Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import { Router } from 'express'
- import Route from './models/Route'
- import { Methods } from './constants/methods'
- export default (middleware, options) => (...routes) => {
- let expressRouter = Router(options)
- if (middleware) {
- expressRouter.use('/', middleware)
- }
- const routerMethodsMap = {
- [Methods.GET]: expressRouter.get.bind(expressRouter),
- [Methods.POST]: expressRouter.post.bind(expressRouter),
- [Methods.PUT]: expressRouter.put.bind(expressRouter),
- [Methods.DELETE]: expressRouter.delete.bind(expressRouter),
- }
- routes.forEach(route => {
- routerMethodsMap[route.method](route.path, ...route.middleware, route.handler)
- route.subroutes.forEach(subroute => {
- routerMethodsMap[subroute.method](subroute.path, ...subroute.middleware, subroute.handler)
- })
- })
- return expressRouter
- }
- const route = (path, handler, method, subroutes, ...middleware) => new Route({ path, handler, method, middleware, subroutes })
- export const get = (...middleware) => (path, handler, ...subroutes) => route(path, handler, Methods.GET, subroutes, middleware)
- export const post = (...middleware) => (path, handler, ...subroutes) => route(path, handler, Methods.POST, subroutes, middleware)
- export const put = (...middleware) => (path, handler, ...subroutes) => route(path, handler, Methods.PUT, subroutes, middleware)
- export const delet = (...middleware) => (path, handler, ...subroutes) => route(path, handler, Methods.DELETE, subroutes, middleware)
- //constants/methods.js
- const Methods = {
- GET: 'GET',
- POST: 'POST',
- PUT: 'PUT',
- DELETE: 'DELETE',
- }
- export { Methods }
- models/Route.js
- export default class Route {
- constructor({ path, handler, method, middleware, subroutes }) {
- this._path = path
- if (typeof handler !== 'function') {
- throw new Error('Route handler must be a function!')
- }
- this._handler = handler
- this._method = method
- this._middleware = middleware
- const subroutesWithMappedPath = subroutes.map(subroute => {
- subroute.path = `${path}${subroute.path}`
- return subroute
- })
- this._subroutes = subroutesWithMappedPath
- }
- get path() {
- return this._path
- }
- set path(path) {
- this._path = path
- }
- get handler() {
- return this._handler
- }
- get method() {
- return this._method
- }
- get middleware() {
- return this._middleware
- }
- get subroutes() {
- return this._subroutes
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement