@mcp-abap-adt/logger 0.1.1 → 0.1.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/CHANGELOG.md +29 -0
- package/README.md +69 -45
- package/dist/default-logger.d.ts +20 -0
- package/dist/default-logger.js +70 -0
- package/dist/index.d.ts +10 -3
- package/dist/index.js +15 -11
- package/dist/pino-logger.d.ts +27 -0
- package/dist/pino-logger.js +127 -0
- package/dist/types.d.ts +15 -0
- package/dist/types.js +28 -0
- package/package.json +16 -2
- package/dist/logger.d.ts +0 -24
- package/dist/logger.js +0 -202
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,35 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.1.2] - 2025-12-19
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **PinoLogger Implementation**: Added `PinoLogger` class for structured logging using Pino
|
|
14
|
+
- Async logger for server use with pino-pretty formatting
|
|
15
|
+
- Falls back to `DefaultLogger` if pino is not installed
|
|
16
|
+
- Includes icons in log messages (ℹ️ info, 🐛 debug, ⚠️ warn, 💥 error)
|
|
17
|
+
- Optional peer dependencies: `pino@^10.1.0` and `pino-pretty@^13.1.3`
|
|
18
|
+
- **Usage**: `import { PinoLogger } from '@mcp-abap-adt/logger'; const logger = new PinoLogger();`
|
|
19
|
+
- **LogLevel from Interfaces**: Now uses `LogLevel` enum from `@mcp-abap-adt/interfaces` package
|
|
20
|
+
- Standardized log level constants across all packages
|
|
21
|
+
- **Migration**: Import `LogLevel` from `@mcp-abap-adt/interfaces` instead of local enum
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
- **Package Structure Refactoring**: Reorganized code into separate files
|
|
25
|
+
- `default-logger.ts`: `DefaultLogger` implementation with icons and prefixes
|
|
26
|
+
- `pino-logger.ts`: `PinoLogger` implementation
|
|
27
|
+
- `types.ts`: Type definitions and utility functions (`getLogLevel`, `Logger` type)
|
|
28
|
+
- `index.ts`: Main entry point with all exports
|
|
29
|
+
- **DefaultLogger Enhancement**: Added icons to log messages
|
|
30
|
+
- Format: `[LEVEL] icon message` (e.g., `[INFO] ℹ️ Test message`)
|
|
31
|
+
- Icons: ℹ️ (info), 🐛 (debug), ⚠️ (warn), 💥 (error)
|
|
32
|
+
- **Dependency Update**: Updated `@mcp-abap-adt/interfaces` to `^0.1.14` (requires LogLevel export)
|
|
33
|
+
|
|
34
|
+
### Removed
|
|
35
|
+
- **Local LogLevel Enum**: Removed duplicate `LogLevel` enum from logger package
|
|
36
|
+
- Now imported from `@mcp-abap-adt/interfaces`
|
|
37
|
+
- **Migration**: Update imports: `import { LogLevel } from '@mcp-abap-adt/interfaces';`
|
|
38
|
+
|
|
10
39
|
## [0.1.1] - 2025-12-05
|
|
11
40
|
|
|
12
41
|
### Changed
|
package/README.md
CHANGED
|
@@ -8,32 +8,65 @@ Logger interface and implementations for MCP ABAP ADT packages.
|
|
|
8
8
|
npm install @mcp-abap-adt/logger
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
+
For structured logging with Pino (optional):
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install pino pino-pretty
|
|
15
|
+
```
|
|
16
|
+
|
|
11
17
|
## Usage
|
|
12
18
|
|
|
13
|
-
###
|
|
19
|
+
### DefaultLogger (Synchronous)
|
|
20
|
+
|
|
21
|
+
`DefaultLogger` provides synchronous logging with icons and level prefixes, ideal for tests and CLI tools:
|
|
14
22
|
|
|
15
23
|
```typescript
|
|
16
|
-
import {
|
|
24
|
+
import { defaultLogger, DefaultLogger, LogLevel } from '@mcp-abap-adt/logger';
|
|
17
25
|
|
|
18
|
-
// Use default logger
|
|
26
|
+
// Use default logger singleton
|
|
19
27
|
defaultLogger.info('Hello, world!');
|
|
20
28
|
defaultLogger.debug('Debug message');
|
|
21
29
|
defaultLogger.error('Error message');
|
|
22
30
|
defaultLogger.warn('Warning message');
|
|
23
31
|
|
|
24
|
-
//
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
defaultLogger.browserUrl('https://example.com/auth');
|
|
29
|
-
defaultLogger.browserOpening();
|
|
30
|
-
defaultLogger.testSkip('Test skipped');
|
|
32
|
+
// Create custom logger instance with specific log level
|
|
33
|
+
const logger = new DefaultLogger(LogLevel.DEBUG);
|
|
34
|
+
logger.info('Test info'); // Output: [INFO] ℹ️ Test info
|
|
35
|
+
logger.debug('Test debug'); // Output: [DEBUG] 🐛 Test debug
|
|
31
36
|
```
|
|
32
37
|
|
|
38
|
+
### PinoLogger (Asynchronous)
|
|
39
|
+
|
|
40
|
+
`PinoLogger` provides structured logging using Pino, ideal for server applications:
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
import { PinoLogger, LogLevel } from '@mcp-abap-adt/logger';
|
|
44
|
+
|
|
45
|
+
// Create Pino logger (falls back to DefaultLogger if pino is not installed)
|
|
46
|
+
const logger = new PinoLogger(LogLevel.DEBUG);
|
|
47
|
+
logger.info('Server started'); // Output: ℹ️ Server started (with pino-pretty formatting)
|
|
48
|
+
logger.debug('Debug info');
|
|
49
|
+
logger.error('Error occurred');
|
|
50
|
+
logger.warn('Warning message');
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Note**: `PinoLogger` uses async transport, so logs may appear after test completion in Jest. This is expected behavior for server use.
|
|
54
|
+
|
|
33
55
|
### Log Levels
|
|
34
56
|
|
|
35
|
-
|
|
57
|
+
Log levels are defined in `@mcp-abap-adt/interfaces` and controlled by `AUTH_LOG_LEVEL` environment variable:
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
import { LogLevel } from '@mcp-abap-adt/interfaces';
|
|
61
|
+
|
|
62
|
+
// LogLevel enum values:
|
|
63
|
+
// LogLevel.ERROR = 0
|
|
64
|
+
// LogLevel.WARN = 1
|
|
65
|
+
// LogLevel.INFO = 2
|
|
66
|
+
// LogLevel.DEBUG = 3
|
|
67
|
+
```
|
|
36
68
|
|
|
69
|
+
Environment variable values:
|
|
37
70
|
- `error` - only errors
|
|
38
71
|
- `warn` - errors and warnings
|
|
39
72
|
- `info` - errors, warnings, and info (default)
|
|
@@ -47,55 +80,46 @@ For backward compatibility, `DEBUG_AUTH_LOG=true` also sets level to debug.
|
|
|
47
80
|
|
|
48
81
|
### Logger Interface
|
|
49
82
|
|
|
83
|
+
All logger implementations implement the `ILogger` interface from `@mcp-abap-adt/interfaces`:
|
|
84
|
+
|
|
50
85
|
```typescript
|
|
51
|
-
import type {
|
|
86
|
+
import type { ILogger } from '@mcp-abap-adt/interfaces';
|
|
52
87
|
|
|
53
|
-
|
|
54
|
-
info(message: string): void
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
warn(message: string): void {
|
|
64
|
-
// Custom implementation
|
|
65
|
-
}
|
|
66
|
-
browserAuth(message: string): void {
|
|
67
|
-
// Custom implementation
|
|
68
|
-
}
|
|
69
|
-
refresh(message: string): void {
|
|
70
|
-
// Custom implementation
|
|
71
|
-
}
|
|
72
|
-
success(message: string): void {
|
|
88
|
+
interface ILogger {
|
|
89
|
+
info(message: string, meta?: any): void;
|
|
90
|
+
debug(message: string, meta?: any): void;
|
|
91
|
+
error(message: string, meta?: any): void;
|
|
92
|
+
warn(message: string, meta?: any): void;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Create custom logger
|
|
96
|
+
class MyCustomLogger implements ILogger {
|
|
97
|
+
info(message: string, meta?: any): void {
|
|
73
98
|
// Custom implementation
|
|
74
99
|
}
|
|
75
|
-
|
|
100
|
+
debug(message: string, meta?: any): void {
|
|
76
101
|
// Custom implementation
|
|
77
102
|
}
|
|
78
|
-
|
|
103
|
+
error(message: string, meta?: any): void {
|
|
79
104
|
// Custom implementation
|
|
80
105
|
}
|
|
81
|
-
|
|
106
|
+
warn(message: string, meta?: any): void {
|
|
82
107
|
// Custom implementation
|
|
83
108
|
}
|
|
84
109
|
}
|
|
85
110
|
```
|
|
86
111
|
|
|
87
|
-
###
|
|
88
|
-
|
|
89
|
-
For backward compatibility, convenience functions are also exported:
|
|
112
|
+
### Output Format
|
|
90
113
|
|
|
91
|
-
|
|
92
|
-
|
|
114
|
+
**DefaultLogger** output format:
|
|
115
|
+
- `[INFO] ℹ️ message`
|
|
116
|
+
- `[DEBUG] 🐛 message`
|
|
117
|
+
- `[ERROR] 💥 message`
|
|
118
|
+
- `[WARN] ⚠️ message`
|
|
93
119
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
warn('Warning message');
|
|
98
|
-
```
|
|
120
|
+
**PinoLogger** output format (with pino-pretty):
|
|
121
|
+
- Structured JSON in production
|
|
122
|
+
- Pretty formatted with colors and icons in development (NODE_ENV !== 'production')
|
|
99
123
|
|
|
100
124
|
## License
|
|
101
125
|
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default logger implementation
|
|
3
|
+
* Controls output based on AUTH_LOG_LEVEL environment variable:
|
|
4
|
+
* - error: only errors
|
|
5
|
+
* - warn: errors and warnings
|
|
6
|
+
* - info: errors, warnings, and info (default)
|
|
7
|
+
* - debug: all messages
|
|
8
|
+
*
|
|
9
|
+
* Uses process.stdout/stderr for clean output without stack traces
|
|
10
|
+
*/
|
|
11
|
+
import type { ILogger } from '@mcp-abap-adt/interfaces';
|
|
12
|
+
import { LogLevel } from '@mcp-abap-adt/interfaces';
|
|
13
|
+
export declare class DefaultLogger implements ILogger {
|
|
14
|
+
private readonly logLevel;
|
|
15
|
+
constructor(logLevel?: LogLevel);
|
|
16
|
+
info(message: string, meta?: any): void;
|
|
17
|
+
debug(message: string, meta?: any): void;
|
|
18
|
+
error(message: string, meta?: any): void;
|
|
19
|
+
warn(message: string, meta?: any): void;
|
|
20
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Default logger implementation
|
|
4
|
+
* Controls output based on AUTH_LOG_LEVEL environment variable:
|
|
5
|
+
* - error: only errors
|
|
6
|
+
* - warn: errors and warnings
|
|
7
|
+
* - info: errors, warnings, and info (default)
|
|
8
|
+
* - debug: all messages
|
|
9
|
+
*
|
|
10
|
+
* Uses process.stdout/stderr for clean output without stack traces
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.DefaultLogger = void 0;
|
|
14
|
+
const interfaces_1 = require("@mcp-abap-adt/interfaces");
|
|
15
|
+
const types_1 = require("./types");
|
|
16
|
+
class DefaultLogger {
|
|
17
|
+
logLevel;
|
|
18
|
+
constructor(logLevel) {
|
|
19
|
+
this.logLevel = logLevel ?? (0, types_1.getLogLevel)();
|
|
20
|
+
}
|
|
21
|
+
info(message, meta) {
|
|
22
|
+
if (this.logLevel >= interfaces_1.LogLevel.INFO) {
|
|
23
|
+
const icon = 'ℹ️';
|
|
24
|
+
if (meta) {
|
|
25
|
+
process.stdout.write(`[INFO] ${icon} ${message}\n`);
|
|
26
|
+
process.stdout.write(`${JSON.stringify(meta)}\n`);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
process.stdout.write(`[INFO] ${icon} ${message}\n`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
debug(message, meta) {
|
|
34
|
+
if (this.logLevel >= interfaces_1.LogLevel.DEBUG) {
|
|
35
|
+
const icon = '🐛';
|
|
36
|
+
if (meta) {
|
|
37
|
+
process.stdout.write(`[DEBUG] ${icon} ${message}\n`);
|
|
38
|
+
process.stdout.write(`${JSON.stringify(meta)}\n`);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
process.stdout.write(`[DEBUG] ${icon} ${message}\n`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
error(message, meta) {
|
|
46
|
+
if (this.logLevel >= interfaces_1.LogLevel.ERROR) {
|
|
47
|
+
const icon = '💥';
|
|
48
|
+
if (meta) {
|
|
49
|
+
process.stderr.write(`[ERROR] ${icon} ${message}\n`);
|
|
50
|
+
process.stderr.write(`${JSON.stringify(meta)}\n`);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
process.stderr.write(`[ERROR] ${icon} ${message}\n`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
warn(message, meta) {
|
|
58
|
+
if (this.logLevel >= interfaces_1.LogLevel.WARN) {
|
|
59
|
+
const icon = '⚠️';
|
|
60
|
+
if (meta) {
|
|
61
|
+
process.stderr.write(`[WARN] ${icon} ${message}\n`);
|
|
62
|
+
process.stderr.write(`${JSON.stringify(meta)}\n`);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
process.stderr.write(`[WARN] ${icon} ${message}\n`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.DefaultLogger = DefaultLogger;
|
package/dist/index.d.ts
CHANGED
|
@@ -2,7 +2,14 @@
|
|
|
2
2
|
* @mcp-abap-adt/logger
|
|
3
3
|
* Logger interface and implementations for MCP ABAP ADT packages
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
import type { ILogger } from '@mcp-abap-adt/interfaces';
|
|
6
|
+
import { LogLevel } from '@mcp-abap-adt/interfaces';
|
|
7
|
+
import { DefaultLogger } from './default-logger';
|
|
8
|
+
import { PinoLogger } from './pino-logger';
|
|
9
|
+
export type { Logger } from './types';
|
|
10
|
+
export { getLogLevel } from './types';
|
|
11
|
+
export { LogLevel };
|
|
12
|
+
export declare const defaultLogger: ILogger;
|
|
13
|
+
export declare const pinoLogger: ILogger;
|
|
14
|
+
export { DefaultLogger, PinoLogger };
|
|
7
15
|
export type { ILogger } from '@mcp-abap-adt/interfaces';
|
|
8
|
-
export { info, debug, error, warn, } from './logger';
|
package/dist/index.js
CHANGED
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.warn = exports.error = exports.debug = exports.info = exports.testLogger = exports.defaultLogger = exports.LogLevel = void 0;
|
|
4
2
|
/**
|
|
5
3
|
* @mcp-abap-adt/logger
|
|
6
4
|
* Logger interface and implementations for MCP ABAP ADT packages
|
|
7
5
|
*/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
Object.defineProperty(exports, "
|
|
12
|
-
|
|
13
|
-
Object.defineProperty(exports, "
|
|
14
|
-
|
|
15
|
-
Object.defineProperty(exports, "
|
|
16
|
-
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.PinoLogger = exports.DefaultLogger = exports.pinoLogger = exports.defaultLogger = exports.LogLevel = exports.getLogLevel = void 0;
|
|
8
|
+
const interfaces_1 = require("@mcp-abap-adt/interfaces");
|
|
9
|
+
Object.defineProperty(exports, "LogLevel", { enumerable: true, get: function () { return interfaces_1.LogLevel; } });
|
|
10
|
+
const default_logger_1 = require("./default-logger");
|
|
11
|
+
Object.defineProperty(exports, "DefaultLogger", { enumerable: true, get: function () { return default_logger_1.DefaultLogger; } });
|
|
12
|
+
const pino_logger_1 = require("./pino-logger");
|
|
13
|
+
Object.defineProperty(exports, "PinoLogger", { enumerable: true, get: function () { return pino_logger_1.PinoLogger; } });
|
|
14
|
+
var types_1 = require("./types");
|
|
15
|
+
Object.defineProperty(exports, "getLogLevel", { enumerable: true, get: function () { return types_1.getLogLevel; } });
|
|
16
|
+
// Default logger instance (singleton)
|
|
17
|
+
exports.defaultLogger = new default_logger_1.DefaultLogger();
|
|
18
|
+
// Pino logger instance (falls back to DefaultLogger if pino is not installed)
|
|
19
|
+
// Async logger for server use
|
|
20
|
+
exports.pinoLogger = new pino_logger_1.PinoLogger();
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PinoLogger - Structured logging using Pino (optional dependency)
|
|
3
|
+
*
|
|
4
|
+
* If pino is not installed, falls back to DefaultLogger behavior.
|
|
5
|
+
*
|
|
6
|
+
* Install pino: npm install pino pino-pretty
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { PinoLogger } from '@mcp-abap-adt/logger';
|
|
11
|
+
* const logger = new PinoLogger();
|
|
12
|
+
* logger.info('Test message');
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
import type { ILogger } from '@mcp-abap-adt/interfaces';
|
|
16
|
+
import { LogLevel } from '@mcp-abap-adt/interfaces';
|
|
17
|
+
export declare class PinoLogger implements ILogger {
|
|
18
|
+
private pinoLogger;
|
|
19
|
+
private logLevel;
|
|
20
|
+
private fallbackLogger;
|
|
21
|
+
constructor(logLevel?: LogLevel);
|
|
22
|
+
private logLevelToPinoLevel;
|
|
23
|
+
info(message: string, meta?: any): void;
|
|
24
|
+
debug(message: string, meta?: any): void;
|
|
25
|
+
warn(message: string, meta?: any): void;
|
|
26
|
+
error(message: string, meta?: any): void;
|
|
27
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* PinoLogger - Structured logging using Pino (optional dependency)
|
|
4
|
+
*
|
|
5
|
+
* If pino is not installed, falls back to DefaultLogger behavior.
|
|
6
|
+
*
|
|
7
|
+
* Install pino: npm install pino pino-pretty
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* ```typescript
|
|
11
|
+
* import { PinoLogger } from '@mcp-abap-adt/logger';
|
|
12
|
+
* const logger = new PinoLogger();
|
|
13
|
+
* logger.info('Test message');
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.PinoLogger = void 0;
|
|
18
|
+
const interfaces_1 = require("@mcp-abap-adt/interfaces");
|
|
19
|
+
const default_logger_1 = require("./default-logger");
|
|
20
|
+
const types_1 = require("./types");
|
|
21
|
+
class PinoLogger {
|
|
22
|
+
pinoLogger;
|
|
23
|
+
logLevel;
|
|
24
|
+
fallbackLogger;
|
|
25
|
+
constructor(logLevel) {
|
|
26
|
+
this.logLevel = logLevel ?? (0, types_1.getLogLevel)();
|
|
27
|
+
this.fallbackLogger = new default_logger_1.DefaultLogger(this.logLevel);
|
|
28
|
+
try {
|
|
29
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
30
|
+
const pino = require('pino');
|
|
31
|
+
const isDev = process.env.NODE_ENV !== 'production';
|
|
32
|
+
this.pinoLogger = pino({
|
|
33
|
+
level: this.logLevelToPinoLevel(this.logLevel),
|
|
34
|
+
redact: ['password', 'token', 'headers.authorization'],
|
|
35
|
+
transport: isDev
|
|
36
|
+
? {
|
|
37
|
+
target: 'pino-pretty',
|
|
38
|
+
options: {
|
|
39
|
+
colorize: true,
|
|
40
|
+
},
|
|
41
|
+
}
|
|
42
|
+
: undefined,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
this.pinoLogger = null;
|
|
47
|
+
// Log error in development for debugging
|
|
48
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
49
|
+
console.error('PinoLogger initialization error:', error?.message || error);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
logLevelToPinoLevel(level) {
|
|
54
|
+
switch (level) {
|
|
55
|
+
case interfaces_1.LogLevel.ERROR: return 'error';
|
|
56
|
+
case interfaces_1.LogLevel.WARN: return 'warn';
|
|
57
|
+
case interfaces_1.LogLevel.INFO: return 'info';
|
|
58
|
+
case interfaces_1.LogLevel.DEBUG: return 'debug';
|
|
59
|
+
default: return 'info';
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
info(message, meta) {
|
|
63
|
+
if (this.logLevel < interfaces_1.LogLevel.INFO)
|
|
64
|
+
return;
|
|
65
|
+
if (this.pinoLogger) {
|
|
66
|
+
const iconMessage = `ℹ️ ${message}`;
|
|
67
|
+
if (meta) {
|
|
68
|
+
this.pinoLogger.info(meta, iconMessage);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
this.pinoLogger.info(iconMessage);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
this.fallbackLogger.info(message, meta);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
debug(message, meta) {
|
|
79
|
+
if (this.logLevel < interfaces_1.LogLevel.DEBUG)
|
|
80
|
+
return;
|
|
81
|
+
if (this.pinoLogger) {
|
|
82
|
+
const iconMessage = `🐛 ${message}`;
|
|
83
|
+
if (meta) {
|
|
84
|
+
this.pinoLogger.debug(meta, iconMessage);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
this.pinoLogger.debug(iconMessage);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
this.fallbackLogger.debug(message, meta);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
warn(message, meta) {
|
|
95
|
+
if (this.logLevel < interfaces_1.LogLevel.WARN)
|
|
96
|
+
return;
|
|
97
|
+
if (this.pinoLogger) {
|
|
98
|
+
const iconMessage = `⚠️ ${message}`;
|
|
99
|
+
if (meta) {
|
|
100
|
+
this.pinoLogger.warn(meta, iconMessage);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
this.pinoLogger.warn(iconMessage);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
this.fallbackLogger.warn(message, meta);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
error(message, meta) {
|
|
111
|
+
if (this.logLevel < interfaces_1.LogLevel.ERROR)
|
|
112
|
+
return;
|
|
113
|
+
if (this.pinoLogger) {
|
|
114
|
+
const iconMessage = `💥 ${message}`;
|
|
115
|
+
if (meta) {
|
|
116
|
+
this.pinoLogger.error(meta, iconMessage);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
this.pinoLogger.error(iconMessage);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
this.fallbackLogger.error(message, meta);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
exports.PinoLogger = PinoLogger;
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types and utilities for logger
|
|
3
|
+
*/
|
|
4
|
+
import { LogLevel } from '@mcp-abap-adt/interfaces';
|
|
5
|
+
/**
|
|
6
|
+
* Logger interface - re-exported from @mcp-abap-adt/interfaces for backward compatibility
|
|
7
|
+
* @deprecated Use ILogger from @mcp-abap-adt/interfaces for new code
|
|
8
|
+
*/
|
|
9
|
+
export type Logger = import('@mcp-abap-adt/interfaces').ILogger;
|
|
10
|
+
/**
|
|
11
|
+
* Get log level from environment variable
|
|
12
|
+
* AUTH_LOG_LEVEL can be: error, warn, info, debug
|
|
13
|
+
* DEBUG_AUTH_LOG=true is also supported for backward compatibility (sets level to debug)
|
|
14
|
+
*/
|
|
15
|
+
export declare function getLogLevel(): LogLevel;
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Types and utilities for logger
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getLogLevel = getLogLevel;
|
|
7
|
+
const interfaces_1 = require("@mcp-abap-adt/interfaces");
|
|
8
|
+
/**
|
|
9
|
+
* Get log level from environment variable
|
|
10
|
+
* AUTH_LOG_LEVEL can be: error, warn, info, debug
|
|
11
|
+
* DEBUG_AUTH_LOG=true is also supported for backward compatibility (sets level to debug)
|
|
12
|
+
*/
|
|
13
|
+
function getLogLevel() {
|
|
14
|
+
const level = process.env.AUTH_LOG_LEVEL?.toLowerCase();
|
|
15
|
+
if (level === 'error')
|
|
16
|
+
return interfaces_1.LogLevel.ERROR;
|
|
17
|
+
if (level === 'warn')
|
|
18
|
+
return interfaces_1.LogLevel.WARN;
|
|
19
|
+
if (level === 'info')
|
|
20
|
+
return interfaces_1.LogLevel.INFO;
|
|
21
|
+
if (level === 'debug')
|
|
22
|
+
return interfaces_1.LogLevel.DEBUG;
|
|
23
|
+
// Backward compatibility
|
|
24
|
+
if (process.env.DEBUG_AUTH_LOG === 'true')
|
|
25
|
+
return interfaces_1.LogLevel.DEBUG;
|
|
26
|
+
// Default: info level
|
|
27
|
+
return interfaces_1.LogLevel.INFO;
|
|
28
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mcp-abap-adt/logger",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Logger interface and implementations for MCP ABAP ADT packages",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -44,12 +44,26 @@
|
|
|
44
44
|
"node": ">=18.0.0"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@mcp-abap-adt/interfaces": "^0.1.
|
|
47
|
+
"@mcp-abap-adt/interfaces": "^0.1.14"
|
|
48
|
+
},
|
|
49
|
+
"peerDependencies": {
|
|
50
|
+
"pino": "^10.1.0",
|
|
51
|
+
"pino-pretty": "^13.1.3"
|
|
52
|
+
},
|
|
53
|
+
"peerDependenciesMeta": {
|
|
54
|
+
"pino": {
|
|
55
|
+
"optional": true
|
|
56
|
+
},
|
|
57
|
+
"pino-pretty": {
|
|
58
|
+
"optional": true
|
|
59
|
+
}
|
|
48
60
|
},
|
|
49
61
|
"devDependencies": {
|
|
50
62
|
"@types/jest": "^30.0.0",
|
|
51
63
|
"@types/node": "^24.2.1",
|
|
52
64
|
"jest": "^30.2.0",
|
|
65
|
+
"pino": "^10.1.0",
|
|
66
|
+
"pino-pretty": "^13.1.3",
|
|
53
67
|
"ts-jest": "^29.2.5",
|
|
54
68
|
"typescript": "^5.9.2"
|
|
55
69
|
}
|
package/dist/logger.d.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Logger interface and implementations for MCP ABAP ADT packages
|
|
3
|
-
*/
|
|
4
|
-
import type { ILogger } from '@mcp-abap-adt/interfaces';
|
|
5
|
-
/**
|
|
6
|
-
* Log levels
|
|
7
|
-
*/
|
|
8
|
-
export declare enum LogLevel {
|
|
9
|
-
ERROR = 0,
|
|
10
|
-
WARN = 1,
|
|
11
|
-
INFO = 2,
|
|
12
|
-
DEBUG = 3
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Logger interface - re-exported from @mcp-abap-adt/interfaces for backward compatibility
|
|
16
|
-
* @deprecated Use ILogger from @mcp-abap-adt/interfaces for new code
|
|
17
|
-
*/
|
|
18
|
-
export type Logger = ILogger;
|
|
19
|
-
export declare const defaultLogger: ILogger;
|
|
20
|
-
export declare const testLogger: ILogger;
|
|
21
|
-
export declare function info(message: string, meta?: any): void;
|
|
22
|
-
export declare function debug(message: string, meta?: any): void;
|
|
23
|
-
export declare function error(message: string, meta?: any): void;
|
|
24
|
-
export declare function warn(message: string, meta?: any): void;
|
package/dist/logger.js
DELETED
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Logger interface and implementations for MCP ABAP ADT packages
|
|
4
|
-
*/
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.testLogger = exports.defaultLogger = exports.LogLevel = void 0;
|
|
7
|
-
exports.info = info;
|
|
8
|
-
exports.debug = debug;
|
|
9
|
-
exports.error = error;
|
|
10
|
-
exports.warn = warn;
|
|
11
|
-
/**
|
|
12
|
-
* Log levels
|
|
13
|
-
*/
|
|
14
|
-
var LogLevel;
|
|
15
|
-
(function (LogLevel) {
|
|
16
|
-
LogLevel[LogLevel["ERROR"] = 0] = "ERROR";
|
|
17
|
-
LogLevel[LogLevel["WARN"] = 1] = "WARN";
|
|
18
|
-
LogLevel[LogLevel["INFO"] = 2] = "INFO";
|
|
19
|
-
LogLevel[LogLevel["DEBUG"] = 3] = "DEBUG";
|
|
20
|
-
})(LogLevel || (exports.LogLevel = LogLevel = {}));
|
|
21
|
-
/**
|
|
22
|
-
* Get log level from environment variable
|
|
23
|
-
* AUTH_LOG_LEVEL can be: error, warn, info, debug
|
|
24
|
-
* DEBUG_AUTH_LOG=true is also supported for backward compatibility (sets level to debug)
|
|
25
|
-
*/
|
|
26
|
-
function getLogLevel() {
|
|
27
|
-
const level = process.env.AUTH_LOG_LEVEL?.toLowerCase();
|
|
28
|
-
if (level === 'error')
|
|
29
|
-
return LogLevel.ERROR;
|
|
30
|
-
if (level === 'warn')
|
|
31
|
-
return LogLevel.WARN;
|
|
32
|
-
if (level === 'info')
|
|
33
|
-
return LogLevel.INFO;
|
|
34
|
-
if (level === 'debug')
|
|
35
|
-
return LogLevel.DEBUG;
|
|
36
|
-
// Backward compatibility
|
|
37
|
-
if (process.env.DEBUG_AUTH_LOG === 'true')
|
|
38
|
-
return LogLevel.DEBUG;
|
|
39
|
-
// Default: info level
|
|
40
|
-
return LogLevel.INFO;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Default logger implementation
|
|
44
|
-
* Controls output based on AUTH_LOG_LEVEL environment variable:
|
|
45
|
-
* - error: only errors
|
|
46
|
-
* - warn: errors and warnings
|
|
47
|
-
* - info: errors, warnings, and info (default)
|
|
48
|
-
* - debug: all messages
|
|
49
|
-
*/
|
|
50
|
-
class DefaultLogger {
|
|
51
|
-
logLevel;
|
|
52
|
-
constructor(logLevel) {
|
|
53
|
-
this.logLevel = logLevel ?? getLogLevel();
|
|
54
|
-
}
|
|
55
|
-
info(message, meta) {
|
|
56
|
-
if (this.logLevel >= LogLevel.INFO) {
|
|
57
|
-
if (meta) {
|
|
58
|
-
console.info(message, meta);
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
console.info(message);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
debug(message, meta) {
|
|
66
|
-
if (this.logLevel >= LogLevel.DEBUG) {
|
|
67
|
-
if (meta) {
|
|
68
|
-
console.debug(`[DEBUG] ${message}`, meta);
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
console.debug(`[DEBUG] ${message}`);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
error(message, meta) {
|
|
76
|
-
if (this.logLevel >= LogLevel.ERROR) {
|
|
77
|
-
if (meta) {
|
|
78
|
-
console.error(message, meta);
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
console.error(message);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
warn(message, meta) {
|
|
86
|
-
if (this.logLevel >= LogLevel.WARN) {
|
|
87
|
-
if (meta) {
|
|
88
|
-
console.warn(`[WARN] ${message}`, meta);
|
|
89
|
-
}
|
|
90
|
-
else {
|
|
91
|
-
console.warn(`[WARN] ${message}`);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
browserAuth(message) {
|
|
96
|
-
this.info(`🌐 ${message}`);
|
|
97
|
-
}
|
|
98
|
-
refresh(message) {
|
|
99
|
-
this.info(`🔄 ${message}`);
|
|
100
|
-
}
|
|
101
|
-
success(message) {
|
|
102
|
-
this.info(`✅ ${message}`);
|
|
103
|
-
}
|
|
104
|
-
browserUrl(url) {
|
|
105
|
-
// Always show URL when browser is not opened automatically (user needs to open manually)
|
|
106
|
-
this.info(`🔗 Open in browser: ${url}`);
|
|
107
|
-
}
|
|
108
|
-
browserOpening() {
|
|
109
|
-
// Only show when debug is enabled (browser opens automatically)
|
|
110
|
-
this.debug(`🌐 Opening browser for authentication...`);
|
|
111
|
-
}
|
|
112
|
-
testSkip(message) {
|
|
113
|
-
this.info(`⏭️ ${message}`);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Test logger implementation
|
|
118
|
-
* Uses same log levels as DefaultLogger
|
|
119
|
-
*/
|
|
120
|
-
class TestLogger {
|
|
121
|
-
logLevel;
|
|
122
|
-
constructor(logLevel) {
|
|
123
|
-
this.logLevel = logLevel ?? getLogLevel();
|
|
124
|
-
}
|
|
125
|
-
info(message, meta) {
|
|
126
|
-
if (this.logLevel >= LogLevel.INFO) {
|
|
127
|
-
if (meta) {
|
|
128
|
-
console.info(message, meta);
|
|
129
|
-
}
|
|
130
|
-
else {
|
|
131
|
-
console.info(message);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
debug(message, meta) {
|
|
136
|
-
if (this.logLevel >= LogLevel.DEBUG) {
|
|
137
|
-
if (meta) {
|
|
138
|
-
console.info(`[DEBUG] ${message}`, meta);
|
|
139
|
-
}
|
|
140
|
-
else {
|
|
141
|
-
console.info(`[DEBUG] ${message}`);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
error(message, meta) {
|
|
146
|
-
if (this.logLevel >= LogLevel.ERROR) {
|
|
147
|
-
if (meta) {
|
|
148
|
-
console.error(message, meta);
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
console.error(message);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
warn(message, meta) {
|
|
156
|
-
if (this.logLevel >= LogLevel.WARN) {
|
|
157
|
-
if (meta) {
|
|
158
|
-
console.warn(`[WARN] ${message}`, meta);
|
|
159
|
-
}
|
|
160
|
-
else {
|
|
161
|
-
console.warn(`[WARN] ${message}`);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
browserAuth(message) {
|
|
166
|
-
this.info(`🌐 ${message}`);
|
|
167
|
-
}
|
|
168
|
-
refresh(message) {
|
|
169
|
-
this.info(`🔄 ${message}`);
|
|
170
|
-
}
|
|
171
|
-
success(message) {
|
|
172
|
-
this.info(`✅ ${message}`);
|
|
173
|
-
}
|
|
174
|
-
browserUrl(url) {
|
|
175
|
-
// Always show URL when browser is not opened automatically (user needs to open manually)
|
|
176
|
-
this.info(`🔗 Open in browser: ${url}`);
|
|
177
|
-
}
|
|
178
|
-
browserOpening() {
|
|
179
|
-
// Only show when debug is enabled (browser opens automatically)
|
|
180
|
-
this.debug(`🌐 Opening browser for authentication...`);
|
|
181
|
-
}
|
|
182
|
-
testSkip(message) {
|
|
183
|
-
this.info(`⏭️ ${message}`);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
// Default logger instance (singleton)
|
|
187
|
-
exports.defaultLogger = new DefaultLogger();
|
|
188
|
-
// Test logger instance
|
|
189
|
-
exports.testLogger = new TestLogger();
|
|
190
|
-
// Export convenience functions that use default logger (for backward compatibility)
|
|
191
|
-
function info(message, meta) {
|
|
192
|
-
exports.defaultLogger.info(message, meta);
|
|
193
|
-
}
|
|
194
|
-
function debug(message, meta) {
|
|
195
|
-
exports.defaultLogger.debug(message, meta);
|
|
196
|
-
}
|
|
197
|
-
function error(message, meta) {
|
|
198
|
-
exports.defaultLogger.error(message, meta);
|
|
199
|
-
}
|
|
200
|
-
function warn(message, meta) {
|
|
201
|
-
exports.defaultLogger.warn(message, meta);
|
|
202
|
-
}
|