mirror of
https://github.com/EthanShoeDev/fressh.git
synced 2026-01-11 06:12:51 +00:00
44 lines
1.1 KiB
TypeScript
44 lines
1.1 KiB
TypeScript
import * as child from 'child_process';
|
|
import * as path from 'path';
|
|
|
|
export const cmd = (
|
|
command: string,
|
|
options: { relativeCwd?: string; stdio?: child.StdioOptions } = {},
|
|
) =>
|
|
new Promise<{ exitCode: number; stdout: string; stderr: string }>(
|
|
(resolve, reject) => {
|
|
console.log(`cmd: ${command}`);
|
|
const proc = child.spawn(command, {
|
|
shell: true,
|
|
stdio: options.stdio ?? 'inherit',
|
|
cwd: options.relativeCwd
|
|
? path.resolve(process.cwd(), options.relativeCwd)
|
|
: process.cwd(),
|
|
});
|
|
|
|
let stdout = '';
|
|
let stderr = '';
|
|
|
|
proc.stdout?.on('data', (data: unknown) => {
|
|
stdout += String(data);
|
|
});
|
|
proc.stderr?.on('data', (data: unknown) => {
|
|
stderr += String(data);
|
|
});
|
|
|
|
process.once('SIGTERM', () => {
|
|
proc.kill('SIGTERM');
|
|
});
|
|
process.once('SIGINT', () => {
|
|
proc.kill('SIGINT');
|
|
});
|
|
proc.on('close', (code) => {
|
|
console.log(`cmd: ${command} closed with code ${code}`);
|
|
resolve({ exitCode: code ?? 0, stdout, stderr });
|
|
});
|
|
proc.on('error', (error) => {
|
|
reject(error);
|
|
});
|
|
},
|
|
);
|