/**
 * @license
 * Copyright 2020 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import type { FirebaseNamespace } from '@firebase/app-types';
import * as types from '@firebase/firestore-types';
import './register-module';
/**
 * Registers the main Firestore build with the components framework.
 * Persistence can be enabled via `firebase.firestore().enablePersistence()`.
 */
export declare function registerFirestore(instance: FirebaseNamespace): void;
declare module '@firebase/app-compat' {
    interface FirebaseNamespace {
        firestore: {
            (app?: FirebaseApp): types.FirebaseFirestore;
            Blob: typeof types.Blob;
            CollectionReference: typeof types.CollectionReference;
            DocumentReference: typeof types.DocumentReference;
            DocumentSnapshot: typeof types.DocumentSnapshot;
            FieldPath: typeof types.FieldPath;
            FieldValue: typeof types.FieldValue;
            Firestore: typeof types.FirebaseFirestore;
            GeoPoint: typeof types.GeoPoint;
            Query: typeof types.Query;
            QueryDocumentSnapshot: typeof types.QueryDocumentSnapshot;
            QuerySnapshot: typeof types.QuerySnapshot;
            Timestamp: typeof types.Timestamp;
            Transaction: typeof types.Transaction;
            WriteBatch: typeof types.WriteBatch;
            setLogLevel: typeof types.setLogLevel;
        };
    }
    interface FirebaseApp {
        firestore?(): types.FirebaseFirestore;
    }
}

