Generate Rails Style Routing & RESTful Routes. See Rails Routing doc.
Write with ES6+
, build with Babel for ES5
.
let routeMapper = new RouteMapper();
routeMapper
// You can have the root of your site routed with "root"
.root('welcome#index')
// /products/233 controller = catalog, action = view
.get('products/:id', { to: 'catalog#view' })
// Example named route that can be invoked with purchase_path(id: product.id)
// /products/233/purchase === purchasePath(233)
.get('products/:id/purchase', { to: 'catalog#purchase', as: 'purchase' })
// Example resource route (maps HTTP verbs to controller actions automatically):
.resources('products')
// Example resource route with options:
.resources('products', () => {
routeMapper.member(() => {
routeMapper
.get('short')
.post('toggle');
})
.collection(() => {
routeMapper.get('sold');
})
})
// Example resource route with sub-resources:
.resources('products', () => {
routeMapper
.resources('comments', 'sales')
.resource('seller');
})
// Example resource route with more complex sub-resources:
.resources('products', () => {
routeMapper
.resources('comments')
.resources('sales', () => {
routeMapper.get('recent', { on: 'collection' });
});
})
// Example resource route with concerns:
.concern('toggleable', () => {
routeMapper.post('toggle');
})
.resources('posts', { concerns: 'toggleable' })
.resources('photos', { concerns: 'toggleable' })
// Example resource route within a namespace:
.namespace('admin', () => {
// Directs /admin/products/*
routeMapper.resources('products');
});
});
- Nesting
- Namespace
- Resources
- RESTful
- Chaining
- Named Routes
- URL Helpers
- Pluralized or Singularized
- CamelCase or Underscore Styles
- ...
get()
,post()
,put()
,delete()
..., HTTP verbsroot
match
scope
controller
namespace
constraints
resource
resources
collection
member
nested
concern
concerns
draw(filename)
'use strict'
import express from 'express'
import RouteMapper from '../..'
const app = express()
let routeMapper = new RouteMapper()
routeMapper
.root('welcome#index')
.resources('photos')
.namespace('api', {
path: '/'
}, () => {
routeMapper.scope({
module: 'v1'
}, () => {
routeMapper.resources('users')
})
})
app.use(function(req, res, next) {
next()
})
routeMapper.routes.forEach((r) => {
const { controller, action } = r
try {
let c = require(__dirname + '/controllers/' + controller + '.js')
if (c) {
c = c.default || c
r.verb.forEach(m => {
let a
if (a = c[action]) {
if (!Array.isArray(a)) {
a = [a]
}
console.log(r.path, controller, action)
app[m](r.path, ...a)
}
})
}
} catch (e) {
console.log(e)
}
})
app.listen(3300)
console.log('Open http://localhost:3300.')
'use strict'
import koa from 'koa'
import Router from 'koa-router'
import RouteMapper from '../..'
const app = koa()
const router = new Router()
const routeMapper = new RouteMapper()
routeMapper
.root('welcome#index')
.get('about', {
to: 'welcome#about'
})
.resources('posts', () => {
routeMapper.resources('comments')
})
.scope({
path: '~:username?',
module: 'users',
as: 'user'
}, () => {
routeMapper.root('welcome#index')
})
routeMapper.routes.forEach(r => {
const { controller, action } = r
try {
let c = require(__dirname + '/controllers/' + controller + '.js')
if (c) {
c = c.default || c
r.verb.forEach(m => {
let a
if (a = c[action]) {
if (!Array.isArray(a)) {
a = [a]
}
console.log(r.path, controller, action)
router[m](r.path, ...a)
}
})
}
} catch (e) {
console.log(e)
}
})
app.use(router.routes())
console.log('Open http://localhost:3300.')
app.listen(3300)