diff --git a/src/utils/set-deep.ts b/src/utils/set-deep.ts index e95c488..75ad217 100644 --- a/src/utils/set-deep.ts +++ b/src/utils/set-deep.ts @@ -20,9 +20,9 @@ function findSiblings(target: any, keys: string[]) { .reduce((acc, key) => { acc[key] = target[key]; return acc; - }, Object.create(null)); + }, Object.create(target)); - return { ...remaining }; + return remaining; } function isValidKey(key: unknown) { diff --git a/test/index.test.ts b/test/index.test.ts index 1d9044b..c54bc26 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -858,6 +858,48 @@ describe('Unit | Utility | changeset', () => { expect(dummyModel.name.short).toBe('foo'); }); + it('#set works for nested class instances', () => { + class Person { + public name: Name; + public age: number; + public original: object; + + constructor(name: Name, age: number, org: object) { + this.name = name; + this.age = age; + this.original = org; + } + } + + class Name { + public current: object; + + constructor(current: object) { + this.current = current; + } + } + + const expectedChanges = new Person(new Name({ short: 'bar' }), 30, {}); + dummyModel.name = {}; + dummyModel.org = {}; + dummyModel.age = 30; + const dummyChangeset = Changeset(dummyModel); + const expectedName = new Name({ short: 'foo' }); + dummyChangeset.set('name', expectedName); + + expect(dummyChangeset.get('name.current.short')).toBe('foo'); + expect(dummyChangeset.get('name')).toEqual(expectedName); + dummyChangeset.set('name.current.short', 'bar'); + + const changes = dummyChangeset.change; + expect(changes.name).toEqual(expectedChanges.name); + expect(dummyChangeset.name).toEqual(expectedChanges.name); + expect(dummyChangeset.age).toEqual(expectedChanges.age); + expect(dummyChangeset.org).toEqual({}); + + expect(dummyModel.name).toEqual({}); + }); + it('#set overrides', () => { const expectedChanges = [{ key: 'age', value: '90' }]; let dummyChangeset = Changeset({ age: '10' }); diff --git a/test/validated.test.ts b/test/validated.test.ts index f13bfb2..4c0ce81 100644 --- a/test/validated.test.ts +++ b/test/validated.test.ts @@ -605,6 +605,48 @@ describe('Unit | Utility | validation changeset', () => { expect(dummyModel.name.short).toBe('foo'); }); + it('#set works for nested class instances', () => { + class Person { + public name: Name; + public age: number; + public original: object; + + constructor(name: Name, age: number, org: object) { + this.name = name; + this.age = age; + this.original = org; + } + } + + class Name { + public current: object; + + constructor(current: object) { + this.current = current; + } + } + + const expectedChanges = new Person(new Name({ short: 'bar' }), 30, {}); + dummyModel.name = {}; + dummyModel.org = {}; + dummyModel.age = 30; + const dummyChangeset = Changeset(dummyModel); + const expectedName = new Name({ short: 'foo' }); + dummyChangeset.set('name', expectedName); + + expect(dummyChangeset.get('name.current.short')).toBe('foo'); + expect(dummyChangeset.get('name')).toEqual(expectedName); + dummyChangeset.set('name.current.short', 'bar'); + + const changes = dummyChangeset.changes; + expect(changes.name.current).toEqual(expectedChanges.name); + expect(dummyChangeset.name).toEqual(expectedChanges.name); + expect(dummyChangeset.age).toEqual(expectedChanges.age); + expect(dummyChangeset.org).toEqual({}); + + expect(dummyModel.name).toEqual({}); + }); + it('#set overrides', () => { const expectedChanges = { age: { current: '90', original: '10' } }; let dummyChangeset = Changeset({ age: '10' });