@@ -565,6 +565,12 @@ namespace ts {
565
565
sourceMap : false ,
566
566
} ;
567
567
568
+ interface OutputFingerprint {
569
+ hash : string ;
570
+ byteOrderMark : boolean ;
571
+ mtime : Date ;
572
+ }
573
+
568
574
export function createCompilerHost ( options : CompilerOptions , setParentNodes ?: boolean ) : CompilerHost {
569
575
const existingDirectories : Map < boolean > = { } ;
570
576
@@ -615,11 +621,50 @@ namespace ts {
615
621
}
616
622
}
617
623
624
+ let outputFingerprints : Map < OutputFingerprint > ;
625
+
626
+ function writeFileIfUpdated ( fileName : string , data : string , writeByteOrderMark : boolean ) : void {
627
+ if ( ! outputFingerprints ) {
628
+ outputFingerprints = { } ;
629
+ }
630
+
631
+ const hash = sys . createHash ( data ) ;
632
+ const mtimeBefore = sys . getModifiedTime ( fileName ) ;
633
+
634
+ if ( mtimeBefore && hasProperty ( outputFingerprints , fileName ) ) {
635
+ const fingerprint = outputFingerprints [ fileName ] ;
636
+
637
+ // If output has not been changed, and the file has no external modification
638
+ if ( fingerprint . byteOrderMark === writeByteOrderMark &&
639
+ fingerprint . hash === hash &&
640
+ fingerprint . mtime . getTime ( ) === mtimeBefore . getTime ( ) ) {
641
+ return ;
642
+ }
643
+ }
644
+
645
+ sys . writeFile ( fileName , data , writeByteOrderMark ) ;
646
+
647
+ const mtimeAfter = sys . getModifiedTime ( fileName ) ;
648
+
649
+ outputFingerprints [ fileName ] = {
650
+ hash,
651
+ byteOrderMark : writeByteOrderMark ,
652
+ mtime : mtimeAfter
653
+ } ;
654
+ }
655
+
618
656
function writeFile ( fileName : string , data : string , writeByteOrderMark : boolean , onError ?: ( message : string ) => void ) {
619
657
try {
620
658
const start = new Date ( ) . getTime ( ) ;
621
659
ensureDirectoriesExist ( getDirectoryPath ( normalizePath ( fileName ) ) ) ;
622
- sys . writeFile ( fileName , data , writeByteOrderMark ) ;
660
+
661
+ if ( options . watch && sys . createHash && sys . getModifiedTime ) {
662
+ writeFileIfUpdated ( fileName , data , writeByteOrderMark ) ;
663
+ }
664
+ else {
665
+ sys . writeFile ( fileName , data , writeByteOrderMark ) ;
666
+ }
667
+
623
668
ioWriteTime += new Date ( ) . getTime ( ) - start ;
624
669
}
625
670
catch ( e ) {
0 commit comments