Skip to content

Commit

Permalink
Ensure verbose mode prints output synchronously
Browse files Browse the repository at this point in the history
Fixes #8208
  • Loading branch information
conartist6 committed May 26, 2021
1 parent 98ed700 commit e18af6c
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 11 deletions.
24 changes: 13 additions & 11 deletions packages/jest-reporters/src/DefaultReporter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,16 +43,18 @@ export default class DefaultReporter extends BaseReporter {
this._err = process.stderr.write.bind(process.stderr);
this._status = new Status();
this._bufferedOutput = new Set();
this._wrapStdio(process.stdout);
this._wrapStdio(process.stderr);
this.__wrapStdio(process.stdout);
this.__wrapStdio(process.stderr);
this._status.onChange(() => {
this._clearStatus();
this._printStatus();
this.__clearStatus();
this.__printStatus();
});
}

private _wrapStdio(stream: NodeJS.WritableStream | NodeJS.WriteStream) {
const originalWrite = stream.write;
protected __wrapStdio(
stream: NodeJS.WritableStream | NodeJS.WriteStream,
): void {
const write = stream.write.bind(stream);

let buffer: Array<string> = [];
let timeout: NodeJS.Timeout | null = null;
Expand All @@ -62,11 +64,11 @@ export default class DefaultReporter extends BaseReporter {
buffer = [];

// This is to avoid conflicts between random output and status text
this._clearStatus();
this.__clearStatus();
if (string) {
originalWrite.call(stream, string);
write(string);
}
this._printStatus();
this.__printStatus();

this._bufferedOutput.delete(flushBufferedOutput);
};
Expand Down Expand Up @@ -103,7 +105,7 @@ export default class DefaultReporter extends BaseReporter {
}
}

private _clearStatus() {
protected __clearStatus(): void {
if (isInteractive) {
if (this._globalConfig.useStderr) {
this._err(this._clear);
Expand All @@ -113,7 +115,7 @@ export default class DefaultReporter extends BaseReporter {
}
}

private _printStatus() {
protected __printStatus(): void {
const {content, clear} = this._status.get();
this._clear = clear;
if (isInteractive) {
Expand Down
15 changes: 15 additions & 0 deletions packages/jest-reporters/src/VerboseReporter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,21 @@ export default class VerboseReporter extends DefaultReporter {
this._globalConfig = globalConfig;
}

// Verbose mode is for debugging. Buffering of output is undesirable.
// See https://github.com/facebook/jest/issues/8208
protected __wrapStdio(
stream: NodeJS.WritableStream | NodeJS.WriteStream,
): void {
const write = stream.write.bind(stream);

stream.write = (chunk: string) => {
this.__clearStatus();
write(chunk);
this.__printStatus();
return true;
};
}

static filterTestResults(
testResults: Array<AssertionResult>,
): Array<AssertionResult> {
Expand Down

0 comments on commit e18af6c

Please sign in to comment.