import type { Database, DataKey } from "../util/data.js"; import type { Identifier, Item, Items, OptionalItem } from "../util/item.js"; import type { ItemQuery } from "../util/query.js"; import type { Updates } from "../util/update.js"; /** Provides access to data (e.g. IndexedDB, Firebase, or in-memory cache providers). */ export interface AbstractProvider { /** * Get an item. */ getItem>(collection: K, id: I): OptionalItem | PromiseLike>; /** * Require an item. */ requireItem>(collection: K, id: I): Item | PromiseLike>; /** * Subscribe to the value of this item with an async iterator. */ getItemSequence>(collection: K, id: I): AsyncIterable>; /** * Create a new item with a random ID. * - Created item is guaranteed to have a unique ID. * * @param data Complete data to set the item to. * @return String ID for the created item (possibly promised). */ addItem>(collection: K, data: T[K]): I | PromiseLike; /** * Set an item. * * @param data Data to set the item to. */ setItem>(collection: K, id: I, data: T[K]): void | PromiseLike; /** * Update an item. * - Should not throw if the item doesn't exist. * * @param updates Set of property updates to apply to the item. */ updateItem>(collection: K, id: I, updates: Updates): void | PromiseLike; /** * Delete a specified item. * - Should not throw if the item doesn't exist. */ deleteItem>(collection: K, id: I): void | PromiseLike; /** * Count number of items in a query. * * @return Number of items the query matches. */ countQuery>(collection: K, query?: ItemQuery): number | PromiseLike; /** * Get all matching items. * * @return Set of values in `id: data` format. */ getQuery>(collection: K, query?: ItemQuery): Items | PromiseLike>; /** * Subscribe to all matching items with an async iterator. */ getQuerySequence>(collection: K, query?: ItemQuery): AsyncIterable>; /** * Set the data of all matching items. * * @param data Data to set matching items to. * @return Number of items that were set. */ setQuery>(collection: K, query: ItemQuery, data: T[K]): void | PromiseLike; /** * Update the data of all matching items. * * @param updates Set of property updates to apply to matching items. * @return Number of items that were updated. */ updateQuery>(collection: K, query: ItemQuery, updates: Updates): void | PromiseLike; /** * Delete all matching items. * @return Number of items that were deleted. */ deleteQuery>(collection: K, query: ItemQuery): void | PromiseLike; /** Get the first matching item. */ getFirst>(collection: K, query: ItemQuery): OptionalItem | PromiseLike>; /** Require the first matching item. */ requireFirst>(collection: K, query: ItemQuery): Item | PromiseLike>; } /** Provider with a fully synchronous interface */ export declare abstract class Provider implements AbstractProvider { abstract getItem>(collection: K, id: I): OptionalItem; requireItem>(collection: K, id: I): Item; abstract getItemSequence>(collection: K, id: I): AsyncIterable>; abstract addItem>(collection: K, data: T[K]): I; abstract setItem>(collection: K, id: I, data: T[K]): void; abstract updateItem>(collection: K, id: I, updates: Updates): void; abstract deleteItem>(collection: K, id: I): void; abstract getQuery>(collection: K, query?: ItemQuery): Items; countQuery>(collection: K, query?: ItemQuery): number; abstract getQuerySequence>(collection: K, query?: ItemQuery): AsyncIterable>; abstract setQuery>(collection: K, query: ItemQuery, data: T[K]): void; abstract updateQuery>(collection: K, query: ItemQuery, updates: Updates): void; abstract deleteQuery>(collection: K, query: ItemQuery): void; getFirst>(collection: K, query: ItemQuery): OptionalItem; requireFirst>(collection: K, query: ItemQuery): Item; } /** Provider with a fully asynchronous interface */ export declare abstract class AsyncProvider implements AbstractProvider { abstract getItem>(collection: K, id: I): Promise>; requireItem>(collection: K, id: I): Promise>; abstract getItemSequence>(collection: K, id: I): AsyncIterable>; abstract addItem>(collection: K, data: T[K]): Promise; abstract setItem>(collection: K, id: I, data: T[K]): Promise; abstract updateItem>(collection: K, id: I, updates: Updates): Promise; abstract deleteItem>(collection: K, id: I): Promise; abstract getQuery>(collection: K, query?: ItemQuery): Promise>; countQuery>(collection: K, query?: ItemQuery): Promise; abstract getQuerySequence>(collection: K, query?: ItemQuery): AsyncIterable>; abstract setQuery>(collection: K, query: ItemQuery, data: T[K]): Promise; abstract updateQuery>(collection: K, query: ItemQuery, updates: Updates): Promise; abstract deleteQuery>(collection: K, query: ItemQuery): Promise; getFirst>(collection: K, query: ItemQuery): Promise>; requireFirst>(collection: K, query: ItemQuery): Promise>; }