@cmtlyt/logger
Version:
1 lines • 2.14 kB
JavaScript
function e(e){return"object"==typeof e&&null!=e&&"function"==typeof e.then}function t(e,t){return(t.find(t=>"function"==typeof t(e))||(()=>null))(e)||(({type:e,messages:t})=>console.debug(e,...t))}function r(r){let o,n,a,{options:s,readyPromise:l}=function(t){var r;let o,n=[],a=((o={}).promise=new Promise((e,t)=>{o.resolve=e,o.reject=t}),o);if(null==t.outputAdapters)n=[],a.resolve();else if(Array.isArray(t.outputAdapters)){let r,o;o=Array((r=t.outputAdapters.filter(Boolean).slice()).length),(async()=>{try{for(let t=0;t<r.length;t++){let n=r[t];if("function"==typeof n)o[t]=n;else if(e(n)){let o=await n;if(e(o))throw TypeError("outputAdapters must not be nested promise");r[t--]=o}else o[t]=e=>n[e]}a.resolve()}catch(e){a.reject(e)}})(),n=o}else throw TypeError("outputAdapters must be an array");return{options:{enableOutput:null==(r=t.enableOutput)?()=>!0:"function"==typeof r?r:()=>r,outputAdapters:n,maxNestingDepth:t.maxNestingDepth||3,transform:t.transform||(()=>void 0),report:t.report||(()=>void 0)},readyPromise:a.promise}}(r||{}),u={options:s},i=(o=new Map,n=new Set,a=4,{func:(e,{options:r})=>{let s=r.maxNestingDepth;if(o.has(e))return o.get(e);let u=null,i=(t,o)=>{let n={type:e,messages:t,isNestingCall:o>0,timestamp:Date.now()},a=r.transform(n)||{};r.report({...n,data:a});let s=!0;try{s=r.enableOutput({...n,data:a})}catch(e){console.error(e),s=!0}if(s&&u)return u({type:e,messages:t,transformData:a})},p=e=>{console.warn(e),r.enableOutput=()=>!1},f=async(...o)=>{if(4===a&&(await l.catch(p).finally(()=>{a=0}),u=t(e,r.outputAdapters)),3&a)return 2&a?void t("warn",r.outputAdapters)({type:"warn",messages:[`最大嵌套深度 ${s} 已达到, 跳过调用, 请检查是否在 transform 和 report 中存在 logger 调用, 如果存在的话可以通过参数中的 isNestingCall 参数判断是否为嵌套调用`],transformData:{}}):void n.add(e=>i(o,e));a=1,i(o,0);for(let e=1;e<=s&&n.size;e++){let t=Array.from(n);n.clear(),e===s&&(a=2),t.forEach(t=>{t(e)})}a=0,n.clear()},c=(...e)=>void f(...e);return o.set(e,c),c}});return new Proxy({},{get:(e,t,r)=>Reflect.get(u,t,r)||i.func(t,u)})}export{r as createLogger};