@mcp-abap-adt/logger 0.1.1 → 0.1.3

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 CHANGED
@@ -7,6 +7,40 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.1.3] - 2025-12-13
11
+
12
+ ### Changed
13
+ - Dependency bump: `@mcp-abap-adt/interfaces` to `^0.1.16` (timeout docs) to align with latest interfaces release
14
+
15
+ ## [0.1.2] - 2025-12-19
16
+
17
+ ### Added
18
+ - **PinoLogger Implementation**: Added `PinoLogger` class for structured logging using Pino
19
+ - Async logger for server use with pino-pretty formatting
20
+ - Falls back to `DefaultLogger` if pino is not installed
21
+ - Includes icons in log messages (ℹ️ info, 🐛 debug, ⚠️ warn, 💥 error)
22
+ - Optional peer dependencies: `pino@^10.1.0` and `pino-pretty@^13.1.3`
23
+ - **Usage**: `import { PinoLogger } from '@mcp-abap-adt/logger'; const logger = new PinoLogger();`
24
+ - **LogLevel from Interfaces**: Now uses `LogLevel` enum from `@mcp-abap-adt/interfaces` package
25
+ - Standardized log level constants across all packages
26
+ - **Migration**: Import `LogLevel` from `@mcp-abap-adt/interfaces` instead of local enum
27
+
28
+ ### Changed
29
+ - **Package Structure Refactoring**: Reorganized code into separate files
30
+ - `default-logger.ts`: `DefaultLogger` implementation with icons and prefixes
31
+ - `pino-logger.ts`: `PinoLogger` implementation
32
+ - `types.ts`: Type definitions and utility functions (`getLogLevel`, `Logger` type)
33
+ - `index.ts`: Main entry point with all exports
34
+ - **DefaultLogger Enhancement**: Added icons to log messages
35
+ - Format: `[LEVEL] icon message` (e.g., `[INFO] ℹ️ Test message`)
36
+ - Icons: ℹ️ (info), 🐛 (debug), ⚠️ (warn), 💥 (error)
37
+ - **Dependency Update**: Updated `@mcp-abap-adt/interfaces` to `^0.1.14` (requires LogLevel export)
38
+
39
+ ### Removed
40
+ - **Local LogLevel Enum**: Removed duplicate `LogLevel` enum from logger package
41
+ - Now imported from `@mcp-abap-adt/interfaces`
42
+ - **Migration**: Update imports: `import { LogLevel } from '@mcp-abap-adt/interfaces';`
43
+
10
44
  ## [0.1.1] - 2025-12-05
11
45
 
12
46
  ### Changed
@@ -34,4 +68,3 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
34
68
  - TestLogger implementation
35
69
  - Log level support (ERROR, WARN, INFO, DEBUG)
36
70
  - Environment variable configuration (AUTH_LOG_LEVEL)
37
-
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
- ### Basic Usage
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 { Logger, defaultLogger, LogLevel } from '@mcp-abap-adt/logger';
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
- // Specialized logging methods
25
- defaultLogger.browserAuth('Starting browser authentication...');
26
- defaultLogger.refresh('Refreshing token...');
27
- defaultLogger.success('Operation completed successfully');
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
- Logger supports four log levels controlled by `AUTH_LOG_LEVEL` environment variable:
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 { Logger } from '@mcp-abap-adt/logger';
86
+ import type { ILogger } from '@mcp-abap-adt/interfaces';
52
87
 
53
- class MyCustomLogger implements Logger {
54
- info(message: string): void {
55
- // Custom implementation
56
- }
57
- debug(message: string): void {
58
- // Custom implementation
59
- }
60
- error(message: string): void {
61
- // Custom implementation
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
- browserUrl(url: string): void {
100
+ debug(message: string, meta?: any): void {
76
101
  // Custom implementation
77
102
  }
78
- browserOpening(): void {
103
+ error(message: string, meta?: any): void {
79
104
  // Custom implementation
80
105
  }
81
- testSkip(message: string): void {
106
+ warn(message: string, meta?: any): void {
82
107
  // Custom implementation
83
108
  }
84
109
  }
85
110
  ```
86
111
 
87
- ### Convenience Functions
88
-
89
- For backward compatibility, convenience functions are also exported:
112
+ ### Output Format
90
113
 
91
- ```typescript
92
- import { info, debug, error, warn, browserAuth, refresh, success, browserUrl, browserOpening, testSkip } from '@mcp-abap-adt/logger';
114
+ **DefaultLogger** output format:
115
+ - `[INFO] ℹ️ message`
116
+ - `[DEBUG] 🐛 message`
117
+ - `[ERROR] 💥 message`
118
+ - `[WARN] ⚠️ message`
93
119
 
94
- info('Info message');
95
- debug('Debug message');
96
- error('Error message');
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
- export { LogLevel, defaultLogger, testLogger } from './logger';
6
- export type { Logger } from './logger';
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
- var logger_1 = require("./logger");
9
- Object.defineProperty(exports, "LogLevel", { enumerable: true, get: function () { return logger_1.LogLevel; } });
10
- Object.defineProperty(exports, "defaultLogger", { enumerable: true, get: function () { return logger_1.defaultLogger; } });
11
- Object.defineProperty(exports, "testLogger", { enumerable: true, get: function () { return logger_1.testLogger; } });
12
- var logger_2 = require("./logger");
13
- Object.defineProperty(exports, "info", { enumerable: true, get: function () { return logger_2.info; } });
14
- Object.defineProperty(exports, "debug", { enumerable: true, get: function () { return logger_2.debug; } });
15
- Object.defineProperty(exports, "error", { enumerable: true, get: function () { return logger_2.error; } });
16
- Object.defineProperty(exports, "warn", { enumerable: true, get: function () { return logger_2.warn; } });
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;
@@ -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.1",
3
+ "version": "0.1.3",
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.1"
47
+ "@mcp-abap-adt/interfaces": "^0.1.16"
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
- }