route-mapper
v0.6.0
Published
Route Mapper - Generate Rails Style Routing & RESTful Routes
Downloads
37
Maintainers
Readme
route-mapper
Generate Rails Style Routing & RESTful Routes. See Rails Routing doc.
Write with ES6+
, build with Babel for ES5
.
Usage
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');
});
});
Features
- Nesting
- Namespace
- Resources
- RESTful
- Chaining
- Named Routes
- URL Helpers
- Pluralized or Singularized
- CamelCase or Underscore Styles
- ...
APIs
get()
,post()
,put()
,delete()
..., HTTP verbsroot
match
scope
controller
namespace
constraints
resource
resources
collection
member
nested
concern
concerns
draw(filename)
Examples
Express example
'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.')
Koa example
'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)