/route-mapper

Route Mapper - Generate Rails Style Routing & RESTful Routes.

Primary LanguageJavaScriptMIT LicenseMIT

route-mapper

Generate Rails Style Routing & RESTful Routes. See Rails Routing doc. Write with ES6+, build with Babel for ES5.

NPM version Build status David-dm status

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 verbs
  • root
  • 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)