@inversifyjs/core
Version:
InversifyJs core package
89 lines • 4.22 kB
JavaScript
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