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 +4 -0
- package/README.md +53 -0
- package/dist/analogger-browser.min.mjs +2 -2
- package/dist/analogger.min.css +1 -0
- package/esm/ana-logger.mjs +130 -36
- package/esm/src/constants.mjs +18 -1
- package/package.json +4 -4
- package/src/ana-logger.cjs +132 -38
- package/src/constants.cjs +18 -1
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
|
|
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}
|
package/esm/ana-logger.mjs
CHANGED
|
@@ -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
|
|
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
|
|
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 =
|
|
207
|
-
this.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 =
|
|
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 ===
|
|
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:
|
|
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 ("
|
|
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
|
-
|
|
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(".
|
|
907
|
+
let $view = $container.querySelector("." + CONSOLE_AREA_CLASSNAME);
|
|
833
908
|
if (!$view)
|
|
834
909
|
{
|
|
835
910
|
$view = document.createElement("div");
|
|
836
|
-
$view.classList.add(
|
|
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(
|
|
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,
|
|
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 =
|
|
1016
|
+
context.environnment = ____AnaLogger.ENVIRONMENT_TYPE.BROWSER;
|
|
1017
|
+
/* istanbul ignore next */
|
|
932
1018
|
if (this.options.logToDom)
|
|
933
1019
|
{
|
|
934
|
-
|
|
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 =
|
|
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
|
|
1249
|
-
DEV1
|
|
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.
|
|
1367
|
+
applyPredefinedFormat(name = PREDEFINED_FORMATS.DEFAULT_FORMAT, {activeTarget = "", override = false} = {})
|
|
1278
1368
|
{
|
|
1279
|
-
if (name === PREDEFINED_FORMATS.
|
|
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
|
|
1288
|
-
|
|
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
|
|
package/esm/src/constants.mjs
CHANGED
|
@@ -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.
|
|
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.
|
|
93
|
+
"to-esm": "^2.13.1"
|
|
94
94
|
},
|
|
95
95
|
"dependencies": {
|
|
96
96
|
"flatted": "^3.2.5",
|
package/src/ana-logger.cjs
CHANGED
|
@@ -13,7 +13,9 @@ terminalSize = require("window-size");
|
|
|
13
13
|
|
|
14
14
|
const toAnsi = require("to-ansi");
|
|
15
15
|
|
|
16
|
-
const {COLOR_TABLE, SYSTEM
|
|
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
|
|
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 =
|
|
202
|
-
this.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 =
|
|
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 ===
|
|
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:
|
|
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 ("
|
|
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
|
-
|
|
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(".
|
|
902
|
+
let $view = $container.querySelector("." + CONSOLE_AREA_CLASSNAME);
|
|
828
903
|
if (!$view)
|
|
829
904
|
{
|
|
830
905
|
$view = document.createElement("div");
|
|
831
|
-
$view.classList.add(
|
|
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(
|
|
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,
|
|
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 =
|
|
1011
|
+
context.environnment = ____AnaLogger.ENVIRONMENT_TYPE.BROWSER;
|
|
1012
|
+
/* istanbul ignore next */
|
|
927
1013
|
if (this.options.logToDom)
|
|
928
1014
|
{
|
|
929
|
-
|
|
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 =
|
|
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
|
|
1244
|
-
DEV1
|
|
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.
|
|
1362
|
+
applyPredefinedFormat(name = PREDEFINED_FORMATS.DEFAULT_FORMAT, {activeTarget = "", override = false} = {})
|
|
1273
1363
|
{
|
|
1274
|
-
if (name === PREDEFINED_FORMATS.
|
|
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
|
|
1283
|
-
module.exports =
|
|
1284
|
-
|
|
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
|
+
};
|