@ls-stack/utils 1.2.1 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/runShellCmd.d.ts +11 -4
- package/dist/runShellCmd.js +34 -11
- package/dist/runShellCmd.js.map +1 -1
- package/package.json +1 -1
package/dist/runShellCmd.d.ts
CHANGED
|
@@ -5,11 +5,18 @@ type CmdResult = {
|
|
|
5
5
|
stdout: string;
|
|
6
6
|
stderr: string;
|
|
7
7
|
};
|
|
8
|
-
|
|
8
|
+
type RunCmdOptions = {
|
|
9
9
|
mock?: CmdResult;
|
|
10
|
-
silent?: boolean;
|
|
10
|
+
silent?: boolean | 'timeOnly';
|
|
11
11
|
cwd?: string;
|
|
12
|
-
|
|
12
|
+
throwOnError?: boolean;
|
|
13
|
+
};
|
|
14
|
+
declare function runCmd(label: string | null, command: string | string[], { mock, silent, throwOnError, cwd }?: RunCmdOptions): Promise<CmdResult>;
|
|
13
15
|
declare function concurrentCmd(label: string, cmd: string, onResult: (result: CmdResult) => void): Promise<() => void>;
|
|
16
|
+
declare function runCmdUnwrap(label: string | null, command: string | string[], { silent, }?: {
|
|
17
|
+
silent?: boolean | 'timeOnly';
|
|
18
|
+
}): Promise<string>;
|
|
19
|
+
declare function runCmdSilent(command: string | string[]): Promise<CmdResult>;
|
|
20
|
+
declare function runCmdSilentUnwrap(command: string | string[]): Promise<string>;
|
|
14
21
|
|
|
15
|
-
export { concurrentCmd, runCmd };
|
|
22
|
+
export { concurrentCmd, runCmd, runCmdSilent, runCmdSilentUnwrap, runCmdUnwrap };
|
package/dist/runShellCmd.js
CHANGED
|
@@ -1,19 +1,17 @@
|
|
|
1
1
|
// src/runShellCmd.ts
|
|
2
2
|
import { spawn } from "child_process";
|
|
3
3
|
process.env.FORCE_COLOR = true;
|
|
4
|
-
function runCmd(label, command, {
|
|
5
|
-
mock,
|
|
6
|
-
silent,
|
|
7
|
-
cwd = process.cwd()
|
|
8
|
-
} = {}) {
|
|
4
|
+
function runCmd(label, command, { mock, silent, throwOnError, cwd = process.cwd() } = {}) {
|
|
9
5
|
if (mock)
|
|
10
6
|
return Promise.resolve(mock);
|
|
11
|
-
if (label && !silent) {
|
|
7
|
+
if (label && (!silent || silent === "timeOnly")) {
|
|
12
8
|
console.log(`----${label}----`);
|
|
13
9
|
console.time("\u2705");
|
|
14
10
|
}
|
|
15
11
|
return new Promise((resolve) => {
|
|
16
|
-
const [cmd = "", ...args] = Array.isArray(command) ? command
|
|
12
|
+
const [cmd = "", ...args] = Array.isArray(command) ? command.flatMap(
|
|
13
|
+
(item) => item.startsWith("$") ? item.replace("$", "").split(" ") : item
|
|
14
|
+
) : command.split(" ");
|
|
17
15
|
const child = spawn(cmd, args, {
|
|
18
16
|
cwd
|
|
19
17
|
});
|
|
@@ -36,12 +34,23 @@ function runCmd(label, command, {
|
|
|
36
34
|
});
|
|
37
35
|
child.on("close", (code) => {
|
|
38
36
|
const hasError = code !== 0;
|
|
39
|
-
if (!silent
|
|
37
|
+
if (!silent || silent === "timeOnly") {
|
|
40
38
|
if (!hasError) {
|
|
41
39
|
console.timeEnd("\u2705");
|
|
42
40
|
}
|
|
43
41
|
console.log("\n");
|
|
44
42
|
}
|
|
43
|
+
if (throwOnError && hasError) {
|
|
44
|
+
if (silent) {
|
|
45
|
+
if (label) {
|
|
46
|
+
console.log(`----${label}----`);
|
|
47
|
+
} else {
|
|
48
|
+
console.trace();
|
|
49
|
+
}
|
|
50
|
+
console.error(stderr);
|
|
51
|
+
}
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
45
54
|
resolve({ label, out, stderr, stdout, error: hasError });
|
|
46
55
|
});
|
|
47
56
|
});
|
|
@@ -50,9 +59,9 @@ async function concurrentCmd(label, cmd, onResult) {
|
|
|
50
59
|
const start = Date.now();
|
|
51
60
|
const result = await runCmd(label, cmd, { silent: true });
|
|
52
61
|
onResult(result);
|
|
53
|
-
const
|
|
62
|
+
const elapsedSeconds = (Date.now() - start) / 1e3;
|
|
54
63
|
console.log(
|
|
55
|
-
`${result.error ? "\u{1F534}" : "\u2705"} ${result.label} (${
|
|
64
|
+
`${result.error ? "\u{1F534}" : "\u2705"} ${result.label} (${elapsedSeconds.toFixed(
|
|
56
65
|
1
|
|
57
66
|
)}s)`
|
|
58
67
|
);
|
|
@@ -64,8 +73,22 @@ async function concurrentCmd(label, cmd, onResult) {
|
|
|
64
73
|
}
|
|
65
74
|
};
|
|
66
75
|
}
|
|
76
|
+
async function runCmdUnwrap(label, command, {
|
|
77
|
+
silent
|
|
78
|
+
} = {}) {
|
|
79
|
+
return (await runCmd(label, command, { silent, throwOnError: true })).stdout;
|
|
80
|
+
}
|
|
81
|
+
function runCmdSilent(command) {
|
|
82
|
+
return runCmd(null, command, { silent: true });
|
|
83
|
+
}
|
|
84
|
+
function runCmdSilentUnwrap(command) {
|
|
85
|
+
return runCmdUnwrap(null, command, { silent: true });
|
|
86
|
+
}
|
|
67
87
|
export {
|
|
68
88
|
concurrentCmd,
|
|
69
|
-
runCmd
|
|
89
|
+
runCmd,
|
|
90
|
+
runCmdSilent,
|
|
91
|
+
runCmdSilentUnwrap,
|
|
92
|
+
runCmdUnwrap
|
|
70
93
|
};
|
|
71
94
|
//# sourceMappingURL=runShellCmd.js.map
|
package/dist/runShellCmd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runShellCmd.ts"],"sourcesContent":["/* eslint-disable no-console -- we need console here to print errors */\n\ntype CmdResult = {\n label: string | null;\n out: string;\n error: boolean;\n stdout: string;\n stderr: string;\n};\n\nimport { spawn } from 'child_process';\n\n(process.env as any).FORCE_COLOR = true;\n\nexport function runCmd(\n label: string | null,\n command: string | string[],\n {
|
|
1
|
+
{"version":3,"sources":["../src/runShellCmd.ts"],"sourcesContent":["/* eslint-disable no-console -- we need console here to print errors */\n\ntype CmdResult = {\n label: string | null;\n out: string;\n error: boolean;\n stdout: string;\n stderr: string;\n};\n\nimport { spawn } from 'child_process';\n\n(process.env as any).FORCE_COLOR = true;\n\ntype RunCmdOptions = {\n mock?: CmdResult;\n silent?: boolean | 'timeOnly';\n cwd?: string;\n throwOnError?: boolean;\n};\n\nexport function runCmd(\n label: string | null,\n command: string | string[],\n { mock, silent, throwOnError, cwd = process.cwd() }: RunCmdOptions = {},\n): Promise<CmdResult> {\n if (mock) return Promise.resolve(mock);\n\n if (label && (!silent || silent === 'timeOnly')) {\n console.log(`----${label}----`);\n console.time('✅');\n }\n\n return new Promise((resolve) => {\n const [cmd = '', ...args] =\n Array.isArray(command) ?\n command.flatMap((item) =>\n item.startsWith('$') ? item.replace('$', '').split(' ') : item,\n )\n : command.split(' ');\n const child = spawn(cmd, args, {\n cwd,\n });\n\n let stdout = '';\n let stderr = '';\n let out = '';\n\n child.stdout.on('data', (data) => {\n stdout += String(data);\n out += String(data);\n\n if (!silent) {\n console.log(String(data));\n }\n });\n\n child.stderr.on('data', (data) => {\n stderr += String(data);\n out += String(data);\n\n if (!silent) {\n console.log(String(data));\n }\n });\n\n child.on('close', (code) => {\n const hasError = code !== 0;\n\n if (!silent || silent === 'timeOnly') {\n if (!hasError) {\n console.timeEnd('✅');\n }\n\n console.log('\\n');\n }\n\n if (throwOnError && hasError) {\n if (silent) {\n if (label) {\n console.log(`----${label}----`);\n } else {\n console.trace();\n }\n console.error(stderr);\n }\n\n process.exit(1);\n }\n\n resolve({ label, out, stderr, stdout, error: hasError });\n });\n });\n}\n\nexport async function concurrentCmd(\n label: string,\n cmd: string,\n onResult: (result: CmdResult) => void,\n) {\n const start = Date.now();\n\n const result = await runCmd(label, cmd, { silent: true });\n\n onResult(result);\n\n const elapsedSeconds = (Date.now() - start) / 1000;\n\n console.log(\n `${result.error ? '🔴' : '✅'} ${result.label} (${elapsedSeconds.toFixed(\n 1,\n )}s)`,\n );\n\n return () => {\n if (result.error) {\n console.log(`❌ ${result.label} errors:`);\n console.log(result.out);\n console.log('\\n');\n }\n };\n}\n\nexport async function runCmdUnwrap(\n label: string | null,\n command: string | string[],\n {\n silent,\n }: {\n silent?: boolean | 'timeOnly';\n } = {},\n) {\n return (await runCmd(label, command, { silent, throwOnError: true })).stdout;\n}\n\nexport function runCmdSilent(command: string | string[]) {\n return runCmd(null, command, { silent: true });\n}\n\nexport function runCmdSilentUnwrap(command: string | string[]) {\n return runCmdUnwrap(null, command, { silent: true });\n}\n"],"mappings":";AAUA,SAAS,aAAa;AAErB,QAAQ,IAAY,cAAc;AAS5B,SAAS,OACd,OACA,SACA,EAAE,MAAM,QAAQ,cAAc,MAAM,QAAQ,IAAI,EAAE,IAAmB,CAAC,GAClD;AACpB,MAAI;AAAM,WAAO,QAAQ,QAAQ,IAAI;AAErC,MAAI,UAAU,CAAC,UAAU,WAAW,aAAa;AAC/C,YAAQ,IAAI,OAAO,KAAK,MAAM;AAC9B,YAAQ,KAAK,QAAG;AAAA,EAClB;AAEA,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,CAAC,MAAM,IAAI,GAAG,IAAI,IACtB,MAAM,QAAQ,OAAO,IACnB,QAAQ;AAAA,MAAQ,CAAC,SACf,KAAK,WAAW,GAAG,IAAI,KAAK,QAAQ,KAAK,EAAE,EAAE,MAAM,GAAG,IAAI;AAAA,IAC5D,IACA,QAAQ,MAAM,GAAG;AACrB,UAAM,QAAQ,MAAM,KAAK,MAAM;AAAA,MAC7B;AAAA,IACF,CAAC;AAED,QAAI,SAAS;AACb,QAAI,SAAS;AACb,QAAI,MAAM;AAEV,UAAM,OAAO,GAAG,QAAQ,CAAC,SAAS;AAChC,gBAAU,OAAO,IAAI;AACrB,aAAO,OAAO,IAAI;AAElB,UAAI,CAAC,QAAQ;AACX,gBAAQ,IAAI,OAAO,IAAI,CAAC;AAAA,MAC1B;AAAA,IACF,CAAC;AAED,UAAM,OAAO,GAAG,QAAQ,CAAC,SAAS;AAChC,gBAAU,OAAO,IAAI;AACrB,aAAO,OAAO,IAAI;AAElB,UAAI,CAAC,QAAQ;AACX,gBAAQ,IAAI,OAAO,IAAI,CAAC;AAAA,MAC1B;AAAA,IACF,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,YAAM,WAAW,SAAS;AAE1B,UAAI,CAAC,UAAU,WAAW,YAAY;AACpC,YAAI,CAAC,UAAU;AACb,kBAAQ,QAAQ,QAAG;AAAA,QACrB;AAEA,gBAAQ,IAAI,IAAI;AAAA,MAClB;AAEA,UAAI,gBAAgB,UAAU;AAC5B,YAAI,QAAQ;AACV,cAAI,OAAO;AACT,oBAAQ,IAAI,OAAO,KAAK,MAAM;AAAA,UAChC,OAAO;AACL,oBAAQ,MAAM;AAAA,UAChB;AACA,kBAAQ,MAAM,MAAM;AAAA,QACtB;AAEA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,cAAQ,EAAE,OAAO,KAAK,QAAQ,QAAQ,OAAO,SAAS,CAAC;AAAA,IACzD,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAsB,cACpB,OACA,KACA,UACA;AACA,QAAM,QAAQ,KAAK,IAAI;AAEvB,QAAM,SAAS,MAAM,OAAO,OAAO,KAAK,EAAE,QAAQ,KAAK,CAAC;AAExD,WAAS,MAAM;AAEf,QAAM,kBAAkB,KAAK,IAAI,IAAI,SAAS;AAE9C,UAAQ;AAAA,IACN,GAAG,OAAO,QAAQ,cAAO,QAAG,IAAI,OAAO,KAAK,KAAK,eAAe;AAAA,MAC9D;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,MAAM;AACX,QAAI,OAAO,OAAO;AAChB,cAAQ,IAAI,UAAK,OAAO,KAAK,UAAU;AACvC,cAAQ,IAAI,OAAO,GAAG;AACtB,cAAQ,IAAI,IAAI;AAAA,IAClB;AAAA,EACF;AACF;AAEA,eAAsB,aACpB,OACA,SACA;AAAA,EACE;AACF,IAEI,CAAC,GACL;AACA,UAAQ,MAAM,OAAO,OAAO,SAAS,EAAE,QAAQ,cAAc,KAAK,CAAC,GAAG;AACxE;AAEO,SAAS,aAAa,SAA4B;AACvD,SAAO,OAAO,MAAM,SAAS,EAAE,QAAQ,KAAK,CAAC;AAC/C;AAEO,SAAS,mBAAmB,SAA4B;AAC7D,SAAO,aAAa,MAAM,SAAS,EAAE,QAAQ,KAAK,CAAC;AACrD;","names":[]}
|