From afaa73717aa78da43f5a1708b521c14dd23bd19e Mon Sep 17 00:00:00 2001 From: aleclarson Date: Sat, 5 Jan 2019 14:26:16 -0500 Subject: [PATCH] fix: property descriptor edge cases Using the `drafts` object as a source of property descriptors is bad, because enumerability is not preserved by the `drafts` object. Thus, we must use `state.base` when `state.copy` is undefined, which means we need to ensure the property descriptor has a `writable` value of true. Otherwise, the descriptor would be lying. --- src/proxy.js | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/proxy.js b/src/proxy.js index bd126df9..6aee2a64 100644 --- a/src/proxy.js +++ b/src/proxy.js @@ -150,15 +150,13 @@ function deleteProperty(state, prop) { } function getOwnPropertyDescriptor(state, prop) { - const owner = state.modified - ? state.copy - : has(state.drafts, prop) - ? state.drafts - : state.base - const descriptor = Reflect.getOwnPropertyDescriptor(owner, prop) - if (descriptor && !(Array.isArray(owner) && prop === "length")) - descriptor.configurable = true - return descriptor + const owner = source(state) + const desc = Reflect.getOwnPropertyDescriptor(owner, prop) + if (desc) { + desc.writable = true + desc.configurable = !Array.isArray(owner) || prop !== "length" + } + return desc } function markChanged(state) {