69 lines
2.0 KiB
TypeScript
Raw Normal View History

import { encode, decode } from 'wherehows-web/utils/encode-decode-uri-component-with-space';
2018-09-11 11:11:36 -07:00
import { isBlank } from '@ember/utils';
/**
* Construct a url by appending a query pair (?key=value | &key=value) to a base url and
* encoding the query value in the pair
* @param {String} baseUrl the base or original url that will be appended with a query string
* @param {String} queryParam
* @param {String} queryValue
* @returns {string}
*/
2018-09-11 11:11:36 -07:00
function buildUrl(): string;
function buildUrl(baseUrl: string, mapParams: Record<string, any>): string;
function buildUrl(baseUrl: string, queryKey: string, queryValue: string): string;
function buildUrl(baseUrl?: string, queryParamOrMap?: string | Record<string, string>, queryValue?: string): 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
let paramMap: { [x: string]: string };
if (typeof queryParamOrMap === 'string') {
paramMap = {
[queryParamOrMap]: queryValue || ''
};
} else {
paramMap = queryParamOrMap;
}
return Object.keys(paramMap).reduce((url, paramKey) => {
// 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
// Malformed URL will cause decodeURIComponent to throw
// handle and encode queryValue in such instance
try {
// Check if queryValue is already encoded,
// otherwise encode queryValue before composing url
// e.g. if user directly enters query in location bar
if (decode(paramValue) === queryValue) {
paramValue = encode(paramValue);
}
} catch (err) {
if (err instanceof URIError) {
paramValue = encode(paramValue);
}
throw err;
}
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;