66 lines
1.6 KiB
JavaScript
66 lines
1.6 KiB
JavaScript
|
var fs = require('fs');
|
||
|
|
||
|
var DEFAULT_EXCLUDE_DIR = /^\./;
|
||
|
var DEFAULT_FILTER = /^([^\.].*)\.js(on)?$/;
|
||
|
var DEFAULT_RECURSIVE = true;
|
||
|
|
||
|
module.exports = function requireAll(options) {
|
||
|
var dirname = typeof options === 'string' ? options : options.dirname;
|
||
|
var excludeDirs = options.excludeDirs === undefined ? DEFAULT_EXCLUDE_DIR : options.excludeDirs;
|
||
|
var filter = options.filter === undefined ? DEFAULT_FILTER : options.filter;
|
||
|
var modules = {};
|
||
|
var recursive = options.recursive === undefined ? DEFAULT_RECURSIVE : options.recursive;
|
||
|
var resolve = options.resolve || identity;
|
||
|
var map = options.map || identity;
|
||
|
|
||
|
function excludeDirectory(dirname) {
|
||
|
return !recursive ||
|
||
|
(excludeDirs && dirname.match(excludeDirs));
|
||
|
}
|
||
|
|
||
|
function filterFile(filename) {
|
||
|
if (typeof filter === 'function') {
|
||
|
return filter(filename);
|
||
|
}
|
||
|
|
||
|
var match = filename.match(filter);
|
||
|
if (!match) return;
|
||
|
|
||
|
return match[1] || match[0];
|
||
|
}
|
||
|
|
||
|
var files = fs.readdirSync(dirname);
|
||
|
|
||
|
files.forEach(function (file) {
|
||
|
var filepath = dirname + '/' + file;
|
||
|
if (fs.statSync(filepath).isDirectory()) {
|
||
|
|
||
|
if (excludeDirectory(file)) return;
|
||
|
|
||
|
var subModules = requireAll({
|
||
|
dirname: filepath,
|
||
|
filter: filter,
|
||
|
excludeDirs: excludeDirs,
|
||
|
map: map,
|
||
|
resolve: resolve
|
||
|
});
|
||
|
|
||
|
if (Object.keys(subModules).length === 0) return;
|
||
|
|
||
|
modules[map(file, filepath)] = subModules;
|
||
|
|
||
|
} else {
|
||
|
var name = filterFile(file);
|
||
|
if (!name) return;
|
||
|
|
||
|
modules[map(name, filepath)] = resolve(require(filepath));
|
||
|
}
|
||
|
});
|
||
|
|
||
|
return modules;
|
||
|
};
|
||
|
|
||
|
function identity(val) {
|
||
|
return val;
|
||
|
}
|