diff --git a/.changeset/nuxt-silent-nitro-replace.md b/.changeset/nuxt-silent-nitro-replace.md new file mode 100644 index 00000000..37705438 --- /dev/null +++ b/.changeset/nuxt-silent-nitro-replace.md @@ -0,0 +1,5 @@ +--- +"evlog": patch +--- + +Fix Nuxt `silent` option not suppressing built-in console output in production builds on evlog 2.11+. The Nuxt module now bakes evlog options into `nitro.options.replace.__EVLOG_CONFIG__` (matching standalone Nitro modules), so the Nitro plugin receives `silent: true` and no longer emits an unenriched log line before your `evlog:drain` hook runs. diff --git a/packages/evlog/src/nuxt/module.ts b/packages/evlog/src/nuxt/module.ts index 2debbb94..894ba587 100644 --- a/packages/evlog/src/nuxt/module.ts +++ b/packages/evlog/src/nuxt/module.ts @@ -361,7 +361,10 @@ export default defineNuxtModule({ const evlogForNitro = nuxt.options.runtimeConfig.evlog ?? options if (evlogForNitro !== undefined && typeof evlogForNitro === 'object') { - process.env.__EVLOG_CONFIG = JSON.stringify(evlogForNitro) + const serialized = JSON.stringify(evlogForNitro) + nitroConfig.replace = nitroConfig.replace || {} + nitroConfig.replace.__EVLOG_CONFIG__ = serialized + process.env.__EVLOG_CONFIG = serialized } }) nuxt.options.runtimeConfig.public.evlog = { diff --git a/packages/evlog/test/nitro/module-paths.test.ts b/packages/evlog/test/nitro/module-paths.test.ts index 507c3320..507e1796 100644 --- a/packages/evlog/test/nitro/module-paths.test.ts +++ b/packages/evlog/test/nitro/module-paths.test.ts @@ -23,7 +23,7 @@ describe('nitro modules avoid backslash paths', () => { it('nitro v2 module pushes POSIX-style plugin and errorHandler paths', () => { const nitro = makeNitroStub() - nitroV2Module({ env: { service: 'test' } }).setup(nitro as never) + nitroV2Module({ env: { service: 'test' }, silent: true }).setup(nitro as never) expect(nitro.options.plugins).toHaveLength(1) expect(nitro.options.plugins[0]).not.toMatch(/\\/) @@ -32,6 +32,9 @@ describe('nitro modules avoid backslash paths', () => { expect(nitro.options.errorHandler).toBeTypeOf('string') expect(nitro.options.errorHandler).not.toMatch(/\\/) expect(nitro.options.errorHandler).toMatch(/\/nitro\/errorHandler$/) + + const { replace } = nitro.options as { replace?: Record } + expect(JSON.parse(replace!.__EVLOG_CONFIG__)).toEqual({ env: { service: 'test' }, silent: true }) }) it('nitro v3 module pushes POSIX-style plugin and errorHandler paths', () => { diff --git a/packages/evlog/test/shared/nitroConfigBridge.test.ts b/packages/evlog/test/shared/nitroConfigBridge.test.ts index 4ae1faba..a2e1e02f 100644 --- a/packages/evlog/test/shared/nitroConfigBridge.test.ts +++ b/packages/evlog/test/shared/nitroConfigBridge.test.ts @@ -104,6 +104,17 @@ describe('nitroConfigBridge — active runtime', () => { expect(importSpy).not.toHaveBeenCalled() }) + it('preserves silent from inlined __EVLOG_CONFIG__', async () => { + globalThis.__EVLOG_CONFIG__ = { silent: true, pretty: false } + const { bridge, importSpy } = await loadBridgeWithMocks() + bridge.setActiveNitroRuntime('v2') + + const config = await bridge.resolveEvlogConfigForNitroPlugin() + + expect(config?.silent).toBe(true) + expect(importSpy).not.toHaveBeenCalled() + }) + it('prefers __EVLOG_CONFIG__ over process.env.__EVLOG_CONFIG', async () => { globalThis.__EVLOG_CONFIG__ = { env: { service: 'svc-inline' } } process.env.__EVLOG_CONFIG = JSON.stringify({ env: { service: 'svc-env' } })