You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.7 KiB
69 lines
1.7 KiB
'use strict' |
|
|
|
import * as utils from '../utils' |
|
|
|
function encode(val) { |
|
return encodeURIComponent(val) |
|
.replace(/%40/gi, '@') |
|
.replace(/%3A/gi, ':') |
|
.replace(/%24/g, '$') |
|
.replace(/%2C/gi, ',') |
|
.replace(/%20/g, '+') |
|
.replace(/%5B/gi, '[') |
|
.replace(/%5D/gi, ']') |
|
} |
|
|
|
/** |
|
* Build a URL by appending params to the end |
|
* |
|
* @param {string} url The base of the url (e.g., http://www.google.com) |
|
* @param {object} [params] The params to be appended |
|
* @returns {string} The formatted url |
|
*/ |
|
export default function buildURL(url, params) { |
|
/* eslint no-param-reassign:0 */ |
|
if (!params) { |
|
return url |
|
} |
|
|
|
let serializedParams |
|
if (utils.isURLSearchParams(params)) { |
|
serializedParams = params.toString() |
|
} else { |
|
const parts = [] |
|
|
|
utils.forEach(params, (val, key) => { |
|
if (val === null || typeof val === 'undefined') { |
|
return |
|
} |
|
|
|
if (utils.isArray(val)) { |
|
key = `${key}[]` |
|
} else { |
|
val = [val] |
|
} |
|
|
|
utils.forEach(val, (v) => { |
|
if (utils.isDate(v)) { |
|
v = v.toISOString() |
|
} else if (utils.isObject(v)) { |
|
v = JSON.stringify(v) |
|
} |
|
parts.push(`${encode(key)}=${encode(v)}`) |
|
}) |
|
}) |
|
|
|
serializedParams = parts.join('&') |
|
} |
|
|
|
if (serializedParams) { |
|
const hashmarkIndex = url.indexOf('#') |
|
if (hashmarkIndex !== -1) { |
|
url = url.slice(0, hashmarkIndex) |
|
} |
|
|
|
url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams |
|
} |
|
|
|
return url |
|
}
|
|
|