UNPKG

transmutable

Version:

immutable objects that pretend to be mutable

39 lines (31 loc) 1.53 kB
'use strict'; 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 }); } };