| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 | // Generated by CoffeeScript 1.6.3var object, _common,  __hasProp = {}.hasOwnProperty;_common = require('./_common');module.exports = object = {  isBareObject: _common.isBareObject.bind(_common),  /*  	if object is an instance of a class  */  isInstance: function(what) {    return !this.isBareObject(what);  },  /*  	Alias to _common.typeOf  */  typeOf: _common.typeOf.bind(_common),  /*  	Alias to _common.clone  */  clone: _common.clone.bind(_common),  /*  	Empties an object of its properties.  */  empty: function(o) {    var prop;    for (prop in o) {      if (o.hasOwnProperty(prop)) {        delete o[prop];      }    }    return o;  },  /*  	Empties an object. Doesn't check for hasOwnProperty, so it's a tiny  	bit faster. Use it for plain objects.  */  fastEmpty: function(o) {    var property;    for (property in o) {      delete o[property];    }    return o;  },  /*  	Overrides values fomr `newValues` on `base`, as long as they  	already exist in base.  */  overrideOnto: function(base, newValues) {    var key, newVal, oldVal;    if (!this.isBareObject(newValues) || !this.isBareObject(base)) {      return base;    }    for (key in base) {      oldVal = base[key];      newVal = newValues[key];      if (newVal === void 0) {        continue;      }      if (typeof newVal !== 'object' || this.isInstance(newVal)) {        base[key] = this.clone(newVal);      } else {        if (typeof oldVal !== 'object' || this.isInstance(oldVal)) {          base[key] = this.clone(newVal);        } else {          this.overrideOnto(oldVal, newVal);        }      }    }    return base;  },  /*  	Takes a clone of 'base' and runs #overrideOnto on it  */  override: function(base, newValues) {    return this.overrideOnto(this.clone(base), newValues);  },  append: function(base, toAppend) {    return this.appendOnto(this.clone(base), toAppend);  },  appendOnto: function(base, toAppend) {    var key, newVal, oldVal;    if (!this.isBareObject(toAppend) || !this.isBareObject(base)) {      return base;    }    for (key in toAppend) {      if (!__hasProp.call(toAppend, key)) continue;      newVal = toAppend[key];      if (newVal === void 0) {        continue;      }      if (typeof newVal !== 'object' || this.isInstance(newVal)) {        base[key] = newVal;      } else {        oldVal = base[key];        if (typeof oldVal !== 'object' || this.isInstance(oldVal)) {          base[key] = this.clone(newVal);        } else {          this.appendOnto(oldVal, newVal);        }      }    }    return base;  },  groupProps: function(obj, groups) {    var def, defs, grouped, key, name, shouldAdd, val, _i, _len;    grouped = {};    for (name in groups) {      defs = groups[name];      grouped[name] = {};    }    grouped['rest'] = {};    top: //;    for (key in obj) {      val = obj[key];      shouldAdd = false;      for (name in groups) {        defs = groups[name];        if (!Array.isArray(defs)) {          defs = [defs];        }        for (_i = 0, _len = defs.length; _i < _len; _i++) {          def = defs[_i];          if (typeof def === 'string') {            if (key === def) {              shouldAdd = true;            }          } else if (def instanceof RegExp) {            if (def.test(key)) {              shouldAdd = true;            }          } else if (def instanceof Function) {            if (def(key)) {              shouldAdd = true;            }          } else {            throw Error('Group definitions must either\						be strings, regexes, or functions.');          }          if (shouldAdd) {            grouped[name][key] = val;            continue top;          }        }      }      grouped['rest'][key] = val;    }    return grouped;  }};
 |