From bb113e10cbed23817771725a13d59ba457e866b4 Mon Sep 17 00:00:00 2001 From: neverland Date: Wed, 15 Jul 2026 14:25:14 +0800 Subject: [PATCH 1/2] chore(deps): downgrade pnpm to 11.11.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 87c4c72..48c4935 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "strip-ansi": "^7.2.0", "typescript": "^7.0.2" }, - "packageManager": "pnpm@11.13.0", + "packageManager": "pnpm@11.11.0", "engines": { "node": "^20.19.0 || >=22.12.0" }, From a53bec7e1c6fa97a4e07b1337acf677746706b0f Mon Sep 17 00:00:00 2001 From: neverland Date: Wed, 15 Jul 2026 14:25:25 +0800 Subject: [PATCH 2/2] fix(logger): align multiline logs with prefixes --- src/createLogger.ts | 16 ++++------------ tests/logger.test.ts | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/createLogger.ts b/src/createLogger.ts index cdc1e7d..e9f368c 100644 --- a/src/createLogger.ts +++ b/src/createLogger.ts @@ -3,8 +3,6 @@ import { LOG_LEVEL, LOG_TYPES } from './constants.js'; import { isErrorStackMessage, stripAnsi } from './utils.js'; import type { Options, LogMessage, Logger, LogMethods } from './types.js'; -const LABEL_WIDTH = 7; - const normalizeErrorMessage = (err: Error) => { if (err.stack) { const [rawName, ...rest] = err.stack.split('\n'); @@ -38,8 +36,8 @@ export const createLogger = (options: Options = {}) => { } const label = 'label' in logType ? logType.label : ''; + const header = label ? (prefix ? `${label} ${prefix}` : label) : prefix; let text = ''; - const hasLabel = Boolean(label); const isErrorObject = message instanceof Error; @@ -63,14 +61,8 @@ export const createLogger = (options: Options = {}) => { text = `${message}`; } - if (prefix) { - text = `${prefix} ${text}`; - } - - if (alignMultiline && hasLabel && !isErrorObject && text.includes('\n')) { - const indent = ' '.repeat( - LABEL_WIDTH + 1 + (prefix ? stripAnsi(prefix).length + 1 : 0), - ); + if (alignMultiline && header && !isErrorObject && text.includes('\n')) { + const indent = ' '.repeat(stripAnsi(header).length + 1); const skipStack = level === 'error'; text = text .split('\n') @@ -83,7 +75,7 @@ export const createLogger = (options: Options = {}) => { } const method = level === 'error' || level === 'warn' ? level : 'log'; - console[method](label ? `${label} ${text}` : text, ...args); + console[method](header ? `${header} ${text}` : text, ...args); }; const logger = { diff --git a/tests/logger.test.ts b/tests/logger.test.ts index 3a7481e..1af881d 100644 --- a/tests/logger.test.ts +++ b/tests/logger.test.ts @@ -304,6 +304,22 @@ describe('logger', () => { ).toMatchSnapshot(); }); + test('should align multi-line log messages to prefix column', () => { + console.log = rs.fn(); + + const alignLogger = createLogger({ + alignMultiline: true, + prefix: '[web]', + }); + + alignLogger.log(`First line +Second line`); + + expect(stripAnsi((console.log as Mock).mock.calls[0][0].toString())) + .toBe(`[web] First line + Second line`); + }); + test('should keep error stacks top-aligned when alignMultiline is enabled', () => { console.error = rs.fn();