From 366d97c335913a897384a8216afbc8b4d5c9bc38 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Tue, 2 Apr 2024 19:58:56 +0900 Subject: [PATCH] fix(utils): fix object diff with getter only property (#5466) --- packages/utils/src/helpers.ts | 11 +++++++++-- test/core/test/diff.test.ts | 28 ++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/packages/utils/src/helpers.ts b/packages/utils/src/helpers.ts index 5a3b454a8d8b..40effb2a3836 100644 --- a/packages/utils/src/helpers.ts +++ b/packages/utils/src/helpers.ts @@ -111,7 +111,15 @@ export function clone( if (!descriptor) continue const cloned = clone((val as any)[k], seen, options) - if ('get' in descriptor) { + if (options.forceWritable) { + Object.defineProperty(out, k, { + enumerable: descriptor.enumerable, + configurable: true, + writable: true, + value: cloned, + }) + } + else if ('get' in descriptor) { Object.defineProperty(out, k, { ...descriptor, get() { @@ -122,7 +130,6 @@ export function clone( else { Object.defineProperty(out, k, { ...descriptor, - writable: options.forceWritable ? true : descriptor.writable, value: cloned, }) } diff --git a/test/core/test/diff.test.ts b/test/core/test/diff.test.ts index 18c3f2ec9a98..b68e9dd9a0c4 100644 --- a/test/core/test/diff.test.ts +++ b/test/core/test/diff.test.ts @@ -115,6 +115,34 @@ test('asymmetric matcher in nested', () => { `) }) +test('getter only property', () => { + setupColors(getDefaultColors()) + const x = { normalProp: 1 } + const y = { normalProp: 2 } + Object.defineProperty(x, 'getOnlyProp', { + enumerable: true, + get: () => ({ a: 'b' }), + }) + Object.defineProperty(y, 'getOnlyProp', { + enumerable: true, + get: () => ({ a: 'b' }), + }) + expect( + getErrorDiff(x, y), + ).toMatchInlineSnapshot(` + "- Expected + + Received + + Object { + "getOnlyProp": Object { + "a": "b", + }, + - "normalProp": 2, + + "normalProp": 1, + }" + `) +}) + function getErrorDiff(actual: unknown, expected: unknown) { try { expect(actual).toEqual(expected)