From b1e5d0aa4ec8286225925807c058c4eaf4046736 Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Thu, 21 Nov 2024 10:44:31 +0100 Subject: [PATCH] fix(core): Do not throw when trying to fill readonly properties --- packages/core/src/utils-hoist/object.ts | 6 ++++- packages/core/test/utils-hoist/object.test.ts | 23 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/packages/core/src/utils-hoist/object.ts b/packages/core/src/utils-hoist/object.ts index e0424f6aa120..13ddff35664b 100644 --- a/packages/core/src/utils-hoist/object.ts +++ b/packages/core/src/utils-hoist/object.ts @@ -32,7 +32,11 @@ export function fill(source: { [key: string]: any }, name: string, replacementFa markFunctionWrapped(wrapped, original); } - source[name] = wrapped; + try { + source[name] = wrapped; + } catch { + DEBUG_BUILD && logger.log(`Failed to replace method "${name}" in object`, source); + } } /** diff --git a/packages/core/test/utils-hoist/object.test.ts b/packages/core/test/utils-hoist/object.test.ts index de9a44b8f74c..7e39c463336c 100644 --- a/packages/core/test/utils-hoist/object.test.ts +++ b/packages/core/test/utils-hoist/object.test.ts @@ -31,6 +31,29 @@ describe('fill()', () => { expect(replacement).toBeCalled(); }); + test('does not throw on readonly properties', () => { + const originalFn = () => 41; + const source = { + get prop() { + return originalFn; + }, + set prop(_fn: () => number) { + throw new Error('OH NO, this is not writeable...'); + }, + }; + + expect(source.prop()).toEqual(41); + + const replacement = jest.fn().mockImplementation(() => { + return () => 42; + }); + fill(source, 'prop', replacement); + expect(replacement).toBeCalled(); + + expect(source.prop).toBe(originalFn); + expect(source.prop()).toEqual(41); + }); + test('can do anything inside replacement function', () => { const source = { foo: (): number => 42,