@fabasoad/sarif-to-slack 1.4.0 → 1.4.2

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.
Files changed (76) hide show
  1. package/.github/workflows/release.yml +18 -9
  2. package/.github/workflows/security.yml +1 -1
  3. package/.github/workflows/send-sarif-to-slack.yml +10 -2
  4. package/.github/workflows/unit-tests.yml +3 -3
  5. package/.pre-commit-config.yaml +5 -5
  6. package/.tool-versions +1 -1
  7. package/Makefile +13 -13
  8. package/api-extractor.json +1 -1
  9. package/biome.json +1 -1
  10. package/dist/SarifToSlackClient.d.ts.map +1 -1
  11. package/dist/SarifToSlackClient.js +7 -7
  12. package/dist/index.cjs +71 -115
  13. package/dist/index.d.ts +3 -7
  14. package/dist/model/Finding.js +4 -5
  15. package/dist/model/SlackMessage.d.ts.map +1 -1
  16. package/dist/model/SlackMessage.js +1 -1
  17. package/dist/model/color/Color.d.ts.map +1 -1
  18. package/dist/model/color/ColorIdentification.js +7 -7
  19. package/dist/processors/ProcessorFactory.js +1 -1
  20. package/dist/representations/CompactGroupByRepresentation.js +1 -1
  21. package/dist/representations/Representation.js +1 -1
  22. package/dist/representations/RepresentationFactory.js +1 -1
  23. package/dist/representations/TableGroupByRunPerLevelRepresentation.d.ts.map +1 -1
  24. package/dist/representations/TableGroupByRunPerSeverityRepresentation.d.ts.map +1 -1
  25. package/dist/representations/TableGroupByRunRepresentation.d.ts.map +1 -1
  26. package/dist/representations/TableGroupBySarifPerLevelRepresentation.d.ts.map +1 -1
  27. package/dist/representations/TableGroupBySarifPerSeverityRepresentation.d.ts.map +1 -1
  28. package/dist/representations/TableGroupBySarifRepresentation.d.ts.map +1 -1
  29. package/dist/representations/TableGroupByToolNamePerLevelRepresentation.d.ts.map +1 -1
  30. package/dist/representations/TableGroupByToolNamePerSeverityRepresentation.d.ts.map +1 -1
  31. package/dist/representations/TableGroupByToolNameRepresentation.d.ts.map +1 -1
  32. package/dist/representations/TableGroupRepresentation.d.ts.map +1 -1
  33. package/dist/representations/TableGroupRepresentation.js +3 -3
  34. package/dist/representations/table/Cell.d.ts.map +1 -1
  35. package/dist/representations/table/Cell.js +1 -1
  36. package/dist/representations/table/Column.d.ts.map +1 -1
  37. package/dist/representations/table/Column.js +3 -4
  38. package/dist/representations/table/Row.d.ts.map +1 -1
  39. package/dist/representations/table/Row.js +3 -3
  40. package/dist/representations/table/Table.d.ts.map +1 -1
  41. package/dist/setupLogger.d.ts +16 -0
  42. package/dist/setupLogger.d.ts.map +1 -0
  43. package/dist/setupLogger.js +43 -0
  44. package/dist/system.js +3 -3
  45. package/dist/tsdoc-metadata.json +1 -1
  46. package/dist/types.d.ts +3 -7
  47. package/dist/types.d.ts.map +1 -1
  48. package/dist/types.js +2 -2
  49. package/dist/utils/Comparators.js +1 -1
  50. package/dist/utils/FileUtils.js +3 -3
  51. package/etc/sarif-to-slack.api.md +3 -7
  52. package/package.json +23 -22
  53. package/pnpm-workspace.yaml +8 -0
  54. package/scripts/build.sh +1 -1
  55. package/src/SarifToSlackClient.ts +6 -6
  56. package/src/model/Finding.ts +3 -3
  57. package/src/model/SlackMessage.ts +6 -3
  58. package/src/model/color/ColorIdentification.ts +6 -6
  59. package/src/representations/TableGroupRepresentation.ts +2 -2
  60. package/src/representations/table/Column.ts +2 -2
  61. package/src/representations/table/Row.ts +2 -2
  62. package/src/setupLogger.ts +62 -0
  63. package/src/system.ts +2 -2
  64. package/src/types.ts +2 -6
  65. package/src/utils/FileUtils.ts +2 -2
  66. package/tests/tsconfig.json +8 -0
  67. package/tests/vitest.d.ts +1 -0
  68. package/tsconfig.build.json +9 -0
  69. package/tsconfig.json +4 -4
  70. package/tsconfig.test.json +8 -0
  71. package/vitest.config.ts +22 -0
  72. package/dist/Logger.d.ts +0 -2
  73. package/dist/Logger.d.ts.map +0 -1
  74. package/dist/Logger.js +0 -76
  75. package/jest.config.json +0 -33
  76. package/src/Logger.ts +0 -97
