@firebase/firestore-compat 0.1.3-2021822203916 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,1304 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2017 Google LLC
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License");
6
- * you may not use this file except in compliance with the License.
7
- * You may obtain a copy of the License at
8
- *
9
- * http://www.apache.org/licenses/LICENSE-2.0
10
- *
11
- * Unless required by applicable law or agreed to in writing, software
12
- * distributed under the License is distributed on an "AS IS" BASIS,
13
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- * See the License for the specific language governing permissions and
15
- * limitations under the License.
16
- */
17
-
18
- import { FirebaseApp } from '@firebase/app-types';
19
- import { _FirebaseApp, FirebaseService } from '@firebase/app-types/private';
20
- import {
21
- LoadBundleTask,
22
- Bytes,
23
- clearIndexedDbPersistence,
24
- disableNetwork,
25
- enableIndexedDbPersistence,
26
- enableMultiTabIndexedDbPersistence,
27
- enableNetwork,
28
- ensureFirestoreConfigured,
29
- Firestore as ExpFirestore,
30
- connectFirestoreEmulator,
31
- waitForPendingWrites,
32
- FieldPath as ExpFieldPath,
33
- limit,
34
- limitToLast,
35
- where,
36
- orderBy,
37
- startAfter,
38
- startAt,
39
- query,
40
- endBefore,
41
- endAt,
42
- doc,
43
- collection,
44
- collectionGroup,
45
- queryEqual,
46
- Query as ExpQuery,
47
- CollectionReference as ExpCollectionReference,
48
- DocumentReference as ExpDocumentReference,
49
- refEqual,
50
- addDoc,
51
- deleteDoc,
52
- executeWrite,
53
- getDoc,
54
- getDocFromCache,
55
- getDocFromServer,
56
- getDocs,
57
- getDocsFromCache,
58
- getDocsFromServer,
59
- onSnapshot,
60
- onSnapshotsInSync,
61
- setDoc,
62
- updateDoc,
63
- Unsubscribe,
64
- DocumentChange as ExpDocumentChange,
65
- DocumentSnapshot as ExpDocumentSnapshot,
66
- QueryDocumentSnapshot as ExpQueryDocumentSnapshot,
67
- QuerySnapshot as ExpQuerySnapshot,
68
- snapshotEqual,
69
- SnapshotMetadata,
70
- runTransaction,
71
- Transaction as ExpTransaction,
72
- WriteBatch as ExpWriteBatch,
73
- AbstractUserDataWriter,
74
- FirestoreError,
75
- FirestoreDataConverter as ModularFirestoreDataConverter,
76
- setLogLevel as setClientLogLevel,
77
- _DatabaseId,
78
- _validateIsNotUsedTogether,
79
- _cast,
80
- _DocumentKey,
81
- _debugAssert,
82
- _FieldPath,
83
- _ResourcePath,
84
- _ByteString,
85
- _logWarn,
86
- namedQuery,
87
- loadBundle,
88
- PartialWithFieldValue,
89
- WithFieldValue
90
- } from '@firebase/firestore';
91
- import {
92
- CollectionReference as PublicCollectionReference,
93
- DocumentChange as PublicDocumentChange,
94
- DocumentChangeType as PublicDocumentChangeType,
95
- DocumentData,
96
- DocumentData as PublicDocumentData,
97
- DocumentReference as PublicDocumentReference,
98
- DocumentSnapshot as PublicDocumentSnapshot,
99
- FieldPath as PublicFieldPath,
100
- FirebaseFirestore as PublicFirestore,
101
- FirestoreDataConverter as PublicFirestoreDataConverter,
102
- GetOptions as PublicGetOptions,
103
- LogLevel as PublicLogLevel,
104
- OrderByDirection as PublicOrderByDirection,
105
- PersistenceSettings as PublicPersistenceSettings,
106
- Query as PublicQuery,
107
- QueryDocumentSnapshot as PublicQueryDocumentSnapshot,
108
- QuerySnapshot as PublicQuerySnapshot,
109
- SetOptions as PublicSetOptions,
110
- Settings as PublicSettings,
111
- SnapshotListenOptions as PublicSnapshotListenOptions,
112
- SnapshotOptions as PublicSnapshotOptions,
113
- Transaction as PublicTransaction,
114
- UpdateData as PublicUpdateData,
115
- WhereFilterOp as PublicWhereFilterOp,
116
- WriteBatch as PublicWriteBatch
117
- } from '@firebase/firestore-types';
118
- import {
119
- Compat,
120
- EmulatorMockTokenOptions,
121
- getModularInstance
122
- } from '@firebase/util';
123
-
124
- import { validateSetOptions } from '../util/input_validation';
125
-
126
- import { Blob } from './blob';
127
- import {
128
- CompleteFn,
129
- ErrorFn,
130
- isPartialObserver,
131
- NextFn,
132
- PartialObserver
133
- } from './observer';
134
-
135
- /**
136
- * A persistence provider for either memory-only or IndexedDB persistence.
137
- * Mainly used to allow optional inclusion of IndexedDB code.
138
- */
139
- export interface PersistenceProvider {
140
- enableIndexedDbPersistence(
141
- firestore: Firestore,
142
- forceOwnership: boolean
143
- ): Promise<void>;
144
- enableMultiTabIndexedDbPersistence(firestore: Firestore): Promise<void>;
145
- clearIndexedDbPersistence(firestore: Firestore): Promise<void>;
146
- }
147
-
148
- /**
149
- * The persistence provider included with the full Firestore SDK.
150
- */
151
- export class IndexedDbPersistenceProvider implements PersistenceProvider {
152
- enableIndexedDbPersistence(
153
- firestore: Firestore,
154
- forceOwnership: boolean
155
- ): Promise<void> {
156
- return enableIndexedDbPersistence(firestore._delegate, { forceOwnership });
157
- }
158
- enableMultiTabIndexedDbPersistence(firestore: Firestore): Promise<void> {
159
- return enableMultiTabIndexedDbPersistence(firestore._delegate);
160
- }
161
- clearIndexedDbPersistence(firestore: Firestore): Promise<void> {
162
- return clearIndexedDbPersistence(firestore._delegate);
163
- }
164
- }
165
-
166
- /**
167
- * Compat class for Firestore. Exposes Firestore Legacy API, but delegates
168
- * to the functional API of firestore-exp.
169
- */
170
- export class Firestore
171
- implements PublicFirestore, FirebaseService, Compat<ExpFirestore>
172
- {
173
- _appCompat?: FirebaseApp;
174
- constructor(
175
- databaseIdOrApp: _DatabaseId | FirebaseApp,
176
- readonly _delegate: ExpFirestore,
177
- private _persistenceProvider: PersistenceProvider
178
- ) {
179
- if (!(databaseIdOrApp instanceof _DatabaseId)) {
180
- this._appCompat = databaseIdOrApp as FirebaseApp;
181
- }
182
- }
183
-
184
- get _databaseId(): _DatabaseId {
185
- return this._delegate._databaseId;
186
- }
187
-
188
- settings(settingsLiteral: PublicSettings): void {
189
- const currentSettings = this._delegate._getSettings();
190
- if (
191
- !settingsLiteral.merge &&
192
- currentSettings.host !== settingsLiteral.host
193
- ) {
194
- _logWarn(
195
- 'You are overriding the original host. If you did not intend ' +
196
- 'to override your settings, use {merge: true}.'
197
- );
198
- }
199
-
200
- if (settingsLiteral.merge) {
201
- settingsLiteral = {
202
- ...currentSettings,
203
- ...settingsLiteral
204
- };
205
- // Remove the property from the settings once the merge is completed
206
- delete settingsLiteral.merge;
207
- }
208
-
209
- this._delegate._setSettings(settingsLiteral);
210
- }
211
-
212
- useEmulator(
213
- host: string,
214
- port: number,
215
- options: {
216
- mockUserToken?: EmulatorMockTokenOptions | string;
217
- } = {}
218
- ): void {
219
- connectFirestoreEmulator(this._delegate, host, port, options);
220
- }
221
-
222
- enableNetwork(): Promise<void> {
223
- return enableNetwork(this._delegate);
224
- }
225
-
226
- disableNetwork(): Promise<void> {
227
- return disableNetwork(this._delegate);
228
- }
229
-
230
- enablePersistence(settings?: PublicPersistenceSettings): Promise<void> {
231
- let synchronizeTabs = false;
232
- let experimentalForceOwningTab = false;
233
-
234
- if (settings) {
235
- synchronizeTabs = !!settings.synchronizeTabs;
236
- experimentalForceOwningTab = !!settings.experimentalForceOwningTab;
237
-
238
- _validateIsNotUsedTogether(
239
- 'synchronizeTabs',
240
- synchronizeTabs,
241
- 'experimentalForceOwningTab',
242
- experimentalForceOwningTab
243
- );
244
- }
245
-
246
- return synchronizeTabs
247
- ? this._persistenceProvider.enableMultiTabIndexedDbPersistence(this)
248
- : this._persistenceProvider.enableIndexedDbPersistence(
249
- this,
250
- experimentalForceOwningTab
251
- );
252
- }
253
-
254
- clearPersistence(): Promise<void> {
255
- return this._persistenceProvider.clearIndexedDbPersistence(this);
256
- }
257
-
258
- terminate(): Promise<void> {
259
- if (this._appCompat) {
260
- (this._appCompat as _FirebaseApp)._removeServiceInstance(
261
- 'firestore-compat'
262
- );
263
- (this._appCompat as _FirebaseApp)._removeServiceInstance('firestore');
264
- }
265
- return this._delegate._delete();
266
- }
267
-
268
- waitForPendingWrites(): Promise<void> {
269
- return waitForPendingWrites(this._delegate);
270
- }
271
-
272
- onSnapshotsInSync(observer: PartialObserver<void>): Unsubscribe;
273
- onSnapshotsInSync(onSync: () => void): Unsubscribe;
274
- onSnapshotsInSync(arg: unknown): Unsubscribe {
275
- return onSnapshotsInSync(this._delegate, arg as PartialObserver<void>);
276
- }
277
-
278
- get app(): FirebaseApp {
279
- if (!this._appCompat) {
280
- throw new FirestoreError(
281
- 'failed-precondition',
282
- "Firestore was not initialized using the Firebase SDK. 'app' is " +
283
- 'not available'
284
- );
285
- }
286
- return this._appCompat as FirebaseApp;
287
- }
288
-
289
- INTERNAL = {
290
- delete: () => this.terminate()
291
- };
292
-
293
- collection(pathString: string): PublicCollectionReference {
294
- try {
295
- return new CollectionReference(
296
- this,
297
- collection(this._delegate, pathString)
298
- );
299
- } catch (e) {
300
- throw replaceFunctionName(e, 'collection()', 'Firestore.collection()');
301
- }
302
- }
303
-
304
- doc(pathString: string): PublicDocumentReference {
305
- try {
306
- return new DocumentReference(this, doc(this._delegate, pathString));
307
- } catch (e) {
308
- throw replaceFunctionName(e, 'doc()', 'Firestore.doc()');
309
- }
310
- }
311
-
312
- collectionGroup(collectionId: string): PublicQuery {
313
- try {
314
- return new Query(this, collectionGroup(this._delegate, collectionId));
315
- } catch (e) {
316
- throw replaceFunctionName(
317
- e,
318
- 'collectionGroup()',
319
- 'Firestore.collectionGroup()'
320
- );
321
- }
322
- }
323
-
324
- runTransaction<T>(
325
- updateFunction: (transaction: PublicTransaction) => Promise<T>
326
- ): Promise<T> {
327
- return runTransaction(this._delegate, transaction =>
328
- updateFunction(new Transaction(this, transaction))
329
- );
330
- }
331
-
332
- batch(): PublicWriteBatch {
333
- ensureFirestoreConfigured(this._delegate);
334
- return new WriteBatch(
335
- new ExpWriteBatch(this._delegate, mutations =>
336
- executeWrite(this._delegate, mutations)
337
- )
338
- );
339
- }
340
-
341
- loadBundle(
342
- bundleData: ArrayBuffer | ReadableStream<Uint8Array> | string
343
- ): LoadBundleTask {
344
- return loadBundle(this._delegate, bundleData);
345
- }
346
-
347
- namedQuery(name: string): Promise<PublicQuery<DocumentData> | null> {
348
- return namedQuery(this._delegate, name).then(expQuery => {
349
- if (!expQuery) {
350
- return null;
351
- }
352
- return new Query(
353
- this,
354
- // We can pass `expQuery` here directly since named queries don't have a UserDataConverter.
355
- // Otherwise, we would have to create a new ExpQuery and pass the old UserDataConverter.
356
- expQuery
357
- );
358
- });
359
- }
360
- }
361
-
362
- export class UserDataWriter extends AbstractUserDataWriter {
363
- constructor(protected firestore: Firestore) {
364
- super();
365
- }
366
-
367
- protected convertBytes(bytes: _ByteString): Blob {
368
- return new Blob(new Bytes(bytes));
369
- }
370
-
371
- protected convertReference(name: string): DocumentReference {
372
- const key = this.convertDocumentKey(name, this.firestore._databaseId);
373
- return DocumentReference.forKey(key, this.firestore, /* converter= */ null);
374
- }
375
- }
376
-
377
- export function setLogLevel(level: PublicLogLevel): void {
378
- setClientLogLevel(level);
379
- }
380
-
381
- /**
382
- * A reference to a transaction.
383
- */
384
- export class Transaction implements PublicTransaction, Compat<ExpTransaction> {
385
- private _userDataWriter: UserDataWriter;
386
-
387
- constructor(
388
- private readonly _firestore: Firestore,
389
- readonly _delegate: ExpTransaction
390
- ) {
391
- this._userDataWriter = new UserDataWriter(_firestore);
392
- }
393
-
394
- get<T>(
395
- documentRef: PublicDocumentReference<T>
396
- ): Promise<PublicDocumentSnapshot<T>> {
397
- const ref = castReference(documentRef);
398
- return this._delegate
399
- .get(ref)
400
- .then(
401
- result =>
402
- new DocumentSnapshot(
403
- this._firestore,
404
- new ExpDocumentSnapshot<T>(
405
- this._firestore._delegate,
406
- this._userDataWriter,
407
- result._key,
408
- result._document,
409
- result.metadata,
410
- ref.converter
411
- )
412
- )
413
- );
414
- }
415
-
416
- set<T>(
417
- documentRef: DocumentReference<T>,
418
- data: Partial<T>,
419
- options: PublicSetOptions
420
- ): Transaction;
421
- set<T>(documentRef: DocumentReference<T>, data: T): Transaction;
422
- set<T>(
423
- documentRef: PublicDocumentReference<T>,
424
- data: T | Partial<T>,
425
- options?: PublicSetOptions
426
- ): Transaction {
427
- const ref = castReference(documentRef);
428
- if (options) {
429
- validateSetOptions('Transaction.set', options);
430
- this._delegate.set(ref, data as PartialWithFieldValue<T>, options);
431
- } else {
432
- this._delegate.set(ref, data as WithFieldValue<T>);
433
- }
434
- return this;
435
- }
436
-
437
- update(
438
- documentRef: PublicDocumentReference<unknown>,
439
- data: PublicUpdateData
440
- ): Transaction;
441
- update(
442
- documentRef: PublicDocumentReference<unknown>,
443
- field: string | PublicFieldPath,
444
- value: unknown,
445
- ...moreFieldsAndValues: unknown[]
446
- ): Transaction;
447
- update(
448
- documentRef: PublicDocumentReference<unknown>,
449
- dataOrField: unknown,
450
- value?: unknown,
451
- ...moreFieldsAndValues: unknown[]
452
- ): Transaction {
453
- const ref = castReference(documentRef);
454
- if (arguments.length === 2) {
455
- this._delegate.update(ref, dataOrField as PublicUpdateData);
456
- } else {
457
- this._delegate.update(
458
- ref,
459
- dataOrField as string | ExpFieldPath,
460
- value,
461
- ...moreFieldsAndValues
462
- );
463
- }
464
-
465
- return this;
466
- }
467
-
468
- delete(documentRef: PublicDocumentReference<unknown>): Transaction {
469
- const ref = castReference(documentRef);
470
- this._delegate.delete(ref);
471
- return this;
472
- }
473
- }
474
-
475
- export class WriteBatch implements PublicWriteBatch, Compat<ExpWriteBatch> {
476
- constructor(readonly _delegate: ExpWriteBatch) {}
477
- set<T>(
478
- documentRef: DocumentReference<T>,
479
- data: Partial<T>,
480
- options: PublicSetOptions
481
- ): WriteBatch;
482
- set<T>(documentRef: DocumentReference<T>, data: T): WriteBatch;
483
- set<T>(
484
- documentRef: PublicDocumentReference<T>,
485
- data: T | Partial<T>,
486
- options?: PublicSetOptions
487
- ): WriteBatch {
488
- const ref = castReference(documentRef);
489
- if (options) {
490
- validateSetOptions('WriteBatch.set', options);
491
- this._delegate.set(ref, data as PartialWithFieldValue<T>, options);
492
- } else {
493
- this._delegate.set(ref, data as WithFieldValue<T>);
494
- }
495
- return this;
496
- }
497
-
498
- update(
499
- documentRef: PublicDocumentReference<unknown>,
500
- data: PublicUpdateData
501
- ): WriteBatch;
502
- update(
503
- documentRef: PublicDocumentReference<unknown>,
504
- field: string | PublicFieldPath,
505
- value: unknown,
506
- ...moreFieldsAndValues: unknown[]
507
- ): WriteBatch;
508
- update(
509
- documentRef: PublicDocumentReference<unknown>,
510
- dataOrField: string | PublicFieldPath | PublicUpdateData,
511
- value?: unknown,
512
- ...moreFieldsAndValues: unknown[]
513
- ): WriteBatch {
514
- const ref = castReference(documentRef);
515
- if (arguments.length === 2) {
516
- this._delegate.update(ref, dataOrField as PublicUpdateData);
517
- } else {
518
- this._delegate.update(
519
- ref,
520
- dataOrField as string | ExpFieldPath,
521
- value,
522
- ...moreFieldsAndValues
523
- );
524
- }
525
- return this;
526
- }
527
-
528
- delete(documentRef: PublicDocumentReference<unknown>): WriteBatch {
529
- const ref = castReference(documentRef);
530
- this._delegate.delete(ref);
531
- return this;
532
- }
533
-
534
- commit(): Promise<void> {
535
- return this._delegate.commit();
536
- }
537
- }
538
-
539
- /**
540
- * Wraps a `PublicFirestoreDataConverter` translating the types from the
541
- * experimental SDK into corresponding types from the Classic SDK before passing
542
- * them to the wrapped converter.
543
- */
544
- class FirestoreDataConverter<U>
545
- implements
546
- ModularFirestoreDataConverter<U>,
547
- Compat<PublicFirestoreDataConverter<U>>
548
- {
549
- private static readonly INSTANCES = new WeakMap();
550
-
551
- private constructor(
552
- private readonly _firestore: Firestore,
553
- private readonly _userDataWriter: UserDataWriter,
554
- readonly _delegate: PublicFirestoreDataConverter<U>
555
- ) {}
556
-
557
- fromFirestore(
558
- snapshot: ExpQueryDocumentSnapshot,
559
- options?: PublicSnapshotOptions
560
- ): U {
561
- const expSnapshot = new ExpQueryDocumentSnapshot(
562
- this._firestore._delegate,
563
- this._userDataWriter,
564
- snapshot._key,
565
- snapshot._document,
566
- snapshot.metadata,
567
- /* converter= */ null
568
- );
569
- return this._delegate.fromFirestore(
570
- new QueryDocumentSnapshot(this._firestore, expSnapshot),
571
- options ?? {}
572
- );
573
- }
574
-
575
- toFirestore(modelObject: WithFieldValue<U>): PublicDocumentData;
576
- toFirestore(
577
- modelObject: PartialWithFieldValue<U>,
578
- options: PublicSetOptions
579
- ): PublicDocumentData;
580
- toFirestore(
581
- modelObject: WithFieldValue<U> | PartialWithFieldValue<U>,
582
- options?: PublicSetOptions
583
- ): PublicDocumentData {
584
- if (!options) {
585
- return this._delegate.toFirestore(modelObject as U);
586
- } else {
587
- return this._delegate.toFirestore(modelObject as Partial<U>, options);
588
- }
589
- }
590
-
591
- // Use the same instance of `FirestoreDataConverter` for the given instances
592
- // of `Firestore` and `PublicFirestoreDataConverter` so that isEqual() will
593
- // compare equal for two objects created with the same converter instance.
594
- static getInstance<U>(
595
- firestore: Firestore,
596
- converter: PublicFirestoreDataConverter<U>
597
- ): FirestoreDataConverter<U> {
598
- const converterMapByFirestore = FirestoreDataConverter.INSTANCES;
599
- let untypedConverterByConverter = converterMapByFirestore.get(firestore);
600
- if (!untypedConverterByConverter) {
601
- untypedConverterByConverter = new WeakMap();
602
- converterMapByFirestore.set(firestore, untypedConverterByConverter);
603
- }
604
-
605
- let instance = untypedConverterByConverter.get(converter);
606
- if (!instance) {
607
- instance = new FirestoreDataConverter(
608
- firestore,
609
- new UserDataWriter(firestore),
610
- converter
611
- );
612
- untypedConverterByConverter.set(converter, instance);
613
- }
614
-
615
- return instance;
616
- }
617
- }
618
-
619
- /**
620
- * A reference to a particular document in a collection in the database.
621
- */
622
- export class DocumentReference<T = PublicDocumentData>
623
- implements PublicDocumentReference<T>, Compat<ExpDocumentReference<T>>
624
- {
625
- private _userDataWriter: UserDataWriter;
626
-
627
- constructor(
628
- readonly firestore: Firestore,
629
- readonly _delegate: ExpDocumentReference<T>
630
- ) {
631
- this._userDataWriter = new UserDataWriter(firestore);
632
- }
633
-
634
- static forPath<U>(
635
- path: _ResourcePath,
636
- firestore: Firestore,
637
- converter: ModularFirestoreDataConverter<U> | null
638
- ): DocumentReference<U> {
639
- if (path.length % 2 !== 0) {
640
- throw new FirestoreError(
641
- 'invalid-argument',
642
- 'Invalid document reference. Document ' +
643
- 'references must have an even number of segments, but ' +
644
- `${path.canonicalString()} has ${path.length}`
645
- );
646
- }
647
- return new DocumentReference(
648
- firestore,
649
- new ExpDocumentReference(
650
- firestore._delegate,
651
- converter,
652
- new _DocumentKey(path)
653
- )
654
- );
655
- }
656
-
657
- static forKey<U>(
658
- key: _DocumentKey,
659
- firestore: Firestore,
660
- converter: ModularFirestoreDataConverter<U> | null
661
- ): DocumentReference<U> {
662
- return new DocumentReference(
663
- firestore,
664
- new ExpDocumentReference(firestore._delegate, converter, key)
665
- );
666
- }
667
-
668
- get id(): string {
669
- return this._delegate.id;
670
- }
671
-
672
- get parent(): PublicCollectionReference<T> {
673
- return new CollectionReference(this.firestore, this._delegate.parent);
674
- }
675
-
676
- get path(): string {
677
- return this._delegate.path;
678
- }
679
-
680
- collection(
681
- pathString: string
682
- ): PublicCollectionReference<PublicDocumentData> {
683
- try {
684
- return new CollectionReference(
685
- this.firestore,
686
- collection(this._delegate, pathString)
687
- );
688
- } catch (e) {
689
- throw replaceFunctionName(
690
- e,
691
- 'collection()',
692
- 'DocumentReference.collection()'
693
- );
694
- }
695
- }
696
-
697
- isEqual(other: PublicDocumentReference<T>): boolean {
698
- other = getModularInstance<PublicDocumentReference<T>>(other);
699
-
700
- if (!(other instanceof ExpDocumentReference)) {
701
- return false;
702
- }
703
- return refEqual(this._delegate, other);
704
- }
705
-
706
- set(value: Partial<T>, options: PublicSetOptions): Promise<void>;
707
- set(value: T): Promise<void>;
708
- set(value: T | Partial<T>, options?: PublicSetOptions): Promise<void> {
709
- options = validateSetOptions('DocumentReference.set', options);
710
- try {
711
- if (options) {
712
- return setDoc(
713
- this._delegate,
714
- value as PartialWithFieldValue<T>,
715
- options
716
- );
717
- } else {
718
- return setDoc(this._delegate, value as WithFieldValue<T>);
719
- }
720
- } catch (e) {
721
- throw replaceFunctionName(e, 'setDoc()', 'DocumentReference.set()');
722
- }
723
- }
724
-
725
- update(value: PublicUpdateData): Promise<void>;
726
- update(
727
- field: string | PublicFieldPath,
728
- value: unknown,
729
- ...moreFieldsAndValues: unknown[]
730
- ): Promise<void>;
731
- update(
732
- fieldOrUpdateData: string | PublicFieldPath | PublicUpdateData,
733
- value?: unknown,
734
- ...moreFieldsAndValues: unknown[]
735
- ): Promise<void> {
736
- try {
737
- if (arguments.length === 1) {
738
- return updateDoc(this._delegate, fieldOrUpdateData as PublicUpdateData);
739
- } else {
740
- return updateDoc(
741
- this._delegate,
742
- fieldOrUpdateData as string | ExpFieldPath,
743
- value,
744
- ...moreFieldsAndValues
745
- );
746
- }
747
- } catch (e) {
748
- throw replaceFunctionName(e, 'updateDoc()', 'DocumentReference.update()');
749
- }
750
- }
751
-
752
- delete(): Promise<void> {
753
- return deleteDoc(this._delegate);
754
- }
755
-
756
- onSnapshot(observer: PartialObserver<PublicDocumentSnapshot<T>>): Unsubscribe;
757
- onSnapshot(
758
- options: PublicSnapshotListenOptions,
759
- observer: PartialObserver<PublicDocumentSnapshot<T>>
760
- ): Unsubscribe;
761
- onSnapshot(
762
- onNext: NextFn<PublicDocumentSnapshot<T>>,
763
- onError?: ErrorFn,
764
- onCompletion?: CompleteFn
765
- ): Unsubscribe;
766
- onSnapshot(
767
- options: PublicSnapshotListenOptions,
768
- onNext: NextFn<PublicDocumentSnapshot<T>>,
769
- onError?: ErrorFn,
770
- onCompletion?: CompleteFn
771
- ): Unsubscribe;
772
-
773
- onSnapshot(...args: unknown[]): Unsubscribe {
774
- const options = extractSnapshotOptions(args);
775
- const observer = wrapObserver<DocumentSnapshot<T>, ExpDocumentSnapshot<T>>(
776
- args,
777
- result =>
778
- new DocumentSnapshot(
779
- this.firestore,
780
- new ExpDocumentSnapshot(
781
- this.firestore._delegate,
782
- this._userDataWriter,
783
- result._key,
784
- result._document,
785
- result.metadata,
786
- this._delegate.converter
787
- )
788
- )
789
- );
790
- return onSnapshot(this._delegate, options, observer);
791
- }
792
-
793
- get(options?: PublicGetOptions): Promise<PublicDocumentSnapshot<T>> {
794
- let snap: Promise<ExpDocumentSnapshot<T>>;
795
- if (options?.source === 'cache') {
796
- snap = getDocFromCache(this._delegate);
797
- } else if (options?.source === 'server') {
798
- snap = getDocFromServer(this._delegate);
799
- } else {
800
- snap = getDoc(this._delegate);
801
- }
802
-
803
- return snap.then(
804
- result =>
805
- new DocumentSnapshot(
806
- this.firestore,
807
- new ExpDocumentSnapshot(
808
- this.firestore._delegate,
809
- this._userDataWriter,
810
- result._key,
811
- result._document,
812
- result.metadata,
813
- this._delegate.converter
814
- )
815
- )
816
- );
817
- }
818
-
819
- withConverter(converter: null): PublicDocumentReference<PublicDocumentData>;
820
- withConverter<U>(
821
- converter: PublicFirestoreDataConverter<U>
822
- ): PublicDocumentReference<U>;
823
- withConverter<U>(
824
- converter: PublicFirestoreDataConverter<U> | null
825
- ): PublicDocumentReference<U> {
826
- return new DocumentReference<U>(
827
- this.firestore,
828
- converter
829
- ? this._delegate.withConverter(
830
- FirestoreDataConverter.getInstance(this.firestore, converter)
831
- )
832
- : (this._delegate.withConverter(null) as ExpDocumentReference<U>)
833
- );
834
- }
835
- }
836
-
837
- /**
838
- * Replaces the function name in an error thrown by the firestore-exp API
839
- * with the function names used in the classic API.
840
- */
841
- function replaceFunctionName(
842
- e: Error,
843
- original: string | RegExp,
844
- updated: string
845
- ): Error {
846
- e.message = e.message.replace(original, updated);
847
- return e;
848
- }
849
-
850
- /**
851
- * Iterates the list of arguments from an `onSnapshot` call and returns the
852
- * first argument that may be an `SnapshotListenOptions` object. Returns an
853
- * empty object if none is found.
854
- */
855
- export function extractSnapshotOptions(
856
- args: unknown[]
857
- ): PublicSnapshotListenOptions {
858
- for (const arg of args) {
859
- if (typeof arg === 'object' && !isPartialObserver(arg)) {
860
- return arg as PublicSnapshotListenOptions;
861
- }
862
- }
863
- return {};
864
- }
865
-
866
- /**
867
- * Creates an observer that can be passed to the firestore-exp SDK. The
868
- * observer converts all observed values into the format expected by the classic
869
- * SDK.
870
- *
871
- * @param args - The list of arguments from an `onSnapshot` call.
872
- * @param wrapper - The function that converts the firestore-exp type into the
873
- * type used by this shim.
874
- */
875
- export function wrapObserver<CompatType, ExpType>(
876
- args: unknown[],
877
- wrapper: (val: ExpType) => CompatType
878
- ): PartialObserver<ExpType> {
879
- let userObserver: PartialObserver<CompatType>;
880
- if (isPartialObserver(args[0])) {
881
- userObserver = args[0] as PartialObserver<CompatType>;
882
- } else if (isPartialObserver(args[1])) {
883
- userObserver = args[1];
884
- } else if (typeof args[0] === 'function') {
885
- userObserver = {
886
- next: args[0] as NextFn<CompatType> | undefined,
887
- error: args[1] as ErrorFn | undefined,
888
- complete: args[2] as CompleteFn | undefined
889
- };
890
- } else {
891
- userObserver = {
892
- next: args[1] as NextFn<CompatType> | undefined,
893
- error: args[2] as ErrorFn | undefined,
894
- complete: args[3] as CompleteFn | undefined
895
- };
896
- }
897
-
898
- return {
899
- next: val => {
900
- if (userObserver!.next) {
901
- userObserver!.next(wrapper(val));
902
- }
903
- },
904
- error: userObserver.error?.bind(userObserver),
905
- complete: userObserver.complete?.bind(userObserver)
906
- };
907
- }
908
-
909
- /**
910
- * Options interface that can be provided to configure the deserialization of
911
- * DocumentSnapshots.
912
- */
913
- export interface SnapshotOptions extends PublicSnapshotOptions {}
914
-
915
- export class DocumentSnapshot<T = PublicDocumentData>
916
- implements PublicDocumentSnapshot<T>, Compat<ExpDocumentSnapshot<T>>
917
- {
918
- constructor(
919
- private readonly _firestore: Firestore,
920
- readonly _delegate: ExpDocumentSnapshot<T>
921
- ) {}
922
-
923
- get ref(): DocumentReference<T> {
924
- return new DocumentReference<T>(this._firestore, this._delegate.ref);
925
- }
926
-
927
- get id(): string {
928
- return this._delegate.id;
929
- }
930
-
931
- get metadata(): SnapshotMetadata {
932
- return this._delegate.metadata;
933
- }
934
-
935
- get exists(): boolean {
936
- return this._delegate.exists();
937
- }
938
-
939
- data(options?: PublicSnapshotOptions): T | undefined {
940
- return this._delegate.data(options);
941
- }
942
-
943
- get(
944
- fieldPath: string | PublicFieldPath,
945
- options?: PublicSnapshotOptions
946
- // We are using `any` here to avoid an explicit cast by our users.
947
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
948
- ): any {
949
- return this._delegate.get(fieldPath as string | ExpFieldPath, options);
950
- }
951
-
952
- isEqual(other: DocumentSnapshot<T>): boolean {
953
- return snapshotEqual(this._delegate, other._delegate);
954
- }
955
- }
956
-
957
- export class QueryDocumentSnapshot<T = PublicDocumentData>
958
- extends DocumentSnapshot<T>
959
- implements PublicQueryDocumentSnapshot<T>
960
- {
961
- data(options?: PublicSnapshotOptions): T {
962
- const data = this._delegate.data(options);
963
- _debugAssert(
964
- data !== undefined,
965
- 'Document in a QueryDocumentSnapshot should exist'
966
- );
967
- return data;
968
- }
969
- }
970
-
971
- export class Query<T = PublicDocumentData>
972
- implements PublicQuery<T>, Compat<ExpQuery<T>>
973
- {
974
- private readonly _userDataWriter: UserDataWriter;
975
-
976
- constructor(readonly firestore: Firestore, readonly _delegate: ExpQuery<T>) {
977
- this._userDataWriter = new UserDataWriter(firestore);
978
- }
979
-
980
- where(
981
- fieldPath: string | _FieldPath,
982
- opStr: PublicWhereFilterOp,
983
- value: unknown
984
- ): Query<T> {
985
- try {
986
- // The "as string" cast is a little bit of a hack. `where` accepts the
987
- // FieldPath Compat type as input, but is not typed as such in order to
988
- // not expose this via our public typings file.
989
- return new Query<T>(
990
- this.firestore,
991
- query(this._delegate, where(fieldPath as string, opStr, value))
992
- );
993
- } catch (e) {
994
- throw replaceFunctionName(e, /(orderBy|where)\(\)/, 'Query.$1()');
995
- }
996
- }
997
-
998
- orderBy(
999
- fieldPath: string | _FieldPath,
1000
- directionStr?: PublicOrderByDirection
1001
- ): Query<T> {
1002
- try {
1003
- // The "as string" cast is a little bit of a hack. `orderBy` accepts the
1004
- // FieldPath Compat type as input, but is not typed as such in order to
1005
- // not expose this via our public typings file.
1006
- return new Query<T>(
1007
- this.firestore,
1008
- query(this._delegate, orderBy(fieldPath as string, directionStr))
1009
- );
1010
- } catch (e) {
1011
- throw replaceFunctionName(e, /(orderBy|where)\(\)/, 'Query.$1()');
1012
- }
1013
- }
1014
-
1015
- limit(n: number): Query<T> {
1016
- try {
1017
- return new Query<T>(this.firestore, query(this._delegate, limit(n)));
1018
- } catch (e) {
1019
- throw replaceFunctionName(e, 'limit()', 'Query.limit()');
1020
- }
1021
- }
1022
-
1023
- limitToLast(n: number): Query<T> {
1024
- try {
1025
- return new Query<T>(
1026
- this.firestore,
1027
- query(this._delegate, limitToLast(n))
1028
- );
1029
- } catch (e) {
1030
- throw replaceFunctionName(e, 'limitToLast()', 'Query.limitToLast()');
1031
- }
1032
- }
1033
-
1034
- startAt(...args: any[]): Query<T> {
1035
- try {
1036
- return new Query(this.firestore, query(this._delegate, startAt(...args)));
1037
- } catch (e) {
1038
- throw replaceFunctionName(e, 'startAt()', 'Query.startAt()');
1039
- }
1040
- }
1041
-
1042
- startAfter(...args: any[]): Query<T> {
1043
- try {
1044
- return new Query(
1045
- this.firestore,
1046
- query(this._delegate, startAfter(...args))
1047
- );
1048
- } catch (e) {
1049
- throw replaceFunctionName(e, 'startAfter()', 'Query.startAfter()');
1050
- }
1051
- }
1052
-
1053
- endBefore(...args: any[]): Query<T> {
1054
- try {
1055
- return new Query(
1056
- this.firestore,
1057
- query(this._delegate, endBefore(...args))
1058
- );
1059
- } catch (e) {
1060
- throw replaceFunctionName(e, 'endBefore()', 'Query.endBefore()');
1061
- }
1062
- }
1063
-
1064
- endAt(...args: any[]): Query<T> {
1065
- try {
1066
- return new Query(this.firestore, query(this._delegate, endAt(...args)));
1067
- } catch (e) {
1068
- throw replaceFunctionName(e, 'endAt()', 'Query.endAt()');
1069
- }
1070
- }
1071
-
1072
- isEqual(other: PublicQuery<T>): boolean {
1073
- return queryEqual(this._delegate, (other as Query<T>)._delegate);
1074
- }
1075
-
1076
- get(options?: PublicGetOptions): Promise<QuerySnapshot<T>> {
1077
- let query: Promise<ExpQuerySnapshot<T>>;
1078
- if (options?.source === 'cache') {
1079
- query = getDocsFromCache(this._delegate);
1080
- } else if (options?.source === 'server') {
1081
- query = getDocsFromServer(this._delegate);
1082
- } else {
1083
- query = getDocs(this._delegate);
1084
- }
1085
- return query.then(
1086
- result =>
1087
- new QuerySnapshot(
1088
- this.firestore,
1089
- new ExpQuerySnapshot<T>(
1090
- this.firestore._delegate,
1091
- this._userDataWriter,
1092
- this._delegate,
1093
- result._snapshot
1094
- )
1095
- )
1096
- );
1097
- }
1098
-
1099
- onSnapshot(observer: PartialObserver<PublicQuerySnapshot<T>>): Unsubscribe;
1100
- onSnapshot(
1101
- options: PublicSnapshotListenOptions,
1102
- observer: PartialObserver<PublicQuerySnapshot<T>>
1103
- ): Unsubscribe;
1104
- onSnapshot(
1105
- onNext: NextFn<PublicQuerySnapshot<T>>,
1106
- onError?: ErrorFn,
1107
- onCompletion?: CompleteFn
1108
- ): Unsubscribe;
1109
- onSnapshot(
1110
- options: PublicSnapshotListenOptions,
1111
- onNext: NextFn<PublicQuerySnapshot<T>>,
1112
- onError?: ErrorFn,
1113
- onCompletion?: CompleteFn
1114
- ): Unsubscribe;
1115
-
1116
- onSnapshot(...args: unknown[]): Unsubscribe {
1117
- const options = extractSnapshotOptions(args);
1118
- const observer = wrapObserver<QuerySnapshot<T>, ExpQuerySnapshot<T>>(
1119
- args,
1120
- snap =>
1121
- new QuerySnapshot(
1122
- this.firestore,
1123
- new ExpQuerySnapshot<T>(
1124
- this.firestore._delegate,
1125
- this._userDataWriter,
1126
- this._delegate,
1127
- snap._snapshot
1128
- )
1129
- )
1130
- );
1131
- return onSnapshot(this._delegate, options, observer);
1132
- }
1133
-
1134
- withConverter(converter: null): Query<PublicDocumentData>;
1135
- withConverter<U>(converter: PublicFirestoreDataConverter<U>): Query<U>;
1136
- withConverter<U>(
1137
- converter: PublicFirestoreDataConverter<U> | null
1138
- ): Query<U> {
1139
- return new Query<U>(
1140
- this.firestore,
1141
- converter
1142
- ? this._delegate.withConverter(
1143
- FirestoreDataConverter.getInstance(this.firestore, converter)
1144
- )
1145
- : (this._delegate.withConverter(null) as ExpQuery<U>)
1146
- );
1147
- }
1148
- }
1149
-
1150
- export class DocumentChange<T = PublicDocumentData>
1151
- implements PublicDocumentChange<T>, Compat<ExpDocumentChange<T>>
1152
- {
1153
- constructor(
1154
- private readonly _firestore: Firestore,
1155
- readonly _delegate: ExpDocumentChange<T>
1156
- ) {}
1157
-
1158
- get type(): PublicDocumentChangeType {
1159
- return this._delegate.type;
1160
- }
1161
-
1162
- get doc(): QueryDocumentSnapshot<T> {
1163
- return new QueryDocumentSnapshot<T>(this._firestore, this._delegate.doc);
1164
- }
1165
-
1166
- get oldIndex(): number {
1167
- return this._delegate.oldIndex;
1168
- }
1169
-
1170
- get newIndex(): number {
1171
- return this._delegate.newIndex;
1172
- }
1173
- }
1174
-
1175
- export class QuerySnapshot<T = PublicDocumentData>
1176
- implements PublicQuerySnapshot<T>, Compat<ExpQuerySnapshot<T>>
1177
- {
1178
- constructor(
1179
- readonly _firestore: Firestore,
1180
- readonly _delegate: ExpQuerySnapshot<T>
1181
- ) {}
1182
-
1183
- get query(): Query<T> {
1184
- return new Query(this._firestore, this._delegate.query);
1185
- }
1186
-
1187
- get metadata(): SnapshotMetadata {
1188
- return this._delegate.metadata;
1189
- }
1190
-
1191
- get size(): number {
1192
- return this._delegate.size;
1193
- }
1194
-
1195
- get empty(): boolean {
1196
- return this._delegate.empty;
1197
- }
1198
-
1199
- get docs(): Array<QueryDocumentSnapshot<T>> {
1200
- return this._delegate.docs.map(
1201
- doc => new QueryDocumentSnapshot<T>(this._firestore, doc)
1202
- );
1203
- }
1204
-
1205
- docChanges(
1206
- options?: PublicSnapshotListenOptions
1207
- ): Array<PublicDocumentChange<T>> {
1208
- return this._delegate
1209
- .docChanges(options)
1210
- .map(docChange => new DocumentChange<T>(this._firestore, docChange));
1211
- }
1212
-
1213
- forEach(
1214
- callback: (result: QueryDocumentSnapshot<T>) => void,
1215
- thisArg?: unknown
1216
- ): void {
1217
- this._delegate.forEach(snapshot => {
1218
- callback.call(
1219
- thisArg,
1220
- new QueryDocumentSnapshot(this._firestore, snapshot)
1221
- );
1222
- });
1223
- }
1224
-
1225
- isEqual(other: QuerySnapshot<T>): boolean {
1226
- return snapshotEqual(this._delegate, other._delegate);
1227
- }
1228
- }
1229
-
1230
- export class CollectionReference<T = PublicDocumentData>
1231
- extends Query<T>
1232
- implements PublicCollectionReference<T>
1233
- {
1234
- constructor(
1235
- readonly firestore: Firestore,
1236
- readonly _delegate: ExpCollectionReference<T>
1237
- ) {
1238
- super(firestore, _delegate);
1239
- }
1240
-
1241
- get id(): string {
1242
- return this._delegate.id;
1243
- }
1244
-
1245
- get path(): string {
1246
- return this._delegate.path;
1247
- }
1248
-
1249
- get parent(): DocumentReference<PublicDocumentData> | null {
1250
- const docRef = this._delegate.parent;
1251
- return docRef ? new DocumentReference(this.firestore, docRef) : null;
1252
- }
1253
-
1254
- doc(documentPath?: string): DocumentReference<T> {
1255
- try {
1256
- if (documentPath === undefined) {
1257
- // Call `doc` without `documentPath` if `documentPath` is `undefined`
1258
- // as `doc` validates the number of arguments to prevent users from
1259
- // accidentally passing `undefined`.
1260
- return new DocumentReference(this.firestore, doc(this._delegate));
1261
- } else {
1262
- return new DocumentReference(
1263
- this.firestore,
1264
- doc(this._delegate, documentPath)
1265
- );
1266
- }
1267
- } catch (e) {
1268
- throw replaceFunctionName(e, 'doc()', 'CollectionReference.doc()');
1269
- }
1270
- }
1271
-
1272
- add(data: T): Promise<DocumentReference<T>> {
1273
- return addDoc(this._delegate, data as WithFieldValue<T>).then(
1274
- docRef => new DocumentReference(this.firestore, docRef)
1275
- );
1276
- }
1277
-
1278
- isEqual(other: CollectionReference<T>): boolean {
1279
- return refEqual(this._delegate, other._delegate);
1280
- }
1281
-
1282
- withConverter(converter: null): CollectionReference<PublicDocumentData>;
1283
- withConverter<U>(
1284
- converter: PublicFirestoreDataConverter<U>
1285
- ): CollectionReference<U>;
1286
- withConverter<U>(
1287
- converter: PublicFirestoreDataConverter<U> | null
1288
- ): CollectionReference<U> {
1289
- return new CollectionReference<U>(
1290
- this.firestore,
1291
- converter
1292
- ? this._delegate.withConverter(
1293
- FirestoreDataConverter.getInstance(this.firestore, converter)
1294
- )
1295
- : (this._delegate.withConverter(null) as ExpCollectionReference<U>)
1296
- );
1297
- }
1298
- }
1299
-
1300
- function castReference<T>(
1301
- documentRef: PublicDocumentReference<T>
1302
- ): ExpDocumentReference<T> {
1303
- return _cast<ExpDocumentReference<T>>(documentRef, ExpDocumentReference);
1304
- }