-
Notifications
You must be signed in to change notification settings - Fork 0
/
recursive-require.js
111 lines (91 loc) · 3.06 KB
/
recursive-require.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
105
106
107
108
109
110
111
'use strict';
const async = require( 'async' );
const fs = require( 'fs' );
const path = require( 'path' );
const untildify = require( 'untildify' );
module.exports = recursiveRequire;
let defaults = {
verbose: false,
allowMissing: false,
extensions: [ 'js' ],
require: require,
check: null,
visit: null
};
function recursiveRequire( options, callback ) {
if ( typeof options === 'string' ) {
options = Object.assign( defaults, {
directory: options
} );
}
else {
options = Object.assign( defaults, options );
}
if ( !options.check ) {
options.check = function( filename ) {
const regexp = new RegExp( '\\.(' + options.extensions.join( '|' ) + ')$', 'i' );
if ( !regexp.test( filename ) ) {
return false;
}
return true;
};
}
const canonical = path.resolve( untildify( options.directory ) );
let files = null;
async.series( [
function getFileList( next ) {
fs.readdir( canonical, function( error, _files ) {
if ( error ) {
if ( options.allowMissing && error.code && error.code === 'ENOENT' ) {
next( {
skip: true
} );
return;
}
next( error );
return;
}
files = _files;
next();
} );
},
function loadFiles( next ) {
async.eachSeries( files, function( filename, _next ) {
const canonicalFilename = path.join( canonical, filename );
fs.lstat( canonicalFilename, function( error, stat ) {
if ( error ) {
_next( error );
return;
}
if ( stat.isDirectory() ) {
recursiveRequire( Object.assign( options, {
directory: canonicalFilename
} ), _next );
return;
}
if ( !options.check( canonicalFilename ) ) {
_next();
return;
}
if ( options.verbose ) {
console.log( 'Loading: ' + canonicalFilename );
}
var required = options.require( canonicalFilename );
if ( options.visit ) {
if ( options.verbose ) {
console.log( 'Visiting: ' + canonicalFilename );
}
options.visit( required, canonicalFilename, filename, _next );
return;
}
_next();
} );
}, next );
}
], function( error ) {
if ( error && error.skip ) {
error = null;
}
callback( error );
} );
}