UNPKG

shelving

Version:

Toolkit for using data in JavaScript.

77 lines (76 loc) 4.62 kB
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>>;