@@ -1,7 +1,7 @@
1
+ import { getLogger, type Logger } from "@logtape/logtape";
1
2
  import type Finding from '../Finding';
2
3
  import type FindingArray from '../FindingArray';
3
4
  import { SecurityLevel, SecuritySeverity } from '../../types';
4
- import Logger from '../../Logger';
5
5
  import type {
6
6
  ColorGroupByLevel,
7
7
  ColorGroupBySeverity,
@@ -43,7 +43,7 @@ function identifyColorCommon<K extends keyof Pick<Finding, 'level' | 'severity'>
43
43
  unknown: Finding[K],
44
44
  color: ColorGroupCommon,
45
45
  ): string | undefined {
46
- const logger = new Logger();
46
+ const logger: Logger = getLogger();
47
47
  if (color.none) {
48
48
  if (findings.findByProperty(prop, none) != null) {
49
49
  logColorTaken(logger, color.none, `${prop === 'severity' ? 'bySeverity' : 'byLevel'}.none`);
@@ -70,7 +70,7 @@ function identifyColorCommon<K extends keyof Pick<Finding, 'level' | 'severity'>
70
70
  }
71
71
 
72
72
  function identifyColorBySeverity(findings: FindingArray, color: ColorGroupBySeverity): string | undefined {
73
- const logger = new Logger();
73
+ const logger: Logger = getLogger();
74
74
  if (color.critical) {
75
75
  if (findings.findByProperty('severity', SecuritySeverity.Critical) != null) {
76
76
  logColorTaken(logger, color.critical, 'bySeverity.critical');
@@ -119,7 +119,7 @@ function identifyColorBySeverity(findings: FindingArray, color: ColorGroupBySeve
119
119
  }
120
120
 
121
121
  function identifyColorByLevel(findings: FindingArray, color: ColorGroupByLevel): string | undefined {
122
- const logger = new Logger();
122
+ const logger: Logger = getLogger();
123
123
  if (color.error) {
124
124
  if (findings.findByProperty('level', SecurityLevel.Error) != null) {
125
125
  logColorTaken(logger, color.error, 'byLevel.error');
@@ -165,12 +165,12 @@ function identifyColorByLevel(findings: FindingArray, color: ColorGroupByLevel):
165
165
  * @internal
166
166
  */
167
167
  export function identifyColor(findings: FindingArray, colorOpts?: ColorOptions): string | undefined {
168
- const logger = new Logger();
168
+ const logger: Logger = getLogger();
169
169
  if (!colorOpts) {
170
170
  logger.debug('Message has no color as color options are not defined.');
171
171
  return undefined;
172
172
  }
173
- logger.trace(`Identifying color for ${findings.length} findings and the following color options:`, JSON.stringify(colorOpts, null, 2));
173
+ logger.trace(`Identifying color for ${findings.length} findings and the following color options: {data}`, { data: JSON.stringify(colorOpts, null, 2) });
174
174
 
175
175
  if (colorOpts.bySeverity) {
176
176
  const color: string | undefined = identifyColorBySeverity(findings, colorOpts.bySeverity);
@@ -1,8 +1,8 @@
1
+ import { getLogger, type Logger } from "@logtape/logtape";
1
2
  import type { SarifModel } from '../types';
2
3
  import type Finding from '../model/Finding';
3
4
  import Representation from './Representation';
4
5
  import Table from './table/Table';
5
- import Logger from '../Logger';
6
6
 
7
7
  export default abstract class TableGroupRepresentation<
8
8
  KBy extends keyof Pick<Finding, 'toolName' | 'runId' | 'sarifPath'>,
@@ -56,7 +56,7 @@ export default abstract class TableGroupRepresentation<
56
56
  }
57
57
 
58
58
  public override compose(): string {
59
- const logger = new Logger();
59
+ const logger: Logger = getLogger();
60
60
  const groupedBy: Map<string, Finding[]> = this.groupFindingsBy(this._model.findings);
61
61
  const table = new Table({
62
62
  main: this.title,
@@ -1,5 +1,5 @@
1
+ import { getLogger, type Logger } from "@logtape/logtape";
1
2
  import type Cell from './Cell';
2
- import Logger from '../../Logger';
3
3
 
4
4
  export default class Column {
5
5
  private readonly _cells: Cell[];
@@ -32,7 +32,7 @@ export default class Column {
32
32
  const width: number = this.width;
33
33
  this._cells.forEach((c: Cell): void => c.setWidth(width));
34
34
  } else {
35
- const logger = new Logger();;
35
+ const logger: Logger = getLogger();
36
36
  logger.warn(`Cell index out of range. Requested index: ${index}. Cells count: ${this._cells.length}.`);
37
37
  }
38
38
  }
@@ -1,5 +1,5 @@
1
+ import { getLogger, type Logger } from "@logtape/logtape";
1
2
  import Cell from './Cell';
2
- import Logger from '../../Logger';
3
3
 
4
4
  export default class Row {
5
5
  private readonly _cells: Cell[];
@@ -26,7 +26,7 @@ export default class Row {
26
26
  if (index >= 0 && index < this._cells.length) {
27
27
  this._cells[index] = value;
28
28
  } else {
29
- const logger = new Logger();
29
+ const logger: Logger = getLogger();
30
30
  logger.warn(`Setting cell failed. Reason: index out of range. Requested index: ${index}. Cells count: ${this._cells.length}.`);
31
31
  }
32
32
  }
@@ -0,0 +1,62 @@
1
+ import {
2
+ type LogLevel,
3
+ configureSync,
4
+ getConsoleSink,
5
+ getAnsiColorFormatter,
6
+ } from "@logtape/logtape";
7
+ import type { LoggerOptions } from "./types";
8
+
9
+ /**
10
+ * Accepted value for the `category` option of `AnsiColorFormatterOptions`.
11
+ *
12
+ * - `string` — a fixed label rendered as the category in every log line.
13
+ * - `(category: readonly string[]) => string` — a function that maps the logtape category path to a display label.
14
+ * - `undefined` — use logtape's default category rendering.
15
+ *
16
+ * @private
17
+ */
18
+ type FormatterCategory = string | ((category: readonly string[]) => string) | undefined;
19
+
20
+ /**
21
+ * Initializes the global logtape logger with a console sink and ANSI color formatting.
22
+ *
23
+ * Configures two loggers:
24
+ * - The logtape meta logger (category `["logtape", "meta"]`), clamped to at least `"warning"`.
25
+ * - The root logger (category `[]`), set to `lowestLevel` (defaults to `"info"`).
26
+ *
27
+ * Calling this function resets any previously registered logtape configuration.
28
+ *
29
+ * @param opts - An instance of {@link LoggerOptions}.
30
+ *
31
+ * @public
32
+ */
33
+ export function setupLogger(opts?: LoggerOptions): void {
34
+ const lowestLevel: LogLevel = opts?.lowestLevel ?? "info";
35
+ const category: FormatterCategory =
36
+ opts?.name && opts?.name.length > 0
37
+ ? (_: readonly string[]): string => opts.name as string
38
+ : undefined;
39
+
40
+ configureSync({
41
+ reset: false,
42
+ sinks: {
43
+ console: getConsoleSink({
44
+ formatter: getAnsiColorFormatter({ category }),
45
+ }),
46
+ },
47
+ loggers: [
48
+ {
49
+ category: ["logtape", "meta"],
50
+ lowestLevel: Array.from<LogLevel>(["warning", "error", "fatal"]).includes(lowestLevel)
51
+ ? lowestLevel
52
+ : "warning",
53
+ sinks: ["console"],
54
+ },
55
+ {
56
+ category: [],
57
+ lowestLevel: lowestLevel,
58
+ sinks: ["console"],
59
+ },
60
+ ],
61
+ });
62
+ }
package/src/system.ts CHANGED
@@ -1,5 +1,5 @@
1
+ import { getLogger, type Logger } from "@logtape/logtape";
1
2
  import { z, type ZodSafeParseResult } from 'zod';
2
- import Logger from './Logger';
3
3
  import { version, sha, buildAt } from './metadata.json';
4
4
 
5
5
  /**
@@ -8,7 +8,7 @@ import { version, sha, buildAt } from './metadata.json';
8
8
  * @internal
9
9
  */
10
10
  export function logMetadata(): void {
11
- const logger = new Logger();
11
+ const logger: Logger = getLogger();
12
12
  logger.debug(`version: ${version}`);
13
13
  logger.debug(`sha: ${sha}`);
14
14
  logger.debug(`built at: ${buildAt}`);
package/src/types.ts CHANGED
@@ -247,7 +247,7 @@ export type SarifOptions = {
247
247
  * Valid log levels for the Logger.
248
248
  * @public
249
249
  */
250
- export const LogLevelItems = ['silly', 'trace', 'debug', 'info', 'warning', 'error', 'fatal'] as const;
250
+ export const LogLevelItems = ['trace', 'debug', 'info', 'warning', 'error', 'fatal'] as const;
251
251
  /**
252
252
  * Log levels for the Logger.
253
253
  * @public
@@ -259,12 +259,8 @@ export type LogLevel = typeof LogLevelItems[number];
259
259
  * @public
260
260
  */
261
261
  export type LoggerOptions = {
262
- logFunctionName?: boolean,
263
- logFunctionNameOnPosition?: number,
264
- minLevel?: LogLevel,
262
+ lowestLevel?: LogLevel,
265
263
  name?: string,
266
- stylePrettyLogs?: boolean,
267
- prettyLogTemplate?: string,
268
264
  }
269
265
 
270
266
  /**
@@ -1,6 +1,6 @@
1
1
  import fs from 'node:fs';
2
2
  import * as path from 'node:path';
3
- import Logger from '../Logger';
3
+ import { getLogger, type Logger } from "@logtape/logtape";
4
4
  import type { SarifFileExtension, SarifOptions } from '../types';
5
5
 
6
6
  /**
@@ -43,7 +43,7 @@ export function extractListOfFiles(opts: SarifOptions): string[] {
43
43
  throw new Error(`Provided path does not exist: ${opts.path}`);
44
44
  }
45
45
 
46
- const logger = new Logger();
46
+ const logger: Logger = getLogger();
47
47
  const stats: fs.Stats = fs.statSync(opts.path);
48
48
 
49
49
  if (stats.isDirectory()) {
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "../tsconfig.json",
3
+ "compilerOptions": {
4
+ "rootDir": "..",
5
+ "types": ["node", "vitest/globals"]
6
+ },
7
+ "include": [".."]
8
+ }
@@ -0,0 +1 @@
1
+ /// <reference types="vitest/globals" />
@@ -0,0 +1,9 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "rootDir": "src",
5
+ "types": ["node"]
6
+ },
7
+ "include": ["src"],
8
+ "exclude": ["node_modules", "dist", "tests"]
9
+ }
package/tsconfig.json CHANGED
@@ -14,7 +14,7 @@
14
14
  "lib": ["es2024"],
15
15
  "module": "es2022",
16
16
  "moduleResolution": "bundler",
17
- "rootDir": "src",
17
+ "rootDir": ".",
18
18
  "newLine": "lf",
19
19
  "noFallthroughCasesInSwitch": true,
20
20
  "noImplicitAny": true,
@@ -29,8 +29,8 @@
29
29
  "stripInternal": true,
30
30
  "target": "es2024",
31
31
  "typeRoots": ["node_modules/@types", "@types"],
32
- "types": ["node", "jest"]
32
+ "types": ["node"]
33
33
  },
34
- "include": ["src"],
35
- "exclude": ["node_modules", "dist", "tests"]
34
+ "include": ["src", "tests"],
35
+ "exclude": ["node_modules", "dist"]
36
36
  }
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "rootDir": ".",
5
+ "types": ["node", "vitest/globals"]
6
+ },
7
+ "include": ["src", "tests"]
8
+ }
@@ -0,0 +1,22 @@
1
+ import { defineConfig } from 'vitest/config';
2
+
3
+ export default defineConfig({
4
+ test: {
5
+ globals: true,
6
+ clearMocks: true,
7
+ coverage: {
8
+ include: ['**/*.ts'],
9
+ exclude: ['**/*.d.ts', '**/node_modules/**'],
10
+ reporter: ['lcov', 'text', 'text-summary'],
11
+ thresholds: {
12
+ branches: 10,
13
+ functions: 40,
14
+ lines: 25,
15
+ statements: 30,
16
+ },
17
+ },
18
+ environment: 'node',
19
+ include: ['**/*.spec.ts'],
20
+ testTimeout: 20000,
21
+ },
22
+ });
package/dist/Logger.d.ts DELETED
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=Logger.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../src/Logger.ts"],"names":[],"mappings":""}
package/dist/Logger.js DELETED
@@ -1,76 +0,0 @@
1
- import { z } from 'zod';
2
- import * as stackTraceParser from 'stacktrace-parser';
3
- import { Logger as TSLogger } from 'tslog';
4
- import { isDebug } from './system';
5
- import { LogLevelItems } from './types';
6
- import { globalState } from './globalState';
7
- /**
8
- * Logger class for managing logging operations.
9
- * @internal
10
- */
11
- export default class Logger {
12
- static DEFAULT_LOG_LEVEL = 'info';
13
- static DEFAULT_FUNC_NAME_POSITION = 2;
14
- _instance;
15
- getMinLevel(minLevel) {
16
- let result = Logger.DEFAULT_LOG_LEVEL;
17
- if (isDebug()) {
18
- result = 'silly';
19
- }
20
- else if (minLevel !== undefined) {
21
- const parseResult = z.enum(LogLevelItems).safeParse(minLevel);
22
- if (parseResult.success) {
23
- result = parseResult.data;
24
- }
25
- }
26
- return LogLevelItems.findIndex((v) => v === result);
27
- }
28
- composeLogHeader(name, logFunctionName, logFunctionNameOnPosition) {
29
- let result = name;
30
- if (logFunctionName === true) {
31
- const pos = logFunctionNameOnPosition ?? Logger.DEFAULT_FUNC_NAME_POSITION;
32
- if (result === undefined) {
33
- result = '';
34
- }
35
- else {
36
- result += '::';
37
- }
38
- const stackFrames = stackTraceParser.parse(new Error().stack ?? '');
39
- if (stackFrames.length > pos) {
40
- result += stackFrames[pos].methodName;
41
- }
42
- }
43
- return result;
44
- }
45
- constructor(overrides = {}) {
46
- const opts = {
47
- ...structuredClone(globalState.loggerOpts ?? {}),
48
- ...overrides,
49
- };
50
- const logName = this.composeLogHeader(opts.name, opts.logFunctionName, opts.logFunctionNameOnPosition);
51
- const settings = {
52
- minLevel: this.getMinLevel(opts.minLevel),
53
- name: logName,
54
- type: 'pretty',
55
- prettyLogTemplate: opts.prettyLogTemplate || (logName === undefined
56
- ? '[{{logLevelName}}] {{dateIsoStr}} '
57
- : '[{{logLevelName}}] [{{name}}] {{dateIsoStr}} '),
58
- prettyLogTimeZone: 'UTC',
59
- stylePrettyLogs: opts.stylePrettyLogs ?? true,
60
- };
61
- this._instance = new TSLogger(settings);
62
- }
63
- info(...args) {
64
- this._instance.info(...args);
65
- }
66
- warn(...args) {
67
- this._instance.warn(...args);
68
- }
69
- trace(...args) {
70
- this._instance.trace(...args);
71
- }
72
- debug(...args) {
73
- this._instance.debug(...args);
74
- }
75
- }
76
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsQ0FBQyxFQUEyQixNQUFNLEtBQUssQ0FBQztBQUNqRCxPQUFPLEtBQUssZ0JBQWdCLE1BQU0sbUJBQW1CLENBQUM7QUFDdEQsT0FBTyxFQUFxQyxNQUFNLElBQUksUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbkMsT0FBTyxFQUFxQyxhQUFhLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDM0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU1Qzs7O0dBR0c7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLE1BQU07SUFDakIsTUFBTSxDQUFDLGlCQUFpQixHQUFhLE1BQU0sQ0FBQztJQUM1QyxNQUFNLENBQUMsMEJBQTBCLEdBQVcsQ0FBQyxDQUFDO0lBRXJDLFNBQVMsQ0FBb0I7SUFFdEMsV0FBVyxDQUFDLFFBQThCO1FBQ2hELElBQUksTUFBTSxHQUFhLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztRQUVoRCxJQUFJLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDZCxNQUFNLEdBQUcsT0FBTyxDQUFDO1FBQ25CLENBQUM7YUFBTSxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNsQyxNQUFNLFdBQVcsR0FBaUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDNUYsSUFBSSxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3hCLE1BQU0sR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO1lBQzVCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBVyxFQUFXLEVBQUUsQ0FBQyxDQUFDLEtB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
package/jest.config.json DELETED
@@ -1,33 +0,0 @@
1
- {
2
- "clearMocks": true,
3
- "collectCoverageFrom": [
4
- "**/*.ts",
5
- "!**/*.d.ts",
6
- "!**/node_modules/**"
7
- ],
8
- "coverageReporters": [
9
- "lcov", "text", "text-summary"
10
- ],
11
- "coverageThreshold": {
12
- "global": {
13
- "branches": 10,
14
- "functions": 35,
15
- "lines": 40,
16
- "statements": 40
17
- }
18
- },
19
- "moduleFileExtensions": [
20
- "js",
21
- "ts"
22
- ],
23
- "testEnvironment": "node",
24
- "testMatch": [
25
- "**/*.spec.ts"
26
- ],
27
- "testRunner": "jest-circus/runner",
28
- "testTimeout": 20000,
29
- "transform": {
30
- "^.+\\.ts$": "ts-jest"
31
- },
32
- "verbose": true
33
- }
package/src/Logger.ts DELETED
@@ -1,97 +0,0 @@
1
- import { z, type ZodSafeParseResult } from 'zod';
2
- import * as stackTraceParser from 'stacktrace-parser';
3
- import { type ILogObj, type ISettingsParam, Logger as TSLogger } from 'tslog';
4
- import { isDebug } from './system';
5
- import { type LoggerOptions, type LogLevel, LogLevelItems } from './types';
6
- import { globalState } from './globalState';
7
-
8
- /**
9
- * Logger class for managing logging operations.
10
- * @internal
11
- */
12
- export default class Logger {
13
- private static DEFAULT_LOG_LEVEL: LogLevel = 'info';
14
- private static DEFAULT_FUNC_NAME_POSITION: number = 2;
15
-
16
- private readonly _instance: TSLogger<ILogObj>;
17
-
18
- private getMinLevel(minLevel: LogLevel | undefined): number {
19
- let result: LogLevel = Logger.DEFAULT_LOG_LEVEL;
20
-
21
- if (isDebug()) {
22
- result = 'silly';
23
- } else if (minLevel !== undefined) {
24
- const parseResult: ZodSafeParseResult<LogLevel> = z.enum(LogLevelItems).safeParse(minLevel);
25
- if (parseResult.success) {
26
- result = parseResult.data;
27
- }
28
- }
29
-
30
- return LogLevelItems.findIndex((v: LogLevel): boolean => v === result);
31
- }
32
-
33
- private composeLogHeader(
34
- name: string | undefined,
35
- logFunctionName: boolean | undefined,
36
- logFunctionNameOnPosition: number | undefined,
37
- ): string | undefined {
38
- let result: string | undefined = name;
39
-
40
- if (logFunctionName === true) {
41
- const pos: number = logFunctionNameOnPosition ?? Logger.DEFAULT_FUNC_NAME_POSITION;
42
- if (result === undefined) {
43
- result = '';
44
- } else {
45
- result += '::';
46
- }
47
- const stackFrames: stackTraceParser.StackFrame[] = stackTraceParser.parse(
48
- new Error().stack ?? '',
49
- );
50
- if (stackFrames.length > pos) {
51
- result += stackFrames[pos].methodName;
52
- }
53
- }
54
-
55
- return result;
56
- }
57
-
58
- public constructor(overrides: Partial<LoggerOptions> = {}) {
59
- const opts: LoggerOptions = {
60
- ...structuredClone(globalState.loggerOpts ?? {}),
61
- ...overrides,
62
- };
63
-
64
- const logName: string | undefined = this.composeLogHeader(
65
- opts.name, opts.logFunctionName, opts.logFunctionNameOnPosition,
66
- );
67
- const settings: ISettingsParam<ILogObj> = {
68
- minLevel: this.getMinLevel(opts.minLevel),
69
- name: logName,
70
- type: 'pretty',
71
- prettyLogTemplate: opts.prettyLogTemplate || (
72
- logName === undefined
73
- ? '[{{logLevelName}}] {{dateIsoStr}} '
74
- : '[{{logLevelName}}] [{{name}}] {{dateIsoStr}} '
75
- ),
76
- prettyLogTimeZone: 'UTC',
77
- stylePrettyLogs: opts.stylePrettyLogs ?? true,
78
- };
79
- this._instance = new TSLogger(settings);
80
- }
81
-
82
- public info(...args: unknown[]): void {
83
- this._instance.info(...args);
84
- }
85
-
86
- public warn(...args: unknown[]): void {
87
- this._instance.warn(...args);
88
- }
89
-
90
- public trace(...args: unknown[]): void {
91
- this._instance.trace(...args);
92
- }
93
-
94
- public debug(...args: unknown[]): void {
95
- this._instance.debug(...args);
96
- }
97
- }