export default function Router (namedRoutes) { const provide = function (name) { return namedRoutes[name] } const preg_quote = function (str, delimiter) { // discuss at: http://phpjs.org/functions/preg_quote/ // original by: booeyOH // improved by: Ates Goral (http://magnetiq.com) // improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // improved by: Brett Zamir (http://brett-zamir.me) // bugfixed by: Onno Marsman // example 1: preg_quote("$40"); // returns 1: '\\$40' // example 2: preg_quote("*RRRING* Hello?"); // returns 2: '\\*RRRING\\* Hello\\?' // example 3: preg_quote("\\.+*?[^]$(){}=!<>|:"); // returns 3: '\\\\\\.\\+\\*\\?\\[\\^\\]\\$\\(\\)\\{\\}\\=\\!\\<\\>\\|\\:' return String(str) .replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + (delimiter || '') + '-]', 'g'), '\\$&') } const http_build_query = function (formdata, numeric_prefix, arg_separator) { // discuss at: http://phpjs.org/functions/http_build_query/ // original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // improved by: Legaev Andrey // improved by: Michael White (http://getsprink.com) // improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // improved by: Brett Zamir (http://brett-zamir.me) // revised by: stag019 // input by: Dreamer // bugfixed by: Brett Zamir (http://brett-zamir.me) // bugfixed by: MIO_KODUKI (http://mio-koduki.blogspot.com/) // note: If the value is null, key and value are skipped in the http_build_query of PHP while in phpjs they are not. // depends on: urlencode // example 1: http_build_query({foo: 'bar', php: 'hypertext processor', baz: 'boom', cow: 'milk'}, '', '&'); // returns 1: 'foo=bar&php=hypertext+processor&baz=boom&cow=milk' // example 2: http_build_query({'php': 'hypertext processor', 0: 'foo', 1: 'bar', 2: 'baz', 3: 'boom', 'cow': 'milk'}, 'myvar_'); // returns 2: 'myvar_0=foo&myvar_1=bar&myvar_2=baz&myvar_3=boom&php=hypertext+processor&cow=milk' var value, key, tmp = [] var _http_build_query_helper = function (key, val, arg_separator) { var k, tmp = [] if (val === true) { val = '1' } else if (val === false) { val = '0' } if (val != null) { if (typeof val === 'object') { for (k in val) { if (val[k] != null) { tmp.push(_http_build_query_helper(key + '[' + k + ']', val[k], arg_separator)) } } return tmp.join(arg_separator) } else if (typeof val !== 'function') { return urlencode(key) + '=' + urlencode(val) } else { throw new Error('There was an error processing for http_build_query().') } } else { return '' } } if (!arg_separator) { arg_separator = '&' } for (key in formdata) { value = formdata[key] if (numeric_prefix && !isNaN(key)) { key = String(numeric_prefix) + key } var query = _http_build_query_helper(key, value, arg_separator) if (query !== '') { tmp.push(query) } } return tmp.join(arg_separator) } const urlencode = function (str) { // discuss at: http://phpjs.org/functions/urlencode/ // original by: Philip Peterson // improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // improved by: Brett Zamir (http://brett-zamir.me) // improved by: Lars Fischer // input by: AJ // input by: travc // input by: Brett Zamir (http://brett-zamir.me) // input by: Ratheous // bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // bugfixed by: Joris // reimplemented by: Brett Zamir (http://brett-zamir.me) // reimplemented by: Brett Zamir (http://brett-zamir.me) // note: This reflects PHP 5.3/6.0+ behavior // note: Please be aware that this function expects to encode into UTF-8 encoded strings, as found on // note: pages served as UTF-8 // example 1: urlencode('Kevin van Zonneveld!'); // returns 1: 'Kevin+van+Zonneveld%21' // example 2: urlencode('http://kevin.vanzonneveld.net/'); // returns 2: 'http%3A%2F%2Fkevin.vanzonneveld.net%2F' // example 3: urlencode('http://www.google.nl/search?q=php.js&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a'); // returns 3: 'http%3A%2F%2Fwww.google.nl%2Fsearch%3Fq%3Dphp.js%26ie%3Dutf-8%26oe%3Dutf-8%26aq%3Dt%26rls%3Dcom.ubuntu%3Aen-US%3Aunofficial%26client%3Dfirefox-a' str = (str + '') .toString() // Tilde should be allowed unescaped in future versions of PHP (as reflected below), but if you want to reflect current // PHP behavior, you would need to add ".replace(/~/g, '%7E');" to the following. return encodeURIComponent(str) .replace(/!/g, '%21') .replace(/'/g, '%27') .replace(/\(/g, '%28') .replace(/\)/g, '%29') .replace(/\*/g, '%2A') .replace(/%20/g, '+') } this.urlFor = function (host, name, parameters, queryParameters) { let url let search let queryString let pattern = provide(name) for (let key in parameters) { search = new RegExp('{' + preg_quote(key, '#') + '}') pattern = pattern.replace(search, parameters[key]) } url = pattern.replace('#\\(/?:.+\\)|\\(|\\)|\\\\#', '') if (queryParameters && 0 < Object.keys(queryParameters).length) { queryString = http_build_query(queryParameters) if (queryString !== '') { // With plain permalinks the REST root is already a query string // (index.php?rest_route=/...), so further params must use '&'. url += (host.includes('?') ? '&' : '?') + queryString } } return `${ host }${ url }` } }