Skip to content

Commit 366d97c

Browse files
authoredApr 2, 2024··
fix(utils): fix object diff with getter only property (#5466)
1 parent 91b06cc commit 366d97c

File tree

2 files changed

+37
-2
lines changed

2 files changed

+37
-2
lines changed
 

‎packages/utils/src/helpers.ts

+9-2
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,15 @@ export function clone<T>(
111111
if (!descriptor)
112112
continue
113113
const cloned = clone((val as any)[k], seen, options)
114-
if ('get' in descriptor) {
114+
if (options.forceWritable) {
115+
Object.defineProperty(out, k, {
116+
enumerable: descriptor.enumerable,
117+
configurable: true,
118+
writable: true,
119+
value: cloned,
120+
})
121+
}
122+
else if ('get' in descriptor) {
115123
Object.defineProperty(out, k, {
116124
...descriptor,
117125
get() {
@@ -122,7 +130,6 @@ export function clone<T>(
122130
else {
123131
Object.defineProperty(out, k, {
124132
...descriptor,
125-
writable: options.forceWritable ? true : descriptor.writable,
126133
value: cloned,
127134
})
128135
}

‎test/core/test/diff.test.ts

+28
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,34 @@ test('asymmetric matcher in nested', () => {
115115
`)
116116
})
117117

118+
test('getter only property', () => {
119+
setupColors(getDefaultColors())
120+
const x = { normalProp: 1 }
121+
const y = { normalProp: 2 }
122+
Object.defineProperty(x, 'getOnlyProp', {
123+
enumerable: true,
124+
get: () => ({ a: 'b' }),
125+
})
126+
Object.defineProperty(y, 'getOnlyProp', {
127+
enumerable: true,
128+
get: () => ({ a: 'b' }),
129+
})
130+
expect(
131+
getErrorDiff(x, y),
132+
).toMatchInlineSnapshot(`
133+
"- Expected
134+
+ Received
135+
136+
Object {
137+
"getOnlyProp": Object {
138+
"a": "b",
139+
},
140+
- "normalProp": 2,
141+
+ "normalProp": 1,
142+
}"
143+
`)
144+
})
145+
118146
function getErrorDiff(actual: unknown, expected: unknown) {
119147
try {
120148
expect(actual).toEqual(expected)

0 commit comments

Comments
 (0)
Please sign in to comment.