diff --git a/src/reactive-handler.ts b/src/reactive-handler.ts index 6a4e631..f7b13d3 100644 --- a/src/reactive-handler.ts +++ b/src/reactive-handler.ts @@ -1,7 +1,6 @@ import { toString, isUndefined, - unwrap, ArrayConcat, isArray, ObjectDefineProperty, @@ -29,9 +28,9 @@ function wrapValue(membrane: ReactiveMembrane, value: any): any { * We only need to unwrap if value is specified * @param descriptor external descrpitor provided to define new property on original value */ -function unwrapDescriptor(descriptor: PropertyDescriptor): PropertyDescriptor { +function unwrapDescriptor(membrane: ReactiveMembrane, descriptor: PropertyDescriptor): PropertyDescriptor { if (hasOwnProperty.call(descriptor, 'value')) { - descriptor.value = unwrap(descriptor.value); + descriptor.value = membrane.unwrapProxy(descriptor.value); } return descriptor; } @@ -71,8 +70,10 @@ export class ReactiveProxyHandler { return membrane.getProxy(value); } set(shadowTarget: ReactiveMembraneShadowTarget, key: PropertyKey, value: any): boolean { - const { originalTarget, membrane: { valueMutated } } = this; + const { originalTarget, membrane } = this; const oldValue = originalTarget[key]; + const { valueMutated } = membrane; + value = membrane.unwrapProxy(value); if (oldValue !== value) { originalTarget[key] = value; valueMutated(originalTarget, key); @@ -182,7 +183,7 @@ export class ReactiveProxyHandler { const originalDescriptor = getOwnPropertyDescriptor(originalTarget, key) as PropertyDescriptor; descriptor.value = originalDescriptor.value; } - ObjectDefineProperty(originalTarget, key, unwrapDescriptor(descriptor)); + ObjectDefineProperty(originalTarget, key, unwrapDescriptor(membrane, descriptor)); if (configurable === false) { ObjectDefineProperty(shadowTarget, key, wrapDescriptor(membrane, descriptor, wrapValue)); } diff --git a/src/reactive-membrane.ts b/src/reactive-membrane.ts index e7311da..faaad51 100644 --- a/src/reactive-membrane.ts +++ b/src/reactive-membrane.ts @@ -140,7 +140,13 @@ export class ReactiveMembrane { } unwrapProxy(p: any) { - return unwrap(p); + const unwrapped = unwrap(p); + const distorted = this.valueDistortion(unwrapped); + const reactiveState = this.objectGraph.get(distorted); + if (reactiveState && reactiveState.readOnly === p) { + return p; + } + return distorted; } private getReactiveState(value: any, distortedValue: any): ReactiveState {