@@ -8,7 +8,12 @@ interface FileInformation {
88} 
99
1010interface  FindFileResult  { 
11+ } 
1112
13+ interface  IOLogFile  { 
14+     path : string ; 
15+     codepage : number ; 
16+     result ?: FileInformation ; 
1217} 
1318
1419interface  IOLog  { 
@@ -17,11 +22,7 @@ interface IOLog {
1722    executingPath : string ; 
1823    currentDirectory : string ; 
1924    useCustomLibraryFile ?: boolean ; 
20-     filesRead : { 
21-         path : string ; 
22-         codepage : number ; 
23-         result ?: FileInformation ; 
24-     } [ ] ; 
25+     filesRead : IOLogFile [ ] ; 
2526    filesWritten : { 
2627        path : string ; 
2728        contents : string ; 
@@ -61,7 +62,7 @@ interface IOLog {
6162    } [ ] ; 
6263    directoriesRead : { 
6364        path : string , 
64-         extension : string [ ] , 
65+         extensions : string [ ] , 
6566        exclude : string [ ] , 
6667        include : string [ ] , 
6768        result : string [ ] 
@@ -170,8 +171,7 @@ namespace Playback {
170171            path  =>  callAndRecord ( underlying . fileExists ( path ) ,  recordLog . fileExists ,  {  path } ) , 
171172            memoize ( path  =>  { 
172173                // If we read from the file, it must exist 
173-                 const  noResult  =  { } ; 
174-                 if  ( findResultByPath ( wrapper ,  replayLog . filesRead ,  path ,  noResult )  !==  noResult )  { 
174+                 if  ( findFileByPath ( wrapper ,  replayLog . filesRead ,  path ,  /*throwFileNotFoundError*/  false ) )  { 
175175                    return  true ; 
176176                } 
177177                else  { 
@@ -215,16 +215,30 @@ namespace Playback {
215215                recordLog . filesRead . push ( logEntry ) ; 
216216                return  result ; 
217217            } , 
218-             memoize ( path  =>  findResultByPath ( wrapper ,  replayLog . filesRead ,  path ) . contents ) ) ; 
218+             memoize ( path  =>  findFileByPath ( wrapper ,  replayLog . filesRead ,  path ,   /*throwFileNotFoundError*/   true ) . contents ) ) ; 
219219
220220        wrapper . readDirectory  =  recordReplay ( wrapper . readDirectory ,  underlying ) ( 
221-             ( path ,  extension ,  exclude ,  include )  =>  { 
222-                 const  result  =  ( < ts . System > underlying ) . readDirectory ( path ,  extension ,  exclude ,  include ) ; 
223-                 const  logEntry  =  {  path,  extension ,  exclude,  include,  result } ; 
221+             ( path ,  extensions ,  exclude ,  include )  =>  { 
222+                 const  result  =  ( < ts . System > underlying ) . readDirectory ( path ,  extensions ,  exclude ,  include ) ; 
223+                 const  logEntry  =  {  path,  extensions ,  exclude,  include,  result } ; 
224224                recordLog . directoriesRead . push ( logEntry ) ; 
225225                return  result ; 
226226            } , 
227-             ( path ,  extension ,  exclude )  =>  findResultByPath ( wrapper ,  replayLog . directoriesRead ,  path ) ) ; 
227+             ( path ,  extensions ,  exclude )  =>  { 
228+                 // Because extensions is an array of all allowed extension, we will want to merge each of the replayLog.directoriesRead into one 
229+                 // if each of the directoriesRead has matched path with the given path (directory with same path but different extension will considered 
230+                 // different entry). 
231+                 // TODO (yuisu): We can certainly remove these once we recapture the RWC using new API 
232+                 const  normalizedPath  =  ts . normalizePath ( path ) . toLowerCase ( ) ; 
233+                 const  result : string [ ]  =  [ ] ; 
234+                  for  ( const  directory  of  replayLog . directoriesRead )  { 
235+                     if  ( ts . normalizeSlashes ( directory . path ) . toLowerCase ( )  ===  normalizedPath )  { 
236+                         result . push ( ...directory . result ) ; 
237+                     } 
238+                 } 
239+ 
240+                 return  result ; 
241+             } ) ; 
228242
229243        wrapper . writeFile  =  recordReplay ( wrapper . writeFile ,  underlying ) ( 
230244            ( path : string ,  contents : string )  =>  callAndRecord ( underlying . writeFile ( path ,  contents ) ,  recordLog . filesWritten ,  {  path,  contents,  bom : false  } ) , 
@@ -279,30 +293,22 @@ namespace Playback {
279293        return  results [ 0 ] . result ; 
280294    } 
281295
282-     function  findResultByPath < T > ( wrapper : {  resolvePath ( s : string ) : string  } ,  logArray : {  path : string ;  result ?: T  } [ ] ,  expectedPath : string ,  defaultValue ?: T ) : T  { 
296+     function  findFileByPath ( wrapper : {  resolvePath ( s : string ) : string  } ,  logArray : IOLogFile [ ] , 
297+         expectedPath : string ,  throwFileNotFoundError : boolean ) : FileInformation  { 
283298        const  normalizedName  =  ts . normalizePath ( expectedPath ) . toLowerCase ( ) ; 
284299        // Try to find the result through normal fileName 
285-         for  ( let  i  =  0 ;  i  <  logArray . length ;  i ++ )  { 
286-             if  ( ts . normalizeSlashes ( logArray [ i ] . path ) . toLowerCase ( )  ===  normalizedName )  { 
287-                 return  logArray [ i ] . result ; 
288-             } 
289-         } 
290-         // Fallback, try to resolve the target paths as well 
291-         if  ( replayLog . pathsResolved . length  >  0 )  { 
292-             const  normalizedResolvedName  =  wrapper . resolvePath ( expectedPath ) . toLowerCase ( ) ; 
293-             for  ( let  i  =  0 ;  i  <  logArray . length ;  i ++ )  { 
294-                 if  ( wrapper . resolvePath ( logArray [ i ] . path ) . toLowerCase ( )  ===  normalizedResolvedName )  { 
295-                     return  logArray [ i ] . result ; 
296-                 } 
300+         for  ( const  log  of  logArray )  { 
301+             if  ( ts . normalizeSlashes ( log . path ) . toLowerCase ( )  ===  normalizedName )  { 
302+                 return  log . result ; 
297303            } 
298304        } 
299305
300306        // If we got here, we didn't find a match 
301-         if  ( defaultValue   ===   undefined )  { 
307+         if  ( throwFileNotFoundError )  { 
302308            throw  new  Error ( "No matching result in log array for path: "  +  expectedPath ) ; 
303309        } 
304310        else  { 
305-             return  defaultValue ; 
311+             return  undefined ; 
306312        } 
307313    } 
308314
0 commit comments