analogger 1.15.3 → 1.17.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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ # [1.17.0](https://github.com/thimpat/analogger/compare/v1.16.0...v1.17.0) (2022-06-08)
2
+
3
+ # [1.16.0](https://github.com/thimpat/analogger/compare/v1.15.2...v1.16.0) (2022-06-07)
4
+
1
5
  ## [1.15.2](https://github.com/thimpat/analogger/compare/v1.15.1...v1.15.2) (2022-06-07)
2
6
 
3
7
  ## [1.15.1](https://github.com/thimpat/analogger/compare/v1.15.0...v1.15.1) (2022-06-06)
package/README.md CHANGED
@@ -40,7 +40,41 @@ import {anaLogger} from "analogger"
40
40
 
41
41
  ### In the Browser
42
42
 
43
+ ```html
44
+ <!DOCTYPE html>
45
+ <html lang="en">
46
+ <head>
47
+ <meta charset="UTF-8">
48
+ <title>Demo</title>
49
+
50
+ <!-- AnaLogger Theme -->
51
+ <link rel="stylesheet" href="../dist/analogger.min.css">
52
+
53
+ </head>
54
+ <body>
55
+
56
+ <div id="analogger" class="analogger">
57
+ </div>
58
+
59
+ <!-- AnaLogger Main -->
60
+ <script type="module">
61
+ import {anaLogger} from "../dist/analogger-browser.min.mjs";
62
+ anaLogger.applyPredefinedFormat();
63
+ anaLogger.setOptions({logToDom: "#analogger"});
64
+ anaLogger.log({lid: 100000}, "Test Log example C1");
65
+ </script>
66
+
67
+ </body>
68
+ </html>
69
+ ```
70
+
71
+ <br/>
72
+
73
+ ### In the Browser via a module bundler
74
+
43
75
  ```javascript
76
+ // Read your module bundler documentation to load a style file
77
+ import "./node_modules/analogger/dist/analogger.min.css"
44
78
  import {anaLogger} from "./node_modules/analogger/dist/analogger-browser.min.mjs";
45
79
  ```
46
80
 
@@ -579,3 +613,22 @@ to them), you can set a handler here. All other console.error will be working as
579
613
  anaLogger.error({target: LOG_TARGETS.USER}, "Salut user!"); // Display an alert box
580
614
  anaLogger.error("Hi user!"); // Log the message to the inspector
