392c4d0b7c
This PR updates `@types/node` to `14.14.31`. The most important type is that `ParsedUrlQuery` can hold `undefined` so we are updating the code here to explicitly handle those cases. Aside from it we are adding a global definition taken from NodeJS for `AsyncLocalStorage` that we export in `server.d.ts`
54 lines
1.4 KiB
TypeScript
54 lines
1.4 KiB
TypeScript
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
|
|
}
|