zario 0.2.11 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +10 -1
  2. package/dist/cjs/core/CustomLogLevel.js +2 -0
  3. package/dist/cjs/core/Formatter.js +75 -0
  4. package/dist/cjs/core/LogLevel.js +2 -0
  5. package/dist/cjs/core/Logger.js +234 -0
  6. package/dist/cjs/index.js +19 -0
  7. package/dist/cjs/package.json +1 -0
  8. package/dist/cjs/transports/ConsoleTransport.js +39 -0
  9. package/dist/cjs/transports/FileTransport.js +260 -0
  10. package/dist/cjs/transports/HttpTransport.js +150 -0
  11. package/dist/cjs/transports/Transport.js +2 -0
  12. package/dist/cjs/transports/index.js +20 -0
  13. package/dist/cjs/utils/ColorUtil.js +42 -0
  14. package/dist/cjs/utils/TimeUtil.js +26 -0
  15. package/dist/cjs/utils/Timerutil.js +22 -0
  16. package/dist/{core → esm/core}/CustomLogLevel.d.ts +1 -1
  17. package/dist/esm/core/CustomLogLevel.js +1 -0
  18. package/dist/{core → esm/core}/Formatter.d.ts +1 -1
  19. package/dist/esm/core/Formatter.js +71 -0
  20. package/dist/esm/core/LogLevel.js +1 -0
  21. package/dist/{core → esm/core}/Logger.d.ts +4 -5
  22. package/dist/esm/core/Logger.js +230 -0
  23. package/dist/esm/index.d.ts +8 -0
  24. package/dist/esm/index.js +13 -0
  25. package/dist/{transports → esm/transports}/ConsoleTransport.d.ts +3 -3
  26. package/dist/esm/transports/ConsoleTransport.js +35 -0
  27. package/dist/{transports → esm/transports}/FileTransport.d.ts +7 -5
  28. package/dist/esm/transports/FileTransport.js +223 -0
  29. package/dist/{transports → esm/transports}/HttpTransport.d.ts +3 -3
  30. package/dist/esm/transports/HttpTransport.js +113 -0
  31. package/dist/{transports → esm/transports}/Transport.d.ts +2 -2
  32. package/dist/esm/transports/Transport.js +1 -0
  33. package/dist/esm/transports/index.d.ts +4 -0
  34. package/dist/esm/transports/index.js +4 -0
  35. package/dist/esm/utils/ColorUtil.js +38 -0
  36. package/dist/esm/utils/TimeUtil.js +22 -0
  37. package/dist/esm/utils/Timerutil.js +18 -0
  38. package/package.json +19 -8
  39. package/dist/index.d.ts +0 -8
  40. package/dist/index.js +0 -3
  41. package/dist/index.mjs +0 -3
  42. package/dist/transports/index.d.ts +0 -28
  43. /package/dist/{core → esm/core}/LogLevel.d.ts +0 -0
  44. /package/dist/{utils → esm/utils}/ColorUtil.d.ts +0 -0
  45. /package/dist/{utils → esm/utils}/TimeUtil.d.ts +0 -0
  46. /package/dist/{utils → esm/utils}/Timerutil.d.ts +0 -0
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  A minimal, fast logging library for Node.js with TypeScript support.
4
4
 
5
- ## UPDATE 2.9
5
+ ## What's New in 0.2.11
6
6
 
7
7
  - Added HTTP transport support with new HttpTransport class
8
8
  - Added log batching functionality for efficient writes
@@ -61,6 +61,7 @@ logger.error("❌ Database connection failed", { code: 500 });
61
61
  ### Transports
62
62
 
63
63
  #### Console Transport
64
+
64
65
  ```js
65
66
  import { Logger, ConsoleTransport } from "zario";
66
67
 
@@ -72,6 +73,7 @@ const logger = new Logger({
72
73
  ```
73
74
 
74
75
  #### File Transport
76
+
75
77
  ```js
76
78
  import { Logger, FileTransport } from "zario";
77
79
 
@@ -90,6 +92,7 @@ const logger = new Logger({
90
92
  ```
91
93
 