581
615
  ```
616
+
617
+ ## Multiple instances
618
+
619
+ It is possible to generate multiple AnaLogger instances, so they can point to different targets.
620
+
621
+ ### Example
622
+
623
+ ```javascript
624
+ const AnaLogger = require("analogger"); // or import AnaLogger from "analogger"
625
+ const anaLoggerInstance1 = new AnaLogger();
626
+ const anaLoggerInstance2 = new AnaLogger();
627
+
628
+ anaLoggerInstance1.setOptions({logToDom: ".analogger"});
629
+ anaLoggerInstance2.setOptions({logToFile: "./logme.log"});
630
+ ```
631
+
632
+ <br/>
633
+ <br/>
634
+
@@ -1,3 +1,3 @@
1
- var Ee=Object.defineProperty,we=Object.defineProperties;var xe=Object.getOwnPropertyDescriptors;var Q=Object.getOwnPropertySymbols;var Te=Object.prototype.hasOwnProperty,ye=Object.prototype.propertyIsEnumerable;var J=(s,e,t)=>e in s?Ee(s,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[e]=t,A=(s,e)=>{for(var t in e||(e={}))Te.call(e,t)&&J(s,t,e[t]);if(Q)for(var t of Q(e))ye.call(e,t)&&J(s,t,e[t]);return s},Z=(s,e)=>we(s,xe(e));var g=(s,e,t)=>(J(s,typeof e!="symbol"?e+"":e,t),t),ee=(s,e,t)=>{if(!e.has(s))throw TypeError("Cannot "+t)};var d=(s,e,t)=>(ee(s,e,"read from private field"),t?t.call(s):e.get(s)),F=(s,e,t)=>{if(e.has(s))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(s):e.set(s,t)};var te=(s,e,t)=>(ee(s,e,"access private method"),t);var re={Foreground:38,Background:48},_="\x1B[1D",se="\x1B[0m"+_,U={Bold:"\x1B[1m"+_,Underline:"\x1B[4m"+_,Reversed:"\x1B[7m"+_},Le={Bold:"\x1B[1m"+_,Underline:"\x1B[4m"+_,Reversed:"\x1B[7m"+_},z={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4","indianred ":"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};function Oe(s){return!!z[s]}var oe=(s,e,t)=>s===e&&e===t?s<8?16:s>248?231:Math.round((s-8)/247*24)+232:16+36*Math.round(s/255*5)+6*Math.round(e/255*5)+Math.round(t/255*5),ne=s=>{let e=/^#?([a-f\d])([a-f\d])([a-f\d])$/i;s=s.replace(e,function(r,o,n,i){return o+o+n+n+i+i});let t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(s);return t?{red:parseInt(t[1],16),blue:parseInt(t[2],16),green:parseInt(t[3],16)}:{}},ie=function({red:s,green:e,blue:t}){let r=s<<16|e<<8|t<<0;return"#"+(16777216+r).toString(16).slice(1)},ae=function(s){let e=s.matchAll(/\d+/g),t=[];for(let r of e){let o=parseInt(r[0]);if(o>255)return null;t.push(o)}return t.length!==3?null:{red:t[0],green:t[1],blue:t[2]}},_e=function(s){let e=ae(s);return e&&ie(e)},C=function(e,t,r){return r<0&&(r+=1),r>1&&(r-=1),r<1/6?e+(t-e)*6*r:r<1/2?t:r<2/3?e+(t-e)*(2/3-r)*6:e},le=({hue:s,saturation:e,lightness:t})=>{let r,o,n;if(e===0)r=o=n=t;else{let i=t<.5?t*(1+e):t+e-t*e,a=2*t-i;r=C(a,i,s+1/3),o=C(a,i,s),n=C(a,i,s-1/3)}return{red:Math.round(r*255),blue:Math.round(n*255),green:Math.round(o*255)}},fe=s=>{let e=s.toLowerCase();return typeof z[e]!="undefined"?z[e]:""};function D({red:s,blue:e,green:t},r=!0){if(s===void 0||e===void 0||t===void 0)return"";let o=oe(s,e,t);return`\x1B[${r?re.Foreground:re.Background};5;`+o+"m "+_}function M(s,e=!0){let{red:t,green:r,blue:o}=ne(s);return D({red:t,green:r,blue:o},e)}function P({hue:s,saturation:e,lightness:t},r){let{red:o,green:n,blue:i}=le({hue:s,saturation:e,lightness:t});return D({red:o,green:n,blue:i},r)}function X(s,e=!0){try{let t;return s=s||"",s?((typeof s=="string"||s instanceof String)&&(s=s.trim()),Oe(s)?(t=fe(s),M(t,e)):typeof s=="object"&&!!s.red&&!!s.blue&&!!s.green?D(s,e):typeof s=="object"&&!!s.hue&&!!s.saturation&&!!s.lightness?P(s,e):s.startsWith("#")?M(s,e):(s=s.toString(),/^[\da-fA-F]+$/.test(s)?M("#"+s,e):"")):""}catch(t){console.error("TO_ANSI_INVALID_ARGUMENT_ERROR",t.message)}}function $(s,{fg:e,bg:t,isUnderline:r=!1,isBold:o=!1,isReversed:n=!1}){let i=!1,a="";return e&&(i=!0,a=a+e),t&&(i=!0,a=a+t),r&&(i=!0,a=a+U.Underline),o&&(i=!0,a=a+U.Bold),n&&(i=!0,a=a+U.Reversed),i?a+s+se:s}function Re(s,{fg:e={},bg:t={},isUnderline:r=!1,isBold:o=!1,isReversed:n=!1}){return e&&(e=D(A({},e))),t&&(t=D(A({},t),!1)),$(s,{fg:e,bg:t,isUnderline:r,isBold:o,isReversed:n})}function Ae(s,{fg:e="",bg:t="",isUnderline:r=!1,isBold:o=!1,isReversed:n=!1}){return e&&(e=P(A({},e))),t&&(t=P(A({},t),!1)),$(s,{fg:e,bg:t,isUnderline:r,isBold:o,isReversed:n})}function Ne(s,{fg:e="",bg:t="",isUnderline:r=!1,isBold:o=!1,isReversed:n=!1}){return e&&(e=M(e)),t&&(t=M(t,!1)),$(s,{fg:e,bg:t,isUnderline:r,isBold:o,isReversed:n})}function Fe(s,e=null){if(!e)return s;let{fg:t="",bg:r="",isUnderline:o=!1,isBold:n=!1,isReversed:i=!1}=e;return t&&(t=X(t)),r&&(r=X(r,!1)),$(s,{fg:t,bg:r,isUnderline:o,isBold:n,isReversed:i})}var G={fromRgb:D,fromHexa:M,fromHsl:P,fromColor:X,getTextFromRgb:Re,getTextFromHsl:Ae,getTextFromHex:Ne,getTextFromColor:Fe,colorNameToHex:fe,hslToRgb:le,hexToRgb:ne,rgbToHex:ie,rgbToAnsi256:oe,rgbStringToRgb:ae,rgbStringToHex:_e,hue2rgb:C,RESET:se,FONT_STYLE:U,STYLE:Le};var ce={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"}},B=ce.COLOR_TABLE,I=ce.SYSTEM;var{parse:Ce,stringify:Me}=JSON,{keys:Pe}=Object,De=String,Se="string";var de="object",ve=(s,e)=>e;var he=(s,e,t)=>{let r=De(e.push(t)-1);return s.set(t,r),r};var ue=(s,e,t)=>{let r=e&&typeof e===de?(x,h)=>x===""||-1<e.indexOf(x)?h:void 0:e||ve,o=new Map,n=[],i=[],a=+he(o,n,r.call({"":s},"",s)),p=!a;for(;a<n.length;)p=!0,i[a]=Me(n[a++],R,t);return"["+i.join(",")+"]";function R(x,h){if(p)return p=!p,h;let T=r.call(this,x,h);switch(typeof T){case de:if(T===null)return T;case Se:return o.get(T)||he(o,n,T)}return T}};var W={};W={};var y={DEFAULT:"DEFAULT",ERROR:"ERROR"},ge={ANALOGGER:"ANALOGGER"},j=`
2
- `,q={airplane:"\u2708",anchor:"\u2693",arrow_backward:"\u25C0",arrow_double_up:"\u23EB",arrow_double_down:"\u23EC",arrow_forward:"\u25B6",arrow_lower_right:"\u2198",arrow_lower_left:"\u2199",arrow_right_hook:"\u21AA",arrow_up_down:"\u2195",arrow_upper_left:"\u2196",arrow_upper_right:"\u2197",ballot_box_with_check:"\u2611",biohazard:"\u2623",black_circle:"\u23FA",black_medium_small_square:"\u25FE",black_medium_square:"\u25FC",black_nib:"\u2712",black_small_square:"\u25AA",black_square:"\u23F9",chains:"\u26D3",check:"\u2714",chess_pawn:"\u265F",cloud_and_rain:"\u26C8",clubs:"\u2663",coffee:"\u2615",copyright:"\xA9",cross:"\u274C",diamonds:"\u2666",divisions_ign:"\u2797",double_triangle_right:"\u23ED",double_triangle_left:"\u23EE",email:"\u2709",eject:"\u23CF",exclamation_mark:"\u2757",fast_forward:"\u23E9",female_sign:"\u2640",fist:"\u270A",fuel_pump:"\u26FD",gear:"\u2699",hammer_and_pick:"\u2692",hand:"\u270B",hearts:"\u2665",infinity:"\u267E",information:"\u2139",left_right_arrow:"\u2194",leftwards_arrow_with_hook:"\u21A9",male_sign:"\u2642",minus_sign:"\u2796",no_entry:"\u26D4",partly_sunny:"\u26C5",pencil:"\u270F",phone:"\u260E",plus_sign:"\u2795",question:"\u2754",radioactive:"\u2622",raised_hand:"\u270B",recycle:"\u267B",registered:"\xAE",relaxed:"\u263A",rewind:"\u23EA",scissors:"\u2702",snowman:"\u2603",spades:"\u2660",sparkles:"\u2728",star:"\u2B50",sunny:"\u2600",tent:"\u26FA",trademark:"\u2122",triangle_with_vertical_bar:"\u23EF",umbrella:"\u2614",vertical_bars:"\u23F8",watch:"\u231A",white_frowning_face:"\u2639",white_medium_square:"\u25FB",white_medium_small_square:"\u25FD",white_small_square:"\u25AB",wheelchair:"\u267F",white_circle:"\u26AA",writing_hand:"\u270D"},w,S,v,k,Y,pe,m=class{constructor(){F(this,Y);g(this,"system","");g(this,"logIndex",0);g(this,"logCounter",0);g(this,"contexts",[]);g(this,"targets",{});g(this,"activeTarget",null);g(this,"indexColor",0);g(this,"format","");g(this,"keepLog",!1);g(this,"logHistory",[]);g(this,"$containers",null);g(this,"options",{hideHookMessage:!1});F(this,w,console.log);F(this,S,console.info);F(this,v,console.warn);F(this,k,console.error);g(this,"isBrowser0",null);g(this,"originalFormatFunction");if(m.Instance)return m.Instance;m.Instance=this,this.system=typeof process=="object"?I.NODE:I.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.rawLog=d(this,w),this.rawInfo=d(this,S),this.rawWarn=d(this,v),this.rawError=d(this,k),console.rawLog=d(this,w),console.rawInfo=d(this,S),console.rawWarn=d(this,v),console.rawError=d(this,k),console.table=this.table,console.buildTable=this.buildTable,console.isNode=this.isNode,console.isBrowser=this.isBrowser,console.truncateMessage=this.truncateMessage,console.rawLog=this.rawLog,console.rawInfo=this.rawInfo,console.rawWarn=this.rawWarn,console.rawError=this.rawError,console.isBrowser0=this.system===I.BROWSER,this.ALIGN=m.ALIGN,this.ENVIRONMENT_TYPE=m.ENVIRONMENT_TYPE}keepLogHistory(){this.keepLog=!0}releaseLogHistory(){this.keepLog=!1}resetLogHistory(){this.logHistory=[]}getLogHistory(e=!0,t=j){let r=JSON.parse(JSON.stringify(this.logHistory.slice(0)));return e?r.join(t):r}isNode(){return this.system===I.NODE}isBrowser(){return!this.isNode()}resetLogger(){this.options={},this.options.timeLenMax=10,this.options.contextLenMax=10,this.options.idLenMax=5,this.options.lidLenMax=6,this.options.messageLenMax=void 0,this.options.symbolLenMax=60,this.options.hideHookMessage=void 0,this.options.hidePassingTests=void 0,this.options.hideLog=void 0,this.options.hideError=void 0,this.options.oneConsolePerContext=!0,this.options.logToDom=void 0,this.options.logToFile=void 0,this.options.logToDomlogToFile=void 0,this.options.silent=!1}resetOptions(){this.resetLogger()}setOptions({contextLenMax:e=10,idLenMax:t=5,lidLenMax:r=6,symbolLenMax:o=2,messageLenMax:n=void 0,hideLog:i=void 0,hideError:a=void 0,hideHookMessage:p=void 0,hidePassingTests:R=void 0,logToDom:x=void 0,logToFile:h=void 0,oneConsolePerContext:T=void 0,silent:L=void 0}=null){this.options.contextLenMax=e,this.options.idLenMax=t,this.options.lidLenMax=r,this.options.messageLenMax=n,this.options.symbolLenMax=o,R!==void 0&&(this.options.hidePassingTests=!!R),p!==void 0&&(this.options.hideHookMessage=!!p),i!==void 0&&(this.options.hideLog=!!i),a!==void 0&&(this.options.hideError=!!a),T!==void 0&&(this.options.oneConsolePerContext=!!T),x!==void 0&&(this.options.logToDom=x||"#analogger"),h===!1?this.options.logToFile=!1:h!==void 0&&(this.isBrowser()||(this.options.logToFile=h||"./analogger.log"),d(this,w).call(this,"LogToFile is not supported in this environment. ")),L!==void 0&&(this.options.silent=!!L,this.options.hideLog=this.options.silent)}getOptions(){return this.options}truncateMessage(e="",{fit:t=0,align:r=m.ALIGN.LEFT,ellipsis:o="..."}={}){return e=""+e,t&&e.length>t&&(e=e.substring(0,t-o.length)+o),e=r===m.ALIGN.LEFT?e.padEnd(t," "):e.padStart(t," "),e}buildTable(e,{ellipsis:t="...",ColumnMinChars:r=6,columnMaxChars:o=0,verticalSeparator:n=" \u2502 ",horizontalSeparator:i="\u2500",availableLength:a=0,onCompleteHeaders:p=null,onCompleteSeparators:R=null,onCompleteLines:x=null}={}){let h="";if(Array.isArray(e)||(e=Object.values(Object.values(e))),!e||!e.length)return"";let L=e.map(l=>Object.assign({},l)),me=L[0],b=Object.keys(me);L.unshift(b),i=i.repeat(100);let u={};for(let l=1;l<L.length;++l){let f=L[l];for(let E=0;E<b.length;++E){let O=b[E],V=f[O];u[O]=u[O]||0;let N;try{N=JSON.stringify(V).length}catch(Be){}N=N||r,u[O]=Math.max(u[O],N,O.length)}}this.isBrowser0||(W=W||{},a||(a=W.width||process.stdout.columns||120-n.length-1-5)),a=a-4;let K=Object.values(u).reduce((l,f)=>l+f,0);if(a<K){let l=a/K;for(let f in u)u[f]=Math.floor(u[f]*l)-1,r&&u[f]<r&&(u[f]=r),o&&u[f]>o&&(u[f]=o),u[f]=u[f]}let c;c="";for(let l=0;l<b.length;++l){let f=b[l],E=u[f];c+=this.truncateMessage(f,{fit:E,ellipsis:t}),c+=n}p&&(c=p(c,b)),h+=this.truncateMessage(c,{fit:a}),h+=j,c="";let be=i;for(let l=0;l<b.length;++l){let f=b[l],E=u[f];c+=this.truncateMessage(be,{fit:E,ellipsis:""}),c+=n}R&&(c=R(c,b)),h+=this.truncateMessage(c,{fit:a}),h+=j;for(let l=1;l<L.length;++l){c="";let f=L[l];for(let E=0;E<b.length;++E){let O=b[E],V=f[O],N=u[O];c+=this.truncateMessage(V,{fit:N,ellipsis:t}),c+=n}x&&(c=x(c,f)),h+=this.truncateMessage(c,{fit:a}),h+=j}return this.rawLog(h),h}onBuildLog({contextName:e,message:t="",lid:r="",symbol:o=""}={}){let n=new Date,i=("0"+n.getHours()).slice(-2)+":"+("0"+n.getMinutes()).slice(-2)+":"+("0"+n.getSeconds()).slice(-2);return i=this.truncateMessage(i,{fit:this.options.timeLenMax}),e=this.truncateMessage(e,{fit:this.options.contextLenMax,align:m.ALIGN.RIGHT}),r=this.truncateMessage(r,{fit:this.options.lidLenMax}),this.options.messageLenMax!==void 0&&(t=this.truncateMessage(t,{fit:this.options.messageLenMax})),o=this.truncateMessage(o,{fit:this.options.symbolLenMax}),`[${i}] ${e}: (${r}) ${o} ${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(typeof e!="function")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 typeof e=="object"&&!Array.isArray(e)&&e!==null?e.hasOwnProperty("contextName")&&e.hasOwnProperty("target"):!1}setContext(e,t){this.contexts[e]=t}setDefaultContext(e){this.setContext(y.DEFAULT,e)}generateDefaultContext(){let e=this.contexts[y.DEFAULT]||{};return e=Object.assign({},{name:y.DEFAULT,contextName:y.DEFAULT,target:"ALL",symbol:"\u26A1",color:B[1]},e),e.id=this.logIndex++,e}generateNewContext(){let e=this.generateDefaultContext();return e.color=B[this.indexColor++%(B.length-3)+2],e.symbol="",e}generateErrorContext(){let e=this.generateDefaultContext();return e.name=y.ERROR,e.contextName=y.ERROR,e.color=B[0],e.symbol="\u274C",e.error=!0,e}setContexts(e){let t=Object.keys(e);e[y.DEFAULT]=this.contexts[y.DEFAULT]=this.generateDefaultContext(),e[y.ERROR]=this.contexts[y.ERROR]=this.generateErrorContext(),t.forEach(r=>{let o=e[r]||{};o.contextName=r,o.name=r,this.contexts[r]=te(this,Y,pe).call(this,o),e[r]=this.contexts[r]})}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?!0:this.activeTarget===e}setColumns(e,t,r){let o=0;for(let i in t){if(i==="name")continue;let a=t[i],p=document.createElement("span");p.classList.add("analogger-col",`analogger-col-${i}`,`analogger-col-${o}`),++o,p.textContent=a,e.append(p)}let n=document.createElement("span");n.classList.add("analogger-col","analogger-col-text",`analogger-col-${o}`),n.textContent=r,e.append(n)}writeLogToDom(e,t){this.$containers=this.$containers||document.querySelectorAll(this.options.logToDom);for(let r=0;r<this.$containers.length;++r){let o=this.$containers[r],n=o.querySelector(".analogger-view");n||(n=document.createElement("div"),n.classList.add("analogger-view"),o.append(n));let i=document.createElement("div");i.classList.add("to-esm-line"),i.style.color=e.color,i.setAttribute("data-log-counter",this.logCounter),i.setAttribute("data-log-index",this.logIndex),this.setColumns(i,e,t),n.append(i)}}writeLogToFile(e){try{fs.appendFileSync(this.options.logToFilePath,e+this.EOL)}catch(t){console.rawError("LOG_TO_FILE_FAILURE: ",t.message)}}convertArgumentsToText(e){let t=[],r,o=e.length;for(let n=0;n<o;++n){let i,a=e[n];try{i=JSON.stringify(a)}catch(p){}if(!i)try{i=ue(a)}catch(p){}t.push(i)}return r=t.join("\u2022"),r}processOutput(e={}){try{let t="";if(!this.isTargetAllowed(e.target))return;let r=Array.prototype.slice.call(arguments);r.shift(),t=this.convertArgumentsToText(r);let o="",n="";if(n=this.format(Z(A({},e),{message:t})),++this.logCounter,this.isBrowser()?(e.environnment=m.ENVIRONMENT_TYPE.BROWSER,this.options.logToDom&&this.writeLogToDom(e,n),o=`%c${n}`):(e.environnment=m.ENVIRONMENT_TYPE.NODE,o=G.getTextFromColor(n,{fg:e.color,bg:e.bgColor,isBold:e.bold,isUnderline:e.underline,isReversed:e.reversed}),this.options.logToFile&&this.writeLogToFile(n)),this.keepLog&&this.logHistory.push(o),this.options.hideLog)return;this.isBrowser()?d(this,w).call(this,o,`color: ${e.color}`):d(this,w).call(this,o),this.errorTargetHandler(e,r)}catch(t){console.error("AnaLogger:",t.message)}}isExtendedOptionsPassed(e){return typeof e!="object"?!1:e.hasOwnProperty("context")||e.hasOwnProperty("target")||e.hasOwnProperty("color")||e.hasOwnProperty("contextName")||e.hasOwnProperty("lid")}listSymbols(){for(let e in q)console.rawLog(q[e]+` ${e} `)}applySymbolByName(e){try{e.symbol&&q[e.symbol]&&(e.symbol=q[e.symbol])}catch(t){}}convertToContext(e,t){t=t||this.generateDefaultContext(),e=e||t;let r=e;if(e.context&&typeof e.context=="object"){let o=Object.assign({},e);delete o.context,r=Object.assign({},e.context,o)}return r=Object.assign({},t,r),delete r.context,this.applySymbolByName(r),r}log(e,...t){if(!this.isExtendedOptionsPassed(e)){let o=this.generateDefaultContext();this.processOutput.apply(this,[o,e,...t]);return}let r=this.convertToContext(e);this.processOutput.apply(this,[r,...t])}error(e,...t){if(this.options.hideError)return;if(!this.isExtendedOptionsPassed(e)){let i=this.generateErrorContext();this.processOutput.apply(this,[i,e,...t]);return}let r=this.generateErrorContext(),o=this.convertToContext(e,r),n=Array.prototype.slice.call(arguments,1);this.log(o,...n)}overrideError(){this.options.hideHookMessage||d(this,w).call(this,"AnaLogger: Hook placed on console.error"),console.error=this.onDisplayError.bind(this)}overrideConsole({log:e=!0,info:t=!0,warn:r=!0,error:o=!1}={}){this.options.hideHookMessage||d(this,w).call(this,"AnaLogger: Hook placed on console.log"),e&&(console.log=this.onDisplayLog.bind(this)),t&&(console.info=this.onDisplayLog.bind(this)),r&&(console.warn=this.onDisplayLog.bind(this)),o&&this.overrideError()}removeOverrideError(){console.warn=d(this,k)}removeOverride({log:e=!0,info:t=!0,warn:r=!0,error:o=!1}={}){e&&(console.log=d(this,w)),t&&(console.info=d(this,S)),r&&(console.warn=d(this,v)),o&&this.removeOverrideError()}info(...e){return this.log(...e)}warn(...e){return this.log(...e)}table(...e){return this.buildTable(...e)}alert(...e){if(this.isNode())return this.log(...e);let t=e.join(" | ");alert(t)}assert(e,t=!0,...r){let o;try{return typeof e=="function"?(o=e(...r),o!==t?(this.error("Asset failed"),!1):(this.options.hidePassingTests||this.log("SUCCESS: Assert passed"),!0)):e!==t?(this.error("Assert failed"),!1):(this.options.hidePassingTests||this.log("SUCCESS: Assert passed"),!0)}catch(n){this.error("Unexpected error in assert")}return!1}applyAnalogFormatting({activeTarget:e="",override:t=!1}={}){try{let n={STANDARD:null,TEST:{color:"#B18904",symbol:"diamonds"},C1:null,C2:null,C3:null,DEFAULT:{}},i={ALL:"ALL",DEBUG:"DEBUG",DEV:process.env.DEVELOPER,DEV1:process.env.DEVELOPER,USER:"USER"};return this.setDefaultContext(n.DEFAULT),this.setTargets(i),e&&this.setActiveTarget(e),this.setOptions({silent:!1,hideError:!1,hideHookMessage:!0,lidLenMax:4}),t&&(this.overrideConsole(),this.overrideError()),!0}catch(r){console.error({lid:3249},r.message)}return!1}applyPredefinedFormat(e=ge.ANALOGGER,{activeTarget:t="",override:r=!1}={}){if(e===ge.ANALOGGER)return this.applyAnalogFormatting({activeTarget:t,override:r})}},H=m;w=new WeakMap,S=new WeakMap,v=new WeakMap,k=new WeakMap,Y=new WeakSet,pe=function(e){let t=e,r=this.generateNewContext();return t=Object.assign({},r,t),t.color.toLowerCase().indexOf("rgb")>-1?t.color=G.rgbStringToHex(t.color):t.color.indexOf("#")===-1&&(t.color=G.colorNameToHex(t.color)),t},g(H,"ALIGN",{LEFT:"LEFT",RIGHT:"RIGHT"}),g(H,"ENVIRONMENT_TYPE",{BROWSER:"BROWSER",NODE:"NODE",OTHER:"OTHER"});var ke=new H,We=ke;export{ge as PREDEFINED_FORMATS,ke as anaLogger,We as default};
1
+ var Ae=Object.defineProperty,we=Object.defineProperties;var _e=Object.getOwnPropertyDescriptors;var se=Object.getOwnPropertySymbols;var Re=Object.prototype.hasOwnProperty,Ne=Object.prototype.propertyIsEnumerable;var X=(s,e,t)=>e in s?Ae(s,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[e]=t,R=(s,e)=>{for(var t in e||(e={}))Re.call(e,t)&&X(s,t,e[t]);if(se)for(var t of se(e))Ne.call(e,t)&&X(s,t,e[t]);return s},oe=(s,e)=>we(s,_e(e));var h=(s,e,t)=>(X(s,typeof e!="symbol"?e+"":e,t),t),ne=(s,e,t)=>{if(!e.has(s))throw TypeError("Cannot "+t)};var g=(s,e,t)=>(ne(s,e,"read from private field"),t?t.call(s):e.get(s)),D=(s,e,t)=>{if(e.has(s))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(s):e.set(s,t)};var ie=(s,e,t)=>(ne(s,e,"access private method"),t);var ae={Foreground:38,Background:48},_="\x1B[1D",le="\x1B[0m"+_,k={Bold:"\x1B[1m"+_,Underline:"\x1B[4m"+_,Reversed:"\x1B[7m"+_},De={Bold:"\x1B[1m"+_,Underline:"\x1B[4m"+_,Reversed:"\x1B[7m"+_},z={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4","indianred ":"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};function Me(s){return!!z[s]}var fe=(s,e,t)=>s===e&&e===t?s<8?16:s>248?231:Math.round((s-8)/247*24)+232:16+36*Math.round(s/255*5)+6*Math.round(e/255*5)+Math.round(t/255*5),ce=s=>{let e=/^#?([a-f\d])([a-f\d])([a-f\d])$/i;s=s.replace(e,function(r,o,n,i){return o+o+n+n+i+i});let t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(s);return t?{red:parseInt(t[1],16),blue:parseInt(t[2],16),green:parseInt(t[3],16)}:{}},de=function({red:s,green:e,blue:t}){let r=s<<16|e<<8|t<<0;return"#"+(16777216+r).toString(16).slice(1)},he=function(s){let e=s.matchAll(/\d+/g),t=[];for(let r of e){let o=parseInt(r[0]);if(o>255)return null;t.push(o)}return t.length!==3?null:{red:t[0],green:t[1],blue:t[2]}},Fe=function(s){let e=he(s);return e&&de(e)},U=function(e,t,r){return r<0&&(r+=1),r>1&&(r-=1),r<1/6?e+(t-e)*6*r:r<1/2?t:r<2/3?e+(t-e)*(2/3-r)*6:e},ue=({hue:s,saturation:e,lightness:t})=>{let r,o,n;if(e===0)r=o=n=t;else{let i=t<.5?t*(1+e):t+e-t*e,a=2*t-i;r=U(a,i,s+1/3),o=U(a,i,s),n=U(a,i,s-1/3)}return{red:Math.round(r*255),blue:Math.round(n*255),green:Math.round(o*255)}},ge=s=>{let e=s.toLowerCase();return typeof z[e]!="undefined"?z[e]:""};function F({red:s,blue:e,green:t},r=!0){if(s===void 0||e===void 0||t===void 0)return"";let o=fe(s,e,t);return`\x1B[${r?ae.Foreground:ae.Background};5;`+o+"m "+_}function M(s,e=!0){let{red:t,green:r,blue:o}=ce(s);return F({red:t,green:r,blue:o},e)}function P({hue:s,saturation:e,lightness:t},r){let{red:o,green:n,blue:i}=ue({hue:s,saturation:e,lightness:t});return F({red:o,green:n,blue:i},r)}function K(s,e=!0){try{let t;return s=s||"",s?((typeof s=="string"||s instanceof String)&&(s=s.trim()),Me(s)?(t=ge(s),M(t,e)):typeof s=="object"&&!!s.red&&!!s.blue&&!!s.green?F(s,e):typeof s=="object"&&!!s.hue&&!!s.saturation&&!!s.lightness?P(s,e):s.startsWith("#")?M(s,e):(s=s.toString(),/^[\da-fA-F]+$/.test(s)?M("#"+s,e):"")):""}catch(t){console.error("TO_ANSI_INVALID_ARGUMENT_ERROR",t.message)}}function G(s,{fg:e,bg:t,isUnderline:r=!1,isBold:o=!1,isReversed:n=!1}){let i=!1,a="";return e&&(i=!0,a=a+e),t&&(i=!0,a=a+t),r&&(i=!0,a=a+k.Underline),o&&(i=!0,a=a+k.Bold),n&&(i=!0,a=a+k.Reversed),i?a+s+le:s}function Se(s,{fg:e={},bg:t={},isUnderline:r=!1,isBold:o=!1,isReversed:n=!1}){return e&&(e=F(R({},e))),t&&(t=F(R({},t),!1)),G(s,{fg:e,bg:t,isUnderline:r,isBold:o,isReversed:n})}function Be(s,{fg:e="",bg:t="",isUnderline:r=!1,isBold:o=!1,isReversed:n=!1}){return e&&(e=P(R({},e))),t&&(t=P(R({},t),!1)),G(s,{fg:e,bg:t,isUnderline:r,isBold:o,isReversed:n})}function Ce(s,{fg:e="",bg:t="",isUnderline:r=!1,isBold:o=!1,isReversed:n=!1}){return e&&(e=M(e)),t&&(t=M(t,!1)),G(s,{fg:e,bg:t,isUnderline:r,isBold:o,isReversed:n})}function ve(s,e=null){if(!e)return s;let{fg:t="",bg:r="",isUnderline:o=!1,isBold:n=!1,isReversed:i=!1}=e;return t&&(t=K(t)),r&&(r=K(r,!1)),G(s,{fg:t,bg:r,isUnderline:o,isBold:n,isReversed:i})}var j={fromRgb:F,fromHexa:M,fromHsl:P,fromColor:K,getTextFromRgb:Se,getTextFromHsl:Be,getTextFromHex:Ce,getTextFromColor:ve,colorNameToHex:ge,hslToRgb:ue,hexToRgb:ce,rgbToHex:de,rgbToAnsi256:fe,rgbStringToRgb:he,rgbStringToHex:Fe,hue2rgb:U,RESET:le,FONT_STYLE:k,STYLE:De};var me={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"}},H=me.COLOR_TABLE,I=me.SYSTEM,Q=2e3,Z="analogger-removed-notif",ee="analogger-view",pe="to-esm-line",q={TOP:"TOP",BOTTOM:"BOTTOM"},Ee="ANALOGGER",te={DEFAULT_FORMAT:"FORMAT1"};var{parse:Ye,stringify:He}=JSON,{keys:We}=Object,Ie=String,ke="string";var be="object",Ue=(s,e)=>e;var Te=(s,e,t)=>{let r=Ie(e.push(t)-1);return s.set(t,r),r};var Le=(s,e,t)=>{let r=e&&typeof e===be?(p,d)=>p===""||-1<e.indexOf(p)?d:void 0:e||Ue,o=new Map,n=[],i=[],a=+Te(o,n,r.call({"":s},"",s)),l=!a;for(;a<n.length;)l=!0,i[a]=He(n[a++],x,t);return"["+i.join(",")+"]";function x(p,d){if(l)return l=!l,d;let E=r.call(this,p,d);switch(typeof E){case be:if(E===null)return E;case ke:return o.get(E)||Te(o,n,E)}return E}};var W={};W={};var O={DEFAULT:"DEFAULT",ERROR:"ERROR"},V=`
2
+ `,Y={airplane:"\u2708",anchor:"\u2693",arrow_backward:"\u25C0",arrow_double_up:"\u23EB",arrow_double_down:"\u23EC",arrow_forward:"\u25B6",arrow_lower_right:"\u2198",arrow_lower_left:"\u2199",arrow_right_hook:"\u21AA",arrow_up_down:"\u2195",arrow_upper_left:"\u2196",arrow_upper_right:"\u2197",ballot_box_with_check:"\u2611",biohazard:"\u2623",black_circle:"\u23FA",black_medium_small_square:"\u25FE",black_medium_square:"\u25FC",black_nib:"\u2712",black_small_square:"\u25AA",black_square:"\u23F9",chains:"\u26D3",check:"\u2714",chess_pawn:"\u265F",cloud_and_rain:"\u26C8",clubs:"\u2663",coffee:"\u2615",copyright:"\xA9",cross:"\u274C",diamonds:"\u2666",divisions_ign:"\u2797",double_triangle_right:"\u23ED",double_triangle_left:"\u23EE",email:"\u2709",eject:"\u23CF",exclamation_mark:"\u2757",fast_forward:"\u23E9",female_sign:"\u2640",fist:"\u270A",fuel_pump:"\u26FD",gear:"\u2699",hammer_and_pick:"\u2692",hand:"\u270B",hearts:"\u2665",infinity:"\u267E",information:"\u2139",left_right_arrow:"\u2194",leftwards_arrow_with_hook:"\u21A9",male_sign:"\u2642",minus_sign:"\u2796",no_entry:"\u26D4",partly_sunny:"\u26C5",pencil:"\u270F",phone:"\u260E",plus_sign:"\u2795",question:"\u2754",radioactive:"\u2622",raised_hand:"\u270B",recycle:"\u267B",registered:"\xAE",relaxed:"\u263A",rewind:"\u23EA",scissors:"\u2702",snowman:"\u2603",spades:"\u2660",sparkles:"\u2728",star:"\u2B50",sunny:"\u2600",tent:"\u26FA",trademark:"\u2122",triangle_with_vertical_bar:"\u23EF",umbrella:"\u2614",vertical_bars:"\u23F8",watch:"\u231A",white_frowning_face:"\u2639",white_medium_square:"\u25FB",white_medium_small_square:"\u25FD",white_small_square:"\u25AB",wheelchair:"\u267F",white_circle:"\u26AA",writing_hand:"\u270D"},L,B,C,v,$,Oe,w=class{constructor(){D(this,$);h(this,"system","");h(this,"logIndex",0);h(this,"logCounter",0);h(this,"contexts",[]);h(this,"targets",{});h(this,"activeTarget",null);h(this,"indexColor",0);h(this,"format","");h(this,"keepLog",!1);h(this,"logHistory",[]);h(this,"$containers",null);h(this,"options",{hideHookMessage:!1});D(this,L,console.log);D(this,B,console.info);D(this,C,console.warn);D(this,v,console.error);h(this,"isBrowser0",null);h(this,"originalFormatFunction");h(this,"removeDomOldEntries",e=>{if(e.childElementCount>Q){let r=Math.ceil(Q/10);for(let o=0;o<r;++o)e.removeChild(e.firstChild);return r}return 0});h(this,"scrollDivToBottom",e=>{let t=e.scrollHeight-(e.clientHeight+e.scrollTop),r=e.clientHeight||e.offsetHeight;t>r/2||(e.scrollTop=e.scrollHeight)});this.system=typeof process=="object"?I.NODE:I.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.rawLog=g(this,L),this.rawInfo=g(this,B),this.rawWarn=g(this,C),this.rawError=g(this,v),console.rawLog=g(this,L),console.rawInfo=g(this,B),console.rawWarn=g(this,C),console.rawError=g(this,v),console.table=this.table,console.buildTable=this.buildTable,console.isNode=this.isNode,console.isBrowser=this.isBrowser,console.truncateMessage=this.truncateMessage,console.rawLog=this.rawLog,console.rawInfo=this.rawInfo,console.rawWarn=this.rawWarn,console.rawError=this.rawError,console.isBrowser0=this.system===I.BROWSER,this.ALIGN=w.ALIGN,this.ENVIRONMENT_TYPE=w.ENVIRONMENT_TYPE}keepLogHistory(){this.keepLog=!0}releaseLogHistory(){this.keepLog=!1}resetLogHistory(){this.logHistory=[]}getLogHistory(e=!0,t=V){let r=JSON.parse(JSON.stringify(this.logHistory.slice(0)));return e?r.join(t):r}isNode(){return this.system===I.NODE}isBrowser(){return!this.isNode()}resetLogger(){this.options={},this.options.timeLenMax=10,this.options.contextLenMax=10,this.options.idLenMax=5,this.options.lidLenMax=6,this.options.messageLenMax=void 0,this.options.symbolLenMax=60,this.options.hideHookMessage=void 0,this.options.hidePassingTests=void 0,this.options.hideLog=void 0,this.options.hideError=void 0,this.options.oneConsolePerContext=!0,this.options.logToDom=void 0,this.options.logToFile=void 0,this.options.logToDomlogToFile=void 0,this.options.silent=!1}resetOptions(){this.resetLogger()}setOptions({contextLenMax:e=10,idLenMax:t=5,lidLenMax:r=6,symbolLenMax:o=2,messageLenMax:n=void 0,hideLog:i=void 0,hideError:a=void 0,hideHookMessage:l=void 0,hidePassingTests:x=void 0,logToDom:p=void 0,logToFile:d=void 0,oneConsolePerContext:E=void 0,silent:y=void 0}=null){this.options.contextLenMax=e,this.options.idLenMax=t,this.options.lidLenMax=r,this.options.messageLenMax=n,this.options.symbolLenMax=o,x!==void 0&&(this.options.hidePassingTests=!!x),l!==void 0&&(this.options.hideHookMessage=!!l),i!==void 0&&(this.options.hideLog=!!i),a!==void 0&&(this.options.hideError=!!a),E!==void 0&&(this.options.oneConsolePerContext=!!E),p!==void 0&&(this.options.logToDom=p||"#analogger"),d===!1?this.options.logToFile=!1:d!==void 0&&(this.isBrowser()||(this.options.logToFile=d||"./analogger.log"),g(this,L).call(this,"LogToFile is not supported in this environment. ")),y!==void 0&&(this.options.silent=!!y,this.options.hideLog=this.options.silent)}getOptions(){return this.options}truncateMessage(e="",{fit:t=0,align:r=w.ALIGN.LEFT,ellipsis:o="..."}={}){return e=""+e,t&&e.length>t&&(e=e.substring(0,t-o.length)+o),e=r===w.ALIGN.LEFT?e.padEnd(t," "):e.padStart(t," "),e}buildTable(e,{ellipsis:t="...",ColumnMinChars:r=6,columnMaxChars:o=0,verticalSeparator:n=" \u2502 ",horizontalSeparator:i="\u2500",availableLength:a=0,onCompleteHeaders:l=null,onCompleteSeparators:x=null,onCompleteLines:p=null}={}){let d="";if(Array.isArray(e)||(e=Object.values(Object.values(e))),!e||!e.length)return"";let y=e.map(f=>Object.assign({},f)),xe=y[0],b=Object.keys(xe);y.unshift(b),i=i.repeat(100);let m={};for(let f=1;f<y.length;++f){let c=y[f];for(let T=0;T<b.length;++T){let A=b[T],J=c[A];m[A]=m[A]||0;let N;try{N=JSON.stringify(J).length}catch(Ge){}N=N||r,m[A]=Math.max(m[A],N,A.length)}}this.isBrowser0||(W=W||{},a||(a=W.width||process.stdout.columns||120-n.length-1-5)),a=a-4;let re=Object.values(m).reduce((f,c)=>f+c,0);if(a<re){let f=a/re;for(let c in m)m[c]=Math.floor(m[c]*f)-1,r&&m[c]<r&&(m[c]=r),o&&m[c]>o&&(m[c]=o),m[c]=m[c]}let u;u="";for(let f=0;f<b.length;++f){let c=b[f],T=m[c];u+=this.truncateMessage(c,{fit:T,ellipsis:t}),u+=n}l&&(u=l(u,b)),d+=this.truncateMessage(u,{fit:a}),d+=V,u="";let ye=i;for(let f=0;f<b.length;++f){let c=b[f],T=m[c];u+=this.truncateMessage(ye,{fit:T,ellipsis:""}),u+=n}x&&(u=x(u,b)),d+=this.truncateMessage(u,{fit:a}),d+=V;for(let f=1;f<y.length;++f){u="";let c=y[f];for(let T=0;T<b.length;++T){let A=b[T],J=c[A],N=m[A];u+=this.truncateMessage(J,{fit:N,ellipsis:t}),u+=n}p&&(u=p(u,c)),d+=this.truncateMessage(u,{fit:a}),d+=V}return this.rawLog(d),d}onBuildLog({contextName:e,message:t="",lid:r="",symbol:o=""}={}){let n=new Date,i=("0"+n.getHours()).slice(-2)+":"+("0"+n.getMinutes()).slice(-2)+":"+("0"+n.getSeconds()).slice(-2);return i=this.truncateMessage(i,{fit:this.options.timeLenMax}),e=this.truncateMessage(e,{fit:this.options.contextLenMax,align:w.ALIGN.RIGHT}),r=this.truncateMessage(r,{fit:this.options.lidLenMax}),this.options.messageLenMax!==void 0&&(t=this.truncateMessage(t,{fit:this.options.messageLenMax})),o=this.truncateMessage(o,{fit:this.options.symbolLenMax}),`[${i}] ${e}: (${r}) ${o} ${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(typeof e!="function")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 typeof e=="object"&&!Array.isArray(e)&&e!==null?e.hasOwnProperty("contextName")&&e.hasOwnProperty("target"):!1}setContext(e,t){this.contexts[e]=t}setDefaultContext(e){this.setContext(O.DEFAULT,e)}generateDefaultContext(){let e=this.contexts[O.DEFAULT]||{};return e=Object.assign({},{name:O.DEFAULT,contextName:O.DEFAULT,target:"ALL",symbol:"\u26A1",color:H[1]},e),e.id=this.logIndex++,e}generateNewContext(){let e=this.generateDefaultContext();return e.color=H[this.indexColor++%(H.length-3)+2],e.symbol="",e}generateErrorContext(){let e=this.generateDefaultContext();return e.name=O.ERROR,e.contextName=O.ERROR,e.color=H[0],e.symbol="\u274C",e.error=!0,e}setContexts(e){let t=Object.keys(e);e[O.DEFAULT]=this.contexts[O.DEFAULT]=this.generateDefaultContext(),e[O.ERROR]=this.contexts[O.ERROR]=this.generateErrorContext(),t.forEach(r=>{let o=e[r]||{};o.contextName=r,o.name=r,this.contexts[r]=ie(this,$,Oe).call(this,o),e[r]=this.contexts[r]})}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?!0:this.activeTarget===e}setColumns(e,t,r){let o=0;for(let i in t){if(!["contextName","symbol","lid","text"].includes(i))continue;let a=t[i],l=document.createElement("span");l.classList.add("analogger-col",`analogger-col-${i}`,`analogger-col-${o}`),++o,l.textContent=a,e.append(l)}let n=document.createElement("span");n.classList.add("analogger-col","analogger-col-text",`analogger-col-${o}`),n.textContent=r,e.append(n)}addLineToDom(e,t,{context:r,addType:o}){if(o===q.BOTTOM?e.append(t):e.insertBefore(t,e.firstChild),this.removeDomOldEntries(e)){if(e.getElementsByClassName(Z).length)return;r.contextName=Ee,r.symbol="\u{1F5D1}",r.color="orange",r.className=Z,clearTimeout(this.timerAddLineToDomID),this.timerAddLineToDomID=setTimeout(()=>{this.timerAddLineToDomID=null,this.writeLogToDom(r,"",{addType:q.TOP,message:"Oldest entries removed"})},500);return}this.scrollDivToBottom(e)}writeLogToDom(e,t,{addType:r=q.BOTTOM,message:o=""}={}){this.$containers=this.$containers||document.querySelectorAll(this.options.logToDom),t=o||t;for(let n=0;n<this.$containers.length;++n){let i=this.$containers[n],a=i.querySelector("."+ee);a||(a=document.createElement("div"),a.classList.add(ee),i.append(a));let l=document.createElement("div");l.classList.add(pe),e.className&&l.classList.add(e.className),l.style.color=e.color,this.setColumns(l,e,t),setTimeout(function(x,p,{addType:d,context:E}){this.addLineToDom(x,p,{addType:d,context:E})}.bind(this,a,l,{addType:r,context:e}),0)}}writeLogToFile(e){try{fs.appendFileSync(this.options.logToFilePath,e+this.EOL)}catch(t){console.rawError("LOG_TO_FILE_FAILURE: ",t.message)}}convertArgumentsToText(e){let t=[],r,o=e.length;for(let n=0;n<o;++n){let i,a=e[n];try{i=JSON.stringify(a)}catch(l){}if(!i)try{i=Le(a)}catch(l){}t.push(i)}return r=t.join("\u2022"),r}processOutput(e={}){try{let t="";if(!this.isTargetAllowed(e.target))return;let r=Array.prototype.slice.call(arguments);r.shift(),t=this.convertArgumentsToText(r);let o="",n="";if(n=this.format(oe(R({},e),{message:t})),++this.logCounter,this.isBrowser()?(e.environnment=w.ENVIRONMENT_TYPE.BROWSER,this.options.logToDom&&this.writeLogToDom(e,n,{message:t}),o=`%c${n}`):(e.environnment=w.ENVIRONMENT_TYPE.NODE,o=j.getTextFromColor(n,{fg:e.color,bg:e.bgColor,isBold:e.bold,isUnderline:e.underline,isReversed:e.reversed}),this.options.logToFile&&this.writeLogToFile(n)),this.keepLog&&this.logHistory.push(o),this.options.hideLog)return;this.isBrowser()?g(this,L).call(this,o,`color: ${e.color}`):g(this,L).call(this,o),this.errorTargetHandler(e,r)}catch(t){console.error("AnaLogger:",t.message)}}isExtendedOptionsPassed(e){return typeof e!="object"?!1:e.hasOwnProperty("context")||e.hasOwnProperty("target")||e.hasOwnProperty("color")||e.hasOwnProperty("contextName")||e.hasOwnProperty("lid")}listSymbols(){for(let e in Y)console.rawLog(Y[e]+` ${e} `)}applySymbolByName(e){try{e.symbol&&Y[e.symbol]&&(e.symbol=Y[e.symbol])}catch(t){}}convertToContext(e,t){t=t||this.generateDefaultContext(),e=e||t;let r=e;if(e.context&&typeof e.context=="object"){let o=Object.assign({},e);delete o.context,r=Object.assign({},e.context,o)}return r=Object.assign({},t,r),delete r.context,this.applySymbolByName(r),r}log(e,...t){if(!this.isExtendedOptionsPassed(e)){let o=this.generateDefaultContext();this.processOutput.apply(this,[o,e,...t]);return}let r=this.convertToContext(e);this.processOutput.apply(this,[r,...t])}error(e,...t){if(this.options.hideError)return;if(!this.isExtendedOptionsPassed(e)){let i=this.generateErrorContext();this.processOutput.apply(this,[i,e,...t]);return}let r=this.generateErrorContext(),o=this.convertToContext(e,r),n=Array.prototype.slice.call(arguments,1);this.log(o,...n)}overrideError(){this.options.hideHookMessage||g(this,L).call(this,"AnaLogger: Hook placed on console.error"),console.error=this.onDisplayError.bind(this)}overrideConsole({log:e=!0,info:t=!0,warn:r=!0,error:o=!1}={}){this.options.hideHookMessage||g(this,L).call(this,"AnaLogger: Hook placed on console.log"),e&&(console.log=this.onDisplayLog.bind(this)),t&&(console.info=this.onDisplayLog.bind(this)),r&&(console.warn=this.onDisplayLog.bind(this)),o&&this.overrideError()}removeOverrideError(){console.warn=g(this,v)}removeOverride({log:e=!0,info:t=!0,warn:r=!0,error:o=!1}={}){e&&(console.log=g(this,L)),t&&(console.info=g(this,B)),r&&(console.warn=g(this,C)),o&&this.removeOverrideError()}info(...e){return this.log(...e)}warn(...e){return this.log(...e)}table(...e){return this.buildTable(...e)}alert(...e){if(this.isNode())return this.log(...e);let t=e.join(" | ");alert(t)}assert(e,t=!0,...r){let o;try{return typeof e=="function"?(o=e(...r),o!==t?(this.error("Asset failed"),!1):(this.options.hidePassingTests||this.log("SUCCESS: Assert passed"),!0)):e!==t?(this.error("Assert failed"),!1):(this.options.hidePassingTests||this.log("SUCCESS: Assert passed"),!0)}catch(n){this.error("Unexpected error in assert")}return!1}applyAnalogFormatting({activeTarget:e="",override:t=!1}={}){try{let n={STANDARD:null,TEST:{color:"#B18904",symbol:"diamonds"},C1:null,C2:null,C3:null,DEFAULT:{}},i=typeof process=="object"?process.env.DEVELOPER:"DEV",a=typeof process=="object"?process.env.DEVELOPER:"DEV1",l={ALL:"ALL",DEBUG:"DEBUG",DEV:i,DEV1:a,USER:"USER"};return this.setDefaultContext(n.DEFAULT),this.setTargets(l),e&&this.setActiveTarget(e),this.setOptions({silent:!1,hideError:!1,hideHookMessage:!0,lidLenMax:4}),t&&(this.overrideConsole(),this.overrideError()),!0}catch(r){console.error({lid:3249},r.message)}return!1}applyPredefinedFormat(e=te.DEFAULT_FORMAT,{activeTarget:t="",override:r=!1}={}){if(e===te.DEFAULT_FORMAT)return this.applyAnalogFormatting({activeTarget:t,override:r})}},S=w;L=new WeakMap,B=new WeakMap,C=new WeakMap,v=new WeakMap,$=new WeakSet,Oe=function(e){let t=e,r=this.generateNewContext();return t=Object.assign({},r,t),t.color.toLowerCase().indexOf("rgb")>-1?t.color=j.rgbStringToHex(t.color):t.color.indexOf("#")===-1&&(t.color=j.colorNameToHex(t.color)),t},h(S,"ALIGN",{LEFT:"LEFT",RIGHT:"RIGHT"}),h(S,"ENVIRONMENT_TYPE",{BROWSER:"BROWSER",NODE:"NODE",OTHER:"OTHER"});var Pe=S,Ke=Pe,Qe=new S;export{Qe as anaLogger,Ke as default};
3
3
 
