diff --git a/.changeset/eleven-taxis-hear.md b/.changeset/eleven-taxis-hear.md new file mode 100644 index 000000000..f75fcdc90 --- /dev/null +++ b/.changeset/eleven-taxis-hear.md @@ -0,0 +1,5 @@ +--- +'slate': patch +--- + +Fixed flaw in deep-equal algorithm when dealing with nested mark objects diff --git a/packages/slate/src/utils/deep-equal.ts b/packages/slate/src/utils/deep-equal.ts index 623474c46..027057909 100644 --- a/packages/slate/src/utils/deep-equal.ts +++ b/packages/slate/src/utils/deep-equal.ts @@ -17,7 +17,7 @@ export const isDeepEqual = ( for (const key in node) { const a = node[key] const b = another[key] - if (isPlainObject(a)) { + if (isPlainObject(a) && isPlainObject(b)) { if (!isDeepEqual(a, b)) return false } else if (Array.isArray(a) && Array.isArray(b)) { if (a.length !== b.length) return false diff --git a/packages/slate/test/utils/deep-equal/deep-not-equal-nested-undefined.js b/packages/slate/test/utils/deep-equal/deep-not-equal-nested-undefined.js new file mode 100644 index 000000000..b5a26d47d --- /dev/null +++ b/packages/slate/test/utils/deep-equal/deep-not-equal-nested-undefined.js @@ -0,0 +1,21 @@ +import { isDeepEqual } from '../../../src/utils/deep-equal' + +export const input = { + objectA: { + text: 'same text', + bold: true, + italic: { origin: 'inherited', value: true }, + underline: { origin: 'inherited', value: false }, + }, + objectB: { + text: 'same text', + bold: true, + italic: { origin: 'inherited', value: true }, + }, +} + +export const test = ({ objectA, objectB }) => { + return isDeepEqual(objectA, objectB) +} + +export const output = false