92
94
  #### HTTP Transport
95
+
93
96
  ```js
94
97
  import { Logger, HttpTransport } from "zario";
95
98
 
@@ -115,6 +118,7 @@ const logger = new Logger({
115
118
  - `logger.info(message, metadata?)` - Info level logging
116
119
  - `logger.warn(message, metadata?)` - Warning level logging
117
120
  - `logger.error(message, metadata?)` - Error level logging
121
+ - `logger.logWithLevel(level, message, metadata?)` - Log a message at an arbitrary/custom level
118
122
  - `logger.createChild(options)` - Creates a child logger with inherited settings
119
123
  - `logger.setLevel(level)` - Change the logger level at runtime
120
124
  - `logger.setFormat(format)` - Set the output format to text or json
@@ -122,6 +126,7 @@ const logger = new Logger({
122
126
  ## Usage Examples
123
127
 
124
128
  ### Basic Usage
129
+
125
130
  ```js
126
131
  import { Logger, ConsoleTransport } from "zario";
127
132
 
@@ -136,11 +141,13 @@ logger.error("Something went wrong", { userId: 123 });
136
141
  ```
137
142
 
138
143
  ### JSON Format
144
+
139
145
  ```js
140
146
  const logger = new Logger({ json: true });
141
147
  ```
142
148
 
143
149
  ### Custom Levels & Colors
150
+
144
151
  ```js
145
152
  import { Logger, ConsoleTransport } from "zario";
146
153
 
@@ -168,6 +175,7 @@ logger.logWithLevel('critical', 'This is a critical message in bright red');
168
175
  ```
169
176
 
170
177
  ### Child Loggers
178
+
171
179
  ```js
172
180
  const main = new Logger({ prefix: "[APP]" });
173
181
  const db = main.createChild({ prefix: "[DB]" });
@@ -177,6 +185,7 @@ db.error("Connection timeout");
177
185
  ```
178
186
 
179
187
  ### Multiple Transports
188
+
180
189
  ```js
181
190
  import { Logger, ConsoleTransport, FileTransport } from "zario";
