Skip to content

Commit e754d55

Browse files
committed
Merge pull request #22 from websdk/resource-metadata
Add metadata to resources, and the ability to find them by path
2 parents ef8ba85 + d86af35 commit e754d55

File tree

3 files changed

+53
-7
lines changed

3 files changed

+53
-7
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@websdk/nap",
3-
"version": "0.10.7",
3+
"version": "0.11.0",
44
"description": "Organizing applications into resources",
55
"main": "lib/nap.js",
66
"devDependencies": {

src/nap.js

+19-6
Original file line numberDiff line numberDiff line change
@@ -172,33 +172,42 @@ function newWeb(){
172172
, routes = rhumb.create()
173173
, middleware = []
174174

175-
web.resource = function(name, ptn, handler){
176-
if(arguments.length == 1) return resources[name]
177-
178-
if(arguments.length == 2) {
175+
web.resource = function(name, ptn, handler, metadata) {
176+
if (arguments.length == 1) {
177+
return resources[name]
178+
} else if (arguments.length == 2) {
179+
handler = ptn
180+
ptn = name
181+
} else if (arguments.length == 3 && typeof handler !== 'function') {
182+
metadata = handler
179183
handler = ptn
180184
ptn = name
181185
}
182186

187+
metadata || (metadata = {})
188+
183189
handler = wrap(handler, middleware)
184190

185191
resources[name] = {
186192
name : name
187193
, ptn : ptn
188194
, handler : handler
195+
, metadata : metadata
189196
}
190197

191198
routes.add(ptn, function(params){
192199
return {
193200
fn : handler
194201
, params : params
202+
, metadata: metadata
195203
}
196204
})
197205
return web
198206
}
199207

208+
web.find = find
209+
200210
web.req = function(path, cb){
201-
202211
var req = isStr(path) ? {uri: path} : path
203212
, cb = cb || noop
204213

@@ -208,7 +217,7 @@ function newWeb(){
208217
req.headers || (req.headers = {})
209218
req.headers.accept || (req.headers.accept = "application/x.nap.view")
210219

211-
var match = routes.match(req.uri) || { fn : wrap(notFound, middleware) }
220+
var match = find(req.uri) || { fn: wrap(notFound, middleware) }
212221
req.params = match.params
213222
match.fn.call(null, req, cb)
214223
return web
@@ -238,6 +247,10 @@ function newWeb(){
238247
}
239248

240249
return web
250+
251+
function find(path) {
252+
return routes.match(path)
253+
}
241254
}
242255

243256
module.exports = nap

test/web.test.js

+33
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,39 @@ test('Web resource handlers should invoke a response callback if given', functio
8585
})
8686
})
8787

88+
test('Web should return handler, params, and metadata when finding a resource by path', function(t) {
89+
t.plan(12)
90+
var web = nap.web()
91+
, fn_a = function() {}
92+
, fn_b = function() {}
93+
, fn_c = function() {}
94+
, fn_d = function() {}
95+
96+
web.resource('/no/metadata/no/params', fn_a)
97+
var a = web.find('/no/metadata/no/params')
98+
t.equal(a.fn, fn_a)
99+
t.deepEqual(a.params, {})
100+
t.deepEqual(a.metadata, {})
101+
102+
web.resource('/with/metadata/no/params', fn_b, { foo: 'bar' })
103+
var b = web.find('/with/metadata/no/params')
104+
t.equal(b.fn, fn_b)
105+
t.deepEqual(b.params, {})
106+
t.deepEqual(b.metadata, { foo: 'bar' })
107+
108+
web.resource('/{with}/metadata/and/{params}', fn_c, { baz: 'wibble' })
109+
var c = web.find('/some/metadata/and/fun')
110+
t.equal(c.fn, fn_c)
111+
t.deepEqual(c.params, { with: 'some', params: 'fun' })
112+
t.deepEqual(c.metadata, { baz: 'wibble' })
113+
114+
web.resource('named', '/also/{with}/metadata/and/{params}', fn_d, { boo: 'moo' })
115+
var d = web.find('/also/some/metadata/and/fun')
116+
t.equal(d.fn, fn_d)
117+
t.deepEqual(d.params, { with: 'some', params: 'fun' })
118+
t.deepEqual(d.metadata, { boo: 'moo' })
119+
})
120+
88121
test("Web should respond with a 404 if no resource is found", function(t) {
89122
t.plan(1)
90123
var web = nap.web()

0 commit comments

Comments
 (0)