@@ -8,6 +8,33 @@ const ES6_BROWSER_EMPTY = resolve( __dirname, '../src/empty.js' );
8
8
const CONSOLE_WARN = ( ...args ) => console . warn ( ...args ) ; // eslint-disable-line no-console
9
9
const exts = [ '.js' , '.json' , '.node' ] ;
10
10
11
+ let readFileCache = { } ;
12
+ const readFileAsync = file => new Promise ( ( fulfil , reject ) => fs . readFile ( file , ( err , contents ) => err ? reject ( err ) : fulfil ( contents ) ) ) ;
13
+ const statAsync = file => new Promise ( ( fulfil , reject ) => fs . stat ( file , ( err , contents ) => err ? reject ( err ) : fulfil ( contents ) ) ) ;
14
+ function cachedReadFile ( file , cb ) {
15
+ if ( file in readFileCache === false ) {
16
+ readFileCache [ file ] = readFileAsync ( file ) . catch ( err => {
17
+ delete readFileCache [ file ] ;
18
+ throw err ;
19
+ } ) ;
20
+ }
21
+ readFileCache [ file ] . then ( contents => cb ( null , contents ) , cb ) ;
22
+ }
23
+
24
+ let isFileCache = { } ;
25
+ function cachedIsFile ( file , cb ) {
26
+ if ( file in isFileCache === false ) {
27
+ isFileCache [ file ] = statAsync ( file )
28
+ . then ( stat => stat . isFile ( ) )
29
+ . catch ( err => {
30
+ if ( err . code == 'ENOENT' ) return false ;
31
+ delete isFileCache [ file ] ;
32
+ throw err ;
33
+ } ) ;
34
+ }
35
+ isFileCache [ file ] . then ( contents => cb ( null , contents ) , cb ) ;
36
+ }
37
+
11
38
export default function nodeResolve ( options = { } ) {
12
39
const useModule = options . module !== false ;
13
40
const useMain = options . main !== false ;
@@ -31,6 +58,11 @@ export default function nodeResolve ( options = {} ) {
31
58
return {
32
59
name : 'node-resolve' ,
33
60
61
+ write ( ) {
62
+ isFileCache = { }
63
+ readFileCache = { }
64
+ } ,
65
+
34
66
resolveId ( importee , importer ) {
35
67
if ( / \0 / . test ( importee ) ) return null ; // ignore IDs with null character, these belong to other plugins
36
68
@@ -99,6 +131,8 @@ export default function nodeResolve ( options = {} ) {
99
131
}
100
132
return pkg ;
101
133
} ,
134
+ readFile : cachedReadFile ,
135
+ isFile : cachedIsFile ,
102
136
extensions : options . extensions
103
137
} , customResolveOptions ) ,
104
138
( err , resolved ) => {
0 commit comments