|
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'); |
|
} |
|
}; |
|
|