import { DBFieldAttribute, InferDBValueType } from "@better-auth/core/db"; //#region src/db/field.d.ts type InferFieldsOutput> = Fields extends Record ? { [key in Key as Fields[key]["returned"] extends false ? never : Fields[key]["required"] extends false ? Fields[key]["defaultValue"] extends boolean | string | number | Date ? key : never : key]: InferFieldOutput } & { [key in Key as Fields[key]["returned"] extends false ? never : Fields[key]["required"] extends false ? Fields[key]["defaultValue"] extends boolean | string | number | Date ? never : key : never]?: InferFieldOutput | null } : never; /** * For client will add "?" on optional fields */ type InferFieldsInputClient> = Fields extends Record ? { [key in Key as Fields[key]["required"] extends false ? never : Fields[key]["defaultValue"] extends string | number | boolean | Date ? never : Fields[key]["input"] extends false ? never : key]: InferFieldInput } & { [key in Key as Fields[key]["input"] extends false ? never : Fields[key]["required"] extends false ? key : Fields[key]["defaultValue"] extends string | number | boolean | Date ? key : never]?: InferFieldInput | undefined | null } : never; type InferFieldOutput = T["returned"] extends false ? never : T["required"] extends false ? InferDBValueType | undefined | null : InferDBValueType; /** * Converts a Record to an object type * with keys and value types inferred from DBFieldAttribute["type"]. */ type FieldAttributeToObject> = AddOptionalFields<{ [K in keyof Fields]: InferDBValueType }, Fields>; type AddOptionalFields, Fields extends Record> = { [K in keyof T as Fields[K] extends { required: false; } ? never : K]: T[K] } & { [K in keyof T as Fields[K] extends { required: false; } ? K : never]?: T[K] }; /** * Infer the additional fields from the plugin options. * For example, you can infer the additional fields of the org plugin's organization schema like this: * ```ts * type AdditionalFields = InferAdditionalFieldsFromPluginOptions<"organization", OrganizationOptions> * ``` * * @param isClientSide - When `true` (default), filters out `input: false` fields (clients can't send these). * When `false`, includes all fields (for internal/server-side use). */ type InferAdditionalFieldsFromPluginOptions; } } | undefined; }, isClientSide extends boolean = true> = Options["schema"] extends { [key in SchemaName]?: { additionalFields: infer Field extends Record; } } ? isClientSide extends true ? FieldAttributeToObject> : FieldAttributeToObject : {}; type RemoveFieldsWithInputFalse> = { [K in keyof T as T[K]["input"] extends false ? never : K]: T[K] }; type RemoveFieldsWithReturnedFalse> = { [K in keyof T as T[K]["returned"] extends false ? never : K]: T[K] }; type InferFieldInput = InferDBValueType; //#endregion export { FieldAttributeToObject, InferAdditionalFieldsFromPluginOptions, InferFieldsInputClient, InferFieldsOutput, RemoveFieldsWithReturnedFalse };