@atlaskit/editor-common
Version:
A package that contains common classes and components for editor and renderer
117 lines (115 loc) • 4.29 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.serializeValue = exports.getShallowPropsDifference = exports.getPropsDifference = exports.getKeysAddedRemovedCommon = exports.getKeys = void 0;
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _react = _interopRequireDefault(require("react"));
var getKeys = exports.getKeys = Object.keys;
var getKeysAddedRemovedCommon = exports.getKeysAddedRemovedCommon = function getKeysAddedRemovedCommon(object1, object2) {
var oldKeys = object1 !== null ? getKeys(object1) : [];
var newKeys = object2 !== null ? getKeys(object2) : [];
var removed = oldKeys.filter(function (key) {
return !newKeys.includes(key);
});
var added = newKeys.filter(function (key) {
return !oldKeys.includes(key);
});
var common = oldKeys.filter(function (key) {
return newKeys.includes(key);
});
return {
added: added,
common: common,
removed: removed
};
};
var serializeValue = exports.serializeValue = function serializeValue(value) {
var valueType = (0, _typeof2.default)(value);
if (value === null) {
return 'null';
} else if (value === undefined) {
return 'undefined';
} else if (valueType === 'string' || valueType === 'number') {
return value;
} else if (valueType === 'symbol') {
return value.toString();
}
// Calling toString of function returns whole function text with body.
// So, just return function with name.
else if (valueType === 'function') {
return "function:".concat(value.name);
} else if (valueType === 'object') {
return {
type: 'object',
keys: Object.keys(value)
};
}
};
var getPropsDifference = exports.getPropsDifference = function getPropsDifference(object1, object2) {
var curDepth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
var maxDepth = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 2;
var keysToIgnore = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];
var _getKeysAddedRemovedC = getKeysAddedRemovedCommon(object1, object2),
added = _getKeysAddedRemovedC.added,
common = _getKeysAddedRemovedC.common,
removed = _getKeysAddedRemovedC.removed;
var changed = [];
common.forEach(function (key) {
var value1 = object1[key];
var value2 = object2[key];
var value1Type = (0, _typeof2.default)(value1);
var value2Type = (0, _typeof2.default)(value2);
// Do comparision only if values doesn't match (or reference to same object in memory).
// Or if key does not exist in keys to ignore.
if (value1 !== value2 && keysToIgnore.indexOf(key) === -1) {
// if both key value are objects and not referencing same object in memory.
// then get recursive difference.
if ( /*#__PURE__*/_react.default.isValidElement(value1) || /*#__PURE__*/_react.default.isValidElement(value2)) {
changed.push({
key: key,
reactElementChanged: true
});
} else if (value1Type === 'object' && value2Type === 'object') {
if (curDepth <= maxDepth) {
var difference = getPropsDifference(value1, value2, curDepth + 1, maxDepth);
changed.push({
key: key,
difference: difference
});
} else {
changed.push({
key: key,
maxDepthReached: true
});
}
} else {
changed.push({
key: key,
oldValue: serializeValue(value1),
newValue: serializeValue(value2)
});
}
}
});
return {
added: added,
changed: changed,
removed: removed
};
};
var getShallowPropsDifference = exports.getShallowPropsDifference = function getShallowPropsDifference(object1, object2) {
var _getKeysAddedRemovedC2 = getKeysAddedRemovedCommon(object1, object2),
added = _getKeysAddedRemovedC2.added,
common = _getKeysAddedRemovedC2.common,
removed = _getKeysAddedRemovedC2.removed;
var changed = common.filter(function (key) {
return object1[key] !== object2[key];
});
return {
added: added,
changed: changed,
removed: removed
};
};