import { ContainerModule, interfaces } from 'inversify'; import { ServiceIdentifiers } from '../../ServiceIdentifiers'; import { INodeTransformer } from '../../../interfaces/node-transformers/INodeTransformer'; import { NodeTransformers } from '../../../enums/container/NodeTransformers'; import { FunctionControlFlowTransformer } from '../../../node-transformers/control-flow-transformers/FunctionControlFlowTransformer'; import { BlockStatementControlFlowTransformer } from '../../../node-transformers/control-flow-transformers/BlockStatementControlFlowTransformer'; import { CatchClauseTransformer } from '../../../node-transformers/obfuscating-transformers/CatchClauseTransformer'; import { FunctionDeclarationTransformer } from '../../../node-transformers/obfuscating-transformers/FunctionDeclarationTransformer'; import { FunctionTransformer } from '../../../node-transformers/obfuscating-transformers/FunctionTransformer'; import { LabeledStatementTransformer } from '../../../node-transformers/obfuscating-transformers/LabeledStatementTransformer'; import { LiteralTransformer } from '../../../node-transformers/obfuscating-transformers/LiteralTransformer'; import { MemberExpressionTransformer } from '../../../node-transformers/converting-transformers/MemberExpressionTransformer'; import { MethodDefinitionTransformer } from '../../../node-transformers/converting-transformers/MethodDefinitionTransformer'; import { ObjectExpressionTransformer } from '../../../node-transformers/obfuscating-transformers/ObjectExpressionTransformer'; import { TemplateLiteralTransformer } from '../../../node-transformers/converting-transformers/TemplateLiteralTransformer'; import { VariableDeclarationTransformer } from '../../../node-transformers/obfuscating-transformers/VariableDeclarationTransformer'; export const nodeTransformersModule: interfaces.ContainerModule = new ContainerModule((bind: interfaces.Bind) => { // control flow transformers bind(ServiceIdentifiers.INodeTransformer) .to(BlockStatementControlFlowTransformer) .whenTargetNamed(NodeTransformers.BlockStatementControlFlowTransformer); bind(ServiceIdentifiers.INodeTransformer) .to(FunctionControlFlowTransformer) .whenTargetNamed(NodeTransformers.FunctionControlFlowTransformer); // converting transformers bind(ServiceIdentifiers.INodeTransformer) .to(MemberExpressionTransformer) .whenTargetNamed(NodeTransformers.MemberExpressionTransformer); bind(ServiceIdentifiers.INodeTransformer) .to(MethodDefinitionTransformer) .whenTargetNamed(NodeTransformers.MethodDefinitionTransformer); bind(ServiceIdentifiers.INodeTransformer) .to(TemplateLiteralTransformer) .whenTargetNamed(NodeTransformers.TemplateLiteralTransformer); // obfuscation transformers bind(ServiceIdentifiers.INodeTransformer) .to(CatchClauseTransformer) .whenTargetNamed(NodeTransformers.CatchClauseTransformer); bind(ServiceIdentifiers.INodeTransformer) .to(FunctionDeclarationTransformer) .whenTargetNamed(NodeTransformers.FunctionDeclarationTransformer); bind(ServiceIdentifiers.INodeTransformer) .to(FunctionTransformer) .whenTargetNamed(NodeTransformers.FunctionTransformer); bind(ServiceIdentifiers.INodeTransformer) .to(LabeledStatementTransformer) .whenTargetNamed(NodeTransformers.LabeledStatementTransformer); bind(ServiceIdentifiers.INodeTransformer) .to(LiteralTransformer) .whenTargetNamed(NodeTransformers.LiteralTransformer); bind(ServiceIdentifiers.INodeTransformer) .to(ObjectExpressionTransformer) .whenTargetNamed(NodeTransformers.ObjectExpressionTransformer); bind(ServiceIdentifiers.INodeTransformer) .to(VariableDeclarationTransformer) .whenTargetNamed(NodeTransformers.VariableDeclarationTransformer); // node transformers factory bind(ServiceIdentifiers.Factory__INodeTransformer) .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.getNamed( ServiceIdentifiers.INodeTransformer, transformer ); cache.set(transformer, nodeTransformer); } instancesArray.push(nodeTransformer); }); return instancesArray; }; }); });