import { type ValidationContext } from '../../context'; import { type ValidationResult } from '../../types'; export type GuardDefOptions> = Partial & { /** * Переопределяет дефолтное сообщения ошибки для required * @example string.define({ requiredMessage: 'ИНН не может быть пустым' })(inn()) */ requiredErrorMessage?: string; /** * Переопределяет сообщение об ошибке типа * @example string.define({ typeErrorMessage: 'ИНН не может быть числом' })(inn()) */ typeErrorMessage?: string; /** * Позволяет выключать проверку на required * @default false */ isOptional?: boolean; }; export type GuardValue = unknown; /** * Интерфейс функции guard, которая в прототипе содержит метод define */ export interface IGuard = {}, TAddDefOptions extends Record = {}> { (value: GuardValue, ctx?: ValidationContext): ValidationResult; /** * Функция для создания нового guard с переопределенными дефолтными параметрами. Возвращает новый guard * @param options - параметры, позволяющие переопределить дефолтные настройки guard * @example string(inn()).define({ requiredMessage: 'ИНН не может быть пустым' }) */ define = {}>(options: GuardDefOptions): IGuard; } /** * Интерфейс асинхронной функции guard, которая в прототипе содержит метод define */ export interface IAsyncGuard = {}, TAddDefOptions extends Record = {}> { (value: GuardValue, ctx?: ValidationContext): Promise; /** * Функция для создания нового guard с переопределенными дефолтными параметрами. Возвращает новый guard * @param options - параметры, позволяющие переопределить дефолтные настройки guard * @example string.define({ requiredMessage: 'ИНН не может быть пустым' })(inn()) */ define(options: GuardDefOptions): IAsyncGuard; } /** * Функция, которая позволяет определять частную логику для guard */ type GuardExecutor, TAddDefOptions extends Record> = (value: unknown, ctx: ValidationContext, defOptions: GuardDefOptions) => ValidationResult; /** * Функция, которая позволяет определять частную логику для guard */ type AsyncGuardExecutor, TAddDefOptions extends Record> = (value: unknown, ctx: ValidationContext, defOptions: GuardDefOptions) => Promise; /** * Создает guard. Guard - функция, проверяющая тип значения * По-дефолту проверяет value на required. Для выключения required необходимо использовать optional(). * После первого вызова guard в прототипу функции становится доступен метод define, который позволяет переопределить дефолтное поведение guard (например, изменить текст для required правила) * @example * ```ts * const string = >(...rules: ValidationRule[]) => * createGuard((value, ctx) => { * if (typeof value !== 'string') { * return ctx.createError({ code: 'custom error', message: 'Не строка' }); * } * * return compose(...rules)(value, ctx); * }); * ``` */ export declare function createGuard, TAddDefOptions extends Record = {}>(executor: GuardExecutor): IGuard; export declare function createGuard, TAddDefOptions extends Record = {}>(executor: AsyncGuardExecutor): IAsyncGuard; export {};