UNPKG

snooplogg

Version:

Your mind on your logs and your logs on your mind

6 lines 12.5 kB
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("node:util");var t=class{events={};addListener(e,t){return this.on(e,t)}emit(e,...t){let n=this.events[e],r=n?.length??0;if(r===0)return!1;if(r===1)n[0](...t);else for(let e=0;e<r;e++)n[e](...t);return!0}off(e,t){let n=this.events[e];return n&&(this.events[e]=n.filter(e=>e!==t)),this}on(e,t){return this.events[e]?this.events[e].push(t):this.events[e]=[t],this}removeListener(e,t){return this.off(e,t)}};function n(e){return typeof e!=`object`||!e?!1:Object.getPrototypeOf(e)?.constructor.name===`Object`}function r({args:t,colors:r,elements:i,method:a,ns:o,uptime:s},c){let l=`${i.uptime(s,c)} ${o?`${i.namespace(o,c)} `:``}${a&&a!==`log`?`${i.method(a,c)} `:``}`,u=t.map(t=>n(t)?(0,e.inspect)(t,{breakLength:0,colors:r,depth:4,showHidden:!1}):t);for(let e=0,t=u.length;e<t;e++){let t=u[e];t instanceof Error&&(u[e]=i.error(t,c))}return(0,e.format)(...u).split(` `).map(e=>l+i.message(e,a,c)).join(` `)}var i=class e{buffer;_head=0;_maxSize;_size=0;constructor(e=0){if(typeof e!=`number`)throw TypeError(`Expected max size to be a number`);if(Number.isNaN(e)||e<0)throw RangeError(`Expected max size to be zero or greater`);this.buffer=Array(e|0),this._maxSize=e|0}get head(){return this._head}get maxSize(){return this._maxSize}set maxSize(t){if(typeof t!=`number`)throw TypeError(`Expected max size to be a number`);if(Number.isNaN(t)||t<0)throw RangeError(`Expected max size to be zero or greater`);if(t===this._maxSize)return;let n=new e(t);for(let e of this)e!==void 0&&n.push(e);this.buffer=n.buffer,this._head=n.head,this._maxSize=n._maxSize,this._size=n.size}get size(){return this._size}push(e){return this._maxSize>0&&(this._size>0&&this._head++,this._head>=this._maxSize&&(this._head=0),this._size=Math.min(this._size+1,this._maxSize),this.buffer[this._head]=e),this}clear(){return this.buffer=Array(this._maxSize),this._head=0,this._size=0,this}[Symbol.iterator](){let e=0;return{next:()=>{if(e=Math.min(e,this._maxSize),e>=this._size)return e++,{value:void 0,done:!0};let t=this.head+e-(this._size-1);return t<0&&(t+=this._maxSize),e++,{value:this.buffer[t],done:!1}}}}};function a(e){let t=3957909437,n=325035406;for(let r=0,i=e.length;r<i;r++){let i=e.charCodeAt(r);t=Math.imul(t^i,2654435761),n=Math.imul(n^i,1597334677)}t=Math.imul(t^t>>>16,2246822507),t^=Math.imul(n^n>>>13,3266489909),n=Math.imul(n^n>>>16,2246822507),n^=Math.imul(t^t>>>13,3266489909);let r=4294967296*(2097151&n)+(t>>>0),i=r%360,a=(r%50+50)/100,o=(r%60+30)/100,s=a*Math.min(o,1-o),c=(e,t=(e+i/30)%12)=>o-s*Math.max(Math.min(t-3,9-t,1),-1);return{r:Math.round(255*c(0)),g:Math.round(255*c(8)),b:Math.round(255*c(4))}}const o={trace:10,debug:20,log:30,info:40,warn:50,error:60,panic:70},s=(e=0)=>t=>`\u001B[${t+e}m`,c=(e=0)=>t=>`\u001B[${38+e};5;${t}m`,l=(e=0)=>(t,n,r)=>`\u001B[${38+e};2;${t};${n};${r}m`,u={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};Object.keys(u.modifier);const d=Object.keys(u.color),f=Object.keys(u.bgColor);[...d,...f];function p(){let e=new Map;for(let[t,n]of Object.entries(u)){for(let[t,r]of Object.entries(n))u[t]={open:`\u001B[${r[0]}m`,close:`\u001B[${r[1]}m`},n[t]=u[t],e.set(r[0],r[1]);Object.defineProperty(u,t,{value:n,enumerable:!1})}return Object.defineProperty(u,"codes",{value:e,enumerable:!1}),u.color.close=`\x1B[39m`,u.bgColor.close=`\x1B[49m`,u.color.ansi=s(),u.color.ansi256=c(),u.color.ansi16m=l(),u.bgColor.ansi=s(10),u.bgColor.ansi256=c(10),u.bgColor.ansi16m=l(10),Object.defineProperties(u,{rgbToAnsi256:{value(e,t,n){return e===t&&t===n?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(t/255*5)+Math.round(n/255*5)},enumerable:!1},hexToRgb:{value(e){let t=/[a-f\d]{6}|[a-f\d]{3}/i.exec(e.toString(16));if(!t)return[0,0,0];let[n]=t;n.length===3&&(n=[...n].map(e=>e+e).join(``));let r=Number.parseInt(n,16);return[r>>16&255,r>>8&255,r&255]},enumerable:!1},hexToAnsi256:{value:e=>u.rgbToAnsi256(...u.hexToRgb(e)),enumerable:!1},ansi256ToAnsi:{value(e){if(e<8)return 30+e;if(e<16)return 90+(e-8);let t,n,r;if(e>=232)t=((e-232)*10+8)/255,n=t,r=t;else{e-=16;let i=e%36;t=Math.floor(e/36)/5,n=Math.floor(i/6)/5,r=i%6/5}let i=Math.max(t,n,r)*2;if(i===0)return 30;let a=30+(Math.round(r)<<2|Math.round(n)<<1|Math.round(t));return i===2&&(a+=60),a},enumerable:!1},rgbToAnsi:{value:(e,t,n)=>u.ansi256ToAnsi(u.rgbToAnsi256(e,t,n)),enumerable:!1},hexToAnsi:{value:e=>u.ansi256ToAnsi(u.hexToAnsi256(e)),enumerable:!1}}),u}const m=p(),h=/^\s*at (.* )?(\(?.+\)?)$/,g={error(e,t){let n=`${t.redBright.open}${e.toString()}${t.redBright.close}`,r=``;return e.stack&&(r=e.stack.split(` `).slice(1).map((e,n,r)=>{let i=e.match(h),a=`${t.gray.open}${n+1<r.length?`├`:`└`}${i?``:e.trim()}${t.gray.close}`;if(i){let[e,n,r]=i,o=n?`${t.whiteBright.open}${t.italic.open}${n}${t.italic.close}${t.whiteBright.close}`:``;a+=`${o}${t.white.open}${r}${t.white.close}`}return a}).join(` `)),r?`${n}\n${r}`:n},message(e,t,n){return t===`trace`?`${n.white.open}${e}${n.white.close}`:e},method(e,t){let n=e.toUpperCase().padEnd(5);switch(e){case`debug`:return`${t.magenta.open}${n}${t.magenta.close}`;case`info`:return`${t.green.open}${n}${t.green.close}`;case`warn`:return`${t.yellow.open}${n}${t.yellow.close}`;case`error`:return`${t.redBright.open}${n}${t.redBright.close}`;case`panic`:return`${t.bgRed.open}${t.white.open}${n}${t.white.close}${t.bgRed.close}`;default:return`${t.gray.open}${n}${t.gray.close}`}},namespace(e,{color:t,nsToRgb:n,rgbToAnsi256:r}){let{r:i,g:a,b:o}=n(e);return`${t.ansi256(r(i,a,o))}${e}${t.close}`},timestamp(e,t){return`${t.gray.open}${e.toISOString().replace(`T`,` `).replace(`Z`,``)}${t.gray.close}`},uptime(e,t){return`${t.gray.open}${e.toFixed(3).padStart(8)}s${t.gray.close}`}},_=e=>e.replace(/[.+?^${}()|[\]\\]/g,`\\$&`),v=[`[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\\u0007)`,`(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))`].join(`|`),y=new RegExp(v,`g`);var b=class extends Function{constructor(e){return super(),Object.setPrototypeOf(e,new.target.prototype)}},x=class e extends b{#e;#t;#n;#r;#i;#a;#o;ns;nsPath;root;subnamespaces={};constructor(e,t=null,n){if(super(e=>this.initChild(e)),this.nsPath=[],this.root=e,n!==void 0){if(!n||typeof n!=`string`)throw TypeError(`Expected namespace to be a string`);if(/[\s,|]+/.test(n))throw Error(`Namespace cannot contain spaces, commas, or pipe characters`);this.nsPath=t?[...t.nsPath,n]:[n]}this.ns=this.nsPath.join(`:`)}initChild(t){return this.subnamespaces[t]||(this.subnamespaces[t]=new e(this.root,this,t)),this.subnamespaces[t]}#s(e){return(...t)=>(this.root.dispatch({args:t,level:o[e]||0,method:e,ns:this.ns,ts:new Date,uptime:process.uptime()}),this)}get log(){return this.#n||=this.#s(`log`),this.#n}get trace(){return this.#e||=this.#s(`trace`),this.#e}get debug(){return this.#t||=this.#s(`debug`),this.#t}get info(){return this.#r||=this.#s(`info`),this.#r}get warn(){return this.#i||=this.#s(`warn`),this.#i}get error(){return this.#a||=this.#s(`error`),this.#a}get panic(){return this.#o||=this.#s(`panic`),this.#o}},S=class extends b{allow=null;colors=!0;elements={};format;history=new i;id=Date.now()+Math.random();ignore=null;logLevel=o.trace;onSnoopMessage=null;logger;streams=new Map;constructor(e){super(e=>this.logger.initChild(e)),this.logger=new x(this),process.env.SNOOPLOGG_LEVEL&&this.setLogLevel(process.env.SNOOPLOGG_LEVEL),e&&this.config(e)}config(e={}){if(typeof e!=`object`)throw TypeError(`Expected logger options to be an object`);if(e.colors!==void 0){if(typeof e.colors!=`boolean`)throw TypeError(`Expected colors to be a boolean`);this.colors=e.colors}if(e.format&&typeof e.format!=`function`)throw TypeError(`Expected format to be a function`);if(this.format=e.format,e.elements!==void 0){if(typeof e.elements!=`object`)throw TypeError(`Expected elements to be an object`);if(e.elements){for(let[t,n]of Object.entries(e.elements))if(g[t]&&typeof n!=`function`)throw TypeError(`Expected "${t}" elements to be a function`)}this.elements=e.elements}if(e.historySize!==void 0)try{this.history.maxSize=e.historySize}catch(e){throw e instanceof Error&&(e.message=`Invalid history size: ${e.message}`,e.stack=`${e.toString()}${e.stack?.substring(e.stack.indexOf(` `))||``}`),e}return e.logLevel!==void 0&&this.setLogLevel(e.logLevel),this}dispatch(e){let t={id:this.id,...e};this.history.push(t),this.writeToStreams(t),t.id===this.id&&globalThis.__snooplogg__?.emit(`message`,t)}setLogLevel(e){if(typeof e==`number`)this.logLevel=e;else if(typeof e==`string`){if(this.logLevel=o[e.toLowerCase()],!this.logLevel)throw Error(`Invalid log level: ${e}`)}else throw TypeError(`Expected log level to be a string or number`);return this}enable(e=``){if(typeof e!=`string`&&!(e instanceof RegExp))throw TypeError(`Expected pattern to be a string or regex`);let t=null,n=null;if(e===`*`||e instanceof RegExp)t=e;else if(e&&typeof e==`string`){let r=[],i=[];for(let t of e.split(/[,|]+/))if(t=t.trim(),t){let e=t[0]===`-`;t=_(e?t.slice(1):t).replaceAll(`*`,`.*?`),e?i.push(t):r.push(t)}r.length&&(t=RegExp(`^(${r.join(`|`)})(:.+|$)`)),i.length&&(n=RegExp(`^(${i.join(`|`)})$`))}return this.allow=t,this.ignore=n,this}isEnabled(e){let t=this.allow;return t===null?!1:!!(!e||t===`*`||t instanceof RegExp&&t.test(e)&&(!this.ignore||!this.ignore.test(e)))}pipe(e,t={}){if(!e||typeof e.write!=`function`)throw TypeError(`Invalid stream`);if(this.streams.has(e))return this;let n=()=>this.streams.delete(e);if(this.streams.set(e,{colors:t.colors,elements:t.elements,format:t.format,onEnd:n}),e.on(`end`,n),t.flush){let t=this.streams.get(e);for(let n of this.history)n&&this.isEnabled(n.ns)&&n.level>=this.logLevel&&this.writeToStream(e,t,n)}return this}unpipe(e){if(!e||typeof e.write!=`function`)throw TypeError(`Invalid stream`);let t=this.streams.get(e);return t?.onEnd&&(e.removeListener(`end`,t.onEnd),this.streams.delete(e)),this}snoop(e){if(e!==void 0&&typeof e!=`string`)throw TypeError(`Expected namespace prefix to be a string`);return this.unsnoop(),this.onSnoopMessage=t=>{t&&typeof t==`object`&&t.id!==this.id&&this.dispatch(e?{...t,ns:`${e}${t.ns||``}`}:t)},globalThis.__snooplogg__?.on(`message`,this.onSnoopMessage),this}unsnoop(){return this.onSnoopMessage&&=(globalThis.__snooplogg__?.off(`message`,this.onSnoopMessage),null),this}writeToStream(e,t,n){let{args:i,level:o,method:s,ns:c,ts:l,uptime:u}=n;if(e.writableObjectMode){e.write(n);return}let d=t?.format||this.format||r,f=t.colors??(this.colors&&e.isTTY!==!1),p=`${d({args:i,colors:f,elements:{...g,...this.elements,...t?.elements},level:o,method:s,ns:c,ts:l,uptime:u},Object.defineProperties({...m,nsToRgb:a},Object.getOwnPropertyDescriptors(m)))}\n`;f||(p=p.replace(y,``)),e.write(p)}writeToStreams(e){if(this.isEnabled(e.ns)&&e.level>=this.logLevel)for(let[t,n]of this.streams.entries())this.writeToStream(t,n,e)}get trace(){return this.logger.trace}get debug(){return this.logger.debug}get log(){return this.logger.log}get info(){return this.logger.info}get warn(){return this.logger.warn}get error(){return this.logger.error}get panic(){return this.logger.panic}};Object.getOwnPropertyDescriptor(globalThis,`__snooplogg__`)||Object.defineProperty(globalThis,"__snooplogg__",{value:new t});const C=new S().enable(process.env.SNOOPLOGG||process.env.DEBUG).pipe(process.stderr),w=C.log.bind(C),T=C.trace.bind(C),E=C.debug.bind(C),D=C.info.bind(C),O=C.warn.bind(C),k=C.error.bind(C),A=C.panic.bind(C);exports.LogLevels=o,exports.Logger=x,exports.SnoopEmitter=t,exports.SnoopLogg=S,exports.debug=E,exports.defaultElements=g,exports.error=k,exports.info=D,exports.isJSON=n,exports.log=w,exports.nsToRgb=a,exports.panic=A,exports.snooplogg=C,exports.stripRegExp=y,exports.trace=T,exports.warn=O;