@cmtlyt/logger
Version:
19 lines (18 loc) • 5.3 kB
JavaScript
;var LogThrow=(r=>(r.PREVENT_DEFAULT="cl:logger:preventDefault",r.NO_OUTPUT="cl:logger:noOutput",r))(LogThrow||{});function onelineFormat(r){return r.replace(/\s*?\n\s*/g," ")}const{formatContent:c,_formatContent:e}=(()=>{const r=["function","number","boolean","string","symbol","undefined"],t=new Set,o=(n,u=1,i=!1)=>{if(r.includes(typeof n))return!i&&typeof n=="string"?JSON.stringify(n):String(n);if(t.add(n),n instanceof Set)return formatSetData(n,u);if(n instanceof Map)return formatMapData(n,u);if(n instanceof Error)return n.stack||n.message;if(Array.isArray(n))return formatArray(n,u);try{return formatObject(n,u)}catch{return String(n)}},a=(n,u=1,i=!1)=>t.has(n)?"[Circular]":o(n,u,i).replace(/\s*?\n\s*?\n\s*/g," ");return{formatContent:(n,u=1,i=!1)=>{const s=a(n,u,i);return t.clear(),s},_formatContent:a}})();function formatArray(r,t=1){return`[
${r.map(o=>`${" ".repeat(t*2)}${e(o,t+1)},`).join(`
`)}
${" ".repeat((t-1)*2)}]`}function formatObject(r,t=1){const o=Object.create(null);for(const a in r)o[a]=e(r[a],t+1);return`{
${Object.entries(o).map(([a,n])=>`${" ".repeat(t*2)}${a}: ${n},`).join(`
`)}
${" ".repeat((t-1)*2)}}`}function formatMapData(r,t=1){const o=[...r].map(([a,n])=>onelineFormat(`{ ${e(a)} => ${e(n)} },`));return`Map(${o.length}) [
${" ".repeat(t*2)}${[...o].join(`
${" ".repeat(t*2)}`)}
${" ".repeat((t-1)*2)}]`}function formatSetData(r,t=1){const o=[...r].map(a=>e(a)).map(a=>`${" ".repeat(t*2)}${onelineFormat(a)},
`);return`Set(${o.length}) {
${o.join("")}${" ".repeat((t-1)*2)}}`}function hasDoubleByteChar(r){return r.length===1?r.charCodeAt(0)>255:/[^\x00-\xFF]/.test(r)}function joinContentInfo(r,t){return r.map(o=>`${o.text}${" ".repeat(Math.max(0,t-o.length))}`).join(`%c
%c`)}function getLineWidth(r){return r.length>1&&r.some(t=>t.hasChinese)?1e3:Math.max(10,Math.max(...r.map(t=>t.length)))}function getTrace(){const r=new Error(" ").stack;if(!r)return"";const t=r.split(`
`),o=t.findIndex(u=>u.includes("Proxy"))+1;if(!o)return"\u65E0\u6CD5\u6B63\u786E\u8BFB\u53D6\u4F4D\u7F6E\u8BF7\u4F7F\u7528\u5B9E\u4F8B\u8C03\u7528, \u5982\u9700\u89E3\u6784\u8BF7\u4F7F\u7528bind\u5C06this\u6307\u5411\u5B9E\u4F8B";const a=t[o],n=a.match(/at\s.*?\((.*?)\)/);return n?n[1]:a}function getContentInfo(r){return r.map(t=>c(t,void 0,!0)).join(" ").split(`
`).map(t=>{let o=0,a=!1;for(let n=0,u=t[n];n<t.length;u=t[++n])hasDoubleByteChar(u)?(o+=2,a=!0):o+=1;return{text:t,length:o,hasChinese:a}})}const fontStyle="line-height:1.5;",lineBreakStyle=`${fontStyle}`,defaultConf={info:{kind:"info",tagColor:"#000",tagBg:"#d9d9d9",contentColor:"#000",contentBg:"#fff",borderColor:"#d9d9d9"},warn:{kind:"warn",tagColor:"#fff",tagBg:"#fa8c16",contentColor:"#000",contentBg:"#fff",borderColor:"#fa8c16"},error:{kind:"error",tagColor:"#fff",tagBg:"#f5222d",contentColor:"#000",contentBg:"#fff",borderColor:"#f5222d"},debug:{kind:"debug",tagColor:"#fff",tagBg:"#eb2f96",contentColor:"#000",contentBg:"#fff",borderColor:"#eb2f96"},success:{kind:"success",tagColor:"#fff",tagBg:"#389e0d",contentColor:"#000",contentBg:"#fff",borderColor:"#389e0d"}};function generateLoggerConfig(r){const t={...defaultConf};return r&&Object.keys(r).sort().forEach(o=>{const a=r[o],{inherit:n,...u}=a;if(n){const i=t[n];Object.assign(a,{...i,...u})}o in t?Object.assign(t[o],a):t[o]=a}),t}function generateContentStyles(r,t){return r.length===1?[t]:r.map((o,a)=>a===0?[`${t}border-radius:0 0.4rem 0 0;`]:a===r.length-1?[lineBreakStyle,`${t}border-top:none;border-top-right-radius:0;`]:[lineBreakStyle,`${t}border-top:none;border-radius:0;`]).flat()}function generateMessage(r,t,o){const{needTrace:a,noOutput:n}=r,{kind:u,tagColor:i,tagBg:s,contentColor:h,contentBg:f,borderColor:b,style:g,noOutput:d=n,needTrace:m=a}=t;if(d)throw LogThrow.NO_OUTPUT;const B=`${u.toUpperCase()}`,p=getContentInfo(o),$=`${fontStyle}padding:0.1rem 0.4rem;border:0.1rem solid ${b};`,{tagStyle:y,contentStyle:O}=g?.(t)||{tagStyle:`${$}color:${i};background:${s};border-radius:0.4rem 0.4rem 0 0;`,contentStyle:`${$}margin-top:-0.12rem;color:${h};background:${f};border-radius:0 0.4rem 0.4rem;`},T=getLineWidth(p),S=generateContentStyles(p,O),j=joinContentInfo(p,T);let F=`%c${B}%c
%c${j}`;const k=[y,lineBreakStyle,...S];if(m){const w=getTrace(),x=`${y}margin-top:0.2rem;border-radius:0.4rem 0.4rem 0 0;`,D=`${O}`;F+=`%c
%cTRACE%c
%c${w}`,k.push(lineBreakStyle,x,lineBreakStyle,D)}return[F,...k]}const l=new WeakMap;function C(r){switch(r){case LogThrow.PREVENT_DEFAULT:case LogThrow.NO_OUTPUT:break;default:throw r}}const E={get(r,t,o){const{userOption:a={},conf:n}=l.get(r)||{};if(!n)throw new Error("illegal call");const{getPrintFunc:u=()=>console.log,printFunc:i,onLogBefore:s}=a||{},h=i||u.call(r,t);t in n||console.warn(`not found [${t}] logConfig, please add logConfig, currently using log replacement`);const f=n[t]||{...n.info,kind:t};return(...b)=>{let g=b;try{if(s){let m=!1;const{kind:B}=f,p={kind:B,messages:g,logConf:f,preventDefault:()=>m=!0,changeMessages:$=>g=$};if(s.call(r,p),m)throw LogThrow.PREVENT_DEFAULT}const d=generateMessage(r,f,g);h?.(...d)}catch(d){C(d)}}}};function createLogger(r){const{logConfig:t}=r||{},o={...r},a=generateLoggerConfig(t);return l.set(o,{userOption:o,conf:a}),new Proxy(o,E)}const logger=createLogger();exports.createLogger=createLogger,exports.logger=logger;