Source: store/modules/decorators.js

/**
 * @summary decorators
 * @version 3.0.0
 * @since 3.0.0
 * @author Arian Khosravi<arian.khosravi@aofl.com>
 */
/**
 * v2 decorator adds observed properties to an Sdo's instance to support memoized
 * getters.
 *
 * @memberof module:@aofl/store
 *
 * @param {String[]} args
 * @return {Object}
 */
function decorate(...args) {
  return (descriptor, name) => {
    /* istanbul ignore next */
    if (args.length === 0) {
      throw new TypeError('@aofl/store#decorate requires at least 1 argumen, but only 0 were passed');
    }
    descriptor.finisher = (clazz) => {
      /* istanbul ignore else */
      if (typeof clazz.prototype.observedProperties === 'undefined') {
        clazz.prototype.observedProperties = {};
      }

      clazz.prototype.observedProperties[descriptor.key] = {
        keys: args,
        values: args,
        value: ''
      };
    };

    return descriptor;
  };
}

/**
 * Proxies state properties to store and converts instance properties to getters that return
 * values from store.
 *
 * @memberof module:@aofl/store
 * @return {Object}
 */
function state() {
  return (descriptor) => {
    const key = descriptor.key;
    return {
      kind: 'field',
      key: Symbol(),
      placement: 'own',
      descriptor: {},
      initializer() {
        const val = descriptor.initializer.call(this);
        /* istanbul ignore else */
        if (typeof this.constructor.initialState === 'undefined') {
          this.constructor.initialState = {};
        }
        /* istanbul ignore else */
        if (typeof this.constructor.initialState[key] === 'undefined') {
          this.constructor.initialState[key] = val;
        }

        Object.defineProperty(this, key, {
          get() {
            return this.state[key];
          },
          set(value) {
            this.commit(Object.assign({}, this.state, {
              [key]: value
            }));
          },
          enumerable: true
        });
      },
      finisher(clazz) {}
    };
  };
}

export {
  decorate,
  state
};