import { type object, type Schema } from '@astral/validations'; import type { ISearchParamsParser, JSONSearchParamsParser } from '../SearchParamsParser'; /** * Тип, вычисляемый из конкретно заданного SearchParamsParser */ export type ParsedSearchParams = ReturnType; /** * Обобщенный тип для использования внутри реализации роутера. * Для публичного api вычисляется конкретный тип из SearchParamsParser - ParsedSearchParams * Причина такой реализации: при использовании полностью вычисляемого типа через generic появится много лишнего кода - очень много generics */ export type SearchParams = Record; export type RawSearchParams = URLSearchParams; export type SetSearchParamsOptions = { /** * Если false, то будут сохранены в истории браузера * @default true */ replace?: boolean; }; export type SetSearchParams = (setter: ((prev: TAllowedSearchParams) => TAllowedSearchParams) | TAllowedSearchParams, options?: SetSearchParamsOptions) => void; /** * Схема валидации searchParams для createSearchParamsStore. * Позволяет вынести validationSchema в отдельную переменную или поле класса, * не теряя типизацию * * @example * * ```typescript * type SearchParams = { id: string; page?: number }; * * const schema: SearchParamsValidationSchema = { * id: v.string(), * page: v.optional(v.number()), * }; * ``` */ export type SearchParamsValidationSchema = Schema; export type ValidateSearchParams = (schema: Schema) => ReturnType>; export type ValidationSearchParamsError = { [TKey in keyof TSearchParams]?: { message: string; code: string; }; }; /** * Функция для вычисления defaultValues * * @example * * ```typescript * defaultValues: (values) => { if (values?.fromDate || values?.toDate) { return values; } return this.defaultValues * } * ``` */ export type DefaultValuesFunction = (values: ParsedSearchParams) => TSearchParams;