-
-
Notifications
You must be signed in to change notification settings - Fork 203
/
output-sync.js
102 lines (88 loc) · 2.86 KB
/
output-sync.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import {writeFileSync} from 'node:fs';
import {shouldLogOutput, logLinesSync} from '../verbose/output.js';
import {runGeneratorsSync} from '../transform/generator.js';
import {splitLinesSync} from '../transform/split.js';
import {joinToString, joinToUint8Array, bufferToUint8Array} from '../utils/uint-array.js';
import {FILE_TYPES} from '../stdio/type.js';
import {truncateMaxBufferSync} from './max-buffer.js';
// Apply `stdout`/`stderr` options, after spawning, in sync mode
export const transformOutputSync = ({fileDescriptors, syncResult: {output}, options, isMaxBuffer, verboseInfo}) => {
if (output === null) {
return {output: Array.from({length: 3})};
}
const state = {};
const transformedOutput = output.map((result, fdNumber) =>
transformOutputResultSync({
result,
fileDescriptors,
fdNumber,
state,
isMaxBuffer,
verboseInfo,
}, options));
return {output: transformedOutput, ...state};
};
const transformOutputResultSync = ({result, fileDescriptors, fdNumber, state, isMaxBuffer, verboseInfo}, {buffer, encoding, lines, stripFinalNewline, maxBuffer}) => {
if (result === null) {
return;
}
const truncatedResult = truncateMaxBufferSync(result, isMaxBuffer, maxBuffer);
const uint8ArrayResult = bufferToUint8Array(truncatedResult);
const {stdioItems, objectMode} = fileDescriptors[fdNumber];
const chunks = runOutputGeneratorsSync([uint8ArrayResult], stdioItems, encoding, state);
const {serializedResult, finalResult = serializedResult} = serializeChunks({
chunks,
objectMode,
encoding,
lines,
stripFinalNewline,
fdNumber,
});
if (shouldLogOutput({
stdioItems,
encoding,
verboseInfo,
fdNumber,
})) {
const linesArray = splitLinesSync(serializedResult, false, objectMode);
logLinesSync(linesArray, verboseInfo);
}
const returnedResult = buffer[fdNumber] ? finalResult : undefined;
try {
if (state.error === undefined) {
writeToFiles(serializedResult, stdioItems);
}
return returnedResult;
} catch (error) {
state.error = error;
return returnedResult;
}
};
const runOutputGeneratorsSync = (chunks, stdioItems, encoding, state) => {
try {
return runGeneratorsSync(chunks, stdioItems, encoding, false);
} catch (error) {
state.error = error;
return chunks;
}
};
const serializeChunks = ({chunks, objectMode, encoding, lines, stripFinalNewline, fdNumber}) => {
if (objectMode) {
return {serializedResult: chunks};
}
if (encoding === 'buffer') {
return {serializedResult: joinToUint8Array(chunks)};
}
const serializedResult = joinToString(chunks, encoding);
if (lines[fdNumber]) {
return {serializedResult, finalResult: splitLinesSync(serializedResult, !stripFinalNewline[fdNumber], objectMode)};
}
return {serializedResult};
};
const writeToFiles = (serializedResult, stdioItems) => {
for (const {type, path} of stdioItems) {
if (FILE_TYPES.has(type)) {
writeFileSync(path, serializedResult);
}
}
};