UNPKG

@inversifyjs/core

Version:

InversifyJs core package

91 lines 5.41 kB
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