UNPKG

koatty_logger

Version:
1 lines 51.3 kB
{"version":3,"sources":["../src/shield.ts","../src/logger.ts","../src/decorator.ts","../src/index.ts"],"names":["ShieldField","str","strArr","Object","assign","l","length","start","end","res","slice","join","num","Math","floor","mo","startNum","endNum","repeat","ShieldLog","splat","fields","keyName","depth","maxDepth","size","Array","isArray","map","item","undefined","isError","message","has","cloneSplat","create","getPrototypeOf","key","keys","combine","timestamp","printf","format","LogLevelObj","defaultLoggerOpt","File","level","filename","handleExceptions","json","datePattern","maxSize","colorize","Console","Logger","logLevel","enableLog","emptyObj","logger","transports","logFilePath","sensFields","Set","baseLogDir","path","resolve","process","cwd","batchConfig","enabled","flushInterval","maxWaitTime","logBuffer","flushTimer","lastFlushTime","Date","now","isDestroyed","opt","env","LOGS_LEVEL","toLowerCase","LOGS_PATH","isTrueEmpty","createLogger","startBatchTimer","enable","b","getLevel","setLevel","getLogFilePath","setLogFilePath","f","safePath","validateLogPath","close","getSensFields","setSensFields","clearSensFields","clear","resetSensFields","destroy","stopBatchTimer","flushBatch","catch","e","console","error","enableBatch","setBatchConfig","config","wasEnabled","getBatchConfig","getBatchStatus","bufferSize","timeSinceLastFlush","logsToFlush","Promise","setImmediate","forEach","entry","writeLogEntry","clearInterval","setInterval","addToBuffer","name","args","logEntry","push","logName","toUpperCase","sanitizedArgs","arg","sanitizeInput","unshift","input","replace","logPath","Error","normalizedPath","normalize","includes","isAbsolute","resolvedPath","startsWith","test","Debug","printLog","debug","Info","info","Warn","warn","Fatal","exit","fatal","Log","log","writeLogAsync","reject","label","params","util","apply","stack","trans","DailyRotateFile","levels","defaultLoggerInstance","getDefaultLogger","LOG_DECORATOR_TYPE","customLoggerCache","WeakMap","getOrCreateCustomLogger","ctor","propertyName","get","Map","set","logPropertyWrapper","_originalDescriptor","target","String","privateKey","value","enumerable","configurable","storedPropertyManager","registerLogDecorator","propertyManager","registerWrapper","unregisterLogDecorator","createDualField","legacyHandler","tc39Handler","options","propertyKey","pm","registerDecorator","wrapperTypes","context","fieldName","addInitializer","proto","DefaultLogger"],"mappings":";;;;;;;;;;;;;;;AAsBO,SAASA,YAAYC,GAAAA,EAAW;AACrC,EAAA,MAAMC,MAAAA,GAASC,MAAAA,CAAOC,MAAAA,CAAO,IAAIH,GAAAA,CAAAA;AACjC,EAAA,MAAMI,IAAIH,MAAAA,CAAOI,MAAAA;AACjB,EAAA,IAAIC,OAAOC,GAAAA,EAAKC,GAAAA;AAChB,EAAA,IAAIJ,KAAK,CAAA,EAAG;AACVE,IAAAA,KAAAA,GAAQ,GAAA;AACRC,IAAAA,GAAAA,GAAM,EAAA;AACNC,IAAAA,GAAAA,GAAM,GAAA;AACR,EAAA,CAAA,MAAA,IAAWJ,KAAK,CAAA,EAAG;AACjBE,IAAAA,KAAAA,GAAQL,MAAAA,CAAOQ,KAAAA,CAAM,CAAA,CAAA,CAAGC,KAAK,EAAA,CAAA;AAC7BH,IAAAA,GAAAA,GAAM,GAAA;AACNC,IAAAA,GAAAA,GAAM,CAAA,EAAGF,KAAAA,CAAAA,EAAQC,GAAAA,CAAAA,CAAAA;EACnB,CAAA,MAAO;AACL,IAAA,IAAII,GAAAA,GAAMC,IAAAA,CAAKC,KAAAA,CAAMT,CAAAA,GAAI,CAAA,CAAA;AACzB,IAAA,MAAMU,EAAAA,GAAKF,IAAAA,CAAKC,KAAAA,CAAMT,CAAAA,GAAI,CAAA,CAAA;AAC1B,IAAA,IAAIW,QAAAA,GAAWJ,GAAAA;AACf,IAAA,IAAIG,KAAK,CAAA,EAAG;AACVH,MAAAA,GAAAA,GAAMA,GAAAA,GAAM,CAAA;AACd,IAAA;AACA,IAAA,IAAII,WAAW,CAAA,EAAG;AAChBJ,MAAAA,GAAAA,GAAMA,OAAOI,QAAAA,GAAW,CAAA,CAAA;AACxBA,MAAAA,QAAAA,GAAW,CAAA;AACb,IAAA;AACA,IAAA,MAAMC,MAAAA,GAASZ,IAAIO,GAAAA,GAAMI,QAAAA;AACzB,IAAA,IAAIC,SAAS,CAAA,EAAG;AACdL,MAAAA,GAAAA,GAAMA,OAAOK,MAAAA,GAAS,CAAA,CAAA;AAExB,IAAA;AAEAV,IAAAA,KAAAA,GAAQL,OAAOQ,KAAAA,CAAM,CAAA,EAAGM,QAAAA,CAAAA,CAAUL,KAAK,EAAA,CAAA;AACvCH,IAAAA,GAAAA,GAAMN,OAAOQ,KAAAA,CAAME,GAAAA,GAAMI,QAAAA,CAAAA,CAAUL,KAAK,EAAA,CAAA;AACxCF,IAAAA,GAAAA,GAAM,CAAA,EAAGF,KAAAA,CAAAA,EAAQ,GAAA,CAAIW,OAAON,GAAAA,CAAAA,GAAOJ,GAAAA,CAAAA,CAAAA;AACrC,EAAA;AACA,EAAA,OAAO;AAAEC,IAAAA,GAAAA;AAAKF,IAAAA,KAAAA;AAAOC,IAAAA;AAAI,GAAA;AAC3B;AAlCgBR,MAAAA,CAAAA,WAAAA,EAAAA,aAAAA,CAAAA;AA+CT,SAASmB,UAAUC,KAAAA,EAAYC,MAAAA,EAAqBC,SAAkBC,KAAAA,GAAgB,CAAA,EAAGC,WAAmB,EAAA,EAAE;AACnH,EAAA,IAAIH,MAAAA,CAAOI,SAAS,CAAA,EAAG;AACrB,IAAA,OAAOL,KAAAA;AACT,EAAA;AACA,EAAA,IAAI,CAACA,OAAO,OAAOA,KAAAA;AAGnB,EAAA,IAAIG,QAAQC,QAAAA,EAAU;AACpB,IAAA,OAAO,oBAAA;AACT,EAAA;AAEA,EAAA,IAAIE,KAAAA,CAAMC,OAAAA,CAAQP,KAAAA,CAAAA,EAAQ;AAExB,IAAA,OAAOA,KAAAA,CAAMQ,GAAAA,CAAIC,CAAAA,IAAAA,KAAQV,SAAAA,CAAUU,IAAAA,EAAMR,MAAAA,EAAQS,MAAAA,EAAWP,KAAAA,GAAQ,CAAA,EAAGC,QAAAA,CAAAA,CAAAA;AACzE,EAAA;AAEA,EAAA,IAAWO,MAAAA,CAAAA,OAAAA,CAAQX,KAAAA,CAAAA,EAAQ;AACzB,IAAA,OAAOA,KAAAA,CAAMY,OAAAA;AACf,EAAA;AACA,EAAA,IAAI,OAAOZ,UAAU,QAAA,EAAU;AAC7B,IAAA,IAAIC,MAAAA,CAAOY,GAAAA,CAAIX,OAAAA,IAAW,EAAA,CAAA,EAAK;AAC7B,MAAA,OAAOtB,WAAAA,CAAYoB,KAAAA,CAAAA,CAAOX,GAAAA;AAC5B,IAAA;AACA,IAAA,OAAO,GAAGW,KAAAA,CAAAA,CAAAA;AACZ,EAAA;AAGA,EAAA,MAAMc,aAAa/B,MAAAA,CAAOgC,MAAAA,CAAOhC,MAAAA,CAAOiC,cAAAA,CAAehB,KAAAA,CAAAA,CAAAA;AAGvD,EAAA,KAAA,MAAWiB,GAAAA,IAAOlC,MAAAA,CAAOmC,IAAAA,CAAKlB,KAAAA,CAAAA,EAAQ;AAEpCc,IAAAA,UAAAA,CAAWG,GAAAA,CAAAA,GAAOlB,SAAAA,CAAUC,KAAAA,CAAMiB,GAAAA,GAAMhB,MAAAA,EAAQgB,GAAAA,EAAKd,KAAAA,GAAQ,CAAA,EAAGC,QAAAA,CAAAA;AAClE,EAAA;AAEA,EAAA,OAAOU,UAAAA;AACT;AApCgBf,MAAAA,CAAAA,SAAAA,EAAAA,WAAAA,CAAAA;ACtDhB,IAAM,EAAEoB,OAAAA,EAASC,SAAAA,EAAWC,MAAAA,EAAM,GAAKC,MAAAA;AAEvC,IAAMC,WAAAA,GAAmB;EACvB,OAAA,EAAS,CAAA;EACT,MAAA,EAAQ,CAAA;EACR,MAAA,EAAQ,CAAA;EACR,OAAA,EAAS;AACX,CAAA;AASA,IAAMC,gBAAAA,GAAmB;EACvBC,IAAAA,EAAM;IACJC,KAAAA,EAAO,MAAA;IACPC,QAAAA,EAAU,gBAAA;IACVC,gBAAAA,EAAkB,IAAA;IAClBC,IAAAA,EAAM,IAAA;IACNC,WAAAA,EAAa,eAAA;;IAEbC,OAAAA,EAAS,KAAA;;IAETC,QAAAA,EAAU,KAAA;IACVZ,SAAAA,EAAW;AACb,GAAA;EACAa,OAAAA,EAAS;IACPP,KAAAA,EAAO,OAAA;IACPE,gBAAAA,EAAkB,IAAA;IAClBC,IAAAA,EAAM,IAAA;IACNG,QAAAA,EAAU,IAAA;IACVZ,SAAAA,EAAW;AACb;AACF,CAAA;AAOO,IAAMc,SAAN,MAAMA;EA1Db;;;;EA4DUC,QAAAA,GAAyB,OAAA;;EAEzBC,SAAAA,GAAY,IAAA;;AAEZC,EAAAA,QAAAA,GAAgB,EAAC;AACjBC,EAAAA,MAAAA;AACAC,EAAAA,UAAAA,GAAuB,EAAC;;EAExBC,WAAAA,GAAc,EAAA;;AAEdC,EAAAA,UAAAA,uBAA8BC,GAAAA,EAAAA;;AAErBC,EAAAA,UAAAA,GAAaC,IAAAA,CAAKC,OAAAA,CAAQC,OAAAA,CAAQC,GAAAA,IAAO,MAAA,CAAA;;EAGlDC,WAAAA,GAA2B;IACjCC,OAAAA,EAAS,KAAA;IACTlB,OAAAA,EAAS,GAAA;IACTmB,aAAAA,EAAe,GAAA;IACfC,WAAAA,EAAa;;AACf,GAAA;AACQC,EAAAA,SAAAA,GAAwB,EAAA;EACxBC,UAAAA,GAAoC,IAAA;AACpCC,EAAAA,aAAAA,GAAwBC,KAAKC,GAAAA,EAAG;EAChCC,WAAAA,GAAuB,KAAA;;;;;;AAO/B,EAAA,WAAA,CAAYC,GAAAA,EAAiB;AAC3B,IAAA,MAAMhC,KAAAA,GAAAA,CAASoB,OAAAA,CAAQa,GAAAA,CAAIC,UAAAA,IAAc,IAAIC,WAAAA,EAAW;AACxD,IAAA,IAAInC,KAAAA,IAASH,WAAAA,CAAYG,KAAAA,CAAAA,KAAWhB,MAAAA,EAAW;AAC7C,MAAA,IAAA,CAAKyB,QAAAA,GAAyBT,KAAAA;AAChC,IAAA;AAEA,IAAA,IAAIoB,OAAAA,CAAQa,IAAIG,SAAAA,EAAW;AACzB,MAAA,IAAA,CAAKtB,WAAAA,GAAcM,QAAQa,GAAAA,CAAIG,SAAAA;AACjC,IAAA;AACA,IAAA,IAAI,CAAQC,MAAAA,CAAAA,WAAAA,CAAYL,GAAAA,CAAAA,IAAQA,GAAAA,EAAK;AACnC,MAAA,IAAA,CAAKvB,QAAAA,GAAWuB,GAAAA,CAAIvB,QAAAA,IAAY,IAAA,CAAKA,QAAAA;AACrC,MAAA,IAAA,CAAKK,WAAAA,GAAckB,GAAAA,CAAIlB,WAAAA,IAAe,IAAA,CAAKA,WAAAA;AAC3C,MAAA,IAAA,CAAKC,UAAAA,GAAaiB,GAAAA,CAAIjB,UAAAA,IAAc,IAAA,CAAKA,UAAAA;AAGzC,MAAA,IAAIiB,IAAIV,WAAAA,EAAa;AACnB,QAAA,IAAA,CAAKA,WAAAA,GAAc;AAAE,UAAA,GAAG,IAAA,CAAKA,WAAAA;AAAa,UAAA,GAAGU,GAAAA,CAAIV;AAAY,SAAA;AAC/D,MAAA;AACF,IAAA;AAEA,IAAA,IAAA,CAAKV,MAAAA,GAAS,KAAK0B,YAAAA,EAAY;AAG/B,IAAA,IAAI,IAAA,CAAKhB,YAAYC,OAAAA,EAAS;AAC5B,MAAA,IAAA,CAAKgB,eAAAA,EAAe;AACtB,IAAA;AACF,EAAA;;;;AAKOC,EAAAA,MAAAA,CAAOC,IAAI,IAAA,EAAM;AACtB,IAAA,IAAA,CAAK/B,SAAAA,GAAY+B,CAAAA;AACnB,EAAA;;;;EAKOC,QAAAA,GAAyB;AAC9B,IAAA,OAAO,IAAA,CAAKjC,QAAAA;AACd,EAAA;;;;AAKOkC,EAAAA,QAAAA,CAAS3C,KAAAA,EAAqB;AACnC,IAAA,IAAA,CAAKS,QAAAA,GAAWT,KAAAA;AAChB,IAAA,IAAI,IAAA,CAAKa,WAAWN,OAAAA,EAAS;AAC3B,MAAA,IAAA,CAAKM,UAAAA,CAAWN,QAAQP,KAAAA,GAAQA,KAAAA;AAClC,IAAA;AACA,IAAA,IAAI,IAAA,CAAKa,WAAWd,IAAAA,EAAM;AACxB,MAAA,IAAA,CAAKc,UAAAA,CAAWd,KAAKC,KAAAA,GAAQA,KAAAA;AAC/B,IAAA;AACF,EAAA;;;;EAKO4C,cAAAA,GAAiB;AACtB,IAAA,OAAO,IAAA,CAAK9B,WAAAA;AACd,EAAA;;;;AAKO+B,EAAAA,cAAAA,CAAeC,CAAAA,EAAW;AAE/B,IAAA,MAAMC,QAAAA,GAAW,IAAA,CAAKC,eAAAA,CAAgBF,CAAAA,CAAAA;AACtC,IAAA,IAAA,CAAKhC,WAAAA,GAAciC,QAAAA;AACnB,IAAA,IAAA,CAAKnC,OAAOqC,KAAAA,EAAK;AACjB,IAAA,IAAA,CAAKrC,MAAAA,GAAS,KAAK0B,YAAAA,EAAY;AACjC,EAAA;;;;EAKOY,aAAAA,GAAgB;AACrB,IAAA,OAAO,IAAA,CAAKnC,UAAAA;AACd,EAAA;;;;AAKOoC,EAAAA,aAAAA,CAAc5E,MAAAA,EAAkB;AACrC,IAAA,IAAA,CAAKwC,UAAAA,uBAAiBC,GAAAA,CAAI;SAAI,IAAA,CAAKD,UAAAA;AAAexC,MAAAA,GAAAA;AAAO,KAAA,CAAA;AAC3D,EAAA;;;;EAKO6E,eAAAA,GAAkB;AACvB,IAAA,IAAA,CAAKrC,WAAWsC,KAAAA,EAAK;AACvB,EAAA;;;;AAKOC,EAAAA,eAAAA,CAAgB/E,MAAAA,EAAkB;AACvC,IAAA,IAAA,CAAKwC,WAAWsC,KAAAA,EAAK;AACrB,IAAA,IAAA,CAAKtC,UAAAA,GAAa,IAAIC,GAAAA,CAAIzC,MAAAA,CAAAA;AAC5B,EAAA;;;;EAKOgF,OAAAA,GAAU;AACf,IAAA,IAAI;AACF,MAAA,IAAA,CAAKxB,WAAAA,GAAc,IAAA;AAGnB,MAAA,IAAA,CAAKyB,cAAAA,EAAc;AAGnB,MAAA,IAAI,IAAA,CAAK9B,SAAAA,CAAUlE,MAAAA,GAAS,CAAA,EAAG;AAC7B,QAAA,IAAA,CAAKiG,UAAAA,EAAU,CAAGC,KAAAA,CAAMC,CAAAA,CAAAA,KAAAA;AACtBC,UAAAA,OAAAA,CAAQC,KAAAA,CAAM,uCAAuCF,CAAAA,CAAAA;QACvD,CAAA,CAAA;AACF,MAAA;AAGA,MAAA,IAAI,KAAK/C,MAAAA,EAAQ;AACf,QAAA,IAAA,CAAKA,OAAOqC,KAAAA,EAAK;AACnB,MAAA;AAGA,MAAA,IAAA,CAAKlC,WAAWsC,KAAAA,EAAK;AACrB,MAAA,IAAA,CAAKxC,aAAa,EAAC;AACnB,MAAA,IAAA,CAAKH,SAAAA,GAAY,KAAA;AACjB,MAAA,IAAA,CAAKgB,YAAY,EAAA;AACnB,IAAA,CAAA,CAAA,OAASiC,CAAAA,EAAG;AACVC,MAAAA,OAAAA,CAAQC,KAAAA,CAAM,4BAA4BF,CAAAA,CAAAA;AAC5C,IAAA;AACF,EAAA;;;;AAKOG,EAAAA,WAAAA,CAAYvC,UAAmB,IAAA,EAAM;AAC1C,IAAA,IAAIA,OAAAA,IAAW,CAAC,IAAA,CAAKD,WAAAA,CAAYC,OAAAA,EAAS;AACxC,MAAA,IAAA,CAAKD,YAAYC,OAAAA,GAAU,IAAA;AAC3B,MAAA,IAAA,CAAKgB,eAAAA,EAAe;AACtB,IAAA,CAAA,MAAA,IAAW,CAAChB,OAAAA,IAAW,IAAA,CAAKD,WAAAA,CAAYC,OAAAA,EAAS;AAC/C,MAAA,IAAA,CAAKD,YAAYC,OAAAA,GAAU,KAAA;AAC3B,MAAA,IAAA,CAAKiC,cAAAA,EAAc;AAEnB,MAAA,IAAA,CAAKC,UAAAA,EAAU,CAAGC,KAAAA,CAAMC,CAAAA,CAAAA,KAAAA;AACtBC,QAAAA,OAAAA,CAAQC,KAAAA,CAAM,6CAA6CF,CAAAA,CAAAA;MAC7D,CAAA,CAAA;AACF,IAAA;AACF,EAAA;;;;AAKOI,EAAAA,cAAAA,CAAeC,MAAAA,EAA8B;AAClD,IAAA,MAAMC,UAAAA,GAAa,KAAK3C,WAAAA,CAAYC,OAAAA;AACpC,IAAA,IAAA,CAAKD,WAAAA,GAAc;AAAE,MAAA,GAAG,IAAA,CAAKA,WAAAA;MAAa,GAAG0C;AAAO,KAAA;AAGpD,IAAA,IAAI,IAAA,CAAK1C,WAAAA,CAAYC,OAAAA,IAAW0C,UAAAA,EAAY;AAC1C,MAAA,IAAA,CAAKT,cAAAA,EAAc;AACnB,MAAA,IAAA,CAAKjB,eAAAA,EAAe;AACtB,IAAA,CAAA,MAAA,IAAW,IAAA,CAAKjB,WAAAA,CAAYC,OAAAA,IAAW,CAAC0C,UAAAA,EAAY;AAClD,MAAA,IAAA,CAAK1B,eAAAA,EAAe;AACtB,IAAA,CAAA,MAAA,IAAW,CAAC,IAAA,CAAKjB,WAAAA,CAAYC,OAAAA,IAAW0C,UAAAA,EAAY;AAClD,MAAA,IAAA,CAAKT,cAAAA,EAAc;AACnB,MAAA,IAAA,CAAKC,UAAAA,EAAU,CAAGC,KAAAA,CAAMC,CAAAA,CAAAA,KAAAA;AACtBC,QAAAA,OAAAA,CAAQC,KAAAA,CAAM,wDAAwDF,CAAAA,CAAAA;MACxE,CAAA,CAAA;AACF,IAAA;AACF,EAAA;;;;EAKOO,cAAAA,GAA8B;AACnC,IAAA,OAAO;AAAE,MAAA,GAAG,IAAA,CAAK5C;AAAY,KAAA;AAC/B,EAAA;;;;EAKO6C,cAAAA,GAAiB;AACtB,IAAA,OAAO;MACL5C,OAAAA,EAAS,IAAA,CAAKD,YAAYC,OAAAA,IAAW,KAAA;AACrC6C,MAAAA,UAAAA,EAAY,KAAK1C,SAAAA,CAAUlE,MAAAA;AAC3B6C,MAAAA,OAAAA,EAAS,KAAKiB,WAAAA,CAAYjB,OAAAA;MAC1BgE,kBAAAA,EAAoBxC,IAAAA,CAAKC,GAAAA,EAAG,GAAK,IAAA,CAAKF;AACxC,KAAA;AACF,EAAA;;;;AAKA,EAAA,MAAa6B,UAAAA,GAA4B;AACvC,IAAA,IAAI,IAAA,CAAK/B,SAAAA,CAAUlE,MAAAA,KAAW,CAAA,IAAK,KAAKuE,WAAAA,EAAa;AACnD,MAAA;AACF,IAAA;AAEA,IAAA,MAAMuC,WAAAA,GAAc;SAAI,IAAA,CAAK5C;;AAC7B,IAAA,IAAA,CAAKA,YAAY,EAAA;AACjB,IAAA,IAAA,CAAKE,aAAAA,GAAgBC,KAAKC,GAAAA,EAAG;AAG7B,IAAA,OAAO,IAAIyC,OAAAA,CAAc,CAACpD,OAAAA,KAAAA;AACxBqD,MAAAA,YAAAA,CAAa,MAAA;AACX,QAAA,IAAI;AAEFF,UAAAA,WAAAA,CAAYG,OAAAA,CAAQC,CAAAA,KAAAA,KAAAA;AAClB,YAAA,IAAA,CAAKC,cAAcD,KAAAA,CAAAA;UACrB,CAAA,CAAA;AACAvD,UAAAA,OAAAA,EAAAA;AACF,QAAA,CAAA,CAAA,OAASwC,CAAAA,EAAG;AACVC,UAAAA,OAAAA,CAAQC,KAAAA,CAAM,yBAAyBF,CAAAA,CAAAA;AACvCxC,UAAAA,OAAAA,EAAAA;AACF,QAAA;MACF,CAAA,CAAA;IACF,CAAA,CAAA;AACF,EAAA;;;;EAKQoB,eAAAA,GAAkB;AACxB,IAAA,IAAI,KAAKZ,UAAAA,EAAY;AACnBiD,MAAAA,aAAAA,CAAc,KAAKjD,UAAU,CAAA;AAC/B,IAAA;AAEA,IAAA,IAAA,CAAKA,UAAAA,GAAakD,YAAY,MAAA;AAC5B,MAAA,MAAM/C,GAAAA,GAAMD,KAAKC,GAAAA,EAAG;AACpB,MAAA,MAAMuC,kBAAAA,GAAqBvC,MAAM,IAAA,CAAKF,aAAAA;AAGtC,MAAA,IAAI,IAAA,CAAKF,SAAAA,CAAUlE,MAAAA,GAAS,CAAA,KACzB6G,kBAAAA,IAAsB,IAAA,CAAK/C,WAAAA,CAAYG,WAAAA,IACtC,IAAA,CAAKC,SAAAA,CAAUlE,MAAAA,IAAU,IAAA,CAAK8D,YAAYjB,OAAAA,CAAAA,EAAW;AAEvD,QAAA,IAAA,CAAKoD,UAAAA,EAAU,CAAGC,KAAAA,CAAMC,CAAAA,CAAAA,KAAAA;AACtBC,UAAAA,OAAAA,CAAQC,KAAAA,CAAM,yBAAyBF,CAAAA,CAAAA;QACzC,CAAA,CAAA;AACF,MAAA;IACF,CAAA,EAAG,IAAA,CAAKrC,YAAYE,aAAa,CAAA;AACnC,EAAA;;;;EAKQgC,cAAAA,GAAiB;AACvB,IAAA,IAAI,KAAK7B,UAAAA,EAAY;AACnBiD,MAAAA,aAAAA,CAAc,KAAKjD,UAAU,CAAA;AAC7B,MAAA,IAAA,CAAKA,UAAAA,GAAa,IAAA;AACpB,IAAA;AACF,EAAA;;;;EAKQmD,WAAAA,CAAY9E,KAAAA,EAAqB+E,MAAcC,IAAAA,EAAa;AAClE,IAAA,IAAI,KAAKjD,WAAAA,EAAa;AACpB,MAAA;AACF,IAAA;AAEA,IAAA,MAAMkD,QAAAA,GAAqB;AACzBjF,MAAAA,KAAAA;AACA+E,MAAAA,IAAAA;AACAC,MAAAA,IAAAA;AACAtF,MAAAA,SAAAA,EAAWmC,KAAKC,GAAAA;AAClB,KAAA;AAEA,IAAA,IAAA,CAAKJ,SAAAA,CAAUwD,KAAKD,QAAAA,CAAAA;AAGpB,IAAA,IAAI,IAAA,CAAKvD,SAAAA,CAAUlE,MAAAA,IAAU,IAAA,CAAK8D,YAAYjB,OAAAA,EAAU;AACtD,MAAA,IAAA,CAAKoD,UAAAA,EAAU,CAAGC,KAAAA,CAAMC,CAAAA,CAAAA,KAAAA;AACtBC,QAAAA,OAAAA,CAAQC,KAAAA,CAAM,6BAA6BF,CAAAA,CAAAA;MAC7C,CAAA,CAAA;AACF,IAAA;AACF,EAAA;;;;AAKQgB,EAAAA,aAAAA,CAAcD,KAAAA,EAAiB;AACrC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE1E,KAAAA,EAAO+E,IAAAA,EAAMC,IAAAA,EAAI,GAAKN,KAAAA;AAC9B,MAAA,MAAMS,UAAUJ,IAAAA,KAAS,EAAA,GAAKA,KAAKK,WAAAA,EAAW,GAAKpF,MAAMoF,WAAAA,EAAW;AAGpE,MAAA,MAAMC,aAAAA,GAAgBL,KAAKlG,GAAAA,CAAIwG,CAAAA,QAAO,IAAA,CAAKC,aAAAA,CAAcD,GAAAA,CAAAA,CAAAA;AAGzDD,MAAAA,aAAAA,CAAcG,QAAQL,OAAAA,CAAAA;AAGtB,MAAA,IAAA,CAAKvE,MAAAA,CAAOZ,KAAAA,CAAAA,CAAOqF,aAAAA,CAAAA;AACrB,IAAA,CAAA,CAAA,OAAS1B,CAAAA,EAAG;AACVC,MAAAA,OAAAA,CAAQC,KAAAA,CAAM,4BAA4BF,CAAAA,CAAAA;AAC5C,IAAA;AACF,EAAA;;;;AAKQ4B,EAAAA,aAAAA,CAAcE,KAAAA,EAAiB;AACrC,IAAA,IAAI,OAAOA,UAAU,QAAA,EAAU;AAE7B,MAAA,OAAOA,KAAAA,CAAMC,OAAAA,CAAQ,wBAAA,EAA0B,GAAA,CAAA;AACjD,IAAA;AACA,IAAA,OAAOD,KAAAA;AACT,EAAA;;;;AAKQzC,EAAAA,eAAAA,CAAgB2C,OAAAA,EAAyB;AAC/C,IAAA,IAAI,CAACA,OAAAA,EAAS;AACZ,MAAA,MAAM,IAAIC,MAAM,0BAAA,CAAA;AAClB,IAAA;AAEA,IAAA,MAAMC,cAAAA,GAAiB3E,IAAAA,CAAK4E,SAAAA,CAAUH,OAAAA,CAAAA;AAEtC,IAAA,IAAIE,cAAAA,CAAeE,QAAAA,CAAS,IAAA,CAAA,EAAO;AACjC,MAAA,MAAM,IAAIH,MAAM,oDAAA,CAAA;AAClB,IAAA;AAEA,IAAA,IAAI,CAAC1E,IAAAA,CAAK8E,UAAAA,CAAWH,cAAAA,CAAAA,EAAiB;AACpC,MAAA,MAAMI,YAAAA,GAAe/E,IAAAA,CAAKC,OAAAA,CAAQ,IAAA,CAAKF,YAAY4E,cAAAA,CAAAA;AACnD,MAAA,IAAI,CAACI,YAAAA,CAAaC,UAAAA,CAAW,IAAA,CAAKjF,UAAU,CAAA,EAAG;AAC7C,QAAA,MAAM,IAAI2E,KAAAA,CAAM,CAAA,iCAAA,EAAoC,IAAA,CAAK3E,UAAU,CAAA,CAAE,CAAA;AACvE,MAAA;AACA,MAAA,IAAI,oBAAA,CAAqBkF,IAAAA,CAAKN,cAAAA,CAAAA,EAAiB;AAC7C,QAAA,MAAM,IAAID,MAAM,sCAAA,CAAA;AAClB,MAAA;AACA,MAAA,OAAOK,YAAAA;AACT,IAAA;AAEA,IAAA,IAAI,kBAAA,CAAmBE,IAAAA,CAAKN,cAAAA,CAAAA,EAAiB;AAC3C,MAAA,MAAM,IAAID,MAAM,sCAAA,CAAA;AAClB,IAAA;AAEA,IAAA,OAAOC,cAAAA;AACT,EAAA;;;;;;;AAQOO,EAAAA,KAAAA,CAAAA,GAASpB,IAAAA,EAAa;AAC3B,IAAA,OAAO,IAAA,CAAKqB,QAAAA,CAAS,OAAA,EAAS,EAAA,EAAIrB,IAAAA,CAAAA;AACpC,EAAA;;;;AAKOsB,EAAAA,KAAAA,CAAAA,GAAStB,IAAAA,EAAa;AAC3B,IAAA,OAAO,IAAA,CAAKqB,QAAAA,CAAS,OAAA,EAAS,EAAA,EAAIrB,IAAAA,CAAAA;AACpC,EAAA;;;;;;;AAQOuB,EAAAA,IAAAA,CAAAA,GAAQvB,IAAAA,EAAa;AAC1B,IAAA,OAAO,IAAA,CAAKqB,QAAAA,CAAS,MAAA,EAAQ,EAAA,EAAIrB,IAAAA,CAAAA;AACnC,EAAA;;;;AAKOwB,EAAAA,IAAAA,CAAAA,GAAQxB,IAAAA,EAAa;AAC1B,IAAA,OAAO,IAAA,CAAKqB,QAAAA,CAAS,MAAA,EAAQ,EAAA,EAAIrB,IAAAA,CAAAA;AACnC,EAAA;;;;;;;AAQOyB,EAAAA,IAAAA,CAAAA,GAAQzB,IAAAA,EAAa;AAC1B,IAAA,OAAO,IAAA,CAAKqB,QAAAA,CAAS,MAAA,EAAQ,EAAA,EAAIrB,IAAAA,CAAAA;AACnC,EAAA;;;;AAKO0B,EAAAA,IAAAA,CAAAA,GAAQ1B,IAAAA,EAAa;AAC1B,IAAA,OAAO,IAAA,CAAKqB,QAAAA,CAAS,MAAA,EAAQ,EAAA,EAAIrB,IAAAA,CAAAA;AACnC,EAAA;;;;;;;AAQOY,EAAAA,KAAAA,CAAAA,GAASZ,IAAAA,EAAa;AAC3B,IAAA,OAAO,IAAA,CAAKqB,QAAAA,CAAS,OAAA,EAAS,EAAA,EAAIrB,IAAAA,CAAAA;AACpC,EAAA;;;;AAIOnB,EAAAA,KAAAA,CAAAA,GAASmB,IAAAA,EAAa;AAC3B,IAAA,OAAO,IAAA,CAAKqB,QAAAA,CAAS,OAAA,EAAS,EAAA,EAAIrB,IAAAA,CAAAA;AACpC,EAAA;;;;;;;;AASO2B,EAAAA,KAAAA,CAAAA,GAAS3B,IAAAA,EAAa;AAE3B,IAAA,IAAI,IAAA,CAAK1D,YAAYC,OAAAA,EAAS;AAC5B,MAAA,IAAA,CAAKkC,UAAAA,EAAU,CAAGC,KAAAA,CAAM,MAAA;MAAO,CAAA,CAAA;AACjC,IAAA;AAEAE,IAAAA,OAAAA,CAAQC,KAAAA,CAAM,wBAAA,EAAA,GAA6BmB,IAAAA,CAAAA;AAC3C,IAAA,IAAA,CAAKqB,QAAAA,CAAS,OAAA,EAAS,OAAA,EAASrB,IAAAA,CAAAA;AAEhCR,IAAAA,YAAAA,CAAa,MAAMpD,OAAAA,CAAQwF,IAAAA,CAAK,CAAA,CAAA,CAAA;AAClC,EAAA;;;;AAIOC,EAAAA,KAAAA,CAAAA,GAAS7B,IAAAA,EAAa;AAE3B,IAAA,IAAI,IAAA,CAAK1D,YAAYC,OAAAA,EAAS;AAC5B,MAAA,IAAA,CAAKkC,UAAAA,EAAU,CAAGC,KAAAA,CAAM,MAAA;MAAO,CAAA,CAAA;AACjC,IAAA;AAEAE,IAAAA,OAAAA,CAAQC,KAAAA,CAAM,wBAAA,EAAA,GAA6BmB,IAAAA,CAAAA;AAC3C,IAAA,IAAA,CAAKqB,QAAAA,CAAS,OAAA,EAAS,OAAA,EAASrB,IAAAA,CAAAA;AAEhCR,IAAAA,YAAAA,CAAa,MAAMpD,OAAAA,CAAQwF,IAAAA,CAAK,CAAA,CAAA,CAAA;AAClC,EAAA;;;;;;;;;;;;;;AAeOE,EAAAA,GAAAA,CAAI/B,SAAgCC,IAAAA,EAAa;AAEtD,IAAA,IAAIhF,KAAAA,GAAQ,MAAA;AACZ,IAAA,IAAIH,WAAAA,CAAYkF,IAAAA,CAAAA,KAAU/F,MAAAA,EAAW;AACnCgB,MAAAA,KAAAA,GAAQ+E,IAAAA;AACRA,MAAAA,IAAAA,GAAO,EAAA;AACT,IAAA;AACA,IAAA,OAAO,IAAA,CAAKsB,QAAAA,CAAuBrG,KAAAA,EAAO+E,IAAAA,EAAMC,IAAAA,CAAAA;AAClD,EAAA;;;;AAKO+B,EAAAA,GAAAA,CAAIhC,SAAgCC,IAAAA,EAAa;AACtD,IAAA,IAAIhF,KAAAA,GAAQ,MAAA;AACZ,IAAA,IAAIH,WAAAA,CAAYkF,IAAAA,CAAAA,KAAU/F,MAAAA,EAAW;AACnCgB,MAAAA,KAAAA,GAAQ+E,IAAAA;AACRA,MAAAA,IAAAA,GAAO,EAAA;AACT,IAAA;AACA,IAAA,OAAO,IAAA,CAAKsB,QAAAA,CAAuBrG,KAAAA,EAAO+E,IAAAA,EAAMC,IAAAA,CAAAA;AAClD,EAAA;;;;;;;;;;EAWQqB,QAAAA,CAASrG,KAAAA,EAAqB+E,MAAcC,IAAAA,EAAa;AAC/D,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,IAAA,CAAKtE,SAAAA,IAAa,IAAA,CAAKqB,WAAAA,EAAa;AACvC,QAAA;AACF,MAAA;AAGA,MAAA,IAAI,IAAA,CAAKT,YAAYC,OAAAA,EAAS;AAC5B,QAAA,IAAA,CAAKuD,WAAAA,CAAY9E,KAAAA,EAAO+E,IAAAA,EAAMC,IAAAA,CAAAA;MAChC,CAAA,MAAO;AAEL,QAAA,IAAA,CAAKgC,aAAAA,CAAchH,KAAAA,EAAO+E,IAAAA,EAAMC,IAAAA,CAAAA;AAClC,MAAA;AACF,IAAA,CAAA,CAAA,OAASrB,CAAAA,EAAG;AACVC,MAAAA,OAAAA,CAAQC,KAAAA,CAAM,sBAAsBF,CAAAA,CAAAA;AACtC,IAAA;AACF,EAAA;;;;EAKA,MAAcqD,aAAAA,CAAchH,KAAAA,EAAqB+E,IAAAA,EAAcC,IAAAA,EAAa;AAC1E,IAAA,IAAI;AACF,MAAA,MAAMG,UAAUJ,IAAAA,KAAS,EAAA,GAAKA,KAAKK,WAAAA,EAAW,GAAKpF,MAAMoF,WAAAA,EAAW;AAGpE,MAAA,MAAMC,aAAAA,GAAgBL,KAAKlG,GAAAA,CAAIwG,CAAAA,QAAO,IAAA,CAAKC,aAAAA,CAAcD,GAAAA,CAAAA,CAAAA;AAGzDD,MAAAA,aAAAA,CAAcG,QAAQL,OAAAA,CAAAA;AAGtB,MAAA,OAAO,IAAIZ,OAAAA,CAAc,CAACpD,OAAAA,EAAS8F,MAAAA,KAAAA;AACjC,QAAA,IAAI;AAEFzC,UAAAA,YAAAA,CAAa,MAAA;AACX,YAAA,IAAI;AACF,cAAA,IAAA,CAAK5D,MAAAA,CAAOZ,KAAAA,CAAAA,CAAOqF,aAAAA,CAAAA;AACnBlE,cAAAA,OAAAA,EAAAA;AACF,YAAA,CAAA,CAAA,OAAS0C,KAAAA,EAAO;AACdoD,cAAAA,MAAAA,CAAOpD,KAAAA,CAAAA;AACT,YAAA;UACF,CAAA,CAAA;AACF,QAAA,CAAA,CAAA,OAASA,KAAAA,EAAO;AACdoD,UAAAA,MAAAA,CAAOpD,KAAAA,CAAAA;AACT,QAAA;MACF,CAAA,CAAA,CAAGH,KAAAA,CAAMC,CAAAA,CAAAA,KAAAA;AACPC,QAAAA,OAAAA,CAAQC,KAAAA,CAAM,6BAA6BF,CAAAA,CAAAA;MAC7C,CAAA,CAAA;AACF,IAAA,CAAA,CAAA,OAASA,CAAAA,EAAG;AACVC,MAAAA,OAAAA,CAAQC,KAAAA,CAAM,2BAA2BF,CAAAA,CAAAA;AAC3C,IAAA;AACF,EAAA;;;;;;;;;;;;EAaQ/D,MAAAA,CAAOI,KAAAA,EAAekH,KAAAA,EAAexH,UAAAA,EAAmBsF,IAAAA,EAA8B;AAC5F,IAAA,IAAI;AACFkC,MAAAA,KAAAA,GAAQA,KAAAA,GAAQ,CAAA,CAAA,EAAIA,KAAAA,CAAAA,CAAAA,CAAAA,GAAW,EAAA;AAC/B,MAAA,MAAMC,MAAAA,GAAS;AAAC,QAAA,CAAA,CAAA,EAAIzH,UAAAA,CAAAA,CAAAA,CAAAA;AAAcwH,QAAAA,KAAAA;WAAU7I,SAAAA,CAAU2G,IAAAA,EAAM,KAAKjE,UAAU;;AAO3E,MAAA,OAAOqG,IAAAA,CAAKxH,MAAAA,CAAOyH,KAAAA,CAAM,IAAA,EAAMF,MAAAA,CAAAA;AACjC,IAAA,CAAA,CAAA,OAASxD,CAAAA,EAAG;AAEV,MAAA,IAAA,CAAK/C,MAAAA,CAAOiD,KAAAA,CAAMF,CAAAA,CAAE2D,KAAK,CAAA;AACzB,MAAA,OAAO,EAAA;AACT,IAAA;AACF,EAAA;;;;;EAMQhF,YAAAA,GAAwB;AAC9B,IAAA,MAAMiF,QAAe,EAAA;AACrB,IAAA,IAAI,IAAA,CAAKzG,eAAe,EAAA,EAAI;AAC1BhB,MAAAA,gBAAAA,CAAiBC,IAAAA,CAAKC,QAAQ,IAAA,CAAKS,QAAAA;AACnCX,MAAAA,gBAAAA,CAAiBC,IAAAA,CAAKE,QAAAA,GAAW,CAAA,EAAI,IAAA,CAAKa,eAAe,SAAA,CAAA,eAAA,CAAA;AACzD,MAAA,IAAA,CAAKD,UAAAA,CAAWd,IAAAA,GAAO,IAAIyH,eAAAA,CAAgB1H,iBAAiBC,IAAI,CAAA;AAChEwH,MAAAA,KAAAA,CAAMrC,IAAAA,CAAK,IAAA,CAAKrE,UAAAA,CAAWd,IAAI,CAAA;IACjC,CAAA,MAAO;AACLD,MAAAA,gBAAAA,CAAiBS,OAAAA,CAAQP,QAAQ,IAAA,CAAKS,QAAAA;AACtC,MAAA,IAAA,CAAKI,WAAWN,OAAAA,GAAU,IAAIM,UAAAA,CAAWN,OAAAA,CAAQT,iBAAiBS,OAAO,CAAA;AACzEgH,MAAAA,KAAAA,CAAMrC,IAAAA,CAAK,IAAA,CAAKrE,UAAAA,CAAWN,OAAO,CAAA;AACpC,IAAA;AAEA,IAAA,OAAO+B,YAAAA,CAAa;MAClBmF,MAAAA,EAAQ5H,WAAAA;MACRgB,UAAAA,EAAY0G,KAAAA;AACZ3H,MAAAA,MAAAA,EAAQH,QACNC,SAAAA,CAAU;QACRE,MAAAA,EAAQ;AACV,OAAA,CAAA,EACAA,MAAAA,CAAOO,IAAAA,EAAI,EACXR,MAAAA,CAAO,CAAC,EAAEK,KAAAA,EAAOd,OAAAA,EAASgI,KAAAA,EAAOxH,SAAAA,EAAAA,UAAAA,EAAS,KAAO;AAC/C,QAAA,OAAO,IAAA,CAAKE,MAAAA,CAAOI,KAAAA,EAAOkH,KAAAA,EAAOxH,YAAWR,OAAAA,CAAAA;AAC9C,MAAA,CAAA,CAAA;KAEJ,CAAA;AACF,EAAA;AAEF;AAEA,IAAIwI,qBAAAA,GAAuC,IAAA;AAMpC,SAASC,gBAAAA,GAAAA;AACd,EAAA,IAAI,CAACD,qBAAAA,EAAuB;AAC1BA,IAAAA,qBAAAA,GAAwB,IAAIlH,MAAAA,EAAAA;AAC9B,EAAA;AACA,EAAA,OAAOkH,qBAAAA;AACT;AALgBC,MAAAA,CAAAA,gBAAAA,EAAAA,kBAAAA,CAAAA;;;AC/pBhB,IAAMC,kBAAAA,GAAqB,KAAA;AAG3B,IAAMC,iBAAAA,uBAAwBC,OAAAA,EAAAA;AAE9B,SAASC,uBAAAA,CAAwBC,IAAAA,EAAcC,YAAAA,EAAsBjE,MAAAA,EAAiB;AACpF,EAAA,IAAIlF,GAAAA,GAAM+I,iBAAAA,CAAkBK,GAAAA,CAAIF,IAAAA,CAAAA;AAChC,EAAA,IAAI,CAAClJ,GAAAA,EAAK;AACRA,IAAAA,GAAAA,uBAAUqJ,GAAAA,EAAAA;AACVN,IAAAA,iBAAAA,CAAkBO,GAAAA,CAAIJ,MAAMlJ,GAAAA,CAAAA;AAC9B,EAAA;AACA,EAAA,IAAI8B,MAAAA,GAAS9B,GAAAA,CAAIoJ,GAAAA,CAAID,YAAAA,CAAAA;AACrB,EAAA,IAAI,CAACrH,MAAAA,EAAQ;AACX,IAAA,MAAMoB,GAAAA,GAAiB;MAAE,GAAGgC;AAAO,KAAA;AACnC,IAAA,IAAIhC,IAAIjB,UAAAA,IAAcnC,KAAAA,CAAMC,OAAAA,CAAQmD,GAAAA,CAAIjB,UAAU,CAAA,EAAG;AACnDiB,MAAAA,GAAAA,CAAIjB,UAAAA,GAAa,IAAIC,GAAAA,CAAIgB,GAAAA,CAAIjB,UAAU,CAAA;AACzC,IAAA;AACAH,IAAAA,MAAAA,GAAS,IAAIJ,OAAOwB,GAAAA,CAAAA;AACpBlD,IAAAA,GAAAA,CAAIsJ,GAAAA,CAAIH,cAAcrH,MAAAA,CAAAA;AACxB,EAAA;AACA,EAAA,OAAOA,MAAAA;AACT;AAhBSmH,MAAAA,CAAAA,uBAAAA,EAAAA,yBAAAA,CAAAA;AAuBT,SAASM,kBAAAA,CACPC,mBAAAA,EACAtE,MAAAA,EACAiE,YAAAA,EACAM,MAAAA,EAAW;AAEX,EAAA,MAAMhJ,GAAAA,GAAMiJ,OAAOP,YAAAA,CAAAA;AACnB,EAAA,MAAMQ,UAAAA,GAAa,QAAQlJ,GAAAA,CAAAA,CAAAA;AAC3B,EAAA,OAAO;IACL2I,GAAAA,GAAAA;AACE,MAAA,IAAK,IAAA,CAAaO,UAAAA,CAAAA,KAAgBzJ,MAAAA,EAAW;AAC3C,QAAA,OAAQ,KAAayJ,UAAAA,CAAAA;AACvB,MAAA;AACA,MAAA,IAAI,CAACzE,MAAAA,IAAW,OAAOA,MAAAA,KAAW,QAAA,IAAY3G,OAAOmC,IAAAA,CAAKwE,MAAAA,CAAAA,CAAQxG,MAAAA,KAAW,CAAA,EAAI;AAC/E,QAAA,OAAOmK,gBAAAA,EAAAA;AACT,MAAA;AACA,MAAA,MAAMK,IAAAA,GAAO,IAAA,EAAM,WAAA,IAAeO,MAAAA,EAAQ,WAAA;AAC1C,MAAA,IAAI,CAACP,IAAAA,EAAM;AACT,QAAA,OAAO,IAAIxH,OAAOwD,MAAAA,CAAAA;AACpB,MAAA;AACA,MAAA,OAAO+D,uBAAAA,CAAwBC,IAAAA,EAAMzI,GAAAA,EAAKyE,MAAAA,CAAAA;AAC5C,IAAA,CAAA;AACAoE,IAAAA,GAAAA,CAAeM,KAAAA,EAAU;AACtB,MAAA,IAAA,CAAaD,UAAAA,CAAAA,GAAcC,KAAAA;AAC9B,IAAA,CAAA;IACAC,UAAAA,EAAY,IAAA;IACZC,YAAAA,EAAc;AAChB,GAAA;AACF;AA5BSP,MAAAA,CAAAA,kBAAAA,EAAAA,oBAAAA,CAAAA;AA8BT,IAAIQ,qBAAAA,GAA8D,IAAA;AAQ3D,SAASC,qBAAqBC,eAAAA,EAA8C;AACjF,EAAA,IAAI,CAACA,eAAAA,IAAmB,OAAOA,eAAAA,CAAgBC,oBAAoB,UAAA,EAAY;AAC7E,IAAA;AACF,EAAA;AACA,EAAA,IAAI;AACFD,IAAAA,eAAAA,CAAgBC,eAAAA,CAAgBpB,oBAAoBS,kBAAAA,CAAAA;AACpDQ,IAAAA,qBAAAA,GAAwBE,eAAAA;EAC1B,CAAA,CAAA,MAAQ;AAER,EAAA;AACF;AAVgBD,MAAAA,CAAAA,oBAAAA,EAAAA,sBAAAA,CAAAA;AAeT,SAASG,sBAAAA,GAAAA;AACdJ,EAAAA,qBAAAA,GAAwB,IAAA;AAC1B;AAFgBI,MAAAA,CAAAA,sBAAAA,EAAAA,wBAAAA,CAAAA;AAQhB,SAASC,eAAAA,CACPC,eACAC,WAAAA,EAA0D;AAE1D,EAAA,OAAO,IAAIpE,IAAAA,KAAAA;AACT,IAAA,IAAIA,IAAAA,CAAKxH,MAAAA,KAAW,CAAA,IAAKwH,IAAAA,CAAK,CAAA,CAAA,IAAM,OAAOA,IAAAA,CAAK,CAAA,CAAA,KAAO,QAAA,IAAY,MAAA,IAAUA,IAAAA,CAAK,CAAA,CAAA,EAAI;AACpF,MAAA,OAAOoE,WAAAA,CAAYpE,IAAAA,CAAK,CAAA,CAAE,CAAA;AAC5B,IAAA;AACA,IAAA,OAAOmE,cAAcnE,IAAAA,CAAK,CAAA,CAAA,EAAIA,IAAAA,CAAK,CAAA,CAAE,CAAA;AACvC,EAAA,CAAA;AACF;AAVSkE,MAAAA,CAAAA,eAAAA,EAAAA,iBAAAA,CAAAA;AAmCF,SAASpC,IAAIuC,OAAAA,EAAmB;AACrC,EAAA,OAAOH,eAAAA,CACL,CAACX,MAAAA,EAAgBe,WAAAA,KAAAA;AACf,IAAA,MAAMC,EAAAA,GAAKV,qBAAAA;AACX,IAAA,IAAI,CAACU,EAAAA,IAAM,OAAOA,EAAAA,CAAGC,sBAAsB,UAAA,EAAY;AACrD,MAAA;AACF,IAAA;AACA,IAAA,IAAI;AACF,MAAA,OAAOD,EAAAA,CAAGC,iBAAAA,CAAkBjB,MAAAA,EAAQe,WAAAA,EAAa;QAC/CG,YAAAA,EAAc;AAAC7B,UAAAA;;QACf5D,MAAAA,EAAQqF;OACV,CAAA;IACF,CAAA,CAAA,MAAQ;AACN,MAAA;AACF,IAAA;AACF,EAAA,CAAA,EACA,CAACK,OAAAA,KAAAA;AACC,IAAA,MAAMC,SAAAA,GAAYnB,MAAAA,CAAOkB,OAAAA,CAAQ3E,IAAI,CAAA;AACrC2E,IAAAA,OAAAA,CAAQE,eAAe,WAAA;AACrB,MAAA,MAAML,EAAAA,GAAKV,qBAAAA;AACX,MAAA,IAAI,CAACU,EAAAA,IAAM,OAAOA,EAAAA,CAAGC,sBAAsB,UAAA,EAAY;AACrD,QAAA;AACF,MAAA;AACA,MAAA,IAAI;AACF,QAAA,MAAMK,KAAAA,GAAQxM,MAAAA,CAAOiC,cAAAA,CAAe,IAAI,CAAA;AACxCiK,QAAAA,EAAAA,CAAGC,iBAAAA,CAAkBK,OAAOF,SAAAA,EAAW;UACrCF,YAAAA,EAAc;AAAC7B,YAAAA;;UACf5D,MAAAA,EAAQqF;SACV,CAAA;MACF,CAAA,CAAA,MAAQ;AAER,MAAA;IACF,CAAA,CAAA;EACF,CAAA,CAAA;AAEJ;AAnCgBvC,MAAAA,CAAAA,GAAAA,EAAAA,KAAAA,CAAAA;;;AC5IT,IAAMgD,gBAAwBnC,gBAAAA","file":"index.mjs","sourcesContent":["/*\n * @Description: \n * @Usage: \n * @Author: richen\n * @Date: 2021-11-04 20:31:43\n * @LastEditTime: 2023-01-08 14:50:16\n */\nimport * as helper from \"koatty_lib\";\n\n\nexport interface ShieldFieldRes {\n res: string;\n start: string;\n end: string;\n}\n/**\n * ShieldField\n *\n * @export\n * @param {string} str\n * @returns {*} {ShieldFieldRes}\n */\nexport function ShieldField(str: string): ShieldFieldRes {\n const strArr = Object.assign([], str);\n const l = strArr.length;\n let start, end, res;\n if (l <= 1) {\n start = \"*\";\n end = \"\";\n res = \"*\";\n } else if (l == 2) {\n start = strArr.slice(1).join(\"\");\n end = \"*\";\n res = `${start}${end}`;\n } else {\n let num = Math.floor(l / 3);\n const mo = Math.floor(l % 3);\n let startNum = num;\n if (mo > 0) {\n num = num + 1;\n }\n if (startNum > 4) {\n num = num + (startNum - 4);\n startNum = 4;\n }\n const endNum = l - num - startNum;\n if (endNum > 4) {\n num = num + (endNum - 4);\n // endNum = 4;\n }\n // console.log(startNum, num, endNum)\n start = strArr.slice(0, startNum).join(\"\");\n end = strArr.slice(num + startNum).join(\"\");\n res = `${start}${\"*\".repeat(num)}${end}`;\n }\n return { res, start, end }\n}\n\n/**\n * ShieldLog\n *\n * @export\n * @param {*} splat\n * @param {Set<string>} fields\n * @param {string} [keyName]\n * @param {number} [depth=0] 递归深度\n * @param {number} [maxDepth=10] 最大递归深度\n * @returns {*} {*}\n */\nexport function ShieldLog(splat: any, fields: Set<string>, keyName?: string, depth: number = 0, maxDepth: number = 10): any {\n if (fields.size === 0) {\n return splat;\n }\n if (!splat) return splat;\n\n // 防止过深递归\n if (depth > maxDepth) {\n return '[Object: too deep]';\n }\n\n if (Array.isArray(splat)) {\n // 使用map代替for循环,更简洁高效\n return splat.map(item => ShieldLog(item, fields, undefined, depth + 1, maxDepth));\n }\n\n if (helper.isError(splat)) {\n return splat.message;\n }\n if (typeof splat !== \"object\") {\n if (fields.has(keyName || \"\")) {\n return ShieldField(splat).res;\n }\n return `${splat}`;\n }\n\n // 优化对象克隆:使用Object.create保持原型链,避免constructor调用\n const cloneSplat = Object.create(Object.getPrototypeOf(splat));\n\n // 使用Object.keys代替for...in,避免原型链属性\n for (const key of Object.keys(splat)) {\n // 递归拷贝\n cloneSplat[key] = ShieldLog(splat[key], fields, key, depth + 1, maxDepth);\n }\n\n return cloneSplat;\n}","/*\n * @Author: richen\n * @Date: 2020-11-20 17:40:48\n * @LastEditors: Please set LastEditors\n * @LastEditTime: 2024-10-31 16:30:52\n * @License: BSD (3-Clause)\n * @Copyright (c) - <richenlin(at)gmail.com>\n */\nimport * as helper from \"koatty_lib\";\nimport util from \"util\";\nimport { createLogger, format, transports, Logger as wLogger } from \"winston\";\nimport DailyRotateFile from \"winston-daily-rotate-file\";\nimport { BatchConfig, ILogger, LogEntry, LogLevelType, LogTrans } from \"./interface\";\nimport { ShieldLog } from \"./shield\";\nimport path from \"path\";\nconst { combine, timestamp, printf } = format;\n\nconst LogLevelObj: any = {\n \"debug\": 7,\n \"info\": 6,\n \"warn\": 4,\n \"error\": 3\n};\nexport interface LoggerOpt {\n logLevel?: LogLevelType;\n logFilePath?: string;\n sensFields?: Set<string>;\n batchConfig?: BatchConfig; // 批量写入配置\n}\n\n// defaultLoggerOpt\nconst defaultLoggerOpt = {\n File: {\n level: \"info\",\n filename: \"./logs/log.log\",\n handleExceptions: true,\n json: true,\n datePattern: 'YYYY-MM-DD-HH',\n // zippedArchive: true,\n maxSize: '20m',\n // maxFiles: '7d',\n colorize: false,\n timestamp: true\n },\n Console: {\n level: \"debug\",\n handleExceptions: true,\n json: true,\n colorize: true,\n timestamp: true\n }\n};\n\n/**\n * Logger\n *\n * @class Logger\n */\nexport class Logger implements ILogger {\n // 日志级别\n private logLevel: LogLevelType = \"debug\";\n // 默认打开日志\n private enableLog = true;\n // 日志对象\n private emptyObj: any = {};\n private logger: wLogger;\n private transports: LogTrans = {};\n // 文件日志\n private logFilePath = \"\";\n // 脱敏字段\n private sensFields: Set<string> = new Set();\n // 基础日志目录,用于安全验证\n private readonly baseLogDir = path.resolve(process.cwd(), \"logs\");\n\n // 批量写入相关属性\n private batchConfig: BatchConfig = {\n enabled: false,\n maxSize: 100,\n flushInterval: 1000, // 1秒\n maxWaitTime: 5000 // 5秒\n };\n private logBuffer: LogEntry[] = [];\n private flushTimer: NodeJS.Timeout | null = null;\n private lastFlushTime: number = Date.now();\n private isDestroyed: boolean = false;\n\n /**\n * Creates an instance of Logger.\n * @param {LoggerOpt} [opt]\n * @memberof Logger\n */\n constructor(opt?: LoggerOpt) {\n const level = (process.env.LOGS_LEVEL || \"\").toLowerCase();\n if (level && LogLevelObj[level] !== undefined) {\n this.logLevel = <LogLevelType>level;\n }\n\n if (process.env.LOGS_PATH) {\n this.logFilePath = process.env.LOGS_PATH;\n }\n if (!helper.isTrueEmpty(opt) && opt) {\n this.logLevel = opt.logLevel ?? this.logLevel;\n this.logFilePath = opt.logFilePath ?? this.logFilePath;\n this.sensFields = opt.sensFields ?? this.sensFields;\n \n // 配置批量写入\n if (opt.batchConfig) {\n this.batchConfig = { ...this.batchConfig, ...opt.batchConfig };\n }\n }\n\n this.logger = this.createLogger();\n \n // 如果启用批量写入,开始定时器\n if (this.batchConfig.enabled) {\n this.startBatchTimer();\n }\n }\n\n /**\n * enable\n */\n public enable(b = true) {\n this.enableLog = b;\n }\n\n /**\n * getLevel\n */\n public getLevel(): LogLevelType {\n return this.logLevel;\n }\n\n /**\n * setLevel\n */\n public setLevel(level: LogLevelType) {\n this.logLevel = level;\n if (this.transports.Console) {\n this.transports.Console.level = level;\n }\n if (this.transports.File) {\n this.transports.File.level = level;\n }\n }\n\n /**\n * getLogFilePath\n */\n public getLogFilePath() {\n return this.logFilePath;\n }\n\n /**\n * setLogFile\n */\n public setLogFilePath(f: string) {\n // 验证路径安全性\n const safePath = this.validateLogPath(f);\n this.logFilePath = safePath;\n this.logger.close();\n this.logger = this.createLogger();\n }\n\n /**\n * getSensFields\n */\n public getSensFields() {\n return this.sensFields;\n }\n\n /**\n * setSensFields\n */\n public setSensFields(fields: string[]) {\n this.sensFields = new Set([...this.sensFields, ...fields]);\n }\n\n /**\n * clearSensFields - 清理敏感字段,防止内存泄漏\n */\n public clearSensFields() {\n this.sensFields.clear();\n }\n\n /**\n * resetSensFields - 重置敏感字段为指定列表\n */\n public resetSensFields(fields: string[]) {\n this.sensFields.clear();\n this.sensFields = new Set(fields);\n }\n\n /**\n * destroy - 销毁Logger实例,释放资源\n */\n public destroy() {\n try {\n this.isDestroyed = true;\n\n // 停止批量写入定时器\n this.stopBatchTimer();\n\n // 异步刷新缓冲区,但不等待完成(避免阻塞销毁流程)\n if (this.logBuffer.length > 0) {\n this.flushBatch().catch(e => {\n console.error('Error flushing logs during destroy:', e);\n });\n }\n\n // 关闭winston logger\n if (this.logger) {\n this.logger.close();\n }\n\n // 清理内存引用\n this.sensFields.clear();\n this.transports = {};\n this.enableLog = false;\n this.logBuffer = [];\n } catch (e) {\n console.error('Error destroying logger:', e);\n }\n }\n\n /**\n * enableBatch - 启用/禁用批量写入\n */\n public enableBatch(enabled: boolean = true) {\n if (enabled && !this.batchConfig.enabled) {\n this.batchConfig.enabled = true;\n this.startBatchTimer();\n } else if (!enabled && this.batchConfig.enabled) {\n this.batchConfig.enabled = false;\n this.stopBatchTimer();\n // 异步刷新剩余的日志\n this.flushBatch().catch(e => {\n console.error('Error flushing logs when disabling batch:', e);\n });\n }\n }\n\n /**\n * setBatchConfig - 设置批量写入配置\n */\n public setBatchConfig(config: Partial<BatchConfig>) {\n const wasEnabled = this.batchConfig.enabled;\n this.batchConfig = { ...this.batchConfig, ...config };\n\n // 如果配置改变,重新启动定时器\n if (this.batchConfig.enabled && wasEnabled) {\n this.stopBatchTimer();\n this.startBatchTimer();\n } else if (this.batchConfig.enabled && !wasEnabled) {\n this.startBatchTimer();\n } else if (!this.batchConfig.enabled && wasEnabled) {\n this.stopBatchTimer();\n this.flushBatch().catch(e => {\n console.error('Error flushing logs when disabling batch via config:', e);\n });\n }\n }\n\n /**\n * getBatchConfig - 获取批量写入配置\n */\n public getBatchConfig(): BatchConfig {\n return { ...this.batchConfig };\n }\n\n /**\n * getBatchStatus - 获取批量写入状态\n */\n public getBatchStatus() {\n return {\n enabled: this.batchConfig.enabled || false,\n bufferSize: this.logBuffer.length,\n maxSize: this.batchConfig.maxSize,\n timeSinceLastFlush: Date.now() - this.lastFlushTime\n };\n }\n\n /**\n * flushBatch - 立即刷新批量写入缓冲区\n */\n public async flushBatch(): Promise<void> {\n if (this.logBuffer.length === 0 || this.isDestroyed) {\n return;\n }\n\n const logsToFlush = [...this.logBuffer];\n this.logBuffer = [];\n this.lastFlushTime = Date.now();\n\n // 异步批量处理日志 - 避免阻塞主线程\n return new Promise<void>((resolve) => {\n setImmediate(() => {\n try {\n // 批量写入所有日志\n logsToFlush.forEach(entry => {\n this.writeLogEntry(entry);\n });\n resolve();\n } catch (e) {\n console.error('Error in batch flush:', e);\n resolve(); // 即使出错也要resolve,避免阻塞\n }\n });\n });\n }\n\n /**\n * startBatchTimer - 启动批量写入定时器\n */\n private startBatchTimer() {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n }\n\n this.flushTimer = setInterval(() => {\n const now = Date.now();\n const timeSinceLastFlush = now - this.lastFlushTime;\n\n // 检查是否需要刷新(超时或缓冲区满)\n if (this.logBuffer.length > 0 &&\n (timeSinceLastFlush >= this.batchConfig.maxWaitTime! ||\n this.logBuffer.length >= this.batchConfig.maxSize!)) {\n // 异步刷新,不阻塞定时器\n this.flushBatch().catch(e => {\n console.error('Error in timer flush:', e);\n });\n }\n }, this.batchConfig.flushInterval);\n }\n\n /**\n * stopBatchTimer - 停止批量写入定时器\n */\n private stopBatchTimer() {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n }\n\n /**\n * addToBuffer - 添加日志到缓冲区\n */\n private addToBuffer(level: LogLevelType, name: string, args: any[]) {\n if (this.isDestroyed) {\n return;\n }\n\n const logEntry: LogEntry = {\n level,\n name,\n args,\n timestamp: Date.now()\n };\n\n this.logBuffer.push(logEntry);\n\n // 如果缓冲区达到最大大小,立即异步刷新\n if (this.logBuffer.length >= this.batchConfig.maxSize!) {\n this.flushBatch().catch(e => {\n console.error('Error in immediate flush:', e);\n });\n }\n }\n\n /**\n * writeLogEntry - 写入单个日志条目\n */\n private writeLogEntry(entry: LogEntry) {\n try {\n const { level, name, args } = entry;\n const logName = name !== '' ? name.toUpperCase() : level.toUpperCase();\n\n // 对输入参数进行安全过滤\n const sanitizedArgs = args.map(arg => this.sanitizeInput(arg));\n\n // format\n sanitizedArgs.unshift(logName);\n\n // 批量写入时直接调用winston(在批量刷新时已经是异步的)\n this.logger[level](sanitizedArgs);\n } catch (e) {\n console.error('Error writing log entry:', e);\n }\n }\n\n /**\n * sanitizeInput - 过滤危险字符,防止日志注入\n */\n private sanitizeInput(input: any): any {\n if (typeof input === 'string') {\n // 移除控制字符和换行符,防止日志注入\n return input.replace(/[\\r\\n\\t\\x00-\\x1f\\x7f]/g, ' ');\n }\n return input;\n }\n\n /**\n * validateLogPath - 验证日志路径安全性\n */\n private validateLogPath(logPath: string): string {\n if (!logPath) {\n throw new Error('Log path cannot be empty');\n }\n\n const normalizedPath = path.normalize(logPath);\n\n if (normalizedPath.includes('..')) {\n throw new Error('Log path must not contain path traversal sequences');\n }\n\n if (!path.isAbsolute(normalizedPath)) {\n const resolvedPath = path.resolve(this.baseLogDir, normalizedPath);\n if (!resolvedPath.startsWith(this.baseLogDir)) {\n throw new Error(`Relative log path must be within ${this.baseLogDir}`);\n }\n if (/[<>:\"|?*\\x00-\\x1f]/.test(normalizedPath)) {\n throw new Error('Log path contains invalid characters');\n }\n return resolvedPath;\n }\n\n if (/[<>|?*\\x00-\\x1f]/.test(normalizedPath)) {\n throw new Error('Log path contains invalid characters');\n }\n\n return normalizedPath;\n }\n\n /**\n * log Debug\n *\n * @returns {*} \n * @memberof Logger\n */\n public Debug(...args: any[]) {\n return this.printLog(\"debug\", \"\", args);\n }\n\n /**\n * debug\n */\n public debug(...args: any[]) {\n return this.printLog(\"debug\", \"\", args);\n }\n\n /**\n * log Info\n *\n * @returns {*} \n * @memberof Logger\n */\n public Info(...args: any[]) {\n return this.printLog(\"info\", \"\", args);\n }\n\n /**\n * info\n */\n public info(...args: any[]) {\n return this.printLog(\"info\", \"\", args);\n }\n\n /**\n * log Warn\n *\n * @returns {*} \n * @memberof Logger\n */\n public Warn(...args: any[]) {\n return this.printLog(\"warn\", \"\", args);\n }\n\n /**\n * warn\n */\n public warn(...args: any[]) {\n return this.printLog(\"warn\", \"\", args);\n }\n\n /**\n * log Error\n * \n * @returns {*} \n * @memberof Logger\n */\n public Error(...args: any[]) {\n return this.printLog(\"error\", \"\", args);\n }\n /**\n * error\n */\n public error(...args: any[]) {\n return this.printLog(\"error\", \"\", args);\n }\n\n /**\n * log Fatal - for critical errors that cause application termination\n * Automatically exits the process after logging\n * \n * @returns {*} \n * @memberof Logger\n */\n public Fatal(...args: any[]) {\n // Flush any buffered logs first\n if (this.batchConfig.enabled) {\n this.flushBatch().catch(() => {}); // Don't wait, just try to flush\n }\n // Print to console.error directly to ensure visibility\n console.error('\\x1b[31m[FATAL]\\x1b[0m', ...args);\n this.printLog(\"error\", \"FATAL\", args);\n // Give a tiny delay for logs to be written\n setImmediate(() => process.exit(1));\n }\n /**\n * fatal\n */\n public fatal(...args: any[]) {\n // Flush any buffered logs first\n if (this.batchConfig.enabled) {\n this.flushBatch().catch(() => {}); // Don't wait, just try to flush\n }\n // Print to console.error directly to ensure visibility\n console.error('\\x1b[31m[FATAL]\\x1b[0m', ...args);\n this.printLog(\"error\", \"FATAL\", args);\n // Give a tiny delay for logs to be written\n setImmediate(() => process.exit(1));\n }\n\n /**\n * log Log\n * \n * Logger.Log('msg')\n * \n * Logger.Log('name', 'msg')\n * \n * Logger.Log('name', 'msg1', 'msg2'...)\n *\n * @param {...any[]} args\n * @returns {*} \n * @memberof Logger\n */\n public Log(name: LogLevelType | string, ...args: any[]) {\n // tslint:disable-next-line: one-variable-per-declaration\n let level = \"info\";\n if (LogLevelObj[name] !== undefined) {\n level = name;\n name = \"\";\n }\n return this.printLog(<LogLevelType>level, name, args);\n }\n\n /**\n * log\n */\n public log(name: LogLevelType | string, ...args: any[]) {\n let level = \"info\";\n if (LogLevelObj[name] !== undefined) {\n level = name;\n name = \"\";\n }\n return this.printLog(<LogLevelType>level, name, args);\n }\n\n /**\n * print console\n *\n * @private\n * @param {LogLevelType} level\n * @param {string} name\n * @param {any[]|string} args\n * @memberof Logger\n */\n private printLog(level: LogLevelType, name: string, args: any[]) {\n try {\n if (!this.enableLog || this.isDestroyed) {\n return;\n }\n\n // 如果启用批量写入,添加到缓冲区\n if (this.batchConfig.enabled) {\n this.addToBuffer(level, name, args);\n } else {\n // 默认异步写入\n this.writeLogAsync(level, name, args);\n }\n } catch (e) {\n console.error('Error in printLog:', e);\n }\n }\n\n /**\n * writeLogAsync - 异步写入单个日志条目\n */\n private async writeLogAsync(level: LogLevelType, name: string, args: any[]) {\n try {\n const logName = name !== '' ? name.toUpperCase() : level.toUpperCase();\n\n // 对输入参数进行安全过滤\n const sanitizedArgs = args.map(arg => this.sanitizeInput(arg));\n\n // format\n sanitizedArgs.unshift(logName);\n\n // Winston的日志方法本身就是异步的,我们使用Promise.resolve确保异步执行\n return new Promise<void>((resolve, reject) => {\n try {\n // 使用setImmediate确保异步执行,避免阻塞主线程\n setImmediate(() => {\n try {\n this.logger[level](sanitizedArgs);\n resolve();\n } catch (error) {\n reject(error);\n }\n });\n } catch (error) {\n reject(error);\n }\n }).catch(e => {\n console.error('Error in async log write:', e);\n });\n } catch (e) {\n console.error('Error in writeLogAsync:', e);\n }\n }\n\n /**\n * 格式化\n *\n * @private\n * @param {string} level\n * @param {string} label\n * @param {string} timestamp\n * @param {any[]|string} args\n * @returns {string} \n * @memberof Logger\n */\n private format(level: string, label: string, timestamp: string, args: any[] | string): string {\n try {\n label = label ? `[${label}]` : '';\n const params = [`[${timestamp}]`, label, ...ShieldLog(args, this.sensFields)];\n // if (level === \"debug\") {\n // Error.captureStackTrace(this.emptyObj);\n // const matchResult = (this.emptyObj.stack.slice(this.emptyObj.stack.lastIndexOf(\"koatty_logger\"))).match(/\\(.*?\\)/g) || [];\n // params.push(matchResult.join(\" \"));\n // }\n\n return util.format.apply(null, params);\n } catch (e) {\n // console.error(e.stack);\n this.logger.error(e.stack);\n return \"\";\n }\n }\n\n /**\n * createLogger\n * @returns \n */\n private createLogger(): wLogger {\n const trans: any[] = [];\n if (this.logFilePath != \"\") {\n defaultLoggerOpt.File.level = this.logLevel;\n defaultLoggerOpt.File.filename = `${(this.logFilePath || './logs/')}/log-%DATE%.log`;\n this.transports.File = new DailyRotateFile(defaultLoggerOpt.File);\n trans.push(this.transports.File);\n } else {\n defaultLoggerOpt.Console.level = this.logLevel;\n this.transports.Console = new transports.Console(defaultLoggerOpt.Console);\n trans.push(this.transports.Console);\n }\n\n return createLogger({\n levels: LogLevelObj,\n transports: trans,\n format: combine(\n timestamp({\n format: \"YYYY-MM-DD HH:mm:ss.SSS Z\",\n }),\n format.json(),\n printf(({ level, message, label, timestamp }: any) => {\n return this.format(level, label, timestamp, message);\n }),\n ),\n });\n }\n\n}\n\nlet defaultLoggerInstance: Logger | null = null;\n\n/**\n * Get the default logger singleton (used by @Log() decorator to avoid circular dependency).\n * @internal\n */\nexport function getDefaultLogger(): Logger {\n if (!defaultLoggerInstance) {\n defaultLoggerInstance = new Logger();\n }\n return defaultLoggerInstance;\n}\n\n","/*\n * @Description: Log property decorator integrated with koatty-container\n * @Usage: Use registerLogDecorator(decoratorManager.property) then @Log() or @Log(options)\n * @Author: richen\n * @Date: 2025-02-03\n */\nimport { Logger, LoggerOpt, getDefaultLogger } from \"./logger\";\n\n/**\n * Minimal interface for property decorator manager (avoids depending on koatty_container).\n * Pass decoratorManager.property from koatty_container when calling registerLogDecorator.\n */\nexport interface IPropertyDecoratorManagerLike {\n registerWrapper(\n decoratorType: string,\n wrapperFunction: (\n originalDescriptor: PropertyDescriptor | undefined,\n config: any,\n propertyName: string,\n target: any\n ) => PropertyDescriptor\n ): void;\n registerDecorator(\n target: any,\n propertyKey: string | symbol,\n metadata: { wrapperTypes: string[]; config?: any },\n originalDescriptor?: PropertyDescriptor\n ): PropertyDescriptor;\n}\n\nconst LOG_DECORATOR_TYPE = \"Log\";\n\n/** Cache for custom Logger instances: (constructor, propertyName) -> Logger */\nconst customLoggerCache = new WeakMap<object, Map<string, Logger>>();\n\nfunction getOrCreateCustomLogger(ctor: object, propertyName: string, config: LoggerOpt): Logger {\n let map = customLoggerCache.get(ctor);\n if (!map) {\n map = new Map<string, Logger>();\n customLoggerCache.set(ctor, map);\n }\n let logger = map.get(propertyName);\n if (!logger) {\n const opt: LoggerOpt = { ...config };\n if (opt.sensFields && Array.isArray(opt.sensFields)) {\n opt.sensFields = new Set(opt.sensFields as unknown as string[]);\n }\n logger = new Logger(opt);\n map.set(propertyName, logger);\n }\n return logger;\n}\n\n/**\n * Property wrapper for \"Log\" decorator type.\n * - config undefined/empty: return DefaultLogger\n * - config provided: return a Logger instance per (class, property), cached\n */\nfunction logPropertyWrapper(\n _originalDescriptor: PropertyDescriptor | undefined,\n config: LoggerOpt | undefined,\n propertyName: string,\n target: any\n): PropertyDescriptor {\n const key = String(propertyName);\n const privateKey = `_log_${key}`;\n return {\n get(this: any): Logger {\n if ((this as any)[privateKey] !== undefined) {\n return (this as any)[privateKey];\n }\n if (!config || (typeof config === \"object\" && Object.keys(config).length === 0)) {\n return getDefaultLogger();\n }\n const ctor = this?.constructor ?? target?.constructor;\n if (!ctor) {\n return new Logger(config);\n }\n return getOrCreateCustomLogger(ctor, key, config);\n },\n set(this: any, value: any) {\n (this as any)[privateKey] = value;\n },\n enumerable: true,\n configurable: true\n };\n}\n\nlet storedPropertyManager: IPropertyDecoratorManagerLike | null = null;\n\n/**\n * Register the \"Log\" decorator with koatty-container's property manager.\n * Call once at app startup, e.g. registerLogDecorator(decoratorManager.property).\n *\n * @param propertyManager - PropertyDecoratorManager from decoratorManager.property\n */\nexport function registerLogDecorator(propertyManager: IPropertyDecoratorManagerLike): void {\n if (!propertyManager || typeof propertyManager.registerWrapper !== \"function\") {\n return;\n }\n try {\n propertyManager.registerWrapper(LOG_DECORATOR_TYPE, logPropertyWrapper);\n storedPropertyManager = propertyManager;\n } catch {\n // Avoid breaking app if container API differs\n }\n}\n\n/**\n * Unregister the stored property manager (e.g. for tests).\n */\nexport function unregisterLogDecorator(): void {\n storedPropertyManager = null;\n}\n\n/**\n * Inline dual field decorator helper (avoids koatty_container dependency).\n * Detects TC39 vs legacy calling convention at runtime and routes accordingly.\n */\nfunction createDualField(\n legacyHandler: (target: object, key: string | symbol) => void | PropertyDescriptor,\n tc39Handler: (context: any) => ((init: any) => any) | void\n) {\n return (...args: any[]) => {\n if (args.length === 2 && args[1] && typeof args[1] === 'object' && 'kind' in args[1]) {\n return tc39Handler(args[1]);\n }\n return legacyHandler(args[0], args[1]);\n };\n}\n\n/**\n * Property decorator: inject a logger instance.\n * - @Log() uses the global DefaultLogger.\n * - @Log(options) uses a dedicated Logger instance with the given options (cached per class+property).\n *\n * Supports both legacy and TC39 field decorator calling conventions.\n * Requires registerLogDecorator(decoratorManager.property) to be called first;\n * otherwise the decorator is a no-op so existing code is not broken.\n *\n * @param options - Optional LoggerOpt for a custom Logger instance\n * @example\n * ```ts\n * registerLogDecorator(decoratorManager.property);\n *\n * class UserController {\n * \\@Log()\n * logger: any;\n *\n * \\@Log({ logLevel: 'debug' })\n * debugLogger: any;\n * }\n * ```\n */\nexport function Log(options?: LoggerOpt) {\n return createDualField(\n (target: object, propertyKey: string | symbol): void | PropertyDescriptor => {\n const pm = storedPropertyManager;\n if (!pm || typeof pm.registerDecorator !== \"function\") {\n return;\n }\n try {\n return pm.registerDecorator(target, propertyKey, {\n wrapperTypes: [LOG_DECORATOR_TYPE],\n config: options\n });\n } catch {\n return;\n }\n },\n (context: any) => {\n const fieldName = String(context.name);\n context.addInitializer(function (this: any) {\n const pm = storedPropertyManager;\n if (!pm || typeof pm.registerDecorator !== \"function\") {\n return;\n }\n try {\n const proto = Object.getPrototypeOf(this);\n pm.registerDecorator(proto, fieldName, {\n wrapperTypes: [LOG_DECORATOR_TYPE],\n config: options\n });\n } catch {\n // no-op\n }\n });\n }\n );\n}\n","/*\n * @Description: \n * @Usage: \n * @Author: richen\n * @Date: 2021-12-18 20:03:31\n * @LastEditTime: 2024-10-31 16:32:08\n */\nimport {