@sjts/lib-log 31.0.1 → 31.0.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/dist/Logger.d.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  import { LoggerLevel } from './LoggerLevel.js';
2
- export type LogListener = (message: string, data?: any) => void;
3
2
  export declare class Logger {
4
3
  static red: string;
5
4
  static green: string;
@@ -19,14 +18,17 @@ export declare class Logger {
19
18
  static bgBlue: string;
20
19
  static bgMagenta: string;
21
20
  static bgCyan: string;
21
+ static lastLogTimestamp: number;
22
+ private static _indent;
22
23
  private level;
23
24
  private systemTags;
24
25
  c: any;
25
- private static listeners;
26
26
  set console(c: any);
27
27
  static set console(c: any);
28
28
  set logLevel(l: LoggerLevel[]);
29
29
  static set logLevel(l: LoggerLevel[]);
30
+ static indent(): void;
31
+ static outdent(): void;
30
32
  addDebug(): void;
31
33
  static addDebug(): void;
32
34
  addSystem(): void;
@@ -49,12 +51,11 @@ export declare class Logger {
49
51
  static throw(message: string, data?: any): void;
50
52
  kill: (message: string, data?: any) => void;
51
53
  static kill(message: string, data?: any): void;
52
- triggerListeners: (message: string, data?: any) => void;
53
- static triggerListeners(message: string, data?: any): void;
54
- addListener: (l: LogListener) => void;
55
- static addListener(l: LogListener): void;
56
- removeListener: (l: LogListener) => void;
57
- static removeListener(l: LogListener): void;
58
54
  static instance: Logger;
55
+ private static _openProfiles;
56
+ static startProfiling(key: string): void;
57
+ static stopProfiling(key: string): void;
58
+ static initProfiles(): void;
59
+ static indentMessage(message: string): string;
59
60
  }
60
61
  //# sourceMappingURL=Logger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../src/Logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,CAAA;AAI/D,qBAAa,MAAM;IAClB,OAAc,GAAG,SAAa;IAC9B,OAAc,KAAK,SAAa;IAChC,OAAc,MAAM,SAAa;IACjC,OAAc,IAAI,SAAa;IAC/B,OAAc,OAAO,SAAa;IAClC,OAAc,IAAI,SAAa;IAC/B,OAAc,KAAK,SAAY;IAE/B,OAAc,IAAI,SAAY;IAC9B,OAAc,GAAG,SAAY;IAC7B,OAAc,MAAM,SAAY;IAChC,OAAc,SAAS,SAAY;IACnC,OAAc,aAAa,SAAY;IAEvC,OAAc,KAAK,SAAa;IAChC,OAAc,OAAO,SAAa;IAClC,OAAc,QAAQ,SAAa;IACnC,OAAc,MAAM,SAAa;IACjC,OAAc,SAAS,SAAa;IACpC,OAAc,MAAM,SAAa;IAEjC,OAAO,CAAC,KAAK,CAAkD;IAC/D,OAAO,CAAC,UAAU,CAAe;IAC1B,CAAC,EAAE,GAAG,CAAU;IACvB,OAAO,CAAC,MAAM,CAAC,SAAS,CAAoB;IAE5C,IAAI,OAAO,CAAC,CAAC,EAAE,GAAG,EAEjB;IACD,MAAM,KAAK,OAAO,CAAC,CAAC,EAAE,GAAG,EAExB;IAED,IAAI,QAAQ,CAAC,CAAC,EAAE,WAAW,EAAE,EAE5B;IACD,MAAM,KAAK,QAAQ,CAAC,CAAC,EAAE,WAAW,EAAE,EAEnC;IAED,QAAQ;IAGR,MAAM,CAAC,QAAQ;IAIf,SAAS;IAGT,MAAM,CAAC,SAAS;IAIhB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE;IAG5B,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE;IAI5B,KAAK,GAAI,SAAS,MAAM,EAAE,OAAO,GAAG,UASzC;WACY,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;IAYxC,KAAK,GAAI,SAAS,MAAM,EAAE,OAAO,GAAG,UAAgC;WAC7D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;IAMxC,IAAI,GAAI,SAAS,MAAM,EAAE,OAAO,GAAG,UAA+B;WAC3D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;IAMvC,MAAM,GAAI,KAAK,MAAM,EAAE,SAAS,MAAM,EAAE,OAAO,GAAG,UAA+B;WAC1E,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;IAOtD,IAAI,GAAI,SAAS,MAAM,EAAE,OAAO,GAAG,UAA+B;WAC3D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;IAOvC,KAAK,GAAI,SAAS,MAAM,EAAE,OAAO,GAAG,UAAgC;WAC7D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;IAOxC,KAAK,GAAI,SAAS,MAAM,EAAE,OAAO,GAAG,UAAgC;WAC7D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;IAQxC,IAAI,GAAI,SAAS,MAAM,EAAE,OAAO,GAAG,UAA+B;WAC3D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;IAUvC,gBAAgB,GAAI,SAAS,MAAM,EAAE,OAAO,GAAG,UACf;WACzB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;IAMnD,WAAW,GAAI,GAAG,WAAW,UAA0B;WAChD,WAAW,CAAC,CAAC,EAAE,WAAW;IAIjC,cAAc,GAAI,GAAG,WAAW,UAA6B;WACtD,cAAc,CAAC,CAAC,EAAE,WAAW;IAI3C,OAAc,QAAQ,EAAE,MAAM,CAAe;CAC7C"}
1
+ {"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../src/Logger.ts"],"names":[],"mappings":"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"}
package/dist/Logger.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { DateTime } from 'luxon';
1
2
  import { LoggerLevel } from './LoggerLevel.js';
2
3
  const { DEBUG, INFO, SYSTEM, WARN, ERROR, THROW, KILL } = LoggerLevel;
3
4
  export class Logger {
@@ -19,10 +20,11 @@ export class Logger {
19
20
  static bgBlue = '\x1b[44m';
20
21
  static bgMagenta = '\x1b[45m';
21
22
  static bgCyan = '\x1b[46m';
23
+ static lastLogTimestamp = 0;
24
+ static _indent = 0;
22
25
  level = [INFO, WARN, ERROR, THROW, KILL];
23
26
  systemTags = [];
24
27
  c = console;
25
- static listeners = [];
26
28
  set console(c) {
27
29
  this.c = c;
28
30
  }
@@ -35,6 +37,12 @@ export class Logger {
35
37
  static set logLevel(l) {
36
38
  this.instance.logLevel = l;
37
39
  }
40
+ static indent() {
41
+ this._indent++;
42
+ }
43
+ static outdent() {
44
+ this._indent--;
45
+ }
38
46
  addDebug() {
39
47
  this.level = [...this.level, DEBUG];
40
48
  }
@@ -69,68 +77,96 @@ export class Logger {
69
77
  }
70
78
  debug = (message, data) => Logger.debug(message, data);
71
79
  static debug(message, data) {
80
+ Logger.initProfiles();
81
+ const msg = Logger.indentMessage(message);
72
82
  if (this.instance.level.includes(DEBUG))
73
- this.instance.c.log(...(data ? [message, data] : [message]));
74
- this.triggerListeners(message, data);
83
+ this.instance.c.log(...(data ? [msg, data] : [msg]));
84
+ this.lastLogTimestamp = DateTime.now().toMillis();
75
85
  }
76
86
  info = (message, data) => Logger.info(message, data);
77
87
  static info(message, data) {
88
+ Logger.initProfiles();
89
+ const msg = Logger.indentMessage(message);
78
90
  if (this.instance.level.includes(INFO))
79
- this.instance.c.log(...(data ? [message, data] : [message]));
80
- this.triggerListeners(message, data);
91
+ this.instance.c.log(...(data ? [msg, data] : [msg]));
92
+ this.lastLogTimestamp = DateTime.now().toMillis();
81
93
  }
82
94
  system = (tag, message, data) => Logger.info(message, data);
83
95
  static system(tag, message, data) {
84
- const formattedMessage = `${Logger.magenta}${message}${Logger.reset}`;
96
+ Logger.initProfiles();
97
+ const msg = Logger.indentMessage(message);
98
+ const formattedMessage = `${Logger.magenta}${msg}${Logger.reset}`;
85
99
  if (this.instance.level.includes(SYSTEM) && this.instance.systemTags.includes(tag))
86
100
  this.instance.c.log(...(data ? [formattedMessage, data] : [formattedMessage]));
87
- this.triggerListeners(message, data);
101
+ this.lastLogTimestamp = DateTime.now().toMillis();
88
102
  }
89
103
  warn = (message, data) => Logger.warn(message, data);
90
104
  static warn(message, data) {
91
- const formattedMessage = `${Logger.yellow}WARN: ${message}${Logger.reset}`;
105
+ Logger.initProfiles();
106
+ const msg = Logger.indentMessage(message);
107
+ const formattedMessage = `${Logger.yellow}WARN: ${msg}${Logger.reset}`;
92
108
  if (this.instance.level.includes(WARN))
93
109
  this.instance.c.warn(...(data ? [formattedMessage, data] : [formattedMessage]));
94
- this.triggerListeners(message, data);
110
+ this.lastLogTimestamp = DateTime.now().toMillis();
95
111
  }
96
112
  error = (message, data) => Logger.error(message, data);
97
113
  static error(message, data) {
98
- const formattedMessage = `${Logger.red}ERROR: ${message}${Logger.reset}`;
114
+ Logger.initProfiles();
115
+ const msg = Logger.indentMessage(message);
116
+ const formattedMessage = `${Logger.red}ERROR: ${msg}${Logger.reset}`;
99
117
  if (this.instance.level.includes(ERROR))
100
118
  this.instance.c.error(...(data ? [formattedMessage, data] : [formattedMessage]));
101
- this.triggerListeners(message, data);
119
+ this.lastLogTimestamp = DateTime.now().toMillis();
102
120
  }
103
121
  throw = (message, data) => Logger.throw(message, data);
104
122
  static throw(message, data) {
105
- const formattedMessage = `${Logger.red}ERROR: ${message}${Logger.reset}`;
123
+ Logger.initProfiles();
124
+ const msg = Logger.indentMessage(message);
125
+ const formattedMessage = `${Logger.red}ERROR: ${msg}${Logger.reset}`;
106
126
  if (this.instance.level.includes(THROW))
107
127
  this.instance.c.error(...(data ? [formattedMessage, data] : [formattedMessage]));
108
- this.triggerListeners(message, data);
109
128
  throw new Error(message.toString());
110
129
  }
111
130
  kill = (message, data) => Logger.kill(message, data);
112
131
  static kill(message, data) {
113
- const formattedMessage = `${Logger.red}ERROR: ${message}${Logger.reset}`;
132
+ Logger.initProfiles();
133
+ const msg = Logger.indentMessage(message);
134
+ const formattedMessage = `${Logger.red}ERROR: ${msg}${Logger.reset}`;
114
135
  if (this.instance.level.includes(KILL))
115
136
  this.instance.c.error(...(data ? [formattedMessage, data] : [formattedMessage]));
116
- this.triggerListeners(message, data);
137
+ this.lastLogTimestamp = DateTime.now().toMillis();
117
138
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
118
139
  // @ts-ignore
119
140
  process.exit(0);
120
141
  }
121
- triggerListeners = (message, data) => Logger.triggerListeners(message, data);
122
- static triggerListeners(message, data) {
123
- this.listeners.forEach(l => {
124
- l(message.toString(), data);
142
+ static instance = new Logger();
143
+ // ------------------------------------------------------------
144
+ // Performance
145
+ // ------------------------------------------------------------
146
+ static _openProfiles = {};
147
+ static startProfiling(key) {
148
+ Logger._openProfiles[key] = { start: DateTime.now().toMillis(), initiated: false };
149
+ }
150
+ static stopProfiling(key) {
151
+ const endTime = DateTime.now().toMillis();
152
+ const duration = endTime - Logger._openProfiles[key].start;
153
+ if (Logger._openProfiles[key].initiated)
154
+ Logger.outdent();
155
+ delete Logger._openProfiles[key];
156
+ Logger.info(`${Logger.blue}${Logger.italic}${key}${Logger.reset} - ${Logger.green}${duration}ms${Logger.reset}`);
157
+ }
158
+ static initProfiles() {
159
+ Object.keys(Logger._openProfiles).forEach(key => {
160
+ if (!Logger._openProfiles[key].initiated) {
161
+ Logger._openProfiles[key].initiated = true;
162
+ Logger.info(`${Logger.blue}${Logger.italic}${key}${Logger.reset}`);
163
+ Logger.indent();
164
+ }
125
165
  });
126
166
  }
127
- addListener = (l) => Logger.addListener(l);
128
- static addListener(l) {
129
- this.listeners.push(l);
167
+ static indentMessage(message) {
168
+ return Logger._indent > 0
169
+ ? `${Logger.dim}${Logger.blue}${'| '.repeat(Logger._indent)}${Logger.reset}${message}`
170
+ : message;
130
171
  }
131
- removeListener = (l) => Logger.removeListener(l);
132
- static removeListener(l) {
133
- this.listeners = this.listeners.filter(ll => ll !== l);
134
- }
135
- static instance = new Logger();
136
172
  }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Logger.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Logger.test.d.ts","sourceRoot":"","sources":["../src/Logger.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import { Logger } from './Logger';
2
+ const test = () => {
3
+ Logger.startProfiling('Speed Test');
4
+ Logger.info('ABC');
5
+ Logger.startProfiling('Something');
6
+ Logger.info('DEF');
7
+ Logger.info('GHI');
8
+ Logger.stopProfiling('Something');
9
+ Logger.info('JKL');
10
+ Logger.startProfiling('Something Else');
11
+ Logger.stopProfiling('Something Else');
12
+ Logger.stopProfiling('Speed Test');
13
+ return 100;
14
+ };
15
+ test();
@@ -0,0 +1,11 @@
1
+ export type ProfilerOptions = {
2
+ logAtStart?: boolean;
3
+ };
4
+ export declare class Profiler {
5
+ private label;
6
+ private o;
7
+ private startTime;
8
+ constructor(label: string, o?: ProfilerOptions);
9
+ stop(): void;
10
+ }
11
+ //# sourceMappingURL=Profiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Profiler.d.ts","sourceRoot":"","sources":["../src/Profiler.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,eAAe,GAAG;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAA;CACpB,CAAA;AAED,qBAAa,QAAQ;IAInB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,CAAC;IAJV,OAAO,CAAC,SAAS,CAAQ;gBAGhB,KAAK,EAAE,MAAM,EACb,CAAC,GAAE,eAAuC;IAUnD,IAAI;CAUJ"}
@@ -0,0 +1,25 @@
1
+ import { DateTime } from 'luxon';
2
+ import { Logger } from './Logger';
3
+ export class Profiler {
4
+ label;
5
+ o;
6
+ startTime;
7
+ constructor(label, o = { logAtStart: false }) {
8
+ this.label = label;
9
+ this.o = o;
10
+ this.label = label;
11
+ this.startTime = DateTime.now().toMillis();
12
+ if (o.logAtStart) {
13
+ Logger.info(`${label}`);
14
+ Logger.indent();
15
+ }
16
+ }
17
+ stop() {
18
+ const endTime = Date.now();
19
+ const duration = endTime - this.startTime;
20
+ if (this.o.logAtStart) {
21
+ Logger.outdent();
22
+ }
23
+ Logger.info(`${this.label} - ${duration}ms`);
24
+ }
25
+ }
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from './Logger.js';
2
+ export * from './Logger.test.js';
2
3
  export * from './LoggerLevel.js';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA"}
package/dist/index.js CHANGED
@@ -1,2 +1,3 @@
1
1
  export * from './Logger.js';
2
+ export * from './Logger.test.js';
2
3
  export * from './LoggerLevel.js';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sjts/lib-log",
3
3
  "description": "The Steve James Typescript Log package",
4
- "version": "31.0.1",
4
+ "version": "31.0.3",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.js",
@@ -19,11 +19,13 @@
19
19
  "clean": "rm -rf dist",
20
20
  "release:patch": "yarn version patch && yarn npm publish",
21
21
  "release:minor": "yarn version minor && yarn npm publish",
22
- "release:major": "yarn version major && yarn npm publish"
22
+ "release:major": "yarn version major && yarn npm publish",
23
+ "test": "tsx src/Logger.test.ts"
23
24
  },
24
25
  "prettier": "@sjts/lib-devops/prettier.json",
25
26
  "devDependencies": {
26
27
  "@sjts/lib-devops": "31.0.1",
28
+ "tsx": "^4.20.6",
27
29
  "typescript": "^5.8.3"
28
30
  },
29
31
  "publishConfig": {