@roit/roit-model-mapper
Version:
ROIT model mapper makes it easy to convert any object or JSON to the model
114 lines • 4.43 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const normalizeWhitespace = require("normalize-html-whitespace");
class MapperHandle {
static deserialize(clazz, jsonObject, optionsMapper) {
if ((clazz === undefined) || (jsonObject === undefined))
return undefined;
if (Array.isArray(jsonObject)) {
const result = jsonObject.map(j => this.deserialize(clazz, j, optionsMapper));
if (optionsMapper && optionsMapper.singleResult) {
return result[0];
}
return result;
}
if (this.isPrimitive(jsonObject)) {
if (this.IsValidJSONString(jsonObject)) {
jsonObject = JSON.parse(jsonObject);
}
else {
return undefined;
}
}
let obj = new clazz();
if (optionsMapper && optionsMapper.compareWithAttributesLowerCase) {
jsonObject = this.toLowerCaseAllAttributes(jsonObject);
}
Object.keys(obj).forEach((key) => {
let propertyMetadataFn = (propertyMetadata) => {
let propertyName = optionsMapper && optionsMapper.ignoreJsonPropertyName ? key : propertyMetadata.name || key;
let innerJson = undefined;
innerJson = jsonObject ? jsonObject[this.getKey(propertyName, optionsMapper)] : undefined;
let clazz = this.getClazz(obj, key);
if (propertyMetadata.clazz) {
let objectTarget = propertyMetadata.linear && !optionsMapper.ignoreLinear ? jsonObject : innerJson;
if (propertyMetadata.alwaysArray) {
if (objectTarget) {
objectTarget = Array.isArray(objectTarget) ? objectTarget : [objectTarget];
}
else {
objectTarget = [];
}
}
return this.deserialize(propertyMetadata.clazz, objectTarget, optionsMapper);
}
else if (!this.isPrimitive(clazz) && !propertyMetadata.name) {
return this.deserialize(clazz, innerJson, optionsMapper);
}
else {
return jsonObject ? jsonObject[this.getKey(propertyName, optionsMapper)] : undefined;
}
};
let propertyMetadata = this.getJsonProperty(obj, key);
if (propertyMetadata) {
obj[key] = this.getValue(propertyMetadataFn(propertyMetadata), optionsMapper);
}
else {
if (jsonObject && jsonObject[key.toLowerCase()] !== undefined) {
obj[key] = this.getValue(jsonObject[this.getKey(key, optionsMapper)], optionsMapper);
}
}
});
return obj;
}
static isPrimitive(obj) {
switch (typeof obj) {
case "string":
case "number":
case "boolean":
return true;
}
return !!(obj instanceof String || obj === String ||
obj instanceof Number || obj === Number ||
obj instanceof Boolean || obj === Boolean);
}
static getClazz(target, propertyKey) {
return Reflect.getMetadata("design:type", target, propertyKey);
}
static getJsonProperty(target, propertyKey) {
return Reflect.getMetadata("jsonProperty", target, propertyKey);
}
static toLowerCaseAllAttributes(obj) {
var key, keys = Object.keys(obj);
var n = keys.length;
var newobj = {};
while (n--) {
key = keys[n];
newobj[key.toLowerCase()] = obj[key];
}
return newobj;
}
static getValue(value, options) {
if (options && options.normalizeString && typeof value == "string") {
return normalizeWhitespace(value);
}
return value;
}
static getKey(key, options) {
if (options && options.compareWithAttributesLowerCase) {
return key.toLowerCase();
}
return key;
}
static IsValidJSONString(str) {
try {
JSON.parse(str);
}
catch (e) {
return false;
}
return true;
}
}
exports.MapperHandle = MapperHandle;
//# sourceMappingURL=MapperHandle.js.map