UNPKG

vulcain-corejs

Version:
141 lines 5.01 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const annotations_1 = require("./annotations"); var BusUsage; (function (BusUsage) { BusUsage[BusUsage["all"] = 0] = "all"; BusUsage[BusUsage["commandOnly"] = 1] = "commandOnly"; BusUsage[BusUsage["eventOnly"] = 2] = "eventOnly"; })(BusUsage = exports.BusUsage || (exports.BusUsage = {})); /** * Register direct route * @param verb Http verb in uppercase * @param path Path to compare * @param handler Request */ class NativeEndpoint { } exports.NativeEndpoint = NativeEndpoint; class InstanceResolver { constructor(instance) { this.instance = instance; this.lifeTime = annotations_1.LifeTime.Singleton; } resolve(container, name) { return this.instance; } } exports.InstanceResolver = InstanceResolver; class Resolver { constructor(fn, lifeTime, args) { this.fn = fn; this.lifeTime = lifeTime; this.args = args; } resolve(container, name) { let params = []; this.injectArguments(container, name, params); if (this.args) { this.args.forEach(a => { params.push(a); }); } let component = invoke(this.fn, params); component._id = Resolver.nb++; this.injectProperties(container, name, component); component.onInjectionCompleted && component.onInjectionCompleted(); return component; } injectProperties(container, name, component) { let injects = []; let target = this.fn.prototype; while (target) { try { let tmp = Reflect.getMetadata(Symbol.for("di:props_injects"), target); if (tmp) { injects = injects.concat(tmp); } } catch (e) { } target = Object.getPrototypeOf(target); } for (let inject in injects) { let info = injects[inject]; try { // Do not inject if property is already set component[info.property] = component[info.property] || container.get(info.name, info.optional); } catch (e) { throw new Error(`Error when instantiating component ${name} on injected property ${info.property} : ${e.message}`); } } } injectArguments(container, name, params) { let injects; try { injects = Reflect.getMetadata(Symbol.for("di:ctor_injects"), this.fn); } catch (e) { } if (injects) { try { for (let inject in injects) { let info = injects[inject]; params.push(container.get(info.name, info.optional)); } } catch (e) { throw new Error(`Error when instantiating component ${name} on injected parameter : ${e.message}`); } } } } Resolver.nb = 0; exports.Resolver = Resolver; class SingletonResolver extends Resolver { constructor(fn, args) { super(fn, annotations_1.LifeTime.Singleton, args); } resolve(container, name, parentContainer) { let instance = name && container.scope.getInstance(name); if (!instance) { instance = super.resolve(container, name); // Add instance in the container where the resolver was defined if (name && instance) parentContainer.scope.set(name, instance); } return instance; } } exports.SingletonResolver = SingletonResolver; class ScopedResolver extends Resolver { constructor(fn, args) { super(fn, annotations_1.LifeTime.Scoped, args); } resolve(container, name) { let instance = name && container.scope.getInstance(name); if (!instance) { instance = super.resolve(container, name); // Add instance in the current scope if (name && instance) container.scope.set(name, instance); } instance.context = container.scope.context; return instance; } } exports.ScopedResolver = ScopedResolver; function invoke(fn, args) { switch (args.length) { case 0: return new fn(); case 1: return new fn(args[0]); case 2: return new fn(args[0], args[1]); case 3: return new fn(args[0], args[1], args[2]); case 4: return new fn(args[0], args[1], args[2], args[3]); case 5: return new fn(args[0], args[1], args[2], args[3], args[4]); case 6: return new fn(args[0], args[1], args[2], args[3], args[4], args[5]); case 7: return new fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); default: return Reflect.construct(fn, args); } } //# sourceMappingURL=resolvers.js.map