From d55253db209f200898ec2ef305dfde757d5700c3 Mon Sep 17 00:00:00 2001 From: Jean Burellier Date: Sun, 22 Mar 2026 10:30:59 +0100 Subject: [PATCH] [vitest-pool-workers] feat: allow user to configure logLevel on vitest-pool-workers --- .changeset/vpw-log-level.md | 21 +++++++ .../src/pool/cloudflare-pool-worker.ts | 4 ++ .../vitest-pool-workers/src/pool/config.ts | 7 +++ .../vitest-pool-workers/src/pool/index.ts | 25 +++++++- .../test/log-level.test.ts | 58 +++++++++++++++++++ 5 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 .changeset/vpw-log-level.md create mode 100644 packages/vitest-pool-workers/test/log-level.test.ts diff --git a/.changeset/vpw-log-level.md b/.changeset/vpw-log-level.md new file mode 100644 index 000000000000..5bbce9934ab3 --- /dev/null +++ b/.changeset/vpw-log-level.md @@ -0,0 +1,21 @@ +--- +"@cloudflare/vitest-pool-workers": minor +--- + +Add configurable `logLevel` option to control `[vpw:*]` pool log verbosity + +The pool logger was previously hardcoded to `VERBOSE`, causing debug messages like `[vpw:debug] Adding compatibility flag...` to always appear with no way to suppress them. A new `logLevel` option lets you control this: + +```ts +import { cloudflareTest } from "@cloudflare/vitest-pool-workers"; + +export default defineConfig({ + plugins: [ + cloudflareTest({ + logLevel: "warn", // "none" | "error" | "warn" | "info" | "debug" | "verbose" + }), + ], +}); +``` + +The default is now `"info"`, which hides debug/verbose messages while still showing informational, warning, and error output. diff --git a/packages/vitest-pool-workers/src/pool/cloudflare-pool-worker.ts b/packages/vitest-pool-workers/src/pool/cloudflare-pool-worker.ts index 50b3ba141657..35b57cd8d3de 100644 --- a/packages/vitest-pool-workers/src/pool/cloudflare-pool-worker.ts +++ b/packages/vitest-pool-workers/src/pool/cloudflare-pool-worker.ts @@ -13,6 +13,7 @@ import { getProjectMiniflare, getRunnerName, maybeGetResolvedMainPath, + setPoolLogLevel, structuredSerializableParse, structuredSerializableStringify, } from "."; @@ -76,6 +77,9 @@ export class CloudflarePoolWorker implements PoolWorker { this.options.project, resolvedPoolOptions ); + if (this.parsedPoolOptions.logLevel) { + setPoolLogLevel(this.parsedPoolOptions.logLevel); + } this.main = maybeGetResolvedMainPath( this.options.project, this.parsedPoolOptions diff --git a/packages/vitest-pool-workers/src/pool/config.ts b/packages/vitest-pool-workers/src/pool/config.ts index 5e6452739134..1f052a118e04 100644 --- a/packages/vitest-pool-workers/src/pool/config.ts +++ b/packages/vitest-pool-workers/src/pool/config.ts @@ -36,6 +36,13 @@ const WorkersPoolOptionsSchema = z.object({ * bindings. */ main: z.ostring(), + /** + * Controls the verbosity of `[vpw:*]` pool log messages. + * Defaults to `"info"`. + */ + logLevel: z + .enum(["none", "error", "warn", "info", "debug", "verbose"]) + .default("info"), /** * Enables remote bindings to access remote resources configured * with `remote: true` in the wrangler configuration file. diff --git a/packages/vitest-pool-workers/src/pool/index.ts b/packages/vitest-pool-workers/src/pool/index.ts index 2259668fd487..52b99c0f3516 100644 --- a/packages/vitest-pool-workers/src/pool/index.ts +++ b/packages/vitest-pool-workers/src/pool/index.ts @@ -63,7 +63,30 @@ export function structuredSerializableParse(value: string): unknown { } // Log for informational pool messages -const log = new Log(LogLevel.VERBOSE, { prefix: "vpw" }); +let log = new Log(LogLevel.INFO, { prefix: "vpw" }); + +function logLevelFromString(level: string): LogLevel { + switch (level) { + case "none": + return LogLevel.NONE; + case "error": + return LogLevel.ERROR; + case "warn": + return LogLevel.WARN; + case "info": + return LogLevel.INFO; + case "debug": + return LogLevel.DEBUG; + case "verbose": + return LogLevel.VERBOSE; + default: + return LogLevel.INFO; + } +} + +export function setPoolLogLevel(level: string): void { + log = new Log(logLevelFromString(level), { prefix: "vpw" }); +} // Log for Miniflare instances, used for user code warnings/errors const mfLog = new Log(LogLevel.WARN); diff --git a/packages/vitest-pool-workers/test/log-level.test.ts b/packages/vitest-pool-workers/test/log-level.test.ts new file mode 100644 index 000000000000..80e72a4a1f67 --- /dev/null +++ b/packages/vitest-pool-workers/test/log-level.test.ts @@ -0,0 +1,58 @@ +import dedent from "ts-dedent"; +import { test, vitestConfig } from "./helpers"; + +const simpleTest = dedent` + import { it, expect } from "vitest"; + it("passes", () => { + expect(true).toBe(true); + }); +`; + +test("default logLevel suppresses debug messages", async ({ + expect, + seed, + vitestRun, +}) => { + await seed({ + "vitest.config.mts": vitestConfig(), + "index.test.ts": simpleTest, + }); + + const result = await vitestRun(); + await expect(result.exitCode).resolves.toBe(0); + // Default is "info": info messages should appear, debug should not + expect(result.stdout).toContain("[vpw:info]"); + expect(result.stdout).not.toContain("[vpw:debug]"); +}); + +test('logLevel "verbose" shows debug messages', async ({ + expect, + seed, + vitestRun, +}) => { + await seed({ + "vitest.config.mts": vitestConfig({ logLevel: "verbose" }), + "index.test.ts": simpleTest, + }); + + const result = await vitestRun(); + await expect(result.exitCode).resolves.toBe(0); + expect(result.stdout).toContain("[vpw:debug]"); + expect(result.stdout).toContain("[vpw:info]"); +}); + +test('logLevel "warn" suppresses info and debug messages', async ({ + expect, + seed, + vitestRun, +}) => { + await seed({ + "vitest.config.mts": vitestConfig({ logLevel: "warn" }), + "index.test.ts": simpleTest, + }); + + const result = await vitestRun(); + await expect(result.exitCode).resolves.toBe(0); + expect(result.stdout).not.toContain("[vpw:info]"); + expect(result.stdout).not.toContain("[vpw:debug]"); +});