1 | import {createWriteStream} from 'node:fs';
|
2 | import {ChildProcess} from 'node:child_process';
|
3 | import {isWritableStream} from 'is-stream';
|
4 |
|
5 | const isExecaChildProcess = target => target instanceof ChildProcess && typeof target.then === 'function';
|
6 |
|
7 | const pipeToTarget = (spawned, streamName, target) => {
|
8 | if (typeof target === 'string') {
|
9 | spawned[streamName].pipe(createWriteStream(target));
|
10 | return spawned;
|
11 | }
|
12 |
|
13 | if (isWritableStream(target)) {
|
14 | spawned[streamName].pipe(target);
|
15 | return spawned;
|
16 | }
|
17 |
|
18 | if (!isExecaChildProcess(target)) {
|
19 | throw new TypeError('The second argument must be a string, a stream or an Execa child process.');
|
20 | }
|
21 |
|
22 | if (!isWritableStream(target.stdin)) {
|
23 | throw new TypeError('The target child process\'s stdin must be available.');
|
24 | }
|
25 |
|
26 | spawned[streamName].pipe(target.stdin);
|
27 | return target;
|
28 | };
|
29 |
|
30 | export const addPipeMethods = spawned => {
|
31 | if (spawned.stdout !== null) {
|
32 | spawned.pipeStdout = pipeToTarget.bind(undefined, spawned, 'stdout');
|
33 | }
|
34 |
|
35 | if (spawned.stderr !== null) {
|
36 | spawned.pipeStderr = pipeToTarget.bind(undefined, spawned, 'stderr');
|
37 | }
|
38 |
|
39 | if (spawned.all !== undefined) {
|
40 | spawned.pipeAll = pipeToTarget.bind(undefined, spawned, 'all');
|
41 | }
|
42 | };
|