182
191
 
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Formatter = void 0;
4
+ const TimeUtil_js_1 = require("../utils/TimeUtil.js");
5
+ const ColorUtil_js_1 = require("../utils/ColorUtil.js");
6
+ class Formatter {
7
+ constructor(options = {}) {
8
+ const { colorize = true, json = false, timestampFormat = "YYYY-MM-DD HH:mm:ss", timestamp = false, customColors = {}, } = options;
9
+ this.colorize = colorize;
10
+ this.json = json;
11
+ this.timestampFormat = timestampFormat;
12
+ this.timestamp = timestamp;
13
+ this.customColors = customColors;
14
+ }
15
+ format(data) {
16
+ if (this.json) {
17
+ return this.formatAsJson(data);
18
+ }
19
+ else {
20
+ return this.formatAsText(data);
21
+ }
22
+ }
23
+ formatAsJson(data) {
24
+ const formattedData = {
25
+ ...data.metadata, // Spread first so core fields can override
26
+ level: data.level,
27
+ message: data.message,
28
+ };
29
+ if (this.timestamp) {
30
+ formattedData.timestamp = data.timestamp.toISOString();
31
+ }
32
+ if (data.prefix) {
33
+ formattedData.prefix = data.prefix;
34
+ }
35
+ return JSON.stringify(formattedData);
36
+ }
37
+ formatAsText(data) {
38
+ let output = "";
39
+ if (this.timestamp) {
40
+ output += `[${TimeUtil_js_1.TimeUtil.format(data.timestamp, this.timestampFormat)}] `;
41
+ }
42
+ if (data.prefix) {
43
+ output += `${data.prefix} `;
44
+ }
45
+ let level = data.level.toUpperCase();
46
+ if (this.colorize) {
47
+ const color = this.customColors[data.level] || data.level;
48
+ level = ColorUtil_js_1.ColorUtil.colorize(level, color);
49
+ }
50
+ output += `[${level}] ${data.message}`;
51
+ if (data.metadata) {
52
+ output += ` ${JSON.stringify(data.metadata)}`;
53
+ }
54
+ return output;
55
+ }
56
+ setJson(json) {
57
+ this.json = json;
58
+ }
59
+ isColorized() {
60
+ return this.colorize;
61
+ }
62
+ isJson() {
63
+ return this.json;
64
+ }
65
+ getTimestampFormat() {
66
+ return this.timestampFormat;
67
+ }
68
+ hasTimestamp() {
69
+ return this.timestamp;
70
+ }
71
+ getCustomColors() {
72
+ return { ...this.customColors };
73
+ }
74
+ }
75
+ exports.Formatter = Formatter;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,234 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Logger = void 0;
4
+ const Formatter_js_1 = require("./Formatter.js");
5
+ const ConsoleTransport_js_1 = require("../transports/ConsoleTransport.js");
6
+ class Logger {
7
+ constructor(options = {}) {
8
+ this.transports = [];
9
+ const { level, colorize, json, transports = [], timestampFormat = "YYYY-MM-DD HH:mm:ss", prefix, timestamp, context = {}, parent, asyncMode, customLevels = {}, customColors = {}, } = options;
10
+ this.parent = parent; // Set parent
11
+ this.context = { ...context }; // Init context
12
+ this.customLevels = customLevels; // custom log store
13
+ this.asyncMode = false;
14
+ if (this.parent) {
15
+ this.level = level ?? this.parent.level;
16
+ this.prefix = prefix ?? this.parent.prefix;
17
+ this.timestamp = timestamp ?? this.parent.timestamp;
18
+ this.asyncMode = asyncMode ?? this.parent.asyncMode;
19
+ this.transports =
20
+ transports && transports.length > 0
21
+ ? this.initTransports(transports)
22
+ : this.parent.transports;
23
+ // Merge colors; child overrides parent
24
+ const mergedCColors = {
25
+ ...this.parent.formatter.getCustomColors(),
26
+ ...customColors,
27
+ };
28
+ this.formatter = new Formatter_js_1.Formatter({
29
+ colorize: this.getDefaultColorizeValue(colorize) ??
30
+ this.parent.formatter.isColorized(),
31
+ json: json ?? this.parent.formatter.isJson(),
32
+ timestampFormat: timestampFormat ?? this.parent.formatter.getTimestampFormat(),
33
+ timestamp: timestamp ?? this.parent.formatter.hasTimestamp(),
34
+ customColors: mergedCColors,
35
+ });
36
+ this.context = { ...this.parent.context, ...this.context };
37
+ // Merge custom levels with parent's custom levels
38
+ this.customLevels = { ...this.parent.customLevels, ...customLevels };
39
+ }
40
+ else {
41
+ // Auto-configure based on environment
42
+ const isProd = this.isProductionEnvironment();
43
+ this.level = level ?? this.getDefaultLevel(isProd);
44
+ this.prefix = prefix ?? "";
45
+ this.timestamp = timestamp ?? this.getDefaultTimestamp(isProd);
46
+ const defaultTransports = transports && transports.length > 0
47
+ ? transports
48
+ : this.getDefaultTransports(isProd);
49
+ this.asyncMode = asyncMode ?? this.getDefaultAsyncMode(isProd);
50
+ this.transports = this.initTransports(defaultTransports);
51
+ this.formatter = new Formatter_js_1.Formatter({
52
+ colorize: this.getDefaultColorizeValue(colorize),
53
+ json: json ?? this.getDefaultJson(isProd),
54
+ timestampFormat,
55
+ timestamp: this.getDefaultTimestamp(isProd),
56
+ customColors,
57
+ });
58
+ }
59
+ if (!Logger._global) {
60
+ Logger._global = this;
61
+ }
62
+ }
63
+ isProductionEnvironment() {
64
+ const env = process.env.NODE_ENV?.toLowerCase();
65
+ return env === "production" || env === "prod";
66
+ }
67
+ getDefaultLevel(isProd) {
68
+ return isProd ? "warn" : "debug";
69
+ }
70
+ getDefaultColorizeValue(colorize) {
71
+ if (colorize !== undefined) {
72
+ return colorize;
73
+ }
74
+ const isProd = this.isProductionEnvironment();
75
+ return !isProd;
76
+ }
77
+ getDefaultJson(isProd) {
78
+ return isProd;
79
+ }
80
+ getDefaultTimestamp(isProd) {
81
+ return true;
82
+ }
83
+ getDefaultTransports(isProd) {
84
+ if (Logger.defaultTransportsFactory) {
85
+ return Logger.defaultTransportsFactory(isProd);
86
+ }
87
+ return [new ConsoleTransport_js_1.ConsoleTransport()];
88
+ }
89
+ getDefaultAsyncMode(isProd) {
90
+ return isProd;
91
+ }
92
+ initTransports(transportConfigs) {
93
+ const initializedTransports = [];
94
+ for (const transportConfig of transportConfigs) {
95
+ if (this.isTransport(transportConfig)) {
96
+ initializedTransports.push(transportConfig);
97
+ }
98
+ }
99
+ return initializedTransports;
100
+ }
101
+ isTransport(transport) {
102
+ return (typeof transport === "object" &&
103
+ transport !== null &&
104
+ typeof transport.write === "function");
105
+ }
106
+ shouldLog(level) {
107
+ // Get the priority of the current logger level
108
+ const currentLevelPriority = this.getLevelPriority(this.level);
109
+ // Get the priority of the message level
110
+ const messageLevelPriority = this.getLevelPriority(level);
111
+ return messageLevelPriority >= currentLevelPriority;
112
+ }
113
+ getLevelPriority(level) {
114
+ // use a static map to avoid repeated allocations
115
+ if (Logger.LEVEL_PRIORITIES.hasOwnProperty(level)) {
116
+ return Logger.LEVEL_PRIORITIES[level];
117
+ }
118
+ // Check if it's a custom level
119
+ if (this.customLevels && level in this.customLevels) {
120
+ const customPriority = this.customLevels[level];
121
+ return customPriority !== undefined ? customPriority : 999;
122
+ }
123
+ return 999;
124
+ }
125
+ log(level, message, metadata) {
126
+ if (!this.shouldLog(level) || level === "silent") {
127
+ return;
128
+ }
129
+ const timestamp = new Date();
130
+ // Optimize metadata merging
131
+ let finalMetadata;
132
+ const hasContext = this.context && Object.keys(this.context).length > 0;
133
+ if (hasContext && metadata) {
134
+ finalMetadata = { ...this.context, ...metadata };
135
+ }
136
+ else if (hasContext) {
137
+ finalMetadata = this.context;
138
+ }
139
+ else if (metadata) {
140
+ finalMetadata = metadata;
141
+ }
142
+ // Only add metadata if it's not empty after merging
143
+ const logData = {
144
+ level,
145
+ message,
146
+ timestamp,
147
+ metadata: finalMetadata && Object.keys(finalMetadata).length > 0
148
+ ? finalMetadata
149
+ : undefined,
150
+ prefix: this.prefix,
151
+ };
152
+ if (this.asyncMode) {
153
+ for (const transport of this.transports) {
154
+ if (transport.writeAsync) {
155
+ transport.writeAsync(logData, this.formatter).catch((error) => {
156
+ console.error("Error during async logging:", error);
157
+ });
158
+ }
159
+ else {
160
+ setImmediate(() => {
161
+ transport.write(logData, this.formatter);
162
+ });
163
+ }
164
+ }
165
+ }
166
+ else {
167
+ for (const transport of this.transports) {
168
+ transport.write(logData, this.formatter);
169
+ }
170
+ }
171
+ }
172
+ debug(message, metadata) {
173
+ this.log("debug", message, metadata);
174
+ }
175
+ info(message, metadata) {
176
+ this.log("info", message, metadata);
177
+ }
178
+ warn(message, metadata) {
179
+ this.log("warn", message, metadata);
180
+ }
181
+ error(message, metadata) {
182
+ this.log("error", message, metadata);
183
+ }
184
+ silent(message, metadata) {
185
+ this.log("silent", message, metadata);
186
+ }
187
+ boring(message, metadata) {
188
+ this.log("boring", message, metadata);
189
+ }
190
+ /**
191
+ * Generic log method that allows logging with custom levels
192
+ */
193
+ logWithLevel(level, message, metadata) {
194
+ this.log(level, message, metadata);
195
+ }
196
+ setLevel(level) {
197
+ this.level = level;
198
+ }
199
+ setFormat(format) {
200
+ this.formatter.setJson(format === "json");
201
+ }
202
+ setAsyncMode(asyncMode) {
203
+ this.asyncMode = asyncMode;
204
+ }
205
+ addTransport(transport) {
206
+ this.transports.push(transport);
207
+ }
208
+ getTimestampSetting() {
209
+ return this.timestamp;
210
+ }
211
+ static get global() {
212
+ if (!Logger._global) {
213
+ Logger._global = new Logger();
214
+ }
215
+ return Logger._global;
216
+ }
217
+ createChild(options = {}) {
218
+ return new Logger({ ...options, parent: this });
219
+ }
220
+ startTimer(name) {
221
+ const { Timer } = require("../utils/Timerutil");
222
+ return new Timer(name, (message) => this.info(message));
223
+ }
224
+ }
225
+ exports.Logger = Logger;
226
+ Logger.defaultTransportsFactory = null;
227
+ Logger.LEVEL_PRIORITIES = {
228
+ silent: 0,
229
+ boring: 1,
230
+ debug: 2,
231
+ info: 3,
232
+ warn: 4,
233
+ error: 5,
234
+ };
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HttpTransport = exports.FileTransport = exports.ConsoleTransport = exports.Logger = void 0;
4
+ const Logger_js_1 = require("./core/Logger.js");
5
+ Object.defineProperty(exports, "Logger", { enumerable: true, get: function () { return Logger_js_1.Logger; } });
6
+ const index_js_1 = require("./transports/index.js");
7
+ Object.defineProperty(exports, "ConsoleTransport", { enumerable: true, get: function () { return index_js_1.ConsoleTransport; } });
8
+ Object.defineProperty(exports, "FileTransport", { enumerable: true, get: function () { return index_js_1.FileTransport; } });
9
+ Object.defineProperty(exports, "HttpTransport", { enumerable: true, get: function () { return index_js_1.HttpTransport; } });
10
+ // Configure default transports to maintain backward compatibility
11
+ Logger_js_1.Logger.defaultTransportsFactory = (isProd) => {
12
+ if (isProd) {
13
+ return [new index_js_1.ConsoleTransport(), new index_js_1.FileTransport({ path: "./logs/app.log" })];
14
+ }
15
+ else {
16
+ return [new index_js_1.ConsoleTransport()];
17
+ }
18
+ };
19
+ exports.default = Logger_js_1.Logger;
@@ -0,0 +1 @@
1
+ {"type":"commonjs"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConsoleTransport = void 0;
4
+ class ConsoleTransport {
5
+ constructor(options = {}) {
6
+ const { colorize = true } = options;
7
+ this.colorize = colorize;
8
+ }
9
+ write(data, formatter) {
10
+ // Toggle colorize temporarily, then restore it
11
+ const originalColorizeSetting = formatter["colorize"];
12
+ if (this.colorize !== originalColorizeSetting) {
13
+ formatter["colorize"] = this.colorize;
14
+ }
15
+ const output = formatter.format(data);
16
+ // Restore
17
+ if (this.colorize !== originalColorizeSetting) {
18
+ formatter["colorize"] = originalColorizeSetting;
19
+ }
20
+ switch (data.level) {
21
+ case "error":
22
+ console.error(output);
23
+ break;
24
+ case "warn":
25
+ console.warn(output);
26
+ break;
27
+ default:
28
+ console.log(output);
29
+ break;
30
+ }
31
+ }
32
+ async writeAsync(data, formatter) {
33
+ setImmediate(() => {
34
+ this.write(data, formatter);
35
+ });
36
+ return Promise.resolve();
37
+ }
38
+ }
39
+ exports.ConsoleTransport = ConsoleTransport;