express-router-config
Version:
The laziest way to route your express app.
2 lines (1 loc) • 2.28 kB
JavaScript
;function sortRoutes(r){if(!Array.isArray(r))throw new Error("argument is expected to be an array of object, ["+typeof r+"] type is given.");return groupSortWildcards(r=groupBySlashes(r))}function groupSortWildcards(r){return Object.entries(r).map(function(r){r[0];return r[1].sort(wildCard)}).reduce(function(r,e){return e.concat(r)})}function groupBySlashes(r){return r.reduce(function(r,e){var t=e.match.split("/").length;return r[t]=r[t]||[],r[t].push(e),r},{})}function wildCard(r,e){var t=r.match.match(/\/(\:[a-zA-Z0-9_-]{1,})/g),n=e.match.match(/\/(\:[a-zA-Z0-9_-]{1,})/g),a=r.match.split("/"),o=e.match.split("/"),i=o?o.length:0;if(!t)return-1;if(!n)return 1;if(t.length===i-1)return 1;if(n.length===i-1)return-1;var u=t.map(function(r){return a.indexOf(r.replace("/",""))}).reduce(function(r,e){return(r+e)/a.length});return n.map(function(r){return o.indexOf(r.replace("/",""))}).reduce(function(r,e){return(r+e)/o.length})-u}function normalizeEndpoint(r){return"/"+r.replace(/^\/|\/$/,"")}function routeTranslator(r,e,t){return Array.isArray(r)&&r.length?r.map(function(r){return r.group?routeTranslator(r.routes,r.middleware,r.group):routeTranslator(r,e,t)}):(e=mapMiddleware([e,r.middleware]),t=appendPrefix(r.match,t),{method:r.method,match:normalizeEndpoint(t),middleware:e,action:r.action})}function mapMiddleware(r){var e=[];return r.forEach(function(r){Array.isArray(r)?e.push.apply(e,r):e.push(r)}),e.filter(function(r){return r})}function appendPrefix(r,e){return void 0===e&&(e=!1),e&&(r=(""+e+r.match).replace("//","/")),r}function groupMiddleware(r){var e={before:[],after:[]};return r.forEach(function(r){isValidArray(r)?isValidMiddlewarePosition(r[0])&&e[r[0]].push(r[1]):e.before.push(r)}),[e.before,e.after]}function isValidMiddlewarePosition(r){return"before"===r||"after"===r}function isValidArray(r){return Array.isArray(r)&&1<r.length}function configureRoutes(o,i){return void 0===i&&(i=!1),function(r){return(r=r.length?sortRoutes([].concat.apply([],routeTranslator(r))):[]).map(function(r){i&&console.log("Routing: ["+r.method+"] - "+r.match);var e=[r.action];if(r.middleware.length){var t=groupMiddleware(r.middleware),n=t[0],a=t[1];e=n.concat(e,a)}return o[r.method].apply(o,[r.match].concat(e))})}}module.exports=configureRoutes;