# Roads
Client route helpers for Phoenix inspired by Rails JSRoutes.
This is for the guys who want to write DRY code, avoid reimplementing router helper in javascript like:
```js
function postPath(id) {
return "/api/posts/" + id;
}
```
## Usage
Roads has similar signature to Phoenix router helper
```js
import Roads from './roads';
Roads.blog_path("index") // Output: /blogs
Roads.blog_path("show", 1) // Output: /blogs/1
Roads.blog_comment_path("index", 1, { sort: 'popular' }) // Output: /blogs/1/comments?sort=popular
Roads.blog_comment_path("show", 1, 2) // Output: /blogs/1/comments/2
```
We can change to use camelCase instead of snake_case (require configuration):
```js
import Roads from './roads';
Roads.blogPath("show", 1) // Output: /blogs/1
Roads.blogCommentPath("index", 1, { sort: 'popular' }) // Output: /blogs/1/comments?sort=popular
```
## Installation
1. Add `roads` to your list of dependencies in `mix.exs`:
```elixir
def deps do
[{:roads, "~> 0.1.1"}]
end
```
## Setup
#### Compilers
In order to use Roads, we need to add it to the compilers:
```elixir
# mix.esx
def project do
[app: :our_app,
...
compilers: [:phoenix, :gettext] ++ Mix.compilers ++ [:roads]
...]
end
```
We need to put `:roads` after `Mix.compilers` because the `router.ex` must be compiled before we run `:roads` compiler.
#### Code reload
This is to make javascript file to be generated every time we change the `outer.ex`
```elixir
# config/dev.exs
config :our_app, MyApp.Endpoint,
reloadable_compilers: [:gettext, :phoenix, :elixir, :roads]
```
#### Configuration
Here is the default configurations, all are optional, only add when you need to:
```elixir
# config/config.exs
config :our_app, :roads,
out_file: "web/static/js/roads.js", # Output file
camelcase: false, # Change to true if you prefer to use camelCase rather than snake_case
global_name: nil # Will expose to window[global_name] when you want to use as standalone library.
```