Skip to content

Commit f1dee40

Browse files
Serializer test
1 parent ae8f6fd commit f1dee40

File tree

7 files changed

+211
-209
lines changed

7 files changed

+211
-209
lines changed

packages/firestore/src/api/database.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1355,14 +1355,18 @@ export interface SnapshotOptions extends firestore.SnapshotOptions {}
13551355

13561356
export class DocumentSnapshot<T = firestore.DocumentData>
13571357
implements firestore.DocumentSnapshot<T> {
1358+
private readonly _serializer: JsonProtoSerializer;
1359+
13581360
constructor(
13591361
private _firestore: Firestore,
13601362
private _key: DocumentKey,
13611363
public _document: Document | null,
13621364
private _fromCache: boolean,
13631365
private _hasPendingWrites: boolean,
13641366
private readonly _converter?: firestore.FirestoreDataConverter<T>
1365-
) {}
1367+
) {
1368+
this._serializer = new JsonProtoSerializer(this._firestore._databaseId, {useProto3Json: PlatformSupport.getPlatform().usesProto3Json});
1369+
}
13661370

13671371
data(options?: firestore.SnapshotOptions): T | undefined {
13681372
validateBetweenNumberOfArgs('DocumentSnapshot.data', arguments, 0, 1);
@@ -1384,6 +1388,7 @@ export class DocumentSnapshot<T = firestore.DocumentData>
13841388
} else {
13851389
const userDataWriter = new UserDataWriter(
13861390
this._firestore,
1391+
this._serializer,
13871392
this._firestore._areTimestampsInSnapshotsEnabled(),
13881393
options.serverTimestamps,
13891394
/* converter= */ undefined
@@ -1407,6 +1412,7 @@ export class DocumentSnapshot<T = firestore.DocumentData>
14071412
if (value !== null) {
14081413
const userDataWriter = new UserDataWriter(
14091414
this._firestore,
1415+
this._serializer,
14101416
this._firestore._areTimestampsInSnapshotsEnabled(),
14111417
options.serverTimestamps,
14121418
this._converter

packages/firestore/src/api/user_data_reader.ts

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ import * as firestore from '@firebase/firestore-types';
1919

2020
import * as api from '../protos/firestore_proto_api';
2121

22-
import { Timestamp } from './timestamp';
23-
import { DatabaseId } from '../core/database_info';
24-
import { DocumentKey } from '../model/document_key';
22+
import {Timestamp} from './timestamp';
23+
import {DatabaseId} from '../core/database_info';
24+
import {DocumentKey} from '../model/document_key';
2525

2626
import {
2727
FieldMask,
@@ -32,20 +32,20 @@ import {
3232
SetMutation,
3333
TransformMutation
3434
} from '../model/mutation';
35-
import { FieldPath } from '../model/path';
36-
import { assert, fail } from '../util/assert';
37-
import { Code, FirestoreError } from '../util/error';
38-
import { isPlainObject, valueDescription } from '../util/input_validation';
39-
import { Dict, forEach, isEmpty } from '../util/obj';
35+
import {FieldPath} from '../model/path';
36+
import {assert, fail} from '../util/assert';
37+
import {Code, FirestoreError} from '../util/error';
38+
import {isPlainObject, valueDescription} from '../util/input_validation';
39+
import {Dict, forEach, isEmpty} from '../util/obj';
4040

4141
import {
4242
ArrayRemoveTransformOperation,
4343
ArrayUnionTransformOperation,
4444
NumericIncrementTransformOperation,
4545
ServerTimestampTransform
4646
} from '../model/transform_operation';
47-
import { SortedSet } from '../util/sorted_set';
48-
import { Blob } from './blob';
47+
import {SortedSet} from '../util/sorted_set';
48+
import {Blob} from './blob';
4949
import {
5050
FieldPath as ExternalFieldPath,
5151
fromDotSeparatedString
@@ -58,9 +58,9 @@ import {
5858
NumericIncrementFieldValueImpl,
5959
ServerTimestampFieldValueImpl
6060
} from './field_value';
61-
import { GeoPoint } from './geo_point';
62-
import { ObjectValue } from '../model/field_value';
63-
import { JsonProtoSerializer } from '../remote/serializer';
61+
import {GeoPoint} from './geo_point';
62+
import {ObjectValue} from '../model/field_value';
63+
import {JsonProtoSerializer} from '../remote/serializer';
6464

6565
const RESERVED_FIELD_REGEX = /^__.*__$/;
6666

@@ -598,7 +598,7 @@ export class UserDataReader {
598598
if (parsedEntry == null) {
599599
// Just include nulls in the array for fields being replaced with a
600600
// sentinel.
601-
parsedEntry = { nullValue: 'NULL_VALUE' };
601+
parsedEntry = {nullValue: 'NULL_VALUE'}
602602
}
603603
values.push(parsedEntry);
604604
entryIndex++;
@@ -694,7 +694,7 @@ export class UserDataReader {
694694
*/
695695
private parseScalarValue(input: unknown, context: ParseContext): api.Value {
696696
if (input === null) {
697-
return { nullValue: 'NULL_VALUE' };
697+
return {nullValue: 'NULL_VALUE'};
698698
} else if (typeof input === 'number') {
699699
return this.serializer.toNumber(input);
700700
} else if (typeof input === 'boolean') {

packages/firestore/src/api/user_data_writer.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,18 +44,14 @@ export type ServerTimestampBehavior = 'estimate' | 'previous' | 'none';
4444
* Converts Firestore's internal types to the JavaScript types that we expose
4545
* to the user.
4646
*/
47-
export class UserDataWriter<T> {
48-
private readonly serializer: JsonProtoSerializer;
47+
export class UserDataWriter<T = firestore.DocumentData> {
4948
constructor(
5049
private readonly firestore: Firestore,
50+
private readonly serializer: JsonProtoSerializer,
5151
private readonly timestampsInSnapshots: boolean,
5252
private readonly serverTimestampBehavior?: ServerTimestampBehavior,
5353
private readonly converter?: firestore.FirestoreDataConverter<T>
54-
) {
55-
this.serializer = new JsonProtoSerializer(firestore._databaseId, {
56-
useProto3Json: PlatformSupport.getPlatform().usesProto3Json
57-
});
58-
}
54+
) {}
5955

6056
convertValue(value: api.Value): unknown {
6157
if ('nullValue' in value) {

packages/firestore/src/protos/firestore_proto_api.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,7 @@ export declare namespace firestoreV1ApiClientInterfaces {
359359
field?: FieldReference;
360360
}
361361
interface Value {
362-
nullValue?: ValueNullValue;
362+
nullValue?: ValueNullValue | 0;
363363
booleanValue?: boolean;
364364
integerValue?: string | number;
365365
doubleValue?: string | number;

packages/firestore/src/remote/serializer.ts

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
* limitations under the License.
1616
*/
1717

18-
import { Blob } from '../api/blob';
19-
import { Timestamp } from '../api/timestamp';
20-
import { DatabaseId } from '../core/database_info';
18+
import {Blob} from '../api/blob';
19+
import {Timestamp} from '../api/timestamp';
20+
import {DatabaseId} from '../core/database_info';
2121
import {
2222
Bound,
2323
Direction,
@@ -28,12 +28,12 @@ import {
2828
OrderBy,
2929
Query
3030
} from '../core/query';
31-
import { SnapshotVersion } from '../core/snapshot_version';
32-
import { Target } from '../core/target';
33-
import { TargetId } from '../core/types';
34-
import { TargetData, TargetPurpose } from '../local/target_data';
35-
import { Document, MaybeDocument, NoDocument } from '../model/document';
36-
import { DocumentKey } from '../model/document_key';
31+
import {SnapshotVersion} from '../core/snapshot_version';
32+
import {Target} from '../core/target';
33+
import {TargetId} from '../core/types';
34+
import {TargetData, TargetPurpose} from '../local/target_data';
35+
import {Document, MaybeDocument, NoDocument} from '../model/document';
36+
import {DocumentKey} from '../model/document_key';
3737
import {
3838
DeleteMutation,
3939
FieldMask,
@@ -46,11 +46,11 @@ import {
4646
TransformMutation,
4747
VerifyMutation
4848
} from '../model/mutation';
49-
import { FieldPath, ResourcePath } from '../model/path';
49+
import {FieldPath, ResourcePath} from '../model/path';
5050
import * as api from '../protos/firestore_proto_api';
51-
import { assert, fail } from '../util/assert';
52-
import { Code, FirestoreError } from '../util/error';
53-
import { ByteString } from '../util/byte_string';
51+
import {assert, fail} from '../util/assert';
52+
import {Code, FirestoreError} from '../util/error';
53+
import {ByteString} from '../util/byte_string';
5454

5555
import {
5656
ArrayRemoveTransformOperation,
@@ -59,8 +59,8 @@ import {
5959
ServerTimestampTransform,
6060
TransformOperation
6161
} from '../model/transform_operation';
62-
import { ExistenceFilter } from './existence_filter';
63-
import { mapCodeFromRpcCode, mapRpcCodeFromCode } from './rpc_error';
62+
import {ExistenceFilter} from './existence_filter';
63+
import {mapCodeFromRpcCode, mapRpcCodeFromCode} from './rpc_error';
6464
import {
6565
DocumentWatchChange,
6666
ExistenceFilterChange,
@@ -74,8 +74,8 @@ import {
7474
normalizeTimestamp,
7575
ProtoTimestampValue
7676
} from '../model/values';
77-
import { ObjectValue } from '../model/field_value';
78-
import { isNullOrUndefined, isSafeInteger } from '../util/types';
77+
import {ObjectValue} from '../model/field_value';
78+
import {isNullOrUndefined, isSafeInteger} from '../util/types';
7979

8080
const DIRECTIONS = (() => {
8181
const dirs: { [dir: string]: api.OrderDirection } = {};
@@ -1148,9 +1148,7 @@ export class JsonProtoSerializer {
11481148
const nullField = this.fromFieldPathReference(
11491149
filter.unaryFilter!.field!
11501150
);
1151-
return FieldFilter.create(nullField, Operator.EQUAL, {
1152-
nullValue: 'NULL_VALUE'
1153-
});
1151+
return FieldFilter.create(nullField, Operator.EQUAL, {nullValue: 'NULL_VALUE'});
11541152
case 'OPERATOR_UNSPECIFIED':
11551153
return fail('Unspecified filter');
11561154
default:

0 commit comments

Comments
 (0)