You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Decorator.ts 1.8KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import { CLASSNAME_ATTRIBUTE } from "./Strings"
  2. export abstract class DeserializerFactory {
  3. static entityClasses = {}
  4. static from(object: any) {
  5. if(!object){
  6. return
  7. }
  8. if(typeof object !== 'object'){ //definitely not a class object
  9. return object
  10. }
  11. if(Array.isArray(object)){
  12. return object.map(DeserializerFactory.from)
  13. }
  14. const clazz = DeserializerFactory.entityClasses[object[CLASSNAME_ATTRIBUTE]]
  15. delete object[CLASSNAME_ATTRIBUTE]
  16. if(!clazz){ //anonymous object or class not registered as @Serializable
  17. Object.keys(object).forEach(key => {
  18. object[key] = DeserializerFactory.from(object[key])
  19. })
  20. return object
  21. }
  22. const obj = new clazz()
  23. Object.keys(object).forEach(key => {
  24. obj[key] = DeserializerFactory.from(object[key])
  25. })
  26. return obj
  27. }
  28. static makeDeserializable(object: any){
  29. if(!object)
  30. return
  31. if(typeof object !== 'object')
  32. return object
  33. if(object.constructor.name === 'Object'){
  34. Object.keys(object).forEach(key => {
  35. object[key] = DeserializerFactory.makeDeserializable(object[key])
  36. })
  37. return object
  38. }
  39. object[CLASSNAME_ATTRIBUTE] = object.constructor.name
  40. Object.keys(object).forEach(key => {
  41. object[key] = DeserializerFactory.makeDeserializable(object[key])
  42. })
  43. return object
  44. }
  45. }
  46. export function Serializable(attr?: any) {
  47. return function _Serializable<T extends { new(...args: any[]): {} }>(clazz: T) {
  48. DeserializerFactory.entityClasses[clazz.name] = clazz
  49. return clazz
  50. }
  51. }