@travetto/watch
Version:
Support for making files watchable during runtime
71 lines (64 loc) • 1.67 kB
text/typescript
import { Watcher, WatcherOptions } from './watcher';
import { AllEvent, WatchEmitter } from './emitter';
type Opts = WatcherOptions & {
validFile?: (f: string) => boolean;
};
/**
* Tracks file changes for the application roots,
* and handles multiple file roots.
*/
export class FilePresenceManager extends WatchEmitter {
#watchers = new Map<string, Watcher>();
#config: Opts;
/**
* Build a new file presence manager
*
* @param config
*/
constructor(folders: string[], config: Opts = {}) {
super();
this.#config = config;
this.addFolder(...folders);
setTimeout(() => this.#config.ignoreInitial = false, 1000);
}
/**
* Callback handle for the watcher
*/
#watcherListener({ event, entry }: AllEvent): void {
switch (event) {
case 'added':
case 'changed':
case 'removed':
if (this.#config.validFile && !this.#config.validFile(entry.file)) {
return;
}
break;
}
this.emit(event, entry);
}
/**
* Add a folder
*/
addFolder(...folders: string[]): void {
for (const folder of folders.filter(x => !this.#watchers.has(x))) {
this.#watchers.set(folder, new Watcher(folder, this.#config)
.on('all', this.#watcherListener.bind(this)));
}
}
/**
* Remove a folder
* @param folder
*/
removeFolder(...folders: string[]): void {
for (const folder of folders.filter(x => this.#watchers.has(x))) {
this.#watchers.get(folder)!.close();
this.#watchers.delete(folder);
}
}
/**
* Close manager, freeing all watchers
*/
close(): void {
this.removeFolder(...this.#watchers.keys());
}
}