|  | 
|  | 1 | +import { NgModule, Optional, NgZone, InjectionToken, ModuleWithProviders } from '@angular/core'; | 
|  | 2 | +import { FirebaseFirestore } from 'firebase/firestore/lite'; | 
|  | 3 | +import { AuthInstances  } from '@angular/fire/auth'; | 
|  | 4 | +import { ɵmemoizeInstance, ɵgetDefaultInstanceOf, ɵAngularFireSchedulers } from '@angular/fire'; | 
|  | 5 | +import { Firestore, FirestoreInstances, FIRESTORE_PROVIDER_NAME } from './lite'; | 
|  | 6 | +import { FirebaseApps } from '@angular/fire/app'; | 
|  | 7 | + | 
|  | 8 | +export const PROVIDED_FIRESTORE_INSTANCES = new InjectionToken<Firestore[]>('angularfire2.firestore-lite-instances'); | 
|  | 9 | + | 
|  | 10 | +export function defaultFirestoreInstanceFactory(_: Firestore[]) { | 
|  | 11 | +  const defaultFirestore = ɵgetDefaultInstanceOf<FirebaseFirestore>(FIRESTORE_PROVIDER_NAME); | 
|  | 12 | +  return new Firestore(defaultFirestore); | 
|  | 13 | +} | 
|  | 14 | + | 
|  | 15 | +export function firestoreInstanceFactory(fn: () => FirebaseFirestore) { | 
|  | 16 | +  return (zone: NgZone) => { | 
|  | 17 | +    const firestore = ɵmemoizeInstance<FirebaseFirestore>(fn, zone); | 
|  | 18 | +    return new Firestore(firestore); | 
|  | 19 | +  }; | 
|  | 20 | +} | 
|  | 21 | + | 
|  | 22 | +const FIRESTORE_INSTANCES_PROVIDER = { | 
|  | 23 | +  provide: FirestoreInstances, | 
|  | 24 | +  deps: [ | 
|  | 25 | +    [new Optional(), PROVIDED_FIRESTORE_INSTANCES ], | 
|  | 26 | +  ] | 
|  | 27 | +}; | 
|  | 28 | + | 
|  | 29 | +const DEFAULT_FIRESTORE_INSTANCE_PROVIDER = { | 
|  | 30 | +  provide: Firestore, | 
|  | 31 | +  useFactory: defaultFirestoreInstanceFactory, | 
|  | 32 | +  deps: [ | 
|  | 33 | +    NgZone, | 
|  | 34 | +    [new Optional(), PROVIDED_FIRESTORE_INSTANCES ], | 
|  | 35 | +  ] | 
|  | 36 | +}; | 
|  | 37 | + | 
|  | 38 | +@NgModule({ | 
|  | 39 | +  providers: [ | 
|  | 40 | +    DEFAULT_FIRESTORE_INSTANCE_PROVIDER, | 
|  | 41 | +    FIRESTORE_INSTANCES_PROVIDER, | 
|  | 42 | +  ] | 
|  | 43 | +}) | 
|  | 44 | +export class FirestoreModule { | 
|  | 45 | +} | 
|  | 46 | + | 
|  | 47 | +export function provideFirestore(fn: () => FirebaseFirestore): ModuleWithProviders<FirestoreModule> { | 
|  | 48 | +  return { | 
|  | 49 | +    ngModule: FirestoreModule, | 
|  | 50 | +    providers: [{ | 
|  | 51 | +      provide: PROVIDED_FIRESTORE_INSTANCES, | 
|  | 52 | +      useFactory: firestoreInstanceFactory(fn), | 
|  | 53 | +      multi: true, | 
|  | 54 | +      deps: [ | 
|  | 55 | +        NgZone, | 
|  | 56 | +        ɵAngularFireSchedulers, | 
|  | 57 | +        FirebaseApps, | 
|  | 58 | +        // Firestore+Auth work better if Auth is loaded first | 
|  | 59 | +        [new Optional(), AuthInstances ], | 
|  | 60 | +      ] | 
|  | 61 | +    }] | 
|  | 62 | +  }; | 
|  | 63 | +} | 
0 commit comments