import type { ParsedUrlQuery } from 'querystring' export function searchParamsToUrlQuery( searchParams: URLSearchParams ): ParsedUrlQuery { const query: ParsedUrlQuery = {} searchParams.forEach((value, key) => { if (typeof query[key] === 'undefined') { query[key] = value } else if (Array.isArray(query[key])) { ;(query[key] as string[]).push(value) } else { query[key] = [query[key] as string, value] } }) return query } function stringifyUrlQueryParam(param: unknown): string { if ( typeof param === 'string' || (typeof param === 'number' && !isNaN(param)) || typeof param === 'boolean' ) { return String(param) } else { return '' } } export function urlQueryToSearchParams( urlQuery: ParsedUrlQuery ): URLSearchParams { const result = new URLSearchParams() Object.entries(urlQuery).forEach(([key, value]) => { if (Array.isArray(value)) { value.forEach((item) => result.append(key, stringifyUrlQueryParam(item))) } else { result.set(key, stringifyUrlQueryParam(value)) } }) return result } export function assign( target: URLSearchParams, ...searchParamsList: URLSearchParams[] ): URLSearchParams { searchParamsList.forEach((searchParams) => { Array.from(searchParams.keys()).forEach((key) => target.delete(key)) searchParams.forEach((value, key) => target.append(key, value)) }) return target }