From f8492d246209c0b24add3c1ca93a640abbf888f1 Mon Sep 17 00:00:00 2001 From: Nithin <52503252+nithin42@users.noreply.github.com> Date: Wed, 19 Aug 2026 18:29:33 +0000 Subject: [PATCH] [lexical-utils] Bug Fix: objectKlassEquals throws on undefined and prototype-less objects (#9079) --- .../src/__tests__/unit/LexicalUtilsKlassEqual.test.ts | 9 +++++++++ packages/lexical-utils/src/index.ts | 11 ++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/packages/lexical-utils/src/__tests__/unit/LexicalUtilsKlassEqual.test.ts b/packages/lexical-utils/src/__tests__/unit/LexicalUtilsKlassEqual.test.ts index eaa830807de..d0ad78400a7 100644 --- a/packages/lexical-utils/src/__tests__/unit/LexicalUtilsKlassEqual.test.ts +++ b/packages/lexical-utils/src/__tests__/unit/LexicalUtilsKlassEqual.test.ts @@ -28,5 +28,14 @@ describe('LexicalUtilsKlassEqual tests', () => { expect(eventInstance instanceof MyEventShadow).toBeFalsy(); expect(objectKlassEquals(eventInstance, MyEventShadow)).toBeTruthy(); }); + it('objectKlassEquals with a nullish or prototype-less value', async () => { + // The parameter is typed `unknown`, and the existing `!== null` guard + // shows nullish input is expected to be answered, not thrown on. + expect(objectKlassEquals(null, MyEvent)).toBe(false); + expect(objectKlassEquals(undefined, MyEvent)).toBe(false); + // Object.getPrototypeOf() returns null for these, so reading + // .constructor off it throws. + expect(objectKlassEquals(Object.create(null), MyEvent)).toBe(false); + }); }); }); diff --git a/packages/lexical-utils/src/index.ts b/packages/lexical-utils/src/index.ts index b1abed2765f..ae53e2b73e9 100644 --- a/packages/lexical-utils/src/index.ts +++ b/packages/lexical-utils/src/index.ts @@ -848,9 +848,14 @@ export function objectKlassEquals( object: unknown, objectClass: ObjectKlass, ): object is T { - return object !== null - ? Object.getPrototypeOf(object).constructor.name === objectClass.name - : false; + if (object == null) { + return false; + } + const prototype = Object.getPrototypeOf(object); + if (prototype == null || prototype.constructor == null) { + return false; + } + return prototype.constructor.name === objectClass.name; } // Clipboard may contain files that we aren't allowed to read. While the event is arguably useless,