-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.js
150 lines (124 loc) · 4.58 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
// Module: index.js
//
// Loads specified route-definition and route-build functions then uses them to
// setup routes
//
// (1) SCOPE VARIABLES, (2) UTILITY METHODS, (3) MODULE EXPORTS
//---------------- BEGIN MODULE SCOPE VARIABLES --------------
var
debug = require('debug')('routes-builder:index'),
path = require('path'),
async = require('async'),
express = require('express'),
sprintf = require('sprintf-js').sprintf,
RoutesTable = require('./lib/RoutesTable'),
DirectoryLoader = require('./lib/DirectoryLoader'),
_loader,
_builder,
routes_table;
//---------------- END MODULE SCOPE VARIABLES ----------------
//------------------- BEGIN UTILITY METHODS ------------------
_loader = function(options, cb) {
var options, cb, map;
if (!cb && typeof options === 'function') {
cb = options;
options = {};
}
debug('loading routes map');
var directory_loader = new DirectoryLoader();
async.parallel([
// Routes
function(callback) {
directory_loader.loadDirectory(options.dirs.routes, function(err, routes) {
if (err) callback(err, null);
callback(null, routes);
});
},
// Middleware
function(callback) {
directory_loader.loadDirectory(options.dirs.middleware, function(err, middleware) {
if (err) callback(err, null);
callback(null, middleware);
});
},
// Handlers
function(callback) {
directory_loader.loadDirectory(options.dirs.handlers, function(err, handlers) {
if (err) callback(err, null);
callback(null, handlers);
});
}
], function(err, results) {
if (err) { return cb(err, null); }
debug('routes map loaded');
map = {
routes: results[0],
middleware: results[1],
handlers: results[2]
};
cb(null, map);
});
};
_builder = function(app, map, cb) {
if (!map) cb(new Error('Routes map is empty'), null);
var app = app;
var map = map;
// Iterate over the route definition files
Object.keys(map.routes).forEach(function(definition) {
var prefix = map.routes[definition].prefix || '/';
var default_middleware = map.routes[definition].default_middleware;
var routes = map.routes[definition].routes;
var default_middleware_fns = routes_table.resolveMiddlewareFunctions(default_middleware);
var router = express.Router();
debug(sprintf('%s router: created', definition));
// Add default middleware to the router
if (default_middleware_fns && default_middleware_fns.length > 0) {
router.use(default_middleware_fns);
}
debug(sprintf('%s router: added default middleware: %s ', definition, default_middleware || 'none'));
// Iterate over the routes in the definition file
routes.forEach(function(route) {
var method = route[0];
var path = route[1];
var middlewares = route[2];
var handler = route[3];
var middleware_fns, handler_fn;
if ((path !== '/') && (path[path.length - 1] === '/' )) {
path = path.substr(0, path.length - 1);
}
middleware_fns = routes_table.resolveMiddlewareFunctions(middlewares);
handler_fn = routes_table.resolveHandlerFunction(handler);
// Add the route to the router
router[method](path, middleware_fns, handler_fn);
debug(sprintf('%s router: added route: %s %s -> %s -> %s', definition, method, path, middlewares.join(','), handler));
});
// Load the router onto the path prefix
app.use(prefix, router);
debug(sprintf('%s router: loaded onto path %s ', definition, prefix));
});
cb(null, app);
};
//-------------------- END UTILITY METHODS -------------------
//-------------------- BEGIN MODULE EXPORT -------------------
module.exports = function(app, options) {
var options = options || {};
options.dirs = options.dirs || {};
options.dirs.routes = options.dirs.routes || path.join(process.cwd(), 'routes');
options.dirs.middleware = options.dirs.middleware || path.join(process.cwd(), 'middleware');
options.dirs.handlers = options.dirs.handlers || path.join(process.cwd(), 'handlers');
options.loader = options.loader || _loader;
options.builder = options.builder || _builder;
routes_table = new RoutesTable(app, options);
routes_table.runRoutesPipeline(options, function(err, results) {
if (err) {
console.log('RoutesPipelineError: ' + err);
app.emit('setup-failed', err);
}
else {
console.log('Routes pipeline complete');
app.emit('setup-complete', results);
}
});
return app;
};
//--------------------- END MODULE EXPORT --------------------