_const serializableClassMappings = require('./serializable-class-mappings').get

function addSerializableClasses(clazz) {
  if (clazz._serializationKey) {
    serializableClassMappings().set(clazz._serializationKey, clazz.prototype)
  }
}

/**
 * Decorates a class with serialization metadata.
 *
 * @memberOf module:tanagra-core
 * @function serializable
 * @param customSerializationKey By default, when the class is serialized, it is keyed on its name; this default can
 *                               be overridden by setting this parameter.
 *
 * @example <caption>Javascript</caption>
 *
 * const serializable = require('tanagra-core').serializable
 *
 * module.exports = serializable()(class Foo {
 *   constructor(barNumber, bazObject) {
 *     this.barNumber = barNumber // primitive
 *     this.bazObject = bazObject // serializable object
 *   }
 * })
 *
 * @example <caption>Typescript</caption>
 *
 * import { serializable } from 'tanagra-core'
 *
 * \@serializable()
 * export default class Foo {
 *   private bar: number
 *   private baz: Baz
 *
 *   constructor(bar: number, baz: Baz) {
 *     this.bar = bar // primitive
 *     this.baz = baz // serializable object
 *   }
 * }
 */
module.exports = function(customSerializationKey) {
  return function (clazz) {
    const serializationKey = customSerializationKey || clazz.name
    Reflect.defineProperty(clazz, '_serializationKey', {
      get: function _serializationKey() { return serializationKey },
      configurable: true
    })

    // add class mappings for deserialization
    addSerializableClasses(clazz)

    return clazz
  }
}

Licensed under the MIT License

Documentation generated by JSDoc 3.6.3 using Docolatte theme on