@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.
- package/.github/workflows/release.yml +18 -9
- package/.github/workflows/security.yml +1 -1
- package/.github/workflows/send-sarif-to-slack.yml +10 -2
- package/.github/workflows/unit-tests.yml +3 -3
- package/.pre-commit-config.yaml +5 -5
- package/.tool-versions +1 -1
- package/Makefile +13 -13
- package/api-extractor.json +1 -1
- package/biome.json +1 -1
- package/dist/SarifToSlackClient.d.ts.map +1 -1
- package/dist/SarifToSlackClient.js +7 -7
- package/dist/index.cjs +71 -115
- package/dist/index.d.ts +3 -7
- package/dist/model/Finding.js +4 -5
- package/dist/model/SlackMessage.d.ts.map +1 -1
- package/dist/model/SlackMessage.js +1 -1
- package/dist/model/color/Color.d.ts.map +1 -1
- package/dist/model/color/ColorIdentification.js +7 -7
- package/dist/processors/ProcessorFactory.js +1 -1
- package/dist/representations/CompactGroupByRepresentation.js +1 -1
- package/dist/representations/Representation.js +1 -1
- package/dist/representations/RepresentationFactory.js +1 -1
- package/dist/representations/TableGroupByRunPerLevelRepresentation.d.ts.map +1 -1
- package/dist/representations/TableGroupByRunPerSeverityRepresentation.d.ts.map +1 -1
- package/dist/representations/TableGroupByRunRepresentation.d.ts.map +1 -1
- package/dist/representations/TableGroupBySarifPerLevelRepresentation.d.ts.map +1 -1
- package/dist/representations/TableGroupBySarifPerSeverityRepresentation.d.ts.map +1 -1
- package/dist/representations/TableGroupBySarifRepresentation.d.ts.map +1 -1
- package/dist/representations/TableGroupByToolNamePerLevelRepresentation.d.ts.map +1 -1
- package/dist/representations/TableGroupByToolNamePerSeverityRepresentation.d.ts.map +1 -1
- package/dist/representations/TableGroupByToolNameRepresentation.d.ts.map +1 -1
- package/dist/representations/TableGroupRepresentation.d.ts.map +1 -1
- package/dist/representations/TableGroupRepresentation.js +3 -3
- package/dist/representations/table/Cell.d.ts.map +1 -1
- package/dist/representations/table/Cell.js +1 -1
- package/dist/representations/table/Column.d.ts.map +1 -1
- package/dist/representations/table/Column.js +3 -4
- package/dist/representations/table/Row.d.ts.map +1 -1
- package/dist/representations/table/Row.js +3 -3
- package/dist/representations/table/Table.d.ts.map +1 -1
- package/dist/setupLogger.d.ts +16 -0
- package/dist/setupLogger.d.ts.map +1 -0
- package/dist/setupLogger.js +43 -0
- package/dist/system.js +3 -3
- package/dist/tsdoc-metadata.json +1 -1
- package/dist/types.d.ts +3 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -2
- package/dist/utils/Comparators.js +1 -1
- package/dist/utils/FileUtils.js +3 -3
- package/etc/sarif-to-slack.api.md +3 -7
- package/package.json +23 -22
- package/pnpm-workspace.yaml +8 -0
- package/scripts/build.sh +1 -1
- package/src/SarifToSlackClient.ts +6 -6
- package/src/model/Finding.ts +3 -3
- package/src/model/SlackMessage.ts +6 -3
- package/src/model/color/ColorIdentification.ts +6 -6
- package/src/representations/TableGroupRepresentation.ts +2 -2
- package/src/representations/table/Column.ts +2 -2
- package/src/representations/table/Row.ts +2 -2
- package/src/setupLogger.ts +62 -0
- package/src/system.ts +2 -2
- package/src/types.ts +2 -6
- package/src/utils/FileUtils.ts +2 -2
- package/tests/tsconfig.json +8 -0
- package/tests/vitest.d.ts +1 -0
- package/tsconfig.build.json +9 -0
- package/tsconfig.json +4 -4
- package/tsconfig.test.json +8 -0
- package/vitest.config.ts +22 -0
- package/dist/Logger.d.ts +0 -2
- package/dist/Logger.d.ts.map +0 -1
- package/dist/Logger.js +0 -76
- package/jest.config.json +0 -33
- 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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 = ['
|
|
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
|
-
|
|
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
|
/**
|
package/src/utils/FileUtils.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import * as path from 'node:path';
|
|
3
|
-
import Logger from
|
|
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 =
|
|
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 @@
|
|
|
1
|
+
/// <reference types="vitest/globals" />
|
package/tsconfig.json
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"lib": ["es2024"],
|
|
15
15
|
"module": "es2022",
|
|
16
16
|
"moduleResolution": "bundler",
|
|
17
|
-
"rootDir": "
|
|
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"
|
|
32
|
+
"types": ["node"]
|
|
33
33
|
},
|
|
34
|
-
"include": ["src"],
|
|
35
|
-
"exclude": ["node_modules", "dist"
|
|
34
|
+
"include": ["src", "tests"],
|
|
35
|
+
"exclude": ["node_modules", "dist"]
|
|
36
36
|
}
|
package/vitest.config.ts
ADDED
|
@@ -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
package/dist/Logger.d.ts.map
DELETED
|
@@ -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
|
-
}
|