import { CollectionFn } from './Magnetar.js';
import { MagnetarDeleteAction, MagnetarDeletePropAction, MagnetarFetchAction, MagnetarInsertAction, MagnetarStreamAction, MagnetarWriteAction } from './types/actions.js';
export type DocInstance<DocDataType extends {
    [key: string]: any;
} = {
    [key: string]: any;
}, GranularTypes extends {
    insert: {
        [key: string]: any;
    };
} = {
    insert: DocDataType;
}> = {
    /**
     * The cached data that was written or read so far
     */
    data: DocDataType | undefined;
    /**
     * `collection` is available on every document for chaining
     * @example doc('001').collection('items')
     */
    collection: CollectionFn;
    /**
     * The id of the document. When this is a nested document, it will not include the full path, only the final part
     * @example '001'
     */
    id: string;
    /**
     * The full path of the document
     * @example 'pokedex/001'
     */
    path: string;
    /**
     * Meta data on the doc's existence
     * ```js
     * await magnetar.db('users/abc123').fetch() // this will update the `exists` metadata
     * console.log(`magnetar.db('users/abc123').exists → `, magnetar.db('users/abc123').exists)
     * ```
     * This way you can easily display in your UI if a document exists or not without having to manage that state yourself
     * - `undefined` at first
     * - `'error'` when fetched but the API call returned an error
     * - `false` when fetched once and the document does not exist
     * - `true` when successfully fetched
     */
    exists: undefined | 'error' | boolean;
    /**
     * Returns the open stream promise of this doc.
     *
     * Returns `null` when there is no open stream.
     *
     * This promise will resolve when `doc().closeStream()` is called, or when the stream closed because of an error.
     */
    streaming: () => Promise<void> | null;
    /**
     * Close the stream of this doc.
     *
     * Does nothing if there is no open stream.
     */
    closeStream: () => void;
    /**
     * @see {@link MagnetarFetchAction}
     */
    fetch: MagnetarFetchAction<DocDataType, 'doc'>;
    /**
     * @see {@link MagnetarStreamAction}
     */
    stream: MagnetarStreamAction<DocDataType>;
    /**
     * @see {@link MagnetarInsertAction}
     */
    insert: MagnetarInsertAction<GranularTypes['insert']>;
    /**
     * @see {@link MagnetarWriteAction}
     */
    merge: MagnetarWriteAction<DocDataType>;
    /**
     * @see {@link MagnetarWriteAction}
     */
    assign: MagnetarWriteAction<DocDataType>;
    /**
     * @see {@link MagnetarWriteAction}
     */
    replace: MagnetarWriteAction<DocDataType>;
    /**
     * @see {@link MagnetarDeletePropAction}
     */
    deleteProp: MagnetarDeletePropAction<DocDataType>;
    /**
     * @see {@link MagnetarDeleteAction}
     */
    delete: MagnetarDeleteAction;
};
