diff --git a/packages/core/src/utils/chain-and-copy-promiselike.ts b/packages/core/src/utils/chain-and-copy-promiselike.ts index 4d8db088d22e..ea04d77e015e 100644 --- a/packages/core/src/utils/chain-and-copy-promiselike.ts +++ b/packages/core/src/utils/chain-and-copy-promiselike.ts @@ -32,6 +32,7 @@ export const chainAndCopyPromiseLike = >( // eslint-disable-next-line @typescript-eslint/no-explicit-any const copyProps = >(original: T, chained: T): T => { + if (!chained) return original; let mutated = false; //oxlint-disable-next-line guard-for-in for (const key in original) { diff --git a/packages/core/test/lib/utils/chain-and-copy-promiselike.test.ts b/packages/core/test/lib/utils/chain-and-copy-promiselike.test.ts index 2f4415940dc8..d357ffd9bb34 100644 --- a/packages/core/test/lib/utils/chain-and-copy-promiselike.test.ts +++ b/packages/core/test/lib/utils/chain-and-copy-promiselike.test.ts @@ -53,4 +53,25 @@ describe('chain and copy promiselike objects', () => { expect(success).toBe(true); expect(error).toBe(false); }); + + it('returns original when .then() returns undefined', () => { + const original = { + value: 42, + then() { + return undefined; + }, + customMethod() { + return 'hello'; + }, + } as unknown as PromiseLike & { customMethod: () => string }; + + const q = chainAndCopyPromiseLike( + original, + () => {}, + () => {}, + ); + + expect(q).toBe(original); + expect((q as typeof original).customMethod()).toBe('hello'); + }); });