• Stars
    star
    352
  • Rank 120,622 (Top 3 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created over 10 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

An isomorphic, bullet-proof, ninja-ready route parsing, matching, and reversing library for Javascript in Node and the browser.

Build Status Dependency Status devDependency Status

What is it?

A isomorphic, bullet-proof, ninja-ready route parsing, matching, and reversing library for Javascript in Node and the browser.

Is it any good?

Yes.

Why do I want it?

You want to write routes in a way that makes sense, capture named parameters, add additional constraints to routing, and be able to generate links using your routes. You don't want to be surprised by limitations in your router or hit a spiral of additional complexity when you need to do more advanced tasks.

How do I install it?

npm install --save route-parser

How do I use it?

Route = require('route-parser');
var route = new Route('/my/fancy/route/page/:page');
route.match('/my/fancy/route/page/7') // { page: 7 }
route.reverse({page: 3}) // -> '/my/fancy/route/page/3'

What can I use in my routes?

Example Description
:name a parameter to capture from the route up to /, ?, or end of string
*splat a splat to capture from the route up to ? or end of string
() Optional group that doesn't have to be part of the query. Can contain nested optional groups, params, and splats
anything else free form literals

Some examples:

  • /some/(optional/):thing
  • /users/:id/comments/:comment/rating/:rating
  • /*a/foo/*b
  • /books/*section/:title
  • /books?author=:author&subject=:subject

How does it work?

We define a grammar for route specifications and parse the route. Matching is done by generating a regular expression from that tree, and reversing is done by filling in parameter nodes in the tree.

FAQ

Isn't this over engineered? A full parser for route specifications?

Not really. Parsing route specs into regular expressions gets to be problematic if you want to do named captures and route reversing. Other routing libraries have issues with parsing one of /foo(/:bar) or /foo(/:bar), and two-pass string-to-RegExp transforms become complex and error prone.

Using a parser here also gives us the chance to give early feedback for any errors that are made in the route spec.

Why not use...

RFC 6570 URI Templates directly?

URI templates are designed for expanding data into a template, not matching a route. Taking an arbitrary path and matching it against a URI template isn't defined. In the expansion step of URI templates, undefined variables can be evaluated to '', which isn't useful when trying to do route matching, optional or otherwise. To use a URI-template-like language is possible, but needs to be expanded past the RFC

Express/Backbone.Router/Director style routers

These all lack named parameters and reversability.

Named parameters are less brittle and reduce the coupling betwen routes and their handlers. Given the routes /users/:userid/photos/:category and /photos/:category/users/:userid, backbone style routing solutions require two different handlers. Named parameters let you use just one.

Reversibility means you can use a single route table for your application for matching and generating links instead of throwing route helper functions throughout your code.

Related

More Repositories

1

jsenv-brunch

Add support for processing .jsenv files to Brunch (http://brunch.io). Read environment values to compile to JS.
JavaScript
33
star
2

google-tag-manager-rails

Use Google Tag Manager ( http://www.google.com/tagmanager/ ) in your Rails application.
Ruby
26
star
3

hubot-epichal

Turn hubot into a conversational partner with EpicHAL
CoffeeScript
5
star
4

marla

A Hubot implementation
CoffeeScript
2
star
5

jQuery.relativeSelector

A jQuery plugin to return a selector string for an element relative to the existing page structure.
2
star
6

epichal

A conversation generator for JS. Heavily inspired by MegaHAL
JavaScript
2
star
7

gandolfini

A CORS proxy for the modern web. Written in node
CoffeeScript
2
star
8

dotfiles-zsh

Shell
2
star
9

phantom-grab

CoffeeScript
2
star
10

rendr-react-todomvc

Rendr and React.js working together for todomvc
JavaScript
1
star
11

dotfiles-tmux

1
star
12

rendr-react

JavaScript
1
star
13

kittyStatus

Simple server to return status codes based on the URL
JavaScript
1
star
14

yelper

Access Yelp's v2 API, with OAuth
Ruby
1
star
15

numa

HTTP swiss army knife (like httpbin.org)
CoffeeScript
1
star
16

jsxhint-loader

JSXHint Loader for Webpack -- Use JSX and jshint in a loving embrace
JavaScript
1
star
17

tilde

Manage your homedir with mr sugar
Shell
1
star
18

naked_nap

Turn a Ruby class into a RESTful Rack application
Ruby
1
star
19

boilership

Web Service Wrapper for Boilerpipe
Clojure
1
star
20

dotfiles-vim

Vim Script
1
star
21

platonic_config

Easy per class and per instance configuration for Ruby
Ruby
1
star
22

fizzbuzz

Fizzbuzz implementation without loop-internal conditionals, boolean, or arithmetic (except modulo) operators. Bitwise operators abound.
C
1
star
23

fuzzywordclock

A coffeescript library to generate human readable fuzzy clocks
CoffeeScript
1
star
24

fuzzy_clicks

Miss your link? Fuzzy clicks lets you click where you want and register it on the closest.
CoffeeScript
1
star
25

naked_model

No fuss, no muss REST Rack interfaces for your models. ActiveRecord and MongoMapper included out of the box.
JavaScript
1
star