From 6ec399d4db60f1a8d59268c333b43a26dc518b79 Mon Sep 17 00:00:00 2001 From: Andrew Herron Date: Tue, 14 Sep 2021 17:32:47 +1000 Subject: [PATCH] Fixed nested object comparison when the second value doesn't have that key (#4518) --- .changeset/eleven-taxis-hear.md | 5 +++++ packages/slate/src/utils/deep-equal.ts | 2 +- .../deep-not-equal-nested-undefined.js | 21 +++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 .changeset/eleven-taxis-hear.md create mode 100644 packages/slate/test/utils/deep-equal/deep-not-equal-nested-undefined.js 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