pipe.js (1194B)
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 };