airship-server
Version:
Airship is a framework for Node.JS & TypeScript that helps you to write big, scalable and maintainable API servers.
75 lines • 3.28 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const BaseSerializer_1 = require("./BaseSerializer");
class JSONSerializer extends BaseSerializer_1.BaseSerializer {
static deserialize(serializableType, raw, valuePath = []) {
const serializableConstructor = serializableType.prototype;
const propsNames = serializableConstructor[BaseSerializer_1.SerializableKeys] || [];
const types = serializableConstructor[BaseSerializer_1.SerializableTypes];
const arrayTypes = serializableConstructor[BaseSerializer_1.SerializableArrayTypes];
const props = propsNames.map((prop, index) => {
let type = types[index];
let arrayType = arrayTypes[index];
let isSerializable = super.isSerializableObject(type) == true;
valuePath.push(prop);
this.checkType(valuePath.join('.'), raw[prop], type, isSerializable);
if (arrayType &&
super.isSerializableObject(arrayType) == true) {
let val = raw[prop].map((v, i) => {
valuePath.push(`{${i}}`);
let deserialized = JSONSerializer.deserialize(arrayType, v, valuePath);
valuePath.pop();
return deserialized;
});
valuePath.pop();
return val;
}
else if (arrayType) {
let val = raw[prop].map((v, i) => {
valuePath.push(`{${i}}`);
super.checkType(valuePath.join('.'), v, arrayType, false);
valuePath.pop();
return v;
});
valuePath.pop();
return val;
}
else if (isSerializable) {
let val = JSONSerializer.deserialize(type, raw[prop], valuePath);
valuePath.pop();
return val;
}
else {
valuePath.pop();
return raw[prop];
}
});
return new serializableConstructor.constructor(...props);
}
static serialize(entity) {
let result = {};
let arrayTypes = entity[BaseSerializer_1.SerializableArrayTypes];
let i = 0;
for (let prop in entity) {
if (prop == BaseSerializer_1.SerializableKeys ||
prop == BaseSerializer_1.SerializableTypes ||
prop == BaseSerializer_1.SerializableArrayTypes)
continue;
let keyName = Reflect.getMetadata(BaseSerializer_1.SerializableKey, entity, prop) || prop;
let type = Reflect.getMetadata('design:type', entity, prop);
let arrayType = arrayTypes[i];
if (arrayType && super.isSerializableObject(arrayType) == true) {
result[keyName] = entity[prop].map(JSONSerializer.serialize);
}
else if (super.isSerializableObject(type) == true) {
result[keyName] = JSONSerializer.serialize(entity[prop]);
}
else
result[keyName] = entity[prop];
i++;
}
return result;
}
}
exports.default = JSONSerializer;
//# sourceMappingURL=JSONSerializator.js.map