import * as childProcess from 'child_process'; export function execute( command: string, args: string[], options?: { cwd?: string; env?: any }, shell: boolean = false, ): Promise { const spawnOptions: childProcess.SpawnOptions = { shell, env: { ...process.env }, }; if (options?.cwd) { spawnOptions.cwd = options.cwd; } if (options?.env) { spawnOptions.env = { ...process.env, ...options.env }; } // Before spawning an external process, we look if we need to restore the system proxy configuration, // which overides the cli internal proxy configuration. if (process.env.SNYK_SYSTEM_HTTP_PROXY !== undefined) { spawnOptions.env.HTTP_PROXY = process.env.SNYK_SYSTEM_HTTP_PROXY; } if (process.env.SNYK_SYSTEM_HTTPS_PROXY !== undefined) { spawnOptions.env.HTTPS_PROXY = process.env.SNYK_SYSTEM_HTTPS_PROXY; } if (process.env.SNYK_SYSTEM_NO_PROXY !== undefined) { spawnOptions.env.NO_PROXY = process.env.SNYK_SYSTEM_NO_PROXY; } return new Promise((resolve, reject) => { let stdout = ''; let stderr = ''; const proc = childProcess.spawn(command, args, spawnOptions); proc.stdout.on('data', (data: Buffer) => { stdout = stdout + data; }); proc.stderr.on('data', (data: Buffer) => { stderr = stderr + data; }); proc.on('close', (code) => { if (code !== 0) { return reject(stdout || stderr); } resolve(stdout || stderr); }); }); }