@@ -8,6 +8,34 @@ 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 (
29
+ stat => stat . isFile ( ) ,
30
+ err => {
31
+ if ( err . code == 'ENOENT' ) return false ;
32
+ delete isFileCache [ file ] ;
33
+ throw err ;
34
+ } ) ;
35
+ }
36
+ isFileCache [ file ] . then ( contents => cb ( null , contents ) , cb ) ;
37
+ }
38
+
11
39
export default function nodeResolve ( options = { } ) {
12
40
const useModule = options . module !== false ;
13
41
const useMain = options . main !== false ;
@@ -31,6 +59,11 @@ export default function nodeResolve ( options = {} ) {
31
59
return {
32
60
name : 'node-resolve' ,
33
61
62
+ onwrite ( ) {
63
+ isFileCache = { } ;
64
+ readFileCache = { } ;
65
+ } ,
66
+
34
67
resolveId ( importee , importer ) {
35
68
if ( / \0 / . test ( importee ) ) return null ; // ignore IDs with null character, these belong to other plugins
36
69
@@ -99,6 +132,8 @@ export default function nodeResolve ( options = {} ) {
99
132
}
100
133
return pkg ;
101
134
} ,
135
+ readFile : cachedReadFile ,
136
+ isFile : cachedIsFile ,
102
137
extensions : options . extensions
103
138
} , customResolveOptions ) ,
104
139
( err , resolved ) => {
0 commit comments