@smb-tech/logger-core 1.0.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/README.md ADDED
@@ -0,0 +1,28 @@
1
+ # @smb-tech/logger-core
2
+
3
+ Core library for structured logging.
4
+
5
+ ## Features
6
+
7
+ - LogEvent builder
8
+ - JSON serialization
9
+ - Logging levels
10
+ - Tags and metadata
11
+
12
+ ## Installation
13
+
14
+ ```bash
15
+ npm install @smb-tech/logger-core
16
+ ```
17
+
18
+ ## Usage
19
+
20
+ ```ts
21
+ import { Logger } from '@smb-tech/logger-core';
22
+
23
+ const logger = Logger.get('MyClass');
24
+
25
+ logger.info((event) => {
26
+ event.message('Hello world');
27
+ });
28
+ ```
@@ -0,0 +1,16 @@
1
+ import type { EventType, NormalizedLogEvent } from './types.js';
2
+ export declare class LogEvent {
3
+ private messageValue;
4
+ private dataValue;
5
+ private tagsValue;
6
+ private typeValue;
7
+ private errorValue?;
8
+ private sensitiveValue;
9
+ type(type: EventType): this;
10
+ tag(tag: string): this;
11
+ sensitive(): this;
12
+ message(message: string): this;
13
+ with(key: string, value: unknown): this;
14
+ error(error: Error): this;
15
+ toJSON(): NormalizedLogEvent;
16
+ }
package/dist/event.js ADDED
@@ -0,0 +1,44 @@
1
+ export class LogEvent {
2
+ messageValue = '';
3
+ dataValue = {};
4
+ tagsValue = new Set();
5
+ typeValue = 'APP';
6
+ errorValue;
7
+ sensitiveValue = false;
8
+ type(type) {
9
+ this.typeValue = type;
10
+ return this;
11
+ }
12
+ tag(tag) {
13
+ this.tagsValue.add(tag);
14
+ return this;
15
+ }
16
+ sensitive() {
17
+ this.sensitiveValue = true;
18
+ this.tagsValue.add('SENSITIVE');
19
+ return this;
20
+ }
21
+ message(message) {
22
+ this.messageValue = message;
23
+ return this;
24
+ }
25
+ with(key, value) {
26
+ this.dataValue[key] = value;
27
+ return this;
28
+ }
29
+ error(error) {
30
+ this.errorValue = error;
31
+ return this;
32
+ }
33
+ toJSON() {
34
+ return {
35
+ type: this.typeValue,
36
+ msg: this.messageValue,
37
+ data: { ...this.dataValue },
38
+ tags: [...this.tagsValue].filter((tag) => tag !== 'SENSITIVE'),
39
+ pii: this.sensitiveValue,
40
+ error: this.errorValue
41
+ };
42
+ }
43
+ }
44
+ //# sourceMappingURL=event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.js","sourceRoot":"","sources":["../src/event.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,QAAQ;IACX,YAAY,GAAG,EAAE,CAAC;IAClB,SAAS,GAA4B,EAAE,CAAC;IACxC,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,SAAS,GAAc,KAAK,CAAC;IAC7B,UAAU,CAAS;IACnB,cAAc,GAAG,KAAK,CAAC;IAE/B,IAAI,CAAC,IAAe;QAClB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,GAAW;QACb,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS;QACP,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,GAAW,EAAE,KAAc;QAC9B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,KAAY;QAChB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM;QACJ,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,SAAS;YACpB,GAAG,EAAE,IAAI,CAAC,YAAY;YACtB,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE;YAC3B,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,WAAW,CAAC;YAC9D,GAAG,EAAE,IAAI,CAAC,cAAc;YACxB,KAAK,EAAE,IAAI,CAAC,UAAU;SACvB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ export * from './event.js';
2
+ export * from './logger.js';
3
+ export * from './types.js';
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export * from './event.js';
2
+ export * from './logger.js';
3
+ export * from './types.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { LogEvent } from './event.js';
2
+ import type { LogContextAccessor, LogSink, RuntimeDetailsProvider } from './types.js';
3
+ export declare class Logger {
4
+ private readonly contextName;
5
+ private readonly contextAccessor;
6
+ private readonly sink;
7
+ private readonly runtimeDetailsProvider;
8
+ constructor(contextName: string, contextAccessor: LogContextAccessor, sink: LogSink, runtimeDetailsProvider: RuntimeDetailsProvider);
9
+ trace(builder: (event: LogEvent) => void): void;
10
+ debug(builder: (event: LogEvent) => void): void;
11
+ info(builder: (event: LogEvent) => void): void;
12
+ warn(builder: (event: LogEvent) => void): void;
13
+ error(builder: (event: LogEvent) => void): void;
14
+ metric(builder: (event: LogEvent) => void): void;
15
+ audit(builder: (event: LogEvent) => void): void;
16
+ security(builder: (event: LogEvent) => void): void;
17
+ track(builder: (event: LogEvent) => void): void;
18
+ private log;
19
+ private toPayload;
20
+ }
package/dist/logger.js ADDED
@@ -0,0 +1,88 @@
1
+ import { LogEvent } from './event.js';
2
+ const ENABLED_LEVELS = new Set(['TRACE', 'DEBUG', 'INFO', 'WARN', 'ERROR', 'METRIC', 'AUDIT', 'SECURITY', 'TRACK']);
3
+ export class Logger {
4
+ contextName;
5
+ contextAccessor;
6
+ sink;
7
+ runtimeDetailsProvider;
8
+ constructor(contextName, contextAccessor, sink, runtimeDetailsProvider) {
9
+ this.contextName = contextName;
10
+ this.contextAccessor = contextAccessor;
11
+ this.sink = sink;
12
+ this.runtimeDetailsProvider = runtimeDetailsProvider;
13
+ }
14
+ trace(builder) {
15
+ this.log('TRACE', builder);
16
+ }
17
+ debug(builder) {
18
+ this.log('DEBUG', builder);
19
+ }
20
+ info(builder) {
21
+ this.log('INFO', builder);
22
+ }
23
+ warn(builder) {
24
+ this.log('WARN', builder);
25
+ }
26
+ error(builder) {
27
+ this.log('ERROR', builder);
28
+ }
29
+ metric(builder) {
30
+ this.log('METRIC', (event) => {
31
+ event.type('METRIC');
32
+ builder(event);
33
+ });
34
+ }
35
+ audit(builder) {
36
+ this.log('AUDIT', (event) => {
37
+ event.type('AUDIT');
38
+ builder(event);
39
+ });
40
+ }
41
+ security(builder) {
42
+ this.log('SECURITY', (event) => {
43
+ event.type('SECURITY');
44
+ builder(event);
45
+ });
46
+ }
47
+ track(builder) {
48
+ this.log('TRACK', (event) => {
49
+ event.type('TRACK');
50
+ builder(event);
51
+ });
52
+ }
53
+ log(level, builder) {
54
+ if (!ENABLED_LEVELS.has(level)) {
55
+ return;
56
+ }
57
+ const event = new LogEvent();
58
+ builder(event);
59
+ const payload = this.toPayload(level, event);
60
+ this.sink.dispatch(JSON.stringify(payload), level);
61
+ }
62
+ toPayload(level, event) {
63
+ const normalized = event.toJSON();
64
+ const error = normalized.error;
65
+ const mdc = this.contextAccessor.getMdc();
66
+ return {
67
+ ts: new Date().toISOString(),
68
+ uuid: mdc.requestId ?? this.runtimeDetailsProvider.fallbackId(),
69
+ type: normalized.type === 'APP' ? level : normalized.type,
70
+ msg: normalized.msg,
71
+ class: this.contextName,
72
+ pii: normalized.pii,
73
+ thread: this.runtimeDetailsProvider.getThreadLabel(),
74
+ mdc,
75
+ data: normalized.data,
76
+ tags: normalized.tags,
77
+ exception: error
78
+ ? {
79
+ message: error.message,
80
+ class: error.name,
81
+ stack: error.stack,
82
+ cause: error.cause instanceof Error ? error.cause.message : undefined
83
+ }
84
+ : {}
85
+ };
86
+ }
87
+ }
88
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ export type LogLevel = 'TRACE' | 'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'METRIC' | 'AUDIT' | 'SECURITY' | 'TRACK';
2
+ export type EventType = 'APP' | 'ERROR' | 'TRACK' | 'SECURITY' | 'AUDIT' | 'ACCESS' | 'METRIC' | string;
3
+ export interface ThrowablePayload {
4
+ message?: string;
5
+ class: string;
6
+ stack?: string;
7
+ cause?: string;
8
+ }
9
+ export interface LogPayload {
10
+ ts: string;
11
+ uuid: string;
12
+ type: EventType;
13
+ msg: string;
14
+ class: string;
15
+ pii: boolean;
16
+ thread: string;
17
+ mdc: Record<string, string>;
18
+ data: Record<string, unknown>;
19
+ tags: string[];
20
+ exception: Record<string, unknown> | ThrowablePayload;
21
+ }
22
+ export interface NormalizedLogEvent {
23
+ type: EventType;
24
+ msg: string;
25
+ data: Record<string, unknown>;
26
+ tags: string[];
27
+ pii: boolean;
28
+ error?: Error;
29
+ }
30
+ export interface LogContextAccessor {
31
+ getMdc(): Record<string, string>;
32
+ }
33
+ export interface LogSink {
34
+ dispatch(line: string, level: LogLevel): void;
35
+ }
36
+ export interface RuntimeDetailsProvider {
37
+ getThreadLabel(): string;
38
+ fallbackId(): string;
39
+ }
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@smb-tech/logger-core",
3
+ "version": "1.0.0",
4
+ "description": "Core library for structured logging, events, and serialization",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "README.md"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsc -p tsconfig.json"
21
+ },
22
+ "devDependencies": {
23
+ "typescript": "^5.8.2"
24
+ },
25
+ "publishConfig": {
26
+ "access": "public"
27
+ }
28
+ }