transform-url
Version:
Build URLs by transforming a template with params.
68 lines (56 loc) • 2.06 kB
JavaScript
var parse = require('./simple-parse');
var URLSearchParams = require('./url-search-params');
var defaultRegex = [/{([\w]+)}/g, /:([a-zA-Z][\w]+)/g];
var fixedEncodeURIComponent = function fixedEncodeURIComponent(str) {
return encodeURIComponent(str).replace(/[!'()*]/g, function (c) {
return '%' + c.charCodeAt(0).toString(16);
});
};
function transformUrl(urlTemplate) {
var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var matcher = options.matcher;
var matchers = matcher ? [matcher].concat(defaultRegex) : defaultRegex;
var matches = [];
var usedParams = [];
var getParamValue = function getParamValue(key) {
if (key in params) {
usedParams.push(key);
return params[key];
}
throw new Error("Param (".concat(key, ") not provided for url template: ").concat(urlTemplate));
};
matchers.forEach(function (m) {
var re = new RegExp(m);
var match;
while ((match = re.exec(urlTemplate)) != null) {
matches.push(match);
}
});
var replacedUrl = matches.reduce(function (acc, cur) {
var full = cur[0];
var key = cur[1];
var value = getParamValue(key);
return acc.replace(full, fixedEncodeURIComponent(value));
}, urlTemplate);
var _parse = parse(replacedUrl),
urlPart = _parse.url,
query = _parse.query,
_parse$hash = _parse.hash,
hashPart = _parse$hash === void 0 ? '' : _parse$hash;
var searchParams = new URLSearchParams(query);
Object.keys(params).forEach(function (key) {
if (usedParams.indexOf(key) < 0) {
var values = params[key];
(Array.isArray(values) ? values : [values]).forEach(function (value) {
searchParams.append(key, value);
});
}
});
searchParams.sort();
var queryPart = searchParams.toString();
queryPart = queryPart ? '?' + queryPart : '';
return "".concat(urlPart).concat(queryPart).concat(hashPart);
}
module.exports = transformUrl;
;