@inversifyjs/core
Version:
InversifyJs core package
91 lines • 5.98 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.resolve = resolve;
const common_1 = require("@inversifyjs/common");
const BindingType_1 = require("../../binding/models/BindingType");
const InversifyCoreError_1 = require("../../error/models/InversifyCoreError");
const InversifyCoreErrorKind_1 = require("../../error/models/InversifyCoreErrorKind");
const isPlanServiceRedirectionBindingNode_1 = require("../../planning/calculations/isPlanServiceRedirectionBindingNode");
const resolveConstantValueBinding_1 = require("./resolveConstantValueBinding");
const resolveDynamicValueBinding_1 = require("./resolveDynamicValueBinding");
const resolveFactoryBinding_1 = require("./resolveFactoryBinding");
const resolveInstanceBindingConstructorParams_1 = require("./resolveInstanceBindingConstructorParams");
const resolveInstanceBindingNode_1 = require("./resolveInstanceBindingNode");
const resolveInstanceBindingNodeAsyncFromConstructorParams_1 = require("./resolveInstanceBindingNodeAsyncFromConstructorParams");
const resolveInstanceBindingNodeFromConstructorParams_1 = require("./resolveInstanceBindingNodeFromConstructorParams");
const resolveProviderBinding_1 = require("./resolveProviderBinding");
const resolveResolvedValueBindingNode_1 = require("./resolveResolvedValueBindingNode");
const resolveResolvedValueBindingParams_1 = require("./resolveResolvedValueBindingParams");
const resolveScopedInstanceBindingNode_1 = require("./resolveScopedInstanceBindingNode");
const resolveScopedResolvedValueBindingNode_1 = require("./resolveScopedResolvedValueBindingNode");
const resolveServiceRedirectionBindingNode_1 = require("./resolveServiceRedirectionBindingNode");
const setInstanceProperties_1 = require("./setInstanceProperties");
const setInstanceProperties = (0, setInstanceProperties_1.setInstanceProperties)(resolveServiceNode);
const resolveServiceRedirectionBindingNode = (0, resolveServiceRedirectionBindingNode_1.resolveServiceRedirectionBindingNode)(resolveBindingNode);
const resolveInstanceBindingNode = (0, resolveInstanceBindingNode_1.resolveInstanceBindingNode)(
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(0, resolveInstanceBindingConstructorParams_1.resolveInstanceBindingConstructorParams)(resolveServiceNode), (0, resolveInstanceBindingNodeAsyncFromConstructorParams_1.resolveInstanceBindingNodeAsyncFromConstructorParams)((0, resolveInstanceBindingNodeFromConstructorParams_1.resolveInstanceBindingNodeFromConstructorParams)(setInstanceProperties)), (0, resolveInstanceBindingNodeFromConstructorParams_1.resolveInstanceBindingNodeFromConstructorParams)(setInstanceProperties));
const resolveResolvedValueBindingNode = (0, resolveResolvedValueBindingNode_1.resolveResolvedValueBindingNode)(
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(0, resolveResolvedValueBindingParams_1.resolveResolvedValueBindingParams)(resolveServiceNode));
const resolveScopedInstanceBindingNode = (0, resolveScopedInstanceBindingNode_1.resolveScopedInstanceBindingNode)(resolveInstanceBindingNode);
const resolveScopedResolvedValueBindingNode = (0, resolveScopedResolvedValueBindingNode_1.resolveScopedResolvedValueBindingNode)(resolveResolvedValueBindingNode);
function resolve(params) {
const serviceNode = params.planResult.tree.root;
return resolveServiceNode(params, serviceNode);
}
function resolveBindingNode(params, planBindingNode) {
switch (planBindingNode.binding.type) {
case BindingType_1.bindingTypeValues.ConstantValue:
return (0, resolveConstantValueBinding_1.resolveConstantValueBinding)(params, planBindingNode.binding);
case BindingType_1.bindingTypeValues.DynamicValue:
return (0, resolveDynamicValueBinding_1.resolveDynamicValueBinding)(params, planBindingNode.binding);
case BindingType_1.bindingTypeValues.Factory:
return (0, resolveFactoryBinding_1.resolveFactoryBinding)(params, planBindingNode.binding);
case BindingType_1.bindingTypeValues.Instance:
return resolveScopedInstanceBindingNode(params, planBindingNode);
case BindingType_1.bindingTypeValues.Provider:
return (0, resolveProviderBinding_1.resolveProviderBinding)(params, planBindingNode.binding);
case BindingType_1.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 ((0, isPlanServiceRedirectionBindingNode_1.isPlanServiceRedirectionBindingNode)(binding)) {
resolvedValues.push(...resolveServiceRedirectionBindingNode(params, binding));
}
else {
resolvedValues.push(resolveBindingNode(params, binding));
}
}
if (resolvedValues.some(common_1.isPromise)) {
return Promise.all(resolvedValues);
}
return resolvedValues;
}
function resolveSingleBindingServiceNode(params, binding) {
if ((0, isPlanServiceRedirectionBindingNode_1.isPlanServiceRedirectionBindingNode)(binding)) {
const resolvedValues = resolveServiceRedirectionBindingNode(params, binding);
if (resolvedValues.length === 1) {
return resolvedValues[0];
}
else {
throw new InversifyCoreError_1.InversifyCoreError(InversifyCoreErrorKind_1.InversifyCoreErrorKind.resolution, 'Unexpected multiple resolved values on single injection');
}
}
else {
return resolveBindingNode(params, binding);
}
}
//# sourceMappingURL=resolve.js.map