@@ -0,0 +1 @@
1
+ .analogger{background-color:#462210;border:4px solid #16122a;box-shadow:3px 4px 9px 0px rgba(0,0,0,.75);height:320px;overflow:hidden;margin:1rem;padding:13px 0 0 0;width:80%;max-height:300px}.analogger .analogger-view{background-color:#0c0c0c;box-sizing:border-box;color:#faebd7;display:block;font-family:sans-serif;font-size:12px;line-height:30px;height:calc(100% - 20px);margin:20px 0 0 0;padding:12px;overflow:auto;position:relative;width:100%}.analogger .analogger-view .to-esm-line{align-items:stretch;display:flex;justify-content:flex-start;height:26px;line-height:26px;overflow:hidden;vertical-align:middle;white-space:nowrap}.analogger .analogger-view .to-esm-line.analogger-removed-notif{background-color:rgba(223,73,73,.51);color:#abb9b7;font-size:9px}.analogger .analogger-view .to-esm-line.analogger-removed-notif .analogger-col-symbol{font-size:18px}.analogger .analogger-view .to-esm-line .analogger-col{overflow:hidden;padding:0 4px;text-overflow:ellipsis;white-space:nowrap}.analogger .analogger-view .to-esm-line .analogger-col-contextName{flex-grow:1;max-width:60px;text-align:right}.analogger .analogger-view .to-esm-line .analogger-col-target{flex-grow:1;max-width:60px;text-align:right}.analogger .analogger-view .to-esm-line .analogger-col-symbol{flex-grow:1;max-width:40px;text-align:center}.analogger .analogger-view .to-esm-line .analogger-col-text{flex-grow:1}.analogger .analogger-view::-webkit-scrollbar-thumb{border:5px solid transparent;border-radius:100px;background-color:#514b6e;background-clip:content-box}.analogger .analogger-view::-webkit-scrollbar{width:14px}.analogger .analogger-view::-webkit-scrollbar-track{background-color:#382525;border-radius:100px}.analogger .analogger-view::-webkit-scrollbar-thumb{border-radius:100px;border:4px solid transparent;background-clip:content-box;background-color:#9f6c53}
@@ -9,7 +9,9 @@ import fs from "fs";
9
9
  import os from "os";
10
10
  import terminalSize from "./node_modules/window-size/index.mjs";
11
11
  import toAnsi from "to-ansi";
12
- import {COLOR_TABLE, SYSTEM} from "./src/constants.mjs";
12
+ import {COLOR_TABLE, SYSTEM, MAX_CHILDREN_DOM_ANALOGGER, CLASS_REMOVED_NOTIF, ADD_TYPE, CONSOLE_AREA_CLASSNAME,
13
+ PREDEFINED_FORMATS, ANALOGGER_NAME, LINE_CLASSNAME
14
+ } from "./src/constants.mjs";
13
15
  import {stringify} from "flatted";
14
16
  terminalSize = {};
15
17
 
@@ -29,9 +31,6 @@ const PREDEFINED_CONTEXT_NAMES = {
29
31
  "ERROR": "ERROR"
30
32
  };
31
33
 
32
- export const PREDEFINED_FORMATS = {
33
- "ANALOGGER": "ANALOGGER"
34
- };
35
34
 
36
35
 
37
36
  const EOL = `
@@ -120,7 +119,7 @@ const symbolNames = {
120
119
  writing_hand : "✍",
121
120
  };
122
121
 
123
- class AnaLogger
122
+ class ____AnaLogger
124
123
  {
125
124
  system = "";
126
125
 
@@ -165,14 +164,6 @@ class AnaLogger
165
164
 
166
165
  constructor()
167
166
  {
168
- if (AnaLogger.Instance)
169
- {
170
- /* istanbul ignore next */
171
- return AnaLogger.Instance;
172
- }
173
-
174
- AnaLogger.Instance = this;
175
-
176
167
  this.system = (typeof process === "object") ? SYSTEM.NODE : SYSTEM.BROWSER;
177
168
  this.format = this.onBuildLog.bind(this);
178
169
  this.originalFormatFunction = this.format;
@@ -203,8 +194,8 @@ class AnaLogger
203
194
  console.rawError = this.rawError;
204
195
  console.isBrowser0 = this.system === SYSTEM.BROWSER;
205
196
 
206
- this.ALIGN = AnaLogger.ALIGN;
207
- this.ENVIRONMENT_TYPE = AnaLogger.ENVIRONMENT_TYPE;
197
+ this.ALIGN = ____AnaLogger.ALIGN;
198
+ this.ENVIRONMENT_TYPE = ____AnaLogger.ENVIRONMENT_TYPE;
208
199
  }
209
200
 
210
201
  keepLogHistory()
@@ -363,7 +354,7 @@ class AnaLogger
363
354
  return this.options;
364
355
  }
365
356
 
366
- truncateMessage(input = "", {fit = 0, align = AnaLogger.ALIGN.LEFT, ellipsis = "..."} = {})
357
+ truncateMessage(input = "", {fit = 0, align = ____AnaLogger.ALIGN.LEFT, ellipsis = "..."} = {})
367
358
  {
368
359
  input = "" + input;
369
360
  if (fit && input.length > fit)
@@ -371,7 +362,7 @@ class AnaLogger
371
362
  input = input.substring(0, fit - ellipsis.length) + ellipsis;
372
363
  }
373
364
 
374
- input = align === AnaLogger.ALIGN.LEFT ? input.padEnd(fit, " ") : input.padStart(fit, " ");
365
+ input = align === ____AnaLogger.ALIGN.LEFT ? input.padEnd(fit, " ") : input.padStart(fit, " ");
375
366
  return input;
376
367
  }
377
368
 
@@ -570,7 +561,7 @@ class AnaLogger
570
561
  time = this.truncateMessage(time, {fit: this.options.timeLenMax});
571
562
  contextName = this.truncateMessage(contextName, {
572
563
  fit : this.options.contextLenMax,
573
- align: AnaLogger.ALIGN.RIGHT
564
+ align: ____AnaLogger.ALIGN.RIGHT
574
565
  });
575
566
  lid = this.truncateMessage(lid, {fit: this.options.lidLenMax});
576
567
 
@@ -802,7 +793,7 @@ class AnaLogger
802
793
  let index = 0;
803
794
  for (let columnName in context)
804
795
  {
805
- if ("name" === columnName)
796
+ if (!["contextName", "symbol", "lid", "text"].includes(columnName))
806
797
  {
807
798
  continue;
808
799
  }
@@ -821,31 +812,124 @@ class AnaLogger
821
812
  $line.append($col);
822
813
  }
823
814
 
824
- writeLogToDom(context, text)
815
+ /**
816
+ * Check that the div has not too many entries
817
+ * @param $view
818
+ */
819
+ removeDomOldEntries = ($view) =>
820
+ {
821
+ const nbChildren = $view.childElementCount;
822
+ if (nbChildren > MAX_CHILDREN_DOM_ANALOGGER)
823
+ {
824
+ const n = Math.ceil(MAX_CHILDREN_DOM_ANALOGGER / 10);
825
+ for (let i = 0; i < n; ++i)
826
+ {
827
+ $view.removeChild($view.firstChild);
828
+ }
829
+ return n;
830
+ }
831
+
832
+ return 0;
833
+ };
834
+
835
+ /**
836
+ * Scroll to bottom if div is already at the bottom
837
+ * @param $view
838
+ */
839
+ scrollDivToBottom = ($view) =>
840
+ {
841
+ const scrollBottom = $view.scrollHeight - ($view.clientHeight + $view.scrollTop);
842
+ const divHeight = $view.clientHeight || $view.offsetHeight;
843
+ if (scrollBottom > divHeight / 2)
844
+ {
845
+ /* istanbul ignore next */
846
+ return;
847
+ }
848
+
849
+ $view.scrollTop = $view.scrollHeight;
850
+ };
851
+
852
+ /**
853
+ * Add a line to the Analogger div.
854
+ * Remove older lines if exceeding limit.
855
+ * @param $view
856
+ * @param $line
857
+ * @param context
858
+ * @param addType
859
+ */
860
+ addLineToDom($view, $line, {context, addType})
861
+ {
862
+ if (addType === ADD_TYPE.BOTTOM)
863
+ {
864
+ $view.append($line);
865
+ }
866
+ else
867
+ {
868
+ $view.insertBefore($line, $view.firstChild);
869
+ }
870
+
871
+ let nbRemoved = this.removeDomOldEntries($view);
872
+ if (nbRemoved)
873
+ {
874
+ if ($view.getElementsByClassName(CLASS_REMOVED_NOTIF).length)
875
+ {
876
+ return;
877
+ }
878
+
879
+ context.contextName = ANALOGGER_NAME;
880
+ context.symbol = "🗑";
881
+ context.color = "orange";
882
+ context.className = CLASS_REMOVED_NOTIF;
883
+
884
+ clearTimeout(this.timerAddLineToDomID);
885
+ this.timerAddLineToDomID = setTimeout(()=>
886
+ {
887
+ this.timerAddLineToDomID = null;
888
+ /* istanbul ignore next */
889
+ this.writeLogToDom(context, "", {addType: ADD_TYPE.TOP, message: `Oldest entries removed`});
890
+ }, 500);
891
+ return;
892
+ }
893
+
894
+ this.scrollDivToBottom($view);
895
+
896
+ }
897
+
898
+ writeLogToDom(context, fullText, {addType = ADD_TYPE.BOTTOM, message = ""} = {})
825
899
  {
826
900
  this.$containers = this.$containers || document.querySelectorAll(this.options.logToDom);
901
+ fullText = message || fullText;
827
902
 
828
903
  for (let i = 0; i < this.$containers.length; ++i)
829
904
  {
830
905
  const $container = this.$containers[i];
831
906
 
832
- let $view = $container.querySelector(".analogger-view");
907
+ let $view = $container.querySelector("." + CONSOLE_AREA_CLASSNAME);
833
908
  if (!$view)
834
909
  {
835
910
  $view = document.createElement("div");
836
- $view.classList.add("analogger-view");
911
+ $view.classList.add(CONSOLE_AREA_CLASSNAME);
837
912
  $container.append($view);
838
913
  }
839
914
 
840
915
  const $line = document.createElement("div");
841
- $line.classList.add("to-esm-line");
916
+ $line.classList.add(LINE_CLASSNAME);
917
+ if (context.className)
918
+ {
919
+ $line.classList.add(context.className);
920
+ }
842
921
  $line.style.color = context.color;
843
- $line.setAttribute("data-log-counter", this.logCounter);
844
- $line.setAttribute("data-log-index", this.logIndex);
845
922
 
846
- this.setColumns($line, context, text);
923
+ this.setColumns($line, context, fullText);
924
+
925
+ // Prevent the application to be stuck when many logs are entered at once
926
+ /* istanbul ignore next */
927
+ setTimeout(/* istanbul ignore next */function($view, $line, {addType, context})
928
+ {
929
+ /* istanbul ignore next */
930
+ this.addLineToDom($view, $line, {addType, context});
931
+ }.bind(this, $view, $line, {addType, context}), 0);
847
932
 
848
- $view.append($line);
849
933
  }
850
934
  }
851
935
 
@@ -926,19 +1010,22 @@ class AnaLogger
926
1010
 
927
1011
  ++this.logCounter;
928
1012
 
1013
+ /* istanbul ignore next */
929
1014
  if (this.isBrowser())
930
1015
  {
931
- context.environnment = AnaLogger.ENVIRONMENT_TYPE.BROWSER;
1016
+ context.environnment = ____AnaLogger.ENVIRONMENT_TYPE.BROWSER;
1017
+ /* istanbul ignore next */
932
1018
  if (this.options.logToDom)
933
1019
  {
934
- this.writeLogToDom(context, text);
1020
+ /* istanbul ignore next */
1021
+ this.writeLogToDom(context, text, {message});
935
1022
  }
936
1023
 
937
1024
  output = `%c${text}`;
938
1025
  }
939
1026
  else
940
1027
  {
941
- context.environnment = AnaLogger.ENVIRONMENT_TYPE.NODE;
1028
+ context.environnment = ____AnaLogger.ENVIRONMENT_TYPE.NODE;
942
1029
  output = toAnsi.getTextFromColor(text, {
943
1030
  fg : context.color,
944
1031
  bg : context.bgColor,
@@ -1242,11 +1329,14 @@ class AnaLogger
1242
1329
  DEFAULT : {}
1243
1330
  };
1244
1331
 
1332
+ const DEV = (typeof process === "object") ? process.env.DEVELOPER : "DEV";
1333
+ const DEV1 = (typeof process === "object") ? process.env.DEVELOPER : "DEV1";
1334
+
1245
1335
  const LOG_TARGETS = {
1246
1336
  ALL : "ALL",
1247
1337
  DEBUG: "DEBUG",
1248
- DEV : process.env.DEVELOPER,
1249
- DEV1 : process.env.DEVELOPER,
1338
+ DEV,
1339
+ DEV1,
1250
1340
  USER : "USER"
1251
1341
  };
1252
1342
 
@@ -1274,9 +1364,9 @@ class AnaLogger
1274
1364
  return false;
1275
1365
  }
1276
1366
 
1277
- applyPredefinedFormat(name = PREDEFINED_FORMATS.ANALOGGER, {activeTarget = "", override = false} = {})
1367
+ applyPredefinedFormat(name = PREDEFINED_FORMATS.DEFAULT_FORMAT, {activeTarget = "", override = false} = {})
1278
1368
  {
1279
- if (name === PREDEFINED_FORMATS.ANALOGGER)
1369
+ if (name === PREDEFINED_FORMATS.DEFAULT_FORMAT)
1280
1370
  {
1281
1371
  return this.applyAnalogFormatting({activeTarget, override});
1282
1372
  }
@@ -1284,8 +1374,12 @@ class AnaLogger
1284
1374
 
1285
1375
  }
1286
1376
 
1287
- export const anaLogger = new AnaLogger();
1288
- export default anaLogger;
1377
+ export const AnaLogger = ____AnaLogger;
1378
+
1379
+
1380
+ const __AnaLogger = ____AnaLogger;
1381
+ export default __AnaLogger;
1289
1382
 
1383
+ export const anaLogger = new ____AnaLogger();
1290
1384
 
1291
1385
 
@@ -34,4 +34,21 @@ const constants = {
34
34
  };
35
35
 
36
36
  export const COLOR_TABLE = constants.COLOR_TABLE;
37
- export const SYSTEM = constants.SYSTEM;
37
+ export const SYSTEM = constants.SYSTEM;
38
+ export const MAX_CHILDREN_DOM_ANALOGGER = 2000;
39
+ export const CLASS_REMOVED_NOTIF = "analogger-removed-notif";
40
+ export const CONSOLE_AREA_CLASSNAME = "analogger-view";
41
+ export const LINE_CLASSNAME = "to-esm-line";
42
+
43
+ export const ADD_TYPE = {
44
+ TOP: "TOP",
45
+ BOTTOM: "BOTTOM"
46
+ };
47
+
48
+ export const ANALOGGER_NAME = "ANALOGGER";
49
+
50
+
51
+
52
+ export const PREDEFINED_FORMATS = {
53
+ DEFAULT_FORMAT: "FORMAT1"
54
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "analogger",
3
- "version": "1.15.3",
3
+ "version": "1.17.1",
4
4
  "description": "Js Logger",
5
5
  "main": "./src/ana-logger.cjs",
6
6
  "module": "./esm/ana-logger.mjs",
@@ -38,7 +38,7 @@
38
38
  "build:esm:browser": " npm run clean:browser && to-esm src/ana-logger.cjs --output generated/browser/ --config .toesm.cjs --target package",
39
39
  "build:esm:browser:importmaps": " npm run clean:browser:importmaps && to-esm src/ana-logger.cjs --output generated/browser-importmaps/ --config .toesm.cjs --target browser --useImportMaps",
40
40
  "build:esm:browser:minified": " npm run clean:browser:minified && to-esm src/ana-logger.cjs --output generated/browser-minified/ --config .toesm.cjs --target browser --bundle ./dist/analogger-browser.min.mjs --update-all",
41
- "build:esm": "npm run clean:all && npm run build:esm:terminal && npm run build:esm:browser && npm run build:esm:browser:importmaps && npm run build:esm:browser:minified",
41
+ "build:esm": "npm run clean:all && npm run build:esm:terminal && npm run build:esm:browser && npm run build:esm:browser:importmaps && npm run build:esm:browser:minified && clonefile src/ana-logger.css dist/analogger.min.css && npm pack",
42
42
  "*** In the Browser-1 ****": "# ----------------------------------------------------------------------------------------------------------",
43
43
  "*** In the Browser-2 ****": "# Generate Demo code",
44
44
  "*** In the Browser-3 ****": "# ----------------------------------------------------------------------------------------------------------",
@@ -49,7 +49,7 @@
49
49
  "*** In the Browser with importmap-1 ****": "# ----------------------------------------------------------------------------------------------------------",
50
50
  "*** In the Browser with importmap-2 ****": "# Generate demo code with import map",
51
51
  "*** In the Browser with importmap-3 ****": "# ----------------------------------------------------------------------------------------------------------",
52
- "build:demo": "npm run build:esm && npm run build:demo:terminal && npm run build:demo:browser && npm run build:demo:browser:importmaps && npm run build:demo:minified",
52
+ "build:demo": "npm run build:esm --recursive && npm run build:demo:terminal && npm run build:demo:browser && npm run build:demo:browser:importmaps && npm run build:demo:minified",
53
53
  "quick:run": "node example/more/demo.cjs"
54
54
  },
55
55
  "author": "Patrice Thimothee",
@@ -90,7 +90,7 @@
90
90
  "selenium-webdriver": "^4.1.1",
91
91
  "semantic-release": "^19.0.2",
92
92
  "sinon": "^13.0.1",
93
- "to-esm": "^2.12.1"
93
+ "to-esm": "^2.13.1"
94
94
  },
95
95
  "dependencies": {
96
96
  "flatted": "^3.2.5",
@@ -13,7 +13,9 @@ terminalSize = require("window-size");
13
13
 
14
14
  const toAnsi = require("to-ansi");
15
15
 
16
- const {COLOR_TABLE, SYSTEM} = require("./constants.cjs");
16
+ const {COLOR_TABLE, SYSTEM, MAX_CHILDREN_DOM_ANALOGGER, CLASS_REMOVED_NOTIF, ADD_TYPE, CONSOLE_AREA_CLASSNAME,
17
+ PREDEFINED_FORMATS, ANALOGGER_NAME, LINE_CLASSNAME
18
+ } = require("./constants.cjs");
17
19
  const PREDEFINED_CONTEXT_NAMES = {
18
20
  "DEFAULT": "DEFAULT",
19
21
  // "LOG" : "LOG",
@@ -23,9 +25,6 @@ const PREDEFINED_CONTEXT_NAMES = {
23
25
  "ERROR": "ERROR"
24
26
  };
25
27
 
26
- const PREDEFINED_FORMATS = {
27
- "ANALOGGER": "ANALOGGER"
28
- };
29
28
 
30
29
  const {stringify} = require("flatted");
31
30
 
@@ -115,7 +114,7 @@ const symbolNames = {
115
114
  writing_hand : "✍",
116
115
  };
117
116
 
118
- class AnaLogger
117
+ class ____AnaLogger
119
118
  {
120
119
  system = "";
121
120
 
@@ -160,14 +159,6 @@ class AnaLogger
160
159
 
161
160
  constructor()
162
161
  {
163
- if (AnaLogger.Instance)
164
- {
165
- /* istanbul ignore next */
166
- return AnaLogger.Instance;
167
- }
168
-
169
- AnaLogger.Instance = this;
170
-
171
162
  this.system = (typeof process === "object") ? SYSTEM.NODE : SYSTEM.BROWSER;
172
163
  this.format = this.onBuildLog.bind(this);
173
164
  this.originalFormatFunction = this.format;
@@ -198,8 +189,8 @@ class AnaLogger
198
189
  console.rawError = this.rawError;
199
190
  console.isBrowser0 = this.system === SYSTEM.BROWSER;
200
191
 
201
- this.ALIGN = AnaLogger.ALIGN;
202
- this.ENVIRONMENT_TYPE = AnaLogger.ENVIRONMENT_TYPE;
192
+ this.ALIGN = ____AnaLogger.ALIGN;
193
+ this.ENVIRONMENT_TYPE = ____AnaLogger.ENVIRONMENT_TYPE;
203
194
  }
204
195
 
205
196
  keepLogHistory()
@@ -358,7 +349,7 @@ class AnaLogger
358
349
  return this.options;
359
350
  }
360
351
 
361
- truncateMessage(input = "", {fit = 0, align = AnaLogger.ALIGN.LEFT, ellipsis = "..."} = {})
352
+ truncateMessage(input = "", {fit = 0, align = ____AnaLogger.ALIGN.LEFT, ellipsis = "..."} = {})
362
353
  {
363
354
  input = "" + input;
364
355
  if (fit && input.length > fit)
@@ -366,7 +357,7 @@ class AnaLogger
366
357
  input = input.substring(0, fit - ellipsis.length) + ellipsis;
367
358
  }
368
359
 
369
- input = align === AnaLogger.ALIGN.LEFT ? input.padEnd(fit, " ") : input.padStart(fit, " ");
360
+ input = align === ____AnaLogger.ALIGN.LEFT ? input.padEnd(fit, " ") : input.padStart(fit, " ");
370
361
  return input;
371
362
  }
372
363
 
@@ -565,7 +556,7 @@ class AnaLogger
565
556
  time = this.truncateMessage(time, {fit: this.options.timeLenMax});
566
557
  contextName = this.truncateMessage(contextName, {
567
558
  fit : this.options.contextLenMax,
568
- align: AnaLogger.ALIGN.RIGHT
559
+ align: ____AnaLogger.ALIGN.RIGHT
569
560
  });
570
561
  lid = this.truncateMessage(lid, {fit: this.options.lidLenMax});
571
562
 
@@ -797,7 +788,7 @@ class AnaLogger
797
788
  let index = 0;
798
789
  for (let columnName in context)
799
790
  {
800
- if ("name" === columnName)
791
+ if (!["contextName", "symbol", "lid", "text"].includes(columnName))
801
792
  {
802
793
  continue;
803
794
  }
@@ -816,31 +807,124 @@ class AnaLogger
816
807
  $line.append($col);
817
808
  }
818
809
 
819
- writeLogToDom(context, text)
810
+ /**
811
+ * Check that the div has not too many entries
812
+ * @param $view
813
+ */
814
+ removeDomOldEntries = ($view) =>
815
+ {
816
+ const nbChildren = $view.childElementCount;
817
+ if (nbChildren > MAX_CHILDREN_DOM_ANALOGGER)
818
+ {
819
+ const n = Math.ceil(MAX_CHILDREN_DOM_ANALOGGER / 10);
820
+ for (let i = 0; i < n; ++i)
821
+ {
822
+ $view.removeChild($view.firstChild);
823
+ }
824
+ return n;
825
+ }
826
+
827
+ return 0;
828
+ };
829
+
830
+ /**
831
+ * Scroll to bottom if div is already at the bottom
832
+ * @param $view
833
+ */
834
+ scrollDivToBottom = ($view) =>
835
+ {
836
+ const scrollBottom = $view.scrollHeight - ($view.clientHeight + $view.scrollTop);
837
+ const divHeight = $view.clientHeight || $view.offsetHeight;
838
+ if (scrollBottom > divHeight / 2)
839
+ {
840
+ /* istanbul ignore next */
841
+ return;
842
+ }
843
+
844
+ $view.scrollTop = $view.scrollHeight;
845
+ };
846
+
847
+ /**
848
+ * Add a line to the Analogger div.
849
+ * Remove older lines if exceeding limit.
850
+ * @param $view
851
+ * @param $line
852
+ * @param context
853
+ * @param addType
854
+ */
855
+ addLineToDom($view, $line, {context, addType})
856
+ {
857
+ if (addType === ADD_TYPE.BOTTOM)
858
+ {
859
+ $view.append($line);
860
+ }
861
+ else
862
+ {
863
+ $view.insertBefore($line, $view.firstChild);
864
+ }
865
+
866
+ let nbRemoved = this.removeDomOldEntries($view);
867
+ if (nbRemoved)
868
+ {
869
+ if ($view.getElementsByClassName(CLASS_REMOVED_NOTIF).length)
870
+ {
871
+ return;
872
+ }
873
+
874
+ context.contextName = ANALOGGER_NAME;
875
+ context.symbol = "🗑";
876
+ context.color = "orange";
877
+ context.className = CLASS_REMOVED_NOTIF;
878
+
879
+ clearTimeout(this.timerAddLineToDomID);
880
+ this.timerAddLineToDomID = setTimeout(()=>
881
+ {
882
+ this.timerAddLineToDomID = null;
883
+ /* istanbul ignore next */
884
+ this.writeLogToDom(context, "", {addType: ADD_TYPE.TOP, message: `Oldest entries removed`});
885
+ }, 500);
886
+ return;
887
+ }
888
+
889
+ this.scrollDivToBottom($view);
890
+
891
+ }
892
+
893
+ writeLogToDom(context, fullText, {addType = ADD_TYPE.BOTTOM, message = ""} = {})
820
894
  {
821
895
  this.$containers = this.$containers || document.querySelectorAll(this.options.logToDom);
896
+ fullText = message || fullText;
822
897
 
823
898
  for (let i = 0; i < this.$containers.length; ++i)
824
899
  {
825
900
  const $container = this.$containers[i];
826
901
 
827
- let $view = $container.querySelector(".analogger-view");
902
+ let $view = $container.querySelector("." + CONSOLE_AREA_CLASSNAME);
828
903
  if (!$view)
829
904
  {
830
905
  $view = document.createElement("div");
831
- $view.classList.add("analogger-view");
906
+ $view.classList.add(CONSOLE_AREA_CLASSNAME);
832
907
  $container.append($view);
833
908
  }
834
909
 
835
910
  const $line = document.createElement("div");
836
- $line.classList.add("to-esm-line");
911
+ $line.classList.add(LINE_CLASSNAME);
912
+ if (context.className)
913
+ {
914
+ $line.classList.add(context.className);
915
+ }
837
916
  $line.style.color = context.color;
838
- $line.setAttribute("data-log-counter", this.logCounter);
839
- $line.setAttribute("data-log-index", this.logIndex);
840
917
 
841
- this.setColumns($line, context, text);
918
+ this.setColumns($line, context, fullText);
919
+
920
+ // Prevent the application to be stuck when many logs are entered at once
921
+ /* istanbul ignore next */
922
+ setTimeout(/* istanbul ignore next */function($view, $line, {addType, context})
923
+ {
924
+ /* istanbul ignore next */
925
+ this.addLineToDom($view, $line, {addType, context});
926
+ }.bind(this, $view, $line, {addType, context}), 0);
842
927
 
843
- $view.append($line);
844
928
  }
845
929
  }
846
930
 
@@ -921,19 +1005,22 @@ class AnaLogger
921
1005
 
922
1006
  ++this.logCounter;
923
1007
 
1008
+ /* istanbul ignore next */
924
1009
  if (this.isBrowser())
925
1010
  {
926
- context.environnment = AnaLogger.ENVIRONMENT_TYPE.BROWSER;
1011
+ context.environnment = ____AnaLogger.ENVIRONMENT_TYPE.BROWSER;
1012
+ /* istanbul ignore next */
927
1013
  if (this.options.logToDom)
928
1014
  {
929
- this.writeLogToDom(context, text);
1015
+ /* istanbul ignore next */
1016
+ this.writeLogToDom(context, text, {message});
930
1017
  }
931
1018
 
932
1019
  output = `%c${text}`;
933
1020
  }
934
1021
  else
935
1022
  {
936
- context.environnment = AnaLogger.ENVIRONMENT_TYPE.NODE;
1023
+ context.environnment = ____AnaLogger.ENVIRONMENT_TYPE.NODE;
937
1024
  output = toAnsi.getTextFromColor(text, {
938
1025
  fg : context.color,
939
1026
  bg : context.bgColor,
@@ -1237,11 +1324,14 @@ class AnaLogger
1237
1324
  DEFAULT : {}
1238
1325
  };
1239
1326
 
1327
+ const DEV = (typeof process === "object") ? process.env.DEVELOPER : "DEV";
1328
+ const DEV1 = (typeof process === "object") ? process.env.DEVELOPER : "DEV1";
1329
+
1240
1330
  const LOG_TARGETS = {
1241
1331
  ALL : "ALL",
1242
1332
  DEBUG: "DEBUG",
1243
- DEV : process.env.DEVELOPER,
1244
- DEV1 : process.env.DEVELOPER,
1333
+ DEV,
1334
+ DEV1,
1245
1335
  USER : "USER"
1246
1336
  };
1247
1337
 
@@ -1269,9 +1359,9 @@ class AnaLogger
1269
1359
  return false;
1270
1360
  }
1271
1361
 
1272
- applyPredefinedFormat(name = PREDEFINED_FORMATS.ANALOGGER, {activeTarget = "", override = false} = {})
1362
+ applyPredefinedFormat(name = PREDEFINED_FORMATS.DEFAULT_FORMAT, {activeTarget = "", override = false} = {})
1273
1363
  {
1274
- if (name === PREDEFINED_FORMATS.ANALOGGER)
1364
+ if (name === PREDEFINED_FORMATS.DEFAULT_FORMAT)
1275
1365
  {
1276
1366
  return this.applyAnalogFormatting({activeTarget, override});
1277
1367
  }
@@ -1279,8 +1369,12 @@ class AnaLogger
1279
1369
 
1280
1370
  }
1281
1371
 
1282
- const anaLogger = new AnaLogger();
1283
- module.exports = anaLogger;
1284
- module.exports.anaLogger = anaLogger;
1372
+ const _AnaLogger = ____AnaLogger;
1373
+ module.exports.AnaLogger = _AnaLogger;
1374
+
1375
+ const __AnaLogger = ____AnaLogger;
1376
+ module.exports = __AnaLogger;
1377
+
1378
+ const ___anaLogger = new ____AnaLogger();
1379
+ module.exports.anaLogger = ___anaLogger;
1285
1380
 
1286
- module.exports.PREDEFINED_FORMATS = PREDEFINED_FORMATS;
package/src/constants.cjs CHANGED
@@ -28,4 +28,21 @@ const constants = {
28
28
  };
29
29
 
30
30
  module.exports.COLOR_TABLE = constants.COLOR_TABLE;
31
- module.exports.SYSTEM = constants.SYSTEM;
31
+ module.exports.SYSTEM = constants.SYSTEM;
32
+ module.exports.MAX_CHILDREN_DOM_ANALOGGER = 2000;
33
+ module.exports.CLASS_REMOVED_NOTIF = "analogger-removed-notif";
34
+ module.exports.CONSOLE_AREA_CLASSNAME = "analogger-view";
35
+ module.exports.LINE_CLASSNAME = "to-esm-line";
36
+
37
+ module.exports.ADD_TYPE = {
38
+ TOP: "TOP",
39
+ BOTTOM: "BOTTOM"
40
+ };
41
+
42
+ const ANALOGGER_NAME = "ANALOGGER";
43
+
44
+ module.exports.ANALOGGER_NAME = ANALOGGER_NAME;
45
+
46
+ module.exports.PREDEFINED_FORMATS = {
47
+ DEFAULT_FORMAT: "FORMAT1"
48
+ };