From 7ed96b2bb73ff946f6a51661859d28de66529149 Mon Sep 17 00:00:00 2001 From: Henry Lin Date: Sun, 11 Jun 2023 15:37:49 +0800 Subject: [PATCH] fix: wrapped ref should not report descriptors for non-configurable properties --- src/__tests__/helper.test.tsx | 7 +++++++ src/helper.ts | 9 ++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/__tests__/helper.test.tsx b/src/__tests__/helper.test.tsx index caa4e01..823820a 100644 --- a/src/__tests__/helper.test.tsx +++ b/src/__tests__/helper.test.tsx @@ -25,6 +25,13 @@ describe('createWrappedRef', () => { expect(Object.getOwnPropertyDescriptor(wrapped, 'a')).toEqual( Object.getOwnPropertyDescriptor(obj, 'a') ); + + Object.defineProperty(obj, 'a', { + configurable: false, + }); + // expect non-configurable properties to not be reported as existing + // see invariants at https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy/Proxy/getOwnPropertyDescriptor#invariants + expect(Object.getOwnPropertyDescriptor(wrapped, 'a')).toBeUndefined(); }); it('traps getPrototypeOf', () => { const obj = { a: 1 }; diff --git a/src/helper.ts b/src/helper.ts index 6acfa49..37ad7dd 100644 --- a/src/helper.ts +++ b/src/helper.ts @@ -109,7 +109,14 @@ export function createWrappedRef(ref: T): WrappedRef { else return Reflect.get(target[WRAP_KEY] as any, p, receiver); }, getOwnPropertyDescriptor(target, p) { - return Reflect.getOwnPropertyDescriptor(target[WRAP_KEY] as any, p); + const descriptor = Reflect.getOwnPropertyDescriptor( + target[WRAP_KEY] as any, + p + ); + if (descriptor && !descriptor.configurable) { + return undefined; + } + return descriptor; }, getPrototypeOf(target) { return Reflect.getPrototypeOf(target[WRAP_KEY] as any);