@@ -13,22 +13,23 @@ export const transformOutputSync = ({fileDescriptors, syncResult: {output}, opti
1313 return { output : Array . from ( { length : 3 } ) } ;
1414 }
1515
16- const state = { } ;
1716 const outputFiles = new Set ( ) ;
17+ // Transforms, `verbose` and file writes apply to a single file descriptor each, so their errors must not affect the other ones
18+ const errors = [ ] ;
1819 const transformedOutput = output . map ( ( result , fdNumber ) =>
1920 transformOutputResultSync ( {
2021 result,
2122 fileDescriptors,
2223 fdNumber,
23- state ,
24+ errors ,
2425 outputFiles,
2526 verboseInfo,
2627 } , options ) ) ;
27- return { output : transformedOutput , ... state } ;
28+ return { output : transformedOutput , error : errors . find ( error => error !== undefined ) } ;
2829} ;
2930
3031const transformOutputResultSync = (
31- { result, fileDescriptors, fdNumber, state , outputFiles, verboseInfo} ,
32+ { result, fileDescriptors, fdNumber, errors , outputFiles, verboseInfo} ,
3233 { buffer, encoding, lines, stripFinalNewline, maxBuffer} ,
3334) => {
3435 if ( result === null ) {
@@ -38,7 +39,8 @@ const transformOutputResultSync = (
3839 const truncatedResult = truncateMaxBufferSync ( result , fdNumber , { maxBuffer, buffer} ) ;
3940 const uint8ArrayResult = bufferToUint8Array ( truncatedResult ) ;
4041 const { stdioItems, objectMode} = fileDescriptors [ fdNumber ] ;
41- const chunks = runOutputGeneratorsSync ( [ uint8ArrayResult ] , stdioItems , encoding , state ) ;
42+ // Empty output must not be passed as a chunk: with a binary encoding, no line is split, so transforms would wrongly run on it
43+ const { chunks, error : transformError } = runOutputGeneratorsSync ( uint8ArrayResult . length === 0 ? [ ] : [ uint8ArrayResult ] , stdioItems , encoding ) ;
4244 const { serializedResult, finalResult = serializedResult } = serializeChunks ( {
4345 chunks,
4446 objectMode,
@@ -48,37 +50,38 @@ const transformOutputResultSync = (
4850 fdNumber,
4951 } ) ;
5052
51- logOutputSync ( {
53+ const logError = logOutputSync ( {
5254 serializedResult,
5355 fdNumber,
54- state,
5556 verboseInfo,
5657 encoding,
5758 stdioItems,
5859 objectMode,
5960 } ) ;
6061
62+ const error = transformError ?? logError ;
63+ errors . push ( error ) ;
64+
6165 const returnedResult = buffer [ fdNumber ] ? finalResult : undefined ;
6266
6367 try {
64- if ( state . error === undefined ) {
68+ if ( error === undefined ) {
6569 writeToFiles ( serializedResult , stdioItems , outputFiles ) ;
6670 }
6771
6872 return returnedResult ;
69- } catch ( error ) {
70- state . error = error ;
73+ } catch ( writeError ) {
74+ errors . push ( writeError ) ;
7175 return returnedResult ;
7276 }
7377} ;
7478
7579// Applies transform generators to `stdout`/`stderr`
76- const runOutputGeneratorsSync = ( chunks , stdioItems , encoding , state ) => {
80+ const runOutputGeneratorsSync = ( chunks , stdioItems , encoding ) => {
7781 try {
78- return runGeneratorsSync ( chunks , stdioItems , encoding , false ) ;
82+ return { chunks : runGeneratorsSync ( chunks , stdioItems , encoding , false ) } ;
7983 } catch ( error ) {
80- state . error = error ;
81- return chunks ;
84+ return { chunks, error} ;
8285 }
8386} ;
8487
@@ -102,7 +105,7 @@ const serializeChunks = ({chunks, objectMode, encoding, lines, stripFinalNewline
102105 return { serializedResult} ;
103106} ;
104107
105- const logOutputSync = ( { serializedResult, fdNumber, state , verboseInfo, encoding, stdioItems, objectMode} ) => {
108+ const logOutputSync = ( { serializedResult, fdNumber, verboseInfo, encoding, stdioItems, objectMode} ) => {
106109 if ( ! shouldLogOutput ( {
107110 stdioItems,
108111 encoding,
@@ -117,7 +120,7 @@ const logOutputSync = ({serializedResult, fdNumber, state, verboseInfo, encoding
117120 try {
118121 logLinesSync ( linesArray , fdNumber , verboseInfo ) ;
119122 } catch ( error ) {
120- state . error ??= error ;
123+ return error ;
121124 }
122125} ;
123126
0 commit comments