UNPKG

@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
"use strict"; 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