From 2b89bae51bbeea921832486ec6d6ebe2b5841040 Mon Sep 17 00:00:00 2001 From: "Marc J. Schmidt" Date: Tue, 3 Oct 2023 21:50:56 +0200 Subject: [PATCH] feature(type): add easy way to serialize/deserialize values in serializer API ``` serializer.deserializeRegistry.registerClass(Date, (type, state) => { state.convert((v) => new Date(v)); }); ``` --- packages/type/src/serializer.ts | 15 +++++++++++++++ packages/type/tests/serializer-api.spec.ts | 22 +++++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/packages/type/src/serializer.ts b/packages/type/src/serializer.ts index 4314f49b7..0d2ab437d 100644 --- a/packages/type/src/serializer.ts +++ b/packages/type/src/serializer.ts @@ -498,6 +498,21 @@ export class TemplateState { } } + /** + * Adds a converter function that is executed on the current `this.accessor` value. + * + * @example + * ```typescript + * serializer.deserializeRegistry.registerClass(Date, (type, state) => { + * state.convert((v) => new Date(v)); + * }); + * ``` + */ + convert(callback: (value: any) => any) { + const converter = this.setVariable('convert', callback); + this.addSetter(`${converter}(${this.accessor})`); + } + /** * Stop executing next templates. */ diff --git a/packages/type/tests/serializer-api.spec.ts b/packages/type/tests/serializer-api.spec.ts index 4f694e97f..8abe9aba3 100644 --- a/packages/type/tests/serializer-api.spec.ts +++ b/packages/type/tests/serializer-api.spec.ts @@ -69,5 +69,25 @@ test('new serializer', () => { }); const user = deserialize({ name: 'Peter', created: 0 }, undefined, mySerializer); - console.log('empty serializer', user); + expect(user.created).toBeInstanceOf(Date); +}); + +test('new serializer easy mode', () => { + class User { + name: string = ''; + created: Date = new Date; + } + + const mySerializer = new EmptySerializer('mySerializer'); + + mySerializer.deserializeRegistry.registerClass(Date, (type, state) => { + state.convert((v) => new Date(v)); + }); + + mySerializer.serializeRegistry.registerClass(Date, (type, state) => { + state.convert((v) => v.toJSON()); + }); + + const user = deserialize({ name: 'Peter', created: 0 }, undefined, mySerializer); + expect(user.created).toBeInstanceOf(Date); });