11'use strict' ;
22
33var Snapshot = require ( './snapshot' ) ;
4+ var Timestamp = require ( './timestamp' ) ;
45var FieldValue = require ( './firestore-field-value' ) ;
56var _ = require ( './lodash' ) ;
67
@@ -81,6 +82,24 @@ exports.priorityComparator = function priorityComparator(a, b) {
8182 return 0 ;
8283} ;
8384
85+ var serverClock , defaultClock ;
86+
87+ serverClock = defaultClock = function ( ) {
88+ return new Date ( ) . getTime ( ) ;
89+ } ;
90+
91+ exports . getServerTime = function getServerTime ( ) {
92+ return serverClock ( ) ;
93+ } ;
94+
95+ exports . setServerClock = function setServerTime ( fn ) {
96+ serverClock = fn ;
97+ } ;
98+
99+ exports . restoreServerClock = function restoreServerTime ( ) {
100+ serverClock = defaultClock ;
101+ } ;
102+
84103exports . isServerTimestamp = function isServerTimestamp ( data ) {
85104 return _ . isObject ( data ) && data [ '.sv' ] === 'timestamp' ;
86105} ;
@@ -114,12 +133,10 @@ exports.removeEmptyRtdbProperties = function removeEmptyRtdbProperties(obj) {
114133 }
115134} ;
116135
117- exports . removeEmptyFirestoreProperties = function removeEmptyFirestoreProperties ( obj , current ) {
118- var t = typeof obj ;
119- if ( t === 'boolean' || t === 'string' || t === 'number' || t === 'undefined' ) {
136+ exports . removeEmptyFirestoreProperties = function removeEmptyFirestoreProperties ( obj , current , serverTime ) {
137+ if ( ! _ . isPlainObject ( obj ) ) {
120138 return obj ;
121139 }
122- if ( obj instanceof Date ) return obj ;
123140
124141 var keys = getKeys ( obj ) ;
125142
@@ -131,13 +148,13 @@ exports.removeEmptyFirestoreProperties = function removeEmptyFirestoreProperties
131148
132149 if ( keys . length > 0 ) {
133150 for ( var s in obj ) {
134-
135- var value = removeEmptyFirestoreProperties ( obj [ s ] ) ;
151+ var value = removeEmptyFirestoreProperties ( obj [ s ] , serverTime ) ;
136152 if ( FieldValue . delete ( ) . isEqual ( value ) ) {
137153 delete obj [ s ] ;
138- }
139- if ( FieldValue . serverTimestamp ( ) . isEqual ( value ) ) {
140- obj [ s ] = new Date ( ) ;
154+ } else if ( FieldValue . serverTimestamp ( ) . isEqual ( value ) ) {
155+ obj [ s ] = new Date ( serverTime ) ;
156+ } else if ( value instanceof Timestamp ) {
157+ obj [ s ] = value . toDate ( ) ;
141158 }
142159 if ( FieldValue . arrayRemove ( ) . isEqual ( value ) ) {
143160 const replacement = Array . isArray ( value . arg ) ? value . arg : [ value . arg ] ;
@@ -228,3 +245,9 @@ exports.createThenableReference = function(reference, promise) {
228245 } ;
229246 return reference ;
230247} ;
248+
249+ exports . cloneCustomizer = function ( value ) {
250+ if ( value instanceof Date ) {
251+ return Timestamp . fromMillis ( value . getTime ( ) ) ;
252+ }
253+ } ;
0 commit comments