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); });