import type { DocumentByName, GenericDatabaseWriter, GenericDataModel, GenericMutationCtx, NamedTableInfo, QueryInitializer, TableNamesInDataModel, WithOptionalSystemFields, WithoutSystemFields } from "convex/server"; import type { GenericId } from "convex/values"; /** * This function will be called when a document in the table changes. */ export type Trigger> = (ctx: Ctx & { innerDb: GenericDatabaseWriter; }, change: Change) => Promise; export type Change> = { id: GenericId; } & ({ operation: "insert"; oldDoc: null; newDoc: DocumentByName; } | { operation: "update"; oldDoc: DocumentByName; newDoc: DocumentByName; } | { operation: "delete"; oldDoc: DocumentByName; newDoc: null; }); /** * Construct Triggers to register functions that run whenever a table changes. * Sample usage: * * ``` * import { mutation as rawMutation } from "./_generated/server"; * import { DataModel } from "./_generated/dataModel"; * import { Triggers } from "convex-helpers/server/triggers"; * import { customCtx, customMutation } from "convex-helpers/server/customFunctions"; * * const triggers = new Triggers(); * triggers.register("myTableName", async (ctx, change) => { * console.log("Table changed", change); * }); * * // Use `mutation` to define all mutations, and the triggers will get called. * export const mutation = customMutation(rawMutation, customCtx(triggers.wrapDB)); * ``` */ export declare class Triggers; } = GenericMutationCtx> { registered: { [TableName in TableNamesInDataModel]?: Trigger[]; }; register>(tableName: TableName, trigger: Trigger): void; wrapDB: (ctx: C) => C; } /** @deprecated use writerWithTriggers instead */ export declare class DatabaseWriterWithTriggers; } = GenericMutationCtx> implements GenericDatabaseWriter { writer: GenericDatabaseWriter; constructor(ctx: Ctx, innerDb: GenericDatabaseWriter, triggers: Triggers, isWithinTrigger?: boolean); delete>(table: TableName, id: GenericId>): Promise; delete(id: GenericId>): Promise; get>(table: TableName, id: GenericId>): Promise | null>; get>(id: GenericId): Promise | null>; insert>(table: TableName, value: WithoutSystemFields>): Promise>; patch>(table: TableName, id: GenericId>, value: PatchValue>): Promise; patch>(id: GenericId, value: PatchValue>): Promise; query>(tableName: TableName): QueryInitializer>; normalizeId>(tableName: TableName, id: string): GenericId | null; replace>(table: TableName, id: GenericId>, value: WithOptionalSystemFields>): Promise; replace>(id: GenericId, value: WithOptionalSystemFields>): Promise; system: GenericDatabaseWriter["system"]; } export declare function writerWithTriggers; } = GenericMutationCtx>(ctx: Ctx, innerDb: GenericDatabaseWriter, triggers: Triggers, isWithinTrigger?: boolean): GenericDatabaseWriter; /** * This prevents TypeScript from inferring that the generic `TableName` type is * a union type when `table` and `id` disagree. */ type NonUnion = T extends never ? never : T; /** * This is like Partial, but it also allows undefined to be passed to optional * fields when `exactOptionalPropertyTypes` is enabled in the tsconfig. */ type PatchValue = { [P in keyof T]?: undefined extends T[P] ? T[P] | undefined : T[P]; }; export {}; //# sourceMappingURL=triggers.d.ts.map