diff --git a/src/types/index.ts b/src/types/index.ts index ba8e0ba..016285a 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -1,6 +1,6 @@ export interface ProxyHandler { changes: Record; - content: unknown; + content: Content; proxy: any; children: Record; safeGet: (obj: any, key: string) => any; diff --git a/src/utils/object-tree-node.ts b/src/utils/object-tree-node.ts index 9e93633..07844e0 100644 --- a/src/utils/object-tree-node.ts +++ b/src/utils/object-tree-node.ts @@ -53,15 +53,27 @@ const objectProxyHandler = { }, ownKeys(node: ProxyHandler): any { - return Reflect.ownKeys(node.changes); + // If changes have been made reflect the change, otherwise reflect the original content + if (Object.keys(node.changes).length > 0) { + return Reflect.ownKeys(node.changes); + } + return Reflect.ownKeys(node.content); }, getOwnPropertyDescriptor(node: ProxyHandler, prop: string): any { - return Reflect.getOwnPropertyDescriptor(node.changes, prop); + // If changes have been made reflect the change, otherwise reflect the original content + if (Object.keys(node.changes).length > 0) { + return Reflect.getOwnPropertyDescriptor(node.changes, prop); + } + return Reflect.getOwnPropertyDescriptor(node.content, prop); }, has(node: ProxyHandler, prop: string): any { - return Reflect.has(node.changes, prop); + // If changes have been made reflect the change, otherwise reflect the original content + if (Object.keys(node.changes).length > 0) { + return Reflect.has(node.changes, prop); + } + return Reflect.has(node.content, prop); }, set(node: ProxyHandler, key: string, value: unknown): any { diff --git a/test/validated.test.ts b/test/validated.test.ts index f13bfb2..0fee69c 100644 --- a/test/validated.test.ts +++ b/test/validated.test.ts @@ -455,6 +455,22 @@ describe('Unit | Utility | validation changeset', () => { const expectedResult = get(model, 'foo.bar.dog'); expect(actual).toEqual(expectedResult); } + { + // Check Object.keys is proxied to the original model when no change has been made + const c = Changeset(model); + const actual = Object.keys(get(c, 'foo')); + const expectedResult = Object.keys(get(model, 'foo')); + expect(actual).toEqual(expectedResult); + } + { + // Check Object.keys is proxied to the change when a change has been made + const c = Changeset(model); + const newFoo = { baz: { dog: new Dog('woof') } }; + set(c, 'foo', newFoo); + const actual = Object.keys(get(c, 'foo')); + const expectedResult = Object.keys(newFoo); + expect(actual).toEqual(expectedResult); + } }); it('#get proxies to underlying array properties', () => {