Recursively iterates over specified directory, require()'ing each file, and returning a nested hash structure containing those modules.
Follow me (@troygoode) on Twitter!
Installation (via npm)
$ npm install require-directoryA common pattern in node.js is to include an index file which creates a hash of the files in its current directory. Given a directory structure like so:
- app.js
- routes/
- index.js
- home.js
- auth/
- login.js
- logout.js
- register.js
routes/index.js uses require-directory to build the hash (rather than doing so manually) like so:
varrequireDirectory=require('require-directory');module.exports=requireDirectory(module);app.js references routes/index.js like any other module, but it now has a hash/tree of the exports from the ./routes/ directory:
varroutes=require('./routes');// snipapp.get('/',routes.home);app.get('/register',routes.auth.register);app.get('/login',routes.auth.login);app.get('/logout',routes.auth.logout);The routes variable above is the equivalent of this:
varroutes={home: require('routes/home.js'),auth: {login: require('routes/auth/login.js'),logout: require('routes/auth/logout.js'),register: require('routes/auth/register.js')}};Note that routes.index will be undefined as you would hope.
You can specify which directory you want to build a tree of (if it isn't the current directory for whatever reason) by passing it as the second parameter. Not specifying the path (requireDirectory(module)) is the equivelant of requireDirectory(module, __dirname):
varrequireDirectory=require('require-directory');module.exports=requireDirectory(module,'./some/subdirectory');For example, in the example in the Usage section we could have avoided creating routes/index.js and instead changed the first lines of app.js to:
varrequireDirectory=require('require-directory');varroutes=requireDirectory(module,'./routes');You can pass an options hash to require-directory as the 2nd parameter (or 3rd if you're passing the path to another directory as the 2nd parameter already). Here are the available options:
Whitelisting (either via RegExp or function) allows you to specify that only certain files be loaded.
varrequireDirectory=require('require-directory'),whitelist=/onlyinclude.js$/,hash=requireDirectory(module,{include: whitelist});varrequireDirectory=require('require-directory'),check=function(path){if(/onlyinclude.js$/.test(path)){returntrue;// go ahead and include}else{returnfalse;// don't include}},hash=requireDirectory(module,{include: check});Blacklisting (either via RegExp or function) allows you to specify that all but certain files should be loaded.
varrequireDirectory=require('require-directory'),blacklist=/dontinclude\.js$/,hash=requireDirectory(module,{exclude: blacklist});varrequireDirectory=require('require-directory'),check=function(path){if(/dontinclude\.js$/.test(path)){returnfalse;// don't include}else{returntrue;// go ahead and include}},hash=requireDirectory(module,{exclude: check});require-directory takes a function as the visit option that will be called for each module that is added to module.exports.
varrequireDirectory=require('require-directory'),visitor=function(obj){console.log(obj);// will be called for every module that is loaded},hash=requireDirectory(module,{visit: visitor});The visitor can also transform the objects by returning a value:
varrequireDirectory=require('require-directory'),visitor=function(obj){returnobj(newDate());},hash=requireDirectory(module,{visit: visitor});varrequireDirectory=require('require-directory'),renamer=function(name){returnname.toUpperCase();},hash=requireDirectory(module,{rename: renamer});varrequireDirectory=require('require-directory'),hash=requireDirectory(module,{recurse: false});$ npm run lint
$ npm test
