rsnext/packages/next/shared/lib/router/utils/querystring.ts

54 lines
1.4 KiB
TypeScript

import { 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: string): 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
}