@inversifyjs/core
Version:
InversifyJs core package
91 lines • 5.41 kB
JavaScript
import { isPromise } from '@inversifyjs/common';
import { bindingTypeValues } from '../../binding/models/BindingType.js';
import { InversifyCoreError } from '../../error/models/InversifyCoreError.js';
import { InversifyCoreErrorKind } from '../../error/models/InversifyCoreErrorKind.js';
import { handleResolveError } from '../../planning/calculations/handleResolveError.js';
import { isPlanServiceRedirectionBindingNode } from '../../planning/calculations/isPlanServiceRedirectionBindingNode.js';
import { resolveConstantValueBinding } from './resolveConstantValueBinding.js';
import { resolveDynamicValueBinding } from './resolveDynamicValueBinding.js';
import { resolveFactoryBinding } from './resolveFactoryBinding.js';
import { resolveInstanceBindingConstructorParams as curryResolveInstanceBindingConstructorParams } from './resolveInstanceBindingConstructorParams.js';
import { resolveInstanceBindingNode as curryResolveInstanceBindingNode } from './resolveInstanceBindingNode.js';
import { resolveInstanceBindingNodeAsyncFromConstructorParams } from './resolveInstanceBindingNodeAsyncFromConstructorParams.js';
import { resolveInstanceBindingNodeFromConstructorParams } from './resolveInstanceBindingNodeFromConstructorParams.js';
import { resolveResolvedValueBindingNode as curryResolveResolvedValueBindingNode } from './resolveResolvedValueBindingNode.js';
import { resolveResolvedValueBindingParams as curryResolveResolvedValueBindingParams } from './resolveResolvedValueBindingParams.js';
import { resolveScopedInstanceBindingNode as curryResolveScopedInstanceBindingNode } from './resolveScopedInstanceBindingNode.js';
import { resolveScopedResolvedValueBindingNode as curryResolveScopedResolvedValueBindingNode } from './resolveScopedResolvedValueBindingNode.js';
import { resolveServiceRedirectionBindingNode as curryResolveServiceRedirectionBindingNode } from './resolveServiceRedirectionBindingNode.js';
import { setInstanceProperties as currySetInstanceProperties } from './setInstanceProperties.js';
const setInstanceProperties = currySetInstanceProperties(resolveServiceNode);
const resolveServiceRedirectionBindingNode = curryResolveServiceRedirectionBindingNode(resolveBindingNode);
const resolveInstanceBindingNode = curryResolveInstanceBindingNode(
// eslint-disable-next-line @typescript-eslint/no-explicit-any
curryResolveInstanceBindingConstructorParams(resolveServiceNode), resolveInstanceBindingNodeAsyncFromConstructorParams(resolveInstanceBindingNodeFromConstructorParams(setInstanceProperties)), resolveInstanceBindingNodeFromConstructorParams(setInstanceProperties));
const resolveResolvedValueBindingNode = curryResolveResolvedValueBindingNode(
// eslint-disable-next-line @typescript-eslint/no-explicit-any
curryResolveResolvedValueBindingParams(resolveServiceNode));
const resolveScopedInstanceBindingNode = curryResolveScopedInstanceBindingNode(resolveInstanceBindingNode);
const resolveScopedResolvedValueBindingNode = curryResolveScopedResolvedValueBindingNode(resolveResolvedValueBindingNode);
export function resolve(params) {
try {
const serviceNode = params.planResult.tree.root;
return resolveServiceNode(params, serviceNode);
}
catch (error) {
handleResolveError(params, error);
}
}
function resolveBindingNode(params, planBindingNode) {
switch (planBindingNode.binding.type) {
case bindingTypeValues.ConstantValue:
return resolveConstantValueBinding(params, planBindingNode.binding);
case bindingTypeValues.DynamicValue:
return resolveDynamicValueBinding(params, planBindingNode.binding);
case bindingTypeValues.Factory:
return resolveFactoryBinding(params, planBindingNode.binding);
case bindingTypeValues.Instance:
return resolveScopedInstanceBindingNode(params, planBindingNode);
case bindingTypeValues.ResolvedValue:
return resolveScopedResolvedValueBindingNode(params, planBindingNode);
}
}
function resolveServiceNode(params, serviceNode) {
if (serviceNode.bindings === undefined) {
return undefined;
}
if (Array.isArray(serviceNode.bindings)) {
return resolveMultipleBindingServiceNode(params, serviceNode.bindings);
}
return resolveSingleBindingServiceNode(params, serviceNode.bindings);
}
function resolveMultipleBindingServiceNode(params, bindings) {
const resolvedValues = [];
for (const binding of bindings) {
if (isPlanServiceRedirectionBindingNode(binding)) {
resolvedValues.push(...resolveServiceRedirectionBindingNode(params, binding));
}
else {
resolvedValues.push(resolveBindingNode(params, binding));
}
}
if (resolvedValues.some(isPromise)) {
return Promise.all(resolvedValues);
}
return resolvedValues;
}
function resolveSingleBindingServiceNode(params, binding) {
if (isPlanServiceRedirectionBindingNode(binding)) {
const resolvedValues = resolveServiceRedirectionBindingNode(params, binding);
if (resolvedValues.length === 1) {
return resolvedValues[0];
}
else {
throw new InversifyCoreError(InversifyCoreErrorKind.resolution, 'Unexpected multiple resolved values on single injection');
}
}
else {
return resolveBindingNode(params, binding);
}
}
//# sourceMappingURL=resolve.js.map