Code coverage report for require-dir-all/index.js

Statements: 100% (44 / 44)      Branches: 100% (28 / 28)      Functions: 100% (4 / 4)      Lines: 100% (44 / 44)      Ignored: none     

All files » require-dir-all/ » 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                3     3 3 3             3       1 19       1 5     1 9   9   9   22 22 22 22 22         22         3 3   19 13 13 13 2   13         9                 3   5 5 5 5 5 5   5 5 4   4     1 1   2 2   1        
// See README.md for details.
 
// Inspired by require-all and require-dir packages:
// https://github.com/felixge/node-require-all
// https://github.com/aseemk/requireDir
 
'use strict';
 
var fs = require('fs'),
  path = require('path');
 
var parentModule = module.parent;
var parentFile = parentModule.filename;
var parentDir = path.dirname(parentFile);
 
// Trick taken from https://github.com/aseemk/requireDir/blob/master/index.js
//
// make a note of the calling file's path, so that we can resolve relative
// paths. this only works if a fresh version of this module is run on every
// require(), so important: we clear the require() cache each time!
delete require.cache[__filename];
//
//////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////
 
function isExcludedFile(reqModule, reIncludeFiles) {
  return (reqModule.filepath === parentFile) ||   // Exclude require'ing file
    (reIncludeFiles && !reqModule.filename.match(reIncludeFiles)); // Exclude files non-matched to patter includeFiles
}
 
function isExcludedDir(reqModule, reExcludeDirs) {
  return  reExcludeDirs && reqModule.filename.match(reExcludeDirs);
}
 
function _requireDirAll(absDir, options) {
  var modules = {};
 
  var files = fs.readdirSync(absDir);
 
  for (var length=files.length, i=0; i<length; ++i) {
 
    var reqModule = {};
    reqModule.filename = files[i];                                         // full filename without path
    reqModule.ext      = path.extname(reqModule.filename);                 // file extension
    reqModule.base     = path.basename(reqModule.filename, reqModule.ext); // filename without extension
    reqModule.filepath = path.join(absDir, reqModule.filename);            // full filename with absolute path
 
    //console.log('reqModule:', reqModule);
 
    // If this is subdirectory, then descend recursively into it (excluding matching patter excludeDirs)
    if (fs.statSync(reqModule.filepath).isDirectory() &&
      options.recursive &&
      ! isExcludedDir(reqModule, options.excludeDirs) ) {
 
      // use filename instead of base to keep complete directory name for directories with '.', like 'dir.1.2.3'
      reqModule.name = reqModule.filename;
      modules[reqModule.name] = _requireDirAll(reqModule.filepath, options);
 
    } else if ( ! isExcludedFile(reqModule, options.includeFiles)) {
      reqModule.name = reqModule.base;
      reqModule.exports = require(reqModule.filepath);
      if (options.map) {
        options.map(reqModule);
      }
      modules[reqModule.name] = reqModule.exports;
    }
 
  }
 
  return modules;
}
 
/**
 *
 * @param relOrAbsDir String || [] - Directory or array of directories to 'require'
 * @param options {{}}             - Set of options
 * @returns {{} || []}             - Returns object with require'd modules or array of such objects
 */
module.exports = function requireDirAll(relOrAbsDir, options) {
 
  relOrAbsDir = relOrAbsDir || '.';
  options = options || {};
  options.recursive    = options.recursive    || false;
  options.includeFiles = options.includeFiles || /^.*\.(js|json|coffee)$/;
  options.excludeDirs  = options.excludeDirs  || /^(\.git|\.svn|node_modules)$/;
  options.map          = options.map          || null;
 
  var absDir;
  if (typeof relOrAbsDir === 'string') {
    absDir = path.resolve(parentDir, relOrAbsDir);
    //console.log('relOrAbsDir:', relOrAbsDir, '; options:', options);
    return _requireDirAll(absDir, options);
 
  } else { // Assume it is array
    var modulesArray = [];
    for (var length=relOrAbsDir.length, i=0; i<length; ++i) {
      //console.log('relOrAbsDir:', relOrAbsDir, '; options:', options);
      absDir = path.resolve(parentDir, relOrAbsDir[i]);
      modulesArray.push(_requireDirAll(absDir, options));
    }
    return modulesArray;
 
  }
};