




















@@ -1,4 +1,5 @@
11import { beforeEach, describe, expect, it, vi } from "vitest";
2+import { note } from "../../terminal/note.js";
23import { formatCliCommand } from "../command-format.js";
34import { ensureConfigReady, testApi } from "./config-guard.js";
45@@ -39,10 +40,20 @@ function plainErrorCalls(runtime: ReturnType<typeof makeRuntime>): string[] {
39404041async function withCapturedStdout(run: () => Promise<void>): Promise<string> {
4142const writes: string[] = [];
42-const writeSpy = vi.spyOn(process.stdout, "write").mockImplementation(((chunk: unknown) => {
43-writes.push(String(chunk));
44-return true;
45-}) as typeof process.stdout.write);
43+const writeSpy = vi
44+.spyOn(process.stdout, "write")
45+.mockImplementation(
46+((
47+chunk: unknown,
48+encodingOrCallback?: BufferEncoding | ((error?: Error | null) => void),
49+callback?: (error?: Error | null) => void,
50+) => {
51+writes.push(String(chunk));
52+const done = typeof encodingOrCallback === "function" ? encodingOrCallback : callback;
53+done?.();
54+return true;
55+}) as typeof process.stdout.write,
56+);
4657try {
4758await run();
4859return writes.join("");
@@ -212,9 +223,9 @@ describe("ensureConfigReady", () => {
212223expect(loadAndMaybeMigrateDoctorConfigMock).toHaveBeenCalledTimes(1);
213224});
214225215-it("prevents preflight stdout noise when suppression is enabled", async () => {
226+it("prevents preflight note noise when suppression is enabled", async () => {
216227loadAndMaybeMigrateDoctorConfigMock.mockImplementation(async () => {
217-process.stdout.write("Doctor warnings\n");
228+note("Doctor warnings", "Config warnings");
218229return {
219230snapshot: makeSnapshot(),
220231baseConfig: {},
@@ -226,9 +237,9 @@ describe("ensureConfigReady", () => {
226237expect(output).not.toContain("Doctor warnings");
227238});
228239229-it("allows preflight stdout noise when suppression is not enabled", async () => {
240+it("allows preflight note noise when suppression is not enabled", async () => {
230241loadAndMaybeMigrateDoctorConfigMock.mockImplementation(async () => {
231-process.stdout.write("Doctor warnings\n");
242+note("Doctor warnings", "Config warnings");
232243return {
233244snapshot: makeSnapshot(),
234245baseConfig: {},
@@ -239,4 +250,39 @@ describe("ensureConfigReady", () => {
239250});
240251expect(output).toContain("Doctor warnings");
241252});
253+254+it("does not suppress unrelated concurrent stdout writes while suppressing preflight notes", async () => {
255+let releasePreflight: (() => void) | undefined;
256+let preflightStarted: (() => void) | undefined;
257+const preflightStartedPromise = new Promise<void>((resolve) => {
258+preflightStarted = resolve;
259+});
260+const releasePreflightPromise = new Promise<void>((resolve) => {
261+releasePreflight = resolve;
262+});
263+loadAndMaybeMigrateDoctorConfigMock.mockImplementation(async () => {
264+note("Doctor warnings", "Config warnings");
265+preflightStarted?.();
266+await releasePreflightPromise;
267+return {
268+snapshot: makeSnapshot(),
269+baseConfig: {},
270+};
271+});
272+273+let callbackCalled = false;
274+const output = await withCapturedStdout(async () => {
275+const ready = runEnsureConfigReady(["message"], true);
276+await preflightStartedPromise;
277+process.stdout.write("Concurrent output\n", () => {
278+callbackCalled = true;
279+});
280+releasePreflight?.();
281+await ready;
282+});
283+284+expect(output).toContain("Concurrent output");
285+expect(output).not.toContain("Doctor warnings");
286+expect(callbackCalled).toBe(true);
287+});
242288});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。