var util = require('../util');
function isEmpty(obj) {
return Object.keys(obj).length === 0;
}
;
function extend(instance, schema) {
return merge(instantiate(schema), instance);
}
exports.extend = extend;
;
function instantiate(schema) {
var val;
Iif (schema === undefined) {
return undefined;
}
else if ('default' in schema) {
val = schema.default;
return util.isObject(val) ? util.duplicate(val) : val;
}
else if (schema.type === 'object') {
var instance = {};
for (var name in schema.properties) {
val = instantiate(schema.properties[name]);
if (val !== undefined) {
instance[name] = val;
}
}
return instance;
}
else if (schema.type === 'array') {
return [];
}
return undefined;
}
exports.instantiate = instantiate;
;
function subtract(instance, defaults) {
var changes = {};
for (var prop in instance) {
var def = defaults[prop];
var ins = instance[prop];
if (!defaults || def !== ins) {
if (typeof ins === 'object' && !util.isArray(ins) && def) {
var c = subtract(ins, def);
if (!isEmpty(c))
changes[prop] = c;
}
else Eif (!util.isArray(ins) || ins.length > 0) {
changes[prop] = ins;
}
}
}
return changes;
}
exports.subtract = subtract;
;
function merge(dest) {
var src = [];
for (var _i = 1; _i < arguments.length; _i++) {
src[_i - 1] = arguments[_i];
}
for (var i = 0; i < src.length; i++) {
dest = merge_(dest, src[i]);
}
return dest;
}
exports.merge = merge;
;
function merge_(dest, src) {
Iif (typeof src !== 'object' || src === null) {
return dest;
}
for (var p in src) {
Iif (!src.hasOwnProperty(p)) {
continue;
}
if (src[p] === undefined) {
continue;
}
if (typeof src[p] !== 'object' || src[p] === null) {
dest[p] = src[p];
}
else if (typeof dest[p] !== 'object' || dest[p] === null) {
dest[p] = merge(src[p].constructor === Array ? [] : {}, src[p]);
}
else {
merge(dest[p], src[p]);
}
}
return dest;
}
//# sourceMappingURL=schemautil.js.map |