diff --git a/src/serde.ts b/src/serde.ts index 914041a..30e1f0f 100644 --- a/src/serde.ts +++ b/src/serde.ts @@ -31,7 +31,7 @@ export abstract class Serde extends Object { serialize() { const pluckProperties = Reflect.getMetadata(PLUCK_PROPERTIES_KEY, this) as {[key: string]: any}; - return Object.entries(this) + let serializedObj = Object.entries(this) .filter(([key, _]) => this.removeableProperty(key)) .reduce((obj, [key, value]) => { if (!!pluckProperties) { @@ -50,11 +50,12 @@ export abstract class Serde extends Object { } } obj[key] = this.recursiveSerialize(value); - if (typeof this.customSerialize === 'function') { - obj = this.customSerialize(obj); - } return obj; }, {} as Partial); + if (typeof this.customSerialize === 'function') { + serializedObj = this.customSerialize(serializedObj); + } + return serializedObj; } } \ No newline at end of file diff --git a/tests/decorators/custom-serializer.spec.ts b/tests/decorators/custom-serializer.spec.ts new file mode 100644 index 0000000..6fdcb2f --- /dev/null +++ b/tests/decorators/custom-serializer.spec.ts @@ -0,0 +1,30 @@ +import 'reflect-metadata'; +import { Serde } from "src/serde"; +import { Exclude } from 'src/decorators'; + +class NestedModel extends Serde { + name: string; + @Exclude() excluded: boolean; +} + +class ParentModel extends Serde { + name: string; + nested: NestedModel; + @Exclude() excluded: boolean; +} + +describe('Custom serlializer', () => { + it('should run custom seiralizer once', () => { + const testModel = new ParentModel().deserialize({ + name: 'parent model', + excluded: true, + nested: new NestedModel().deserialize({ + name: 'nested model', + excluded: true + }) + }); + + const serializedModel = testModel.serialize(); + expect(serializedModel).toEqual({ name: 'parent model', nested: { name: 'nested model' } }); + }); +}); \ No newline at end of file