UNPKG

type-initializr

Version:

Uma ferramenta para instanciar classes existentes baseasas em modelos com valores padrões

62 lines (61 loc) 2.81 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const TypeUtils_1 = require("./utils/TypeUtils"); const MetadataUtils_1 = require("./utils/MetadataUtils"); function init(className) { function decorate(target, propertyKey) { return MetadataUtils_1.MetadataUtils.registerProperty(target, propertyKey, className); } return decorate; } exports.init = init; class TypeInitialzr { /** * Retorna uma nova instância do tipo TInstance carregada com o objeto anônimo do tipo TPayload * * @param ctor - Tipo instânciável (classe) do tipo TInstance * @param payload - Objeto anônimo do tipo TPayload * @returns Instância do tipo TInstance carregada com as informações passadas no objeto anônimo do tipo TPayload * **/ static init(ctor, payload) { return this.resolve(ctor, payload); } static resolve(ctor, payload, parent = null) { var _a, _b; this.result = new ctor(); const decorations = (_a = MetadataUtils_1.MetadataUtils.getDecoratedProperties(this.result)) !== null && _a !== void 0 ? _a : []; if (parent) { parent.instance[parent.propName] = Object.assign(this.result, payload); } this.result = (_b = parent === null || parent === void 0 ? void 0 : parent.instance) !== null && _b !== void 0 ? _b : Object.assign(this.result, payload); if (decorations.length > 0) { this.result = this.resolveDecoratedProperties(decorations, payload, this.result); } return this.result; } static resolveDecoratedProperties(metadataTypes, payload, parent) { metadataTypes.forEach(metadata => { var _a; if (Object.keys(payload).some(p => p === metadata.key)) { const currentPrototype = metadata.type.prototype; let currentParent = parent; if (metadata.context !== (currentParent === null || currentParent === void 0 ? void 0 : currentParent.constructor.name)) { for (const key in parent) { if (metadata.context === ((_a = parent[key]) === null || _a === void 0 ? void 0 : _a.constructor.name)) { currentParent = parent[key]; } } } if (TypeUtils_1.TypeUtils.isInitializable(currentPrototype)) { return this.resolve(currentPrototype.constructor, payload[metadata.key], { instance: currentParent, propName: metadata.key, }); } } }); return parent; } } exports.TypeInitialzr = TypeInitialzr;