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.9KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. return class extends clazz{
  52. constructor(...args: any[]) {
  53. super(...args)
  54. }
  55. }
  56. */
  57. }
  58. }