Skip to content

Commit b5a48ce

Browse files
committed
close #33 by adding a routes() method for displaying routes
1 parent b674c15 commit b5a48ce

File tree

5 files changed

+179
-3
lines changed

5 files changed

+179
-3
lines changed

index.js

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
const REQUEST = require('./lib/request.js') // Resquest object
1111
const RESPONSE = require('./lib/response.js') // Response object
12+
const UTILS = require('./lib/utils.js') // Require utils library
13+
const prettyPrint = require('./lib/prettyPrint') // Pretty print for debugging
1214

1315
// Create the API class
1416
class API {
@@ -102,7 +104,13 @@ class API {
102104
// Add the route to the global _routes
103105
this.setRoute(
104106
this._routes,
105-
(i === route.length-1 ? { ['__'+method.toUpperCase()]: { vars: pathVars, handler: handler, route: '/'+parsedPath.join('/') } } : {}),
107+
(i === route.length-1 ? {
108+
['__'+method.toUpperCase()]: {
109+
vars: pathVars,
110+
handler: handler,
111+
route: '/'+parsedPath.join('/'),
112+
path: '/'+this._prefix.concat(parsedPath).join('/') }
113+
} : {}),
106114
route.slice(0,i+1)
107115
)
108116

@@ -292,8 +300,19 @@ class API {
292300
} // end register
293301

294302

295-
} // end API class
303+
// prettyPrint debugger
304+
routes(format) {
305+
// Parse the routes
306+
let routes = UTILS.extractRoutes(this._routes)
307+
308+
if (format) {
309+
prettyPrint(routes)
310+
} else {
311+
return routes
312+
}
313+
}
296314

315+
} // end API class
297316

298317
// Export the API class as a new instance
299318
module.exports = opts => new API(opts)

lib/prettyPrint.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
'use strict'
2+
3+
/**
4+
* Lightweight web framework for your serverless applications
5+
* @author Jeremy Daly <[email protected]>
6+
* @license MIT
7+
*/
8+
9+
module.exports = routes => {
10+
// Calculate column widths
11+
let widths = routes.reduce((acc,row) => {
12+
return [Math.max(acc[0],row[0].length),Math.max(acc[1],row[1].length)]
13+
},[0,0])
14+
15+
console.log('╔══' + ''.padEnd(widths[0],'═') + '══╤══' + ''.padEnd(widths[1],'═') + '══╗')
16+
console.log('║ ' + "\u001b[1m" + 'METHOD'.padEnd(widths[0]) + "\u001b[0m" + ' │ ' + "\u001b[1m" + 'ROUTE'.padEnd(widths[1]) + "\u001b[0m" + ' ║')
17+
console.log('╟──' + ''.padEnd(widths[0],'─') + '──┼──' + ''.padEnd(widths[1],'─') + '──╢')
18+
routes.forEach((route,i) => {
19+
console.log('║ ' + route[0].padEnd(widths[0]) + ' │ ' + route[1].padEnd(widths[1]) + ' ║')
20+
if (i < routes.length-1) { console.log('╟──' + ''.padEnd(widths[0],'─') + '──┼──' + ''.padEnd(widths[1],'─') + '──╢') }
21+
})
22+
console.log('╚══' + ''.padEnd(widths[0],'═') + '══╧══' + ''.padEnd(widths[1],'═') + '══╝')
23+
}

lib/utils.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,3 +83,18 @@ module.exports.mimeLookup = (input,custom={}) => {
8383
return mime ? mime : false
8484
}
8585
}
86+
87+
88+
// Parses routes into readable array
89+
const extractRoutes = (routes,table=[]) => {
90+
for (let route in routes) {
91+
if (/^__[A-Z]+$/.test(route)) {
92+
table.push([route.replace(/^__/,''),routes[route].path])
93+
} else {
94+
extractRoutes(routes[route],table)
95+
}
96+
}
97+
return table
98+
}
99+
100+
module.exports.extractRoutes = extractRoutes

test/routes.js

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -600,5 +600,59 @@ describe('Route Tests:', function() {
600600

601601
}) // end method tests
602602

