@atlaskit/editor-common
Version:
A package that contains common classes and components for editor and renderer
120 lines (117 loc) • 4.39 kB
JavaScript
// Ignored via go/ees005
// eslint-disable-next-line @typescript-eslint/no-explicit-any
function makeSameType(_a, _b) {
return true;
}
export var shallowEqual = function shallowEqual(objA, objB) {
if (objA === objB) {
return true;
}
if (objA == null || objB == null) {
return false;
}
var keysA = Object.keys(objA);
var keysB = Object.keys(objB);
if (keysA.length !== keysB.length) {
return false;
}
var bHasOwnProperty = Object.prototype.hasOwnProperty.bind(objB);
for (var idx = 0; idx < keysA.length; idx++) {
var key = keysA[idx];
if (!bHasOwnProperty(key)) {
return false;
}
// Ignored via go/ees005
// eslint-disable-next-line @typescript-eslint/no-explicit-any
if (objA[key] !== objB[key]) {
return false;
}
}
return true;
};
// Ignored via go/ees005
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export var compareArrays = function compareArrays(left, right) {
var compareFn = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : shallowEqual;
if (left.length !== right.length) {
return false;
}
for (var idx = 0; idx < left.length; idx++) {
if (!compareFn(left[idx], right[idx])) {
return false;
}
}
return true;
};
var compareItemWithKeys = function compareItemWithKeys(leftItem, rightItem) {
var excludedKeys = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
return Object.keys(leftItem).filter(function (key) {
return excludedKeys.indexOf(key) === -1;
}).every(function (key) {
return leftItem[key] instanceof Object ?
// Ignored via go/ees005
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
// Ignored via go/ees005
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
shallowEqual(leftItem[key], rightItem[key]) : leftItem[key] === rightItem[key];
});
};
export var isSameItem = function isSameItem(leftItem, rightItem) {
if (leftItem.type !== rightItem.type) {
return false;
}
switch (leftItem.type) {
case 'button':
// Need to typecast `rightItem as typeof leftItem` otherwise we will
// have to put the `type !==` inside each case.
return compareItemWithKeys(leftItem, rightItem, ['type', 'onClick', 'onMouseEnter', 'onMouseLeave']);
case 'copy-button':
return compareItemWithKeys(leftItem, rightItem, ['type', 'items']);
case 'input':
return compareItemWithKeys(leftItem, rightItem, ['type', 'onSubmit', 'onBlur']);
case 'select':
if (makeSameType(leftItem, rightItem) && Array.isArray(leftItem.options) && Array.isArray(rightItem.options) &&
// Ignored via go/ees005
// eslint-disable-next-line @typescript-eslint/no-explicit-any
!compareArrays(leftItem.options, rightItem.options, function (left, right) {
return compareItemWithKeys(left, right);
})) {
return false;
}
return compareItemWithKeys(leftItem, rightItem, ['type', 'onChange', 'options']);
case 'dropdown':
if (makeSameType(leftItem, rightItem) && Array.isArray(leftItem.options) && Array.isArray(rightItem.options) &&
// @ts-expect-error TS2345: Argument of type 'DropdownOptionT<Function>[]' is not assignable to parameter of type 'any[][]'
!compareArrays(leftItem.options, rightItem.options, function (left, right) {
return (
// @ts-expect-error TS2322: Type '"onClick"' is not assignable to type 'keyof any[]'
compareItemWithKeys(left, right, ['onClick'])
);
})) {
return false;
}
return compareItemWithKeys(leftItem, rightItem, ['type', 'options']);
case 'custom':
return false;
case 'separator':
return compareItemWithKeys(leftItem, rightItem);
case 'extensions-placeholder':
return compareItemWithKeys(leftItem, rightItem);
}
};
export var areSameItems = function areSameItems(leftArr, rightArr) {
if (leftArr === undefined && rightArr === undefined) {
return true;
}
if (leftArr === undefined || rightArr === undefined) {
return false;
}
if (leftArr.length !== rightArr.length) {
return false;
}
return leftArr.every(function (item, index) {
return isSameItem(rightArr[index], item);
});
};
// eslint-disable-next-line @atlaskit/editor/no-re-export
export { default as messages } from './messages';