From 67940c8ced17bdfc1680f9f49477e9194365ddb7 Mon Sep 17 00:00:00 2001 From: Yusuke Wada Date: Fri, 16 Oct 2026 02:01:01 +0900 Subject: [PATCH] fix(vite): drop Vite's notes that say nothing about the app --- src/utils/vite.test.ts | 16 +++++++++++++++- src/utils/vite.ts | 15 ++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/utils/vite.test.ts b/src/utils/vite.test.ts index bd827a5..e5680df 100644 --- a/src/utils/vite.test.ts +++ b/src/utils/vite.test.ts @@ -1,6 +1,6 @@ import { afterEach, describe, expect, it, vi } from 'vitest' import { join } from 'node:path' -import { isVoidProject, loadVoidApp, startVite } from './vite' +import { isViteNoise, isVoidProject, loadVoidApp, startVite } from './vite' const FIXTURE = join(import.meta.dirname, 'fixtures/vite') const VOID_FIXTURE = join(import.meta.dirname, 'fixtures/void') @@ -62,3 +62,17 @@ describe('startVite', () => { expect(isVoidProject()).toBe(false) }) }) + +describe('isViteNoise', () => { + it("drops Vite's own notes and keeps the app logs", () => { + expect(isViteNoise('Re-optimizing dependencies because vite config has changed')).toBe(true) + expect(isViteNoise('Default inspector port 9229 not available, using 9232 instead')).toBe(true) + expect( + isViteNoise( + 'Sourcemap for "/a/node_modules/x/index.mjs" points to a source file outside its package: "/a/src/x.ts"' + ) + ).toBe(true) + expect(isViteNoise('GET /users 200')).toBe(false) + expect(isViteNoise('Error: something broke')).toBe(false) + }) +}) diff --git a/src/utils/vite.ts b/src/utils/vite.ts index 0a054bb..975078e 100644 --- a/src/utils/vite.ts +++ b/src/utils/vite.ts @@ -95,12 +95,25 @@ const loadVite = async (): Promise => { * that a Vite plugin builds (with virtual modules) can take requests. * The server listens on a random port on 127.0.0.1 only. */ +const VITE_NOISE = [ + /^Sourcemap for .* points to (a source file outside its package|missing source files)/, + /^Re-optimizing dependencies because/, + /^Default inspector port \d+ not available/, +] + +/** Vite's own notes that say nothing about the app */ +export const isViteNoise = (msg: string): boolean => VITE_NOISE.some((noise) => noise.test(msg)) + export const startVite = async (): Promise => { const { createLogger, createServer: createViteServer } = await loadVite() // Keep the app logs off stdout, which is for the JSON output. An app // in workerd logs through this logger; an app in this process (e.g. // @hono/vite-dev-server) calls console.log, so `request` wraps it. - const toStderr = (msg: string) => console.error(msg) + const toStderr = (msg: string) => { + if (!isViteNoise(msg)) { + console.error(msg) + } + } // Plugins may log with console.log while the server starts (Void does) const vite = await logsToStderr(() => createViteServer({