lib/yamb/proto/virtual.js

Summary

Maintainability
C
7 hrs
Test Coverage
"use strict";

var utils = require('./../../utils');

function descriptors(priv, yamb, options) {
  var props = {};

  function descriptor(param) {
    return {
      enumerable: true,

      get: function() {
        return yamb[priv.symbl][options.name][param];
      },

      set: function(value) {
        if (!utils.is.str(value)) {
          return;
        }

        value = utils.striptags(value.trim());

        if (utils.whitespace(value)) {
          value = '';
        }

        yamb[priv.symbl][options.name][param] = value;
        yamb[priv.flags][options.name] = yamb[priv.shado][options.name][param] !== value;
      }
    };
  }

  for (var i=0, length=options.params.length; i<length; i++) {
    props[options.params[i]] = descriptor(options.params[i]);
  }

  return props;
}

module.exports = function(priv, options) {
  var getter = function() {
    if (!utils.is.obj(this[priv.cache][options.name])) {
      this[priv.cache][options.name] = Object.defineProperties({}, descriptors(priv, this, options));
    }

    return this[priv.cache][options.name];
  };

  var setter = function(value) {
    if (options.direct && utils.is.str(value)) {
      value = utils.striptags(value.trim());

      if (!utils.whitespace(value)) {
        this[priv.symbl][options.name][options.direct] = value;
        this[priv.flags][options.name] = this[priv.shado][options.name][options.direct] !== value;
      }

      return;
    }

    if (!utils.is.obj(value)) {
      return;
    }

    var val;
    var changes = false;

    for (var i=0, length=options.params.length; i<length; i++) {
      if (!utils.is.str(value[options.params[i]])) {
        continue;
      }

      val = utils.striptags(value[options.params[i]].trim());

      if (utils.whitespace(val)) {
        val = '';
      }

      this[priv.symbl][options.name][options.params[i]] = val;

      if (this[priv.shado][options.name][options.params[i]] !== val) {
        changes = true;
      }
    }

    this[priv.flags][options.name] = changes;
  };

  var validate = function(value) {
    if (!utils.is.obj(value) || Object.keys(value).length !== options.params.length) {
      return false;
    }

    for (var i=0, length=options.params.length; i<length; i++) {
      if (!utils.is.str(value[options.params[i]])) {
        return false;
      }
    }

    return true;
  };

  return {
    validate: validate,
    get: getter,
    set: setter
  };
};