import { CLASSNAME_ATTRIBUTE } from "./Strings" export abstract class DeserializerFactory { static entityClasses = {} static from(object: any) { if(!object){ return } if(typeof object !== 'object'){ //definitely not a class object return object } if(Array.isArray(object)){ return object.map(DeserializerFactory.from) } const clazz = DeserializerFactory.entityClasses[object[CLASSNAME_ATTRIBUTE]] delete object[CLASSNAME_ATTRIBUTE] if(!clazz){ //anonymous object or class not registered as @Serializable Object.keys(object).forEach(key => { object[key] = DeserializerFactory.from(object[key]) }) return object } const obj = new clazz() Object.keys(object).forEach(key => { obj[key] = DeserializerFactory.from(object[key]) }) return obj } static makeDeserializable(object: any){ if(!object) return if(typeof object !== 'object') return object if(object.constructor.name === 'Object'){ Object.keys(object).forEach(key => { object[key] = DeserializerFactory.makeDeserializable(object[key]) }) return object } object[CLASSNAME_ATTRIBUTE] = object.constructor.name Object.keys(object).forEach(key => { object[key] = DeserializerFactory.makeDeserializable(object[key]) }) return object } } export function Serializable(attr?: any) { return function _Serializable(clazz: T) { DeserializerFactory.entityClasses[clazz.name] = clazz return clazz } }