Advertisement
Guest User

Untitled

a guest
Jul 3rd, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import { Router } from 'express'
  2.  
  3. import Route from './models/Route'
  4. import { Methods } from './constants/methods'
  5.  
  6. export default (middleware, options) => (...routes) => {
  7.   let expressRouter = Router(options)
  8.  
  9.   if (middleware) {
  10.     expressRouter.use('/', middleware)
  11.   }
  12.  
  13.   const routerMethodsMap = {
  14.     [Methods.GET]: expressRouter.get.bind(expressRouter),
  15.     [Methods.POST]: expressRouter.post.bind(expressRouter),
  16.     [Methods.PUT]: expressRouter.put.bind(expressRouter),
  17.     [Methods.DELETE]: expressRouter.delete.bind(expressRouter),
  18.   }
  19.  
  20.   routes.forEach(route => {
  21.     routerMethodsMap[route.method](route.path, ...route.middleware, route.handler)
  22.  
  23.     route.subroutes.forEach(subroute => {
  24.       routerMethodsMap[subroute.method](subroute.path, ...subroute.middleware, subroute.handler)
  25.     })
  26.   })
  27.  
  28.   return expressRouter
  29. }
  30.  
  31. const route = (path, handler, method, subroutes, ...middleware) => new Route({ path, handler, method, middleware, subroutes })
  32.  
  33. export const get = (...middleware) => (path, handler, ...subroutes) => route(path, handler, Methods.GET, subroutes, middleware)
  34.  
  35. export const post = (...middleware) => (path, handler, ...subroutes) => route(path, handler, Methods.POST, subroutes, middleware)
  36.  
  37. export const put = (...middleware) => (path, handler, ...subroutes) => route(path, handler, Methods.PUT, subroutes, middleware)
  38.  
  39. export const delet = (...middleware) => (path, handler, ...subroutes) => route(path, handler, Methods.DELETE, subroutes, middleware)
  40.  
  41.  
  42. //constants/methods.js
  43. const Methods = {
  44.   GET: 'GET',
  45.   POST: 'POST',
  46.   PUT: 'PUT',
  47.   DELETE: 'DELETE',
  48. }
  49.  
  50. export { Methods }
  51.  
  52. models/Route.js
  53. export default class Route {
  54.   constructor({ path, handler, method, middleware, subroutes }) {
  55.     this._path = path
  56.     if (typeof handler !== 'function') {
  57.       throw new Error('Route handler must be a function!')
  58.     }
  59.     this._handler = handler
  60.     this._method = method
  61.     this._middleware = middleware
  62.     const subroutesWithMappedPath = subroutes.map(subroute => {
  63.       subroute.path = `${path}${subroute.path}`
  64.       return subroute
  65.     })
  66.     this._subroutes = subroutesWithMappedPath
  67.   }
  68.  
  69.   get path() {
  70.     return this._path
  71.   }
  72.  
  73.   set path(path) {
  74.     this._path = path
  75.   }
  76.  
  77.   get handler() {
  78.     return this._handler
  79.   }
  80.  
  81.   get method() {
  82.     return this._method
  83.   }
  84.  
  85.   get middleware() {
  86.     return this._middleware
  87.   }
  88.  
  89.   get subroutes() {
  90.     return this._subroutes
  91.   }
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement