UNPKG

@travetto/watch

Version:

Support for making files watchable during runtime

71 lines (64 loc) 1.67 kB
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()); } }