logiscout 1.0.0

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 (67) hide show
  1. package/dist/cjs/api/Interceptor.cjs +15 -0
  2. package/dist/cjs/api/Interceptor.d.ts +4 -0
  3. package/dist/cjs/api/Interceptor.d.ts.map +1 -0
  4. package/dist/cjs/api/LogApi.cjs +16 -0
  5. package/dist/cjs/api/LogApi.d.ts +6 -0
  6. package/dist/cjs/api/LogApi.d.ts.map +1 -0
  7. package/dist/cjs/core/context/RequestContext.cjs +17 -0
  8. package/dist/cjs/core/context/RequestContext.d.ts +8 -0
  9. package/dist/cjs/core/context/RequestContext.d.ts.map +1 -0
  10. package/dist/cjs/core/enum/LogLevels.cjs +11 -0
  11. package/dist/cjs/core/enum/LogLevels.d.ts +8 -0
  12. package/dist/cjs/core/enum/LogLevels.d.ts.map +1 -0
  13. package/dist/cjs/core/interface/LoggerInterface.cjs +2 -0
  14. package/dist/cjs/core/interface/LoggerInterface.d.ts +7 -0
  15. package/dist/cjs/core/interface/LoggerInterface.d.ts.map +1 -0
  16. package/dist/cjs/core/types/LogContext.cjs +2 -0
  17. package/dist/cjs/core/types/LogContext.d.ts +5 -0
  18. package/dist/cjs/core/types/LogContext.d.ts.map +1 -0
  19. package/dist/cjs/core/types/LogEntry.cjs +2 -0
  20. package/dist/cjs/core/types/LogEntry.d.ts +9 -0
  21. package/dist/cjs/core/types/LogEntry.d.ts.map +1 -0
  22. package/dist/cjs/index.cjs +16 -0
  23. package/dist/cjs/index.d.ts +9 -0
  24. package/dist/cjs/index.d.ts.map +1 -0
  25. package/dist/cjs/middlewares/correlationMiddleware.cjs +20 -0
  26. package/dist/cjs/middlewares/correlationMiddleware.d.ts +2 -0
  27. package/dist/cjs/middlewares/correlationMiddleware.d.ts.map +1 -0
  28. package/dist/cjs/services/Levels/Levels.cjs +24 -0
  29. package/dist/cjs/services/Levels/Levels.d.ts +9 -0
  30. package/dist/cjs/services/Levels/Levels.d.ts.map +1 -0
  31. package/dist/cjs/services/Logger/Logger.cjs +101 -0
  32. package/dist/cjs/services/Logger/Logger.d.ts +12 -0
  33. package/dist/cjs/services/Logger/Logger.d.ts.map +1 -0
  34. package/dist/esm/api/Interceptor.d.ts +4 -0
  35. package/dist/esm/api/Interceptor.d.ts.map +1 -0
  36. package/dist/esm/api/Interceptor.js +10 -0
  37. package/dist/esm/api/LogApi.d.ts +6 -0
  38. package/dist/esm/api/LogApi.d.ts.map +1 -0
  39. package/dist/esm/api/LogApi.js +10 -0
  40. package/dist/esm/core/context/RequestContext.d.ts +8 -0
  41. package/dist/esm/core/context/RequestContext.d.ts.map +1 -0
  42. package/dist/esm/core/context/RequestContext.js +13 -0
  43. package/dist/esm/core/enum/LogLevels.d.ts +8 -0
  44. package/dist/esm/core/enum/LogLevels.d.ts.map +1 -0
  45. package/dist/esm/core/enum/LogLevels.js +8 -0
  46. package/dist/esm/core/interface/LoggerInterface.d.ts +7 -0
  47. package/dist/esm/core/interface/LoggerInterface.d.ts.map +1 -0
  48. package/dist/esm/core/interface/LoggerInterface.js +1 -0
  49. package/dist/esm/core/types/LogContext.d.ts +5 -0
  50. package/dist/esm/core/types/LogContext.d.ts.map +1 -0
  51. package/dist/esm/core/types/LogContext.js +1 -0
  52. package/dist/esm/core/types/LogEntry.d.ts +9 -0
  53. package/dist/esm/core/types/LogEntry.d.ts.map +1 -0
  54. package/dist/esm/core/types/LogEntry.js +1 -0
  55. package/dist/esm/index.d.ts +9 -0
  56. package/dist/esm/index.d.ts.map +1 -0
  57. package/dist/esm/index.js +8 -0
  58. package/dist/esm/middlewares/correlationMiddleware.d.ts +2 -0
  59. package/dist/esm/middlewares/correlationMiddleware.d.ts.map +1 -0
  60. package/dist/esm/middlewares/correlationMiddleware.js +13 -0
  61. package/dist/esm/services/Levels/Levels.d.ts +9 -0
  62. package/dist/esm/services/Levels/Levels.d.ts.map +1 -0
  63. package/dist/esm/services/Levels/Levels.js +20 -0
  64. package/dist/esm/services/Logger/Logger.d.ts +12 -0
  65. package/dist/esm/services/Logger/Logger.d.ts.map +1 -0
  66. package/dist/esm/services/Logger/Logger.js +64 -0
  67. package/package.json +56 -0
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const axios_1 = __importDefault(require("axios"));
7
+ const HTTP = axios_1.default.create({
8
+ baseURL: "http://127.0.0.1:3000/api/",
9
+ headers: {
10
+ "Content-Type": "application/json",
11
+ Accept: "application/json",
12
+ },
13
+ withCredentials: false,
14
+ });
15
+ exports.default = HTTP;
@@ -0,0 +1,4 @@
1
+ import { AxiosInstance } from "axios";
2
+ declare const HTTP: AxiosInstance;
3
+ export default HTTP;
4
+ //# sourceMappingURL=Interceptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Interceptor.d.ts","sourceRoot":"","sources":["../../../src/api/Interceptor.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE7C,QAAA,MAAM,IAAI,EAAE,aAOV,CAAC;AAEH,eAAe,IAAI,CAAC"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.LogApi = LogApi;
7
+ const Interceptor_js_1 = __importDefault(require("./Interceptor.cjs"));
8
+ async function LogApi(data) {
9
+ try {
10
+ const response = await Interceptor_js_1.default.post("/log", data);
11
+ console.log("Log sent successfully:", response.status);
12
+ }
13
+ catch (error) {
14
+ console.error("Failed to send log:", error);
15
+ }
16
+ }
@@ -0,0 +1,6 @@
1
+ interface LogPayload {
2
+ logs: unknown;
3
+ }
4
+ export declare function LogApi(data: LogPayload): Promise<void>;
5
+ export {};
6
+ //# sourceMappingURL=LogApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogApi.d.ts","sourceRoot":"","sources":["../../../src/api/LogApi.ts"],"names":[],"mappings":"AAEA,UAAU,UAAU;IAClB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAO5D"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RequestContext = void 0;
4
+ const async_hooks_1 = require("async_hooks");
5
+ const crypto_1 = require("crypto");
6
+ const storage = new async_hooks_1.AsyncLocalStorage();
7
+ class RequestContext {
8
+ static run(fn, correlationId) {
9
+ storage.run({
10
+ correlationId: correlationId ?? (0, crypto_1.randomUUID)(),
11
+ }, fn);
12
+ }
13
+ static getCorrelationId() {
14
+ return storage.getStore()?.correlationId;
15
+ }
16
+ }
17
+ exports.RequestContext = RequestContext;
@@ -0,0 +1,8 @@
1
+ export interface RequestContextData {
2
+ correlationId: string;
3
+ }
4
+ export declare class RequestContext {
5
+ static run(fn: () => void, correlationId?: string): void;
6
+ static getCorrelationId(): string | undefined;
7
+ }
8
+ //# sourceMappingURL=RequestContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RequestContext.d.ts","sourceRoot":"","sources":["../../../../src/core/context/RequestContext.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,MAAM,CAAC;CACvB;AAID,qBAAa,cAAc;IACzB,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IASxD,MAAM,CAAC,gBAAgB,IAAI,MAAM,GAAG,SAAS;CAG9C"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LogLevels = void 0;
4
+ var LogLevels;
5
+ (function (LogLevels) {
6
+ LogLevels["INFO"] = "info";
7
+ LogLevels["WARN"] = "warn";
8
+ LogLevels["ERROR"] = "error";
9
+ LogLevels["DEBUG"] = "debug";
10
+ LogLevels["CRITICAL"] = "critical";
11
+ })(LogLevels || (exports.LogLevels = LogLevels = {}));
@@ -0,0 +1,8 @@
1
+ export declare enum LogLevels {
2
+ INFO = "info",
3
+ WARN = "warn",
4
+ ERROR = "error",
5
+ DEBUG = "debug",
6
+ CRITICAL = "critical"
7
+ }
8
+ //# sourceMappingURL=LogLevels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogLevels.d.ts","sourceRoot":"","sources":["../../../../src/core/enum/LogLevels.ts"],"names":[],"mappings":"AAAA,oBAAY,SAAS;IACnB,IAAI,SAAS;IACb,IAAI,SAAS;IACb,KAAK,UAAU;IACf,KAAK,UAAU;IACf,QAAQ,aAAa;CACtB"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,7 @@
1
+ export interface LoggerInterface {
2
+ info(message: string, meta?: Record<string, unknown>): void;
3
+ warn(message: string, meta?: Record<string, unknown>): void;
4
+ error(message: string, meta?: Record<string, unknown>): void;
5
+ debug(message: string, meta?: Record<string, unknown>): void;
6
+ }
7
+ //# sourceMappingURL=LoggerInterface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoggerInterface.d.ts","sourceRoot":"","sources":["../../../../src/core/interface/LoggerInterface.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC7D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC9D"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,5 @@
1
+ export interface LogContext {
2
+ projectName: string;
3
+ componentName: string;
4
+ }
5
+ //# sourceMappingURL=LogContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogContext.d.ts","sourceRoot":"","sources":["../../../../src/core/types/LogContext.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,9 @@
1
+ import { LogLevels } from "../enum/LogLevels.js";
2
+ export interface LogEntry {
3
+ message: string;
4
+ meta?: Record<string, unknown>;
5
+ timestamp: string;
6
+ level: LogLevels;
7
+ correlationId?: string;
8
+ }
9
+ //# sourceMappingURL=LogEntry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogEntry.d.ts","sourceRoot":"","sources":["../../../../src/core/types/LogEntry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,SAAS,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createCorrelationMiddleware = exports.createLogger = exports.BaseLogger = exports.Levels = exports.LogLevels = void 0;
4
+ var LogLevels_js_1 = require("./core/enum/LogLevels.cjs");
5
+ Object.defineProperty(exports, "LogLevels", { enumerable: true, get: function () { return LogLevels_js_1.LogLevels; } });
6
+ var Levels_js_1 = require("./services/Levels/Levels.cjs");
7
+ Object.defineProperty(exports, "Levels", { enumerable: true, get: function () { return Levels_js_1.Levels; } });
8
+ var Logger_js_1 = require("./services/Logger/Logger.cjs");
9
+ Object.defineProperty(exports, "BaseLogger", { enumerable: true, get: function () { return Logger_js_1.Logger; } });
10
+ const Levels_js_2 = require("./services/Levels/Levels.cjs");
11
+ // const Logger = new Levels();
12
+ const createLogger = (component) => new Levels_js_2.Levels(component);
13
+ exports.createLogger = createLogger;
14
+ var correlationMiddleware_js_1 = require("./middlewares/correlationMiddleware.cjs");
15
+ Object.defineProperty(exports, "createCorrelationMiddleware", { enumerable: true, get: function () { return correlationMiddleware_js_1.createCorrelationMiddleware; } });
16
+ // export { Logger };
@@ -0,0 +1,9 @@
1
+ export { LogLevels } from "./core/enum/LogLevels.js";
2
+ export { LoggerInterface } from "./core/interface/LoggerInterface.js";
3
+ export { LogEntry } from "./core/types/LogEntry.js";
4
+ export { Levels } from "./services/Levels/Levels.js";
5
+ export { Logger as BaseLogger } from "./services/Logger/Logger.js";
6
+ import { Levels } from "./services/Levels/Levels.js";
7
+ export declare const createLogger: (component: string) => Levels;
8
+ export { createCorrelationMiddleware } from "./middlewares/correlationMiddleware.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AACrD,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAGnE,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAGrD,eAAO,MAAM,YAAY,GAAI,WAAW,MAAM,WACvB,CAAC;AAGxB,OAAO,EAAE,2BAA2B,EAAE,MAAM,wCAAwC,CAAA"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createCorrelationMiddleware = void 0;
7
+ const RequestContext_js_1 = require("../core/context/RequestContext.cjs");
8
+ const crypto_1 = __importDefault(require("crypto"));
9
+ const createCorrelationMiddleware = () => {
10
+ return (req, res, next) => {
11
+ const correlationId = crypto_1.default.randomUUID();
12
+ RequestContext_js_1.RequestContext.run(() => {
13
+ if (res?.setHeader) {
14
+ res.setHeader("x-correlation-id", correlationId);
15
+ }
16
+ next();
17
+ }, correlationId);
18
+ };
19
+ };
20
+ exports.createCorrelationMiddleware = createCorrelationMiddleware;
@@ -0,0 +1,2 @@
1
+ export declare const createCorrelationMiddleware: () => (req: any, res: any, next: () => void) => void;
2
+ //# sourceMappingURL=correlationMiddleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"correlationMiddleware.d.ts","sourceRoot":"","sources":["../../../src/middlewares/correlationMiddleware.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,2BAA2B,SAC9B,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,MAAM,IAAI,SAU7C,CAAC"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Levels = void 0;
4
+ const Logger_js_1 = require("../Logger/Logger.cjs");
5
+ const LogLevels_js_1 = require("../../core/enum/LogLevels.cjs");
6
+ class Levels extends Logger_js_1.Logger {
7
+ info(message, meta) {
8
+ const entry = this.getLogEntry(message, LogLevels_js_1.LogLevels.INFO, meta);
9
+ this.log(entry);
10
+ }
11
+ warn(message, meta) {
12
+ const entry = this.getLogEntry(message, LogLevels_js_1.LogLevels.WARN, meta);
13
+ this.log(entry);
14
+ }
15
+ error(message, meta) {
16
+ const entry = this.getLogEntry(message, LogLevels_js_1.LogLevels.ERROR, meta);
17
+ this.log(entry);
18
+ }
19
+ debug(message, meta) {
20
+ const entry = this.getLogEntry(message, LogLevels_js_1.LogLevels.DEBUG, meta);
21
+ this.log(entry);
22
+ }
23
+ }
24
+ exports.Levels = Levels;
@@ -0,0 +1,9 @@
1
+ import { Logger } from "../Logger/Logger.js";
2
+ import { LoggerInterface } from "../../core/interface/LoggerInterface.js";
3
+ export declare class Levels extends Logger implements LoggerInterface {
4
+ info(message: string, meta?: Record<string, unknown>): void;
5
+ warn(message: string, meta?: Record<string, unknown>): void;
6
+ error(message: string, meta?: Record<string, unknown>): void;
7
+ debug(message: string, meta?: Record<string, unknown>): void;
8
+ }
9
+ //# sourceMappingURL=Levels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Levels.d.ts","sourceRoot":"","sources":["../../../../src/services/Levels/Levels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAG7C,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAE1E,qBAAa,MAAO,SAAQ,MAAO,YAAW,eAAe;IAC3D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAK3D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM3D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAK5D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAI7D"}
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.Logger = void 0;
37
+ const winston_1 = __importStar(require("winston"));
38
+ const RequestContext_js_1 = require("../../core/context/RequestContext.cjs");
39
+ class Logger {
40
+ winstonLogger;
41
+ componentName;
42
+ constructor(componentName) {
43
+ this.componentName = componentName;
44
+ this.winstonLogger = winston_1.default.createLogger({
45
+ level: "debug",
46
+ levels: {
47
+ error: 0,
48
+ warn: 1,
49
+ info: 2,
50
+ debug: 3,
51
+ },
52
+ format: winston_1.format.combine(winston_1.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }), winston_1.format.printf(({ timestamp, level, message, component, correlationId, ...meta }) => {
53
+ const metaString = Object.keys(meta).length > 0 ? ` ${JSON.stringify(meta)}` : "";
54
+ return `[${component}] [${timestamp}] [${level.toUpperCase()}] [${correlationId}] ${message}${metaString}`;
55
+ })),
56
+ transports: [
57
+ new winston_1.transports.Console({
58
+ format: winston_1.format.combine(winston_1.format.colorize({ all: true }), winston_1.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }), winston_1.format.printf(({ timestamp, level, message, ...meta }) => {
59
+ const metaString = Object.keys(meta).length > 0 ? ` ${JSON.stringify(meta)}` : "";
60
+ return `[${componentName}] [${timestamp}] [${level}] ${message}${metaString}`;
61
+ })),
62
+ }),
63
+ ],
64
+ });
65
+ }
66
+ log(entry) {
67
+ try {
68
+ const correlationId = RequestContext_js_1.RequestContext.getCorrelationId();
69
+ const logMeta = {
70
+ component: this.componentName,
71
+ correlationId,
72
+ ...entry.meta,
73
+ };
74
+ this.winstonLogger.log(entry.level, entry.message, logMeta);
75
+ // Send structured log to API (no formatting)
76
+ // LogApi({
77
+ // logs: {
78
+ // ...entry,
79
+ // component: this.componentName,
80
+ // correlationId,
81
+ // },
82
+ // });
83
+ }
84
+ catch {
85
+ // never throw from logger
86
+ }
87
+ }
88
+ getWinstonLogger() {
89
+ return this.winstonLogger;
90
+ }
91
+ getLogEntry(message, logLevel, meta) {
92
+ const entry = {
93
+ message,
94
+ meta,
95
+ timestamp: new Date().toISOString(),
96
+ level: logLevel,
97
+ };
98
+ return entry;
99
+ }
100
+ }
101
+ exports.Logger = Logger;
@@ -0,0 +1,12 @@
1
+ import { Logger as WinstonLogger } from "winston";
2
+ import { LogEntry } from "../../core/types/LogEntry.js";
3
+ import { LogLevels } from "../../core/enum/LogLevels.js";
4
+ export declare abstract class Logger {
5
+ protected winstonLogger: WinstonLogger;
6
+ private componentName;
7
+ constructor(componentName: string);
8
+ protected log(entry: LogEntry): void;
9
+ getWinstonLogger(): WinstonLogger;
10
+ protected getLogEntry(message: string, logLevel: LogLevels, meta?: Record<string, unknown>): LogEntry;
11
+ }
12
+ //# sourceMappingURL=Logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../../../../src/services/Logger/Logger.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,MAAM,IAAI,aAAa,EAAsB,MAAM,SAAS,CAAC;AAE/E,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAGxD,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAGzD,8BAAsB,MAAM;IAC1B,SAAS,CAAC,aAAa,EAAE,aAAa,CAAC;IACvC,OAAO,CAAC,aAAa,CAAS;gBAGlB,aAAa,EAAE,MAAM;IA4CjC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAyBpC,gBAAgB,IAAI,aAAa;IAIjC,SAAS,CAAC,WAAW,CACnB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,SAAS,EACnB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,QAAQ;CASZ"}
@@ -0,0 +1,4 @@
1
+ import { AxiosInstance } from "axios";
2
+ declare const HTTP: AxiosInstance;
3
+ export default HTTP;
4
+ //# sourceMappingURL=Interceptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Interceptor.d.ts","sourceRoot":"","sources":["../../../src/api/Interceptor.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE7C,QAAA,MAAM,IAAI,EAAE,aAOV,CAAC;AAEH,eAAe,IAAI,CAAC"}
@@ -0,0 +1,10 @@
1
+ import axios from "axios";
2
+ const HTTP = axios.create({
3
+ baseURL: "http://127.0.0.1:3000/api/",
4
+ headers: {
5
+ "Content-Type": "application/json",
6
+ Accept: "application/json",
7
+ },
8
+ withCredentials: false,
9
+ });
10
+ export default HTTP;
@@ -0,0 +1,6 @@
1
+ interface LogPayload {
2
+ logs: unknown;
3
+ }
4
+ export declare function LogApi(data: LogPayload): Promise<void>;
5
+ export {};
6
+ //# sourceMappingURL=LogApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogApi.d.ts","sourceRoot":"","sources":["../../../src/api/LogApi.ts"],"names":[],"mappings":"AAEA,UAAU,UAAU;IAClB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAO5D"}
@@ -0,0 +1,10 @@
1
+ import HTTP from "./Interceptor.js";
2
+ export async function LogApi(data) {
3
+ try {
4
+ const response = await HTTP.post("/log", data);
5
+ console.log("Log sent successfully:", response.status);
6
+ }
7
+ catch (error) {
8
+ console.error("Failed to send log:", error);
9
+ }
10
+ }
@@ -0,0 +1,8 @@
1
+ export interface RequestContextData {
2
+ correlationId: string;
3
+ }
4
+ export declare class RequestContext {
5
+ static run(fn: () => void, correlationId?: string): void;
6
+ static getCorrelationId(): string | undefined;
7
+ }
8
+ //# sourceMappingURL=RequestContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RequestContext.d.ts","sourceRoot":"","sources":["../../../../src/core/context/RequestContext.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,MAAM,CAAC;CACvB;AAID,qBAAa,cAAc;IACzB,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IASxD,MAAM,CAAC,gBAAgB,IAAI,MAAM,GAAG,SAAS;CAG9C"}
@@ -0,0 +1,13 @@
1
+ import { AsyncLocalStorage } from "async_hooks";
2
+ import { randomUUID } from "crypto";
3
+ const storage = new AsyncLocalStorage();
4
+ export class RequestContext {
5
+ static run(fn, correlationId) {
6
+ storage.run({
7
+ correlationId: correlationId ?? randomUUID(),
8
+ }, fn);
9
+ }
10
+ static getCorrelationId() {
11
+ return storage.getStore()?.correlationId;
12
+ }
13
+ }
@@ -0,0 +1,8 @@
1
+ export declare enum LogLevels {
2
+ INFO = "info",
3
+ WARN = "warn",
4
+ ERROR = "error",
5
+ DEBUG = "debug",
6
+ CRITICAL = "critical"
7
+ }
8
+ //# sourceMappingURL=LogLevels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogLevels.d.ts","sourceRoot":"","sources":["../../../../src/core/enum/LogLevels.ts"],"names":[],"mappings":"AAAA,oBAAY,SAAS;IACnB,IAAI,SAAS;IACb,IAAI,SAAS;IACb,KAAK,UAAU;IACf,KAAK,UAAU;IACf,QAAQ,aAAa;CACtB"}
@@ -0,0 +1,8 @@
1
+ export var LogLevels;
2
+ (function (LogLevels) {
3
+ LogLevels["INFO"] = "info";
4
+ LogLevels["WARN"] = "warn";
5
+ LogLevels["ERROR"] = "error";
6
+ LogLevels["DEBUG"] = "debug";
7
+ LogLevels["CRITICAL"] = "critical";
8
+ })(LogLevels || (LogLevels = {}));
@@ -0,0 +1,7 @@
1
+ export interface LoggerInterface {
2
+ info(message: string, meta?: Record<string, unknown>): void;
3
+ warn(message: string, meta?: Record<string, unknown>): void;
4
+ error(message: string, meta?: Record<string, unknown>): void;
5
+ debug(message: string, meta?: Record<string, unknown>): void;
6
+ }
7
+ //# sourceMappingURL=LoggerInterface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoggerInterface.d.ts","sourceRoot":"","sources":["../../../../src/core/interface/LoggerInterface.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC7D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC9D"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,5 @@
1
+ export interface LogContext {
2
+ projectName: string;
3
+ componentName: string;
4
+ }
5
+ //# sourceMappingURL=LogContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogContext.d.ts","sourceRoot":"","sources":["../../../../src/core/types/LogContext.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,9 @@
1
+ import { LogLevels } from "../enum/LogLevels.js";
2
+ export interface LogEntry {
3
+ message: string;
4
+ meta?: Record<string, unknown>;
5
+ timestamp: string;
6
+ level: LogLevels;
7
+ correlationId?: string;
8
+ }
9
+ //# sourceMappingURL=LogEntry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogEntry.d.ts","sourceRoot":"","sources":["../../../../src/core/types/LogEntry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,SAAS,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,9 @@
1
+ export { LogLevels } from "./core/enum/LogLevels.js";
2
+ export { LoggerInterface } from "./core/interface/LoggerInterface.js";
3
+ export { LogEntry } from "./core/types/LogEntry.js";
4
+ export { Levels } from "./services/Levels/Levels.js";
5
+ export { Logger as BaseLogger } from "./services/Logger/Logger.js";
6
+ import { Levels } from "./services/Levels/Levels.js";
7
+ export declare const createLogger: (component: string) => Levels;
8
+ export { createCorrelationMiddleware } from "./middlewares/correlationMiddleware.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AACrD,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAGnE,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAGrD,eAAO,MAAM,YAAY,GAAI,WAAW,MAAM,WACvB,CAAC;AAGxB,OAAO,EAAE,2BAA2B,EAAE,MAAM,wCAAwC,CAAA"}
@@ -0,0 +1,8 @@
1
+ export { LogLevels } from "./core/enum/LogLevels.js";
2
+ export { Levels } from "./services/Levels/Levels.js";
3
+ export { Logger as BaseLogger } from "./services/Logger/Logger.js";
4
+ import { Levels } from "./services/Levels/Levels.js";
5
+ // const Logger = new Levels();
6
+ export const createLogger = (component) => new Levels(component);
7
+ export { createCorrelationMiddleware } from "./middlewares/correlationMiddleware.js";
8
+ // export { Logger };
@@ -0,0 +1,2 @@
1
+ export declare const createCorrelationMiddleware: () => (req: any, res: any, next: () => void) => void;
2
+ //# sourceMappingURL=correlationMiddleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"correlationMiddleware.d.ts","sourceRoot":"","sources":["../../../src/middlewares/correlationMiddleware.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,2BAA2B,SAC9B,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,MAAM,IAAI,SAU7C,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { RequestContext } from "../core/context/RequestContext.js";
2
+ import crypto from "crypto";
3
+ export const createCorrelationMiddleware = () => {
4
+ return (req, res, next) => {
5
+ const correlationId = crypto.randomUUID();
6
+ RequestContext.run(() => {
7
+ if (res?.setHeader) {
8
+ res.setHeader("x-correlation-id", correlationId);
9
+ }
10
+ next();
11
+ }, correlationId);
12
+ };
13
+ };
@@ -0,0 +1,9 @@
1
+ import { Logger } from "../Logger/Logger.js";
2
+ import { LoggerInterface } from "../../core/interface/LoggerInterface.js";
3
+ export declare class Levels extends Logger implements LoggerInterface {
4
+ info(message: string, meta?: Record<string, unknown>): void;
5
+ warn(message: string, meta?: Record<string, unknown>): void;
6
+ error(message: string, meta?: Record<string, unknown>): void;
7
+ debug(message: string, meta?: Record<string, unknown>): void;
8
+ }
9
+ //# sourceMappingURL=Levels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Levels.d.ts","sourceRoot":"","sources":["../../../../src/services/Levels/Levels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAG7C,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAE1E,qBAAa,MAAO,SAAQ,MAAO,YAAW,eAAe;IAC3D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAK3D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM3D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAK5D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAI7D"}
@@ -0,0 +1,20 @@
1
+ import { Logger } from "../Logger/Logger.js";
2
+ import { LogLevels } from "../../core/enum/LogLevels.js";
3
+ export class Levels extends Logger {
4
+ info(message, meta) {
5
+ const entry = this.getLogEntry(message, LogLevels.INFO, meta);
6
+ this.log(entry);
7
+ }
8
+ warn(message, meta) {
9
+ const entry = this.getLogEntry(message, LogLevels.WARN, meta);
10
+ this.log(entry);
11
+ }
12
+ error(message, meta) {
13
+ const entry = this.getLogEntry(message, LogLevels.ERROR, meta);
14
+ this.log(entry);
15
+ }
16
+ debug(message, meta) {
17
+ const entry = this.getLogEntry(message, LogLevels.DEBUG, meta);
18
+ this.log(entry);
19
+ }
20
+ }
@@ -0,0 +1,12 @@
1
+ import { Logger as WinstonLogger } from "winston";
2
+ import { LogEntry } from "../../core/types/LogEntry.js";
3
+ import { LogLevels } from "../../core/enum/LogLevels.js";
4
+ export declare abstract class Logger {
5
+ protected winstonLogger: WinstonLogger;
6
+ private componentName;
7
+ constructor(componentName: string);
8
+ protected log(entry: LogEntry): void;
9
+ getWinstonLogger(): WinstonLogger;
10
+ protected getLogEntry(message: string, logLevel: LogLevels, meta?: Record<string, unknown>): LogEntry;
11
+ }
12
+ //# sourceMappingURL=Logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../../../../src/services/Logger/Logger.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,MAAM,IAAI,aAAa,EAAsB,MAAM,SAAS,CAAC;AAE/E,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAGxD,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAGzD,8BAAsB,MAAM;IAC1B,SAAS,CAAC,aAAa,EAAE,aAAa,CAAC;IACvC,OAAO,CAAC,aAAa,CAAS;gBAGlB,aAAa,EAAE,MAAM;IA4CjC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAyBpC,gBAAgB,IAAI,aAAa;IAIjC,SAAS,CAAC,WAAW,CACnB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,SAAS,EACnB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,QAAQ;CASZ"}
@@ -0,0 +1,64 @@
1
+ import winston, { format, transports } from "winston";
2
+ import { RequestContext } from "../../core/context/RequestContext.js";
3
+ export class Logger {
4
+ winstonLogger;
5
+ componentName;
6
+ constructor(componentName) {
7
+ this.componentName = componentName;
8
+ this.winstonLogger = winston.createLogger({
9
+ level: "debug",
10
+ levels: {
11
+ error: 0,
12
+ warn: 1,
13
+ info: 2,
14
+ debug: 3,
15
+ },
16
+ format: format.combine(format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }), format.printf(({ timestamp, level, message, component, correlationId, ...meta }) => {
17
+ const metaString = Object.keys(meta).length > 0 ? ` ${JSON.stringify(meta)}` : "";
18
+ return `[${component}] [${timestamp}] [${level.toUpperCase()}] [${correlationId}] ${message}${metaString}`;
19
+ })),
20
+ transports: [
21
+ new transports.Console({
22
+ format: format.combine(format.colorize({ all: true }), format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }), format.printf(({ timestamp, level, message, ...meta }) => {
23
+ const metaString = Object.keys(meta).length > 0 ? ` ${JSON.stringify(meta)}` : "";
24
+ return `[${componentName}] [${timestamp}] [${level}] ${message}${metaString}`;
25
+ })),
26
+ }),
27
+ ],
28
+ });
29
+ }
30
+ log(entry) {
31
+ try {
32
+ const correlationId = RequestContext.getCorrelationId();
33
+ const logMeta = {
34
+ component: this.componentName,
35
+ correlationId,
36
+ ...entry.meta,
37
+ };
38
+ this.winstonLogger.log(entry.level, entry.message, logMeta);
39
+ // Send structured log to API (no formatting)
40
+ // LogApi({
41
+ // logs: {
42
+ // ...entry,
43
+ // component: this.componentName,
44
+ // correlationId,
45
+ // },
46
+ // });
47
+ }
48
+ catch {
49
+ // never throw from logger
50
+ }
51
+ }
52
+ getWinstonLogger() {
53
+ return this.winstonLogger;
54
+ }
55
+ getLogEntry(message, logLevel, meta) {
56
+ const entry = {
57
+ message,
58
+ meta,
59
+ timestamp: new Date().toISOString(),
60
+ level: logLevel,
61
+ };
62
+ return entry;
63
+ }
64
+ }
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "logiscout",
3
+ "version": "1.0.0",
4
+ "description": "Logiscout — a structured logger library",
5
+ "type": "module",
6
+ "main": "./dist/cjs/index.cjs",
7
+ "module": "./dist/esm/index.js",
8
+ "types": "./dist/types/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/esm/index.js",
12
+ "require": "./dist/cjs/index.cjs",
13
+ "types": "./dist/types/index.d.ts"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "scripts": {
20
+ "build": "npm run build:esm && npm run build:cjs && npm run rename:cjs",
21
+ "build:esm": "tsc -p tsconfig.esm.json",
22
+ "build:cjs": "tsc -p tsconfig.cjs.json",
23
+ "rename:cjs": "node scripts/rename-cjs.cjs",
24
+ "start": "ts-node test/test.ts"
25
+ },
26
+ "keywords": [
27
+ "logger",
28
+ "logging",
29
+ "correlation-id",
30
+ "async-context",
31
+ "structured-logging",
32
+ "nodejs",
33
+ "express",
34
+ "winston"
35
+ ],
36
+ "author": "YOUR_NAME",
37
+ "license": "MIT",
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "https://github.com/YOUR_GITHUB_USERNAME/logicout"
41
+ },
42
+ "homepage": "https://github.com/YOUR_GITHUB_USERNAME/logicout#readme",
43
+ "bugs": {
44
+ "url": "https://github.com/YOUR_GITHUB_USERNAME/logicout/issues"
45
+ },
46
+ "engines": {
47
+ "node": ">=18"
48
+ },
49
+ "dependencies": {
50
+ "winston": "^3.11.0"
51
+ },
52
+ "devDependencies": {
53
+ "typescript": "^5.3.3",
54
+ "@types/node": "^20.10.0"
55
+ }
56
+ }