type CommonParams = { page?: number; page_size?: number; }; type MergeParams = { [K in keyof M]: M[K]; } & { [K in keyof O]?: O[K]; }; type EmptyParamValue = '' | null | undefined; type SanitizedMandatoryParams = { [K in keyof M]: Exclude; }; type SanitizedOptionalParams = { [K in keyof O as Exclude extends never ? never : K]?: Exclude; }; type RequestSafeParams = SanitizedMandatoryParams & SanitizedOptionalParams; type ParamCodec = { parse?: (value: string | string[] | null, context: { key: string; searchParams: URLSearchParams; }) => TValue; serialize?: (value: TValue, context: { key: string; }) => string | string[] | null | undefined; }; type ParamCodecs> = Partial<{ [K in keyof TParams]: ParamCodec; }>; type ParamKey> = Extract; type ProtectedParamCodec = true | { parse?: (value: string | string[] | null, context: { key: string; searchParams: URLSearchParams; }) => TValue; serialize?: (value: TValue, context: { key: string; }) => string | string[] | null | undefined; }; type ProtectedParams> = Partial<{ [K in keyof TParams]: ProtectedParamCodec; }>; type CoerceParamType = 'string' | 'number' | 'boolean' | 'array'; type CoerceParams> = Partial, CoerceParamType>>; type PaginationStrategy> = { mode: 'page'; pageKey?: ParamKey; pageSizeKey?: ParamKey; } | { mode: 'offset'; offsetKey?: ParamKey; limitKey?: ParamKey; } | { mode: 'cursor'; cursorKey?: ParamKey; }; type ResetOnChangeRules> = Partial, Array>>>; type UnknownParamsPolicy = 'drop' | 'preserve'; type HistoryMode = 'push' | 'replace'; type BuiltInOmitParamValue = 'all' | 'default' | 'unknown' | 'none' | 'void'; type OmitParamValue = BuiltInOmitParamValue | (string & {}); type OnChangeEvent> = { key: keyof TParams; previousValue: unknown; currentValue: unknown; }; type OnChangeCallback> = ((event: OnChangeEvent) => void) | (() => void); /** * Interface for the configuration object that the hook receives */ interface UseMagicSearchParamsOptions, O extends Record> { mandatory: M; optional?: O; defaultParams?: Partial>; forceParams?: Partial>; arraySerialization?: 'csv' | 'repeat' | 'brackets'; omitParamsByValues?: Array; coerceParams?: CoerceParams>; codecs?: ParamCodecs>; protectedParams?: ProtectedParams>; historyMode?: HistoryMode; resetOnChange?: ResetOnChangeRules>; paginationStrategy?: PaginationStrategy>; unknownParamsPolicy?: UnknownParamsPolicy; } /** Generic hook to handle search parameters in the URL @param mandatory - Mandatory parameters (e.g., page=1, page_size=10, etc.) @param optional - Optional parameters (e.g., order, search, etc.) @param defaultParams - Default parameters sent in the URL on initialization @param forceParams - Parameters forced into the URL regardless of user input @param omitParamsByValues - Parameters omitted if they have specific values */ declare const useMagicSearchParams: & CommonParams, O extends Record>({ mandatory, optional, defaultParams, arraySerialization, forceParams, omitParamsByValues, coerceParams, codecs, protectedParams, historyMode, resetOnChange, paginationStrategy, unknownParamsPolicy }: UseMagicSearchParamsOptions) => { searchParams: URLSearchParams; updateParams: (input?: { newParams?: Partial<{ [K in keyof MergeParams]: "" | MergeParams[K] | (MergeParams[K] extends infer T ? T extends MergeParams[K] ? T extends (infer TItem)[] ? TItem : never : never : never); }> | ((current: MergeParams) => Partial<{ [K in keyof MergeParams]: "" | MergeParams[K] | (MergeParams[K] extends infer T ? T extends MergeParams[K] ? T extends (infer TItem)[] ? TItem : never : never : never); }>); keepParams?: Partial | Extract, boolean>>; historyMode?: HistoryMode; } | ((current: MergeParams) => { newParams?: Partial<{ [K in keyof MergeParams]: "" | MergeParams[K] | (MergeParams[K] extends infer T ? T extends MergeParams[K] ? T extends (infer TItem)[] ? TItem : never : never : never); }> | ((current: MergeParams) => Partial<{ [K in keyof MergeParams]: "" | MergeParams[K] | (MergeParams[K] extends infer T ? T extends MergeParams[K] ? T extends (infer TItem)[] ? TItem : never : never : never); }>); keepParams?: Partial | Extract, boolean>>; historyMode?: HistoryMode; } | Partial<{ [K in keyof MergeParams]: "" | MergeParams[K] | (MergeParams[K] extends infer T ? T extends MergeParams[K] ? T extends (infer TItem)[] ? TItem : never : never : never); }>)) => void; clearParams: ({ keepMandatoryParams, historyMode: historyModeOverride }?: { keepMandatoryParams?: boolean; historyMode?: HistoryMode; }) => void; getParams: { (options: { convert: false; forRequest?: boolean; }): MergeParams; (options: { convert?: true; forRequest: true; }): RequestSafeParams; (options?: { convert?: true; forRequest?: false; }): MergeParams; (options: { convert: boolean; forRequest?: boolean; }): MergeParams | RequestSafeParams; }; getParam: | Extract, T extends boolean = true>(key: K, options?: { convert: T; }) => T extends true ? MergeParams[K] : string; onChange: (paramName: Extract | Extract, callbacks: Array>>) => () => void; pagination: { mode: "page" | "offset" | "cursor"; next: (cursor?: string) => void; prev: () => void; reset: () => void; setCursor: (cursor: string | null | undefined) => void; }; }; export { type BuiltInOmitParamValue, type CoerceParamType, type CoerceParams, type HistoryMode, type OmitParamValue, type OnChangeEvent, type PaginationStrategy, type ParamCodec, type ProtectedParamCodec, type ProtectedParams, type ResetOnChangeRules, type UnknownParamsPolicy, type UseMagicSearchParamsOptions, useMagicSearchParams };