59 lines
1.7 KiB
TypeScript
Raw Normal View History

2018-09-11 11:11:36 -07:00
import { isBlank } from '@ember/utils';
2019-08-31 20:51:14 -07:00
import { isObject } from '@datahub/utils/validators/object';
/**
* Construct a url by appending a query pair (?key=value | &key=value) to a base url and
* encoding the query value in the pair
2018-09-26 21:57:16 -07:00
* @param baseUrl the base or original url that will be appended with a query string
* @param queryParamOrMap a map of query keys to values or a single query param key
* @param queryValue if a queryParam is supplied, then a queryValue can be expected
* @returns {string}
*/
2019-08-31 20:51:14 -07:00
function buildUrl(baseUrl: string, queryParamOrMap?: {}): string;
function buildUrl(baseUrl: string, queryParamOrMap?: string, queryValue?: string): string;
2018-09-26 21:57:16 -07:00
function buildUrl(
baseUrl: string,
2019-08-31 20:51:14 -07:00
queryParamOrMap: string | Record<string, unknown> = {},
queryValue?: string | boolean
2018-09-26 21:57:16 -07:00
): string {
2018-03-07 13:31:17 -08:00
if (!baseUrl) {
return '';
}
2018-09-11 11:11:36 -07:00
if (!queryParamOrMap) {
2018-03-07 13:31:17 -08:00
return baseUrl;
}
2018-09-11 11:11:36 -07:00
2019-08-31 20:51:14 -07:00
let paramMap: Record<string, unknown> = {};
2018-09-26 21:57:16 -07:00
// queryParamOrMap is a string then, reify paramMap object with supplied value
2018-09-11 11:11:36 -07:00
if (typeof queryParamOrMap === 'string') {
paramMap = {
2018-09-26 21:57:16 -07:00
[queryParamOrMap]: queryValue
2018-09-11 11:11:36 -07:00
};
2018-09-26 21:57:16 -07:00
}
if (isObject(queryParamOrMap)) {
2019-08-31 20:51:14 -07:00
paramMap = queryParamOrMap as Record<string, unknown>;
2018-09-11 11:11:36 -07:00
}
2018-09-26 21:57:16 -07:00
return Object.keys(paramMap).reduce((url: string, paramKey: string): string => {
2018-09-11 11:11:36 -07:00
// If the query string already contains the initial question mark append
// kv-pair with ampersand
const separator = String(url).includes('?') ? '&' : '?';
let paramValue = paramMap[paramKey];
if (Array.isArray(paramValue)) {
paramValue = paramValue.toString();
}
2018-09-11 11:11:36 -07:00
if (isBlank(paramValue)) {
return url;
}
2018-09-11 11:11:36 -07:00
return `${url}${separator}${paramKey}=${paramValue}`;
}, baseUrl);
}
2018-09-11 11:11:36 -07:00
export default buildUrl;