diff --git a/packages/functions/src/serializer.ts b/packages/functions/src/serializer.ts index 677d22d8804..f3e8f7c6719 100644 --- a/packages/functions/src/serializer.ts +++ b/packages/functions/src/serializer.ts @@ -51,6 +51,9 @@ export class Serializer { if (data === true || data === false) { return data; } + if (data instanceof Date) { + return data.toISOString(); + } if (Object.prototype.toString.call(data) === '[object String]') { return data; } @@ -95,6 +98,14 @@ export class Serializer { if (typeof json === 'function' || typeof json === 'object') { return mapValues(json!, x => this.decode(x)); } + if ( + typeof json === 'string' && + /^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]+)?(Z)?$/.test( + json + ) + ) { + return new Date(json); + } // Anything else is safe to return. return json; } diff --git a/packages/functions/test/serializer.test.ts b/packages/functions/test/serializer.test.ts index 3de6d6d0d9c..f4bb4d44c69 100644 --- a/packages/functions/test/serializer.test.ts +++ b/packages/functions/test/serializer.test.ts @@ -80,6 +80,18 @@ describe('Serializer', () => { expect(serializer.decode(1.2)).to.equal(1.2); }); + it('encodes date', () => { + expect(serializer.encode(new Date('2021-02-10T13:26:37.977Z'))).to.equal( + '2021-02-10T13:26:37.977Z' + ); + }); + + it('decodes date', () => { + expect(serializer.decode('2021-02-10T13:26:37.977Z')).to.deep.equal( + new Date('2021-02-10T13:26:37.977Z') + ); + }); + it('encodes string', () => { expect(serializer.encode('hello')).to.equal('hello'); });