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.
		
		
		
		
			
				
					159 lines
				
				3.8 KiB
			
		
		
			
		
	
	
					159 lines
				
				3.8 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								// Generated by CoffeeScript 1.6.3
							 | 
						||
| 
								 | 
							
								var 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;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								};
							 |