import * as i0 from '@angular/core';
import { NgZone, InjectionToken, ModuleWithProviders } from '@angular/core';
import { Observable } from 'rxjs';
import firebase from 'firebase/compat/app';
import { FirebaseOptions, FirebaseAppSettings } from 'firebase/app';

type MyFunction = (...args: any[]) => any;
type FunctionPropertyNames<T> = {
    [K in keyof T]: T[K] extends MyFunction ? K : never;
}[keyof T];
type ReturnTypeOrNever<T> = T extends MyFunction ? ReturnType<T> : never;
type ParametersOrNever<T> = T extends MyFunction ? Parameters<T> : never;
type PromiseReturningFunctionPropertyNames<T> = {
    [K in FunctionPropertyNames<T>]: ReturnTypeOrNever<T[K]> extends Promise<any> ? K : never;
}[FunctionPropertyNames<T>];
type NonPromiseReturningFunctionPropertyNames<T> = {
    [K in FunctionPropertyNames<T>]: ReturnTypeOrNever<T[K]> extends Promise<any> ? never : K;
}[FunctionPropertyNames<T>];
type NonFunctionPropertyNames<T> = {
    [K in keyof T]: T[K] extends MyFunction ? never : K;
}[keyof T];
type ɵPromiseProxy<T> = {
    [K in NonFunctionPropertyNames<T>]: Promise<T[K]>;
} & {
    [K in NonPromiseReturningFunctionPropertyNames<T>]: (...args: ParametersOrNever<T[K]>) => Promise<ReturnTypeOrNever<T[K]>>;
} & {
    [K in PromiseReturningFunctionPropertyNames<T>]: T[K];
};
declare const ɵlazySDKProxy: (klass: any, observable: Observable<any>, zone: NgZone, options?: {
    spy?: {
        get?: ((name: string, it: any) => void);
        apply?: ((name: string, args: any[], it: any) => void);
    };
}) => any;
declare const ɵapplyMixins: (derivedCtor: any, constructors: any[]) => void;

interface FirebaseApp extends firebase.app.App {
}
declare class FirebaseApp {
    constructor(app: firebase.app.App);
}

declare const FIREBASE_OPTIONS: InjectionToken<FirebaseOptions>;
declare const FIREBASE_APP_NAME: InjectionToken<string>;
declare function ɵfirebaseAppFactory(options: FirebaseOptions, zone: NgZone, nameOrConfig?: string | FirebaseAppSettings | null): FirebaseApp;
declare class AngularFireModule {
    static initializeApp(options: FirebaseOptions, nameOrConfig?: string | FirebaseAppSettings): ModuleWithProviders<AngularFireModule>;
    constructor(platformId: Object);
    static ɵfac: i0.ɵɵFactoryDeclaration<AngularFireModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<AngularFireModule, never, never, never>;
    static ɵinj: i0.ɵɵInjectorDeclaration<AngularFireModule>;
}

declare function ɵcacheInstance<T>(cacheKey: any, moduleName: string, appName: string, fn: () => T, deps: any): T;

export { AngularFireModule, FIREBASE_APP_NAME, FIREBASE_OPTIONS, FirebaseApp, ɵapplyMixins, ɵcacheInstance, ɵfirebaseAppFactory, ɵlazySDKProxy };
export type { ɵPromiseProxy };
