import type { TypesaurusUtils as Utils } from "./utils.js"; import type { TypesaurusCore as Core } from "./core.js"; export declare namespace TypesaurusUpdate { interface CollectionFunction { (id: Def["Id"], data: ArgData, options?: Core.OperationOptions): Promise>; (id: Def["Id"], data: ArgGetterResolved, Def["WideModel"], Props>, options?: Core.OperationOptions): Promise>; (id: Def["Id"], data: ArgGetterUnresolved, Props>, options?: Core.OperationOptions): undefined; build(id: Def["Id"], options?: Core.OperationOptions): Builder; } /** * The update doc function, used to define `update` method in the doc and ref * types. */ interface DocFunction { (data: ArgData, options?: Core.OperationOptions): Promise>; (data: ArgGetterResolved, Def["WideModel"], Props>, options?: Core.OperationOptions): Promise>; (data: ArgGetterUnresolved, Props>, options?: Core.OperationOptions): undefined; build(options?: Core.OperationOptions): Builder; } /** * The update argument type. It can be update data or a function that returns * update data. */ type Arg = Core.WriteData, Props> | MinimalData | Data, Props> | ArgGetter; /** * The update argument data type. It excludes the getter function, so that * the type can be used in the update function signature. Keeping the getter * separate allows to infer the result without inferring the model shape. */ type ArgData = Core.WriteData, Props> | MinimalData | Data, Props>; /** * Update data getter, accepts helper functions and returns the update data. */ type ArgGetter = Core.DocModel extends infer Model extends Core.ModelObjectType ? ($: Helpers) => Core.WriteData, Props> | Data | UpdateField | Array | Utils.Falsy> | Utils.Falsy : never; /** * Update data getter, accepts helper functions and returns the update data. * The type assumes that the return type is resolved making it possible to * define separate update signatures. */ type ArgGetterResolved = ($: Helpers) => Core.WriteData, Props> | Data | UpdateField | Array | Utils.Falsy>; /** * Update data getter, accepts helper functions and returns the update data. * The type assumes that the return type is falsy making it possible to * define separate update signatures. */ type ArgGetterUnresolved = ($: Helpers) => Utils.Falsy | string | boolean | number; /** * The update field interface. It contains path to the property and property value. */ interface UpdateField<_Model> { key: string | string[]; value: any; } /** * The update data type. It extends the model allowing to set specific values, * such as server dates, increment, etc. The data is also nullified allowing * to pass nulls instead of undefined. */ type Data = { [Key in keyof Model]?: Core.WriteField; }; /** * The type resolves the minimal required data to update the variable * document. It includes unions each variable model type omitting the shared * properties. The shared properties are added back as optional. */ type MinimalData = Def["Flags"]["Reduced"] extends true ? never : Def["WideModel"] extends infer Model ? Core.DocModel extends infer DocModel extends Core.ModelObjectType ? Model extends Core.ModelObjectType ? never : Model extends [ infer A extends Core.ModelObjectType, infer B extends Core.ModelObjectType, infer C extends Core.ModelObjectType, infer D extends Core.ModelObjectType, infer E extends Core.ModelObjectType, infer F extends Core.ModelObjectType, infer G extends Core.ModelObjectType, infer H extends Core.ModelObjectType, infer I extends Core.ModelObjectType, infer J extends Core.ModelObjectType ] ? (Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props>) & Partial> : Model extends [ infer A extends Core.ModelObjectType, infer B extends Core.ModelObjectType, infer C extends Core.ModelObjectType, infer D extends Core.ModelObjectType, infer E extends Core.ModelObjectType, infer F extends Core.ModelObjectType, infer G extends Core.ModelObjectType, infer H extends Core.ModelObjectType, infer I extends Core.ModelObjectType ] ? (Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props>) & Partial> : Model extends [ infer A extends Core.ModelObjectType, infer B extends Core.ModelObjectType, infer C extends Core.ModelObjectType, infer D extends Core.ModelObjectType, infer E extends Core.ModelObjectType, infer F extends Core.ModelObjectType, infer G extends Core.ModelObjectType, infer H extends Core.ModelObjectType ] ? (Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props>) & Partial> : Model extends [ infer A extends Core.ModelObjectType, infer B extends Core.ModelObjectType, infer C extends Core.ModelObjectType, infer D extends Core.ModelObjectType, infer E extends Core.ModelObjectType, infer F extends Core.ModelObjectType, infer G extends Core.ModelObjectType ] ? (Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props>) & Partial> : Model extends [ infer A extends Core.ModelObjectType, infer B extends Core.ModelObjectType, infer C extends Core.ModelObjectType, infer D extends Core.ModelObjectType, infer E extends Core.ModelObjectType, infer F extends Core.ModelObjectType ] ? (Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props>) & Partial> : Model extends [ infer A extends Core.ModelObjectType, infer B extends Core.ModelObjectType, infer C extends Core.ModelObjectType, infer D extends Core.ModelObjectType, infer E extends Core.ModelObjectType ] ? (Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props>) & Partial> : Model extends [ infer A extends Core.ModelObjectType, infer B extends Core.ModelObjectType, infer C extends Core.ModelObjectType, infer D extends Core.ModelObjectType ] ? (Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props>) & Partial> : Model extends [ infer A extends Core.ModelObjectType, infer B extends Core.ModelObjectType, infer C extends Core.ModelObjectType ] ? (Core.WriteData, Props> | Core.WriteData, Props> | Core.WriteData, Props>) & Partial> : Model extends [ infer A extends Core.ModelObjectType, infer B extends Core.ModelObjectType ] ? (Core.WriteData, Props> | Core.WriteData, Props>) & Partial> : Model extends [ infer A extends Core.ModelObjectType ] ? Core.WriteData, Props> & Partial> : never : never : never; /** * Update helpers which allow to set specific values, such as server dates, * increment, etc. */ interface Helpers extends CommonHelpers> { } interface Builder extends CommonHelpers, Props, void> { run(): Promise>; } interface FieldHelpers { set(value: Core.WriteField): SetResult; } interface CommonHelpers extends Core.WriteHelpers { /** * Field selector, allows updating a specific field. */ field(key: Key1): FieldHelpers; /** * Field selector, allows updating a specific field. */ field[Key1]>(key1: Key1, key2: Utils.SafePath2 extends true ? Key2 : never): FieldHelpers[Key1], Key2, SetResult>; /** * Field selector, allows updating a specific field. */ field[Key1], Key3 extends keyof Utils.AllRequired[Key1]>[Key2]>(key1: Key1, key2: Utils.SafePath2 extends true ? Key2 : never, key3: Utils.SafePath3 extends true ? Key3 : never): FieldHelpers[Key1]>[Key2], Key3, SetResult>; /** * Field selector, allows updating a specific field. */ field[Key1], Key3 extends keyof Utils.AllRequired[Key1]>[Key2], Key4 extends keyof Utils.AllRequired[Key1]>[Key2]>[Key3]>(key1: Key1, key2: Utils.SafePath2 extends true ? Key2 : never, key3: Utils.SafePath3 extends true ? Key3 : never, key4: Utils.SafePath4 extends true ? Key4 : never): FieldHelpers[Key1]>[Key2]>[Key3], Key4, SetResult>; /** * Field selector, allows updating a specific field. */ field[Key1], Key3 extends keyof Utils.AllRequired[Key1]>[Key2], Key4 extends keyof Utils.AllRequired[Key1]>[Key2]>[Key3], Key5 extends keyof Utils.AllRequired[Key1]>[Key2]>[Key3]>[Key4]>(key1: Key1, key2: Utils.SafePath2 extends true ? Key2 : never, key3: Utils.SafePath3 extends true ? Key3 : never, key4: Utils.SafePath4 extends true ? Key4 : never, key5: Utils.SafePath5 extends true ? Key5 : never): FieldHelpers[Key1]>[Key2]>[Key3]>[Key4], Key5, SetResult>; /** * Field selector, allows updating a specific field. */ field[Key1], Key3 extends keyof Utils.AllRequired[Key1]>[Key2], Key4 extends keyof Utils.AllRequired[Key1]>[Key2]>[Key3], Key5 extends keyof Utils.AllRequired[Key1]>[Key2]>[Key3]>[Key4], Key6 extends keyof Utils.AllRequired[Key1]>[Key2]>[Key3]>[Key4]>[Key5]>(key1: Key1, key2: Utils.SafePath2 extends true ? Key2 : never, key3: Utils.SafePath3 extends true ? Key3 : never, key4: Utils.SafePath4 extends true ? Key4 : never, key5: Utils.SafePath5 extends true ? Key5 : never, key6: Utils.SafePath6 extends true ? Key6 : never): FieldHelpers[Key1]>[Key2]>[Key3]>[Key4]>[Key5], Key6, SetResult>; /** * Field selector, allows updating a specific field. */ field[Key1], Key3 extends keyof Utils.AllRequired[Key1]>[Key2], Key4 extends keyof Utils.AllRequired[Key1]>[Key2]>[Key3], Key5 extends keyof Utils.AllRequired[Key1]>[Key2]>[Key3]>[Key4], Key6 extends keyof Utils.AllRequired[Key1]>[Key2]>[Key3]>[Key4]>[Key5], Key7 extends keyof Utils.AllRequired[Key1]>[Key2]>[Key3]>[Key4]>[Key5]>[Key6]>(key1: Key1, key2: Utils.SafePath2 extends true ? Key2 : never, key3: Utils.SafePath3 extends true ? Key3 : never, key4: Utils.SafePath4 extends true ? Key4 : never, key5: Utils.SafePath5 extends true ? Key5 : never, key6: Utils.SafePath6 extends true ? Key6 : never, key7: Utils.SafePath7 extends true ? Key7 : never): FieldHelpers[Key1]>[Key2]>[Key3]>[Key4]>[Key5]>[Key6], Key7, SetResult>; /** * Field selector, allows updating a specific field. */ field[Key1], Key3 extends keyof Utils.AllRequired[Key1]>[Key2], Key4 extends keyof Utils.AllRequired[Key1]>[Key2]>[Key3], Key5 extends keyof Utils.AllRequired[Key1]>[Key2]>[Key3]>[Key4], Key6 extends keyof Utils.AllRequired[Key1]>[Key2]>[Key3]>[Key4]>[Key5], Key7 extends keyof Utils.AllRequired[Key1]>[Key2]>[Key3]>[Key4]>[Key5]>[Key6], Key8 extends keyof Utils.AllRequired[Key1]>[Key2]>[Key3]>[Key4]>[Key5]>[Key6]>[Key7]>(key1: Key1, key2: Utils.SafePath2 extends true ? Key2 : never, key3: Utils.SafePath3 extends true ? Key3 : never, key4: Utils.SafePath4 extends true ? Key4 : never, key5: Utils.SafePath5 extends true ? Key5 : never, key6: Utils.SafePath6 extends true ? Key6 : never, key7: Utils.SafePath7 extends true ? Key7 : never, key8: Utils.SafePath8 extends true ? Key8 : never): FieldHelpers[Key1]>[Key2]>[Key3]>[Key4]>[Key5]>[Key6]>[Key7], Key8, SetResult>; /** * Field selector, allows updating a specific field. */ field[Key1], Key3 extends keyof Utils.AllRequired[Key1]>[Key2], Key4 extends keyof Utils.AllRequired[Key1]>[Key2]>[Key3], Key5 extends keyof Utils.AllRequired[Key1]>[Key2]>[Key3]>[Key4], Key6 extends keyof Utils.AllRequired[Key1]>[Key2]>[Key3]>[Key4]>[Key5], Key7 extends keyof Utils.AllRequired[Key1]>[Key2]>[Key3]>[Key4]>[Key5]>[Key6], Key8 extends keyof Utils.AllRequired[Key1]>[Key2]>[Key3]>[Key4]>[Key5]>[Key6]>[Key7], Key9 extends keyof Utils.AllRequired[Key1]>[Key2]>[Key3]>[Key4]>[Key5]>[Key6]>[Key7]>[Key8]>(key1: Key1, key2: Utils.SafePath2 extends true ? Key2 : never, key3: Utils.SafePath3 extends true ? Key3 : never, key4: Utils.SafePath4 extends true ? Key4 : never, key5: Utils.SafePath5 extends true ? Key5 : never, key6: Utils.SafePath6 extends true ? Key6 : never, key7: Utils.SafePath7 extends true ? Key7 : never, key8: Utils.SafePath8 extends true ? Key8 : never, key9: Utils.SafePath9 extends true ? Key9 : never): FieldHelpers[Key1]>[Key2]>[Key3]>[Key4]>[Key5]>[Key6]>[Key7]>[Key8], Key9, SetResult>; /** * Field selector, allows updating a specific field. */ field[Key1], Key3 extends keyof Utils.AllRequired[Key1]>[Key2], Key4 extends keyof Utils.AllRequired[Key1]>[Key2]>[Key3], Key5 extends keyof Utils.AllRequired[Key1]>[Key2]>[Key3]>[Key4], Key6 extends keyof Utils.AllRequired[Key1]>[Key2]>[Key3]>[Key4]>[Key5], Key7 extends keyof Utils.AllRequired[Key1]>[Key2]>[Key3]>[Key4]>[Key5]>[Key6], Key8 extends keyof Utils.AllRequired[Key1]>[Key2]>[Key3]>[Key4]>[Key5]>[Key6]>[Key7], Key9 extends keyof Utils.AllRequired[Key1]>[Key2]>[Key3]>[Key4]>[Key5]>[Key6]>[Key7]>[Key8], Key10 extends keyof Utils.AllRequired[Key1]>[Key2]>[Key3]>[Key4]>[Key5]>[Key6]>[Key7]>[Key8]>[Key9]>(key1: Key1, key2: Utils.SafePath2 extends true ? Key2 : never, key3: Utils.SafePath3 extends true ? Key3 : never, key4: Utils.SafePath4 extends true ? Key4 : never, key5: Utils.SafePath5 extends true ? Key5 : never, key6: Utils.SafePath6 extends true ? Key6 : never, key7: Utils.SafePath7 extends true ? Key7 : never, key8: Utils.SafePath8 extends true ? Key8 : never, key9: Utils.SafePath9 extends true ? Key9 : never, key10: Utils.SafePath10 extends true ? Key10 : never): FieldHelpers[Key1]>[Key2]>[Key3]>[Key4]>[Key5]>[Key6]>[Key7]>[Key8]>[Key9], Key10, SetResult>; } }