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.
70 lines
1.6 KiB
70 lines
1.6 KiB
'use strict'; |
|
|
|
var utils = require('./../utils'); |
|
|
|
function encode(val) { |
|
return encodeURIComponent(val). |
|
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 |
|
*/ |
|
module.exports = function buildURL(url, params, paramsSerializer) { |
|
/*eslint no-param-reassign:0*/ |
|
if (!params) { |
|
return url; |
|
} |
|
|
|
var serializedParams; |
|
if (paramsSerializer) { |
|
serializedParams = paramsSerializer(params); |
|
} else if (utils.isURLSearchParams(params)) { |
|
serializedParams = params.toString(); |
|
} else { |
|
var parts = []; |
|
|
|
utils.forEach(params, function serialize(val, key) { |
|
if (val === null || typeof val === 'undefined') { |
|
return; |
|
} |
|
|
|
if (utils.isArray(val)) { |
|
key = key + '[]'; |
|
} else { |
|
val = [val]; |
|
} |
|
|
|
utils.forEach(val, function parseValue(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) { |
|
var hashmarkIndex = url.indexOf('#'); |
|
if (hashmarkIndex !== -1) { |
|
url = url.slice(0, hashmarkIndex); |
|
} |
|
|
|
url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams; |
|
} |
|
|
|
return url; |
|
};
|
|
|