1 | import * as childProcess from "child_process";
|
2 | import {Logger, optional} from "@simplism/core";
|
3 | import ProcessEnv = NodeJS.ProcessEnv;
|
4 |
|
5 | export 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 |