@likec4/log 1.44.0 → 1.45.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
@@ -14,6 +14,41 @@ declare function getConsoleSink(options?: ConsoleSinkOptions): Sink;
14
14
  declare function getConsoleStderrSink(options?: ConsoleSinkOptions): Sink;
15
15
 
16
16
  declare function loggable(error: unknown): string;
17
+ type NormalizeError<ErrorArg> = ErrorArg extends Error ? ErrorArg : Error;
18
+ /**
19
+ * Appends `message` to `error.message`. If `message` ends with `:` or `:\n`,
20
+ * prepends it instead.
21
+ *
22
+ * Returns `error`. If `error` is not an `Error` instance, it is converted to
23
+ * one.
24
+ *
25
+ * @example
26
+ * ```js
27
+ * wrapErrorMessage(new Error('Message.'), 'Additional message.')
28
+ * // Error: Message.
29
+ * // Additional message.
30
+ *
31
+ * wrapErrorMessage(new Error('Message.'), 'Additional message:')
32
+ * // Error: Additional message: Message.
33
+ *
34
+ * wrapErrorMessage(new Error('Message.'), 'Additional message:\n')
35
+ * // Error: Additional message:
36
+ * // Message.
37
+ *
38
+ * wrapErrorMessage(new Error('Message.'), '')
39
+ * // Error: Message.
40
+ *
41
+ * const invalidError = 'Message.'
42
+ * wrapErrorMessage(invalidError, 'Additional message.')
43
+ * // Error: Message.
44
+ * // Additional message.
45
+ *
46
+ * wrapErrorMessage(new Error(' Message with spaces '), ' Additional message ')
47
+ * // Error: Message with spaces
48
+ * // Additional message
49
+ * ```
50
+ */
51
+ declare function wrapError<ErrorArg>(error: ErrorArg, newMessage: string): NormalizeError<ErrorArg>;
17
52
 
18
53
  declare const logger: _logtape_logtape.Logger;
19
54
 
@@ -26,4 +61,4 @@ declare const logger: _logtape_logtape.Logger;
26
61
  declare function createLogger(subcategory: string | readonly [string] | readonly [string, ...string[]]): _logtape_logtape.Logger;
27
62
  declare function configureLogger<TSinkId extends string, TFilterId extends string>(config?: Partial<Config<TSinkId, TFilterId>>): void;
28
63
 
29
- export { configureLogger, logger as consola, createLogger, errorFromLogRecord, getAnsiColorFormatter, getConsoleSink, getConsoleStderrSink, getMessageOnlyFormatter, getTextFormatter, loggable, logger, logger as rootLogger };
64
+ export { configureLogger, logger as consola, createLogger, errorFromLogRecord, getAnsiColorFormatter, getConsoleSink, getConsoleStderrSink, getMessageOnlyFormatter, getTextFormatter, loggable, logger, logger as rootLogger, wrapError };
package/dist/index.mjs CHANGED
@@ -1302,14 +1302,23 @@ function loggable(error) {
1302
1302
  }
1303
1303
  return safeStringify(error, { indentation: " " });
1304
1304
  }
1305
+ function wrapError(error, newMessage) {
1306
+ return wrapErrorMessage(error, newMessage);
1307
+ }
1305
1308
 
