diff --git a/packages/jest-core/package.json b/packages/jest-core/package.json index fc501edc72ab..19a920a07273 100644 --- a/packages/jest-core/package.json +++ b/packages/jest-core/package.json @@ -13,6 +13,7 @@ "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", + "emittery": "^0.7.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-changed-files": "^26.3.0", diff --git a/packages/jest-core/src/TestScheduler.ts b/packages/jest-core/src/TestScheduler.ts index a1eac111ddce..272e8c7950c9 100644 --- a/packages/jest-core/src/TestScheduler.ts +++ b/packages/jest-core/src/TestScheduler.ts @@ -426,15 +426,15 @@ export default class TestScheduler { aggregatedResults.numFailedTests >= this._globalConfig.bail ) { if (watcher.isWatchMode()) { - watcher.setState({interrupted: true}); - } else { - const failureExit = () => exit(1); - - return this._dispatcher - .onRunComplete(contexts, aggregatedResults) - .then(failureExit) - .catch(failureExit); + return watcher.setState({interrupted: true}); } + + const failureExit = () => exit(1); + + return this._dispatcher + .onRunComplete(contexts, aggregatedResults) + .then(failureExit) + .catch(failureExit); } return Promise.resolve(); } diff --git a/packages/jest-core/src/TestWatcher.ts b/packages/jest-core/src/TestWatcher.ts index 750dcbe45efc..3dbacb3fb5e4 100644 --- a/packages/jest-core/src/TestWatcher.ts +++ b/packages/jest-core/src/TestWatcher.ts @@ -5,13 +5,13 @@ * LICENSE file in the root directory of this source tree. */ -import {EventEmitter} from 'events'; +import emittery = require('emittery'); type State = { interrupted: boolean; }; -export default class TestWatcher extends EventEmitter { +export default class TestWatcher extends emittery.Typed<{change: State}> { state: State; private _isWatchMode: boolean; @@ -21,9 +21,9 @@ export default class TestWatcher extends EventEmitter { this._isWatchMode = isWatchMode; } - setState(state: State): void { + async setState(state: State): Promise { Object.assign(this.state, state); - this.emit('change', this.state); + await this.emit('change', this.state); } isInterrupted(): boolean { diff --git a/packages/jest-runner/src/index.ts b/packages/jest-runner/src/index.ts index abdba02c39aa..b403ada3cd00 100644 --- a/packages/jest-runner/src/index.ts +++ b/packages/jest-runner/src/index.ts @@ -25,7 +25,6 @@ import type { TestRunnerContext as JestTestRunnerContext, TestRunnerOptions as JestTestRunnerOptions, TestWatcher as JestTestWatcher, - WatcherState, } from './types'; const TEST_WORKER_PATH = require.resolve('./testWorker'); @@ -243,7 +242,7 @@ class TestRunner { }; const onInterrupt = new Promise((_, reject) => { - watcher.on('change', (state: WatcherState) => { + watcher.on('change', state => { if (state.interrupted) { reject(new CancelRun()); } diff --git a/packages/jest-runner/src/types.ts b/packages/jest-runner/src/types.ts index 4b20d260e910..a04572643d9b 100644 --- a/packages/jest-runner/src/types.ts +++ b/packages/jest-runner/src/types.ts @@ -5,7 +5,7 @@ * LICENSE file in the root directory of this source tree. */ -import type {EventEmitter} from 'events'; +import type {Typed as EmitteryTyped} from 'emittery'; import type {Config} from '@jest/types'; import type { AssertionResult, @@ -79,10 +79,8 @@ export type TestRunnerSerializedContext = { }; // TODO: Should live in `@jest/core` or `jest-watcher` -export type WatcherState = { - interrupted: boolean; -}; -export interface TestWatcher extends EventEmitter { +type WatcherState = {interrupted: boolean}; +export interface TestWatcher extends EmitteryTyped<{change: WatcherState}> { state: WatcherState; setState(state: WatcherState): void; isInterrupted(): boolean; diff --git a/yarn.lock b/yarn.lock index b305620d22f7..9f566be8fcf1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1766,6 +1766,7 @@ __metadata: "@types/rimraf": ^3.0.0 ansi-escapes: ^4.2.1 chalk: ^4.0.0 + emittery: ^0.7.1 exit: ^0.1.2 graceful-fs: ^4.2.4 jest-changed-files: ^26.3.0