testcafe
Version:
Automated browser testing for the modern web development stack.
139 lines • 17.3 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 file_watcher_1 = __importDefault(require("./file-watcher"));
const logger_1 = __importDefault(require("./logger"));
const process_1 = __importDefault(require("process"));
const readline_1 = __importDefault(require("readline"));
const pinkie_1 = __importDefault(require("pinkie"));
const REQUIRED_MODULE_FOUND_EVENT = 'require-module-found';
const LOCK_KEY_PRESS_TIMEOUT = 1000;
class LiveModeController extends events_1.default {
constructor(runner) {
super();
this.src = null;
this.running = false;
this.restarting = false;
this.watchingPaused = false;
this.stopping = false;
this.logger = new logger_1.default();
this.runner = runner;
this.lockKeyPress = false;
this.fileWatcher = null;
this.rl = null;
}
init(files) {
this._listenKeyPress();
this._initFileWatching(files);
this._listenTestRunnerEvents();
this._setRunning();
return pinkie_1.default.resolve()
.then(() => this.logger.writeIntroMessage(files));
}
dispose() {
this.fileWatcher.stop();
process_1.default.stdin.setRawMode(false);
this.rl.close();
}
_toggleWatching() {
this.watchingPaused = !this.watchingPaused;
this.logger.writeToggleWatchingMessage(!this.watchingPaused);
}
_stop() {
if (!this.runner || !this.running) {
this.logger.writeNothingToStopMessage();
return pinkie_1.default.resolve();
}
this.logger.writeStopRunningMessage();
return this.runner.suspend()
.then(() => {
this.restarting = false;
this.running = false;
});
}
_restart() {
if (this.restarting || this.watchingPaused)
return pinkie_1.default.resolve();
this.restarting = true;
if (this.running) {
return this._stop()
.then(() => this.logger.writeTestsFinishedMessage())
.then(() => this._runTests());
}
return this._runTests();
}
_exit() {
if (this.stopping)
return pinkie_1.default.resolve();
this.logger.writeExitMessage();
this.stopping = true;
return this.runner ? this.runner.exit() : pinkie_1.default.resolve();
}
_createFileWatcher(src) {
return new file_watcher_1.default(src);
}
_listenKeyPress() {
readline_1.default.emitKeypressEvents(process_1.default.stdin);
if (process_1.default.stdin.isTTY)
process_1.default.stdin.setRawMode(true);
this.rl = readline_1.default.createInterface({
input: process_1.default.stdin,
output: process_1.default.stdout
});
process_1.default.stdin.on('keypress', (ch, key) => {
if (this.lockKeyPress)
return null;
this.lockKeyPress = true;
setTimeout(() => {
this.lockKeyPress = false;
}, LOCK_KEY_PRESS_TIMEOUT);
if (key && key.ctrl) {
switch (key.name) {
case 's':
return this._stop();
case 'r':
return this._restart();
case 'c':
return this._exit();
case 'w':
return this._toggleWatching();
}
}
return null;
});
}
_listenTestRunnerEvents() {
this.runner.on(this.runner.TEST_RUN_DONE_EVENT, e => {
this.running = false;
if (!this.restarting)
this.logger.writeTestsFinishedMessage();
if (e.err)
this.logger.err(e.err);
});
this.runner.on(this.runner.REQUIRED_MODULE_FOUND_EVENT, e => {
this.emit(REQUIRED_MODULE_FOUND_EVENT, e);
});
}
_initFileWatching(src) {
this.fileWatcher = this._createFileWatcher(src);
this.on(REQUIRED_MODULE_FOUND_EVENT, e => this.fileWatcher.addFile(e.filename));
this.fileWatcher.on(this.fileWatcher.FILE_CHANGED_EVENT, () => this._runTests(true));
}
_setRunning() {
this.running = true;
this.restarting = false;
}
_runTests(sourceChanged) {
if (this.watchingPaused || this.running)
return pinkie_1.default.resolve();
this._setRunning();
this.logger.writeRunTestsMessage(sourceChanged);
return this.runner.runTests();
}
}
exports.default = LiveModeController;
module.exports = exports.default;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saXZlL2NvbnRyb2xsZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBa0M7QUFDbEMsa0VBQXlDO0FBQ3pDLHNEQUE4QjtBQUM5QixzREFBOEI7QUFDOUIsd0RBQWdDO0FBQ2hDLG9EQUE2QjtBQUU3QixNQUFNLDJCQUEyQixHQUFHLHNCQUFzQixDQUFDO0FBQzNELE1BQU0sc0JBQXNCLEdBQVEsSUFBSSxDQUFDO0FBRXpDLE1BQU0sa0JBQW1CLFNBQVEsZ0JBQVk7SUFDekMsWUFBYSxNQUFNO1FBQ2YsS0FBSyxFQUFFLENBQUM7UUFFUixJQUFJLENBQUMsR0FBRyxHQUFjLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsT0FBTyxHQUFVLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsVUFBVSxHQUFPLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsUUFBUSxHQUFTLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsTUFBTSxHQUFXLElBQUksZ0JBQU0sRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxNQUFNLEdBQVcsTUFBTSxDQUFDO1FBQzdCLElBQUksQ0FBQyxZQUFZLEdBQUssS0FBSyxDQUFDO1FBQzVCLElBQUksQ0FBQyxXQUFXLEdBQU0sSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyxFQUFFLEdBQWUsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFJLENBQUUsS0FBSztRQUNQLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRW5CLE9BQU8sZ0JBQU8sQ0FBQyxPQUFPLEVB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dCBGaWxlV2F0Y2hlciBmcm9tICcuL2ZpbGUtd2F0Y2hlcic7XG5pbXBvcnQgTG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ3Byb2Nlc3MnO1xuaW1wb3J0IHJlYWRsaW5lIGZyb20gJ3JlYWRsaW5lJztcbmltcG9ydCBQcm9taXNlIGZyb20gJ3BpbmtpZSc7XG5cbmNvbnN0IFJFUVVJUkVEX01PRFVMRV9GT1VORF9FVkVOVCA9ICdyZXF1aXJlLW1vZHVsZS1mb3VuZCc7XG5jb25zdCBMT0NLX0tFWV9QUkVTU19USU1FT1VUICAgICAgPSAxMDAwO1xuXG5jbGFzcyBMaXZlTW9kZUNvbnRyb2xsZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIGNvbnN0cnVjdG9yIChydW5uZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLnNyYyAgICAgICAgICAgID0gbnVsbDtcbiAgICAgICAgdGhpcy5ydW5uaW5nICAgICAgICA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlc3RhcnRpbmcgICAgID0gZmFsc2U7XG4gICAgICAgIHRoaXMud2F0Y2hpbmdQYXVzZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zdG9wcGluZyAgICAgICA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxvZ2dlciAgICAgICAgID0gbmV3IExvZ2dlcigpO1xuICAgICAgICB0aGlzLnJ1bm5lciAgICAgICAgID0gcnVubmVyO1xuICAgICAgICB0aGlzLmxvY2tLZXlQcmVzcyAgID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZmlsZVdhdGNoZXIgICAgPSBudWxsO1xuICAgICAgICB0aGlzLnJsICAgICAgICAgICAgID0gbnVsbDtcbiAgICB9XG5cbiAgICBpbml0IChmaWxlcykge1xuICAgICAgICB0aGlzLl9saXN0ZW5LZXlQcmVzcygpO1xuICAgICAgICB0aGlzLl9pbml0RmlsZVdhdGNoaW5nKGZpbGVzKTtcbiAgICAgICAgdGhpcy5fbGlzdGVuVGVzdFJ1bm5lckV2ZW50cygpO1xuICAgICAgICB0aGlzLl9zZXRSdW5uaW5nKCk7XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLmxvZ2dlci53cml0ZUludHJvTWVzc2FnZShmaWxlcykpO1xuICAgIH1cblxuICAgIGRpc3Bvc2UgKCkge1xuICAgICAgICB0aGlzLmZpbGVXYXRjaGVyLnN0b3AoKTtcbiAgICAgICAgcHJvY2Vzcy5zdGRpbi5zZXRSYXdNb2RlKGZhbHNlKTtcbiAgICAgICAgdGhpcy5ybC5jbG9zZSgpO1xuICAgIH1cblxuICAgIF90b2dnbGVXYXRjaGluZyAoKSB7XG4gICAgICAgIHRoaXMud2F0Y2hpbmdQYXVzZWQgPSAhdGhpcy53YXRjaGluZ1BhdXNlZDtcblxuICAgICAgICB0aGlzLmxvZ2dlci53cml0ZVRvZ2dsZVdhdGNoaW5nTWVzc2FnZSghdGhpcy53YXRjaGluZ1BhdXNlZCk7XG4gICAgfVxuXG4gICAgX3N0b3AgKCkge1xuICAgICAgICBpZiAoIXRoaXMucnVubmVyIHx8ICF0aGlzLnJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndyaXRlTm90aGluZ1RvU3RvcE1lc3NhZ2UoKTtcblxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2dnZXIud3JpdGVTdG9wUnVubmluZ01lc3NhZ2UoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5ydW5uZXIuc3VzcGVuZCgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXN0YXJ0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5ydW5uaW5nICAgID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfcmVzdGFydCAoKSB7XG4gICAgICAgIGlmICh0aGlzLnJlc3RhcnRpbmcgfHwgdGhpcy53YXRjaGluZ1BhdXNlZClcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblxuICAgICAgICB0aGlzLnJlc3RhcnRpbmcgPSB0cnVlO1xuXG4gICAgICAgIGlmICh0aGlzLnJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdG9wKClcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLmxvZ2dlci53cml0ZVRlc3RzRmluaXNoZWRNZXNzYWdlKCkpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5fcnVuVGVzdHMoKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fcnVuVGVzdHMoKTtcbiAgICB9XG5cbiAgICBfZXhpdCAoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0b3BwaW5nKVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXG4gICAgICAgIHRoaXMubG9nZ2VyLndyaXRlRXhpdE1lc3NhZ2UoKTtcblxuICAgICAgICB0aGlzLnN0b3BwaW5nID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gdGhpcy5ydW5uZXIgPyB0aGlzLnJ1bm5lci5leGl0KCkgOiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBfY3JlYXRlRmlsZVdhdGNoZXIgKHNyYykge1xuICAgICAgICByZXR1cm4gbmV3IEZpbGVXYXRjaGVyKHNyYyk7XG4gICAgfVxuXG4gICAgX2xpc3RlbktleVByZXNzICgpIHtcbiAgICAgICAgcmVhZGxpbmUuZW1pdEtleXByZXNzRXZlbnRzKHByb2Nlc3Muc3RkaW4pO1xuICAgICAgICBpZiAocHJvY2Vzcy5zdGRpbi5pc1RUWSlcbiAgICAgICAgICAgIHByb2Nlc3Muc3RkaW4uc2V0UmF3TW9kZSh0cnVlKTtcblxuICAgICAgICB0aGlzLnJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHtcbiAgICAgICAgICAgIGlucHV0OiAgcHJvY2Vzcy5zdGRpbixcbiAgICAgICAgICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcHJvY2Vzcy5zdGRpbi5vbigna2V5cHJlc3MnLCAoY2gsIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMubG9ja0tleVByZXNzKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICB0aGlzLmxvY2tLZXlQcmVzcyA9IHRydWU7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9ja0tleVByZXNzID0gZmFsc2U7XG4gICAgICAgICAgICB9LCBMT0NLX0tFWV9QUkVTU19USU1FT1VUKTtcblxuICAgICAgICAgICAgaWYgKGtleSAmJiBrZXkuY3RybCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoa2V5Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdyJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXN0YXJ0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2MnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2V4aXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdG9nZ2xlV2F0Y2hpbmcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfbGlzdGVuVGVzdFJ1bm5lckV2ZW50cyAoKSB7XG4gICAgICAgIHRoaXMucnVubmVyLm9uKHRoaXMucnVubmVyLlRFU1RfUlVOX0RPTkVfRVZFTlQsIGUgPT4ge1xuICAgICAgICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5yZXN0YXJ0aW5nKVxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndyaXRlVGVzdHNGaW5pc2hlZE1lc3NhZ2UoKTtcblxuICAgICAgICAgICAgaWYgKGUuZXJyKVxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycihlLmVycik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucnVubmVyLm9uKHRoaXMucnVubmVyLlJFUVVJUkVEX01PRFVMRV9GT1VORF9FVkVOVCwgZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoUkVRVUlSRURfTU9EVUxFX0ZPVU5EX0VWRU5ULCBlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2luaXRGaWxlV2F0Y2hpbmcgKHNyYykge1xuICAgICAgICB0aGlzLmZpbGVXYXRjaGVyID0gdGhpcy5fY3JlYXRlRmlsZVdhdGNoZXIoc3JjKTtcblxuICAgICAgICB0aGlzLm9uKFJFUVVJUkVEX01PRFVMRV9GT1VORF9FVkVOVCwgZSA9PiB0aGlzLmZpbGVXYXRjaGVyLmFkZEZpbGUoZS5maWxlbmFtZSkpO1xuXG4gICAgICAgIHRoaXMuZmlsZVdhdGNoZXIub24odGhpcy5maWxlV2F0Y2hlci5GSUxFX0NIQU5HRURfRVZFTlQsICgpID0+IHRoaXMuX3J1blRlc3RzKHRydWUpKTtcbiAgICB9XG5cbiAgICBfc2V0UnVubmluZyAoKSB7XG4gICAgICAgIHRoaXMucnVubmluZyAgICA9IHRydWU7XG4gICAgICAgIHRoaXMucmVzdGFydGluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIF9ydW5UZXN0cyAoc291cmNlQ2hhbmdlZCkge1xuICAgICAgICBpZiAodGhpcy53YXRjaGluZ1BhdXNlZCB8fCB0aGlzLnJ1bm5pbmcpXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICAgICAgdGhpcy5fc2V0UnVubmluZygpO1xuXG4gICAgICAgIHRoaXMubG9nZ2VyLndyaXRlUnVuVGVzdHNNZXNzYWdlKHNvdXJjZUNoYW5nZWQpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnJ1bm5lci5ydW5UZXN0cygpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTGl2ZU1vZGVDb250cm9sbGVyO1xuIl19