From 7b735bf2dbc2fbd96afd96ecadc2c6846bf40e83 Mon Sep 17 00:00:00 2001 From: Lauren Long Date: Mon, 23 Oct 2017 14:12:48 -0700 Subject: [PATCH 1/4] Add test --- spec/providers/firestore.spec.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/spec/providers/firestore.spec.ts b/spec/providers/firestore.spec.ts index a632d9fa3..2580ac4dd 100644 --- a/spec/providers/firestore.spec.ts +++ b/spec/providers/firestore.spec.ts @@ -307,6 +307,19 @@ describe('Firestore Functions', () => { expect(snapshot.data()).to.deep.equal({'timestampVal': new Date('2017-06-13T00:58:40.349Z')}); }); + it('should parse timestamp values of with precision to the second', () => { + let raw = constructValue({ + 'timestampVal': { + 'timestampValue': '2017-06-13T00:58:40Z', + }, + }); + let snapshot = firestore.dataConstructor({ + data: { value: raw }, + }); + expect(snapshot.data()).to.deep.equal({'timestampVal': new Date('2017-06-13T00:58:40Z')}); + + }); + it('should parse binary values', () => { // Format defined in https://developers.google.com/discovery/v1/type-format let raw = constructValue({ From 0cfa512f5d21a470c6f6750491b8742bba1aac45 Mon Sep 17 00:00:00 2001 From: Lauren Long Date: Mon, 23 Oct 2017 14:39:06 -0700 Subject: [PATCH 2/4] Handle timestamp values with precision to the second --- spec/providers/firestore.spec.ts | 4 ++-- src/encoder.ts | 14 ++++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/spec/providers/firestore.spec.ts b/spec/providers/firestore.spec.ts index 2580ac4dd..e6e72c5d0 100644 --- a/spec/providers/firestore.spec.ts +++ b/spec/providers/firestore.spec.ts @@ -295,7 +295,7 @@ describe('Firestore Functions', () => { expect(snapshot.data()['referenceVal'].path).to.equal('doc1/id'); }); - it('should parse timestamp values', () => { + it('should parse timestamp values with precision to the millisecond', () => { let raw = constructValue({ 'timestampVal': { 'timestampValue': '2017-06-13T00:58:40.349Z', @@ -307,7 +307,7 @@ describe('Firestore Functions', () => { expect(snapshot.data()).to.deep.equal({'timestampVal': new Date('2017-06-13T00:58:40.349Z')}); }); - it('should parse timestamp values of with precision to the second', () => { + it('should parse timestamp values with precision to the second', () => { let raw = constructValue({ 'timestampVal': { 'timestampValue': '2017-06-13T00:58:40Z', diff --git a/src/encoder.ts b/src/encoder.ts index 78ddba559..159fc0429 100644 --- a/src/encoder.ts +++ b/src/encoder.ts @@ -20,18 +20,20 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. +import * as _ from 'lodash'; + export function dateToTimestampProto(timeString) { if (typeof timeString === 'undefined') { return; } let date = new Date(timeString); let seconds = Math.floor(date.getTime() / 1000); - let nanoString = timeString.substring(20, timeString.length - 1); - - if (nanoString.length === 3) { - nanoString = `${nanoString}000000`; - } else if (nanoString.length === 6) { - nanoString = `${nanoString}000`; + let nanoString; + if (timeString.length <= 20) { + nanoString = '000000000'; + } else { + nanoString = timeString.substring(20, timeString.length - 1); + nanoString += _.reduce(new Array(9 - nanoString.length), i => {return i + '0';}, ''); } let proto = { seconds: seconds, From 50a3a1b8bebe995f48ce211c75823c4d32943e81 Mon Sep 17 00:00:00 2001 From: Lauren Long Date: Mon, 23 Oct 2017 15:21:44 -0700 Subject: [PATCH 3/4] Revise according to review comments --- src/encoder.ts | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/encoder.ts b/src/encoder.ts index 159fc0429..d7b9a8a25 100644 --- a/src/encoder.ts +++ b/src/encoder.ts @@ -20,24 +20,21 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. -import * as _ from 'lodash'; - export function dateToTimestampProto(timeString) { if (typeof timeString === 'undefined') { return; } let date = new Date(timeString); let seconds = Math.floor(date.getTime() / 1000); - let nanoString; - if (timeString.length <= 20) { - nanoString = '000000000'; - } else { - nanoString = timeString.substring(20, timeString.length - 1); - nanoString += _.reduce(new Array(9 - nanoString.length), i => {return i + '0';}, ''); + let nanos = 0; + if (timeString.length > 20) { + const nanoString = timeString.substring(20, timeString.length - 1); + const trailingZeroes = 9 - nanoString.length; + nanos = parseInt(nanoString, 10) * Math.pow(10, trailingZeroes); } - let proto = { + + return { seconds: seconds, - nanos: parseInt(nanoString, 10), + nanos: nanos, }; - return proto; }; From 42982955d647e3166a34da128249e2ccdfb1ad6a Mon Sep 17 00:00:00 2001 From: Lauren Long Date: Mon, 23 Oct 2017 16:29:35 -0700 Subject: [PATCH 4/4] small change --- src/encoder.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/encoder.ts b/src/encoder.ts index d7b9a8a25..59d3cb223 100644 --- a/src/encoder.ts +++ b/src/encoder.ts @@ -32,9 +32,5 @@ export function dateToTimestampProto(timeString) { const trailingZeroes = 9 - nanoString.length; nanos = parseInt(nanoString, 10) * Math.pow(10, trailingZeroes); } - - return { - seconds: seconds, - nanos: nanos, - }; + return { seconds, nanos }; };