/**
 * 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);
});