import { deepEqual } from './utils' import type { NoInfer, PickOptional } from './utils' import type { SearchMiddleware } from './route' import type { IsRequiredParams } from './link' export function retainSearchParams( keys: Array | true, ): SearchMiddleware { return ({ search, next }) => { const result = next(search) if (keys === true) { return { ...search, ...result } } // add missing keys from search to result keys.forEach((key) => { if (!(key in result)) { result[key] = search[key] } }) return result } } export function stripSearchParams< TSearchSchema, TOptionalProps = PickOptional>, const TValues = | Partial> | Array, const TInput = IsRequiredParams extends never ? TValues | true : TValues, >(input: NoInfer): SearchMiddleware { return ({ search, next }) => { if (input === true) { return {} } const result = next(search) as Record if (Array.isArray(input)) { input.forEach((key) => { delete result[key] }) } else { Object.entries(input as Record).forEach( ([key, value]) => { if (deepEqual(result[key], value)) { delete result[key] } }, ) } return result as any } }