import { ContainerModule, interfaces } from 'inversify'; import { ServiceIdentifiers } from '../../ServiceIdentifiers'; import { IControlFlowReplacer } from '../../../interfaces/node-transformers/IControlFlowReplacer'; import { NodeControlFlowReplacers } from '../../../enums/container/NodeControlFlowReplacers'; import { BinaryExpressionControlFlowReplacer } from '../../../node-transformers/node-control-flow-transformers/control-flow-replacers/BinaryExpressionControlFlowReplacer'; import { CallExpressionControlFlowReplacer } from '../../../node-transformers/node-control-flow-transformers/control-flow-replacers/CallExpressionControlFlowReplacer'; import { LogicalExpressionControlFlowReplacer } from '../../../node-transformers/node-control-flow-transformers/control-flow-replacers/LogicalExpressionControlFlowReplacer'; export const nodeControlFlowTransformersModule: interfaces.ContainerModule = new ContainerModule((bind: interfaces.Bind) => { bind(ServiceIdentifiers.IControlFlowReplacer) .to(BinaryExpressionControlFlowReplacer) .whenTargetNamed(NodeControlFlowReplacers.BinaryExpressionControlFlowReplacer); bind(ServiceIdentifiers.IControlFlowReplacer) .to(CallExpressionControlFlowReplacer) .whenTargetNamed(NodeControlFlowReplacers.CallExpressionControlFlowReplacer); bind(ServiceIdentifiers.IControlFlowReplacer) .to(LogicalExpressionControlFlowReplacer) .whenTargetNamed(NodeControlFlowReplacers.LogicalExpressionControlFlowReplacer); bind(ServiceIdentifiers.Factory__IControlFlowReplacer) .toFactory((context: interfaces.Context) => { const cache: Map = new Map(); return (replacerName: NodeControlFlowReplacers) => { if (cache.has(replacerName)) { return cache.get(replacerName); } const controlFlowReplacer: IControlFlowReplacer = context.container.getNamed( ServiceIdentifiers.IControlFlowReplacer, replacerName ); cache.set(replacerName, controlFlowReplacer); return controlFlowReplacer; }; }); });