index.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. var fs = require('fs'),
  2. path = require('path');
  3. var valid_extensions = ['js', 'coffee'];
  4. module.exports = function(dir){
  5. dir = path.resolve(dir);
  6. var res = {};
  7. var objs = fs.readdirSync(dir)
  8. // ignore index file
  9. .filter(function(f){ return f.match(/^index\./) ? false : true })
  10. // ignore non-js files that aren't folders
  11. .filter(function(f){ return isDir(dir,f) || f.match(extensions_regex()) ? true : false })
  12. // ignore folders without an index file
  13. .filter(function(f){ return (isDir(dir,f) && !contains_index(dir,f)) ? false : true })
  14. // remove extensions
  15. .map(function(f){ return f.replace(extensions_regex(), '') });
  16. objs.forEach(function(obj){
  17. try {
  18. res[obj] = require(path.join(dir, obj));
  19. } catch (err) {
  20. err.message = "Could note require " + path.join(dir, obj) + ": " + err.message
  21. throw err
  22. }
  23. });
  24. return res;
  25. }
  26. //
  27. // @api private
  28. //
  29. function isDir(dir, f){ return fs.statSync(path.join(dir,f)).isDirectory() }
  30. function extensions_regex(){
  31. var str = '';
  32. valid_extensions.forEach(function(ext){ str += '\\.' + ext + '$' + '|'; });
  33. return new RegExp(str.slice(0,-1))
  34. }
  35. function contains_index(dir,f){
  36. var res = false;
  37. valid_extensions.forEach(function(ext){
  38. if (fs.existsSync(path.join(dir, f, 'index.' + ext))) { res = true; }
  39. });
  40. return res;
  41. }