@@ -17,17 +17,18 @@ const { addAbortListener } = require('internal/events/abort_listener');
17
17
const { watch } = require ( 'fs' ) ;
18
18
const { fileURLToPath } = require ( 'internal/url' ) ;
19
19
const { resolve, dirname } = require ( 'path' ) ;
20
- const { setTimeout } = require ( 'timers' ) ;
20
+ const { setTimeout, clearTimeout } = require ( 'timers' ) ;
21
21
22
22
const supportsRecursiveWatching = process . platform === 'win32' ||
23
23
process . platform === 'darwin' ;
24
24
25
25
class FilesWatcher extends EventEmitter {
26
26
#watchers = new SafeMap ( ) ;
27
27
#filteredFiles = new SafeSet ( ) ;
28
- #debouncing = new SafeSet ( ) ;
29
28
#depencencyOwners = new SafeMap ( ) ;
30
29
#ownerDependencies = new SafeMap ( ) ;
30
+ #debounceOwners = new SafeSet ( ) ;
31
+ #debounceTimer;
31
32
#debounce;
32
33
#mode;
33
34
#signal;
@@ -75,17 +76,20 @@ class FilesWatcher extends EventEmitter {
75
76
}
76
77
77
78
#onChange( trigger ) {
78
- if ( this . #debouncing. has ( trigger ) ) {
79
- return ;
80
- }
81
79
if ( this . #mode === 'filter' && ! this . #filteredFiles. has ( trigger ) ) {
82
80
return ;
83
81
}
84
- this . #debouncing. add ( trigger ) ;
85
82
const owners = this . #depencencyOwners. get ( trigger ) ;
86
- setTimeout ( ( ) => {
87
- this . #debouncing. delete ( trigger ) ;
88
- this . emit ( 'changed' , { owners } ) ;
83
+ if ( owners ) {
84
+ for ( const owner of owners ) {
85
+ this . #debounceOwners. add ( owner ) ;
86
+ }
87
+ }
88
+ clearTimeout ( this . #debounceTimer) ;
89
+ this . #debounceTimer = setTimeout ( ( ) => {
90
+ this . #debounceTimer = null ;
91
+ this . emit ( 'changed' , { owners : this . #debounceOwners } ) ;
92
+ this . #debounceOwners. clear ( ) ;
89
93
} , this . #debounce) . unref ( ) ;
90
94
}
91
95
0 commit comments