All files / lib/modifiers/initializers RunSettersInitializer.ts

90% Statements 18/20
72.72% Branches 8/11
100% Functions 3/3
89.47% Lines 17/19

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 34 35 36 37  12x 12x     12x 45x   45x       58x       58x 58x 58x 2x 3x 3x 3x 3x     3x 3x           2x      
import { IInitializer } from "./IInitializer";
import { Keys } from "../../Keys";
import { ArgResolver } from "../../definitions/helpers/ArgResolver";
import { IResolver } from "../../interfaces/IResolver";
 
export class RunSettersInitializer implements IInitializer {
    argResolver: ArgResolver = new ArgResolver(this.resolver);
 
    constructor(readonly resolver: IResolver) {
    }
 
    async run(resolvedInstance: any, definition: any): Promise<any> {
        return this.runSetters(resolvedInstance, definition);
    }
 
    async runSetters(resolvedInstance: any, definition: any): Promise<any> {
        const initMethodMeta = Reflect.getMetadata(Keys.SETTER_METHOD_PROPERTY_DECORATOR_KEY, definition.content) || {};
        const setterMethods: string[] = initMethodMeta[Keys.SETTER_METHOD_PROPERTY_DECORATOR_KEY];
        if (setterMethods === undefined || setterMethods.length <= 0) return resolvedInstance;
        for (const setterMethod of setterMethods) {
            if (setterMethod !== undefined) {
                const setterParamsMeta = Reflect.getMetadata(setterMethod, definition.content) || {};
                const setterFnArgs: any = await this.argResolver.resolveArguments(setterParamsMeta, definition.context, setterMethod) || [];
                Iif (setterFnArgs.length > 1) {
                    throw new Error(`@Setter method too many args (pleas pass 1 @inject('key') arg) to ${setterMethod}`);
                }
                try {
                    resolvedInstance[setterMethod] = setterFnArgs[0];
                } catch (err) {
                    throw new Error("@Setter method only allowed to setters (example: @Setter() set setVariable(@Inject('key') param){...})");
                }
            }
        }
        return resolvedInstance;
    }
}