@wsxjs/wsx-logger 0.0.18 → 0.0.19
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/index.cjs +140 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +102 -59
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,141 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const pino = require("pino");
|
|
4
|
+
function isProduction() {
|
|
5
|
+
return typeof process !== "undefined" && process.env.NODE_ENV === "production";
|
|
6
|
+
}
|
|
7
|
+
function isNodeEnvironment() {
|
|
8
|
+
var _a;
|
|
9
|
+
return typeof process !== "undefined" && ((_a = process.versions) == null ? void 0 : _a.node) !== void 0;
|
|
10
|
+
}
|
|
11
|
+
function isBrowserEnvironment() {
|
|
12
|
+
return typeof window !== "undefined" && typeof document !== "undefined";
|
|
13
|
+
}
|
|
14
|
+
const DEFAULT_CONFIG = {
|
|
15
|
+
name: "WSX",
|
|
16
|
+
level: isProduction() ? "info" : "debug",
|
|
17
|
+
pretty: !isProduction()
|
|
18
|
+
};
|
|
19
|
+
function createPinoLogger(config = {}) {
|
|
20
|
+
const { name, level, pretty, pinoOptions } = { ...DEFAULT_CONFIG, ...config };
|
|
21
|
+
const options = {
|
|
22
|
+
name: name || DEFAULT_CONFIG.name,
|
|
23
|
+
level: level || DEFAULT_CONFIG.level,
|
|
24
|
+
...pinoOptions
|
|
25
|
+
};
|
|
26
|
+
if (isBrowserEnvironment()) {
|
|
27
|
+
options.browser = {
|
|
28
|
+
asObject: false,
|
|
29
|
+
// Use console methods directly (default behavior)
|
|
30
|
+
write: void 0,
|
|
31
|
+
// Use default console write
|
|
32
|
+
...(pinoOptions == null ? void 0 : pinoOptions.browser) || {}
|
|
33
|
+
// Allow override via pinoOptions
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
if (pretty && isNodeEnvironment() && !isProduction()) {
|
|
37
|
+
try {
|
|
38
|
+
return pino(
|
|
39
|
+
options,
|
|
40
|
+
pino.transport({
|
|
41
|
+
target: "pino-pretty",
|
|
42
|
+
options: {
|
|
43
|
+
colorize: true,
|
|
44
|
+
translateTime: "HH:MM:ss.l",
|
|
45
|
+
ignore: "pid,hostname",
|
|
46
|
+
singleLine: false
|
|
47
|
+
}
|
|
48
|
+
})
|
|
49
|
+
);
|
|
50
|
+
} catch {
|
|
51
|
+
console.warn("[wsx-logger] pino-pretty not available, using default formatter");
|
|
52
|
+
return pino(options);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return pino(options);
|
|
56
|
+
}
|
|
57
|
+
class WSXLogger {
|
|
58
|
+
constructor(config = {}) {
|
|
59
|
+
this.isProd = isProduction();
|
|
60
|
+
this.pinoLogger = createPinoLogger(config);
|
|
61
|
+
}
|
|
62
|
+
debug(message, ...args) {
|
|
63
|
+
if (!this.isProd) {
|
|
64
|
+
if (args.length > 0) {
|
|
65
|
+
this.pinoLogger.debug({ args }, message);
|
|
66
|
+
} else {
|
|
67
|
+
this.pinoLogger.debug(message);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
info(message, ...args) {
|
|
72
|
+
if (!this.isProd) {
|
|
73
|
+
if (args.length > 0) {
|
|
74
|
+
this.pinoLogger.info({ args }, message);
|
|
75
|
+
} else {
|
|
76
|
+
this.pinoLogger.info(message);
|
|
77
|
+
}
|
|
78
|
+
} else {
|
|
79
|
+
if (args.length > 0) {
|
|
80
|
+
this.pinoLogger.info({ args }, message);
|
|
81
|
+
} else {
|
|
82
|
+
this.pinoLogger.info(message);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
warn(message, ...args) {
|
|
87
|
+
if (args.length > 0) {
|
|
88
|
+
this.pinoLogger.warn({ args }, message);
|
|
89
|
+
} else {
|
|
90
|
+
this.pinoLogger.warn(message);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
error(message, ...args) {
|
|
94
|
+
if (args.length > 0) {
|
|
95
|
+
this.pinoLogger.error({ args }, message);
|
|
96
|
+
} else {
|
|
97
|
+
this.pinoLogger.error(message);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
fatal(message, ...args) {
|
|
101
|
+
if (args.length > 0) {
|
|
102
|
+
this.pinoLogger.fatal({ args }, message);
|
|
103
|
+
} else {
|
|
104
|
+
this.pinoLogger.fatal(message);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
trace(message, ...args) {
|
|
108
|
+
if (!this.isProd) {
|
|
109
|
+
if (args.length > 0) {
|
|
110
|
+
this.pinoLogger.trace({ args }, message);
|
|
111
|
+
} else {
|
|
112
|
+
this.pinoLogger.trace(message);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get the underlying pino logger instance
|
|
118
|
+
*/
|
|
119
|
+
getPinoLogger() {
|
|
120
|
+
return this.pinoLogger;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const logger = new WSXLogger();
|
|
124
|
+
function createLogger(componentName, config = {}) {
|
|
125
|
+
return new WSXLogger({
|
|
126
|
+
...config,
|
|
127
|
+
name: config.name || `WSX:${componentName}`
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
function createLoggerWithConfig(config) {
|
|
131
|
+
return new WSXLogger(config);
|
|
132
|
+
}
|
|
133
|
+
Object.defineProperty(exports, "pino", {
|
|
134
|
+
enumerable: true,
|
|
135
|
+
get: () => pino.pino
|
|
136
|
+
});
|
|
137
|
+
exports.WSXLogger = WSXLogger;
|
|
138
|
+
exports.createLogger = createLogger;
|
|
139
|
+
exports.createLoggerWithConfig = createLoggerWithConfig;
|
|
140
|
+
exports.logger = logger;
|
|
2
141
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":["/**\n * @wsxjs/wsx-logger\n * Pino-based logging utility for WSXJS\n */\n\nimport pino, { type LoggerOptions } from \"pino\";\nimport type { Logger as PinoLoggerType } from \"pino\";\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"fatal\" | \"trace\";\n\n/**\n * Logger interface compatible with WSXJS core logger\n */\nexport interface Logger {\n debug(message: string, ...args: unknown[]): void;\n info(message: string, ...args: unknown[]): void;\n warn(message: string, ...args: unknown[]): void;\n error(message: string, ...args: unknown[]): void;\n fatal?(message: string, ...args: unknown[]): void;\n trace?(message: string, ...args: unknown[]): void;\n}\n\n/**\n * Logger configuration options\n */\nexport interface LoggerConfig {\n /** Logger name/prefix */\n name?: string;\n /** Minimum log level */\n level?: LogLevel;\n /** Enable pretty printing (for development) */\n pretty?: boolean;\n /** Additional pino options */\n pinoOptions?: LoggerOptions;\n}\n\n/**\n * Check if we're in production environment\n */\nfunction isProduction(): boolean {\n return typeof process !== \"undefined\" && process.env.NODE_ENV === \"production\";\n}\n\n/**\n * Check if we're in a Node.js environment\n */\nfunction isNodeEnvironment(): boolean {\n return typeof process !== \"undefined\" && process.versions?.node !== undefined;\n}\n\n/**\n * Check if we're in a browser environment\n */\nfunction isBrowserEnvironment(): boolean {\n return typeof window !== \"undefined\" && typeof document !== \"undefined\";\n}\n\n/**\n * Default logger configuration\n * - Production: info level, no pretty printing\n * - Development: debug level, pretty printing enabled\n */\nconst DEFAULT_CONFIG: LoggerConfig = {\n name: \"WSX\",\n level: isProduction() ? \"info\" : \"debug\",\n pretty: !isProduction(),\n};\n\n/**\n * Create a pino logger instance\n */\nfunction createPinoLogger(config: LoggerConfig = {}): PinoLoggerType {\n const { name, level, pretty, pinoOptions } = { ...DEFAULT_CONFIG, ...config };\n\n const options: LoggerOptions = {\n name: name || DEFAULT_CONFIG.name,\n level: level || DEFAULT_CONFIG.level,\n ...pinoOptions,\n };\n\n // Configure browser-specific options if in browser environment\n if (isBrowserEnvironment()) {\n // In browser, pino automatically uses console methods\n // We can optionally configure browser-specific behavior\n options.browser = {\n asObject: false, // Use console methods directly (default behavior)\n write: undefined, // Use default console write\n ...(pinoOptions?.browser || {}), // Allow override via pinoOptions\n };\n }\n\n // In development and Node.js environment, use pino-pretty for better readability\n if (pretty && isNodeEnvironment() && !isProduction()) {\n try {\n return pino(\n options,\n pino.transport({\n target: \"pino-pretty\",\n options: {\n colorize: true,\n translateTime: \"HH:MM:ss.l\",\n ignore: \"pid,hostname\",\n singleLine: false,\n },\n })\n );\n } catch {\n // Fallback to regular pino if pino-pretty is not available\n console.warn(\"[wsx-logger] pino-pretty not available, using default formatter\");\n return pino(options);\n }\n }\n\n return pino(options);\n}\n\n/**\n * WSX Logger wrapper that implements the Logger interface\n * and uses pino under the hood\n */\nexport class WSXLogger implements Logger {\n private pinoLogger: PinoLoggerType;\n private isProd: boolean;\n\n constructor(config: LoggerConfig = {}) {\n this.isProd = isProduction();\n this.pinoLogger = createPinoLogger(config);\n }\n\n debug(message: string, ...args: unknown[]): void {\n // Always show debug logs in non-production environments\n if (!this.isProd) {\n if (args.length > 0) {\n this.pinoLogger.debug({ args }, message);\n } else {\n this.pinoLogger.debug(message);\n }\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n // Always show info logs in non-production environments\n if (!this.isProd) {\n if (args.length > 0) {\n this.pinoLogger.info({ args }, message);\n } else {\n this.pinoLogger.info(message);\n }\n } else {\n // In production, respect pino's level configuration\n if (args.length > 0) {\n this.pinoLogger.info({ args }, message);\n } else {\n this.pinoLogger.info(message);\n }\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n // Always show warnings (in both production and development)\n if (args.length > 0) {\n this.pinoLogger.warn({ args }, message);\n } else {\n this.pinoLogger.warn(message);\n }\n }\n\n error(message: string, ...args: unknown[]): void {\n // Always show errors (in both production and development)\n if (args.length > 0) {\n this.pinoLogger.error({ args }, message);\n } else {\n this.pinoLogger.error(message);\n }\n }\n\n fatal(message: string, ...args: unknown[]): void {\n if (args.length > 0) {\n this.pinoLogger.fatal({ args }, message);\n } else {\n this.pinoLogger.fatal(message);\n }\n }\n\n trace(message: string, ...args: unknown[]): void {\n // Always show trace logs in non-production environments\n if (!this.isProd) {\n if (args.length > 0) {\n this.pinoLogger.trace({ args }, message);\n } else {\n this.pinoLogger.trace(message);\n }\n }\n }\n\n /**\n * Get the underlying pino logger instance\n */\n getPinoLogger(): PinoLoggerType {\n return this.pinoLogger;\n }\n}\n\n/**\n * Default logger instance\n */\nexport const logger = new WSXLogger();\n\n/**\n * Create a component-specific logger\n *\n * @param componentName - Name of the component/module\n * @param config - Optional logger configuration\n * @returns Logger instance\n */\nexport function createLogger(componentName: string, config: LoggerConfig = {}): Logger {\n return new WSXLogger({\n ...config,\n name: config.name || `WSX:${componentName}`,\n });\n}\n\n/**\n * Create a logger with custom configuration\n *\n * @param config - Logger configuration\n * @returns Logger instance\n */\nexport function createLoggerWithConfig(config: LoggerConfig): Logger {\n return new WSXLogger(config);\n}\n\n// Export pino types for advanced usage\nexport type { Logger as PinoLogger, LoggerOptions } from \"pino\";\nexport { pino } from \"pino\";\n"],"names":[
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":["/**\n * @wsxjs/wsx-logger\n * Pino-based logging utility for WSXJS\n */\n\nimport pino, { type LoggerOptions } from \"pino\";\nimport type { Logger as PinoLoggerType } from \"pino\";\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"fatal\" | \"trace\";\n\n/**\n * Logger interface compatible with WSXJS core logger\n */\nexport interface Logger {\n debug(message: string, ...args: unknown[]): void;\n info(message: string, ...args: unknown[]): void;\n warn(message: string, ...args: unknown[]): void;\n error(message: string, ...args: unknown[]): void;\n fatal?(message: string, ...args: unknown[]): void;\n trace?(message: string, ...args: unknown[]): void;\n}\n\n/**\n * Logger configuration options\n */\nexport interface LoggerConfig {\n /** Logger name/prefix */\n name?: string;\n /** Minimum log level */\n level?: LogLevel;\n /** Enable pretty printing (for development) */\n pretty?: boolean;\n /** Additional pino options */\n pinoOptions?: LoggerOptions;\n}\n\n/**\n * Check if we're in production environment\n */\nfunction isProduction(): boolean {\n return typeof process !== \"undefined\" && process.env.NODE_ENV === \"production\";\n}\n\n/**\n * Check if we're in a Node.js environment\n */\nfunction isNodeEnvironment(): boolean {\n return typeof process !== \"undefined\" && process.versions?.node !== undefined;\n}\n\n/**\n * Check if we're in a browser environment\n */\nfunction isBrowserEnvironment(): boolean {\n return typeof window !== \"undefined\" && typeof document !== \"undefined\";\n}\n\n/**\n * Default logger configuration\n * - Production: info level, no pretty printing\n * - Development: debug level, pretty printing enabled\n */\nconst DEFAULT_CONFIG: LoggerConfig = {\n name: \"WSX\",\n level: isProduction() ? \"info\" : \"debug\",\n pretty: !isProduction(),\n};\n\n/**\n * Create a pino logger instance\n */\nfunction createPinoLogger(config: LoggerConfig = {}): PinoLoggerType {\n const { name, level, pretty, pinoOptions } = { ...DEFAULT_CONFIG, ...config };\n\n const options: LoggerOptions = {\n name: name || DEFAULT_CONFIG.name,\n level: level || DEFAULT_CONFIG.level,\n ...pinoOptions,\n };\n\n // Configure browser-specific options if in browser environment\n if (isBrowserEnvironment()) {\n // In browser, pino automatically uses console methods\n // We can optionally configure browser-specific behavior\n options.browser = {\n asObject: false, // Use console methods directly (default behavior)\n write: undefined, // Use default console write\n ...(pinoOptions?.browser || {}), // Allow override via pinoOptions\n };\n }\n\n // In development and Node.js environment, use pino-pretty for better readability\n if (pretty && isNodeEnvironment() && !isProduction()) {\n try {\n return pino(\n options,\n pino.transport({\n target: \"pino-pretty\",\n options: {\n colorize: true,\n translateTime: \"HH:MM:ss.l\",\n ignore: \"pid,hostname\",\n singleLine: false,\n },\n })\n );\n } catch {\n // Fallback to regular pino if pino-pretty is not available\n console.warn(\"[wsx-logger] pino-pretty not available, using default formatter\");\n return pino(options);\n }\n }\n\n return pino(options);\n}\n\n/**\n * WSX Logger wrapper that implements the Logger interface\n * and uses pino under the hood\n */\nexport class WSXLogger implements Logger {\n private pinoLogger: PinoLoggerType;\n private isProd: boolean;\n\n constructor(config: LoggerConfig = {}) {\n this.isProd = isProduction();\n this.pinoLogger = createPinoLogger(config);\n }\n\n debug(message: string, ...args: unknown[]): void {\n // Always show debug logs in non-production environments\n if (!this.isProd) {\n if (args.length > 0) {\n this.pinoLogger.debug({ args }, message);\n } else {\n this.pinoLogger.debug(message);\n }\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n // Always show info logs in non-production environments\n if (!this.isProd) {\n if (args.length > 0) {\n this.pinoLogger.info({ args }, message);\n } else {\n this.pinoLogger.info(message);\n }\n } else {\n // In production, respect pino's level configuration\n if (args.length > 0) {\n this.pinoLogger.info({ args }, message);\n } else {\n this.pinoLogger.info(message);\n }\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n // Always show warnings (in both production and development)\n if (args.length > 0) {\n this.pinoLogger.warn({ args }, message);\n } else {\n this.pinoLogger.warn(message);\n }\n }\n\n error(message: string, ...args: unknown[]): void {\n // Always show errors (in both production and development)\n if (args.length > 0) {\n this.pinoLogger.error({ args }, message);\n } else {\n this.pinoLogger.error(message);\n }\n }\n\n fatal(message: string, ...args: unknown[]): void {\n if (args.length > 0) {\n this.pinoLogger.fatal({ args }, message);\n } else {\n this.pinoLogger.fatal(message);\n }\n }\n\n trace(message: string, ...args: unknown[]): void {\n // Always show trace logs in non-production environments\n if (!this.isProd) {\n if (args.length > 0) {\n this.pinoLogger.trace({ args }, message);\n } else {\n this.pinoLogger.trace(message);\n }\n }\n }\n\n /**\n * Get the underlying pino logger instance\n */\n getPinoLogger(): PinoLoggerType {\n return this.pinoLogger;\n }\n}\n\n/**\n * Default logger instance\n */\nexport const logger = new WSXLogger();\n\n/**\n * Create a component-specific logger\n *\n * @param componentName - Name of the component/module\n * @param config - Optional logger configuration\n * @returns Logger instance\n */\nexport function createLogger(componentName: string, config: LoggerConfig = {}): Logger {\n return new WSXLogger({\n ...config,\n name: config.name || `WSX:${componentName}`,\n });\n}\n\n/**\n * Create a logger with custom configuration\n *\n * @param config - Logger configuration\n * @returns Logger instance\n */\nexport function createLoggerWithConfig(config: LoggerConfig): Logger {\n return new WSXLogger(config);\n}\n\n// Export pino types for advanced usage\nexport type { Logger as PinoLogger, LoggerOptions } from \"pino\";\nexport { pino } from \"pino\";\n"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,73 +1,116 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { pino as
|
|
3
|
-
function
|
|
4
|
-
return typeof process
|
|
1
|
+
import pino from "pino";
|
|
2
|
+
import { pino as pino2 } from "pino";
|
|
3
|
+
function isProduction() {
|
|
4
|
+
return typeof process !== "undefined" && process.env.NODE_ENV === "production";
|
|
5
5
|
}
|
|
6
|
-
function
|
|
7
|
-
var
|
|
8
|
-
return typeof process
|
|
6
|
+
function isNodeEnvironment() {
|
|
7
|
+
var _a;
|
|
8
|
+
return typeof process !== "undefined" && ((_a = process.versions) == null ? void 0 : _a.node) !== void 0;
|
|
9
9
|
}
|
|
10
|
-
function
|
|
11
|
-
return typeof window
|
|
10
|
+
function isBrowserEnvironment() {
|
|
11
|
+
return typeof window !== "undefined" && typeof document !== "undefined";
|
|
12
12
|
}
|
|
13
|
-
const
|
|
13
|
+
const DEFAULT_CONFIG = {
|
|
14
14
|
name: "WSX",
|
|
15
|
-
level:
|
|
16
|
-
pretty: !
|
|
15
|
+
level: isProduction() ? "info" : "debug",
|
|
16
|
+
pretty: !isProduction()
|
|
17
17
|
};
|
|
18
|
-
function
|
|
19
|
-
const { name
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
function createPinoLogger(config = {}) {
|
|
19
|
+
const { name, level, pretty, pinoOptions } = { ...DEFAULT_CONFIG, ...config };
|
|
20
|
+
const options = {
|
|
21
|
+
name: name || DEFAULT_CONFIG.name,
|
|
22
|
+
level: level || DEFAULT_CONFIG.level,
|
|
23
|
+
...pinoOptions
|
|
23
24
|
};
|
|
24
|
-
if (
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
25
|
+
if (isBrowserEnvironment()) {
|
|
26
|
+
options.browser = {
|
|
27
|
+
asObject: false,
|
|
28
|
+
// Use console methods directly (default behavior)
|
|
29
|
+
write: void 0,
|
|
30
|
+
// Use default console write
|
|
31
|
+
...(pinoOptions == null ? void 0 : pinoOptions.browser) || {}
|
|
32
|
+
// Allow override via pinoOptions
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
if (pretty && isNodeEnvironment() && !isProduction()) {
|
|
32
36
|
try {
|
|
33
|
-
return
|
|
34
|
-
|
|
35
|
-
|
|
37
|
+
return pino(
|
|
38
|
+
options,
|
|
39
|
+
pino.transport({
|
|
36
40
|
target: "pino-pretty",
|
|
37
41
|
options: {
|
|
38
|
-
colorize:
|
|
42
|
+
colorize: true,
|
|
39
43
|
translateTime: "HH:MM:ss.l",
|
|
40
44
|
ignore: "pid,hostname",
|
|
41
|
-
singleLine:
|
|
45
|
+
singleLine: false
|
|
42
46
|
}
|
|
43
47
|
})
|
|
44
48
|
);
|
|
45
49
|
} catch {
|
|
46
|
-
|
|
50
|
+
console.warn("[wsx-logger] pino-pretty not available, using default formatter");
|
|
51
|
+
return pino(options);
|
|
47
52
|
}
|
|
48
|
-
|
|
53
|
+
}
|
|
54
|
+
return pino(options);
|
|
49
55
|
}
|
|
50
|
-
class
|
|
51
|
-
constructor(
|
|
52
|
-
this.isProd =
|
|
56
|
+
class WSXLogger {
|
|
57
|
+
constructor(config = {}) {
|
|
58
|
+
this.isProd = isProduction();
|
|
59
|
+
this.pinoLogger = createPinoLogger(config);
|
|
53
60
|
}
|
|
54
|
-
debug(
|
|
55
|
-
|
|
61
|
+
debug(message, ...args) {
|
|
62
|
+
if (!this.isProd) {
|
|
63
|
+
if (args.length > 0) {
|
|
64
|
+
this.pinoLogger.debug({ args }, message);
|
|
65
|
+
} else {
|
|
66
|
+
this.pinoLogger.debug(message);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
56
69
|
}
|
|
57
|
-
info(
|
|
58
|
-
|
|
70
|
+
info(message, ...args) {
|
|
71
|
+
if (!this.isProd) {
|
|
72
|
+
if (args.length > 0) {
|
|
73
|
+
this.pinoLogger.info({ args }, message);
|
|
74
|
+
} else {
|
|
75
|
+
this.pinoLogger.info(message);
|
|
76
|
+
}
|
|
77
|
+
} else {
|
|
78
|
+
if (args.length > 0) {
|
|
79
|
+
this.pinoLogger.info({ args }, message);
|
|
80
|
+
} else {
|
|
81
|
+
this.pinoLogger.info(message);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
59
84
|
}
|
|
60
|
-
warn(
|
|
61
|
-
|
|
85
|
+
warn(message, ...args) {
|
|
86
|
+
if (args.length > 0) {
|
|
87
|
+
this.pinoLogger.warn({ args }, message);
|
|
88
|
+
} else {
|
|
89
|
+
this.pinoLogger.warn(message);
|
|
90
|
+
}
|
|
62
91
|
}
|
|
63
|
-
error(
|
|
64
|
-
|
|
92
|
+
error(message, ...args) {
|
|
93
|
+
if (args.length > 0) {
|
|
94
|
+
this.pinoLogger.error({ args }, message);
|
|
95
|
+
} else {
|
|
96
|
+
this.pinoLogger.error(message);
|
|
97
|
+
}
|
|
65
98
|
}
|
|
66
|
-
fatal(
|
|
67
|
-
|
|
99
|
+
fatal(message, ...args) {
|
|
100
|
+
if (args.length > 0) {
|
|
101
|
+
this.pinoLogger.fatal({ args }, message);
|
|
102
|
+
} else {
|
|
103
|
+
this.pinoLogger.fatal(message);
|
|
104
|
+
}
|
|
68
105
|
}
|
|
69
|
-
trace(
|
|
70
|
-
|
|
106
|
+
trace(message, ...args) {
|
|
107
|
+
if (!this.isProd) {
|
|
108
|
+
if (args.length > 0) {
|
|
109
|
+
this.pinoLogger.trace({ args }, message);
|
|
110
|
+
} else {
|
|
111
|
+
this.pinoLogger.trace(message);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
71
114
|
}
|
|
72
115
|
/**
|
|
73
116
|
* Get the underlying pino logger instance
|
|
@@ -76,21 +119,21 @@ class f {
|
|
|
76
119
|
return this.pinoLogger;
|
|
77
120
|
}
|
|
78
121
|
}
|
|
79
|
-
const
|
|
80
|
-
function
|
|
81
|
-
return new
|
|
82
|
-
...
|
|
83
|
-
name:
|
|
122
|
+
const logger = new WSXLogger();
|
|
123
|
+
function createLogger(componentName, config = {}) {
|
|
124
|
+
return new WSXLogger({
|
|
125
|
+
...config,
|
|
126
|
+
name: config.name || `WSX:${componentName}`
|
|
84
127
|
});
|
|
85
128
|
}
|
|
86
|
-
function
|
|
87
|
-
return new
|
|
129
|
+
function createLoggerWithConfig(config) {
|
|
130
|
+
return new WSXLogger(config);
|
|
88
131
|
}
|
|
89
132
|
export {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
133
|
+
WSXLogger,
|
|
134
|
+
createLogger,
|
|
135
|
+
createLoggerWithConfig,
|
|
136
|
+
logger,
|
|
137
|
+
pino2 as pino
|
|
95
138
|
};
|
|
96
139
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["/**\n * @wsxjs/wsx-logger\n * Pino-based logging utility for WSXJS\n */\n\nimport pino, { type LoggerOptions } from \"pino\";\nimport type { Logger as PinoLoggerType } from \"pino\";\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"fatal\" | \"trace\";\n\n/**\n * Logger interface compatible with WSXJS core logger\n */\nexport interface Logger {\n debug(message: string, ...args: unknown[]): void;\n info(message: string, ...args: unknown[]): void;\n warn(message: string, ...args: unknown[]): void;\n error(message: string, ...args: unknown[]): void;\n fatal?(message: string, ...args: unknown[]): void;\n trace?(message: string, ...args: unknown[]): void;\n}\n\n/**\n * Logger configuration options\n */\nexport interface LoggerConfig {\n /** Logger name/prefix */\n name?: string;\n /** Minimum log level */\n level?: LogLevel;\n /** Enable pretty printing (for development) */\n pretty?: boolean;\n /** Additional pino options */\n pinoOptions?: LoggerOptions;\n}\n\n/**\n * Check if we're in production environment\n */\nfunction isProduction(): boolean {\n return typeof process !== \"undefined\" && process.env.NODE_ENV === \"production\";\n}\n\n/**\n * Check if we're in a Node.js environment\n */\nfunction isNodeEnvironment(): boolean {\n return typeof process !== \"undefined\" && process.versions?.node !== undefined;\n}\n\n/**\n * Check if we're in a browser environment\n */\nfunction isBrowserEnvironment(): boolean {\n return typeof window !== \"undefined\" && typeof document !== \"undefined\";\n}\n\n/**\n * Default logger configuration\n * - Production: info level, no pretty printing\n * - Development: debug level, pretty printing enabled\n */\nconst DEFAULT_CONFIG: LoggerConfig = {\n name: \"WSX\",\n level: isProduction() ? \"info\" : \"debug\",\n pretty: !isProduction(),\n};\n\n/**\n * Create a pino logger instance\n */\nfunction createPinoLogger(config: LoggerConfig = {}): PinoLoggerType {\n const { name, level, pretty, pinoOptions } = { ...DEFAULT_CONFIG, ...config };\n\n const options: LoggerOptions = {\n name: name || DEFAULT_CONFIG.name,\n level: level || DEFAULT_CONFIG.level,\n ...pinoOptions,\n };\n\n // Configure browser-specific options if in browser environment\n if (isBrowserEnvironment()) {\n // In browser, pino automatically uses console methods\n // We can optionally configure browser-specific behavior\n options.browser = {\n asObject: false, // Use console methods directly (default behavior)\n write: undefined, // Use default console write\n ...(pinoOptions?.browser || {}), // Allow override via pinoOptions\n };\n }\n\n // In development and Node.js environment, use pino-pretty for better readability\n if (pretty && isNodeEnvironment() && !isProduction()) {\n try {\n return pino(\n options,\n pino.transport({\n target: \"pino-pretty\",\n options: {\n colorize: true,\n translateTime: \"HH:MM:ss.l\",\n ignore: \"pid,hostname\",\n singleLine: false,\n },\n })\n );\n } catch {\n // Fallback to regular pino if pino-pretty is not available\n console.warn(\"[wsx-logger] pino-pretty not available, using default formatter\");\n return pino(options);\n }\n }\n\n return pino(options);\n}\n\n/**\n * WSX Logger wrapper that implements the Logger interface\n * and uses pino under the hood\n */\nexport class WSXLogger implements Logger {\n private pinoLogger: PinoLoggerType;\n private isProd: boolean;\n\n constructor(config: LoggerConfig = {}) {\n this.isProd = isProduction();\n this.pinoLogger = createPinoLogger(config);\n }\n\n debug(message: string, ...args: unknown[]): void {\n // Always show debug logs in non-production environments\n if (!this.isProd) {\n if (args.length > 0) {\n this.pinoLogger.debug({ args }, message);\n } else {\n this.pinoLogger.debug(message);\n }\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n // Always show info logs in non-production environments\n if (!this.isProd) {\n if (args.length > 0) {\n this.pinoLogger.info({ args }, message);\n } else {\n this.pinoLogger.info(message);\n }\n } else {\n // In production, respect pino's level configuration\n if (args.length > 0) {\n this.pinoLogger.info({ args }, message);\n } else {\n this.pinoLogger.info(message);\n }\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n // Always show warnings (in both production and development)\n if (args.length > 0) {\n this.pinoLogger.warn({ args }, message);\n } else {\n this.pinoLogger.warn(message);\n }\n }\n\n error(message: string, ...args: unknown[]): void {\n // Always show errors (in both production and development)\n if (args.length > 0) {\n this.pinoLogger.error({ args }, message);\n } else {\n this.pinoLogger.error(message);\n }\n }\n\n fatal(message: string, ...args: unknown[]): void {\n if (args.length > 0) {\n this.pinoLogger.fatal({ args }, message);\n } else {\n this.pinoLogger.fatal(message);\n }\n }\n\n trace(message: string, ...args: unknown[]): void {\n // Always show trace logs in non-production environments\n if (!this.isProd) {\n if (args.length > 0) {\n this.pinoLogger.trace({ args }, message);\n } else {\n this.pinoLogger.trace(message);\n }\n }\n }\n\n /**\n * Get the underlying pino logger instance\n */\n getPinoLogger(): PinoLoggerType {\n return this.pinoLogger;\n }\n}\n\n/**\n * Default logger instance\n */\nexport const logger = new WSXLogger();\n\n/**\n * Create a component-specific logger\n *\n * @param componentName - Name of the component/module\n * @param config - Optional logger configuration\n * @returns Logger instance\n */\nexport function createLogger(componentName: string, config: LoggerConfig = {}): Logger {\n return new WSXLogger({\n ...config,\n name: config.name || `WSX:${componentName}`,\n });\n}\n\n/**\n * Create a logger with custom configuration\n *\n * @param config - Logger configuration\n * @returns Logger instance\n */\nexport function createLoggerWithConfig(config: LoggerConfig): Logger {\n return new WSXLogger(config);\n}\n\n// Export pino types for advanced usage\nexport type { Logger as PinoLogger, LoggerOptions } from \"pino\";\nexport { pino } from \"pino\";\n"],"names":[
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["/**\n * @wsxjs/wsx-logger\n * Pino-based logging utility for WSXJS\n */\n\nimport pino, { type LoggerOptions } from \"pino\";\nimport type { Logger as PinoLoggerType } from \"pino\";\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"fatal\" | \"trace\";\n\n/**\n * Logger interface compatible with WSXJS core logger\n */\nexport interface Logger {\n debug(message: string, ...args: unknown[]): void;\n info(message: string, ...args: unknown[]): void;\n warn(message: string, ...args: unknown[]): void;\n error(message: string, ...args: unknown[]): void;\n fatal?(message: string, ...args: unknown[]): void;\n trace?(message: string, ...args: unknown[]): void;\n}\n\n/**\n * Logger configuration options\n */\nexport interface LoggerConfig {\n /** Logger name/prefix */\n name?: string;\n /** Minimum log level */\n level?: LogLevel;\n /** Enable pretty printing (for development) */\n pretty?: boolean;\n /** Additional pino options */\n pinoOptions?: LoggerOptions;\n}\n\n/**\n * Check if we're in production environment\n */\nfunction isProduction(): boolean {\n return typeof process !== \"undefined\" && process.env.NODE_ENV === \"production\";\n}\n\n/**\n * Check if we're in a Node.js environment\n */\nfunction isNodeEnvironment(): boolean {\n return typeof process !== \"undefined\" && process.versions?.node !== undefined;\n}\n\n/**\n * Check if we're in a browser environment\n */\nfunction isBrowserEnvironment(): boolean {\n return typeof window !== \"undefined\" && typeof document !== \"undefined\";\n}\n\n/**\n * Default logger configuration\n * - Production: info level, no pretty printing\n * - Development: debug level, pretty printing enabled\n */\nconst DEFAULT_CONFIG: LoggerConfig = {\n name: \"WSX\",\n level: isProduction() ? \"info\" : \"debug\",\n pretty: !isProduction(),\n};\n\n/**\n * Create a pino logger instance\n */\nfunction createPinoLogger(config: LoggerConfig = {}): PinoLoggerType {\n const { name, level, pretty, pinoOptions } = { ...DEFAULT_CONFIG, ...config };\n\n const options: LoggerOptions = {\n name: name || DEFAULT_CONFIG.name,\n level: level || DEFAULT_CONFIG.level,\n ...pinoOptions,\n };\n\n // Configure browser-specific options if in browser environment\n if (isBrowserEnvironment()) {\n // In browser, pino automatically uses console methods\n // We can optionally configure browser-specific behavior\n options.browser = {\n asObject: false, // Use console methods directly (default behavior)\n write: undefined, // Use default console write\n ...(pinoOptions?.browser || {}), // Allow override via pinoOptions\n };\n }\n\n // In development and Node.js environment, use pino-pretty for better readability\n if (pretty && isNodeEnvironment() && !isProduction()) {\n try {\n return pino(\n options,\n pino.transport({\n target: \"pino-pretty\",\n options: {\n colorize: true,\n translateTime: \"HH:MM:ss.l\",\n ignore: \"pid,hostname\",\n singleLine: false,\n },\n })\n );\n } catch {\n // Fallback to regular pino if pino-pretty is not available\n console.warn(\"[wsx-logger] pino-pretty not available, using default formatter\");\n return pino(options);\n }\n }\n\n return pino(options);\n}\n\n/**\n * WSX Logger wrapper that implements the Logger interface\n * and uses pino under the hood\n */\nexport class WSXLogger implements Logger {\n private pinoLogger: PinoLoggerType;\n private isProd: boolean;\n\n constructor(config: LoggerConfig = {}) {\n this.isProd = isProduction();\n this.pinoLogger = createPinoLogger(config);\n }\n\n debug(message: string, ...args: unknown[]): void {\n // Always show debug logs in non-production environments\n if (!this.isProd) {\n if (args.length > 0) {\n this.pinoLogger.debug({ args }, message);\n } else {\n this.pinoLogger.debug(message);\n }\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n // Always show info logs in non-production environments\n if (!this.isProd) {\n if (args.length > 0) {\n this.pinoLogger.info({ args }, message);\n } else {\n this.pinoLogger.info(message);\n }\n } else {\n // In production, respect pino's level configuration\n if (args.length > 0) {\n this.pinoLogger.info({ args }, message);\n } else {\n this.pinoLogger.info(message);\n }\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n // Always show warnings (in both production and development)\n if (args.length > 0) {\n this.pinoLogger.warn({ args }, message);\n } else {\n this.pinoLogger.warn(message);\n }\n }\n\n error(message: string, ...args: unknown[]): void {\n // Always show errors (in both production and development)\n if (args.length > 0) {\n this.pinoLogger.error({ args }, message);\n } else {\n this.pinoLogger.error(message);\n }\n }\n\n fatal(message: string, ...args: unknown[]): void {\n if (args.length > 0) {\n this.pinoLogger.fatal({ args }, message);\n } else {\n this.pinoLogger.fatal(message);\n }\n }\n\n trace(message: string, ...args: unknown[]): void {\n // Always show trace logs in non-production environments\n if (!this.isProd) {\n if (args.length > 0) {\n this.pinoLogger.trace({ args }, message);\n } else {\n this.pinoLogger.trace(message);\n }\n }\n }\n\n /**\n * Get the underlying pino logger instance\n */\n getPinoLogger(): PinoLoggerType {\n return this.pinoLogger;\n }\n}\n\n/**\n * Default logger instance\n */\nexport const logger = new WSXLogger();\n\n/**\n * Create a component-specific logger\n *\n * @param componentName - Name of the component/module\n * @param config - Optional logger configuration\n * @returns Logger instance\n */\nexport function createLogger(componentName: string, config: LoggerConfig = {}): Logger {\n return new WSXLogger({\n ...config,\n name: config.name || `WSX:${componentName}`,\n });\n}\n\n/**\n * Create a logger with custom configuration\n *\n * @param config - Logger configuration\n * @returns Logger instance\n */\nexport function createLoggerWithConfig(config: LoggerConfig): Logger {\n return new WSXLogger(config);\n}\n\n// Export pino types for advanced usage\nexport type { Logger as PinoLogger, LoggerOptions } from \"pino\";\nexport { pino } from \"pino\";\n"],"names":[],"mappings":"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"}
|