603+
describe('routes() (debug method)', function() {
604+
it('Extract routes', async function() {
605+
expect(api.routes()).to.deep.equal([
606+
[ 'GET', '/' ],
607+
[ 'OPTIONS', '/test' ],
608+
[ 'PUT', '/test' ],
609+
[ 'POST', '/test' ],
610+
[ 'GET', '/test' ],
611+
[ 'OPTIONS', '/test/:test' ],
612+
[ 'DELETE', '/test/:test' ],
613+
[ 'PUT', '/test/:test' ],
614+
[ 'POST', '/test/:test' ],
615+
[ 'GET', '/test/:test' ],
616+
[ 'DELETE', '/test/:test/:test2' ],
617+
[ 'OPTIONS', '/test/:test/query' ],
618+
[ 'PUT', '/test/:test/query' ],
619+
[ 'POST', '/test/:test/query' ],
620+
[ 'GET', '/test/:test/query' ],
621+
[ 'OPTIONS', '/test/:test/query/:test2' ],
622+
[ 'PUT', '/test/:test/query/:test2' ],
623+
[ 'POST', '/test/:test/query/:test2' ],
624+
[ 'GET', '/test/:test/query/:test2' ],
625+
[ 'TEST', '/test/:param1/queryx' ],
626+
[ 'PUT', '/test/json' ],
627+
[ 'POST', '/test/json' ],
628+
[ 'PUT', '/test/form' ],
629+
[ 'POST', '/test/form' ],
630+
[ 'GET', '/test_options' ],
631+
[ 'GET', '/test_options2/:test' ],
632+
[ 'TEST', '/test_options2/:param1/test' ],
633+
[ 'OPTIONS', '/test_options2/:param1/*' ],
634+
[ 'OPTIONS', '/test_options2/*' ],
635+
[ 'OPTIONS', '/*' ],
636+
[ 'HEAD', '/override/head/request' ],
637+
[ 'GET', '/override/head/request' ]
638+
])
639+
})
640+
641+
it('Sample routes', function() {
642+
// Create an api instance
643+
let api2 = require('../index')()
644+
api2.get('/', (req,res) => {})
645+
api2.post('/test', (req,res) => {})
646+
api2.put('/test/put', (req,res) => {})
647+
api2.delete('/test/:var/delete', (req,res) => {})
648+
649+
expect(api2.routes()).to.deep.equal([
650+
[ 'GET', '/' ],
651+
[ 'POST', '/test' ],
652+
[ 'PUT', '/test/put' ],
653+
[ 'DELETE', '/test/:var/delete' ]
654+
])
655+
}) // end it
656+
}) // end routes() test
603657

604658
}) // end ROUTE tests

test/utils.js

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,73 @@ describe('Utility Function Tests:', function() {
189189
expect(utils.mimeLookup('.mpeg', { mpeg: 'video/mpeg' })).to.equal('video/mpeg')
190190
}) // end it
191191

192-
193192
}) // end encodeBody tests
194193

195194

195+
describe('extractRoutes:', function() {
196+
197+
it('Sample routes', function() {
198+
// Create an api instance
199+
let api = require('../index')()
200+
api.get('/', (req,res) => {})
201+
api.post('/test', (req,res) => {})
202+
api.put('/test/put', (req,res) => {})
203+
api.delete('/test/:var/delete', (req,res) => {})
204+
205+
expect(utils.extractRoutes(api._routes)).to.deep.equal([
206+
[ 'GET', '/' ],
207+
[ 'POST', '/test' ],
208+
[ 'PUT', '/test/put' ],
209+
[ 'DELETE', '/test/:var/delete' ]
210+
])
211+
}) // end it
212+
213+
it('No routes', function() {
214+
// Create an api instance
215+
let api = require('../index')()
216+
217+
expect(utils.extractRoutes(api._routes)).to.deep.equal([])
218+
}) // end it
219+
220+
it('Prefixed routes', function() {
221+
// Create an api instance
222+
let api = require('../index')()
223+
224+
api.register((apix,opts) => {
225+
apix.get('/', (req,res) => {})
226+
apix.post('/test', (req,res) => {})
227+
}, { prefix: '/v1' })
228+
api.get('/', (req,res) => {})
229+
api.post('/test', (req,res) => {})
230+
api.put('/test/put', (req,res) => {})
231+
api.delete('/test/:var/delete', (req,res) => {})
232+
233+
expect(utils.extractRoutes(api._routes)).to.deep.equal([
234+
[ 'GET', '/v1' ],
235+
[ 'POST', '/v1/test' ],
236+
[ 'GET', '/' ],
237+
[ 'POST', '/test' ],
238+
[ 'PUT', '/test/put' ],
239+
[ 'DELETE', '/test/:var/delete' ]
240+
])
241+
}) // end it
242+
243+
it('Base routes', function() {
244+
// Create an api instance
245+
let api = require('../index')({ base: 'v2' })
246+
api.get('/', (req,res) => {})
247+
api.post('/test', (req,res) => {})
248+
api.put('/test/put', (req,res) => {})
249+
api.delete('/test/:var/delete', (req,res) => {})
250+
251+
expect(utils.extractRoutes(api._routes)).to.deep.equal([
252+
[ 'GET', '/v2' ],
253+
[ 'POST', '/v2/test' ],
254+
[ 'PUT', '/v2/test/put' ],
255+
[ 'DELETE', '/v2/test/:var/delete' ]
256+
])
257+
}) // end it
258+
259+
}) // end extractRoutes
260+
196261
}) // end UTILITY tests

0 commit comments

Comments
 (0)