import { FirebaseApp as FirebaseAppCompat } from "@firebase/app-compat";
import { type WithFieldValue, type DocumentReference, type CollectionReference, type DocumentData, type Query, type EmulatorMockTokenOptions, type PersistenceSettings, type AggregateQuerySnapshot, type AggregateField, type DocumentSnapshot, type QuerySnapshot, type Firestore, type FirestoreSettings, type LoadBundleTask, type FirestoreError, type Unsubscribe, type SnapshotListenOptions, type QueryCompositeFilterConstraint, type QueryNonFilterConstraint, type QueryConstraint, type Transaction, type TransactionOptions, type PartialWithFieldValue, type SetOptions, type IndexConfiguration, type UpdateData, type FieldPath, type WriteBatch } from "@firebase/firestore";
declare module "@firebase/firestore" {
    function addDoc<T>(reference: types.CollectionReference<T>, data: WithFieldValue<T>): Promise<DocumentReference<T>>;
    function clearIndexedDbPersistence(firestore: types.FirebaseFirestore): Promise<void>;
    function collection(firestore: types.FirebaseFirestore, path: string, ...pathSegments: string[]): CollectionReference<DocumentData>;
    function collection(reference: types.CollectionReference<unknown>, path: string, ...pathSegments: string[]): CollectionReference<DocumentData>;
    function collection(reference: types.DocumentReference, path: string, ...pathSegments: string[]): CollectionReference<DocumentData>;
    function collectionGroup(firestore: types.FirebaseFirestore, collectionId: string): Query<DocumentData>;
    function connectFirestoreEmulator(firestore: types.FirebaseFirestore, host: string, port: number, options?: {
        mockUserToken?: EmulatorMockTokenOptions | string;
    }): void;
    function deleteDoc(reference: types.DocumentReference<unknown>): Promise<void>;
    function disableNetwork(firestore: types.FirebaseFirestore): Promise<void>;
    function doc(firestore: types.FirebaseFirestore, path: string, ...pathSegments: string[]): DocumentReference<DocumentData>;
    function doc<T>(reference: types.CollectionReference<T>, path?: string, ...pathSegments: string[]): DocumentReference<T>;
    function doc(reference: types.DocumentReference<unknown>, path: string, ...pathSegments: string[]): DocumentReference<DocumentData>;
    function enableIndexedDbPersistence(firestore: types.FirebaseFirestore, persistenceSettings?: PersistenceSettings): Promise<void>;
    function enableMultiTabIndexedDbPersistence(firestore: types.FirebaseFirestore): Promise<void>;
    function enableNetwork(firestore: types.FirebaseFirestore): Promise<void>;
    function getCountFromServer(query: types.Query<unknown>): Promise<AggregateQuerySnapshot<{
        count: AggregateField<number>;
    }>>;
    function getDoc<T>(reference: types.DocumentReference<T>): Promise<DocumentSnapshot<T>>;
    function getDocFromCache<T>(reference: types.DocumentReference<T>): Promise<DocumentSnapshot<T>>;
    function getDocFromServer<T>(reference: types.DocumentReference<T>): Promise<DocumentSnapshot<T>>;
    function getDocs<T>(query: types.Query<T>): Promise<QuerySnapshot<T>>;
    function getDocsFromCache<T>(query: types.Query<T>): Promise<QuerySnapshot<T>>;
    function getDocsFromServer<T>(query: types.Query<T>): Promise<QuerySnapshot<T>>;
    function getFirestore(app: FirebaseAppCompat): Firestore;
    function getFirestore(app: FirebaseAppCompat, databaseId: string): Firestore;
    function initializeFirestore(app: FirebaseAppCompat, settings: FirestoreSettings, databaseId?: string): Firestore;
    function loadBundle(firestore: types.FirebaseFirestore, bundleData: ReadableStream<Uint8Array> | ArrayBuffer | string): LoadBundleTask;
    function namedQuery(firestore: types.FirebaseFirestore, name: string): Promise<Query | null>;
    function onSnapshot<T>(reference: types.DocumentReference<T>, observer: {
        next?: (snapshot: DocumentSnapshot<T>) => void;
        error?: (error: FirestoreError) => void;
        complete?: () => void;
    }): Unsubscribe;
    function onSnapshot<T>(reference: types.DocumentReference<T>, options: SnapshotListenOptions, observer: {
        next?: (snapshot: DocumentSnapshot<T>) => void;
        error?: (error: FirestoreError) => void;
        complete?: () => void;
    }): Unsubscribe;
    function onSnapshot<T>(reference: types.DocumentReference<T>, onNext: (snapshot: DocumentSnapshot<T>) => void, onError?: (error: FirestoreError) => void, onCompletion?: () => void): Unsubscribe;
    function onSnapshot<T>(reference: types.DocumentReference<T>, options: SnapshotListenOptions, onNext: (snapshot: DocumentSnapshot<T>) => void, onError?: (error: FirestoreError) => void, onCompletion?: () => void): Unsubscribe;
    function onSnapshot<T>(query: types.Query<T>, observer: {
        next?: (snapshot: QuerySnapshot<T>) => void;
        error?: (error: FirestoreError) => void;
        complete?: () => void;
    }): Unsubscribe;
    function onSnapshot<T>(query: types.Query<T>, options: SnapshotListenOptions, observer: {
        next?: (snapshot: QuerySnapshot<T>) => void;
        error?: (error: FirestoreError) => void;
        complete?: () => void;
    }): Unsubscribe;
    function onSnapshot<T>(query: types.Query<T>, onNext: (snapshot: QuerySnapshot<T>) => void, onError?: (error: FirestoreError) => void, onCompletion?: () => void): Unsubscribe;
    function onSnapshot<T>(query: types.Query<T>, options: SnapshotListenOptions, onNext: (snapshot: QuerySnapshot<T>) => void, onError?: (error: FirestoreError) => void, onCompletion?: () => void): Unsubscribe;
    function onSnapshotsInSync(firestore: types.FirebaseFirestore, observer: {
        next?: (value: void) => void;
        error?: (error: FirestoreError) => void;
        complete?: () => void;
    }): Unsubscribe;
    function onSnapshotsInSync(firestore: types.FirebaseFirestore, onSync: () => void): Unsubscribe;
    function query<T>(query: types.Query<T>, compositeFilter: QueryCompositeFilterConstraint, ...queryConstraints: QueryNonFilterConstraint[]): Query<T>;
    function query<T>(query: types.Query<T>, ...queryConstraints: QueryConstraint[]): Query<T>;
    function queryEqual<T>(left: types.Query<T>, right: types.Query<T>): boolean;
    function runTransaction<T>(firestore: types.FirebaseFirestore, updateFunction: (transaction: Transaction) => Promise<T>, options?: TransactionOptions): Promise<T>;
    function setDoc<T>(reference: types.DocumentReference<T>, data: WithFieldValue<T>): Promise<void>;
    function setDoc<T>(reference: types.DocumentReference<T>, data: PartialWithFieldValue<T>, options: SetOptions): Promise<void>;
    function setIndexConfiguration(firestore: types.FirebaseFirestore, configuration: IndexConfiguration): Promise<void>;
    function setIndexConfiguration(firestore: types.FirebaseFirestore, json: string): Promise<void>;
    function terminate(firestore: types.FirebaseFirestore): Promise<void>;
    function updateDoc<T>(reference: types.DocumentReference<T>, data: UpdateData<T>): Promise<void>;
    function updateDoc(reference: types.DocumentReference<unknown>, field: string | FieldPath, value: unknown, ...moreFieldsAndValues: unknown[]): Promise<void>;
    function waitForPendingWrites(firestore: types.FirebaseFirestore): Promise<void>;
    function writeBatch(firestore: types.FirebaseFirestore): WriteBatch;
}
