-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
108 lines (81 loc) · 3.2 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
var _ = require('underscore');
var fs = require('fs');
var path = require('path');
module.exports = (function() {
var makeUrl = function(str) {
if (path.sep == '/') {
return String(str);
} else if (path.sep == '\\') {
return String(str).replace(/\\/g, '/');
}
throw new Error('Unsupported path.sep ' + path.sep);
};
var noIndex = function(str) {
return makeUrl(str).replace(/\/index$/, '/').toLowerCase();
};
var noSlash = function(str) {
return makeUrl(str).replace(/\/+$/, '');
};
var trailingSlash = function(str) {
return noSlash(str) + '/';
};
var defaultDelegate = function(path, filename){
return filename[0] !== '.' && /\.(js|coffee)$/i.test(filename);
};
// FIXME: support *
var methods = ['get', 'post', 'put', 'delete', 'options'];
var doMergeRoute = function(existingRoutes, routeModule, routeUrl) {
var name = noSlash(noIndex(routeUrl)) || '/';
var r = existingRoutes[name] || {};
var s = {};
_.each(routeModule, function(value, key) {
if (methods.indexOf(key) > -1) {
r[key] = value;
} else {
s[key] = value;
}
});
_.each(s, function(value, key) {
doMergeRoute(existingRoutes, value, path.join(name, key));
});
//console.log('domergeRoute', routeUrl, name, r, s);
existingRoutes[name] = r;
};
var mergeRoute = function(existingRoutes, routePath, routeUrl) {
var mod = require(routePath);
doMergeRoute(existingRoutes, mod, routeUrl);
};
var getRoutes = function(module, /*optional*/dir, /*optional*/urlPrefix, /*optional*/existingRoutes) {
var result = existingRoutes || {};
var subdirs = [];
dir = trailingSlash(dir || 'routes');
urlPrefix = trailingSlash(urlPrefix || '');
var baseDir = path.dirname(module.filename);
var routeDir = path.join(baseDir, dir);
fs.readdirSync(routeDir).forEach(function(filename) {
var name = filename.substring(0, filename.lastIndexOf('.'));
var joined = path.join(routeDir, filename);
//console.log('joined', name, filename, joined);
if (fs.statSync(joined).isDirectory()) {
subdirs.push({dir: path.join(dir, filename), url: path.join(urlPrefix, filename)});
} else if (defaultDelegate(joined, filename)) {
mergeRoute(result, joined, [urlPrefix, name].join(''));
}
});
subdirs.forEach(function(folder) {
getRoutes(module, folder.dir, folder.url, result);
});
return result;
};
var installRoutes = function(module, app, /*optional*/dir, /*optional*/urlPrefix) {
var routes = getRoutes(module, dir, urlPrefix);
_.each(routes, function(value, key) {
_.each(value, function(handler, method) {
// console.log('registering ' + method + ' handler for ' + key, handler);
app[method](key, handler);
});
});
return routes;
};
return {get: getRoutes, install: installRoutes};
}());