Repository: facebook/react
Pull request: Add new Jest --compact-console flag for DevTools tests

This flag uses `CustomConsole` (from `@jest/console`) to override default formatting and remove the logging source location (making the logs more compact and easier to read).

# Default logging (remains unchanged)
<img width="747" alt="Screen Shot 2021-10-03 at 12 57 22 PM" src="https://user-images.githubusercontent.com/29597/135764075-9011cb38-f5ba-437a-993d-72d35209c1de.png">
g console logging more compact).

# Example with `-c` or `--compact-console` flag
<img width="584" alt="Screen Shot 2021-10-03 at 12 53 28 PM" src="https://user-images.githubusercontent.com/29597/135764074-f00d2486-1159-4013-af41-4c2986ec950d.png">

Note that this feature only supports the DevTools test targets because of the way reconciler tests mock console to verify that all expected warnings and errors were explicitly flushed before the end of the test.

Changed files:
filename: packages/react-devtools-shared/src/__tests__/setupTests.js
patch: @@ -7,11 +7,31 @@
  * @flow
  */
 
+import {CustomConsole} from '@jest/console';
+
 import type {
   BackendBridge,
   FrontendBridge,
 } from 'react-devtools-shared/src/bridge';
 
+// Argument is serialized when passed from jest-cli script through to setupTests.
+const compactConsole = process.env.compactConsole === 'true';
+if (compactConsole) {
+  const formatter = (type, message) => {
+    switch (type) {
+      case 'error':
+        return '\x1b[31m' + message + '\x1b[0m';
+      case 'warn':
+        return '\x1b[33m' + message + '\x1b[0m';
+      case 'log':
+      default:
+        return message;
+    }
+  };
+
+  global.console = new CustomConsole(process.stdout, process.stderr, formatter);
+}
+
 const env = jasmine.getEnv();
 env.beforeEach(() => {
   global.mockClipboardCopy = jest.fn();

filename: scripts/jest/jest-cli.js
patch: @@ -97,6 +97,13 @@ const argv = yargs
       requiresArg: true,
       type: 'string',
     },
+    compactConsole: {
+      alias: 'c',
+      describe: 'Compact console output (hide file locations).',
+      requiresArg: false,
+      type: 'boolean',
+      default: false,
+    },
   }).argv;
 
 function logError(message) {
@@ -159,6 +166,11 @@ function validateOptions() {
       logError('DevTool tests require --build.');
       success = false;
     }
+  } else {
+    if (argv.compactConsole) {
+      logError('Only DevTool tests support compactConsole flag.');
+      success = false;
+    }
   }
 
   if (isWWWConfig()) {
@@ -284,6 +296,10 @@ function getEnvars() {
     RELEASE_CHANNEL: argv.releaseChannel.match(/modern|experimental/)
       ? 'experimental'
       : 'stable',
+
+    // Pass this flag through to the confit environment
+    // so the base config can conditionally load the console setup file.
+    compactConsole: argv.compactConsole,
   };
 
   if (argv.prod) {
@@ -306,7 +322,9 @@ function main() {
     console.log(chalk.red(`\nPlease run: \`${argv.deprecated}\` instead.\n`));
     return;
   }
+
   validateOptions();
+
   const args = getCommandArgs();
   const envars = getEnvars();
   const env = Object.entries(envars).map(([k, v]) => `${k}=${v}`);
@@ -334,6 +352,7 @@ function main() {
     stdio: 'inherit',
     env: {...envars, ...process.env},
   });
+
   // Ensure we close our process when we get a failure case.
   jest.on('close', code => {
     // Forward the exit code from the Jest process.