Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | 1x 1x 1x | import childProcess from "child_process"; export type ChildProcess = childProcess.ChildProcess; interface SpawnLogFns { onLog?: (msg: string) => void; onError?: (msg: string) => void; } const spawn = ( command: string, args: string[], options: childProcess.SpawnOptions, { onLog = () => {}, onError = () => {} }: SpawnLogFns ) => { let complete = false; let code = 0; const child = childProcess.spawn(command, args, options); child.on("error", (err) => { onError(err.toString()); }); child.stdout?.on("data", (childData: string) => { const lines = childData.toString().split("\n"); lines.forEach((line, lineIndex) => { Iif (line.length === 0 && lineIndex === lines.length - 1) { return; } onLog && onLog(line); }); }); child.stderr?.on("data", (childData: string) => { const lines = childData.toString().split("\n"); lines.forEach((line, lineIndex) => { Iif (line.length === 0 && lineIndex === lines.length - 1) { return; } onError && onError(line); }); }); child.on("close", async (childCode) => { complete = true; code = childCode ?? 0; }); return { child, completed: new Promise<void>((resolve, reject) => { const interval = setInterval(() => { Iif (complete) { clearInterval(interval); if (code === 0) { resolve(); } else { reject(code); } } }, 10); }), }; }; export default spawn; |