export function tryExecuteCommandInForkAsync()

in src/helpers/command.ts [148:207]


export function tryExecuteCommandInForkAsync(
  workingDirectory: string | undefined,
  writeToOutputChannel: boolean,
  modulePath: string,
  ...args: string[]
): ICommandExecute {
  let cmdOutput: string = '';
  let cmdOutputIncludingStderr: string = '';
  const messages: Array<string | object> = [];
  const batches: {[key: string]: string[]} = {};

  const childProcess = forkProcess(workingDirectory, modulePath, args);
  const result = new Promise((resolve: (res: any) => void, reject: (error: Error) => void): void => {
    childProcess.stdout.on('data', (data: string | Buffer) => {
      data = data.toString();
      cmdOutput = cmdOutput.concat(data);
      cmdOutputIncludingStderr = cmdOutputIncludingStderr.concat(data);

      if (writeToOutputChannel) {
        Output.output(Constants.outputChannel.executeCommand, data);
      }
    });

    childProcess.stderr.on('data', (data: string | Buffer) => {
      data = data.toString();
      cmdOutputIncludingStderr = cmdOutputIncludingStderr.concat(data);

      if (writeToOutputChannel) {
        Output.output(Constants.outputChannel.executeCommand, data);
      }
    });

    childProcess.on('message', (message: IForkMessage) => {
      if (message.batch) {
        batches[message.command] = batches[message.command] || [];
        batches[message.command][message.batch.index] = message.batch.message;
        if (message.batch.done) {
          messages.push({command: message.command, message: batches[message.command].join('')});
        }
      } else {
        messages.push(message);
      }

      const data = JSON.stringify(message);
      cmdOutput = cmdOutput.concat(data);
      cmdOutputIncludingStderr = cmdOutputIncludingStderr.concat(data);

      if (writeToOutputChannel) {
        Output.output(Constants.outputChannel.executeCommand, data);
      }
    });

    childProcess.on('error', reject);
    childProcess.on('close', (code: number) => {
      resolve({ cmdOutput, cmdOutputIncludingStderr, code, messages });
    });
  });

  return { childProcess, result };
}