@likec4/log 1.36.1 → 1.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -7,6 +7,11 @@ declare function getMessageOnlyFormatter(): TextFormatter;
7
7
  declare function getTextFormatter(options?: TextFormatterOptions): TextFormatter;
8
8
  declare function getAnsiColorFormatter(options?: AnsiColorFormatterOptions): TextFormatter;
9
9
  declare function getConsoleSink(options?: ConsoleSinkOptions): Sink;
10
+ /**
11
+ * Creates a console sink that writes to stderr.
12
+ * (MCP protocol requires stderr to be used for logging)
13
+ */
14
+ declare function getConsoleStderrSink(options?: ConsoleSinkOptions): Sink;
10
15
 
11
16
  declare function loggable(error: unknown): string;
12
17
 
@@ -18,6 +23,6 @@ declare const logger: _logtape_logtape.Logger;
18
23
  * @returns The child logger.
19
24
  */
20
25
  declare function createLogger(subcategory: string | readonly [string] | readonly [string, ...string[]]): _logtape_logtape.Logger;
21
- declare function configureLogger<TSinkId extends string, TFilterId extends string>(config?: Config<TSinkId, TFilterId>): void;
26
+ declare function configureLogger<TSinkId extends string, TFilterId extends string>(config?: Partial<Config<TSinkId, TFilterId>>): void;
22
27
 
23
- export { configureLogger, logger as consola, createLogger, errorFromLogRecord, getAnsiColorFormatter, getConsoleSink, getMessageOnlyFormatter, getTextFormatter, loggable, logger, logger as rootLogger };
28
+ export { configureLogger, logger as consola, createLogger, errorFromLogRecord, getAnsiColorFormatter, getConsoleSink, getConsoleStderrSink, getMessageOnlyFormatter, getTextFormatter, loggable, logger, logger as rootLogger };
package/dist/index.mjs CHANGED
@@ -1402,6 +1402,18 @@ function getConsoleSink(options) {
1402
1402
  ...options
1403
1403
  });
1404
1404
  }
1405
+ function getConsoleStderrSink(options) {
1406
+ const formatter = options?.formatter ?? getTextFormatter();
1407
+ return (record) => {
1408
+ const args = formatter(record);
1409
+ if (typeof args === "string") {
1410
+ const msg = args.replace(/\r?\n$/, "");
1411
+ console.error(msg);
1412
+ } else {
1413
+ console.error(...args);
1414
+ }
1415
+ };
1416
+ }
1405
1417
 
1406
1418
  const logger = getLogger("likec4");
1407
1419
  function createLogger(subcategory) {
@@ -1413,11 +1425,11 @@ function configureLogger(config) {
1413
1425
  configureWasCalled = true;
1414
1426
  const sinks = config?.sinks ?? {};
1415
1427
  configureSync({
1428
+ reset: true,
1416
1429
  ...config,
1417
1430
  sinks: {
1418
- ...sinks,
1419
- // @ts-expect-error console is not a valid sink id
1420
- console: sinks["console"] ?? getConsoleSink()
1431
+ console: getConsoleSink(),
1432
+ ...sinks
1421
1433
  },
1422
1434
  loggers: [
1423
1435
  { category: ["logtape", "meta"], sinks: ["console"], lowestLevel: "warning" },
@@ -1435,4 +1447,4 @@ function configureLogger(config) {
1435
1447
  }
1436
1448
  }
1437
1449
 
1438
- export { configureLogger, logger as consola, createLogger, errorFromLogRecord, getAnsiColorFormatter, getConsoleSink, getMessageOnlyFormatter, getTextFormatter, loggable, logger, logger as rootLogger };
1450
+ export { configureLogger, logger as consola, createLogger, errorFromLogRecord, getAnsiColorFormatter, getConsoleSink, getConsoleStderrSink, getMessageOnlyFormatter, getTextFormatter, loggable, logger, logger as rootLogger };
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@likec4/log",
3
3
  "description": "Shared interface for logging",
4
4
  "license": "MIT",
5
- "version": "1.36.1",
5
+ "version": "1.38.0",
6
6
  "bugs": "https://github.com/likec4/likec4/issues",
7
7
  "homepage": "https://likec4.dev",
8
8
  "author": "Denis Davydkov <denis@davydkov.com>",
@@ -42,7 +42,7 @@
42
42
  "typescript": "5.9.2",
43
43
  "unbuild": "3.5.0",
44
44
  "wrap-error-message": "^3.0.1",
45
- "@likec4/tsconfig": "1.36.1"
45
+ "@likec4/tsconfig": "1.38.0"
46
46
  },
47
47
  "scripts": {
48
48
  "typecheck": "tsc -b --verbose",
package/src/formatters.ts CHANGED
@@ -129,3 +129,20 @@ export function getConsoleSink(options?: ConsoleSinkOptions): Sink {
129
129
  ...options,
130
130
  })
131
131
  }
132
+
133
+ /**
134
+ * Creates a console sink that writes to stderr.
135
+ * (MCP protocol requires stderr to be used for logging)
136
+ */
137
+ export function getConsoleStderrSink(options?: ConsoleSinkOptions): Sink {
138
+ const formatter = options?.formatter ?? getTextFormatter()
139
+ return (record: LogRecord) => {
140
+ const args = formatter(record)
141
+ if (typeof args === 'string') {
142
+ const msg = args.replace(/\r?\n$/, '')
143
+ console.error(msg)
144
+ } else {
145
+ console.error(...args)
146
+ }
147
+ }
148
+ }
package/src/index.ts CHANGED
@@ -20,6 +20,7 @@ export {
20
20
  // formatRecord,
21
21
  getAnsiColorFormatter,
22
22
  getConsoleSink,
23
+ getConsoleStderrSink,
23
24
  getMessageOnlyFormatter,
24
25
  getTextFormatter,
25
26
  } from './formatters'
@@ -52,24 +53,24 @@ export function createLogger(subcategory: string | readonly [string] | readonly
52
53
  let configureWasCalled = false
53
54
 
54
55
  export function configureLogger<TSinkId extends string, TFilterId extends string>(
55
- config?: Config<TSinkId, TFilterId>,
56
+ config?: Partial<Config<TSinkId, TFilterId>>,
56
57
  ) {
57
58
  try {
58
59
  configureWasCalled = true
59
60
  const sinks = config?.sinks ?? {}
60
61
  configureLogtape<any, any>({
62
+ reset: true,
61
63
  ...config,
62
64
  sinks: {
65
+ console: getConsoleSink(),
63
66
  ...sinks,
64
- // @ts-expect-error console is not a valid sink id
65
- console: sinks['console'] ?? getConsoleSink(),
66
67
  },
67
68
  loggers: [
68
- { category: ['logtape', 'meta'], sinks: ['console' as any], lowestLevel: 'warning' },
69
+ { category: ['logtape', 'meta'], sinks: ['console'], lowestLevel: 'warning' },
69
70
  ...(config?.loggers ?? [
70
71
  {
71
72
  category: 'likec4',
72
- sinks: ['console' as any],
73
+ sinks: ['console'],
73
74
  lowestLevel: 'debug',
74
75
  },
75
76
  ]),