159 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // 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;
 | |
|   }
 | |
| };
 |