From 0b84902fe1cec85482a13723a56f1c63594a1dd6 Mon Sep 17 00:00:00 2001 From: Felipe Barso <77860630+aprendendofelipe@users.noreply.github.com> Date: Mon, 30 Mar 2026 19:34:35 -0300 Subject: [PATCH 1/3] chore: update brace-expansion and picomatch versions in package-lock.json --- package-lock.json | 120 +++++++++++++++++++++++----------------------- 1 file changed, 60 insertions(+), 60 deletions(-) diff --git a/package-lock.json b/package-lock.json index 699d6493..107acabc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3140,9 +3140,9 @@ } }, "node_modules/@npmcli/arborist/node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3396,9 +3396,9 @@ } }, "node_modules/@npmcli/map-workspaces/node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3501,9 +3501,9 @@ } }, "node_modules/@npmcli/package-json/node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4110,9 +4110,9 @@ "license": "MIT" }, "node_modules/@rollup/pluginutils/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -5161,9 +5161,9 @@ } }, "node_modules/@tufjs/models/node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5674,9 +5674,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7082,9 +7082,9 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, "license": "MIT", "dependencies": { @@ -11341,9 +11341,9 @@ } }, "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", "dev": true, "license": "MIT", "dependencies": { @@ -12231,9 +12231,9 @@ } }, "node_modules/glob/node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12385,9 +12385,9 @@ "license": "ISC" }, "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12974,9 +12974,9 @@ } }, "node_modules/ignore-walk/node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14359,9 +14359,9 @@ } }, "node_modules/lerna/node_modules/@nx/devkit/node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14621,9 +14621,9 @@ } }, "node_modules/lerna/node_modules/nx/node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14673,9 +14673,9 @@ } }, "node_modules/lerna/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -14837,9 +14837,9 @@ } }, "node_modules/lint-staged/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -17839,9 +17839,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -20332,9 +20332,9 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -21219,9 +21219,9 @@ } }, "node_modules/vite/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -21343,9 +21343,9 @@ } }, "node_modules/vitest/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -21715,9 +21715,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", "dev": true, "license": "ISC", "bin": { From 103bd773fec290a3b1c7c346cd5363700f5d0a80 Mon Sep 17 00:00:00 2001 From: Felipe Barso <77860630+aprendendofelipe@users.noreply.github.com> Date: Mon, 30 Mar 2026 19:35:15 -0300 Subject: [PATCH 2/3] feat(logger): enhance getLogger to handle silent log level --- packages/infra/src/logger/logger.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/infra/src/logger/logger.js b/packages/infra/src/logger/logger.js index 0c244524..ebdb95f6 100644 --- a/packages/infra/src/logger/logger.js +++ b/packages/infra/src/logger/logger.js @@ -21,6 +21,13 @@ export function getLogger(options = {}) { return pinoLogger; } + const logLevel = process.env.LOG_LEVEL; + + if (logLevel === 'silent') { + const silentLogger = { debug: noop, error: noop, fatal: noop, info: noop, trace: noop, warn: noop, flush: noop }; + return silentLogger; + } + const consoleLogger = { ...console, info: noop, @@ -28,7 +35,7 @@ export function getLogger(options = {}) { flush: noop, }; - if (process.env.LOG_LEVEL === 'info') { + if (['info', 'debug'].includes(logLevel)) { // eslint-disable-next-line no-console consoleLogger.info = console.log; } From 94872b094f1899ad9155da058ddb01b20a4b39c3 Mon Sep 17 00:00:00 2001 From: Felipe Barso <77860630+aprendendofelipe@users.noreply.github.com> Date: Mon, 30 Mar 2026 21:48:39 -0300 Subject: [PATCH 3/3] feat(logger): enhance logger in development mode --- packages/infra/src/logger/logger.js | 146 ++++++++++++++++++++--- packages/infra/src/logger/logger.test.js | 84 ++++++++++++- 2 files changed, 214 insertions(+), 16 deletions(-) diff --git a/packages/infra/src/logger/logger.js b/packages/infra/src/logger/logger.js index ebdb95f6..fb1f6720 100644 --- a/packages/infra/src/logger/logger.js +++ b/packages/infra/src/logger/logger.js @@ -1,10 +1,12 @@ -import { noop } from '@barso/helpers'; +import { deepMerge, noop } from '@barso/helpers'; import pino from 'pino'; import { axiomTransport } from './axiom-transport.js'; export function getLogger(options = {}) { const environment = process.env.VERCEL_ENV || process.env.NODE_ENV; + const logLevel = process.env.LOG_LEVEL; + const level = logLevel || options.level || 'info'; if (['preview', 'production'].includes(environment) || process.env.AXIOM_DATASET) { const pinoLogger = pino( @@ -14,6 +16,7 @@ export function getLogger(options = {}) { environment, ...options.base, }, + level, }, axiomTransport(), ); @@ -21,24 +24,139 @@ export function getLogger(options = {}) { return pinoLogger; } - const logLevel = process.env.LOG_LEVEL; + return createConsoleLogger({ + effectiveMinLocalLogLevel: logLevel || (environment === 'test' ? 'silent' : 'warn'), + level, + }); +} - if (logLevel === 'silent') { - const silentLogger = { debug: noop, error: noop, fatal: noop, info: noop, trace: noop, warn: noop, flush: noop }; - return silentLogger; - } +const LOG_LEVEL_PRIORITIES = { + trace: 10, + debug: 20, + info: 30, + warn: 40, + error: 50, + fatal: 60, + silent: 70, +}; + +const consoleRef = globalThis.console; + +function getConsoleMethod(level) { + const map = { + trace: consoleRef.trace, + debug: consoleRef.debug, + info: consoleRef.log, + warn: consoleRef.warn, + error: consoleRef.error, + fatal: consoleRef.error, + }; + + return map[level] || consoleRef.log; +} + +function createConsoleLogger({ bindings = {}, effectiveMinLocalLogLevel = 'warn', level = 'info' } = {}) { + const currentBindings = { ...bindings }; + + const log = (targetLevel, ...args) => { + if (!isLevelEnabled(targetLevel, effectiveMinLocalLogLevel)) { + return; + } + + const method = getConsoleMethod(targetLevel); + + if (args.length === 0) { + if (Object.keys(currentBindings).length > 0) { + method({ ...currentBindings }); + } - const consoleLogger = { - ...console, - info: noop, - fatal: console.error, + return; + } + + const [firstArg, ...restArgs] = args; + + if (typeof firstArg === 'string') { + if (Object.keys(currentBindings).length > 0) { + method(firstArg, { ...currentBindings }, ...restArgs); + return; + } + + method(firstArg, ...restArgs); + return; + } + + if (firstArg && typeof firstArg === 'object') { + const payload = deepMerge(currentBindings, firstArg); + + if (typeof restArgs[0] === 'string') { + const [msg, ...remaining] = restArgs; + method(msg, payload, ...remaining); + return; + } + + method(payload, ...restArgs); + return; + } + + method(firstArg, ...restArgs); + }; + + const logger = { + get level() { + return level; + }, + set level(nextLevel) { + if (nextLevel in LOG_LEVEL_PRIORITIES) { + level = nextLevel; + } + }, + trace(...args) { + log('trace', ...args); + }, + debug(...args) { + log('debug', ...args); + }, + info(...args) { + log('info', ...args); + }, + warn(...args) { + log('warn', ...args); + }, + error(...args) { + log('error', ...args); + }, + fatal(...args) { + log('fatal', ...args); + }, flush: noop, + bindings() { + return { ...currentBindings }; + }, + setBindings(nextBindings = {}) { + Object.assign(currentBindings, deepMerge(currentBindings, nextBindings)); + }, + child(childBindings = {}) { + return createConsoleLogger({ + effectiveMinLocalLogLevel, + level, + bindings: deepMerge(currentBindings, childBindings), + }); + }, + isLevelEnabled(targetLevel) { + return isLevelEnabled(targetLevel, level); + }, }; - if (['info', 'debug'].includes(logLevel)) { - // eslint-disable-next-line no-console - consoleLogger.info = console.log; + return logger; +} + +function isLevelEnabled(targetLevel, level) { + const targetPriority = LOG_LEVEL_PRIORITIES[targetLevel]; + const currentPriority = LOG_LEVEL_PRIORITIES[level] ?? LOG_LEVEL_PRIORITIES.warn; + + if (targetPriority == null) { + return false; } - return consoleLogger; + return targetPriority >= currentPriority; } diff --git a/packages/infra/src/logger/logger.test.js b/packages/infra/src/logger/logger.test.js index 51611f4a..cdc6132c 100644 --- a/packages/infra/src/logger/logger.test.js +++ b/packages/infra/src/logger/logger.test.js @@ -1,7 +1,7 @@ import { noop } from 'packages/helpers'; const productionLevels = ['info', 'warn', 'error', 'fatal']; -const devLevels = ['trace', 'debug', 'warn', 'error', 'fatal']; +const devLevels = ['warn', 'error', 'fatal']; const onlyDevLevels = ['trace', 'debug']; const consoleLevels = { @@ -59,11 +59,13 @@ describe('infra/logger', () => { describe('Development (via console)', () => { beforeAll(() => { + vi.stubEnv('NODE_ENV', 'development'); vi.stubEnv('VERCEL_ENV', ''); vi.stubEnv('AXIOM_DATASET', ''); }); afterAll(() => { + vi.stubEnv('NODE_ENV', 'test'); vi.stubEnv('AXIOM_DATASET', dataset); }); @@ -87,6 +89,44 @@ describe('infra/logger', () => { expect(logger.flush).not.toThrow(); }); + it('should expose pino-compatible methods', () => { + expect(typeof logger.child).toBe('function'); + expect(typeof logger.bindings).toBe('function'); + expect(typeof logger.setBindings).toBe('function'); + expect(typeof logger.isLevelEnabled).toBe('function'); + }); + + it('should merge child bindings and write to console', () => { + const childLogger = logger.child({ requestId: 'req-1' }); + + childLogger.warn('logger.warn'); + childLogger.error({ message: 'logger.error' }); + + expect(consoleSpy.warn).toHaveBeenCalledWith('logger.warn', { requestId: 'req-1' }); + expect(consoleSpy.error).toHaveBeenCalledWith({ message: 'logger.error', requestId: 'req-1' }); + }); + + it('should set and get bindings', () => { + logger.setBindings({ session: 'abc' }); + + expect(logger.bindings()).toStrictEqual({ session: 'abc' }); + }); + + it('should keep info disabled by default', () => { + logger.info('logger.info'); + + expect(logger.isLevelEnabled('info')).toBe(true); + expect(consoleSpy.info).not.toHaveBeenCalled(); + }); + + it('should keep debug disabled by default', () => { + expect(logger.isLevelEnabled('debug')).toBe(false); + }); + + it('should keep trace disabled by default', () => { + expect(logger.isLevelEnabled('trace')).toBe(false); + }); + describe('with "LOG_LEVEL" set to "info"', () => { beforeAll(() => { vi.stubEnv('LOG_LEVEL', 'info'); @@ -122,7 +162,7 @@ describe('infra/logger', () => { productionLevels.forEach((level) => { expect(stdoutSpy).toHaveBeenCalledWith( expect.stringMatching( - new RegExp(`{"level":\\d+,"time":\\d+,"environment":"test","msg":"logger.${level}"}`), + new RegExp(`{"level":\\d+,"time":\\d+,"environment":"development","msg":"logger.${level}"}`), ), ); }); @@ -200,6 +240,46 @@ describe('infra/logger', () => { it('should not throw error on flush', () => { expect(() => logger.flush()).not.toThrow(); }); + + describe('with "LOG_LEVEL" set to "debug"', () => { + beforeAll(() => { + vi.stubEnv('LOG_LEVEL', 'debug'); + }); + + afterAll(() => { + vi.stubEnv('LOG_LEVEL', ''); + }); + + it('should log debug level', async () => { + logger.debug('logger.debug'); + + await vi.waitUntil(() => mocks.axiomIngest.mock.calls.length === 1); + expect(mocks.axiomIngest).toHaveBeenCalledWith( + dataset, + expect.objectContaining({ level: 'debug', msg: 'logger.debug' }), + ); + }); + }); + }); + + describe('Test runtime defaults to silent', () => { + beforeAll(() => { + vi.stubEnv('NODE_ENV', 'test'); + vi.stubEnv('VERCEL_ENV', ''); + vi.stubEnv('AXIOM_DATASET', ''); + vi.stubEnv('LOG_LEVEL', ''); + }); + + afterAll(() => { + vi.stubEnv('AXIOM_DATASET', dataset); + }); + + it('should silent logger by default', () => { + logger.warn('logger.warn'); + + expect(logger.isLevelEnabled('warn')).toBe(true); + expect(consoleSpy.warn).not.toHaveBeenCalled(); + }); }); describe('With pino options', () => {