@@ -19,7 +19,6 @@ import * as firestore from '@firebase/firestore-types';
19
19
20
20
import { FirebaseApp } from '@firebase/app-types' ;
21
21
import { FirebaseService , _FirebaseApp } from '@firebase/app-types/private' ;
22
- import { Blob } from './blob' ;
23
22
import { DatabaseId , DatabaseInfo } from '../core/database_info' ;
24
23
import { ListenOptions } from '../core/event_manager' ;
25
24
import {
@@ -45,10 +44,7 @@ import { Document, MaybeDocument, NoDocument } from '../model/document';
45
44
import { DocumentKey } from '../model/document_key' ;
46
45
import {
47
46
ArrayValue ,
48
- BlobValue ,
49
47
FieldValue ,
50
- FieldValueOptions ,
51
- ObjectValue ,
52
48
RefValue ,
53
49
ServerTimestampValue
54
50
} from '../model/field_value' ;
@@ -105,8 +101,9 @@ import {
105
101
import {
106
102
DocumentKeyReference ,
107
103
fieldPathFromArgument ,
108
- UserDataConverter
109
- } from './user_data_converter' ;
104
+ UserDataReader
105
+ } from './user_data_reader' ;
106
+ import { UserDataWriter } from './user_data_writer' ;
110
107
import { FirebaseAuthInternalName } from '@firebase/auth-interop-types' ;
111
108
import { Provider } from '@firebase/component' ;
112
109
@@ -310,7 +307,7 @@ export class Firestore implements firestore.FirebaseFirestore, FirebaseService {
310
307
// TODO(mikelehen): Use modularized initialization instead.
311
308
readonly _queue = new AsyncQueue ( ) ;
312
309
313
- readonly _dataConverter : UserDataConverter ;
310
+ readonly _dataReader : UserDataReader ;
314
311
315
312
constructor (
316
313
databaseIdOrApp : FirestoreDatabase | FirebaseApp ,
@@ -340,7 +337,7 @@ export class Firestore implements firestore.FirebaseFirestore, FirebaseService {
340
337
}
341
338
342
339
this . _settings = new FirestoreSettings ( { } ) ;
343
- this . _dataConverter = this . createDataConverter ( this . _databaseId ) ;
340
+ this . _dataReader = this . createDataReader ( this . _databaseId ) ;
344
341
}
345
342
346
343
settings ( settingsLiteral : firestore . Settings ) : void {
@@ -535,7 +532,7 @@ export class Firestore implements firestore.FirebaseFirestore, FirebaseService {
535
532
return this . _firestoreClient . start ( persistenceSettings ) ;
536
533
}
537
534
538
- private createDataConverter ( databaseId : DatabaseId ) : UserDataConverter {
535
+ private createDataReader ( databaseId : DatabaseId ) : UserDataReader {
539
536
const preConverter = ( value : unknown ) : unknown => {
540
537
if ( value instanceof DocumentReference ) {
541
538
const thisDb = databaseId ;
@@ -553,7 +550,7 @@ export class Firestore implements firestore.FirebaseFirestore, FirebaseService {
553
550
return value ;
554
551
}
555
552
} ;
556
- return new UserDataConverter ( preConverter ) ;
553
+ return new UserDataReader ( preConverter ) ;
557
554
}
558
555
559
556
private static databaseIdFromApp ( app : FirebaseApp ) : DatabaseId {
@@ -760,12 +757,12 @@ export class Transaction implements firestore.Transaction {
760
757
) ;
761
758
const parsed =
762
759
options . merge || options . mergeFields
763
- ? this . _firestore . _dataConverter . parseMergeData (
760
+ ? this . _firestore . _dataReader . parseMergeData (
764
761
functionName ,
765
762
convertedValue ,
766
763
options . mergeFields
767
764
)
768
- : this . _firestore . _dataConverter . parseSetData (
765
+ : this . _firestore . _dataReader . parseSetData (
769
766
functionName ,
770
767
convertedValue
771
768
) ;
@@ -802,7 +799,7 @@ export class Transaction implements firestore.Transaction {
802
799
documentRef ,
803
800
this . _firestore
804
801
) ;
805
- parsed = this . _firestore . _dataConverter . parseUpdateVarargs (
802
+ parsed = this . _firestore . _dataReader . parseUpdateVarargs (
806
803
'Transaction.update' ,
807
804
fieldOrUpdateData ,
808
805
value ,
@@ -815,7 +812,7 @@ export class Transaction implements firestore.Transaction {
815
812
documentRef ,
816
813
this . _firestore
817
814
) ;
818
- parsed = this . _firestore . _dataConverter . parseUpdateData (
815
+ parsed = this . _firestore . _dataReader . parseUpdateData (
819
816
'Transaction.update' ,
820
817
fieldOrUpdateData
821
818
) ;
@@ -863,12 +860,12 @@ export class WriteBatch implements firestore.WriteBatch {
863
860
) ;
864
861
const parsed =
865
862
options . merge || options . mergeFields
866
- ? this . _firestore . _dataConverter . parseMergeData (
863
+ ? this . _firestore . _dataReader . parseMergeData (
867
864
functionName ,
868
865
convertedValue ,
869
866
options . mergeFields
870
867
)
871
- : this . _firestore . _dataConverter . parseSetData (
868
+ : this . _firestore . _dataReader . parseSetData (
872
869
functionName ,
873
870
convertedValue
874
871
) ;
@@ -909,7 +906,7 @@ export class WriteBatch implements firestore.WriteBatch {
909
906
documentRef ,
910
907
this . _firestore
911
908
) ;
912
- parsed = this . _firestore . _dataConverter . parseUpdateVarargs (
909
+ parsed = this . _firestore . _dataReader . parseUpdateVarargs (
913
910
'WriteBatch.update' ,
914
911
fieldOrUpdateData ,
915
912
value ,
@@ -922,7 +919,7 @@ export class WriteBatch implements firestore.WriteBatch {
922
919
documentRef ,
923
920
this . _firestore
924
921
) ;
925
- parsed = this . _firestore . _dataConverter . parseUpdateData (
922
+ parsed = this . _firestore . _dataReader . parseUpdateData (
926
923
'WriteBatch.update' ,
927
924
fieldOrUpdateData
928
925
) ;
@@ -1059,15 +1056,12 @@ export class DocumentReference<T = firestore.DocumentData>
1059
1056
) ;
1060
1057
const parsed =
1061
1058
options . merge || options . mergeFields
1062
- ? this . firestore . _dataConverter . parseMergeData (
1059
+ ? this . firestore . _dataReader . parseMergeData (
1063
1060
functionName ,
1064
1061
convertedValue ,
1065
1062
options . mergeFields
1066
1063
)
1067
- : this . firestore . _dataConverter . parseSetData (
1068
- functionName ,
1069
- convertedValue
1070
- ) ;
1064
+ : this . firestore . _dataReader . parseSetData ( functionName , convertedValue ) ;
1071
1065
return this . _firestoreClient . write (
1072
1066
parsed . toMutations ( this . _key , Precondition . NONE )
1073
1067
) ;
@@ -1091,15 +1085,15 @@ export class DocumentReference<T = firestore.DocumentData>
1091
1085
fieldOrUpdateData instanceof ExternalFieldPath
1092
1086
) {
1093
1087
validateAtLeastNumberOfArgs ( 'DocumentReference.update' , arguments , 2 ) ;
1094
- parsed = this . firestore . _dataConverter . parseUpdateVarargs (
1088
+ parsed = this . firestore . _dataReader . parseUpdateVarargs (
1095
1089
'DocumentReference.update' ,
1096
1090
fieldOrUpdateData ,
1097
1091
value ,
1098
1092
moreFieldsAndValues
1099
1093
) ;
1100
1094
} else {
1101
1095
validateExactNumberOfArgs ( 'DocumentReference.update' , arguments , 1 ) ;
1102
- parsed = this . firestore . _dataConverter . parseUpdateData (
1096
+ parsed = this . firestore . _dataReader . parseUpdateData (
1103
1097
'DocumentReference.update' ,
1104
1098
fieldOrUpdateData
1105
1099
) ;
@@ -1385,13 +1379,13 @@ export class DocumentSnapshot<T = firestore.DocumentData>
1385
1379
) ;
1386
1380
return this . _converter . fromFirestore ( snapshot , options ) ;
1387
1381
} else {
1388
- return this . toJSObject (
1389
- this . _document . data ( ) ,
1390
- FieldValueOptions . fromSnapshotOptions (
1391
- options ,
1392
- this . _firestore . _areTimestampsInSnapshotsEnabled ( )
1393
- )
1394
- ) as T ;
1382
+ const userDataWriter = new UserDataWriter (
1383
+ this . _firestore ,
1384
+ this . _firestore . _areTimestampsInSnapshotsEnabled ( ) ,
1385
+ options . serverTimestamps ,
1386
+ /* converter= */ undefined
1387
+ ) ;
1388
+ return userDataWriter . convertValue ( this . _document . data ( ) ) as T ;
1395
1389
}
1396
1390
}
1397
1391
}
@@ -1407,13 +1401,13 @@ export class DocumentSnapshot<T = firestore.DocumentData>
1407
1401
. data ( )
1408
1402
. field ( fieldPathFromArgument ( 'DocumentSnapshot.get' , fieldPath ) ) ;
1409
1403
if ( value !== null ) {
1410
- return this . toJSValue (
1411
- value ,
1412
- FieldValueOptions . fromSnapshotOptions (
1413
- options ,
1414
- this . _firestore . _areTimestampsInSnapshotsEnabled ( )
1415
- )
1404
+ const userDataWriter = new UserDataWriter (
1405
+ this . _firestore ,
1406
+ this . _firestore . _areTimestampsInSnapshotsEnabled ( ) ,
1407
+ options . serverTimestamps ,
1408
+ this . _converter
1416
1409
) ;
1410
+ return userDataWriter . convertValue ( value ) ;
1417
1411
}
1418
1412
}
1419
1413
return undefined ;
@@ -1453,50 +1447,6 @@ export class DocumentSnapshot<T = firestore.DocumentData>
1453
1447
this . _converter === other . _converter
1454
1448
) ;
1455
1449
}
1456
-
1457
- private toJSObject (
1458
- data : ObjectValue ,
1459
- options : FieldValueOptions
1460
- ) : firestore . DocumentData {
1461
- const result : firestore . DocumentData = { } ;
1462
- data . forEach ( ( key , value ) => {
1463
- result [ key ] = this . toJSValue ( value , options ) ;
1464
- } ) ;
1465
- return result ;
1466
- }
1467
-
1468
- private toJSValue ( value : FieldValue , options : FieldValueOptions ) : unknown {
1469
- if ( value instanceof ObjectValue ) {
1470
- return this . toJSObject ( value , options ) ;
1471
- } else if ( value instanceof ArrayValue ) {
1472
- return this . toJSArray ( value , options ) ;
1473
- } else if ( value instanceof RefValue ) {
1474
- const key = value . value ( options ) ;
1475
- const database = this . _firestore . ensureClientConfigured ( ) . databaseId ( ) ;
1476
- if ( ! value . databaseId . isEqual ( database ) ) {
1477
- // TODO(b/64130202): Somehow support foreign references.
1478
- log . error (
1479
- `Document ${ this . _key . path } contains a document ` +
1480
- `reference within a different database (` +
1481
- `${ value . databaseId . projectId } /${ value . databaseId . database } ) which is not ` +
1482
- `supported. It will be treated as a reference in the current ` +
1483
- `database (${ database . projectId } /${ database . database } ) ` +
1484
- `instead.`
1485
- ) ;
1486
- }
1487
- return new DocumentReference ( key , this . _firestore , this . _converter ) ;
1488
- } else if ( value instanceof BlobValue ) {
1489
- return new Blob ( value . internalValue ) ;
1490
- } else {
1491
- return value . value ( options ) ;
1492
- }
1493
- }
1494
-
1495
- private toJSArray ( data : ArrayValue , options : FieldValueOptions ) : unknown [ ] {
1496
- return data . internalValue . map ( value => {
1497
- return this . toJSValue ( value , options ) ;
1498
- } ) ;
1499
- }
1500
1450
}
1501
1451
1502
1452
export class QueryDocumentSnapshot < T = firestore . DocumentData >
@@ -1570,7 +1520,7 @@ export class Query<T = firestore.DocumentData> implements firestore.Query<T> {
1570
1520
) {
1571
1521
this . validateDisjunctiveFilterElements ( value , operator ) ;
1572
1522
}
1573
- fieldValue = this . firestore . _dataConverter . parseQueryValue (
1523
+ fieldValue = this . firestore . _dataReader . parseQueryValue (
1574
1524
'Query.where' ,
1575
1525
value ,
1576
1526
// We only allow nested arrays for IN queries.
@@ -1882,7 +1832,7 @@ export class Query<T = firestore.DocumentData> implements firestore.Query<T> {
1882
1832
const key = new DocumentKey ( path ) ;
1883
1833
components . push ( new RefValue ( this . firestore . _databaseId , key ) ) ;
1884
1834
} else {
1885
- const wrapped = this . firestore . _dataConverter . parseQueryValue (
1835
+ const wrapped = this . firestore . _dataReader . parseQueryValue (
1886
1836
methodName ,
1887
1837
rawValue
1888
1838
) ;
0 commit comments