Coverage

100%
63
63
0

/home/deadhorse/nodejs/ci_router/lib/router.js

100%
63
63
0
LineHitsSource
11var fs = require('fs');
21var path = require('path');
31var urlparse = require('url').parse;
4
51function pageNotFound(req, res) {
68 res.statusCode = 404;
78 res.end(req.method !== 'HEAD' && req.method + ' ' + req.url + ' Not Found ');
8}
9
101module.exports = function router(options) {
11 //default options
121 options = options || {};
131 options.path = options.path || './controllers';
141 options.deepth = options.deepth || 1;
151 options.index = options.index || 'index';
161 options.rewrite = options.rewrite || {};
171 options.root = options.root || '/';
181 var controllers = {};
19
20 //load all the controllers
211 var realPath = path.resolve(options.path);
221 var innerDirs = [];
231 do {
243 var inner = innerDirs.shift() || '';
253 var dirName = realPath + (inner ? '/' + inner : '');
263 fs.readdirSync(dirName).forEach(function(filename) {
279 var totalName = dirName + '/' + filename;
289 var innerName = inner ? inner + '/' + filename : filename;
299 if (fs.statSync(totalName).isDirectory() && innerName.split('/').length < options.deepth) {
302 innerDirs.push(innerName);
31 }
327 else if (/\.js$/.test(filename) && !controllers.hasOwnProperty(innerName.slice(0, -3))) {
336 var controller = require(totalName);
346 for (var key in controller) {
3518 var temp = controller[key];
3618 delete controller[key];
3718 controller[key.toUpperCase()] = temp;
38 }
396 controllers[innerName.slice(0, -3).toUpperCase()] = controller;
40 }
41 });
42 } while(innerDirs.length);
431 function getActionParam() {
4430 var ctlName = '';
4530 var controller;
4630 var funcNum;
4730 var deepth = arguments.length < options.deepth ? arguments.length : options.deepth;
4830 for (var i = 0; i < deepth; ++i) {
4944 ctlName += arguments[i];
5044 controller = controllers[(ctlName || options.index).toUpperCase()];
5144 funcNum = i+1;
5244 if (controller) {
5324 break;
54 }
5520 ctlName += '/';
56 }
5730 if (controller) {
5824 var func = controller[(arguments[funcNum] || options.index).toUpperCase()];
5924 if (typeof func === 'function') {
6022 return {
61 action: func,
62 param: Array.prototype.splice.call(arguments, funcNum + 1)
63 }
64 }
65 }
668 return {
67 action: pageNotFound
68 };
69 }
701 return function lookup(req, res, next) {
7130 var pathname = urlparse(req.url).pathname;
7230 pathname = !pathname || pathname === '/' ? options.root : pathname;
7330 var rewrite = options.rewrite;
7430 var rewritePath = '';
7530 for(var key in rewrite) {
7658 var reg = new RegExp('^' + key);
7758 rewritePath = pathname.replace(reg, rewrite[key]);
7858 if (rewritePath !== pathname) {
794 pathname = rewritePath;
804 break;
81 }
82 }
8330 var segments = pathname.slice(1).split('/');
8430 var actionInfo = getActionParam.apply(null, segments);
8530 req.param = actionInfo.param;
8630 actionInfo.action.apply(null, arguments);
87 }
88}