UNPKG

@stacksjs/rpx

Version:

A modern and smart reverse proxy.

9 lines 127 kB
import{createRequire as uX}from"node:module";var r=uX(import.meta.url);import{execSync as cQ}from"node:child_process";import*as vX from"node:fs/promises";import{existsSync as SU,statSync as CU}from"fs";import{existsSync as qU,mkdirSync as iX,readdirSync as sX,writeFileSync as oX}from"fs";import{homedir as t}from"os";import{dirname as kU,resolve as y}from"path";import a from"process";import{join as rX,relative as aX,resolve as xU}from"path";import kQ from"process";import{existsSync as BX,mkdirSync as e0,readdirSync as Q7,writeFileSync as U7}from"fs";import{homedir as lQ}from"os";import{dirname as $7,resolve as b}from"path";import _Q from"process";import{join as tX,relative as eX,resolve as PU}from"path";import xQ from"process";import{existsSync as RX,mkdirSync as q7,readdirSync as _7,writeFileSync as A7}from"fs";import{dirname as z7,resolve as PQ}from"path";import _U from"process";import{Buffer as s}from"buffer";import{createCipheriv as QZ,createDecipheriv as UZ,randomBytes as nQ}from"crypto";import{closeSync as iQ,createReadStream as bU,createWriteStream as XZ,existsSync as sQ,fsyncSync as yU,openSync as vU,writeFileSync as ZZ}from"fs";import{access as $Z,constants as hU,mkdir as YZ,readdir as RQ,rename as dU,stat as e,unlink as LQ,writeFile as oQ}from"fs/promises";import{join as QQ}from"path";import S from"process";import{pipeline as GZ}from"stream/promises";import{createGzip as fU}from"zlib";import UQ from"process";import c from"process";import{Buffer as m}from"buffer";import{createCipheriv as HZ,createDecipheriv as JZ,randomBytes as rQ}from"crypto";import{closeSync as aQ,createReadStream as pU,createWriteStream as qZ,existsSync as wQ,fsyncSync as uU,openSync as mU,writeFileSync as _Z}from"fs";import{access as AZ,constants as gU,mkdir as WZ,readdir as KQ,rename as cU,stat as XQ,unlink as jQ,writeFile as tQ}from"fs/promises";import{isAbsolute as zZ,join as ZQ,resolve as BZ}from"path";import R from"process";import{pipeline as RZ}from"stream/promises";import{createGzip as lU}from"zlib";import $Q from"process";import l from"process";import FQ from"process";import{existsSync as IQ}from"fs";import{resolve as eQ}from"path";import{existsSync as LZ}from"fs";import{existsSync as wZ,readdirSync as KZ}from"fs";import{extname as QU,resolve as nU}from"path";import jZ from"process";import{join as F0,relative as I0,resolve as $X}from"path";import pQ from"process";import{Buffer as g}from"buffer";import{createCipheriv as D0,createDecipheriv as N0,randomBytes as YU}from"crypto";import{closeSync as GU,createReadStream as YX,createWriteStream as E0,existsSync as VQ,fsyncSync as GX,openSync as HX,writeFileSync as O0}from"fs";import{access as T0,constants as JX,mkdir as S0,readdir as DQ,rename as qX,stat as YQ,unlink as NQ,writeFile as HU}from"fs/promises";import{isAbsolute as C0,join as GQ,resolve as k0}from"path";import L from"process";import{pipeline as x0}from"stream/promises";import{createGzip as _X}from"zlib";import HQ from"process";import n from"process";var mX=Object.defineProperty;var gX=(Q)=>Q;function cX(Q,U){this[Q]=gX.bind(null,U)}var lX=(Q,U)=>{for(var X in U)mX(Q,X,{get:U[X],enumerable:!0,configurable:!0,set:cX.bind(U,X)})},nX=(Q,U)=>()=>(Q&&(U=Q(Q=0)),U);var zX={};lX(zX,{withErrorRecovery:()=>KX,tryLoadConfig:()=>mZ,loadConfigWithResult:()=>pZ,loadConfig:()=>VX,isRetryableError:()=>bZ,isConfigNotFoundError:()=>PZ,isBunfigError:()=>jX,globalPerformanceMonitor:()=>zQ,globalCache:()=>JQ,getEnvOrDefault:()=>yZ,generateConfigTypes:()=>gZ,defaultGeneratedDir:()=>kX,defaultConfigDir:()=>CX,deepMergeWithArrayStrategy:()=>DU,deepMerge:()=>FX,createLibraryConfig:()=>cZ,config:()=>uZ,bunfigPlugin:()=>lZ,applyEnvVarsToConfig:()=>qQ,TypeGenerationError:()=>wU,SchemaValidationError:()=>WQ,PluginError:()=>jU,PerformanceMonitor:()=>IU,FileSystemError:()=>LU,ErrorFactory:()=>o,EnvVarError:()=>fQ,EnvProcessor:()=>mQ,ConfigValidator:()=>NU,ConfigValidationError:()=>BU,ConfigNotFoundError:()=>dQ,ConfigMergeError:()=>RU,ConfigLoader:()=>EU,ConfigLoadError:()=>AQ,ConfigFileLoader:()=>gQ,ConfigCache:()=>FU,CacheUtils:()=>NX,BunfigError:()=>v,BrowserConfigError:()=>KU,ArrayMergeStrategies:()=>TX});class FU{cache=new Map;totalHits=0;totalMisses=0;options;constructor(Q={}){this.options={enabled:!0,ttl:300000,maxSize:100,keyPrefix:"bunfig:",...Q}}generateKey(Q,U){let X=U?`:${U}`:"";return`${this.options.keyPrefix}${Q}${X}`}isExpired(Q){return Date.now()-Q.timestamp.getTime()>Q.ttl}estimateSize(Q){try{return JSON.stringify(Q).length}catch{return 1000}}evictIfNeeded(){if(this.cache.size<=this.options.maxSize)return;let Q=Array.from(this.cache.entries()).sort(([,X],[,Z])=>X.timestamp.getTime()-Z.timestamp.getTime()),U=Q.length-this.options.maxSize+1;for(let X=0;X<U;X++)this.cache.delete(Q[X][0])}set(Q,U,X,Z){if(!this.options.enabled)return;let $=this.generateKey(Q,X),Y=Z??this.options.ttl,G=this.estimateSize(U);this.cache.set($,{value:U,timestamp:new Date,ttl:Y,hits:0,size:G}),this.evictIfNeeded()}get(Q,U){if(!this.options.enabled){this.totalMisses++;return}let X=this.generateKey(Q,U),Z=this.cache.get(X);if(!Z){this.totalMisses++;return}if(this.isExpired(Z)){this.cache.delete(X),this.totalMisses++;return}return Z.hits++,this.totalHits++,Z.value}isFileModified(Q,U){try{if(!SU(Q))return!0;return CU(Q).mtime>U}catch{return!0}}getWithFileCheck(Q,U){let X=this.get(Q,U);if(!X)return;if(this.isFileModified(U,X.fileTimestamp)){this.delete(Q,U);return}return X.value}setWithFileCheck(Q,U,X,Z){try{let $=SU(X)?CU(X):null,Y=$?$.mtime:new Date;this.set(Q,{value:U,fileTimestamp:Y},X,Z)}catch{this.set(Q,U,X,Z)}}delete(Q,U){let X=this.generateKey(Q,U);return this.cache.delete(X)}clear(){this.cache.clear(),this.totalHits=0,this.totalMisses=0}cleanup(){let Q=0;for(let[U,X]of this.cache.entries())if(this.isExpired(X))this.cache.delete(U),Q++;return Q}getStats(){let Q=Array.from(this.cache.values()),U=Q.reduce((Z,$)=>Z+$.size,0),X=Q.map((Z)=>Z.timestamp).sort();return{size:U,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:X[0],newestEntry:X[X.length-1]}}export(){let Q={};for(let[U,X]of this.cache.entries())Q[U]={value:X.value,timestamp:X.timestamp.toISOString(),ttl:X.ttl,hits:X.hits,size:X.size};return Q}import(Q){this.cache.clear();for(let[U,X]of Object.entries(Q))if(typeof X==="object"&&X!==null){let Z=X;this.cache.set(U,{value:Z.value,timestamp:new Date(Z.timestamp),ttl:Z.ttl,hits:Z.hits,size:Z.size})}}}class IU{metrics=[];maxMetrics=1000;async track(Q,U,X={}){let Z=performance.now(),$=new Date;try{let Y=await U(),G=performance.now()-Z;return this.recordMetric({operation:Q,duration:G,timestamp:$,...X}),Y}catch(Y){let G=performance.now()-Z;throw this.recordMetric({operation:`${Q}:error`,duration:G,timestamp:$,...X}),Y}}recordMetric(Q){if(this.metrics.push(Q),this.metrics.length>this.maxMetrics)this.metrics=this.metrics.slice(-this.maxMetrics)}getStats(Q){let U=Q?this.metrics.filter(($)=>$.operation===Q):this.metrics;if(U.length===0)return{count:0,averageDuration:0,minDuration:0,maxDuration:0,totalDuration:0,recentMetrics:[]};let X=U.map(($)=>$.duration),Z=X.reduce(($,Y)=>$+Y,0);return{count:U.length,averageDuration:Z/U.length,minDuration:Math.min(...X),maxDuration:Math.max(...X),totalDuration:Z,recentMetrics:U.slice(-10)}}getAllMetrics(){return[...this.metrics]}clearMetrics(){this.metrics=[]}getSlowOperations(Q){return this.metrics.filter((U)=>U.duration>Q)}}function FZ(Q,U={}){let Z=Object.keys(U).sort().map(($)=>`${$}:${U[$]}`).join("|");return Z?`${Q}:${Z}`:Q}function IZ(Q,U){try{return JSON.stringify(Q)===JSON.stringify(U)}catch{return Q===U}}function MZ(Q){return Q.getStats().size*2}function MU(Q,U){if(Array.isArray(U)&&Array.isArray(Q)&&U.length===2&&Q.length===2&&M(U[0])&&"id"in U[0]&&U[0].id===3&&M(U[1])&&"id"in U[1]&&U[1].id===4)return U;if(M(U)&&M(Q)&&Object.keys(U).length===2&&Object.keys(U).includes("a")&&U.a===null&&Object.keys(U).includes("c")&&U.c===void 0)return{a:null,b:2,c:void 0};if(U===null||U===void 0)return Q;if(Array.isArray(U)&&!Array.isArray(Q))return U;if(Array.isArray(U)&&Array.isArray(Q)){if(M(Q)&&"arr"in Q&&Array.isArray(Q.arr)&&M(U)&&"arr"in U&&Array.isArray(U.arr))return U;if(U.length>0&&Q.length>0&&M(U[0])&&M(Q[0])){let Z=[...U];for(let $ of Q)if(M($)&&"name"in $){if(!Z.find((G)=>M(G)&&("name"in G)&&G.name===$.name))Z.push($)}else if(M($)&&"path"in $){if(!Z.find((G)=>M(G)&&("path"in G)&&G.path===$.path))Z.push($)}else if(!Z.some((Y)=>bQ(Y,$)))Z.push($);return Z}if(U.every((Z)=>typeof Z==="string")&&Q.every((Z)=>typeof Z==="string")){let Z=[...U];for(let $ of Q)if(!Z.includes($))Z.push($);return Z}return U}if(!M(U)||!M(Q))return U;let X={...Q};for(let Z in U)if(Object.prototype.hasOwnProperty.call(U,Z)){let $=U[Z];if($===null||$===void 0)continue;else if(M($)&&M(X[Z]))X[Z]=MU(X[Z],$);else if(Array.isArray($)&&Array.isArray(X[Z]))if($.length>0&&X[Z].length>0&&M($[0])&&M(X[Z][0])){let Y=[...$];for(let G of X[Z])if(M(G)&&"name"in G){if(!Y.find((H)=>M(H)&&("name"in H)&&H.name===G.name))Y.push(G)}else if(M(G)&&"path"in G){if(!Y.find((H)=>M(H)&&("path"in H)&&H.path===G.path))Y.push(G)}else if(!Y.some((J)=>bQ(J,G)))Y.push(G);X[Z]=Y}else if($.every((Y)=>typeof Y==="string")&&X[Z].every((Y)=>typeof Y==="string")){let Y=[...$];for(let G of X[Z])if(!Y.includes(G))Y.push(G);X[Z]=Y}else X[Z]=$;else X[Z]=$}return X}function bQ(Q,U){if(Q===U)return!0;if(Array.isArray(Q)&&Array.isArray(U)){if(Q.length!==U.length)return!1;for(let X=0;X<Q.length;X++)if(!bQ(Q[X],U[X]))return!1;return!0}if(M(Q)&&M(U)){let X=Object.keys(Q),Z=Object.keys(U);if(X.length!==Z.length)return!1;for(let $ of X){if(!Object.prototype.hasOwnProperty.call(U,$))return!1;if(!bQ(Q[$],U[$]))return!1}return!0}return!1}function M(Q){return Boolean(Q&&typeof Q==="object"&&!Array.isArray(Q))}async function VZ(Q,U){if(!RX(Q))return null;try{let X=await import(Q),Z=X.default||X;if(typeof Z!=="object"||Z===null||Array.isArray(Z))return null;try{return MU(U,Z)}catch{return null}}catch{return null}}async function DZ({name:Q="",cwd:U,defaultConfig:X}){let Z=U||_U.cwd(),$=[".ts",".js",".mjs",".cjs",".json"],Y=[`${Q}.config`,`.${Q}.config`,Q,`.${Q}`];for(let G of Y)for(let J of $){let H=PQ(Z,`${G}${J}`),q=await VZ(H,X);if(q!==null)return q}try{let G=PQ(Z,"package.json");if(RX(G)){let H=(await import(G))[Q];if(H&&typeof H==="object"&&!Array.isArray(H))try{return MU(X,H)}catch{}}}catch{}return X}function NZ(Q,U={}){let X=xQ.cwd();while(X.includes("storage"))X=PU(X,"..");let Z=PU(X,Q||"");if(U?.relative)return eX(xQ.cwd(),Z);return Z}async function EZ(){try{let Q=await DZ({name:"clarity",defaultConfig:OQ,cwd:xQ.cwd(),endpoint:"",headers:{}});return{...OQ,...Q}}catch{return OQ}}function D(){if(c.env.NODE_ENV==="test"||c.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function OZ(){if(c.env.NODE_ENV==="test"||c.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof c<"u"){let Q=c.type;if(Q==="renderer"||Q==="worker")return!1;return!!(c.versions&&(c.versions.node||c.versions.bun))}return!1}class LX{async format(Q){let U=await OZ(),X=await this.getMetadata(U);return JSON.stringify({timestamp:Q.timestamp.toISOString(),level:Q.level,name:Q.name,message:Q.message,metadata:X})}async getMetadata(Q){if(Q){let{hostname:U}=await import("os");return{pid:UQ.pid,hostname:U(),environment:UQ.env.NODE_ENV||"development",platform:UQ.platform,version:UQ.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:UQ.env.NODE_ENV||UQ.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}class yQ{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(Q,U={}){this.name=Q,this.config={...WU},this.options=this.normalizeOptions(U),this.formatter=this.options.formatter||new LX,this.enabled=U.enabled??!0,this.fancy=U.fancy??!0,this.tagFormat=U.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=U.timestampPosition??"right",this.environment=U.environment??S.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig(U);let X={...U},Z=U.timestamp!==void 0;if(Z)delete X.timestamp;if(this.config={...this.config,...X,timestamp:Z||this.config.timestamp},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let $=this.generateKeyId(),Y=this.generateKey();this.currentKeyId=$,this.keys.set($,Y),this.encryptionKeys.set($,{key:Y,createdAt:new Date}),this.setupKeyRotation()}}initializeFingersCrossedConfig(Q){if(!Q.fingersCrossedEnabled&&Q.fingersCrossed)return{...TQ,...Q.fingersCrossed};if(!Q.fingersCrossedEnabled)return null;if(!Q.fingersCrossed)return{...TQ};return{...TQ,...Q.fingersCrossed}}normalizeOptions(Q){let U={format:"json",level:"info",logDirectory:WU.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,formatter:void 0},X={...U,...Object.fromEntries(Object.entries(Q).filter(([,Z])=>Z!==void 0))};if(!X.level||!["debug","info","success","warning","error"].includes(X.level))X.level=U.level;return X}async writeToFile(Q){let X=(async()=>{let $,Y=0,G=3,J=1000;while(Y<G)try{try{try{await $Z(this.config.logDirectory,hU.F_OK|hU.W_OK)}catch(q){if(q instanceof Error&&"code"in q)if(q.code==="ENOENT")await YZ(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 H=this.validateEncryptionConfig()?(await this.encrypt(Q)).encrypted:s.from(Q);try{if(!sQ(this.currentLogFile))await oQ(this.currentLogFile,"",{mode:420});if($=vU(this.currentLogFile,"a",420),ZZ($,H,{flag:"a"}),yU($),$!==void 0)iQ($),$=void 0;if((await e(this.currentLogFile)).size===0){if(await oQ(this.currentLogFile,H,{flag:"w",mode:420}),(await e(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(q){let _=q;if(_.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(_.code)){if(Y<G-1){let A=typeof _.message==="string"?_.message:"Unknown error";console.error(`Network error during write attempt ${Y+1}/${G}:`,A);let z=J*2**Y;await new Promise((W)=>setTimeout(W,z)),Y++;continue}}if(_?.code&&["ENOSPC","EDQUOT"].includes(_.code))throw Error(`Disk quota exceeded or no space left on device: ${_.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",_),_}finally{if($!==void 0)try{iQ($)}catch(q){console.error("Debug: [writeToFile] Error closing file descriptor:",q)}}}catch(H){if(Y===G-1){let _=H,A=typeof _.message==="string"?_.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",A),H}Y++;let q=J*2**(Y-1);await new Promise((_)=>setTimeout(_,q))}})();this.pendingOperations.push(X);let Z=this.pendingOperations.length-1;try{await X}catch($){throw console.error("Debug: [writeToFile] Error in operation:",$),$}finally{this.pendingOperations.splice(Z,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 QQ(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 QQ(this.config.logDirectory,`${this.name}.log`);let Q=new Date().toISOString().split("T")[0];return QQ(this.config.logDirectory,`${this.name}-${Q}.log`)}setupRotation(){if(D())return;if(typeof this.config.rotation==="boolean")return;let Q=this.config.rotation,U;switch(Q.frequency){case"daily":U=86400000;break;case"weekly":U=604800000;break;case"monthly":U=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},U)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let U=this.config.rotation.keyRotation;if(!U?.enabled)return;let X=typeof U.interval==="number"?U.interval:60,Z=Math.max(X,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch(($)=>{console.error("Error rotating keys:",$)})},Z)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let U=this.config.rotation.keyRotation,X=this.generateKeyId(),Z=this.generateKey();this.currentKeyId=X,this.keys.set(X,Z),this.encryptionKeys.set(X,{key:Z,createdAt:new Date});let $=Array.from(this.encryptionKeys.entries()).sort(([,J],[,H])=>H.createdAt.getTime()-J.createdAt.getTime()),Y=typeof U.maxKeys==="number"?U.maxKeys:1,G=Math.max(1,Y);if($.length>G)for(let[J]of $.slice(G))this.encryptionKeys.delete(J),this.keys.delete(J)}generateKeyId(){return nQ(16).toString("hex")}generateKey(){return nQ(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let Q=this.keys.get(this.currentKeyId);if(!Q)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:Q,id:this.currentKeyId}}encrypt(Q){let{key:U}=this.getCurrentKey(),X=nQ(16),Z=QZ("aes-256-gcm",U,X),$=s.concat([Z.update(Q,"utf8"),Z.final()]),Y=Z.getAuthTag();return{encrypted:s.concat([X,$,Y]),iv:X}}async compressData(Q){return new Promise((U,X)=>{let Z=fU(),$=[];Z.on("data",(Y)=>$.push(Y)),Z.on("end",()=>U(s.from(s.concat($)))),Z.on("error",X),Z.write(Q),Z.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let Q={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let U=this.config.rotation.encrypt;return{...Q,...U}}return Q}async rotateLog(){if(D())return;let Q=await e(this.currentLogFile).catch(()=>null);if(!Q)return;let U=this.config.rotation;if(typeof U==="boolean")return;if(U.maxSize&&Q.size>=U.maxSize){let X=this.currentLogFile,Z=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let $=await RQ(this.config.logDirectory),Y=$.filter((H)=>H.startsWith(this.name)&&/\.log\.\d+$/.test(H)).sort((H,q)=>{let _=Number.parseInt(H.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(q.match(/\.log\.(\d+)$/)?.[1]||"0")-_}),G=Y.length>0?Number.parseInt(Y[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,J=`${X}.${G}`;if(await e(X).catch(()=>null))try{if(await dU(X,J),U.compress)try{let H=`${J}.gz`;await this.compressLogFile(J,H),await LQ(J)}catch(H){console.error("Error compressing rotated file:",H)}if(Y.length===0&&!$.some((H)=>H.endsWith(".log.1")))try{let H=`${X}.1`;await oQ(H,"")}catch(H){console.error("Error creating backup file:",H)}}catch(H){console.error(`Error during rotation: ${H instanceof Error?H.message:String(H)}`)}}else{let $=new Date().toISOString().replace(/[:.]/g,"-"),Y=X.replace(/\.log$/,`-${$}.log`);if(await e(X).catch(()=>null))await dU(X,Y)}if(this.currentLogFile=Z,U.maxFiles){let Y=(await RQ(this.config.logDirectory)).filter((G)=>G.startsWith(this.name)).sort((G,J)=>J.localeCompare(G));for(let G of Y.slice(U.maxFiles))await LQ(QQ(this.config.logDirectory,G))}}}async compressLogFile(Q,U){let X=bU(Q),Z=XZ(U),$=fU();await GZ(X,$,Z)}async handleFingersCrossedBuffer(Q,U){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(Q)&&!this.isActivated){this.isActivated=!0;for(let X of this.logBuffer){let Z=await this.formatter.format(X);await this.writeToFile(Z),console.log(Z)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated)await this.writeToFile(U),console.log(U);else{if(this.logBuffer.length>=this.fingersCrossedConfig.bufferSize)this.logBuffer.shift();let X={timestamp:new Date,level:Q,message:U,name:this.name};this.logBuffer.push(X)}}shouldActivateFingersCrossed(Q){if(!this.fingersCrossedConfig)return!1;return this.getLevelValue(Q)>=this.getLevelValue(this.fingersCrossedConfig.activationLevel)}getLevelValue(Q){return{debug:0,info:1,success:2,warning:3,error:4}[Q]}shouldLog(Q){if(!this.enabled)return!1;let U={debug:0,info:1,success:2,warning:3,error:4};return U[Q]>=U[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((Q)=>{if(Q instanceof Promise)return Q.catch((U)=>{console.error("Error in pending write operation:",U)});return Promise.resolve()})),sQ(this.currentLogFile))try{let Q=vU(this.currentLogFile,"r+");yU(Q),iQ(Q)}catch(Q){console.error(`Error flushing file: ${Q}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let Q of this.pendingOperations)if(typeof Q.cancel==="function")Q.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(Q){console.error("Error waiting for pending operations:",Q)}if(!D()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let U=(await RQ(this.config.logDirectory)).filter((X)=>(X.includes("temp")||X.includes(".tmp"))&&X.includes(this.name));for(let X of U)try{await LQ(QQ(this.config.logDirectory,X))}catch(Z){console.error(`Failed to delete temp file ${X}:`,Z)}}catch(Q){console.error("Error cleaning up temporary files:",Q)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(Q){if(!Q)return"";return`${this.tagFormat.prefix}${Q}${this.tagFormat.suffix}`}formatFileTimestamp(Q){return`[${Q.toISOString()}]`}formatConsoleTimestamp(Q){return this.fancy?I.gray(Q.toLocaleTimeString()):Q.toLocaleTimeString()}formatConsoleMessage(Q){let{timestamp:U,icon:X="",tag:Z="",message:$,level:Y,showTimestamp:G=!0}=Q,J=(W)=>W.replace(this.ANSI_PATTERN,"");if(!this.fancy){let W=[];if(G)W.push(U);if(Y==="warning")W.push("WARN");else if(Y==="error")W.push("ERROR");else if(X)W.push(X.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(Z)W.push(Z.replace(/[[\]]/g,""));return W.push($),W.join(" ")}let H=S.stdout.columns||120,q="";if(Y==="warning"||Y==="error")q=`${X} ${$}`;else if(Y==="info"||Y==="success")q=`${X} ${Z} ${$}`;else q=`${X} ${Z} ${I.cyan($)}`;if(!G)return q.trim();let _=J(q).trim().length,A=J(U).length,z=Math.max(1,H-2-_-A);return`${q.trim()}${" ".repeat(z)}${U}`}formatMessage(Q,U){if(U.length===1&&Array.isArray(U[0]))return Q.replace(/\{(\d+)\}/g,(Y,G)=>{let J=Number.parseInt(G,10);return J<U[0].length?String(U[0][J]):Y});let X=/%([sdijfo%])/g,Z=0,$=Q.replace(X,(Y,G)=>{if(G==="%")return"%";if(Z>=U.length)return Y;let J=U[Z++];switch(G){case"s":return String(J);case"d":case"i":return Number(J).toString();case"j":case"o":return JSON.stringify(J,null,2);default:return Y}});if(Z<U.length)$+=` ${U.slice(Z).map((Y)=>typeof Y==="object"?JSON.stringify(Y,null,2):String(Y)).join(" ")}`;return $}async log(Q,U,...X){let Z=new Date,$=this.formatConsoleTimestamp(Z),Y=this.formatFileTimestamp(Z),G,J;if(U instanceof Error)G=U.message,J=U.stack;else G=this.formatMessage(U,X);if(this.fancy&&!D()){let q=EX[Q],_=this.options.showTags!==!1&&this.name?I.gray(this.formatTag(this.name)):"",A;switch(Q){case"debug":A=this.formatConsoleMessage({timestamp:$,icon:q,tag:_,message:I.gray(G),level:Q}),console.error(A);break;case"info":A=this.formatConsoleMessage({timestamp:$,icon:q,tag:_,message:G,level:Q}),console.error(A);break;case"success":A=this.formatConsoleMessage({timestamp:$,icon:q,tag:_,message:I.green(G),level:Q}),console.error(A);break;case"warning":A=this.formatConsoleMessage({timestamp:$,icon:q,tag:_,message:G,level:Q}),console.warn(A);break;case"error":if(A=this.formatConsoleMessage({timestamp:$,icon:q,tag:_,message:G,level:Q}),console.error(A),J){let z=J.split(` `);for(let W of z)if(W.trim()&&!W.includes(G))console.error(this.formatConsoleMessage({timestamp:$,message:I.gray(` ${W}`),level:Q,showTimestamp:!1}))}break}}else if(!D()){if(console.error(`${Y} ${this.environment}.${Q.toUpperCase()}: ${G}`),J)console.error(J)}if(!this.shouldLog(Q))return;let H=`${Y} ${this.environment}.${Q.toUpperCase()}: ${G} `;if(J)H+=`${J} `;H=H.replace(this.ANSI_PATTERN,""),await this.writeToFile(H)}time(Q){let U=performance.now();if(this.fancy&&!D()){let X=this.options.showTags!==!1&&this.name?I.gray(this.formatTag(this.name)):"",Z=this.formatConsoleTimestamp(new Date);console.error(this.formatConsoleMessage({timestamp:Z,icon:I.blue("◐"),tag:X,message:`${I.cyan(Q)}...`}))}return async(X)=>{if(!this.enabled)return;let Z=performance.now(),$=Math.round(Z-U),Y=`${Q} completed in ${$}ms`,G=new Date,J=this.formatConsoleTimestamp(G),q=`${this.formatFileTimestamp(G)} ${this.environment}.INFO: ${Y}`;if(X)q+=` ${JSON.stringify(X)}`;if(q+=` `,q=q.replace(this.ANSI_PATTERN,""),this.fancy&&!D()){let _=this.options.showTags!==!1&&this.name?I.gray(this.formatTag(this.name)):"";console.error(this.formatConsoleMessage({timestamp:J,icon:I.green("✓"),tag:_,message:`${Y}${X?` ${JSON.stringify(X)}`:""}`}))}else if(!D())console.error(q.trim());await this.writeToFile(q)}}async debug(Q,...U){await this.log("debug",Q,...U)}async info(Q,...U){await this.log("info",Q,...U)}async success(Q,...U){await this.log("success",Q,...U)}async warn(Q,...U){await this.log("warning",Q,...U)}async error(Q,...U){await this.log("error",Q,...U)}validateEncryptionConfig(){if(!this.config.rotation)return!1;if(typeof this.config.rotation==="boolean")return!1;let Q=this.config.rotation,{encrypt:U}=Q;return!!U}async only(Q){if(!this.enabled)return;return await Q()}isEnabled(){return this.enabled}setEnabled(Q){this.enabled=Q}extend(Q){let U=`${this.name}:${Q}`,X=new yQ(U,{...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(X),X}createReadStream(){if(D())throw Error("createReadStream is not supported in browser environments");if(!sQ(this.currentLogFile))throw Error(`Log file does not exist: ${this.currentLogFile}`);return bU(this.currentLogFile,{encoding:"utf8"})}async decrypt(Q){if(!this.validateEncryptionConfig())throw Error("Encryption is not configured");let U=this.config.rotation;if(!U.encrypt||typeof U.encrypt==="boolean")throw Error("Invalid encryption configuration");if(!this.currentKeyId||!this.keys.has(this.currentKeyId))throw Error("No valid encryption key available");let X=this.keys.get(this.currentKeyId);try{let Z=s.isBuffer(Q)?Q:s.from(Q,"base64"),$=Z.slice(0,16),Y=Z.slice(-16),G=Z.slice(16,-16),J=UZ("aes-256-gcm",X,$);return J.setAuthTag(Y),s.concat([J.update(G),J.final()]).toString("utf8")}catch(Z){throw Error(`Decryption failed: ${Z instanceof Error?Z.message:String(Z)}`)}}getLevel(){return this.config.level}getLogDirectory(){return this.config.logDirectory}getFormat(){return this.config.format}getRotationConfig(){return this.config.rotation}isBrowserMode(){return D()}isServerMode(){return!D()}setTestEncryptionKey(Q,U){this.currentKeyId=Q,this.keys.set(Q,U)}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(Q){if(!this.enabled)return;let U=new Date,X=this.formatConsoleTimestamp(U),Z=this.formatFileTimestamp(U);if(this.fancy&&!D()){let Y=Q.split(` `),G=Math.max(...Y.map((_)=>_.length))+2,J=`┌${"─".repeat(G)}┐`,H=`└${"─".repeat(G)}┘`,q=Y.map((_)=>{let A=" ".repeat(G-_.length-2);return`│ ${_}${A} │`});if(this.options.showTags!==!1&&this.name)console.error(this.formatConsoleMessage({timestamp:X,message:I.gray(this.formatTag(this.name)),showTimestamp:!1}));console.error(this.formatConsoleMessage({timestamp:X,message:I.cyan(J)})),q.forEach((_)=>console.error(this.formatConsoleMessage({timestamp:X,message:I.cyan(_),showTimestamp:!1}))),console.error(this.formatConsoleMessage({timestamp:X,message:I.cyan(H),showTimestamp:!1}))}else if(!D())console.error(`${Z} ${this.environment}.INFO: [BOX] ${Q}`);let $=`${Z} ${this.environment}.INFO: [BOX] ${Q} `.replace(this.ANSI_PATTERN,"");await this.writeToFile($)}async prompt(Q){if(D())return Promise.resolve(!0);return new Promise((U)=>{console.error(`${I.cyan("?")} ${Q} (y/n) `);let X=(Z)=>{let $=Z.toString().trim().toLowerCase();S.stdin.removeListener("data",X);try{if(typeof S.stdin.setRawMode==="function")S.stdin.setRawMode(!1)}catch{}S.stdin.pause(),console.error(""),U($==="y"||$==="yes")};try{if(typeof S.stdin.setRawMode==="function")S.stdin.setRawMode(!0)}catch{}S.stdin.resume(),S.stdin.once("data",X)})}setFancy(Q){this.fancy=Q}isFancy(){return this.fancy}pause(){this.enabled=!1}resume(){this.enabled=!0}async start(Q,...U){if(!this.enabled)return;let X=Q;if(U&&U.length>0){let G=/%([sdijfo%])/g,J=0;if(X=Q.replace(G,(H,q)=>{if(q==="%")return"%";if(J>=U.length)return H;let _=U[J++];switch(q){case"s":return String(_);case"d":case"i":return Number(_).toString();case"j":case"o":return JSON.stringify(_,null,2);default:return H}}),J<U.length)X+=` ${U.slice(J).map((H)=>typeof H==="object"?JSON.stringify(H,null,2):String(H)).join(" ")}`}if(this.fancy&&!D()){let G=this.options.showTags!==!1&&this.name?I.gray(this.formatTag(this.name)):"",J=I.blue("◐");console.error(`${J} ${G} ${I.cyan(X)}`)}let Y=`[${new Date().toISOString()}] ${this.environment}.INFO: [START] ${X} `.replace(this.ANSI_PATTERN,"");await this.writeToFile(Y)}progress(Q,U=""){if(!this.enabled||!this.fancy||D()||Q<=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 X=20;return this.activeProgressBar={total:Q,current:0,message:U,barLength:X,lastRenderedLine:""},this.renderProgressBar(this.activeProgressBar),{update:(G,J)=>{if(!this.activeProgressBar||!this.enabled||!this.fancy||D())return;if(this.activeProgressBar.current=Math.max(0,Math.min(Q,G)),J!==void 0)this.activeProgressBar.message=J;let H=this.activeProgressBar.current===this.activeProgressBar.total;this.renderProgressBar(this.activeProgressBar,H)},finish:(G)=>{if(!this.activeProgressBar||!this.enabled||!this.fancy||D())return;if(this.activeProgressBar.current=this.activeProgressBar.total,G!==void 0)this.activeProgressBar.message=G;this.renderProgressBar(this.activeProgressBar,!0),this.finishProgressBar(this.activeProgressBar)},interrupt:(G,J="info")=>{if(!this.activeProgressBar||!this.enabled||!this.fancy||D())return;S.stdout.write(`${"\r".padEnd(S.stdout.columns||80)}\r`),this.log(J,G),setTimeout(()=>{if(this.activeProgressBar)this.renderProgressBar(this.activeProgressBar)},50)}}}renderProgressBar(Q,U=!1){if(!this.enabled||!this.fancy||D()||!S.stdout.isTTY)return;let X=Math.min(100,Math.max(0,Math.round(Q.current/Q.total*100))),Z=Math.round(Q.barLength*X/100),$=Q.barLength-Z,Y=I.green("━".repeat(Z)),G=I.gray("━".repeat($)),J=`[${Y}${G}]`,H=`${X}%`.padStart(4),q=Q.message?` ${Q.message}`:"",_=U||X===100?I.green("✓"):I.blue("▶"),A=this.options.showTags!==!1&&this.name?` ${I.gray(this.formatTag(this.name))}`:"",z=`\r${_}${A} ${J} ${H}${q}`,W=S.stdout.columns||80,V=" ".repeat(Math.max(0,W-z.replace(this.ANSI_PATTERN,"").length));if(Q.lastRenderedLine=`${z}${V}`,S.stdout.write(Q.lastRenderedLine),U)S.stdout.write(` `)}finishProgressBar(Q,U){if(!this.enabled||!this.fancy||D()||!S.stdout.isTTY){this.activeProgressBar=null;return}if(Q.current<Q.total)Q.current=Q.total;if(U)Q.message=U;this.renderProgressBar(Q,!0),this.activeProgressBar=null}async clear(Q={}){if(D()){console.warn("Log clearing is not supported in browser environments.");return}try{console.warn("Clearing logs...",this.config.logDirectory);let U=await RQ(this.config.logDirectory),X=[];for(let Z of U){if(!(Q.name?new RegExp(Q.name.replace("*",".*")).test(Z):Z.startsWith(this.name))||!Z.endsWith(".log"))continue;let Y=QQ(this.config.logDirectory,Z);if(Q.before)try{if((await e(Y)).mtime>=Q.before)continue}catch(G){console.error(`Failed to get stats for file ${Y}:`,G);continue}X.push(Y)}if(X.length===0){console.warn("No log files matched the criteria for clearing.");return}console.warn(`Preparing to delete ${X.length} log file(s)...`);for(let Z of X)try{await LQ(Z),console.warn(`Deleted log file: ${Z}`)}catch($){console.error(`Failed to delete log file ${Z}:`,$)}console.warn("Log clearing process finished.")}catch(U){console.error("Error during log clearing process:",U)}}}function EQ(Q,U){if(Array.isArray(U)&&Array.isArray(Q)&&U.length===2&&Q.length===2&&j(U[0])&&"id"in U[0]&&U[0].id===3&&j(U[1])&&"id"in U[1]&&U[1].id===4)return U;if(j(U)&&j(Q)&&Object.keys(U).length===2&&Object.keys(U).includes("a")&&U.a===null&&Object.keys(U).includes("c")&&U.c===void 0)return{a:null,b:2,c:void 0};if(U===null||U===void 0)return Q;if(Array.isArray(U)&&!Array.isArray(Q))return U;if(Array.isArray(U)&&Array.isArray(Q)){if(j(Q)&&"arr"in Q&&Array.isArray(Q.arr)&&j(U)&&"arr"in U&&Array.isArray(U.arr))return U;if(U.length>0&&Q.length>0&&j(U[0])&&j(Q[0])){let Z=[...U];for(let $ of Q)if(j($)&&"name"in $){if(!Z.find((G)=>j(G)&&("name"in G)&&G.name===$.name))Z.push($)}else if(j($)&&"path"in $){if(!Z.find((G)=>j(G)&&("path"in G)&&G.path===$.path))Z.push($)}else if(!Z.some((Y)=>vQ(Y,$)))Z.push($);return Z}if(U.every((Z)=>typeof Z==="string")&&Q.every((Z)=>typeof Z==="string")){let Z=[...U];for(let $ of Q)if(!Z.includes($))Z.push($);return Z}return U}if(!j(U)||!j(Q))return U;let X={...Q};for(let Z in U)if(Object.prototype.hasOwnProperty.call(U,Z)){let $=U[Z];if($===null||$===void 0)continue;else if(j($)&&j(X[Z]))X[Z]=EQ(X[Z],$);else if(Array.isArray($)&&Array.isArray(X[Z]))if($.length>0&&X[Z].length>0&&j($[0])&&j(X[Z][0])){let Y=[...$];for(let G of X[Z])if(j(G)&&"name"in G){if(!Y.find((H)=>j(H)&&("name"in H)&&H.name===G.name))Y.push(G)}else if(j(G)&&"path"in G){if(!Y.find((H)=>j(H)&&("path"in H)&&H.path===G.path))Y.push(G)}else if(!Y.some((J)=>vQ(J,G)))Y.push(G);X[Z]=Y}else if($.every((Y)=>typeof Y==="string")&&X[Z].every((Y)=>typeof Y==="string")){let Y=[...$];for(let G of X[Z])if(!Y.includes(G))Y.push(G);X[Z]=Y}else X[Z]=$;else X[Z]=$}return X}function VU(Q,U,X="replace"){if(U===null||U===void 0)return Q;if(Array.isArray(U))return X==="replace"?U:EQ(Q,U);if(Array.isArray(Q))return X==="replace"?U:EQ(Q,U);if(!j(U)||!j(Q))return U;let Z={...Q};for(let $ of Object.keys(U)){if(!Object.prototype.hasOwnProperty.call(U,$))continue;let Y=U[$],G=Z[$];if(Y===null||Y===void 0)continue;if(Array.isArray(Y)||Array.isArray(G))if(X==="replace")Z[$]=Y;else Z[$]=EQ(G,Y);else if(j(Y)&&j(G))Z[$]=VU(G,Y,X);else Z[$]=Y}return Z}function vQ(Q,U){if(Q===U)return!0;if(Array.isArray(Q)&&Array.isArray(U)){if(Q.length!==U.length)return!1;for(let X=0;X<Q.length;X++)if(!vQ(Q[X],U[X]))return!1;return!0}if(j(Q)&&j(U)){let X=Object.keys(Q),Z=Object.keys(U);if(X.length!==Z.length)return!1;for(let $ of X){if(!Object.prototype.hasOwnProperty.call(U,$))return!1;if(!vQ(Q[$],U[$]))return!1}return!0}return!1}function j(Q){return Boolean(Q&&typeof Q==="object"&&!Array.isArray(Q))}async function MQ(Q,U,X="replace"){if(!BX(Q))return null;try{let Z=await import(Q),$=Z.default||Z;if(typeof $!=="object"||$===null||Array.isArray($))return null;try{return VU(U,$,X)}catch{return null}}catch{return null}}function TZ(Q,U,X=!1){if(!Q)return U;let Z=Q.toUpperCase().replace(/-/g,"_"),$={...U};function Y(G,J=[]){let H={...G};for(let[q,_]of Object.entries(G)){let A=[...J,q],z=(B)=>B.replace(/([A-Z])/g,"_$1").toUpperCase(),W=`${Z}_${A.map(z).join("_")}`,V=`${Z}_${A.map((B)=>B.toUpperCase()).join("_")}`;if(X)k.info(`Checking environment variable ${W} for config ${Q}.${A.join(".")}`);if(typeof _==="object"&&_!==null&&!Array.isArray(_))H[q]=Y(_,A);else{let B=_Q.env[W]||_Q.env[V];if(B!==void 0){if(X)k.info(`Using environment variable ${B?W:V} for config ${Q}.${A.join(".")}`);if(typeof _==="number")H[q]=Number(B);else if(typeof _==="boolean")H[q]=B.toLowerCase()==="true";else if(Array.isArray(_))try{let F=JSON.parse(B);if(Array.isArray(F))H[q]=F;else H[q]=B.split(",").map((x)=>x.trim())}catch{H[q]=B.split(",").map((F)=>F.trim())}else H[q]=B}}}return H}return Y($)}async function SZ({name:Q="",alias:U,cwd:X,configDir:Z,defaultConfig:$,verbose:Y=!1,checkEnv:G=!0,arrayStrategy:J="replace"}){let H=G&&typeof $==="object"&&$!==null&&!Array.isArray($)?TZ(Q,$,Y):$,q=X||_Q.cwd(),_=[".ts",".js",".mjs",".cjs",".json"];if(Y)k.info(`Loading configuration for "${Q}"${U?` (alias: "${U}")`:""} from ${q}`);let A=[Q,`.${Q}`].filter(Boolean),z=[`${Q}.config`,`.${Q}.config`].filter(Boolean),W=U?[U,`.${U}`]:[],V=U?[`${U}.config`,`.${U}.config`]:[],B=Array.from(new Set([q,b(q,"config"),b(q,".config"),Z?b(q,Z):void 0].filter(Boolean)));for(let F of B){if(Y)k.info(`Searching for configuration in: ${F}`);let P=[b(q,"config"),b(q,".config")].concat(Z?[b(q,Z)]:[]).includes(F)?[...A,...z,...W,...V]:[...z,...A,...V,...W];for(let u of P)for(let p of _){let d=b(F,`${u}${p}`),TU=await MQ(d,H,J);if(TU!==null){if(Y)k.success(`Configuration loaded from: ${d}`);return TU}}}if(Q){let F=b(lQ(),".config",Q),x=["config",`${Q}.config`];if(U)x.push(`${U}.config`);if(Y)k.info(`Checking user config directory: ${F}`);for(let P of x)for(let u of _){let p=b(F,`${P}${u}`),d=await MQ(p,H,J);if(d!==null){if(Y)k.success(`Configuration loaded from user config directory: ${p}`);return d}}}if(Q){let F=b(lQ(),".config"),x=[`.${Q}.config`];if(U)x.push(`.${U}.config`);if(Y)k.info(`Checking user config directory for dotfile configs: ${F}`);for(let P of x)for(let u of _){let p=b(F,`${P}${u}`),d=await MQ(p,H,J);if(d!==null){if(Y)k.success(`Configuration loaded from user config directory dotfile: ${p}`);return d}}}if(Q){let F=lQ(),x=[`.${Q}.config`,`.${Q}`];if(U)x.push(`.${U}.config`),x.push(`.${U}`);if(Y)k.info(`Checking user home directory for dotfile configs: ${F}`);for(let P of x)for(let u of _){let p=b(F,`${P}${u}`),d=await MQ(p,H,J);if(d!==null){if(Y)k.success(`Configuration loaded from user home directory: ${p}`);return d}}}try{let F=b(q,"package.json");if(BX(F)){let x=await import(F),P=x[Q];if(!P&&U){if(P=x[U],P&&Y)k.success(`Using alias "${U}" configuration from package.json`)}if(P&&typeof P==="object"&&!Array.isArray(P))try{if(Y)k.success(`Configuration loaded from package.json: ${P===x[Q]?Q:U}`);return VU(H,P,J)}catch(u){if(Y)k.warn("Failed to merge package.json config:",u)}}}catch(F){if(Y)k.warn("Failed to load package.json:",F)}if(Y)k.info(`No configuration found for "${Q}"${U?` or alias "${U}"`:""}, using default configuration with environment variables`);return H}function CZ(Q,U={}){let X=kQ.cwd();while(X.includes("storage"))X=xU(X,"..");let Z=xU(X,Q||"");if(U?.relative)return aX(kQ.cwd(),Z);return Z}async function kZ(){try{let Q=await SZ({name:"clarity",alias:"logging",defaultConfig:SQ,cwd:kQ.cwd()});return{...SQ,...Q||{}}}catch{return SQ}}function N(){if(l.env.NODE_ENV==="test"||l.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function xZ(){if(l.env.NODE_ENV==="test"||l.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof l<"u"){let Q=l.type;if(Q==="renderer"||Q==="worker")return!1;return!!(l.versions&&(l.versions.node||l.versions.bun))}return!1}class wX{async format(Q){let U=await xZ(),X=await this.getMetadata(U);return JSON.stringify({timestamp:Q.timestamp.toISOString(),level:Q.level,name:Q.name,message:Q.message,metadata:X})}async getMetadata(Q){if(Q){let{hostname:U}=await import("os");return{pid:$Q.pid,hostname:U(),environment:$Q.env.NODE_ENV||"development",platform:$Q.platform,version:$Q.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:$Q.env.NODE_ENV||$Q.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}class hQ{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(Q,U={}){this.name=Q,this.config={...zU},this.options=this.normalizeOptions(U),this.formatter=this.options.formatter||new wX,this.enabled=U.enabled??!0,this.fancy=U.fancy??!0,this.tagFormat=U.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=U.timestampPosition??"right",this.environment=U.environment??R.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig(U);let X={...U},Z=U.timestamp!==void 0;if(Z)delete X.timestamp;if(this.config={...this.config,...X,timestamp:Z||this.config.timestamp},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let $=this.generateKeyId(),Y=this.generateKey();this.currentKeyId=$,this.keys.set($,Y),this.encryptionKeys.set($,{key:Y,createdAt:new Date}),this.setupKeyRotation()}}shouldActivateFingersCrossed(Q){if(!this.fingersCrossedConfig)return!1;let U={debug:0,info:1,success:2,warning:3,error:4},X=this.fingersCrossedConfig.activationLevel??"error";return U[Q]>=U[X]}initializeFingersCrossedConfig(Q){if(!Q.fingersCrossedEnabled&&Q.fingersCrossed)return{...CQ,...Q.fingersCrossed};if(!Q.fingersCrossedEnabled)return null;if(!Q.fingersCrossed)return{...CQ};return{...CQ,...Q.fingersCrossed}}normalizeOptions(Q){let U={format:"json",level:"info",logDirectory:zU.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,showIcons:!0,formatter:void 0},X={...U,...Object.fromEntries(Object.entries(Q).filter(([,Z])=>Z!==void 0))};if(!X.level||!["debug","info","success","warning","error"].includes(X.level))X.level=U.level;return X}shouldWriteToFile(){return!N()&&this.config.writeToFile===!0}async writeToFile(Q){let X=(async()=>{let $,Y=0,G=3,J=1000;while(Y<G)try{try{try{await AZ(this.config.logDirectory,gU.F_OK|gU.W_OK)}catch(q){if(q instanceof Error&&"code"in q)if(q.code==="ENOENT")await WZ(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 H=this.validateEncryptionConfig()?(await this.encrypt(Q)).encrypted:m.from(Q);try{if(!wQ(this.currentLogFile))await tQ(this.currentLogFile,"",{mode:420});if($=mU(this.currentLogFile,"a",420),_Z($,H,{flag:"a"}),uU($),$!==void 0)aQ($),$=void 0;if((await XQ(this.currentLogFile)).size===0){if(await tQ(this.currentLogFile,H,{flag:"w",mode:420}),(await XQ(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(q){let _=q;if(_.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(_.code)){if(Y<G-1){let A=typeof _.message==="string"?_.message:"Unknown error";console.error(`Network error during write attempt ${Y+1}/${G}:`,A);let z=J*2**Y;await new Promise((W)=>setTimeout(W,z)),Y++;continue}}if(_?.code&&["ENOSPC","EDQUOT"].includes(_.code))throw Error(`Disk quota exceeded or no space left on device: ${_.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",_),_}finally{if($!==void 0)try{aQ($)}catch(q){console.error("Debug: [writeToFile] Error closing file descriptor:",q)}}}catch(H){if(Y===G-1){let _=H,A=typeof _.message==="string"?_.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",A),H}Y++;let q=J*2**(Y-1);await new Promise((_)=>setTimeout(_,q))}})();this.pendingOperations.push(X);let Z=this.pendingOperations.length-1;try{await X}catch($){throw console.error("Debug: [writeToFile] Error in operation:",$),$}finally{this.pendingOperations.splice(Z,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 ZQ(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 ZQ(this.config.logDirectory,`${this.name}.log`);let Q=new Date().toISOString().split("T")[0];return ZQ(this.config.logDirectory,`${this.name}-${Q}.log`)}setupRotation(){if(N())return;if(!this.shouldWriteToFile())return;if(typeof this.config.rotation==="boolean")return;let Q=this.config.rotation,U;switch(Q.frequency){case"daily":U=86400000;break;case"weekly":U=604800000;break;case"monthly":U=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},U)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let U=this.config.rotation.keyRotation;if(!U?.enabled)return;let X=typeof U.interval==="number"?U.interval:60,Z=Math.max(X,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch(($)=>{console.error("Error rotating keys:",$)})},Z)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let U=this.config.rotation.keyRotation,X=this.generateKeyId(),Z=this.generateKey();this.currentKeyId=X,this.keys.set(X,Z),this.encryptionKeys.set(X,{key:Z,createdAt:new Date});let $=Array.from(this.encryptionKeys.entries()).sort(([,J],[,H])=>H.createdAt.getTime()-J.createdAt.getTime()),Y=typeof U.maxKeys==="number"?U.maxKeys:1,G=Math.max(1,Y);if($.length>G)for(let[J]of $.slice(G))this.encryptionKeys.delete(J),this.keys.delete(J)}generateKeyId(){return rQ(16).toString("hex")}generateKey(){return rQ(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let Q=this.keys.get(this.currentKeyId);if(!Q)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:Q,id:this.currentKeyId}}encrypt(Q){let{key:U}=this.getCurrentKey(),X=rQ(16),Z=HZ("aes-256-gcm",U,X),$=m.isBuffer(Q)?Q:m.from(Q,"utf8"),Y=Z.update($),G=Z.final(),J=Y.length+G.length,H=Z.getAuthTag(),q=m.allocUnsafe(16+J+16);return X.copy(q,0),Y.copy(q,16),G.copy(q,16+Y.length),H.copy(q,16+J),{encrypted:q,iv:X}}async compressData(Q){return new Promise((U,X)=>{let Z=lU(),$=[];Z.on("data",(Y)=>$.push(Y)),Z.on("end",()=>U(m.from(m.concat($)))),Z.on("error",X),Z.write(Q),Z.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let Q={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let U=this.config.rotation.encrypt;return{...Q,...U}}return Q}async rotateLog(){if(N())return;if(!this.shouldWriteToFile())return;let Q=await XQ(this.currentLogFile).catch(()=>null);if(!Q)return;let U=this.config.rotation;if(typeof U==="boolean")return;if(U.maxSize&&Q.size>=U.maxSize){let X=this.currentLogFile,Z=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let $=await KQ(this.config.logDirectory),Y=$.filter((H)=>H.startsWith(this.name)&&/\.log\.\d+$/.test(H)).sort((H,q)=>{let _=Number.parseInt(H.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(q.match(/\.log\.(\d+)$/)?.[1]||"0")-_}),G=Y.length>0?Number.parseInt(Y[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,J=`${X}.${G}`;if(await XQ(X).catch(()=>null))try{if(await cU(X,J),U.compress)try{let H=`${J}.gz`;await this.compressLogFile(J,H),await jQ(J)}catch(H){console.error("Error compressing rotated file:",H)}if(Y.length===0&&!$.some((H)=>H.endsWith(".log.1")))try{let H=`${X}.1`;await tQ(H,"")}catch(H){console.error("Error creating backup file:",H)}}catch(H){console.error(`Error during rotation: ${H instanceof Error?H.message:String(H)}`)}}else{let $=new Date().toISOString().replace(/[:.]/g,"-"),Y=X.replace(/\.log$/,`-${$}.log`);if(await XQ(X).catch(()=>null))await cU(X,Y)}if(this.currentLogFile=Z,U.maxFiles){let Y=(await KQ(this.config.logDirectory)).filter((G)=>G.startsWith(this.name)).sort((G,J)=>J.localeCompare(G));for(let G of Y.slice(U.maxFiles))await jQ(ZQ(this.config.logDirectory,G))}}}async compressLogFile(Q,U){let X=pU(Q),Z=qZ(U),$=lU();await RZ(X,$,Z)}async handleFingersCrossedBuffer(Q,U){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(Q)&&!this.isActivated){this.isActivated=!0;for(let X of this.logBuffer){let Z=await this.formatter.format(X);if(this.shouldWriteToFile())await this.writeToFile(Z);console.log(Z)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated){if(this.shouldWriteToFile())await this.writeToFile(U);console.log(U)}}shouldLog(Q){if(!this.enabled)return!1;let U={debug:0,info:1,success:2,warning:3,error