var path = require('path');
|
|
var fs = require('fs');
|
|
|
|
var automodule = module.exports = function(options){
|
|
options = (options)?options:{};
|
|
var search_path = String(get(options, 'search', process.cwd()));
|
|
var print = Boolean(get(options, 'print', false));
|
|
var recursive = Number(get(options, 'recursive', 1));
|
|
|
|
var modules = {};
|
|
var all_files = get_files(search_path, recursive);
|
|
var top_level = ~all_files.indexOf('lib') || ~all_files.indexOf('src');
|
|
if(top_level){
|
|
modules = get_require('lib', search_path, print);
|
|
} else{
|
|
all_files.forEach(function(file){
|
|
var module = null;
|
|
var abs = path.resolve(search_path, file);
|
|
var ext = path.extname(file);
|
|
var name = path.basename(abs, ext);
|
|
var dirname = path.dirname(file);
|
|
module = get_require(file, search_path, print);
|
|
add_module(modules, file.replace(ext, '').split('/'), module);
|
|
});
|
|
}
|
|
if(print){
|
|
return compile(modules);
|
|
} else{
|
|
return modules;
|
|
}
|
|
};
|
|
|
|
var compile = function(modules){
|
|
var out = 'return module.exports = ';
|
|
if(typeof(modules) == 'string'){
|
|
return out += modules + ';';
|
|
}
|
|
|
|
out += '{';
|
|
for(var name in modules){
|
|
out += name + ':' + modules[name] + ',';
|
|
}
|
|
out += '};';
|
|
return out;
|
|
};
|
|
|
|
var get_require = function(file, search_path, print){
|
|
if(print){
|
|
return 'require("./' + file + '")';
|
|
} else{
|
|
return require(search_path + '/' + file);
|
|
}
|
|
};
|
|
|
|
var get_files = function(search_path, recurse_level){
|
|
var files = [];
|
|
if(recurse_level < 1){
|
|
return files;
|
|
}
|
|
fs.readdirSync(search_path).forEach(function(file){
|
|
if(file[0] == '.'){
|
|
return;
|
|
}
|
|
var abs_path = path.resolve(search_path, file);
|
|
var stats = fs.lstatSync(abs_path);
|
|
if(stats.isDirectory()){
|
|
var new_files = get_files(abs_path, recurse_level-1);
|
|
new_files.forEach(function(new_f){
|
|
files.push(file + '/' + new_f);
|
|
});
|
|
|
|
if(!new_files.length && fs.existsSync(path.resolve(abs_path, 'index.js'))){
|
|
files.push(file);
|
|
}
|
|
} else{
|
|
var ext = path.extname(file);
|
|
if(ext == '.js' || ext == '.json'){
|
|
files.push(file);
|
|
}
|
|
}
|
|
});
|
|
return files;
|
|
};
|
|
|
|
var get = function(obj, key, def){
|
|
if(obj[key] == null || obj[key] == undefined){
|
|
return def;
|
|
} else{
|
|
return obj[key];
|
|
}
|
|
};
|
|
|
|
var add_module = function(obj, name_parts, module){
|
|
if(name_parts.length <= 1){
|
|
if(name_parts[0].toLowerCase() == 'index'){
|
|
for(var name in module){
|
|
obj[name] = module[name]
|
|
}
|
|
}else{
|
|
obj[name_parts[0]] = module;
|
|
}
|
|
}else{
|
|
if(obj[name_parts[0]] == undefined){
|
|
obj[name_parts[0]] = {};
|
|
}
|
|
obj[name_parts[0]] = add_module(obj[name_parts[0]], name_parts.slice(1), module);
|
|
}
|
|
return obj;
|
|
};
|