UNPKG

1.93 kBPlain TextView Raw
1import * as childProcess from "child_process";
2import {Logger, optional} from "@simplism/core";
3import ProcessEnv = NodeJS.ProcessEnv;
4
5export async function spawnAsync(logger: Logger, cmds: string[], opts?: { env?: ProcessEnv; cwd?: string }): Promise<{ message: string; errorMessage: string }> {
6 return await new Promise<{ message: string; errorMessage: string }>((resolve, reject) => {
7 const worker = childProcess.spawn(cmds[0], cmds.slice(1), {
8 shell: true,
9 stdio: "pipe",
10 env: optional(opts, o => o.env),
11 cwd: optional(opts, o => o.cwd) || process.cwd()
12 });
13
14 let resultMessage = "";
15 worker.stdout.on("data", data => {
16 resultMessage += data.toString();
17 if (resultMessage.includes("\n")) {
18 const newMessages = resultMessage.split("\n").map(item => `${item.replace(/\r/g, "")}`).slice(0, -1).filter(item => !!item);
19 for (const newMessage of newMessages) {
20 logger.log(newMessage);
21 }
22 resultMessage = resultMessage.split("\n").slice(-1)[0].replace(/\r/g, "") || "";
23 }
24 });
25
26 let errorMessage = "";
27 worker.stderr.on("data", data => {
28 errorMessage += data.toString();
29 if (errorMessage.includes("\n")) {
30 const newMessages = errorMessage.split("\n").map(item => `${item.replace(/\r/g, "")}`).slice(0, -1).filter(item => !!item);
31 for (const newMessage of newMessages) {
32 logger.log(newMessage);
33 }
34 errorMessage = errorMessage.split("\n").slice(-1)[0].replace(/\r/g, "") || "";
35 }
36 });
37
38 worker.on("close", code => {
39 if (errorMessage.replace(/\r/g, "")) {
40 logger.error(errorMessage);
41 }
42 if (resultMessage.replace(/\r/g, "")) {
43 logger.log(resultMessage);
44 }
45
46 if (code === 0) {
47 resolve();
48 }
49 else {
50 reject(new Error());
51 }
52 });
53 });
54}
\No newline at end of file