time-to-botec

Benchmark sampling in different programming languages
Log | Files | Refs | README

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