From cb96deb517670a90dcb9bb6f1540112d8422f113 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 9 Jan 2026 15:00:31 +0100 Subject: [PATCH] test: harden Windows CI output sanitization (#567) (thanks @erikpr1994) --- test/setup.ts | 56 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 20 deletions(-) diff --git a/test/setup.ts b/test/setup.ts index 039d78298..c02df22be 100644 --- a/test/setup.ts +++ b/test/setup.ts @@ -9,34 +9,50 @@ function sanitizeWindowsCIOutput(text: string): string { } if (process.platform === "win32" && process.env.GITHUB_ACTIONS === "true") { + const decodeUtf8Text = (chunk: unknown): string | null => { + if (typeof chunk === "string") return chunk; + if (Buffer.isBuffer(chunk)) return chunk.toString("utf-8"); + if (chunk instanceof Uint8Array) + return Buffer.from(chunk).toString("utf-8"); + if (chunk instanceof ArrayBuffer) + return Buffer.from(chunk).toString("utf-8"); + if (ArrayBuffer.isView(chunk)) { + return Buffer.from( + chunk.buffer, + chunk.byteOffset, + chunk.byteLength, + ).toString("utf-8"); + } + return null; + }; + const originalStdoutWrite = process.stdout.write.bind(process.stdout); const originalStderrWrite = process.stderr.write.bind(process.stderr); process.stdout.write = ((chunk: unknown, ...args: unknown[]) => { - if (typeof chunk === "string") { - return originalStdoutWrite(sanitizeWindowsCIOutput(chunk), ...args); - } - if (Buffer.isBuffer(chunk)) { - return originalStdoutWrite( - sanitizeWindowsCIOutput(chunk.toString("utf-8")), - ...args, - ); - } - return originalStdoutWrite(chunk as never, ...args); + const text = decodeUtf8Text(chunk); + if (text !== null) + return originalStdoutWrite(sanitizeWindowsCIOutput(text), ...args); + return originalStdoutWrite(chunk as never, ...args); // passthrough }) as typeof process.stdout.write; process.stderr.write = ((chunk: unknown, ...args: unknown[]) => { - if (typeof chunk === "string") { - return originalStderrWrite(sanitizeWindowsCIOutput(chunk), ...args); - } - if (Buffer.isBuffer(chunk)) { - return originalStderrWrite( - sanitizeWindowsCIOutput(chunk.toString("utf-8")), - ...args, - ); - } - return originalStderrWrite(chunk as never, ...args); + const text = decodeUtf8Text(chunk); + if (text !== null) + return originalStderrWrite(sanitizeWindowsCIOutput(text), ...args); + return originalStderrWrite(chunk as never, ...args); // passthrough }) as typeof process.stderr.write; + + const originalWriteSync = fs.writeSync.bind(fs); + fs.writeSync = ((fd: number, data: unknown, ...args: unknown[]) => { + if (fd === 1 || fd === 2) { + const text = decodeUtf8Text(data); + if (text !== null) { + return originalWriteSync(fd, sanitizeWindowsCIOutput(text), ...args); + } + } + return originalWriteSync(fd, data as never, ...(args as never[])); + }) as typeof fs.writeSync; } const originalHome = process.env.HOME;