mixdown-router
Advanced tools
Comparing version 0.2.2 to 0.2.3
110
index.js
@@ -6,2 +6,3 @@ var _ = require('lodash'); | ||
var querystring = require('querystring'); | ||
var Generator = require('./lib/generator.js'); | ||
@@ -32,8 +33,10 @@ var Router = function() { | ||
/** | ||
* Initializes the routes for this application | ||
* | ||
**/ | ||
var router = this.router = { | ||
// attached the router. | ||
Generator.prototype.attach.call(this, options); | ||
var router = this.router; | ||
// attach the server side component | ||
_.extend(this.router, { | ||
/** | ||
@@ -82,101 +85,6 @@ * Creates a new instance of router. | ||
/** | ||
* Gets a url object for the given route and parameters. This is where you put your custom route generation. | ||
* http://nodejs.org/api/url.html#url_url | ||
**/ | ||
, url: function(route, params) { | ||
var uri = url.parse(''); | ||
var routeObject = router.routes[route]; | ||
}); | ||
// if these are set on the route, then attach them. This will allow injection of FQ urls. | ||
uri.protocol = routeObject.protocol || null; | ||
uri.hostname = routeObject.hostname || null; | ||
uri.port = routeObject.port || null; | ||
uri.method = routeObject.method || null; | ||
// map the param fields to querystring as defined in route. | ||
var queryParams = {}; | ||
var restParams = {}; | ||
// split params into rest/query | ||
_.each(routeObject.params, function (param, key) { | ||
if (param.kind === 'rest') { | ||
restParams[key] = param; | ||
} | ||
else if (param.kind === 'query') { | ||
queryParams[key] = param; | ||
} | ||
}); | ||
if (!_.isEmpty(queryParams)) { | ||
_.each(queryParams, function (param, key) { | ||
if (params[key] || param.default) { | ||
uri.query = uri.query || {}; | ||
// replace capturing group with value | ||
var qval = (param.enabled && params[key]) ? params[key] : param.default; | ||
if (qval) { | ||
uri.query[key] = param.regex.replace(/\(.*\)/, qval); | ||
} | ||
} | ||
}); | ||
} | ||
// build the pathname. | ||
uri.pathname = ''; | ||
// get url segments | ||
// drop first element in array, since a leading slash creates an empty segment | ||
var urlSegments = _.rest(routeObject.path.split('/')); | ||
// replace named params with corresponding values and generate uri | ||
_.each(urlSegments, function (segment, i) { | ||
// is this a REST segment? | ||
if (/^\??:/.test(segment)) { | ||
// replace with param value if available. | ||
var pName = segment.replace(/^\??:/, ''); | ||
var pConfig = restParams[pName]; | ||
if (pConfig && pConfig.kind === 'rest') { | ||
// this is a rest param. replace the capturing group with our value. | ||
var pval = (pConfig.enabled && params[pName]) ? params[pName] : pConfig.default; | ||
if (pval) { | ||
uri.pathname += '/' + pConfig.regex.replace(/\(.*\)/, pval); | ||
} | ||
} | ||
} | ||
else { | ||
// just append | ||
uri.pathname += '/' + segment; | ||
} | ||
}); | ||
uri.search = uri.query ? '?' + querystring.stringify(uri.query) : null; | ||
uri.path = uri.pathname + (uri.search || ''); | ||
uri.host = uri.hostname ? (uri.hostname + (uri.port ? ':' + uri.port : '')) : null; | ||
return uri; | ||
} | ||
/** | ||
* Gets a url as a string for the given route and parameters. This calls url() and stringifies the route. | ||
* | ||
**/ | ||
, format: function(route, params) { | ||
return url.format(router.url(route, params)); | ||
} | ||
, routes: options.routes | ||
, params: options.params | ||
}; | ||
this.router.routes = options.routes; | ||
}; | ||
module.exports = Router; |
{ | ||
"name": "mixdown-router", | ||
"version": "0.2.2", | ||
"version": "0.2.3", | ||
"description": "Router for mixdown.js", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
@@ -30,8 +30,2 @@ router | ||
"options": { | ||
"params": { | ||
"gender": "(\\w+)", | ||
"age": "(\\d+)", | ||
"id": "(\\d{1})", | ||
"bark": "bark-(loud|quiet)" | ||
}, | ||
"routes": { | ||
@@ -41,10 +35,35 @@ "search": { | ||
"path": "/dogs/:gender/:bark/:age", | ||
"handler": "dogs" | ||
"handler": "dogs", | ||
"params": { | ||
"bark": { | ||
"regex": "bark-(loud|quiet)", | ||
"kind": "rest" | ||
}, | ||
"gender": { | ||
"regex": "(\\w+)", | ||
"kind": "rest" | ||
}, | ||
"age": { | ||
"regex": "(\\d+)", | ||
"kind": "rest" | ||
} | ||
} | ||
}, | ||
"single": { | ||
"method": "GET", | ||
"path": "/dog/:id", | ||
"query": [ "hidePictures" ], | ||
"handler": "dog" | ||
"handler": "dog", | ||
"params": { | ||
"hidePictures": { | ||
"kind": "query", | ||
"regex": "(true|false)" | ||
}, | ||
"id": { | ||
"regex": "(\\d{1})", | ||
"kind": "rest" | ||
} | ||
} | ||
}, | ||
"create": { | ||
@@ -54,3 +73,9 @@ "method": "POST", | ||
"body": [ "gender", "age", "phone" ], | ||
"handler": "create" | ||
"handler": "create", | ||
"params": { | ||
"id": { | ||
"kind": "rest", | ||
"regex": "(\\d{1})" | ||
} | ||
} | ||
} | ||
@@ -57,0 +82,0 @@ } |
@@ -33,11 +33,14 @@ { | ||
"regex": "bark-(loud|quiet)", | ||
"kind": "rest" | ||
"kind": "rest", | ||
"enabled": true | ||
}, | ||
"gender": { | ||
"regex": "(\\w+)", | ||
"kind": "rest" | ||
"kind": "rest", | ||
"enabled": true | ||
}, | ||
"age": { | ||
"regex": "(\\d+)", | ||
"kind": "rest" | ||
"kind": "rest", | ||
"enabled": true | ||
} | ||
@@ -54,7 +57,9 @@ } | ||
"kind": "query", | ||
"regex": "(true|false)" | ||
"regex": "(true|false)", | ||
"enabled": true | ||
}, | ||
"id": { | ||
"regex": "(\\d{1})", | ||
"kind": "rest" | ||
"kind": "rest", | ||
"enabled": true | ||
} | ||
@@ -72,3 +77,4 @@ } | ||
"kind": "rest", | ||
"regex": "(\\d{1})" | ||
"regex": "(\\d{1})", | ||
"enabled": true | ||
} | ||
@@ -98,11 +104,14 @@ } | ||
"regex": "claws-(yes|no)", | ||
"kind": "rest" | ||
"kind": "rest", | ||
"enabled": true | ||
}, | ||
"gender": { | ||
"regex": "(\\w+)", | ||
"kind": "rest" | ||
"kind": "rest", | ||
"enabled": true | ||
}, | ||
"age": { | ||
"regex": "(\\d+)", | ||
"kind": "rest" | ||
"kind": "rest", | ||
"enabled": true | ||
} | ||
@@ -118,3 +127,4 @@ } | ||
"regex": "(\\d{1})", | ||
"kind": "rest" | ||
"kind": "rest", | ||
"enabled": true | ||
} | ||
@@ -121,0 +131,0 @@ } |
@@ -14,2 +14,3 @@ var _ = require('lodash'); | ||
test('Create router instance', function(t) { | ||
console.log(require('util').inspect(app.plugins.router)); | ||
var router = app.plugins.router.create(); | ||
@@ -16,0 +17,0 @@ t.ok(router, 'Router instance exists'); |
27205
13
522
258