All files / lib/definitions FactoryResultInstantiation.ts

88.23% Statements 15/17
62.5% Branches 5/8
100% Functions 3/3
100% Lines 15/15

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33      12x   12x 3x         3x 3x 3x       3x       3x 3x 3x 3x 3x 3x 3x 3x        
import { IFactoryResultDefinition } from "./definitionInterfaces/IFactoryResultDefinition";
import { IInstantiatable } from "../interfaces/IInstantiatable";
import { Container } from "../Container";
import { ArgResolver } from "./helpers/ArgResolver";
 
export class FactoryResultInstantiation implements IInstantiatable {
    tags: string[] = [];
 
    definition: IFactoryResultDefinition;
    argResolver: ArgResolver;
 
    constructor(definition: IFactoryResultDefinition, private readonly container: Container) {
        this.definition = definition;
        this.argResolver = new ArgResolver(this.container);
    }
 
    async instantiate() {
        return this.getFactoryResult(this.definition);
    }
 
    public async getFactoryResult<T>(factoryResultDefinition: IFactoryResultDefinition): Promise<T> {
        Iif (factoryResultDefinition.factoryKey === undefined) throw new Error(`cannot resolve ${factoryResultDefinition.key} as factory because do not have factoryKey`);
        const factoryDefinition: any = this.container.definitionsRepository.getDefinition(factoryResultDefinition.factoryKey).definition;
        const factoryObj = await this.container.resolve(factoryResultDefinition.factoryKey) as any;
        Iif (!factoryDefinition?.factoryFn) factoryDefinition.factoryFn = "create";
        const meta = Reflect.getMetadata(factoryDefinition.factoryFn, factoryDefinition.content) || {};
        const factoryFnArgs: any = await this.argResolver.resolveArguments(meta, factoryResultDefinition.factoryMethodContext, factoryDefinition.factoryFn);
        const result = factoryObj[factoryDefinition.factoryFn](...factoryFnArgs);
        return result as T;
    }
 
}