@@ -530,6 +530,9 @@ export function removeDirSync(dir: string) {
530
530
}
531
531
}
532
532
533
+ export const removeDir = isWindows
534
+ ? promisify ( gracefulRemoveDir )
535
+ : removeDirSync
533
536
export const renameDir = isWindows ? promisify ( gracefulRename ) : fs . renameSync
534
537
535
538
export function ensureWatchedFile (
@@ -804,6 +807,38 @@ function gracefulRename(
804
807
} )
805
808
}
806
809
810
+ const GRACEFUL_REMOVE_DIR_TIMEOUT = 5000
811
+ function gracefulRemoveDir (
812
+ dir : string ,
813
+ cb : ( error : NodeJS . ErrnoException | null ) => void
814
+ ) {
815
+ const rmdir = fs . rm ?? fs . rmdir // TODO: Remove after support for Node 12 is dropped
816
+ const start = Date . now ( )
817
+ let backoff = 0
818
+ rmdir ( dir , { recursive : true } , function CB ( er ) {
819
+ if ( er ) {
820
+ if (
821
+ ( er . code === 'ENOTEMPTY' ||
822
+ er . code === 'EACCES' ||
823
+ er . code === 'EPERM' ) &&
824
+ Date . now ( ) - start < GRACEFUL_REMOVE_DIR_TIMEOUT
825
+ ) {
826
+ setTimeout ( function ( ) {
827
+ rmdir ( dir , { recursive : true } , CB )
828
+ } , backoff )
829
+ if ( backoff < 100 ) backoff += 10
830
+ return
831
+ }
832
+
833
+ if ( er . code === 'ENOENT' ) {
834
+ er = null
835
+ }
836
+ }
837
+
838
+ if ( cb ) cb ( er )
839
+ } )
840
+ }
841
+
807
842
export function emptyCssComments ( raw : string ) {
808
843
return raw . replace ( multilineCommentsRE , ( s ) => ' ' . repeat ( s . length ) )
809
844
}
0 commit comments