Barista is a simple URL router for NodeJS.
Install via npm, thusly:
npm install barista
var Router = require('barista').Router;
var router = new Router;
router.match( '/products', 'GET' )
.to( 'products.index' )
router.match( '/products/:id', 'GET' )
.to( 'products.show' )
router.match( '/profiles/:username', 'GET' )
.to( 'users.show' )
router.match( '/products/:id(.:format)', 'GET' )
.to( 'products.show' )
router.match( '/:beverage/near/:zipcode', 'GET' )
.to( 'beverage.byZipCode' )
.where({
// an array of options
beverage: [ 'coffee', 'tea', 'beer', 'warm_sake' ],
// a regex pattern
zipcode: /^\d{5}(-\d{4})?$/
})
router.match( '/:beverage/near/:location', 'GET' )
.to( 'beverage.byLocation' )
.where({
// could be a postal code
// OR a zip code
// OR the word 'me' (geolocation FTW)
location: [ /^\d{5}(-\d{4})?$/, /^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}$/, 'me' ]
})
router.get( '/products/:id(.:format)' )
.to( 'products.show' )
router.put( '/products/:id(.:format)' )
.to( 'products.update' )
router.post( '/products' )
.to( 'products.create' )
router.delete( '/products' )
.to( 'products.destroy' )
router.resource( 'products' )
is equivalent to:
router.get( '/products(.:format)' )
.to( 'products.index' )
router.get( '/products/add(.:format)' )
.to( 'products.add' )
router.get( '/products/:id(.:format)' )
.to('products.show' )
router.get('/products/:id/edit(.:format)' )
.to( 'products.edit' )
router.post('/products(.:format)' )
.to( 'products.create' )
router.put('/products/:id(.:format)' )
.to( 'products.update' )
router.delete('/products/:id(.:format)' )
.to( 'products.destroy' )
The router.first( url, method [, callback] )
method can be used in two ways:
var params = router.first( '/products/15', 'GET' )
OR
router.first( '/products/15', 'GET', function( params ){
// dispatch the request or something
})
You can get all the matching routes like so:
var params = router.all( '/products/15', 'GET' )
//=> [params, params, params....]
Pass in a params hash, get back a tasty string:
router.url( {
controller: 'products',
action: 'show',
id: 5
} )
//=> '/products/5'
router.url( {
controller: 'products',
action: 'show',
id: 5,
format: 'json'
} )
//=> '/products/5.json'
Set the optional second parameter to true
if you want
extra params appended as a query string:
router.url({
controller: 'products',
action: 'show',
id: 5,
format: 'json',
love: 'cheese'
}, true )
//=> '/products/5.json?love=cheese'
nested optional segments are currently unsupported. e.g. this won't work:
router.get( '/:controller(/:action(/:id(.:format)))' )
nesting routes & resources is also still on the TODO list
...might be in the /docs
folder...
...or might not exist at all.
Shit happens.
Write a test that fails and add it to the tests folder, then create an issue!
Patches welcome :-)
I'm Kieran Huggins, partner at Refactory in Toronto, Canada.