/** * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ import {fork} from 'child_process'; import invariant from 'invariant'; import process from 'process'; import * as readline from 'readline'; import {hideBin} from 'yargs/helpers'; readline.emitKeypressEvents(process.stdin); if (process.stdin.isTTY) { process.stdin.setRawMode(true); } process.stdin.on('keypress', function (_, key) { if (key && key.name === 'c' && key.ctrl) { // handle sigint if (childProc) { console.log('Interrupted!!'); childProc.kill('SIGINT'); childProc.unref(); process.exit(-1); } } }); const childProc = fork(require.resolve('./runner.js'), hideBin(process.argv), { // for some reason, keypress events aren't sent to handlers in both processes // when we `inherit` stdin. // pipe stdout and stderr so we can silence child process after parent exits stdio: ['pipe', 'pipe', 'pipe', 'ipc'], // forward existing env variables, like `NODE_OPTIONS` which VSCode uses to attach // its debugger env: {...process.env, FORCE_COLOR: 'true'}, }); invariant( childProc.stdin && childProc.stdout && childProc.stderr, 'Expected forked process to have piped stdio', ); process.stdin.pipe(childProc.stdin); childProc.stdout.pipe(process.stdout); childProc.stderr.pipe(process.stderr); childProc.on('exit', code => { process.exit(code ?? -1); });