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.
158 lines
3.8 KiB
158 lines
3.8 KiB
// 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; |
|
} |
|
};
|
|
|