UNPKG

tachi

Version:

Node.js MVC framework for seriously rapid application development.

75 lines (60 loc) 1.64 kB
module.exports = (function() { var findBestMatchingRoute = function(routes, params) { var paramKeys = []; for (var key in params) { if (params[key]) { paramKeys.push(key); } } if (!paramKeys.length) { return ''; } var bestMatch = ''; var currentBest = 0; for (var i = routes.length; i--;) { var pattern = routes[i]; var patternItems = pattern._parameters; if (patternItems.length > paramKeys.length) { continue; } var matches = 0; for (var j = paramKeys.length; j--;) { if ( !! ~patternItems.indexOf(paramKeys[j])) { matches++; } } if (matches > currentBest && matches == patternItems.length) { currentBest = matches; bestMatch = pattern.url; } } return bestMatch; }; var getUrl = function(bestMatch, params) { var qs = []; for (var key in params) { var toMatch = '{' + key + '}'; if (!bestMatch.match(toMatch)) { qs.push(key + '=' + encodeURIComponent(params[key])); } else { bestMatch = bestMatch.replace(toMatch, params[key]); } } var qsString = ''; if (qs.length) { qsString = '?' + qs.join('&'); } return bestMatch + qsString; }; var RouteFinder = function RouteFinder(routeData) { var routes = routeData.routes; return function(params) { var bestMatch = findBestMatchingRoute(routes, params); return getUrl(bestMatch, params); }; }; // Expose a couple of methods for unit testing. RouteFinder.findBestMatchingRoute = findBestMatchingRoute; RouteFinder.getUrl = getUrl; return RouteFinder; })();