Skip to content
This repository was archived by the owner on Feb 8, 2024. It is now read-only.

Commit 5889355

Browse files
committed
Add simple resource
1 parent f3ec18b commit 5889355

5 files changed

Lines changed: 104 additions & 5 deletions

File tree

.eslintignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
*.test.js
2+
examples

examples/resource.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
const stringify = require('stringify-object')
2+
const chalk = require('chalk')
3+
4+
const { createRest, flattenRoutes, printRoutes } = require('../dist')
5+
6+
const ObjectController = {
7+
read() {},
8+
create() {},
9+
update() {},
10+
destroy() {},
11+
12+
beforeEach() {},
13+
afterEach() {},
14+
}
15+
16+
const routes = createRest(r => {
17+
r.resource('demo', ObjectController)
18+
})
19+
20+
printRoutes(routes, true)

lib/index.js

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ class Maker {
1818
}
1919

2020
before(...list) {
21-
this.ctx.before = this.ctx.before.concat(list)
21+
this.ctx.before = this.ctx.before.concat(list.filter(ln => !!ln))
2222
}
2323

2424
after(...list) {
25-
this.ctx.after = this.ctx.after.concat(list)
25+
this.ctx.after = this.ctx.after.concat(list.filter(ln => !!ln))
2626
}
2727

2828
scope(name, creator) {
@@ -59,8 +59,9 @@ class Maker {
5959
* @param {string} method
6060
* @param {function[]} listeners
6161
*/
62-
method(method, listeners) {
62+
method(method, _listeners) {
6363
let name = ''
64+
let listeners = _listeners
6465
if (typeof listeners[0] === 'string') {
6566
name = listeners.splice(0, 1)[0]
6667
}
@@ -73,6 +74,11 @@ class Maker {
7374
throw new Error('Maybe you forget to add listener?')
7475
}
7576

77+
listeners = listeners.filter(e => typeof e === 'function')
78+
79+
// if added undefined listeners
80+
if (listeners.length === 0) return
81+
7682
if (name !== '') {
7783
let scoped = this.ctx.scoped[name]
7884
if (!scoped) {
@@ -126,6 +132,39 @@ class Maker {
126132
patch(...listeners) {
127133
this.method('PATCH', listeners)
128134
}
135+
136+
/**
137+
*
138+
* @param {string} name
139+
* @param {object|function} controller
140+
* @param {object} options
141+
*/
142+
resource(name, controller, options = {}) {
143+
if (!name || name.length === 0) {
144+
throw new Error('Resource should be named')
145+
}
146+
147+
if (typeof controller === 'undefined') {
148+
return
149+
}
150+
151+
const idName = `:${name}Id`
152+
const list = [
153+
['get', 'read'],
154+
['post', 'create'],
155+
['put', 'update'],
156+
['delete', 'destroy'],
157+
]
158+
159+
this.scope(name, r => {
160+
r.before(controller.beforeEach)
161+
r.after(controller.afterEach)
162+
163+
list.forEach(([http, method]) => {
164+
r[http](idName, controller[method])
165+
})
166+
})
167+
}
129168
}
130169

131170
/**

package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,7 @@
3131
"homepage": "https://github.com/atomixinteractions/createrest#readme",
3232
"dependencies": {
3333
"chalk": "^1.1.3",
34-
"pluralize": "^3.1.0",
35-
"ramda": "^0.23.0"
34+
"pluralize": "^3.1.0"
3635
},
3736
"devDependencies": {
3837
"@ava/babel-preset-stage-4": "^1.0.0",

test/index.test.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,13 @@ const destroy = () => {}
1111
const before = () => {}
1212
const after = () => {}
1313

14+
const ObjectController = {
15+
create() {},
16+
read() {},
17+
update() {},
18+
destroy() {},
19+
}
20+
1421
const make = (before = [], after = [], scoped = {}, local = {}) => ({
1522
before,
1623
after,
@@ -230,3 +237,36 @@ test('Fail if no listeners passed to method', t => {
230237
})
231238
})
232239

240+
test('Simple resource with default options', t => {
241+
t.deepEqual(
242+
createRest(r => {
243+
r.resource('unicorn', ObjectController)
244+
}),
245+
make([], [], {
246+
unicorn: make([], [], {
247+
':unicornId': make([], [], {}, {
248+
GET: [ObjectController.read],
249+
POST: [ObjectController.create],
250+
PUT: [ObjectController.update],
251+
DELETE: [ObjectController.destroy],
252+
}),
253+
}),
254+
}, {})
255+
)
256+
})
257+
258+
259+
test('Fail resource with def opts', t => {
260+
t.deepEqual(
261+
createRest(r => {
262+
r.resource('unicorn')
263+
}),
264+
make([], [], {}, {})
265+
)
266+
267+
t.throws(() => {
268+
createRest(r => {
269+
r.resource()
270+
})
271+
})
272+
})

0 commit comments

Comments
 (0)