the-forest/client/node_modules/utila/lib/object.js

159 lines
3.8 KiB
JavaScript
Raw Normal View History

2024-09-17 20:35:18 -04:00
// 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;
}
};