1306
1309
  function gerErrorFromLogRecord(record) {
1307
- const errors = Object.values(record.properties).filter((v) => v instanceof Error).map((err) => {
1308
- const mergedErr = mergeErrorCause(err);
1309
- if (mergedErr.stack) {
1310
- mergedErr.stack = parseStack(mergedErr.stack).join("\n");
1310
+ const errors = Object.entries(record.properties).flatMap(([k, err]) => {
1311
+ if (err instanceof Error) {
1312
+ const mergedErr = mergeErrorCause(err);
1313
+ if (mergedErr.stack) {
1314
+ mergedErr.stack = parseStack(mergedErr.stack).join("\n");
1315
+ }
1316
+ return [mergedErr];
1317
+ }
1318
+ if (k === "error" || k === "err") {
1319
+ return [new Error(`${err}`)];
1311
1320
  }
1312
- return mergedErr;
1321
+ return [];
1313
1322
  });
1314
1323
  if (errors.length === 0) {
1315
1324
  return null;
@@ -1323,7 +1332,7 @@ function errorFromLogRecord(record) {
1323
1332
  }
1324
1333
  return error;
1325
1334
  }
1326
- function appendErrorToMessage(values, color) {
1335
+ function appendErrorToMessage(values, color = false) {
1327
1336
  const error = gerErrorFromLogRecord(values.record);
1328
1337
  if (error) {
1329
1338
  let errorMessge = error.message;
@@ -1446,4 +1455,4 @@ function configureLogger(config) {
1446
1455
  }
1447
1456
  }
1448
1457
 
1449
- export { configureLogger, logger as consola, createLogger, errorFromLogRecord, getAnsiColorFormatter, getConsoleSink, getConsoleStderrSink, getMessageOnlyFormatter, getTextFormatter, loggable, logger, logger as rootLogger };
1458
+ export { configureLogger, logger as consola, createLogger, errorFromLogRecord, getAnsiColorFormatter, getConsoleSink, getConsoleStderrSink, getMessageOnlyFormatter, getTextFormatter, loggable, logger, logger as rootLogger, wrapError };
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.44.0",
5
+ "version": "1.45.0",
6
6
  "bugs": "https://github.com/likec4/likec4/issues",
7
7
  "homepage": "https://likec4.dev",
8
8
  "author": "Denis Davydkov <denis@davydkov.com>",
@@ -38,11 +38,11 @@
38
38
  "@types/node": "~20.19.22",
39
39
  "merge-error-cause": "^5.0.2",
40
40
  "safe-stringify": "^1.2.0",
41
- "std-env": "^3.9.0",
41
+ "std-env": "^3.10.0",
42
42
  "typescript": "5.9.3",
43
43
  "unbuild": "3.5.0",
44
44
  "wrap-error-message": "^3.0.1",
45
- "@likec4/tsconfig": "1.44.0",
45
+ "@likec4/tsconfig": "1.45.0",
46
46
  "@likec4/devops": "1.42.0"
47
47
  },
48
48
  "scripts": {
package/src/formatters.ts CHANGED
@@ -17,14 +17,19 @@ import { indent, parseStack } from './utils'
17
17
 
18
18
  function gerErrorFromLogRecord(record: LogRecord): Error | null {
19
19
  const errors = Object
20
- .values(record.properties)
21
- .filter((v) => v instanceof Error)
22
- .map(err => {
23
- const mergedErr = mergeErrorCause(err)
24
- if (mergedErr.stack) {
25
- mergedErr.stack = parseStack(mergedErr.stack).join('\n')
20
+ .entries(record.properties)
21
+ .flatMap(([k, err]) => {
22
+ if (err instanceof Error) {
23
+ const mergedErr = mergeErrorCause(err)
24
+ if (mergedErr.stack) {
25
+ mergedErr.stack = parseStack(mergedErr.stack).join('\n')
26
+ }
27
+ return [mergedErr]
26
28
  }
27
- return mergedErr
29
+ if (k === 'error' || k === 'err') {
30
+ return [new Error(`${err}`)]
31
+ }
32
+ return []
28
33
  })
29
34
  if (errors.length === 0) {
30
35
  return null
@@ -40,7 +45,7 @@ export function errorFromLogRecord(record: LogRecord): Error | null {
40
45
  return error
41
46
  }
42
47
 
43
- export function appendErrorToMessage(values: FormattedValues, color?: boolean): FormattedValues {
48
+ export function appendErrorToMessage(values: FormattedValues, color = false): FormattedValues {
44
49
  const error = gerErrorFromLogRecord(values.record)
45
50
  if (error) {
46
51
  let errorMessge = error.message
package/src/index.ts CHANGED
@@ -34,7 +34,10 @@ export {
34
34
  logger as rootLogger,
35
35
  }
36
36
 
37
- export { loggable } from './utils'
37
+ export {
38
+ loggable,
39
+ wrapError,
40
+ } from './utils'
38
41
 
39
42
  /**
40
43
  * Get a child logger with the given subcategory.
package/src/utils.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import mergeErrorCause from 'merge-error-cause'
2
2
  import safeStringify from 'safe-stringify'
3
+ import wrapErrorMessage from 'wrap-error-message'
3
4
 
4
5
  export const parseStack = (stack: string): string[] => {
5
6
  const lines = stack
@@ -36,3 +37,42 @@ export function loggable(error: unknown): string {
36
37
  }
37
38
  return safeStringify(error, { indentation: '\t' })
38
39
  }
40
+
41
+ type NormalizeError<ErrorArg> = ErrorArg extends Error ? ErrorArg : Error
42
+
43
+ /**
44
+ * Appends `message` to `error.message`. If `message` ends with `:` or `:\n`,
45
+ * prepends it instead.
46
+ *
47
+ * Returns `error`. If `error` is not an `Error` instance, it is converted to
48
+ * one.
49
+ *
50
+ * @example
51
+ * ```js
52
+ * wrapErrorMessage(new Error('Message.'), 'Additional message.')
53
+ * // Error: Message.
54
+ * // Additional message.
55
+ *
56
+ * wrapErrorMessage(new Error('Message.'), 'Additional message:')
57
+ * // Error: Additional message: Message.
58
+ *
59
+ * wrapErrorMessage(new Error('Message.'), 'Additional message:\n')
60
+ * // Error: Additional message:
61
+ * // Message.
62
+ *
63
+ * wrapErrorMessage(new Error('Message.'), '')
64
+ * // Error: Message.
65
+ *
66
+ * const invalidError = 'Message.'
67
+ * wrapErrorMessage(invalidError, 'Additional message.')
68
+ * // Error: Message.
69
+ * // Additional message.
70
+ *
71
+ * wrapErrorMessage(new Error(' Message with spaces '), ' Additional message ')
72
+ * // Error: Message with spaces
73
+ * // Additional message
74
+ * ```
75
+ */
76
+ export function wrapError<ErrorArg>(error: ErrorArg, newMessage: string): NormalizeError<ErrorArg> {
77
+ return wrapErrorMessage(error, newMessage)
78
+ }