@@ -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 ;
@@ -37,6 +65,11 @@ export default function nodeResolve ( options = {} ) {
37
65
preserveSymlinks = options . preserveSymlinks ;
38
66
} ,
39
67
68
+ onwrite ( ) {
69
+ isFileCache = { } ;
70
+ readFileCache = { } ;
71
+ } ,
72
+
40
73
resolveId ( importee , importer ) {
41
74
if ( / \0 / . test ( importee ) ) return null ; // ignore IDs with null character, these belong to other plugins
42
75
@@ -91,7 +124,7 @@ export default function nodeResolve ( options = {} ) {
91
124
return browser ;
92
125
} , { } ) ;
93
126
}
94
-
127
+
95
128
if ( options . browser && typeof pkg [ 'browser' ] === 'string' ) {
96
129
pkg [ 'main' ] = pkg [ 'browser' ] ;
97
130
} else if ( useModule && pkg [ 'module' ] ) {
@@ -103,6 +136,8 @@ export default function nodeResolve ( options = {} ) {
103
136
}
104
137
return pkg ;
105
138
} ,
139
+ readFile : cachedReadFile ,
140
+ isFile : cachedIsFile ,
106
141
extensions : options . extensions
107
142
} ;
108
143
0 commit comments