






















@@ -13,6 +13,11 @@ type RunResult = {
1313stderr: string;
1414};
151516+type OutputCapture = {
17+text: string;
18+truncatedChars: number;
19+};
20+1621type PnpmCommand = {
1722args: string[];
1823command: string;
@@ -29,11 +34,33 @@ type ResolvePnpmCommandOptions = {
2934platform?: NodeJS.Platform;
3035};
313637+const COMMAND_OUTPUT_MAX_CHARS = 512 * 1024;
38+3239function resolveEnvValue(env: NodeJS.ProcessEnv, name: string): string | undefined {
3340const key = Object.keys(env).find((candidate) => candidate.toLowerCase() === name.toLowerCase());
3441return key === undefined ? undefined : env[key];
3542}
364344+export function appendBoundedReproOutput(
45+capture: OutputCapture,
46+chunk: unknown,
47+maxChars = COMMAND_OUTPUT_MAX_CHARS,
48+): OutputCapture {
49+const nextText = capture.text + String(chunk);
50+if (nextText.length <= maxChars) {
51+return { text: nextText, truncatedChars: capture.truncatedChars };
52+}
53+const truncatedChars = capture.truncatedChars + nextText.length - maxChars;
54+return { text: nextText.slice(-maxChars), truncatedChars };
55+}
56+57+function formatBoundedReproOutput(capture: OutputCapture): string {
58+if (capture.truncatedChars === 0) {
59+return capture.text;
60+}
61+return `[output truncated ${capture.truncatedChars} chars; showing tail]\n${capture.text}`;
62+}
63+3764export function resolveZaiFallbackPnpmCommand(
3865args: string[],
3966options: ResolvePnpmCommandOptions = {},
@@ -83,25 +110,31 @@ async function runCommand(
83110stdio: ["ignore", "pipe", "pipe"],
84111windowsVerbatimArguments: command.windowsVerbatimArguments,
85112});
86-let stdout = "";
87-let stderr = "";
113+let stdout: OutputCapture = { text: "", truncatedChars: 0 };
114+let stderr: OutputCapture = { text: "", truncatedChars: 0 };
88115child.stdout.on("data", (chunk) => {
89116const text = String(chunk);
90-stdout += text;
117+stdout = appendBoundedReproOutput(stdout, text);
91118process.stdout.write(text);
92119});
93120child.stderr.on("data", (chunk) => {
94121const text = String(chunk);
95-stderr += text;
122+stderr = appendBoundedReproOutput(stderr, text);
96123process.stderr.write(text);
97124});
98125child.on("error", (err) => reject(err));
99126child.on("close", (code, signal) => {
127+const result = {
128+ code,
129+ signal,
130+stdout: formatBoundedReproOutput(stdout),
131+stderr: formatBoundedReproOutput(stderr),
132+};
100133if (code === 0) {
101-resolve({ code, signal, stdout, stderr });
134+resolve(result);
102135return;
103136}
104-resolve({ code, signal, stdout, stderr });
137+resolve(result);
105138const summary = signal
106139 ? `${label} exited with signal ${signal}`
107140 : `${label} exited with code ${code}`;
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。