@inversifyjs/core
Version:
InversifyJs core package
130 lines • 9.06 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.currySubplan = currySubplan;
const ClassElementMetadataKind_1 = require("../../metadata/models/ClassElementMetadataKind");
const ResolvedValueElementMetadataKind_1 = require("../../metadata/models/ResolvedValueElementMetadataKind");
const getServiceFromMaybeLazyServiceIdentifier_1 = require("../calculations/getServiceFromMaybeLazyServiceIdentifier");
const isInstanceBindingNode_1 = require("../calculations/isInstanceBindingNode");
const tryBuildGetPlanOptionsFromManagedClassElementMetadata_1 = require("../calculations/tryBuildGetPlanOptionsFromManagedClassElementMetadata");
const tryBuildGetPlanOptionsFromResolvedValueElementMetadata_1 = require("../calculations/tryBuildGetPlanOptionsFromResolvedValueElementMetadata");
const LazyPlanServiceNode_1 = require("../models/LazyPlanServiceNode");
const cacheNonRootPlanServiceNode_1 = require("./cacheNonRootPlanServiceNode");
class LazyManagedClassMetadataPlanServiceNode extends LazyPlanServiceNode_1.LazyPlanServiceNode {
#params;
#buildLazyPlanServiceNodeNodeFromClassElementMetadata;
#bindingConstraintsList;
#elementMetadata;
constructor(params, buildLazyPlanServiceNodeNodeFromClassElementMetadata, bindingConstraintsList, elementMetadata, serviceNode) {
super(serviceNode, (0, getServiceFromMaybeLazyServiceIdentifier_1.getServiceFromMaybeLazyServiceIdentifier)(elementMetadata.value));
this.#buildLazyPlanServiceNodeNodeFromClassElementMetadata =
buildLazyPlanServiceNodeNodeFromClassElementMetadata;
this.#params = params;
this.#bindingConstraintsList = bindingConstraintsList;
this.#elementMetadata = elementMetadata;
}
_buildPlanServiceNode() {
return this.#buildLazyPlanServiceNodeNodeFromClassElementMetadata(this.#params, this.#bindingConstraintsList, this.#elementMetadata);
}
}
class LazyResolvedValueMetadataPlanServiceNode extends LazyPlanServiceNode_1.LazyPlanServiceNode {
#params;
#buildLazyPlanServiceNodeNodeFromResolvedValueElementMetadata;
#bindingConstraintsList;
#resolvedValueElementMetadata;
constructor(params, buildLazyPlanServiceNodeNodeFromResolvedValueElementMetadata, bindingConstraintsList, resolvedValueElementMetadata, serviceNode) {
super(serviceNode, (0, getServiceFromMaybeLazyServiceIdentifier_1.getServiceFromMaybeLazyServiceIdentifier)(resolvedValueElementMetadata.value));
this.#params = params;
this.#buildLazyPlanServiceNodeNodeFromResolvedValueElementMetadata =
buildLazyPlanServiceNodeNodeFromResolvedValueElementMetadata;
this.#bindingConstraintsList = bindingConstraintsList;
this.#resolvedValueElementMetadata = resolvedValueElementMetadata;
}
_buildPlanServiceNode() {
return this.#buildLazyPlanServiceNodeNodeFromResolvedValueElementMetadata(this.#params, this.#bindingConstraintsList, this.#resolvedValueElementMetadata);
}
}
function currySubplan(buildLazyPlanServiceNodeNodeFromClassElementMetadata, buildLazyPlanServiceNodeNodeFromResolvedValueElementMetadata, buildPlanServiceNodeFromClassElementMetadata, buildPlanServiceNodeFromResolvedValueElementMetadata) {
const subplanInstanceBindingNode = currySubplanInstanceBindingNode(buildLazyPlanServiceNodeNodeFromClassElementMetadata, buildPlanServiceNodeFromClassElementMetadata);
const subplanResolvedValueBindingNode = currySubplanResolvedValueBindingNode(buildLazyPlanServiceNodeNodeFromResolvedValueElementMetadata, buildPlanServiceNodeFromResolvedValueElementMetadata);
return (params, bindingConstraintsList) => {
if ((0, isInstanceBindingNode_1.isInstanceBindingNode)(params.node)) {
return subplanInstanceBindingNode(params, params.node, bindingConstraintsList);
}
else {
return subplanResolvedValueBindingNode(params, params.node, bindingConstraintsList);
}
};
}
function currySubplanInstanceBindingNode(buildLazyPlanServiceNodeNodeFromClassElementMetadata, buildPlanServiceNodeFromClassElementMetadata) {
const handlePlanServiceNodeBuildFromClassElementMetadata = curryHandlePlanServiceNodeBuildFromClassElementMetadata(buildLazyPlanServiceNodeNodeFromClassElementMetadata, buildPlanServiceNodeFromClassElementMetadata);
return (params, node, bindingConstraintsList) => {
const classMetadata = node.classMetadata;
for (const [index, elementMetadata,] of classMetadata.constructorArguments.entries()) {
node.constructorParams[index] =
handlePlanServiceNodeBuildFromClassElementMetadata(params, bindingConstraintsList, elementMetadata);
}
for (const [propertyKey, elementMetadata] of classMetadata.properties) {
const planServiceNode = handlePlanServiceNodeBuildFromClassElementMetadata(params, bindingConstraintsList, elementMetadata);
if (planServiceNode !== undefined) {
node.propertyParams.set(propertyKey, planServiceNode);
}
}
return params.node;
};
}
function currySubplanResolvedValueBindingNode(buildLazyPlanServiceNodeNodeFromResolvedValueElementMetadata, buildPlanServiceNodeFromResolvedValueElementMetadata) {
const handlePlanServiceNodeBuildFromResolvedValueElementMetadata = curryHandlePlanServiceNodeBuildFromResolvedValueElementMetadata(buildLazyPlanServiceNodeNodeFromResolvedValueElementMetadata, buildPlanServiceNodeFromResolvedValueElementMetadata);
return (params, node, bindingConstraintsList) => {
const resolvedValueMetadata = node.binding.metadata;
for (const [index, elementMetadata,] of resolvedValueMetadata.arguments.entries()) {
node.params[index] =
handlePlanServiceNodeBuildFromResolvedValueElementMetadata(params, bindingConstraintsList, elementMetadata);
}
return params.node;
};
}
function curryHandlePlanServiceNodeBuildFromClassElementMetadata(buildLazyPlanServiceNodeNodeFromClassElementMetadata, buildPlanServiceNodeFromClassElementMetadata) {
return (params, bindingConstraintsList, elementMetadata) => {
if (elementMetadata.kind === ClassElementMetadataKind_1.ClassElementMetadataKind.unmanaged) {
return undefined;
}
const getPlanOptions = (0, tryBuildGetPlanOptionsFromManagedClassElementMetadata_1.tryBuildGetPlanOptionsFromManagedClassElementMetadata)(elementMetadata);
if (getPlanOptions !== undefined) {
const planResult = params.operations.getPlan(getPlanOptions);
if (planResult !== undefined && planResult.tree.root.isContextFree) {
return planResult.tree.root;
}
}
const serviceNode = buildPlanServiceNodeFromClassElementMetadata(params, bindingConstraintsList, elementMetadata);
const lazyPlanServiceNode = new LazyManagedClassMetadataPlanServiceNode(params, buildLazyPlanServiceNodeNodeFromClassElementMetadata, bindingConstraintsList, elementMetadata, serviceNode);
(0, cacheNonRootPlanServiceNode_1.cacheNonRootPlanServiceNode)(getPlanOptions, params.operations, lazyPlanServiceNode, {
bindingConstraintsList,
chainedBindings: elementMetadata.kind === ClassElementMetadataKind_1.ClassElementMetadataKind.multipleInjection &&
elementMetadata.chained,
optionalBindings: elementMetadata.optional,
});
return lazyPlanServiceNode;
};
}
function curryHandlePlanServiceNodeBuildFromResolvedValueElementMetadata(buildLazyPlanServiceNodeNodeFromResolvedValueElementMetadata, buildPlanServiceNodeFromResolvedValueElementMetadata) {
return (params, bindingConstraintsList, elementMetadata) => {
const getPlanOptions = (0, tryBuildGetPlanOptionsFromResolvedValueElementMetadata_1.tryBuildGetPlanOptionsFromResolvedValueElementMetadata)(elementMetadata);
if (getPlanOptions !== undefined) {
const planResult = params.operations.getPlan(getPlanOptions);
if (planResult !== undefined && planResult.tree.root.isContextFree) {
return planResult.tree.root;
}
}
const serviceNode = buildPlanServiceNodeFromResolvedValueElementMetadata(params, bindingConstraintsList, elementMetadata);
const lazyPlanServiceNode = new LazyResolvedValueMetadataPlanServiceNode(params, buildLazyPlanServiceNodeNodeFromResolvedValueElementMetadata, bindingConstraintsList, elementMetadata, serviceNode);
(0, cacheNonRootPlanServiceNode_1.cacheNonRootPlanServiceNode)(getPlanOptions, params.operations, lazyPlanServiceNode, {
bindingConstraintsList,
chainedBindings: elementMetadata.kind ===
ResolvedValueElementMetadataKind_1.ResolvedValueElementMetadataKind.multipleInjection &&
elementMetadata.chained,
optionalBindings: elementMetadata.optional,
});
return lazyPlanServiceNode;
};
}
//# sourceMappingURL=currySubplan.js.map