analogger 1.5.1 → 1.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,5 @@
1
- ## [1.5.1](https://github.com/thimpat/analogger/compare/v1.5.0...v1.5.1) (2022-02-11)
2
-
1
+ ## [1.5.1](https://github.com/thimpat/analogger/compare/v1.5.0...v1.5.1) (2022-02-11)
2
+
3
3
  # [1.5.0](https://github.com/thimpat/analogger/compare/v1.4.1...v1.5.0) (2022-02-11)
4
4
 
5
5
  ## [1.4.1](https://github.com/thimpat/analogger/compare/v1.4.0...v1.4.1) (2022-02-09)
@@ -10,4 +10,4 @@
10
10
 
11
11
  ## [1.3.1](https://github.com/thimpat/analogger/compare/v1.3.0...v1.3.1) (2022-02-09)
12
12
 
13
- # [1.3.0](https://github.com/thimpat/analogger/compare/v1.2.0...v1.3.0) (2022-02-08)
13
+ # [1.3.0](https://github.com/thimpat/analogger/compare/v1.2.0...v1.3.0) (2022-02-08)
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var require$$0=require("chalk-cjs"),require$$1=require("color-convert-cjs"),require$$2=require("rgb-hex-cjs");function _interopDefaultLegacy(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var require$$0__default=_interopDefaultLegacy(require$$0),require$$1__default=_interopDefaultLegacy(require$$1),require$$2__default=_interopDefaultLegacy(require$$2),anaLogger={},constants$1={};const constants={COLOR_TABLE:["#d2466e","#FFA07A","#FF7F50","#FF6347","#FFE4B5","#ADFF2F","#808000","#40E0D0","#1E90FF","#EE82EE","#708090","#DEB887","#FE642E","#210B61","#088A4B","#5E610B","#FA8258","#088A68","#B40431"],SYSTEM:{BROWSER:"BROWSER",NODE:"NODE"}},chalk=(constants$1.COLOR_TABLE=constants.COLOR_TABLE,constants$1.SYSTEM=constants.SYSTEM,require$$0__default.default),colorConvert=require$$1__default.default,rgbHex=require$$2__default.default,{COLOR_TABLE,SYSTEM}=constants$1,EOL=`
2
+ `;class AnaLogger{system="";logIndex=0;contexts=[];targets={};activeTarget=null;indexColor=0;format="";keepLog=!1;logHistory=[];$containers=null;options={hideHookMessage:!1};static ALIGN={LEFT:"LEFT",RIGHT:"RIGHT"};static ENVIRONMENT_TYPE={BROWSER:"BROWSER",NODE:"NODE",OTHER:"OTHER"};originalFormatFunction;constructor(){this.system="object"==typeof process?SYSTEM.NODE:SYSTEM.BROWSER,this.format=this.onBuildLog.bind(this),this.originalFormatFunction=this.format,this.errorTargetHandler=this.onError.bind(this),this.errorUserTargetHandler=this.onErrorForUserTarget.bind(this),this.setOptions(this.options),this.realConsoleLog=console.log,this.realConsoleInfo=console.info,this.realConsoleWarn=console.warn,this.realConsoleError=console.error,this.ALIGN=AnaLogger.ALIGN,this.ENVIRONMENT_TYPE=AnaLogger.ENVIRONMENT_TYPE}keepLogHistory(){this.keepLog=!0}releaseLogHistory(){this.keepLog=!1}resetLogHistory(){this.logHistory=[]}getLogHistory(e=!0,t=EOL){const o=JSON.parse(JSON.stringify(this.logHistory.slice(0)));return e?o.join(t):o}isNode(){return this.system===SYSTEM.NODE}isBrowser(){return!this.isNode()}setOptions({contextLenMax:e=10,idLenMax:t=5,lidLenMax:o=5,symbolLenMax:r=2,messageLenMax:s=60,hideLog:n=!1,hideError:i=!1,hideHookMessage:a=!1,showPassingTests:l=!0,logToDom:g=void 0,silent:h=!1}={}){this.options.contextLenMax=e,this.options.idLenMax=t,this.options.lidLenMax=o,this.options.messageLenMax=s,this.options.symbolLenMax=r,this.options.hideLog=!!n,this.options.hideError=!!i,this.options.hideHookMessage=!!a,this.options.showPassingTests=!!l,void 0!==g&&(this.options.logToDom=g||"#analogger"),h&&(this.options.hideLog=!0,this.options.hideHookMessage=!0,this.options.silent=!0)}getOptions(){return this.options}truncateMessage(e="",{fit:t=0,align:o=AnaLogger.ALIGN.LEFT}){return e=""+e,t&&e.length>=t+2&&(e=e.substring(0,t-3)+"..."),e=o===AnaLogger.ALIGN.LEFT?e.padEnd(t+1," "):e.padStart(t+1," ")}onBuildLog({contextName:e,message:t="",lid:o="",symbol:r=""}={}){const s=new Date;var n=("0"+s.getHours()).slice(-2)+":"+("0"+s.getMinutes()).slice(-2)+":"+("0"+s.getSeconds()).slice(-2),n=this.truncateMessage(n,{fit:7});return e=this.truncateMessage(e,{fit:this.options.contextLenMax,align:AnaLogger.ALIGN.RIGHT}),o=this.truncateMessage(o,{fit:this.options.lidLenMax}),t=this.truncateMessage(t,{fit:this.options.messageLenMax}),`[${n}] ${e}: (${o}) ${r=this.truncateMessage(r,{fit:this.options.symbolLenMax})} `+t}onErrorForUserTarget(e,...t){this.errorUserTargetHandler(e,...t)}onError(e,...t){e.target===this.targets.USER&&this.onErrorForUserTarget(e,...t)}onDisplayLog(...e){this.log(...e)}onDisplayError(...e){this.error(...e)}setLogFormat(e){if("function"!=typeof e)return console.error("Invalid parameter for setFormat. It is expecting a function or method."),!1;this.format=e.bind(this)}resetLogFormatter(){this.format=this.originalFormatFunction}setErrorHandler(e){this.errorTargetHandler=e.bind(this)}setErrorHandlerForUserTarget(e){this.errorUserTargetHandler=e.bind(this)}isContextValid(e){return"object"==typeof e&&!Array.isArray(e)&&null!==e&&(e.hasOwnProperty("contextName")&&e.hasOwnProperty("target"))}generateDefaultContext(){const e={name:"DEFAULT",contextName:"DEFAULT",target:"ALL",symbol:"⚡"};return e.id=this.logIndex++,e.color=COLOR_TABLE[1],e}generateNewContext(){const e=this.generateDefaultContext();return e.color=COLOR_TABLE[this.indexColor++%(COLOR_TABLE.length-3)+2],e.symbol="",e}generateErrorContext(){const e=this.generateDefaultContext();return e.color=COLOR_TABLE[0],e.symbol="v",e.error=!0,e}#allegeProperties(e){let t=e;e=this.generateNewContext();return t=Object.assign({},e,t),-1<t.color.toLowerCase().indexOf("rgb")?t.color="#"+rgbHex(t.color):-1===t.color.indexOf("#")&&colorConvert&&(t.color="#"+colorConvert.keyword.hex(t.color)),t}setContexts(o){const e=Object.keys(o);o.DEFAULT=this.contexts.DEFAULT=this.generateDefaultContext(),o.ERROR=this.contexts.ERROR=this.generateErrorContext(),e.forEach(e=>{const t=o[e]||{};t.contextName=e,t.name=e,this.contexts[e]=this.#allegeProperties(t),o[e]=this.contexts[e]})}setTargets(e={}){this.targets=Object.assign({},e,{ALL:"ALL",USER:"USER"})}setActiveTarget(e){this.activeTarget=e}isTargetAllowed(e){return!e||!this.activeTarget||(e===this.targets.ALL||this.activeTarget===e)}writeLogToDom(o){this.$containers=this.$containers||document.querySelectorAll(this.options.logToDom);for(let t=0;t<this.$containers.length;++t){const r=this.$containers[t];let e=r.querySelector(".analogger-view");e||(e=document.createElement("div"),e.classList.add("analogger-view"),r.append(e));const s=document.createElement("div"),n=(s.classList.add("to-esm-line"),s.textContent=o,document.createElement("span"));n.classList.add("to-esm-row"),s.append(n),e.append(s)}}processOutput(o={}){try{if(!this.isTargetAllowed(o.target))return;let e=Array.prototype.slice.call(arguments);e.shift();var r=e.join(" | ");let t="";var s=this.format({...o,message:r});if(t=this.isBrowser()?(o.environnment=AnaLogger.ENVIRONMENT_TYPE.BROWSER,this.options.logToDom&&this.writeLogToDom(s),"%c"+s):(o.environnment=AnaLogger.ENVIRONMENT_TYPE.NODE,chalk.hex(o.color)(s)),this.keepLog&&this.logHistory.push(t),this.options.hideLog)return;this.isBrowser()?this.realConsoleLog(t,"color: "+o.color):this.realConsoleLog(t),this.errorTargetHandler(o,e)}catch(e){console.error("AnaLogger:",e.message)}}isExtendedOptionsPassed(e){return"object"==typeof e&&(e.hasOwnProperty("context")||e.hasOwnProperty("target"))}convertToContext(e,t){t=t||this.generateDefaultContext();let o=e=e||t;if(e.context&&"object"==typeof e.context){const r=Object.assign({},e);delete r.context,o=Object.assign({},e.context,r)}return o=Object.assign({},t,o),delete o.context,o}log(e,...t){if(!this.isExtendedOptionsPassed(e))return o=this.generateDefaultContext(),void this.processOutput.apply(this,[o,e,...t]);var o=this.convertToContext(e);this.processOutput.apply(this,[o,...t])}error(e){var t;this.options.hideError||(t=this.generateErrorContext(),e=this.convertToContext(e,t),t=Array.prototype.slice.call(arguments),this.log(e,...t))}overrideError(){this.options.hideHookMessage||this.realConsoleLog("AnaLogger: Hook placed on console.error"),console.error=this.onDisplayError.bind(this)}overrideConsole({log:e=!0,info:t=!0,warn:o=!0,error:r=!1}={}){this.options.hideHookMessage||this.realConsoleLog("AnaLogger: Hook placed on console.log"),e&&(console.log=this.onDisplayLog.bind(this)),t&&(console.info=this.onDisplayLog.bind(this)),o&&(console.warn=this.onDisplayLog.bind(this)),r&&this.overrideError()}removeOverrideError(){console.warn=this.realConsoleError}removeOverride({log:e=!0,info:t=!0,warn:o=!0,error:r=!1}={}){e&&(console.log=this.realConsoleLog),t&&(console.info=this.realConsoleInfo),o&&(console.warn=this.realConsoleWarn),r&&this.removeOverrideError()}info(...e){return this.log(...e)}warn(...e){return this.log(...e)}alert(...e){if(this.isNode())return this.log(...e);e=e.join(" | ");alert(e)}assert(e,t=!0,...o){try{return"function"==typeof e?e(...o)!==t?(this.error("Asset failed"),!1):(this.options.showPassingTests&&this.log("SUCCESS: Assert passed"),!0):e!==t?(this.error("Assert failed"),!1):(this.options.showPassingTests&&this.log("SUCCESS: Assert passed"),!0)}catch(e){this.error("Unexpected error in assert")}return!1}}var anaLogger_1=anaLogger.anaLogger=new AnaLogger;exports.anaLogger=anaLogger_1,exports.default=anaLogger;
@@ -0,0 +1,734 @@
1
+ function rgbHex(red, green, blue, alpha) {
2
+ const isPercent = (red + (alpha || '')).toString().includes('%');
3
+
4
+ if (typeof red === 'string') {
5
+ [red, green, blue, alpha] = red.match(/(0?\.?\d{1,3})%?\b/g).map(component => Number(component));
6
+ } else if (alpha !== undefined) {
7
+ alpha = Number.parseFloat(alpha);
8
+ }
9
+
10
+ if (typeof red !== 'number' ||
11
+ typeof green !== 'number' ||
12
+ typeof blue !== 'number' ||
13
+ red > 255 ||
14
+ green > 255 ||
15
+ blue > 255
16
+ ) {
17
+ throw new TypeError('Expected three numbers below 256');
18
+ }
19
+
20
+ if (typeof alpha === 'number') {
21
+ if (!isPercent && alpha >= 0 && alpha <= 1) {
22
+ alpha = Math.round(255 * alpha);
23
+ } else if (isPercent && alpha >= 0 && alpha <= 100) {
24
+ alpha = Math.round(255 * alpha / 100);
25
+ } else {
26
+ throw new TypeError(`Expected alpha value (${alpha}) as a fraction or percentage`);
27
+ }
28
+
29
+ alpha = (alpha | 1 << 8).toString(16).slice(1); // eslint-disable-line no-mixed-operators
30
+ } else {
31
+ alpha = '';
32
+ }
33
+
34
+ // TODO: Remove this ignore comment.
35
+ // eslint-disable-next-line no-mixed-operators
36
+ return ((blue | green << 8 | red << 16) | 1 << 24).toString(16).slice(1) + alpha;
37
+ }
38
+
39
+ /**
40
+ * DO NOT EDIT THIS FILE DIRECTLY.
41
+ * This file is generated following the conversion of
42
+ * [src/cjs/constants.cjs]
43
+ *
44
+ **/
45
+ const constants = {
46
+ COLOR_TABLE: [
47
+ "#d2466e", // Error context color
48
+ "#FFA07A", // Default context color
49
+ "#FF7F50",
50
+ "#FF6347",
51
+ "#FFE4B5",
52
+ "#ADFF2F",
53
+ "#808000",
54
+ "#40E0D0",
55
+ "#1E90FF",
56
+ "#EE82EE",
57
+ "#708090",
58
+ "#DEB887",
59
+ "#FE642E",
60
+ "#210B61",
61
+ "#088A4B",
62
+ "#5E610B",
63
+ "#FA8258",
64
+ "#088A68",
65
+ "#B40431",
66
+ ],
67
+ SYSTEM: {
68
+ BROWSER: "BROWSER",
69
+ NODE: "NODE"
70
+ }
71
+
72
+ };
73
+
74
+ const COLOR_TABLE = constants.COLOR_TABLE;
75
+ const SYSTEM = constants.SYSTEM;
76
+
77
+ /**
78
+ * DO NOT EDIT THIS FILE DIRECTLY.
79
+ * This file is generated following the conversion of
80
+ * [src/cjs/ana-logger.cjs]
81
+ *
82
+ **/
83
+ const chalk = null;
84
+ const EOL =`
85
+ `;
86
+
87
+ class AnaLogger
88
+ {
89
+ system = ""
90
+
91
+ logIndex = 0;
92
+ contexts = [];
93
+ targets = {};
94
+
95
+ activeTarget = null;
96
+
97
+ indexColor = 0;
98
+
99
+ format = "";
100
+
101
+ keepLog = false;
102
+ logHistory = []
103
+
104
+ $containers = null
105
+
106
+ options = {
107
+ hideHookMessage: false
108
+ }
109
+
110
+ static ALIGN = {
111
+ LEFT : "LEFT",
112
+ RIGHT: "RIGHT"
113
+ }
114
+
115
+ static ENVIRONMENT_TYPE = {
116
+ BROWSER: "BROWSER",
117
+ NODE : "NODE",
118
+ OTHER : "OTHER"
119
+ }
120
+ originalFormatFunction;
121
+
122
+ constructor()
123
+ {
124
+ this.system = (typeof process === "object") ? SYSTEM.NODE : SYSTEM.BROWSER;
125
+ this.format = this.onBuildLog.bind(this);
126
+ this.originalFormatFunction = this.format;
127
+
128
+ this.errorTargetHandler = this.onError.bind(this);
129
+ this.errorUserTargetHandler = this.onErrorForUserTarget.bind(this);
130
+
131
+ this.setOptions(this.options);
132
+
133
+ this.realConsoleLog = console.log;
134
+ this.realConsoleInfo = console.info;
135
+ this.realConsoleWarn = console.warn;
136
+ this.realConsoleError = console.error;
137
+
138
+ this.ALIGN = AnaLogger.ALIGN;
139
+ this.ENVIRONMENT_TYPE = AnaLogger.ENVIRONMENT_TYPE;
140
+ }
141
+
142
+ keepLogHistory()
143
+ {
144
+ this.keepLog = true;
145
+ }
146
+
147
+ releaseLogHistory()
148
+ {
149
+ this.keepLog = false;
150
+ }
151
+
152
+ resetLogHistory()
153
+ {
154
+ this.logHistory = [];
155
+ }
156
+
157
+ getLogHistory(join = true, symbol = EOL)
158
+ {
159
+ const history = JSON.parse(JSON.stringify(this.logHistory.slice(0)));
160
+ if (!join)
161
+ {
162
+ return history;
163
+ }
164
+ return history.join(symbol);
165
+ }
166
+
167
+ /**
168
+ * Tell whether we are in a Node environment
169
+ * @returns {boolean}
170
+ */
171
+ isNode()
172
+ {
173
+ return this.system === SYSTEM.NODE
174
+ }
175
+
176
+ /**
177
+ * Tell whether the logger runs from a browser
178
+ * @returns {boolean}
179
+ */
180
+ isBrowser()
181
+ {
182
+ return !this.isNode()
183
+ }
184
+
185
+ setOptions({
186
+ contextLenMax = 10,
187
+ idLenMax = 5,
188
+ lidLenMax = 5,
189
+ symbolLenMax = 2,
190
+ messageLenMax = 60,
191
+ hideLog = false,
192
+ hideError = false,
193
+ hideHookMessage = false,
194
+ showPassingTests = true,
195
+ logToDom = undefined,
196
+ silent = false
197
+ } = {})
198
+ {
199
+ this.options.contextLenMax = contextLenMax;
200
+ this.options.idLenMax = idLenMax;
201
+ this.options.lidLenMax = lidLenMax;
202
+ this.options.messageLenMax = messageLenMax;
203
+ this.options.symbolLenMax = symbolLenMax;
204
+ this.options.hideLog = !!hideLog;
205
+ this.options.hideError = !!hideError;
206
+ this.options.hideHookMessage = !!hideHookMessage;
207
+ this.options.showPassingTests = !!showPassingTests;
208
+ if (logToDom !== undefined)
209
+ {
210
+ this.options.logToDom = logToDom || "#analogger";
211
+ }
212
+
213
+ if (silent)
214
+ {
215
+ this.options.hideLog = true;
216
+ this.options.hideHookMessage = true;
217
+ this.options.silent = true;
218
+ }
219
+ }
220
+
221
+ getOptions()
222
+ {
223
+ return this.options
224
+ }
225
+
226
+ truncateMessage(input = "", {fit = 0, align = AnaLogger.ALIGN.LEFT})
227
+ {
228
+ input = "" + input;
229
+ if (fit && input.length >= fit + 2)
230
+ {
231
+ input = input.substring(0, fit - 3) + "...";
232
+ }
233
+
234
+ input = align === AnaLogger.ALIGN.LEFT ? input.padEnd(fit + 1, " ") : input.padStart(fit + 1, " ");
235
+ return input
236
+ }
237
+
238
+ /**
239
+ * Format inputs
240
+ * @see Override {@link setLogFormat}
241
+ * @param contextName
242
+ * @param id
243
+ * @param message
244
+ * @param lid
245
+ * @param symbol
246
+ * @returns {string}
247
+ */
248
+ onBuildLog({contextName, id, message = "", lid = "", symbol = ""} = {})
249
+ {
250
+ // Time
251
+ const date = new Date();
252
+ let time = ('0' + date.getHours()).slice(-2) + ":" + ('0' + date.getMinutes()).slice(-2) + ":" + ('0' + date.getSeconds()).slice(-2);
253
+
254
+ // Display content in columns
255
+ time = this.truncateMessage(time, {fit: 7});
256
+ contextName = this.truncateMessage(contextName, {fit: this.options.contextLenMax, align: AnaLogger.ALIGN.RIGHT});
257
+ // id = this.truncateMessage(id, {fit: this.options.idLenMax})
258
+ lid = this.truncateMessage(lid, {fit: this.options.lidLenMax});
259
+ message = this.truncateMessage(message, {fit: this.options.messageLenMax});
260
+ symbol = this.truncateMessage(symbol, {fit: this.options.symbolLenMax});
261
+
262
+ return `[${time}] ${contextName}: (${lid}) ${symbol} ${message}`
263
+ }
264
+
265
+ onErrorForUserTarget(context, ...args)
266
+ {
267
+ this.errorUserTargetHandler(context, ...args);
268
+ }
269
+
270
+ onError(context, ...args)
271
+ {
272
+ if (context.target === this.targets.USER)
273
+ {
274
+ this.onErrorForUserTarget(context, ...args);
275
+ }
276
+ }
277
+
278
+ /**
279
+ * Forward input to real console log
280
+ * @param args
281
+ */
282
+ onDisplayLog(...args)
283
+ {
284
+ this.log(...args);
285
+ }
286
+
287
+ /**
288
+ * Forward input to real console log
289
+ * @param args
290
+ */
291
+ onDisplayError(...args)
292
+ {
293
+ this.error(...args);
294
+ }
295
+
296
+ /**
297
+ * Set log template
298
+ * @param format
299
+ */
300
+ setLogFormat(format)
301
+ {
302
+ if (typeof format !== 'function')
303
+ {
304
+ console.error(`Invalid parameter for setFormat. It is expecting a function or method.`);
305
+ return false
306
+ }
307
+ this.format = format.bind(this);
308
+ }
309
+
310
+ resetLogFormatter()
311
+ {
312
+ this.format = this.originalFormatFunction;
313
+ }
314
+
315
+ setErrorHandler(handler)
316
+ {
317
+ this.errorTargetHandler = handler.bind(this);
318
+ }
319
+
320
+ setErrorHandlerForUserTarget(handler)
321
+ {
322
+ this.errorUserTargetHandler = handler.bind(this);
323
+ }
324
+
325
+ // ------------------------------------------------
326
+ // Color
327
+ // ------------------------------------------------
328
+
329
+ // ------------------------------------------------
330
+ // Log Contexts
331
+ // ------------------------------------------------
332
+ isContextValid(context)
333
+ {
334
+ if (
335
+ !(typeof context === 'object' &&
336
+ !Array.isArray(context) &&
337
+ context !== null)
338
+ )
339
+ {
340
+ return false
341
+ }
342
+ return (context.hasOwnProperty("contextName") && context.hasOwnProperty("target"))
343
+ }
344
+
345
+ generateDefaultContext()
346
+ {
347
+ const defaultContext = {
348
+ name : "DEFAULT",
349
+ contextName: "DEFAULT",
350
+ target : "ALL",
351
+ symbol : "⚡"
352
+ };
353
+
354
+ defaultContext.id = this.logIndex++;
355
+ defaultContext.color = COLOR_TABLE[1];
356
+ return defaultContext
357
+ }
358
+
359
+ generateNewContext()
360
+ {
361
+ const newContext = this.generateDefaultContext();
362
+ newContext.color = COLOR_TABLE[(this.indexColor++) % (COLOR_TABLE.length - 3) + 2];
363
+ newContext.symbol = "";
364
+ return newContext
365
+ }
366
+
367
+ generateErrorContext()
368
+ {
369
+ const errorContext = this.generateDefaultContext();
370
+ errorContext.color = COLOR_TABLE[0];
371
+ errorContext.symbol = "v";
372
+ errorContext.error = true;
373
+ return errorContext
374
+ }
375
+
376
+ #allegeProperties(entry)
377
+ {
378
+ let converted = entry;
379
+
380
+ const defaultContext = this.generateNewContext();
381
+
382
+ converted = Object.assign({}, defaultContext, converted);
383
+
384
+ if (converted.color.toLowerCase().indexOf("rgb") > -1)
385
+ {
386
+ converted.color = "#" + rgbHex(converted.color);
387
+ }
388
+ else if (converted.color.indexOf("#") === -1)
389
+ ;
390
+
391
+ return converted;
392
+ }
393
+
394
+ /**
395
+ * Load the context names that should be available to the environment.
396
+ * They are defined by the user.
397
+ * @see Context definitions {@link ./example/cjs/contexts-def.cjs}
398
+ * @param contextTable
399
+ */
400
+ setContexts(contextTable)
401
+ {
402
+ const arr = Object.keys(contextTable);
403
+ contextTable["DEFAULT"] = this.contexts["DEFAULT"] = this.generateDefaultContext();
404
+ contextTable["ERROR"] = this.contexts["ERROR"] = this.generateErrorContext();
405
+ arr.forEach((key) =>
406
+ {
407
+ const contextPassed = contextTable[key] || {};
408
+ contextPassed.contextName = key;
409
+ contextPassed.name = key;
410
+ this.contexts[key] = this.#allegeProperties(contextPassed);
411
+ contextTable[key] = this.contexts[key];
412
+ });
413
+ }
414
+
415
+ setTargets(targetTable = {})
416
+ {
417
+ this.targets = Object.assign({}, targetTable, {ALL: "ALL", USER: "USER"});
418
+ }
419
+
420
+ setActiveTarget(target)
421
+ {
422
+ this.activeTarget = target;
423
+ }
424
+
425
+ isTargetAllowed(target)
426
+ {
427
+ if (!target || !this.activeTarget)
428
+ {
429
+ return true;
430
+ }
431
+
432
+ if (target === this.targets.ALL)
433
+ {
434
+ return true;
435
+ }
436
+
437
+ return this.activeTarget === target;
438
+ }
439
+
440
+
441
+ // ------------------------------------------------
442
+ // Logging methods
443
+ // ------------------------------------------------
444
+ writeLogToDom(text)
445
+ {
446
+ this.$containers = this.$containers || document.querySelectorAll(this.options.logToDom);
447
+
448
+ for (let i = 0; i < this.$containers.length; ++i)
449
+ {
450
+ const $container = this.$containers[i];
451
+
452
+ let $view = $container.querySelector(".analogger-view");
453
+ if (!$view)
454
+ {
455
+ $view = document.createElement("div");
456
+ $view.classList.add("analogger-view");
457
+ $container.append($view);
458
+ }
459
+
460
+ const line = document.createElement("div");
461
+ line.classList.add("to-esm-line");
462
+ line.textContent = text;
463
+ const row = document.createElement("span");
464
+ row.classList.add("to-esm-row");
465
+ line.append(row);
466
+
467
+ $view.append(line);
468
+ }
469
+ }
470
+
471
+ /**
472
+ * Display log following template
473
+ * @param context
474
+ */
475
+ processOutput(context = {})
476
+ {
477
+ try
478
+ {
479
+ if (!this.isTargetAllowed(context.target))
480
+ {
481
+ return
482
+ }
483
+
484
+ let args = Array.prototype.slice.call(arguments);
485
+ args.shift();
486
+
487
+ const message = args.join(" | ");
488
+
489
+ let output = "";
490
+ const text = this.format({...context, message});
491
+
492
+ if (this.isBrowser())
493
+ {
494
+ context.environnment = AnaLogger.ENVIRONMENT_TYPE.BROWSER;
495
+ if (this.options.logToDom)
496
+ {
497
+ this.writeLogToDom(text);
498
+ }
499
+ output = `%c${text}`;
500
+ }
501
+ else
502
+ {
503
+ context.environnment = AnaLogger.ENVIRONMENT_TYPE.NODE;
504
+ output = chalk.hex(context.color)(text);
505
+ }
506
+
507
+ if (this.keepLog)
508
+ {
509
+ this.logHistory.push(output);
510
+ }
511
+
512
+ if (this.options.hideLog)
513
+ {
514
+ return
515
+ }
516
+
517
+ if (this.isBrowser())
518
+ {
519
+ this.realConsoleLog(output, `color: ${context.color}`);
520
+ }
521
+ else
522
+ {
523
+ this.realConsoleLog(output);
524
+ }
525
+
526
+ this.errorTargetHandler(context, args);
527
+ }
528
+ catch (e)
529
+ {
530
+ console.error(`AnaLogger:`, e.message);
531
+ }
532
+ }
533
+
534
+ /**
535
+ * Check that a parameter (should be the first) uses the expected format.
536
+ * @param options
537
+ * @returns {boolean}
538
+ */
539
+ isExtendedOptionsPassed(options)
540
+ {
541
+ if (typeof options !== "object")
542
+ {
543
+ return false;
544
+ }
545
+
546
+ return options.hasOwnProperty("context") || options.hasOwnProperty("target");
547
+ }
548
+
549
+ convertToContext(options, defaultContext)
550
+ {
551
+ defaultContext = defaultContext || this.generateDefaultContext();
552
+ options = options || defaultContext;
553
+ let context = options;
554
+ if (options.context && typeof options.context === "object")
555
+ {
556
+ const moreOptions = Object.assign({}, options);
557
+ delete moreOptions.context;
558
+ context = Object.assign({}, options.context, moreOptions);
559
+ }
560
+
561
+ context = Object.assign({}, defaultContext, context);
562
+ delete context.context;
563
+
564
+ return context
565
+ }
566
+
567
+ /**
568
+ * console.log with options set on the first parameter to dictate console log behaviours
569
+ * @param options
570
+ * @param args
571
+ */
572
+ log(options, ...args)
573
+ {
574
+ if (!this.isExtendedOptionsPassed(options))
575
+ {
576
+ const defaultContext = this.generateDefaultContext();
577
+ this.processOutput.apply(this, [defaultContext, options, ...args]);
578
+ return;
579
+ }
580
+
581
+ let context = this.convertToContext(options);
582
+
583
+ this.processOutput.apply(this, [context, ...args]);
584
+ }
585
+
586
+ error(options, ...args)
587
+ {
588
+ if (this.options.hideError)
589
+ {
590
+ return
591
+ }
592
+
593
+ const errorContext = this.generateErrorContext();
594
+ let context = this.convertToContext(options, errorContext);
595
+
596
+ let args0 = Array.prototype.slice.call(arguments);
597
+ this.log(context, ...args0);
598
+ }
599
+
600
+ overrideError()
601
+ {
602
+ if (!this.options.hideHookMessage)
603
+ {
604
+ this.realConsoleLog(`AnaLogger: Hook placed on console.error`);
605
+ }
606
+ console.error = this.onDisplayError.bind(this);
607
+ }
608
+
609
+ overrideConsole({log = true, info = true, warn = true, error = false} = {})
610
+ {
611
+ if (!this.options.hideHookMessage)
612
+ {
613
+ this.realConsoleLog(`AnaLogger: Hook placed on console.log`);
614
+ }
615
+
616
+ if (log)
617
+ {
618
+ console.log = this.onDisplayLog.bind(this);
619
+ }
620
+
621
+ if (info)
622
+ {
623
+ console.info = this.onDisplayLog.bind(this);
624
+ }
625
+
626
+ if (warn)
627
+ {
628
+ console.warn = this.onDisplayLog.bind(this);
629
+ }
630
+
631
+ if (error)
632
+ {
633
+ this.overrideError();
634
+ }
635
+ }
636
+
637
+ removeOverrideError()
638
+ {
639
+ console.warn = this.realConsoleError;
640
+ }
641
+
642
+ removeOverride({log = true, info = true, warn = true, error = false} = {})
643
+ {
644
+ if (log)
645
+ {
646
+ console.log = this.realConsoleLog;
647
+ }
648
+
649
+ if (info)
650
+ {
651
+ console.info = this.realConsoleInfo;
652
+ }
653
+
654
+ if (warn)
655
+ {
656
+ console.warn = this.realConsoleWarn;
657
+ }
658
+
659
+ if (error)
660
+ {
661
+ this.removeOverrideError();
662
+ }
663
+
664
+ }
665
+
666
+ info(...args)
667
+ {
668
+ return this.log(...args)
669
+ }
670
+
671
+ warn(...args)
672
+ {
673
+ return this.log(...args)
674
+ }
675
+
676
+ alert(...args)
677
+ {
678
+ if (this.isNode())
679
+ {
680
+ return this.log(...args)
681
+ }
682
+
683
+ const message = args.join(" | ");
684
+
685
+ alert(message);
686
+ }
687
+
688
+ assert(condition, expected = true, ...args)
689
+ {
690
+ let result;
691
+
692
+ try
693
+ {
694
+ if (typeof condition === 'function')
695
+ {
696
+ result = condition(...args);
697
+ if (result !== expected)
698
+ {
699
+ this.error(`Asset failed`);
700
+ return false
701
+ }
702
+
703
+ if (this.options.showPassingTests)
704
+ {
705
+ this.log(`SUCCESS: Assert passed`);
706
+ }
707
+ return true
708
+ }
709
+
710
+ if (condition !== expected)
711
+ {
712
+ this.error(`Assert failed`);
713
+ return false
714
+ }
715
+
716
+ if (this.options.showPassingTests)
717
+ {
718
+ this.log(`SUCCESS: Assert passed`);
719
+ }
720
+ return true
721
+ }
722
+ catch (e)
723
+ {
724
+ this.error(`Unexpected error in assert`);
725
+ }
726
+
727
+ return false;
728
+ }
729
+
730
+ }
731
+
732
+ const anaLogger = new AnaLogger();
733
+
734
+ export { anaLogger };
package/dist/index.css ADDED
@@ -0,0 +1,47 @@
1
+ .analogger {
2
+ background-color: #462210;
3
+ border: 4px solid #16122a;
4
+ box-shadow: 3px 4px 9px 0px rgba(0, 0, 0, 0.75);
5
+ height: 320px;
6
+ overflow: hidden;
7
+ margin: 1rem;
8
+ padding: 13px 0 0 0;
9
+ width: 80%;
10
+ max-height: 300px;
11
+ }
12
+ .analogger .analogger-view {
13
+ background-color: #0c0c0c;
14
+ box-sizing: border-box;
15
+ color: antiquewhite;
16
+ display: block;
17
+ font-family: sans-serif;
18
+ font-size: 12px;
19
+ line-height: 30px;
20
+ height: calc(100% - 20px);
21
+ margin: 20px 0 0 0;
22
+ padding: 12px;
23
+ overflow: auto;
24
+ position: relative;
25
+ width: 100%;
26
+ }
27
+ .analogger .analogger-view::-webkit-scrollbar-thumb {
28
+ border: 5px solid transparent;
29
+ border-radius: 100px;
30
+ background-color: #514b6e;
31
+ background-clip: content-box;
32
+ }
33
+ .analogger .analogger-view::-webkit-scrollbar {
34
+ width: 20px;
35
+ }
36
+ .analogger .analogger-view::-webkit-scrollbar-track {
37
+ background-color: #382525;
38
+ border-radius: 100px;
39
+ }
40
+ .analogger .analogger-view::-webkit-scrollbar-thumb {
41
+ border-radius: 100px;
42
+ border: 4px solid transparent;
43
+ background-clip: content-box;
44
+ background-color: #9f6c53;
45
+ }
46
+
47
+
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "analogger",
3
- "version": "1.5.1",
3
+ "version": "1.5.2",
4
4
  "description": "Js Logger",
5
5
  "main": "dist/index-cjs.min.cjs",
6
6
  "module": "dist/index-esm.min.mjs",
@@ -17,7 +17,7 @@
17
17
  "bundle:prod:cjs": "rollup --config rollup-cjs.config.js",
18
18
  "bundle:prod:esm": "rollup --config rollup-esm.config.js",
19
19
  "bundle:prod": "npm run convert-cjs:esm && npm run convert-cjs:browser && npm run bundle:prod:cjs && npm run bundle:prod:esm",
20
- "test": "npm run bundle:prod && nyc mocha --exit --sort",
20
+ "test": "npm run bundle:prod && nyc mocha --exit --sort --retries 2",
21
21
  "server:start": "http-server.cmd -c-1 -s -p 9880 ./ > log.log",
22
22
  "manual:check": "http-server.cmd -c-1 -p 9877 -o example/index.html ./ ",
23
23
  "manual:test": "concurrently --success first --kill-others \"npm run test\" \"npm run server:start\"",