| import {createWriteStream} from 'node:fs'; | |
| import {ChildProcess} from 'node:child_process'; | |
| import {isWritableStream} from 'is-stream'; | |
| const isExecaChildProcess = target => target instanceof ChildProcess && typeof target.then === 'function'; | |
| const pipeToTarget = (spawned, streamName, target) => { | |
| if (typeof target === 'string') { | |
| spawned[streamName].pipe(createWriteStream(target)); | |
| return spawned; | |
| } | |
| if (isWritableStream(target)) { | |
| spawned[streamName].pipe(target); | |
| return spawned; | |
| } | |
| if (!isExecaChildProcess(target)) { | |
| throw new TypeError('The second argument must be a string, a stream or an Execa child process.'); | |
| } | |
| if (!isWritableStream(target.stdin)) { | |
| throw new TypeError('The target child process\'s stdin must be available.'); | |
| } | |
| spawned[streamName].pipe(target.stdin); | |
| return target; | |
| }; | |
| export const addPipeMethods = spawned => { | |
| if (spawned.stdout !== null) { | |
| spawned.pipeStdout = pipeToTarget.bind(undefined, spawned, 'stdout'); | |
| } | |
| if (spawned.stderr !== null) { | |
| spawned.pipeStderr = pipeToTarget.bind(undefined, spawned, 'stderr'); | |
| } | |
| if (spawned.all !== undefined) { | |
| spawned.pipeAll = pipeToTarget.bind(undefined, spawned, 'all'); | |
| } | |
| }; | |