Blame view

node_modules/require-directory/index.js 2.8 KB
aaac7fed   liuqimichale   add
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
  'use strict';
  
  var fs = require('fs'),
    join = require('path').join,
    resolve = require('path').resolve,
    dirname = require('path').dirname,
    defaultOptions = {
      extensions: ['js', 'json', 'coffee'],
      recurse: true,
      rename: function (name) {
        return name;
      },
      visit: function (obj) {
        return obj;
      }
    };
  
  function checkFileInclusion(path, filename, options) {
    return (
      // verify file has valid extension
      (new RegExp('\\.(' + options.extensions.join('|') + ')$', 'i').test(filename)) &&
  
      // if options.include is a RegExp, evaluate it and make sure the path passes
      !(options.include && options.include instanceof RegExp && !options.include.test(path)) &&
  
      // if options.include is a function, evaluate it and make sure the path passes
      !(options.include && typeof options.include === 'function' && !options.include(path, filename)) &&
  
      // if options.exclude is a RegExp, evaluate it and make sure the path doesn't pass
      !(options.exclude && options.exclude instanceof RegExp && options.exclude.test(path)) &&
  
      // if options.exclude is a function, evaluate it and make sure the path doesn't pass
      !(options.exclude && typeof options.exclude === 'function' && options.exclude(path, filename))
    );
  }
  
  function requireDirectory(m, path, options) {
    var retval = {};
  
    // path is optional
    if (path && !options && typeof path !== 'string') {
      options = path;
      path = null;
    }
  
    // default options
    options = options || {};
    for (var prop in defaultOptions) {
      if (typeof options[prop] === 'undefined') {
        options[prop] = defaultOptions[prop];
      }
    }
  
    // if no path was passed in, assume the equivelant of __dirname from caller
    // otherwise, resolve path relative to the equivalent of __dirname
    path = !path ? dirname(m.filename) : resolve(dirname(m.filename), path);
  
    // get the path of each file in specified directory, append to current tree node, recurse
    fs.readdirSync(path).forEach(function (filename) {
      var joined = join(path, filename),
        files,
        key,
        obj;
  
      if (fs.statSync(joined).isDirectory() && options.recurse) {
        // this node is a directory; recurse
        files = requireDirectory(m, joined, options);
        // exclude empty directories
        if (Object.keys(files).length) {
          retval[options.rename(filename, joined, filename)] = files;
        }
      } else {
        if (joined !== m.filename && checkFileInclusion(joined, filename, options)) {
          // hash node key shouldn't include file extension
          key = filename.substring(0, filename.lastIndexOf('.'));
          obj = m.require(joined);
          retval[options.rename(key, joined, filename)] = options.visit(obj, joined, filename) || obj;
        }
      }
    });
  
    return retval;
  }
  
  module.exports = requireDirectory;
  module.exports.defaults = defaultOptions;