UNPKG

@inversifyjs/core

Version:

InversifyJs core package

89 lines 4.22 kB
import { BindingConstraintsImplementation, } from '../../binding/models/BindingConstraintsImplementation.js'; import { bindingTypeValues } from '../../binding/models/BindingType.js'; import { buildFilteredServiceBindings } from '../calculations/buildFilteredServiceBindings.js'; import { isPlanServiceRedirectionBindingNode } from '../calculations/isPlanServiceRedirectionBindingNode.js'; export function curryBuildServiceNodeBindings(subplan) { const buildInstancePlanBindingNode = curryBuildInstancePlanBindingNode(subplan); const buildResolvedValuePlanBindingNode = curryBuildResolvedValuePlanBindingNode(subplan); const buildServiceNodeBindings = (params, bindingConstraintsList, serviceBindings, parentNode, chainedBindings) => { const serviceIdentifier = isPlanServiceRedirectionBindingNode(parentNode) ? parentNode.binding.targetServiceIdentifier : parentNode.serviceIdentifier; params.servicesBranch.push(serviceIdentifier); const planBindingNodes = []; for (const binding of serviceBindings) { switch (binding.type) { case bindingTypeValues.Instance: { planBindingNodes.push(buildInstancePlanBindingNode(params, binding, bindingConstraintsList)); break; } case bindingTypeValues.ResolvedValue: { planBindingNodes.push(buildResolvedValuePlanBindingNode(params, binding, bindingConstraintsList)); break; } case bindingTypeValues.ServiceRedirection: { const planBindingNode = buildServiceRedirectionPlanBindingNode(params, bindingConstraintsList, binding, chainedBindings); planBindingNodes.push(planBindingNode); break; } default: planBindingNodes.push({ binding: binding, }); } } params.servicesBranch.pop(); return planBindingNodes; }; const buildServiceRedirectionPlanBindingNode = curryBuildServiceRedirectionPlanBindingNode(buildServiceNodeBindings); return buildServiceNodeBindings; } function curryBuildInstancePlanBindingNode(subplan) { return (params, binding, bindingConstraintsList) => { const classMetadata = params.operations.getClassMetadata(binding.implementationType); const childNode = { binding: binding, classMetadata, constructorParams: [], propertyParams: new Map(), }; const subplanParams = { autobindOptions: params.autobindOptions, node: childNode, operations: params.operations, servicesBranch: params.servicesBranch, }; return subplan(subplanParams, bindingConstraintsList); }; } function curryBuildResolvedValuePlanBindingNode(subplan) { return (params, binding, bindingConstraintsList) => { const childNode = { binding: binding, params: [], }; const subplanParams = { autobindOptions: params.autobindOptions, node: childNode, operations: params.operations, servicesBranch: params.servicesBranch, }; return subplan(subplanParams, bindingConstraintsList); }; } function curryBuildServiceRedirectionPlanBindingNode(buildServiceNodeBindings) { return (params, bindingConstraintsList, binding, chainedBindings) => { const childNode = { binding, redirections: [], }; const bindingConstraints = new BindingConstraintsImplementation(bindingConstraintsList.last); const filteredServiceBindings = buildFilteredServiceBindings(params, bindingConstraints, { chained: chainedBindings, customServiceIdentifier: binding.targetServiceIdentifier, }); childNode.redirections.push(...buildServiceNodeBindings(params, bindingConstraintsList, filteredServiceBindings, childNode, chainedBindings)); return childNode; }; } //# sourceMappingURL=curryBuildServiceNodeBindings.js.map