UNPKG

transform-url

Version:

Build URLs by transforming a template with params.

68 lines (56 loc) 2.06 kB
"use strict"; 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;