Skip to content
Snippets Groups Projects
Runner.ts 907 B
Newer Older
insert's avatar
insert committed
import { spawn } from 'child_process';
import { LogOutput, LogError, LogExit } from './Logger';

export interface Result {
	command: string,
	stdout: string,
	stderr: string,
	exitCode: Number
}

export default function Run(args: string[], log?: boolean): Promise<Result> {
	let command = args.join(' ');
	log && LogOutput(command);
	const proc = spawn(args.shift() || 'echo', args);

	let stdout: string[] = [], stderr: string[] = [];

	proc.stdout.on('data', data => {
		data = data.toString(); // safety
		stdout.push(data);
		log && LogOutput(data);
	});

	proc.stderr.on('data', data => {
		data = data.toString(); // safety
		stderr.push(data);
		log && LogError(data);
	});

	return new Promise((resolve, reject) => {
		proc.on('close', exitCode => {
			log && LogExit(exitCode);
			resolve({
				command,
				stdout: stdout.join('\n'),
				stderr: stderr.join('\n'),
				exitCode
			});
		});
	});
}