transmutable
Version:
immutable objects that pretend to be mutable
39 lines (31 loc) • 1.53 kB
JavaScript
;
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var _require = require('./symbols'),
MUTATION = _require.MUTATION;
module.exports = function diff(a, b) {
if (a && (typeof a === 'undefined' ? 'undefined' : _typeof(a)) == 'object' && b && (typeof b === 'undefined' ? 'undefined' : _typeof(b)) == 'object') {
if (Array.isArray(a) && Array.isArray(b)) {
var areSame = a.length == b.length && a.every(function (item, i) {
return diff(item, b[i]) === undefined;
});
if (!areSame) {
return _defineProperty({}, MUTATION, {
value: b
});
}
}
var keys = Object.keys(b).concat(Object.keys(a));
var patch = {};
keys.forEach(function (k) {
var deeperPatch = diff(a[k], b[k]);
if (deeperPatch) patch[k] = deeperPatch;
});
return Object.keys(patch).length ? patch : undefined;
}
if (a !== b) {
return _defineProperty({}, MUTATION, {
value: b
});
}
};