type-initializr
Version:
Uma ferramenta para instanciar classes existentes baseasas em modelos com valores padrões
62 lines (61 loc) • 2.81 kB
JavaScript
;
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;