web-ext-run
Version:
A tool to open and run web extensions
82 lines (75 loc) • 2.47 kB
JavaScript
import { existsSync, lstatSync } from 'fs';
import Watchpack from 'watchpack';
import debounce from 'debounce';
import { UsageError } from './errors.js';
import { createLogger } from './util/logger.js';
const log = createLogger(import.meta.url);
// onSourceChange types and implementation
export default function onSourceChange({
sourceDir,
watchFile,
watchIgnored,
artifactsDir,
onChange,
shouldWatchFile,
debounceTime = 500
}) {
// When running on Windows, transform the ignored paths and globs
// as Watchpack does translate the changed files path internally
// (See https://github.com/webpack/watchpack/blob/v2.1.1/lib/DirectoryWatcher.js#L99-L103).
const ignored = watchIgnored && process.platform === 'win32' ? watchIgnored.map(it => it.replace(/\\/g, '/')) : watchIgnored;
// TODO: For network disks, we would need to add {poll: true}.
const watcher = ignored ? new Watchpack({
ignored
}) : new Watchpack();
// Allow multiple files to be changed before reloading the extension
const executeImmediately = false;
onChange = debounce(onChange, debounceTime, executeImmediately);
watcher.on('change', filePath => {
proxyFileChanges({
artifactsDir,
onChange,
filePath,
shouldWatchFile
});
});
log.debug(`Watching ${watchFile ? watchFile.join(',') : sourceDir} for changes`);
const watchedDirs = [];
const watchedFiles = [];
if (watchFile) {
for (const filePath of watchFile) {
if (existsSync(filePath) && !lstatSync(filePath).isFile()) {
throw new UsageError('Invalid --watch-file value: ' + `"${filePath}" is not a file.`);
}
watchedFiles.push(filePath);
}
} else {
watchedDirs.push(sourceDir);
}
watcher.watch({
files: watchedFiles,
directories: watchedDirs,
missing: [],
startTime: Date.now()
});
// TODO: support interrupting the watcher on Windows.
// https://github.com/mozilla/web-ext/issues/225
process.on('SIGINT', () => watcher.close());
return watcher;
}
// proxyFileChanges types and implementation.
export function proxyFileChanges({
artifactsDir,
onChange,
filePath,
shouldWatchFile
}) {
if (filePath.indexOf(artifactsDir) === 0 || !shouldWatchFile(filePath)) {
log.debug(`Ignoring change to: ${filePath}`);
} else {
log.debug(`Changed: ${filePath}`);
log.debug(`Last change detection: ${new Date().toTimeString()}`);
onChange();
}
}
//# sourceMappingURL=watcher.js.map