From ba6ea8ee131443798c16b69378d2a92149d8e27c Mon Sep 17 00:00:00 2001 From: Sergey Tatarintsev Date: Mon, 27 Mar 2023 17:25:47 +0200 Subject: [PATCH] fix(client): Correct result for hasOwn/hasOwnProperty on proxies (#18519) Problem is in compositeProxy implamentation: we always returned a descriptor from `getOwnPropertyDescriptor`, which caused `hasOwnProperty` to always return `true` regardless of propery existence. Fix #18462 --- .../compositeProxy/createCompositeProxy.test.ts | 5 +++++ .../core/compositeProxy/createCompositeProxy.ts | 16 ++++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/packages/client/src/runtime/core/compositeProxy/createCompositeProxy.test.ts b/packages/client/src/runtime/core/compositeProxy/createCompositeProxy.test.ts index 610eccfae636..1bae18fae1b5 100644 --- a/packages/client/src/runtime/core/compositeProxy/createCompositeProxy.test.ts +++ b/packages/client/src/runtime/core/compositeProxy/createCompositeProxy.test.ts @@ -36,6 +36,11 @@ test('allows to add extra properties via layers', () => { expect(proxy).toHaveProperty('second', 2) }) +test('preserves correct Object.prototype.hasOwnProperty result', () => { + const proxy = createCompositeProxy({}, []) + expect(Object.prototype.hasOwnProperty.call(proxy, 'notThere')).toBe(false) +}) + test('allows to add multiple properties via single layer', () => { const proxy = createCompositeProxy({}, [ { diff --git a/packages/client/src/runtime/core/compositeProxy/createCompositeProxy.ts b/packages/client/src/runtime/core/compositeProxy/createCompositeProxy.ts index 2a19f70e8882..bb1cc88555f0 100644 --- a/packages/client/src/runtime/core/compositeProxy/createCompositeProxy.ts +++ b/packages/client/src/runtime/core/compositeProxy/createCompositeProxy.ts @@ -1,4 +1,4 @@ -import { type InspectOptions, inspect } from 'util' +import { inspect, type InspectOptions } from 'util' import { defaultPropertyDescriptor } from '../model/utils/defaultProxyHandlers' @@ -91,13 +91,17 @@ export function createCompositeProxy(target: T, layers: Compos getOwnPropertyDescriptor(target, prop) { const layer = keysToLayerMap.get(prop) - if (layer && layer.getPropertyDescriptor) { - return { - ...defaultPropertyDescriptor, - ...layer.getPropertyDescriptor(prop), + if (layer) { + if (layer.getPropertyDescriptor) { + return { + ...defaultPropertyDescriptor, + ...layer?.getPropertyDescriptor(prop), + } } + return defaultPropertyDescriptor } - return defaultPropertyDescriptor + + return Reflect.getOwnPropertyDescriptor(target, prop) }, defineProperty(target, property, attributes) {