@hamak/logging-impl 0.4.1
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/core/context-logger.d.ts +26 -0
- package/dist/core/context-logger.d.ts.map +1 -0
- package/dist/core/context-logger.js +82 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +2 -0
- package/dist/core/log-manager.d.ts +41 -0
- package/dist/core/log-manager.d.ts.map +1 -0
- package/dist/core/log-manager.js +241 -0
- package/dist/es2015/core/context-logger.js +74 -0
- package/dist/es2015/core/index.js +2 -0
- package/dist/es2015/core/log-manager.js +255 -0
- package/dist/es2015/formatters/dev-formatter.js +152 -0
- package/dist/es2015/formatters/index.js +2 -0
- package/dist/es2015/formatters/json-formatter.js +69 -0
- package/dist/es2015/index.js +19 -0
- package/dist/es2015/plugin/index.js +1 -0
- package/dist/es2015/plugin/logging-plugin-factory.js +118 -0
- package/dist/es2015/transports/console-transport.js +41 -0
- package/dist/es2015/transports/index.js +1 -0
- package/dist/es2015/utils/console-interceptor.js +105 -0
- package/dist/es2015/utils/event-emitter.js +39 -0
- package/dist/es2015/utils/index.js +2 -0
- package/dist/formatters/dev-formatter.d.ts +20 -0
- package/dist/formatters/dev-formatter.d.ts.map +1 -0
- package/dist/formatters/dev-formatter.js +140 -0
- package/dist/formatters/index.d.ts +3 -0
- package/dist/formatters/index.d.ts.map +1 -0
- package/dist/formatters/index.js +2 -0
- package/dist/formatters/json-formatter.d.ts +24 -0
- package/dist/formatters/json-formatter.d.ts.map +1 -0
- package/dist/formatters/json-formatter.js +65 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/plugin/index.d.ts +2 -0
- package/dist/plugin/index.d.ts.map +1 -0
- package/dist/plugin/index.js +1 -0
- package/dist/plugin/logging-plugin-factory.d.ts +37 -0
- package/dist/plugin/logging-plugin-factory.d.ts.map +1 -0
- package/dist/plugin/logging-plugin-factory.js +112 -0
- package/dist/transports/console-transport.d.ts +16 -0
- package/dist/transports/console-transport.d.ts.map +1 -0
- package/dist/transports/console-transport.js +40 -0
- package/dist/transports/index.d.ts +2 -0
- package/dist/transports/index.d.ts.map +1 -0
- package/dist/transports/index.js +1 -0
- package/dist/utils/console-interceptor.d.ts +36 -0
- package/dist/utils/console-interceptor.d.ts.map +1 -0
- package/dist/utils/console-interceptor.js +105 -0
- package/dist/utils/event-emitter.d.ts +11 -0
- package/dist/utils/event-emitter.d.ts.map +1 -0
- package/dist/utils/event-emitter.js +39 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +2 -0
- package/package.json +54 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Console transport
|
|
3
|
+
*
|
|
4
|
+
* Outputs logs to the browser console or Node.js console.
|
|
5
|
+
* Supports formatting via pluggable formatters.
|
|
6
|
+
*/
|
|
7
|
+
export class ConsoleTransport {
|
|
8
|
+
constructor(formatter) {
|
|
9
|
+
this.formatter = formatter;
|
|
10
|
+
this.id = 'console';
|
|
11
|
+
this.name = 'Console Transport';
|
|
12
|
+
}
|
|
13
|
+
log(entry) {
|
|
14
|
+
const formatted = this.formatter.format(entry);
|
|
15
|
+
switch (entry.level) {
|
|
16
|
+
case 0: // TRACE
|
|
17
|
+
case 1: // DEBUG
|
|
18
|
+
console.debug(formatted);
|
|
19
|
+
break;
|
|
20
|
+
case 2: // INFO
|
|
21
|
+
console.info(formatted);
|
|
22
|
+
break;
|
|
23
|
+
case 3: // WARN
|
|
24
|
+
console.warn(formatted);
|
|
25
|
+
break;
|
|
26
|
+
case 4: // ERROR
|
|
27
|
+
case 5: // FATAL
|
|
28
|
+
console.error(formatted);
|
|
29
|
+
if (entry.metadata?.error) {
|
|
30
|
+
console.error(entry.metadata.error);
|
|
31
|
+
}
|
|
32
|
+
break;
|
|
33
|
+
default:
|
|
34
|
+
console.log(formatted);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
onError(error) {
|
|
38
|
+
console.error('[ConsoleTransport] Error:', error);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transports/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './console-transport.js';
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ILogManager } from '@hamak/logging-api';
|
|
2
|
+
/**
|
|
3
|
+
* Console interceptor that routes console methods through the logging system
|
|
4
|
+
*
|
|
5
|
+
* By default, this is enabled. Set `interceptConsole: false` in LoggingPluginConfig to disable.
|
|
6
|
+
*/
|
|
7
|
+
export declare class ConsoleInterceptor {
|
|
8
|
+
private logManager;
|
|
9
|
+
private originalConsole;
|
|
10
|
+
private isIntercepting;
|
|
11
|
+
constructor(logManager: ILogManager);
|
|
12
|
+
/**
|
|
13
|
+
* Start intercepting console methods
|
|
14
|
+
*/
|
|
15
|
+
intercept(): void;
|
|
16
|
+
/**
|
|
17
|
+
* Stop intercepting and restore original console methods
|
|
18
|
+
*/
|
|
19
|
+
restore(): void;
|
|
20
|
+
/**
|
|
21
|
+
* Get original console for direct access
|
|
22
|
+
*/
|
|
23
|
+
getOriginalConsole(): {
|
|
24
|
+
log: typeof console.log;
|
|
25
|
+
debug: typeof console.debug;
|
|
26
|
+
info: typeof console.info;
|
|
27
|
+
warn: typeof console.warn;
|
|
28
|
+
error: typeof console.error;
|
|
29
|
+
trace: typeof console.trace;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Format console arguments into a single message
|
|
33
|
+
*/
|
|
34
|
+
private formatMessage;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=console-interceptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console-interceptor.d.ts","sourceRoot":"","sources":["../../src/utils/console-interceptor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;;;GAIG;AACH,qBAAa,kBAAkB;IAYjB,OAAO,CAAC,UAAU;IAX9B,OAAO,CAAC,eAAe,CAOrB;IAEF,OAAO,CAAC,cAAc,CAAS;gBAEX,UAAU,EAAE,WAAW;IAY3C;;OAEG;IACH,SAAS,IAAI,IAAI;IAiDjB;;OAEG;IACH,OAAO,IAAI,IAAI;IAef;;OAEG;IACH,kBAAkB;aA/FX,OAAO,OAAO,CAAC,GAAG;eAChB,OAAO,OAAO,CAAC,KAAK;cACrB,OAAO,OAAO,CAAC,IAAI;cACnB,OAAO,OAAO,CAAC,IAAI;eAClB,OAAO,OAAO,CAAC,KAAK;eACpB,OAAO,OAAO,CAAC,KAAK;;IA8F7B;;OAEG;IACH,OAAO,CAAC,aAAa;CAiBtB"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Console interceptor that routes console methods through the logging system
|
|
3
|
+
*
|
|
4
|
+
* By default, this is enabled. Set `interceptConsole: false` in LoggingPluginConfig to disable.
|
|
5
|
+
*/
|
|
6
|
+
export class ConsoleInterceptor {
|
|
7
|
+
constructor(logManager) {
|
|
8
|
+
this.logManager = logManager;
|
|
9
|
+
this.isIntercepting = false;
|
|
10
|
+
// Store original console methods
|
|
11
|
+
this.originalConsole = {
|
|
12
|
+
log: console.log.bind(console),
|
|
13
|
+
debug: console.debug.bind(console),
|
|
14
|
+
info: console.info.bind(console),
|
|
15
|
+
warn: console.warn.bind(console),
|
|
16
|
+
error: console.error.bind(console),
|
|
17
|
+
trace: console.trace.bind(console),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Start intercepting console methods
|
|
22
|
+
*/
|
|
23
|
+
intercept() {
|
|
24
|
+
if (this.isIntercepting) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const logger = this.logManager.createLogger({
|
|
28
|
+
plugin: 'console-interceptor',
|
|
29
|
+
module: 'global'
|
|
30
|
+
});
|
|
31
|
+
// Intercept console.log
|
|
32
|
+
console.log = (...args) => {
|
|
33
|
+
logger.info(this.formatMessage(args));
|
|
34
|
+
};
|
|
35
|
+
// Intercept console.debug
|
|
36
|
+
console.debug = (...args) => {
|
|
37
|
+
logger.debug(this.formatMessage(args));
|
|
38
|
+
};
|
|
39
|
+
// Intercept console.info
|
|
40
|
+
console.info = (...args) => {
|
|
41
|
+
logger.info(this.formatMessage(args));
|
|
42
|
+
};
|
|
43
|
+
// Intercept console.warn
|
|
44
|
+
console.warn = (...args) => {
|
|
45
|
+
logger.warn(this.formatMessage(args));
|
|
46
|
+
};
|
|
47
|
+
// Intercept console.error
|
|
48
|
+
console.error = (...args) => {
|
|
49
|
+
const message = this.formatMessage(args);
|
|
50
|
+
const error = args.find(arg => arg instanceof Error);
|
|
51
|
+
logger.error(message, error);
|
|
52
|
+
};
|
|
53
|
+
// Intercept console.trace
|
|
54
|
+
console.trace = (...args) => {
|
|
55
|
+
const message = this.formatMessage(args);
|
|
56
|
+
logger.debug(message, {
|
|
57
|
+
stack: new Error().stack,
|
|
58
|
+
tags: ['trace']
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
this.isIntercepting = true;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Stop intercepting and restore original console methods
|
|
65
|
+
*/
|
|
66
|
+
restore() {
|
|
67
|
+
if (!this.isIntercepting) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
console.log = this.originalConsole.log;
|
|
71
|
+
console.debug = this.originalConsole.debug;
|
|
72
|
+
console.info = this.originalConsole.info;
|
|
73
|
+
console.warn = this.originalConsole.warn;
|
|
74
|
+
console.error = this.originalConsole.error;
|
|
75
|
+
console.trace = this.originalConsole.trace;
|
|
76
|
+
this.isIntercepting = false;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get original console for direct access
|
|
80
|
+
*/
|
|
81
|
+
getOriginalConsole() {
|
|
82
|
+
return this.originalConsole;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Format console arguments into a single message
|
|
86
|
+
*/
|
|
87
|
+
formatMessage(args) {
|
|
88
|
+
return args
|
|
89
|
+
.map(arg => {
|
|
90
|
+
if (typeof arg === 'string') {
|
|
91
|
+
return arg;
|
|
92
|
+
}
|
|
93
|
+
if (arg instanceof Error) {
|
|
94
|
+
return `${arg.name}: ${arg.message}`;
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
return JSON.stringify(arg);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return String(arg);
|
|
101
|
+
}
|
|
102
|
+
})
|
|
103
|
+
.join(' ');
|
|
104
|
+
}
|
|
105
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple event emitter for internal use
|
|
3
|
+
*/
|
|
4
|
+
export declare class EventEmitter {
|
|
5
|
+
private listeners;
|
|
6
|
+
on(event: string, handler: Function): void;
|
|
7
|
+
off(event: string, handler: Function): void;
|
|
8
|
+
emit(event: string, ...args: any[]): void;
|
|
9
|
+
clear(): void;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=event-emitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-emitter.d.ts","sourceRoot":"","sources":["../../src/utils/event-emitter.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAoC;IAErD,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,IAAI;IAO1C,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,IAAI;IAU3C,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAazC,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple event emitter for internal use
|
|
3
|
+
*/
|
|
4
|
+
export class EventEmitter {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.listeners = new Map();
|
|
7
|
+
}
|
|
8
|
+
on(event, handler) {
|
|
9
|
+
if (!this.listeners.has(event)) {
|
|
10
|
+
this.listeners.set(event, new Set());
|
|
11
|
+
}
|
|
12
|
+
this.listeners.get(event).add(handler);
|
|
13
|
+
}
|
|
14
|
+
off(event, handler) {
|
|
15
|
+
const handlers = this.listeners.get(event);
|
|
16
|
+
if (handlers) {
|
|
17
|
+
handlers.delete(handler);
|
|
18
|
+
if (handlers.size === 0) {
|
|
19
|
+
this.listeners.delete(event);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
emit(event, ...args) {
|
|
24
|
+
const handlers = this.listeners.get(event);
|
|
25
|
+
if (handlers) {
|
|
26
|
+
handlers.forEach(handler => {
|
|
27
|
+
try {
|
|
28
|
+
handler(...args);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
console.error(`[EventEmitter] Error in handler for '${event}':`, error);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
clear() {
|
|
37
|
+
this.listeners.clear();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hamak/logging-impl",
|
|
3
|
+
"version": "0.4.1",
|
|
4
|
+
"description": "Logging Implementation - Core implementation of the pluggable logging system",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"default": "./dist/index.js",
|
|
13
|
+
"legacy": "./dist/es2015/index.js"
|
|
14
|
+
},
|
|
15
|
+
"./es2015": {
|
|
16
|
+
"import": "./dist/es2015/index.js",
|
|
17
|
+
"default": "./dist/es2015/index.js"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist"
|
|
22
|
+
],
|
|
23
|
+
"repository": {
|
|
24
|
+
"type": "git",
|
|
25
|
+
"url": "https://github.com/amah/app-framework.git",
|
|
26
|
+
"directory": "packages/logging/logging-impl"
|
|
27
|
+
},
|
|
28
|
+
"publishConfig": {
|
|
29
|
+
"access": "public"
|
|
30
|
+
},
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build": "tsc -p tsconfig.lib.json && tsc -p tsconfig.es2015.json",
|
|
33
|
+
"clean": "rm -rf dist"
|
|
34
|
+
},
|
|
35
|
+
"keywords": [
|
|
36
|
+
"logging",
|
|
37
|
+
"implementation",
|
|
38
|
+
"microkernel"
|
|
39
|
+
],
|
|
40
|
+
"author": "",
|
|
41
|
+
"license": "MIT",
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"@hamak/logging-api": "0.4.0",
|
|
44
|
+
"@hamak/logging-spi": "0.4.0",
|
|
45
|
+
"@hamak/microkernel-api": "0.4.0",
|
|
46
|
+
"@hamak/microkernel-spi": "0.4.0"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@testing-library/jest-dom": "^6.9.1",
|
|
50
|
+
"typescript": "^5.9.3",
|
|
51
|
+
"vitest": "^3.2.4",
|
|
52
|
+
"jsdom": "^27.0.0"
|
|
53
|
+
}
|
|
54
|
+
}
|