From e0c2db61d3a9abe897b069597138c123c3bdadbf Mon Sep 17 00:00:00 2001 From: KingDarBoja Date: Sun, 23 Aug 2020 15:52:09 -0500 Subject: [PATCH 1/3] fix(firestore): doc and collection methods generic --- .../collection-group/collection-group.spec.ts | 8 ++++---- .../collection-group/collection-group.ts | 4 ++-- src/firestore/collection/collection.spec.ts | 6 +++--- src/firestore/collection/collection.ts | 10 +++++----- src/firestore/document/document.spec.ts | 5 +++-- src/firestore/document/document.ts | 14 ++++++------- src/firestore/firestore.ts | 20 +++++++++---------- src/firestore/interfaces.ts | 16 +++++++-------- src/firestore/observable/fromRef.ts | 12 +++++------ 9 files changed, 48 insertions(+), 47 deletions(-) diff --git a/src/firestore/collection-group/collection-group.spec.ts b/src/firestore/collection-group/collection-group.spec.ts index 4c199fb17..6a5951dd6 100644 --- a/src/firestore/collection-group/collection-group.spec.ts +++ b/src/firestore/collection-group/collection-group.spec.ts @@ -1,6 +1,6 @@ import { AngularFireModule, FirebaseApp } from '@angular/fire'; import { AngularFirestore, AngularFirestoreCollectionGroup, AngularFirestoreModule, SETTINGS } from '../public_api'; -import { Query, QueryGroupFn } from '../interfaces'; +import { QueryGroupFn, Query } from '../interfaces'; import { BehaviorSubject } from 'rxjs'; import { skip, switchMap, take } from 'rxjs/operators'; import { TestBed } from '@angular/core/testing'; @@ -19,11 +19,11 @@ import { Stock } from '../utils.spec'; -async function collectionHarness(afs: AngularFirestore, items: number, queryGroupFn?: QueryGroupFn) { +async function collectionHarness(afs: AngularFirestore, items: number, queryGroupFn?: QueryGroupFn) { const randomCollectionName = randomName(afs.firestore); const ref = afs.firestore.collection(`${randomCollectionName}`); - const firestore: any = afs.firestore; - const collectionGroup: Query = firestore.collectionGroup(randomCollectionName); + const firestore = afs.firestore; + const collectionGroup = firestore.collectionGroup(randomCollectionName) as Query; const queryFn = queryGroupFn || (ref => ref); const stocks = new AngularFirestoreCollectionGroup(queryFn(collectionGroup), afs); const names = await createRandomStocks(afs.firestore, ref, items); diff --git a/src/firestore/collection-group/collection-group.ts b/src/firestore/collection-group/collection-group.ts index 1c3aff9fd..e1093e442 100644 --- a/src/firestore/collection-group/collection-group.ts +++ b/src/firestore/collection-group/collection-group.ts @@ -26,13 +26,13 @@ import { AngularFirestore } from '../firestore'; * // Subscribe to changes as snapshots. This provides you data updates as well as delta updates. * fakeStock.valueChanges().subscribe(value => console.log(value)); */ -export class AngularFirestoreCollectionGroup { +export class AngularFirestoreCollectionGroup { /** * The constructor takes in a CollectionGroupQuery to provide wrapper methods * for data operations and data streaming. */ constructor( - private readonly query: Query, + private readonly query: Query, private readonly afs: AngularFirestore) { } /** diff --git a/src/firestore/collection/collection.spec.ts b/src/firestore/collection/collection.spec.ts index 5d1951a59..eb933c6e2 100644 --- a/src/firestore/collection/collection.spec.ts +++ b/src/firestore/collection/collection.spec.ts @@ -2,7 +2,7 @@ import { AngularFireModule, FirebaseApp } from '@angular/fire'; import { AngularFirestore, SETTINGS } from '../firestore'; import { AngularFirestoreModule } from '../firestore.module'; import { AngularFirestoreCollection } from './collection'; -import { QueryFn } from '../interfaces'; +import { QueryFn, CollectionReference } from '../interfaces'; import { BehaviorSubject } from 'rxjs'; import { skip, switchMap, take } from 'rxjs/operators'; import 'firebase/firestore'; @@ -22,9 +22,9 @@ import { Stock } from '../utils.spec'; -async function collectionHarness(afs: AngularFirestore, items: number, queryFn?: QueryFn) { +async function collectionHarness(afs: AngularFirestore, items: number, queryFn?: QueryFn) { const randomCollectionName = randomName(afs.firestore); - const ref = afs.firestore.collection(`${randomCollectionName}`); + const ref = afs.firestore.collection(`${randomCollectionName}`) as CollectionReference; if (!queryFn) { queryFn = (ref) => ref; } diff --git a/src/firestore/collection/collection.ts b/src/firestore/collection/collection.ts index 94a953577..dbd2d049d 100644 --- a/src/firestore/collection/collection.ts +++ b/src/firestore/collection/collection.ts @@ -38,7 +38,7 @@ export function validateEventsArray(events?: DocumentChangeType[]) { * // Subscribe to changes as snapshots. This provides you data updates as well as delta updates. * fakeStock.valueChanges().subscribe(value => console.log(value)); */ -export class AngularFirestoreCollection { +export class AngularFirestoreCollection { /** * The constructor takes in a CollectionReference and Query to provide wrapper methods * for data operations and data streaming. @@ -49,8 +49,8 @@ export class AngularFirestoreCollection { * on this implication. */ constructor( - public readonly ref: CollectionReference, - private readonly query: Query, + public readonly ref: CollectionReference, + private readonly query: Query, private readonly afs: AngularFirestore) { } /** @@ -134,14 +134,14 @@ export class AngularFirestoreCollection { * when you update data it is not updating data to the window of your query unless * the data fits the criteria of the query. */ - add(data: T): Promise { + add(data: T): Promise> { return this.ref.add(data); } /** * Create a reference to a single document in a collection. */ - doc(path?: string): AngularFirestoreDocument { + doc(path?: string): AngularFirestoreDocument { return new AngularFirestoreDocument(this.ref.doc(path), this.afs); } } diff --git a/src/firestore/document/document.spec.ts b/src/firestore/document/document.spec.ts index a6acc0b52..601de576c 100644 --- a/src/firestore/document/document.spec.ts +++ b/src/firestore/document/document.spec.ts @@ -2,6 +2,7 @@ import { AngularFireModule, FirebaseApp } from '@angular/fire'; import { AngularFirestore, SETTINGS } from '../firestore'; import { AngularFirestoreModule } from '../firestore.module'; import { AngularFirestoreDocument } from './document'; +import { DocumentReference } from '../interfaces'; import { take } from 'rxjs/operators'; import { TestBed } from '@angular/core/testing'; @@ -35,7 +36,7 @@ describe('AngularFirestoreDocument', () => { it('should get action updates', async (done: any) => { const randomCollectionName = randomName(afs.firestore); - const ref = afs.firestore.doc(`${randomCollectionName}/FAKE`); + const ref = afs.firestore.doc(`${randomCollectionName}/FAKE`) as DocumentReference; const stock = new AngularFirestoreDocument(ref, afs); await stock.set(FAKE_STOCK_DATA); const sub = stock @@ -51,7 +52,7 @@ describe('AngularFirestoreDocument', () => { it('should get unwrapped snapshot', async (done: any) => { const randomCollectionName = afs.firestore.collection('a').doc().id; - const ref = afs.firestore.doc(`${randomCollectionName}/FAKE`); + const ref = afs.firestore.doc(`${randomCollectionName}/FAKE`) as DocumentReference; const stock = new AngularFirestoreDocument(ref, afs); await stock.set(FAKE_STOCK_DATA); const obs$ = stock.valueChanges(); diff --git a/src/firestore/document/document.ts b/src/firestore/document/document.ts index 8592c5a5f..2431ef1bf 100644 --- a/src/firestore/document/document.ts +++ b/src/firestore/document/document.ts @@ -28,13 +28,13 @@ import { firestore } from 'firebase/app'; * // OR! Transform using Observable.from() and the data is unwrapped for you * Observable.from(fakeStock).subscribe(value => console.log(value)); */ -export class AngularFirestoreDocument { +export class AngularFirestoreDocument { /** - * The contstuctor takes in a DocumentReference to provide wrapper methods + * The constructor takes in a DocumentReference to provide wrapper methods * for data operations, data streaming, and Symbol.observable. */ - constructor(public ref: DocumentReference, private afs: AngularFirestore) { } + constructor(public ref: DocumentReference, private afs: AngularFirestore) { } /** * Create or overwrite a single document. @@ -61,10 +61,10 @@ export class AngularFirestoreDocument { * Create a reference to a sub-collection given a path and an optional query * function. */ - collection(path: string, queryFn?: QueryFn): AngularFirestoreCollection { - const collectionRef = this.ref.collection(path); - const { ref, query } = associateQuery(collectionRef, queryFn); - return new AngularFirestoreCollection(ref, query, this.afs); + collection(path: string, queryFn?: QueryFn): AngularFirestoreCollection { + const collectionRef = this.ref.collection(path) as firestore.CollectionReference; + const { ref, query } = associateQuery(collectionRef, queryFn); + return new AngularFirestoreCollection(ref, query, this.afs); } /** diff --git a/src/firestore/firestore.ts b/src/firestore/firestore.ts index f7d1571e6..991747a38 100644 --- a/src/firestore/firestore.ts +++ b/src/firestore/firestore.ts @@ -47,7 +47,7 @@ export const SETTINGS = new InjectionToken('angularfire2.firestore.set * return ref.where('age', '<', 200); * }); */ -export function associateQuery(collectionRef: CollectionReference, queryFn = ref => ref): AssociatedReference { +export function associateQuery(collectionRef: CollectionReference, queryFn = ref => ref): AssociatedReference { const query = queryFn(collectionRef); const ref = collectionRef; return { query, ref }; @@ -174,14 +174,14 @@ export class AngularFirestore { collection(path: string, queryFn?: QueryFn): AngularFirestoreCollection; // tslint:disable-next-line:unified-signatures collection(ref: CollectionReference, queryFn?: QueryFn): AngularFirestoreCollection; - collection(pathOrRef: string | CollectionReference, queryFn?: QueryFn): AngularFirestoreCollection { - let collectionRef: CollectionReference; + collection(pathOrRef: string | CollectionReference, queryFn?: QueryFn): AngularFirestoreCollection { + let collectionRef: CollectionReference; if (typeof pathOrRef === 'string') { - collectionRef = this.firestore.collection(pathOrRef); + collectionRef = this.firestore.collection(pathOrRef) as firestore.CollectionReference; } else { collectionRef = pathOrRef; } - const { ref, query } = associateQuery(collectionRef, queryFn); + const { ref, query } = associateQuery(collectionRef, queryFn); const refInZone = this.schedulers.ngZone.run(() => ref); return new AngularFirestoreCollection(refInZone, query, this); } @@ -191,9 +191,9 @@ export class AngularFirestore { * and an optional query function to narrow the result * set. */ - collectionGroup(collectionId: string, queryGroupFn?: QueryGroupFn): AngularFirestoreCollectionGroup { + collectionGroup(collectionId: string, queryGroupFn?: QueryGroupFn): AngularFirestoreCollectionGroup { const queryFn = queryGroupFn || (ref => ref); - const collectionGroup: Query = this.firestore.collectionGroup(collectionId); + const collectionGroup: Query = this.firestore.collectionGroup(collectionId) as firestore.Query; return new AngularFirestoreCollectionGroup(queryFn(collectionGroup), this); } @@ -206,10 +206,10 @@ export class AngularFirestore { doc(path: string): AngularFirestoreDocument; // tslint:disable-next-line:unified-signatures doc(ref: DocumentReference): AngularFirestoreDocument; - doc(pathOrRef: string | DocumentReference): AngularFirestoreDocument { - let ref: DocumentReference; + doc(pathOrRef: string | DocumentReference): AngularFirestoreDocument { + let ref: DocumentReference; if (typeof pathOrRef === 'string') { - ref = this.firestore.doc(pathOrRef); + ref = this.firestore.doc(pathOrRef) as firestore.DocumentReference; } else { ref = pathOrRef; } diff --git a/src/firestore/interfaces.ts b/src/firestore/interfaces.ts index 8a8461fdd..26341612c 100644 --- a/src/firestore/interfaces.ts +++ b/src/firestore/interfaces.ts @@ -2,13 +2,13 @@ import { Subscriber } from 'rxjs'; import { firestore } from 'firebase/app'; export type Settings = firestore.Settings; -export type CollectionReference = firestore.CollectionReference; -export type DocumentReference = firestore.DocumentReference; +export type CollectionReference = firestore.CollectionReference; +export type DocumentReference = firestore.DocumentReference; export type PersistenceSettings = firestore.PersistenceSettings; export type DocumentChangeType = firestore.DocumentChangeType; export type SnapshotOptions = firestore.SnapshotOptions; export type FieldPath = firestore.FieldPath; -export type Query = firestore.Query; +export type Query = firestore.Query; export type SetOptions = firestore.SetOptions; export type DocumentData = firestore.DocumentData; @@ -54,9 +54,9 @@ export interface Reference { // A convience type for making a query. // Example: const query = (ref) => ref.where('name', == 'david'); -export type QueryFn = (ref: CollectionReference) => Query; +export type QueryFn = (ref: CollectionReference) => Query; -export type QueryGroupFn = (query: Query) => Query; +export type QueryGroupFn = (query: Query) => Query; /** * A structure that provides an association between a reference @@ -80,7 +80,7 @@ export type QueryGroupFn = (query: Query) => Query; * publisher: 'SportsPublisher' * }); */ -export interface AssociatedReference { - ref: CollectionReference; - query: Query; +export interface AssociatedReference { + ref: CollectionReference; + query: Query; } diff --git a/src/firestore/observable/fromRef.ts b/src/firestore/observable/fromRef.ts index bfdd345e1..d1fa98d90 100644 --- a/src/firestore/observable/fromRef.ts +++ b/src/firestore/observable/fromRef.ts @@ -4,7 +4,7 @@ import { map } from 'rxjs/operators'; function _fromRef(ref: Reference, scheduler: SchedulerLike = asyncScheduler): Observable { return new Observable(subscriber => { - let unsubscribe; + let unsubscribe: () => void; if (scheduler != null) { scheduler.schedule(() => { unsubscribe = ref.onSnapshot(subscriber); @@ -21,17 +21,17 @@ function _fromRef(ref: Reference, scheduler: SchedulerLike = asyncSched }); } -export function fromRef(ref: DocumentReference | Query, scheduler?: SchedulerLike) { +export function fromRef(ref: DocumentReference | Query, scheduler?: SchedulerLike) { return _fromRef(ref, scheduler); } -export function fromDocRef(ref: DocumentReference, scheduler?: SchedulerLike): Observable>> { - return fromRef>(ref, scheduler) +export function fromDocRef(ref: DocumentReference, scheduler?: SchedulerLike): Observable>> { + return fromRef, T>(ref, scheduler) .pipe( map(payload => ({ payload, type: 'value' })) ); } -export function fromCollectionRef(ref: Query, scheduler?: SchedulerLike): Observable>> { - return fromRef>(ref, scheduler).pipe(map(payload => ({ payload, type: 'query' }))); +export function fromCollectionRef(ref: Query, scheduler?: SchedulerLike): Observable>> { + return fromRef, T>(ref, scheduler).pipe(map(payload => ({ payload, type: 'query' }))); } From 9adcd70ff65a8893d27269efb34b2119a60f2430 Mon Sep 17 00:00:00 2001 From: James Daniels Date: Wed, 11 Nov 2020 16:32:10 -0500 Subject: [PATCH 2/3] Update document.spec.ts --- src/firestore/document/document.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/firestore/document/document.spec.ts b/src/firestore/document/document.spec.ts index cf2f548d1..b65cde549 100644 --- a/src/firestore/document/document.spec.ts +++ b/src/firestore/document/document.spec.ts @@ -67,7 +67,7 @@ describe('AngularFirestoreDocument', () => { }); describe('snapshotChanges()', () => { - + it('should get action updates', async (done: any) => { const randomCollectionName = randomName(afs.firestore); const ref = afs.firestore.doc(`${randomCollectionName}/FAKE`) as DocumentReference; @@ -86,7 +86,7 @@ describe('AngularFirestoreDocument', () => { it('should get unwrapped snapshot', async (done: any) => { const randomCollectionName = afs.firestore.collection('a').doc().id; - const ref = afs.firestore.doc(`${randomCollectionName}/FAKE`) as DocumentReference;; + const ref = afs.firestore.doc(`${randomCollectionName}/FAKE`) as DocumentReference; const stock = new AngularFirestoreDocument(ref, afs); await stock.set(FAKE_STOCK_DATA); const obs$ = stock.valueChanges(); From 0aa60139fe8d5ba0d2e0db4590e2eecb69be2e83 Mon Sep 17 00:00:00 2001 From: James Daniels Date: Wed, 11 Nov 2020 18:00:52 -0500 Subject: [PATCH 3/3] Update firestore.ts --- src/firestore/firestore.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/firestore/firestore.ts b/src/firestore/firestore.ts index 70c18d89e..b821737fd 100644 --- a/src/firestore/firestore.ts +++ b/src/firestore/firestore.ts @@ -176,7 +176,7 @@ export class AngularFirestore { collection(pathOrRef: string | CollectionReference, queryFn?: QueryFn): AngularFirestoreCollection { let collectionRef: CollectionReference; if (typeof pathOrRef === 'string') { - collectionRef = this.firestore.collection(pathOrRef) as firestore.CollectionReference; + collectionRef = this.firestore.collection(pathOrRef) as firebase.firestore.CollectionReference; } else { collectionRef = pathOrRef; } @@ -192,7 +192,7 @@ export class AngularFirestore { */ collectionGroup(collectionId: string, queryGroupFn?: QueryGroupFn): AngularFirestoreCollectionGroup { const queryFn = queryGroupFn || (ref => ref); - const collectionGroup: Query = this.firestore.collectionGroup(collectionId) as firestore.Query; + const collectionGroup: Query = this.firestore.collectionGroup(collectionId) as firebase.firestore.Query; return new AngularFirestoreCollectionGroup(queryFn(collectionGroup), this); } @@ -208,7 +208,7 @@ export class AngularFirestore { doc(pathOrRef: string | DocumentReference): AngularFirestoreDocument { let ref: DocumentReference; if (typeof pathOrRef === 'string') { - ref = this.firestore.doc(pathOrRef) as firestore.DocumentReference; + ref = this.firestore.doc(pathOrRef) as firebase.firestore.DocumentReference; } else { ref = pathOrRef; }