@warlock.js/logger 4.0.31 → 4.0.39
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/cjs/index.js +3 -1
- package/cjs/index.js.map +1 -1
- package/esm/index.js +3 -1
- package/esm/index.js.map +1 -1
- package/package.json +39 -37
- package/cjs/channels/console-log.d.ts +0 -17
- package/cjs/channels/console-log.d.ts.map +0 -1
- package/cjs/channels/console-log.js +0 -47
- package/cjs/channels/console-log.js.map +0 -1
- package/cjs/channels/file-log.d.ts +0 -167
- package/cjs/channels/file-log.d.ts.map +0 -1
- package/cjs/channels/file-log.js +0 -272
- package/cjs/channels/file-log.js.map +0 -1
- package/cjs/channels/index.d.ts +0 -4
- package/cjs/channels/index.d.ts.map +0 -1
- package/cjs/channels/json-file-log.d.ts +0 -29
- package/cjs/channels/json-file-log.d.ts.map +0 -1
- package/cjs/channels/json-file-log.js +0 -102
- package/cjs/channels/json-file-log.js.map +0 -1
- package/cjs/index.d.ts +0 -6
- package/cjs/index.d.ts.map +0 -1
- package/cjs/log-channel.d.ts +0 -63
- package/cjs/log-channel.d.ts.map +0 -1
- package/cjs/log-channel.js +0 -88
- package/cjs/log-channel.js.map +0 -1
- package/cjs/logger.d.ts +0 -58
- package/cjs/logger.d.ts.map +0 -1
- package/cjs/logger.js +0 -112
- package/cjs/logger.js.map +0 -1
- package/cjs/types.d.ts +0 -90
- package/cjs/types.d.ts.map +0 -1
- package/cjs/utils/capture-unhandled-errors.d.ts +0 -2
- package/cjs/utils/capture-unhandled-errors.d.ts.map +0 -1
- package/cjs/utils/capture-unhandled-errors.js +0 -12
- package/cjs/utils/capture-unhandled-errors.js.map +0 -1
- package/cjs/utils/clear-message.d.ts +0 -5
- package/cjs/utils/clear-message.d.ts.map +0 -1
- package/cjs/utils/clear-message.js +0 -9
- package/cjs/utils/clear-message.js.map +0 -1
- package/cjs/utils/index.d.ts +0 -3
- package/cjs/utils/index.d.ts.map +0 -1
- package/esm/channels/console-log.d.ts +0 -17
- package/esm/channels/console-log.d.ts.map +0 -1
- package/esm/channels/console-log.js +0 -47
- package/esm/channels/console-log.js.map +0 -1
- package/esm/channels/file-log.d.ts +0 -167
- package/esm/channels/file-log.d.ts.map +0 -1
- package/esm/channels/file-log.js +0 -272
- package/esm/channels/file-log.js.map +0 -1
- package/esm/channels/index.d.ts +0 -4
- package/esm/channels/index.d.ts.map +0 -1
- package/esm/channels/json-file-log.d.ts +0 -29
- package/esm/channels/json-file-log.d.ts.map +0 -1
- package/esm/channels/json-file-log.js +0 -102
- package/esm/channels/json-file-log.js.map +0 -1
- package/esm/index.d.ts +0 -6
- package/esm/index.d.ts.map +0 -1
- package/esm/log-channel.d.ts +0 -63
- package/esm/log-channel.d.ts.map +0 -1
- package/esm/log-channel.js +0 -88
- package/esm/log-channel.js.map +0 -1
- package/esm/logger.d.ts +0 -58
- package/esm/logger.d.ts.map +0 -1
- package/esm/logger.js +0 -112
- package/esm/logger.js.map +0 -1
- package/esm/types.d.ts +0 -90
- package/esm/types.d.ts.map +0 -1
- package/esm/utils/capture-unhandled-errors.d.ts +0 -2
- package/esm/utils/capture-unhandled-errors.d.ts.map +0 -1
- package/esm/utils/capture-unhandled-errors.js +0 -12
- package/esm/utils/capture-unhandled-errors.js.map +0 -1
- package/esm/utils/clear-message.d.ts +0 -5
- package/esm/utils/clear-message.d.ts.map +0 -1
- package/esm/utils/clear-message.js +0 -9
- package/esm/utils/clear-message.js.map +0 -1
- package/esm/utils/index.d.ts +0 -3
- package/esm/utils/index.d.ts.map +0 -1
package/cjs/index.js
CHANGED
|
@@ -1 +1,3 @@
|
|
|
1
|
-
'use strict';var
|
|
1
|
+
'use strict';var copper=require('@mongez/copper'),fs=require('@mongez/fs'),u=require('dayjs'),L=require('fs'),os=require('os'),f=require('path'),reinforcements=require('@mongez/reinforcements');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var u__default=/*#__PURE__*/_interopDefault(u);var L__default=/*#__PURE__*/_interopDefault(L);var f__default=/*#__PURE__*/_interopDefault(f);var h=class{name;description;terminal=false;defaultConfigurations={};channelConfigurations={};isInitialized=false;constructor(e){e&&this.setConfigurations(e),setTimeout(async()=>{this.init&&await this.init(),this.isInitialized=true;},0);}config(e){return this.channelConfigurations[e]??(this.defaultConfigurations??{})[e]}setConfigurations(e){return this.channelConfigurations={...this.channelConfigurations,...e},this}shouldBeLogged(e){let t=this.config("levels");if(t?.length&&!t.includes(e.type))return false;let s=this.config("filter");return s?s(e):true}getDateAndTimeFormat(){let e=this.config("dateFormat"),t=e?.date??"DD-MM-YYYY",s=e?.time??"HH:mm:ss";return {date:t,time:s}}withBasicConfigurations(e){return {filter:()=>true,...e}}};var x=class extends h{name="console";terminal=true;log(e){let{module:t,action:s,message:i,type:r}=e;if(!this.shouldBeLogged(e))return;let a=new Date().toISOString();switch(r){case "debug":console.log(copper.colors.magentaBright("\u2699"),copper.colors.yellow(`(${a})`),copper.colors.cyan(`[${t}]`),copper.colors.magenta(`[${s}]`),copper.colors.magentaBright(i));break;case "info":console.log(copper.colors.blueBright("\u2139"),copper.colors.yellow(`(${a})`),copper.colors.cyan(`[${t}]`),copper.colors.magenta(`[${s}]`),copper.colors.blueBright(i));break;case "warn":console.log(copper.colors.yellow("\u26A0"),copper.colors.yellow(`(${a})`),copper.colors.cyan(`[${t}]`),copper.colors.magenta(`[${s}]`),copper.colors.yellowBright(i));break;case "error":console.log(copper.colors.red("\u2717"),copper.colors.yellow(`(${a})`),copper.colors.cyan(`[${t}]`),copper.colors.magenta(`[${s}]`),copper.colors.redBright(i));break;case "success":console.log(copper.colors.green("\u2713"),copper.colors.yellow(`(${a})`),copper.colors.cyan(`[${t}]`),copper.colors.magenta(`[${s}]`),copper.colors.greenBright(i));break;default:console.log("[log]",copper.colors.yellow(`(${a})`),copper.colors.cyan(`[${t}]`),copper.colors.magenta(`[${s}]`),i);}typeof i=="object"&&console.log(i);}};var d=class extends h{name="file";messages=[];groupedMessages={};defaultConfigurations={storagePath:process.cwd()+"/storage/logs",rotate:true,name:"app",extension:"log",chunk:"single",maxMessagesToWrite:100,filter:()=>true,maxFileSize:10*1024*1024,get rotateFileName(){return u__default.default().format("DD-MM-YYYY")},dateFormat:{date:"DD-MM-YYYY",time:"HH:mm:ss"}};lastWriteTime=Date.now();isWriting=false;async checkAndRotateFile(e=this.filePath){if(this.config("rotate"))try{(await L__default.default.promises.stat(e)).size>=this.config("maxFileSize")&&await this.rotateLogFile();}catch(t){t.code==="ENOENT"?console.log("Log file does not exist, will be created on first write."):console.error("Error checking log file:",t);}}async rotateLogFile(){let e=`${this.fileName}-${this.config("rotateFileName")}-${Date.now()}`,t=this.extension,s=f__default.default.join(this.storagePath,`${e}.${t}`);await L__default.default.promises.rename(this.filePath,s).catch(i=>{console.error("Error rotating file:",i);});}initMessageFlush(){setInterval(()=>{this.messages.length>0&&(this.messages.length>=this.maxMessagesToWrite||Date.now()-this.lastWriteTime>5e3)&&this.writeMessagesToFile();},5e3);}get filePath(){let e=this.fileName,t=this.extension;return f__default.default.join(this.storagePath,`${e}.${t}`)}get maxMessagesToWrite(){return this.config("maxMessagesToWrite")}get fileName(){switch(this.config("chunk")){case "single":default:return this.config("name");case "daily":return u__default.default().format("DD-MM-YYYY");case "hourly":return u__default.default().format("DD-MM-YYYY-HH")}}get extension(){return this.config("extension")}get content(){return this.messages.map(e=>e.content).join(os.EOL)+os.EOL}get storagePath(){return this.config("storagePath")}async init(){let e=this.storagePath;await fs.ensureDirectoryAsync(e),this.initMessageFlush();}async log(e){let{module:t,action:s,message:i,type:r}=e;if(!this.shouldBeLogged(e))return;let{date:a,time:y}=this.getDateAndTimeFormat(),m=u__default.default().format(a+" "+y),l=`[${m}] [${r}] [${t}][${s}]: `,b;i instanceof Error?(l+=i.message+os.EOL,l+="[trace]"+os.EOL,l+=i.stack,b=i.stack):l+=i,this.messages.push({content:l,level:r,date:m,module:t,action:s,stack:b}),await this.checkIfMessagesShouldBeWritten();}async checkIfMessagesShouldBeWritten(){(this.messages.length>=this.maxMessagesToWrite||Date.now()-this.lastWriteTime>5e3)&&await this.writeMessagesToFile();}onSave(){this.messages=[],this.groupedMessages={},this.isWriting=false,this.lastWriteTime=Date.now();}get messagedShouldBeGrouped(){return Number(this.config("groupBy")?.length)>0}async writeMessagesToFile(){if(!(this.messages.length===0||this.isWriting||!this.isInitialized)){if(this.isWriting=true,this.messagedShouldBeGrouped)return await this.writeGroupedMessagesToFile();await this.checkAndRotateFile();try{await this.write(this.filePath,this.content),this.onSave();}catch(e){console.error("Failed to write log:",e),this.isWriting=false;}}}async writeGroupedMessagesToFile(){this.prepareGroupedMessages();for(let e in this.groupedMessages){let t=f__default.default.join(this.storagePath,e);await fs.ensureDirectoryAsync(t);let s=f__default.default.join(t,`${this.fileName}.${this.extension}`);await this.checkAndRotateFile(s);let i=this.groupedMessages[e].map(r=>r.content).join(os.EOL)+os.EOL;try{await this.write(s,i);}catch(r){console.error("Failed to write log:",r);}}this.onSave(),this.isWriting=false;}prepareGroupedMessages(){this.messages.forEach(e=>{let t=this.config("groupBy").map(s=>encodeURIComponent(e[s])).join("/");this.groupedMessages[t]=this.groupedMessages[t]||[],this.groupedMessages[t].push(e);});}async write(e,t){return new Promise((s,i)=>{let r=L__default.default.createWriteStream(e,{flags:"a"});r.write(t,a=>{r.end(),a?i(a):s(true);});})}};var C=class extends d{name="fileJson";get extension(){return "json"}get initialFileContents(){return {messages:this.messages}}async log(e){let t;e.message instanceof Error&&(t=e.message.stack?.split(`
|
|
2
|
+
`),e.message=e.message.message);let{module:s,action:i,message:r,type:a}=e;if(!this.shouldBeLogged(e))return;let{date:y,time:m}=this.getDateAndTimeFormat(),l=u__default.default().format(y+" "+m);this.messages.push({content:r,level:a,date:l,module:s,action:i,stack:t}),await this.checkIfMessagesShouldBeWritten();}async writeMessagesToFile(){if(this.messages.length===0||this.isWriting)return;if(this.isWriting=true,this.messagedShouldBeGrouped)return await this.writeGroupedMessagesToFile();await this.checkAndRotateFile();let e;if(await fs.fileExistsAsync(this.filePath))try{e=await fs.getJsonFileAsync(this.filePath);}catch(t){console.error("Error reading log file, reinitializing:",t),e={messages:[]};}else e={messages:[]};e.messages.push(...this.messages);try{await fs.putJsonFileAsync(this.filePath,e,{spaces:2}),this.onSave();}catch(t){console.error("Failed to write log:",t),this.isWriting=false;}}async writeGroupedMessagesToFile(){this.prepareGroupedMessages();for(let e in this.groupedMessages){let t=f__default.default.join(this.storagePath,e);await fs.ensureDirectoryAsync(t);let s=f__default.default.join(t,`${this.fileName}.${this.extension}`);await this.checkAndRotateFile(s);let i=this.groupedMessages[e];try{await fs.putJsonFileAsync(s,i,{spaces:2});}catch(r){console.error("Failed to write log:",r),this.isWriting=false;}}this.onSave();}};function $(n){return typeof n!="string"?n:n.replace(/\u001b[^m]*?m/g,"")}var w=class{channels=[];id="logger-"+reinforcements.Random.string(32);addChannel(e){return this.channels.push(e),this}configure(e){return this.channels=e.channels,this}setChannels(e){return this.channels=e,this}normalizeLogData(e,t,s="",i){return typeof e=="object"?{type:i||e.type||"info",module:e.module,action:e.action,message:e.message,...e.context?{context:e.context}:{}}:{type:i||"info",module:e,action:t,message:s}}async log(e){for(let t of this.channels)t.terminal===false&&(e.message=$(e.message)),t.log(e);return this}debug(e,t,s=""){let i=this.normalizeLogData(e,t,s,"debug");return this.log(i)}info(e,t,s=""){let i=this.normalizeLogData(e,t,s,"info");return this.log(i)}warn(e,t,s=""){let i=this.normalizeLogData(e,t,s,"warn");return this.log(i)}error(e,t,s=""){let i=this.normalizeLogData(e,t,s,"error");return this.log(i)}success(e,t,s=""){let i=this.normalizeLogData(e,t,s,"success");return this.log(i)}channel(e){return this.channels.find(t=>t.name===e)}},g=new w,c=n=>g.log(n);c.info=g.info.bind(g);c.debug=g.debug.bind(g);c.warn=g.warn.bind(g);c.error=g.error.bind(g);c.success=g.success.bind(g);c.channel=g.channel.bind(g);function ie(){process.on("unhandledRejection",(n,e)=>{c.error("app","unhandledRejection",n),console.log(e);}),process.on("uncaughtException",n=>{c.error("app","uncaughtException",n),console.log(n);});}exports.ConsoleLog=x;exports.FileLog=d;exports.JSONFileLog=C;exports.LogChannel=h;exports.Logger=w;exports.captureAnyUnhandledRejection=ie;exports.clearMessage=$;exports.log=c;exports.logger=g;//# sourceMappingURL=index.js.map
|
|
3
|
+
//# sourceMappingURL=index.js.map
|
package/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../warlock.js/logger/src/log-channel.ts","../../../../../../../warlock.js/logger/src/channels/console-log.ts","../../../../../../../warlock.js/logger/src/channels/file-log.ts","../../../../../../../warlock.js/logger/src/channels/json-file-log.ts","../../../../../../../warlock.js/logger/src/utils/clear-message.ts","../../../../../../../warlock.js/logger/src/logger.ts","../../../../../../../warlock.js/logger/src/utils/capture-unhandled-errors.ts"],"names":["LogChannel","configurations","key","data","allowedLevels","filter","dateFormat","date","time","ConsoleLog","module","action","message","level","colors","FileLog","dayjs","filePath","fs","error","fileName","extension","rotatedFilePath","path","EOL","logsDirectory","ensureDirectoryAsync","content","stack","directoryPath","groupKey","resolve","reject","writer","JSONFileLog","fileContents","fileExistsAsync","getJsonFileAsync","putJsonFileAsync","clearMessage","Logger","Random","channel","config","channels","dataOrModule","name","logger","log","captureAnyUnhandledRejection","reason","promise"],"mappings":"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","file":"index.js","sourcesContent":["import type { BasicLogConfigurations, LogContract, LoggingData } from \"./types\";\r\n\r\nexport abstract class LogChannel<\r\n Options extends BasicLogConfigurations = BasicLogConfigurations,\r\n> implements LogContract\r\n{\r\n /**\r\n * Channel name\r\n */\r\n public name!: string;\r\n\r\n /**\r\n * Channel description\r\n */\r\n public description?: string;\r\n\r\n /**\r\n * Determine if channel is logging in terminal\r\n */\r\n public terminal = false;\r\n\r\n /**\r\n * Default Configurations\r\n */\r\n protected defaultConfigurations: Options = {} as Options;\r\n\r\n /**\r\n * Channel configurations\r\n */\r\n protected channelConfigurations: Options = {} as Options; //\r\n\r\n /**\r\n * Determine whether the channel is fully initialized\r\n */\r\n protected isInitialized = false;\r\n\r\n /**\r\n * Constructor\r\n */\r\n public constructor(configurations?: Options) {\r\n if (configurations) {\r\n this.setConfigurations(configurations);\r\n }\r\n\r\n setTimeout(async () => {\r\n if (this.init) {\r\n await this.init();\r\n }\r\n\r\n this.isInitialized = true;\r\n }, 0);\r\n }\r\n\r\n /**\r\n * Initialize the channel\r\n */\r\n protected init?(): void | Promise<void>;\r\n\r\n /**\r\n * Get config value\r\n */\r\n protected config<K extends keyof Options>(key: K): Options[K] {\r\n return (\r\n this.channelConfigurations[key] ?? (this.defaultConfigurations ?? {})[key]\r\n );\r\n }\r\n\r\n /**\r\n * Set configurations\r\n */\r\n protected setConfigurations(configurations: Options) {\r\n this.channelConfigurations = {\r\n ...this.channelConfigurations,\r\n ...configurations,\r\n };\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Determine if the message should be logged\r\n */\r\n protected shouldBeLogged(data: LoggingData): boolean {\r\n // check for debug mode\r\n const allowedLevels = this.config(\"levels\");\r\n\r\n if (allowedLevels?.length && !allowedLevels.includes(data.type))\r\n return false;\r\n\r\n const filter = this.config(\"filter\");\r\n\r\n if (filter) {\r\n return filter(data);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Log the given message\r\n */\r\n public abstract log(data: LoggingData): void | Promise<void>;\r\n\r\n /**\r\n * Get date and time formats\r\n */\r\n protected getDateAndTimeFormat() {\r\n const dateFormat = this.config(\"dateFormat\");\r\n const date = dateFormat?.date ?? \"DD-MM-YYYY\";\r\n const time = dateFormat?.time ?? \"HH:mm:ss\";\r\n\r\n return { date, time };\r\n }\r\n\r\n /**\r\n * get basic configurations with the given ones\r\n */\r\n protected withBasicConfigurations(configurations: Partial<Options>): Options {\r\n return {\r\n filter: () => true,\r\n ...configurations,\r\n } as any as Options;\r\n }\r\n}\r\n","import { colors } from \"@mongez/copper\";\r\nimport { LogChannel } from \"../log-channel\";\r\nimport type { BasicLogConfigurations, LoggingData } from \"../types\";\r\n\r\nexport class ConsoleLog extends LogChannel<BasicLogConfigurations> {\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public name = \"console\";\r\n\r\n /**\r\n * Determine if channel is logging in terminal\r\n */\r\n public terminal = true;\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public log(data: LoggingData) {\r\n const { module, action, message, type: level } = data;\r\n\r\n if (!this.shouldBeLogged(data)) return;\r\n\r\n // display date and time with milliseconds\r\n const date = new Date().toISOString(); // i.e 2021-01-01T00:00:00.000Z\r\n switch (level) {\r\n case \"debug\":\r\n // add a debug icon\r\n console.log(\r\n colors.magentaBright(\"⚙\"),\r\n colors.yellow(`(${date})`),\r\n colors.cyan(`[${module}]`),\r\n colors.magenta(`[${action}]`),\r\n colors.magentaBright(message),\r\n );\r\n break;\r\n case \"info\":\r\n // add an info icon\r\n console.log(\r\n colors.blueBright(\"ℹ\"),\r\n colors.yellow(`(${date})`),\r\n colors.cyan(`[${module}]`),\r\n colors.magenta(`[${action}]`),\r\n colors.blueBright(message),\r\n );\r\n break;\r\n case \"warn\":\r\n // add a warning icon\r\n console.log(\r\n colors.yellow(\"⚠\"),\r\n colors.yellow(`(${date})`),\r\n colors.cyan(`[${module}]`),\r\n colors.magenta(`[${action}]`),\r\n colors.yellowBright(message),\r\n );\r\n break;\r\n case \"error\":\r\n // add an error icon\r\n console.log(\r\n colors.red(\"✗\"),\r\n colors.yellow(`(${date})`),\r\n colors.cyan(`[${module}]`),\r\n colors.magenta(`[${action}]`),\r\n colors.redBright(message),\r\n );\r\n break;\r\n\r\n case \"success\":\r\n // add a success icon\r\n console.log(\r\n colors.green(\"✓\"),\r\n colors.yellow(`(${date})`),\r\n colors.cyan(`[${module}]`),\r\n colors.magenta(`[${action}]`),\r\n colors.greenBright(message),\r\n );\r\n break;\r\n\r\n default:\r\n console.log(\r\n \"[log]\",\r\n colors.yellow(`(${date})`),\r\n colors.cyan(`[${module}]`),\r\n colors.magenta(`[${action}]`),\r\n message,\r\n );\r\n }\r\n\r\n if (typeof message === \"object\") {\r\n console.log(message);\r\n }\r\n }\r\n}\r\n","import { ensureDirectoryAsync } from \"@mongez/fs\";\r\nimport dayjs from \"dayjs\";\r\nimport fs from \"fs\";\r\nimport { EOL } from \"os\";\r\nimport path from \"path\";\r\nimport { LogChannel } from \"../log-channel\";\r\nimport type {\r\n BasicLogConfigurations,\r\n LogContract,\r\n LoggingData,\r\n LogLevel,\r\n LogMessage,\r\n} from \"../types\";\r\n\r\n// TODO: Add max messages per file before rotation\r\n\r\nexport type FileLogConfig = BasicLogConfigurations & {\r\n storagePath?: string;\r\n /**\r\n * File name, without extension\r\n */\r\n name?: string;\r\n /**\r\n * chunk mode\r\n * If set to `single`, the logs will be created in a single file, unless the rotate is set to true\r\n * If set to `daily`, the logs will be created in a daily file, unless the rotate is set to true\r\n * If set to `hourly`, the logs will be created in an hourly file, unless the rotate is set to true\r\n * @default single\r\n */\r\n chunk?: \"single\" | \"daily\" | \"hourly\";\r\n /**\r\n * Whether to rotate the file\r\n *\r\n * @default true\r\n */\r\n rotate?: boolean;\r\n /**\r\n * File Extension\r\n *\r\n * @default log\r\n */\r\n extension?: string;\r\n /**\r\n * If rotate is set, the rotate name will be added to the file name suffixed with `-`\r\n *\r\n * @default DD-MM-YYYY\r\n */\r\n rotateFileName?: string;\r\n /**\r\n * Max file size before rotating the file\r\n *\r\n * @default 10MB\r\n */\r\n maxFileSize?: number;\r\n /**\r\n * Set the max messages that needs to be added before writing to the file\r\n *\r\n * @default 100\r\n */\r\n maxMessagesToWrite?: number;\r\n /**\r\n * Group logs by\r\n * Please note that the order matters here\r\n * For example, if you set `groupBy: ['level', 'module']`, the logs will be added in level name first, then by module\r\n *\r\n * @default none\r\n */\r\n groupBy?: (\"level\" | \"module\" | \"action\")[];\r\n /**\r\n * Define what levels should be logged\r\n *\r\n * @default all\r\n */\r\n levels?: LogLevel[];\r\n /**\r\n * Date and time format\r\n */\r\n dateFormat?: {\r\n date?: string;\r\n time?: string;\r\n };\r\n};\r\n\r\nexport class FileLog extends LogChannel<FileLogConfig> implements LogContract {\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public name = \"file\";\r\n\r\n /**\r\n * Messages buffer\r\n */\r\n protected messages: LogMessage[] = [];\r\n\r\n /**\r\n * Grouped messages\r\n */\r\n protected groupedMessages: Record<string, LogMessage[]> = {};\r\n\r\n /**\r\n * Default channel configurations\r\n */\r\n protected defaultConfigurations: FileLogConfig = {\r\n storagePath: process.cwd() + \"/storage/logs\",\r\n rotate: true,\r\n name: \"app\",\r\n extension: \"log\",\r\n chunk: \"single\",\r\n maxMessagesToWrite: 100,\r\n filter: () => true,\r\n maxFileSize: 10 * 1024 * 1024, // 10MB\r\n get rotateFileName() {\r\n return dayjs().format(\"DD-MM-YYYY\");\r\n },\r\n dateFormat: {\r\n date: \"DD-MM-YYYY\",\r\n time: \"HH:mm:ss\",\r\n },\r\n };\r\n\r\n /**\r\n * Last write time\r\n */\r\n protected lastWriteTime = Date.now();\r\n\r\n /**\r\n * A flag to determine if the file is being written\r\n */\r\n protected isWriting = false;\r\n\r\n /**\r\n * Check file size for file rotation\r\n */\r\n protected async checkAndRotateFile(filePath = this.filePath) {\r\n if (!this.config(\"rotate\")) return;\r\n\r\n try {\r\n const stats = await fs.promises.stat(filePath);\r\n if (stats.size >= this.config(\"maxFileSize\")!) {\r\n await this.rotateLogFile();\r\n }\r\n } catch (error: any) {\r\n if (error.code === \"ENOENT\") {\r\n // File doesn't exist, this can be normal if it's a new file\r\n console.log(\"Log file does not exist, will be created on first write.\");\r\n } else {\r\n console.error(\"Error checking log file:\", error);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Rotate log file\r\n */\r\n protected async rotateLogFile() {\r\n const fileName = `${this.fileName}-${this.config(\r\n \"rotateFileName\",\r\n )}-${Date.now()}`;\r\n\r\n const extension = this.extension;\r\n\r\n const rotatedFilePath = path.join(\r\n this.storagePath,\r\n `${fileName}.${extension}`,\r\n );\r\n\r\n await fs.promises.rename(this.filePath, rotatedFilePath).catch(error => {\r\n console.error(\"Error rotating file:\", error);\r\n });\r\n }\r\n\r\n /**\r\n * Flush messages\r\n */\r\n protected initMessageFlush() {\r\n setInterval(() => {\r\n if (\r\n this.messages.length > 0 &&\r\n (this.messages.length >= this.maxMessagesToWrite ||\r\n Date.now() - this.lastWriteTime > 5000)\r\n ) {\r\n this.writeMessagesToFile();\r\n }\r\n }, 5000); // Periodic check\r\n }\r\n\r\n /**\r\n * Get file path\r\n */\r\n public get filePath() {\r\n const fileName = this.fileName;\r\n\r\n const extension = this.extension;\r\n\r\n return path.join(this.storagePath, `${fileName}.${extension}`);\r\n }\r\n\r\n /**\r\n * Get max messages\r\n */\r\n protected get maxMessagesToWrite(): number {\r\n return this.config(\"maxMessagesToWrite\")!;\r\n }\r\n\r\n /**\r\n * Get file name\r\n */\r\n public get fileName(): string {\r\n const debugLevel = this.config(\"chunk\")!;\r\n\r\n switch (debugLevel) {\r\n case \"single\":\r\n default:\r\n return this.config(\"name\")!;\r\n case \"daily\":\r\n return dayjs().format(\"DD-MM-YYYY\");\r\n case \"hourly\":\r\n return dayjs().format(\"DD-MM-YYYY-HH\");\r\n }\r\n }\r\n\r\n /**\r\n * Get file extension\r\n */\r\n public get extension(): string {\r\n return this.config(\"extension\")!;\r\n }\r\n\r\n /**\r\n * Get content\r\n */\r\n protected get content() {\r\n return this.messages.map(message => message.content).join(EOL) + EOL;\r\n }\r\n\r\n /**\r\n * Get storage path\r\n */\r\n public get storagePath(): string {\r\n return this.config(\"storagePath\")!;\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n protected async init() {\r\n const logsDirectory = this.storagePath;\r\n\r\n await ensureDirectoryAsync(logsDirectory);\r\n\r\n this.initMessageFlush();\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async log(data: LoggingData) {\r\n const { module, action, message, type: level } = data;\r\n\r\n if (!this.shouldBeLogged(data)) return;\r\n\r\n const { date: dateFormat, time } = this.getDateAndTimeFormat();\r\n\r\n const date = dayjs().format(dateFormat + \" \" + time);\r\n\r\n let content = `[${date}] [${level}] [${module}][${action}]: `;\r\n\r\n let stack: string | undefined;\r\n\r\n // check if message is an instance of Error\r\n if (message instanceof Error) {\r\n // in that case we need to store the error message and stack trace\r\n content += message.message + EOL;\r\n content += `[trace]` + EOL;\r\n content += message.stack;\r\n stack = message.stack;\r\n } else {\r\n content += message;\r\n }\r\n\r\n this.messages.push({\r\n content,\r\n level,\r\n date,\r\n module,\r\n action,\r\n stack,\r\n });\r\n\r\n await this.checkIfMessagesShouldBeWritten(); // Immediate check on buffer size\r\n }\r\n\r\n /**\r\n * Check if messages should be written\r\n */\r\n protected async checkIfMessagesShouldBeWritten() {\r\n if (\r\n this.messages.length >= this.maxMessagesToWrite ||\r\n Date.now() - this.lastWriteTime > 5000\r\n ) {\r\n await this.writeMessagesToFile();\r\n }\r\n }\r\n\r\n /**\r\n * Should be called after messages are saved\r\n */\r\n protected onSave() {\r\n this.messages = [];\r\n this.groupedMessages = {};\r\n this.isWriting = false;\r\n this.lastWriteTime = Date.now();\r\n }\r\n\r\n /**\r\n * Check if messages should be grouped\r\n */\r\n protected get messagedShouldBeGrouped(): boolean {\r\n return Number(this.config(\"groupBy\")?.length) > 0;\r\n }\r\n\r\n /**\r\n * Write messages to the file\r\n */\r\n protected async writeMessagesToFile() {\r\n if (this.messages.length === 0 || this.isWriting || !this.isInitialized)\r\n return;\r\n\r\n this.isWriting = true;\r\n\r\n if (this.messagedShouldBeGrouped) {\r\n return await this.writeGroupedMessagesToFile();\r\n }\r\n\r\n await this.checkAndRotateFile(); // Ensure we check file size before writing\r\n\r\n try {\r\n await this.write(this.filePath, this.content);\r\n this.onSave();\r\n } catch (error) {\r\n console.error(\"Failed to write log:\", error);\r\n // Implement fallback logic here\r\n this.isWriting = false;\r\n }\r\n }\r\n\r\n /**\r\n * Write grouped messages to the file\r\n */\r\n protected async writeGroupedMessagesToFile(): Promise<void> {\r\n // first step, is to group the messages\r\n this.prepareGroupedMessages();\r\n\r\n // now each key in the grouped messages, represents the directory path that should extend the storage path\r\n for (const key in this.groupedMessages) {\r\n const directoryPath = path.join(this.storagePath, key);\r\n\r\n await ensureDirectoryAsync(directoryPath);\r\n\r\n const filePath = path.join(\r\n directoryPath,\r\n `${this.fileName}.${this.extension}`,\r\n );\r\n\r\n await this.checkAndRotateFile(filePath); // Ensure we check file size before writing\r\n\r\n const content =\r\n this.groupedMessages[key].map(message => message.content).join(EOL) +\r\n EOL;\r\n\r\n try {\r\n await this.write(filePath, content);\r\n } catch (error) {\r\n console.error(\"Failed to write log:\", error);\r\n }\r\n }\r\n\r\n this.onSave();\r\n this.isWriting = false;\r\n }\r\n\r\n /**\r\n * Prepare grouped messages\r\n */\r\n protected prepareGroupedMessages(): void {\r\n this.messages.forEach(message => {\r\n const key = this.config(\"groupBy\")!\r\n .map(groupKey => encodeURIComponent(message[groupKey]))\r\n .join(\"/\");\r\n\r\n this.groupedMessages[key] = this.groupedMessages[key] || [];\r\n this.groupedMessages[key].push(message);\r\n });\r\n }\r\n\r\n /**\r\n * Start writing to the file\r\n */\r\n protected async write(filePath: string, content: string) {\r\n return new Promise((resolve, reject) => {\r\n const writer = fs.createWriteStream(filePath, { flags: \"a\" });\r\n\r\n writer.write(content, error => {\r\n writer.end();\r\n if (error) {\r\n reject(error);\r\n } else {\r\n resolve(true);\r\n }\r\n });\r\n });\r\n }\r\n}\r\n","import {\r\n ensureDirectoryAsync,\r\n fileExistsAsync,\r\n getJsonFileAsync,\r\n putJsonFileAsync,\r\n} from \"@mongez/fs\";\r\nimport dayjs from \"dayjs\";\r\nimport path from \"path\";\r\nimport type { LogContract, LogMessage, LoggingData } from \"../types\";\r\nimport { FileLog } from \"./file-log\";\r\n\r\nexport class JSONFileLog extends FileLog implements LogContract {\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public name = \"fileJson\";\r\n\r\n /**\r\n * Get file extension\r\n */\r\n public get extension(): string {\r\n return \"json\";\r\n }\r\n\r\n /**\r\n * Get initial file contents\r\n */\r\n protected get initialFileContents(): Record<string, any> {\r\n return {\r\n messages: this.messages,\r\n };\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async log(data: LoggingData) {\r\n let stack: string[] | undefined;\r\n\r\n if (data.message instanceof Error) {\r\n stack = data.message.stack?.split(\"\\n\");\r\n data.message = data.message.message;\r\n }\r\n\r\n const { module, action, message, type: level } = data;\r\n\r\n if (!this.shouldBeLogged(data)) return;\r\n\r\n const { date: dateFormat, time } = this.getDateAndTimeFormat();\r\n\r\n const date = dayjs().format(dateFormat + \" \" + time);\r\n\r\n this.messages.push({\r\n content: message,\r\n level,\r\n date,\r\n module,\r\n action,\r\n stack,\r\n } as LogMessage);\r\n\r\n await this.checkIfMessagesShouldBeWritten(); // Immediate check on buffer size\r\n }\r\n\r\n /**\r\n * Write messages to the file\r\n */\r\n protected async writeMessagesToFile(): Promise<void> {\r\n if (this.messages.length === 0 || this.isWriting) return;\r\n\r\n this.isWriting = true;\r\n\r\n if (this.messagedShouldBeGrouped) {\r\n return await this.writeGroupedMessagesToFile();\r\n }\r\n\r\n await this.checkAndRotateFile(); // Ensure file rotation is handled\r\n\r\n let fileContents;\r\n if (await fileExistsAsync(this.filePath)) {\r\n try {\r\n fileContents = await getJsonFileAsync(this.filePath);\r\n } catch (error) {\r\n console.error(\"Error reading log file, reinitializing:\", error);\r\n fileContents = { messages: [] }; // Reinitialize the file if corrupted\r\n }\r\n } else {\r\n fileContents = { messages: [] }; // Reinitialize the file if corrupted\r\n }\r\n\r\n fileContents.messages.push(...this.messages);\r\n\r\n try {\r\n await putJsonFileAsync(this.filePath, fileContents, { spaces: 2 });\r\n\r\n this.onSave();\r\n } catch (error) {\r\n console.error(\"Failed to write log:\", error);\r\n // Implement fallback logic here\r\n this.isWriting = false;\r\n }\r\n }\r\n\r\n /**\r\n * Write grouped messages to the file\r\n */\r\n protected async writeGroupedMessagesToFile(): Promise<void> {\r\n // first step, is to group the messages\r\n this.prepareGroupedMessages();\r\n\r\n // now each key in the grouped messages, represents the directory path that should extend the storage path\r\n for (const key in this.groupedMessages) {\r\n const directoryPath = path.join(this.storagePath, key);\r\n\r\n await ensureDirectoryAsync(directoryPath);\r\n\r\n const filePath = path.join(\r\n directoryPath,\r\n `${this.fileName}.${this.extension}`,\r\n );\r\n\r\n await this.checkAndRotateFile(filePath); // Ensure we check file size before writing\r\n\r\n const content = this.groupedMessages[key];\r\n\r\n try {\r\n await putJsonFileAsync(filePath, content, { spaces: 2 });\r\n } catch (error) {\r\n console.error(\"Failed to write log:\", error);\r\n this.isWriting = false;\r\n }\r\n }\r\n\r\n this.onSave();\r\n }\r\n}\r\n","/**\r\n * Clear message from any terminal codes\r\n */\r\nexport function clearMessage(message: any) {\r\n if (typeof message !== \"string\") return message;\r\n\r\n // eslint-disable-next-line no-control-regex\r\n return message.replace(/\\u001b[^m]*?m/g, \"\");\r\n}\r\n","import { Random } from \"@mongez/reinforcements\";\r\nimport type { LogChannel } from \"./log-channel\";\r\nimport type { Log, LoggingData, LogLevel, OmittedLoggingData } from \"./types\";\r\nimport { clearMessage } from \"./utils/clear-message\";\r\n\r\nexport class Logger {\r\n /**\r\n * Current channel\r\n */\r\n public channels: LogChannel[] = [];\r\n\r\n public id = \"logger-\" + Random.string(32);\r\n\r\n /**\r\n * Add a new channel\r\n */\r\n public addChannel(channel: LogChannel) {\r\n this.channels.push(channel);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set base configurations\r\n */\r\n public configure(config: { channels: LogChannel[] }) {\r\n this.channels = config.channels;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set channels\r\n */\r\n public setChannels(channels: LogChannel[]) {\r\n this.channels = channels;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Normalize log data to a single object\r\n */\r\n private normalizeLogData(\r\n dataOrModule: LoggingData | OmittedLoggingData | string,\r\n action?: string,\r\n message: any = \"\",\r\n level?: LogLevel,\r\n ): LoggingData {\r\n if (typeof dataOrModule === \"object\") {\r\n // If level is provided, override type\r\n return {\r\n type: (level || (dataOrModule as any).type || \"info\") as LogLevel,\r\n module: dataOrModule.module,\r\n action: dataOrModule.action,\r\n message: dataOrModule.message,\r\n ...(dataOrModule.context ? { context: dataOrModule.context } : {}),\r\n };\r\n }\r\n return {\r\n type: (level || \"info\") as LogLevel,\r\n module: dataOrModule,\r\n action: action as string,\r\n message,\r\n };\r\n }\r\n\r\n /**\r\n * Make log\r\n */\r\n public async log(data: LoggingData) {\r\n for (const channel of this.channels) {\r\n if (channel.terminal === false) {\r\n data.message = clearMessage(data.message);\r\n }\r\n\r\n channel.log(data);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Make debug log\r\n */\r\n public debug(\r\n dataOrModule: LoggingData | string,\r\n action?: string,\r\n message: any = \"\",\r\n ) {\r\n const data = this.normalizeLogData(dataOrModule, action, message, \"debug\");\r\n return this.log(data);\r\n }\r\n\r\n /**\r\n * Make info log\r\n */\r\n public info(\r\n dataOrModule: OmittedLoggingData | string,\r\n action?: string,\r\n message: any = \"\",\r\n ) {\r\n const data = this.normalizeLogData(dataOrModule, action, message, \"info\");\r\n return this.log(data);\r\n }\r\n\r\n /**\r\n * Make warn log\r\n */\r\n public warn(\r\n dataOrModule: LoggingData | string,\r\n action?: string,\r\n message: any = \"\",\r\n ) {\r\n const data = this.normalizeLogData(dataOrModule, action, message, \"warn\");\r\n return this.log(data);\r\n }\r\n\r\n /**\r\n * Make error log\r\n */\r\n public error(\r\n dataOrModule: LoggingData | string,\r\n action?: string,\r\n message: any = \"\",\r\n ) {\r\n const data = this.normalizeLogData(dataOrModule, action, message, \"error\");\r\n return this.log(data);\r\n }\r\n\r\n /**\r\n * Make success log\r\n */\r\n public success(\r\n dataOrModule: LoggingData | string,\r\n action?: string,\r\n message: any = \"\",\r\n ) {\r\n const data = this.normalizeLogData(\r\n dataOrModule,\r\n action,\r\n message,\r\n \"success\",\r\n );\r\n\r\n return this.log(data);\r\n }\r\n\r\n /**\r\n * Get channel by name\r\n */\r\n public channel(name: string) {\r\n return this.channels.find(channel => channel.name === name);\r\n }\r\n}\r\n\r\nexport const logger = new Logger();\r\n\r\nexport const log: Log = (data: LoggingData) => {\r\n return logger.log(data);\r\n};\r\n\r\nlog.info = logger.info.bind(logger) as Log[\"info\"];\r\nlog.debug = logger.debug.bind(logger) as Log[\"debug\"];\r\nlog.warn = logger.warn.bind(logger) as Log[\"warn\"];\r\nlog.error = logger.error.bind(logger) as Log[\"error\"];\r\nlog.success = logger.success.bind(logger) as Log[\"success\"];\r\n\r\nlog.channel = logger.channel.bind(logger);\r\n","import { log } from \"../logger\";\r\n\r\nexport function captureAnyUnhandledRejection() {\r\n process.on(\"unhandledRejection\", (reason: any, promise) => {\r\n log.error(\"app\", \"unhandledRejection\", reason);\r\n console.log(promise);\r\n // console.trace();\r\n });\r\n\r\n process.on(\"uncaughtException\", error => {\r\n log.error(\"app\", \"uncaughtException\", error);\r\n // console.trace();\r\n console.log(error);\r\n });\r\n}\r\n"]}
|
package/esm/index.js
CHANGED
|
@@ -1 +1,3 @@
|
|
|
1
|
-
|
|
1
|
+
import {colors}from'@mongez/copper';import {ensureDirectoryAsync,fileExistsAsync,getJsonFileAsync,putJsonFileAsync}from'@mongez/fs';import u from'dayjs';import L from'fs';import {EOL}from'os';import f from'path';import {Random}from'@mongez/reinforcements';var h=class{name;description;terminal=false;defaultConfigurations={};channelConfigurations={};isInitialized=false;constructor(e){e&&this.setConfigurations(e),setTimeout(async()=>{this.init&&await this.init(),this.isInitialized=true;},0);}config(e){return this.channelConfigurations[e]??(this.defaultConfigurations??{})[e]}setConfigurations(e){return this.channelConfigurations={...this.channelConfigurations,...e},this}shouldBeLogged(e){let t=this.config("levels");if(t?.length&&!t.includes(e.type))return false;let s=this.config("filter");return s?s(e):true}getDateAndTimeFormat(){let e=this.config("dateFormat"),t=e?.date??"DD-MM-YYYY",s=e?.time??"HH:mm:ss";return {date:t,time:s}}withBasicConfigurations(e){return {filter:()=>true,...e}}};var x=class extends h{name="console";terminal=true;log(e){let{module:t,action:s,message:i,type:r}=e;if(!this.shouldBeLogged(e))return;let a=new Date().toISOString();switch(r){case "debug":console.log(colors.magentaBright("\u2699"),colors.yellow(`(${a})`),colors.cyan(`[${t}]`),colors.magenta(`[${s}]`),colors.magentaBright(i));break;case "info":console.log(colors.blueBright("\u2139"),colors.yellow(`(${a})`),colors.cyan(`[${t}]`),colors.magenta(`[${s}]`),colors.blueBright(i));break;case "warn":console.log(colors.yellow("\u26A0"),colors.yellow(`(${a})`),colors.cyan(`[${t}]`),colors.magenta(`[${s}]`),colors.yellowBright(i));break;case "error":console.log(colors.red("\u2717"),colors.yellow(`(${a})`),colors.cyan(`[${t}]`),colors.magenta(`[${s}]`),colors.redBright(i));break;case "success":console.log(colors.green("\u2713"),colors.yellow(`(${a})`),colors.cyan(`[${t}]`),colors.magenta(`[${s}]`),colors.greenBright(i));break;default:console.log("[log]",colors.yellow(`(${a})`),colors.cyan(`[${t}]`),colors.magenta(`[${s}]`),i);}typeof i=="object"&&console.log(i);}};var d=class extends h{name="file";messages=[];groupedMessages={};defaultConfigurations={storagePath:process.cwd()+"/storage/logs",rotate:true,name:"app",extension:"log",chunk:"single",maxMessagesToWrite:100,filter:()=>true,maxFileSize:10*1024*1024,get rotateFileName(){return u().format("DD-MM-YYYY")},dateFormat:{date:"DD-MM-YYYY",time:"HH:mm:ss"}};lastWriteTime=Date.now();isWriting=false;async checkAndRotateFile(e=this.filePath){if(this.config("rotate"))try{(await L.promises.stat(e)).size>=this.config("maxFileSize")&&await this.rotateLogFile();}catch(t){t.code==="ENOENT"?console.log("Log file does not exist, will be created on first write."):console.error("Error checking log file:",t);}}async rotateLogFile(){let e=`${this.fileName}-${this.config("rotateFileName")}-${Date.now()}`,t=this.extension,s=f.join(this.storagePath,`${e}.${t}`);await L.promises.rename(this.filePath,s).catch(i=>{console.error("Error rotating file:",i);});}initMessageFlush(){setInterval(()=>{this.messages.length>0&&(this.messages.length>=this.maxMessagesToWrite||Date.now()-this.lastWriteTime>5e3)&&this.writeMessagesToFile();},5e3);}get filePath(){let e=this.fileName,t=this.extension;return f.join(this.storagePath,`${e}.${t}`)}get maxMessagesToWrite(){return this.config("maxMessagesToWrite")}get fileName(){switch(this.config("chunk")){case "single":default:return this.config("name");case "daily":return u().format("DD-MM-YYYY");case "hourly":return u().format("DD-MM-YYYY-HH")}}get extension(){return this.config("extension")}get content(){return this.messages.map(e=>e.content).join(EOL)+EOL}get storagePath(){return this.config("storagePath")}async init(){let e=this.storagePath;await ensureDirectoryAsync(e),this.initMessageFlush();}async log(e){let{module:t,action:s,message:i,type:r}=e;if(!this.shouldBeLogged(e))return;let{date:a,time:y}=this.getDateAndTimeFormat(),m=u().format(a+" "+y),l=`[${m}] [${r}] [${t}][${s}]: `,b;i instanceof Error?(l+=i.message+EOL,l+="[trace]"+EOL,l+=i.stack,b=i.stack):l+=i,this.messages.push({content:l,level:r,date:m,module:t,action:s,stack:b}),await this.checkIfMessagesShouldBeWritten();}async checkIfMessagesShouldBeWritten(){(this.messages.length>=this.maxMessagesToWrite||Date.now()-this.lastWriteTime>5e3)&&await this.writeMessagesToFile();}onSave(){this.messages=[],this.groupedMessages={},this.isWriting=false,this.lastWriteTime=Date.now();}get messagedShouldBeGrouped(){return Number(this.config("groupBy")?.length)>0}async writeMessagesToFile(){if(!(this.messages.length===0||this.isWriting||!this.isInitialized)){if(this.isWriting=true,this.messagedShouldBeGrouped)return await this.writeGroupedMessagesToFile();await this.checkAndRotateFile();try{await this.write(this.filePath,this.content),this.onSave();}catch(e){console.error("Failed to write log:",e),this.isWriting=false;}}}async writeGroupedMessagesToFile(){this.prepareGroupedMessages();for(let e in this.groupedMessages){let t=f.join(this.storagePath,e);await ensureDirectoryAsync(t);let s=f.join(t,`${this.fileName}.${this.extension}`);await this.checkAndRotateFile(s);let i=this.groupedMessages[e].map(r=>r.content).join(EOL)+EOL;try{await this.write(s,i);}catch(r){console.error("Failed to write log:",r);}}this.onSave(),this.isWriting=false;}prepareGroupedMessages(){this.messages.forEach(e=>{let t=this.config("groupBy").map(s=>encodeURIComponent(e[s])).join("/");this.groupedMessages[t]=this.groupedMessages[t]||[],this.groupedMessages[t].push(e);});}async write(e,t){return new Promise((s,i)=>{let r=L.createWriteStream(e,{flags:"a"});r.write(t,a=>{r.end(),a?i(a):s(true);});})}};var C=class extends d{name="fileJson";get extension(){return "json"}get initialFileContents(){return {messages:this.messages}}async log(e){let t;e.message instanceof Error&&(t=e.message.stack?.split(`
|
|
2
|
+
`),e.message=e.message.message);let{module:s,action:i,message:r,type:a}=e;if(!this.shouldBeLogged(e))return;let{date:y,time:m}=this.getDateAndTimeFormat(),l=u().format(y+" "+m);this.messages.push({content:r,level:a,date:l,module:s,action:i,stack:t}),await this.checkIfMessagesShouldBeWritten();}async writeMessagesToFile(){if(this.messages.length===0||this.isWriting)return;if(this.isWriting=true,this.messagedShouldBeGrouped)return await this.writeGroupedMessagesToFile();await this.checkAndRotateFile();let e;if(await fileExistsAsync(this.filePath))try{e=await getJsonFileAsync(this.filePath);}catch(t){console.error("Error reading log file, reinitializing:",t),e={messages:[]};}else e={messages:[]};e.messages.push(...this.messages);try{await putJsonFileAsync(this.filePath,e,{spaces:2}),this.onSave();}catch(t){console.error("Failed to write log:",t),this.isWriting=false;}}async writeGroupedMessagesToFile(){this.prepareGroupedMessages();for(let e in this.groupedMessages){let t=f.join(this.storagePath,e);await ensureDirectoryAsync(t);let s=f.join(t,`${this.fileName}.${this.extension}`);await this.checkAndRotateFile(s);let i=this.groupedMessages[e];try{await putJsonFileAsync(s,i,{spaces:2});}catch(r){console.error("Failed to write log:",r),this.isWriting=false;}}this.onSave();}};function $(n){return typeof n!="string"?n:n.replace(/\u001b[^m]*?m/g,"")}var w=class{channels=[];id="logger-"+Random.string(32);addChannel(e){return this.channels.push(e),this}configure(e){return this.channels=e.channels,this}setChannels(e){return this.channels=e,this}normalizeLogData(e,t,s="",i){return typeof e=="object"?{type:i||e.type||"info",module:e.module,action:e.action,message:e.message,...e.context?{context:e.context}:{}}:{type:i||"info",module:e,action:t,message:s}}async log(e){for(let t of this.channels)t.terminal===false&&(e.message=$(e.message)),t.log(e);return this}debug(e,t,s=""){let i=this.normalizeLogData(e,t,s,"debug");return this.log(i)}info(e,t,s=""){let i=this.normalizeLogData(e,t,s,"info");return this.log(i)}warn(e,t,s=""){let i=this.normalizeLogData(e,t,s,"warn");return this.log(i)}error(e,t,s=""){let i=this.normalizeLogData(e,t,s,"error");return this.log(i)}success(e,t,s=""){let i=this.normalizeLogData(e,t,s,"success");return this.log(i)}channel(e){return this.channels.find(t=>t.name===e)}},g=new w,c=n=>g.log(n);c.info=g.info.bind(g);c.debug=g.debug.bind(g);c.warn=g.warn.bind(g);c.error=g.error.bind(g);c.success=g.success.bind(g);c.channel=g.channel.bind(g);function ie(){process.on("unhandledRejection",(n,e)=>{c.error("app","unhandledRejection",n),console.log(e);}),process.on("uncaughtException",n=>{c.error("app","uncaughtException",n),console.log(n);});}export{x as ConsoleLog,d as FileLog,C as JSONFileLog,h as LogChannel,w as Logger,ie as captureAnyUnhandledRejection,$ as clearMessage,c as log,g as logger};//# sourceMappingURL=index.js.map
|
|
3
|
+
//# sourceMappingURL=index.js.map
|
package/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../warlock.js/logger/src/log-channel.ts","../../../../../../../warlock.js/logger/src/channels/console-log.ts","../../../../../../../warlock.js/logger/src/channels/file-log.ts","../../../../../../../warlock.js/logger/src/channels/json-file-log.ts","../../../../../../../warlock.js/logger/src/utils/clear-message.ts","../../../../../../../warlock.js/logger/src/logger.ts","../../../../../../../warlock.js/logger/src/utils/capture-unhandled-errors.ts"],"names":["LogChannel","configurations","key","data","allowedLevels","filter","dateFormat","date","time","ConsoleLog","module","action","message","level","colors","FileLog","dayjs","filePath","fs","error","fileName","extension","rotatedFilePath","path","EOL","logsDirectory","ensureDirectoryAsync","content","stack","directoryPath","groupKey","resolve","reject","writer","JSONFileLog","fileContents","fileExistsAsync","getJsonFileAsync","putJsonFileAsync","clearMessage","Logger","Random","channel","config","channels","dataOrModule","name","logger","log","captureAnyUnhandledRejection","reason","promise"],"mappings":"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","file":"index.js","sourcesContent":["import type { BasicLogConfigurations, LogContract, LoggingData } from \"./types\";\r\n\r\nexport abstract class LogChannel<\r\n Options extends BasicLogConfigurations = BasicLogConfigurations,\r\n> implements LogContract\r\n{\r\n /**\r\n * Channel name\r\n */\r\n public name!: string;\r\n\r\n /**\r\n * Channel description\r\n */\r\n public description?: string;\r\n\r\n /**\r\n * Determine if channel is logging in terminal\r\n */\r\n public terminal = false;\r\n\r\n /**\r\n * Default Configurations\r\n */\r\n protected defaultConfigurations: Options = {} as Options;\r\n\r\n /**\r\n * Channel configurations\r\n */\r\n protected channelConfigurations: Options = {} as Options; //\r\n\r\n /**\r\n * Determine whether the channel is fully initialized\r\n */\r\n protected isInitialized = false;\r\n\r\n /**\r\n * Constructor\r\n */\r\n public constructor(configurations?: Options) {\r\n if (configurations) {\r\n this.setConfigurations(configurations);\r\n }\r\n\r\n setTimeout(async () => {\r\n if (this.init) {\r\n await this.init();\r\n }\r\n\r\n this.isInitialized = true;\r\n }, 0);\r\n }\r\n\r\n /**\r\n * Initialize the channel\r\n */\r\n protected init?(): void | Promise<void>;\r\n\r\n /**\r\n * Get config value\r\n */\r\n protected config<K extends keyof Options>(key: K): Options[K] {\r\n return (\r\n this.channelConfigurations[key] ?? (this.defaultConfigurations ?? {})[key]\r\n );\r\n }\r\n\r\n /**\r\n * Set configurations\r\n */\r\n protected setConfigurations(configurations: Options) {\r\n this.channelConfigurations = {\r\n ...this.channelConfigurations,\r\n ...configurations,\r\n };\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Determine if the message should be logged\r\n */\r\n protected shouldBeLogged(data: LoggingData): boolean {\r\n // check for debug mode\r\n const allowedLevels = this.config(\"levels\");\r\n\r\n if (allowedLevels?.length && !allowedLevels.includes(data.type))\r\n return false;\r\n\r\n const filter = this.config(\"filter\");\r\n\r\n if (filter) {\r\n return filter(data);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Log the given message\r\n */\r\n public abstract log(data: LoggingData): void | Promise<void>;\r\n\r\n /**\r\n * Get date and time formats\r\n */\r\n protected getDateAndTimeFormat() {\r\n const dateFormat = this.config(\"dateFormat\");\r\n const date = dateFormat?.date ?? \"DD-MM-YYYY\";\r\n const time = dateFormat?.time ?? \"HH:mm:ss\";\r\n\r\n return { date, time };\r\n }\r\n\r\n /**\r\n * get basic configurations with the given ones\r\n */\r\n protected withBasicConfigurations(configurations: Partial<Options>): Options {\r\n return {\r\n filter: () => true,\r\n ...configurations,\r\n } as any as Options;\r\n }\r\n}\r\n","import { colors } from \"@mongez/copper\";\r\nimport { LogChannel } from \"../log-channel\";\r\nimport type { BasicLogConfigurations, LoggingData } from \"../types\";\r\n\r\nexport class ConsoleLog extends LogChannel<BasicLogConfigurations> {\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public name = \"console\";\r\n\r\n /**\r\n * Determine if channel is logging in terminal\r\n */\r\n public terminal = true;\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public log(data: LoggingData) {\r\n const { module, action, message, type: level } = data;\r\n\r\n if (!this.shouldBeLogged(data)) return;\r\n\r\n // display date and time with milliseconds\r\n const date = new Date().toISOString(); // i.e 2021-01-01T00:00:00.000Z\r\n switch (level) {\r\n case \"debug\":\r\n // add a debug icon\r\n console.log(\r\n colors.magentaBright(\"⚙\"),\r\n colors.yellow(`(${date})`),\r\n colors.cyan(`[${module}]`),\r\n colors.magenta(`[${action}]`),\r\n colors.magentaBright(message),\r\n );\r\n break;\r\n case \"info\":\r\n // add an info icon\r\n console.log(\r\n colors.blueBright(\"ℹ\"),\r\n colors.yellow(`(${date})`),\r\n colors.cyan(`[${module}]`),\r\n colors.magenta(`[${action}]`),\r\n colors.blueBright(message),\r\n );\r\n break;\r\n case \"warn\":\r\n // add a warning icon\r\n console.log(\r\n colors.yellow(\"⚠\"),\r\n colors.yellow(`(${date})`),\r\n colors.cyan(`[${module}]`),\r\n colors.magenta(`[${action}]`),\r\n colors.yellowBright(message),\r\n );\r\n break;\r\n case \"error\":\r\n // add an error icon\r\n console.log(\r\n colors.red(\"✗\"),\r\n colors.yellow(`(${date})`),\r\n colors.cyan(`[${module}]`),\r\n colors.magenta(`[${action}]`),\r\n colors.redBright(message),\r\n );\r\n break;\r\n\r\n case \"success\":\r\n // add a success icon\r\n console.log(\r\n colors.green(\"✓\"),\r\n colors.yellow(`(${date})`),\r\n colors.cyan(`[${module}]`),\r\n colors.magenta(`[${action}]`),\r\n colors.greenBright(message),\r\n );\r\n break;\r\n\r\n default:\r\n console.log(\r\n \"[log]\",\r\n colors.yellow(`(${date})`),\r\n colors.cyan(`[${module}]`),\r\n colors.magenta(`[${action}]`),\r\n message,\r\n );\r\n }\r\n\r\n if (typeof message === \"object\") {\r\n console.log(message);\r\n }\r\n }\r\n}\r\n","import { ensureDirectoryAsync } from \"@mongez/fs\";\r\nimport dayjs from \"dayjs\";\r\nimport fs from \"fs\";\r\nimport { EOL } from \"os\";\r\nimport path from \"path\";\r\nimport { LogChannel } from \"../log-channel\";\r\nimport type {\r\n BasicLogConfigurations,\r\n LogContract,\r\n LoggingData,\r\n LogLevel,\r\n LogMessage,\r\n} from \"../types\";\r\n\r\n// TODO: Add max messages per file before rotation\r\n\r\nexport type FileLogConfig = BasicLogConfigurations & {\r\n storagePath?: string;\r\n /**\r\n * File name, without extension\r\n */\r\n name?: string;\r\n /**\r\n * chunk mode\r\n * If set to `single`, the logs will be created in a single file, unless the rotate is set to true\r\n * If set to `daily`, the logs will be created in a daily file, unless the rotate is set to true\r\n * If set to `hourly`, the logs will be created in an hourly file, unless the rotate is set to true\r\n * @default single\r\n */\r\n chunk?: \"single\" | \"daily\" | \"hourly\";\r\n /**\r\n * Whether to rotate the file\r\n *\r\n * @default true\r\n */\r\n rotate?: boolean;\r\n /**\r\n * File Extension\r\n *\r\n * @default log\r\n */\r\n extension?: string;\r\n /**\r\n * If rotate is set, the rotate name will be added to the file name suffixed with `-`\r\n *\r\n * @default DD-MM-YYYY\r\n */\r\n rotateFileName?: string;\r\n /**\r\n * Max file size before rotating the file\r\n *\r\n * @default 10MB\r\n */\r\n maxFileSize?: number;\r\n /**\r\n * Set the max messages that needs to be added before writing to the file\r\n *\r\n * @default 100\r\n */\r\n maxMessagesToWrite?: number;\r\n /**\r\n * Group logs by\r\n * Please note that the order matters here\r\n * For example, if you set `groupBy: ['level', 'module']`, the logs will be added in level name first, then by module\r\n *\r\n * @default none\r\n */\r\n groupBy?: (\"level\" | \"module\" | \"action\")[];\r\n /**\r\n * Define what levels should be logged\r\n *\r\n * @default all\r\n */\r\n levels?: LogLevel[];\r\n /**\r\n * Date and time format\r\n */\r\n dateFormat?: {\r\n date?: string;\r\n time?: string;\r\n };\r\n};\r\n\r\nexport class FileLog extends LogChannel<FileLogConfig> implements LogContract {\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public name = \"file\";\r\n\r\n /**\r\n * Messages buffer\r\n */\r\n protected messages: LogMessage[] = [];\r\n\r\n /**\r\n * Grouped messages\r\n */\r\n protected groupedMessages: Record<string, LogMessage[]> = {};\r\n\r\n /**\r\n * Default channel configurations\r\n */\r\n protected defaultConfigurations: FileLogConfig = {\r\n storagePath: process.cwd() + \"/storage/logs\",\r\n rotate: true,\r\n name: \"app\",\r\n extension: \"log\",\r\n chunk: \"single\",\r\n maxMessagesToWrite: 100,\r\n filter: () => true,\r\n maxFileSize: 10 * 1024 * 1024, // 10MB\r\n get rotateFileName() {\r\n return dayjs().format(\"DD-MM-YYYY\");\r\n },\r\n dateFormat: {\r\n date: \"DD-MM-YYYY\",\r\n time: \"HH:mm:ss\",\r\n },\r\n };\r\n\r\n /**\r\n * Last write time\r\n */\r\n protected lastWriteTime = Date.now();\r\n\r\n /**\r\n * A flag to determine if the file is being written\r\n */\r\n protected isWriting = false;\r\n\r\n /**\r\n * Check file size for file rotation\r\n */\r\n protected async checkAndRotateFile(filePath = this.filePath) {\r\n if (!this.config(\"rotate\")) return;\r\n\r\n try {\r\n const stats = await fs.promises.stat(filePath);\r\n if (stats.size >= this.config(\"maxFileSize\")!) {\r\n await this.rotateLogFile();\r\n }\r\n } catch (error: any) {\r\n if (error.code === \"ENOENT\") {\r\n // File doesn't exist, this can be normal if it's a new file\r\n console.log(\"Log file does not exist, will be created on first write.\");\r\n } else {\r\n console.error(\"Error checking log file:\", error);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Rotate log file\r\n */\r\n protected async rotateLogFile() {\r\n const fileName = `${this.fileName}-${this.config(\r\n \"rotateFileName\",\r\n )}-${Date.now()}`;\r\n\r\n const extension = this.extension;\r\n\r\n const rotatedFilePath = path.join(\r\n this.storagePath,\r\n `${fileName}.${extension}`,\r\n );\r\n\r\n await fs.promises.rename(this.filePath, rotatedFilePath).catch(error => {\r\n console.error(\"Error rotating file:\", error);\r\n });\r\n }\r\n\r\n /**\r\n * Flush messages\r\n */\r\n protected initMessageFlush() {\r\n setInterval(() => {\r\n if (\r\n this.messages.length > 0 &&\r\n (this.messages.length >= this.maxMessagesToWrite ||\r\n Date.now() - this.lastWriteTime > 5000)\r\n ) {\r\n this.writeMessagesToFile();\r\n }\r\n }, 5000); // Periodic check\r\n }\r\n\r\n /**\r\n * Get file path\r\n */\r\n public get filePath() {\r\n const fileName = this.fileName;\r\n\r\n const extension = this.extension;\r\n\r\n return path.join(this.storagePath, `${fileName}.${extension}`);\r\n }\r\n\r\n /**\r\n * Get max messages\r\n */\r\n protected get maxMessagesToWrite(): number {\r\n return this.config(\"maxMessagesToWrite\")!;\r\n }\r\n\r\n /**\r\n * Get file name\r\n */\r\n public get fileName(): string {\r\n const debugLevel = this.config(\"chunk\")!;\r\n\r\n switch (debugLevel) {\r\n case \"single\":\r\n default:\r\n return this.config(\"name\")!;\r\n case \"daily\":\r\n return dayjs().format(\"DD-MM-YYYY\");\r\n case \"hourly\":\r\n return dayjs().format(\"DD-MM-YYYY-HH\");\r\n }\r\n }\r\n\r\n /**\r\n * Get file extension\r\n */\r\n public get extension(): string {\r\n return this.config(\"extension\")!;\r\n }\r\n\r\n /**\r\n * Get content\r\n */\r\n protected get content() {\r\n return this.messages.map(message => message.content).join(EOL) + EOL;\r\n }\r\n\r\n /**\r\n * Get storage path\r\n */\r\n public get storagePath(): string {\r\n return this.config(\"storagePath\")!;\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n protected async init() {\r\n const logsDirectory = this.storagePath;\r\n\r\n await ensureDirectoryAsync(logsDirectory);\r\n\r\n this.initMessageFlush();\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async log(data: LoggingData) {\r\n const { module, action, message, type: level } = data;\r\n\r\n if (!this.shouldBeLogged(data)) return;\r\n\r\n const { date: dateFormat, time } = this.getDateAndTimeFormat();\r\n\r\n const date = dayjs().format(dateFormat + \" \" + time);\r\n\r\n let content = `[${date}] [${level}] [${module}][${action}]: `;\r\n\r\n let stack: string | undefined;\r\n\r\n // check if message is an instance of Error\r\n if (message instanceof Error) {\r\n // in that case we need to store the error message and stack trace\r\n content += message.message + EOL;\r\n content += `[trace]` + EOL;\r\n content += message.stack;\r\n stack = message.stack;\r\n } else {\r\n content += message;\r\n }\r\n\r\n this.messages.push({\r\n content,\r\n level,\r\n date,\r\n module,\r\n action,\r\n stack,\r\n });\r\n\r\n await this.checkIfMessagesShouldBeWritten(); // Immediate check on buffer size\r\n }\r\n\r\n /**\r\n * Check if messages should be written\r\n */\r\n protected async checkIfMessagesShouldBeWritten() {\r\n if (\r\n this.messages.length >= this.maxMessagesToWrite ||\r\n Date.now() - this.lastWriteTime > 5000\r\n ) {\r\n await this.writeMessagesToFile();\r\n }\r\n }\r\n\r\n /**\r\n * Should be called after messages are saved\r\n */\r\n protected onSave() {\r\n this.messages = [];\r\n this.groupedMessages = {};\r\n this.isWriting = false;\r\n this.lastWriteTime = Date.now();\r\n }\r\n\r\n /**\r\n * Check if messages should be grouped\r\n */\r\n protected get messagedShouldBeGrouped(): boolean {\r\n return Number(this.config(\"groupBy\")?.length) > 0;\r\n }\r\n\r\n /**\r\n * Write messages to the file\r\n */\r\n protected async writeMessagesToFile() {\r\n if (this.messages.length === 0 || this.isWriting || !this.isInitialized)\r\n return;\r\n\r\n this.isWriting = true;\r\n\r\n if (this.messagedShouldBeGrouped) {\r\n return await this.writeGroupedMessagesToFile();\r\n }\r\n\r\n await this.checkAndRotateFile(); // Ensure we check file size before writing\r\n\r\n try {\r\n await this.write(this.filePath, this.content);\r\n this.onSave();\r\n } catch (error) {\r\n console.error(\"Failed to write log:\", error);\r\n // Implement fallback logic here\r\n this.isWriting = false;\r\n }\r\n }\r\n\r\n /**\r\n * Write grouped messages to the file\r\n */\r\n protected async writeGroupedMessagesToFile(): Promise<void> {\r\n // first step, is to group the messages\r\n this.prepareGroupedMessages();\r\n\r\n // now each key in the grouped messages, represents the directory path that should extend the storage path\r\n for (const key in this.groupedMessages) {\r\n const directoryPath = path.join(this.storagePath, key);\r\n\r\n await ensureDirectoryAsync(directoryPath);\r\n\r\n const filePath = path.join(\r\n directoryPath,\r\n `${this.fileName}.${this.extension}`,\r\n );\r\n\r\n await this.checkAndRotateFile(filePath); // Ensure we check file size before writing\r\n\r\n const content =\r\n this.groupedMessages[key].map(message => message.content).join(EOL) +\r\n EOL;\r\n\r\n try {\r\n await this.write(filePath, content);\r\n } catch (error) {\r\n console.error(\"Failed to write log:\", error);\r\n }\r\n }\r\n\r\n this.onSave();\r\n this.isWriting = false;\r\n }\r\n\r\n /**\r\n * Prepare grouped messages\r\n */\r\n protected prepareGroupedMessages(): void {\r\n this.messages.forEach(message => {\r\n const key = this.config(\"groupBy\")!\r\n .map(groupKey => encodeURIComponent(message[groupKey]))\r\n .join(\"/\");\r\n\r\n this.groupedMessages[key] = this.groupedMessages[key] || [];\r\n this.groupedMessages[key].push(message);\r\n });\r\n }\r\n\r\n /**\r\n * Start writing to the file\r\n */\r\n protected async write(filePath: string, content: string) {\r\n return new Promise((resolve, reject) => {\r\n const writer = fs.createWriteStream(filePath, { flags: \"a\" });\r\n\r\n writer.write(content, error => {\r\n writer.end();\r\n if (error) {\r\n reject(error);\r\n } else {\r\n resolve(true);\r\n }\r\n });\r\n });\r\n }\r\n}\r\n","import {\r\n ensureDirectoryAsync,\r\n fileExistsAsync,\r\n getJsonFileAsync,\r\n putJsonFileAsync,\r\n} from \"@mongez/fs\";\r\nimport dayjs from \"dayjs\";\r\nimport path from \"path\";\r\nimport type { LogContract, LogMessage, LoggingData } from \"../types\";\r\nimport { FileLog } from \"./file-log\";\r\n\r\nexport class JSONFileLog extends FileLog implements LogContract {\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public name = \"fileJson\";\r\n\r\n /**\r\n * Get file extension\r\n */\r\n public get extension(): string {\r\n return \"json\";\r\n }\r\n\r\n /**\r\n * Get initial file contents\r\n */\r\n protected get initialFileContents(): Record<string, any> {\r\n return {\r\n messages: this.messages,\r\n };\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async log(data: LoggingData) {\r\n let stack: string[] | undefined;\r\n\r\n if (data.message instanceof Error) {\r\n stack = data.message.stack?.split(\"\\n\");\r\n data.message = data.message.message;\r\n }\r\n\r\n const { module, action, message, type: level } = data;\r\n\r\n if (!this.shouldBeLogged(data)) return;\r\n\r\n const { date: dateFormat, time } = this.getDateAndTimeFormat();\r\n\r\n const date = dayjs().format(dateFormat + \" \" + time);\r\n\r\n this.messages.push({\r\n content: message,\r\n level,\r\n date,\r\n module,\r\n action,\r\n stack,\r\n } as LogMessage);\r\n\r\n await this.checkIfMessagesShouldBeWritten(); // Immediate check on buffer size\r\n }\r\n\r\n /**\r\n * Write messages to the file\r\n */\r\n protected async writeMessagesToFile(): Promise<void> {\r\n if (this.messages.length === 0 || this.isWriting) return;\r\n\r\n this.isWriting = true;\r\n\r\n if (this.messagedShouldBeGrouped) {\r\n return await this.writeGroupedMessagesToFile();\r\n }\r\n\r\n await this.checkAndRotateFile(); // Ensure file rotation is handled\r\n\r\n let fileContents;\r\n if (await fileExistsAsync(this.filePath)) {\r\n try {\r\n fileContents = await getJsonFileAsync(this.filePath);\r\n } catch (error) {\r\n console.error(\"Error reading log file, reinitializing:\", error);\r\n fileContents = { messages: [] }; // Reinitialize the file if corrupted\r\n }\r\n } else {\r\n fileContents = { messages: [] }; // Reinitialize the file if corrupted\r\n }\r\n\r\n fileContents.messages.push(...this.messages);\r\n\r\n try {\r\n await putJsonFileAsync(this.filePath, fileContents, { spaces: 2 });\r\n\r\n this.onSave();\r\n } catch (error) {\r\n console.error(\"Failed to write log:\", error);\r\n // Implement fallback logic here\r\n this.isWriting = false;\r\n }\r\n }\r\n\r\n /**\r\n * Write grouped messages to the file\r\n */\r\n protected async writeGroupedMessagesToFile(): Promise<void> {\r\n // first step, is to group the messages\r\n this.prepareGroupedMessages();\r\n\r\n // now each key in the grouped messages, represents the directory path that should extend the storage path\r\n for (const key in this.groupedMessages) {\r\n const directoryPath = path.join(this.storagePath, key);\r\n\r\n await ensureDirectoryAsync(directoryPath);\r\n\r\n const filePath = path.join(\r\n directoryPath,\r\n `${this.fileName}.${this.extension}`,\r\n );\r\n\r\n await this.checkAndRotateFile(filePath); // Ensure we check file size before writing\r\n\r\n const content = this.groupedMessages[key];\r\n\r\n try {\r\n await putJsonFileAsync(filePath, content, { spaces: 2 });\r\n } catch (error) {\r\n console.error(\"Failed to write log:\", error);\r\n this.isWriting = false;\r\n }\r\n }\r\n\r\n this.onSave();\r\n }\r\n}\r\n","/**\r\n * Clear message from any terminal codes\r\n */\r\nexport function clearMessage(message: any) {\r\n if (typeof message !== \"string\") return message;\r\n\r\n // eslint-disable-next-line no-control-regex\r\n return message.replace(/\\u001b[^m]*?m/g, \"\");\r\n}\r\n","import { Random } from \"@mongez/reinforcements\";\r\nimport type { LogChannel } from \"./log-channel\";\r\nimport type { Log, LoggingData, LogLevel, OmittedLoggingData } from \"./types\";\r\nimport { clearMessage } from \"./utils/clear-message\";\r\n\r\nexport class Logger {\r\n /**\r\n * Current channel\r\n */\r\n public channels: LogChannel[] = [];\r\n\r\n public id = \"logger-\" + Random.string(32);\r\n\r\n /**\r\n * Add a new channel\r\n */\r\n public addChannel(channel: LogChannel) {\r\n this.channels.push(channel);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set base configurations\r\n */\r\n public configure(config: { channels: LogChannel[] }) {\r\n this.channels = config.channels;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set channels\r\n */\r\n public setChannels(channels: LogChannel[]) {\r\n this.channels = channels;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Normalize log data to a single object\r\n */\r\n private normalizeLogData(\r\n dataOrModule: LoggingData | OmittedLoggingData | string,\r\n action?: string,\r\n message: any = \"\",\r\n level?: LogLevel,\r\n ): LoggingData {\r\n if (typeof dataOrModule === \"object\") {\r\n // If level is provided, override type\r\n return {\r\n type: (level || (dataOrModule as any).type || \"info\") as LogLevel,\r\n module: dataOrModule.module,\r\n action: dataOrModule.action,\r\n message: dataOrModule.message,\r\n ...(dataOrModule.context ? { context: dataOrModule.context } : {}),\r\n };\r\n }\r\n return {\r\n type: (level || \"info\") as LogLevel,\r\n module: dataOrModule,\r\n action: action as string,\r\n message,\r\n };\r\n }\r\n\r\n /**\r\n * Make log\r\n */\r\n public async log(data: LoggingData) {\r\n for (const channel of this.channels) {\r\n if (channel.terminal === false) {\r\n data.message = clearMessage(data.message);\r\n }\r\n\r\n channel.log(data);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Make debug log\r\n */\r\n public debug(\r\n dataOrModule: LoggingData | string,\r\n action?: string,\r\n message: any = \"\",\r\n ) {\r\n const data = this.normalizeLogData(dataOrModule, action, message, \"debug\");\r\n return this.log(data);\r\n }\r\n\r\n /**\r\n * Make info log\r\n */\r\n public info(\r\n dataOrModule: OmittedLoggingData | string,\r\n action?: string,\r\n message: any = \"\",\r\n ) {\r\n const data = this.normalizeLogData(dataOrModule, action, message, \"info\");\r\n return this.log(data);\r\n }\r\n\r\n /**\r\n * Make warn log\r\n */\r\n public warn(\r\n dataOrModule: LoggingData | string,\r\n action?: string,\r\n message: any = \"\",\r\n ) {\r\n const data = this.normalizeLogData(dataOrModule, action, message, \"warn\");\r\n return this.log(data);\r\n }\r\n\r\n /**\r\n * Make error log\r\n */\r\n public error(\r\n dataOrModule: LoggingData | string,\r\n action?: string,\r\n message: any = \"\",\r\n ) {\r\n const data = this.normalizeLogData(dataOrModule, action, message, \"error\");\r\n return this.log(data);\r\n }\r\n\r\n /**\r\n * Make success log\r\n */\r\n public success(\r\n dataOrModule: LoggingData | string,\r\n action?: string,\r\n message: any = \"\",\r\n ) {\r\n const data = this.normalizeLogData(\r\n dataOrModule,\r\n action,\r\n message,\r\n \"success\",\r\n );\r\n\r\n return this.log(data);\r\n }\r\n\r\n /**\r\n * Get channel by name\r\n */\r\n public channel(name: string) {\r\n return this.channels.find(channel => channel.name === name);\r\n }\r\n}\r\n\r\nexport const logger = new Logger();\r\n\r\nexport const log: Log = (data: LoggingData) => {\r\n return logger.log(data);\r\n};\r\n\r\nlog.info = logger.info.bind(logger) as Log[\"info\"];\r\nlog.debug = logger.debug.bind(logger) as Log[\"debug\"];\r\nlog.warn = logger.warn.bind(logger) as Log[\"warn\"];\r\nlog.error = logger.error.bind(logger) as Log[\"error\"];\r\nlog.success = logger.success.bind(logger) as Log[\"success\"];\r\n\r\nlog.channel = logger.channel.bind(logger);\r\n","import { log } from \"../logger\";\r\n\r\nexport function captureAnyUnhandledRejection() {\r\n process.on(\"unhandledRejection\", (reason: any, promise) => {\r\n log.error(\"app\", \"unhandledRejection\", reason);\r\n console.log(promise);\r\n // console.trace();\r\n });\r\n\r\n process.on(\"uncaughtException\", error => {\r\n log.error(\"app\", \"uncaughtException\", error);\r\n // console.trace();\r\n console.log(error);\r\n });\r\n}\r\n"]}
|
package/package.json
CHANGED
|
@@ -1,39 +1,41 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
"
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
"
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
"
|
|
24
|
-
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
"
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"
|
|
2
|
+
"name": "@warlock.js/logger",
|
|
3
|
+
"version": "4.0.39",
|
|
4
|
+
"description": "A powerful logging system for messages and errors in nodejs.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"password",
|
|
7
|
+
"hash",
|
|
8
|
+
"make",
|
|
9
|
+
"generate",
|
|
10
|
+
"verify",
|
|
11
|
+
"brute-force"
|
|
12
|
+
],
|
|
13
|
+
"author": "hassanzohdy",
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "https://github.com/hassanzohdy/mongez-password"
|
|
18
|
+
},
|
|
19
|
+
"main": "./cjs/index.js",
|
|
20
|
+
"module": "./esm/index.js",
|
|
21
|
+
"types": "./esm/index.d.ts",
|
|
22
|
+
"exports": {
|
|
23
|
+
".": {
|
|
24
|
+
"import": {
|
|
25
|
+
"types": "./esm/index.d.ts",
|
|
26
|
+
"default": "./esm/index.js"
|
|
27
|
+
},
|
|
28
|
+
"require": {
|
|
29
|
+
"types": "./cjs/index.d.ts",
|
|
30
|
+
"default": "./cjs/index.js"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"sideEffects": false,
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"@mongez/fs": "^3.0.4",
|
|
37
|
+
"@mongez/copper": "^1.0.1",
|
|
38
|
+
"@mongez/reinforcements": "^2.3.17",
|
|
39
|
+
"dayjs": "^1.11.9"
|
|
40
|
+
}
|
|
39
41
|
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { LogChannel } from "../log-channel";
|
|
2
|
-
import type { BasicLogConfigurations, LoggingData } from "../types";
|
|
3
|
-
export declare class ConsoleLog extends LogChannel<BasicLogConfigurations> {
|
|
4
|
-
/**
|
|
5
|
-
* {@inheritdoc}
|
|
6
|
-
*/
|
|
7
|
-
name: string;
|
|
8
|
-
/**
|
|
9
|
-
* Determine if channel is logging in terminal
|
|
10
|
-
*/
|
|
11
|
-
terminal: boolean;
|
|
12
|
-
/**
|
|
13
|
-
* {@inheritdoc}
|
|
14
|
-
*/
|
|
15
|
-
log(data: LoggingData): void;
|
|
16
|
-
}
|
|
17
|
-
//# sourceMappingURL=console-log.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"console-log.d.ts","sourceRoot":"","sources":["../../src/channels/console-log.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEpE,qBAAa,UAAW,SAAQ,UAAU,CAAC,sBAAsB,CAAC;IAChE;;OAEG;IACI,IAAI,SAAa;IAExB;;OAEG;IACI,QAAQ,UAAQ;IAEvB;;OAEG;IACI,GAAG,CAAC,IAAI,EAAE,WAAW;CA0E7B"}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
'use strict';var copper=require('@mongez/copper'),logChannel=require('../log-channel.js');class ConsoleLog extends logChannel.LogChannel {
|
|
2
|
-
/**
|
|
3
|
-
* {@inheritdoc}
|
|
4
|
-
*/
|
|
5
|
-
name = "console";
|
|
6
|
-
/**
|
|
7
|
-
* Determine if channel is logging in terminal
|
|
8
|
-
*/
|
|
9
|
-
terminal = true;
|
|
10
|
-
/**
|
|
11
|
-
* {@inheritdoc}
|
|
12
|
-
*/
|
|
13
|
-
log(data) {
|
|
14
|
-
const { module, action, message, type: level } = data;
|
|
15
|
-
if (!this.shouldBeLogged(data))
|
|
16
|
-
return;
|
|
17
|
-
// display date and time with milliseconds
|
|
18
|
-
const date = new Date().toISOString(); // i.e 2021-01-01T00:00:00.000Z
|
|
19
|
-
switch (level) {
|
|
20
|
-
case "debug":
|
|
21
|
-
// add a debug icon
|
|
22
|
-
console.log(copper.colors.magentaBright("⚙"), copper.colors.yellow(`(${date})`), copper.colors.cyan(`[${module}]`), copper.colors.magenta(`[${action}]`), copper.colors.magentaBright(message));
|
|
23
|
-
break;
|
|
24
|
-
case "info":
|
|
25
|
-
// add an info icon
|
|
26
|
-
console.log(copper.colors.blueBright("ℹ"), copper.colors.yellow(`(${date})`), copper.colors.cyan(`[${module}]`), copper.colors.magenta(`[${action}]`), copper.colors.blueBright(message));
|
|
27
|
-
break;
|
|
28
|
-
case "warn":
|
|
29
|
-
// add a warning icon
|
|
30
|
-
console.log(copper.colors.yellow("⚠"), copper.colors.green(`(${date})`), copper.colors.cyan(`[${module}]`), copper.colors.magenta(`[${action}]`), copper.colors.yellowBright(message));
|
|
31
|
-
break;
|
|
32
|
-
case "error":
|
|
33
|
-
// add an error icon
|
|
34
|
-
console.log(copper.colors.red("✗"), copper.colors.yellow(`(${date})`), copper.colors.cyan(`[${module}]`), copper.colors.magenta(`[${action}]`), copper.colors.redBright(message));
|
|
35
|
-
break;
|
|
36
|
-
case "success":
|
|
37
|
-
// add a success icon
|
|
38
|
-
console.log(copper.colors.green("✓"), copper.colors.yellow(`(${date})`), copper.colors.cyan(`[${module}]`), copper.colors.magenta(`[${action}]`), copper.colors.greenBright(message));
|
|
39
|
-
break;
|
|
40
|
-
default:
|
|
41
|
-
console.log("[log]", copper.colors.yellow(`(${date})`), copper.colors.cyan(`[${module}]`), copper.colors.magenta(`[${action}]`), message);
|
|
42
|
-
}
|
|
43
|
-
if (typeof message === "object") {
|
|
44
|
-
console.log(message);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}exports.ConsoleLog=ConsoleLog;//# sourceMappingURL=console-log.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"console-log.js","sources":["../../src/channels/console-log.ts"],"sourcesContent":[null],"names":["LogChannel","colors"],"mappings":"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"}
|
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
import { LogChannel } from "../log-channel";
|
|
2
|
-
import type { BasicLogConfigurations, LogContract, LoggingData, LogLevel, LogMessage } from "../types";
|
|
3
|
-
export type FileLogConfig = BasicLogConfigurations & {
|
|
4
|
-
storagePath?: string;
|
|
5
|
-
/**
|
|
6
|
-
* File name, without extension
|
|
7
|
-
*/
|
|
8
|
-
name?: string;
|
|
9
|
-
/**
|
|
10
|
-
* chunk mode
|
|
11
|
-
* If set to `single`, the logs will be created in a single file, unless the rotate is set to true
|
|
12
|
-
* If set to `daily`, the logs will be created in a daily file, unless the rotate is set to true
|
|
13
|
-
* If set to `hourly`, the logs will be created in an hourly file, unless the rotate is set to true
|
|
14
|
-
* @default single
|
|
15
|
-
*/
|
|
16
|
-
chunk?: "single" | "daily" | "hourly";
|
|
17
|
-
/**
|
|
18
|
-
* Whether to rotate the file
|
|
19
|
-
*
|
|
20
|
-
* @default true
|
|
21
|
-
*/
|
|
22
|
-
rotate?: boolean;
|
|
23
|
-
/**
|
|
24
|
-
* File Extension
|
|
25
|
-
*
|
|
26
|
-
* @default log
|
|
27
|
-
*/
|
|
28
|
-
extension?: string;
|
|
29
|
-
/**
|
|
30
|
-
* If rotate is set, the rotate name will be added to the file name suffixed with `-`
|
|
31
|
-
*
|
|
32
|
-
* @default DD-MM-YYYY
|
|
33
|
-
*/
|
|
34
|
-
rotateFileName?: string;
|
|
35
|
-
/**
|
|
36
|
-
* Max file size before rotating the file
|
|
37
|
-
*
|
|
38
|
-
* @default 10MB
|
|
39
|
-
*/
|
|
40
|
-
maxFileSize?: number;
|
|
41
|
-
/**
|
|
42
|
-
* Set the max messages that needs to be added before writing to the file
|
|
43
|
-
*
|
|
44
|
-
* @default 100
|
|
45
|
-
*/
|
|
46
|
-
maxMessagesToWrite?: number;
|
|
47
|
-
/**
|
|
48
|
-
* Group logs by
|
|
49
|
-
* Please note that the order matters here
|
|
50
|
-
* For example, if you set `groupBy: ['level', 'module']`, the logs will be added in level name first, then by module
|
|
51
|
-
*
|
|
52
|
-
* @default none
|
|
53
|
-
*/
|
|
54
|
-
groupBy?: ("level" | "module" | "action")[];
|
|
55
|
-
/**
|
|
56
|
-
* Define what levels should be logged
|
|
57
|
-
*
|
|
58
|
-
* @default all
|
|
59
|
-
*/
|
|
60
|
-
levels?: LogLevel[];
|
|
61
|
-
/**
|
|
62
|
-
* Date and time format
|
|
63
|
-
*/
|
|
64
|
-
dateFormat?: {
|
|
65
|
-
date?: string;
|
|
66
|
-
time?: string;
|
|
67
|
-
};
|
|
68
|
-
};
|
|
69
|
-
export declare class FileLog extends LogChannel<FileLogConfig> implements LogContract {
|
|
70
|
-
/**
|
|
71
|
-
* {@inheritdoc}
|
|
72
|
-
*/
|
|
73
|
-
name: string;
|
|
74
|
-
/**
|
|
75
|
-
* Messages buffer
|
|
76
|
-
*/
|
|
77
|
-
protected messages: LogMessage[];
|
|
78
|
-
/**
|
|
79
|
-
* Grouped messages
|
|
80
|
-
*/
|
|
81
|
-
protected groupedMessages: Record<string, LogMessage[]>;
|
|
82
|
-
/**
|
|
83
|
-
* Default channel configurations
|
|
84
|
-
*/
|
|
85
|
-
protected defaultConfigurations: FileLogConfig;
|
|
86
|
-
/**
|
|
87
|
-
* Last write time
|
|
88
|
-
*/
|
|
89
|
-
protected lastWriteTime: number;
|
|
90
|
-
/**
|
|
91
|
-
* A flag to determine if the file is being written
|
|
92
|
-
*/
|
|
93
|
-
protected isWriting: boolean;
|
|
94
|
-
/**
|
|
95
|
-
* Check file size for file rotation
|
|
96
|
-
*/
|
|
97
|
-
protected checkAndRotateFile(filePath?: string): Promise<void>;
|
|
98
|
-
/**
|
|
99
|
-
* Rotate log file
|
|
100
|
-
*/
|
|
101
|
-
protected rotateLogFile(): Promise<void>;
|
|
102
|
-
/**
|
|
103
|
-
* Flush messages
|
|
104
|
-
*/
|
|
105
|
-
protected initMessageFlush(): void;
|
|
106
|
-
/**
|
|
107
|
-
* Get file path
|
|
108
|
-
*/
|
|
109
|
-
get filePath(): string;
|
|
110
|
-
/**
|
|
111
|
-
* Get max messages
|
|
112
|
-
*/
|
|
113
|
-
protected get maxMessagesToWrite(): number;
|
|
114
|
-
/**
|
|
115
|
-
* Get file name
|
|
116
|
-
*/
|
|
117
|
-
get fileName(): string;
|
|
118
|
-
/**
|
|
119
|
-
* Get file extension
|
|
120
|
-
*/
|
|
121
|
-
get extension(): string;
|
|
122
|
-
/**
|
|
123
|
-
* Get content
|
|
124
|
-
*/
|
|
125
|
-
protected get content(): string;
|
|
126
|
-
/**
|
|
127
|
-
* Get storage path
|
|
128
|
-
*/
|
|
129
|
-
get storagePath(): string;
|
|
130
|
-
/**
|
|
131
|
-
* {@inheritdoc}
|
|
132
|
-
*/
|
|
133
|
-
protected init(): Promise<void>;
|
|
134
|
-
/**
|
|
135
|
-
* {@inheritdoc}
|
|
136
|
-
*/
|
|
137
|
-
log(data: LoggingData): Promise<void>;
|
|
138
|
-
/**
|
|
139
|
-
* Check if messages should be written
|
|
140
|
-
*/
|
|
141
|
-
protected checkIfMessagesShouldBeWritten(): Promise<void>;
|
|
142
|
-
/**
|
|
143
|
-
* Should be called after messages are saved
|
|
144
|
-
*/
|
|
145
|
-
protected onSave(): void;
|
|
146
|
-
/**
|
|
147
|
-
* Check if messages should be grouped
|
|
148
|
-
*/
|
|
149
|
-
protected get messagedShouldBeGrouped(): boolean;
|
|
150
|
-
/**
|
|
151
|
-
* Write messages to the file
|
|
152
|
-
*/
|
|
153
|
-
protected writeMessagesToFile(): Promise<void>;
|
|
154
|
-
/**
|
|
155
|
-
* Write grouped messages to the file
|
|
156
|
-
*/
|
|
157
|
-
protected writeGroupedMessagesToFile(): Promise<void>;
|
|
158
|
-
/**
|
|
159
|
-
* Prepare grouped messages
|
|
160
|
-
*/
|
|
161
|
-
protected prepareGroupedMessages(): void;
|
|
162
|
-
/**
|
|
163
|
-
* Start writing to the file
|
|
164
|
-
*/
|
|
165
|
-
protected write(filePath: string, content: string): Promise<unknown>;
|
|
166
|
-
}
|
|
167
|
-
//# sourceMappingURL=file-log.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"file-log.d.ts","sourceRoot":"","sources":["../../src/channels/file-log.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EACV,sBAAsB,EACtB,WAAW,EACX,WAAW,EACX,QAAQ,EACR,UAAU,EACX,MAAM,UAAU,CAAC;AAIlB,MAAM,MAAM,aAAa,GAAG,sBAAsB,GAAG;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;IACtC;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,CAAC,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC,EAAE,CAAC;IAC5C;;;;OAIG;IACH,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB;;OAEG;IACH,UAAU,CAAC,EAAE;QACX,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH,CAAC;AAEF,qBAAa,OAAQ,SAAQ,UAAU,CAAC,aAAa,CAAE,YAAW,WAAW;IAC3E;;OAEG;IACI,IAAI,SAAU;IAErB;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAM;IAEtC;;OAEG;IACH,SAAS,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAM;IAE7D;;OAEG;IACH,SAAS,CAAC,qBAAqB,EAAE,aAAa,CAgB5C;IAEF;;OAEG;IACH,SAAS,CAAC,aAAa,SAAc;IAErC;;OAEG;IACH,SAAS,CAAC,SAAS,UAAS;IAE5B;;OAEG;cACa,kBAAkB,CAAC,QAAQ,SAAgB;IAkB3D;;OAEG;cACa,aAAa;IAiB7B;;OAEG;IACH,SAAS,CAAC,gBAAgB;IAY1B;;OAEG;IACH,IAAW,QAAQ,WAMlB;IAED;;OAEG;IACH,SAAS,KAAK,kBAAkB,IAAI,MAAM,CAEzC;IAED;;OAEG;IACH,IAAW,QAAQ,IAAI,MAAM,CAY5B;IAED;;OAEG;IACH,IAAW,SAAS,IAAI,MAAM,CAE7B;IAED;;OAEG;IACH,SAAS,KAAK,OAAO,WAEpB;IAED;;OAEG;IACH,IAAW,WAAW,IAAI,MAAM,CAE/B;IAED;;OAEG;cACa,IAAI;IAQpB;;OAEG;IACU,GAAG,CAAC,IAAI,EAAE,WAAW;IAoClC;;OAEG;cACa,8BAA8B;IAS9C;;OAEG;IACH,SAAS,CAAC,MAAM;IAOhB;;OAEG;IACH,SAAS,KAAK,uBAAuB,IAAI,OAAO,CAE/C;IAED;;OAEG;cACa,mBAAmB;IAsBnC;;OAEG;cACa,0BAA0B,IAAI,OAAO,CAAC,IAAI,CAAC;IAgC3D;;OAEG;IACH,SAAS,CAAC,sBAAsB,IAAI,IAAI;IAWxC;;OAEG;cACa,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAcxD"}
|