testcafe
Version:
Automated browser testing for the modern web development stack.
59 lines • 7.35 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const events_1 = __importDefault(require("events"));
const fs_1 = __importDefault(require("fs"));
const modules_graph_1 = __importDefault(require("./modules-graph"));
const WATCH_LOCKED_TIMEOUT = 700;
class FileWatcher extends events_1.default {
constructor(files) {
super();
this.FILE_CHANGED_EVENT = 'file-changed';
this.watchers = {};
this.lockedFiles = {};
this.modulesGraph = null;
this.lastChangedFiles = [];
files.forEach(f => this.addFile(f));
}
_onChanged(file) {
const cache = require.cache;
if (!this.modulesGraph) {
this.modulesGraph = new modules_graph_1.default();
this.modulesGraph.build(cache, Object.keys(this.watchers));
}
else {
this.lastChangedFiles.forEach(changedFile => this.modulesGraph.rebuildNode(cache, changedFile));
this.lastChangedFiles = [];
}
this.lastChangedFiles.push(file);
this.modulesGraph.clearParentsCache(cache, file);
this.emit(this.FILE_CHANGED_EVENT, { file });
}
_watch(file) {
if (this.lockedFiles[file])
return;
this.lockedFiles[file] = setTimeout(() => {
this._onChanged(file);
delete this.lockedFiles[file];
}, WATCH_LOCKED_TIMEOUT);
}
stop() {
Object.values(this.watchers).forEach(watcher => {
watcher.close();
});
}
addFile(file) {
if (!this.watchers[file] && file.indexOf('node_modules') < 0) {
if (this.modulesGraph) {
this.lastChangedFiles.push(file);
this.modulesGraph.addNode(file, require.cache);
}
this.watchers[file] = fs_1.default.watch(file, () => this._watch(file));
}
}
}
exports.default = FileWatcher;
module.exports = exports.default;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGl2ZS9maWxlLXdhdGNoZXIvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBa0M7QUFDbEMsNENBQW9CO0FBQ3BCLG9FQUEyQztBQUUzQyxNQUFNLG9CQUFvQixHQUFHLEdBQUcsQ0FBQztBQUVqQyxNQUFxQixXQUFZLFNBQVEsZ0JBQVk7SUFDakQsWUFBYSxLQUFLO1FBQ2QsS0FBSyxFQUFFLENBQUM7UUFFUixJQUFJLENBQUMsa0JBQWtCLEdBQUcsY0FBYyxDQUFDO1FBRXpDLElBQUksQ0FBQyxRQUFRLEdBQVcsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxXQUFXLEdBQVEsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxZQUFZLEdBQU8sSUFBSSxDQUFDO1FBQzdCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFFM0IsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsVUFBVSxDQUFFLElBQUk7UUFDWixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBRTVCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSx1QkFBWSxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7U0FDOUQ7YUFDSTtZQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNoRyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1NBQzlCO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVqRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELE1BQU0sQ0FBRSxJQUFJO1FBQ1IsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztZQUN0QixPQUFPO1FBRVgsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ3JDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFdEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUFJO1FBQ0EsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzNDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxPQUFPLENBQUUsSUFBSTtRQUNULElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzFELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDbkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDakMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNsRDtZQUVELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsWUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ2pFO0lBQ0wsQ0FBQztDQUNKO0FBM0RELDhCQTJEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSAnZXZlbnRzJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgTW9kdWxlc0dyYXBoIGZyb20gJy4vbW9kdWxlcy1ncmFwaCc7XG5cbmNvbnN0IFdBVENIX0xPQ0tFRF9USU1FT1VUID0gNzAwO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaWxlV2F0Y2hlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IgKGZpbGVzKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5GSUxFX0NIQU5HRURfRVZFTlQgPSAnZmlsZS1jaGFuZ2VkJztcblxuICAgICAgICB0aGlzLndhdGNoZXJzICAgICAgICAgPSB7fTtcbiAgICAgICAgdGhpcy5sb2NrZWRGaWxlcyAgICAgID0ge307XG4gICAgICAgIHRoaXMubW9kdWxlc0dyYXBoICAgICA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdENoYW5nZWRGaWxlcyA9IFtdO1xuXG4gICAgICAgIGZpbGVzLmZvckVhY2goZiA9PiB0aGlzLmFkZEZpbGUoZikpO1xuICAgIH1cblxuICAgIF9vbkNoYW5nZWQgKGZpbGUpIHtcbiAgICAgICAgY29uc3QgY2FjaGUgPSByZXF1aXJlLmNhY2hlO1xuXG4gICAgICAgIGlmICghdGhpcy5tb2R1bGVzR3JhcGgpIHtcbiAgICAgICAgICAgIHRoaXMubW9kdWxlc0dyYXBoID0gbmV3IE1vZHVsZXNHcmFwaCgpO1xuICAgICAgICAgICAgdGhpcy5tb2R1bGVzR3JhcGguYnVpbGQoY2FjaGUsIE9iamVjdC5rZXlzKHRoaXMud2F0Y2hlcnMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGFzdENoYW5nZWRGaWxlcy5mb3JFYWNoKGNoYW5nZWRGaWxlID0+IHRoaXMubW9kdWxlc0dyYXBoLnJlYnVpbGROb2RlKGNhY2hlLCBjaGFuZ2VkRmlsZSkpO1xuICAgICAgICAgICAgdGhpcy5sYXN0Q2hhbmdlZEZpbGVzID0gW107XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxhc3RDaGFuZ2VkRmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgdGhpcy5tb2R1bGVzR3JhcGguY2xlYXJQYXJlbnRzQ2FjaGUoY2FjaGUsIGZpbGUpO1xuXG4gICAgICAgIHRoaXMuZW1pdCh0aGlzLkZJTEVfQ0hBTkdFRF9FVkVOVCwgeyBmaWxlIH0pO1xuICAgIH1cblxuICAgIF93YXRjaCAoZmlsZSkge1xuICAgICAgICBpZiAodGhpcy5sb2NrZWRGaWxlc1tmaWxlXSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0aGlzLmxvY2tlZEZpbGVzW2ZpbGVdID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZWQoZmlsZSk7XG5cbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmxvY2tlZEZpbGVzW2ZpbGVdO1xuICAgICAgICB9LCBXQVRDSF9MT0NLRURfVElNRU9VVCk7XG4gICAgfVxuXG4gICAgc3RvcCAoKSB7XG4gICAgICAgIE9iamVjdC52YWx1ZXModGhpcy53YXRjaGVycykuZm9yRWFjaCh3YXRjaGVyID0+IHtcbiAgICAgICAgICAgIHdhdGNoZXIuY2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYWRkRmlsZSAoZmlsZSkge1xuICAgICAgICBpZiAoIXRoaXMud2F0Y2hlcnNbZmlsZV0gJiYgZmlsZS5pbmRleE9mKCdub2RlX21vZHVsZXMnKSA8IDApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1vZHVsZXNHcmFwaCkge1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdENoYW5nZWRGaWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICAgICAgICAgIHRoaXMubW9kdWxlc0dyYXBoLmFkZE5vZGUoZmlsZSwgcmVxdWlyZS5jYWNoZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMud2F0Y2hlcnNbZmlsZV0gPSBmcy53YXRjaChmaWxlLCAoKSA9PiB0aGlzLl93YXRjaChmaWxlKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=