/**
* Creates a safe url encoded url
*
* @param {string[]} encoded - Pre-encoded parts for the url
* @param {string[]} raw - Possibly unsafe (not encoded) parts for the url
* @param {object} query - A 'query object' the values of which are possibly unsafe and will be passed through encode
* @param {function} [encode=encodeURIComponent] - Injectable encode function, defaulting to the browser default encodeURIComponent
* @example
* // returns 'a/nice-url/with%20some/non%20encoded?sortBy=the%20name&page=1'
* createURL(['a/nice-url'], ['with some', 'non encoded'], {sortBy: "the name", page: 1})
*/
export default function(encoded, raw, query = {}, encode = encodeURIComponent) {
return [
encoded.concat(raw.map(encode)).join('/'),
Object.keys(query)
.map(function(key, i, arr) {
if (query[key] != null) {
return `${encode(key)}=${encode(query[key])}`;
}
return key;
})
.join('&'),
]
.filter(item => item !== '')
.join('?');