UNPKG

testcafe

Version:

Automated browser testing for the modern web development stack.

139 lines 17.3 kB
"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