diff --git a/packages/build/src/log/logger.js b/packages/build/src/log/logger.js index 0e3756e45d..893c8bc99d 100644 --- a/packages/build/src/log/logger.js +++ b/packages/build/src/log/logger.js @@ -113,11 +113,21 @@ export const logWarningSubHeader = function (logs, string, opts) { const reduceLogLines = function (lines) { return lines .map((input) => { + if (input instanceof Error) { + return `${input.message} ${input.stack}` + } + if (typeof input === 'object') { - return JSON.stringify(input) + try { + return JSON.stringify(input) + } catch { + // Value could not be serialized to JSON, so we return the string + // representation. + return String(input) + } } - return input.toString() + return String(input) }) .join(' ') } diff --git a/packages/build/tests/unit/logger/snapshots/tests.js.md b/packages/build/tests/unit/logger/snapshots/tests.js.md new file mode 100644 index 0000000000..0fccaec4ff --- /dev/null +++ b/packages/build/tests/unit/logger/snapshots/tests.js.md @@ -0,0 +1,20 @@ +# Snapshot report for `packages/build/tests/unit/logger/tests.js` + +The actual snapshot is saved in `tests.js.snap`. + +Generated by [AVA](https://avajs.dev). + +## System logger writes to file descriptor + +> Snapshot 1 + + `Hello world {"object":true,"problem":false} Something went wrong Error: Something went wrong␊ + STACK TRACE␊ + ` + +## System logger does not write to file descriptor when `debug: true` + +> Snapshot 1 + + `Hello world {"object":true,"problem":false} Something went wrong Error: Something went wrong␊ + STACK TRACE` diff --git a/packages/build/tests/unit/logger/snapshots/tests.js.snap b/packages/build/tests/unit/logger/snapshots/tests.js.snap new file mode 100644 index 0000000000..a62a8308d4 Binary files /dev/null and b/packages/build/tests/unit/logger/snapshots/tests.js.snap differ diff --git a/packages/build/tests/unit/logger/tests.js b/packages/build/tests/unit/logger/tests.js index 9d31e088af..efe62fb93b 100644 --- a/packages/build/tests/unit/logger/tests.js +++ b/packages/build/tests/unit/logger/tests.js @@ -4,6 +4,7 @@ import test from 'ava' import tmp from 'tmp-promise' import { getSystemLogger } from '../../../src/log/logger.js' +import { normalizeOutput } from '../../helpers/normalize.js' test('System logger writes to file descriptor', async (t) => { const { fd, cleanup, path } = await tmp.file() @@ -11,10 +12,13 @@ test('System logger writes to file descriptor', async (t) => { stdout: [], } const systemLog = getSystemLogger(mockProcess, false, fd) + const error = new Error('Something went wrong') - systemLog('Hello world', { object: true, problem: false }) + systemLog('Hello world', { object: true, problem: false }, error) - t.is(await fs.readFile(path, 'utf8'), 'Hello world {"object":true,"problem":false}\n') + const output = normalizeOutput(await fs.readFile(path, 'utf8')) + + t.snapshot(output) t.is(mockProcess.stdout.length, 0) await cleanup() @@ -26,11 +30,14 @@ test('System logger does not write to file descriptor when `debug: true`', async stdout: [], } const systemLog = getSystemLogger(mockProcess, true, fd) + const error = new Error('Something went wrong') + + systemLog('Hello world', { object: true, problem: false }, error) - systemLog('Hello world', { object: true, problem: false }) + const output = normalizeOutput(mockProcess.stdout[0]) t.is(mockProcess.stdout.length, 1) - t.is(mockProcess.stdout[0], 'Hello world {"object":true,"problem":false}') + t.snapshot(output) t.is(await fs.readFile(path, 'utf8'), '') await cleanup()