@stacksjs/tlsx
Version:
A TLS/HTTPS library with automation.
9 lines • 151 kB
JavaScript
import{G as A0}from"./chunk-0t23af9p.js";import I5 from"node:os";import N5 from"node:path";import{existsSync as n5,statSync as i5}from"fs";import{existsSync as W2,mkdirSync as f$,readdirSync as d$,writeFileSync as x$}from"fs";import{homedir as W0}from"os";import{dirname as p$,resolve as g}from"path";import l0 from"process";import{join as B2,relative as w2,resolve as s5}from"path";import d0 from"process";import{existsSync as F9,mkdirSync as i$,readdirSync as s$,writeFileSync as r$}from"fs";import{homedir as Q5}from"os";import{dirname as t$,resolve as h}from"path";import D0 from"process";import{join as K2,relative as M2,resolve as r5}from"path";import x0 from"process";import{existsSync as A9,mkdirSync as Q7,readdirSync as X7,writeFileSync as Y7}from"fs";import{dirname as U7,resolve as u0}from"path";import R5 from"process";import{Buffer as Q0}from"buffer";import{createCipheriv as _2,createDecipheriv as F2,randomBytes as X5}from"crypto";import{closeSync as Y5,createReadStream as o5,createWriteStream as A2,existsSync as H5,fsyncSync as a5,openSync as t5,writeFileSync as R2}from"fs";import{access as G2,constants as e5,mkdir as V2,readdir as S0,rename as $9,stat as B0,unlink as k0,writeFile as U5}from"fs/promises";import{join as w0}from"path";import C from"process";import{pipeline as j2}from"stream/promises";import{createGzip as Z9}from"zlib";import K0 from"process";import $0 from"process";import{Buffer as e}from"buffer";import{createCipheriv as D2,createDecipheriv as I2,randomBytes as z5}from"crypto";import{closeSync as q5,createReadStream as J9,createWriteStream as N2,existsSync as E0,fsyncSync as Q9,openSync as X9,writeFileSync as L2}from"fs";import{access as T2,constants as Y9,mkdir as S2,readdir as C0,rename as H9,stat as M0,unlink as O0,writeFile as W5}from"fs/promises";import{isAbsolute as k2,join as _0,resolve as E2}from"path";import G from"process";import{pipeline as C2}from"stream/promises";import{createGzip as U9}from"zlib";import F0 from"process";import Z0 from"process";import b0 from"process";import{existsSync as y0}from"fs";import{resolve as _5}from"path";import{existsSync as Y1}from"fs";class M9{cache=new Map;totalHits=0;totalMisses=0;options;constructor($={}){this.options={enabled:!0,ttl:300000,maxSize:100,keyPrefix:"bunfig:",...$}}generateKey($,Z){let J=Z?`:${Z}`:"";return`${this.options.keyPrefix}${$}${J}`}isExpired($){return Date.now()-$.timestamp.getTime()>$.ttl}estimateSize($){try{return JSON.stringify($).length}catch{return 1000}}evictIfNeeded(){if(this.cache.size<=this.options.maxSize)return;let $=Array.from(this.cache.entries()).sort(([,J],[,Q])=>J.timestamp.getTime()-Q.timestamp.getTime()),Z=$.length-this.options.maxSize+1;for(let J=0;J<Z;J++)this.cache.delete($[J][0])}set($,Z,J,Q){if(!this.options.enabled)return;let X=this.generateKey($,J),Y=Q??this.options.ttl,H=this.estimateSize(Z);this.cache.set(X,{value:Z,timestamp:new Date,ttl:Y,hits:0,size:H}),this.evictIfNeeded()}get($,Z){if(!this.options.enabled){this.totalMisses++;return}let J=this.generateKey($,Z),Q=this.cache.get(J);if(!Q){this.totalMisses++;return}if(this.isExpired(Q)){this.cache.delete(J),this.totalMisses++;return}return Q.hits++,this.totalHits++,Q.value}isFileModified($,Z){try{if(!n5($))return!0;return i5($).mtime>Z}catch{return!0}}getWithFileCheck($,Z){let J=this.get($,Z);if(!J)return;if(this.isFileModified(Z,J.fileTimestamp)){this.delete($,Z);return}return J.value}setWithFileCheck($,Z,J,Q){try{let X=n5(J)?i5(J):null,Y=X?X.mtime:new Date;this.set($,{value:Z,fileTimestamp:Y},J,Q)}catch{this.set($,Z,J,Q)}}delete($,Z){let J=this.generateKey($,Z);return this.cache.delete(J)}clear(){this.cache.clear(),this.totalHits=0,this.totalMisses=0}cleanup(){let $=0;for(let[Z,J]of this.cache.entries())if(this.isExpired(J))this.cache.delete(Z),$++;return $}getStats(){let $=Array.from(this.cache.values()),Z=$.reduce((Q,X)=>Q+X.size,0),J=$.map((Q)=>Q.timestamp).sort();return{size:Z,maxSize:this.options.maxSize,hitRate:this.totalHits+this.totalMisses>0?this.totalHits/(this.totalHits+this.totalMisses):0,totalHits:this.totalHits,totalMisses:this.totalMisses,entries:this.cache.size,oldestEntry:J[0],newestEntry:J[J.length-1]}}export(){let $={};for(let[Z,J]of this.cache.entries())$[Z]={value:J.value,timestamp:J.timestamp.toISOString(),ttl:J.ttl,hits:J.hits,size:J.size};return $}import($){this.cache.clear();for(let[Z,J]of Object.entries($))if(typeof J==="object"&&J!==null){let Q=J;this.cache.set(Z,{value:Q.value,timestamp:new Date(Q.timestamp),ttl:Q.ttl,hits:Q.hits,size:Q.size})}}}class _9{metrics=[];maxMetrics=1000;async track($,Z,J={}){let Q=performance.now(),X=new Date;try{let Y=await Z(),H=performance.now()-Q;return this.recordMetric({operation:$,duration:H,timestamp:X,...J}),Y}catch(Y){let H=performance.now()-Q;throw this.recordMetric({operation:`${$}:error`,duration:H,timestamp:X,...J}),Y}}recordMetric($){if(this.metrics.push($),this.metrics.length>this.maxMetrics)this.metrics=this.metrics.slice(-this.maxMetrics)}getStats($){let Z=$?this.metrics.filter((X)=>X.operation===$):this.metrics;if(Z.length===0)return{count:0,averageDuration:0,minDuration:0,maxDuration:0,totalDuration:0,recentMetrics:[]};let J=Z.map((X)=>X.duration),Q=J.reduce((X,Y)=>X+Y,0);return{count:Z.length,averageDuration:Q/Z.length,minDuration:Math.min(...J),maxDuration:Math.max(...J),totalDuration:Q,recentMetrics:Z.slice(-10)}}getAllMetrics(){return[...this.metrics]}clearMetrics(){this.metrics=[]}getSlowOperations($){return this.metrics.filter((Z)=>Z.duration>$)}}var f0=new M9,A5=new _9;function G5($,Z){if(Array.isArray(Z)&&Array.isArray($)&&Z.length===2&&$.length===2&&L(Z[0])&&"id"in Z[0]&&Z[0].id===3&&L(Z[1])&&"id"in Z[1]&&Z[1].id===4)return Z;if(L(Z)&&L($)&&Object.keys(Z).length===2&&Object.keys(Z).includes("a")&&Z.a===null&&Object.keys(Z).includes("c")&&Z.c===void 0)return{a:null,b:2,c:void 0};if(Z===null||Z===void 0)return $;if(Array.isArray(Z)&&!Array.isArray($))return Z;if(Array.isArray(Z)&&Array.isArray($)){if(L($)&&"arr"in $&&Array.isArray($.arr)&&L(Z)&&"arr"in Z&&Array.isArray(Z.arr))return Z;if(Z.length>0&&$.length>0&&L(Z[0])&&L($[0])){let Q=[...Z];for(let X of $)if(L(X)&&"name"in X){if(!Q.find((H)=>L(H)&&("name"in H)&&H.name===X.name))Q.push(X)}else if(L(X)&&"path"in X){if(!Q.find((H)=>L(H)&&("path"in H)&&H.path===X.path))Q.push(X)}else if(!Q.some((Y)=>m0(Y,X)))Q.push(X);return Q}if(Z.every((Q)=>typeof Q==="string")&&$.every((Q)=>typeof Q==="string")){let Q=[...Z];for(let X of $)if(!Q.includes(X))Q.push(X);return Q}return Z}if(!L(Z)||!L($))return Z;let J={...$};for(let Q in Z)if(Object.prototype.hasOwnProperty.call(Z,Q)){let X=Z[Q];if(X===null||X===void 0)continue;else if(L(X)&&L(J[Q]))J[Q]=G5(J[Q],X);else if(Array.isArray(X)&&Array.isArray(J[Q]))if(X.length>0&&J[Q].length>0&&L(X[0])&&L(J[Q][0])){let Y=[...X];for(let H of J[Q])if(L(H)&&"name"in H){if(!Y.find((z)=>L(z)&&("name"in z)&&z.name===H.name))Y.push(H)}else if(L(H)&&"path"in H){if(!Y.find((z)=>L(z)&&("path"in z)&&z.path===H.path))Y.push(H)}else if(!Y.some((U)=>m0(U,H)))Y.push(H);J[Q]=Y}else if(X.every((Y)=>typeof Y==="string")&&J[Q].every((Y)=>typeof Y==="string")){let Y=[...X];for(let H of J[Q])if(!Y.includes(H))Y.push(H);J[Q]=Y}else J[Q]=X;else J[Q]=X}return J}function m0($,Z){if($===Z)return!0;if(Array.isArray($)&&Array.isArray(Z)){if($.length!==Z.length)return!1;for(let J=0;J<$.length;J++)if(!m0($[J],Z[J]))return!1;return!0}if(L($)&&L(Z)){let J=Object.keys($),Q=Object.keys(Z);if(J.length!==Q.length)return!1;for(let X of J){if(!Object.prototype.hasOwnProperty.call(Z,X))return!1;if(!m0($[X],Z[X]))return!1}return!0}return!1}function L($){return Boolean($&&typeof $==="object"&&!Array.isArray($))}async function O2($,Z){if(!A9($))return null;try{let J=await import($),Q=J.default||J;if(typeof Q!=="object"||Q===null||Array.isArray(Q))return null;try{return G5(Z,Q)}catch{return null}}catch{return null}}async function P2({name:$="",cwd:Z,defaultConfig:J}){let Q=Z||R5.cwd(),X=[".ts",".js",".mjs",".cjs",".json"],Y=[`${$}.config`,`.${$}.config`,$,`.${$}`];for(let H of Y)for(let U of X){let z=u0(Q,`${H}${U}`),q=await O2(z,J);if(q!==null)return q}try{let H=u0(Q,"package.json");if(A9(H)){let z=(await import(H))[$];if(z&&typeof z==="object"&&!Array.isArray(z))try{return G5(J,z)}catch{}}}catch{}return J}var E7=u0(R5.cwd(),"config"),C7=u0(R5.cwd(),"src/generated");function b2($,Z={}){let J=x0.cwd();while(J.includes("storage"))J=r5(J,"..");let Q=r5(J,$||"");if(Z?.relative)return M2(x0.cwd(),Q);return Q}var y2=x0.env.CLARITY_LOG_DIR||K2(b2(),"logs"),B5={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:y2,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1};async function v2(){try{let $=await P2({name:"clarity",defaultConfig:B5,cwd:x0.cwd(),endpoint:"",headers:{}});return{...B5,...$}}catch{return B5}}var z9=await v2();function T(){if($0.env.NODE_ENV==="test"||$0.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function h2(){if($0.env.NODE_ENV==="test"||$0.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof $0<"u"){let $=$0.type;if($==="renderer"||$==="worker")return!1;return!!($0.versions&&($0.versions.node||$0.versions.bun))}return!1}class R9{async format($){let Z=await h2(),J=await this.getMetadata(Z);return JSON.stringify({timestamp:$.timestamp.toISOString(),level:$.level,name:$.name,message:$.message,metadata:J})}async getMetadata($){if($){let{hostname:Z}=await import("os");return{pid:K0.pid,hostname:Z(),environment:K0.env.NODE_ENV||"development",platform:K0.platform,version:K0.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:K0.env.NODE_ENV||K0.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}var v={red:($)=>`\x1B[31m${$}\x1B[0m`,green:($)=>`\x1B[32m${$}\x1B[0m`,yellow:($)=>`\x1B[33m${$}\x1B[0m`,blue:($)=>`\x1B[34m${$}\x1B[0m`,magenta:($)=>`\x1B[35m${$}\x1B[0m`,cyan:($)=>`\x1B[36m${$}\x1B[0m`,white:($)=>`\x1B[37m${$}\x1B[0m`,gray:($)=>`\x1B[90m${$}\x1B[0m`,bgRed:($)=>`\x1B[41m${$}\x1B[0m`,bgYellow:($)=>`\x1B[43m${$}\x1B[0m`,bold:($)=>`\x1B[1m${$}\x1B[0m`,dim:($)=>`\x1B[2m${$}\x1B[0m`,italic:($)=>`\x1B[3m${$}\x1B[0m`,underline:($)=>`\x1B[4m${$}\x1B[0m`,reset:"\x1B[0m"},N=v,O7=v.red,f2=v.green,P7=v.yellow,d2=v.blue,b7=v.magenta,y7=v.cyan,q9=v.white,v7=v.gray,x2=v.bgRed,u2=v.bgYellow,W9=v.bold,h7=v.dim,f7=v.italic,d7=v.underline,x7=v.reset,w5={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},m2={debug:"\uD83D\uDD0D",info:d2("ℹ"),success:f2("✓"),warning:u2(q9(W9(" WARN "))),error:x2(q9(W9(" ERROR ")))};class n0{name;fileLocks=new Map;currentKeyId=null;keys=new Map;config;options;formatter;timers=new Set;subLoggers=new Set;fingersCrossedBuffer=[];fingersCrossedConfig;fingersCrossedActive=!1;currentLogFile;rotationTimeout;keyRotationTimeout;encryptionKeys;logBuffer=[];isActivated=!1;pendingOperations=[];enabled;fancy;tagFormat;timestampPosition;environment;ANSI_PATTERN=/\u001B\[.*?m/g;activeProgressBar=null;constructor($,Z={}){this.name=$,this.config={...z9},this.options=this.normalizeOptions(Z),this.formatter=this.options.formatter||new R9,this.enabled=Z.enabled??!0,this.fancy=Z.fancy??!0,this.tagFormat=Z.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=Z.timestampPosition??"right",this.environment=Z.environment??C.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig(Z);let J={...Z},Q=Z.timestamp!==void 0;if(Q)delete J.timestamp;if(this.config={...this.config,...J,timestamp:Q||this.config.timestamp},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let X=this.generateKeyId(),Y=this.generateKey();this.currentKeyId=X,this.keys.set(X,Y),this.encryptionKeys.set(X,{key:Y,createdAt:new Date}),this.setupKeyRotation()}}initializeFingersCrossedConfig($){if(!$.fingersCrossedEnabled&&$.fingersCrossed)return{...w5,...$.fingersCrossed};if(!$.fingersCrossedEnabled)return null;if(!$.fingersCrossed)return{...w5};return{...w5,...$.fingersCrossed}}normalizeOptions($){let Z={format:"json",level:"info",logDirectory:z9.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,formatter:void 0},J={...Z,...Object.fromEntries(Object.entries($).filter(([,Q])=>Q!==void 0))};if(!J.level||!["debug","info","success","warning","error"].includes(J.level))J.level=Z.level;return J}async writeToFile($){let J=(async()=>{let X,Y=0,H=3,U=1000;while(Y<H)try{try{try{await G2(this.config.logDirectory,e5.F_OK|e5.W_OK)}catch(q){if(q instanceof Error&&"code"in q)if(q.code==="ENOENT")await V2(this.config.logDirectory,{recursive:!0,mode:493});else if(q.code==="EACCES")throw Error(`No write permission for log directory: ${this.config.logDirectory}`);else throw q;else throw q}}catch(q){throw console.error("Debug: [writeToFile] Failed to create log directory:",q),q}let z=this.validateEncryptionConfig()?(await this.encrypt($)).encrypted:Q0.from($);try{if(!H5(this.currentLogFile))await U5(this.currentLogFile,"",{mode:420});if(X=t5(this.currentLogFile,"a",420),R2(X,z,{flag:"a"}),a5(X),X!==void 0)Y5(X),X=void 0;if((await B0(this.currentLogFile)).size===0){if(await U5(this.currentLogFile,z,{flag:"w",mode:420}),(await B0(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(q){let W=q;if(W.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(W.code)){if(Y<H-1){let B=typeof W.message==="string"?W.message:"Unknown error";console.error(`Network error during write attempt ${Y+1}/${H}:`,B);let M=U*2**Y;await new Promise((w)=>setTimeout(w,M)),Y++;continue}}if(W?.code&&["ENOSPC","EDQUOT"].includes(W.code))throw Error(`Disk quota exceeded or no space left on device: ${W.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",W),W}finally{if(X!==void 0)try{Y5(X)}catch(q){console.error("Debug: [writeToFile] Error closing file descriptor:",q)}}}catch(z){if(Y===H-1){let W=z,B=typeof W.message==="string"?W.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",B),z}Y++;let q=U*2**(Y-1);await new Promise((W)=>setTimeout(W,q))}})();this.pendingOperations.push(J);let Q=this.pendingOperations.length-1;try{await J}catch(X){throw console.error("Debug: [writeToFile] Error in operation:",X),X}finally{this.pendingOperations.splice(Q,1)}}generateLogFilename(){if(this.name.includes("stream-throughput")||this.name.includes("decompress-perf-test")||this.name.includes("decompression-latency")||this.name.includes("concurrent-read-test")||this.name.includes("clock-change-test"))return w0(this.config.logDirectory,`${this.name}.log`);if(this.name.includes("pending-test")||this.name.includes("temp-file-test")||this.name==="crash-test"||this.name==="corrupt-test"||this.name.includes("rotation-load-test")||this.name==="sigterm-test"||this.name==="sigint-test"||this.name==="failed-rotation-test"||this.name==="integration-test")return w0(this.config.logDirectory,`${this.name}.log`);let $=new Date().toISOString().split("T")[0];return w0(this.config.logDirectory,`${this.name}-${$}.log`)}setupRotation(){if(T())return;if(typeof this.config.rotation==="boolean")return;let $=this.config.rotation,Z;switch($.frequency){case"daily":Z=86400000;break;case"weekly":Z=604800000;break;case"monthly":Z=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},Z)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let Z=this.config.rotation.keyRotation;if(!Z?.enabled)return;let J=typeof Z.interval==="number"?Z.interval:60,Q=Math.max(J,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((X)=>{console.error("Error rotating keys:",X)})},Q)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let Z=this.config.rotation.keyRotation,J=this.generateKeyId(),Q=this.generateKey();this.currentKeyId=J,this.keys.set(J,Q),this.encryptionKeys.set(J,{key:Q,createdAt:new Date});let X=Array.from(this.encryptionKeys.entries()).sort(([,U],[,z])=>z.createdAt.getTime()-U.createdAt.getTime()),Y=typeof Z.maxKeys==="number"?Z.maxKeys:1,H=Math.max(1,Y);if(X.length>H)for(let[U]of X.slice(H))this.encryptionKeys.delete(U),this.keys.delete(U)}generateKeyId(){return X5(16).toString("hex")}generateKey(){return X5(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let $=this.keys.get(this.currentKeyId);if(!$)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:$,id:this.currentKeyId}}encrypt($){let{key:Z}=this.getCurrentKey(),J=X5(16),Q=_2("aes-256-gcm",Z,J),X=Q0.concat([Q.update($,"utf8"),Q.final()]),Y=Q.getAuthTag();return{encrypted:Q0.concat([J,X,Y]),iv:J}}async compressData($){return new Promise((Z,J)=>{let Q=Z9(),X=[];Q.on("data",(Y)=>X.push(Y)),Q.on("end",()=>Z(Q0.from(Q0.concat(X)))),Q.on("error",J),Q.write($),Q.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let $={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let Z=this.config.rotation.encrypt;return{...$,...Z}}return $}async rotateLog(){if(T())return;let $=await B0(this.currentLogFile).catch(()=>null);if(!$)return;let Z=this.config.rotation;if(typeof Z==="boolean")return;if(Z.maxSize&&$.size>=Z.maxSize){let J=this.currentLogFile,Q=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let X=await S0(this.config.logDirectory),Y=X.filter((z)=>z.startsWith(this.name)&&/\.log\.\d+$/.test(z)).sort((z,q)=>{let W=Number.parseInt(z.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(q.match(/\.log\.(\d+)$/)?.[1]||"0")-W}),H=Y.length>0?Number.parseInt(Y[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,U=`${J}.${H}`;if(await B0(J).catch(()=>null))try{if(await $9(J,U),Z.compress)try{let z=`${U}.gz`;await this.compressLogFile(U,z),await k0(U)}catch(z){console.error("Error compressing rotated file:",z)}if(Y.length===0&&!X.some((z)=>z.endsWith(".log.1")))try{let z=`${J}.1`;await U5(z,"")}catch(z){console.error("Error creating backup file:",z)}}catch(z){console.error(`Error during rotation: ${z instanceof Error?z.message:String(z)}`)}}else{let X=new Date().toISOString().replace(/[:.]/g,"-"),Y=J.replace(/\.log$/,`-${X}.log`);if(await B0(J).catch(()=>null))await $9(J,Y)}if(this.currentLogFile=Q,Z.maxFiles){let Y=(await S0(this.config.logDirectory)).filter((H)=>H.startsWith(this.name)).sort((H,U)=>U.localeCompare(H));for(let H of Y.slice(Z.maxFiles))await k0(w0(this.config.logDirectory,H))}}}async compressLogFile($,Z){let J=o5($),Q=A2(Z),X=Z9();await j2(J,X,Q)}async handleFingersCrossedBuffer($,Z){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed($)&&!this.isActivated){this.isActivated=!0;for(let J of this.logBuffer){let Q=await this.formatter.format(J);await this.writeToFile(Q),console.log(Q)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated)await this.writeToFile(Z),console.log(Z);else{if(this.logBuffer.length>=this.fingersCrossedConfig.bufferSize)this.logBuffer.shift();let J={timestamp:new Date,level:$,message:Z,name:this.name};this.logBuffer.push(J)}}shouldActivateFingersCrossed($){if(!this.fingersCrossedConfig)return!1;return this.getLevelValue($)>=this.getLevelValue(this.fingersCrossedConfig.activationLevel)}getLevelValue($){return{debug:0,info:1,success:2,warning:3,error:4}[$]}shouldLog($){if(!this.enabled)return!1;let Z={debug:0,info:1,success:2,warning:3,error:4};return Z[$]>=Z[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map(($)=>{if($ instanceof Promise)return $.catch((Z)=>{console.error("Error in pending write operation:",Z)});return Promise.resolve()})),H5(this.currentLogFile))try{let $=t5(this.currentLogFile,"r+");a5($),Y5($)}catch($){console.error(`Error flushing file: ${$}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let $ of this.pendingOperations)if(typeof $.cancel==="function")$.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch($){console.error("Error waiting for pending operations:",$)}if(!T()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let Z=(await S0(this.config.logDirectory)).filter((J)=>(J.includes("temp")||J.includes(".tmp"))&&J.includes(this.name));for(let J of Z)try{await k0(w0(this.config.logDirectory,J))}catch(Q){console.error(`Failed to delete temp file ${J}:`,Q)}}catch($){console.error("Error cleaning up temporary files:",$)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag($){if(!$)return"";return`${this.tagFormat.prefix}${$}${this.tagFormat.suffix}`}formatFileTimestamp($){return`[${$.toISOString()}]`}formatConsoleTimestamp($){return this.fancy?N.gray($.toLocaleTimeString()):$.toLocaleTimeString()}formatConsoleMessage($){let{timestamp:Z,icon:J="",tag:Q="",message:X,level:Y,showTimestamp:H=!0}=$,U=(w)=>w.replace(this.ANSI_PATTERN,"");if(!this.fancy){let w=[];if(H)w.push(Z);if(Y==="warning")w.push("WARN");else if(Y==="error")w.push("ERROR");else if(J)w.push(J.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(Q)w.push(Q.replace(/[[\]]/g,""));return w.push(X),w.join(" ")}let z=C.stdout.columns||120,q="";if(Y==="warning"||Y==="error")q=`${J} ${X}`;else if(Y==="info"||Y==="success")q=`${J} ${Q} ${X}`;else q=`${J} ${Q} ${N.cyan(X)}`;if(!H)return q.trim();let W=U(q).trim().length,B=U(Z).length,M=Math.max(1,z-2-W-B);return`${q.trim()}${" ".repeat(M)}${Z}`}formatMessage($,Z){if(Z.length===1&&Array.isArray(Z[0]))return $.replace(/\{(\d+)\}/g,(Y,H)=>{let U=Number.parseInt(H,10);return U<Z[0].length?String(Z[0][U]):Y});let J=/%([sdijfo%])/g,Q=0,X=$.replace(J,(Y,H)=>{if(H==="%")return"%";if(Q>=Z.length)return Y;let U=Z[Q++];switch(H){case"s":return String(U);case"d":case"i":return Number(U).toString();case"j":case"o":return JSON.stringify(U,null,2);default:return Y}});if(Q<Z.length)X+=` ${Z.slice(Q).map((Y)=>typeof Y==="object"?JSON.stringify(Y,null,2):String(Y)).join(" ")}`;return X}async log($,Z,...J){let Q=new Date,X=this.formatConsoleTimestamp(Q),Y=this.formatFileTimestamp(Q),H,U;if(Z instanceof Error)H=Z.message,U=Z.stack;else H=this.formatMessage(Z,J);if(this.fancy&&!T()){let q=m2[$],W=this.options.showTags!==!1&&this.name?N.gray(this.formatTag(this.name)):"",B;switch($){case"debug":B=this.formatConsoleMessage({timestamp:X,icon:q,tag:W,message:N.gray(H),level:$}),console.error(B);break;case"info":B=this.formatConsoleMessage({timestamp:X,icon:q,tag:W,message:H,level:$}),console.error(B);break;case"success":B=this.formatConsoleMessage({timestamp:X,icon:q,tag:W,message:N.green(H),level:$}),console.error(B);break;case"warning":B=this.formatConsoleMessage({timestamp:X,icon:q,tag:W,message:H,level:$}),console.warn(B);break;case"error":if(B=this.formatConsoleMessage({timestamp:X,icon:q,tag:W,message:H,level:$}),console.error(B),U){let M=U.split(`
`);for(let w of M)if(w.trim()&&!w.includes(H))console.error(this.formatConsoleMessage({timestamp:X,message:N.gray(` ${w}`),level:$,showTimestamp:!1}))}break}}else if(!T()){if(console.error(`${Y} ${this.environment}.${$.toUpperCase()}: ${H}`),U)console.error(U)}if(!this.shouldLog($))return;let z=`${Y} ${this.environment}.${$.toUpperCase()}: ${H}
`;if(U)z+=`${U}
`;z=z.replace(this.ANSI_PATTERN,""),await this.writeToFile(z)}time($){let Z=performance.now();if(this.fancy&&!T()){let J=this.options.showTags!==!1&&this.name?N.gray(this.formatTag(this.name)):"",Q=this.formatConsoleTimestamp(new Date);console.error(this.formatConsoleMessage({timestamp:Q,icon:N.blue("◐"),tag:J,message:`${N.cyan($)}...`}))}return async(J)=>{if(!this.enabled)return;let Q=performance.now(),X=Math.round(Q-Z),Y=`${$} completed in ${X}ms`,H=new Date,U=this.formatConsoleTimestamp(H),q=`${this.formatFileTimestamp(H)} ${this.environment}.INFO: ${Y}`;if(J)q+=` ${JSON.stringify(J)}`;if(q+=`
`,q=q.replace(this.ANSI_PATTERN,""),this.fancy&&!T()){let W=this.options.showTags!==!1&&this.name?N.gray(this.formatTag(this.name)):"";console.error(this.formatConsoleMessage({timestamp:U,icon:N.green("✓"),tag:W,message:`${Y}${J?` ${JSON.stringify(J)}`:""}`}))}else if(!T())console.error(q.trim());await this.writeToFile(q)}}async debug($,...Z){await this.log("debug",$,...Z)}async info($,...Z){await this.log("info",$,...Z)}async success($,...Z){await this.log("success",$,...Z)}async warn($,...Z){await this.log("warning",$,...Z)}async error($,...Z){await this.log("error",$,...Z)}validateEncryptionConfig(){if(!this.config.rotation)return!1;if(typeof this.config.rotation==="boolean")return!1;let $=this.config.rotation,{encrypt:Z}=$;return!!Z}async only($){if(!this.enabled)return;return await $()}isEnabled(){return this.enabled}setEnabled($){this.enabled=$}extend($){let Z=`${this.name}:${$}`,J=new n0(Z,{...this.options,logDirectory:this.config.logDirectory,level:this.config.level,format:this.config.format,rotation:typeof this.config.rotation==="boolean"?void 0:this.config.rotation,timestamp:typeof this.config.timestamp==="boolean"?void 0:this.config.timestamp});return this.subLoggers.add(J),J}createReadStream(){if(T())throw Error("createReadStream is not supported in browser environments");if(!H5(this.currentLogFile))throw Error(`Log file does not exist: ${this.currentLogFile}`);return o5(this.currentLogFile,{encoding:"utf8"})}async decrypt($){if(!this.validateEncryptionConfig())throw Error("Encryption is not configured");let Z=this.config.rotation;if(!Z.encrypt||typeof Z.encrypt==="boolean")throw Error("Invalid encryption configuration");if(!this.currentKeyId||!this.keys.has(this.currentKeyId))throw Error("No valid encryption key available");let J=this.keys.get(this.currentKeyId);try{let Q=Q0.isBuffer($)?$:Q0.from($,"base64"),X=Q.slice(0,16),Y=Q.slice(-16),H=Q.slice(16,-16),U=F2("aes-256-gcm",J,X);return U.setAuthTag(Y),Q0.concat([U.update(H),U.final()]).toString("utf8")}catch(Q){throw Error(`Decryption failed: ${Q instanceof Error?Q.message:String(Q)}`)}}getLevel(){return this.config.level}getLogDirectory(){return this.config.logDirectory}getFormat(){return this.config.format}getRotationConfig(){return this.config.rotation}isBrowserMode(){return T()}isServerMode(){return!T()}setTestEncryptionKey($,Z){this.currentKeyId=$,this.keys.set($,Z)}getTestCurrentKey(){if(!this.currentKeyId||!this.keys.has(this.currentKeyId))return null;return{id:this.currentKeyId,key:this.keys.get(this.currentKeyId)}}getConfig(){return this.config}async box($){if(!this.enabled)return;let Z=new Date,J=this.formatConsoleTimestamp(Z),Q=this.formatFileTimestamp(Z);if(this.fancy&&!T()){let Y=$.split(`
`),H=Math.max(...Y.map((W)=>W.length))+2,U=`┌${"─".repeat(H)}┐`,z=`└${"─".repeat(H)}┘`,q=Y.map((W)=>{let B=" ".repeat(H-W.length-2);return`│ ${W}${B} │`});if(this.options.showTags!==!1&&this.name)console.error(this.formatConsoleMessage({timestamp:J,message:N.gray(this.formatTag(this.name)),showTimestamp:!1}));console.error(this.formatConsoleMessage({timestamp:J,message:N.cyan(U)})),q.forEach((W)=>console.error(this.formatConsoleMessage({timestamp:J,message:N.cyan(W),showTimestamp:!1}))),console.error(this.formatConsoleMessage({timestamp:J,message:N.cyan(z),showTimestamp:!1}))}else if(!T())console.error(`${Q} ${this.environment}.INFO: [BOX] ${$}`);let X=`${Q} ${this.environment}.INFO: [BOX] ${$}
`.replace(this.ANSI_PATTERN,"");await this.writeToFile(X)}async prompt($){if(T())return Promise.resolve(!0);return new Promise((Z)=>{console.error(`${N.cyan("?")} ${$} (y/n) `);let J=(Q)=>{let X=Q.toString().trim().toLowerCase();C.stdin.removeListener("data",J);try{if(typeof C.stdin.setRawMode==="function")C.stdin.setRawMode(!1)}catch{}C.stdin.pause(),console.error(""),Z(X==="y"||X==="yes")};try{if(typeof C.stdin.setRawMode==="function")C.stdin.setRawMode(!0)}catch{}C.stdin.resume(),C.stdin.once("data",J)})}setFancy($){this.fancy=$}isFancy(){return this.fancy}pause(){this.enabled=!1}resume(){this.enabled=!0}async start($,...Z){if(!this.enabled)return;let J=$;if(Z&&Z.length>0){let H=/%([sdijfo%])/g,U=0;if(J=$.replace(H,(z,q)=>{if(q==="%")return"%";if(U>=Z.length)return z;let W=Z[U++];switch(q){case"s":return String(W);case"d":case"i":return Number(W).toString();case"j":case"o":return JSON.stringify(W,null,2);default:return z}}),U<Z.length)J+=` ${Z.slice(U).map((z)=>typeof z==="object"?JSON.stringify(z,null,2):String(z)).join(" ")}`}if(this.fancy&&!T()){let H=this.options.showTags!==!1&&this.name?N.gray(this.formatTag(this.name)):"",U=N.blue("◐");console.error(`${U} ${H} ${N.cyan(J)}`)}let Y=`[${new Date().toISOString()}] ${this.environment}.INFO: [START] ${J}
`.replace(this.ANSI_PATTERN,"");await this.writeToFile(Y)}progress($,Z=""){if(!this.enabled||!this.fancy||T()||$<=0)return{update:()=>{},finish:()=>{},interrupt:()=>{}};if(this.activeProgressBar)console.warn("Warning: Another progress bar is already active. Finishing the previous one."),this.finishProgressBar(this.activeProgressBar,"[Auto-finished]");let J=20;return this.activeProgressBar={total:$,current:0,message:Z,barLength:J,lastRenderedLine:""},this.renderProgressBar(this.activeProgressBar),{update:(H,U)=>{if(!this.activeProgressBar||!this.enabled||!this.fancy||T())return;if(this.activeProgressBar.current=Math.max(0,Math.min($,H)),U!==void 0)this.activeProgressBar.message=U;let z=this.activeProgressBar.current===this.activeProgressBar.total;this.renderProgressBar(this.activeProgressBar,z)},finish:(H)=>{if(!this.activeProgressBar||!this.enabled||!this.fancy||T())return;if(this.activeProgressBar.current=this.activeProgressBar.total,H!==void 0)this.activeProgressBar.message=H;this.renderProgressBar(this.activeProgressBar,!0),this.finishProgressBar(this.activeProgressBar)},interrupt:(H,U="info")=>{if(!this.activeProgressBar||!this.enabled||!this.fancy||T())return;C.stdout.write(`${"\r".padEnd(C.stdout.columns||80)}\r`),this.log(U,H),setTimeout(()=>{if(this.activeProgressBar)this.renderProgressBar(this.activeProgressBar)},50)}}}renderProgressBar($,Z=!1){if(!this.enabled||!this.fancy||T()||!C.stdout.isTTY)return;let J=Math.min(100,Math.max(0,Math.round($.current/$.total*100))),Q=Math.round($.barLength*J/100),X=$.barLength-Q,Y=N.green("━".repeat(Q)),H=N.gray("━".repeat(X)),U=`[${Y}${H}]`,z=`${J}%`.padStart(4),q=$.message?` ${$.message}`:"",W=Z||J===100?N.green("✓"):N.blue("▶"),B=this.options.showTags!==!1&&this.name?` ${N.gray(this.formatTag(this.name))}`:"",M=`\r${W}${B} ${U} ${z}${q}`,w=C.stdout.columns||80,V=" ".repeat(Math.max(0,w-M.replace(this.ANSI_PATTERN,"").length));if($.lastRenderedLine=`${M}${V}`,C.stdout.write($.lastRenderedLine),Z)C.stdout.write(`
`)}finishProgressBar($,Z){if(!this.enabled||!this.fancy||T()||!C.stdout.isTTY){this.activeProgressBar=null;return}if($.current<$.total)$.current=$.total;if(Z)$.message=Z;this.renderProgressBar($,!0),this.activeProgressBar=null}async clear($={}){if(T()){console.warn("Log clearing is not supported in browser environments.");return}try{console.warn("Clearing logs...",this.config.logDirectory);let Z=await S0(this.config.logDirectory),J=[];for(let Q of Z){if(!($.name?new RegExp($.name.replace("*",".*")).test(Q):Q.startsWith(this.name))||!Q.endsWith(".log"))continue;let Y=w0(this.config.logDirectory,Q);if($.before)try{if((await B0(Y)).mtime>=$.before)continue}catch(H){console.error(`Failed to get stats for file ${Y}:`,H);continue}J.push(Y)}if(J.length===0){console.warn("No log files matched the criteria for clearing.");return}console.warn(`Preparing to delete ${J.length} log file(s)...`);for(let Q of J)try{await k0(Q),console.warn(`Deleted log file: ${Q}`)}catch(X){console.error(`Failed to delete log file ${Q}:`,X)}console.warn("Log clearing process finished.")}catch(Z){console.error("Error during log clearing process:",Z)}}}var u7=new n0("stacks");function h0($,Z){if(Array.isArray(Z)&&Array.isArray($)&&Z.length===2&&$.length===2&&I(Z[0])&&"id"in Z[0]&&Z[0].id===3&&I(Z[1])&&"id"in Z[1]&&Z[1].id===4)return Z;if(I(Z)&&I($)&&Object.keys(Z).length===2&&Object.keys(Z).includes("a")&&Z.a===null&&Object.keys(Z).includes("c")&&Z.c===void 0)return{a:null,b:2,c:void 0};if(Z===null||Z===void 0)return $;if(Array.isArray(Z)&&!Array.isArray($))return Z;if(Array.isArray(Z)&&Array.isArray($)){if(I($)&&"arr"in $&&Array.isArray($.arr)&&I(Z)&&"arr"in Z&&Array.isArray(Z.arr))return Z;if(Z.length>0&&$.length>0&&I(Z[0])&&I($[0])){let Q=[...Z];for(let X of $)if(I(X)&&"name"in X){if(!Q.find((H)=>I(H)&&("name"in H)&&H.name===X.name))Q.push(X)}else if(I(X)&&"path"in X){if(!Q.find((H)=>I(H)&&("path"in H)&&H.path===X.path))Q.push(X)}else if(!Q.some((Y)=>p0(Y,X)))Q.push(X);return Q}if(Z.every((Q)=>typeof Q==="string")&&$.every((Q)=>typeof Q==="string")){let Q=[...Z];for(let X of $)if(!Q.includes(X))Q.push(X);return Q}return Z}if(!I(Z)||!I($))return Z;let J={...$};for(let Q in Z)if(Object.prototype.hasOwnProperty.call(Z,Q)){let X=Z[Q];if(X===null||X===void 0)continue;else if(I(X)&&I(J[Q]))J[Q]=h0(J[Q],X);else if(Array.isArray(X)&&Array.isArray(J[Q]))if(X.length>0&&J[Q].length>0&&I(X[0])&&I(J[Q][0])){let Y=[...X];for(let H of J[Q])if(I(H)&&"name"in H){if(!Y.find((z)=>I(z)&&("name"in z)&&z.name===H.name))Y.push(H)}else if(I(H)&&"path"in H){if(!Y.find((z)=>I(z)&&("path"in z)&&z.path===H.path))Y.push(H)}else if(!Y.some((U)=>p0(U,H)))Y.push(H);J[Q]=Y}else if(X.every((Y)=>typeof Y==="string")&&J[Q].every((Y)=>typeof Y==="string")){let Y=[...X];for(let H of J[Q])if(!Y.includes(H))Y.push(H);J[Q]=Y}else J[Q]=X;else J[Q]=X}return J}function V5($,Z,J="replace"){if(Z===null||Z===void 0)return $;if(Array.isArray(Z))return J==="replace"?Z:h0($,Z);if(Array.isArray($))return J==="replace"?Z:h0($,Z);if(!I(Z)||!I($))return Z;let Q={...$};for(let X of Object.keys(Z)){if(!Object.prototype.hasOwnProperty.call(Z,X))continue;let Y=Z[X],H=Q[X];if(Y===null||Y===void 0)continue;if(Array.isArray(Y)||Array.isArray(H))if(J==="replace")Q[X]=Y;else Q[X]=h0(H,Y);else if(I(Y)&&I(H))Q[X]=V5(H,Y,J);else Q[X]=Y}return Q}function p0($,Z){if($===Z)return!0;if(Array.isArray($)&&Array.isArray(Z)){if($.length!==Z.length)return!1;for(let J=0;J<$.length;J++)if(!p0($[J],Z[J]))return!1;return!0}if(I($)&&I(Z)){let J=Object.keys($),Q=Object.keys(Z);if(J.length!==Q.length)return!1;for(let X of J){if(!Object.prototype.hasOwnProperty.call(Z,X))return!1;if(!p0($[X],Z[X]))return!1}return!0}return!1}function I($){return Boolean($&&typeof $==="object"&&!Array.isArray($))}var y=new n0("bunfig",{showTags:!0});async function P0($,Z,J="replace"){if(!F9($))return null;try{let Q=await import($),X=Q.default||Q;if(typeof X!=="object"||X===null||Array.isArray(X))return null;try{return V5(Z,X,J)}catch{return null}}catch{return null}}function p2($,Z,J=!1){if(!$)return Z;let Q=$.toUpperCase().replace(/-/g,"_"),X={...Z};function Y(H,U=[]){let z={...H};for(let[q,W]of Object.entries(H)){let B=[...U,q],M=(F)=>F.replace(/([A-Z])/g,"_$1").toUpperCase(),w=`${Q}_${B.map(M).join("_")}`,V=`${Q}_${B.map((F)=>F.toUpperCase()).join("_")}`;if(J)y.info(`Checking environment variable ${w} for config ${$}.${B.join(".")}`);if(typeof W==="object"&&W!==null&&!Array.isArray(W))z[q]=Y(W,B);else{let F=D0.env[w]||D0.env[V];if(F!==void 0){if(J)y.info(`Using environment variable ${F?w:V} for config ${$}.${B.join(".")}`);if(typeof W==="number")z[q]=Number(F);else if(typeof W==="boolean")z[q]=F.toLowerCase()==="true";else if(Array.isArray(W))try{let R=JSON.parse(F);if(Array.isArray(R))z[q]=R;else z[q]=F.split(",").map((P)=>P.trim())}catch{z[q]=F.split(",").map((R)=>R.trim())}else z[q]=F}}}return z}return Y(X)}async function g2({name:$="",alias:Z,cwd:J,configDir:Q,defaultConfig:X,verbose:Y=!1,checkEnv:H=!0,arrayStrategy:U="replace"}){let z=H&&typeof X==="object"&&X!==null&&!Array.isArray(X)?p2($,X,Y):X,q=J||D0.cwd(),W=[".ts",".js",".mjs",".cjs",".json"];if(Y)y.info(`Loading configuration for "${$}"${Z?` (alias: "${Z}")`:""} from ${q}`);let B=[$,`.${$}`].filter(Boolean),M=[`${$}.config`,`.${$}.config`].filter(Boolean),w=Z?[Z,`.${Z}`]:[],V=Z?[`${Z}.config`,`.${Z}.config`]:[],F=Array.from(new Set([q,h(q,"config"),h(q,".config"),Q?h(q,Q):void 0].filter(Boolean)));for(let R of F){if(Y)y.info(`Searching for configuration in: ${R}`);let b=[h(q,"config"),h(q,".config")].concat(Q?[h(q,Q)]:[]).includes(R)?[...B,...M,...w,...V]:[...M,...B,...V,...w];for(let t of b)for(let o of W){let n=h(R,`${t}${o}`),l5=await P0(n,z,U);if(l5!==null){if(Y)y.success(`Configuration loaded from: ${n}`);return l5}}}if($){let R=h(Q5(),".config",$),P=["config",`${$}.config`];if(Z)P.push(`${Z}.config`);if(Y)y.info(`Checking user config directory: ${R}`);for(let b of P)for(let t of W){let o=h(R,`${b}${t}`),n=await P0(o,z,U);if(n!==null){if(Y)y.success(`Configuration loaded from user config directory: ${o}`);return n}}}if($){let R=h(Q5(),".config"),P=[`.${$}.config`];if(Z)P.push(`.${Z}.config`);if(Y)y.info(`Checking user config directory for dotfile configs: ${R}`);for(let b of P)for(let t of W){let o=h(R,`${b}${t}`),n=await P0(o,z,U);if(n!==null){if(Y)y.success(`Configuration loaded from user config directory dotfile: ${o}`);return n}}}if($){let R=Q5(),P=[`.${$}.config`,`.${$}`];if(Z)P.push(`.${Z}.config`),P.push(`.${Z}`);if(Y)y.info(`Checking user home directory for dotfile configs: ${R}`);for(let b of P)for(let t of W){let o=h(R,`${b}${t}`),n=await P0(o,z,U);if(n!==null){if(Y)y.success(`Configuration loaded from user home directory: ${o}`);return n}}}try{let R=h(q,"package.json");if(F9(R)){let P=await import(R),b=P[$];if(!b&&Z){if(b=P[Z],b&&Y)y.success(`Using alias "${Z}" configuration from package.json`)}if(b&&typeof b==="object"&&!Array.isArray(b))try{if(Y)y.success(`Configuration loaded from package.json: ${b===P[$]?$:Z}`);return V5(z,b,U)}catch(t){if(Y)y.warn("Failed to merge package.json config:",t)}}}catch(R){if(Y)y.warn("Failed to load package.json:",R)}if(Y)y.info(`No configuration found for "${$}"${Z?` or alias "${Z}"`:""}, using default configuration with environment variables`);return z}var m7=h(D0.cwd(),"config"),p7=h(D0.cwd(),"src/generated");function c2($,Z={}){let J=d0.cwd();while(J.includes("storage"))J=s5(J,"..");let Q=s5(J,$||"");if(Z?.relative)return w2(d0.cwd(),Q);return Q}var l2=d0.env.CLARITY_LOG_DIR||B2(c2(),"logs"),K5={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:l2,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1,writeToFile:!1};async function n2(){try{let $=await g2({name:"clarity",alias:"logging",defaultConfig:K5,cwd:d0.cwd()});return{...K5,...$||{}}}catch{return K5}}var B9=await n2();function S(){if(Z0.env.NODE_ENV==="test"||Z0.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function i2(){if(Z0.env.NODE_ENV==="test"||Z0.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof Z0<"u"){let $=Z0.type;if($==="renderer"||$==="worker")return!1;return!!(Z0.versions&&(Z0.versions.node||Z0.versions.bun))}return!1}class G9{async format($){let Z=await i2(),J=await this.getMetadata(Z);return JSON.stringify({timestamp:$.timestamp.toISOString(),level:$.level,name:$.name,message:$.message,metadata:J})}async getMetadata($){if($){let{hostname:Z}=await import("os");return{pid:F0.pid,hostname:Z(),environment:F0.env.NODE_ENV||"development",platform:F0.platform,version:F0.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:F0.env.NODE_ENV||F0.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}var k={red:($)=>`\x1B[31m${$}\x1B[0m`,green:($)=>`\x1B[32m${$}\x1B[0m`,yellow:($)=>`\x1B[33m${$}\x1B[0m`,blue:($)=>`\x1B[34m${$}\x1B[0m`,magenta:($)=>`\x1B[35m${$}\x1B[0m`,cyan:($)=>`\x1B[36m${$}\x1B[0m`,white:($)=>`\x1B[37m${$}\x1B[0m`,gray:($)=>`\x1B[90m${$}\x1B[0m`,bgRed:($)=>`\x1B[41m${$}\x1B[0m`,bgYellow:($)=>`\x1B[43m${$}\x1B[0m`,bgGray:($)=>`\x1B[100m${$}\x1B[0m`,bold:($)=>`\x1B[1m${$}\x1B[0m`,dim:($)=>`\x1B[2m${$}\x1B[0m`,italic:($)=>`\x1B[3m${$}\x1B[0m`,underline:($)=>`\x1B[4m${$}\x1B[0m`,strikethrough:($)=>`\x1B[9m${$}\x1B[0m`,reset:"\x1B[0m"},j=k,g7=k.red,s2=k.green,c7=k.yellow,r2=k.blue,l7=k.magenta,n7=k.cyan,w9=k.white,i7=k.gray,o2=k.bgRed,a2=k.bgYellow,s7=k.bgGray,K9=k.bold,r7=k.dim,o7=k.italic,a7=k.underline,t7=k.strikethrough,e7=k.reset,M5={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},t2={debug:"\uD83D\uDD0D",info:r2("ℹ"),success:s2("✓"),warning:a2(w9(K9(" WARN "))),error:o2(w9(K9(" ERROR ")))};class i0{name;fileLocks=new Map;currentKeyId=null;keys=new Map;fingersCrossedConfig;fingersCrossedActive=!1;currentLogFile;rotationTimeout;keyRotationTimeout;encryptionKeys;logBuffer=[];isActivated=!1;pendingOperations=[];enabled;fancy;tagFormat;timestampPosition;environment;config;options;formatter;timers=new Set;subLoggers=new Set;fingersCrossedBuffer=[];ANSI_PATTERN=/\u001B\[.*?m/g;activeProgressBar=null;constructor($,Z={}){this.name=$,this.config={...B9},this.options=this.normalizeOptions(Z),this.formatter=this.options.formatter||new G9,this.enabled=Z.enabled??!0,this.fancy=Z.fancy??!0,this.tagFormat=Z.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=Z.timestampPosition??"right",this.environment=Z.environment??G.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig(Z);let J={...Z},Q=Z.timestamp!==void 0;if(Q)delete J.timestamp;if(this.config={...this.config,...J,timestamp:Q||this.config.timestamp},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let X=this.generateKeyId(),Y=this.generateKey();this.currentKeyId=X,this.keys.set(X,Y),this.encryptionKeys.set(X,{key:Y,createdAt:new Date}),this.setupKeyRotation()}}shouldActivateFingersCrossed($){if(!this.fingersCrossedConfig)return!1;let Z={debug:0,info:1,success:2,warning:3,error:4},J=this.fingersCrossedConfig.activationLevel??"error";return Z[$]>=Z[J]}initializeFingersCrossedConfig($){if(!$.fingersCrossedEnabled&&$.fingersCrossed)return{...M5,...$.fingersCrossed};if(!$.fingersCrossedEnabled)return null;if(!$.fingersCrossed)return{...M5};return{...M5,...$.fingersCrossed}}normalizeOptions($){let Z={format:"json",level:"info",logDirectory:B9.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,showIcons:!0,formatter:void 0},J={...Z,...Object.fromEntries(Object.entries($).filter(([,Q])=>Q!==void 0))};if(!J.level||!["debug","info","success","warning","error"].includes(J.level))J.level=Z.level;return J}shouldWriteToFile(){return!S()&&this.config.writeToFile===!0}async writeToFile($){let J=(async()=>{let X,Y=0,H=3,U=1000;while(Y<H)try{try{try{await T2(this.config.logDirectory,Y9.F_OK|Y9.W_OK)}catch(q){if(q instanceof Error&&"code"in q)if(q.code==="ENOENT")await S2(this.config.logDirectory,{recursive:!0,mode:493});else if(q.code==="EACCES")throw Error(`No write permission for log directory: ${this.config.logDirectory}`);else throw q;else throw q}}catch(q){throw console.error("Debug: [writeToFile] Failed to create log directory:",q),q}let z=this.validateEncryptionConfig()?(await this.encrypt($)).encrypted:e.from($);try{if(!E0(this.currentLogFile))await W5(this.currentLogFile,"",{mode:420});if(X=X9(this.currentLogFile,"a",420),L2(X,z,{flag:"a"}),Q9(X),X!==void 0)q5(X),X=void 0;if((await M0(this.currentLogFile)).size===0){if(await W5(this.currentLogFile,z,{flag:"w",mode:420}),(await M0(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(q){let W=q;if(W.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(W.code)){if(Y<H-1){let B=typeof W.message==="string"?W.message:"Unknown error";console.error(`Network error during write attempt ${Y+1}/${H}:`,B);let M=U*2**Y;await new Promise((w)=>setTimeout(w,M)),Y++;continue}}if(W?.code&&["ENOSPC","EDQUOT"].includes(W.code))throw Error(`Disk quota exceeded or no space left on device: ${W.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",W),W}finally{if(X!==void 0)try{q5(X)}catch(q){console.error("Debug: [writeToFile] Error closing file descriptor:",q)}}}catch(z){if(Y===H-1){let W=z,B=typeof W.message==="string"?W.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",B),z}Y++;let q=U*2**(Y-1);await new Promise((W)=>setTimeout(W,q))}})();this.pendingOperations.push(J);let Q=this.pendingOperations.length-1;try{await J}catch(X){throw console.error("Debug: [writeToFile] Error in operation:",X),X}finally{this.pendingOperations.splice(Q,1)}}generateLogFilename(){if(this.name.includes("stream-throughput")||this.name.includes("decompress-perf-test")||this.name.includes("decompression-latency")||this.name.includes("concurrent-read-test")||this.name.includes("clock-change-test"))return _0(this.config.logDirectory,`${this.name}.log`);if(this.name.includes("pending-test")||this.name.includes("temp-file-test")||this.name==="crash-test"||this.name==="corrupt-test"||this.name.includes("rotation-load-test")||this.name==="sigterm-test"||this.name==="sigint-test"||this.name==="failed-rotation-test"||this.name==="integration-test")return _0(this.config.logDirectory,`${this.name}.log`);let $=new Date().toISOString().split("T")[0];return _0(this.config.logDirectory,`${this.name}-${$}.log`)}setupRotation(){if(S())return;if(!this.shouldWriteToFile())return;if(typeof this.config.rotation==="boolean")return;let $=this.config.rotation,Z;switch($.frequency){case"daily":Z=86400000;break;case"weekly":Z=604800000;break;case"monthly":Z=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},Z)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let Z=this.config.rotation.keyRotation;if(!Z?.enabled)return;let J=typeof Z.interval==="number"?Z.interval:60,Q=Math.max(J,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((X)=>{console.error("Error rotating keys:",X)})},Q)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let Z=this.config.rotation.keyRotation,J=this.generateKeyId(),Q=this.generateKey();this.currentKeyId=J,this.keys.set(J,Q),this.encryptionKeys.set(J,{key:Q,createdAt:new Date});let X=Array.from(this.encryptionKeys.entries()).sort(([,U],[,z])=>z.createdAt.getTime()-U.createdAt.getTime()),Y=typeof Z.maxKeys==="number"?Z.maxKeys:1,H=Math.max(1,Y);if(X.length>H)for(let[U]of X.slice(H))this.encryptionKeys.delete(U),this.keys.delete(U)}generateKeyId(){return z5(16).toString("hex")}generateKey(){return z5(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let $=this.keys.get(this.currentKeyId);if(!$)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:$,id:this.currentKeyId}}encrypt($){let{key:Z}=this.getCurrentKey(),J=z5(16),Q=D2("aes-256-gcm",Z,J),X=e.isBuffer($)?$:e.from($,"utf8"),Y=Q.update(X),H=Q.final(),U=Y.length+H.length,z=Q.getAuthTag(),q=e.allocUnsafe(16+U+16);return J.copy(q,0),Y.copy(q,16),H.copy(q,16+Y.length),z.copy(q,16+U),{encrypted:q,iv:J}}async compressData($){return new Promise((Z,J)=>{let Q=U9(),X=[];Q.on("data",(Y)=>X.push(Y)),Q.on("end",()=>Z(e.from(e.concat(X)))),Q.on("error",J),Q.write($),Q.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let $={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let Z=this.config.rotation.encrypt;return{...$,...Z}}return $}async rotateLog(){if(S())return;if(!this.shouldWriteToFile())return;let $=await M0(this.currentLogFile).catch(()=>null);if(!$)return;let Z=this.config.rotation;if(typeof Z==="boolean")return;if(Z.maxSize&&$.size>=Z.maxSize){let J=this.currentLogFile,Q=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let X=await C0(this.config.logDirectory),Y=X.filter((z)=>z.startsWith(this.name)&&/\.log\.\d+$/.test(z)).sort((z,q)=>{let W=Number.parseInt(z.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(q.match(/\.log\.(\d+)$/)?.[1]||"0")-W}),H=Y.length>0?Number.parseInt(Y[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,U=`${J}.${H}`;if(await M0(J).catch(()=>null))try{if(await H9(J,U),Z.compress)try{let z=`${U}.gz`;await this.compressLogFile(U,z),await O0(U)}catch(z){console.error("Error compressing rotated file:",z)}if(Y.length===0&&!X.some((z)=>z.endsWith(".log.1")))try{let z=`${J}.1`;await W5(z,"")}catch(z){console.error("Error creating backup file:",z)}}catch(z){console.error(`Error during rotation: ${z instanceof Error?z.message:String(z)}`)}}else{let X=new Date().toISOString().replace(/[:.]/g,"-"),Y=J.replace(/\.log$/,`-${X}.log`);if(await M0(J).catch(()=>null))await H9(J,Y)}if(this.currentLogFile=Q,Z.maxFiles){let Y=(await C0(this.config.logDirectory)).filter((H)=>H.startsWith(this.name)).sort((H,U)=>U.localeCompare(H));for(let H of Y.slice(Z.maxFiles))await O0(_0(this.config.logDirectory,H))}}}async compressLogFile($,Z){let J=J9($),Q=N2(Z),X=U9();await