UNPKG

@booster-ts/core

Version:
194 lines 6.14 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); // tslint:disable-next-line:no-var-requires require("reflect-metadata"); /** * booster * @description Decorator to retreive Classes * @param data info to attach to the Class */ exports.booster = function (data) { return function (target) { Reflect.defineMetadata("data", data || {}, target); return; }; }; /** * Injector * @description Container to Store and Retreive Classes */ var Injector = /** @class */ (function () { function Injector() { this.container = []; } /** * register * @description Register a Class with a custom name * @param className Name you want the class to have * @param target Class to register * @example * ``` * @booster() * class Example { * } * * Inject.register('CustomExample', Example); * ``` */ Injector.prototype.register = function (className, target) { var _this = this; var found = false; var tokens = Reflect.getMetadata("design:paramtypes", target) || []; var inject = tokens.map(function (token) { return _this.resolve(token); }); var newClass = { class: new (target.bind.apply(target, [void 0].concat(inject)))(), name: className, data: Reflect.getMetadata('data', target), target: target }; this.container.map(function (container) { if (container.name === className) { found = true; return newClass; } return container; }); if (!found) this.container.push(newClass); return newClass.class; }; /** * inject * @description Retrive class with dependencies injected * @param target Class to inject * @example * ``` * @booster() * class Greeter { * public hello() { * return "Hello"; * } * } * * @booster() * class Human { * constructor( * greet: Greeter * ) { } * * public hello(): string { * return greet.hello(); * } * } * * const example = Inject.inject(Example); * example.hello() // Returns "Hello" * ``` */ Injector.prototype.inject = function (target) { return this.resolve(target); }; /** * getByKey * @description Gets all class with a specific key attached as metadata * @param keyName Key to find on Target */ Injector.prototype.getByKey = function (keyName) { var _this = this; var classArray = []; this.container.forEach(function (container) { var data = Reflect.getMetadata('data', container.target); if (data === undefined) return; if (data[keyName] !== undefined) classArray.push(_this.resolve(container.target)); }); return classArray; }; /** * getByValue * @description Gets all class with a specific value to the key attached as metadata * @param keyName Key to find on Target * @param value to find on key */ Injector.prototype.getByValue = function (keyName, value) { var _this = this; var classArray = []; this.container.forEach(function (container) { var data = Reflect.getMetadata('data', container.target); if (data === undefined) return; if (data[keyName] === value) classArray.push(_this.resolve(container.target)); }); return classArray; }; /** * getContainerByKey * @description Returns Container with certain key * @param keyName to find on target */ Injector.prototype.getContainerByKey = function (keyName) { var _this = this; var containerArray = []; this.container.forEach(function (container) { var data = Reflect.getMetadata('data', container.target); if (data === undefined) return; if (data[keyName] !== undefined) { _this.resolve(container.target); containerArray.push(container); } }); return containerArray; }; /** * getContainerByValue * @description Gets all class with a specific value to the key attached as metadata * @param keyName Key to find on Target * @param value to find on key */ Injector.prototype.getContainerByValue = function (keyName, value) { var _this = this; var containerArray = []; this.container.forEach(function (container) { var data = Reflect.getMetadata('data', container.target); if (data === undefined) return; if (data[keyName] === value) { _this.resolve(container.target); containerArray.push(container); } }); return containerArray; }; /** * resolve * @description Resolves dependencies and retruns injected Class * @param target Class */ Injector.prototype.resolve = function (target) { var _this = this; var tokens = Reflect.getMetadata("design:paramtypes", target) || []; var inject = tokens.map(function (token) { return _this.resolve(token); }); var className = target.name; var temp = this.container.filter(function (dependency) { if (dependency.name === className) return dependency; return null; }); if (temp.length > 0) return temp[0].class; var newClass = { class: new (target.bind.apply(target, [void 0].concat(inject)))(), name: className, data: Reflect.getMetadata('data', target), target: target }; this.container.push(newClass); return newClass.class; }; return Injector; }()); exports.Injector = Injector; //# sourceMappingURL=core.js.map