diff --git a/lib/stdio/encoding.js b/lib/stdio/encoding.js index 8f0d16324e..3a24a2ff6e 100644 --- a/lib/stdio/encoding.js +++ b/lib/stdio/encoding.js @@ -5,21 +5,22 @@ import {isUint8Array} from './utils.js'; // Apply the `encoding` option using an implicit generator. // This encodes the final output of `stdout`/`stderr`. export const handleStreamsEncoding = (stdioStreams, {encoding}, isSync) => { - if (stdioStreams[0].direction === 'input' || IGNORED_ENCODINGS.has(encoding) || isSync) { - return stdioStreams.map(stdioStream => ({...stdioStream, encoding})); - } - - const transform = encodingEndGenerator.bind(undefined, encoding); - const objectMode = stdioStreams.findLast(({type}) => type === 'generator')?.value.readableObjectMode === true; - return [ - ...stdioStreams, - { - ...stdioStreams[0], - type: 'generator', - value: {transform, binary: true, readableObjectMode: objectMode, writableObjectMode: objectMode}, - encoding: 'buffer', - }, - ]; + const newStdioStreams = stdioStreams.map(stdioStream => ({...stdioStream, encoding})); + return newStdioStreams[0].direction === 'input' || IGNORED_ENCODINGS.has(encoding) || isSync + ? newStdioStreams + : [ + ...newStdioStreams, + { + ...newStdioStreams[0], + type: 'generator', + value: { + transform: encodingEndGenerator.bind(undefined, encoding), + binary: true, + objectMode: 'previous', + }, + encoding: 'buffer', + }, + ]; }; // eslint-disable-next-line unicorn/text-encoding-identifier-case diff --git a/lib/stdio/generator.js b/lib/stdio/generator.js index 462eac8997..bf6ce58e4d 100644 --- a/lib/stdio/generator.js +++ b/lib/stdio/generator.js @@ -36,7 +36,7 @@ The same applies to the first output's generator's `writableObjectMode`. */ const getOutputObjectModes = (objectMode, index, newGenerators) => { const writableObjectMode = index !== 0 && newGenerators[index - 1].value.readableObjectMode; - const readableObjectMode = objectMode; + const readableObjectMode = objectMode === 'previous' ? writableObjectMode : objectMode; return {writableObjectMode, readableObjectMode}; }; diff --git a/lib/stdio/handle.js b/lib/stdio/handle.js index 7162e88eae..be2f8f28dd 100644 --- a/lib/stdio/handle.js +++ b/lib/stdio/handle.js @@ -13,8 +13,8 @@ export const handleInput = (addProperties, options, isSync) => { const stdioStreamsGroups = [[...stdinStreams, ...handleInputOptions(options)], ...otherStreamsGroups] .map(stdioStreams => validateStreams(stdioStreams)) .map(stdioStreams => addStreamDirection(stdioStreams)) - .map(stdioStreams => normalizeGenerators(stdioStreams)) .map(stdioStreams => handleStreamsEncoding(stdioStreams, options, isSync)) + .map(stdioStreams => normalizeGenerators(stdioStreams)) .map(stdioStreams => addStreamsProperties(stdioStreams, addProperties)); options.stdio = transformStdio(stdioStreamsGroups); return stdioStreamsGroups;