# DocURI [![Build Status](https://travis-ci.org/jo/docuri.svg?branch=master)](https://travis-ci.org/jo/docuri) Rich document ids for CouchDB: ```js 'movie/blade-runner/gallery-image/12/medium' ``` ### Advantages * You can access the doc type everywhere (eg. in changes feed, response, view results...) * They sort well in Futon and` _all_docs` * DocURIs can tell a lot about the document * You can rely on a schema and construct ids of dependend documents (eg. a specific version of an image) * Easily delete related documents (eg. by requesting a range from `_all_docs`) _Give DocURIs a try!_ ## Usage Define methods for certain DocURI fragments and provide a routes hash that pairs routes to methods. DocURI is inspired by [Backbone.Router](http://backbonejs.org/#Router). Routes can contain parameter parts, `:param`, which match a single DocURI component between slashes; and splat parts `*splat`, which can match any number of DocURI components. Part of a route can be made optional by surrounding it in parentheses `(/:optional)`. For example, a route of `'movie/:movie_id/gallery-image'` will generate a function which parses ```js 'movie/blade-runner/gallery-image/12' // => { movie_id: 'blade-runner', id: '12' } ``` and vice versa. A route of `'movie/:movie_id/:type/*path'` will generate a function which parses ```js 'movie/blade-runner/gallery-image/12' // => { movie_id: 'blade-runner', type: 'gallery-image', path: ['12'] } // and 'movie/blade-runner/gallery-image/12/medium' // => { movie_id: 'blade-runner', type: 'gallery-image', path: ['12', 'medium'] } ``` The route `'movie/:movie_id/gallery-image/:id(/:version)'` will generate a function which parses ```js 'movie/blade-runner/gallery-image/12' // => { movie_id: 'blade-runner', id: '12' } // as well as 'movie/blade-runner/gallery-image/12/medium' // => { movie_id: 'blade-runner', id: '12', version: 'medium' } ``` ### `docuri.route(route, name)` Create a single route. The `route` argument must be a routing string. The `name` argument will be the identifier for the resulting function: `docuri[name]`. Routes added later may override previously declared routes. ```js // parses 'page/home' as { id: 'home' }: docuri.route('page/:id', 'page'); ``` ### `docuri.routes(map)` Install a routes hash which maps DocURIs with parameters to functions: ```js docuri.routes({ 'movie/:id': 'movie', 'movie/:movie_id/:type/*path': 'movieAsset' 'movie/:movie_id/gallery-image/:id(/:version)': 'galleryImage', }); ``` ### `docuri[name](strOrObj, [obj])` The functions generated by DocURI can have a different behaviour, depending on the type and number of the supplied arguments: * `name(str)`: parse DocURI string to object * `name(obj)`: generate DocURI string from object * `name(str, obj)`: change DocURI string parts with values provided by object returning a string The function returns `false` if a string can not be parsed, enabling type checks. #### Example ```js docuri.movie('movie/blade-runner'); // { id: 'blade-runner' } docuri.movieAsset('movie/blade-runner'); // false docuri.galleryImage({ movie_id: 'blade-runner', id: 12 }); // 'movie/blade-runner/gallery-image/12' docuri.galleryImage('movie/blade-runner/gallery-image/12', { version: 'large' }); // 'movie/blade-runner/gallery-image/12/large' ``` ## Browser support To use DocURI in your client-side application, browserify it like this: ```shell browserify -s DocURI path/to/docuri/index.js > path/to/your/assets ``` Or grab it from [browserify-as-a-service: docuri@latest](http://www.modulefarm.com/standalone/docuri@latest). ## Development To run the unit tests: ```shell npm test ``` ## License Copyright (c) 2014 Johannes J. Schmidt, null2 GmbH Licensed under the MIT license.