Home

Awesome

RouterX

A stupid simple functional reactive router built for use with Rx.js apps. Simply supply the router with a stream of route changes, and the router will return a stream of context objects discribing the current route. Hashbang mode and other config options coming soon.

Install

npm install routerx

API

Define routes as a list of route objects using express like paths

const routes = [
  {name: 'home', path: '/'},
  {name: 'users', path: '/users/:id'},
  {name: 'hello', path: '/hello/:name?'},
  {name: 'notFound', path: '*'},
]

The routerx function takes an array of routes and returns a function.

routerx(routes)

The returned function takes an observable of route objects and returns an observable of context objects

const parameters = {
    id: '4',
    color: 'blue'
}
const routeObject = ['routeName', parameters]

const contextObject = {
    name: 'routeName',
    path: 'routeName/4/blue'
    params: {
        id: '4',
        color: 'blue'
    }
}

Simple Useless Example

const routes = [
  {name: 'home', path: '/'},
  {name: 'users', path: '/users/:id'},
  {name: 'hello', path: '/hello/:name?'},
  {name: 'notFound', path: '*'},
]

const route$ = rx.Observable.fromArray([
  ['login', {}],
  ['home', {}],
  ['users', {id: '4'}]
])

const sub = routerx(routes)(route$).subscribe(
  context => {
    console.log(context)
  },
  error => {
    console.log(error);
  },
  () => {
    console.log('complete')
  }
)

Use with Cycle.js

import routerx from 'routerx'
import Cycle from '@cycle/core'
import {h, makeDOMDriver} from '@cycle/dom'

const routes = [
  {name: 'home', path: '/'},
  {name: 'users', path: '/users/:id'},
  {name: 'hello', path: '/hello/:name?'},
  {name: 'notFound', path: '*'},
]

function routeHandler(router) {
  return router
    .map(route => {
      console.log('NAV TO', route)
      switch (route.name) {
        case 'users':
          return h('button.home', 'home')
          break
        case 'home':
          return h('button.hello', 'Say Hi')
          break
        case 'hello':
          return h('h1', 'Hello ' + route.params.name)
          break
        case 'notFound':
          return h('h1', 'Page Not Found')
          break
      }
    })
}

function routeStream(DOM) {
  return Cycle.Rx.Observable.merge(
    DOM.get('.home', 'click')
    .map(event => {
      return ['home', {}]
    }),
    DOM.get('.hello', 'click')
    .map(event => {
      return ['hello', {
        name: 'George'
      }]
    })
  )
}

function main({DOM, router}) {
  return {
    DOM: routeHandler(router),
    router: routeStream(DOM)
  };
};

Cycle.run(main, {
  DOM: makeDOMDriver('#app'),
  router: routerx(routes)
});