shelving
Version:
Toolkit for using data in JavaScript.
77 lines (76 loc) • 4.62 kB
TypeScript
import type { ImmutableArray } from "../util/array.js";
import type { Database, DataKey } from "../util/data.js";
import type { Identifier } from "../util/item.js";
import { type Nullish } from "../util/null.js";
import type { ItemQuery } from "../util/query.js";
import type { Updates } from "../util/update.js";
import type { AsyncProvider, Provider } from "./Provider.js";
/** A change to a database. */
export interface Change {
readonly action: string;
}
/** A change to a database collection. */
export interface CollectionChange<T extends Database, K extends DataKey<T>> extends Change {
readonly collection: K;
}
/** Add an item to a database collection. */
export interface ItemAddChange<T extends Database, K extends DataKey<T>> extends CollectionChange<T, K> {
readonly action: "add";
readonly id?: never;
readonly query?: never;
readonly data: T[K];
}
/** Change an item in a database collection. */
export interface ItemChange<I extends Identifier, T extends Database, K extends DataKey<T>> extends CollectionChange<T, K> {
readonly id: I;
readonly query?: never;
}
/** Set an item in a database collection. */
export interface ItemSetChange<I extends Identifier, T extends Database, K extends DataKey<T>> extends ItemChange<I, T, K> {
readonly action: "set";
readonly data: T[K];
}
/** Update an item in a database collection. */
export interface ItemUpdateChange<I extends Identifier, T extends Database, K extends DataKey<T>> extends ItemChange<I, T, K> {
readonly action: "update";
readonly updates: Updates<T[K]>;
}
/** Delete an item in a database collection. */
export interface ItemDeleteChange<I extends Identifier, T extends Database, K extends DataKey<T>> extends ItemChange<I, T, K> {
readonly action: "delete";
}
/** Change multiple items in a database collection. */
export interface QueryChange<I extends Identifier, T extends Database, K extends DataKey<T>> extends CollectionChange<T, K> {
readonly query: ItemQuery<I, T[K]>;
readonly id?: never;
}
/** Set multiple items in a database collection. */
export interface QuerySetChange<I extends Identifier, T extends Database, K extends DataKey<T>> extends QueryChange<I, T, K> {
readonly action: "set";
readonly data: T[K];
}
/** Update multiple items in a database collection. */
export interface QueryUpdateChange<I extends Identifier, T extends Database, K extends DataKey<T>> extends QueryChange<I, T, K> {
readonly action: "update";
readonly updates: Updates<T[K]>;
}
/** Delete multiple items in a database collection. */
export interface QueryDeleteChange<I extends Identifier, T extends Database, K extends DataKey<T>> extends QueryChange<I, T, K> {
readonly action: "delete";
}
/** Write an item in a set of collection. */
export type DatabaseItemChange<I extends Identifier, T extends Database> = ItemSetChange<I, T, DataKey<T>> | ItemUpdateChange<I, T, DataKey<T>> | ItemDeleteChange<I, T, DataKey<T>>;
/** Write multiple item in a set of collection. */
export type DatabaseQueryChange<I extends Identifier, T extends Database> = QuerySetChange<I, T, DataKey<T>> | QueryUpdateChange<I, T, DataKey<T>> | QueryDeleteChange<I, T, DataKey<T>>;
/** Write an item or multiple items in a set of collection. */
export type DatabaseChange<I extends Identifier, T extends Database> = ItemAddChange<T, DataKey<T>> | DatabaseItemChange<I, T> | DatabaseQueryChange<I, T>;
/** Write an item or multiple items in a set of collection. */
export type DatabaseChanges<I extends Identifier, T extends Database> = ImmutableArray<DatabaseChange<I, T>>;
/** Write a single change to a synchronous provider and return an array of the changes that were written. */
export declare function writeChange<I extends Identifier, T extends Database>(provider: Provider<I, T>, change: DatabaseChange<I, T>): DatabaseChange<I, T>;
/** Write a set of changes to a synchronous provider. */
export declare function writeChanges<I extends Identifier, T extends Database>(provider: Provider<I, T>, ...changes: Nullish<DatabaseChange<I, T>>[]): DatabaseChanges<I, T>;
/** Write a single change to an asynchronous provider and return the change that was written. */
export declare function writeAsyncChange<I extends Identifier, T extends Database>(provider: AsyncProvider<I, T>, change: DatabaseChange<I, T>): Promise<DatabaseChange<I, T>>;
/** Write a set of changes to an asynchronous provider. */
export declare function writeAsyncChanges<I extends Identifier, T extends Database>(provider: AsyncProvider<I, T>, ...changes: Nullish<DatabaseChange<I, T>>[]): Promise<DatabaseChanges<I, T>>;