@stacksjs/rpx 0.11.30 → 0.11.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bin/cli.js CHANGED
@@ -1,24 +1,24 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
3
  #!/usr/bin/env bun
4
- import{createRequire as F6}from"node:module";var z6=Object.defineProperty;var G6=(w)=>w;function K6(w,$){this[w]=G6.bind(null,$)}var EB=(w,$)=>{for(var Y in $)z6(w,Y,{get:$[Y],enumerable:!0,configurable:!0,set:K6.bind($,Y)})};var t=(w,$)=>()=>(w&&($=w(w=0)),$);var b=F6(import.meta.url);import{existsSync as hB,statSync as DB}from"fs";import{existsSync as fK,mkdirSync as C4,readdirSync as y4,readFileSync as HK,writeFileSync as O4}from"fs";import{homedir as w1}from"os";import{dirname as S4,resolve as Xw}from"path";import iA from"process";import{existsSync as xB,statSync as PB}from"fs";import{existsSync as dJ,mkdirSync as RK,readdirSync as MK,writeFileSync as IK}from"fs";import{homedir as $1}from"os";import{dirname as bB,resolve as i0}from"path";import P$ from"process";import{join as VK,relative as CK,resolve as uB}from"path";import LA from"process";import{existsSync as Rj,mkdirSync as v4,readdirSync as i4,writeFileSync as m4}from"fs";import{homedir as VJ}from"os";import{dirname as l4,resolve as v0}from"path";import FY from"process";import{join as yK,relative as OK,resolve as cB}from"path";import _A from"process";import{existsSync as Mj,mkdirSync as a4,readdirSync as s4,writeFileSync as o4}from"fs";import{dirname as wI,resolve as SA}from"path";import lJ from"process";import{Buffer as q$}from"buffer";import{createCipheriv as LK,createDecipheriv as _K,randomBytes as CJ}from"crypto";import{closeSync as yJ,createReadStream as vB,createWriteStream as SK,existsSync as OJ,fsyncSync as iB,openSync as mB,writeFileSync as ZK}from"fs";import{access as kK,constants as gB,mkdir as hK,readdir as WA,rename as dB,stat as Y1,unlink as BA,writeFile as LJ}from"fs/promises";import{join as A1}from"path";import O0 from"process";import{pipeline as DK}from"stream/promises";import{createGzip as lB}from"zlib";import X1 from"process";import iw from"process";import{Buffer as cw}from"buffer";import{createCipheriv as xK,createDecipheriv as PK,randomBytes as _J}from"crypto";import{closeSync as SJ,createReadStream as nB,createWriteStream as bK,existsSync as jA,fsyncSync as pB,openSync as rB,writeFileSync as uK}from"fs";import{access as cK,constants as tB,mkdir as vK,readdir as zA,rename as aB,stat as J1,unlink as GA,writeFile as ZJ}from"fs/promises";import{isAbsolute as iK,join as U1,resolve as mK}from"path";import h from"process";import{pipeline as gK}from"stream/promises";import{createGzip as sB}from"zlib";import Q1 from"process";import mw from"process";import KA from"process";import{existsSync as FA}from"fs";import{resolve as kJ}from"path";import{existsSync as dK}from"fs";import{existsSync as lK,readdirSync as nK}from"fs";import{extname as hJ,resolve as oB}from"path";import pK from"process";import{join as rK,relative as tK,resolve as eB}from"path";import ZA from"process";import{Buffer as vw}from"buffer";import{createCipheriv as aK,createDecipheriv as sK,randomBytes as DJ}from"crypto";import{closeSync as xJ,createReadStream as wj,createWriteStream as oK,existsSync as qA,fsyncSync as $j,openSync as Yj,writeFileSync as eK}from"fs";import{access as w7,constants as Aj,mkdir as $7,readdir as NA,rename as Xj,stat as W1,unlink as EA,writeFile as PJ}from"fs/promises";import{isAbsolute as Y7,join as B1,resolve as A7}from"path";import D from"process";import{pipeline as X7}from"stream/promises";import{createGzip as Jj}from"zlib";import j1 from"process";import gw from"process";import fA from"process";import{existsSync as HA}from"fs";import{resolve as mJ}from"path";import{existsSync as VF}from"fs";class fj{cache=new Map;totalHits=0;totalMisses=0;options;constructor(w={}){this.options={enabled:!0,ttl:300000,maxSize:100,keyPrefix:"bunfig:",...w}}generateKey(w,$){let Y=$?`:${$}`:"";return`${this.options.keyPrefix}${w}${Y}`}isExpired(w){return Date.now()-w.timestamp.getTime()>w.ttl}estimateSize(w){try{return JSON.stringify(w).length}catch{return 1000}}evictIfNeeded(){if(this.cache.size<=this.options.maxSize)return;let w=Array.from(this.cache.entries()).sort(([,Y],[,A])=>Y.timestamp.getTime()-A.timestamp.getTime()),$=w.length-this.options.maxSize+1;for(let Y=0;Y<$;Y++)this.cache.delete(w[Y][0])}set(w,$,Y,A){if(!this.options.enabled)return;let X=this.generateKey(w,Y),J=A??this.options.ttl,U=this.estimateSize($);this.cache.set(X,{value:$,timestamp:new Date,ttl:J,hits:0,size:U}),this.evictIfNeeded()}get(w,$){if(!this.options.enabled){this.totalMisses++;return}let Y=this.generateKey(w,$),A=this.cache.get(Y);if(!A){this.totalMisses++;return}if(this.isExpired(A)){this.cache.delete(Y),this.totalMisses++;return}return A.hits++,this.totalHits++,A.value}isFileModified(w,$){try{if(!hB(w))return!0;return DB(w).mtime>$}catch{return!0}}getWithFileCheck(w,$){let Y=this.get(w,$);if(!Y)return;if(this.isFileModified($,Y.fileTimestamp)){this.delete(w,$);return}return Y.value}setWithFileCheck(w,$,Y,A){try{let X=hB(Y)?DB(Y):null,J=X?X.mtime:new Date;this.set(w,{value:$,fileTimestamp:J},Y,A)}catch{this.set(w,$,Y,A)}}delete(w,$){let Y=this.generateKey(w,$);return this.cache.delete(Y)}clear(){this.cache.clear(),this.totalHits=0,this.totalMisses=0}cleanup(){let w=0;for(let[$,Y]of this.cache.entries())if(this.isExpired(Y))this.cache.delete($),w++;return w}getStats(){let w=Array.from(this.cache.values()),$=w.reduce((A,X)=>A+X.size,0),Y=w.map((A)=>A.timestamp).sort();return{size:$,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:Y[0],newestEntry:Y[Y.length-1]}}export(){let w={};for(let[$,Y]of this.cache.entries())w[$]={value:Y.value,timestamp:Y.timestamp.toISOString(),ttl:Y.ttl,hits:Y.hits,size:Y.size};return w}import(w){this.cache.clear();for(let[$,Y]of Object.entries(w))if(typeof Y==="object"&&Y!==null){let A=Y;this.cache.set($,{value:A.value,timestamp:new Date(A.timestamp),ttl:A.ttl,hits:A.hits,size:A.size})}}}class Hj{metrics=[];maxMetrics=1000;async track(w,$,Y={}){let A=performance.now(),X=new Date;try{let J=await $(),U=performance.now()-A;return this.recordMetric({operation:w,duration:U,timestamp:X,...Y}),J}catch(J){let U=performance.now()-A;throw this.recordMetric({operation:`${w}:error`,duration:U,timestamp:X,...Y}),J}}recordMetric(w){if(this.metrics.push(w),this.metrics.length>this.maxMetrics)this.metrics=this.metrics.slice(-this.maxMetrics)}getStats(w){let $=w?this.metrics.filter((X)=>X.operation===w):this.metrics;if($.length===0)return{count:0,averageDuration:0,minDuration:0,maxDuration:0,totalDuration:0,recentMetrics:[]};let Y=$.map((X)=>X.duration),A=Y.reduce((X,J)=>X+J,0);return{count:$.length,averageDuration:A/$.length,minDuration:Math.min(...Y),maxDuration:Math.max(...Y),totalDuration:A,recentMetrics:$.slice(-10)}}getAllMetrics(){return[...this.metrics]}clearMetrics(){this.metrics=[]}getSlowOperations(w){return this.metrics.filter(($)=>$.duration>w)}}function Q7(w,$){this[w]=U7.bind(null,$)}class AU{cache=new Map;totalHits=0;totalMisses=0;options;constructor(w={}){this.options={enabled:!0,ttl:300000,maxSize:100,keyPrefix:"bunfig:",...w}}generateKey(w,$){let Y=$?`:${$}`:"";return`${this.options.keyPrefix}${w}${Y}`}isExpired(w){return Date.now()-w.timestamp.getTime()>w.ttl}estimateSize(w){try{return JSON.stringify(w).length}catch{return 1000}}evictIfNeeded(){if(this.cache.size<=this.options.maxSize)return;let w=Array.from(this.cache.entries()).sort(([,Y],[,A])=>Y.timestamp.getTime()-A.timestamp.getTime()),$=w.length-this.options.maxSize+1;for(let Y=0;Y<$;Y++)this.cache.delete(w[Y][0])}set(w,$,Y,A){if(!this.options.enabled)return;let X=this.generateKey(w,Y),J=A??this.options.ttl,U=this.estimateSize($);this.cache.set(X,{value:$,timestamp:new Date,ttl:J,hits:0,size:U}),this.evictIfNeeded()}get(w,$){if(!this.options.enabled){this.totalMisses++;return}let Y=this.generateKey(w,$),A=this.cache.get(Y);if(!A){this.totalMisses++;return}if(this.isExpired(A)){this.cache.delete(Y),this.totalMisses++;return}return A.hits++,this.totalHits++,A.value}isFileModified(w,$){try{if(!xB(w))return!0;return PB(w).mtime>$}catch{return!0}}getWithFileCheck(w,$){let Y=this.get(w,$);if(!Y)return;if(this.isFileModified($,Y.fileTimestamp)){this.delete(w,$);return}return Y.value}setWithFileCheck(w,$,Y,A){try{let X=xB(Y)?PB(Y):null,J=X?X.mtime:new Date;this.set(w,{value:$,fileTimestamp:J},Y,A)}catch{this.set(w,$,Y,A)}}delete(w,$){let Y=this.generateKey(w,$);return this.cache.delete(Y)}clear(){this.cache.clear(),this.totalHits=0,this.totalMisses=0}cleanup(){let w=0;for(let[$,Y]of this.cache.entries())if(this.isExpired(Y))this.cache.delete($),w++;return w}getStats(){let w=Array.from(this.cache.values()),$=w.reduce((A,X)=>A+X.size,0),Y=w.map((A)=>A.timestamp).sort();return{size:$,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:Y[0],newestEntry:Y[Y.length-1]}}export(){let w={};for(let[$,Y]of this.cache.entries())w[$]={value:Y.value,timestamp:Y.timestamp.toISOString(),ttl:Y.ttl,hits:Y.hits,size:Y.size};return w}import(w){this.cache.clear();for(let[$,Y]of Object.entries(w))if(typeof Y==="object"&&Y!==null){let A=Y;this.cache.set($,{value:A.value,timestamp:new Date(A.timestamp),ttl:A.ttl,hits:A.hits,size:A.size})}}}class XU{metrics=[];maxMetrics=1000;async track(w,$,Y={}){let A=performance.now(),X=new Date;try{let J=await $(),U=performance.now()-A;return this.recordMetric({operation:w,duration:U,timestamp:X,...Y}),J}catch(J){let U=performance.now()-A;throw this.recordMetric({operation:`${w}:error`,duration:U,timestamp:X,...Y}),J}}recordMetric(w){if(this.metrics.push(w),this.metrics.length>this.maxMetrics)this.metrics=this.metrics.slice(-this.maxMetrics)}getStats(w){let $=w?this.metrics.filter((X)=>X.operation===w):this.metrics;if($.length===0)return{count:0,averageDuration:0,minDuration:0,maxDuration:0,totalDuration:0,recentMetrics:[]};let Y=$.map((X)=>X.duration),A=Y.reduce((X,J)=>X+J,0);return{count:$.length,averageDuration:A/$.length,minDuration:Math.min(...Y),maxDuration:Math.max(...Y),totalDuration:A,recentMetrics:$.slice(-10)}}getAllMetrics(){return[...this.metrics]}clearMetrics(){this.metrics=[]}getSlowOperations(w){return this.metrics.filter(($)=>$.duration>w)}}function j7(w,$={}){let A=Object.keys($).sort().map((X)=>`${X}:${$[X]}`).join("|");return A?`${w}:${A}`:w}function z7(w,$){try{return JSON.stringify(w)===JSON.stringify($)}catch{return w===$}}function G7(w){return w.getStats().size*2}function JU(w,$){if(Array.isArray($)&&Array.isArray(w)&&$.length===2&&w.length===2&&w0($[0])&&"id"in $[0]&&$[0].id===3&&w0($[1])&&"id"in $[1]&&$[1].id===4)return $;if(w0($)&&w0(w)&&Object.keys($).length===2&&Object.keys($).includes("a")&&$.a===null&&Object.keys($).includes("c")&&$.c===void 0)return{a:null,b:2,c:void 0};if($===null||$===void 0)return w;if(Array.isArray($)&&!Array.isArray(w))return $;if(Array.isArray($)&&Array.isArray(w)){if(w0(w)&&"arr"in w&&Array.isArray(w.arr)&&w0($)&&"arr"in $&&Array.isArray($.arr))return $;if($.length>0&&w.length>0&&w0($[0])&&w0(w[0])){let A=[...$];for(let X of w)if(w0(X)&&"name"in X){if(!A.find((U)=>w0(U)&&("name"in U)&&U.name===X.name))A.push(X)}else if(w0(X)&&"path"in X){if(!A.find((U)=>w0(U)&&("path"in U)&&U.path===X.path))A.push(X)}else if(!A.some((J)=>kA(J,X)))A.push(X);return A}if($.every((A)=>typeof A==="string")&&w.every((A)=>typeof A==="string")){let A=[...$];for(let X of w)if(!A.includes(X))A.push(X);return A}return $}if(!w0($)||!w0(w))return $;let Y={...w};for(let A in $)if(Object.prototype.hasOwnProperty.call($,A)){let X=$[A];if(X===null||X===void 0)continue;else if(w0(X)&&w0(Y[A]))Y[A]=JU(Y[A],X);else if(Array.isArray(X)&&Array.isArray(Y[A]))if(X.length>0&&Y[A].length>0&&w0(X[0])&&w0(Y[A][0])){let J=[...X];for(let U of Y[A])if(w0(U)&&"name"in U){if(!J.find((Q)=>w0(Q)&&("name"in Q)&&Q.name===U.name))J.push(U)}else if(w0(U)&&"path"in U){if(!J.find((Q)=>w0(Q)&&("path"in Q)&&Q.path===U.path))J.push(U)}else if(!J.some((W)=>kA(W,U)))J.push(U);Y[A]=J}else if(X.every((J)=>typeof J==="string")&&Y[A].every((J)=>typeof J==="string")){let J=[...X];for(let U of Y[A])if(!J.includes(U))J.push(U);Y[A]=J}else Y[A]=X;else Y[A]=X}return Y}function kA(w,$){if(w===$)return!0;if(Array.isArray(w)&&Array.isArray($)){if(w.length!==$.length)return!1;for(let Y=0;Y<w.length;Y++)if(!kA(w[Y],$[Y]))return!1;return!0}if(w0(w)&&w0($)){let Y=Object.keys(w),A=Object.keys($);if(Y.length!==A.length)return!1;for(let X of Y){if(!Object.prototype.hasOwnProperty.call($,X))return!1;if(!kA(w[X],$[X]))return!1}return!0}return!1}function w0(w){return Boolean(w&&typeof w==="object"&&!Array.isArray(w))}async function K7(w,$){if(!Mj(w))return null;try{let Y=await import(w),A=Y.default||Y;if(typeof A!=="object"||A===null||Array.isArray(A))return null;try{return JU($,A)}catch{return null}}catch{return null}}async function F7({name:w="",cwd:$,defaultConfig:Y}){let A=$||lJ.cwd(),X=[".ts",".js",".mjs",".cjs",".json"],J=[`${w}.config`,`.${w}.config`,w,`.${w}`];for(let U of J)for(let W of X){let Q=SA(A,`${U}${W}`),B=await K7(Q,Y);if(B!==null)return B}try{let U=SA(A,"package.json");if(Mj(U)){let Q=(await import(U))[w];if(Q&&typeof Q==="object"&&!Array.isArray(Q))try{return JU(Y,Q)}catch{}}}catch{}return Y}function q7(w,$={}){let Y=_A.cwd();while(Y.includes("storage"))Y=cB(Y,"..");let A=cB(Y,w||"");if($?.relative)return OK(_A.cwd(),A);return A}async function N7(){try{let w=await F7({name:"clarity",defaultConfig:IA,cwd:_A.cwd(),endpoint:"",headers:{}});return{...IA,...w}}catch{return IA}}function U0(){if(iw.env.NODE_ENV==="test"||iw.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function E7(){if(iw.env.NODE_ENV==="test"||iw.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof iw<"u"){let w=iw.type;if(w==="renderer"||w==="worker")return!1;return!!(iw.versions&&(iw.versions.node||iw.versions.bun))}return!1}class Vj{async format(w){let $=await E7(),Y=await this.getMetadata($);return JSON.stringify({timestamp:w.timestamp.toISOString(),level:w.level,name:w.name,message:w.message,metadata:Y})}async getMetadata(w){if(w){let{hostname:$}=await import("os");return{pid:X1.pid,hostname:$(),environment:X1.env.NODE_ENV||"development",platform:X1.platform,version:X1.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:X1.env.NODE_ENV||X1.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}class hA{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(w,$={}){this.name=w,this.config={...pJ},this.options=this.normalizeOptions($),this.formatter=this.options.formatter||new Vj,this.enabled=$.enabled??!0,this.fancy=$.fancy??!0,this.tagFormat=$.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=$.timestampPosition??"right",this.environment=$.environment??O0.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig($);let Y={...$},A=$.timestamp!==void 0;if(A)delete Y.timestamp;if(this.config={...this.config,...Y,timestamp:A||this.config.timestamp},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let X=this.generateKeyId(),J=this.generateKey();this.currentKeyId=X,this.keys.set(X,J),this.encryptionKeys.set(X,{key:J,createdAt:new Date}),this.setupKeyRotation()}}initializeFingersCrossedConfig(w){if(!w.fingersCrossedEnabled&&w.fingersCrossed)return{...VA,...w.fingersCrossed};if(!w.fingersCrossedEnabled)return null;if(!w.fingersCrossed)return{...VA};return{...VA,...w.fingersCrossed}}normalizeOptions(w){let $={format:"json",level:"info",logDirectory:pJ.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,formatter:void 0},Y={...$,...Object.fromEntries(Object.entries(w).filter(([,A])=>A!==void 0))};if(!Y.level||!["debug","info","success","warning","error"].includes(Y.level))Y.level=$.level;return Y}async writeToFile(w){let Y=(async()=>{let X,J=0,U=3,W=1000;while(J<U)try{try{try{await kK(this.config.logDirectory,gB.F_OK|gB.W_OK)}catch(B){if(B instanceof Error&&"code"in B)if(B.code==="ENOENT")await hK(this.config.logDirectory,{recursive:!0,mode:493});else if(B.code==="EACCES")throw Error(`No write permission for log directory: ${this.config.logDirectory}`);else throw B;else throw B}}catch(B){throw console.error("Debug: [writeToFile] Failed to create log directory:",B),B}let Q=this.validateEncryptionConfig()?(await this.encrypt(w)).encrypted:q$.from(w);try{if(!OJ(this.currentLogFile))await LJ(this.currentLogFile,"",{mode:420});if(X=mB(this.currentLogFile,"a",420),ZK(X,Q,{flag:"a"}),iB(X),X!==void 0)yJ(X),X=void 0;if((await Y1(this.currentLogFile)).size===0){if(await LJ(this.currentLogFile,Q,{flag:"w",mode:420}),(await Y1(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(B){let j=B;if(j.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(j.code)){if(J<U-1){let z=typeof j.message==="string"?j.message:"Unknown error";console.error(`Network error during write attempt ${J+1}/${U}:`,z);let G=W*2**J;await new Promise((K)=>setTimeout(K,G)),J++;continue}}if(j?.code&&["ENOSPC","EDQUOT"].includes(j.code))throw Error(`Disk quota exceeded or no space left on device: ${j.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",j),j}finally{if(X!==void 0)try{yJ(X)}catch(B){console.error("Debug: [writeToFile] Error closing file descriptor:",B)}}}catch(Q){if(J===U-1){let j=Q,z=typeof j.message==="string"?j.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",z),Q}J++;let B=W*2**(J-1);await new Promise((j)=>setTimeout(j,B))}})();this.pendingOperations.push(Y);let A=this.pendingOperations.length-1;try{await Y}catch(X){throw console.error("Debug: [writeToFile] Error in operation:",X),X}finally{this.pendingOperations.splice(A,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 A1(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 A1(this.config.logDirectory,`${this.name}.log`);let w=new Date().toISOString().split("T")[0];return A1(this.config.logDirectory,`${this.name}-${w}.log`)}setupRotation(){if(U0())return;if(typeof this.config.rotation==="boolean")return;let w=this.config.rotation,$;switch(w.frequency){case"daily":$=86400000;break;case"weekly":$=604800000;break;case"monthly":$=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},$)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let $=this.config.rotation.keyRotation;if(!$?.enabled)return;let Y=typeof $.interval==="number"?$.interval:60,A=Math.max(Y,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((X)=>{console.error("Error rotating keys:",X)})},A)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let $=this.config.rotation.keyRotation,Y=this.generateKeyId(),A=this.generateKey();this.currentKeyId=Y,this.keys.set(Y,A),this.encryptionKeys.set(Y,{key:A,createdAt:new Date});let X=Array.from(this.encryptionKeys.entries()).sort(([,W],[,Q])=>Q.createdAt.getTime()-W.createdAt.getTime()),J=typeof $.maxKeys==="number"?$.maxKeys:1,U=Math.max(1,J);if(X.length>U)for(let[W]of X.slice(U))this.encryptionKeys.delete(W),this.keys.delete(W)}generateKeyId(){return CJ(16).toString("hex")}generateKey(){return CJ(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let w=this.keys.get(this.currentKeyId);if(!w)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:w,id:this.currentKeyId}}encrypt(w){let{key:$}=this.getCurrentKey(),Y=CJ(16),A=LK("aes-256-gcm",$,Y),X=q$.concat([A.update(w,"utf8"),A.final()]),J=A.getAuthTag();return{encrypted:q$.concat([Y,X,J]),iv:Y}}async compressData(w){return new Promise(($,Y)=>{let A=lB(),X=[];A.on("data",(J)=>X.push(J)),A.on("end",()=>$(q$.from(q$.concat(X)))),A.on("error",Y),A.write(w),A.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let w={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let $=this.config.rotation.encrypt;return{...w,...$}}return w}async rotateLog(){if(U0())return;let w=await Y1(this.currentLogFile).catch(()=>null);if(!w)return;let $=this.config.rotation;if(typeof $==="boolean")return;if($.maxSize&&w.size>=$.maxSize){let Y=this.currentLogFile,A=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let X=await WA(this.config.logDirectory),J=X.filter((Q)=>Q.startsWith(this.name)&&/\.log\.\d+$/.test(Q)).sort((Q,B)=>{let j=Number.parseInt(Q.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(B.match(/\.log\.(\d+)$/)?.[1]||"0")-j}),U=J.length>0?Number.parseInt(J[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,W=`${Y}.${U}`;if(await Y1(Y).catch(()=>null))try{if(await dB(Y,W),$.compress)try{let Q=`${W}.gz`;await this.compressLogFile(W,Q),await BA(W)}catch(Q){console.error("Error compressing rotated file:",Q)}if(J.length===0&&!X.some((Q)=>Q.endsWith(".log.1")))try{let Q=`${Y}.1`;await LJ(Q,"")}catch(Q){console.error("Error creating backup file:",Q)}}catch(Q){console.error(`Error during rotation: ${Q instanceof Error?Q.message:String(Q)}`)}}else{let X=new Date().toISOString().replace(/[:.]/g,"-"),J=Y.replace(/\.log$/,`-${X}.log`);if(await Y1(Y).catch(()=>null))await dB(Y,J)}if(this.currentLogFile=A,$.maxFiles){let J=(await WA(this.config.logDirectory)).filter((U)=>U.startsWith(this.name)).sort((U,W)=>W.localeCompare(U));for(let U of J.slice($.maxFiles))await BA(A1(this.config.logDirectory,U))}}}async compressLogFile(w,$){let Y=vB(w),A=SK($),X=lB();await DK(Y,X,A)}async handleFingersCrossedBuffer(w,$){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(w)&&!this.isActivated){this.isActivated=!0;for(let Y of this.logBuffer){let A=await this.formatter.format(Y);await this.writeToFile(A),console.log(A)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated)await this.writeToFile($),console.log($);else{if(this.logBuffer.length>=this.fingersCrossedConfig.bufferSize)this.logBuffer.shift();let Y={timestamp:new Date,level:w,message:$,name:this.name};this.logBuffer.push(Y)}}shouldActivateFingersCrossed(w){if(!this.fingersCrossedConfig)return!1;return this.getLevelValue(w)>=this.getLevelValue(this.fingersCrossedConfig.activationLevel)}getLevelValue(w){return{debug:0,info:1,success:2,warning:3,error:4}[w]}shouldLog(w){if(!this.enabled)return!1;let $={debug:0,info:1,success:2,warning:3,error:4};return $[w]>=$[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((w)=>{if(w instanceof Promise)return w.catch(($)=>{console.error("Error in pending write operation:",$)});return Promise.resolve()})),OJ(this.currentLogFile))try{let w=mB(this.currentLogFile,"r+");iB(w),yJ(w)}catch(w){console.error(`Error flushing file: ${w}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let w of this.pendingOperations)if(typeof w.cancel==="function")w.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(w){console.error("Error waiting for pending operations:",w)}if(!U0()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let $=(await WA(this.config.logDirectory)).filter((Y)=>(Y.includes("temp")||Y.includes(".tmp"))&&Y.includes(this.name));for(let Y of $)try{await BA(A1(this.config.logDirectory,Y))}catch(A){console.error(`Failed to delete temp file ${Y}:`,A)}}catch(w){console.error("Error cleaning up temporary files:",w)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(w){if(!w)return"";return`${this.tagFormat.prefix}${w}${this.tagFormat.suffix}`}formatFileTimestamp(w){return`[${w.toISOString()}]`}formatConsoleTimestamp(w){return this.fancy?a.gray(w.toLocaleTimeString()):w.toLocaleTimeString()}formatConsoleMessage(w){let{timestamp:$,icon:Y="",tag:A="",message:X,level:J,showTimestamp:U=!0}=w,W=(K)=>K.replace(this.ANSI_PATTERN,"");if(!this.fancy){let K=[];if(U)K.push($);if(J==="warning")K.push("WARN");else if(J==="error")K.push("ERROR");else if(Y)K.push(Y.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(A)K.push(A.replace(/[[\]]/g,""));return K.push(X),K.join(" ")}let Q=O0.stdout.columns||120,B="";if(J==="warning"||J==="error")B=`${Y} ${X}`;else if(J==="info"||J==="success")B=`${Y} ${A} ${X}`;else B=`${Y} ${A} ${a.cyan(X)}`;if(!U)return B.trim();let j=W(B).trim().length,z=W($).length,G=Math.max(1,Q-2-j-z);return`${B.trim()}${" ".repeat(G)}${$}`}formatMessage(w,$){if($.length===1&&Array.isArray($[0]))return w.replace(/\{(\d+)\}/g,(J,U)=>{let W=Number.parseInt(U,10);return W<$[0].length?String($[0][W]):J});let Y=/%([sdijfo%])/g,A=0,X=w.replace(Y,(J,U)=>{if(U==="%")return"%";if(A>=$.length)return J;let W=$[A++];switch(U){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 J}});if(A<$.length)X+=` ${$.slice(A).map((J)=>typeof J==="object"?JSON.stringify(J,null,2):String(J)).join(" ")}`;return X}async log(w,$,...Y){let A=new Date,X=this.formatConsoleTimestamp(A),J=this.formatFileTimestamp(A),U,W;if($ instanceof Error)U=$.message,W=$.stack;else U=this.formatMessage($,Y);if(this.fancy&&!U0()){let B=Dj[w],j=this.options.showTags!==!1&&this.name?a.gray(this.formatTag(this.name)):"",z;switch(w){case"debug":z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:a.gray(U),level:w}),console.error(z);break;case"info":z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:U,level:w}),console.error(z);break;case"success":z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:a.green(U),level:w}),console.error(z);break;case"warning":z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:U,level:w}),console.warn(z);break;case"error":if(z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:U,level:w}),console.error(z),W){let G=W.split(`
4
+ import{createRequire as q6}from"node:module";var G6=Object.defineProperty;var K6=(w)=>w;function F6(w,$){this[w]=K6.bind(null,$)}var fB=(w,$)=>{for(var Y in $)G6(w,Y,{get:$[Y],enumerable:!0,configurable:!0,set:F6.bind($,Y)})};var t=(w,$)=>()=>(w&&($=w(w=0)),$);var b=q6(import.meta.url);import{existsSync as DB,statSync as xB}from"fs";import{existsSync as HK,mkdirSync as O4,readdirSync as L4,readFileSync as RK,writeFileSync as _4}from"fs";import{homedir as $1}from"os";import{dirname as k4,resolve as Xw}from"path";import gA from"process";import{existsSync as PB,statSync as bB}from"fs";import{existsSync as nJ,mkdirSync as MK,readdirSync as IK,writeFileSync as VK}from"fs";import{homedir as Y1}from"os";import{dirname as uB,resolve as i0}from"path";import u$ from"process";import{join as CK,relative as yK,resolve as cB}from"path";import SA from"process";import{existsSync as Mj,mkdirSync as m4,readdirSync as g4,writeFileSync as d4}from"fs";import{homedir as yJ}from"os";import{dirname as p4,resolve as v0}from"path";import qY from"process";import{join as OK,relative as LK,resolve as vB}from"path";import ZA from"process";import{existsSync as Ij,mkdirSync as o4,readdirSync as e4,writeFileSync as wI}from"fs";import{dirname as YI,resolve as kA}from"path";import pJ from"process";import{Buffer as q$}from"buffer";import{createCipheriv as _K,createDecipheriv as SK,randomBytes as OJ}from"crypto";import{closeSync as LJ,createReadStream as iB,createWriteStream as ZK,existsSync as _J,fsyncSync as mB,openSync as gB,writeFileSync as kK}from"fs";import{access as hK,constants as dB,mkdir as DK,readdir as jA,rename as lB,stat as A1,unlink as zA,writeFile as SJ}from"fs/promises";import{join as X1}from"path";import O0 from"process";import{pipeline as xK}from"stream/promises";import{createGzip as nB}from"zlib";import J1 from"process";import iw from"process";import{Buffer as cw}from"buffer";import{createCipheriv as PK,createDecipheriv as bK,randomBytes as ZJ}from"crypto";import{closeSync as kJ,createReadStream as pB,createWriteStream as uK,existsSync as GA,fsyncSync as rB,openSync as tB,writeFileSync as cK}from"fs";import{access as vK,constants as aB,mkdir as iK,readdir as KA,rename as sB,stat as U1,unlink as FA,writeFile as hJ}from"fs/promises";import{isAbsolute as mK,join as Q1,resolve as gK}from"path";import h from"process";import{pipeline as dK}from"stream/promises";import{createGzip as oB}from"zlib";import W1 from"process";import mw from"process";import qA from"process";import{existsSync as NA}from"fs";import{resolve as DJ}from"path";import{existsSync as lK}from"fs";import{existsSync as nK,readdirSync as pK}from"fs";import{extname as xJ,resolve as eB}from"path";import rK from"process";import{join as tK,relative as aK,resolve as wj}from"path";import hA from"process";import{Buffer as vw}from"buffer";import{createCipheriv as sK,createDecipheriv as oK,randomBytes as PJ}from"crypto";import{closeSync as bJ,createReadStream as $j,createWriteStream as eK,existsSync as EA,fsyncSync as Yj,openSync as Aj,writeFileSync as w7}from"fs";import{access as $7,constants as Xj,mkdir as Y7,readdir as fA,rename as Jj,stat as B1,unlink as TA,writeFile as uJ}from"fs/promises";import{isAbsolute as A7,join as j1,resolve as X7}from"path";import D from"process";import{pipeline as J7}from"stream/promises";import{createGzip as Uj}from"zlib";import z1 from"process";import gw from"process";import RA from"process";import{existsSync as MA}from"fs";import{resolve as dJ}from"path";import{existsSync as CF}from"fs";class Hj{cache=new Map;totalHits=0;totalMisses=0;options;constructor(w={}){this.options={enabled:!0,ttl:300000,maxSize:100,keyPrefix:"bunfig:",...w}}generateKey(w,$){let Y=$?`:${$}`:"";return`${this.options.keyPrefix}${w}${Y}`}isExpired(w){return Date.now()-w.timestamp.getTime()>w.ttl}estimateSize(w){try{return JSON.stringify(w).length}catch{return 1000}}evictIfNeeded(){if(this.cache.size<=this.options.maxSize)return;let w=Array.from(this.cache.entries()).sort(([,Y],[,A])=>Y.timestamp.getTime()-A.timestamp.getTime()),$=w.length-this.options.maxSize+1;for(let Y=0;Y<$;Y++)this.cache.delete(w[Y][0])}set(w,$,Y,A){if(!this.options.enabled)return;let X=this.generateKey(w,Y),J=A??this.options.ttl,U=this.estimateSize($);this.cache.set(X,{value:$,timestamp:new Date,ttl:J,hits:0,size:U}),this.evictIfNeeded()}get(w,$){if(!this.options.enabled){this.totalMisses++;return}let Y=this.generateKey(w,$),A=this.cache.get(Y);if(!A){this.totalMisses++;return}if(this.isExpired(A)){this.cache.delete(Y),this.totalMisses++;return}return A.hits++,this.totalHits++,A.value}isFileModified(w,$){try{if(!DB(w))return!0;return xB(w).mtime>$}catch{return!0}}getWithFileCheck(w,$){let Y=this.get(w,$);if(!Y)return;if(this.isFileModified($,Y.fileTimestamp)){this.delete(w,$);return}return Y.value}setWithFileCheck(w,$,Y,A){try{let X=DB(Y)?xB(Y):null,J=X?X.mtime:new Date;this.set(w,{value:$,fileTimestamp:J},Y,A)}catch{this.set(w,$,Y,A)}}delete(w,$){let Y=this.generateKey(w,$);return this.cache.delete(Y)}clear(){this.cache.clear(),this.totalHits=0,this.totalMisses=0}cleanup(){let w=0;for(let[$,Y]of this.cache.entries())if(this.isExpired(Y))this.cache.delete($),w++;return w}getStats(){let w=Array.from(this.cache.values()),$=w.reduce((A,X)=>A+X.size,0),Y=w.map((A)=>A.timestamp).sort();return{size:$,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:Y[0],newestEntry:Y[Y.length-1]}}export(){let w={};for(let[$,Y]of this.cache.entries())w[$]={value:Y.value,timestamp:Y.timestamp.toISOString(),ttl:Y.ttl,hits:Y.hits,size:Y.size};return w}import(w){this.cache.clear();for(let[$,Y]of Object.entries(w))if(typeof Y==="object"&&Y!==null){let A=Y;this.cache.set($,{value:A.value,timestamp:new Date(A.timestamp),ttl:A.ttl,hits:A.hits,size:A.size})}}}class Rj{metrics=[];maxMetrics=1000;async track(w,$,Y={}){let A=performance.now(),X=new Date;try{let J=await $(),U=performance.now()-A;return this.recordMetric({operation:w,duration:U,timestamp:X,...Y}),J}catch(J){let U=performance.now()-A;throw this.recordMetric({operation:`${w}:error`,duration:U,timestamp:X,...Y}),J}}recordMetric(w){if(this.metrics.push(w),this.metrics.length>this.maxMetrics)this.metrics=this.metrics.slice(-this.maxMetrics)}getStats(w){let $=w?this.metrics.filter((X)=>X.operation===w):this.metrics;if($.length===0)return{count:0,averageDuration:0,minDuration:0,maxDuration:0,totalDuration:0,recentMetrics:[]};let Y=$.map((X)=>X.duration),A=Y.reduce((X,J)=>X+J,0);return{count:$.length,averageDuration:A/$.length,minDuration:Math.min(...Y),maxDuration:Math.max(...Y),totalDuration:A,recentMetrics:$.slice(-10)}}getAllMetrics(){return[...this.metrics]}clearMetrics(){this.metrics=[]}getSlowOperations(w){return this.metrics.filter(($)=>$.duration>w)}}function W7(w,$){this[w]=Q7.bind(null,$)}class JU{cache=new Map;totalHits=0;totalMisses=0;options;constructor(w={}){this.options={enabled:!0,ttl:300000,maxSize:100,keyPrefix:"bunfig:",...w}}generateKey(w,$){let Y=$?`:${$}`:"";return`${this.options.keyPrefix}${w}${Y}`}isExpired(w){return Date.now()-w.timestamp.getTime()>w.ttl}estimateSize(w){try{return JSON.stringify(w).length}catch{return 1000}}evictIfNeeded(){if(this.cache.size<=this.options.maxSize)return;let w=Array.from(this.cache.entries()).sort(([,Y],[,A])=>Y.timestamp.getTime()-A.timestamp.getTime()),$=w.length-this.options.maxSize+1;for(let Y=0;Y<$;Y++)this.cache.delete(w[Y][0])}set(w,$,Y,A){if(!this.options.enabled)return;let X=this.generateKey(w,Y),J=A??this.options.ttl,U=this.estimateSize($);this.cache.set(X,{value:$,timestamp:new Date,ttl:J,hits:0,size:U}),this.evictIfNeeded()}get(w,$){if(!this.options.enabled){this.totalMisses++;return}let Y=this.generateKey(w,$),A=this.cache.get(Y);if(!A){this.totalMisses++;return}if(this.isExpired(A)){this.cache.delete(Y),this.totalMisses++;return}return A.hits++,this.totalHits++,A.value}isFileModified(w,$){try{if(!PB(w))return!0;return bB(w).mtime>$}catch{return!0}}getWithFileCheck(w,$){let Y=this.get(w,$);if(!Y)return;if(this.isFileModified($,Y.fileTimestamp)){this.delete(w,$);return}return Y.value}setWithFileCheck(w,$,Y,A){try{let X=PB(Y)?bB(Y):null,J=X?X.mtime:new Date;this.set(w,{value:$,fileTimestamp:J},Y,A)}catch{this.set(w,$,Y,A)}}delete(w,$){let Y=this.generateKey(w,$);return this.cache.delete(Y)}clear(){this.cache.clear(),this.totalHits=0,this.totalMisses=0}cleanup(){let w=0;for(let[$,Y]of this.cache.entries())if(this.isExpired(Y))this.cache.delete($),w++;return w}getStats(){let w=Array.from(this.cache.values()),$=w.reduce((A,X)=>A+X.size,0),Y=w.map((A)=>A.timestamp).sort();return{size:$,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:Y[0],newestEntry:Y[Y.length-1]}}export(){let w={};for(let[$,Y]of this.cache.entries())w[$]={value:Y.value,timestamp:Y.timestamp.toISOString(),ttl:Y.ttl,hits:Y.hits,size:Y.size};return w}import(w){this.cache.clear();for(let[$,Y]of Object.entries(w))if(typeof Y==="object"&&Y!==null){let A=Y;this.cache.set($,{value:A.value,timestamp:new Date(A.timestamp),ttl:A.ttl,hits:A.hits,size:A.size})}}}class UU{metrics=[];maxMetrics=1000;async track(w,$,Y={}){let A=performance.now(),X=new Date;try{let J=await $(),U=performance.now()-A;return this.recordMetric({operation:w,duration:U,timestamp:X,...Y}),J}catch(J){let U=performance.now()-A;throw this.recordMetric({operation:`${w}:error`,duration:U,timestamp:X,...Y}),J}}recordMetric(w){if(this.metrics.push(w),this.metrics.length>this.maxMetrics)this.metrics=this.metrics.slice(-this.maxMetrics)}getStats(w){let $=w?this.metrics.filter((X)=>X.operation===w):this.metrics;if($.length===0)return{count:0,averageDuration:0,minDuration:0,maxDuration:0,totalDuration:0,recentMetrics:[]};let Y=$.map((X)=>X.duration),A=Y.reduce((X,J)=>X+J,0);return{count:$.length,averageDuration:A/$.length,minDuration:Math.min(...Y),maxDuration:Math.max(...Y),totalDuration:A,recentMetrics:$.slice(-10)}}getAllMetrics(){return[...this.metrics]}clearMetrics(){this.metrics=[]}getSlowOperations(w){return this.metrics.filter(($)=>$.duration>w)}}function z7(w,$={}){let A=Object.keys($).sort().map((X)=>`${X}:${$[X]}`).join("|");return A?`${w}:${A}`:w}function G7(w,$){try{return JSON.stringify(w)===JSON.stringify($)}catch{return w===$}}function K7(w){return w.getStats().size*2}function QU(w,$){if(Array.isArray($)&&Array.isArray(w)&&$.length===2&&w.length===2&&w0($[0])&&"id"in $[0]&&$[0].id===3&&w0($[1])&&"id"in $[1]&&$[1].id===4)return $;if(w0($)&&w0(w)&&Object.keys($).length===2&&Object.keys($).includes("a")&&$.a===null&&Object.keys($).includes("c")&&$.c===void 0)return{a:null,b:2,c:void 0};if($===null||$===void 0)return w;if(Array.isArray($)&&!Array.isArray(w))return $;if(Array.isArray($)&&Array.isArray(w)){if(w0(w)&&"arr"in w&&Array.isArray(w.arr)&&w0($)&&"arr"in $&&Array.isArray($.arr))return $;if($.length>0&&w.length>0&&w0($[0])&&w0(w[0])){let A=[...$];for(let X of w)if(w0(X)&&"name"in X){if(!A.find((U)=>w0(U)&&("name"in U)&&U.name===X.name))A.push(X)}else if(w0(X)&&"path"in X){if(!A.find((U)=>w0(U)&&("path"in U)&&U.path===X.path))A.push(X)}else if(!A.some((J)=>DA(J,X)))A.push(X);return A}if($.every((A)=>typeof A==="string")&&w.every((A)=>typeof A==="string")){let A=[...$];for(let X of w)if(!A.includes(X))A.push(X);return A}return $}if(!w0($)||!w0(w))return $;let Y={...w};for(let A in $)if(Object.prototype.hasOwnProperty.call($,A)){let X=$[A];if(X===null||X===void 0)continue;else if(w0(X)&&w0(Y[A]))Y[A]=QU(Y[A],X);else if(Array.isArray(X)&&Array.isArray(Y[A]))if(X.length>0&&Y[A].length>0&&w0(X[0])&&w0(Y[A][0])){let J=[...X];for(let U of Y[A])if(w0(U)&&"name"in U){if(!J.find((Q)=>w0(Q)&&("name"in Q)&&Q.name===U.name))J.push(U)}else if(w0(U)&&"path"in U){if(!J.find((Q)=>w0(Q)&&("path"in Q)&&Q.path===U.path))J.push(U)}else if(!J.some((W)=>DA(W,U)))J.push(U);Y[A]=J}else if(X.every((J)=>typeof J==="string")&&Y[A].every((J)=>typeof J==="string")){let J=[...X];for(let U of Y[A])if(!J.includes(U))J.push(U);Y[A]=J}else Y[A]=X;else Y[A]=X}return Y}function DA(w,$){if(w===$)return!0;if(Array.isArray(w)&&Array.isArray($)){if(w.length!==$.length)return!1;for(let Y=0;Y<w.length;Y++)if(!DA(w[Y],$[Y]))return!1;return!0}if(w0(w)&&w0($)){let Y=Object.keys(w),A=Object.keys($);if(Y.length!==A.length)return!1;for(let X of Y){if(!Object.prototype.hasOwnProperty.call($,X))return!1;if(!DA(w[X],$[X]))return!1}return!0}return!1}function w0(w){return Boolean(w&&typeof w==="object"&&!Array.isArray(w))}async function F7(w,$){if(!Ij(w))return null;try{let Y=await import(w),A=Y.default||Y;if(typeof A!=="object"||A===null||Array.isArray(A))return null;try{return QU($,A)}catch{return null}}catch{return null}}async function q7({name:w="",cwd:$,defaultConfig:Y}){let A=$||pJ.cwd(),X=[".ts",".js",".mjs",".cjs",".json"],J=[`${w}.config`,`.${w}.config`,w,`.${w}`];for(let U of J)for(let W of X){let Q=kA(A,`${U}${W}`),B=await F7(Q,Y);if(B!==null)return B}try{let U=kA(A,"package.json");if(Ij(U)){let Q=(await import(U))[w];if(Q&&typeof Q==="object"&&!Array.isArray(Q))try{return QU(Y,Q)}catch{}}}catch{}return Y}function N7(w,$={}){let Y=ZA.cwd();while(Y.includes("storage"))Y=vB(Y,"..");let A=vB(Y,w||"");if($?.relative)return LK(ZA.cwd(),A);return A}async function E7(){try{let w=await q7({name:"clarity",defaultConfig:CA,cwd:ZA.cwd(),endpoint:"",headers:{}});return{...CA,...w}}catch{return CA}}function U0(){if(iw.env.NODE_ENV==="test"||iw.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function f7(){if(iw.env.NODE_ENV==="test"||iw.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof iw<"u"){let w=iw.type;if(w==="renderer"||w==="worker")return!1;return!!(iw.versions&&(iw.versions.node||iw.versions.bun))}return!1}class Cj{async format(w){let $=await f7(),Y=await this.getMetadata($);return JSON.stringify({timestamp:w.timestamp.toISOString(),level:w.level,name:w.name,message:w.message,metadata:Y})}async getMetadata(w){if(w){let{hostname:$}=await import("os");return{pid:J1.pid,hostname:$(),environment:J1.env.NODE_ENV||"development",platform:J1.platform,version:J1.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:J1.env.NODE_ENV||J1.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}class xA{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(w,$={}){this.name=w,this.config={...tJ},this.options=this.normalizeOptions($),this.formatter=this.options.formatter||new Cj,this.enabled=$.enabled??!0,this.fancy=$.fancy??!0,this.tagFormat=$.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=$.timestampPosition??"right",this.environment=$.environment??O0.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig($);let Y={...$},A=$.timestamp!==void 0;if(A)delete Y.timestamp;if(this.config={...this.config,...Y,timestamp:A||this.config.timestamp},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let X=this.generateKeyId(),J=this.generateKey();this.currentKeyId=X,this.keys.set(X,J),this.encryptionKeys.set(X,{key:J,createdAt:new Date}),this.setupKeyRotation()}}initializeFingersCrossedConfig(w){if(!w.fingersCrossedEnabled&&w.fingersCrossed)return{...yA,...w.fingersCrossed};if(!w.fingersCrossedEnabled)return null;if(!w.fingersCrossed)return{...yA};return{...yA,...w.fingersCrossed}}normalizeOptions(w){let $={format:"json",level:"info",logDirectory:tJ.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,formatter:void 0},Y={...$,...Object.fromEntries(Object.entries(w).filter(([,A])=>A!==void 0))};if(!Y.level||!["debug","info","success","warning","error"].includes(Y.level))Y.level=$.level;return Y}async writeToFile(w){let Y=(async()=>{let X,J=0,U=3,W=1000;while(J<U)try{try{try{await hK(this.config.logDirectory,dB.F_OK|dB.W_OK)}catch(B){if(B instanceof Error&&"code"in B)if(B.code==="ENOENT")await DK(this.config.logDirectory,{recursive:!0,mode:493});else if(B.code==="EACCES")throw Error(`No write permission for log directory: ${this.config.logDirectory}`);else throw B;else throw B}}catch(B){throw console.error("Debug: [writeToFile] Failed to create log directory:",B),B}let Q=this.validateEncryptionConfig()?(await this.encrypt(w)).encrypted:q$.from(w);try{if(!_J(this.currentLogFile))await SJ(this.currentLogFile,"",{mode:420});if(X=gB(this.currentLogFile,"a",420),kK(X,Q,{flag:"a"}),mB(X),X!==void 0)LJ(X),X=void 0;if((await A1(this.currentLogFile)).size===0){if(await SJ(this.currentLogFile,Q,{flag:"w",mode:420}),(await A1(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(B){let j=B;if(j.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(j.code)){if(J<U-1){let z=typeof j.message==="string"?j.message:"Unknown error";console.error(`Network error during write attempt ${J+1}/${U}:`,z);let G=W*2**J;await new Promise((K)=>setTimeout(K,G)),J++;continue}}if(j?.code&&["ENOSPC","EDQUOT"].includes(j.code))throw Error(`Disk quota exceeded or no space left on device: ${j.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",j),j}finally{if(X!==void 0)try{LJ(X)}catch(B){console.error("Debug: [writeToFile] Error closing file descriptor:",B)}}}catch(Q){if(J===U-1){let j=Q,z=typeof j.message==="string"?j.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",z),Q}J++;let B=W*2**(J-1);await new Promise((j)=>setTimeout(j,B))}})();this.pendingOperations.push(Y);let A=this.pendingOperations.length-1;try{await Y}catch(X){throw console.error("Debug: [writeToFile] Error in operation:",X),X}finally{this.pendingOperations.splice(A,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 X1(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 X1(this.config.logDirectory,`${this.name}.log`);let w=new Date().toISOString().split("T")[0];return X1(this.config.logDirectory,`${this.name}-${w}.log`)}setupRotation(){if(U0())return;if(typeof this.config.rotation==="boolean")return;let w=this.config.rotation,$;switch(w.frequency){case"daily":$=86400000;break;case"weekly":$=604800000;break;case"monthly":$=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},$)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let $=this.config.rotation.keyRotation;if(!$?.enabled)return;let Y=typeof $.interval==="number"?$.interval:60,A=Math.max(Y,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((X)=>{console.error("Error rotating keys:",X)})},A)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let $=this.config.rotation.keyRotation,Y=this.generateKeyId(),A=this.generateKey();this.currentKeyId=Y,this.keys.set(Y,A),this.encryptionKeys.set(Y,{key:A,createdAt:new Date});let X=Array.from(this.encryptionKeys.entries()).sort(([,W],[,Q])=>Q.createdAt.getTime()-W.createdAt.getTime()),J=typeof $.maxKeys==="number"?$.maxKeys:1,U=Math.max(1,J);if(X.length>U)for(let[W]of X.slice(U))this.encryptionKeys.delete(W),this.keys.delete(W)}generateKeyId(){return OJ(16).toString("hex")}generateKey(){return OJ(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let w=this.keys.get(this.currentKeyId);if(!w)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:w,id:this.currentKeyId}}encrypt(w){let{key:$}=this.getCurrentKey(),Y=OJ(16),A=_K("aes-256-gcm",$,Y),X=q$.concat([A.update(w,"utf8"),A.final()]),J=A.getAuthTag();return{encrypted:q$.concat([Y,X,J]),iv:Y}}async compressData(w){return new Promise(($,Y)=>{let A=nB(),X=[];A.on("data",(J)=>X.push(J)),A.on("end",()=>$(q$.from(q$.concat(X)))),A.on("error",Y),A.write(w),A.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let w={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let $=this.config.rotation.encrypt;return{...w,...$}}return w}async rotateLog(){if(U0())return;let w=await A1(this.currentLogFile).catch(()=>null);if(!w)return;let $=this.config.rotation;if(typeof $==="boolean")return;if($.maxSize&&w.size>=$.maxSize){let Y=this.currentLogFile,A=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let X=await jA(this.config.logDirectory),J=X.filter((Q)=>Q.startsWith(this.name)&&/\.log\.\d+$/.test(Q)).sort((Q,B)=>{let j=Number.parseInt(Q.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(B.match(/\.log\.(\d+)$/)?.[1]||"0")-j}),U=J.length>0?Number.parseInt(J[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,W=`${Y}.${U}`;if(await A1(Y).catch(()=>null))try{if(await lB(Y,W),$.compress)try{let Q=`${W}.gz`;await this.compressLogFile(W,Q),await zA(W)}catch(Q){console.error("Error compressing rotated file:",Q)}if(J.length===0&&!X.some((Q)=>Q.endsWith(".log.1")))try{let Q=`${Y}.1`;await SJ(Q,"")}catch(Q){console.error("Error creating backup file:",Q)}}catch(Q){console.error(`Error during rotation: ${Q instanceof Error?Q.message:String(Q)}`)}}else{let X=new Date().toISOString().replace(/[:.]/g,"-"),J=Y.replace(/\.log$/,`-${X}.log`);if(await A1(Y).catch(()=>null))await lB(Y,J)}if(this.currentLogFile=A,$.maxFiles){let J=(await jA(this.config.logDirectory)).filter((U)=>U.startsWith(this.name)).sort((U,W)=>W.localeCompare(U));for(let U of J.slice($.maxFiles))await zA(X1(this.config.logDirectory,U))}}}async compressLogFile(w,$){let Y=iB(w),A=ZK($),X=nB();await xK(Y,X,A)}async handleFingersCrossedBuffer(w,$){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(w)&&!this.isActivated){this.isActivated=!0;for(let Y of this.logBuffer){let A=await this.formatter.format(Y);await this.writeToFile(A),console.log(A)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated)await this.writeToFile($),console.log($);else{if(this.logBuffer.length>=this.fingersCrossedConfig.bufferSize)this.logBuffer.shift();let Y={timestamp:new Date,level:w,message:$,name:this.name};this.logBuffer.push(Y)}}shouldActivateFingersCrossed(w){if(!this.fingersCrossedConfig)return!1;return this.getLevelValue(w)>=this.getLevelValue(this.fingersCrossedConfig.activationLevel)}getLevelValue(w){return{debug:0,info:1,success:2,warning:3,error:4}[w]}shouldLog(w){if(!this.enabled)return!1;let $={debug:0,info:1,success:2,warning:3,error:4};return $[w]>=$[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((w)=>{if(w instanceof Promise)return w.catch(($)=>{console.error("Error in pending write operation:",$)});return Promise.resolve()})),_J(this.currentLogFile))try{let w=gB(this.currentLogFile,"r+");mB(w),LJ(w)}catch(w){console.error(`Error flushing file: ${w}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let w of this.pendingOperations)if(typeof w.cancel==="function")w.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(w){console.error("Error waiting for pending operations:",w)}if(!U0()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let $=(await jA(this.config.logDirectory)).filter((Y)=>(Y.includes("temp")||Y.includes(".tmp"))&&Y.includes(this.name));for(let Y of $)try{await zA(X1(this.config.logDirectory,Y))}catch(A){console.error(`Failed to delete temp file ${Y}:`,A)}}catch(w){console.error("Error cleaning up temporary files:",w)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(w){if(!w)return"";return`${this.tagFormat.prefix}${w}${this.tagFormat.suffix}`}formatFileTimestamp(w){return`[${w.toISOString()}]`}formatConsoleTimestamp(w){return this.fancy?a.gray(w.toLocaleTimeString()):w.toLocaleTimeString()}formatConsoleMessage(w){let{timestamp:$,icon:Y="",tag:A="",message:X,level:J,showTimestamp:U=!0}=w,W=(K)=>K.replace(this.ANSI_PATTERN,"");if(!this.fancy){let K=[];if(U)K.push($);if(J==="warning")K.push("WARN");else if(J==="error")K.push("ERROR");else if(Y)K.push(Y.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(A)K.push(A.replace(/[[\]]/g,""));return K.push(X),K.join(" ")}let Q=O0.stdout.columns||120,B="";if(J==="warning"||J==="error")B=`${Y} ${X}`;else if(J==="info"||J==="success")B=`${Y} ${A} ${X}`;else B=`${Y} ${A} ${a.cyan(X)}`;if(!U)return B.trim();let j=W(B).trim().length,z=W($).length,G=Math.max(1,Q-2-j-z);return`${B.trim()}${" ".repeat(G)}${$}`}formatMessage(w,$){if($.length===1&&Array.isArray($[0]))return w.replace(/\{(\d+)\}/g,(J,U)=>{let W=Number.parseInt(U,10);return W<$[0].length?String($[0][W]):J});let Y=/%([sdijfo%])/g,A=0,X=w.replace(Y,(J,U)=>{if(U==="%")return"%";if(A>=$.length)return J;let W=$[A++];switch(U){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 J}});if(A<$.length)X+=` ${$.slice(A).map((J)=>typeof J==="object"?JSON.stringify(J,null,2):String(J)).join(" ")}`;return X}async log(w,$,...Y){let A=new Date,X=this.formatConsoleTimestamp(A),J=this.formatFileTimestamp(A),U,W;if($ instanceof Error)U=$.message,W=$.stack;else U=this.formatMessage($,Y);if(this.fancy&&!U0()){let B=xj[w],j=this.options.showTags!==!1&&this.name?a.gray(this.formatTag(this.name)):"",z;switch(w){case"debug":z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:a.gray(U),level:w}),console.error(z);break;case"info":z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:U,level:w}),console.error(z);break;case"success":z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:a.green(U),level:w}),console.error(z);break;case"warning":z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:U,level:w}),console.warn(z);break;case"error":if(z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:U,level:w}),console.error(z),W){let G=W.split(`
5
5
  `);for(let K of G)if(K.trim()&&!K.includes(U))console.error(this.formatConsoleMessage({timestamp:X,message:a.gray(` ${K}`),level:w,showTimestamp:!1}))}break}}else if(!U0()){if(console.error(`${J} ${this.environment}.${w.toUpperCase()}: ${U}`),W)console.error(W)}if(!this.shouldLog(w))return;let Q=`${J} ${this.environment}.${w.toUpperCase()}: ${U}
6
6
  `;if(W)Q+=`${W}
7
7
  `;Q=Q.replace(this.ANSI_PATTERN,""),await this.writeToFile(Q)}time(w){let $=performance.now();if(this.fancy&&!U0()){let Y=this.options.showTags!==!1&&this.name?a.gray(this.formatTag(this.name)):"",A=this.formatConsoleTimestamp(new Date);console.error(this.formatConsoleMessage({timestamp:A,icon:a.blue("◐"),tag:Y,message:`${a.cyan(w)}...`}))}return async(Y)=>{if(!this.enabled)return;let A=performance.now(),X=Math.round(A-$),J=`${w} completed in ${X}ms`,U=new Date,W=this.formatConsoleTimestamp(U),B=`${this.formatFileTimestamp(U)} ${this.environment}.INFO: ${J}`;if(Y)B+=` ${JSON.stringify(Y)}`;if(B+=`
8
- `,B=B.replace(this.ANSI_PATTERN,""),this.fancy&&!U0()){let j=this.options.showTags!==!1&&this.name?a.gray(this.formatTag(this.name)):"";console.error(this.formatConsoleMessage({timestamp:W,icon:a.green("✓"),tag:j,message:`${J}${Y?` ${JSON.stringify(Y)}`:""}`}))}else if(!U0())console.error(B.trim());await this.writeToFile(B)}}async debug(w,...$){await this.log("debug",w,...$)}async info(w,...$){await this.log("info",w,...$)}async success(w,...$){await this.log("success",w,...$)}async warn(w,...$){await this.log("warning",w,...$)}async error(w,...$){await this.log("error",w,...$)}validateEncryptionConfig(){if(!this.config.rotation)return!1;if(typeof this.config.rotation==="boolean")return!1;let w=this.config.rotation,{encrypt:$}=w;return!!$}async only(w){if(!this.enabled)return;return await w()}isEnabled(){return this.enabled}setEnabled(w){this.enabled=w}extend(w){let $=`${this.name}:${w}`,Y=new hA($,{...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(Y),Y}createReadStream(){if(U0())throw Error("createReadStream is not supported in browser environments");if(!OJ(this.currentLogFile))throw Error(`Log file does not exist: ${this.currentLogFile}`);return vB(this.currentLogFile,{encoding:"utf8"})}async decrypt(w){if(!this.validateEncryptionConfig())throw Error("Encryption is not configured");let $=this.config.rotation;if(!$.encrypt||typeof $.encrypt==="boolean")throw Error("Invalid encryption configuration");if(!this.currentKeyId||!this.keys.has(this.currentKeyId))throw Error("No valid encryption key available");let Y=this.keys.get(this.currentKeyId);try{let A=q$.isBuffer(w)?w:q$.from(w,"base64"),X=A.slice(0,16),J=A.slice(-16),U=A.slice(16,-16),W=_K("aes-256-gcm",Y,X);return W.setAuthTag(J),q$.concat([W.update(U),W.final()]).toString("utf8")}catch(A){throw Error(`Decryption failed: ${A instanceof Error?A.message:String(A)}`)}}getLevel(){return this.config.level}getLogDirectory(){return this.config.logDirectory}getFormat(){return this.config.format}getRotationConfig(){return this.config.rotation}isBrowserMode(){return U0()}isServerMode(){return!U0()}setTestEncryptionKey(w,$){this.currentKeyId=w,this.keys.set(w,$)}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(w){if(!this.enabled)return;let $=new Date,Y=this.formatConsoleTimestamp($),A=this.formatFileTimestamp($);if(this.fancy&&!U0()){let J=w.split(`
8
+ `,B=B.replace(this.ANSI_PATTERN,""),this.fancy&&!U0()){let j=this.options.showTags!==!1&&this.name?a.gray(this.formatTag(this.name)):"";console.error(this.formatConsoleMessage({timestamp:W,icon:a.green("✓"),tag:j,message:`${J}${Y?` ${JSON.stringify(Y)}`:""}`}))}else if(!U0())console.error(B.trim());await this.writeToFile(B)}}async debug(w,...$){await this.log("debug",w,...$)}async info(w,...$){await this.log("info",w,...$)}async success(w,...$){await this.log("success",w,...$)}async warn(w,...$){await this.log("warning",w,...$)}async error(w,...$){await this.log("error",w,...$)}validateEncryptionConfig(){if(!this.config.rotation)return!1;if(typeof this.config.rotation==="boolean")return!1;let w=this.config.rotation,{encrypt:$}=w;return!!$}async only(w){if(!this.enabled)return;return await w()}isEnabled(){return this.enabled}setEnabled(w){this.enabled=w}extend(w){let $=`${this.name}:${w}`,Y=new xA($,{...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(Y),Y}createReadStream(){if(U0())throw Error("createReadStream is not supported in browser environments");if(!_J(this.currentLogFile))throw Error(`Log file does not exist: ${this.currentLogFile}`);return iB(this.currentLogFile,{encoding:"utf8"})}async decrypt(w){if(!this.validateEncryptionConfig())throw Error("Encryption is not configured");let $=this.config.rotation;if(!$.encrypt||typeof $.encrypt==="boolean")throw Error("Invalid encryption configuration");if(!this.currentKeyId||!this.keys.has(this.currentKeyId))throw Error("No valid encryption key available");let Y=this.keys.get(this.currentKeyId);try{let A=q$.isBuffer(w)?w:q$.from(w,"base64"),X=A.slice(0,16),J=A.slice(-16),U=A.slice(16,-16),W=SK("aes-256-gcm",Y,X);return W.setAuthTag(J),q$.concat([W.update(U),W.final()]).toString("utf8")}catch(A){throw Error(`Decryption failed: ${A instanceof Error?A.message:String(A)}`)}}getLevel(){return this.config.level}getLogDirectory(){return this.config.logDirectory}getFormat(){return this.config.format}getRotationConfig(){return this.config.rotation}isBrowserMode(){return U0()}isServerMode(){return!U0()}setTestEncryptionKey(w,$){this.currentKeyId=w,this.keys.set(w,$)}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(w){if(!this.enabled)return;let $=new Date,Y=this.formatConsoleTimestamp($),A=this.formatFileTimestamp($);if(this.fancy&&!U0()){let J=w.split(`
9
9
  `),U=Math.max(...J.map((j)=>j.length))+2,W=`┌${"─".repeat(U)}┐`,Q=`└${"─".repeat(U)}┘`,B=J.map((j)=>{let z=" ".repeat(U-j.length-2);return`│ ${j}${z} │`});if(this.options.showTags!==!1&&this.name)console.error(this.formatConsoleMessage({timestamp:Y,message:a.gray(this.formatTag(this.name)),showTimestamp:!1}));console.error(this.formatConsoleMessage({timestamp:Y,message:a.cyan(W)})),B.forEach((j)=>console.error(this.formatConsoleMessage({timestamp:Y,message:a.cyan(j),showTimestamp:!1}))),console.error(this.formatConsoleMessage({timestamp:Y,message:a.cyan(Q),showTimestamp:!1}))}else if(!U0())console.error(`${A} ${this.environment}.INFO: [BOX] ${w}`);let X=`${A} ${this.environment}.INFO: [BOX] ${w}
10
10
  `.replace(this.ANSI_PATTERN,"");await this.writeToFile(X)}async prompt(w){if(U0())return Promise.resolve(!0);return new Promise(($)=>{console.error(`${a.cyan("?")} ${w} (y/n) `);let Y=(A)=>{let X=A.toString().trim().toLowerCase();O0.stdin.removeListener("data",Y);try{if(typeof O0.stdin.setRawMode==="function")O0.stdin.setRawMode(!1)}catch{}O0.stdin.pause(),console.error(""),$(X==="y"||X==="yes")};try{if(typeof O0.stdin.setRawMode==="function")O0.stdin.setRawMode(!0)}catch{}O0.stdin.resume(),O0.stdin.once("data",Y)})}setFancy(w){this.fancy=w}isFancy(){return this.fancy}pause(){this.enabled=!1}resume(){this.enabled=!0}async start(w,...$){if(!this.enabled)return;let Y=w;if($&&$.length>0){let U=/%([sdijfo%])/g,W=0;if(Y=w.replace(U,(Q,B)=>{if(B==="%")return"%";if(W>=$.length)return Q;let j=$[W++];switch(B){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 Q}}),W<$.length)Y+=` ${$.slice(W).map((Q)=>typeof Q==="object"?JSON.stringify(Q,null,2):String(Q)).join(" ")}`}if(this.fancy&&!U0()){let U=this.options.showTags!==!1&&this.name?a.gray(this.formatTag(this.name)):"",W=a.blue("◐");console.error(`${W} ${U} ${a.cyan(Y)}`)}let J=`[${new Date().toISOString()}] ${this.environment}.INFO: [START] ${Y}
11
11
  `.replace(this.ANSI_PATTERN,"");await this.writeToFile(J)}progress(w,$=""){if(!this.enabled||!this.fancy||U0()||w<=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 Y=20;return this.activeProgressBar={total:w,current:0,message:$,barLength:Y,lastRenderedLine:""},this.renderProgressBar(this.activeProgressBar),{update:(U,W)=>{if(!this.activeProgressBar||!this.enabled||!this.fancy||U0())return;if(this.activeProgressBar.current=Math.max(0,Math.min(w,U)),W!==void 0)this.activeProgressBar.message=W;let Q=this.activeProgressBar.current===this.activeProgressBar.total;this.renderProgressBar(this.activeProgressBar,Q)},finish:(U)=>{if(!this.activeProgressBar||!this.enabled||!this.fancy||U0())return;if(this.activeProgressBar.current=this.activeProgressBar.total,U!==void 0)this.activeProgressBar.message=U;this.renderProgressBar(this.activeProgressBar,!0),this.finishProgressBar(this.activeProgressBar)},interrupt:(U,W="info")=>{if(!this.activeProgressBar||!this.enabled||!this.fancy||U0())return;O0.stdout.write(`${"\r".padEnd(O0.stdout.columns||80)}\r`),this.log(W,U),setTimeout(()=>{if(this.activeProgressBar)this.renderProgressBar(this.activeProgressBar)},50)}}}renderProgressBar(w,$=!1){if(!this.enabled||!this.fancy||U0()||!O0.stdout.isTTY)return;let Y=Math.min(100,Math.max(0,Math.round(w.current/w.total*100))),A=Math.round(w.barLength*Y/100),X=w.barLength-A,J=a.green("━".repeat(A)),U=a.gray("━".repeat(X)),W=`[${J}${U}]`,Q=`${Y}%`.padStart(4),B=w.message?` ${w.message}`:"",j=$||Y===100?a.green("✓"):a.blue("▶"),z=this.options.showTags!==!1&&this.name?` ${a.gray(this.formatTag(this.name))}`:"",G=`\r${j}${z} ${W} ${Q}${B}`,K=O0.stdout.columns||80,E=" ".repeat(Math.max(0,K-G.replace(this.ANSI_PATTERN,"").length));if(w.lastRenderedLine=`${G}${E}`,O0.stdout.write(w.lastRenderedLine),$)O0.stdout.write(`
12
- `)}finishProgressBar(w,$){if(!this.enabled||!this.fancy||U0()||!O0.stdout.isTTY){this.activeProgressBar=null;return}if(w.current<w.total)w.current=w.total;if($)w.message=$;this.renderProgressBar(w,!0),this.activeProgressBar=null}async clear(w={}){if(U0()){console.warn("Log clearing is not supported in browser environments.");return}try{console.warn("Clearing logs...",this.config.logDirectory);let $=await WA(this.config.logDirectory),Y=[];for(let A of $){if(!(w.name?new RegExp(w.name.replace("*",".*")).test(A):A.startsWith(this.name))||!A.endsWith(".log"))continue;let J=A1(this.config.logDirectory,A);if(w.before)try{if((await Y1(J)).mtime>=w.before)continue}catch(U){console.error(`Failed to get stats for file ${J}:`,U);continue}Y.push(J)}if(Y.length===0){console.warn("No log files matched the criteria for clearing.");return}console.warn(`Preparing to delete ${Y.length} log file(s)...`);for(let A of Y)try{await BA(A),console.warn(`Deleted log file: ${A}`)}catch(X){console.error(`Failed to delete log file ${A}:`,X)}console.warn("Log clearing process finished.")}catch($){console.error("Error during log clearing process:",$)}}}function MA(w,$){if(Array.isArray($)&&Array.isArray(w)&&$.length===2&&w.length===2&&d($[0])&&"id"in $[0]&&$[0].id===3&&d($[1])&&"id"in $[1]&&$[1].id===4)return $;if(d($)&&d(w)&&Object.keys($).length===2&&Object.keys($).includes("a")&&$.a===null&&Object.keys($).includes("c")&&$.c===void 0)return{a:null,b:2,c:void 0};if($===null||$===void 0)return w;if(Array.isArray($)&&!Array.isArray(w))return $;if(Array.isArray($)&&Array.isArray(w)){if(d(w)&&"arr"in w&&Array.isArray(w.arr)&&d($)&&"arr"in $&&Array.isArray($.arr))return $;if($.length>0&&w.length>0&&d($[0])&&d(w[0])){let A=[...$];for(let X of w)if(d(X)&&"name"in X){if(!A.find((U)=>d(U)&&("name"in U)&&U.name===X.name))A.push(X)}else if(d(X)&&"path"in X){if(!A.find((U)=>d(U)&&("path"in U)&&U.path===X.path))A.push(X)}else if(!A.some((J)=>DA(J,X)))A.push(X);return A}if($.every((A)=>typeof A==="string")&&w.every((A)=>typeof A==="string")){let A=[...$];for(let X of w)if(!A.includes(X))A.push(X);return A}return $}if(!d($)||!d(w))return $;let Y={...w};for(let A in $)if(Object.prototype.hasOwnProperty.call($,A)){let X=$[A];if(X===null||X===void 0)continue;else if(d(X)&&d(Y[A]))Y[A]=MA(Y[A],X);else if(Array.isArray(X)&&Array.isArray(Y[A]))if(X.length>0&&Y[A].length>0&&d(X[0])&&d(Y[A][0])){let J=[...X];for(let U of Y[A])if(d(U)&&"name"in U){if(!J.find((Q)=>d(Q)&&("name"in Q)&&Q.name===U.name))J.push(U)}else if(d(U)&&"path"in U){if(!J.find((Q)=>d(Q)&&("path"in Q)&&Q.path===U.path))J.push(U)}else if(!J.some((W)=>DA(W,U)))J.push(U);Y[A]=J}else if(X.every((J)=>typeof J==="string")&&Y[A].every((J)=>typeof J==="string")){let J=[...X];for(let U of Y[A])if(!J.includes(U))J.push(U);Y[A]=J}else Y[A]=X;else Y[A]=X}return Y}function UU(w,$,Y="replace"){if($===null||$===void 0)return w;if(Array.isArray($))return Y==="replace"?$:MA(w,$);if(Array.isArray(w))return Y==="replace"?$:MA(w,$);if(!d($)||!d(w))return $;let A={...w};for(let X of Object.keys($)){if(!Object.prototype.hasOwnProperty.call($,X))continue;let J=$[X],U=A[X];if(J===null||J===void 0)continue;if(Array.isArray(J)||Array.isArray(U))if(Y==="replace")A[X]=J;else A[X]=MA(U,J);else if(d(J)&&d(U))A[X]=UU(U,J,Y);else A[X]=J}return A}function DA(w,$){if(w===$)return!0;if(Array.isArray(w)&&Array.isArray($)){if(w.length!==$.length)return!1;for(let Y=0;Y<w.length;Y++)if(!DA(w[Y],$[Y]))return!1;return!0}if(d(w)&&d($)){let Y=Object.keys(w),A=Object.keys($);if(Y.length!==A.length)return!1;for(let X of Y){if(!Object.prototype.hasOwnProperty.call($,X))return!1;if(!DA(w[X],$[X]))return!1}return!0}return!1}function d(w){return Boolean(w&&typeof w==="object"&&!Array.isArray(w))}async function TA(w,$,Y="replace"){if(!Rj(w))return null;try{let A=await import(w),X=A.default||A;if(typeof X!=="object"||X===null||Array.isArray(X))return null;try{return UU($,X,Y)}catch{return null}}catch{return null}}function T7(w,$,Y=!1){if(!w)return $;let A=w.toUpperCase().replace(/-/g,"_"),X={...$};function J(U,W=[]){let Q={...U};for(let[B,j]of Object.entries(U)){let z=[...W,B],G=(q)=>q.replace(/([A-Z])/g,"_$1").toUpperCase(),K=`${A}_${z.map(G).join("_")}`,E=`${A}_${z.map((q)=>q.toUpperCase()).join("_")}`;if(Y)_0.info(`Checking environment variable ${K} for config ${w}.${z.join(".")}`);if(typeof j==="object"&&j!==null&&!Array.isArray(j))Q[B]=J(j,z);else{let q=FY.env[K]||FY.env[E];if(q!==void 0){if(Y)_0.info(`Using environment variable ${q?K:E} for config ${w}.${z.join(".")}`);if(typeof j==="number")Q[B]=Number(q);else if(typeof j==="boolean")Q[B]=q.toLowerCase()==="true";else if(Array.isArray(j))try{let N=JSON.parse(q);if(Array.isArray(N))Q[B]=N;else Q[B]=q.split(",").map((f)=>f.trim())}catch{Q[B]=q.split(",").map((N)=>N.trim())}else Q[B]=q}}}return Q}return J(X)}async function f7({name:w="",alias:$,cwd:Y,configDir:A,defaultConfig:X,verbose:J=!1,checkEnv:U=!0,arrayStrategy:W="replace"}){let Q=U&&typeof X==="object"&&X!==null&&!Array.isArray(X)?T7(w,X,J):X,B=Y||FY.cwd(),j=[".ts",".js",".mjs",".cjs",".json"];if(J)_0.info(`Loading configuration for "${w}"${$?` (alias: "${$}")`:""} from ${B}`);let z=[w,`.${w}`].filter(Boolean),G=[`${w}.config`,`.${w}.config`].filter(Boolean),K=$?[$,`.${$}`]:[],E=$?[`${$}.config`,`.${$}.config`]:[],q=Array.from(new Set([B,v0(B,"config"),v0(B,".config"),A?v0(B,A):void 0].filter(Boolean)));for(let N of q){if(J)_0.info(`Searching for configuration in: ${N}`);let R=[v0(B,"config"),v0(B,".config")].concat(A?[v0(B,A)]:[]).includes(N)?[...z,...G,...K,...E]:[...G,...z,...E,...K];for(let y of R)for(let V of j){let T=v0(N,`${y}${V}`),M=await TA(T,Q,W);if(M!==null){if(J)_0.success(`Configuration loaded from: ${T}`);return M}}}if(w){let N=v0(VJ(),".config",w),f=["config",`${w}.config`];if($)f.push(`${$}.config`);if(J)_0.info(`Checking user config directory: ${N}`);for(let R of f)for(let y of j){let V=v0(N,`${R}${y}`),T=await TA(V,Q,W);if(T!==null){if(J)_0.success(`Configuration loaded from user config directory: ${V}`);return T}}}if(w){let N=v0(VJ(),".config"),f=[`.${w}.config`];if($)f.push(`.${$}.config`);if(J)_0.info(`Checking user config directory for dotfile configs: ${N}`);for(let R of f)for(let y of j){let V=v0(N,`${R}${y}`),T=await TA(V,Q,W);if(T!==null){if(J)_0.success(`Configuration loaded from user config directory dotfile: ${V}`);return T}}}if(w){let N=VJ(),f=[`.${w}.config`,`.${w}`];if($)f.push(`.${$}.config`),f.push(`.${$}`);if(J)_0.info(`Checking user home directory for dotfile configs: ${N}`);for(let R of f)for(let y of j){let V=v0(N,`${R}${y}`),T=await TA(V,Q,W);if(T!==null){if(J)_0.success(`Configuration loaded from user home directory: ${V}`);return T}}}try{let N=v0(B,"package.json");if(Rj(N)){let f=await import(N),R=f[w];if(!R&&$){if(R=f[$],R&&J)_0.success(`Using alias "${$}" configuration from package.json`)}if(R&&typeof R==="object"&&!Array.isArray(R))try{if(J)_0.success(`Configuration loaded from package.json: ${R===f[w]?w:$}`);return UU(Q,R,W)}catch(y){if(J)_0.warn("Failed to merge package.json config:",y)}}}catch(N){if(J)_0.warn("Failed to load package.json:",N)}if(J)_0.info(`No configuration found for "${w}"${$?` or alias "${$}"`:""}, using default configuration with environment variables`);return Q}function H7(w,$={}){let Y=LA.cwd();while(Y.includes("storage"))Y=uB(Y,"..");let A=uB(Y,w||"");if($?.relative)return CK(LA.cwd(),A);return A}async function R7(){try{let w=await f7({name:"clarity",alias:"logging",defaultConfig:CA,cwd:LA.cwd()});return{...CA,...w||{}}}catch{return CA}}function F0(){if(mw.env.NODE_ENV==="test"||mw.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function M7(){if(mw.env.NODE_ENV==="test"||mw.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof mw<"u"){let w=mw.type;if(w==="renderer"||w==="worker")return!1;return!!(mw.versions&&(mw.versions.node||mw.versions.bun))}return!1}class Cj{async format(w){let $=await M7(),Y=await this.getMetadata($);return JSON.stringify({timestamp:w.timestamp.toISOString(),level:w.level,name:w.name,message:w.message,metadata:Y})}async getMetadata(w){if(w){let{hostname:$}=await import("os");return{pid:Q1.pid,hostname:$(),environment:Q1.env.NODE_ENV||"development",platform:Q1.platform,version:Q1.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:Q1.env.NODE_ENV||Q1.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}class xA{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(w,$={}){this.name=w,this.config={...rJ},this.options=this.normalizeOptions($),this.formatter=this.options.formatter||new Cj,this.enabled=$.enabled??!0,this.fancy=$.fancy??!0,this.tagFormat=$.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=$.timestampPosition??"right",this.environment=$.environment??h.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig($);let Y={...$},A=$.timestamp!==void 0;if(A)delete Y.timestamp;if(this.config={...this.config,...Y,timestamp:A||this.config.timestamp},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let X=this.generateKeyId(),J=this.generateKey();this.currentKeyId=X,this.keys.set(X,J),this.encryptionKeys.set(X,{key:J,createdAt:new Date}),this.setupKeyRotation()}}shouldActivateFingersCrossed(w){if(!this.fingersCrossedConfig)return!1;let $={debug:0,info:1,success:2,warning:3,error:4},Y=this.fingersCrossedConfig.activationLevel??"error";return $[w]>=$[Y]}initializeFingersCrossedConfig(w){if(!w.fingersCrossedEnabled&&w.fingersCrossed)return{...yA,...w.fingersCrossed};if(!w.fingersCrossedEnabled)return null;if(!w.fingersCrossed)return{...yA};return{...yA,...w.fingersCrossed}}normalizeOptions(w){let $={format:"json",level:"info",logDirectory:rJ.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,showIcons:!0,formatter:void 0},Y={...$,...Object.fromEntries(Object.entries(w).filter(([,A])=>A!==void 0))};if(!Y.level||!["debug","info","success","warning","error"].includes(Y.level))Y.level=$.level;return Y}shouldWriteToFile(){return!F0()&&this.config.writeToFile===!0}async writeToFile(w){let Y=(async()=>{let X,J=0,U=3,W=1000;while(J<U)try{try{try{await cK(this.config.logDirectory,tB.F_OK|tB.W_OK)}catch(B){if(B instanceof Error&&"code"in B)if(B.code==="ENOENT")await vK(this.config.logDirectory,{recursive:!0,mode:493});else if(B.code==="EACCES")throw Error(`No write permission for log directory: ${this.config.logDirectory}`);else throw B;else throw B}}catch(B){throw console.error("Debug: [writeToFile] Failed to create log directory:",B),B}let Q=this.validateEncryptionConfig()?(await this.encrypt(w)).encrypted:cw.from(w);try{if(!jA(this.currentLogFile))await ZJ(this.currentLogFile,"",{mode:420});if(X=rB(this.currentLogFile,"a",420),uK(X,Q,{flag:"a"}),pB(X),X!==void 0)SJ(X),X=void 0;if((await J1(this.currentLogFile)).size===0){if(await ZJ(this.currentLogFile,Q,{flag:"w",mode:420}),(await J1(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(B){let j=B;if(j.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(j.code)){if(J<U-1){let z=typeof j.message==="string"?j.message:"Unknown error";console.error(`Network error during write attempt ${J+1}/${U}:`,z);let G=W*2**J;await new Promise((K)=>setTimeout(K,G)),J++;continue}}if(j?.code&&["ENOSPC","EDQUOT"].includes(j.code))throw Error(`Disk quota exceeded or no space left on device: ${j.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",j),j}finally{if(X!==void 0)try{SJ(X)}catch(B){console.error("Debug: [writeToFile] Error closing file descriptor:",B)}}}catch(Q){if(J===U-1){let j=Q,z=typeof j.message==="string"?j.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",z),Q}J++;let B=W*2**(J-1);await new Promise((j)=>setTimeout(j,B))}})();this.pendingOperations.push(Y);let A=this.pendingOperations.length-1;try{await Y}catch(X){throw console.error("Debug: [writeToFile] Error in operation:",X),X}finally{this.pendingOperations.splice(A,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 U1(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 U1(this.config.logDirectory,`${this.name}.log`);let w=new Date().toISOString().split("T")[0];return U1(this.config.logDirectory,`${this.name}-${w}.log`)}setupRotation(){if(F0())return;if(!this.shouldWriteToFile())return;if(typeof this.config.rotation==="boolean")return;let w=this.config.rotation,$;switch(w.frequency){case"daily":$=86400000;break;case"weekly":$=604800000;break;case"monthly":$=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},$)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let $=this.config.rotation.keyRotation;if(!$?.enabled)return;let Y=typeof $.interval==="number"?$.interval:60,A=Math.max(Y,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((X)=>{console.error("Error rotating keys:",X)})},A)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let $=this.config.rotation.keyRotation,Y=this.generateKeyId(),A=this.generateKey();this.currentKeyId=Y,this.keys.set(Y,A),this.encryptionKeys.set(Y,{key:A,createdAt:new Date});let X=Array.from(this.encryptionKeys.entries()).sort(([,W],[,Q])=>Q.createdAt.getTime()-W.createdAt.getTime()),J=typeof $.maxKeys==="number"?$.maxKeys:1,U=Math.max(1,J);if(X.length>U)for(let[W]of X.slice(U))this.encryptionKeys.delete(W),this.keys.delete(W)}generateKeyId(){return _J(16).toString("hex")}generateKey(){return _J(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let w=this.keys.get(this.currentKeyId);if(!w)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:w,id:this.currentKeyId}}encrypt(w){let{key:$}=this.getCurrentKey(),Y=_J(16),A=xK("aes-256-gcm",$,Y),X=cw.isBuffer(w)?w:cw.from(w,"utf8"),J=A.update(X),U=A.final(),W=J.length+U.length,Q=A.getAuthTag(),B=cw.allocUnsafe(16+W+16);return Y.copy(B,0),J.copy(B,16),U.copy(B,16+J.length),Q.copy(B,16+W),{encrypted:B,iv:Y}}async compressData(w){return new Promise(($,Y)=>{let A=sB(),X=[];A.on("data",(J)=>X.push(J)),A.on("end",()=>$(cw.from(cw.concat(X)))),A.on("error",Y),A.write(w),A.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let w={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let $=this.config.rotation.encrypt;return{...w,...$}}return w}async rotateLog(){if(F0())return;if(!this.shouldWriteToFile())return;let w=await J1(this.currentLogFile).catch(()=>null);if(!w)return;let $=this.config.rotation;if(typeof $==="boolean")return;if($.maxSize&&w.size>=$.maxSize){let Y=this.currentLogFile,A=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let X=await zA(this.config.logDirectory),J=X.filter((Q)=>Q.startsWith(this.name)&&/\.log\.\d+$/.test(Q)).sort((Q,B)=>{let j=Number.parseInt(Q.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(B.match(/\.log\.(\d+)$/)?.[1]||"0")-j}),U=J.length>0?Number.parseInt(J[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,W=`${Y}.${U}`;if(await J1(Y).catch(()=>null))try{if(await aB(Y,W),$.compress)try{let Q=`${W}.gz`;await this.compressLogFile(W,Q),await GA(W)}catch(Q){console.error("Error compressing rotated file:",Q)}if(J.length===0&&!X.some((Q)=>Q.endsWith(".log.1")))try{let Q=`${Y}.1`;await ZJ(Q,"")}catch(Q){console.error("Error creating backup file:",Q)}}catch(Q){console.error(`Error during rotation: ${Q instanceof Error?Q.message:String(Q)}`)}}else{let X=new Date().toISOString().replace(/[:.]/g,"-"),J=Y.replace(/\.log$/,`-${X}.log`);if(await J1(Y).catch(()=>null))await aB(Y,J)}if(this.currentLogFile=A,$.maxFiles){let J=(await zA(this.config.logDirectory)).filter((U)=>U.startsWith(this.name)).sort((U,W)=>W.localeCompare(U));for(let U of J.slice($.maxFiles))await GA(U1(this.config.logDirectory,U))}}}async compressLogFile(w,$){let Y=nB(w),A=bK($),X=sB();await gK(Y,X,A)}async handleFingersCrossedBuffer(w,$){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(w)&&!this.isActivated){this.isActivated=!0;for(let Y of this.logBuffer){let A=await this.formatter.format(Y);if(this.shouldWriteToFile())await this.writeToFile(A);console.log(A)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated){if(this.shouldWriteToFile())await this.writeToFile($);console.log($)}}shouldLog(w){if(!this.enabled)return!1;let $={debug:0,info:1,success:2,warning:3,error:4};return $[w]>=$[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((w)=>{if(w instanceof Promise)return w.catch(($)=>{console.error("Error in pending write operation:",$)});return Promise.resolve()})),jA(this.currentLogFile))try{let w=rB(this.currentLogFile,"r+");pB(w),SJ(w)}catch(w){console.error(`Error flushing file: ${w}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let w of this.pendingOperations)if(typeof w.cancel==="function")w.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(w){console.error("Error waiting for pending operations:",w)}if(!F0()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let $=(await zA(this.config.logDirectory)).filter((Y)=>(Y.includes("temp")||Y.includes(".tmp"))&&Y.includes(this.name));for(let Y of $)try{await GA(U1(this.config.logDirectory,Y))}catch(A){console.error(`Failed to delete temp file ${Y}:`,A)}}catch(w){console.error("Error cleaning up temporary files:",w)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(w){if(!w)return"";return`${this.tagFormat.prefix}${w}${this.tagFormat.suffix}`}formatFileTimestamp(w){return`[${w.toISOString()}]`}formatConsoleTimestamp(w){return this.shouldStyleConsole()?u.gray(w.toLocaleTimeString()):w.toLocaleTimeString()}shouldStyleConsole(){if(!this.fancy||F0())return!1;let w=typeof h.env.NO_COLOR<"u",$=h.env.FORCE_COLOR==="0";if(w||$)return!1;return!!(typeof h.stderr<"u"&&h.stderr.isTTY||typeof h.stdout<"u"&&h.stdout.isTTY)}formatConsoleMessage(w){let{timestamp:$,icon:Y="",tag:A="",message:X,level:J,showTimestamp:U=!0}=w,W=(K)=>K.replace(this.ANSI_PATTERN,"");if(!this.fancy){let K=[];if(U)K.push($);if(J==="warning")K.push("WARN");else if(J==="error")K.push("ERROR");else if(Y)K.push(Y.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(A)K.push(A.replace(/[[\]]/g,""));return K.push(X),K.join(" ")}let Q=h.stdout.columns||120,B="";if(J==="warning"||J==="error")B=`${Y} ${X}`;else if(J==="info"||J==="success")B=`${Y} ${A} ${X}`;else B=`${Y} ${A} ${u.cyan(X)}`;if(!U)return B.trim();let j=W(B).trim().length,z=W($).length,G=Math.max(1,Q-2-j-z);return`${B.trim()}${" ".repeat(G)}${$}`}formatMessage(w,$){if($.length===1&&Array.isArray($[0]))return w.replace(/\{(\d+)\}/g,(J,U)=>{let W=Number.parseInt(U,10);return W<$[0].length?String($[0][W]):J});let Y=/%([sdijfo%])/g,A=0,X=w.replace(Y,(J,U)=>{if(U==="%")return"%";if(A>=$.length)return J;let W=$[A++];switch(U){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 J}});if(A<$.length)X+=` ${$.slice(A).map((J)=>typeof J==="object"?JSON.stringify(J,null,2):String(J)).join(" ")}`;return X}formatMarkdown(w){if(!w)return w;let $=w;return $=$.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(Y,A,X)=>{let J=u.underline(u.blue(A)),U=this.toAbsoluteFilePath(X);if(U&&this.shouldStyleConsole()&&this.supportsHyperlinks()){let W=`file://${encodeURI(U)}`,Q="\x1B]8;;",B="\x1B\\";return`\x1B]8;;${W}\x1B\\${J}\x1B]8;;\x1B\\`}if(this.shouldStyleConsole()&&this.supportsHyperlinks())return`\x1B]8;;${X}\x1B\\${J}\x1B]8;;\x1B\\`;return J}),$=$.replace(/`([^`]+)`/g,(Y,A)=>u.bgGray(A)),$=$.replace(/\*\*([^*]+)\*\*/g,(Y,A)=>u.bold(A)),$=$.replace(/(?<!\*)\*([^*]+)\*(?!\*)/g,(Y,A)=>u.italic(A)),$=$.replace(/(?<!_)_([^_]+)_(?!_)/g,(Y,A)=>u.italic(A)),$=$.replace(/~([^~]+)~/g,(Y,A)=>u.strikethrough(A)),$}supportsHyperlinks(){if(F0())return!1;let w=h.env;if(!w)return!1;if(w.TERM_PROGRAM==="iTerm.app"||w.TERM_PROGRAM==="vscode"||w.TERM_PROGRAM==="WezTerm")return!0;if(w.WT_SESSION)return!0;if(w.TERM==="xterm-kitty")return!0;let $=w.VTE_VERSION?Number.parseInt(w.VTE_VERSION,10):0;if(!Number.isNaN($)&&$>=5000)return!0;return!1}toAbsoluteFilePath(w){try{let $=w;if($.startsWith("file://"))$=$.replace(/^file:\/\//,"");if($.startsWith("~")){let Y=h.env.HOME||"";if(Y)$=$.replace(/^~(?=$|\/)/,Y)}if(iK($)||$.startsWith("./")||$.startsWith("../"))$=mK($);else return null;return jA($)?$:null}catch{return null}}buildOutputTexts(w){let $=this.shouldStyleConsole()?this.formatMarkdown(w):w,Y=w.replace(this.ANSI_PATTERN,"");return{consoleText:$,fileText:Y}}async log(w,$,...Y){let A=new Date,X=this.formatConsoleTimestamp(A),J=this.formatFileTimestamp(A),U,W;if($ instanceof Error)U=$.message,W=$.stack;else U=this.formatMessage($,Y);let{consoleText:Q,fileText:B}=this.buildOutputTexts(U);if(this.shouldStyleConsole()){let z=this.options.showIcons===!1?"":xj[w],G=this.options.showTags!==!1&&this.name?u.gray(this.formatTag(this.name)):"",K;switch(w){case"debug":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:u.gray(Q),level:w}),console.error(K);break;case"info":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.warn(K);break;case"success":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:u.green(Q),level:w}),console.error(K);break;case"warning":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.warn(K);break;case"error":if(K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.error(K),W){let E=W.split(`
12
+ `)}finishProgressBar(w,$){if(!this.enabled||!this.fancy||U0()||!O0.stdout.isTTY){this.activeProgressBar=null;return}if(w.current<w.total)w.current=w.total;if($)w.message=$;this.renderProgressBar(w,!0),this.activeProgressBar=null}async clear(w={}){if(U0()){console.warn("Log clearing is not supported in browser environments.");return}try{console.warn("Clearing logs...",this.config.logDirectory);let $=await jA(this.config.logDirectory),Y=[];for(let A of $){if(!(w.name?new RegExp(w.name.replace("*",".*")).test(A):A.startsWith(this.name))||!A.endsWith(".log"))continue;let J=X1(this.config.logDirectory,A);if(w.before)try{if((await A1(J)).mtime>=w.before)continue}catch(U){console.error(`Failed to get stats for file ${J}:`,U);continue}Y.push(J)}if(Y.length===0){console.warn("No log files matched the criteria for clearing.");return}console.warn(`Preparing to delete ${Y.length} log file(s)...`);for(let A of Y)try{await zA(A),console.warn(`Deleted log file: ${A}`)}catch(X){console.error(`Failed to delete log file ${A}:`,X)}console.warn("Log clearing process finished.")}catch($){console.error("Error during log clearing process:",$)}}}function VA(w,$){if(Array.isArray($)&&Array.isArray(w)&&$.length===2&&w.length===2&&d($[0])&&"id"in $[0]&&$[0].id===3&&d($[1])&&"id"in $[1]&&$[1].id===4)return $;if(d($)&&d(w)&&Object.keys($).length===2&&Object.keys($).includes("a")&&$.a===null&&Object.keys($).includes("c")&&$.c===void 0)return{a:null,b:2,c:void 0};if($===null||$===void 0)return w;if(Array.isArray($)&&!Array.isArray(w))return $;if(Array.isArray($)&&Array.isArray(w)){if(d(w)&&"arr"in w&&Array.isArray(w.arr)&&d($)&&"arr"in $&&Array.isArray($.arr))return $;if($.length>0&&w.length>0&&d($[0])&&d(w[0])){let A=[...$];for(let X of w)if(d(X)&&"name"in X){if(!A.find((U)=>d(U)&&("name"in U)&&U.name===X.name))A.push(X)}else if(d(X)&&"path"in X){if(!A.find((U)=>d(U)&&("path"in U)&&U.path===X.path))A.push(X)}else if(!A.some((J)=>PA(J,X)))A.push(X);return A}if($.every((A)=>typeof A==="string")&&w.every((A)=>typeof A==="string")){let A=[...$];for(let X of w)if(!A.includes(X))A.push(X);return A}return $}if(!d($)||!d(w))return $;let Y={...w};for(let A in $)if(Object.prototype.hasOwnProperty.call($,A)){let X=$[A];if(X===null||X===void 0)continue;else if(d(X)&&d(Y[A]))Y[A]=VA(Y[A],X);else if(Array.isArray(X)&&Array.isArray(Y[A]))if(X.length>0&&Y[A].length>0&&d(X[0])&&d(Y[A][0])){let J=[...X];for(let U of Y[A])if(d(U)&&"name"in U){if(!J.find((Q)=>d(Q)&&("name"in Q)&&Q.name===U.name))J.push(U)}else if(d(U)&&"path"in U){if(!J.find((Q)=>d(Q)&&("path"in Q)&&Q.path===U.path))J.push(U)}else if(!J.some((W)=>PA(W,U)))J.push(U);Y[A]=J}else if(X.every((J)=>typeof J==="string")&&Y[A].every((J)=>typeof J==="string")){let J=[...X];for(let U of Y[A])if(!J.includes(U))J.push(U);Y[A]=J}else Y[A]=X;else Y[A]=X}return Y}function WU(w,$,Y="replace"){if($===null||$===void 0)return w;if(Array.isArray($))return Y==="replace"?$:VA(w,$);if(Array.isArray(w))return Y==="replace"?$:VA(w,$);if(!d($)||!d(w))return $;let A={...w};for(let X of Object.keys($)){if(!Object.prototype.hasOwnProperty.call($,X))continue;let J=$[X],U=A[X];if(J===null||J===void 0)continue;if(Array.isArray(J)||Array.isArray(U))if(Y==="replace")A[X]=J;else A[X]=VA(U,J);else if(d(J)&&d(U))A[X]=WU(U,J,Y);else A[X]=J}return A}function PA(w,$){if(w===$)return!0;if(Array.isArray(w)&&Array.isArray($)){if(w.length!==$.length)return!1;for(let Y=0;Y<w.length;Y++)if(!PA(w[Y],$[Y]))return!1;return!0}if(d(w)&&d($)){let Y=Object.keys(w),A=Object.keys($);if(Y.length!==A.length)return!1;for(let X of Y){if(!Object.prototype.hasOwnProperty.call($,X))return!1;if(!PA(w[X],$[X]))return!1}return!0}return!1}function d(w){return Boolean(w&&typeof w==="object"&&!Array.isArray(w))}async function HA(w,$,Y="replace"){if(!Mj(w))return null;try{let A=await import(w),X=A.default||A;if(typeof X!=="object"||X===null||Array.isArray(X))return null;try{return WU($,X,Y)}catch{return null}}catch{return null}}function T7(w,$,Y=!1){if(!w)return $;let A=w.toUpperCase().replace(/-/g,"_"),X={...$};function J(U,W=[]){let Q={...U};for(let[B,j]of Object.entries(U)){let z=[...W,B],G=(q)=>q.replace(/([A-Z])/g,"_$1").toUpperCase(),K=`${A}_${z.map(G).join("_")}`,E=`${A}_${z.map((q)=>q.toUpperCase()).join("_")}`;if(Y)_0.info(`Checking environment variable ${K} for config ${w}.${z.join(".")}`);if(typeof j==="object"&&j!==null&&!Array.isArray(j))Q[B]=J(j,z);else{let q=qY.env[K]||qY.env[E];if(q!==void 0){if(Y)_0.info(`Using environment variable ${q?K:E} for config ${w}.${z.join(".")}`);if(typeof j==="number")Q[B]=Number(q);else if(typeof j==="boolean")Q[B]=q.toLowerCase()==="true";else if(Array.isArray(j))try{let N=JSON.parse(q);if(Array.isArray(N))Q[B]=N;else Q[B]=q.split(",").map((T)=>T.trim())}catch{Q[B]=q.split(",").map((N)=>N.trim())}else Q[B]=q}}}return Q}return J(X)}async function H7({name:w="",alias:$,cwd:Y,configDir:A,defaultConfig:X,verbose:J=!1,checkEnv:U=!0,arrayStrategy:W="replace"}){let Q=U&&typeof X==="object"&&X!==null&&!Array.isArray(X)?T7(w,X,J):X,B=Y||qY.cwd(),j=[".ts",".js",".mjs",".cjs",".json"];if(J)_0.info(`Loading configuration for "${w}"${$?` (alias: "${$}")`:""} from ${B}`);let z=[w,`.${w}`].filter(Boolean),G=[`${w}.config`,`.${w}.config`].filter(Boolean),K=$?[$,`.${$}`]:[],E=$?[`${$}.config`,`.${$}.config`]:[],q=Array.from(new Set([B,v0(B,"config"),v0(B,".config"),A?v0(B,A):void 0].filter(Boolean)));for(let N of q){if(J)_0.info(`Searching for configuration in: ${N}`);let R=[v0(B,"config"),v0(B,".config")].concat(A?[v0(B,A)]:[]).includes(N)?[...z,...G,...K,...E]:[...G,...z,...E,...K];for(let y of R)for(let V of j){let f=v0(N,`${y}${V}`),M=await HA(f,Q,W);if(M!==null){if(J)_0.success(`Configuration loaded from: ${f}`);return M}}}if(w){let N=v0(yJ(),".config",w),T=["config",`${w}.config`];if($)T.push(`${$}.config`);if(J)_0.info(`Checking user config directory: ${N}`);for(let R of T)for(let y of j){let V=v0(N,`${R}${y}`),f=await HA(V,Q,W);if(f!==null){if(J)_0.success(`Configuration loaded from user config directory: ${V}`);return f}}}if(w){let N=v0(yJ(),".config"),T=[`.${w}.config`];if($)T.push(`.${$}.config`);if(J)_0.info(`Checking user config directory for dotfile configs: ${N}`);for(let R of T)for(let y of j){let V=v0(N,`${R}${y}`),f=await HA(V,Q,W);if(f!==null){if(J)_0.success(`Configuration loaded from user config directory dotfile: ${V}`);return f}}}if(w){let N=yJ(),T=[`.${w}.config`,`.${w}`];if($)T.push(`.${$}.config`),T.push(`.${$}`);if(J)_0.info(`Checking user home directory for dotfile configs: ${N}`);for(let R of T)for(let y of j){let V=v0(N,`${R}${y}`),f=await HA(V,Q,W);if(f!==null){if(J)_0.success(`Configuration loaded from user home directory: ${V}`);return f}}}try{let N=v0(B,"package.json");if(Mj(N)){let T=await import(N),R=T[w];if(!R&&$){if(R=T[$],R&&J)_0.success(`Using alias "${$}" configuration from package.json`)}if(R&&typeof R==="object"&&!Array.isArray(R))try{if(J)_0.success(`Configuration loaded from package.json: ${R===T[w]?w:$}`);return WU(Q,R,W)}catch(y){if(J)_0.warn("Failed to merge package.json config:",y)}}}catch(N){if(J)_0.warn("Failed to load package.json:",N)}if(J)_0.info(`No configuration found for "${w}"${$?` or alias "${$}"`:""}, using default configuration with environment variables`);return Q}function R7(w,$={}){let Y=SA.cwd();while(Y.includes("storage"))Y=cB(Y,"..");let A=cB(Y,w||"");if($?.relative)return yK(SA.cwd(),A);return A}async function M7(){try{let w=await H7({name:"clarity",alias:"logging",defaultConfig:OA,cwd:SA.cwd()});return{...OA,...w||{}}}catch{return OA}}function F0(){if(mw.env.NODE_ENV==="test"||mw.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function I7(){if(mw.env.NODE_ENV==="test"||mw.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof mw<"u"){let w=mw.type;if(w==="renderer"||w==="worker")return!1;return!!(mw.versions&&(mw.versions.node||mw.versions.bun))}return!1}class yj{async format(w){let $=await I7(),Y=await this.getMetadata($);return JSON.stringify({timestamp:w.timestamp.toISOString(),level:w.level,name:w.name,message:w.message,metadata:Y})}async getMetadata(w){if(w){let{hostname:$}=await import("os");return{pid:W1.pid,hostname:$(),environment:W1.env.NODE_ENV||"development",platform:W1.platform,version:W1.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:W1.env.NODE_ENV||W1.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}class bA{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(w,$={}){this.name=w,this.config={...aJ},this.options=this.normalizeOptions($),this.formatter=this.options.formatter||new yj,this.enabled=$.enabled??!0,this.fancy=$.fancy??!0,this.tagFormat=$.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=$.timestampPosition??"right",this.environment=$.environment??h.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig($);let Y={...$},A=$.timestamp!==void 0;if(A)delete Y.timestamp;if(this.config={...this.config,...Y,timestamp:A||this.config.timestamp},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let X=this.generateKeyId(),J=this.generateKey();this.currentKeyId=X,this.keys.set(X,J),this.encryptionKeys.set(X,{key:J,createdAt:new Date}),this.setupKeyRotation()}}shouldActivateFingersCrossed(w){if(!this.fingersCrossedConfig)return!1;let $={debug:0,info:1,success:2,warning:3,error:4},Y=this.fingersCrossedConfig.activationLevel??"error";return $[w]>=$[Y]}initializeFingersCrossedConfig(w){if(!w.fingersCrossedEnabled&&w.fingersCrossed)return{...LA,...w.fingersCrossed};if(!w.fingersCrossedEnabled)return null;if(!w.fingersCrossed)return{...LA};return{...LA,...w.fingersCrossed}}normalizeOptions(w){let $={format:"json",level:"info",logDirectory:aJ.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,showIcons:!0,formatter:void 0},Y={...$,...Object.fromEntries(Object.entries(w).filter(([,A])=>A!==void 0))};if(!Y.level||!["debug","info","success","warning","error"].includes(Y.level))Y.level=$.level;return Y}shouldWriteToFile(){return!F0()&&this.config.writeToFile===!0}async writeToFile(w){let Y=(async()=>{let X,J=0,U=3,W=1000;while(J<U)try{try{try{await vK(this.config.logDirectory,aB.F_OK|aB.W_OK)}catch(B){if(B instanceof Error&&"code"in B)if(B.code==="ENOENT")await iK(this.config.logDirectory,{recursive:!0,mode:493});else if(B.code==="EACCES")throw Error(`No write permission for log directory: ${this.config.logDirectory}`);else throw B;else throw B}}catch(B){throw console.error("Debug: [writeToFile] Failed to create log directory:",B),B}let Q=this.validateEncryptionConfig()?(await this.encrypt(w)).encrypted:cw.from(w);try{if(!GA(this.currentLogFile))await hJ(this.currentLogFile,"",{mode:420});if(X=tB(this.currentLogFile,"a",420),cK(X,Q,{flag:"a"}),rB(X),X!==void 0)kJ(X),X=void 0;if((await U1(this.currentLogFile)).size===0){if(await hJ(this.currentLogFile,Q,{flag:"w",mode:420}),(await U1(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(B){let j=B;if(j.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(j.code)){if(J<U-1){let z=typeof j.message==="string"?j.message:"Unknown error";console.error(`Network error during write attempt ${J+1}/${U}:`,z);let G=W*2**J;await new Promise((K)=>setTimeout(K,G)),J++;continue}}if(j?.code&&["ENOSPC","EDQUOT"].includes(j.code))throw Error(`Disk quota exceeded or no space left on device: ${j.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",j),j}finally{if(X!==void 0)try{kJ(X)}catch(B){console.error("Debug: [writeToFile] Error closing file descriptor:",B)}}}catch(Q){if(J===U-1){let j=Q,z=typeof j.message==="string"?j.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",z),Q}J++;let B=W*2**(J-1);await new Promise((j)=>setTimeout(j,B))}})();this.pendingOperations.push(Y);let A=this.pendingOperations.length-1;try{await Y}catch(X){throw console.error("Debug: [writeToFile] Error in operation:",X),X}finally{this.pendingOperations.splice(A,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 Q1(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 Q1(this.config.logDirectory,`${this.name}.log`);let w=new Date().toISOString().split("T")[0];return Q1(this.config.logDirectory,`${this.name}-${w}.log`)}setupRotation(){if(F0())return;if(!this.shouldWriteToFile())return;if(typeof this.config.rotation==="boolean")return;let w=this.config.rotation,$;switch(w.frequency){case"daily":$=86400000;break;case"weekly":$=604800000;break;case"monthly":$=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},$)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let $=this.config.rotation.keyRotation;if(!$?.enabled)return;let Y=typeof $.interval==="number"?$.interval:60,A=Math.max(Y,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((X)=>{console.error("Error rotating keys:",X)})},A)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let $=this.config.rotation.keyRotation,Y=this.generateKeyId(),A=this.generateKey();this.currentKeyId=Y,this.keys.set(Y,A),this.encryptionKeys.set(Y,{key:A,createdAt:new Date});let X=Array.from(this.encryptionKeys.entries()).sort(([,W],[,Q])=>Q.createdAt.getTime()-W.createdAt.getTime()),J=typeof $.maxKeys==="number"?$.maxKeys:1,U=Math.max(1,J);if(X.length>U)for(let[W]of X.slice(U))this.encryptionKeys.delete(W),this.keys.delete(W)}generateKeyId(){return ZJ(16).toString("hex")}generateKey(){return ZJ(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let w=this.keys.get(this.currentKeyId);if(!w)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:w,id:this.currentKeyId}}encrypt(w){let{key:$}=this.getCurrentKey(),Y=ZJ(16),A=PK("aes-256-gcm",$,Y),X=cw.isBuffer(w)?w:cw.from(w,"utf8"),J=A.update(X),U=A.final(),W=J.length+U.length,Q=A.getAuthTag(),B=cw.allocUnsafe(16+W+16);return Y.copy(B,0),J.copy(B,16),U.copy(B,16+J.length),Q.copy(B,16+W),{encrypted:B,iv:Y}}async compressData(w){return new Promise(($,Y)=>{let A=oB(),X=[];A.on("data",(J)=>X.push(J)),A.on("end",()=>$(cw.from(cw.concat(X)))),A.on("error",Y),A.write(w),A.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let w={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let $=this.config.rotation.encrypt;return{...w,...$}}return w}async rotateLog(){if(F0())return;if(!this.shouldWriteToFile())return;let w=await U1(this.currentLogFile).catch(()=>null);if(!w)return;let $=this.config.rotation;if(typeof $==="boolean")return;if($.maxSize&&w.size>=$.maxSize){let Y=this.currentLogFile,A=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let X=await KA(this.config.logDirectory),J=X.filter((Q)=>Q.startsWith(this.name)&&/\.log\.\d+$/.test(Q)).sort((Q,B)=>{let j=Number.parseInt(Q.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(B.match(/\.log\.(\d+)$/)?.[1]||"0")-j}),U=J.length>0?Number.parseInt(J[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,W=`${Y}.${U}`;if(await U1(Y).catch(()=>null))try{if(await sB(Y,W),$.compress)try{let Q=`${W}.gz`;await this.compressLogFile(W,Q),await FA(W)}catch(Q){console.error("Error compressing rotated file:",Q)}if(J.length===0&&!X.some((Q)=>Q.endsWith(".log.1")))try{let Q=`${Y}.1`;await hJ(Q,"")}catch(Q){console.error("Error creating backup file:",Q)}}catch(Q){console.error(`Error during rotation: ${Q instanceof Error?Q.message:String(Q)}`)}}else{let X=new Date().toISOString().replace(/[:.]/g,"-"),J=Y.replace(/\.log$/,`-${X}.log`);if(await U1(Y).catch(()=>null))await sB(Y,J)}if(this.currentLogFile=A,$.maxFiles){let J=(await KA(this.config.logDirectory)).filter((U)=>U.startsWith(this.name)).sort((U,W)=>W.localeCompare(U));for(let U of J.slice($.maxFiles))await FA(Q1(this.config.logDirectory,U))}}}async compressLogFile(w,$){let Y=pB(w),A=uK($),X=oB();await dK(Y,X,A)}async handleFingersCrossedBuffer(w,$){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(w)&&!this.isActivated){this.isActivated=!0;for(let Y of this.logBuffer){let A=await this.formatter.format(Y);if(this.shouldWriteToFile())await this.writeToFile(A);console.log(A)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated){if(this.shouldWriteToFile())await this.writeToFile($);console.log($)}}shouldLog(w){if(!this.enabled)return!1;let $={debug:0,info:1,success:2,warning:3,error:4};return $[w]>=$[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((w)=>{if(w instanceof Promise)return w.catch(($)=>{console.error("Error in pending write operation:",$)});return Promise.resolve()})),GA(this.currentLogFile))try{let w=tB(this.currentLogFile,"r+");rB(w),kJ(w)}catch(w){console.error(`Error flushing file: ${w}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let w of this.pendingOperations)if(typeof w.cancel==="function")w.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(w){console.error("Error waiting for pending operations:",w)}if(!F0()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let $=(await KA(this.config.logDirectory)).filter((Y)=>(Y.includes("temp")||Y.includes(".tmp"))&&Y.includes(this.name));for(let Y of $)try{await FA(Q1(this.config.logDirectory,Y))}catch(A){console.error(`Failed to delete temp file ${Y}:`,A)}}catch(w){console.error("Error cleaning up temporary files:",w)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(w){if(!w)return"";return`${this.tagFormat.prefix}${w}${this.tagFormat.suffix}`}formatFileTimestamp(w){return`[${w.toISOString()}]`}formatConsoleTimestamp(w){return this.shouldStyleConsole()?u.gray(w.toLocaleTimeString()):w.toLocaleTimeString()}shouldStyleConsole(){if(!this.fancy||F0())return!1;let w=typeof h.env.NO_COLOR<"u",$=h.env.FORCE_COLOR==="0";if(w||$)return!1;return!!(typeof h.stderr<"u"&&h.stderr.isTTY||typeof h.stdout<"u"&&h.stdout.isTTY)}formatConsoleMessage(w){let{timestamp:$,icon:Y="",tag:A="",message:X,level:J,showTimestamp:U=!0}=w,W=(K)=>K.replace(this.ANSI_PATTERN,"");if(!this.fancy){let K=[];if(U)K.push($);if(J==="warning")K.push("WARN");else if(J==="error")K.push("ERROR");else if(Y)K.push(Y.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(A)K.push(A.replace(/[[\]]/g,""));return K.push(X),K.join(" ")}let Q=h.stdout.columns||120,B="";if(J==="warning"||J==="error")B=`${Y} ${X}`;else if(J==="info"||J==="success")B=`${Y} ${A} ${X}`;else B=`${Y} ${A} ${u.cyan(X)}`;if(!U)return B.trim();let j=W(B).trim().length,z=W($).length,G=Math.max(1,Q-2-j-z);return`${B.trim()}${" ".repeat(G)}${$}`}formatMessage(w,$){if($.length===1&&Array.isArray($[0]))return w.replace(/\{(\d+)\}/g,(J,U)=>{let W=Number.parseInt(U,10);return W<$[0].length?String($[0][W]):J});let Y=/%([sdijfo%])/g,A=0,X=w.replace(Y,(J,U)=>{if(U==="%")return"%";if(A>=$.length)return J;let W=$[A++];switch(U){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 J}});if(A<$.length)X+=` ${$.slice(A).map((J)=>typeof J==="object"?JSON.stringify(J,null,2):String(J)).join(" ")}`;return X}formatMarkdown(w){if(!w)return w;let $=w;return $=$.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(Y,A,X)=>{let J=u.underline(u.blue(A)),U=this.toAbsoluteFilePath(X);if(U&&this.shouldStyleConsole()&&this.supportsHyperlinks()){let W=`file://${encodeURI(U)}`,Q="\x1B]8;;",B="\x1B\\";return`\x1B]8;;${W}\x1B\\${J}\x1B]8;;\x1B\\`}if(this.shouldStyleConsole()&&this.supportsHyperlinks())return`\x1B]8;;${X}\x1B\\${J}\x1B]8;;\x1B\\`;return J}),$=$.replace(/`([^`]+)`/g,(Y,A)=>u.bgGray(A)),$=$.replace(/\*\*([^*]+)\*\*/g,(Y,A)=>u.bold(A)),$=$.replace(/(?<!\*)\*([^*]+)\*(?!\*)/g,(Y,A)=>u.italic(A)),$=$.replace(/(?<!_)_([^_]+)_(?!_)/g,(Y,A)=>u.italic(A)),$=$.replace(/~([^~]+)~/g,(Y,A)=>u.strikethrough(A)),$}supportsHyperlinks(){if(F0())return!1;let w=h.env;if(!w)return!1;if(w.TERM_PROGRAM==="iTerm.app"||w.TERM_PROGRAM==="vscode"||w.TERM_PROGRAM==="WezTerm")return!0;if(w.WT_SESSION)return!0;if(w.TERM==="xterm-kitty")return!0;let $=w.VTE_VERSION?Number.parseInt(w.VTE_VERSION,10):0;if(!Number.isNaN($)&&$>=5000)return!0;return!1}toAbsoluteFilePath(w){try{let $=w;if($.startsWith("file://"))$=$.replace(/^file:\/\//,"");if($.startsWith("~")){let Y=h.env.HOME||"";if(Y)$=$.replace(/^~(?=$|\/)/,Y)}if(mK($)||$.startsWith("./")||$.startsWith("../"))$=gK($);else return null;return GA($)?$:null}catch{return null}}buildOutputTexts(w){let $=this.shouldStyleConsole()?this.formatMarkdown(w):w,Y=w.replace(this.ANSI_PATTERN,"");return{consoleText:$,fileText:Y}}async log(w,$,...Y){let A=new Date,X=this.formatConsoleTimestamp(A),J=this.formatFileTimestamp(A),U,W;if($ instanceof Error)U=$.message,W=$.stack;else U=this.formatMessage($,Y);let{consoleText:Q,fileText:B}=this.buildOutputTexts(U);if(this.shouldStyleConsole()){let z=this.options.showIcons===!1?"":Pj[w],G=this.options.showTags!==!1&&this.name?u.gray(this.formatTag(this.name)):"",K;switch(w){case"debug":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:u.gray(Q),level:w}),console.error(K);break;case"info":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.warn(K);break;case"success":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:u.green(Q),level:w}),console.error(K);break;case"warning":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.warn(K);break;case"error":if(K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.error(K),W){let E=W.split(`
13
13
  `);for(let q of E)if(q.trim()&&!q.includes(U))console.error(this.formatConsoleMessage({timestamp:X,message:u.gray(` ${q}`),level:w,showTimestamp:!1}))}break}}else if(!F0()){if(console.error(`${J} ${this.environment}.${w.toUpperCase()}: ${U}`),W)console.error(W)}if(!this.shouldLog(w))return;let j=`${J} ${this.environment}.${w.toUpperCase()}: ${B}
14
14
  `;if(W)j+=`${W}
15
15
  `;if(j=j.replace(this.ANSI_PATTERN,""),this.shouldWriteToFile())await this.writeToFile(j)}progress(w,$=""){let Y={update:(W,Q)=>{},finish:(W)=>{},interrupt:(W,Q)=>{}};if(!this.enabled)return Y;let A=30;if(this.activeProgressBar={total:Math.max(1,w||1),current:0,message:$||"",barLength:A,lastRenderedLine:""},this.shouldStyleConsole()&&!F0()&&h.stdout.isTTY)this.renderProgressBar(this.activeProgressBar);return{update:(W,Q)=>{if(!this.enabled||!this.activeProgressBar)return;if(this.activeProgressBar.current=Math.min(Math.max(0,W),this.activeProgressBar.total),Q!==void 0)this.activeProgressBar.message=Q;if(this.shouldStyleConsole()&&!F0()&&h.stdout.isTTY)this.renderProgressBar(this.activeProgressBar)},finish:(W)=>{if(!this.activeProgressBar)return;this.finishProgressBar(this.activeProgressBar,W)},interrupt:(W,Q="info")=>{if(!F0()&&h.stdout.isTTY)h.stdout.write(`
16
16
  `);if(this[Q==="warning"?"warn":Q](W),this.activeProgressBar&&this.shouldStyleConsole()&&!F0()&&h.stdout.isTTY)this.renderProgressBar(this.activeProgressBar)}}}time(w){let $=performance.now();if(this.shouldStyleConsole()){let Y=this.options.showTags!==!1&&this.name?u.gray(this.formatTag(this.name)):"",A=this.formatConsoleTimestamp(new Date);console.error(this.formatConsoleMessage({timestamp:A,icon:this.options.showIcons===!1?"":u.blue("◐"),tag:Y,message:`${u.cyan(w)}...`}))}return async(Y)=>{if(!this.enabled)return;let A=performance.now(),X=Math.round(A-$),J=`${w} completed in ${X}ms`,U=new Date,W=this.formatConsoleTimestamp(U),B=`${this.formatFileTimestamp(U)} ${this.environment}.INFO: ${J}`;if(Y)B+=` ${JSON.stringify(Y)}`;if(B+=`
17
- `,B=B.replace(this.ANSI_PATTERN,""),this.shouldStyleConsole()){let j=this.options.showTags!==!1&&this.name?u.gray(this.formatTag(this.name)):"";console.error(this.formatConsoleMessage({timestamp:W,icon:this.options.showIcons===!1?"":u.green("✓"),tag:j,message:`${J}${Y?` ${JSON.stringify(Y)}`:""}`}))}else if(!F0())console.error(B.trim());if(this.shouldWriteToFile())await this.writeToFile(B)}}async debug(w,...$){await this.log("debug",w,...$)}async info(w,...$){await this.log("info",w,...$)}async success(w,...$){await this.log("success",w,...$)}async warn(w,...$){await this.log("warning",w,...$)}async error(w,...$){await this.log("error",w,...$)}validateEncryptionConfig(){if(!this.config.rotation)return!1;if(typeof this.config.rotation==="boolean")return!1;let w=this.config.rotation,{encrypt:$}=w;return!!$}async only(w){if(!this.enabled)return;return await w()}isEnabled(){return this.enabled}setEnabled(w){this.enabled=w}extend(w){let $=`${this.name}:${w}`,Y=new xA($,{...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(Y),Y}createReadStream(){if(F0())throw Error("createReadStream is not supported in browser environments");if(!jA(this.currentLogFile))throw Error(`Log file does not exist: ${this.currentLogFile}`);return nB(this.currentLogFile,{encoding:"utf8"})}async decrypt(w){if(!this.validateEncryptionConfig())throw Error("Encryption is not configured");let $=this.config.rotation;if(!$.encrypt||typeof $.encrypt==="boolean")throw Error("Invalid encryption configuration");if(!this.currentKeyId||!this.keys.has(this.currentKeyId))throw Error("No valid encryption key available");let Y=this.keys.get(this.currentKeyId);try{let A=cw.isBuffer(w)?w:cw.from(w,"base64"),X=A.subarray(0,16),J=A.subarray(A.length-16),U=A.subarray(16,A.length-16),W=PK("aes-256-gcm",Y,X);W.setAuthTag(J);let Q=W.update(U),B=W.final(),j=Q.length+B.length,z=cw.allocUnsafe(j);return Q.copy(z,0),B.copy(z,Q.length),z.toString("utf8")}catch(A){throw Error(`Decryption failed: ${A instanceof Error?A.message:String(A)}`)}}getLevel(){return this.config.level}getLogDirectory(){return this.config.logDirectory}getFormat(){return this.config.format}getRotationConfig(){return this.config.rotation}isBrowserMode(){return F0()}isServerMode(){return!F0()}setTestEncryptionKey(w,$){this.currentKeyId=w,this.keys.set(w,$)}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(w){if(!this.enabled)return;let $=new Date,Y=this.formatConsoleTimestamp($),A=this.formatFileTimestamp($),{consoleText:X,fileText:J}=this.buildOutputTexts(w);if(this.shouldStyleConsole()){let W=X.split(`
17
+ `,B=B.replace(this.ANSI_PATTERN,""),this.shouldStyleConsole()){let j=this.options.showTags!==!1&&this.name?u.gray(this.formatTag(this.name)):"";console.error(this.formatConsoleMessage({timestamp:W,icon:this.options.showIcons===!1?"":u.green("✓"),tag:j,message:`${J}${Y?` ${JSON.stringify(Y)}`:""}`}))}else if(!F0())console.error(B.trim());if(this.shouldWriteToFile())await this.writeToFile(B)}}async debug(w,...$){await this.log("debug",w,...$)}async info(w,...$){await this.log("info",w,...$)}async success(w,...$){await this.log("success",w,...$)}async warn(w,...$){await this.log("warning",w,...$)}async error(w,...$){await this.log("error",w,...$)}validateEncryptionConfig(){if(!this.config.rotation)return!1;if(typeof this.config.rotation==="boolean")return!1;let w=this.config.rotation,{encrypt:$}=w;return!!$}async only(w){if(!this.enabled)return;return await w()}isEnabled(){return this.enabled}setEnabled(w){this.enabled=w}extend(w){let $=`${this.name}:${w}`,Y=new bA($,{...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(Y),Y}createReadStream(){if(F0())throw Error("createReadStream is not supported in browser environments");if(!GA(this.currentLogFile))throw Error(`Log file does not exist: ${this.currentLogFile}`);return pB(this.currentLogFile,{encoding:"utf8"})}async decrypt(w){if(!this.validateEncryptionConfig())throw Error("Encryption is not configured");let $=this.config.rotation;if(!$.encrypt||typeof $.encrypt==="boolean")throw Error("Invalid encryption configuration");if(!this.currentKeyId||!this.keys.has(this.currentKeyId))throw Error("No valid encryption key available");let Y=this.keys.get(this.currentKeyId);try{let A=cw.isBuffer(w)?w:cw.from(w,"base64"),X=A.subarray(0,16),J=A.subarray(A.length-16),U=A.subarray(16,A.length-16),W=bK("aes-256-gcm",Y,X);W.setAuthTag(J);let Q=W.update(U),B=W.final(),j=Q.length+B.length,z=cw.allocUnsafe(j);return Q.copy(z,0),B.copy(z,Q.length),z.toString("utf8")}catch(A){throw Error(`Decryption failed: ${A instanceof Error?A.message:String(A)}`)}}getLevel(){return this.config.level}getLogDirectory(){return this.config.logDirectory}getFormat(){return this.config.format}getRotationConfig(){return this.config.rotation}isBrowserMode(){return F0()}isServerMode(){return!F0()}setTestEncryptionKey(w,$){this.currentKeyId=w,this.keys.set(w,$)}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(w){if(!this.enabled)return;let $=new Date,Y=this.formatConsoleTimestamp($),A=this.formatFileTimestamp($),{consoleText:X,fileText:J}=this.buildOutputTexts(w);if(this.shouldStyleConsole()){let W=X.split(`
18
18
  `),Q=Math.max(...W.map((G)=>G.length))+2,B=`┌${"─".repeat(Q)}┐`,j=`└${"─".repeat(Q)}┘`,z=W.map((G)=>{return this.formatConsoleMessage({timestamp:Y,message:u.cyan(G),showTimestamp:!1})});console.error(this.formatConsoleMessage({timestamp:Y,message:u.cyan(B),showTimestamp:!1})),z.forEach((G)=>console.error(G)),console.error(this.formatConsoleMessage({timestamp:Y,message:u.cyan(j),showTimestamp:!1}))}else if(!F0())console.error(`${A} ${this.environment}.INFO: [BOX] ${J}`);let U=`${A} ${this.environment}.INFO: [BOX] ${J}
19
19
  `.replace(this.ANSI_PATTERN,"");if(this.shouldWriteToFile())await this.writeToFile(U)}async prompt(w){if(F0())return Promise.resolve(!0);return new Promise(($)=>{console.error(`${u.cyan("?")} ${w} (y/n) `);let Y=(A)=>{let X=A.toString().trim().toLowerCase();h.stdin.removeListener("data",Y);try{if(typeof h.stdin.setRawMode==="function")h.stdin.setRawMode(!1)}catch{}h.stdin.pause(),console.error(""),$(X==="y"||X==="yes")};try{if(typeof h.stdin.setRawMode==="function")h.stdin.setRawMode(!0)}catch{}h.stdin.resume(),h.stdin.once("data",Y)})}setFancy(w){this.fancy=w}isFancy(){return this.fancy}pause(){this.enabled=!1}resume(){this.enabled=!0}async start(w,...$){if(!this.enabled)return;let Y=w;if($&&$.length>0){let Q=/%([sdijfo%])/g,B=0;if(Y=w.replace(Q,(j,z)=>{if(z==="%")return"%";if(B>=$.length)return j;let G=$[B++];switch(z){case"s":return String(G);case"d":case"i":return Number(G).toString();case"j":case"o":return JSON.stringify(G,null,2);default:return j}}),B<$.length)Y+=` ${$.slice(B).map((j)=>typeof j==="object"?JSON.stringify(j,null,2):String(j)).join(" ")}`}let{consoleText:A,fileText:X}=this.buildOutputTexts(Y);if(this.shouldStyleConsole()){let Q=this.options.showTags!==!1&&this.name?u.gray(this.formatTag(this.name)):"",B=this.options.showIcons===!1?"":`${u.blue("◐")} `;console.error(`${B}${Q} ${u.cyan(A)}`)}let W=`[${new Date().toISOString()}] ${this.environment}.INFO: [START] ${X}
20
20
  `.replace(this.ANSI_PATTERN,"");if(this.shouldWriteToFile())await this.writeToFile(W)}renderProgressBar(w,$=!1){if(!this.enabled||!this.shouldStyleConsole()||!h.stdout.isTTY)return;let Y=Math.min(100,Math.max(0,Math.round(w.current/w.total*100))),A=Math.round(w.barLength*Y/100),X=w.barLength-A,J=u.green("━".repeat(A)),U=u.gray("━".repeat(X)),W=`[${J}${U}]`,Q=`${Y}%`.padStart(4),B=w.message?` ${w.message}`:"",j=this.options.showIcons===!1?"":$||Y===100?u.green("✓"):u.blue("▶"),z=this.options.showTags!==!1&&this.name?` ${u.gray(this.formatTag(this.name))}`:"",G=`\r${j}${z} ${W} ${Q}${B}`,K=h.stdout.columns||80,E=" ".repeat(Math.max(0,K-G.replace(this.ANSI_PATTERN,"").length));if(w.lastRenderedLine=`${G}${E}`,h.stdout.write(w.lastRenderedLine),$)h.stdout.write(`
21
- `)}finishProgressBar(w,$){if(!this.enabled||!this.fancy||F0()||!h.stdout.isTTY){this.activeProgressBar=null;return}if(w.current<w.total)w.current=w.total;if($)w.message=$;this.renderProgressBar(w,!0),this.activeProgressBar=null}async clear(w={}){if(F0()){console.warn("Log clearing is not supported in browser environments.");return}try{console.warn("Clearing logs...",this.config.logDirectory);let $=await zA(this.config.logDirectory),Y=[];for(let A of $){if(!(w.name?new RegExp(w.name.replace("*",".*")).test(A):A.startsWith(this.name))||!A.endsWith(".log"))continue;let J=U1(this.config.logDirectory,A);if(w.before)try{if((await J1(J)).mtime>=w.before)continue}catch(U){console.error(`Failed to get stats for file ${J}:`,U);continue}Y.push(J)}if(Y.length===0){console.warn("No log files matched the criteria for clearing.");return}console.warn(`Preparing to delete ${Y.length} log file(s)...`);for(let A of Y)try{await GA(A),console.warn(`Deleted log file: ${A}`)}catch(X){console.error(`Failed to delete log file ${A}:`,X)}console.warn("Log clearing process finished.")}catch($){console.error("Error during log clearing process:",$)}}}async function yj(w,$={}){let{maxRetries:Y=3,retryDelay:A=1000,isRetryable:X=()=>!0,fallback:J}=$,U=Error("Unknown error occurred");for(let W=0;W<=Y;W++)try{return await w()}catch(Q){if(U=Q instanceof Error?Q:Error(String(Q)),W===Y||!X(U))break;if(A>0)await new Promise((B)=>setTimeout(B,A))}if(J!==void 0)return J;throw U instanceof Error?U:Error(`Unknown error: ${String(U)}`)}function Oj(w){return w instanceof o0}function I7(w){return w instanceof PA}function V7(w){if(Oj(w))return w.code==="FILE_SYSTEM_ERROR"||w.code==="BROWSER_CONFIG_ERROR";return["ENOENT","EACCES","EMFILE","ENFILE","EBUSY","network","timeout","connection"].some((Y)=>w.message.toLowerCase().includes(Y.toLowerCase()))}class mA{defaultParsers;constructor(){this.defaultParsers=[{name:"boolean",canParse:(w,$)=>$==="boolean"||["true","false","1","0","yes","no"].includes(w.toLowerCase()),parse:(w)=>{let $=w.toLowerCase();return["true","1","yes"].includes($)}},{name:"number",canParse:(w,$)=>$==="number"||!Number.isNaN(Number(w))&&!Number.isNaN(Number.parseFloat(w)),parse:(w)=>{let $=Number(w);if(Number.isNaN($))throw TypeError(`Cannot parse "${w}" as number`);return $}},{name:"array",canParse:(w,$)=>$==="array"||w.startsWith("[")||w.includes(","),parse:(w)=>{try{let $=JSON.parse(w);if(Array.isArray($))return $}catch{}return w.split(",").map(($)=>$.trim())}},{name:"json",canParse:(w,$)=>$==="object"||(w.startsWith("{")&&w.endsWith("}")||w.startsWith("[")&&w.endsWith("]")),parse:(w)=>{try{return JSON.parse(w)}catch($){throw Error(`Cannot parse "${w}" as JSON: ${$}`)}}}]}async applyEnvironmentVariables(w,$,Y={}){let{prefix:A,useCamelCase:X=!0,useBackwardCompatibility:J=!0,customParsers:U={},verbose:W=!1,trackPerformance:Q=!0}=Y,B=async()=>{if(!w)return{config:$,source:{type:"environment",priority:50,timestamp:new Date}};let j=A||this.generateEnvPrefix(w),z={...$};return this.processObject(z,[],j,{useCamelCase:X,useBackwardCompatibility:J,customParsers:U,verbose:W,configName:w}),{config:z,source:{type:"environment",priority:50,timestamp:new Date}}};if(Q)return EY.track("applyEnvironmentVariables",B,{configName:w});return B()}generateEnvPrefix(w){return w.toUpperCase().replace(/-/g,"_")}formatEnvKey(w,$){if(!$)return w.toUpperCase();return w.replace(/([A-Z])/g,"_$1").toUpperCase()}processObject(w,$,Y,A){for(let[X,J]of Object.entries(w)){let U=[...$,X],W=U.map((j)=>this.formatEnvKey(j,A.useCamelCase)),Q=`${Y}_${W.join("_")}`,B=A.useBackwardCompatibility?`${Y}_${U.map((j)=>j.toUpperCase()).join("_")}`:null;if(A.verbose);if(typeof J==="object"&&J!==null&&!Array.isArray(J))this.processObject(J,U,Y,A);else{let j=KA.env[Q]||(B?KA.env[B]:void 0);if(j!==void 0){if(A.verbose){let z=KA.env[Q]?Q:B}try{w[X]=this.parseEnvironmentValue(j,typeof J,Q,A.customParsers,A.configName)}catch(z){if(z instanceof bA)throw z;throw N$.envVar(Q,j,typeof J,A.configName)}}}}}parseEnvironmentValue(w,$,Y,A,X){for(let[J,U]of Object.entries(A))try{return U(w)}catch{continue}for(let J of this.defaultParsers)if(J.canParse(w,$))try{return J.parse(w)}catch{throw N$.envVar(Y,w,`${$} (via ${J.name} parser)`,X)}return w}getEnvironmentVariables(w){let $={},Y=w.toUpperCase();for(let[A,X]of Object.entries(KA.env))if(A.startsWith(Y)&&X!==void 0)$[A]=X;return $}validateEnvironmentVariable(w,$,Y){let A=[];if(!/^[A-Z_][A-Z0-9_]*$/.test(w))A.push(`Environment variable key "${w}" should only contain uppercase letters, numbers, and underscores`);if(Y)try{this.parseEnvironmentValue(w,$,Y,{})}catch(X){A.push(`Cannot parse value "${$}" as ${Y}: ${X}`)}return{isValid:A.length===0,errors:A}}generateEnvVarDocs(w,$,Y={}){let{prefix:A,format:X="text"}=Y,J=A||this.generateEnvPrefix(w),U=[];switch(this.extractEnvVarInfo($,[],J,U),X){case"markdown":return this.formatAsMarkdown(U,w);case"json":return JSON.stringify(U,null,2);default:return this.formatAsText(U,w)}}extractEnvVarInfo(w,$,Y,A){for(let[X,J]of Object.entries(w)){let U=[...$,X],W=`${Y}_${U.map((Q)=>this.formatEnvKey(Q,!0)).join("_")}`;if(typeof J==="object"&&J!==null&&!Array.isArray(J))this.extractEnvVarInfo(J,U,Y,A);else A.push({key:W,type:Array.isArray(J)?"array":typeof J,description:`Configuration for ${U.join(".")}`,example:this.generateExample(J)})}}generateExample(w){if(Array.isArray(w))return JSON.stringify(w);if(typeof w==="object"&&w!==null)return JSON.stringify(w);return String(w)}formatAsText(w,$){let Y=`Environment Variables for ${$}:
21
+ `)}finishProgressBar(w,$){if(!this.enabled||!this.fancy||F0()||!h.stdout.isTTY){this.activeProgressBar=null;return}if(w.current<w.total)w.current=w.total;if($)w.message=$;this.renderProgressBar(w,!0),this.activeProgressBar=null}async clear(w={}){if(F0()){console.warn("Log clearing is not supported in browser environments.");return}try{console.warn("Clearing logs...",this.config.logDirectory);let $=await KA(this.config.logDirectory),Y=[];for(let A of $){if(!(w.name?new RegExp(w.name.replace("*",".*")).test(A):A.startsWith(this.name))||!A.endsWith(".log"))continue;let J=Q1(this.config.logDirectory,A);if(w.before)try{if((await U1(J)).mtime>=w.before)continue}catch(U){console.error(`Failed to get stats for file ${J}:`,U);continue}Y.push(J)}if(Y.length===0){console.warn("No log files matched the criteria for clearing.");return}console.warn(`Preparing to delete ${Y.length} log file(s)...`);for(let A of Y)try{await FA(A),console.warn(`Deleted log file: ${A}`)}catch(X){console.error(`Failed to delete log file ${A}:`,X)}console.warn("Log clearing process finished.")}catch($){console.error("Error during log clearing process:",$)}}}async function Oj(w,$={}){let{maxRetries:Y=3,retryDelay:A=1000,isRetryable:X=()=>!0,fallback:J}=$,U=Error("Unknown error occurred");for(let W=0;W<=Y;W++)try{return await w()}catch(Q){if(U=Q instanceof Error?Q:Error(String(Q)),W===Y||!X(U))break;if(A>0)await new Promise((B)=>setTimeout(B,A))}if(J!==void 0)return J;throw U instanceof Error?U:Error(`Unknown error: ${String(U)}`)}function Lj(w){return w instanceof o0}function V7(w){return w instanceof uA}function C7(w){if(Lj(w))return w.code==="FILE_SYSTEM_ERROR"||w.code==="BROWSER_CONFIG_ERROR";return["ENOENT","EACCES","EMFILE","ENFILE","EBUSY","network","timeout","connection"].some((Y)=>w.message.toLowerCase().includes(Y.toLowerCase()))}class dA{defaultParsers;constructor(){this.defaultParsers=[{name:"boolean",canParse:(w,$)=>$==="boolean"||["true","false","1","0","yes","no"].includes(w.toLowerCase()),parse:(w)=>{let $=w.toLowerCase();return["true","1","yes"].includes($)}},{name:"number",canParse:(w,$)=>$==="number"||!Number.isNaN(Number(w))&&!Number.isNaN(Number.parseFloat(w)),parse:(w)=>{let $=Number(w);if(Number.isNaN($))throw TypeError(`Cannot parse "${w}" as number`);return $}},{name:"array",canParse:(w,$)=>$==="array"||w.startsWith("[")||w.includes(","),parse:(w)=>{try{let $=JSON.parse(w);if(Array.isArray($))return $}catch{}return w.split(",").map(($)=>$.trim())}},{name:"json",canParse:(w,$)=>$==="object"||(w.startsWith("{")&&w.endsWith("}")||w.startsWith("[")&&w.endsWith("]")),parse:(w)=>{try{return JSON.parse(w)}catch($){throw Error(`Cannot parse "${w}" as JSON: ${$}`)}}}]}async applyEnvironmentVariables(w,$,Y={}){let{prefix:A,useCamelCase:X=!0,useBackwardCompatibility:J=!0,customParsers:U={},verbose:W=!1,trackPerformance:Q=!0}=Y,B=async()=>{if(!w)return{config:$,source:{type:"environment",priority:50,timestamp:new Date}};let j=A||this.generateEnvPrefix(w),z={...$};return this.processObject(z,[],j,{useCamelCase:X,useBackwardCompatibility:J,customParsers:U,verbose:W,configName:w}),{config:z,source:{type:"environment",priority:50,timestamp:new Date}}};if(Q)return fY.track("applyEnvironmentVariables",B,{configName:w});return B()}generateEnvPrefix(w){return w.toUpperCase().replace(/-/g,"_")}formatEnvKey(w,$){if(!$)return w.toUpperCase();return w.replace(/([A-Z])/g,"_$1").toUpperCase()}processObject(w,$,Y,A){for(let[X,J]of Object.entries(w)){let U=[...$,X],W=U.map((j)=>this.formatEnvKey(j,A.useCamelCase)),Q=`${Y}_${W.join("_")}`,B=A.useBackwardCompatibility?`${Y}_${U.map((j)=>j.toUpperCase()).join("_")}`:null;if(A.verbose);if(typeof J==="object"&&J!==null&&!Array.isArray(J))this.processObject(J,U,Y,A);else{let j=qA.env[Q]||(B?qA.env[B]:void 0);if(j!==void 0){if(A.verbose){let z=qA.env[Q]?Q:B}try{w[X]=this.parseEnvironmentValue(j,typeof J,Q,A.customParsers,A.configName)}catch(z){if(z instanceof cA)throw z;throw N$.envVar(Q,j,typeof J,A.configName)}}}}}parseEnvironmentValue(w,$,Y,A,X){for(let[J,U]of Object.entries(A))try{return U(w)}catch{continue}for(let J of this.defaultParsers)if(J.canParse(w,$))try{return J.parse(w)}catch{throw N$.envVar(Y,w,`${$} (via ${J.name} parser)`,X)}return w}getEnvironmentVariables(w){let $={},Y=w.toUpperCase();for(let[A,X]of Object.entries(qA.env))if(A.startsWith(Y)&&X!==void 0)$[A]=X;return $}validateEnvironmentVariable(w,$,Y){let A=[];if(!/^[A-Z_][A-Z0-9_]*$/.test(w))A.push(`Environment variable key "${w}" should only contain uppercase letters, numbers, and underscores`);if(Y)try{this.parseEnvironmentValue(w,$,Y,{})}catch(X){A.push(`Cannot parse value "${$}" as ${Y}: ${X}`)}return{isValid:A.length===0,errors:A}}generateEnvVarDocs(w,$,Y={}){let{prefix:A,format:X="text"}=Y,J=A||this.generateEnvPrefix(w),U=[];switch(this.extractEnvVarInfo($,[],J,U),X){case"markdown":return this.formatAsMarkdown(U,w);case"json":return JSON.stringify(U,null,2);default:return this.formatAsText(U,w)}}extractEnvVarInfo(w,$,Y,A){for(let[X,J]of Object.entries(w)){let U=[...$,X],W=`${Y}_${U.map((Q)=>this.formatEnvKey(Q,!0)).join("_")}`;if(typeof J==="object"&&J!==null&&!Array.isArray(J))this.extractEnvVarInfo(J,U,Y,A);else A.push({key:W,type:Array.isArray(J)?"array":typeof J,description:`Configuration for ${U.join(".")}`,example:this.generateExample(J)})}}generateExample(w){if(Array.isArray(w))return JSON.stringify(w);if(typeof w==="object"&&w!==null)return JSON.stringify(w);return String(w)}formatAsText(w,$){let Y=`Environment Variables for ${$}:
22
22
 
23
23
  `;for(let A of w)Y+=`${A.key}
24
24
  `,Y+=` Type: ${A.type}
@@ -30,25 +30,25 @@ import{createRequire as F6}from"node:module";var z6=Object.defineProperty;var G6
30
30
  `;Y+=`| Variable | Type | Description | Example |
31
31
  `,Y+=`|----------|------|-------------|----------|
32
32
  `;for(let A of w)Y+=`| \`${A.key}\` | ${A.type} | ${A.description} | \`${A.example}\` |
33
- `;return Y}}function C7(w,$){let Y=kj("process");if(typeof Y>"u"||!Y.env)return $;let A=Y.env[w];return A!==void 0?A:$}function Lj(w,$,Y={}){return _j(w,$,Y,new WeakMap)}function _j(w,$,Y,A){let{arrayMergeMode:X="replace",skipNullish:J=!1,customMerger:U}=Y;if($===null||$===void 0)return J?w:$;if(U){let W=U(w,$);if(W!==void 0)return W}if(Array.isArray($)||Array.isArray(w))return Sj(w,$,X,A);if(!Jw($)||!Jw(w))return $;return _7(w,$,Y,A)}function Sj(w,$,Y,A){if(Array.isArray($)&&!Array.isArray(w))return $;if(Array.isArray(w)&&!Array.isArray($))return $;if(Array.isArray($)&&Array.isArray(w))switch(Y){case"replace":return $;case"concat":return y7(w,$);case"smart":return O7(w,$,A);default:return $}return $}function y7(w,$){let Y=[...$];for(let A of w)if(!Y.some((X)=>nJ(X,A)))Y.push(A);return Y}function O7(w,$,Y){if($.length===0)return w;if(w.length===0)return $;if(Jw($[0])&&Jw(w[0]))return L7(w,$,Y);if($.every((A)=>typeof A==="string")&&w.every((A)=>typeof A==="string")){let A=[...$];for(let X of w)if(!A.includes(X))A.push(X);return A}return $}function L7(w,$,Y){let A=[...$];for(let X of w){if(!Jw(X)){A.push(X);continue}let J=["id","name","key","path","type"],U=!1;for(let W of J)if(W in X){if(A.find((B)=>Jw(B)&&(W in B)&&B[W]===X[W])){U=!0;break}}if(!U)A.push(X)}return A}function _7(w,$,Y,A){let X=$;if(Jw(X)&&A.has(X))return A.get(X);let J={...w};if(Jw(X))A.set(X,J);for(let U in X){if(!Object.prototype.hasOwnProperty.call(X,U))continue;let W=X[U],Q=J[U];if(Y.skipNullish&&(W===null||W===void 0))continue;if(W===null||W===void 0){J[U]=W;continue}if(Jw(W)&&Jw(Q))J[U]=_j(Q,W,Y,A);else if(Array.isArray(W)||Array.isArray(Q))J[U]=Sj(Q,W,Y.arrayMergeMode||"smart",A);else J[U]=W}return J}function QU(w,$,Y="replace"){return Lj(w,$,{arrayMergeMode:Y==="replace"?"replace":"smart",skipNullish:!0})}function nJ(w,$){if(w===$)return!0;if(Array.isArray(w)&&Array.isArray($)){if(w.length!==$.length)return!1;for(let Y=0;Y<w.length;Y++)if(!nJ(w[Y],$[Y]))return!1;return!0}if(Jw(w)&&Jw($)){let Y=Object.keys(w),A=Object.keys($);if(Y.length!==A.length)return!1;for(let X of Y){if(!Object.prototype.hasOwnProperty.call($,X))return!1;if(!nJ(w[X],$[X]))return!1}return!0}return!1}function Jw(w){return Boolean(w&&typeof w==="object"&&!Array.isArray(w))}class gA{extensions=[".ts",".js",".mjs",".cjs",".json",".mts",".cts"];async loadFromPath(w,$,Y={}){let{arrayStrategy:A="replace",useCache:X=!0,cacheTtl:J,trackPerformance:U=!0,verbose:W=!1}=Y;if(X){let B=z1.getWithFileCheck("file",w);if(B){if(W)console.log(`Configuration loaded from cache: ${w}`);return B}}let Q=async()=>{if(!FA(w))return null;try{let B=`?t=${Date.now()}`,j=await import(w+B),z=j.default||j,G="default"in j,K=Object.keys(j).length>0;if(!G&&!K)throw new qY(w,Error("Configuration file is empty and exports nothing"),"unknown");if(typeof z!=="object"||z===null||Array.isArray(z))throw new qY(w,Error("Configuration must export a valid object"),"unknown");let N={config:QU($,z,A),source:{type:"file",path:w,priority:100,timestamp:new Date}};if(X)z1.setWithFileCheck("file",N,w,J);return N}catch(B){throw B instanceof Error?N$.configLoad(w,B):N$.configLoad(w,Error(String(B)))}};if(U)return EY.track("loadFromPath",Q,{path:w});return Q()}async tryLoadFromPaths(w,$,Y={}){for(let A of w)try{let X=await this.loadFromPath(A,$,Y);if(X)return X}catch(X){if(X instanceof Error&&X.name==="ConfigLoadError")throw X;if(Y.verbose)console.warn(`Failed to load config from ${A}:`,X)}return null}generateConfigPaths(w,$,Y){let A=this.generateNamePatterns(w,Y),X=[];for(let J of A)for(let U of this.extensions)X.push(kJ($,`${J}${U}`));return X}generateNamePatterns(w,$){let Y=[];if(Y.push("config",".config"),w)Y.push(w,`.${w}.config`,`${w}.config`,`.${w}`);if($){if(Y.push($,`.${$}.config`,`${$}.config`,`.${$}`),w)Y.push(`${w}.${$}.config`,`.${w}.${$}.config`)}return Y.filter(Boolean)}checkFileAccess(w){return yj(async()=>{return FA(w)},{maxRetries:2,retryDelay:100,fallback:!1})}async discoverConfigFiles(w,$,Y){let A=[];if(!FA(w))return A;if($||Y){let X=this.generateNamePatterns($||"",Y);for(let J of X)for(let U of this.extensions){let W=kJ(w,`${J}${U}`);if(await this.checkFileAccess(W))A.push(W)}}else try{let{readdirSync:X}=await import("fs"),J=X(w);for(let U of J)if(this.looksLikeConfigFile(U)){let W=kJ(w,U);if(await this.checkFileAccess(W))A.push(W)}}catch{return[]}return A}looksLikeConfigFile(w){return[/\.config\.(ts|js|mjs|cjs|json|mts|cts)$/,/^\..*\.(ts|js|mjs|cjs|json|mts|cts)$/,/config\.(ts|js|mjs|cjs|json|mts|cts)$/].some((Y)=>Y.test(w))}async validateConfigFile(w){let $=[];try{if(!FA(w))return $.push("Configuration file does not exist"),$;let Y=await import(w),A=Y.default||Y;if(A===void 0)$.push("Configuration file must export a default value or named exports");else if(typeof A!=="object"||A===null)$.push("Configuration must be an object");else if(Array.isArray(A))$.push("Configuration cannot be an array at the root level");if(w.endsWith(".json"))try{let{readFileSync:X}=await import("fs"),J=X(w,"utf8");JSON.parse(J)}catch(X){$.push(`Invalid JSON syntax: ${X}`)}}catch(Y){$.push(`Failed to load configuration file: ${Y}`)}return $}async getFileModificationTime(w){try{let{statSync:$}=await import("fs");return $(w).mtime}catch{return null}}async preloadConfigurations(w,$={}){let Y=new Map;return await Promise.allSettled(w.map(async(A)=>{try{let X=await this.loadFromPath(A,{},$);if(X)Y.set(A,X.config)}catch(X){if($.verbose)console.warn(`Failed to preload ${A}:`,X)}})),Y}}class WU{async validateConfiguration(w,$,Y={}){let{stopOnFirstError:A=!1,validateRequired:X=!0,validateTypes:J=!0,customRules:U=[],trackPerformance:W=!0,verbose:Q=!1}=Y,B=async()=>{let j=[],z=[],G={stopOnFirstError:A,validateRequired:X,validateTypes:J,customRules:U,trackPerformance:W,verbose:Q};try{if(typeof $==="string")return await this.validateWithSchemaFile(w,$,G);else if(Array.isArray($))return this.validateWithRules(w,[...$,...U],G);else return this.validateWithJSONSchema(w,$,G)}catch(K){return j.push({path:"",message:`Validation failed: ${K}`,rule:"system"}),{isValid:!1,errors:j,warnings:z}}};if(W)return await EY.track("validateConfiguration",B);return B()}async validateWithSchemaFile(w,$,Y){try{if(!dK($))throw new NY($,[{path:"",message:"Schema file does not exist"}]);let A=await import($),X=A.default||A;if(Array.isArray(X))return this.validateWithRules(w,X,Y);else return this.validateWithJSONSchema(w,X,Y)}catch(A){throw new NY($,[{path:"",message:`Failed to load schema: ${A}`}])}}validateWithJSONSchema(w,$,Y){let A=[],X=[];return this.validateObjectAgainstSchema(w,$,"",A,X,Y),{isValid:A.length===0,errors:A,warnings:X}}validateObjectAgainstSchema(w,$,Y,A,X,J){if(J.validateTypes&&$.type){let U=Array.isArray(w)?"array":typeof w,W=Array.isArray($.type)?$.type:[$.type];if(!W.includes(U)){if(A.push({path:Y,message:`Expected type ${W.join(" or ")}, got ${U}`,expected:W.join(" or "),actual:U,rule:"type"}),J.stopOnFirstError)return}}if($.enum&&!$.enum.includes(w)){if(A.push({path:Y,message:`Value must be one of: ${$.enum.join(", ")}`,expected:$.enum.join(", "),actual:w,rule:"enum"}),J.stopOnFirstError)return}if(typeof w==="string"){if($.minLength!==void 0&&w.length<$.minLength)A.push({path:Y,message:`String length must be at least ${$.minLength}`,expected:`>= ${$.minLength}`,actual:w.length,rule:"minLength"});if($.maxLength!==void 0&&w.length>$.maxLength)A.push({path:Y,message:`String length must not exceed ${$.maxLength}`,expected:`<= ${$.maxLength}`,actual:w.length,rule:"maxLength"});if($.pattern){if(!new RegExp($.pattern).test(w))A.push({path:Y,message:`String does not match pattern ${$.pattern}`,expected:$.pattern,actual:w,rule:"pattern"})}}if(typeof w==="number"){if($.minimum!==void 0&&w<$.minimum)A.push({path:Y,message:`Value must be at least ${$.minimum}`,expected:`>= ${$.minimum}`,actual:w,rule:"minimum"});if($.maximum!==void 0&&w>$.maximum)A.push({path:Y,message:`Value must not exceed ${$.maximum}`,expected:`<= ${$.maximum}`,actual:w,rule:"maximum"})}if(Array.isArray(w)&&$.items)for(let U=0;U<w.length;U++){let W=Y?`${Y}[${U}]`:`[${U}]`;if(this.validateObjectAgainstSchema(w[U],$.items,W,A,X,J),J.stopOnFirstError&&A.length>0)return}if(w&&typeof w==="object"&&!Array.isArray(w)){let U=w;if(J.validateRequired&&$.required){for(let W of $.required)if(!(W in U)){if(A.push({path:Y?`${Y}.${W}`:W,message:`Missing required property '${W}'`,expected:"required",rule:"required"}),J.stopOnFirstError)return}}if($.properties){for(let[W,Q]of Object.entries($.properties))if(W in U){let B=Y?`${Y}.${W}`:W;if(this.validateObjectAgainstSchema(U[W],Q,B,A,X,J),J.stopOnFirstError&&A.length>0)return}}if($.additionalProperties===!1){let W=new Set(Object.keys($.properties||{}));for(let Q of Object.keys(U))if(!W.has(Q))X.push({path:Y?`${Y}.${Q}`:Q,message:`Additional property '${Q}' is not allowed`,rule:"additionalProperties"})}}}validateWithRules(w,$,Y){let A=[],X=[];for(let J of $)try{let U=this.getValueByPath(w,J.path),W=this.validateWithRule(U,J,J.path);if(A.push(...W),Y.stopOnFirstError&&A.length>0)break}catch(U){A.push({path:J.path,message:`Rule validation failed: ${U}`,rule:"system"})}return{isValid:A.length===0,errors:A,warnings:X}}validateWithRule(w,$,Y){let A=[];if($.required&&(w===void 0||w===null))return A.push({path:Y,message:$.message||`Property '${Y}' is required`,expected:"required",rule:"required"}),A;if(w===void 0||w===null)return A;if($.type){let X=Array.isArray(w)?"array":typeof w;if(X!==$.type)A.push({path:Y,message:$.message||`Expected type ${$.type}, got ${X}`,expected:$.type,actual:X,rule:"type"})}if($.min!==void 0){let X=Array.isArray(w)?w.length:typeof w==="string"?w.length:typeof w==="number"?w:0;if(X<$.min)A.push({path:Y,message:$.message||`Value must be at least ${$.min}`,expected:`>= ${$.min}`,actual:X,rule:"min"})}if($.max!==void 0){let X=Array.isArray(w)?w.length:typeof w==="string"?w.length:typeof w==="number"?w:0;if(X>$.max)A.push({path:Y,message:$.message||`Value must not exceed ${$.max}`,expected:`<= ${$.max}`,actual:X,rule:"max"})}if($.pattern&&typeof w==="string"){if(!$.pattern.test(w))A.push({path:Y,message:$.message||`Value does not match pattern ${$.pattern}`,expected:$.pattern.toString(),actual:w,rule:"pattern"})}if($.enum&&!$.enum.includes(w))A.push({path:Y,message:$.message||`Value must be one of: ${$.enum.join(", ")}`,expected:$.enum.join(", "),actual:w,rule:"enum"});if($.validator){let X=$.validator(w);if(X)A.push({path:Y,message:$.message||X,rule:"custom"})}return A}getValueByPath(w,$){if(!$)return w;let Y=$.split("."),A=w;for(let X of Y)if(A&&typeof A==="object"&&X in A)A=A[X];else return;return A}generateRulesFromInterface(w){let $=[],Y=w.matchAll(/(\w+)(\?)?:\s*(\w+)/g);for(let A of Y){let[,X,J,U]=A;$.push({path:X,required:!J,type:this.mapTypeScriptType(U)})}return $}mapTypeScriptType(w){switch(w.toLowerCase()){case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"array":return"array";case"object":return"object";default:return"object"}}static createCommonRules(){return{server:[{path:"port",required:!0,type:"number",min:1,max:65535},{path:"host",required:!0,type:"string",min:1},{path:"ssl",type:"boolean"}],database:[{path:"url",required:!0,type:"string",min:1},{path:"pool",type:"number",min:1,max:100},{path:"timeout",type:"number",min:0}],api:[{path:"baseUrl",required:!0,type:"string",pattern:bj},{path:"timeout",type:"number",min:0},{path:"retries",type:"number",min:0,max:10}]}}}class BU{fileLoader=new gA;envProcessor=new mA;validator=new WU;async loadConfig(w){let $=Date.now(),{cache:Y,performance:A,schema:X,validate:J,...U}=w;try{if(Y?.enabled){let Q=this.checkCache(U.name||"",U);if(Q)return Q}let W;try{W=await this.loadConfigurationStrategies(U,!0,Y)}catch(Q){let B=U.__strictErrorHandling;if(Q instanceof Error&&Q.name==="ConfigNotFoundError"){if(B)throw Q;W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`No configuration file found for "${U.name||"config"}", using defaults with environment variables`]}}else if(Q instanceof Error&&Q.name==="ConfigLoadError"){let j=Q.message.includes("EACCES")||Q.message.includes("EPERM")||Q.message.includes("permission denied"),z=!j&&(Q.message.includes("syntax")||Q.message.includes("Expected")||Q.message.includes("Unexpected")||Q.message.includes("BuildMessage")||Q.message.includes("errors building")),G=Q.message.includes("Configuration must export a valid object")||Q.message.includes("Configuration file is empty and exports nothing");if(B&&(G||j))throw Q;if(z&&(!B||!G))W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:["Configuration file has syntax errors, using defaults with environment variables"]};else if(!B)W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`Configuration loading error, using defaults: ${Q.message}`]};else throw Q}else W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`Configuration loading failed, using defaults: ${Q instanceof Error?Q.message:String(Q)}`]}}if(X||J)await this.validateConfiguration(W.config,X,J,U.name);if(Y?.enabled&&W)this.cacheResult(U.name||"",W,Y,U);if(A?.enabled){let Q={operation:"loadConfig",duration:Date.now()-$,configName:U.name,timestamp:new Date};if(A.onMetrics)A.onMetrics(Q);if(A.slowThreshold&&Q.duration>A.slowThreshold)qw.warn(`Slow configuration loading detected: ${Q.duration}ms for ${U.name}`);W.metrics=Q}return W}catch(W){let Q=Date.now()-$;throw qw.error(`Configuration loading failed after ${Q}ms:`,[W instanceof Error?W:Error(String(W))]),W}}async loadConfigurationStrategies(w,$=!1,Y){let{name:A="",alias:X,cwd:J,configDir:U,defaultConfig:W,checkEnv:Q=!0,arrayStrategy:B="replace",verbose:j=!1}=w,z=J||P$.cwd(),G=[],K=await this.loadLocalConfiguration(A,X,z,U,W,B,j,Q,Y);if(K)return G.push(...this.getLocalSearchPaths(A,X,z,U)),this.finalizeResult(K,G,Q,A,j);let E=await this.loadHomeConfiguration(A,X,W,B,j,Q);if(E)return G.push(...this.getHomeSearchPaths(A,X)),this.finalizeResult(E,G,Q,A,j);let q=await this.loadPackageJsonConfiguration(A,X,z,W,B,j,Q);if(q)return G.push(i0(z,"package.json")),this.finalizeResult(q,G,Q,A,j);if(G.push(...this.getAllSearchPaths(A,X,z,U)),$)throw N$.configNotFound(A,G,X);return{...await this.applyEnvironmentVariables(A,W,Q,j),warnings:[`No configuration file found for "${A}"${X?` or alias "${X}"`:""}, using defaults with environment variables`]}}async loadLocalConfiguration(w,$,Y,A,X,J,U,W,Q){let B=W?KY(w,X,U):X,j=this.getLocalDirectories(Y,A);for(let z of j){if(U)qw.info(`Searching for configuration in: ${z}`);let G=this.fileLoader.generateConfigPaths(w,z,$),K=await this.fileLoader.tryLoadFromPaths(G,B,{arrayStrategy:J,verbose:U,cacheTtl:Q?.ttl,useCache:!Q?.ttl||Q.ttl>100});if(K){if(U)qw.success(`Configuration loaded from: ${K.source.path}`);return K}}return null}async loadHomeConfiguration(w,$,Y,A,X,J){if(!w)return null;let U=J?KY(w,Y,X):Y,W=[i0($1(),".config",w),i0($1(),".config"),$1()];for(let Q of W){if(X)qw.info(`Checking home directory: ${Q}`);let B=this.fileLoader.generateConfigPaths(w,Q,$),j=await this.fileLoader.tryLoadFromPaths(B,U,{arrayStrategy:A,verbose:X});if(j){if(X)qw.success(`Configuration loaded from home directory: ${j.source.path}`);return j}}return null}async loadPackageJsonConfiguration(w,$,Y,A,X,J,U){let W=U?KY(w,A,J):A;try{let Q=i0(Y,"package.json");if(!dJ(Q))return null;let B=await import(Q),j=B[w],z=w;if(!j&&$)j=B[$],z=$;if(j&&typeof j==="object"&&!Array.isArray(j)){if(J)qw.success(`Configuration loaded from package.json: ${z}`);return{config:QU(W,j,X),source:{type:"package.json",path:Q,priority:30,timestamp:new Date}}}}catch(Q){if(J)qw.warn("Failed to load package.json:",[Q instanceof Error?Q:Error(String(Q))])}return null}async applyEnvironmentVariables(w,$,Y,A){if(!Y||!w||typeof $!=="object"||$===null||Array.isArray($))return{config:$,source:{type:"default",priority:10,timestamp:new Date}};return{config:KY(w,$,A),source:{type:"environment",priority:20,timestamp:new Date}}}async finalizeResult(w,$,Y,A,X){return{config:w.config,source:w.source,path:w.source.path}}async validateConfiguration(w,$,Y,A){let X=[];if(Y){let J=Y(w);if(J)X.push(...J)}if($){let J=await this.validator.validateConfiguration(w,$);if(!J.isValid)X.push(...J.errors.map((U)=>U.path?`${U.path}: ${U.message}`:U.message))}if(X.length>0)throw N$.configValidation(A||"unknown",X,A)}checkCache(w,$){let Y=this.generateCacheKey(w,$);return z1.get(Y)||null}cacheResult(w,$,Y,A){let X=this.generateCacheKey(w,A);z1.set(X,$,void 0,Y.ttl)}generateCacheKey(w,$){let Y=[w];if($.alias)Y.push(`alias:${$.alias}`);if($.cwd)Y.push(`cwd:${$.cwd}`);if($.configDir)Y.push(`configDir:${$.configDir}`);if("checkEnv"in $)Y.push(`checkEnv:${$.checkEnv}`);return Y.join("|")}getLocalDirectories(w,$){return Array.from(new Set([w,i0(w,"config"),i0(w,".config"),$?i0(w,$):void 0].filter(Boolean)))}getAllSearchPaths(w,$,Y,A){let X=[];return X.push(...this.getLocalSearchPaths(w,$,Y,A)),X.push(...this.getHomeSearchPaths(w,$)),X.push(i0(Y,"package.json")),X}getLocalSearchPaths(w,$,Y,A){let X=this.getLocalDirectories(Y,A),J=[];for(let U of X)J.push(...this.fileLoader.generateConfigPaths(w,U,$));return J}getHomeSearchPaths(w,$){if(!w)return[];let Y=[i0($1(),".config",w),i0($1(),".config"),$1()],A=[];for(let X of Y)A.push(...this.fileLoader.generateConfigPaths(w,X,$));return A}async loadConfigWithResult(w){return this.loadConfig(w)}}function Uj(w){let Y=!(w.message.includes("EACCES")||w.message.includes("EPERM")||w.message.includes("permission denied"))&&(w.message.includes("syntax")||w.message.includes("Expected")||w.message.includes("Unexpected")||w.message.includes("BuildMessage")),A=w.message.includes("Configuration must export a valid object")||w.message.includes("Configuration file is empty and exports nothing");return Y||A}async function S7(w){return dw.loadConfig({...w,__strictErrorHandling:!0})}async function Zj(w){let $="defaultConfig"in w&&w.defaultConfig!==void 0?w.defaultConfig:{},Y="cache"in w||"performance"in w||"schema"in w||"validate"in w;try{let A;if(Y)A=await dw.loadConfig(w);else A=await dw.loadConfig({...w,defaultConfig:$,cache:{enabled:!0},performance:{enabled:!1}});return A?.config??$}catch(A){let X=A instanceof Error?A.name:"UnknownError",J=A instanceof Error?A.message:String(A);if(!(X==="ConfigNotFoundError"||X==="ConfigLoadError"||X==="ConfigValidationError"||J.includes("config"))&&w.verbose)qw.warn("Unexpected error loading config, using defaults:",[A instanceof Error?A:Error(String(A))]);let W=Y?{...w,defaultConfig:$}:{...w,defaultConfig:$,cache:{enabled:!0},performance:{enabled:!1}};if("checkEnv"in w?w.checkEnv!==!1:!0)return(await dw.applyEnvironmentVariables(W.name||"",$,!0,W.verbose||!1))?.config??$;return $}}async function Z7(w={defaultConfig:{}}){if(typeof w==="string"){let{cwd:$}=await import("process");try{return(await dw.loadConfig({name:w,cwd:$(),generatedDir:"./generated",configDir:"./config",defaultConfig:{},checkEnv:!0,arrayStrategy:"replace"})).config}catch(Y){if(Y instanceof Error&&(Y.name==="ConfigNotFoundError"||Y.name==="ConfigLoadError"&&Uj(Y)))return(await dw.applyEnvironmentVariables(w,{},!0,!1)).config;throw Y}}try{return(await dw.loadConfig({...w,cwd:w.cwd||P$.cwd(),cache:{enabled:!0},performance:{enabled:!1}})).config}catch($){if($ instanceof Error&&($.name==="ConfigNotFoundError"||$.name==="ConfigLoadError"&&Uj($)))return(await dw.applyEnvironmentVariables(w.name||"",w.defaultConfig||{},w.checkEnv!==!1,w.verbose||!1)).config;throw $}}async function k7(w,$,Y="replace"){let A=new gA;try{let X=await A.loadFromPath(w,$,{arrayStrategy:Y,useCache:!1,trackPerformance:!1});return X?X.config:null}catch{return null}}function KY(w,$,Y=!1){let A=new mA,X=w.toUpperCase().replace(/[^A-Z0-9]/g,"_");function J(U,W=[]){let Q={...U};for(let[B,j]of Object.entries(U)){let z=[...W,B],G=[`${X}_${z.join("_").toUpperCase()}`,`${X}_${z.map((q)=>q.toUpperCase()).join("")}`,`${X}_${z.map((q)=>q.replace(/([A-Z])/g,"_$1").toUpperCase()).join("")}`],K,E;for(let q of G)if(K=P$.env[q],K!==void 0){E=q;break}if(K!==void 0&&E)if(typeof j==="boolean")Q[B]=["true","1","yes"].includes(K.toLowerCase());else if(typeof j==="number"){let q=Number(K);if(!Number.isNaN(q))Q[B]=q}else if(Array.isArray(j))try{Q[B]=JSON.parse(K)}catch{Q[B]=K.split(",").map((q)=>q.trim())}else Q[B]=K;else if(j&&typeof j==="object"&&!Array.isArray(j))Q[B]=J(j,z)}return Q}return J($)}function h7(w){let $=i0(P$.cwd(),w.configDir),Y=i0(P$.cwd(),w.generatedDir),A=i0(Y,"config-types.ts");if(!dJ(bB(A)))RK(bB(A),{recursive:!0,mode:511});let X=dJ($)?MK($).map((U)=>U.replace(/\.(ts|js|mjs|cjs|mts|cts|json)$/,"")).sort():[],J=`// Generated by bunfig v${WF}
33
+ `;return Y}}function y7(w,$){let Y=hj("process");if(typeof Y>"u"||!Y.env)return $;let A=Y.env[w];return A!==void 0?A:$}function _j(w,$,Y={}){return Sj(w,$,Y,new WeakMap)}function Sj(w,$,Y,A){let{arrayMergeMode:X="replace",skipNullish:J=!1,customMerger:U}=Y;if($===null||$===void 0)return J?w:$;if(U){let W=U(w,$);if(W!==void 0)return W}if(Array.isArray($)||Array.isArray(w))return Zj(w,$,X,A);if(!Jw($)||!Jw(w))return $;return S7(w,$,Y,A)}function Zj(w,$,Y,A){if(Array.isArray($)&&!Array.isArray(w))return $;if(Array.isArray(w)&&!Array.isArray($))return $;if(Array.isArray($)&&Array.isArray(w))switch(Y){case"replace":return $;case"concat":return O7(w,$);case"smart":return L7(w,$,A);default:return $}return $}function O7(w,$){let Y=[...$];for(let A of w)if(!Y.some((X)=>rJ(X,A)))Y.push(A);return Y}function L7(w,$,Y){if($.length===0)return w;if(w.length===0)return $;if(Jw($[0])&&Jw(w[0]))return _7(w,$,Y);if($.every((A)=>typeof A==="string")&&w.every((A)=>typeof A==="string")){let A=[...$];for(let X of w)if(!A.includes(X))A.push(X);return A}return $}function _7(w,$,Y){let A=[...$];for(let X of w){if(!Jw(X)){A.push(X);continue}let J=["id","name","key","path","type"],U=!1;for(let W of J)if(W in X){if(A.find((B)=>Jw(B)&&(W in B)&&B[W]===X[W])){U=!0;break}}if(!U)A.push(X)}return A}function S7(w,$,Y,A){let X=$;if(Jw(X)&&A.has(X))return A.get(X);let J={...w};if(Jw(X))A.set(X,J);for(let U in X){if(!Object.prototype.hasOwnProperty.call(X,U))continue;let W=X[U],Q=J[U];if(Y.skipNullish&&(W===null||W===void 0))continue;if(W===null||W===void 0){J[U]=W;continue}if(Jw(W)&&Jw(Q))J[U]=Sj(Q,W,Y,A);else if(Array.isArray(W)||Array.isArray(Q))J[U]=Zj(Q,W,Y.arrayMergeMode||"smart",A);else J[U]=W}return J}function BU(w,$,Y="replace"){return _j(w,$,{arrayMergeMode:Y==="replace"?"replace":"smart",skipNullish:!0})}function rJ(w,$){if(w===$)return!0;if(Array.isArray(w)&&Array.isArray($)){if(w.length!==$.length)return!1;for(let Y=0;Y<w.length;Y++)if(!rJ(w[Y],$[Y]))return!1;return!0}if(Jw(w)&&Jw($)){let Y=Object.keys(w),A=Object.keys($);if(Y.length!==A.length)return!1;for(let X of Y){if(!Object.prototype.hasOwnProperty.call($,X))return!1;if(!rJ(w[X],$[X]))return!1}return!0}return!1}function Jw(w){return Boolean(w&&typeof w==="object"&&!Array.isArray(w))}class lA{extensions=[".ts",".js",".mjs",".cjs",".json",".mts",".cts"];async loadFromPath(w,$,Y={}){let{arrayStrategy:A="replace",useCache:X=!0,cacheTtl:J,trackPerformance:U=!0,verbose:W=!1}=Y;if(X){let B=G1.getWithFileCheck("file",w);if(B){if(W)console.log(`Configuration loaded from cache: ${w}`);return B}}let Q=async()=>{if(!NA(w))return null;try{let B=`?t=${Date.now()}`,j=await import(w+B),z=j.default||j,G="default"in j,K=Object.keys(j).length>0;if(!G&&!K)throw new NY(w,Error("Configuration file is empty and exports nothing"),"unknown");if(typeof z!=="object"||z===null||Array.isArray(z))throw new NY(w,Error("Configuration must export a valid object"),"unknown");let N={config:BU($,z,A),source:{type:"file",path:w,priority:100,timestamp:new Date}};if(X)G1.setWithFileCheck("file",N,w,J);return N}catch(B){throw B instanceof Error?N$.configLoad(w,B):N$.configLoad(w,Error(String(B)))}};if(U)return fY.track("loadFromPath",Q,{path:w});return Q()}async tryLoadFromPaths(w,$,Y={}){for(let A of w)try{let X=await this.loadFromPath(A,$,Y);if(X)return X}catch(X){if(X instanceof Error&&X.name==="ConfigLoadError")throw X;if(Y.verbose)console.warn(`Failed to load config from ${A}:`,X)}return null}generateConfigPaths(w,$,Y){let A=this.generateNamePatterns(w,Y),X=[];for(let J of A)for(let U of this.extensions)X.push(DJ($,`${J}${U}`));return X}generateNamePatterns(w,$){let Y=[];if(Y.push("config",".config"),w)Y.push(w,`.${w}.config`,`${w}.config`,`.${w}`);if($){if(Y.push($,`.${$}.config`,`${$}.config`,`.${$}`),w)Y.push(`${w}.${$}.config`,`.${w}.${$}.config`)}return Y.filter(Boolean)}checkFileAccess(w){return Oj(async()=>{return NA(w)},{maxRetries:2,retryDelay:100,fallback:!1})}async discoverConfigFiles(w,$,Y){let A=[];if(!NA(w))return A;if($||Y){let X=this.generateNamePatterns($||"",Y);for(let J of X)for(let U of this.extensions){let W=DJ(w,`${J}${U}`);if(await this.checkFileAccess(W))A.push(W)}}else try{let{readdirSync:X}=await import("fs"),J=X(w);for(let U of J)if(this.looksLikeConfigFile(U)){let W=DJ(w,U);if(await this.checkFileAccess(W))A.push(W)}}catch{return[]}return A}looksLikeConfigFile(w){return[/\.config\.(ts|js|mjs|cjs|json|mts|cts)$/,/^\..*\.(ts|js|mjs|cjs|json|mts|cts)$/,/config\.(ts|js|mjs|cjs|json|mts|cts)$/].some((Y)=>Y.test(w))}async validateConfigFile(w){let $=[];try{if(!NA(w))return $.push("Configuration file does not exist"),$;let Y=await import(w),A=Y.default||Y;if(A===void 0)$.push("Configuration file must export a default value or named exports");else if(typeof A!=="object"||A===null)$.push("Configuration must be an object");else if(Array.isArray(A))$.push("Configuration cannot be an array at the root level");if(w.endsWith(".json"))try{let{readFileSync:X}=await import("fs"),J=X(w,"utf8");JSON.parse(J)}catch(X){$.push(`Invalid JSON syntax: ${X}`)}}catch(Y){$.push(`Failed to load configuration file: ${Y}`)}return $}async getFileModificationTime(w){try{let{statSync:$}=await import("fs");return $(w).mtime}catch{return null}}async preloadConfigurations(w,$={}){let Y=new Map;return await Promise.allSettled(w.map(async(A)=>{try{let X=await this.loadFromPath(A,{},$);if(X)Y.set(A,X.config)}catch(X){if($.verbose)console.warn(`Failed to preload ${A}:`,X)}})),Y}}class jU{async validateConfiguration(w,$,Y={}){let{stopOnFirstError:A=!1,validateRequired:X=!0,validateTypes:J=!0,customRules:U=[],trackPerformance:W=!0,verbose:Q=!1}=Y,B=async()=>{let j=[],z=[],G={stopOnFirstError:A,validateRequired:X,validateTypes:J,customRules:U,trackPerformance:W,verbose:Q};try{if(typeof $==="string")return await this.validateWithSchemaFile(w,$,G);else if(Array.isArray($))return this.validateWithRules(w,[...$,...U],G);else return this.validateWithJSONSchema(w,$,G)}catch(K){return j.push({path:"",message:`Validation failed: ${K}`,rule:"system"}),{isValid:!1,errors:j,warnings:z}}};if(W)return await fY.track("validateConfiguration",B);return B()}async validateWithSchemaFile(w,$,Y){try{if(!lK($))throw new EY($,[{path:"",message:"Schema file does not exist"}]);let A=await import($),X=A.default||A;if(Array.isArray(X))return this.validateWithRules(w,X,Y);else return this.validateWithJSONSchema(w,X,Y)}catch(A){throw new EY($,[{path:"",message:`Failed to load schema: ${A}`}])}}validateWithJSONSchema(w,$,Y){let A=[],X=[];return this.validateObjectAgainstSchema(w,$,"",A,X,Y),{isValid:A.length===0,errors:A,warnings:X}}validateObjectAgainstSchema(w,$,Y,A,X,J){if(J.validateTypes&&$.type){let U=Array.isArray(w)?"array":typeof w,W=Array.isArray($.type)?$.type:[$.type];if(!W.includes(U)){if(A.push({path:Y,message:`Expected type ${W.join(" or ")}, got ${U}`,expected:W.join(" or "),actual:U,rule:"type"}),J.stopOnFirstError)return}}if($.enum&&!$.enum.includes(w)){if(A.push({path:Y,message:`Value must be one of: ${$.enum.join(", ")}`,expected:$.enum.join(", "),actual:w,rule:"enum"}),J.stopOnFirstError)return}if(typeof w==="string"){if($.minLength!==void 0&&w.length<$.minLength)A.push({path:Y,message:`String length must be at least ${$.minLength}`,expected:`>= ${$.minLength}`,actual:w.length,rule:"minLength"});if($.maxLength!==void 0&&w.length>$.maxLength)A.push({path:Y,message:`String length must not exceed ${$.maxLength}`,expected:`<= ${$.maxLength}`,actual:w.length,rule:"maxLength"});if($.pattern){if(!new RegExp($.pattern).test(w))A.push({path:Y,message:`String does not match pattern ${$.pattern}`,expected:$.pattern,actual:w,rule:"pattern"})}}if(typeof w==="number"){if($.minimum!==void 0&&w<$.minimum)A.push({path:Y,message:`Value must be at least ${$.minimum}`,expected:`>= ${$.minimum}`,actual:w,rule:"minimum"});if($.maximum!==void 0&&w>$.maximum)A.push({path:Y,message:`Value must not exceed ${$.maximum}`,expected:`<= ${$.maximum}`,actual:w,rule:"maximum"})}if(Array.isArray(w)&&$.items)for(let U=0;U<w.length;U++){let W=Y?`${Y}[${U}]`:`[${U}]`;if(this.validateObjectAgainstSchema(w[U],$.items,W,A,X,J),J.stopOnFirstError&&A.length>0)return}if(w&&typeof w==="object"&&!Array.isArray(w)){let U=w;if(J.validateRequired&&$.required){for(let W of $.required)if(!(W in U)){if(A.push({path:Y?`${Y}.${W}`:W,message:`Missing required property '${W}'`,expected:"required",rule:"required"}),J.stopOnFirstError)return}}if($.properties){for(let[W,Q]of Object.entries($.properties))if(W in U){let B=Y?`${Y}.${W}`:W;if(this.validateObjectAgainstSchema(U[W],Q,B,A,X,J),J.stopOnFirstError&&A.length>0)return}}if($.additionalProperties===!1){let W=new Set(Object.keys($.properties||{}));for(let Q of Object.keys(U))if(!W.has(Q))X.push({path:Y?`${Y}.${Q}`:Q,message:`Additional property '${Q}' is not allowed`,rule:"additionalProperties"})}}}validateWithRules(w,$,Y){let A=[],X=[];for(let J of $)try{let U=this.getValueByPath(w,J.path),W=this.validateWithRule(U,J,J.path);if(A.push(...W),Y.stopOnFirstError&&A.length>0)break}catch(U){A.push({path:J.path,message:`Rule validation failed: ${U}`,rule:"system"})}return{isValid:A.length===0,errors:A,warnings:X}}validateWithRule(w,$,Y){let A=[];if($.required&&(w===void 0||w===null))return A.push({path:Y,message:$.message||`Property '${Y}' is required`,expected:"required",rule:"required"}),A;if(w===void 0||w===null)return A;if($.type){let X=Array.isArray(w)?"array":typeof w;if(X!==$.type)A.push({path:Y,message:$.message||`Expected type ${$.type}, got ${X}`,expected:$.type,actual:X,rule:"type"})}if($.min!==void 0){let X=Array.isArray(w)?w.length:typeof w==="string"?w.length:typeof w==="number"?w:0;if(X<$.min)A.push({path:Y,message:$.message||`Value must be at least ${$.min}`,expected:`>= ${$.min}`,actual:X,rule:"min"})}if($.max!==void 0){let X=Array.isArray(w)?w.length:typeof w==="string"?w.length:typeof w==="number"?w:0;if(X>$.max)A.push({path:Y,message:$.message||`Value must not exceed ${$.max}`,expected:`<= ${$.max}`,actual:X,rule:"max"})}if($.pattern&&typeof w==="string"){if(!$.pattern.test(w))A.push({path:Y,message:$.message||`Value does not match pattern ${$.pattern}`,expected:$.pattern.toString(),actual:w,rule:"pattern"})}if($.enum&&!$.enum.includes(w))A.push({path:Y,message:$.message||`Value must be one of: ${$.enum.join(", ")}`,expected:$.enum.join(", "),actual:w,rule:"enum"});if($.validator){let X=$.validator(w);if(X)A.push({path:Y,message:$.message||X,rule:"custom"})}return A}getValueByPath(w,$){if(!$)return w;let Y=$.split("."),A=w;for(let X of Y)if(A&&typeof A==="object"&&X in A)A=A[X];else return;return A}generateRulesFromInterface(w){let $=[],Y=w.matchAll(/(\w+)(\?)?:\s*(\w+)/g);for(let A of Y){let[,X,J,U]=A;$.push({path:X,required:!J,type:this.mapTypeScriptType(U)})}return $}mapTypeScriptType(w){switch(w.toLowerCase()){case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"array":return"array";case"object":return"object";default:return"object"}}static createCommonRules(){return{server:[{path:"port",required:!0,type:"number",min:1,max:65535},{path:"host",required:!0,type:"string",min:1},{path:"ssl",type:"boolean"}],database:[{path:"url",required:!0,type:"string",min:1},{path:"pool",type:"number",min:1,max:100},{path:"timeout",type:"number",min:0}],api:[{path:"baseUrl",required:!0,type:"string",pattern:uj},{path:"timeout",type:"number",min:0},{path:"retries",type:"number",min:0,max:10}]}}}class zU{fileLoader=new lA;envProcessor=new dA;validator=new jU;async loadConfig(w){let $=Date.now(),{cache:Y,performance:A,schema:X,validate:J,...U}=w;try{if(Y?.enabled){let Q=this.checkCache(U.name||"",U);if(Q)return Q}let W;try{W=await this.loadConfigurationStrategies(U,!0,Y)}catch(Q){let B=U.__strictErrorHandling;if(Q instanceof Error&&Q.name==="ConfigNotFoundError"){if(B)throw Q;W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`No configuration file found for "${U.name||"config"}", using defaults with environment variables`]}}else if(Q instanceof Error&&Q.name==="ConfigLoadError"){let j=Q.message.includes("EACCES")||Q.message.includes("EPERM")||Q.message.includes("permission denied"),z=!j&&(Q.message.includes("syntax")||Q.message.includes("Expected")||Q.message.includes("Unexpected")||Q.message.includes("BuildMessage")||Q.message.includes("errors building")),G=Q.message.includes("Configuration must export a valid object")||Q.message.includes("Configuration file is empty and exports nothing");if(B&&(G||j))throw Q;if(z&&(!B||!G))W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:["Configuration file has syntax errors, using defaults with environment variables"]};else if(!B)W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`Configuration loading error, using defaults: ${Q.message}`]};else throw Q}else W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`Configuration loading failed, using defaults: ${Q instanceof Error?Q.message:String(Q)}`]}}if(X||J)await this.validateConfiguration(W.config,X,J,U.name);if(Y?.enabled&&W)this.cacheResult(U.name||"",W,Y,U);if(A?.enabled){let Q={operation:"loadConfig",duration:Date.now()-$,configName:U.name,timestamp:new Date};if(A.onMetrics)A.onMetrics(Q);if(A.slowThreshold&&Q.duration>A.slowThreshold)qw.warn(`Slow configuration loading detected: ${Q.duration}ms for ${U.name}`);W.metrics=Q}return W}catch(W){let Q=Date.now()-$;throw qw.error(`Configuration loading failed after ${Q}ms:`,[W instanceof Error?W:Error(String(W))]),W}}async loadConfigurationStrategies(w,$=!1,Y){let{name:A="",alias:X,cwd:J,configDir:U,defaultConfig:W,checkEnv:Q=!0,arrayStrategy:B="replace",verbose:j=!1}=w,z=J||u$.cwd(),G=[],K=await this.loadLocalConfiguration(A,X,z,U,W,B,j,Q,Y);if(K)return G.push(...this.getLocalSearchPaths(A,X,z,U)),this.finalizeResult(K,G,Q,A,j);let E=await this.loadHomeConfiguration(A,X,W,B,j,Q);if(E)return G.push(...this.getHomeSearchPaths(A,X)),this.finalizeResult(E,G,Q,A,j);let q=await this.loadPackageJsonConfiguration(A,X,z,W,B,j,Q);if(q)return G.push(i0(z,"package.json")),this.finalizeResult(q,G,Q,A,j);if(G.push(...this.getAllSearchPaths(A,X,z,U)),$)throw N$.configNotFound(A,G,X);return{...await this.applyEnvironmentVariables(A,W,Q,j),warnings:[`No configuration file found for "${A}"${X?` or alias "${X}"`:""}, using defaults with environment variables`]}}async loadLocalConfiguration(w,$,Y,A,X,J,U,W,Q){let B=W?FY(w,X,U):X,j=this.getLocalDirectories(Y,A);for(let z of j){if(U)qw.info(`Searching for configuration in: ${z}`);let G=this.fileLoader.generateConfigPaths(w,z,$),K=await this.fileLoader.tryLoadFromPaths(G,B,{arrayStrategy:J,verbose:U,cacheTtl:Q?.ttl,useCache:!Q?.ttl||Q.ttl>100});if(K){if(U)qw.success(`Configuration loaded from: ${K.source.path}`);return K}}return null}async loadHomeConfiguration(w,$,Y,A,X,J){if(!w)return null;let U=J?FY(w,Y,X):Y,W=[i0(Y1(),".config",w),i0(Y1(),".config"),Y1()];for(let Q of W){if(X)qw.info(`Checking home directory: ${Q}`);let B=this.fileLoader.generateConfigPaths(w,Q,$),j=await this.fileLoader.tryLoadFromPaths(B,U,{arrayStrategy:A,verbose:X});if(j){if(X)qw.success(`Configuration loaded from home directory: ${j.source.path}`);return j}}return null}async loadPackageJsonConfiguration(w,$,Y,A,X,J,U){let W=U?FY(w,A,J):A;try{let Q=i0(Y,"package.json");if(!nJ(Q))return null;let B=await import(Q),j=B[w],z=w;if(!j&&$)j=B[$],z=$;if(j&&typeof j==="object"&&!Array.isArray(j)){if(J)qw.success(`Configuration loaded from package.json: ${z}`);return{config:BU(W,j,X),source:{type:"package.json",path:Q,priority:30,timestamp:new Date}}}}catch(Q){if(J)qw.warn("Failed to load package.json:",[Q instanceof Error?Q:Error(String(Q))])}return null}async applyEnvironmentVariables(w,$,Y,A){if(!Y||!w||typeof $!=="object"||$===null||Array.isArray($))return{config:$,source:{type:"default",priority:10,timestamp:new Date}};return{config:FY(w,$,A),source:{type:"environment",priority:20,timestamp:new Date}}}async finalizeResult(w,$,Y,A,X){return{config:w.config,source:w.source,path:w.source.path}}async validateConfiguration(w,$,Y,A){let X=[];if(Y){let J=Y(w);if(J)X.push(...J)}if($){let J=await this.validator.validateConfiguration(w,$);if(!J.isValid)X.push(...J.errors.map((U)=>U.path?`${U.path}: ${U.message}`:U.message))}if(X.length>0)throw N$.configValidation(A||"unknown",X,A)}checkCache(w,$){let Y=this.generateCacheKey(w,$);return G1.get(Y)||null}cacheResult(w,$,Y,A){let X=this.generateCacheKey(w,A);G1.set(X,$,void 0,Y.ttl)}generateCacheKey(w,$){let Y=[w];if($.alias)Y.push(`alias:${$.alias}`);if($.cwd)Y.push(`cwd:${$.cwd}`);if($.configDir)Y.push(`configDir:${$.configDir}`);if("checkEnv"in $)Y.push(`checkEnv:${$.checkEnv}`);return Y.join("|")}getLocalDirectories(w,$){return Array.from(new Set([w,i0(w,"config"),i0(w,".config"),$?i0(w,$):void 0].filter(Boolean)))}getAllSearchPaths(w,$,Y,A){let X=[];return X.push(...this.getLocalSearchPaths(w,$,Y,A)),X.push(...this.getHomeSearchPaths(w,$)),X.push(i0(Y,"package.json")),X}getLocalSearchPaths(w,$,Y,A){let X=this.getLocalDirectories(Y,A),J=[];for(let U of X)J.push(...this.fileLoader.generateConfigPaths(w,U,$));return J}getHomeSearchPaths(w,$){if(!w)return[];let Y=[i0(Y1(),".config",w),i0(Y1(),".config"),Y1()],A=[];for(let X of Y)A.push(...this.fileLoader.generateConfigPaths(w,X,$));return A}async loadConfigWithResult(w){return this.loadConfig(w)}}function Qj(w){let Y=!(w.message.includes("EACCES")||w.message.includes("EPERM")||w.message.includes("permission denied"))&&(w.message.includes("syntax")||w.message.includes("Expected")||w.message.includes("Unexpected")||w.message.includes("BuildMessage")),A=w.message.includes("Configuration must export a valid object")||w.message.includes("Configuration file is empty and exports nothing");return Y||A}async function Z7(w){return dw.loadConfig({...w,__strictErrorHandling:!0})}async function kj(w){let $="defaultConfig"in w&&w.defaultConfig!==void 0?w.defaultConfig:{},Y="cache"in w||"performance"in w||"schema"in w||"validate"in w;try{let A;if(Y)A=await dw.loadConfig(w);else A=await dw.loadConfig({...w,defaultConfig:$,cache:{enabled:!0},performance:{enabled:!1}});return A?.config??$}catch(A){let X=A instanceof Error?A.name:"UnknownError",J=A instanceof Error?A.message:String(A);if(!(X==="ConfigNotFoundError"||X==="ConfigLoadError"||X==="ConfigValidationError"||J.includes("config"))&&w.verbose)qw.warn("Unexpected error loading config, using defaults:",[A instanceof Error?A:Error(String(A))]);let W=Y?{...w,defaultConfig:$}:{...w,defaultConfig:$,cache:{enabled:!0},performance:{enabled:!1}};if("checkEnv"in w?w.checkEnv!==!1:!0)return(await dw.applyEnvironmentVariables(W.name||"",$,!0,W.verbose||!1))?.config??$;return $}}async function k7(w={defaultConfig:{}}){if(typeof w==="string"){let{cwd:$}=await import("process");try{return(await dw.loadConfig({name:w,cwd:$(),generatedDir:"./generated",configDir:"./config",defaultConfig:{},checkEnv:!0,arrayStrategy:"replace"})).config}catch(Y){if(Y instanceof Error&&(Y.name==="ConfigNotFoundError"||Y.name==="ConfigLoadError"&&Qj(Y)))return(await dw.applyEnvironmentVariables(w,{},!0,!1)).config;throw Y}}try{return(await dw.loadConfig({...w,cwd:w.cwd||u$.cwd(),cache:{enabled:!0},performance:{enabled:!1}})).config}catch($){if($ instanceof Error&&($.name==="ConfigNotFoundError"||$.name==="ConfigLoadError"&&Qj($)))return(await dw.applyEnvironmentVariables(w.name||"",w.defaultConfig||{},w.checkEnv!==!1,w.verbose||!1)).config;throw $}}async function h7(w,$,Y="replace"){let A=new lA;try{let X=await A.loadFromPath(w,$,{arrayStrategy:Y,useCache:!1,trackPerformance:!1});return X?X.config:null}catch{return null}}function FY(w,$,Y=!1){let A=new dA,X=w.toUpperCase().replace(/[^A-Z0-9]/g,"_");function J(U,W=[]){let Q={...U};for(let[B,j]of Object.entries(U)){let z=[...W,B],G=[`${X}_${z.join("_").toUpperCase()}`,`${X}_${z.map((q)=>q.toUpperCase()).join("")}`,`${X}_${z.map((q)=>q.replace(/([A-Z])/g,"_$1").toUpperCase()).join("")}`],K,E;for(let q of G)if(K=u$.env[q],K!==void 0){E=q;break}if(K!==void 0&&E)if(typeof j==="boolean")Q[B]=["true","1","yes"].includes(K.toLowerCase());else if(typeof j==="number"){let q=Number(K);if(!Number.isNaN(q))Q[B]=q}else if(Array.isArray(j))try{Q[B]=JSON.parse(K)}catch{Q[B]=K.split(",").map((q)=>q.trim())}else Q[B]=K;else if(j&&typeof j==="object"&&!Array.isArray(j))Q[B]=J(j,z)}return Q}return J($)}function D7(w){let $=i0(u$.cwd(),w.configDir),Y=i0(u$.cwd(),w.generatedDir),A=i0(Y,"config-types.ts");if(!nJ(uB(A)))MK(uB(A),{recursive:!0,mode:511});let X=nJ($)?IK($).map((U)=>U.replace(/\.(ts|js|mjs|cjs|mts|cts|json)$/,"")).sort():[],J=`// Generated by bunfig v${BF}
34
34
  export type ConfigNames = ${X.length?`'${X.join("' | '")}'`:"string"}
35
- `;IK(A,J,{mode:438})}function D7(w){let $=null,Y=null,A=()=>{if(!Y)Y=Zj(w).then((J)=>{return $=J,J},(J)=>{let U="defaultConfig"in w?w.defaultConfig:{};if($=U,"verbose"in w&&w.verbose)qw.warn("Config loading failed, using defaults:",[J instanceof Error?J:Error(String(J))]);return U});return Y},X="defaultConfig"in w?w.defaultConfig:{};return $=X,A(),new Proxy({},{get(J,U){if($)return $[U];let W=X[U];return A(),W},has(J,U){return U in($||X)},ownKeys(){return Object.keys($||X)},getOwnPropertyDescriptor(J,U){return Object.getOwnPropertyDescriptor($||X,U)},set(J,U,W){if(!$)$={...X};return $[U]=W,!0}})}function x7(w){let $=oB(pK.cwd(),w?.configDir||"./config");function Y(){if(!lK($))return[];let X=new Set([".ts",".js",".mjs",".cjs",".mts",".cts",".json"]),J=[".ts",".mts",".cts",".js",".mjs",".cjs",".json"],U=nK($).filter((Q)=>X.has(hJ(Q))).map((Q)=>({base:Q.replace(/\.(?:ts|js|mjs|cjs|mts|cts|json)$/i,""),file:Q})),W=new Map;for(let{base:Q,file:B}of U){let j=hJ(B).toLowerCase(),z=W.get(Q);if(!z){W.set(Q,B);continue}let G=hJ(z).toLowerCase();if(J.indexOf(j)<J.indexOf(G))W.set(Q,B)}return Array.from(W.entries()).map(([Q,B])=>({base:Q,file:B})).sort((Q,B)=>Q.base.localeCompare(B.base))}function A(){let X=Y(),J=X.map((B)=>B.base),U=J.length?J.map((B)=>`'${B}'`).join(" | "):"string",W=X.length?`{
36
- ${X.map((B)=>{let j=oB($,B.file).replace(/\\/g,"/");return` '${B.base}': typeof import('${j}').default`}).join(`,
35
+ `;VK(A,J,{mode:438})}function x7(w){let $=null,Y=null,A=()=>{if(!Y)Y=kj(w).then((J)=>{return $=J,J},(J)=>{let U="defaultConfig"in w?w.defaultConfig:{};if($=U,"verbose"in w&&w.verbose)qw.warn("Config loading failed, using defaults:",[J instanceof Error?J:Error(String(J))]);return U});return Y},X="defaultConfig"in w?w.defaultConfig:{};return $=X,A(),new Proxy({},{get(J,U){if($)return $[U];let W=X[U];return A(),W},has(J,U){return U in($||X)},ownKeys(){return Object.keys($||X)},getOwnPropertyDescriptor(J,U){return Object.getOwnPropertyDescriptor($||X,U)},set(J,U,W){if(!$)$={...X};return $[U]=W,!0}})}function P7(w){let $=eB(rK.cwd(),w?.configDir||"./config");function Y(){if(!nK($))return[];let X=new Set([".ts",".js",".mjs",".cjs",".mts",".cts",".json"]),J=[".ts",".mts",".cts",".js",".mjs",".cjs",".json"],U=pK($).filter((Q)=>X.has(xJ(Q))).map((Q)=>({base:Q.replace(/\.(?:ts|js|mjs|cjs|mts|cts|json)$/i,""),file:Q})),W=new Map;for(let{base:Q,file:B}of U){let j=xJ(B).toLowerCase(),z=W.get(Q);if(!z){W.set(Q,B);continue}let G=xJ(z).toLowerCase();if(J.indexOf(j)<J.indexOf(G))W.set(Q,B)}return Array.from(W.entries()).map(([Q,B])=>({base:Q,file:B})).sort((Q,B)=>Q.base.localeCompare(B.base))}function A(){let X=Y(),J=X.map((B)=>B.base),U=J.length?J.map((B)=>`'${B}'`).join(" | "):"string",W=X.length?`{
36
+ ${X.map((B)=>{let j=eB($,B.file).replace(/\\/g,"/");return` '${B.base}': typeof import('${j}').default`}).join(`,
37
37
  `)}
38
38
  }`:"Record<string, any>";return`export type ConfigNames = ${U}
39
39
  export type ConfigByName = ${W}
40
40
  export type Config<N extends ConfigNames> = N extends keyof ConfigByName ? ConfigByName[N] : unknown
41
41
  export type ConfigOf = Config
42
- `}return{name:"bunfig-plugin",setup(X){X.onResolve({filter:/^virtual:bunfig-types$/},(J)=>{return{path:J.path,namespace:"bunfig-virtual"}}),X.onLoad({filter:/^virtual:bunfig-types$/,namespace:"bunfig-virtual"},()=>{return{contents:A(),loader:"ts"}})}}}function jF(w,$={}){let Y=ZA.cwd();while(Y.includes("storage"))Y=eB(Y,"..");let A=eB(Y,w||"");if($?.relative)return tK(ZA.cwd(),A);return A}function N0(){if(gw.env.NODE_ENV==="test"||gw.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function GF(){if(gw.env.NODE_ENV==="test"||gw.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof gw<"u"){let w=gw.type;if(w==="renderer"||w==="worker")return!1;return!!(gw.versions&&(gw.versions.node||gw.versions.bun))}return!1}class ij{async format(w){let $=await GF(),Y=await this.getMetadata($);return JSON.stringify({timestamp:w.timestamp.toISOString(),level:w.level,name:w.name,message:w.message,metadata:Y})}async getMetadata(w){if(w){let{hostname:$}=await import("os");return{pid:j1.pid,hostname:$(),environment:j1.env.NODE_ENV||"development",platform:j1.platform,version:j1.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:j1.env.NODE_ENV||j1.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}class dA{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(w,$={}){this.name=w,this.config={...uA},this.options=this.normalizeOptions($),this.formatter=this.options.formatter||new ij,this.enabled=$.enabled??!0,this.fancy=$.fancy??!0,this.tagFormat=$.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=$.timestampPosition??"right",this.environment=$.environment??D.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig($);let Y={...$},A=$.timestamp!==void 0;if(A)delete Y.timestamp;if(this.config={...this.config,...Y,timestamp:A||this.config.timestamp,level:this.options.level??"info"},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let X=this.generateKeyId(),J=this.generateKey();this.currentKeyId=X,this.keys.set(X,J),this.encryptionKeys.set(X,{key:J,createdAt:new Date}),this.setupKeyRotation()}}shouldActivateFingersCrossed(w){if(!this.fingersCrossedConfig)return!1;let $={debug:0,info:1,success:2,warning:3,error:4},Y=this.fingersCrossedConfig.activationLevel??"error";return $[w]>=$[Y]}initializeFingersCrossedConfig(w){if(!w.fingersCrossedEnabled&&w.fingersCrossed)return{...iJ,...w.fingersCrossed};if(!w.fingersCrossedEnabled)return null;if(!w.fingersCrossed)return{...iJ};return{...iJ,...w.fingersCrossed}}normalizeOptions(w){let $={format:"json",level:"info",logDirectory:uA.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,showIcons:!0,formatter:void 0},Y={...$,...Object.fromEntries(Object.entries(w).filter(([,A])=>A!==void 0))};if(!Y.level||!["debug","info","success","warning","error"].includes(Y.level))Y.level=$.level;return Y}shouldWriteToFile(){return!N0()&&this.config.writeToFile===!0}async writeToFile(w){let Y=(async()=>{let X,J=0,U=3,W=1000;while(J<U)try{try{try{await w7(this.config.logDirectory,Aj.F_OK|Aj.W_OK)}catch(B){if(B instanceof Error&&"code"in B)if(B.code==="ENOENT")await $7(this.config.logDirectory,{recursive:!0,mode:493});else if(B.code==="EACCES")throw Error(`No write permission for log directory: ${this.config.logDirectory}`);else throw B;else throw B}}catch(B){throw console.error("Debug: [writeToFile] Failed to create log directory:",B),B}let Q=this.validateEncryptionConfig()?(await this.encrypt(w)).encrypted:vw.from(w);try{if(!qA(this.currentLogFile))await PJ(this.currentLogFile,"",{mode:420});if(X=Yj(this.currentLogFile,"a",420),eK(X,Q,{flag:"a"}),$j(X),X!==void 0)xJ(X),X=void 0;if((await W1(this.currentLogFile)).size===0){if(await PJ(this.currentLogFile,Q,{flag:"w",mode:420}),(await W1(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(B){let j=B;if(j.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(j.code)){if(J<U-1){let z=typeof j.message==="string"?j.message:"Unknown error";console.error(`Network error during write attempt ${J+1}/${U}:`,z);let G=W*2**J;await new Promise((K)=>setTimeout(K,G)),J++;continue}}if(j?.code&&["ENOSPC","EDQUOT"].includes(j.code))throw Error(`Disk quota exceeded or no space left on device: ${j.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",j),j}finally{if(X!==void 0)try{xJ(X)}catch(B){console.error("Debug: [writeToFile] Error closing file descriptor:",B)}}}catch(Q){if(J===U-1){let j=Q,z=typeof j.message==="string"?j.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",z),Q}J++;let B=W*2**(J-1);await new Promise((j)=>setTimeout(j,B))}})();this.pendingOperations.push(Y);let A=this.pendingOperations.length-1;try{await Y}catch(X){throw console.error("Debug: [writeToFile] Error in operation:",X),X}finally{this.pendingOperations.splice(A,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 B1(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 B1(this.config.logDirectory,`${this.name}.log`);let w=new Date().toISOString().split("T")[0];return B1(this.config.logDirectory,`${this.name}-${w}.log`)}setupRotation(){if(N0())return;if(!this.shouldWriteToFile())return;if(typeof this.config.rotation==="boolean")return;let w=this.config.rotation,$;switch(w.frequency){case"daily":$=86400000;break;case"weekly":$=604800000;break;case"monthly":$=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},$)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let $=this.config.rotation.keyRotation;if(!$?.enabled)return;let Y=typeof $.interval==="number"?$.interval:60,A=Math.max(Y,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((X)=>{console.error("Error rotating keys:",X)})},A)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let $=this.config.rotation.keyRotation,Y=this.generateKeyId(),A=this.generateKey();this.currentKeyId=Y,this.keys.set(Y,A),this.encryptionKeys.set(Y,{key:A,createdAt:new Date});let X=Array.from(this.encryptionKeys.entries()).sort(([,W],[,Q])=>Q.createdAt.getTime()-W.createdAt.getTime()),J=typeof $.maxKeys==="number"?$.maxKeys:1,U=Math.max(1,J);if(X.length>U)for(let[W]of X.slice(U))this.encryptionKeys.delete(W),this.keys.delete(W)}generateKeyId(){return DJ(16).toString("hex")}generateKey(){return DJ(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let w=this.keys.get(this.currentKeyId);if(!w)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:w,id:this.currentKeyId}}encrypt(w){let{key:$}=this.getCurrentKey(),Y=DJ(16),A=aK("aes-256-gcm",$,Y),X=vw.isBuffer(w)?w:vw.from(w,"utf8"),J=A.update(X),U=A.final(),W=J.length+U.length,Q=A.getAuthTag(),B=vw.allocUnsafe(16+W+16);return Y.copy(B,0),J.copy(B,16),U.copy(B,16+J.length),Q.copy(B,16+W),{encrypted:B,iv:Y}}async compressData(w){return new Promise(($,Y)=>{let A=Jj(),X=[];A.on("data",(J)=>X.push(J)),A.on("end",()=>$(vw.from(vw.concat(X)))),A.on("error",Y),A.write(w),A.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let w={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let $=this.config.rotation.encrypt;return{...w,...$}}return w}async rotateLog(){if(N0())return;if(!this.shouldWriteToFile())return;let w=await W1(this.currentLogFile).catch(()=>null);if(!w)return;let $=this.config.rotation;if(typeof $==="boolean")return;if($.maxSize&&w.size>=$.maxSize){let Y=this.currentLogFile,A=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let X=await NA(this.config.logDirectory),J=X.filter((Q)=>Q.startsWith(this.name)&&/\.log\.\d+$/.test(Q)).sort((Q,B)=>{let j=Number.parseInt(Q.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(B.match(/\.log\.(\d+)$/)?.[1]||"0")-j}),U=J.length>0?Number.parseInt(J[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,W=`${Y}.${U}`;if(await W1(Y).catch(()=>null))try{if(await Xj(Y,W),$.compress)try{let Q=`${W}.gz`;await this.compressLogFile(W,Q),await EA(W)}catch(Q){console.error("Error compressing rotated file:",Q)}if(J.length===0&&!X.some((Q)=>Q.endsWith(".log.1")))try{let Q=`${Y}.1`;await PJ(Q,"")}catch(Q){console.error("Error creating backup file:",Q)}}catch(Q){console.error(`Error during rotation: ${Q instanceof Error?Q.message:String(Q)}`)}}else{let X=new Date().toISOString().replace(/[:.]/g,"-"),J=Y.replace(/\.log$/,`-${X}.log`);if(await W1(Y).catch(()=>null))await Xj(Y,J)}if(this.currentLogFile=A,$.maxFiles){let J=(await NA(this.config.logDirectory)).filter((U)=>U.startsWith(this.name)).sort((U,W)=>W.localeCompare(U));for(let U of J.slice($.maxFiles))await EA(B1(this.config.logDirectory,U))}}}async compressLogFile(w,$){let Y=wj(w),A=oK($),X=Jj();await X7(Y,X,A)}async handleFingersCrossedBuffer(w,$){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(w)&&!this.isActivated){this.isActivated=!0;for(let Y of this.logBuffer){let A=await this.formatter.format(Y);if(this.shouldWriteToFile())await this.writeToFile(A);console.log(A)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated){if(this.shouldWriteToFile())await this.writeToFile($);console.log($)}}shouldLog(w){if(!this.enabled)return!1;let $={debug:0,info:1,success:2,warning:3,error:4};return $[w]>=$[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((w)=>{if(w instanceof Promise)return w.catch(($)=>{console.error("Error in pending write operation:",$)});return Promise.resolve()})),qA(this.currentLogFile))try{let w=Yj(this.currentLogFile,"r+");$j(w),xJ(w)}catch(w){console.error(`Error flushing file: ${w}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let w of this.pendingOperations)if(typeof w.cancel==="function")w.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(w){console.error("Error waiting for pending operations:",w)}if(!N0()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let $=(await NA(this.config.logDirectory)).filter((Y)=>(Y.includes("temp")||Y.includes(".tmp"))&&Y.includes(this.name));for(let Y of $)try{await EA(B1(this.config.logDirectory,Y))}catch(A){console.error(`Failed to delete temp file ${Y}:`,A)}}catch(w){console.error("Error cleaning up temporary files:",w)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(w){if(!w)return"";return`${this.tagFormat.prefix}${w}${this.tagFormat.suffix}`}formatFileTimestamp(w){return`[${w.toISOString()}]`}formatConsoleTimestamp(w){return this.shouldStyleConsole()?i.gray(w.toLocaleTimeString()):w.toLocaleTimeString()}shouldStyleConsole(){if(!this.fancy||N0())return!1;let w=typeof D.env.NO_COLOR<"u",$=D.env.FORCE_COLOR==="0";if(w||$)return!1;return!!(typeof D.stderr<"u"&&D.stderr.isTTY||typeof D.stdout<"u"&&D.stdout.isTTY)}formatConsoleMessage(w){let{timestamp:$,icon:Y="",tag:A="",message:X,level:J,showTimestamp:U=!0}=w,W=(K)=>K.replace(this.ANSI_PATTERN,"");if(!this.fancy){let K=[];if(U)K.push($);if(J==="warning")K.push("WARN");else if(J==="error")K.push("ERROR");else if(Y)K.push(Y.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(A)K.push(A.replace(/[[\]]/g,""));return K.push(X),K.join(" ")}let Q=D.stdout.columns||120,B="";if(J==="warning"||J==="error")B=`${Y} ${X}`;else if(J==="info"||J==="success")B=`${Y} ${A} ${X}`;else B=`${Y} ${A} ${i.cyan(X)}`;if(!U)return B.trim();let j=W(B).trim().length,z=W($).length,G=Math.max(1,Q-2-j-z);return`${B.trim()}${" ".repeat(G)}${$}`}formatMessage(w,$){if($.length===1&&Array.isArray($[0]))return w.replace(/\{(\d+)\}/g,(J,U)=>{let W=Number.parseInt(U,10);return W<$[0].length?String($[0][W]):J});let Y=/%([sdijfo%])/g,A=0,X=w.replace(Y,(J,U)=>{if(U==="%")return"%";if(A>=$.length)return J;let W=$[A++];switch(U){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 J}});if(A<$.length)X+=` ${$.slice(A).map((J)=>typeof J==="object"?JSON.stringify(J,null,2):String(J)).join(" ")}`;return X}formatMarkdown(w){if(!w)return w;let $=w;return $=$.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(Y,A,X)=>{let J=i.underline(i.blue(A)),U=this.toAbsoluteFilePath(X);if(U&&this.shouldStyleConsole()&&this.supportsHyperlinks()){let W=`file://${encodeURI(U)}`,Q="\x1B]8;;",B="\x1B\\";return`\x1B]8;;${W}\x1B\\${J}\x1B]8;;\x1B\\`}if(this.shouldStyleConsole()&&this.supportsHyperlinks())return`\x1B]8;;${X}\x1B\\${J}\x1B]8;;\x1B\\`;return J}),$=$.replace(/`([^`]+)`/g,(Y,A)=>i.bgGray(A)),$=$.replace(/\*\*([^*]+)\*\*/g,(Y,A)=>i.bold(A)),$=$.replace(/(?<!\*)\*([^*]+)\*(?!\*)/g,(Y,A)=>i.italic(A)),$=$.replace(/(?<!_)_([^_]+)_(?!_)/g,(Y,A)=>i.italic(A)),$=$.replace(/~([^~]+)~/g,(Y,A)=>i.strikethrough(A)),$}supportsHyperlinks(){if(N0())return!1;let w=D.env;if(!w)return!1;if(w.TERM_PROGRAM==="iTerm.app"||w.TERM_PROGRAM==="vscode"||w.TERM_PROGRAM==="WezTerm")return!0;if(w.WT_SESSION)return!0;if(w.TERM==="xterm-kitty")return!0;let $=w.VTE_VERSION?Number.parseInt(w.VTE_VERSION,10):0;if(!Number.isNaN($)&&$>=5000)return!0;return!1}toAbsoluteFilePath(w){try{let $=w;if($.startsWith("file://"))$=$.replace(/^file:\/\//,"");if($.startsWith("~")){let Y=D.env.HOME||"";if(Y)$=$.replace(/^~(?=$|\/)/,Y)}if(Y7($)||$.startsWith("./")||$.startsWith("../"))$=A7($);else return null;return qA($)?$:null}catch{return null}}buildOutputTexts(w){let $=this.shouldStyleConsole()?this.formatMarkdown(w):w,Y=w.replace(this.ANSI_PATTERN,"");return{consoleText:$,fileText:Y}}async log(w,$,...Y){if(!this.shouldLog(w))return;let A=new Date,X=this.formatConsoleTimestamp(A),J=this.formatFileTimestamp(A),U,W;if($ instanceof Error)U=$.message,W=$.stack;else U=this.formatMessage($,Y);let{consoleText:Q,fileText:B}=this.buildOutputTexts(U);if(this.shouldStyleConsole()){let z=this.options.showIcons===!1?"":EF[w],G=this.options.showTags!==!1&&this.name?i.gray(this.formatTag(this.name)):"",K;switch(w){case"debug":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:i.gray(Q),level:w}),console.error(K);break;case"info":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.warn(K);break;case"success":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:i.green(Q),level:w}),console.error(K);break;case"warning":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.warn(K);break;case"error":if(K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.error(K),W){let E=W.split(`
42
+ `}return{name:"bunfig-plugin",setup(X){X.onResolve({filter:/^virtual:bunfig-types$/},(J)=>{return{path:J.path,namespace:"bunfig-virtual"}}),X.onLoad({filter:/^virtual:bunfig-types$/,namespace:"bunfig-virtual"},()=>{return{contents:A(),loader:"ts"}})}}}function zF(w,$={}){let Y=hA.cwd();while(Y.includes("storage"))Y=wj(Y,"..");let A=wj(Y,w||"");if($?.relative)return aK(hA.cwd(),A);return A}function N0(){if(gw.env.NODE_ENV==="test"||gw.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function KF(){if(gw.env.NODE_ENV==="test"||gw.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof gw<"u"){let w=gw.type;if(w==="renderer"||w==="worker")return!1;return!!(gw.versions&&(gw.versions.node||gw.versions.bun))}return!1}class mj{async format(w){let $=await KF(),Y=await this.getMetadata($);return JSON.stringify({timestamp:w.timestamp.toISOString(),level:w.level,name:w.name,message:w.message,metadata:Y})}async getMetadata(w){if(w){let{hostname:$}=await import("os");return{pid:z1.pid,hostname:$(),environment:z1.env.NODE_ENV||"development",platform:z1.platform,version:z1.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:z1.env.NODE_ENV||z1.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}class nA{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(w,$={}){this.name=w,this.config={...vA},this.options=this.normalizeOptions($),this.formatter=this.options.formatter||new mj,this.enabled=$.enabled??!0,this.fancy=$.fancy??!0,this.tagFormat=$.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=$.timestampPosition??"right",this.environment=$.environment??D.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig($);let Y={...$},A=$.timestamp!==void 0;if(A)delete Y.timestamp;if(this.config={...this.config,...Y,timestamp:A||this.config.timestamp,level:this.options.level??"info"},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let X=this.generateKeyId(),J=this.generateKey();this.currentKeyId=X,this.keys.set(X,J),this.encryptionKeys.set(X,{key:J,createdAt:new Date}),this.setupKeyRotation()}}shouldActivateFingersCrossed(w){if(!this.fingersCrossedConfig)return!1;let $={debug:0,info:1,success:2,warning:3,error:4},Y=this.fingersCrossedConfig.activationLevel??"error";return $[w]>=$[Y]}initializeFingersCrossedConfig(w){if(!w.fingersCrossedEnabled&&w.fingersCrossed)return{...gJ,...w.fingersCrossed};if(!w.fingersCrossedEnabled)return null;if(!w.fingersCrossed)return{...gJ};return{...gJ,...w.fingersCrossed}}normalizeOptions(w){let $={format:"json",level:"info",logDirectory:vA.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,showIcons:!0,formatter:void 0},Y={...$,...Object.fromEntries(Object.entries(w).filter(([,A])=>A!==void 0))};if(!Y.level||!["debug","info","success","warning","error"].includes(Y.level))Y.level=$.level;return Y}shouldWriteToFile(){return!N0()&&this.config.writeToFile===!0}async writeToFile(w){let Y=(async()=>{let X,J=0,U=3,W=1000;while(J<U)try{try{try{await $7(this.config.logDirectory,Xj.F_OK|Xj.W_OK)}catch(B){if(B instanceof Error&&"code"in B)if(B.code==="ENOENT")await Y7(this.config.logDirectory,{recursive:!0,mode:493});else if(B.code==="EACCES")throw Error(`No write permission for log directory: ${this.config.logDirectory}`);else throw B;else throw B}}catch(B){throw console.error("Debug: [writeToFile] Failed to create log directory:",B),B}let Q=this.validateEncryptionConfig()?(await this.encrypt(w)).encrypted:vw.from(w);try{if(!EA(this.currentLogFile))await uJ(this.currentLogFile,"",{mode:420});if(X=Aj(this.currentLogFile,"a",420),w7(X,Q,{flag:"a"}),Yj(X),X!==void 0)bJ(X),X=void 0;if((await B1(this.currentLogFile)).size===0){if(await uJ(this.currentLogFile,Q,{flag:"w",mode:420}),(await B1(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(B){let j=B;if(j.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(j.code)){if(J<U-1){let z=typeof j.message==="string"?j.message:"Unknown error";console.error(`Network error during write attempt ${J+1}/${U}:`,z);let G=W*2**J;await new Promise((K)=>setTimeout(K,G)),J++;continue}}if(j?.code&&["ENOSPC","EDQUOT"].includes(j.code))throw Error(`Disk quota exceeded or no space left on device: ${j.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",j),j}finally{if(X!==void 0)try{bJ(X)}catch(B){console.error("Debug: [writeToFile] Error closing file descriptor:",B)}}}catch(Q){if(J===U-1){let j=Q,z=typeof j.message==="string"?j.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",z),Q}J++;let B=W*2**(J-1);await new Promise((j)=>setTimeout(j,B))}})();this.pendingOperations.push(Y);let A=this.pendingOperations.length-1;try{await Y}catch(X){throw console.error("Debug: [writeToFile] Error in operation:",X),X}finally{this.pendingOperations.splice(A,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 j1(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 j1(this.config.logDirectory,`${this.name}.log`);let w=new Date().toISOString().split("T")[0];return j1(this.config.logDirectory,`${this.name}-${w}.log`)}setupRotation(){if(N0())return;if(!this.shouldWriteToFile())return;if(typeof this.config.rotation==="boolean")return;let w=this.config.rotation,$;switch(w.frequency){case"daily":$=86400000;break;case"weekly":$=604800000;break;case"monthly":$=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},$)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let $=this.config.rotation.keyRotation;if(!$?.enabled)return;let Y=typeof $.interval==="number"?$.interval:60,A=Math.max(Y,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((X)=>{console.error("Error rotating keys:",X)})},A)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let $=this.config.rotation.keyRotation,Y=this.generateKeyId(),A=this.generateKey();this.currentKeyId=Y,this.keys.set(Y,A),this.encryptionKeys.set(Y,{key:A,createdAt:new Date});let X=Array.from(this.encryptionKeys.entries()).sort(([,W],[,Q])=>Q.createdAt.getTime()-W.createdAt.getTime()),J=typeof $.maxKeys==="number"?$.maxKeys:1,U=Math.max(1,J);if(X.length>U)for(let[W]of X.slice(U))this.encryptionKeys.delete(W),this.keys.delete(W)}generateKeyId(){return PJ(16).toString("hex")}generateKey(){return PJ(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let w=this.keys.get(this.currentKeyId);if(!w)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:w,id:this.currentKeyId}}encrypt(w){let{key:$}=this.getCurrentKey(),Y=PJ(16),A=sK("aes-256-gcm",$,Y),X=vw.isBuffer(w)?w:vw.from(w,"utf8"),J=A.update(X),U=A.final(),W=J.length+U.length,Q=A.getAuthTag(),B=vw.allocUnsafe(16+W+16);return Y.copy(B,0),J.copy(B,16),U.copy(B,16+J.length),Q.copy(B,16+W),{encrypted:B,iv:Y}}async compressData(w){return new Promise(($,Y)=>{let A=Uj(),X=[];A.on("data",(J)=>X.push(J)),A.on("end",()=>$(vw.from(vw.concat(X)))),A.on("error",Y),A.write(w),A.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let w={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let $=this.config.rotation.encrypt;return{...w,...$}}return w}async rotateLog(){if(N0())return;if(!this.shouldWriteToFile())return;let w=await B1(this.currentLogFile).catch(()=>null);if(!w)return;let $=this.config.rotation;if(typeof $==="boolean")return;if($.maxSize&&w.size>=$.maxSize){let Y=this.currentLogFile,A=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let X=await fA(this.config.logDirectory),J=X.filter((Q)=>Q.startsWith(this.name)&&/\.log\.\d+$/.test(Q)).sort((Q,B)=>{let j=Number.parseInt(Q.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(B.match(/\.log\.(\d+)$/)?.[1]||"0")-j}),U=J.length>0?Number.parseInt(J[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,W=`${Y}.${U}`;if(await B1(Y).catch(()=>null))try{if(await Jj(Y,W),$.compress)try{let Q=`${W}.gz`;await this.compressLogFile(W,Q),await TA(W)}catch(Q){console.error("Error compressing rotated file:",Q)}if(J.length===0&&!X.some((Q)=>Q.endsWith(".log.1")))try{let Q=`${Y}.1`;await uJ(Q,"")}catch(Q){console.error("Error creating backup file:",Q)}}catch(Q){console.error(`Error during rotation: ${Q instanceof Error?Q.message:String(Q)}`)}}else{let X=new Date().toISOString().replace(/[:.]/g,"-"),J=Y.replace(/\.log$/,`-${X}.log`);if(await B1(Y).catch(()=>null))await Jj(Y,J)}if(this.currentLogFile=A,$.maxFiles){let J=(await fA(this.config.logDirectory)).filter((U)=>U.startsWith(this.name)).sort((U,W)=>W.localeCompare(U));for(let U of J.slice($.maxFiles))await TA(j1(this.config.logDirectory,U))}}}async compressLogFile(w,$){let Y=$j(w),A=eK($),X=Uj();await J7(Y,X,A)}async handleFingersCrossedBuffer(w,$){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(w)&&!this.isActivated){this.isActivated=!0;for(let Y of this.logBuffer){let A=await this.formatter.format(Y);if(this.shouldWriteToFile())await this.writeToFile(A);console.log(A)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated){if(this.shouldWriteToFile())await this.writeToFile($);console.log($)}}shouldLog(w){if(!this.enabled)return!1;let $={debug:0,info:1,success:2,warning:3,error:4};return $[w]>=$[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((w)=>{if(w instanceof Promise)return w.catch(($)=>{console.error("Error in pending write operation:",$)});return Promise.resolve()})),EA(this.currentLogFile))try{let w=Aj(this.currentLogFile,"r+");Yj(w),bJ(w)}catch(w){console.error(`Error flushing file: ${w}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let w of this.pendingOperations)if(typeof w.cancel==="function")w.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(w){console.error("Error waiting for pending operations:",w)}if(!N0()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let $=(await fA(this.config.logDirectory)).filter((Y)=>(Y.includes("temp")||Y.includes(".tmp"))&&Y.includes(this.name));for(let Y of $)try{await TA(j1(this.config.logDirectory,Y))}catch(A){console.error(`Failed to delete temp file ${Y}:`,A)}}catch(w){console.error("Error cleaning up temporary files:",w)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(w){if(!w)return"";return`${this.tagFormat.prefix}${w}${this.tagFormat.suffix}`}formatFileTimestamp(w){return`[${w.toISOString()}]`}formatConsoleTimestamp(w){return this.shouldStyleConsole()?i.gray(w.toLocaleTimeString()):w.toLocaleTimeString()}shouldStyleConsole(){if(!this.fancy||N0())return!1;let w=typeof D.env.NO_COLOR<"u",$=D.env.FORCE_COLOR==="0";if(w||$)return!1;return!!(typeof D.stderr<"u"&&D.stderr.isTTY||typeof D.stdout<"u"&&D.stdout.isTTY)}formatConsoleMessage(w){let{timestamp:$,icon:Y="",tag:A="",message:X,level:J,showTimestamp:U=!0}=w,W=(K)=>K.replace(this.ANSI_PATTERN,"");if(!this.fancy){let K=[];if(U)K.push($);if(J==="warning")K.push("WARN");else if(J==="error")K.push("ERROR");else if(Y)K.push(Y.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(A)K.push(A.replace(/[[\]]/g,""));return K.push(X),K.join(" ")}let Q=D.stdout.columns||120,B="";if(J==="warning"||J==="error")B=`${Y} ${X}`;else if(J==="info"||J==="success")B=`${Y} ${A} ${X}`;else B=`${Y} ${A} ${i.cyan(X)}`;if(!U)return B.trim();let j=W(B).trim().length,z=W($).length,G=Math.max(1,Q-2-j-z);return`${B.trim()}${" ".repeat(G)}${$}`}formatMessage(w,$){if($.length===1&&Array.isArray($[0]))return w.replace(/\{(\d+)\}/g,(J,U)=>{let W=Number.parseInt(U,10);return W<$[0].length?String($[0][W]):J});let Y=/%([sdijfo%])/g,A=0,X=w.replace(Y,(J,U)=>{if(U==="%")return"%";if(A>=$.length)return J;let W=$[A++];switch(U){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 J}});if(A<$.length)X+=` ${$.slice(A).map((J)=>typeof J==="object"?JSON.stringify(J,null,2):String(J)).join(" ")}`;return X}formatMarkdown(w){if(!w)return w;let $=w;return $=$.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(Y,A,X)=>{let J=i.underline(i.blue(A)),U=this.toAbsoluteFilePath(X);if(U&&this.shouldStyleConsole()&&this.supportsHyperlinks()){let W=`file://${encodeURI(U)}`,Q="\x1B]8;;",B="\x1B\\";return`\x1B]8;;${W}\x1B\\${J}\x1B]8;;\x1B\\`}if(this.shouldStyleConsole()&&this.supportsHyperlinks())return`\x1B]8;;${X}\x1B\\${J}\x1B]8;;\x1B\\`;return J}),$=$.replace(/`([^`]+)`/g,(Y,A)=>i.bgGray(A)),$=$.replace(/\*\*([^*]+)\*\*/g,(Y,A)=>i.bold(A)),$=$.replace(/(?<!\*)\*([^*]+)\*(?!\*)/g,(Y,A)=>i.italic(A)),$=$.replace(/(?<!_)_([^_]+)_(?!_)/g,(Y,A)=>i.italic(A)),$=$.replace(/~([^~]+)~/g,(Y,A)=>i.strikethrough(A)),$}supportsHyperlinks(){if(N0())return!1;let w=D.env;if(!w)return!1;if(w.TERM_PROGRAM==="iTerm.app"||w.TERM_PROGRAM==="vscode"||w.TERM_PROGRAM==="WezTerm")return!0;if(w.WT_SESSION)return!0;if(w.TERM==="xterm-kitty")return!0;let $=w.VTE_VERSION?Number.parseInt(w.VTE_VERSION,10):0;if(!Number.isNaN($)&&$>=5000)return!0;return!1}toAbsoluteFilePath(w){try{let $=w;if($.startsWith("file://"))$=$.replace(/^file:\/\//,"");if($.startsWith("~")){let Y=D.env.HOME||"";if(Y)$=$.replace(/^~(?=$|\/)/,Y)}if(A7($)||$.startsWith("./")||$.startsWith("../"))$=X7($);else return null;return EA($)?$:null}catch{return null}}buildOutputTexts(w){let $=this.shouldStyleConsole()?this.formatMarkdown(w):w,Y=w.replace(this.ANSI_PATTERN,"");return{consoleText:$,fileText:Y}}async log(w,$,...Y){if(!this.shouldLog(w))return;let A=new Date,X=this.formatConsoleTimestamp(A),J=this.formatFileTimestamp(A),U,W;if($ instanceof Error)U=$.message,W=$.stack;else U=this.formatMessage($,Y);let{consoleText:Q,fileText:B}=this.buildOutputTexts(U);if(this.shouldStyleConsole()){let z=this.options.showIcons===!1?"":fF[w],G=this.options.showTags!==!1&&this.name?i.gray(this.formatTag(this.name)):"",K;switch(w){case"debug":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:i.gray(Q),level:w}),console.error(K);break;case"info":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.warn(K);break;case"success":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:i.green(Q),level:w}),console.error(K);break;case"warning":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.warn(K);break;case"error":if(K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.error(K),W){let E=W.split(`
43
43
  `);for(let q of E)if(q.trim()&&!q.includes(U))console.error(this.formatConsoleMessage({timestamp:X,message:i.gray(` ${q}`),level:w,showTimestamp:!1}))}break}}else if(!N0()){if(console.error(`${J} ${this.environment}.${w.toUpperCase()}: ${U}`),W)console.error(W)}let j=`${J} ${this.environment}.${w.toUpperCase()}: ${B}
44
44
  `;if(W)j+=`${W}
45
45
  `;if(j=j.replace(this.ANSI_PATTERN,""),this.shouldWriteToFile())await this.writeToFile(j)}progress(w,$=""){let Y={update:(W,Q)=>{},finish:(W)=>{},interrupt:(W,Q)=>{}};if(!this.enabled)return Y;let A=30;if(this.activeProgressBar={total:Math.max(1,w||1),current:0,message:$||"",barLength:A,lastRenderedLine:""},this.shouldStyleConsole()&&!N0()&&D.stdout.isTTY)this.renderProgressBar(this.activeProgressBar);return{update:(W,Q)=>{if(!this.enabled||!this.activeProgressBar)return;if(this.activeProgressBar.current=Math.min(Math.max(0,W),this.activeProgressBar.total),Q!==void 0)this.activeProgressBar.message=Q;if(this.shouldStyleConsole()&&!N0()&&D.stdout.isTTY)this.renderProgressBar(this.activeProgressBar)},finish:(W)=>{if(!this.activeProgressBar)return;this.finishProgressBar(this.activeProgressBar,W)},interrupt:(W,Q="info")=>{if(!N0()&&D.stdout.isTTY)D.stdout.write(`
46
46
  `);if(this[Q==="warning"?"warn":Q](W),this.activeProgressBar&&this.shouldStyleConsole()&&!N0()&&D.stdout.isTTY)this.renderProgressBar(this.activeProgressBar)}}}time(w){let $=performance.now();if(this.shouldStyleConsole()){let Y=this.options.showTags!==!1&&this.name?i.gray(this.formatTag(this.name)):"",A=this.formatConsoleTimestamp(new Date);console.error(this.formatConsoleMessage({timestamp:A,icon:this.options.showIcons===!1?"":i.blue("◐"),tag:Y,message:`${i.cyan(w)}...`}))}return async(Y)=>{if(!this.enabled)return;let A=performance.now(),X=Math.round(A-$),J=`${w} completed in ${X}ms`,U=new Date,W=this.formatConsoleTimestamp(U),B=`${this.formatFileTimestamp(U)} ${this.environment}.INFO: ${J}`;if(Y)B+=` ${JSON.stringify(Y)}`;if(B+=`
47
- `,B=B.replace(this.ANSI_PATTERN,""),this.shouldStyleConsole()){let j=this.options.showTags!==!1&&this.name?i.gray(this.formatTag(this.name)):"";console.error(this.formatConsoleMessage({timestamp:W,icon:this.options.showIcons===!1?"":i.green("✓"),tag:j,message:`${J}${Y?` ${JSON.stringify(Y)}`:""}`}))}else if(!N0())console.error(B.trim());if(this.shouldWriteToFile())await this.writeToFile(B)}}async debug(w,...$){await this.log("debug",w,...$)}async info(w,...$){await this.log("info",w,...$)}async success(w,...$){await this.log("success",w,...$)}async warn(w,...$){await this.log("warning",w,...$)}async error(w,...$){await this.log("error",w,...$)}validateEncryptionConfig(){if(!this.config.rotation)return!1;if(typeof this.config.rotation==="boolean")return!1;let w=this.config.rotation,{encrypt:$}=w;return!!$}async only(w){if(!this.enabled)return;return await w()}isEnabled(){return this.enabled}setEnabled(w){this.enabled=w}extend(w){let $=`${this.name}:${w}`,Y=new dA($,{...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(Y),Y}createReadStream(){if(N0())throw Error("createReadStream is not supported in browser environments");if(!qA(this.currentLogFile))throw Error(`Log file does not exist: ${this.currentLogFile}`);return wj(this.currentLogFile,{encoding:"utf8"})}async decrypt(w){if(!this.validateEncryptionConfig())throw Error("Encryption is not configured");let $=this.config.rotation;if(!$.encrypt||typeof $.encrypt==="boolean")throw Error("Invalid encryption configuration");if(!this.currentKeyId||!this.keys.has(this.currentKeyId))throw Error("No valid encryption key available");let Y=this.keys.get(this.currentKeyId);try{let A=vw.isBuffer(w)?w:vw.from(w,"base64"),X=A.subarray(0,16),J=A.subarray(A.length-16),U=A.subarray(16,A.length-16),W=sK("aes-256-gcm",Y,X);W.setAuthTag(J);let Q=W.update(U),B=W.final(),j=Q.length+B.length,z=vw.allocUnsafe(j);return Q.copy(z,0),B.copy(z,Q.length),z.toString("utf8")}catch(A){throw Error(`Decryption failed: ${A instanceof Error?A.message:String(A)}`)}}getLevel(){return this.config.level}getLogDirectory(){return this.config.logDirectory}getFormat(){return this.config.format}getRotationConfig(){return this.config.rotation}isBrowserMode(){return N0()}isServerMode(){return!N0()}setTestEncryptionKey(w,$){this.currentKeyId=w,this.keys.set(w,$)}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(w){if(!this.enabled)return;let $=new Date,Y=this.formatConsoleTimestamp($),A=this.formatFileTimestamp($),{consoleText:X,fileText:J}=this.buildOutputTexts(w);if(this.shouldStyleConsole()){let W=X.split(`
47
+ `,B=B.replace(this.ANSI_PATTERN,""),this.shouldStyleConsole()){let j=this.options.showTags!==!1&&this.name?i.gray(this.formatTag(this.name)):"";console.error(this.formatConsoleMessage({timestamp:W,icon:this.options.showIcons===!1?"":i.green("✓"),tag:j,message:`${J}${Y?` ${JSON.stringify(Y)}`:""}`}))}else if(!N0())console.error(B.trim());if(this.shouldWriteToFile())await this.writeToFile(B)}}async debug(w,...$){await this.log("debug",w,...$)}async info(w,...$){await this.log("info",w,...$)}async success(w,...$){await this.log("success",w,...$)}async warn(w,...$){await this.log("warning",w,...$)}async error(w,...$){await this.log("error",w,...$)}validateEncryptionConfig(){if(!this.config.rotation)return!1;if(typeof this.config.rotation==="boolean")return!1;let w=this.config.rotation,{encrypt:$}=w;return!!$}async only(w){if(!this.enabled)return;return await w()}isEnabled(){return this.enabled}setEnabled(w){this.enabled=w}extend(w){let $=`${this.name}:${w}`,Y=new nA($,{...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(Y),Y}createReadStream(){if(N0())throw Error("createReadStream is not supported in browser environments");if(!EA(this.currentLogFile))throw Error(`Log file does not exist: ${this.currentLogFile}`);return $j(this.currentLogFile,{encoding:"utf8"})}async decrypt(w){if(!this.validateEncryptionConfig())throw Error("Encryption is not configured");let $=this.config.rotation;if(!$.encrypt||typeof $.encrypt==="boolean")throw Error("Invalid encryption configuration");if(!this.currentKeyId||!this.keys.has(this.currentKeyId))throw Error("No valid encryption key available");let Y=this.keys.get(this.currentKeyId);try{let A=vw.isBuffer(w)?w:vw.from(w,"base64"),X=A.subarray(0,16),J=A.subarray(A.length-16),U=A.subarray(16,A.length-16),W=oK("aes-256-gcm",Y,X);W.setAuthTag(J);let Q=W.update(U),B=W.final(),j=Q.length+B.length,z=vw.allocUnsafe(j);return Q.copy(z,0),B.copy(z,Q.length),z.toString("utf8")}catch(A){throw Error(`Decryption failed: ${A instanceof Error?A.message:String(A)}`)}}getLevel(){return this.config.level}getLogDirectory(){return this.config.logDirectory}getFormat(){return this.config.format}getRotationConfig(){return this.config.rotation}isBrowserMode(){return N0()}isServerMode(){return!N0()}setTestEncryptionKey(w,$){this.currentKeyId=w,this.keys.set(w,$)}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(w){if(!this.enabled)return;let $=new Date,Y=this.formatConsoleTimestamp($),A=this.formatFileTimestamp($),{consoleText:X,fileText:J}=this.buildOutputTexts(w);if(this.shouldStyleConsole()){let W=X.split(`
48
48
  `),Q=Math.max(...W.map((G)=>G.length))+2,B=`┌${"─".repeat(Q)}┐`,j=`└${"─".repeat(Q)}┘`,z=W.map((G)=>{return this.formatConsoleMessage({timestamp:Y,message:i.cyan(G),showTimestamp:!1})});console.error(this.formatConsoleMessage({timestamp:Y,message:i.cyan(B),showTimestamp:!1})),z.forEach((G)=>console.error(G)),console.error(this.formatConsoleMessage({timestamp:Y,message:i.cyan(j),showTimestamp:!1}))}else if(!N0())console.error(`${A} ${this.environment}.INFO: [BOX] ${J}`);let U=`${A} ${this.environment}.INFO: [BOX] ${J}
49
49
  `.replace(this.ANSI_PATTERN,"");if(this.shouldWriteToFile())await this.writeToFile(U)}async prompt(w){if(N0())return Promise.resolve(!0);return new Promise(($)=>{console.error(`${i.cyan("?")} ${w} (y/n) `);let Y=(A)=>{let X=A.toString().trim().toLowerCase();D.stdin.removeListener("data",Y);try{if(typeof D.stdin.setRawMode==="function")D.stdin.setRawMode(!1)}catch{}D.stdin.pause(),console.error(""),$(X==="y"||X==="yes")};try{if(typeof D.stdin.setRawMode==="function")D.stdin.setRawMode(!0)}catch{}D.stdin.resume(),D.stdin.once("data",Y)})}setFancy(w){this.fancy=w}isFancy(){return this.fancy}pause(){this.enabled=!1}resume(){this.enabled=!0}async start(w,...$){if(!this.enabled)return;let Y=w;if($&&$.length>0){let Q=/%([sdijfo%])/g,B=0;if(Y=w.replace(Q,(j,z)=>{if(z==="%")return"%";if(B>=$.length)return j;let G=$[B++];switch(z){case"s":return String(G);case"d":case"i":return Number(G).toString();case"j":case"o":return JSON.stringify(G,null,2);default:return j}}),B<$.length)Y+=` ${$.slice(B).map((j)=>typeof j==="object"?JSON.stringify(j,null,2):String(j)).join(" ")}`}let{consoleText:A,fileText:X}=this.buildOutputTexts(Y);if(this.shouldStyleConsole()){let Q=this.options.showTags!==!1&&this.name?i.gray(this.formatTag(this.name)):"",B=this.options.showIcons===!1?"":`${i.blue("◐")} `;console.error(`${B}${Q} ${i.cyan(A)}`)}let W=`[${new Date().toISOString()}] ${this.environment}.INFO: [START] ${X}
50
50
  `.replace(this.ANSI_PATTERN,"");if(this.shouldWriteToFile())await this.writeToFile(W)}renderProgressBar(w,$=!1){if(!this.enabled||!this.shouldStyleConsole()||!D.stdout.isTTY)return;let Y=Math.min(100,Math.max(0,Math.round(w.current/w.total*100))),A=Math.round(w.barLength*Y/100),X=w.barLength-A,J=i.green("━".repeat(A)),U=i.gray("━".repeat(X)),W=`[${J}${U}]`,Q=`${Y}%`.padStart(4),B=w.message?` ${w.message}`:"",j=this.options.showIcons===!1?"":$||Y===100?i.green("✓"):i.blue("▶"),z=this.options.showTags!==!1&&this.name?` ${i.gray(this.formatTag(this.name))}`:"",G=`\r${j}${z} ${W} ${Q}${B}`,K=D.stdout.columns||80,E=" ".repeat(Math.max(0,K-G.replace(this.ANSI_PATTERN,"").length));if(w.lastRenderedLine=`${G}${E}`,D.stdout.write(w.lastRenderedLine),$)D.stdout.write(`
51
- `)}finishProgressBar(w,$){if(!this.enabled||!this.fancy||N0()||!D.stdout.isTTY){this.activeProgressBar=null;return}if(w.current<w.total)w.current=w.total;if($)w.message=$;this.renderProgressBar(w,!0),this.activeProgressBar=null}async clear(w={}){if(N0()){console.warn("Log clearing is not supported in browser environments.");return}try{console.warn("Clearing logs...",this.config.logDirectory);let $=await NA(this.config.logDirectory),Y=[];for(let A of $){if(!(w.name?new RegExp(w.name.replace("*",".*")).test(A):A.startsWith(this.name))||!A.endsWith(".log"))continue;let J=B1(this.config.logDirectory,A);if(w.before)try{if((await W1(J)).mtime>=w.before)continue}catch(U){console.error(`Failed to get stats for file ${J}:`,U);continue}Y.push(J)}if(Y.length===0){console.warn("No log files matched the criteria for clearing.");return}console.warn(`Preparing to delete ${Y.length} log file(s)...`);for(let A of Y)try{await EA(A),console.warn(`Deleted log file: ${A}`)}catch(X){console.error(`Failed to delete log file ${A}:`,X)}console.warn("Log clearing process finished.")}catch($){console.error("Error during log clearing process:",$)}}}async function TF(w,$={}){let{maxRetries:Y=3,retryDelay:A=1000,isRetryable:X=()=>!0,fallback:J}=$,U=Error("Unknown error occurred");for(let W=0;W<=Y;W++)try{return await w()}catch(Q){if(U=Q instanceof Error?Q:Error(String(Q)),W===Y||!X(U))break;if(A>0)await new Promise((B)=>setTimeout(B,A))}if(J!==void 0)return J;throw U instanceof Error?U:Error(`Unknown error: ${String(U)}`)}class zU{defaultParsers;constructor(){this.defaultParsers=[{name:"boolean",canParse:(w,$)=>$==="boolean"||["true","false","1","0","yes","no"].includes(w.toLowerCase()),parse:(w)=>{let $=w.toLowerCase();return["true","1","yes"].includes($)}},{name:"number",canParse:(w,$)=>$==="number"||!Number.isNaN(Number(w))&&!Number.isNaN(Number.parseFloat(w)),parse:(w)=>{let $=Number(w);if(Number.isNaN($))throw TypeError(`Cannot parse "${w}" as number`);return $}},{name:"array",canParse:(w,$)=>$==="array"||w.startsWith("[")||w.includes(","),parse:(w)=>{try{let $=JSON.parse(w);if(Array.isArray($))return $}catch{}return w.split(",").map(($)=>$.trim())}},{name:"json",canParse:(w,$)=>$==="object"||(w.startsWith("{")&&w.endsWith("}")||w.startsWith("[")&&w.endsWith("]")),parse:(w)=>{try{return JSON.parse(w)}catch($){throw Error(`Cannot parse "${w}" as JSON: ${$}`)}}}]}async applyEnvironmentVariables(w,$,Y={}){let{prefix:A,useCamelCase:X=!0,useBackwardCompatibility:J=!0,customParsers:U={},verbose:W=!1,trackPerformance:Q=!0}=Y,B=async()=>{if(!w)return{config:$,source:{type:"environment",priority:50,timestamp:new Date}};let j=A||this.generateEnvPrefix(w),z={...$};return this.processObject(z,[],j,{useCamelCase:X,useBackwardCompatibility:J,customParsers:U,verbose:W,configName:w}),{config:z,source:{type:"environment",priority:50,timestamp:new Date}}};if(Q)return YU.track("applyEnvironmentVariables",B,{configName:w});return B()}generateEnvPrefix(w){return w.toUpperCase().replace(/-/g,"_")}formatEnvKey(w,$){if(!$)return w.toUpperCase();return w.replace(/([A-Z])/g,"_$1").toUpperCase()}processObject(w,$,Y,A){for(let[X,J]of Object.entries(w)){let U=[...$,X],W=U.map((j)=>this.formatEnvKey(j,A.useCamelCase)),Q=`${Y}_${W.join("_")}`,B=A.useBackwardCompatibility?`${Y}_${U.map((j)=>j.toUpperCase()).join("_")}`:null;if(A.verbose);if(typeof J==="object"&&J!==null&&!Array.isArray(J))this.processObject(J,U,Y,A);else{let j=fA.env[Q]||(B?fA.env[B]:void 0);if(j!==void 0){if(A.verbose){let z=fA.env[Q]?Q:B}try{w[X]=this.parseEnvironmentValue(j,typeof J,Q,A.customParsers,A.configName)}catch(z){if(z instanceof jU)throw z;throw G1.envVar(Q,j,typeof J,A.configName)}}}}}parseEnvironmentValue(w,$,Y,A,X){for(let[J,U]of Object.entries(A))try{return U(w)}catch{continue}for(let J of this.defaultParsers)if(J.canParse(w,$))try{return J.parse(w)}catch{throw G1.envVar(Y,w,`${$} (via ${J.name} parser)`,X)}return w}getEnvironmentVariables(w){let $={},Y=w.toUpperCase();for(let[A,X]of Object.entries(fA.env))if(A.startsWith(Y)&&X!==void 0)$[A]=X;return $}validateEnvironmentVariable(w,$,Y){let A=[];if(!/^[A-Z_][A-Z0-9_]*$/.test(w))A.push(`Environment variable key "${w}" should only contain uppercase letters, numbers, and underscores`);if(Y)try{this.parseEnvironmentValue(w,$,Y,{})}catch(X){A.push(`Cannot parse value "${$}" as ${Y}: ${X}`)}return{isValid:A.length===0,errors:A}}generateEnvVarDocs(w,$,Y={}){let{prefix:A,format:X="text"}=Y,J=A||this.generateEnvPrefix(w),U=[];switch(this.extractEnvVarInfo($,[],J,U),X){case"markdown":return this.formatAsMarkdown(U,w);case"json":return JSON.stringify(U,null,2);default:return this.formatAsText(U,w)}}extractEnvVarInfo(w,$,Y,A){for(let[X,J]of Object.entries(w)){let U=[...$,X],W=`${Y}_${U.map((Q)=>this.formatEnvKey(Q,!0)).join("_")}`;if(typeof J==="object"&&J!==null&&!Array.isArray(J))this.extractEnvVarInfo(J,U,Y,A);else A.push({key:W,type:Array.isArray(J)?"array":typeof J,description:`Configuration for ${U.join(".")}`,example:this.generateExample(J)})}}generateExample(w){if(Array.isArray(w))return JSON.stringify(w);if(typeof w==="object"&&w!==null)return JSON.stringify(w);return String(w)}formatAsText(w,$){let Y=`Environment Variables for ${$}:
51
+ `)}finishProgressBar(w,$){if(!this.enabled||!this.fancy||N0()||!D.stdout.isTTY){this.activeProgressBar=null;return}if(w.current<w.total)w.current=w.total;if($)w.message=$;this.renderProgressBar(w,!0),this.activeProgressBar=null}async clear(w={}){if(N0()){console.warn("Log clearing is not supported in browser environments.");return}try{console.warn("Clearing logs...",this.config.logDirectory);let $=await fA(this.config.logDirectory),Y=[];for(let A of $){if(!(w.name?new RegExp(w.name.replace("*",".*")).test(A):A.startsWith(this.name))||!A.endsWith(".log"))continue;let J=j1(this.config.logDirectory,A);if(w.before)try{if((await B1(J)).mtime>=w.before)continue}catch(U){console.error(`Failed to get stats for file ${J}:`,U);continue}Y.push(J)}if(Y.length===0){console.warn("No log files matched the criteria for clearing.");return}console.warn(`Preparing to delete ${Y.length} log file(s)...`);for(let A of Y)try{await TA(A),console.warn(`Deleted log file: ${A}`)}catch(X){console.error(`Failed to delete log file ${A}:`,X)}console.warn("Log clearing process finished.")}catch($){console.error("Error during log clearing process:",$)}}}async function TF(w,$={}){let{maxRetries:Y=3,retryDelay:A=1000,isRetryable:X=()=>!0,fallback:J}=$,U=Error("Unknown error occurred");for(let W=0;W<=Y;W++)try{return await w()}catch(Q){if(U=Q instanceof Error?Q:Error(String(Q)),W===Y||!X(U))break;if(A>0)await new Promise((B)=>setTimeout(B,A))}if(J!==void 0)return J;throw U instanceof Error?U:Error(`Unknown error: ${String(U)}`)}class KU{defaultParsers;constructor(){this.defaultParsers=[{name:"boolean",canParse:(w,$)=>$==="boolean"||["true","false","1","0","yes","no"].includes(w.toLowerCase()),parse:(w)=>{let $=w.toLowerCase();return["true","1","yes"].includes($)}},{name:"number",canParse:(w,$)=>$==="number"||!Number.isNaN(Number(w))&&!Number.isNaN(Number.parseFloat(w)),parse:(w)=>{let $=Number(w);if(Number.isNaN($))throw TypeError(`Cannot parse "${w}" as number`);return $}},{name:"array",canParse:(w,$)=>$==="array"||w.startsWith("[")||w.includes(","),parse:(w)=>{try{let $=JSON.parse(w);if(Array.isArray($))return $}catch{}return w.split(",").map(($)=>$.trim())}},{name:"json",canParse:(w,$)=>$==="object"||(w.startsWith("{")&&w.endsWith("}")||w.startsWith("[")&&w.endsWith("]")),parse:(w)=>{try{return JSON.parse(w)}catch($){throw Error(`Cannot parse "${w}" as JSON: ${$}`)}}}]}async applyEnvironmentVariables(w,$,Y={}){let{prefix:A,useCamelCase:X=!0,useBackwardCompatibility:J=!0,customParsers:U={},verbose:W=!1,trackPerformance:Q=!0}=Y,B=async()=>{if(!w)return{config:$,source:{type:"environment",priority:50,timestamp:new Date}};let j=A||this.generateEnvPrefix(w),z={...$};return this.processObject(z,[],j,{useCamelCase:X,useBackwardCompatibility:J,customParsers:U,verbose:W,configName:w}),{config:z,source:{type:"environment",priority:50,timestamp:new Date}}};if(Q)return XU.track("applyEnvironmentVariables",B,{configName:w});return B()}generateEnvPrefix(w){return w.toUpperCase().replace(/-/g,"_")}formatEnvKey(w,$){if(!$)return w.toUpperCase();return w.replace(/([A-Z])/g,"_$1").toUpperCase()}processObject(w,$,Y,A){for(let[X,J]of Object.entries(w)){let U=[...$,X],W=U.map((j)=>this.formatEnvKey(j,A.useCamelCase)),Q=`${Y}_${W.join("_")}`,B=A.useBackwardCompatibility?`${Y}_${U.map((j)=>j.toUpperCase()).join("_")}`:null;if(A.verbose);if(typeof J==="object"&&J!==null&&!Array.isArray(J))this.processObject(J,U,Y,A);else{let j=RA.env[Q]||(B?RA.env[B]:void 0);if(j!==void 0){if(A.verbose){let z=RA.env[Q]?Q:B}try{w[X]=this.parseEnvironmentValue(j,typeof J,Q,A.customParsers,A.configName)}catch(z){if(z instanceof GU)throw z;throw K1.envVar(Q,j,typeof J,A.configName)}}}}}parseEnvironmentValue(w,$,Y,A,X){for(let[J,U]of Object.entries(A))try{return U(w)}catch{continue}for(let J of this.defaultParsers)if(J.canParse(w,$))try{return J.parse(w)}catch{throw K1.envVar(Y,w,`${$} (via ${J.name} parser)`,X)}return w}getEnvironmentVariables(w){let $={},Y=w.toUpperCase();for(let[A,X]of Object.entries(RA.env))if(A.startsWith(Y)&&X!==void 0)$[A]=X;return $}validateEnvironmentVariable(w,$,Y){let A=[];if(!/^[A-Z_][A-Z0-9_]*$/.test(w))A.push(`Environment variable key "${w}" should only contain uppercase letters, numbers, and underscores`);if(Y)try{this.parseEnvironmentValue(w,$,Y,{})}catch(X){A.push(`Cannot parse value "${$}" as ${Y}: ${X}`)}return{isValid:A.length===0,errors:A}}generateEnvVarDocs(w,$,Y={}){let{prefix:A,format:X="text"}=Y,J=A||this.generateEnvPrefix(w),U=[];switch(this.extractEnvVarInfo($,[],J,U),X){case"markdown":return this.formatAsMarkdown(U,w);case"json":return JSON.stringify(U,null,2);default:return this.formatAsText(U,w)}}extractEnvVarInfo(w,$,Y,A){for(let[X,J]of Object.entries(w)){let U=[...$,X],W=`${Y}_${U.map((Q)=>this.formatEnvKey(Q,!0)).join("_")}`;if(typeof J==="object"&&J!==null&&!Array.isArray(J))this.extractEnvVarInfo(J,U,Y,A);else A.push({key:W,type:Array.isArray(J)?"array":typeof J,description:`Configuration for ${U.join(".")}`,example:this.generateExample(J)})}}generateExample(w){if(Array.isArray(w))return JSON.stringify(w);if(typeof w==="object"&&w!==null)return JSON.stringify(w);return String(w)}formatAsText(w,$){let Y=`Environment Variables for ${$}:
52
52
 
53
53
  `;for(let A of w)Y+=`${A.key}
54
54
  `,Y+=` Type: ${A.type}
@@ -60,28 +60,28 @@ export type ConfigOf = Config
60
60
  `;Y+=`| Variable | Type | Description | Example |
61
61
  `,Y+=`|----------|------|-------------|----------|
62
62
  `;for(let A of w)Y+=`| \`${A.key}\` | ${A.type} | ${A.description} | \`${A.example}\` |
63
- `;return Y}}function fF(w,$,Y={}){return tj(w,$,Y,new WeakMap)}function tj(w,$,Y,A){let{arrayMergeMode:X="replace",skipNullish:J=!1,customMerger:U}=Y;if($===null||$===void 0)return J?w:$;if(U){let W=U(w,$);if(W!==void 0)return W}if(Array.isArray($)||Array.isArray(w))return aj(w,$,X,A);if(!Uw($)||!Uw(w))return $;return IF(w,$,Y,A)}function aj(w,$,Y,A){if(Array.isArray($)&&!Array.isArray(w))return $;if(Array.isArray(w)&&!Array.isArray($))return $;if(Array.isArray($)&&Array.isArray(w))switch(Y){case"replace":return $;case"concat":return HF(w,$);case"smart":return RF(w,$,A);default:return $}return $}function HF(w,$){let Y=[...$];for(let A of w)if(!Y.some((X)=>$U(X,A)))Y.push(A);return Y}function RF(w,$,Y){if($.length===0)return w;if(w.length===0)return $;if(Uw($[0])&&Uw(w[0]))return MF(w,$,Y);if($.every((A)=>typeof A==="string")&&w.every((A)=>typeof A==="string")){let A=[...$];for(let X of w)if(!A.includes(X))A.push(X);return A}return $}function MF(w,$,Y){let A=[...$];for(let X of w){if(!Uw(X)){A.push(X);continue}let J=["id","name","key","path","type"],U=!1;for(let W of J)if(W in X){if(A.find((B)=>Uw(B)&&(W in B)&&B[W]===X[W])){U=!0;break}}if(!U)A.push(X)}return A}function IF(w,$,Y,A){let X=$;if(Uw(X)&&A.has(X))return A.get(X);let J={...w};if(Uw(X))A.set(X,J);for(let U in X){if(!Object.prototype.hasOwnProperty.call(X,U))continue;let W=X[U],Q=J[U];if(Y.skipNullish&&(W===null||W===void 0))continue;if(W===null||W===void 0){J[U]=W;continue}if(Uw(W)&&Uw(Q))J[U]=tj(Q,W,Y,A);else if(Array.isArray(W)||Array.isArray(Q))J[U]=aj(Q,W,Y.arrayMergeMode||"smart",A);else J[U]=W}return J}function sj(w,$,Y="replace"){return fF(w,$,{arrayMergeMode:Y==="replace"?"replace":"smart",skipNullish:!0})}function $U(w,$){if(w===$)return!0;if(Array.isArray(w)&&Array.isArray($)){if(w.length!==$.length)return!1;for(let Y=0;Y<w.length;Y++)if(!$U(w[Y],$[Y]))return!1;return!0}if(Uw(w)&&Uw($)){let Y=Object.keys(w),A=Object.keys($);if(Y.length!==A.length)return!1;for(let X of Y){if(!Object.prototype.hasOwnProperty.call($,X))return!1;if(!$U(w[X],$[X]))return!1}return!0}return!1}function Uw(w){return Boolean(w&&typeof w==="object"&&!Array.isArray(w))}class oj{extensions=[".ts",".js",".mjs",".cjs",".json",".mts",".cts"];async loadFromPath(w,$,Y={}){let{arrayStrategy:A="replace",useCache:X=!0,cacheTtl:J,trackPerformance:U=!0,verbose:W=!1}=Y;if(X){let B=OA.getWithFileCheck("file",w);if(B){if(W)console.log(`Configuration loaded from cache: ${w}`);return B}}let Q=async()=>{if(!HA(w))return null;try{let B=`?t=${Date.now()}`,j=await import(w+B),z=j.default||j,G="default"in j,K=Object.keys(j).length>0;if(!G&&!K)throw new cA(w,Error("Configuration file is empty and exports nothing"),"unknown");if(typeof z!=="object"||z===null||Array.isArray(z))throw new cA(w,Error("Configuration must export a valid object"),"unknown");let N={config:sj($,z,A),source:{type:"file",path:w,priority:100,timestamp:new Date}};if(X)OA.setWithFileCheck("file",N,w,J);return N}catch(B){throw B instanceof Error?G1.configLoad(w,B):G1.configLoad(w,Error(String(B)))}};if(U)return YU.track("loadFromPath",Q,{path:w});return Q()}async tryLoadFromPaths(w,$,Y={}){for(let A of w)try{let X=await this.loadFromPath(A,$,Y);if(X)return X}catch(X){if(X instanceof Error&&X.name==="ConfigLoadError")throw X;if(Y.verbose)console.warn(`Failed to load config from ${A}:`,X)}return null}generateConfigPaths(w,$,Y){let A=this.generateNamePatterns(w,Y),X=[];for(let J of A)for(let U of this.extensions)X.push(mJ($,`${J}${U}`));return X}generateNamePatterns(w,$){let Y=[];if(Y.push("config",".config"),w)Y.push(w,`.${w}.config`,`${w}.config`,`.${w}`);let A=$===void 0?[]:Array.isArray($)?$:[$];for(let J of A){if(!J)continue;if(Y.push(J,`.${J}.config`,`${J}.config`,`.${J}`),w)Y.push(`${w}.${J}.config`,`.${w}.${J}.config`)}let X=new Set;return Y.filter((J)=>{if(!J||X.has(J))return!1;return X.add(J),!0})}checkFileAccess(w){return TF(async()=>{return HA(w)},{maxRetries:2,retryDelay:100,fallback:!1})}async discoverConfigFiles(w,$,Y){let A=[];if(!HA(w))return A;if($||Y){let X=this.generateNamePatterns($||"",Y);for(let J of X)for(let U of this.extensions){let W=mJ(w,`${J}${U}`);if(await this.checkFileAccess(W))A.push(W)}}else try{let{readdirSync:X}=await import("fs"),J=X(w);for(let U of J)if(this.looksLikeConfigFile(U)){let W=mJ(w,U);if(await this.checkFileAccess(W))A.push(W)}}catch{return[]}return A}looksLikeConfigFile(w){return[/\.config\.(ts|js|mjs|cjs|json|mts|cts)$/,/^\..*\.(ts|js|mjs|cjs|json|mts|cts)$/,/config\.(ts|js|mjs|cjs|json|mts|cts)$/].some((Y)=>Y.test(w))}async validateConfigFile(w){let $=[];try{if(!HA(w))return $.push("Configuration file does not exist"),$;let Y=await import(w),A=Y.default||Y;if(A===void 0)$.push("Configuration file must export a default value or named exports");else if(typeof A!=="object"||A===null)$.push("Configuration must be an object");else if(Array.isArray(A))$.push("Configuration cannot be an array at the root level");if(w.endsWith(".json"))try{let{readFileSync:X}=await import("fs"),J=X(w,"utf8");JSON.parse(J)}catch(X){$.push(`Invalid JSON syntax: ${X}`)}}catch(Y){$.push(`Failed to load configuration file: ${Y}`)}return $}async getFileModificationTime(w){try{let{statSync:$}=await import("fs");return $(w).mtime}catch{return null}}async preloadConfigurations(w,$={}){let Y=new Map;return await Promise.allSettled(w.map(async(A)=>{try{let X=await this.loadFromPath(A,{},$);if(X)Y.set(A,X.config)}catch(X){if($.verbose)console.warn(`Failed to preload ${A}:`,X)}})),Y}}class ej{async validateConfiguration(w,$,Y={}){let{stopOnFirstError:A=!1,validateRequired:X=!0,validateTypes:J=!0,customRules:U=[],trackPerformance:W=!0,verbose:Q=!1}=Y,B=async()=>{let j=[],z=[],G={stopOnFirstError:A,validateRequired:X,validateTypes:J,customRules:U,trackPerformance:W,verbose:Q};try{if(typeof $==="string")return await this.validateWithSchemaFile(w,$,G);else if(Array.isArray($))return this.validateWithRules(w,[...$,...U],G);else return this.validateWithJSONSchema(w,$,G)}catch(K){return j.push({path:"",message:`Validation failed: ${K}`,rule:"system"}),{isValid:!1,errors:j,warnings:z}}};if(W)return await YU.track("validateConfiguration",B);return B()}async validateWithSchemaFile(w,$,Y){try{if(!VF($))throw new vA($,[{path:"",message:"Schema file does not exist"}]);let A=await import($),X=A.default||A;if(Array.isArray(X))return this.validateWithRules(w,X,Y);else return this.validateWithJSONSchema(w,X,Y)}catch(A){throw new vA($,[{path:"",message:`Failed to load schema: ${A}`}])}}validateWithJSONSchema(w,$,Y){let A=[],X=[];return this.validateObjectAgainstSchema(w,$,"",A,X,Y),{isValid:A.length===0,errors:A,warnings:X}}validateObjectAgainstSchema(w,$,Y,A,X,J){if(J.validateTypes&&$.type){let U=Array.isArray(w)?"array":typeof w,W=Array.isArray($.type)?$.type:[$.type];if(!W.includes(U)){if(A.push({path:Y,message:`Expected type ${W.join(" or ")}, got ${U}`,expected:W.join(" or "),actual:U,rule:"type"}),J.stopOnFirstError)return}}if($.enum&&!$.enum.includes(w)){if(A.push({path:Y,message:`Value must be one of: ${$.enum.join(", ")}`,expected:$.enum.join(", "),actual:w,rule:"enum"}),J.stopOnFirstError)return}if(typeof w==="string"){if($.minLength!==void 0&&w.length<$.minLength)A.push({path:Y,message:`String length must be at least ${$.minLength}`,expected:`>= ${$.minLength}`,actual:w.length,rule:"minLength"});if($.maxLength!==void 0&&w.length>$.maxLength)A.push({path:Y,message:`String length must not exceed ${$.maxLength}`,expected:`<= ${$.maxLength}`,actual:w.length,rule:"maxLength"});if($.pattern){if(!new RegExp($.pattern).test(w))A.push({path:Y,message:`String does not match pattern ${$.pattern}`,expected:$.pattern,actual:w,rule:"pattern"})}}if(typeof w==="number"){if($.minimum!==void 0&&w<$.minimum)A.push({path:Y,message:`Value must be at least ${$.minimum}`,expected:`>= ${$.minimum}`,actual:w,rule:"minimum"});if($.maximum!==void 0&&w>$.maximum)A.push({path:Y,message:`Value must not exceed ${$.maximum}`,expected:`<= ${$.maximum}`,actual:w,rule:"maximum"})}if(Array.isArray(w)&&$.items)for(let U=0;U<w.length;U++){let W=Y?`${Y}[${U}]`:`[${U}]`;if(this.validateObjectAgainstSchema(w[U],$.items,W,A,X,J),J.stopOnFirstError&&A.length>0)return}if(w&&typeof w==="object"&&!Array.isArray(w)){let U=w;if(J.validateRequired&&$.required){for(let W of $.required)if(!(W in U)){if(A.push({path:Y?`${Y}.${W}`:W,message:`Missing required property '${W}'`,expected:"required",rule:"required"}),J.stopOnFirstError)return}}if($.properties){for(let[W,Q]of Object.entries($.properties))if(W in U){let B=Y?`${Y}.${W}`:W;if(this.validateObjectAgainstSchema(U[W],Q,B,A,X,J),J.stopOnFirstError&&A.length>0)return}}if($.additionalProperties===!1){let W=new Set(Object.keys($.properties||{}));for(let Q of Object.keys(U))if(!W.has(Q))X.push({path:Y?`${Y}.${Q}`:Q,message:`Additional property '${Q}' is not allowed`,rule:"additionalProperties"})}}}validateWithRules(w,$,Y){let A=[],X=[];for(let J of $)try{let U=this.getValueByPath(w,J.path),W=this.validateWithRule(U,J,J.path);if(A.push(...W),Y.stopOnFirstError&&A.length>0)break}catch(U){A.push({path:J.path,message:`Rule validation failed: ${U}`,rule:"system"})}return{isValid:A.length===0,errors:A,warnings:X}}validateWithRule(w,$,Y){let A=[];if($.required&&(w===void 0||w===null))return A.push({path:Y,message:$.message||`Property '${Y}' is required`,expected:"required",rule:"required"}),A;if(w===void 0||w===null)return A;if($.type){let X=Array.isArray(w)?"array":typeof w;if(X!==$.type)A.push({path:Y,message:$.message||`Expected type ${$.type}, got ${X}`,expected:$.type,actual:X,rule:"type"})}if($.min!==void 0){let X=Array.isArray(w)?w.length:typeof w==="string"?w.length:typeof w==="number"?w:0;if(X<$.min)A.push({path:Y,message:$.message||`Value must be at least ${$.min}`,expected:`>= ${$.min}`,actual:X,rule:"min"})}if($.max!==void 0){let X=Array.isArray(w)?w.length:typeof w==="string"?w.length:typeof w==="number"?w:0;if(X>$.max)A.push({path:Y,message:$.message||`Value must not exceed ${$.max}`,expected:`<= ${$.max}`,actual:X,rule:"max"})}if($.pattern&&typeof w==="string"){if(!$.pattern.test(w))A.push({path:Y,message:$.message||`Value does not match pattern ${$.pattern}`,expected:$.pattern.toString(),actual:w,rule:"pattern"})}if($.enum&&!$.enum.includes(w))A.push({path:Y,message:$.message||`Value must be one of: ${$.enum.join(", ")}`,expected:$.enum.join(", "),actual:w,rule:"enum"});if($.validator){let X=$.validator(w);if(X)A.push({path:Y,message:$.message||X,rule:"custom"})}return A}getValueByPath(w,$){if(!$)return w;let Y=$.split("."),A=w;for(let X of Y)if(A&&typeof A==="object"&&X in A)A=A[X];else return;return A}generateRulesFromInterface(w){let $=[],Y=w.matchAll(/(\w+)(\?)?:\s*(\w+)/g);for(let A of Y){let[,X,J,U]=A;$.push({path:X,required:!J,type:this.mapTypeScriptType(U)})}return $}mapTypeScriptType(w){switch(w.toLowerCase()){case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"array":return"array";case"object":return"object";default:return"object"}}static createCommonRules(){return{server:[{path:"port",required:!0,type:"number",min:1,max:65535},{path:"host",required:!0,type:"string",min:1},{path:"ssl",type:"boolean"}],database:[{path:"url",required:!0,type:"string",min:1},{path:"pool",type:"number",min:1,max:100},{path:"timeout",type:"number",min:0}],api:[{path:"baseUrl",required:!0,type:"string",pattern:CF},{path:"timeout",type:"number",min:0},{path:"retries",type:"number",min:0,max:10}]}}}function yF(w){if(!w)return"";let $=Array.isArray(w)?w.filter(Boolean):[w];if($.length===0)return"";if($.length===1)return` or alias "${$[0]}"`;return` or aliases ${$.map((Y)=>`"${Y}"`).join(", ")}`}class w9{fileLoader=new oj;envProcessor=new zU;validator=new ej;async loadConfig(w){let $=Date.now(),{cache:Y,performance:A,schema:X,validate:J,...U}=w;try{if(Y?.enabled){let Q=this.checkCache(U.name||"",U);if(Q)return Q}let W;try{W=await this.loadConfigurationStrategies(U,!0,Y)}catch(Q){let B=U.__strictErrorHandling;if(Q instanceof Error&&Q.name==="ConfigNotFoundError"){if(B)throw Q;W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`No configuration file found for "${U.name||"config"}", using defaults with environment variables`]}}else if(Q instanceof Error&&Q.name==="ConfigLoadError"){let j=Q.message.includes("EACCES")||Q.message.includes("EPERM")||Q.message.includes("permission denied"),z=!j&&(Q.message.includes("syntax")||Q.message.includes("Expected")||Q.message.includes("Unexpected")||Q.message.includes("BuildMessage")||Q.message.includes("errors building")),G=Q.message.includes("Configuration must export a valid object")||Q.message.includes("Configuration file is empty and exports nothing");if(B&&(G||j))throw Q;if(z&&(!B||!G))W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:["Configuration file has syntax errors, using defaults with environment variables"]};else if(!B)W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`Configuration loading error, using defaults: ${Q.message}`]};else throw Q}else W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`Configuration loading failed, using defaults: ${Q instanceof Error?Q.message:String(Q)}`]}}if(X||J)await this.validateConfiguration(W.config,X,J,U.name);if(Y?.enabled&&W)this.cacheResult(U.name||"",W,Y,U);if(A?.enabled){let Q={operation:"loadConfig",duration:Date.now()-$,configName:U.name,timestamp:new Date};if(A.onMetrics)A.onMetrics(Q);if(A.slowThreshold&&Q.duration>A.slowThreshold)Lw.warn(`Slow configuration loading detected: ${Q.duration}ms for ${U.name}`);W.metrics=Q}return W}catch(W){if(W instanceof Error&&W.name==="ConfigNotFoundError")throw W;let Q=Date.now()-$;throw Lw.error(`Configuration loading failed after ${Q}ms:`,[W instanceof Error?W:Error(String(W))]),W}}async loadConfigurationStrategies(w,$=!1,Y){let{name:A="",alias:X,cwd:J,configDir:U,defaultConfig:W,checkEnv:Q=!0,arrayStrategy:B="replace",verbose:j=!1}=w,z=J||iA.cwd(),G=[],K=await this.loadLocalConfiguration(A,X,z,U,W,B,j,Q,Y);if(K)return G.push(...this.getLocalSearchPaths(A,X,z,U)),this.finalizeResult(K,G,Q,A,j);let E=await this.loadHomeConfiguration(A,X,W,B,j,Q);if(E)return G.push(...this.getHomeSearchPaths(A,X)),this.finalizeResult(E,G,Q,A,j);let q=await this.loadPackageJsonConfiguration(A,X,z,W,B,j,Q);if(q)return G.push(Xw(z,"package.json")),this.finalizeResult(q,G,Q,A,j);if(G.push(...this.getAllSearchPaths(A,X,z,U)),$)throw G1.configNotFound(A,G,X);return{...await this.applyEnvironmentVariables(A,W,Q,j),warnings:[`No configuration file found for "${A}"${yF(X)}, using defaults with environment variables`]}}async loadLocalConfiguration(w,$,Y,A,X,J,U,W,Q){let B=W?RA(w,X,U):X,j=this.getLocalDirectories(Y,A);for(let z of j){if(U)Lw.info(`Searching for configuration in: ${z}`);let G=this.fileLoader.generateConfigPaths(w,z,$),K=await this.fileLoader.tryLoadFromPaths(G,B,{arrayStrategy:J,verbose:U,cacheTtl:Q?.ttl,useCache:!Q?.ttl||Q.ttl>100});if(K){if(U)Lw.success(`Configuration loaded from: ${K.source.path}`);return K}}return null}async loadHomeConfiguration(w,$,Y,A,X,J){if(!w)return null;let U=J?RA(w,Y,X):Y,W=[Xw(w1(),".config",w),Xw(w1(),".config"),w1()];for(let Q of W){if(X)Lw.info(`Checking home directory: ${Q}`);let B=this.fileLoader.generateConfigPaths(w,Q,$),j=await this.fileLoader.tryLoadFromPaths(B,U,{arrayStrategy:A,verbose:X});if(j){if(X)Lw.success(`Configuration loaded from home directory: ${j.source.path}`);return j}}return null}async loadPackageJsonConfiguration(w,$,Y,A,X,J,U){let W=U?RA(w,A,J):A;try{let Q=Xw(Y,"package.json");if(!fK(Q))return null;let B={};try{B=JSON.parse(HK(Q,"utf8"))}catch(G){if(J)Lw.warn("Failed to parse package.json:",[G instanceof Error?G:Error(String(G))]);return null}let j=B[w],z=w;if(!j&&$){let G=Array.isArray($)?$:[$];for(let K of G){if(!K)continue;if(B[K]){j=B[K],z=K;break}}}if(j&&typeof j==="object"&&!Array.isArray(j)){if(J)Lw.success(`Configuration loaded from package.json: ${z}`);return{config:sj(W,j,X),source:{type:"package.json",path:Q,priority:30,timestamp:new Date}}}}catch(Q){if(J)Lw.warn("Failed to load package.json:",[Q instanceof Error?Q:Error(String(Q))])}return null}async applyEnvironmentVariables(w,$,Y,A){if(!Y||!w||typeof $!=="object"||$===null||Array.isArray($))return{config:$,source:{type:"default",priority:10,timestamp:new Date}};return{config:RA(w,$,A),source:{type:"environment",priority:20,timestamp:new Date}}}async finalizeResult(w,$,Y,A,X){return{config:w.config,source:w.source,path:w.source.path}}async validateConfiguration(w,$,Y,A){let X=[];if(Y){let J=Y(w);if(J)X.push(...J)}if($){let J=await this.validator.validateConfiguration(w,$);if(!J.isValid)X.push(...J.errors.map((U)=>U.path?`${U.path}: ${U.message}`:U.message))}if(X.length>0)throw G1.configValidation(A||"unknown",X,A)}checkCache(w,$){let Y=this.generateCacheKey(w,$);return OA.get(Y)||null}cacheResult(w,$,Y,A){let X=this.generateCacheKey(w,A);OA.set(X,$,void 0,Y.ttl)}generateCacheKey(w,$){let Y=[w];if($.alias){let A=Array.isArray($.alias)?$.alias.join(","):$.alias;Y.push(`alias:${A}`)}if($.cwd)Y.push(`cwd:${$.cwd}`);if($.configDir)Y.push(`configDir:${$.configDir}`);if("checkEnv"in $)Y.push(`checkEnv:${$.checkEnv}`);return Y.join("|")}getLocalDirectories(w,$){return Array.from(new Set([w,Xw(w,"config"),Xw(w,".config"),$?Xw(w,$):void 0].filter(Boolean)))}getAllSearchPaths(w,$,Y,A){let X=[];return X.push(...this.getLocalSearchPaths(w,$,Y,A)),X.push(...this.getHomeSearchPaths(w,$)),X.push(Xw(Y,"package.json")),X}getLocalSearchPaths(w,$,Y,A){let X=this.getLocalDirectories(Y,A),J=[];for(let U of X)J.push(...this.fileLoader.generateConfigPaths(w,U,$));return J}getHomeSearchPaths(w,$){if(!w)return[];let Y=[Xw(w1(),".config",w),Xw(w1(),".config"),w1()],A=[];for(let X of Y)A.push(...this.fileLoader.generateConfigPaths(w,X,$));return A}async loadConfigWithResult(w){return this.loadConfig(w)}}async function GU(w){let $="defaultConfig"in w&&w.defaultConfig!==void 0?w.defaultConfig:{},Y="cache"in w||"performance"in w||"schema"in w||"validate"in w;try{let A;if(Y)A=await gJ.loadConfig(w);else A=await gJ.loadConfig({...w,defaultConfig:$,cache:{enabled:!0},performance:{enabled:!1}});return A?.config??$}catch(A){let X=A instanceof Error?A.name:"UnknownError",J=A instanceof Error?A.message:String(A);if(!(X==="ConfigNotFoundError"||X==="ConfigLoadError"||X==="ConfigValidationError"||J.includes("config"))&&w.verbose)Lw.warn("Unexpected error loading config, using defaults:",[A instanceof Error?A:Error(String(A))]);let W=Y?{...w,defaultConfig:$}:{...w,defaultConfig:$,cache:{enabled:!0},performance:{enabled:!1}};if("checkEnv"in w?w.checkEnv!==!1:!0)return(await gJ.applyEnvironmentVariables(W.name||"",$,!0,W.verbose||!1))?.config??$;return $}}function RA(w,$,Y=!1){let A=new zU,X=w.toUpperCase().replace(/[^A-Z0-9]/g,"_");function J(U,W=[]){let Q={...U};for(let[B,j]of Object.entries(U)){let z=[...W,B],G=[`${X}_${z.join("_").toUpperCase()}`,`${X}_${z.map((q)=>q.toUpperCase()).join("")}`,`${X}_${z.map((q)=>q.replace(/([A-Z])/g,"_$1").toUpperCase()).join("")}`],K,E;for(let q of G)if(K=iA.env[q],K!==void 0){E=q;break}if(K!==void 0&&E)if(typeof j==="boolean")Q[B]=["true","1","yes"].includes(K.toLowerCase());else if(typeof j==="number"){let q=Number(K);if(!Number.isNaN(q))Q[B]=q}else if(Array.isArray(j))try{Q[B]=JSON.parse(K)}catch{Q[B]=K.split(",").map((q)=>q.trim())}else Q[B]=K;else if(j&&typeof j==="object"&&!Array.isArray(j))Q[B]=J(j,z)}return Q}return J($)}var OA,YU,J7,U7=(w)=>w,W7=(w,$)=>{for(var Y in $)J7(w,Y,{get:$[Y],enumerable:!0,configurable:!0,set:Q7.bind($,Y)})},B7=(w,$)=>()=>(w&&($=w(w=0)),$),Ij,kj,z1,EY,hj,P7,b7,Qj,IA,pJ,L0,a,u7,Wj,c7,Bj,v7,i7,bJ,m7,jj,zj,uJ,g7,d7,l7,n7,VA,Dj,p7,_0,r7,t7,Gj,CA,rJ,q0,u,a7,Kj,s7,Fj,o7,e7,cJ,wF,qj,Nj,$F,vJ,YF,AF,XF,JF,UF,yA,xj,QF,WF="0.15.6",o0,PA,qY,tJ,aJ,bA,sJ,oJ,NY,eJ,wU,N$,Pj,bj,qw,dw,uj,cj,BF,zF,vj,uA,iI,I0,i,mI,KF,gI,FF,dI,lI,Ej,nI,qF,NF,pI,Tj,rI,tI,aI,sI,oI,iJ,EF,eI,Nw,mj,cA,gj,dj,jU,lj,nj,vA,pj,rj,G1,CF,Lw,gJ,XV,JV;var KU=t(()=>{OA=new fj,YU=new Hj,J7=Object.defineProperty;Ij={};W7(Ij,{withErrorRecovery:()=>yj,tryLoadConfig:()=>k7,loadConfigWithResult:()=>S7,loadConfig:()=>Zj,isRetryableError:()=>V7,isConfigNotFoundError:()=>I7,isBunfigError:()=>Oj,globalPerformanceMonitor:()=>EY,globalCache:()=>z1,getEnvOrDefault:()=>C7,generateConfigTypes:()=>h7,defaultGeneratedDir:()=>cj,defaultConfigDir:()=>uj,deepMergeWithArrayStrategy:()=>QU,deepMerge:()=>Lj,createLibraryConfig:()=>D7,config:()=>Z7,bunfigPlugin:()=>x7,applyEnvVarsToConfig:()=>KY,TypeGenerationError:()=>oJ,SchemaValidationError:()=>NY,PluginError:()=>wU,PerformanceMonitor:()=>XU,FileSystemError:()=>sJ,ErrorFactory:()=>N$,EnvVarError:()=>bA,EnvProcessor:()=>mA,ConfigValidator:()=>WU,ConfigValidationError:()=>tJ,ConfigNotFoundError:()=>PA,ConfigMergeError:()=>aJ,ConfigLoader:()=>BU,ConfigLoadError:()=>qY,ConfigFileLoader:()=>gA,ConfigCache:()=>AU,CacheUtils:()=>hj,BunfigError:()=>o0,BrowserConfigError:()=>eJ,ArrayMergeStrategies:()=>Pj});BF=B7(async()=>{kj=import.meta.require,z1=new AU,EY=new XU,hj={createKey:j7,isEquivalent:z7,estimateMemoryUsage:G7},P7=SA(lJ.cwd(),"config"),b7=SA(lJ.cwd(),"src/generated"),Qj=_A.env.CLARITY_LOG_DIR||yK(q7(),"logs"),IA={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:Qj,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1},pJ=await N7(),L0={red:(w)=>`\x1B[31m${w}\x1B[0m`,green:(w)=>`\x1B[32m${w}\x1B[0m`,yellow:(w)=>`\x1B[33m${w}\x1B[0m`,blue:(w)=>`\x1B[34m${w}\x1B[0m`,magenta:(w)=>`\x1B[35m${w}\x1B[0m`,cyan:(w)=>`\x1B[36m${w}\x1B[0m`,white:(w)=>`\x1B[37m${w}\x1B[0m`,gray:(w)=>`\x1B[90m${w}\x1B[0m`,bgRed:(w)=>`\x1B[41m${w}\x1B[0m`,bgYellow:(w)=>`\x1B[43m${w}\x1B[0m`,bold:(w)=>`\x1B[1m${w}\x1B[0m`,dim:(w)=>`\x1B[2m${w}\x1B[0m`,italic:(w)=>`\x1B[3m${w}\x1B[0m`,underline:(w)=>`\x1B[4m${w}\x1B[0m`,reset:"\x1B[0m"},a=L0,u7=L0.red,Wj=L0.green,c7=L0.yellow,Bj=L0.blue,v7=L0.magenta,i7=L0.cyan,bJ=L0.white,m7=L0.gray,jj=L0.bgRed,zj=L0.bgYellow,uJ=L0.bold,g7=L0.dim,d7=L0.italic,l7=L0.underline,n7=L0.reset,VA={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},Dj={debug:"\uD83D\uDD0D",info:Bj("ℹ"),success:Wj("✓"),warning:zj(bJ(uJ(" WARN "))),error:jj(bJ(uJ(" ERROR ")))},p7=new hA("stacks"),_0=new hA("bunfig",{showTags:!0}),r7=v0(FY.cwd(),"config"),t7=v0(FY.cwd(),"src/generated"),Gj=LA.env.CLARITY_LOG_DIR||VK(H7(),"logs"),CA={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:Gj,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1,writeToFile:!1},rJ=await R7(),q0={red:(w)=>`\x1B[31m${w}\x1B[0m`,green:(w)=>`\x1B[32m${w}\x1B[0m`,yellow:(w)=>`\x1B[33m${w}\x1B[0m`,blue:(w)=>`\x1B[34m${w}\x1B[0m`,magenta:(w)=>`\x1B[35m${w}\x1B[0m`,cyan:(w)=>`\x1B[36m${w}\x1B[0m`,white:(w)=>`\x1B[37m${w}\x1B[0m`,gray:(w)=>`\x1B[90m${w}\x1B[0m`,bgRed:(w)=>`\x1B[41m${w}\x1B[0m`,bgYellow:(w)=>`\x1B[43m${w}\x1B[0m`,bgGray:(w)=>`\x1B[100m${w}\x1B[0m`,bold:(w)=>`\x1B[1m${w}\x1B[0m`,dim:(w)=>`\x1B[2m${w}\x1B[0m`,italic:(w)=>`\x1B[3m${w}\x1B[0m`,underline:(w)=>`\x1B[4m${w}\x1B[0m`,strikethrough:(w)=>`\x1B[9m${w}\x1B[0m`,reset:"\x1B[0m"},u=q0,a7=q0.red,Kj=q0.green,s7=q0.yellow,Fj=q0.blue,o7=q0.magenta,e7=q0.cyan,cJ=q0.white,wF=q0.gray,qj=q0.bgRed,Nj=q0.bgYellow,$F=q0.bgGray,vJ=q0.bold,YF=q0.dim,AF=q0.italic,XF=q0.underline,JF=q0.strikethrough,UF=q0.reset,yA={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},xj={debug:"\uD83D\uDD0D",info:Fj("ℹ"),success:Kj("✓"),warning:Nj(cJ(vJ(" WARN "))),error:qj(cJ(vJ(" ERROR ")))},QF=new xA("stacks"),o0=class extends Error{timestamp;context;constructor($,Y={}){super($);if(this.name=this.constructor.name,this.timestamp=new Date,this.context=Y,Error.captureStackTrace)Error.captureStackTrace(this,this.constructor)}toJSON(){return{name:this.name,code:this.code,message:this.message,timestamp:this.timestamp.toISOString(),context:this.context,stack:this.stack}}toString(){let $=Object.keys(this.context).length>0?` (${Object.entries(this.context).map(([Y,A])=>`${Y}: ${A}`).join(", ")})`:"";return`${this.name} [${this.code}]: ${this.message}${$}`}},PA=class extends o0{code="CONFIG_NOT_FOUND";constructor($,Y,A){let X=A?` or alias "${A}"`:"";super(`Configuration "${$}"${X} not found`,{configName:$,alias:A,searchPaths:Y,searchPathCount:Y.length})}},qY=class extends o0{code="CONFIG_LOAD_ERROR";constructor($,Y,A){super(`Failed to load configuration from "${$}": ${Y.message}`,{configPath:$,configName:A,originalError:Y.name,originalMessage:Y.message});this.cause=Y}},tJ=class extends o0{code="CONFIG_VALIDATION_ERROR";constructor($,Y,A){super(`Configuration validation failed for "${$}"`,{configPath:$,configName:A,validationErrors:Y,errorCount:Y.length})}},aJ=class extends o0{code="CONFIG_MERGE_ERROR";constructor($,Y,A,X){super(`Failed to merge configuration from "${$}" with "${Y}": ${A.message}`,{sourcePath:$,targetPath:Y,configName:X,originalError:A.name,originalMessage:A.message});this.cause=A}},bA=class extends o0{code="ENV_VAR_ERROR";constructor($,Y,A,X){super(`Failed to parse environment variable "${$}" with value "${Y}" as ${A}`,{envKey:$,envValue:Y,expectedType:A,configName:X})}},sJ=class extends o0{code="FILE_SYSTEM_ERROR";constructor($,Y,A){super(`File system ${$} failed for "${Y}": ${A.message}`,{operation:$,path:Y,originalError:A.name,originalMessage:A.message});this.cause=A}},oJ=class extends o0{code="TYPE_GENERATION_ERROR";constructor($,Y,A){super(`Failed to generate types from "${$}" to "${Y}": ${A.message}`,{configDir:$,outputPath:Y,originalError:A.name,originalMessage:A.message});this.cause=A}},NY=class extends o0{code="SCHEMA_VALIDATION_ERROR";constructor($,Y,A){super(`Schema validation failed${A?` for config "${A}"`:""}`,{schemaPath:$,configName:A,validationErrors:Y,errorCount:Y.length})}},eJ=class extends o0{code="BROWSER_CONFIG_ERROR";constructor($,Y,A,X){super(`Failed to fetch configuration from "${$}": ${Y} ${A}`,{endpoint:$,status:Y,statusText:A,configName:X})}},wU=class extends o0{code="PLUGIN_ERROR";constructor($,Y,A){super(`Plugin "${$}" failed during ${Y}: ${A.message}`,{pluginName:$,operation:Y,originalError:A.name,originalMessage:A.message});this.cause=A}},N$={configNotFound(w,$,Y){return new PA(w,$,Y)},configLoad(w,$,Y){return new qY(w,$,Y)},configValidation(w,$,Y){return new tJ(w,$,Y)},configMerge(w,$,Y,A){return new aJ(w,$,Y,A)},envVar(w,$,Y,A){return new bA(w,$,Y,A)},fileSystem(w,$,Y){return new sJ(w,$,Y)},typeGeneration(w,$,Y){return new oJ(w,$,Y)},schemaValidation(w,$,Y){return new NY(w,$,Y)},browserConfig(w,$,Y,A){return new eJ(w,$,Y,A)},plugin(w,$,Y){return new wU(w,$,Y)}},Pj={replace:"replace",concat:"concat",smart:"smart"},bj=/^https?:\/\//,qw=new xA("bunfig",{showTags:!0}),dw=new BU,uj=i0(P$.cwd(),"config"),cj=i0(P$.cwd(),"src/generated")});zF=ZA.env.CLARITY_LOG_DIR||rK(jF(),"logs"),vj={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:zF,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1,writeToFile:!1},uA={...vj},iI=(async()=>{try{let{loadConfig:w}=await BF().then(()=>Ij),$=await w({name:"clarity",alias:"logging",defaultConfig:vj,cwd:ZA.cwd()});if($)Object.assign(uA,$)}catch{}return uA})();I0={red:(w)=>`\x1B[31m${w}\x1B[0m`,green:(w)=>`\x1B[32m${w}\x1B[0m`,yellow:(w)=>`\x1B[33m${w}\x1B[0m`,blue:(w)=>`\x1B[34m${w}\x1B[0m`,magenta:(w)=>`\x1B[35m${w}\x1B[0m`,cyan:(w)=>`\x1B[36m${w}\x1B[0m`,white:(w)=>`\x1B[37m${w}\x1B[0m`,gray:(w)=>`\x1B[90m${w}\x1B[0m`,bgRed:(w)=>`\x1B[41m${w}\x1B[0m`,bgYellow:(w)=>`\x1B[43m${w}\x1B[0m`,bgGray:(w)=>`\x1B[100m${w}\x1B[0m`,bold:(w)=>`\x1B[1m${w}\x1B[0m`,dim:(w)=>`\x1B[2m${w}\x1B[0m`,italic:(w)=>`\x1B[3m${w}\x1B[0m`,underline:(w)=>`\x1B[4m${w}\x1B[0m`,strikethrough:(w)=>`\x1B[9m${w}\x1B[0m`,reset:"\x1B[0m"},i=I0,mI=I0.red,KF=I0.green,gI=I0.yellow,FF=I0.blue,dI=I0.magenta,lI=I0.cyan,Ej=I0.white,nI=I0.gray,qF=I0.bgRed,NF=I0.bgYellow,pI=I0.bgGray,Tj=I0.bold,rI=I0.dim,tI=I0.italic,aI=I0.underline,sI=I0.strikethrough,oI=I0.reset,iJ={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},EF={debug:"\uD83D\uDD0D",info:FF("ℹ"),success:KF("✓"),warning:NF(Ej(Tj(" WARN "))),error:qF(Ej(Tj(" ERROR ")))};eI=new dA("stacks");Nw=class Nw extends Error{timestamp;context;constructor(w,$={}){super(w);if(this.name=this.constructor.name,this.timestamp=new Date,this.context=$,Error.captureStackTrace)Error.captureStackTrace(this,this.constructor)}toJSON(){return{name:this.name,code:this.code,message:this.message,timestamp:this.timestamp.toISOString(),context:this.context,stack:this.stack}}toString(){let w=Object.keys(this.context).length>0?` (${Object.entries(this.context).map(([$,Y])=>`${$}: ${Y}`).join(", ")})`:"";return`${this.name} [${this.code}]: ${this.message}${w}`}};mj=class mj extends Nw{code="CONFIG_NOT_FOUND";constructor(w,$,Y){let A=Y===void 0?[]:Array.isArray(Y)?Y.filter(Boolean):[Y],X="";if(A.length===1)X=` or alias "${A[0]}"`;else if(A.length>1)X=` or aliases ${A.map((J)=>`"${J}"`).join(", ")}`;super(`Configuration "${w}"${X} not found`,{configName:w,alias:Y,searchPaths:$,searchPathCount:$.length})}};cA=class cA extends Nw{code="CONFIG_LOAD_ERROR";constructor(w,$,Y){super(`Failed to load configuration from "${w}": ${$.message}`,{configPath:w,configName:Y,originalError:$.name,originalMessage:$.message});this.cause=$}};gj=class gj extends Nw{code="CONFIG_VALIDATION_ERROR";constructor(w,$,Y){super(`Configuration validation failed for "${w}"`,{configPath:w,configName:Y,validationErrors:$,errorCount:$.length})}};dj=class dj extends Nw{code="CONFIG_MERGE_ERROR";constructor(w,$,Y,A){super(`Failed to merge configuration from "${w}" with "${$}": ${Y.message}`,{sourcePath:w,targetPath:$,configName:A,originalError:Y.name,originalMessage:Y.message});this.cause=Y}};jU=class jU extends Nw{code="ENV_VAR_ERROR";constructor(w,$,Y,A){super(`Failed to parse environment variable "${w}" with value "${$}" as ${Y}`,{envKey:w,envValue:$,expectedType:Y,configName:A})}};lj=class lj extends Nw{code="FILE_SYSTEM_ERROR";constructor(w,$,Y){super(`File system ${w} failed for "${$}": ${Y.message}`,{operation:w,path:$,originalError:Y.name,originalMessage:Y.message});this.cause=Y}};nj=class nj extends Nw{code="TYPE_GENERATION_ERROR";constructor(w,$,Y){super(`Failed to generate types from "${w}" to "${$}": ${Y.message}`,{configDir:w,outputPath:$,originalError:Y.name,originalMessage:Y.message});this.cause=Y}};vA=class vA extends Nw{code="SCHEMA_VALIDATION_ERROR";constructor(w,$,Y){super(`Schema validation failed${Y?` for config "${Y}"`:""}`,{schemaPath:w,configName:Y,validationErrors:$,errorCount:$.length})}};pj=class pj extends Nw{code="BROWSER_CONFIG_ERROR";constructor(w,$,Y,A){super(`Failed to fetch configuration from "${w}": ${$} ${Y}`,{endpoint:w,status:$,statusText:Y,configName:A})}};rj=class rj extends Nw{code="PLUGIN_ERROR";constructor(w,$,Y){super(`Plugin "${w}" failed during ${$}: ${Y.message}`,{pluginName:w,operation:$,originalError:Y.name,originalMessage:Y.message});this.cause=Y}};G1={configNotFound(w,$,Y){return new mj(w,$,Y)},configLoad(w,$,Y){return new cA(w,$,Y)},configValidation(w,$,Y){return new gj(w,$,Y)},configMerge(w,$,Y,A){return new dj(w,$,Y,A)},envVar(w,$,Y,A){return new jU(w,$,Y,A)},fileSystem(w,$,Y){return new lj(w,$,Y)},typeGeneration(w,$,Y){return new nj(w,$,Y)},schemaValidation(w,$,Y){return new vA(w,$,Y)},browserConfig(w,$,Y,A){return new pj(w,$,Y,A)},plugin(w,$,Y){return new rj(w,$,Y)}};CF=/^https?:\/\//;Lw=new dA("bunfig",{showTags:!0});gJ=new w9;XV=Xw(iA.cwd(),"config"),JV=Xw(iA.cwd(),"src/generated")});function F1(w){return w.startsWith("*.")}function TY(w,$){if(!F1($))return!1;let Y=$.slice(1);return w.length>Y.length&&w.endsWith(Y)}function lA(w,$){let Y=w.get($);if(Y!==void 0)return Y;let A,X=-1;for(let[J,U]of w){if(!F1(J))continue;if(TY($,J)){let W=J.length-1;if(W>X)X=W,A=U}}return A}var H;var lw=t(()=>{H={info:(...w)=>console.log("[info]",...w),success:(...w)=>console.log("[success]",...w),warn:(...w)=>console.warn("[warn]",...w),error:(...w)=>console.error("[error]",...w),debug:(...w)=>console.debug("[debug]",...w),log:(...w)=>console.log(...w),start:(...w)=>console.log("[start]",...w),box:(...w)=>console.log("[box]",...w)}});import{createRequire as iF}from"node:module";import{Resolver as fU}from"node:dns/promises";import{createHash as gF,sign as dF}from"node:crypto";import{createHash as lF}from"node:crypto";import{sign as nF}from"node:crypto";import{generateKeyPairSync as Kz,X509Certificate as $q}from"node:crypto";import HU from"node:os";import RU from"node:path";import{existsSync as B9,statSync as j9}from"fs";import{existsSync as Aq,mkdirSync as LV,readdirSync as _V,readFileSync as Xq,writeFileSync as SV}from"fs";import{homedir as N1}from"os";import{dirname as hV,resolve as Ww}from"path";import hX from"process";import{existsSync as z9,statSync as G9}from"fs";import{existsSync as lU,mkdirSync as Jq,readdirSync as Uq,writeFileSync as Qq}from"fs";import{homedir as E1}from"os";import{dirname as K9,resolve as g0}from"path";import c$ from"process";import{join as Wq,relative as Bq,resolve as F9}from"path";import NX from"process";import{existsSync as Fz,mkdirSync as gV,readdirSync as dV,writeFileSync as lV}from"fs";import{homedir as MU}from"os";import{dirname as rV,resolve as m0}from"path";import IY from"process";import{join as jq,relative as zq,resolve as q9}from"path";import EX from"process";import{existsSync as qz,mkdirSync as eV,readdirSync as w3,writeFileSync as $3}from"fs";import{dirname as A3,resolve as TX}from"path";import nU from"process";import{Buffer as E$}from"buffer";import{createCipheriv as Gq,createDecipheriv as Kq,randomBytes as IU}from"crypto";import{closeSync as VU,createReadStream as N9,createWriteStream as Fq,existsSync as CU,fsyncSync as E9,openSync as T9,writeFileSync as qq}from"fs";import{access as Nq,constants as f9,mkdir as Eq,readdir as pA,rename as H9,stat as T1,unlink as rA,writeFile as yU}from"fs/promises";import{join as f1}from"path";import S0 from"process";import{pipeline as Tq}from"stream/promises";import{createGzip as R9}from"zlib";import H1 from"process";import tw from"process";import{Buffer as nw}from"buffer";import{createCipheriv as fq,createDecipheriv as Hq,randomBytes as OU}from"crypto";import{closeSync as LU,createReadStream as M9,createWriteStream as Rq,existsSync as tA,fsyncSync as I9,openSync as V9,writeFileSync as Mq}from"fs";import{access as Iq,constants as C9,mkdir as Vq,readdir as aA,rename as y9,stat as R1,unlink as sA,writeFile as _U}from"fs/promises";import{isAbsolute as Cq,join as M1,resolve as yq}from"path";import l from"process";import{pipeline as Oq}from"stream/promises";import{createGzip as O9}from"zlib";import I1 from"process";import aw from"process";import oA from"process";import{existsSync as eA}from"fs";import{resolve as SU}from"path";import{existsSync as Lq}from"fs";import{existsSync as _q,readdirSync as Sq}from"fs";import{extname as ZU,resolve as L9}from"path";import Zq from"process";import{join as kq,relative as hq,resolve as _9}from"path";import fX from"process";import{Buffer as pw}from"buffer";import{createCipheriv as Dq,createDecipheriv as xq,randomBytes as kU}from"crypto";import{closeSync as hU,createReadStream as S9,createWriteStream as Pq,existsSync as wX,fsyncSync as Z9,openSync as k9,writeFileSync as bq}from"fs";import{access as uq,constants as h9,mkdir as cq,readdir as $X,rename as D9,stat as V1,unlink as YX,writeFile as DU}from"fs/promises";import{isAbsolute as vq,join as C1,resolve as iq}from"path";import n from"process";import{pipeline as mq}from"stream/promises";import{createGzip as x9}from"zlib";import y1 from"process";import sw from"process";import AX from"process";import{existsSync as XX}from"fs";import{resolve as xU}from"path";import{existsSync as gq}from"fs";import{exec as zE}from"node:child_process";import AQ from"node:fs";import GE from"node:os";import Ew from"node:path";import sz from"node:process";import{promisify as KE}from"node:util";import S1 from"node:crypto";import ow from"node:fs";import UQ from"node:path";import PE from"node:crypto";import{execSync as cE}from"node:child_process";import ZX from"node:os";async function QX(w,$={},Y=30000){try{return await fetch(w,{...$,signal:AbortSignal.timeout(Y)})}catch(A){if(A&&typeof A==="object"&&A.name==="TimeoutError"){let X=Error(`ACME HTTP request to ${w} timed out after ${Y}ms`);throw X.name="AcmeRequestTimeoutError",X}throw A}}async function wz(w,$,Y={}){let A=Y.timeoutMs??120000,X=Y.intervalMs??3000,J=w.split(".").slice(-2).join("."),U;try{let B=new fU,j=await B.resolveNs(J),z=(await Promise.all(j.map((G)=>B.resolve4(G).catch(()=>[])))).flat();if(z.length>0)U=new fU,U.setServers(z)}catch{}let W=Date.now()+A,Q=U??new fU;for(;;){try{if((await Q.resolveTxt(w)).some((B)=>B.join("")===$))return!0}catch{}if(Date.now()>=W)return!1;await new Promise((B)=>setTimeout(B,X))}}class MY{tokens=new Map;add(w,$){this.tokens.set(w,$)}get(w){return this.tokens.get(w)}remove(w){this.tokens.delete(w)}static PATH_PREFIX="/.well-known/acme-challenge/";handlePath(w){let $=w.indexOf(MY.PATH_PREFIX);if($===-1)return;let Y=w.slice($+MY.PATH_PREFIX.length);return this.get(Y)}}function WX(w){return(typeof w==="string"?Buffer.from(w,"utf8"):Buffer.from(w)).toString("base64url")}function iU(w){return Buffer.from(w,"base64url")}function $z(w){let $=w.export({format:"jwk"});if($.kty!=="EC"||$.crv!=="P-256"||!$.x||!$.y)throw Error(`Expected a P-256 EC public key, got kty=${$.kty} crv=${$.crv}`);return{crv:"P-256",kty:"EC",x:$.x,y:$.y}}function Yz(w){let $=`{"crv":"${w.crv}","kty":"${w.kty}","x":"${w.x}","y":"${w.y}"}`;return gF("sha256").update($).digest("base64url")}function Az(w){let{protectedHeader:$,payload:Y,privateKey:A}=w,X=WX(JSON.stringify($)),J=Y===""?"":WX(JSON.stringify(Y)),U=`${X}.${J}`,W=dF("sha256",Buffer.from(U),{key:A,dsaEncoding:"ieee-p1363"});return{protected:X,payload:J,signature:WX(W)}}class qX{directoryUrl;accountKey;jwk;thumbprint;requestTimeoutMs;directoryCache;nonce;accountKid;constructor(w){this.directoryUrl=w.directoryUrl,this.accountKey=w.accountKey,this.jwk=$z(w.accountPublicKey),this.thumbprint=Yz(this.jwk),this.requestTimeoutMs=w.requestTimeoutMs??e9}get keyThumbprint(){return this.thumbprint}get kid(){return this.accountKid}async directory(){if(this.directoryCache)return this.directoryCache;let w=await QX(this.directoryUrl,{},this.requestTimeoutMs);if(!w.ok)throw Error(`Failed to fetch ACME directory: HTTP ${w.status}`);return this.directoryCache=await w.json(),this.directoryCache}async newNonce(){let w=await this.directory(),$=(await QX(w.newNonce,{method:"HEAD"},this.requestTimeoutMs)).headers.get("replay-nonce");if(!$)throw Error("ACME server did not return a Replay-Nonce");return this.nonce=$,$}async ensureNonce(){if(this.nonce){let w=this.nonce;return this.nonce=void 0,w}return this.newNonce()}async signedPost(w){let{url:$,payload:Y,useJwk:A}=w,X={alg:"ES256",nonce:await this.ensureNonce(),url:$};if(A)X.jwk=this.jwk;else X.kid=this.requireKid();let J=Az({protectedHeader:X,payload:Y,privateKey:this.accountKey}),U=await QX($,{method:"POST",headers:{"content-type":"application/jose+json"},body:JSON.stringify(J)},this.requestTimeoutMs),W=U.headers.get("replay-nonce");if(W)this.nonce=W;let Q=U.headers.get("content-type")??"",B;if(Q.includes("application/pem-certificate-chain")||Q.startsWith("text/"))B=await U.text();else{let j=await U.text();B=j?JSON.parse(j):{}}if(U.status>=400){let j=B??{};throw new FX(`ACME request to ${$} failed (HTTP ${U.status}): ${j.type??""} ${j.detail??""}`.trim(),j,U.status)}return{status:U.status,headers:U.headers,body:B,location:U.headers.get("location")??void 0}}requireKid(){if(!this.accountKid)throw Error("No ACME account; call newAccount() first");return this.accountKid}async newAccount(w={}){let $=await this.directory(),Y={termsOfServiceAgreed:!0};if(w.email)Y.contact=[`mailto:${w.email}`];let A=await this.signedPost({url:$.newAccount,payload:Y,useJwk:!0});if(!A.location)throw Error("ACME newAccount did not return an account URL (Location header)");return this.accountKid=A.location,this.accountKid}async newOrder(w){let $=await this.directory(),Y={identifiers:w.map((X)=>({type:"dns",value:X}))},A=await this.signedPost({url:$.newOrder,payload:Y});if(!A.location)throw Error("ACME newOrder did not return an order URL (Location header)");return{order:A.body,orderUrl:A.location}}async getAuthorization(w){return(await this.signedPost({url:w,payload:""})).body}keyAuthorization(w){return`${w}.${this.thumbprint}`}dns01TxtValue(w){return lF("sha256").update(this.keyAuthorization(w)).digest("base64url")}async notifyChallengeReady(w){await this.signedPost({url:w,payload:{}})}async pollAuthorization(w,$={}){let Y=$.timeoutMs??60000,A=$.intervalMs??2000,X=Date.now()+Y;while(Date.now()<X){let J=await this.getAuthorization(w);if(J.status==="valid")return;if(J.status==="invalid"){let U=J.challenges.find((W)=>W.status==="invalid");throw new FX(`Authorization for ${J.identifier.value} became invalid: ${U?.error?.detail??"unknown reason"}`,U?.error??{},0)}await W9(A),A=Math.min(A*1.5,1e4)}throw Error(`Timed out waiting for authorization ${w} to become valid`)}async finalizeOrder(w,$){return(await this.signedPost({url:w,payload:{csr:$}})).body}async getOrder(w){return(await this.signedPost({url:w,payload:""})).body}async pollOrder(w,$={}){let Y=$.timeoutMs??60000,A=$.intervalMs??2000,X=Date.now()+Y;while(Date.now()<X){let J=await this.getOrder(w);if(J.status==="valid"){if(!J.certificate)throw Error("ACME order is valid but has no certificate URL");return J.certificate}if(J.status==="invalid")throw Error(`ACME order ${w} became invalid`);await W9(A),A=Math.min(A*1.5,1e4)}throw Error(`Timed out waiting for order ${w} to become valid`)}async downloadCertificate(w){let $=await this.signedPost({url:w,payload:""});return typeof $.body==="string"?$.body:String($.body)}static selectChallenge(w,$){let Y=w.challenges.find((A)=>A.type===$);if(!Y)throw Error(`No ${$} challenge available for ${w.identifier.value}`);return Y}}function Uz(w){let $=w.match(/-----BEGIN CERTIFICATE-----[\s\S]*?-----END CERTIFICATE-----\n?/g)??[],Y=$[0];if(!Y)return{certPem:`${w.trim()}
63
+ `;return Y}}function HF(w,$,Y={}){return aj(w,$,Y,new WeakMap)}function aj(w,$,Y,A){let{arrayMergeMode:X="replace",skipNullish:J=!1,customMerger:U}=Y;if($===null||$===void 0)return J?w:$;if(U){let W=U(w,$);if(W!==void 0)return W}if(Array.isArray($)||Array.isArray(w))return sj(w,$,X,A);if(!Uw($)||!Uw(w))return $;return VF(w,$,Y,A)}function sj(w,$,Y,A){if(Array.isArray($)&&!Array.isArray(w))return $;if(Array.isArray(w)&&!Array.isArray($))return $;if(Array.isArray($)&&Array.isArray(w))switch(Y){case"replace":return $;case"concat":return RF(w,$);case"smart":return MF(w,$,A);default:return $}return $}function RF(w,$){let Y=[...$];for(let A of w)if(!Y.some((X)=>AU(X,A)))Y.push(A);return Y}function MF(w,$,Y){if($.length===0)return w;if(w.length===0)return $;if(Uw($[0])&&Uw(w[0]))return IF(w,$,Y);if($.every((A)=>typeof A==="string")&&w.every((A)=>typeof A==="string")){let A=[...$];for(let X of w)if(!A.includes(X))A.push(X);return A}return $}function IF(w,$,Y){let A=[...$];for(let X of w){if(!Uw(X)){A.push(X);continue}let J=["id","name","key","path","type"],U=!1;for(let W of J)if(W in X){if(A.find((B)=>Uw(B)&&(W in B)&&B[W]===X[W])){U=!0;break}}if(!U)A.push(X)}return A}function VF(w,$,Y,A){let X=$;if(Uw(X)&&A.has(X))return A.get(X);let J={...w};if(Uw(X))A.set(X,J);for(let U in X){if(!Object.prototype.hasOwnProperty.call(X,U))continue;let W=X[U],Q=J[U];if(Y.skipNullish&&(W===null||W===void 0))continue;if(W===null||W===void 0){J[U]=W;continue}if(Uw(W)&&Uw(Q))J[U]=aj(Q,W,Y,A);else if(Array.isArray(W)||Array.isArray(Q))J[U]=sj(Q,W,Y.arrayMergeMode||"smart",A);else J[U]=W}return J}function oj(w,$,Y="replace"){return HF(w,$,{arrayMergeMode:Y==="replace"?"replace":"smart",skipNullish:!0})}function AU(w,$){if(w===$)return!0;if(Array.isArray(w)&&Array.isArray($)){if(w.length!==$.length)return!1;for(let Y=0;Y<w.length;Y++)if(!AU(w[Y],$[Y]))return!1;return!0}if(Uw(w)&&Uw($)){let Y=Object.keys(w),A=Object.keys($);if(Y.length!==A.length)return!1;for(let X of Y){if(!Object.prototype.hasOwnProperty.call($,X))return!1;if(!AU(w[X],$[X]))return!1}return!0}return!1}function Uw(w){return Boolean(w&&typeof w==="object"&&!Array.isArray(w))}class ej{extensions=[".ts",".js",".mjs",".cjs",".json",".mts",".cts"];async loadFromPath(w,$,Y={}){let{arrayStrategy:A="replace",useCache:X=!0,cacheTtl:J,trackPerformance:U=!0,verbose:W=!1}=Y;if(X){let B=_A.getWithFileCheck("file",w);if(B){if(W)console.log(`Configuration loaded from cache: ${w}`);return B}}let Q=async()=>{if(!MA(w))return null;try{let B=`?t=${Date.now()}`,j=await import(w+B),z=j.default||j,G="default"in j,K=Object.keys(j).length>0;if(!G&&!K)throw new iA(w,Error("Configuration file is empty and exports nothing"),"unknown");if(typeof z!=="object"||z===null||Array.isArray(z))throw new iA(w,Error("Configuration must export a valid object"),"unknown");let N={config:oj($,z,A),source:{type:"file",path:w,priority:100,timestamp:new Date}};if(X)_A.setWithFileCheck("file",N,w,J);return N}catch(B){throw B instanceof Error?K1.configLoad(w,B):K1.configLoad(w,Error(String(B)))}};if(U)return XU.track("loadFromPath",Q,{path:w});return Q()}async tryLoadFromPaths(w,$,Y={}){for(let A of w)try{let X=await this.loadFromPath(A,$,Y);if(X)return X}catch(X){if(X instanceof Error&&X.name==="ConfigLoadError")throw X;if(Y.verbose)console.warn(`Failed to load config from ${A}:`,X)}return null}generateConfigPaths(w,$,Y){let A=this.generateNamePatterns(w,Y),X=[];for(let J of A)for(let U of this.extensions)X.push(dJ($,`${J}${U}`));return X}generateNamePatterns(w,$){let Y=[];if(Y.push("config",".config"),w)Y.push(w,`.${w}.config`,`${w}.config`,`.${w}`);let A=$===void 0?[]:Array.isArray($)?$:[$];for(let J of A){if(!J)continue;if(Y.push(J,`.${J}.config`,`${J}.config`,`.${J}`),w)Y.push(`${w}.${J}.config`,`.${w}.${J}.config`)}let X=new Set;return Y.filter((J)=>{if(!J||X.has(J))return!1;return X.add(J),!0})}checkFileAccess(w){return TF(async()=>{return MA(w)},{maxRetries:2,retryDelay:100,fallback:!1})}async discoverConfigFiles(w,$,Y){let A=[];if(!MA(w))return A;if($||Y){let X=this.generateNamePatterns($||"",Y);for(let J of X)for(let U of this.extensions){let W=dJ(w,`${J}${U}`);if(await this.checkFileAccess(W))A.push(W)}}else try{let{readdirSync:X}=await import("fs"),J=X(w);for(let U of J)if(this.looksLikeConfigFile(U)){let W=dJ(w,U);if(await this.checkFileAccess(W))A.push(W)}}catch{return[]}return A}looksLikeConfigFile(w){return[/\.config\.(ts|js|mjs|cjs|json|mts|cts)$/,/^\..*\.(ts|js|mjs|cjs|json|mts|cts)$/,/config\.(ts|js|mjs|cjs|json|mts|cts)$/].some((Y)=>Y.test(w))}async validateConfigFile(w){let $=[];try{if(!MA(w))return $.push("Configuration file does not exist"),$;let Y=await import(w),A=Y.default||Y;if(A===void 0)$.push("Configuration file must export a default value or named exports");else if(typeof A!=="object"||A===null)$.push("Configuration must be an object");else if(Array.isArray(A))$.push("Configuration cannot be an array at the root level");if(w.endsWith(".json"))try{let{readFileSync:X}=await import("fs"),J=X(w,"utf8");JSON.parse(J)}catch(X){$.push(`Invalid JSON syntax: ${X}`)}}catch(Y){$.push(`Failed to load configuration file: ${Y}`)}return $}async getFileModificationTime(w){try{let{statSync:$}=await import("fs");return $(w).mtime}catch{return null}}async preloadConfigurations(w,$={}){let Y=new Map;return await Promise.allSettled(w.map(async(A)=>{try{let X=await this.loadFromPath(A,{},$);if(X)Y.set(A,X.config)}catch(X){if($.verbose)console.warn(`Failed to preload ${A}:`,X)}})),Y}}class w9{async validateConfiguration(w,$,Y={}){let{stopOnFirstError:A=!1,validateRequired:X=!0,validateTypes:J=!0,customRules:U=[],trackPerformance:W=!0,verbose:Q=!1}=Y,B=async()=>{let j=[],z=[],G={stopOnFirstError:A,validateRequired:X,validateTypes:J,customRules:U,trackPerformance:W,verbose:Q};try{if(typeof $==="string")return await this.validateWithSchemaFile(w,$,G);else if(Array.isArray($))return this.validateWithRules(w,[...$,...U],G);else return this.validateWithJSONSchema(w,$,G)}catch(K){return j.push({path:"",message:`Validation failed: ${K}`,rule:"system"}),{isValid:!1,errors:j,warnings:z}}};if(W)return await XU.track("validateConfiguration",B);return B()}async validateWithSchemaFile(w,$,Y){try{if(!CF($))throw new mA($,[{path:"",message:"Schema file does not exist"}]);let A=await import($),X=A.default||A;if(Array.isArray(X))return this.validateWithRules(w,X,Y);else return this.validateWithJSONSchema(w,X,Y)}catch(A){throw new mA($,[{path:"",message:`Failed to load schema: ${A}`}])}}validateWithJSONSchema(w,$,Y){let A=[],X=[];return this.validateObjectAgainstSchema(w,$,"",A,X,Y),{isValid:A.length===0,errors:A,warnings:X}}validateObjectAgainstSchema(w,$,Y,A,X,J){if(J.validateTypes&&$.type){let U=Array.isArray(w)?"array":typeof w,W=Array.isArray($.type)?$.type:[$.type];if(!W.includes(U)){if(A.push({path:Y,message:`Expected type ${W.join(" or ")}, got ${U}`,expected:W.join(" or "),actual:U,rule:"type"}),J.stopOnFirstError)return}}if($.enum&&!$.enum.includes(w)){if(A.push({path:Y,message:`Value must be one of: ${$.enum.join(", ")}`,expected:$.enum.join(", "),actual:w,rule:"enum"}),J.stopOnFirstError)return}if(typeof w==="string"){if($.minLength!==void 0&&w.length<$.minLength)A.push({path:Y,message:`String length must be at least ${$.minLength}`,expected:`>= ${$.minLength}`,actual:w.length,rule:"minLength"});if($.maxLength!==void 0&&w.length>$.maxLength)A.push({path:Y,message:`String length must not exceed ${$.maxLength}`,expected:`<= ${$.maxLength}`,actual:w.length,rule:"maxLength"});if($.pattern){if(!new RegExp($.pattern).test(w))A.push({path:Y,message:`String does not match pattern ${$.pattern}`,expected:$.pattern,actual:w,rule:"pattern"})}}if(typeof w==="number"){if($.minimum!==void 0&&w<$.minimum)A.push({path:Y,message:`Value must be at least ${$.minimum}`,expected:`>= ${$.minimum}`,actual:w,rule:"minimum"});if($.maximum!==void 0&&w>$.maximum)A.push({path:Y,message:`Value must not exceed ${$.maximum}`,expected:`<= ${$.maximum}`,actual:w,rule:"maximum"})}if(Array.isArray(w)&&$.items)for(let U=0;U<w.length;U++){let W=Y?`${Y}[${U}]`:`[${U}]`;if(this.validateObjectAgainstSchema(w[U],$.items,W,A,X,J),J.stopOnFirstError&&A.length>0)return}if(w&&typeof w==="object"&&!Array.isArray(w)){let U=w;if(J.validateRequired&&$.required){for(let W of $.required)if(!(W in U)){if(A.push({path:Y?`${Y}.${W}`:W,message:`Missing required property '${W}'`,expected:"required",rule:"required"}),J.stopOnFirstError)return}}if($.properties){for(let[W,Q]of Object.entries($.properties))if(W in U){let B=Y?`${Y}.${W}`:W;if(this.validateObjectAgainstSchema(U[W],Q,B,A,X,J),J.stopOnFirstError&&A.length>0)return}}if($.additionalProperties===!1){let W=new Set(Object.keys($.properties||{}));for(let Q of Object.keys(U))if(!W.has(Q))X.push({path:Y?`${Y}.${Q}`:Q,message:`Additional property '${Q}' is not allowed`,rule:"additionalProperties"})}}}validateWithRules(w,$,Y){let A=[],X=[];for(let J of $)try{let U=this.getValueByPath(w,J.path),W=this.validateWithRule(U,J,J.path);if(A.push(...W),Y.stopOnFirstError&&A.length>0)break}catch(U){A.push({path:J.path,message:`Rule validation failed: ${U}`,rule:"system"})}return{isValid:A.length===0,errors:A,warnings:X}}validateWithRule(w,$,Y){let A=[];if($.required&&(w===void 0||w===null))return A.push({path:Y,message:$.message||`Property '${Y}' is required`,expected:"required",rule:"required"}),A;if(w===void 0||w===null)return A;if($.type){let X=Array.isArray(w)?"array":typeof w;if(X!==$.type)A.push({path:Y,message:$.message||`Expected type ${$.type}, got ${X}`,expected:$.type,actual:X,rule:"type"})}if($.min!==void 0){let X=Array.isArray(w)?w.length:typeof w==="string"?w.length:typeof w==="number"?w:0;if(X<$.min)A.push({path:Y,message:$.message||`Value must be at least ${$.min}`,expected:`>= ${$.min}`,actual:X,rule:"min"})}if($.max!==void 0){let X=Array.isArray(w)?w.length:typeof w==="string"?w.length:typeof w==="number"?w:0;if(X>$.max)A.push({path:Y,message:$.message||`Value must not exceed ${$.max}`,expected:`<= ${$.max}`,actual:X,rule:"max"})}if($.pattern&&typeof w==="string"){if(!$.pattern.test(w))A.push({path:Y,message:$.message||`Value does not match pattern ${$.pattern}`,expected:$.pattern.toString(),actual:w,rule:"pattern"})}if($.enum&&!$.enum.includes(w))A.push({path:Y,message:$.message||`Value must be one of: ${$.enum.join(", ")}`,expected:$.enum.join(", "),actual:w,rule:"enum"});if($.validator){let X=$.validator(w);if(X)A.push({path:Y,message:$.message||X,rule:"custom"})}return A}getValueByPath(w,$){if(!$)return w;let Y=$.split("."),A=w;for(let X of Y)if(A&&typeof A==="object"&&X in A)A=A[X];else return;return A}generateRulesFromInterface(w){let $=[],Y=w.matchAll(/(\w+)(\?)?:\s*(\w+)/g);for(let A of Y){let[,X,J,U]=A;$.push({path:X,required:!J,type:this.mapTypeScriptType(U)})}return $}mapTypeScriptType(w){switch(w.toLowerCase()){case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"array":return"array";case"object":return"object";default:return"object"}}static createCommonRules(){return{server:[{path:"port",required:!0,type:"number",min:1,max:65535},{path:"host",required:!0,type:"string",min:1},{path:"ssl",type:"boolean"}],database:[{path:"url",required:!0,type:"string",min:1},{path:"pool",type:"number",min:1,max:100},{path:"timeout",type:"number",min:0}],api:[{path:"baseUrl",required:!0,type:"string",pattern:yF},{path:"timeout",type:"number",min:0},{path:"retries",type:"number",min:0,max:10}]}}}function OF(w){if(!w)return"";let $=Array.isArray(w)?w.filter(Boolean):[w];if($.length===0)return"";if($.length===1)return` or alias "${$[0]}"`;return` or aliases ${$.map((Y)=>`"${Y}"`).join(", ")}`}class $9{fileLoader=new ej;envProcessor=new KU;validator=new w9;async loadConfig(w){let $=Date.now(),{cache:Y,performance:A,schema:X,validate:J,...U}=w;try{if(Y?.enabled){let Q=this.checkCache(U.name||"",U);if(Q)return Q}let W;try{W=await this.loadConfigurationStrategies(U,!0,Y)}catch(Q){let B=U.__strictErrorHandling;if(Q instanceof Error&&Q.name==="ConfigNotFoundError"){if(B)throw Q;W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`No configuration file found for "${U.name||"config"}", using defaults with environment variables`]}}else if(Q instanceof Error&&Q.name==="ConfigLoadError"){let j=Q.message.includes("EACCES")||Q.message.includes("EPERM")||Q.message.includes("permission denied"),z=!j&&(Q.message.includes("syntax")||Q.message.includes("Expected")||Q.message.includes("Unexpected")||Q.message.includes("BuildMessage")||Q.message.includes("errors building")),G=Q.message.includes("Configuration must export a valid object")||Q.message.includes("Configuration file is empty and exports nothing");if(B&&(G||j))throw Q;if(z&&(!B||!G))W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:["Configuration file has syntax errors, using defaults with environment variables"]};else if(!B)W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`Configuration loading error, using defaults: ${Q.message}`]};else throw Q}else W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`Configuration loading failed, using defaults: ${Q instanceof Error?Q.message:String(Q)}`]}}if(X||J)await this.validateConfiguration(W.config,X,J,U.name);if(Y?.enabled&&W)this.cacheResult(U.name||"",W,Y,U);if(A?.enabled){let Q={operation:"loadConfig",duration:Date.now()-$,configName:U.name,timestamp:new Date};if(A.onMetrics)A.onMetrics(Q);if(A.slowThreshold&&Q.duration>A.slowThreshold)Lw.warn(`Slow configuration loading detected: ${Q.duration}ms for ${U.name}`);W.metrics=Q}return W}catch(W){if(W instanceof Error&&W.name==="ConfigNotFoundError")throw W;let Q=Date.now()-$;throw Lw.error(`Configuration loading failed after ${Q}ms:`,[W instanceof Error?W:Error(String(W))]),W}}async loadConfigurationStrategies(w,$=!1,Y){let{name:A="",alias:X,cwd:J,configDir:U,defaultConfig:W,checkEnv:Q=!0,arrayStrategy:B="replace",verbose:j=!1}=w,z=J||gA.cwd(),G=[],K=await this.loadLocalConfiguration(A,X,z,U,W,B,j,Q,Y);if(K)return G.push(...this.getLocalSearchPaths(A,X,z,U)),this.finalizeResult(K,G,Q,A,j);let E=await this.loadHomeConfiguration(A,X,W,B,j,Q);if(E)return G.push(...this.getHomeSearchPaths(A,X)),this.finalizeResult(E,G,Q,A,j);let q=await this.loadPackageJsonConfiguration(A,X,z,W,B,j,Q);if(q)return G.push(Xw(z,"package.json")),this.finalizeResult(q,G,Q,A,j);if(G.push(...this.getAllSearchPaths(A,X,z,U)),$)throw K1.configNotFound(A,G,X);return{...await this.applyEnvironmentVariables(A,W,Q,j),warnings:[`No configuration file found for "${A}"${OF(X)}, using defaults with environment variables`]}}async loadLocalConfiguration(w,$,Y,A,X,J,U,W,Q){let B=W?IA(w,X,U):X,j=this.getLocalDirectories(Y,A);for(let z of j){if(U)Lw.info(`Searching for configuration in: ${z}`);let G=this.fileLoader.generateConfigPaths(w,z,$),K=await this.fileLoader.tryLoadFromPaths(G,B,{arrayStrategy:J,verbose:U,cacheTtl:Q?.ttl,useCache:!Q?.ttl||Q.ttl>100});if(K){if(U)Lw.success(`Configuration loaded from: ${K.source.path}`);return K}}return null}async loadHomeConfiguration(w,$,Y,A,X,J){if(!w)return null;let U=J?IA(w,Y,X):Y,W=[Xw($1(),".config",w),Xw($1(),".config"),$1()];for(let Q of W){if(X)Lw.info(`Checking home directory: ${Q}`);let B=this.fileLoader.generateConfigPaths(w,Q,$),j=await this.fileLoader.tryLoadFromPaths(B,U,{arrayStrategy:A,verbose:X});if(j){if(X)Lw.success(`Configuration loaded from home directory: ${j.source.path}`);return j}}return null}async loadPackageJsonConfiguration(w,$,Y,A,X,J,U){let W=U?IA(w,A,J):A;try{let Q=Xw(Y,"package.json");if(!HK(Q))return null;let B={};try{B=JSON.parse(RK(Q,"utf8"))}catch(G){if(J)Lw.warn("Failed to parse package.json:",[G instanceof Error?G:Error(String(G))]);return null}let j=B[w],z=w;if(!j&&$){let G=Array.isArray($)?$:[$];for(let K of G){if(!K)continue;if(B[K]){j=B[K],z=K;break}}}if(j&&typeof j==="object"&&!Array.isArray(j)){if(J)Lw.success(`Configuration loaded from package.json: ${z}`);return{config:oj(W,j,X),source:{type:"package.json",path:Q,priority:30,timestamp:new Date}}}}catch(Q){if(J)Lw.warn("Failed to load package.json:",[Q instanceof Error?Q:Error(String(Q))])}return null}async applyEnvironmentVariables(w,$,Y,A){if(!Y||!w||typeof $!=="object"||$===null||Array.isArray($))return{config:$,source:{type:"default",priority:10,timestamp:new Date}};return{config:IA(w,$,A),source:{type:"environment",priority:20,timestamp:new Date}}}async finalizeResult(w,$,Y,A,X){return{config:w.config,source:w.source,path:w.source.path}}async validateConfiguration(w,$,Y,A){let X=[];if(Y){let J=Y(w);if(J)X.push(...J)}if($){let J=await this.validator.validateConfiguration(w,$);if(!J.isValid)X.push(...J.errors.map((U)=>U.path?`${U.path}: ${U.message}`:U.message))}if(X.length>0)throw K1.configValidation(A||"unknown",X,A)}checkCache(w,$){let Y=this.generateCacheKey(w,$);return _A.get(Y)||null}cacheResult(w,$,Y,A){let X=this.generateCacheKey(w,A);_A.set(X,$,void 0,Y.ttl)}generateCacheKey(w,$){let Y=[w];if($.alias){let A=Array.isArray($.alias)?$.alias.join(","):$.alias;Y.push(`alias:${A}`)}if($.cwd)Y.push(`cwd:${$.cwd}`);if($.configDir)Y.push(`configDir:${$.configDir}`);if("checkEnv"in $)Y.push(`checkEnv:${$.checkEnv}`);return Y.join("|")}getLocalDirectories(w,$){return Array.from(new Set([w,Xw(w,"config"),Xw(w,".config"),$?Xw(w,$):void 0].filter(Boolean)))}getAllSearchPaths(w,$,Y,A){let X=[];return X.push(...this.getLocalSearchPaths(w,$,Y,A)),X.push(...this.getHomeSearchPaths(w,$)),X.push(Xw(Y,"package.json")),X}getLocalSearchPaths(w,$,Y,A){let X=this.getLocalDirectories(Y,A),J=[];for(let U of X)J.push(...this.fileLoader.generateConfigPaths(w,U,$));return J}getHomeSearchPaths(w,$){if(!w)return[];let Y=[Xw($1(),".config",w),Xw($1(),".config"),$1()],A=[];for(let X of Y)A.push(...this.fileLoader.generateConfigPaths(w,X,$));return A}async loadConfigWithResult(w){return this.loadConfig(w)}}async function FU(w){let $="defaultConfig"in w&&w.defaultConfig!==void 0?w.defaultConfig:{},Y="cache"in w||"performance"in w||"schema"in w||"validate"in w;try{let A;if(Y)A=await lJ.loadConfig(w);else A=await lJ.loadConfig({...w,defaultConfig:$,cache:{enabled:!0},performance:{enabled:!1}});return A?.config??$}catch(A){let X=A instanceof Error?A.name:"UnknownError",J=A instanceof Error?A.message:String(A);if(!(X==="ConfigNotFoundError"||X==="ConfigLoadError"||X==="ConfigValidationError"||J.includes("config"))&&w.verbose)Lw.warn("Unexpected error loading config, using defaults:",[A instanceof Error?A:Error(String(A))]);let W=Y?{...w,defaultConfig:$}:{...w,defaultConfig:$,cache:{enabled:!0},performance:{enabled:!1}};if("checkEnv"in w?w.checkEnv!==!1:!0)return(await lJ.applyEnvironmentVariables(W.name||"",$,!0,W.verbose||!1))?.config??$;return $}}function IA(w,$,Y=!1){let A=new KU,X=w.toUpperCase().replace(/[^A-Z0-9]/g,"_");function J(U,W=[]){let Q={...U};for(let[B,j]of Object.entries(U)){let z=[...W,B],G=[`${X}_${z.join("_").toUpperCase()}`,`${X}_${z.map((q)=>q.toUpperCase()).join("")}`,`${X}_${z.map((q)=>q.replace(/([A-Z])/g,"_$1").toUpperCase()).join("")}`],K,E;for(let q of G)if(K=gA.env[q],K!==void 0){E=q;break}if(K!==void 0&&E)if(typeof j==="boolean")Q[B]=["true","1","yes"].includes(K.toLowerCase());else if(typeof j==="number"){let q=Number(K);if(!Number.isNaN(q))Q[B]=q}else if(Array.isArray(j))try{Q[B]=JSON.parse(K)}catch{Q[B]=K.split(",").map((q)=>q.trim())}else Q[B]=K;else if(j&&typeof j==="object"&&!Array.isArray(j))Q[B]=J(j,z)}return Q}return J($)}var _A,XU,U7,Q7=(w)=>w,B7=(w,$)=>{for(var Y in $)U7(w,Y,{get:$[Y],enumerable:!0,configurable:!0,set:W7.bind($,Y)})},j7=(w,$)=>()=>(w&&($=w(w=0)),$),Vj,hj,G1,fY,Dj,b7,u7,Wj,CA,tJ,L0,a,c7,Bj,v7,jj,i7,m7,cJ,g7,zj,Gj,vJ,d7,l7,n7,p7,yA,xj,r7,_0,t7,a7,Kj,OA,aJ,q0,u,s7,Fj,o7,qj,e7,wF,iJ,$F,Nj,Ej,YF,mJ,AF,XF,JF,UF,QF,LA,Pj,WF,BF="0.15.6",o0,uA,NY,sJ,oJ,cA,eJ,wU,EY,$U,YU,N$,bj,uj,qw,dw,cj,vj,jF,GF,ij,vA,gI,I0,i,dI,FF,lI,qF,nI,pI,fj,rI,NF,EF,tI,Tj,aI,sI,oI,eI,wV,gJ,fF,$V,Nw,gj,iA,dj,lj,GU,nj,pj,mA,rj,tj,K1,yF,Lw,lJ,UV,QV;var qU=t(()=>{_A=new Hj,XU=new Rj,U7=Object.defineProperty;Vj={};B7(Vj,{withErrorRecovery:()=>Oj,tryLoadConfig:()=>h7,loadConfigWithResult:()=>Z7,loadConfig:()=>kj,isRetryableError:()=>C7,isConfigNotFoundError:()=>V7,isBunfigError:()=>Lj,globalPerformanceMonitor:()=>fY,globalCache:()=>G1,getEnvOrDefault:()=>y7,generateConfigTypes:()=>D7,defaultGeneratedDir:()=>vj,defaultConfigDir:()=>cj,deepMergeWithArrayStrategy:()=>BU,deepMerge:()=>_j,createLibraryConfig:()=>x7,config:()=>k7,bunfigPlugin:()=>P7,applyEnvVarsToConfig:()=>FY,TypeGenerationError:()=>wU,SchemaValidationError:()=>EY,PluginError:()=>YU,PerformanceMonitor:()=>UU,FileSystemError:()=>eJ,ErrorFactory:()=>N$,EnvVarError:()=>cA,EnvProcessor:()=>dA,ConfigValidator:()=>jU,ConfigValidationError:()=>sJ,ConfigNotFoundError:()=>uA,ConfigMergeError:()=>oJ,ConfigLoader:()=>zU,ConfigLoadError:()=>NY,ConfigFileLoader:()=>lA,ConfigCache:()=>JU,CacheUtils:()=>Dj,BunfigError:()=>o0,BrowserConfigError:()=>$U,ArrayMergeStrategies:()=>bj});jF=j7(async()=>{hj=import.meta.require,G1=new JU,fY=new UU,Dj={createKey:z7,isEquivalent:G7,estimateMemoryUsage:K7},b7=kA(pJ.cwd(),"config"),u7=kA(pJ.cwd(),"src/generated"),Wj=ZA.env.CLARITY_LOG_DIR||OK(N7(),"logs"),CA={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:Wj,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1},tJ=await E7(),L0={red:(w)=>`\x1B[31m${w}\x1B[0m`,green:(w)=>`\x1B[32m${w}\x1B[0m`,yellow:(w)=>`\x1B[33m${w}\x1B[0m`,blue:(w)=>`\x1B[34m${w}\x1B[0m`,magenta:(w)=>`\x1B[35m${w}\x1B[0m`,cyan:(w)=>`\x1B[36m${w}\x1B[0m`,white:(w)=>`\x1B[37m${w}\x1B[0m`,gray:(w)=>`\x1B[90m${w}\x1B[0m`,bgRed:(w)=>`\x1B[41m${w}\x1B[0m`,bgYellow:(w)=>`\x1B[43m${w}\x1B[0m`,bold:(w)=>`\x1B[1m${w}\x1B[0m`,dim:(w)=>`\x1B[2m${w}\x1B[0m`,italic:(w)=>`\x1B[3m${w}\x1B[0m`,underline:(w)=>`\x1B[4m${w}\x1B[0m`,reset:"\x1B[0m"},a=L0,c7=L0.red,Bj=L0.green,v7=L0.yellow,jj=L0.blue,i7=L0.magenta,m7=L0.cyan,cJ=L0.white,g7=L0.gray,zj=L0.bgRed,Gj=L0.bgYellow,vJ=L0.bold,d7=L0.dim,l7=L0.italic,n7=L0.underline,p7=L0.reset,yA={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},xj={debug:"\uD83D\uDD0D",info:jj("ℹ"),success:Bj("✓"),warning:Gj(cJ(vJ(" WARN "))),error:zj(cJ(vJ(" ERROR ")))},r7=new xA("stacks"),_0=new xA("bunfig",{showTags:!0}),t7=v0(qY.cwd(),"config"),a7=v0(qY.cwd(),"src/generated"),Kj=SA.env.CLARITY_LOG_DIR||CK(R7(),"logs"),OA={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:Kj,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1,writeToFile:!1},aJ=await M7(),q0={red:(w)=>`\x1B[31m${w}\x1B[0m`,green:(w)=>`\x1B[32m${w}\x1B[0m`,yellow:(w)=>`\x1B[33m${w}\x1B[0m`,blue:(w)=>`\x1B[34m${w}\x1B[0m`,magenta:(w)=>`\x1B[35m${w}\x1B[0m`,cyan:(w)=>`\x1B[36m${w}\x1B[0m`,white:(w)=>`\x1B[37m${w}\x1B[0m`,gray:(w)=>`\x1B[90m${w}\x1B[0m`,bgRed:(w)=>`\x1B[41m${w}\x1B[0m`,bgYellow:(w)=>`\x1B[43m${w}\x1B[0m`,bgGray:(w)=>`\x1B[100m${w}\x1B[0m`,bold:(w)=>`\x1B[1m${w}\x1B[0m`,dim:(w)=>`\x1B[2m${w}\x1B[0m`,italic:(w)=>`\x1B[3m${w}\x1B[0m`,underline:(w)=>`\x1B[4m${w}\x1B[0m`,strikethrough:(w)=>`\x1B[9m${w}\x1B[0m`,reset:"\x1B[0m"},u=q0,s7=q0.red,Fj=q0.green,o7=q0.yellow,qj=q0.blue,e7=q0.magenta,wF=q0.cyan,iJ=q0.white,$F=q0.gray,Nj=q0.bgRed,Ej=q0.bgYellow,YF=q0.bgGray,mJ=q0.bold,AF=q0.dim,XF=q0.italic,JF=q0.underline,UF=q0.strikethrough,QF=q0.reset,LA={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},Pj={debug:"\uD83D\uDD0D",info:qj("ℹ"),success:Fj("✓"),warning:Ej(iJ(mJ(" WARN "))),error:Nj(iJ(mJ(" ERROR ")))},WF=new bA("stacks"),o0=class extends Error{timestamp;context;constructor($,Y={}){super($);if(this.name=this.constructor.name,this.timestamp=new Date,this.context=Y,Error.captureStackTrace)Error.captureStackTrace(this,this.constructor)}toJSON(){return{name:this.name,code:this.code,message:this.message,timestamp:this.timestamp.toISOString(),context:this.context,stack:this.stack}}toString(){let $=Object.keys(this.context).length>0?` (${Object.entries(this.context).map(([Y,A])=>`${Y}: ${A}`).join(", ")})`:"";return`${this.name} [${this.code}]: ${this.message}${$}`}},uA=class extends o0{code="CONFIG_NOT_FOUND";constructor($,Y,A){let X=A?` or alias "${A}"`:"";super(`Configuration "${$}"${X} not found`,{configName:$,alias:A,searchPaths:Y,searchPathCount:Y.length})}},NY=class extends o0{code="CONFIG_LOAD_ERROR";constructor($,Y,A){super(`Failed to load configuration from "${$}": ${Y.message}`,{configPath:$,configName:A,originalError:Y.name,originalMessage:Y.message});this.cause=Y}},sJ=class extends o0{code="CONFIG_VALIDATION_ERROR";constructor($,Y,A){super(`Configuration validation failed for "${$}"`,{configPath:$,configName:A,validationErrors:Y,errorCount:Y.length})}},oJ=class extends o0{code="CONFIG_MERGE_ERROR";constructor($,Y,A,X){super(`Failed to merge configuration from "${$}" with "${Y}": ${A.message}`,{sourcePath:$,targetPath:Y,configName:X,originalError:A.name,originalMessage:A.message});this.cause=A}},cA=class extends o0{code="ENV_VAR_ERROR";constructor($,Y,A,X){super(`Failed to parse environment variable "${$}" with value "${Y}" as ${A}`,{envKey:$,envValue:Y,expectedType:A,configName:X})}},eJ=class extends o0{code="FILE_SYSTEM_ERROR";constructor($,Y,A){super(`File system ${$} failed for "${Y}": ${A.message}`,{operation:$,path:Y,originalError:A.name,originalMessage:A.message});this.cause=A}},wU=class extends o0{code="TYPE_GENERATION_ERROR";constructor($,Y,A){super(`Failed to generate types from "${$}" to "${Y}": ${A.message}`,{configDir:$,outputPath:Y,originalError:A.name,originalMessage:A.message});this.cause=A}},EY=class extends o0{code="SCHEMA_VALIDATION_ERROR";constructor($,Y,A){super(`Schema validation failed${A?` for config "${A}"`:""}`,{schemaPath:$,configName:A,validationErrors:Y,errorCount:Y.length})}},$U=class extends o0{code="BROWSER_CONFIG_ERROR";constructor($,Y,A,X){super(`Failed to fetch configuration from "${$}": ${Y} ${A}`,{endpoint:$,status:Y,statusText:A,configName:X})}},YU=class extends o0{code="PLUGIN_ERROR";constructor($,Y,A){super(`Plugin "${$}" failed during ${Y}: ${A.message}`,{pluginName:$,operation:Y,originalError:A.name,originalMessage:A.message});this.cause=A}},N$={configNotFound(w,$,Y){return new uA(w,$,Y)},configLoad(w,$,Y){return new NY(w,$,Y)},configValidation(w,$,Y){return new sJ(w,$,Y)},configMerge(w,$,Y,A){return new oJ(w,$,Y,A)},envVar(w,$,Y,A){return new cA(w,$,Y,A)},fileSystem(w,$,Y){return new eJ(w,$,Y)},typeGeneration(w,$,Y){return new wU(w,$,Y)},schemaValidation(w,$,Y){return new EY(w,$,Y)},browserConfig(w,$,Y,A){return new $U(w,$,Y,A)},plugin(w,$,Y){return new YU(w,$,Y)}},bj={replace:"replace",concat:"concat",smart:"smart"},uj=/^https?:\/\//,qw=new bA("bunfig",{showTags:!0}),dw=new zU,cj=i0(u$.cwd(),"config"),vj=i0(u$.cwd(),"src/generated")});GF=hA.env.CLARITY_LOG_DIR||tK(zF(),"logs"),ij={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:GF,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1,writeToFile:!1},vA={...ij},gI=(async()=>{try{let{loadConfig:w}=await jF().then(()=>Vj),$=await w({name:"clarity",alias:"logging",defaultConfig:ij,cwd:hA.cwd()});if($)Object.assign(vA,$)}catch{}return vA})();I0={red:(w)=>`\x1B[31m${w}\x1B[0m`,green:(w)=>`\x1B[32m${w}\x1B[0m`,yellow:(w)=>`\x1B[33m${w}\x1B[0m`,blue:(w)=>`\x1B[34m${w}\x1B[0m`,magenta:(w)=>`\x1B[35m${w}\x1B[0m`,cyan:(w)=>`\x1B[36m${w}\x1B[0m`,white:(w)=>`\x1B[37m${w}\x1B[0m`,gray:(w)=>`\x1B[90m${w}\x1B[0m`,bgRed:(w)=>`\x1B[41m${w}\x1B[0m`,bgYellow:(w)=>`\x1B[43m${w}\x1B[0m`,bgGray:(w)=>`\x1B[100m${w}\x1B[0m`,bold:(w)=>`\x1B[1m${w}\x1B[0m`,dim:(w)=>`\x1B[2m${w}\x1B[0m`,italic:(w)=>`\x1B[3m${w}\x1B[0m`,underline:(w)=>`\x1B[4m${w}\x1B[0m`,strikethrough:(w)=>`\x1B[9m${w}\x1B[0m`,reset:"\x1B[0m"},i=I0,dI=I0.red,FF=I0.green,lI=I0.yellow,qF=I0.blue,nI=I0.magenta,pI=I0.cyan,fj=I0.white,rI=I0.gray,NF=I0.bgRed,EF=I0.bgYellow,tI=I0.bgGray,Tj=I0.bold,aI=I0.dim,sI=I0.italic,oI=I0.underline,eI=I0.strikethrough,wV=I0.reset,gJ={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},fF={debug:"\uD83D\uDD0D",info:qF("ℹ"),success:FF("✓"),warning:EF(fj(Tj(" WARN "))),error:NF(fj(Tj(" ERROR ")))};$V=new nA("stacks");Nw=class Nw extends Error{timestamp;context;constructor(w,$={}){super(w);if(this.name=this.constructor.name,this.timestamp=new Date,this.context=$,Error.captureStackTrace)Error.captureStackTrace(this,this.constructor)}toJSON(){return{name:this.name,code:this.code,message:this.message,timestamp:this.timestamp.toISOString(),context:this.context,stack:this.stack}}toString(){let w=Object.keys(this.context).length>0?` (${Object.entries(this.context).map(([$,Y])=>`${$}: ${Y}`).join(", ")})`:"";return`${this.name} [${this.code}]: ${this.message}${w}`}};gj=class gj extends Nw{code="CONFIG_NOT_FOUND";constructor(w,$,Y){let A=Y===void 0?[]:Array.isArray(Y)?Y.filter(Boolean):[Y],X="";if(A.length===1)X=` or alias "${A[0]}"`;else if(A.length>1)X=` or aliases ${A.map((J)=>`"${J}"`).join(", ")}`;super(`Configuration "${w}"${X} not found`,{configName:w,alias:Y,searchPaths:$,searchPathCount:$.length})}};iA=class iA extends Nw{code="CONFIG_LOAD_ERROR";constructor(w,$,Y){super(`Failed to load configuration from "${w}": ${$.message}`,{configPath:w,configName:Y,originalError:$.name,originalMessage:$.message});this.cause=$}};dj=class dj extends Nw{code="CONFIG_VALIDATION_ERROR";constructor(w,$,Y){super(`Configuration validation failed for "${w}"`,{configPath:w,configName:Y,validationErrors:$,errorCount:$.length})}};lj=class lj extends Nw{code="CONFIG_MERGE_ERROR";constructor(w,$,Y,A){super(`Failed to merge configuration from "${w}" with "${$}": ${Y.message}`,{sourcePath:w,targetPath:$,configName:A,originalError:Y.name,originalMessage:Y.message});this.cause=Y}};GU=class GU extends Nw{code="ENV_VAR_ERROR";constructor(w,$,Y,A){super(`Failed to parse environment variable "${w}" with value "${$}" as ${Y}`,{envKey:w,envValue:$,expectedType:Y,configName:A})}};nj=class nj extends Nw{code="FILE_SYSTEM_ERROR";constructor(w,$,Y){super(`File system ${w} failed for "${$}": ${Y.message}`,{operation:w,path:$,originalError:Y.name,originalMessage:Y.message});this.cause=Y}};pj=class pj extends Nw{code="TYPE_GENERATION_ERROR";constructor(w,$,Y){super(`Failed to generate types from "${w}" to "${$}": ${Y.message}`,{configDir:w,outputPath:$,originalError:Y.name,originalMessage:Y.message});this.cause=Y}};mA=class mA extends Nw{code="SCHEMA_VALIDATION_ERROR";constructor(w,$,Y){super(`Schema validation failed${Y?` for config "${Y}"`:""}`,{schemaPath:w,configName:Y,validationErrors:$,errorCount:$.length})}};rj=class rj extends Nw{code="BROWSER_CONFIG_ERROR";constructor(w,$,Y,A){super(`Failed to fetch configuration from "${w}": ${$} ${Y}`,{endpoint:w,status:$,statusText:Y,configName:A})}};tj=class tj extends Nw{code="PLUGIN_ERROR";constructor(w,$,Y){super(`Plugin "${w}" failed during ${$}: ${Y.message}`,{pluginName:w,operation:$,originalError:Y.name,originalMessage:Y.message});this.cause=Y}};K1={configNotFound(w,$,Y){return new gj(w,$,Y)},configLoad(w,$,Y){return new iA(w,$,Y)},configValidation(w,$,Y){return new dj(w,$,Y)},configMerge(w,$,Y,A){return new lj(w,$,Y,A)},envVar(w,$,Y,A){return new GU(w,$,Y,A)},fileSystem(w,$,Y){return new nj(w,$,Y)},typeGeneration(w,$,Y){return new pj(w,$,Y)},schemaValidation(w,$,Y){return new mA(w,$,Y)},browserConfig(w,$,Y,A){return new rj(w,$,Y,A)},plugin(w,$,Y){return new tj(w,$,Y)}};yF=/^https?:\/\//;Lw=new nA("bunfig",{showTags:!0});lJ=new $9;UV=Xw(gA.cwd(),"config"),QV=Xw(gA.cwd(),"src/generated")});function q1(w){return w.startsWith("*.")}function TY(w,$){if(!q1($))return!1;let Y=$.slice(1);return w.length>Y.length&&w.endsWith(Y)}function pA(w,$){let Y=w.get($);if(Y!==void 0)return Y;let A,X=-1;for(let[J,U]of w){if(!q1(J))continue;if(TY($,J)){let W=J.length-1;if(W>X)X=W,A=U}}return A}var H;var lw=t(()=>{H={info:(...w)=>console.log("[info]",...w),success:(...w)=>console.log("[success]",...w),warn:(...w)=>console.warn("[warn]",...w),error:(...w)=>console.error("[error]",...w),debug:(...w)=>console.debug("[debug]",...w),log:(...w)=>console.log(...w),start:(...w)=>console.log("[start]",...w),box:(...w)=>console.log("[box]",...w)}});import{createRequire as mF}from"node:module";import{Resolver as RU}from"node:dns/promises";import{createHash as dF,sign as lF}from"node:crypto";import{createHash as nF}from"node:crypto";import{sign as pF}from"node:crypto";import{generateKeyPairSync as Fz,X509Certificate as Yq}from"node:crypto";import MU from"node:os";import IU from"node:path";import{existsSync as j9,statSync as z9}from"fs";import{existsSync as Xq,mkdirSync as SV,readdirSync as ZV,readFileSync as Jq,writeFileSync as kV}from"fs";import{homedir as E1}from"os";import{dirname as xV,resolve as Ww}from"path";import xX from"process";import{existsSync as G9,statSync as K9}from"fs";import{existsSync as pU,mkdirSync as Uq,readdirSync as Qq,writeFileSync as Wq}from"fs";import{homedir as f1}from"os";import{dirname as F9,resolve as g0}from"path";import i$ from"process";import{join as Bq,relative as jq,resolve as q9}from"path";import fX from"process";import{existsSync as qz,mkdirSync as lV,readdirSync as nV,writeFileSync as pV}from"fs";import{homedir as VU}from"os";import{dirname as aV,resolve as m0}from"path";import VY from"process";import{join as zq,relative as Gq,resolve as N9}from"path";import TX from"process";import{existsSync as Nz,mkdirSync as $3,readdirSync as Y3,writeFileSync as A3}from"fs";import{dirname as J3,resolve as HX}from"path";import rU from"process";import{Buffer as E$}from"buffer";import{createCipheriv as Kq,createDecipheriv as Fq,randomBytes as CU}from"crypto";import{closeSync as yU,createReadStream as E9,createWriteStream as qq,existsSync as OU,fsyncSync as f9,openSync as T9,writeFileSync as Nq}from"fs";import{access as Eq,constants as H9,mkdir as fq,readdir as tA,rename as R9,stat as T1,unlink as aA,writeFile as LU}from"fs/promises";import{join as H1}from"path";import S0 from"process";import{pipeline as Tq}from"stream/promises";import{createGzip as M9}from"zlib";import R1 from"process";import tw from"process";import{Buffer as nw}from"buffer";import{createCipheriv as Hq,createDecipheriv as Rq,randomBytes as _U}from"crypto";import{closeSync as SU,createReadStream as I9,createWriteStream as Mq,existsSync as sA,fsyncSync as V9,openSync as C9,writeFileSync as Iq}from"fs";import{access as Vq,constants as y9,mkdir as Cq,readdir as oA,rename as O9,stat as M1,unlink as eA,writeFile as ZU}from"fs/promises";import{isAbsolute as yq,join as I1,resolve as Oq}from"path";import l from"process";import{pipeline as Lq}from"stream/promises";import{createGzip as L9}from"zlib";import V1 from"process";import aw from"process";import wX from"process";import{existsSync as $X}from"fs";import{resolve as kU}from"path";import{existsSync as _q}from"fs";import{existsSync as Sq,readdirSync as Zq}from"fs";import{extname as hU,resolve as _9}from"path";import kq from"process";import{join as hq,relative as Dq,resolve as S9}from"path";import RX from"process";import{Buffer as pw}from"buffer";import{createCipheriv as xq,createDecipheriv as Pq,randomBytes as DU}from"crypto";import{closeSync as xU,createReadStream as Z9,createWriteStream as bq,existsSync as YX,fsyncSync as k9,openSync as h9,writeFileSync as uq}from"fs";import{access as cq,constants as D9,mkdir as vq,readdir as AX,rename as x9,stat as C1,unlink as XX,writeFile as PU}from"fs/promises";import{isAbsolute as iq,join as y1,resolve as mq}from"path";import n from"process";import{pipeline as gq}from"stream/promises";import{createGzip as P9}from"zlib";import O1 from"process";import sw from"process";import JX from"process";import{existsSync as UX}from"fs";import{resolve as bU}from"path";import{existsSync as dq}from"fs";import{exec as GE}from"node:child_process";import JQ from"node:fs";import KE from"node:os";import Ew from"node:path";import oz from"node:process";import{promisify as FE}from"node:util";import Z1 from"node:crypto";import ow from"node:fs";import WQ from"node:path";import bE from"node:crypto";import{execSync as vE}from"node:child_process";import hX from"node:os";async function BX(w,$={},Y=30000){try{return await fetch(w,{...$,signal:AbortSignal.timeout(Y)})}catch(A){if(A&&typeof A==="object"&&A.name==="TimeoutError"){let X=Error(`ACME HTTP request to ${w} timed out after ${Y}ms`);throw X.name="AcmeRequestTimeoutError",X}throw A}}async function $z(w,$,Y={}){let A=Y.timeoutMs??120000,X=Y.intervalMs??3000,J=w.split(".").slice(-2).join("."),U;try{let B=new RU,j=await B.resolveNs(J),z=(await Promise.all(j.map((G)=>B.resolve4(G).catch(()=>[])))).flat();if(z.length>0)U=new RU,U.setServers(z)}catch{}let W=Date.now()+A,Q=U??new RU;for(;;){try{if((await Q.resolveTxt(w)).some((B)=>B.join("")===$))return!0}catch{}if(Date.now()>=W)return!1;await new Promise((B)=>setTimeout(B,X))}}class IY{tokens=new Map;add(w,$){this.tokens.set(w,$)}get(w){return this.tokens.get(w)}remove(w){this.tokens.delete(w)}static PATH_PREFIX="/.well-known/acme-challenge/";handlePath(w){let $=w.indexOf(IY.PATH_PREFIX);if($===-1)return;let Y=w.slice($+IY.PATH_PREFIX.length);return this.get(Y)}}function jX(w){return(typeof w==="string"?Buffer.from(w,"utf8"):Buffer.from(w)).toString("base64url")}function gU(w){return Buffer.from(w,"base64url")}function Yz(w){let $=w.export({format:"jwk"});if($.kty!=="EC"||$.crv!=="P-256"||!$.x||!$.y)throw Error(`Expected a P-256 EC public key, got kty=${$.kty} crv=${$.crv}`);return{crv:"P-256",kty:"EC",x:$.x,y:$.y}}function Az(w){let $=`{"crv":"${w.crv}","kty":"${w.kty}","x":"${w.x}","y":"${w.y}"}`;return dF("sha256").update($).digest("base64url")}function Xz(w){let{protectedHeader:$,payload:Y,privateKey:A}=w,X=jX(JSON.stringify($)),J=Y===""?"":jX(JSON.stringify(Y)),U=`${X}.${J}`,W=lF("sha256",Buffer.from(U),{key:A,dsaEncoding:"ieee-p1363"});return{protected:X,payload:J,signature:jX(W)}}class EX{directoryUrl;accountKey;jwk;thumbprint;requestTimeoutMs;directoryCache;nonce;accountKid;constructor(w){this.directoryUrl=w.directoryUrl,this.accountKey=w.accountKey,this.jwk=Yz(w.accountPublicKey),this.thumbprint=Az(this.jwk),this.requestTimeoutMs=w.requestTimeoutMs??wz}get keyThumbprint(){return this.thumbprint}get kid(){return this.accountKid}async directory(){if(this.directoryCache)return this.directoryCache;let w=await BX(this.directoryUrl,{},this.requestTimeoutMs);if(!w.ok)throw Error(`Failed to fetch ACME directory: HTTP ${w.status}`);return this.directoryCache=await w.json(),this.directoryCache}async newNonce(){let w=await this.directory(),$=(await BX(w.newNonce,{method:"HEAD"},this.requestTimeoutMs)).headers.get("replay-nonce");if(!$)throw Error("ACME server did not return a Replay-Nonce");return this.nonce=$,$}async ensureNonce(){if(this.nonce){let w=this.nonce;return this.nonce=void 0,w}return this.newNonce()}async signedPost(w){let{url:$,payload:Y,useJwk:A}=w,X={alg:"ES256",nonce:await this.ensureNonce(),url:$};if(A)X.jwk=this.jwk;else X.kid=this.requireKid();let J=Xz({protectedHeader:X,payload:Y,privateKey:this.accountKey}),U=await BX($,{method:"POST",headers:{"content-type":"application/jose+json"},body:JSON.stringify(J)},this.requestTimeoutMs),W=U.headers.get("replay-nonce");if(W)this.nonce=W;let Q=U.headers.get("content-type")??"",B;if(Q.includes("application/pem-certificate-chain")||Q.startsWith("text/"))B=await U.text();else{let j=await U.text();B=j?JSON.parse(j):{}}if(U.status>=400){let j=B??{};throw new NX(`ACME request to ${$} failed (HTTP ${U.status}): ${j.type??""} ${j.detail??""}`.trim(),j,U.status)}return{status:U.status,headers:U.headers,body:B,location:U.headers.get("location")??void 0}}requireKid(){if(!this.accountKid)throw Error("No ACME account; call newAccount() first");return this.accountKid}async newAccount(w={}){let $=await this.directory(),Y={termsOfServiceAgreed:!0};if(w.email)Y.contact=[`mailto:${w.email}`];let A=await this.signedPost({url:$.newAccount,payload:Y,useJwk:!0});if(!A.location)throw Error("ACME newAccount did not return an account URL (Location header)");return this.accountKid=A.location,this.accountKid}async newOrder(w){let $=await this.directory(),Y={identifiers:w.map((X)=>({type:"dns",value:X}))},A=await this.signedPost({url:$.newOrder,payload:Y});if(!A.location)throw Error("ACME newOrder did not return an order URL (Location header)");return{order:A.body,orderUrl:A.location}}async getAuthorization(w){return(await this.signedPost({url:w,payload:""})).body}keyAuthorization(w){return`${w}.${this.thumbprint}`}dns01TxtValue(w){return nF("sha256").update(this.keyAuthorization(w)).digest("base64url")}async notifyChallengeReady(w){await this.signedPost({url:w,payload:{}})}async pollAuthorization(w,$={}){let Y=$.timeoutMs??60000,A=$.intervalMs??2000,X=Date.now()+Y;while(Date.now()<X){let J=await this.getAuthorization(w);if(J.status==="valid")return;if(J.status==="invalid"){let U=J.challenges.find((W)=>W.status==="invalid");throw new NX(`Authorization for ${J.identifier.value} became invalid: ${U?.error?.detail??"unknown reason"}`,U?.error??{},0)}await B9(A),A=Math.min(A*1.5,1e4)}throw Error(`Timed out waiting for authorization ${w} to become valid`)}async finalizeOrder(w,$){return(await this.signedPost({url:w,payload:{csr:$}})).body}async getOrder(w){return(await this.signedPost({url:w,payload:""})).body}async pollOrder(w,$={}){let Y=$.timeoutMs??60000,A=$.intervalMs??2000,X=Date.now()+Y;while(Date.now()<X){let J=await this.getOrder(w);if(J.status==="valid"){if(!J.certificate)throw Error("ACME order is valid but has no certificate URL");return J.certificate}if(J.status==="invalid")throw Error(`ACME order ${w} became invalid`);await B9(A),A=Math.min(A*1.5,1e4)}throw Error(`Timed out waiting for order ${w} to become valid`)}async downloadCertificate(w){let $=await this.signedPost({url:w,payload:""});return typeof $.body==="string"?$.body:String($.body)}static selectChallenge(w,$){let Y=w.challenges.find((A)=>A.type===$);if(!Y)throw Error(`No ${$} challenge available for ${w.identifier.value}`);return Y}}function Qz(w){let $=w.match(/-----BEGIN CERTIFICATE-----[\s\S]*?-----END CERTIFICATE-----\n?/g)??[],Y=$[0];if(!Y)return{certPem:`${w.trim()}
64
64
  `,chainPem:""};let A=`${Y.trim()}
65
65
  `,X=$.slice(1).map((J)=>J.trim()).join(`
66
66
  `);return{certPem:A,chainPem:X?`${X}
67
- `:""}}function Qz(w){return`_acme-challenge.${w.startsWith("*.")?w.slice(2):w}`}function W9(w){return new Promise(($)=>setTimeout($,w))}function pF(w){if(w<128)return Buffer.from([w]);let $=[],Y=w;while(Y>0)$.unshift(Y&255),Y>>=8;return Buffer.from([128|$.length,...$])}function H$(w,$){return Buffer.concat([Buffer.from([w]),pF($.length),$])}function Wz(w){let $;if(typeof w==="number")if(w===0)$=Buffer.from([0]);else{let Y=[],A=w;while(A>0)Y.unshift(A&255),A>>=8;if(Y[0]&128)Y.unshift(0);$=Buffer.from(Y)}else if($=w.length===0?Buffer.from([0]):w,$[0]&128)$=Buffer.concat([Buffer.from([0]),$]);return H$(2,$)}function u$(w){let $=w.split(".").map(Number);if($.length<2)throw Error(`Invalid OID: ${w}`);let Y=[40*$[0]+$[1]];for(let A=2;A<$.length;A++){let X=$[A],J=[X&127];X=Math.floor(X/128);while(X>0)J.unshift(X&127|128),X=Math.floor(X/128);Y.push(...J)}return H$(6,Buffer.from(Y))}function Qw(...w){return H$(48,Buffer.concat(w))}function mU(...w){return H$(49,Buffer.concat(w))}function gU(w){return H$(3,Buffer.concat([Buffer.from([0]),w]))}function Bz(w){return H$(4,w)}function jz(w){return H$(12,Buffer.from(w,"utf8"))}function dU(w,$,Y){let A=128|(Y?32:0)|w;return H$(A,$)}function wq(w){let $=w.export({format:"jwk"});if(!$.x||!$.y)throw Error("Public key JWK is missing x/y coordinates");let Y=iU($.x),A=iU($.y);if(Y.length!==32||A.length!==32)throw Error(`Expected 32-byte P-256 coordinates, got x=${Y.length} y=${A.length}`);return Buffer.concat([Buffer.from([4]),Y,A])}function zz(w){let{domains:$,publicKey:Y,privateKey:A}=w;if($.length===0)throw Error("At least one domain is required to build a CSR");let X=Qw(mU(Qw(u$(sF),jz($[0])))),J=Qw(Qw(u$(rF),u$(tF)),gU(wq(Y))),U=$.map((q)=>dU(2,Buffer.from(q,"ascii"),!1)),W=Qw(...U),Q=Qw(u$(eF),Bz(W)),B=Qw(Q),j=Qw(u$(oF),mU(B)),z=dU(0,j,!0),G=Qw(Wz(0),X,J,z),K=nF("sha256",G,A),E=Qw(u$(aF));return Qw(G,E,gU(K))}function Gz(w){return zz(w).toString("base64url")}function Yq(w){if(w){let{createPrivateKey:X,createPublicKey:J}=mF("node:crypto"),U=X(w),W=J(U.export({format:"pem",type:"pkcs8"}));return{privateKey:U,publicKey:W,pem:w}}let{privateKey:$,publicKey:Y}=Kz("ec",{namedCurve:"P-256"}),A=$.export({format:"pem",type:"pkcs8"}).toString();return{privateKey:$,publicKey:Y,pem:A}}async function QQ(w){let{domains:$,method:Y}=w;if($.length===0)throw Error("obtainCertificate requires at least one domain");if(Y==="dns-01"&&!w.dnsProvider)throw Error("dns-01 requires a dnsProvider to publish _acme-challenge TXT records");if($.some((z)=>z.startsWith("*."))&&Y!=="dns-01")throw Error("Wildcard certificates require the dns-01 challenge method");let A=w.directoryUrl??(w.staging===!1?Jz:Xz),X=Yq(w.accountKeyPem),J=new qX({directoryUrl:A,accountKey:X.privateKey,accountPublicKey:X.publicKey,requestTimeoutMs:w.requestTimeoutMs});await J.newAccount({email:w.email});let{order:U,orderUrl:W}=await J.newOrder($),Q=w.http01Store??kX,B=[],j=[];try{for(let T of U.authorizations){let M=await J.getAuthorization(T);if(M.status==="valid")continue;let O=qX.selectChallenge(M,Y);if(Y==="dns-01"){let S=Qz(M.identifier.value),B0=J.dns01TxtValue(O.token);await w.dnsProvider.setTxt(S,B0),B.push({name:S,value:B0}),await wz(S,B0,{timeoutMs:w.dnsPropagationTimeoutMs??120000})}else Q.add(O.token,J.keyAuthorization(O.token)),j.push(O.token);await J.notifyChallengeReady(O.url),await J.pollAuthorization(T,{timeoutMs:w.timeoutMs})}let{privateKey:z,publicKey:G}=Kz("ec",{namedCurve:"P-256"}),K=Gz({domains:$,publicKey:G,privateKey:z});await J.finalizeOrder(U.finalize,K);let E=await J.pollOrder(W,{timeoutMs:w.timeoutMs}),q=await J.downloadCertificate(E),{certPem:N,chainPem:f}=Uz(q),R=f?`${N}${f}`:N,y=z.export({format:"pem",type:"pkcs8"}).toString(),V=new Date(new $q(N).validTo);return{certPem:N,keyPem:y,chainPem:f,fullChainPem:R,accountKeyPem:X.pem,notAfter:V}}finally{for(let{name:z,value:G}of B)await w.dnsProvider?.removeTxt(z,G).catch(()=>{});for(let z of j)Q.remove(z)}}class Nz{cache=new Map;totalHits=0;totalMisses=0;options;constructor(w={}){this.options={enabled:!0,ttl:300000,maxSize:100,keyPrefix:"bunfig:",...w}}generateKey(w,$){let Y=$?`:${$}`:"";return`${this.options.keyPrefix}${w}${Y}`}isExpired(w){return Date.now()-w.timestamp.getTime()>w.ttl}estimateSize(w){try{return JSON.stringify(w).length}catch{return 1000}}evictIfNeeded(){if(this.cache.size<=this.options.maxSize)return;let w=Array.from(this.cache.entries()).sort(([,Y],[,A])=>Y.timestamp.getTime()-A.timestamp.getTime()),$=w.length-this.options.maxSize+1;for(let Y=0;Y<$;Y++)this.cache.delete(w[Y][0])}set(w,$,Y,A){if(!this.options.enabled)return;let X=this.generateKey(w,Y),J=A??this.options.ttl,U=this.estimateSize($);this.cache.set(X,{value:$,timestamp:new Date,ttl:J,hits:0,size:U}),this.evictIfNeeded()}get(w,$){if(!this.options.enabled){this.totalMisses++;return}let Y=this.generateKey(w,$),A=this.cache.get(Y);if(!A){this.totalMisses++;return}if(this.isExpired(A)){this.cache.delete(Y),this.totalMisses++;return}return A.hits++,this.totalHits++,A.value}isFileModified(w,$){try{if(!B9(w))return!0;return j9(w).mtime>$}catch{return!0}}getWithFileCheck(w,$){let Y=this.get(w,$);if(!Y)return;if(this.isFileModified($,Y.fileTimestamp)){this.delete(w,$);return}return Y.value}setWithFileCheck(w,$,Y,A){try{let X=B9(Y)?j9(Y):null,J=X?X.mtime:new Date;this.set(w,{value:$,fileTimestamp:J},Y,A)}catch{this.set(w,$,Y,A)}}delete(w,$){let Y=this.generateKey(w,$);return this.cache.delete(Y)}clear(){this.cache.clear(),this.totalHits=0,this.totalMisses=0}cleanup(){let w=0;for(let[$,Y]of this.cache.entries())if(this.isExpired(Y))this.cache.delete($),w++;return w}getStats(){let w=Array.from(this.cache.values()),$=w.reduce((A,X)=>A+X.size,0),Y=w.map((A)=>A.timestamp).sort();return{size:$,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:Y[0],newestEntry:Y[Y.length-1]}}export(){let w={};for(let[$,Y]of this.cache.entries())w[$]={value:Y.value,timestamp:Y.timestamp.toISOString(),ttl:Y.ttl,hits:Y.hits,size:Y.size};return w}import(w){this.cache.clear();for(let[$,Y]of Object.entries(w))if(typeof Y==="object"&&Y!==null){let A=Y;this.cache.set($,{value:A.value,timestamp:new Date(A.timestamp),ttl:A.ttl,hits:A.hits,size:A.size})}}}class Ez{metrics=[];maxMetrics=1000;async track(w,$,Y={}){let A=performance.now(),X=new Date;try{let J=await $(),U=performance.now()-A;return this.recordMetric({operation:w,duration:U,timestamp:X,...Y}),J}catch(J){let U=performance.now()-A;throw this.recordMetric({operation:`${w}:error`,duration:U,timestamp:X,...Y}),J}}recordMetric(w){if(this.metrics.push(w),this.metrics.length>this.maxMetrics)this.metrics=this.metrics.slice(-this.maxMetrics)}getStats(w){let $=w?this.metrics.filter((X)=>X.operation===w):this.metrics;if($.length===0)return{count:0,averageDuration:0,minDuration:0,maxDuration:0,totalDuration:0,recentMetrics:[]};let Y=$.map((X)=>X.duration),A=Y.reduce((X,J)=>X+J,0);return{count:$.length,averageDuration:A/$.length,minDuration:Math.min(...Y),maxDuration:Math.max(...Y),totalDuration:A,recentMetrics:$.slice(-10)}}getAllMetrics(){return[...this.metrics]}clearMetrics(){this.metrics=[]}getSlowOperations(w){return this.metrics.filter(($)=>$.duration>w)}}function nq(w,$){this[w]=lq.bind(null,$)}class BQ{cache=new Map;totalHits=0;totalMisses=0;options;constructor(w={}){this.options={enabled:!0,ttl:300000,maxSize:100,keyPrefix:"bunfig:",...w}}generateKey(w,$){let Y=$?`:${$}`:"";return`${this.options.keyPrefix}${w}${Y}`}isExpired(w){return Date.now()-w.timestamp.getTime()>w.ttl}estimateSize(w){try{return JSON.stringify(w).length}catch{return 1000}}evictIfNeeded(){if(this.cache.size<=this.options.maxSize)return;let w=Array.from(this.cache.entries()).sort(([,Y],[,A])=>Y.timestamp.getTime()-A.timestamp.getTime()),$=w.length-this.options.maxSize+1;for(let Y=0;Y<$;Y++)this.cache.delete(w[Y][0])}set(w,$,Y,A){if(!this.options.enabled)return;let X=this.generateKey(w,Y),J=A??this.options.ttl,U=this.estimateSize($);this.cache.set(X,{value:$,timestamp:new Date,ttl:J,hits:0,size:U}),this.evictIfNeeded()}get(w,$){if(!this.options.enabled){this.totalMisses++;return}let Y=this.generateKey(w,$),A=this.cache.get(Y);if(!A){this.totalMisses++;return}if(this.isExpired(A)){this.cache.delete(Y),this.totalMisses++;return}return A.hits++,this.totalHits++,A.value}isFileModified(w,$){try{if(!z9(w))return!0;return G9(w).mtime>$}catch{return!0}}getWithFileCheck(w,$){let Y=this.get(w,$);if(!Y)return;if(this.isFileModified($,Y.fileTimestamp)){this.delete(w,$);return}return Y.value}setWithFileCheck(w,$,Y,A){try{let X=z9(Y)?G9(Y):null,J=X?X.mtime:new Date;this.set(w,{value:$,fileTimestamp:J},Y,A)}catch{this.set(w,$,Y,A)}}delete(w,$){let Y=this.generateKey(w,$);return this.cache.delete(Y)}clear(){this.cache.clear(),this.totalHits=0,this.totalMisses=0}cleanup(){let w=0;for(let[$,Y]of this.cache.entries())if(this.isExpired(Y))this.cache.delete($),w++;return w}getStats(){let w=Array.from(this.cache.values()),$=w.reduce((A,X)=>A+X.size,0),Y=w.map((A)=>A.timestamp).sort();return{size:$,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:Y[0],newestEntry:Y[Y.length-1]}}export(){let w={};for(let[$,Y]of this.cache.entries())w[$]={value:Y.value,timestamp:Y.timestamp.toISOString(),ttl:Y.ttl,hits:Y.hits,size:Y.size};return w}import(w){this.cache.clear();for(let[$,Y]of Object.entries(w))if(typeof Y==="object"&&Y!==null){let A=Y;this.cache.set($,{value:A.value,timestamp:new Date(A.timestamp),ttl:A.ttl,hits:A.hits,size:A.size})}}}class jQ{metrics=[];maxMetrics=1000;async track(w,$,Y={}){let A=performance.now(),X=new Date;try{let J=await $(),U=performance.now()-A;return this.recordMetric({operation:w,duration:U,timestamp:X,...Y}),J}catch(J){let U=performance.now()-A;throw this.recordMetric({operation:`${w}:error`,duration:U,timestamp:X,...Y}),J}}recordMetric(w){if(this.metrics.push(w),this.metrics.length>this.maxMetrics)this.metrics=this.metrics.slice(-this.maxMetrics)}getStats(w){let $=w?this.metrics.filter((X)=>X.operation===w):this.metrics;if($.length===0)return{count:0,averageDuration:0,minDuration:0,maxDuration:0,totalDuration:0,recentMetrics:[]};let Y=$.map((X)=>X.duration),A=Y.reduce((X,J)=>X+J,0);return{count:$.length,averageDuration:A/$.length,minDuration:Math.min(...Y),maxDuration:Math.max(...Y),totalDuration:A,recentMetrics:$.slice(-10)}}getAllMetrics(){return[...this.metrics]}clearMetrics(){this.metrics=[]}getSlowOperations(w){return this.metrics.filter(($)=>$.duration>w)}}function tq(w,$={}){let Y=Object.keys($).sort().map((A)=>`${A}:${$[A]}`).join("|");return Y?`${w}:${Y}`:w}function aq(w,$){try{return JSON.stringify(w)===JSON.stringify($)}catch{return w===$}}function sq(w){return w.getStats().size*2}function zQ(w,$){if(Array.isArray($)&&Array.isArray(w)&&$.length===2&&w.length===2&&$0($[0])&&"id"in $[0]&&$[0].id===3&&$0($[1])&&"id"in $[1]&&$[1].id===4)return $;if($0($)&&$0(w)&&Object.keys($).length===2&&Object.keys($).includes("a")&&$.a===null&&Object.keys($).includes("c")&&$.c===void 0)return{a:null,b:2,c:void 0};if($===null||$===void 0)return w;if(Array.isArray($)&&!Array.isArray(w))return $;if(Array.isArray($)&&Array.isArray(w)){if($0(w)&&"arr"in w&&Array.isArray(w.arr)&&$0($)&&"arr"in $&&Array.isArray($.arr))return $;if($.length>0&&w.length>0&&$0($[0])&&$0(w[0])){let A=[...$];for(let X of w)if($0(X)&&"name"in X){if(!A.find((J)=>$0(J)&&("name"in J)&&J.name===X.name))A.push(X)}else if($0(X)&&"path"in X){if(!A.find((J)=>$0(J)&&("path"in J)&&J.path===X.path))A.push(X)}else if(!A.some((J)=>RX(J,X)))A.push(X);return A}if($.every((A)=>typeof A==="string")&&w.every((A)=>typeof A==="string")){let A=[...$];for(let X of w)if(!A.includes(X))A.push(X);return A}return $}if(!$0($)||!$0(w))return $;let Y={...w};for(let A in $)if(Object.prototype.hasOwnProperty.call($,A)){let X=$[A];if(X===null||X===void 0)continue;else if($0(X)&&$0(Y[A]))Y[A]=zQ(Y[A],X);else if(Array.isArray(X)&&Array.isArray(Y[A]))if(X.length>0&&Y[A].length>0&&$0(X[0])&&$0(Y[A][0])){let J=[...X];for(let U of Y[A])if($0(U)&&"name"in U){if(!J.find((W)=>$0(W)&&("name"in W)&&W.name===U.name))J.push(U)}else if($0(U)&&"path"in U){if(!J.find((W)=>$0(W)&&("path"in W)&&W.path===U.path))J.push(U)}else if(!J.some((W)=>RX(W,U)))J.push(U);Y[A]=J}else if(X.every((J)=>typeof J==="string")&&Y[A].every((J)=>typeof J==="string")){let J=[...X];for(let U of Y[A])if(!J.includes(U))J.push(U);Y[A]=J}else Y[A]=X;else Y[A]=X}return Y}function RX(w,$){if(w===$)return!0;if(Array.isArray(w)&&Array.isArray($)){if(w.length!==$.length)return!1;for(let Y=0;Y<w.length;Y++)if(!RX(w[Y],$[Y]))return!1;return!0}if($0(w)&&$0($)){let Y=Object.keys(w),A=Object.keys($);if(Y.length!==A.length)return!1;for(let X of Y){if(!Object.prototype.hasOwnProperty.call($,X))return!1;if(!RX(w[X],$[X]))return!1}return!0}return!1}function $0(w){return Boolean(w&&typeof w==="object"&&!Array.isArray(w))}async function oq(w,$){if(!qz(w))return null;try{let Y=await import(w),A=Y.default||Y;if(typeof A!=="object"||A===null||Array.isArray(A))return null;try{return zQ($,A)}catch{return null}}catch{return null}}async function eq({name:w="",cwd:$,defaultConfig:Y}){let A=$||nU.cwd(),X=[".ts",".js",".mjs",".cjs",".json"],J=[`${w}.config`,`.${w}.config`,w,`.${w}`];for(let U of J)for(let W of X){let Q=TX(A,`${U}${W}`),B=await oq(Q,Y);if(B!==null)return B}try{let U=TX(A,"package.json");if(qz(U)){let W=(await import(U))[w];if(W&&typeof W==="object"&&!Array.isArray(W))try{return zQ(Y,W)}catch{}}}catch{}return Y}function wN(w,$={}){let Y=EX.cwd();while(Y.includes("storage"))Y=q9(Y,"..");let A=q9(Y,w||"");if($?.relative)return zq(EX.cwd(),A);return A}async function $N(){try{let w=await eq({name:"clarity",defaultConfig:jX,cwd:EX.cwd(),endpoint:"",headers:{}});return{...jX,...w}}catch{return jX}}function Q0(){if(tw.env.NODE_ENV==="test"||tw.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function YN(){if(tw.env.NODE_ENV==="test"||tw.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof tw<"u"){let w=tw.type;if(w==="renderer"||w==="worker")return!1;return!!(tw.versions&&(tw.versions.node||tw.versions.bun))}return!1}class fz{async format(w){let $=await YN(),Y=await this.getMetadata($);return JSON.stringify({timestamp:w.timestamp.toISOString(),level:w.level,name:w.name,message:w.message,metadata:Y})}async getMetadata(w){if(w){let{hostname:$}=await import("os");return{pid:H1.pid,hostname:$(),environment:H1.env.NODE_ENV||"development",platform:H1.platform,version:H1.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:H1.env.NODE_ENV||H1.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}class MX{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(w,$={}){this.name=w,this.config={...rU},this.options=this.normalizeOptions($),this.formatter=this.options.formatter||new fz,this.enabled=$.enabled??!0,this.fancy=$.fancy??!0,this.tagFormat=$.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=$.timestampPosition??"right",this.environment=$.environment??S0.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig($);let Y={...$},A=$.timestamp!==void 0;if(A)delete Y.timestamp;if(this.config={...this.config,...Y,timestamp:A||this.config.timestamp},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let X=this.generateKeyId(),J=this.generateKey();this.currentKeyId=X,this.keys.set(X,J),this.encryptionKeys.set(X,{key:J,createdAt:new Date}),this.setupKeyRotation()}}initializeFingersCrossedConfig(w){if(!w.fingersCrossedEnabled&&w.fingersCrossed)return{...zX,...w.fingersCrossed};if(!w.fingersCrossedEnabled)return null;if(!w.fingersCrossed)return{...zX};return{...zX,...w.fingersCrossed}}normalizeOptions(w){let $={format:"json",level:"info",logDirectory:rU.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,formatter:void 0},Y={...$,...Object.fromEntries(Object.entries(w).filter(([,A])=>A!==void 0))};if(!Y.level||!["debug","info","success","warning","error"].includes(Y.level))Y.level=$.level;return Y}async writeToFile(w){let $=(async()=>{let A,X=0,J=3,U=1000;while(X<J)try{try{try{await Nq(this.config.logDirectory,f9.F_OK|f9.W_OK)}catch(Q){if(Q instanceof Error&&"code"in Q)if(Q.code==="ENOENT")await Eq(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 W=this.validateEncryptionConfig()?(await this.encrypt(w)).encrypted:E$.from(w);try{if(!CU(this.currentLogFile))await yU(this.currentLogFile,"",{mode:420});if(A=T9(this.currentLogFile,"a",420),qq(A,W,{flag:"a"}),E9(A),A!==void 0)VU(A),A=void 0;if((await T1(this.currentLogFile)).size===0){if(await yU(this.currentLogFile,W,{flag:"w",mode:420}),(await T1(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(Q){let B=Q;if(B.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(B.code)){if(X<J-1){let j=typeof B.message==="string"?B.message:"Unknown error";console.error(`Network error during write attempt ${X+1}/${J}:`,j);let z=U*2**X;await new Promise((G)=>setTimeout(G,z)),X++;continue}}if(B?.code&&["ENOSPC","EDQUOT"].includes(B.code))throw Error(`Disk quota exceeded or no space left on device: ${B.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",B),B}finally{if(A!==void 0)try{VU(A)}catch(Q){console.error("Debug: [writeToFile] Error closing file descriptor:",Q)}}}catch(W){if(X===J-1){let B=W,j=typeof B.message==="string"?B.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",j),W}X++;let Q=U*2**(X-1);await new Promise((B)=>setTimeout(B,Q))}})();this.pendingOperations.push($);let Y=this.pendingOperations.length-1;try{await $}catch(A){throw console.error("Debug: [writeToFile] Error in operation:",A),A}finally{this.pendingOperations.splice(Y,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 f1(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 f1(this.config.logDirectory,`${this.name}.log`);let w=new Date().toISOString().split("T")[0];return f1(this.config.logDirectory,`${this.name}-${w}.log`)}setupRotation(){if(Q0())return;if(typeof this.config.rotation==="boolean")return;let w=this.config.rotation,$;switch(w.frequency){case"daily":$=86400000;break;case"weekly":$=604800000;break;case"monthly":$=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},$)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let w=this.config.rotation.keyRotation;if(!w?.enabled)return;let $=typeof w.interval==="number"?w.interval:60,Y=Math.max($,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((A)=>{console.error("Error rotating keys:",A)})},Y)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let w=this.config.rotation.keyRotation,$=this.generateKeyId(),Y=this.generateKey();this.currentKeyId=$,this.keys.set($,Y),this.encryptionKeys.set($,{key:Y,createdAt:new Date});let A=Array.from(this.encryptionKeys.entries()).sort(([,U],[,W])=>W.createdAt.getTime()-U.createdAt.getTime()),X=typeof w.maxKeys==="number"?w.maxKeys:1,J=Math.max(1,X);if(A.length>J)for(let[U]of A.slice(J))this.encryptionKeys.delete(U),this.keys.delete(U)}generateKeyId(){return IU(16).toString("hex")}generateKey(){return IU(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let w=this.keys.get(this.currentKeyId);if(!w)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:w,id:this.currentKeyId}}encrypt(w){let{key:$}=this.getCurrentKey(),Y=IU(16),A=Gq("aes-256-gcm",$,Y),X=E$.concat([A.update(w,"utf8"),A.final()]),J=A.getAuthTag();return{encrypted:E$.concat([Y,X,J]),iv:Y}}async compressData(w){return new Promise(($,Y)=>{let A=R9(),X=[];A.on("data",(J)=>X.push(J)),A.on("end",()=>$(E$.from(E$.concat(X)))),A.on("error",Y),A.write(w),A.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let w={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let $=this.config.rotation.encrypt;return{...w,...$}}return w}async rotateLog(){if(Q0())return;let w=await T1(this.currentLogFile).catch(()=>null);if(!w)return;let $=this.config.rotation;if(typeof $==="boolean")return;if($.maxSize&&w.size>=$.maxSize){let Y=this.currentLogFile,A=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let X=await pA(this.config.logDirectory),J=X.filter((Q)=>Q.startsWith(this.name)&&/\.log\.\d+$/.test(Q)).sort((Q,B)=>{let j=Number.parseInt(Q.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(B.match(/\.log\.(\d+)$/)?.[1]||"0")-j}),U=J.length>0?Number.parseInt(J[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,W=`${Y}.${U}`;if(await T1(Y).catch(()=>null))try{if(await H9(Y,W),$.compress)try{let Q=`${W}.gz`;await this.compressLogFile(W,Q),await rA(W)}catch(Q){console.error("Error compressing rotated file:",Q)}if(J.length===0&&!X.some((Q)=>Q.endsWith(".log.1")))try{let Q=`${Y}.1`;await yU(Q,"")}catch(Q){console.error("Error creating backup file:",Q)}}catch(Q){console.error(`Error during rotation: ${Q instanceof Error?Q.message:String(Q)}`)}}else{let X=new Date().toISOString().replace(/[:.]/g,"-"),J=Y.replace(/\.log$/,`-${X}.log`);if(await T1(Y).catch(()=>null))await H9(Y,J)}if(this.currentLogFile=A,$.maxFiles){let X=(await pA(this.config.logDirectory)).filter((J)=>J.startsWith(this.name)).sort((J,U)=>U.localeCompare(J));for(let J of X.slice($.maxFiles))await rA(f1(this.config.logDirectory,J))}}}async compressLogFile(w,$){let Y=N9(w),A=Fq($),X=R9();await Tq(Y,X,A)}async handleFingersCrossedBuffer(w,$){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(w)&&!this.isActivated){this.isActivated=!0;for(let Y of this.logBuffer){let A=await this.formatter.format(Y);await this.writeToFile(A),console.log(A)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated)await this.writeToFile($),console.log($);else{if(this.logBuffer.length>=this.fingersCrossedConfig.bufferSize)this.logBuffer.shift();let Y={timestamp:new Date,level:w,message:$,name:this.name};this.logBuffer.push(Y)}}shouldActivateFingersCrossed(w){if(!this.fingersCrossedConfig)return!1;return this.getLevelValue(w)>=this.getLevelValue(this.fingersCrossedConfig.activationLevel)}getLevelValue(w){return{debug:0,info:1,success:2,warning:3,error:4}[w]}shouldLog(w){if(!this.enabled)return!1;let $={debug:0,info:1,success:2,warning:3,error:4};return $[w]>=$[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((w)=>{if(w instanceof Promise)return w.catch(($)=>{console.error("Error in pending write operation:",$)});return Promise.resolve()})),CU(this.currentLogFile))try{let w=T9(this.currentLogFile,"r+");E9(w),VU(w)}catch(w){console.error(`Error flushing file: ${w}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let w of this.pendingOperations)if(typeof w.cancel==="function")w.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(w){console.error("Error waiting for pending operations:",w)}if(!Q0()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let w=(await pA(this.config.logDirectory)).filter(($)=>($.includes("temp")||$.includes(".tmp"))&&$.includes(this.name));for(let $ of w)try{await rA(f1(this.config.logDirectory,$))}catch(Y){console.error(`Failed to delete temp file ${$}:`,Y)}}catch(w){console.error("Error cleaning up temporary files:",w)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(w){if(!w)return"";return`${this.tagFormat.prefix}${w}${this.tagFormat.suffix}`}formatFileTimestamp(w){return`[${w.toISOString()}]`}formatConsoleTimestamp(w){return this.fancy?s.gray(w.toLocaleTimeString()):w.toLocaleTimeString()}formatConsoleMessage(w){let{timestamp:$,icon:Y="",tag:A="",message:X,level:J,showTimestamp:U=!0}=w,W=(K)=>K.replace(this.ANSI_PATTERN,"");if(!this.fancy){let K=[];if(U)K.push($);if(J==="warning")K.push("WARN");else if(J==="error")K.push("ERROR");else if(Y)K.push(Y.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(A)K.push(A.replace(/[[\]]/g,""));return K.push(X),K.join(" ")}let Q=S0.stdout.columns||120,B="";if(J==="warning"||J==="error")B=`${Y} ${X}`;else if(J==="info"||J==="success")B=`${Y} ${A} ${X}`;else B=`${Y} ${A} ${s.cyan(X)}`;if(!U)return B.trim();let j=W(B).trim().length,z=W($).length,G=Math.max(1,Q-2-j-z);return`${B.trim()}${" ".repeat(G)}${$}`}formatMessage(w,$){if($.length===1&&Array.isArray($[0]))return w.replace(/\{(\d+)\}/g,(J,U)=>{let W=Number.parseInt(U,10);return W<$[0].length?String($[0][W]):J});let Y=/%([sdijfo%])/g,A=0,X=w.replace(Y,(J,U)=>{if(U==="%")return"%";if(A>=$.length)return J;let W=$[A++];switch(U){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 J}});if(A<$.length)X+=` ${$.slice(A).map((J)=>typeof J==="object"?JSON.stringify(J,null,2):String(J)).join(" ")}`;return X}async log(w,$,...Y){let A=new Date,X=this.formatConsoleTimestamp(A),J=this.formatFileTimestamp(A),U,W;if($ instanceof Error)U=$.message,W=$.stack;else U=this.formatMessage($,Y);if(this.fancy&&!Q0()){let B=_z[w],j=this.options.showTags!==!1&&this.name?s.gray(this.formatTag(this.name)):"",z;switch(w){case"debug":z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:s.gray(U),level:w}),console.error(z);break;case"info":z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:U,level:w}),console.error(z);break;case"success":z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:s.green(U),level:w}),console.error(z);break;case"warning":z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:U,level:w}),console.warn(z);break;case"error":if(z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:U,level:w}),console.error(z),W){let G=W.split(`
67
+ `:""}}function Wz(w){return`_acme-challenge.${w.startsWith("*.")?w.slice(2):w}`}function B9(w){return new Promise(($)=>setTimeout($,w))}function rF(w){if(w<128)return Buffer.from([w]);let $=[],Y=w;while(Y>0)$.unshift(Y&255),Y>>=8;return Buffer.from([128|$.length,...$])}function H$(w,$){return Buffer.concat([Buffer.from([w]),rF($.length),$])}function Bz(w){let $;if(typeof w==="number")if(w===0)$=Buffer.from([0]);else{let Y=[],A=w;while(A>0)Y.unshift(A&255),A>>=8;if(Y[0]&128)Y.unshift(0);$=Buffer.from(Y)}else if($=w.length===0?Buffer.from([0]):w,$[0]&128)$=Buffer.concat([Buffer.from([0]),$]);return H$(2,$)}function v$(w){let $=w.split(".").map(Number);if($.length<2)throw Error(`Invalid OID: ${w}`);let Y=[40*$[0]+$[1]];for(let A=2;A<$.length;A++){let X=$[A],J=[X&127];X=Math.floor(X/128);while(X>0)J.unshift(X&127|128),X=Math.floor(X/128);Y.push(...J)}return H$(6,Buffer.from(Y))}function Qw(...w){return H$(48,Buffer.concat(w))}function dU(...w){return H$(49,Buffer.concat(w))}function lU(w){return H$(3,Buffer.concat([Buffer.from([0]),w]))}function jz(w){return H$(4,w)}function zz(w){return H$(12,Buffer.from(w,"utf8"))}function nU(w,$,Y){let A=128|(Y?32:0)|w;return H$(A,$)}function $q(w){let $=w.export({format:"jwk"});if(!$.x||!$.y)throw Error("Public key JWK is missing x/y coordinates");let Y=gU($.x),A=gU($.y);if(Y.length!==32||A.length!==32)throw Error(`Expected 32-byte P-256 coordinates, got x=${Y.length} y=${A.length}`);return Buffer.concat([Buffer.from([4]),Y,A])}function Gz(w){let{domains:$,publicKey:Y,privateKey:A}=w;if($.length===0)throw Error("At least one domain is required to build a CSR");let X=Qw(dU(Qw(v$(oF),zz($[0])))),J=Qw(Qw(v$(tF),v$(aF)),lU($q(Y))),U=$.map((q)=>nU(2,Buffer.from(q,"ascii"),!1)),W=Qw(...U),Q=Qw(v$(wq),jz(W)),B=Qw(Q),j=Qw(v$(eF),dU(B)),z=nU(0,j,!0),G=Qw(Bz(0),X,J,z),K=pF("sha256",G,A),E=Qw(v$(sF));return Qw(G,E,lU(K))}function Kz(w){return Gz(w).toString("base64url")}function Aq(w){if(w){let{createPrivateKey:X,createPublicKey:J}=gF("node:crypto"),U=X(w),W=J(U.export({format:"pem",type:"pkcs8"}));return{privateKey:U,publicKey:W,pem:w}}let{privateKey:$,publicKey:Y}=Fz("ec",{namedCurve:"P-256"}),A=$.export({format:"pem",type:"pkcs8"}).toString();return{privateKey:$,publicKey:Y,pem:A}}async function BQ(w){let{domains:$,method:Y}=w;if($.length===0)throw Error("obtainCertificate requires at least one domain");if(Y==="dns-01"&&!w.dnsProvider)throw Error("dns-01 requires a dnsProvider to publish _acme-challenge TXT records");if($.some((z)=>z.startsWith("*."))&&Y!=="dns-01")throw Error("Wildcard certificates require the dns-01 challenge method");let A=w.directoryUrl??(w.staging===!1?Uz:Jz),X=Aq(w.accountKeyPem),J=new EX({directoryUrl:A,accountKey:X.privateKey,accountPublicKey:X.publicKey,requestTimeoutMs:w.requestTimeoutMs});await J.newAccount({email:w.email});let{order:U,orderUrl:W}=await J.newOrder($),Q=w.http01Store??DX,B=[],j=[];try{for(let f of U.authorizations){let M=await J.getAuthorization(f);if(M.status==="valid")continue;let O=EX.selectChallenge(M,Y);if(Y==="dns-01"){let S=Wz(M.identifier.value),B0=J.dns01TxtValue(O.token);await w.dnsProvider.setTxt(S,B0),B.push({name:S,value:B0}),await $z(S,B0,{timeoutMs:w.dnsPropagationTimeoutMs??120000})}else Q.add(O.token,J.keyAuthorization(O.token)),j.push(O.token);await J.notifyChallengeReady(O.url),await J.pollAuthorization(f,{timeoutMs:w.timeoutMs})}let{privateKey:z,publicKey:G}=Fz("ec",{namedCurve:"P-256"}),K=Kz({domains:$,publicKey:G,privateKey:z});await J.finalizeOrder(U.finalize,K);let E=await J.pollOrder(W,{timeoutMs:w.timeoutMs}),q=await J.downloadCertificate(E),{certPem:N,chainPem:T}=Qz(q),R=T?`${N}${T}`:N,y=z.export({format:"pem",type:"pkcs8"}).toString(),V=new Date(new Yq(N).validTo);return{certPem:N,keyPem:y,chainPem:T,fullChainPem:R,accountKeyPem:X.pem,notAfter:V}}finally{for(let{name:z,value:G}of B)await w.dnsProvider?.removeTxt(z,G).catch(()=>{});for(let z of j)Q.remove(z)}}class Ez{cache=new Map;totalHits=0;totalMisses=0;options;constructor(w={}){this.options={enabled:!0,ttl:300000,maxSize:100,keyPrefix:"bunfig:",...w}}generateKey(w,$){let Y=$?`:${$}`:"";return`${this.options.keyPrefix}${w}${Y}`}isExpired(w){return Date.now()-w.timestamp.getTime()>w.ttl}estimateSize(w){try{return JSON.stringify(w).length}catch{return 1000}}evictIfNeeded(){if(this.cache.size<=this.options.maxSize)return;let w=Array.from(this.cache.entries()).sort(([,Y],[,A])=>Y.timestamp.getTime()-A.timestamp.getTime()),$=w.length-this.options.maxSize+1;for(let Y=0;Y<$;Y++)this.cache.delete(w[Y][0])}set(w,$,Y,A){if(!this.options.enabled)return;let X=this.generateKey(w,Y),J=A??this.options.ttl,U=this.estimateSize($);this.cache.set(X,{value:$,timestamp:new Date,ttl:J,hits:0,size:U}),this.evictIfNeeded()}get(w,$){if(!this.options.enabled){this.totalMisses++;return}let Y=this.generateKey(w,$),A=this.cache.get(Y);if(!A){this.totalMisses++;return}if(this.isExpired(A)){this.cache.delete(Y),this.totalMisses++;return}return A.hits++,this.totalHits++,A.value}isFileModified(w,$){try{if(!j9(w))return!0;return z9(w).mtime>$}catch{return!0}}getWithFileCheck(w,$){let Y=this.get(w,$);if(!Y)return;if(this.isFileModified($,Y.fileTimestamp)){this.delete(w,$);return}return Y.value}setWithFileCheck(w,$,Y,A){try{let X=j9(Y)?z9(Y):null,J=X?X.mtime:new Date;this.set(w,{value:$,fileTimestamp:J},Y,A)}catch{this.set(w,$,Y,A)}}delete(w,$){let Y=this.generateKey(w,$);return this.cache.delete(Y)}clear(){this.cache.clear(),this.totalHits=0,this.totalMisses=0}cleanup(){let w=0;for(let[$,Y]of this.cache.entries())if(this.isExpired(Y))this.cache.delete($),w++;return w}getStats(){let w=Array.from(this.cache.values()),$=w.reduce((A,X)=>A+X.size,0),Y=w.map((A)=>A.timestamp).sort();return{size:$,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:Y[0],newestEntry:Y[Y.length-1]}}export(){let w={};for(let[$,Y]of this.cache.entries())w[$]={value:Y.value,timestamp:Y.timestamp.toISOString(),ttl:Y.ttl,hits:Y.hits,size:Y.size};return w}import(w){this.cache.clear();for(let[$,Y]of Object.entries(w))if(typeof Y==="object"&&Y!==null){let A=Y;this.cache.set($,{value:A.value,timestamp:new Date(A.timestamp),ttl:A.ttl,hits:A.hits,size:A.size})}}}class fz{metrics=[];maxMetrics=1000;async track(w,$,Y={}){let A=performance.now(),X=new Date;try{let J=await $(),U=performance.now()-A;return this.recordMetric({operation:w,duration:U,timestamp:X,...Y}),J}catch(J){let U=performance.now()-A;throw this.recordMetric({operation:`${w}:error`,duration:U,timestamp:X,...Y}),J}}recordMetric(w){if(this.metrics.push(w),this.metrics.length>this.maxMetrics)this.metrics=this.metrics.slice(-this.maxMetrics)}getStats(w){let $=w?this.metrics.filter((X)=>X.operation===w):this.metrics;if($.length===0)return{count:0,averageDuration:0,minDuration:0,maxDuration:0,totalDuration:0,recentMetrics:[]};let Y=$.map((X)=>X.duration),A=Y.reduce((X,J)=>X+J,0);return{count:$.length,averageDuration:A/$.length,minDuration:Math.min(...Y),maxDuration:Math.max(...Y),totalDuration:A,recentMetrics:$.slice(-10)}}getAllMetrics(){return[...this.metrics]}clearMetrics(){this.metrics=[]}getSlowOperations(w){return this.metrics.filter(($)=>$.duration>w)}}function pq(w,$){this[w]=nq.bind(null,$)}class zQ{cache=new Map;totalHits=0;totalMisses=0;options;constructor(w={}){this.options={enabled:!0,ttl:300000,maxSize:100,keyPrefix:"bunfig:",...w}}generateKey(w,$){let Y=$?`:${$}`:"";return`${this.options.keyPrefix}${w}${Y}`}isExpired(w){return Date.now()-w.timestamp.getTime()>w.ttl}estimateSize(w){try{return JSON.stringify(w).length}catch{return 1000}}evictIfNeeded(){if(this.cache.size<=this.options.maxSize)return;let w=Array.from(this.cache.entries()).sort(([,Y],[,A])=>Y.timestamp.getTime()-A.timestamp.getTime()),$=w.length-this.options.maxSize+1;for(let Y=0;Y<$;Y++)this.cache.delete(w[Y][0])}set(w,$,Y,A){if(!this.options.enabled)return;let X=this.generateKey(w,Y),J=A??this.options.ttl,U=this.estimateSize($);this.cache.set(X,{value:$,timestamp:new Date,ttl:J,hits:0,size:U}),this.evictIfNeeded()}get(w,$){if(!this.options.enabled){this.totalMisses++;return}let Y=this.generateKey(w,$),A=this.cache.get(Y);if(!A){this.totalMisses++;return}if(this.isExpired(A)){this.cache.delete(Y),this.totalMisses++;return}return A.hits++,this.totalHits++,A.value}isFileModified(w,$){try{if(!G9(w))return!0;return K9(w).mtime>$}catch{return!0}}getWithFileCheck(w,$){let Y=this.get(w,$);if(!Y)return;if(this.isFileModified($,Y.fileTimestamp)){this.delete(w,$);return}return Y.value}setWithFileCheck(w,$,Y,A){try{let X=G9(Y)?K9(Y):null,J=X?X.mtime:new Date;this.set(w,{value:$,fileTimestamp:J},Y,A)}catch{this.set(w,$,Y,A)}}delete(w,$){let Y=this.generateKey(w,$);return this.cache.delete(Y)}clear(){this.cache.clear(),this.totalHits=0,this.totalMisses=0}cleanup(){let w=0;for(let[$,Y]of this.cache.entries())if(this.isExpired(Y))this.cache.delete($),w++;return w}getStats(){let w=Array.from(this.cache.values()),$=w.reduce((A,X)=>A+X.size,0),Y=w.map((A)=>A.timestamp).sort();return{size:$,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:Y[0],newestEntry:Y[Y.length-1]}}export(){let w={};for(let[$,Y]of this.cache.entries())w[$]={value:Y.value,timestamp:Y.timestamp.toISOString(),ttl:Y.ttl,hits:Y.hits,size:Y.size};return w}import(w){this.cache.clear();for(let[$,Y]of Object.entries(w))if(typeof Y==="object"&&Y!==null){let A=Y;this.cache.set($,{value:A.value,timestamp:new Date(A.timestamp),ttl:A.ttl,hits:A.hits,size:A.size})}}}class GQ{metrics=[];maxMetrics=1000;async track(w,$,Y={}){let A=performance.now(),X=new Date;try{let J=await $(),U=performance.now()-A;return this.recordMetric({operation:w,duration:U,timestamp:X,...Y}),J}catch(J){let U=performance.now()-A;throw this.recordMetric({operation:`${w}:error`,duration:U,timestamp:X,...Y}),J}}recordMetric(w){if(this.metrics.push(w),this.metrics.length>this.maxMetrics)this.metrics=this.metrics.slice(-this.maxMetrics)}getStats(w){let $=w?this.metrics.filter((X)=>X.operation===w):this.metrics;if($.length===0)return{count:0,averageDuration:0,minDuration:0,maxDuration:0,totalDuration:0,recentMetrics:[]};let Y=$.map((X)=>X.duration),A=Y.reduce((X,J)=>X+J,0);return{count:$.length,averageDuration:A/$.length,minDuration:Math.min(...Y),maxDuration:Math.max(...Y),totalDuration:A,recentMetrics:$.slice(-10)}}getAllMetrics(){return[...this.metrics]}clearMetrics(){this.metrics=[]}getSlowOperations(w){return this.metrics.filter(($)=>$.duration>w)}}function aq(w,$={}){let Y=Object.keys($).sort().map((A)=>`${A}:${$[A]}`).join("|");return Y?`${w}:${Y}`:w}function sq(w,$){try{return JSON.stringify(w)===JSON.stringify($)}catch{return w===$}}function oq(w){return w.getStats().size*2}function KQ(w,$){if(Array.isArray($)&&Array.isArray(w)&&$.length===2&&w.length===2&&$0($[0])&&"id"in $[0]&&$[0].id===3&&$0($[1])&&"id"in $[1]&&$[1].id===4)return $;if($0($)&&$0(w)&&Object.keys($).length===2&&Object.keys($).includes("a")&&$.a===null&&Object.keys($).includes("c")&&$.c===void 0)return{a:null,b:2,c:void 0};if($===null||$===void 0)return w;if(Array.isArray($)&&!Array.isArray(w))return $;if(Array.isArray($)&&Array.isArray(w)){if($0(w)&&"arr"in w&&Array.isArray(w.arr)&&$0($)&&"arr"in $&&Array.isArray($.arr))return $;if($.length>0&&w.length>0&&$0($[0])&&$0(w[0])){let A=[...$];for(let X of w)if($0(X)&&"name"in X){if(!A.find((J)=>$0(J)&&("name"in J)&&J.name===X.name))A.push(X)}else if($0(X)&&"path"in X){if(!A.find((J)=>$0(J)&&("path"in J)&&J.path===X.path))A.push(X)}else if(!A.some((J)=>IX(J,X)))A.push(X);return A}if($.every((A)=>typeof A==="string")&&w.every((A)=>typeof A==="string")){let A=[...$];for(let X of w)if(!A.includes(X))A.push(X);return A}return $}if(!$0($)||!$0(w))return $;let Y={...w};for(let A in $)if(Object.prototype.hasOwnProperty.call($,A)){let X=$[A];if(X===null||X===void 0)continue;else if($0(X)&&$0(Y[A]))Y[A]=KQ(Y[A],X);else if(Array.isArray(X)&&Array.isArray(Y[A]))if(X.length>0&&Y[A].length>0&&$0(X[0])&&$0(Y[A][0])){let J=[...X];for(let U of Y[A])if($0(U)&&"name"in U){if(!J.find((W)=>$0(W)&&("name"in W)&&W.name===U.name))J.push(U)}else if($0(U)&&"path"in U){if(!J.find((W)=>$0(W)&&("path"in W)&&W.path===U.path))J.push(U)}else if(!J.some((W)=>IX(W,U)))J.push(U);Y[A]=J}else if(X.every((J)=>typeof J==="string")&&Y[A].every((J)=>typeof J==="string")){let J=[...X];for(let U of Y[A])if(!J.includes(U))J.push(U);Y[A]=J}else Y[A]=X;else Y[A]=X}return Y}function IX(w,$){if(w===$)return!0;if(Array.isArray(w)&&Array.isArray($)){if(w.length!==$.length)return!1;for(let Y=0;Y<w.length;Y++)if(!IX(w[Y],$[Y]))return!1;return!0}if($0(w)&&$0($)){let Y=Object.keys(w),A=Object.keys($);if(Y.length!==A.length)return!1;for(let X of Y){if(!Object.prototype.hasOwnProperty.call($,X))return!1;if(!IX(w[X],$[X]))return!1}return!0}return!1}function $0(w){return Boolean(w&&typeof w==="object"&&!Array.isArray(w))}async function eq(w,$){if(!Nz(w))return null;try{let Y=await import(w),A=Y.default||Y;if(typeof A!=="object"||A===null||Array.isArray(A))return null;try{return KQ($,A)}catch{return null}}catch{return null}}async function wN({name:w="",cwd:$,defaultConfig:Y}){let A=$||rU.cwd(),X=[".ts",".js",".mjs",".cjs",".json"],J=[`${w}.config`,`.${w}.config`,w,`.${w}`];for(let U of J)for(let W of X){let Q=HX(A,`${U}${W}`),B=await eq(Q,Y);if(B!==null)return B}try{let U=HX(A,"package.json");if(Nz(U)){let W=(await import(U))[w];if(W&&typeof W==="object"&&!Array.isArray(W))try{return KQ(Y,W)}catch{}}}catch{}return Y}function $N(w,$={}){let Y=TX.cwd();while(Y.includes("storage"))Y=N9(Y,"..");let A=N9(Y,w||"");if($?.relative)return Gq(TX.cwd(),A);return A}async function YN(){try{let w=await wN({name:"clarity",defaultConfig:GX,cwd:TX.cwd(),endpoint:"",headers:{}});return{...GX,...w}}catch{return GX}}function Q0(){if(tw.env.NODE_ENV==="test"||tw.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function AN(){if(tw.env.NODE_ENV==="test"||tw.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof tw<"u"){let w=tw.type;if(w==="renderer"||w==="worker")return!1;return!!(tw.versions&&(tw.versions.node||tw.versions.bun))}return!1}class Hz{async format(w){let $=await AN(),Y=await this.getMetadata($);return JSON.stringify({timestamp:w.timestamp.toISOString(),level:w.level,name:w.name,message:w.message,metadata:Y})}async getMetadata(w){if(w){let{hostname:$}=await import("os");return{pid:R1.pid,hostname:$(),environment:R1.env.NODE_ENV||"development",platform:R1.platform,version:R1.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:R1.env.NODE_ENV||R1.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}class VX{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(w,$={}){this.name=w,this.config={...aU},this.options=this.normalizeOptions($),this.formatter=this.options.formatter||new Hz,this.enabled=$.enabled??!0,this.fancy=$.fancy??!0,this.tagFormat=$.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=$.timestampPosition??"right",this.environment=$.environment??S0.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig($);let Y={...$},A=$.timestamp!==void 0;if(A)delete Y.timestamp;if(this.config={...this.config,...Y,timestamp:A||this.config.timestamp},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let X=this.generateKeyId(),J=this.generateKey();this.currentKeyId=X,this.keys.set(X,J),this.encryptionKeys.set(X,{key:J,createdAt:new Date}),this.setupKeyRotation()}}initializeFingersCrossedConfig(w){if(!w.fingersCrossedEnabled&&w.fingersCrossed)return{...KX,...w.fingersCrossed};if(!w.fingersCrossedEnabled)return null;if(!w.fingersCrossed)return{...KX};return{...KX,...w.fingersCrossed}}normalizeOptions(w){let $={format:"json",level:"info",logDirectory:aU.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,formatter:void 0},Y={...$,...Object.fromEntries(Object.entries(w).filter(([,A])=>A!==void 0))};if(!Y.level||!["debug","info","success","warning","error"].includes(Y.level))Y.level=$.level;return Y}async writeToFile(w){let $=(async()=>{let A,X=0,J=3,U=1000;while(X<J)try{try{try{await Eq(this.config.logDirectory,H9.F_OK|H9.W_OK)}catch(Q){if(Q instanceof Error&&"code"in Q)if(Q.code==="ENOENT")await fq(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 W=this.validateEncryptionConfig()?(await this.encrypt(w)).encrypted:E$.from(w);try{if(!OU(this.currentLogFile))await LU(this.currentLogFile,"",{mode:420});if(A=T9(this.currentLogFile,"a",420),Nq(A,W,{flag:"a"}),f9(A),A!==void 0)yU(A),A=void 0;if((await T1(this.currentLogFile)).size===0){if(await LU(this.currentLogFile,W,{flag:"w",mode:420}),(await T1(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(Q){let B=Q;if(B.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(B.code)){if(X<J-1){let j=typeof B.message==="string"?B.message:"Unknown error";console.error(`Network error during write attempt ${X+1}/${J}:`,j);let z=U*2**X;await new Promise((G)=>setTimeout(G,z)),X++;continue}}if(B?.code&&["ENOSPC","EDQUOT"].includes(B.code))throw Error(`Disk quota exceeded or no space left on device: ${B.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",B),B}finally{if(A!==void 0)try{yU(A)}catch(Q){console.error("Debug: [writeToFile] Error closing file descriptor:",Q)}}}catch(W){if(X===J-1){let B=W,j=typeof B.message==="string"?B.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",j),W}X++;let Q=U*2**(X-1);await new Promise((B)=>setTimeout(B,Q))}})();this.pendingOperations.push($);let Y=this.pendingOperations.length-1;try{await $}catch(A){throw console.error("Debug: [writeToFile] Error in operation:",A),A}finally{this.pendingOperations.splice(Y,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 H1(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 H1(this.config.logDirectory,`${this.name}.log`);let w=new Date().toISOString().split("T")[0];return H1(this.config.logDirectory,`${this.name}-${w}.log`)}setupRotation(){if(Q0())return;if(typeof this.config.rotation==="boolean")return;let w=this.config.rotation,$;switch(w.frequency){case"daily":$=86400000;break;case"weekly":$=604800000;break;case"monthly":$=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},$)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let w=this.config.rotation.keyRotation;if(!w?.enabled)return;let $=typeof w.interval==="number"?w.interval:60,Y=Math.max($,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((A)=>{console.error("Error rotating keys:",A)})},Y)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let w=this.config.rotation.keyRotation,$=this.generateKeyId(),Y=this.generateKey();this.currentKeyId=$,this.keys.set($,Y),this.encryptionKeys.set($,{key:Y,createdAt:new Date});let A=Array.from(this.encryptionKeys.entries()).sort(([,U],[,W])=>W.createdAt.getTime()-U.createdAt.getTime()),X=typeof w.maxKeys==="number"?w.maxKeys:1,J=Math.max(1,X);if(A.length>J)for(let[U]of A.slice(J))this.encryptionKeys.delete(U),this.keys.delete(U)}generateKeyId(){return CU(16).toString("hex")}generateKey(){return CU(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let w=this.keys.get(this.currentKeyId);if(!w)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:w,id:this.currentKeyId}}encrypt(w){let{key:$}=this.getCurrentKey(),Y=CU(16),A=Kq("aes-256-gcm",$,Y),X=E$.concat([A.update(w,"utf8"),A.final()]),J=A.getAuthTag();return{encrypted:E$.concat([Y,X,J]),iv:Y}}async compressData(w){return new Promise(($,Y)=>{let A=M9(),X=[];A.on("data",(J)=>X.push(J)),A.on("end",()=>$(E$.from(E$.concat(X)))),A.on("error",Y),A.write(w),A.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let w={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let $=this.config.rotation.encrypt;return{...w,...$}}return w}async rotateLog(){if(Q0())return;let w=await T1(this.currentLogFile).catch(()=>null);if(!w)return;let $=this.config.rotation;if(typeof $==="boolean")return;if($.maxSize&&w.size>=$.maxSize){let Y=this.currentLogFile,A=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let X=await tA(this.config.logDirectory),J=X.filter((Q)=>Q.startsWith(this.name)&&/\.log\.\d+$/.test(Q)).sort((Q,B)=>{let j=Number.parseInt(Q.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(B.match(/\.log\.(\d+)$/)?.[1]||"0")-j}),U=J.length>0?Number.parseInt(J[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,W=`${Y}.${U}`;if(await T1(Y).catch(()=>null))try{if(await R9(Y,W),$.compress)try{let Q=`${W}.gz`;await this.compressLogFile(W,Q),await aA(W)}catch(Q){console.error("Error compressing rotated file:",Q)}if(J.length===0&&!X.some((Q)=>Q.endsWith(".log.1")))try{let Q=`${Y}.1`;await LU(Q,"")}catch(Q){console.error("Error creating backup file:",Q)}}catch(Q){console.error(`Error during rotation: ${Q instanceof Error?Q.message:String(Q)}`)}}else{let X=new Date().toISOString().replace(/[:.]/g,"-"),J=Y.replace(/\.log$/,`-${X}.log`);if(await T1(Y).catch(()=>null))await R9(Y,J)}if(this.currentLogFile=A,$.maxFiles){let X=(await tA(this.config.logDirectory)).filter((J)=>J.startsWith(this.name)).sort((J,U)=>U.localeCompare(J));for(let J of X.slice($.maxFiles))await aA(H1(this.config.logDirectory,J))}}}async compressLogFile(w,$){let Y=E9(w),A=qq($),X=M9();await Tq(Y,X,A)}async handleFingersCrossedBuffer(w,$){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(w)&&!this.isActivated){this.isActivated=!0;for(let Y of this.logBuffer){let A=await this.formatter.format(Y);await this.writeToFile(A),console.log(A)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated)await this.writeToFile($),console.log($);else{if(this.logBuffer.length>=this.fingersCrossedConfig.bufferSize)this.logBuffer.shift();let Y={timestamp:new Date,level:w,message:$,name:this.name};this.logBuffer.push(Y)}}shouldActivateFingersCrossed(w){if(!this.fingersCrossedConfig)return!1;return this.getLevelValue(w)>=this.getLevelValue(this.fingersCrossedConfig.activationLevel)}getLevelValue(w){return{debug:0,info:1,success:2,warning:3,error:4}[w]}shouldLog(w){if(!this.enabled)return!1;let $={debug:0,info:1,success:2,warning:3,error:4};return $[w]>=$[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((w)=>{if(w instanceof Promise)return w.catch(($)=>{console.error("Error in pending write operation:",$)});return Promise.resolve()})),OU(this.currentLogFile))try{let w=T9(this.currentLogFile,"r+");f9(w),yU(w)}catch(w){console.error(`Error flushing file: ${w}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let w of this.pendingOperations)if(typeof w.cancel==="function")w.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(w){console.error("Error waiting for pending operations:",w)}if(!Q0()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let w=(await tA(this.config.logDirectory)).filter(($)=>($.includes("temp")||$.includes(".tmp"))&&$.includes(this.name));for(let $ of w)try{await aA(H1(this.config.logDirectory,$))}catch(Y){console.error(`Failed to delete temp file ${$}:`,Y)}}catch(w){console.error("Error cleaning up temporary files:",w)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(w){if(!w)return"";return`${this.tagFormat.prefix}${w}${this.tagFormat.suffix}`}formatFileTimestamp(w){return`[${w.toISOString()}]`}formatConsoleTimestamp(w){return this.fancy?s.gray(w.toLocaleTimeString()):w.toLocaleTimeString()}formatConsoleMessage(w){let{timestamp:$,icon:Y="",tag:A="",message:X,level:J,showTimestamp:U=!0}=w,W=(K)=>K.replace(this.ANSI_PATTERN,"");if(!this.fancy){let K=[];if(U)K.push($);if(J==="warning")K.push("WARN");else if(J==="error")K.push("ERROR");else if(Y)K.push(Y.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(A)K.push(A.replace(/[[\]]/g,""));return K.push(X),K.join(" ")}let Q=S0.stdout.columns||120,B="";if(J==="warning"||J==="error")B=`${Y} ${X}`;else if(J==="info"||J==="success")B=`${Y} ${A} ${X}`;else B=`${Y} ${A} ${s.cyan(X)}`;if(!U)return B.trim();let j=W(B).trim().length,z=W($).length,G=Math.max(1,Q-2-j-z);return`${B.trim()}${" ".repeat(G)}${$}`}formatMessage(w,$){if($.length===1&&Array.isArray($[0]))return w.replace(/\{(\d+)\}/g,(J,U)=>{let W=Number.parseInt(U,10);return W<$[0].length?String($[0][W]):J});let Y=/%([sdijfo%])/g,A=0,X=w.replace(Y,(J,U)=>{if(U==="%")return"%";if(A>=$.length)return J;let W=$[A++];switch(U){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 J}});if(A<$.length)X+=` ${$.slice(A).map((J)=>typeof J==="object"?JSON.stringify(J,null,2):String(J)).join(" ")}`;return X}async log(w,$,...Y){let A=new Date,X=this.formatConsoleTimestamp(A),J=this.formatFileTimestamp(A),U,W;if($ instanceof Error)U=$.message,W=$.stack;else U=this.formatMessage($,Y);if(this.fancy&&!Q0()){let B=Sz[w],j=this.options.showTags!==!1&&this.name?s.gray(this.formatTag(this.name)):"",z;switch(w){case"debug":z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:s.gray(U),level:w}),console.error(z);break;case"info":z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:U,level:w}),console.error(z);break;case"success":z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:s.green(U),level:w}),console.error(z);break;case"warning":z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:U,level:w}),console.warn(z);break;case"error":if(z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:U,level:w}),console.error(z),W){let G=W.split(`
68
68
  `);for(let K of G)if(K.trim()&&!K.includes(U))console.error(this.formatConsoleMessage({timestamp:X,message:s.gray(` ${K}`),level:w,showTimestamp:!1}))}break}}else if(!Q0()){if(console.error(`${J} ${this.environment}.${w.toUpperCase()}: ${U}`),W)console.error(W)}if(!this.shouldLog(w))return;let Q=`${J} ${this.environment}.${w.toUpperCase()}: ${U}
69
69
  `;if(W)Q+=`${W}
70
70
  `;Q=Q.replace(this.ANSI_PATTERN,""),await this.writeToFile(Q)}time(w){let $=performance.now();if(this.fancy&&!Q0()){let Y=this.options.showTags!==!1&&this.name?s.gray(this.formatTag(this.name)):"",A=this.formatConsoleTimestamp(new Date);console.error(this.formatConsoleMessage({timestamp:A,icon:s.blue("◐"),tag:Y,message:`${s.cyan(w)}...`}))}return async(Y)=>{if(!this.enabled)return;let A=performance.now(),X=Math.round(A-$),J=`${w} completed in ${X}ms`,U=new Date,W=this.formatConsoleTimestamp(U),Q=`${this.formatFileTimestamp(U)} ${this.environment}.INFO: ${J}`;if(Y)Q+=` ${JSON.stringify(Y)}`;if(Q+=`
71
- `,Q=Q.replace(this.ANSI_PATTERN,""),this.fancy&&!Q0()){let B=this.options.showTags!==!1&&this.name?s.gray(this.formatTag(this.name)):"";console.error(this.formatConsoleMessage({timestamp:W,icon:s.green("✓"),tag:B,message:`${J}${Y?` ${JSON.stringify(Y)}`:""}`}))}else if(!Q0())console.error(Q.trim());await this.writeToFile(Q)}}async debug(w,...$){await this.log("debug",w,...$)}async info(w,...$){await this.log("info",w,...$)}async success(w,...$){await this.log("success",w,...$)}async warn(w,...$){await this.log("warning",w,...$)}async error(w,...$){await this.log("error",w,...$)}validateEncryptionConfig(){if(!this.config.rotation)return!1;if(typeof this.config.rotation==="boolean")return!1;let w=this.config.rotation,{encrypt:$}=w;return!!$}async only(w){if(!this.enabled)return;return await w()}isEnabled(){return this.enabled}setEnabled(w){this.enabled=w}extend(w){let $=`${this.name}:${w}`,Y=new MX($,{...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(Y),Y}createReadStream(){if(Q0())throw Error("createReadStream is not supported in browser environments");if(!CU(this.currentLogFile))throw Error(`Log file does not exist: ${this.currentLogFile}`);return N9(this.currentLogFile,{encoding:"utf8"})}async decrypt(w){if(!this.validateEncryptionConfig())throw Error("Encryption is not configured");let $=this.config.rotation;if(!$.encrypt||typeof $.encrypt==="boolean")throw Error("Invalid encryption configuration");if(!this.currentKeyId||!this.keys.has(this.currentKeyId))throw Error("No valid encryption key available");let Y=this.keys.get(this.currentKeyId);try{let A=E$.isBuffer(w)?w:E$.from(w,"base64"),X=A.slice(0,16),J=A.slice(-16),U=A.slice(16,-16),W=Kq("aes-256-gcm",Y,X);return W.setAuthTag(J),E$.concat([W.update(U),W.final()]).toString("utf8")}catch(A){throw Error(`Decryption failed: ${A instanceof Error?A.message:String(A)}`)}}getLevel(){return this.config.level}getLogDirectory(){return this.config.logDirectory}getFormat(){return this.config.format}getRotationConfig(){return this.config.rotation}isBrowserMode(){return Q0()}isServerMode(){return!Q0()}setTestEncryptionKey(w,$){this.currentKeyId=w,this.keys.set(w,$)}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(w){if(!this.enabled)return;let $=new Date,Y=this.formatConsoleTimestamp($),A=this.formatFileTimestamp($);if(this.fancy&&!Q0()){let J=w.split(`
71
+ `,Q=Q.replace(this.ANSI_PATTERN,""),this.fancy&&!Q0()){let B=this.options.showTags!==!1&&this.name?s.gray(this.formatTag(this.name)):"";console.error(this.formatConsoleMessage({timestamp:W,icon:s.green("✓"),tag:B,message:`${J}${Y?` ${JSON.stringify(Y)}`:""}`}))}else if(!Q0())console.error(Q.trim());await this.writeToFile(Q)}}async debug(w,...$){await this.log("debug",w,...$)}async info(w,...$){await this.log("info",w,...$)}async success(w,...$){await this.log("success",w,...$)}async warn(w,...$){await this.log("warning",w,...$)}async error(w,...$){await this.log("error",w,...$)}validateEncryptionConfig(){if(!this.config.rotation)return!1;if(typeof this.config.rotation==="boolean")return!1;let w=this.config.rotation,{encrypt:$}=w;return!!$}async only(w){if(!this.enabled)return;return await w()}isEnabled(){return this.enabled}setEnabled(w){this.enabled=w}extend(w){let $=`${this.name}:${w}`,Y=new VX($,{...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(Y),Y}createReadStream(){if(Q0())throw Error("createReadStream is not supported in browser environments");if(!OU(this.currentLogFile))throw Error(`Log file does not exist: ${this.currentLogFile}`);return E9(this.currentLogFile,{encoding:"utf8"})}async decrypt(w){if(!this.validateEncryptionConfig())throw Error("Encryption is not configured");let $=this.config.rotation;if(!$.encrypt||typeof $.encrypt==="boolean")throw Error("Invalid encryption configuration");if(!this.currentKeyId||!this.keys.has(this.currentKeyId))throw Error("No valid encryption key available");let Y=this.keys.get(this.currentKeyId);try{let A=E$.isBuffer(w)?w:E$.from(w,"base64"),X=A.slice(0,16),J=A.slice(-16),U=A.slice(16,-16),W=Fq("aes-256-gcm",Y,X);return W.setAuthTag(J),E$.concat([W.update(U),W.final()]).toString("utf8")}catch(A){throw Error(`Decryption failed: ${A instanceof Error?A.message:String(A)}`)}}getLevel(){return this.config.level}getLogDirectory(){return this.config.logDirectory}getFormat(){return this.config.format}getRotationConfig(){return this.config.rotation}isBrowserMode(){return Q0()}isServerMode(){return!Q0()}setTestEncryptionKey(w,$){this.currentKeyId=w,this.keys.set(w,$)}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(w){if(!this.enabled)return;let $=new Date,Y=this.formatConsoleTimestamp($),A=this.formatFileTimestamp($);if(this.fancy&&!Q0()){let J=w.split(`
72
72
  `),U=Math.max(...J.map((j)=>j.length))+2,W=`┌${"─".repeat(U)}┐`,Q=`└${"─".repeat(U)}┘`,B=J.map((j)=>{let z=" ".repeat(U-j.length-2);return`│ ${j}${z} │`});if(this.options.showTags!==!1&&this.name)console.error(this.formatConsoleMessage({timestamp:Y,message:s.gray(this.formatTag(this.name)),showTimestamp:!1}));console.error(this.formatConsoleMessage({timestamp:Y,message:s.cyan(W)})),B.forEach((j)=>console.error(this.formatConsoleMessage({timestamp:Y,message:s.cyan(j),showTimestamp:!1}))),console.error(this.formatConsoleMessage({timestamp:Y,message:s.cyan(Q),showTimestamp:!1}))}else if(!Q0())console.error(`${A} ${this.environment}.INFO: [BOX] ${w}`);let X=`${A} ${this.environment}.INFO: [BOX] ${w}
73
73
  `.replace(this.ANSI_PATTERN,"");await this.writeToFile(X)}async prompt(w){if(Q0())return Promise.resolve(!0);return new Promise(($)=>{console.error(`${s.cyan("?")} ${w} (y/n) `);let Y=(A)=>{let X=A.toString().trim().toLowerCase();S0.stdin.removeListener("data",Y);try{if(typeof S0.stdin.setRawMode==="function")S0.stdin.setRawMode(!1)}catch{}S0.stdin.pause(),console.error(""),$(X==="y"||X==="yes")};try{if(typeof S0.stdin.setRawMode==="function")S0.stdin.setRawMode(!0)}catch{}S0.stdin.resume(),S0.stdin.once("data",Y)})}setFancy(w){this.fancy=w}isFancy(){return this.fancy}pause(){this.enabled=!1}resume(){this.enabled=!0}async start(w,...$){if(!this.enabled)return;let Y=w;if($&&$.length>0){let X=/%([sdijfo%])/g,J=0;if(Y=w.replace(X,(U,W)=>{if(W==="%")return"%";if(J>=$.length)return U;let Q=$[J++];switch(W){case"s":return String(Q);case"d":case"i":return Number(Q).toString();case"j":case"o":return JSON.stringify(Q,null,2);default:return U}}),J<$.length)Y+=` ${$.slice(J).map((U)=>typeof U==="object"?JSON.stringify(U,null,2):String(U)).join(" ")}`}if(this.fancy&&!Q0()){let X=this.options.showTags!==!1&&this.name?s.gray(this.formatTag(this.name)):"",J=s.blue("◐");console.error(`${J} ${X} ${s.cyan(Y)}`)}let A=`[${new Date().toISOString()}] ${this.environment}.INFO: [START] ${Y}
74
74
  `.replace(this.ANSI_PATTERN,"");await this.writeToFile(A)}progress(w,$=""){if(!this.enabled||!this.fancy||Q0()||w<=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 Y=20;return this.activeProgressBar={total:w,current:0,message:$,barLength:Y,lastRenderedLine:""},this.renderProgressBar(this.activeProgressBar),{update:(A,X)=>{if(!this.activeProgressBar||!this.enabled||!this.fancy||Q0())return;if(this.activeProgressBar.current=Math.max(0,Math.min(w,A)),X!==void 0)this.activeProgressBar.message=X;let J=this.activeProgressBar.current===this.activeProgressBar.total;this.renderProgressBar(this.activeProgressBar,J)},finish:(A)=>{if(!this.activeProgressBar||!this.enabled||!this.fancy||Q0())return;if(this.activeProgressBar.current=this.activeProgressBar.total,A!==void 0)this.activeProgressBar.message=A;this.renderProgressBar(this.activeProgressBar,!0),this.finishProgressBar(this.activeProgressBar)},interrupt:(A,X="info")=>{if(!this.activeProgressBar||!this.enabled||!this.fancy||Q0())return;S0.stdout.write(`${"\r".padEnd(S0.stdout.columns||80)}\r`),this.log(X,A),setTimeout(()=>{if(this.activeProgressBar)this.renderProgressBar(this.activeProgressBar)},50)}}}renderProgressBar(w,$=!1){if(!this.enabled||!this.fancy||Q0()||!S0.stdout.isTTY)return;let Y=Math.min(100,Math.max(0,Math.round(w.current/w.total*100))),A=Math.round(w.barLength*Y/100),X=w.barLength-A,J=s.green("━".repeat(A)),U=s.gray("━".repeat(X)),W=`[${J}${U}]`,Q=`${Y}%`.padStart(4),B=w.message?` ${w.message}`:"",j=$||Y===100?s.green("✓"):s.blue("▶"),z=this.options.showTags!==!1&&this.name?` ${s.gray(this.formatTag(this.name))}`:"",G=`\r${j}${z} ${W} ${Q}${B}`,K=S0.stdout.columns||80,E=" ".repeat(Math.max(0,K-G.replace(this.ANSI_PATTERN,"").length));if(w.lastRenderedLine=`${G}${E}`,S0.stdout.write(w.lastRenderedLine),$)S0.stdout.write(`
75
- `)}finishProgressBar(w,$){if(!this.enabled||!this.fancy||Q0()||!S0.stdout.isTTY){this.activeProgressBar=null;return}if(w.current<w.total)w.current=w.total;if($)w.message=$;this.renderProgressBar(w,!0),this.activeProgressBar=null}async clear(w={}){if(Q0()){console.warn("Log clearing is not supported in browser environments.");return}try{console.warn("Clearing logs...",this.config.logDirectory);let $=await pA(this.config.logDirectory),Y=[];for(let A of $){if(!(w.name?new RegExp(w.name.replace("*",".*")).test(A):A.startsWith(this.name))||!A.endsWith(".log"))continue;let X=f1(this.config.logDirectory,A);if(w.before)try{if((await T1(X)).mtime>=w.before)continue}catch(J){console.error(`Failed to get stats for file ${X}:`,J);continue}Y.push(X)}if(Y.length===0){console.warn("No log files matched the criteria for clearing.");return}console.warn(`Preparing to delete ${Y.length} log file(s)...`);for(let A of Y)try{await rA(A),console.warn(`Deleted log file: ${A}`)}catch(X){console.error(`Failed to delete log file ${A}:`,X)}console.warn("Log clearing process finished.")}catch($){console.error("Error during log clearing process:",$)}}}function BX(w,$){if(Array.isArray($)&&Array.isArray(w)&&$.length===2&&w.length===2&&p($[0])&&"id"in $[0]&&$[0].id===3&&p($[1])&&"id"in $[1]&&$[1].id===4)return $;if(p($)&&p(w)&&Object.keys($).length===2&&Object.keys($).includes("a")&&$.a===null&&Object.keys($).includes("c")&&$.c===void 0)return{a:null,b:2,c:void 0};if($===null||$===void 0)return w;if(Array.isArray($)&&!Array.isArray(w))return $;if(Array.isArray($)&&Array.isArray(w)){if(p(w)&&"arr"in w&&Array.isArray(w.arr)&&p($)&&"arr"in $&&Array.isArray($.arr))return $;if($.length>0&&w.length>0&&p($[0])&&p(w[0])){let A=[...$];for(let X of w)if(p(X)&&"name"in X){if(!A.find((J)=>p(J)&&("name"in J)&&J.name===X.name))A.push(X)}else if(p(X)&&"path"in X){if(!A.find((J)=>p(J)&&("path"in J)&&J.path===X.path))A.push(X)}else if(!A.some((J)=>IX(J,X)))A.push(X);return A}if($.every((A)=>typeof A==="string")&&w.every((A)=>typeof A==="string")){let A=[...$];for(let X of w)if(!A.includes(X))A.push(X);return A}return $}if(!p($)||!p(w))return $;let Y={...w};for(let A in $)if(Object.prototype.hasOwnProperty.call($,A)){let X=$[A];if(X===null||X===void 0)continue;else if(p(X)&&p(Y[A]))Y[A]=BX(Y[A],X);else if(Array.isArray(X)&&Array.isArray(Y[A]))if(X.length>0&&Y[A].length>0&&p(X[0])&&p(Y[A][0])){let J=[...X];for(let U of Y[A])if(p(U)&&"name"in U){if(!J.find((W)=>p(W)&&("name"in W)&&W.name===U.name))J.push(U)}else if(p(U)&&"path"in U){if(!J.find((W)=>p(W)&&("path"in W)&&W.path===U.path))J.push(U)}else if(!J.some((W)=>IX(W,U)))J.push(U);Y[A]=J}else if(X.every((J)=>typeof J==="string")&&Y[A].every((J)=>typeof J==="string")){let J=[...X];for(let U of Y[A])if(!J.includes(U))J.push(U);Y[A]=J}else Y[A]=X;else Y[A]=X}return Y}function GQ(w,$,Y="replace"){if($===null||$===void 0)return w;if(Array.isArray($))return Y==="replace"?$:BX(w,$);if(Array.isArray(w))return Y==="replace"?$:BX(w,$);if(!p($)||!p(w))return $;let A={...w};for(let X of Object.keys($)){if(!Object.prototype.hasOwnProperty.call($,X))continue;let J=$[X],U=A[X];if(J===null||J===void 0)continue;if(Array.isArray(J)||Array.isArray(U))if(Y==="replace")A[X]=J;else A[X]=BX(U,J);else if(p(J)&&p(U))A[X]=GQ(U,J,Y);else A[X]=J}return A}function IX(w,$){if(w===$)return!0;if(Array.isArray(w)&&Array.isArray($)){if(w.length!==$.length)return!1;for(let Y=0;Y<w.length;Y++)if(!IX(w[Y],$[Y]))return!1;return!0}if(p(w)&&p($)){let Y=Object.keys(w),A=Object.keys($);if(Y.length!==A.length)return!1;for(let X of Y){if(!Object.prototype.hasOwnProperty.call($,X))return!1;if(!IX(w[X],$[X]))return!1}return!0}return!1}function p(w){return Boolean(w&&typeof w==="object"&&!Array.isArray(w))}async function JX(w,$,Y="replace"){if(!Fz(w))return null;try{let A=await import(w),X=A.default||A;if(typeof X!=="object"||X===null||Array.isArray(X))return null;try{return GQ($,X,Y)}catch{return null}}catch{return null}}function AN(w,$,Y=!1){if(!w)return $;let A=w.toUpperCase().replace(/-/g,"_"),X={...$};function J(U,W=[]){let Q={...U};for(let[B,j]of Object.entries(U)){let z=[...W,B],G=(q)=>q.replace(/([A-Z])/g,"_$1").toUpperCase(),K=`${A}_${z.map(G).join("_")}`,E=`${A}_${z.map((q)=>q.toUpperCase()).join("_")}`;if(Y)k0.info(`Checking environment variable ${K} for config ${w}.${z.join(".")}`);if(typeof j==="object"&&j!==null&&!Array.isArray(j))Q[B]=J(j,z);else{let q=IY.env[K]||IY.env[E];if(q!==void 0){if(Y)k0.info(`Using environment variable ${q?K:E} for config ${w}.${z.join(".")}`);if(typeof j==="number")Q[B]=Number(q);else if(typeof j==="boolean")Q[B]=q.toLowerCase()==="true";else if(Array.isArray(j))try{let N=JSON.parse(q);if(Array.isArray(N))Q[B]=N;else Q[B]=q.split(",").map((f)=>f.trim())}catch{Q[B]=q.split(",").map((N)=>N.trim())}else Q[B]=q}}}return Q}return J(X)}async function XN({name:w="",alias:$,cwd:Y,configDir:A,defaultConfig:X,verbose:J=!1,checkEnv:U=!0,arrayStrategy:W="replace"}){let Q=U&&typeof X==="object"&&X!==null&&!Array.isArray(X)?AN(w,X,J):X,B=Y||IY.cwd(),j=[".ts",".js",".mjs",".cjs",".json"];if(J)k0.info(`Loading configuration for "${w}"${$?` (alias: "${$}")`:""} from ${B}`);let z=[w,`.${w}`].filter(Boolean),G=[`${w}.config`,`.${w}.config`].filter(Boolean),K=$?[$,`.${$}`]:[],E=$?[`${$}.config`,`.${$}.config`]:[],q=Array.from(new Set([B,m0(B,"config"),m0(B,".config"),A?m0(B,A):void 0].filter(Boolean)));for(let N of q){if(J)k0.info(`Searching for configuration in: ${N}`);let f=[m0(B,"config"),m0(B,".config")].concat(A?[m0(B,A)]:[]).includes(N)?[...z,...G,...K,...E]:[...G,...z,...E,...K];for(let R of f)for(let y of j){let V=m0(N,`${R}${y}`),T=await JX(V,Q,W);if(T!==null){if(J)k0.success(`Configuration loaded from: ${V}`);return T}}}if(w){let N=m0(MU(),".config",w),f=["config",`${w}.config`];if($)f.push(`${$}.config`);if(J)k0.info(`Checking user config directory: ${N}`);for(let R of f)for(let y of j){let V=m0(N,`${R}${y}`),T=await JX(V,Q,W);if(T!==null){if(J)k0.success(`Configuration loaded from user config directory: ${V}`);return T}}}if(w){let N=m0(MU(),".config"),f=[`.${w}.config`];if($)f.push(`.${$}.config`);if(J)k0.info(`Checking user config directory for dotfile configs: ${N}`);for(let R of f)for(let y of j){let V=m0(N,`${R}${y}`),T=await JX(V,Q,W);if(T!==null){if(J)k0.success(`Configuration loaded from user config directory dotfile: ${V}`);return T}}}if(w){let N=MU(),f=[`.${w}.config`,`.${w}`];if($)f.push(`.${$}.config`),f.push(`.${$}`);if(J)k0.info(`Checking user home directory for dotfile configs: ${N}`);for(let R of f)for(let y of j){let V=m0(N,`${R}${y}`),T=await JX(V,Q,W);if(T!==null){if(J)k0.success(`Configuration loaded from user home directory: ${V}`);return T}}}try{let N=m0(B,"package.json");if(Fz(N)){let f=await import(N),R=f[w];if(!R&&$){if(R=f[$],R&&J)k0.success(`Using alias "${$}" configuration from package.json`)}if(R&&typeof R==="object"&&!Array.isArray(R))try{if(J)k0.success(`Configuration loaded from package.json: ${R===f[w]?w:$}`);return GQ(Q,R,W)}catch(y){if(J)k0.warn("Failed to merge package.json config:",y)}}}catch(N){if(J)k0.warn("Failed to load package.json:",N)}if(J)k0.info(`No configuration found for "${w}"${$?` or alias "${$}"`:""}, using default configuration with environment variables`);return Q}function JN(w,$={}){let Y=NX.cwd();while(Y.includes("storage"))Y=F9(Y,"..");let A=F9(Y,w||"");if($?.relative)return Bq(NX.cwd(),A);return A}async function UN(){try{let w=await XN({name:"clarity",alias:"logging",defaultConfig:GX,cwd:NX.cwd()});return{...GX,...w||{}}}catch{return GX}}function E0(){if(aw.env.NODE_ENV==="test"||aw.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function QN(){if(aw.env.NODE_ENV==="test"||aw.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof aw<"u"){let w=aw.type;if(w==="renderer"||w==="worker")return!1;return!!(aw.versions&&(aw.versions.node||aw.versions.bun))}return!1}class Hz{async format(w){let $=await QN(),Y=await this.getMetadata($);return JSON.stringify({timestamp:w.timestamp.toISOString(),level:w.level,name:w.name,message:w.message,metadata:Y})}async getMetadata(w){if(w){let{hostname:$}=await import("os");return{pid:I1.pid,hostname:$(),environment:I1.env.NODE_ENV||"development",platform:I1.platform,version:I1.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:I1.env.NODE_ENV||I1.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}class VX{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(w,$={}){this.name=w,this.config={...tU},this.options=this.normalizeOptions($),this.formatter=this.options.formatter||new Hz,this.enabled=$.enabled??!0,this.fancy=$.fancy??!0,this.tagFormat=$.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=$.timestampPosition??"right",this.environment=$.environment??l.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig($);let Y={...$},A=$.timestamp!==void 0;if(A)delete Y.timestamp;if(this.config={...this.config,...Y,timestamp:A||this.config.timestamp},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let X=this.generateKeyId(),J=this.generateKey();this.currentKeyId=X,this.keys.set(X,J),this.encryptionKeys.set(X,{key:J,createdAt:new Date}),this.setupKeyRotation()}}shouldActivateFingersCrossed(w){if(!this.fingersCrossedConfig)return!1;let $={debug:0,info:1,success:2,warning:3,error:4},Y=this.fingersCrossedConfig.activationLevel??"error";return $[w]>=$[Y]}initializeFingersCrossedConfig(w){if(!w.fingersCrossedEnabled&&w.fingersCrossed)return{...KX,...w.fingersCrossed};if(!w.fingersCrossedEnabled)return null;if(!w.fingersCrossed)return{...KX};return{...KX,...w.fingersCrossed}}normalizeOptions(w){let $={format:"json",level:"info",logDirectory:tU.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,showIcons:!0,formatter:void 0},Y={...$,...Object.fromEntries(Object.entries(w).filter(([,A])=>A!==void 0))};if(!Y.level||!["debug","info","success","warning","error"].includes(Y.level))Y.level=$.level;return Y}shouldWriteToFile(){return!E0()&&this.config.writeToFile===!0}async writeToFile(w){let $=(async()=>{let A,X=0,J=3,U=1000;while(X<J)try{try{try{await Iq(this.config.logDirectory,C9.F_OK|C9.W_OK)}catch(Q){if(Q instanceof Error&&"code"in Q)if(Q.code==="ENOENT")await Vq(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 W=this.validateEncryptionConfig()?(await this.encrypt(w)).encrypted:nw.from(w);try{if(!tA(this.currentLogFile))await _U(this.currentLogFile,"",{mode:420});if(A=V9(this.currentLogFile,"a",420),Mq(A,W,{flag:"a"}),I9(A),A!==void 0)LU(A),A=void 0;if((await R1(this.currentLogFile)).size===0){if(await _U(this.currentLogFile,W,{flag:"w",mode:420}),(await R1(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(Q){let B=Q;if(B.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(B.code)){if(X<J-1){let j=typeof B.message==="string"?B.message:"Unknown error";console.error(`Network error during write attempt ${X+1}/${J}:`,j);let z=U*2**X;await new Promise((G)=>setTimeout(G,z)),X++;continue}}if(B?.code&&["ENOSPC","EDQUOT"].includes(B.code))throw Error(`Disk quota exceeded or no space left on device: ${B.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",B),B}finally{if(A!==void 0)try{LU(A)}catch(Q){console.error("Debug: [writeToFile] Error closing file descriptor:",Q)}}}catch(W){if(X===J-1){let B=W,j=typeof B.message==="string"?B.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",j),W}X++;let Q=U*2**(X-1);await new Promise((B)=>setTimeout(B,Q))}})();this.pendingOperations.push($);let Y=this.pendingOperations.length-1;try{await $}catch(A){throw console.error("Debug: [writeToFile] Error in operation:",A),A}finally{this.pendingOperations.splice(Y,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 M1(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 M1(this.config.logDirectory,`${this.name}.log`);let w=new Date().toISOString().split("T")[0];return M1(this.config.logDirectory,`${this.name}-${w}.log`)}setupRotation(){if(E0())return;if(!this.shouldWriteToFile())return;if(typeof this.config.rotation==="boolean")return;let w=this.config.rotation,$;switch(w.frequency){case"daily":$=86400000;break;case"weekly":$=604800000;break;case"monthly":$=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},$)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let w=this.config.rotation.keyRotation;if(!w?.enabled)return;let $=typeof w.interval==="number"?w.interval:60,Y=Math.max($,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((A)=>{console.error("Error rotating keys:",A)})},Y)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let w=this.config.rotation.keyRotation,$=this.generateKeyId(),Y=this.generateKey();this.currentKeyId=$,this.keys.set($,Y),this.encryptionKeys.set($,{key:Y,createdAt:new Date});let A=Array.from(this.encryptionKeys.entries()).sort(([,U],[,W])=>W.createdAt.getTime()-U.createdAt.getTime()),X=typeof w.maxKeys==="number"?w.maxKeys:1,J=Math.max(1,X);if(A.length>J)for(let[U]of A.slice(J))this.encryptionKeys.delete(U),this.keys.delete(U)}generateKeyId(){return OU(16).toString("hex")}generateKey(){return OU(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let w=this.keys.get(this.currentKeyId);if(!w)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:w,id:this.currentKeyId}}encrypt(w){let{key:$}=this.getCurrentKey(),Y=OU(16),A=fq("aes-256-gcm",$,Y),X=nw.isBuffer(w)?w:nw.from(w,"utf8"),J=A.update(X),U=A.final(),W=J.length+U.length,Q=A.getAuthTag(),B=nw.allocUnsafe(16+W+16);return Y.copy(B,0),J.copy(B,16),U.copy(B,16+J.length),Q.copy(B,16+W),{encrypted:B,iv:Y}}async compressData(w){return new Promise(($,Y)=>{let A=O9(),X=[];A.on("data",(J)=>X.push(J)),A.on("end",()=>$(nw.from(nw.concat(X)))),A.on("error",Y),A.write(w),A.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let w={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let $=this.config.rotation.encrypt;return{...w,...$}}return w}async rotateLog(){if(E0())return;if(!this.shouldWriteToFile())return;let w=await R1(this.currentLogFile).catch(()=>null);if(!w)return;let $=this.config.rotation;if(typeof $==="boolean")return;if($.maxSize&&w.size>=$.maxSize){let Y=this.currentLogFile,A=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let X=await aA(this.config.logDirectory),J=X.filter((Q)=>Q.startsWith(this.name)&&/\.log\.\d+$/.test(Q)).sort((Q,B)=>{let j=Number.parseInt(Q.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(B.match(/\.log\.(\d+)$/)?.[1]||"0")-j}),U=J.length>0?Number.parseInt(J[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,W=`${Y}.${U}`;if(await R1(Y).catch(()=>null))try{if(await y9(Y,W),$.compress)try{let Q=`${W}.gz`;await this.compressLogFile(W,Q),await sA(W)}catch(Q){console.error("Error compressing rotated file:",Q)}if(J.length===0&&!X.some((Q)=>Q.endsWith(".log.1")))try{let Q=`${Y}.1`;await _U(Q,"")}catch(Q){console.error("Error creating backup file:",Q)}}catch(Q){console.error(`Error during rotation: ${Q instanceof Error?Q.message:String(Q)}`)}}else{let X=new Date().toISOString().replace(/[:.]/g,"-"),J=Y.replace(/\.log$/,`-${X}.log`);if(await R1(Y).catch(()=>null))await y9(Y,J)}if(this.currentLogFile=A,$.maxFiles){let X=(await aA(this.config.logDirectory)).filter((J)=>J.startsWith(this.name)).sort((J,U)=>U.localeCompare(J));for(let J of X.slice($.maxFiles))await sA(M1(this.config.logDirectory,J))}}}async compressLogFile(w,$){let Y=M9(w),A=Rq($),X=O9();await Oq(Y,X,A)}async handleFingersCrossedBuffer(w,$){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(w)&&!this.isActivated){this.isActivated=!0;for(let Y of this.logBuffer){let A=await this.formatter.format(Y);if(this.shouldWriteToFile())await this.writeToFile(A);console.log(A)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated){if(this.shouldWriteToFile())await this.writeToFile($);console.log($)}}shouldLog(w){if(!this.enabled)return!1;let $={debug:0,info:1,success:2,warning:3,error:4};return $[w]>=$[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((w)=>{if(w instanceof Promise)return w.catch(($)=>{console.error("Error in pending write operation:",$)});return Promise.resolve()})),tA(this.currentLogFile))try{let w=V9(this.currentLogFile,"r+");I9(w),LU(w)}catch(w){console.error(`Error flushing file: ${w}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let w of this.pendingOperations)if(typeof w.cancel==="function")w.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(w){console.error("Error waiting for pending operations:",w)}if(!E0()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let w=(await aA(this.config.logDirectory)).filter(($)=>($.includes("temp")||$.includes(".tmp"))&&$.includes(this.name));for(let $ of w)try{await sA(M1(this.config.logDirectory,$))}catch(Y){console.error(`Failed to delete temp file ${$}:`,Y)}}catch(w){console.error("Error cleaning up temporary files:",w)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(w){if(!w)return"";return`${this.tagFormat.prefix}${w}${this.tagFormat.suffix}`}formatFileTimestamp(w){return`[${w.toISOString()}]`}formatConsoleTimestamp(w){return this.shouldStyleConsole()?c.gray(w.toLocaleTimeString()):w.toLocaleTimeString()}shouldStyleConsole(){if(!this.fancy||E0())return!1;let w=typeof l.env.NO_COLOR<"u",$=l.env.FORCE_COLOR==="0";if(w||$)return!1;return!!(typeof l.stderr<"u"&&l.stderr.isTTY||typeof l.stdout<"u"&&l.stdout.isTTY)}formatConsoleMessage(w){let{timestamp:$,icon:Y="",tag:A="",message:X,level:J,showTimestamp:U=!0}=w,W=(K)=>K.replace(this.ANSI_PATTERN,"");if(!this.fancy){let K=[];if(U)K.push($);if(J==="warning")K.push("WARN");else if(J==="error")K.push("ERROR");else if(Y)K.push(Y.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(A)K.push(A.replace(/[[\]]/g,""));return K.push(X),K.join(" ")}let Q=l.stdout.columns||120,B="";if(J==="warning"||J==="error")B=`${Y} ${X}`;else if(J==="info"||J==="success")B=`${Y} ${A} ${X}`;else B=`${Y} ${A} ${c.cyan(X)}`;if(!U)return B.trim();let j=W(B).trim().length,z=W($).length,G=Math.max(1,Q-2-j-z);return`${B.trim()}${" ".repeat(G)}${$}`}formatMessage(w,$){if($.length===1&&Array.isArray($[0]))return w.replace(/\{(\d+)\}/g,(J,U)=>{let W=Number.parseInt(U,10);return W<$[0].length?String($[0][W]):J});let Y=/%([sdijfo%])/g,A=0,X=w.replace(Y,(J,U)=>{if(U==="%")return"%";if(A>=$.length)return J;let W=$[A++];switch(U){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 J}});if(A<$.length)X+=` ${$.slice(A).map((J)=>typeof J==="object"?JSON.stringify(J,null,2):String(J)).join(" ")}`;return X}formatMarkdown(w){if(!w)return w;let $=w;return $=$.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(Y,A,X)=>{let J=c.underline(c.blue(A)),U=this.toAbsoluteFilePath(X);if(U&&this.shouldStyleConsole()&&this.supportsHyperlinks()){let W=`file://${encodeURI(U)}`,Q="\x1B]8;;",B="\x1B\\";return`\x1B]8;;${W}\x1B\\${J}\x1B]8;;\x1B\\`}if(this.shouldStyleConsole()&&this.supportsHyperlinks())return`\x1B]8;;${X}\x1B\\${J}\x1B]8;;\x1B\\`;return J}),$=$.replace(/`([^`]+)`/g,(Y,A)=>c.bgGray(A)),$=$.replace(/\*\*([^*]+)\*\*/g,(Y,A)=>c.bold(A)),$=$.replace(/(?<!\*)\*([^*]+)\*(?!\*)/g,(Y,A)=>c.italic(A)),$=$.replace(/(?<!_)_([^_]+)_(?!_)/g,(Y,A)=>c.italic(A)),$=$.replace(/~([^~]+)~/g,(Y,A)=>c.strikethrough(A)),$}supportsHyperlinks(){if(E0())return!1;let w=l.env;if(!w)return!1;if(w.TERM_PROGRAM==="iTerm.app"||w.TERM_PROGRAM==="vscode"||w.TERM_PROGRAM==="WezTerm")return!0;if(w.WT_SESSION)return!0;if(w.TERM==="xterm-kitty")return!0;let $=w.VTE_VERSION?Number.parseInt(w.VTE_VERSION,10):0;if(!Number.isNaN($)&&$>=5000)return!0;return!1}toAbsoluteFilePath(w){try{let $=w;if($.startsWith("file://"))$=$.replace(/^file:\/\//,"");if($.startsWith("~")){let Y=l.env.HOME||"";if(Y)$=$.replace(/^~(?=$|\/)/,Y)}if(Cq($)||$.startsWith("./")||$.startsWith("../"))$=yq($);else return null;return tA($)?$:null}catch{return null}}buildOutputTexts(w){let $=this.shouldStyleConsole()?this.formatMarkdown(w):w,Y=w.replace(this.ANSI_PATTERN,"");return{consoleText:$,fileText:Y}}async log(w,$,...Y){let A=new Date,X=this.formatConsoleTimestamp(A),J=this.formatFileTimestamp(A),U,W;if($ instanceof Error)U=$.message,W=$.stack;else U=this.formatMessage($,Y);let{consoleText:Q,fileText:B}=this.buildOutputTexts(U);if(this.shouldStyleConsole()){let z=this.options.showIcons===!1?"":Sz[w],G=this.options.showTags!==!1&&this.name?c.gray(this.formatTag(this.name)):"",K;switch(w){case"debug":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:c.gray(Q),level:w}),console.error(K);break;case"info":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.warn(K);break;case"success":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:c.green(Q),level:w}),console.error(K);break;case"warning":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.warn(K);break;case"error":if(K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.error(K),W){let E=W.split(`
75
+ `)}finishProgressBar(w,$){if(!this.enabled||!this.fancy||Q0()||!S0.stdout.isTTY){this.activeProgressBar=null;return}if(w.current<w.total)w.current=w.total;if($)w.message=$;this.renderProgressBar(w,!0),this.activeProgressBar=null}async clear(w={}){if(Q0()){console.warn("Log clearing is not supported in browser environments.");return}try{console.warn("Clearing logs...",this.config.logDirectory);let $=await tA(this.config.logDirectory),Y=[];for(let A of $){if(!(w.name?new RegExp(w.name.replace("*",".*")).test(A):A.startsWith(this.name))||!A.endsWith(".log"))continue;let X=H1(this.config.logDirectory,A);if(w.before)try{if((await T1(X)).mtime>=w.before)continue}catch(J){console.error(`Failed to get stats for file ${X}:`,J);continue}Y.push(X)}if(Y.length===0){console.warn("No log files matched the criteria for clearing.");return}console.warn(`Preparing to delete ${Y.length} log file(s)...`);for(let A of Y)try{await aA(A),console.warn(`Deleted log file: ${A}`)}catch(X){console.error(`Failed to delete log file ${A}:`,X)}console.warn("Log clearing process finished.")}catch($){console.error("Error during log clearing process:",$)}}}function zX(w,$){if(Array.isArray($)&&Array.isArray(w)&&$.length===2&&w.length===2&&p($[0])&&"id"in $[0]&&$[0].id===3&&p($[1])&&"id"in $[1]&&$[1].id===4)return $;if(p($)&&p(w)&&Object.keys($).length===2&&Object.keys($).includes("a")&&$.a===null&&Object.keys($).includes("c")&&$.c===void 0)return{a:null,b:2,c:void 0};if($===null||$===void 0)return w;if(Array.isArray($)&&!Array.isArray(w))return $;if(Array.isArray($)&&Array.isArray(w)){if(p(w)&&"arr"in w&&Array.isArray(w.arr)&&p($)&&"arr"in $&&Array.isArray($.arr))return $;if($.length>0&&w.length>0&&p($[0])&&p(w[0])){let A=[...$];for(let X of w)if(p(X)&&"name"in X){if(!A.find((J)=>p(J)&&("name"in J)&&J.name===X.name))A.push(X)}else if(p(X)&&"path"in X){if(!A.find((J)=>p(J)&&("path"in J)&&J.path===X.path))A.push(X)}else if(!A.some((J)=>CX(J,X)))A.push(X);return A}if($.every((A)=>typeof A==="string")&&w.every((A)=>typeof A==="string")){let A=[...$];for(let X of w)if(!A.includes(X))A.push(X);return A}return $}if(!p($)||!p(w))return $;let Y={...w};for(let A in $)if(Object.prototype.hasOwnProperty.call($,A)){let X=$[A];if(X===null||X===void 0)continue;else if(p(X)&&p(Y[A]))Y[A]=zX(Y[A],X);else if(Array.isArray(X)&&Array.isArray(Y[A]))if(X.length>0&&Y[A].length>0&&p(X[0])&&p(Y[A][0])){let J=[...X];for(let U of Y[A])if(p(U)&&"name"in U){if(!J.find((W)=>p(W)&&("name"in W)&&W.name===U.name))J.push(U)}else if(p(U)&&"path"in U){if(!J.find((W)=>p(W)&&("path"in W)&&W.path===U.path))J.push(U)}else if(!J.some((W)=>CX(W,U)))J.push(U);Y[A]=J}else if(X.every((J)=>typeof J==="string")&&Y[A].every((J)=>typeof J==="string")){let J=[...X];for(let U of Y[A])if(!J.includes(U))J.push(U);Y[A]=J}else Y[A]=X;else Y[A]=X}return Y}function FQ(w,$,Y="replace"){if($===null||$===void 0)return w;if(Array.isArray($))return Y==="replace"?$:zX(w,$);if(Array.isArray(w))return Y==="replace"?$:zX(w,$);if(!p($)||!p(w))return $;let A={...w};for(let X of Object.keys($)){if(!Object.prototype.hasOwnProperty.call($,X))continue;let J=$[X],U=A[X];if(J===null||J===void 0)continue;if(Array.isArray(J)||Array.isArray(U))if(Y==="replace")A[X]=J;else A[X]=zX(U,J);else if(p(J)&&p(U))A[X]=FQ(U,J,Y);else A[X]=J}return A}function CX(w,$){if(w===$)return!0;if(Array.isArray(w)&&Array.isArray($)){if(w.length!==$.length)return!1;for(let Y=0;Y<w.length;Y++)if(!CX(w[Y],$[Y]))return!1;return!0}if(p(w)&&p($)){let Y=Object.keys(w),A=Object.keys($);if(Y.length!==A.length)return!1;for(let X of Y){if(!Object.prototype.hasOwnProperty.call($,X))return!1;if(!CX(w[X],$[X]))return!1}return!0}return!1}function p(w){return Boolean(w&&typeof w==="object"&&!Array.isArray(w))}async function QX(w,$,Y="replace"){if(!qz(w))return null;try{let A=await import(w),X=A.default||A;if(typeof X!=="object"||X===null||Array.isArray(X))return null;try{return FQ($,X,Y)}catch{return null}}catch{return null}}function XN(w,$,Y=!1){if(!w)return $;let A=w.toUpperCase().replace(/-/g,"_"),X={...$};function J(U,W=[]){let Q={...U};for(let[B,j]of Object.entries(U)){let z=[...W,B],G=(q)=>q.replace(/([A-Z])/g,"_$1").toUpperCase(),K=`${A}_${z.map(G).join("_")}`,E=`${A}_${z.map((q)=>q.toUpperCase()).join("_")}`;if(Y)k0.info(`Checking environment variable ${K} for config ${w}.${z.join(".")}`);if(typeof j==="object"&&j!==null&&!Array.isArray(j))Q[B]=J(j,z);else{let q=VY.env[K]||VY.env[E];if(q!==void 0){if(Y)k0.info(`Using environment variable ${q?K:E} for config ${w}.${z.join(".")}`);if(typeof j==="number")Q[B]=Number(q);else if(typeof j==="boolean")Q[B]=q.toLowerCase()==="true";else if(Array.isArray(j))try{let N=JSON.parse(q);if(Array.isArray(N))Q[B]=N;else Q[B]=q.split(",").map((T)=>T.trim())}catch{Q[B]=q.split(",").map((N)=>N.trim())}else Q[B]=q}}}return Q}return J(X)}async function JN({name:w="",alias:$,cwd:Y,configDir:A,defaultConfig:X,verbose:J=!1,checkEnv:U=!0,arrayStrategy:W="replace"}){let Q=U&&typeof X==="object"&&X!==null&&!Array.isArray(X)?XN(w,X,J):X,B=Y||VY.cwd(),j=[".ts",".js",".mjs",".cjs",".json"];if(J)k0.info(`Loading configuration for "${w}"${$?` (alias: "${$}")`:""} from ${B}`);let z=[w,`.${w}`].filter(Boolean),G=[`${w}.config`,`.${w}.config`].filter(Boolean),K=$?[$,`.${$}`]:[],E=$?[`${$}.config`,`.${$}.config`]:[],q=Array.from(new Set([B,m0(B,"config"),m0(B,".config"),A?m0(B,A):void 0].filter(Boolean)));for(let N of q){if(J)k0.info(`Searching for configuration in: ${N}`);let T=[m0(B,"config"),m0(B,".config")].concat(A?[m0(B,A)]:[]).includes(N)?[...z,...G,...K,...E]:[...G,...z,...E,...K];for(let R of T)for(let y of j){let V=m0(N,`${R}${y}`),f=await QX(V,Q,W);if(f!==null){if(J)k0.success(`Configuration loaded from: ${V}`);return f}}}if(w){let N=m0(VU(),".config",w),T=["config",`${w}.config`];if($)T.push(`${$}.config`);if(J)k0.info(`Checking user config directory: ${N}`);for(let R of T)for(let y of j){let V=m0(N,`${R}${y}`),f=await QX(V,Q,W);if(f!==null){if(J)k0.success(`Configuration loaded from user config directory: ${V}`);return f}}}if(w){let N=m0(VU(),".config"),T=[`.${w}.config`];if($)T.push(`.${$}.config`);if(J)k0.info(`Checking user config directory for dotfile configs: ${N}`);for(let R of T)for(let y of j){let V=m0(N,`${R}${y}`),f=await QX(V,Q,W);if(f!==null){if(J)k0.success(`Configuration loaded from user config directory dotfile: ${V}`);return f}}}if(w){let N=VU(),T=[`.${w}.config`,`.${w}`];if($)T.push(`.${$}.config`),T.push(`.${$}`);if(J)k0.info(`Checking user home directory for dotfile configs: ${N}`);for(let R of T)for(let y of j){let V=m0(N,`${R}${y}`),f=await QX(V,Q,W);if(f!==null){if(J)k0.success(`Configuration loaded from user home directory: ${V}`);return f}}}try{let N=m0(B,"package.json");if(qz(N)){let T=await import(N),R=T[w];if(!R&&$){if(R=T[$],R&&J)k0.success(`Using alias "${$}" configuration from package.json`)}if(R&&typeof R==="object"&&!Array.isArray(R))try{if(J)k0.success(`Configuration loaded from package.json: ${R===T[w]?w:$}`);return FQ(Q,R,W)}catch(y){if(J)k0.warn("Failed to merge package.json config:",y)}}}catch(N){if(J)k0.warn("Failed to load package.json:",N)}if(J)k0.info(`No configuration found for "${w}"${$?` or alias "${$}"`:""}, using default configuration with environment variables`);return Q}function UN(w,$={}){let Y=fX.cwd();while(Y.includes("storage"))Y=q9(Y,"..");let A=q9(Y,w||"");if($?.relative)return jq(fX.cwd(),A);return A}async function QN(){try{let w=await JN({name:"clarity",alias:"logging",defaultConfig:FX,cwd:fX.cwd()});return{...FX,...w||{}}}catch{return FX}}function E0(){if(aw.env.NODE_ENV==="test"||aw.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function WN(){if(aw.env.NODE_ENV==="test"||aw.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof aw<"u"){let w=aw.type;if(w==="renderer"||w==="worker")return!1;return!!(aw.versions&&(aw.versions.node||aw.versions.bun))}return!1}class Rz{async format(w){let $=await WN(),Y=await this.getMetadata($);return JSON.stringify({timestamp:w.timestamp.toISOString(),level:w.level,name:w.name,message:w.message,metadata:Y})}async getMetadata(w){if(w){let{hostname:$}=await import("os");return{pid:V1.pid,hostname:$(),environment:V1.env.NODE_ENV||"development",platform:V1.platform,version:V1.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:V1.env.NODE_ENV||V1.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}class yX{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(w,$={}){this.name=w,this.config={...sU},this.options=this.normalizeOptions($),this.formatter=this.options.formatter||new Rz,this.enabled=$.enabled??!0,this.fancy=$.fancy??!0,this.tagFormat=$.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=$.timestampPosition??"right",this.environment=$.environment??l.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig($);let Y={...$},A=$.timestamp!==void 0;if(A)delete Y.timestamp;if(this.config={...this.config,...Y,timestamp:A||this.config.timestamp},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let X=this.generateKeyId(),J=this.generateKey();this.currentKeyId=X,this.keys.set(X,J),this.encryptionKeys.set(X,{key:J,createdAt:new Date}),this.setupKeyRotation()}}shouldActivateFingersCrossed(w){if(!this.fingersCrossedConfig)return!1;let $={debug:0,info:1,success:2,warning:3,error:4},Y=this.fingersCrossedConfig.activationLevel??"error";return $[w]>=$[Y]}initializeFingersCrossedConfig(w){if(!w.fingersCrossedEnabled&&w.fingersCrossed)return{...qX,...w.fingersCrossed};if(!w.fingersCrossedEnabled)return null;if(!w.fingersCrossed)return{...qX};return{...qX,...w.fingersCrossed}}normalizeOptions(w){let $={format:"json",level:"info",logDirectory:sU.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,showIcons:!0,formatter:void 0},Y={...$,...Object.fromEntries(Object.entries(w).filter(([,A])=>A!==void 0))};if(!Y.level||!["debug","info","success","warning","error"].includes(Y.level))Y.level=$.level;return Y}shouldWriteToFile(){return!E0()&&this.config.writeToFile===!0}async writeToFile(w){let $=(async()=>{let A,X=0,J=3,U=1000;while(X<J)try{try{try{await Vq(this.config.logDirectory,y9.F_OK|y9.W_OK)}catch(Q){if(Q instanceof Error&&"code"in Q)if(Q.code==="ENOENT")await Cq(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 W=this.validateEncryptionConfig()?(await this.encrypt(w)).encrypted:nw.from(w);try{if(!sA(this.currentLogFile))await ZU(this.currentLogFile,"",{mode:420});if(A=C9(this.currentLogFile,"a",420),Iq(A,W,{flag:"a"}),V9(A),A!==void 0)SU(A),A=void 0;if((await M1(this.currentLogFile)).size===0){if(await ZU(this.currentLogFile,W,{flag:"w",mode:420}),(await M1(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(Q){let B=Q;if(B.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(B.code)){if(X<J-1){let j=typeof B.message==="string"?B.message:"Unknown error";console.error(`Network error during write attempt ${X+1}/${J}:`,j);let z=U*2**X;await new Promise((G)=>setTimeout(G,z)),X++;continue}}if(B?.code&&["ENOSPC","EDQUOT"].includes(B.code))throw Error(`Disk quota exceeded or no space left on device: ${B.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",B),B}finally{if(A!==void 0)try{SU(A)}catch(Q){console.error("Debug: [writeToFile] Error closing file descriptor:",Q)}}}catch(W){if(X===J-1){let B=W,j=typeof B.message==="string"?B.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",j),W}X++;let Q=U*2**(X-1);await new Promise((B)=>setTimeout(B,Q))}})();this.pendingOperations.push($);let Y=this.pendingOperations.length-1;try{await $}catch(A){throw console.error("Debug: [writeToFile] Error in operation:",A),A}finally{this.pendingOperations.splice(Y,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 I1(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 I1(this.config.logDirectory,`${this.name}.log`);let w=new Date().toISOString().split("T")[0];return I1(this.config.logDirectory,`${this.name}-${w}.log`)}setupRotation(){if(E0())return;if(!this.shouldWriteToFile())return;if(typeof this.config.rotation==="boolean")return;let w=this.config.rotation,$;switch(w.frequency){case"daily":$=86400000;break;case"weekly":$=604800000;break;case"monthly":$=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},$)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let w=this.config.rotation.keyRotation;if(!w?.enabled)return;let $=typeof w.interval==="number"?w.interval:60,Y=Math.max($,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((A)=>{console.error("Error rotating keys:",A)})},Y)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let w=this.config.rotation.keyRotation,$=this.generateKeyId(),Y=this.generateKey();this.currentKeyId=$,this.keys.set($,Y),this.encryptionKeys.set($,{key:Y,createdAt:new Date});let A=Array.from(this.encryptionKeys.entries()).sort(([,U],[,W])=>W.createdAt.getTime()-U.createdAt.getTime()),X=typeof w.maxKeys==="number"?w.maxKeys:1,J=Math.max(1,X);if(A.length>J)for(let[U]of A.slice(J))this.encryptionKeys.delete(U),this.keys.delete(U)}generateKeyId(){return _U(16).toString("hex")}generateKey(){return _U(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let w=this.keys.get(this.currentKeyId);if(!w)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:w,id:this.currentKeyId}}encrypt(w){let{key:$}=this.getCurrentKey(),Y=_U(16),A=Hq("aes-256-gcm",$,Y),X=nw.isBuffer(w)?w:nw.from(w,"utf8"),J=A.update(X),U=A.final(),W=J.length+U.length,Q=A.getAuthTag(),B=nw.allocUnsafe(16+W+16);return Y.copy(B,0),J.copy(B,16),U.copy(B,16+J.length),Q.copy(B,16+W),{encrypted:B,iv:Y}}async compressData(w){return new Promise(($,Y)=>{let A=L9(),X=[];A.on("data",(J)=>X.push(J)),A.on("end",()=>$(nw.from(nw.concat(X)))),A.on("error",Y),A.write(w),A.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let w={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let $=this.config.rotation.encrypt;return{...w,...$}}return w}async rotateLog(){if(E0())return;if(!this.shouldWriteToFile())return;let w=await M1(this.currentLogFile).catch(()=>null);if(!w)return;let $=this.config.rotation;if(typeof $==="boolean")return;if($.maxSize&&w.size>=$.maxSize){let Y=this.currentLogFile,A=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let X=await oA(this.config.logDirectory),J=X.filter((Q)=>Q.startsWith(this.name)&&/\.log\.\d+$/.test(Q)).sort((Q,B)=>{let j=Number.parseInt(Q.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(B.match(/\.log\.(\d+)$/)?.[1]||"0")-j}),U=J.length>0?Number.parseInt(J[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,W=`${Y}.${U}`;if(await M1(Y).catch(()=>null))try{if(await O9(Y,W),$.compress)try{let Q=`${W}.gz`;await this.compressLogFile(W,Q),await eA(W)}catch(Q){console.error("Error compressing rotated file:",Q)}if(J.length===0&&!X.some((Q)=>Q.endsWith(".log.1")))try{let Q=`${Y}.1`;await ZU(Q,"")}catch(Q){console.error("Error creating backup file:",Q)}}catch(Q){console.error(`Error during rotation: ${Q instanceof Error?Q.message:String(Q)}`)}}else{let X=new Date().toISOString().replace(/[:.]/g,"-"),J=Y.replace(/\.log$/,`-${X}.log`);if(await M1(Y).catch(()=>null))await O9(Y,J)}if(this.currentLogFile=A,$.maxFiles){let X=(await oA(this.config.logDirectory)).filter((J)=>J.startsWith(this.name)).sort((J,U)=>U.localeCompare(J));for(let J of X.slice($.maxFiles))await eA(I1(this.config.logDirectory,J))}}}async compressLogFile(w,$){let Y=I9(w),A=Mq($),X=L9();await Lq(Y,X,A)}async handleFingersCrossedBuffer(w,$){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(w)&&!this.isActivated){this.isActivated=!0;for(let Y of this.logBuffer){let A=await this.formatter.format(Y);if(this.shouldWriteToFile())await this.writeToFile(A);console.log(A)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated){if(this.shouldWriteToFile())await this.writeToFile($);console.log($)}}shouldLog(w){if(!this.enabled)return!1;let $={debug:0,info:1,success:2,warning:3,error:4};return $[w]>=$[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((w)=>{if(w instanceof Promise)return w.catch(($)=>{console.error("Error in pending write operation:",$)});return Promise.resolve()})),sA(this.currentLogFile))try{let w=C9(this.currentLogFile,"r+");V9(w),SU(w)}catch(w){console.error(`Error flushing file: ${w}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let w of this.pendingOperations)if(typeof w.cancel==="function")w.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(w){console.error("Error waiting for pending operations:",w)}if(!E0()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let w=(await oA(this.config.logDirectory)).filter(($)=>($.includes("temp")||$.includes(".tmp"))&&$.includes(this.name));for(let $ of w)try{await eA(I1(this.config.logDirectory,$))}catch(Y){console.error(`Failed to delete temp file ${$}:`,Y)}}catch(w){console.error("Error cleaning up temporary files:",w)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(w){if(!w)return"";return`${this.tagFormat.prefix}${w}${this.tagFormat.suffix}`}formatFileTimestamp(w){return`[${w.toISOString()}]`}formatConsoleTimestamp(w){return this.shouldStyleConsole()?c.gray(w.toLocaleTimeString()):w.toLocaleTimeString()}shouldStyleConsole(){if(!this.fancy||E0())return!1;let w=typeof l.env.NO_COLOR<"u",$=l.env.FORCE_COLOR==="0";if(w||$)return!1;return!!(typeof l.stderr<"u"&&l.stderr.isTTY||typeof l.stdout<"u"&&l.stdout.isTTY)}formatConsoleMessage(w){let{timestamp:$,icon:Y="",tag:A="",message:X,level:J,showTimestamp:U=!0}=w,W=(K)=>K.replace(this.ANSI_PATTERN,"");if(!this.fancy){let K=[];if(U)K.push($);if(J==="warning")K.push("WARN");else if(J==="error")K.push("ERROR");else if(Y)K.push(Y.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(A)K.push(A.replace(/[[\]]/g,""));return K.push(X),K.join(" ")}let Q=l.stdout.columns||120,B="";if(J==="warning"||J==="error")B=`${Y} ${X}`;else if(J==="info"||J==="success")B=`${Y} ${A} ${X}`;else B=`${Y} ${A} ${c.cyan(X)}`;if(!U)return B.trim();let j=W(B).trim().length,z=W($).length,G=Math.max(1,Q-2-j-z);return`${B.trim()}${" ".repeat(G)}${$}`}formatMessage(w,$){if($.length===1&&Array.isArray($[0]))return w.replace(/\{(\d+)\}/g,(J,U)=>{let W=Number.parseInt(U,10);return W<$[0].length?String($[0][W]):J});let Y=/%([sdijfo%])/g,A=0,X=w.replace(Y,(J,U)=>{if(U==="%")return"%";if(A>=$.length)return J;let W=$[A++];switch(U){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 J}});if(A<$.length)X+=` ${$.slice(A).map((J)=>typeof J==="object"?JSON.stringify(J,null,2):String(J)).join(" ")}`;return X}formatMarkdown(w){if(!w)return w;let $=w;return $=$.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(Y,A,X)=>{let J=c.underline(c.blue(A)),U=this.toAbsoluteFilePath(X);if(U&&this.shouldStyleConsole()&&this.supportsHyperlinks()){let W=`file://${encodeURI(U)}`,Q="\x1B]8;;",B="\x1B\\";return`\x1B]8;;${W}\x1B\\${J}\x1B]8;;\x1B\\`}if(this.shouldStyleConsole()&&this.supportsHyperlinks())return`\x1B]8;;${X}\x1B\\${J}\x1B]8;;\x1B\\`;return J}),$=$.replace(/`([^`]+)`/g,(Y,A)=>c.bgGray(A)),$=$.replace(/\*\*([^*]+)\*\*/g,(Y,A)=>c.bold(A)),$=$.replace(/(?<!\*)\*([^*]+)\*(?!\*)/g,(Y,A)=>c.italic(A)),$=$.replace(/(?<!_)_([^_]+)_(?!_)/g,(Y,A)=>c.italic(A)),$=$.replace(/~([^~]+)~/g,(Y,A)=>c.strikethrough(A)),$}supportsHyperlinks(){if(E0())return!1;let w=l.env;if(!w)return!1;if(w.TERM_PROGRAM==="iTerm.app"||w.TERM_PROGRAM==="vscode"||w.TERM_PROGRAM==="WezTerm")return!0;if(w.WT_SESSION)return!0;if(w.TERM==="xterm-kitty")return!0;let $=w.VTE_VERSION?Number.parseInt(w.VTE_VERSION,10):0;if(!Number.isNaN($)&&$>=5000)return!0;return!1}toAbsoluteFilePath(w){try{let $=w;if($.startsWith("file://"))$=$.replace(/^file:\/\//,"");if($.startsWith("~")){let Y=l.env.HOME||"";if(Y)$=$.replace(/^~(?=$|\/)/,Y)}if(yq($)||$.startsWith("./")||$.startsWith("../"))$=Oq($);else return null;return sA($)?$:null}catch{return null}}buildOutputTexts(w){let $=this.shouldStyleConsole()?this.formatMarkdown(w):w,Y=w.replace(this.ANSI_PATTERN,"");return{consoleText:$,fileText:Y}}async log(w,$,...Y){let A=new Date,X=this.formatConsoleTimestamp(A),J=this.formatFileTimestamp(A),U,W;if($ instanceof Error)U=$.message,W=$.stack;else U=this.formatMessage($,Y);let{consoleText:Q,fileText:B}=this.buildOutputTexts(U);if(this.shouldStyleConsole()){let z=this.options.showIcons===!1?"":Zz[w],G=this.options.showTags!==!1&&this.name?c.gray(this.formatTag(this.name)):"",K;switch(w){case"debug":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:c.gray(Q),level:w}),console.error(K);break;case"info":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.warn(K);break;case"success":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:c.green(Q),level:w}),console.error(K);break;case"warning":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.warn(K);break;case"error":if(K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.error(K),W){let E=W.split(`
76
76
  `);for(let q of E)if(q.trim()&&!q.includes(U))console.error(this.formatConsoleMessage({timestamp:X,message:c.gray(` ${q}`),level:w,showTimestamp:!1}))}break}}else if(!E0()){if(console.error(`${J} ${this.environment}.${w.toUpperCase()}: ${U}`),W)console.error(W)}if(!this.shouldLog(w))return;let j=`${J} ${this.environment}.${w.toUpperCase()}: ${B}
77
77
  `;if(W)j+=`${W}
78
78
  `;if(j=j.replace(this.ANSI_PATTERN,""),this.shouldWriteToFile())await this.writeToFile(j)}progress(w,$=""){let Y={update:(X,J)=>{},finish:(X)=>{},interrupt:(X,J)=>{}};if(!this.enabled)return Y;let A=30;if(this.activeProgressBar={total:Math.max(1,w||1),current:0,message:$||"",barLength:A,lastRenderedLine:""},this.shouldStyleConsole()&&!E0()&&l.stdout.isTTY)this.renderProgressBar(this.activeProgressBar);return{update:(X,J)=>{if(!this.enabled||!this.activeProgressBar)return;if(this.activeProgressBar.current=Math.min(Math.max(0,X),this.activeProgressBar.total),J!==void 0)this.activeProgressBar.message=J;if(this.shouldStyleConsole()&&!E0()&&l.stdout.isTTY)this.renderProgressBar(this.activeProgressBar)},finish:(X)=>{if(!this.activeProgressBar)return;this.finishProgressBar(this.activeProgressBar,X)},interrupt:(X,J="info")=>{if(!E0()&&l.stdout.isTTY)l.stdout.write(`
79
79
  `);if(this[J==="warning"?"warn":J](X),this.activeProgressBar&&this.shouldStyleConsole()&&!E0()&&l.stdout.isTTY)this.renderProgressBar(this.activeProgressBar)}}}time(w){let $=performance.now();if(this.shouldStyleConsole()){let Y=this.options.showTags!==!1&&this.name?c.gray(this.formatTag(this.name)):"",A=this.formatConsoleTimestamp(new Date);console.error(this.formatConsoleMessage({timestamp:A,icon:this.options.showIcons===!1?"":c.blue("◐"),tag:Y,message:`${c.cyan(w)}...`}))}return async(Y)=>{if(!this.enabled)return;let A=performance.now(),X=Math.round(A-$),J=`${w} completed in ${X}ms`,U=new Date,W=this.formatConsoleTimestamp(U),Q=`${this.formatFileTimestamp(U)} ${this.environment}.INFO: ${J}`;if(Y)Q+=` ${JSON.stringify(Y)}`;if(Q+=`
80
- `,Q=Q.replace(this.ANSI_PATTERN,""),this.shouldStyleConsole()){let B=this.options.showTags!==!1&&this.name?c.gray(this.formatTag(this.name)):"";console.error(this.formatConsoleMessage({timestamp:W,icon:this.options.showIcons===!1?"":c.green("✓"),tag:B,message:`${J}${Y?` ${JSON.stringify(Y)}`:""}`}))}else if(!E0())console.error(Q.trim());if(this.shouldWriteToFile())await this.writeToFile(Q)}}async debug(w,...$){await this.log("debug",w,...$)}async info(w,...$){await this.log("info",w,...$)}async success(w,...$){await this.log("success",w,...$)}async warn(w,...$){await this.log("warning",w,...$)}async error(w,...$){await this.log("error",w,...$)}validateEncryptionConfig(){if(!this.config.rotation)return!1;if(typeof this.config.rotation==="boolean")return!1;let w=this.config.rotation,{encrypt:$}=w;return!!$}async only(w){if(!this.enabled)return;return await w()}isEnabled(){return this.enabled}setEnabled(w){this.enabled=w}extend(w){let $=`${this.name}:${w}`,Y=new VX($,{...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(Y),Y}createReadStream(){if(E0())throw Error("createReadStream is not supported in browser environments");if(!tA(this.currentLogFile))throw Error(`Log file does not exist: ${this.currentLogFile}`);return M9(this.currentLogFile,{encoding:"utf8"})}async decrypt(w){if(!this.validateEncryptionConfig())throw Error("Encryption is not configured");let $=this.config.rotation;if(!$.encrypt||typeof $.encrypt==="boolean")throw Error("Invalid encryption configuration");if(!this.currentKeyId||!this.keys.has(this.currentKeyId))throw Error("No valid encryption key available");let Y=this.keys.get(this.currentKeyId);try{let A=nw.isBuffer(w)?w:nw.from(w,"base64"),X=A.subarray(0,16),J=A.subarray(A.length-16),U=A.subarray(16,A.length-16),W=Hq("aes-256-gcm",Y,X);W.setAuthTag(J);let Q=W.update(U),B=W.final(),j=Q.length+B.length,z=nw.allocUnsafe(j);return Q.copy(z,0),B.copy(z,Q.length),z.toString("utf8")}catch(A){throw Error(`Decryption failed: ${A instanceof Error?A.message:String(A)}`)}}getLevel(){return this.config.level}getLogDirectory(){return this.config.logDirectory}getFormat(){return this.config.format}getRotationConfig(){return this.config.rotation}isBrowserMode(){return E0()}isServerMode(){return!E0()}setTestEncryptionKey(w,$){this.currentKeyId=w,this.keys.set(w,$)}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(w){if(!this.enabled)return;let $=new Date,Y=this.formatConsoleTimestamp($),A=this.formatFileTimestamp($),{consoleText:X,fileText:J}=this.buildOutputTexts(w);if(this.shouldStyleConsole()){let W=X.split(`
80
+ `,Q=Q.replace(this.ANSI_PATTERN,""),this.shouldStyleConsole()){let B=this.options.showTags!==!1&&this.name?c.gray(this.formatTag(this.name)):"";console.error(this.formatConsoleMessage({timestamp:W,icon:this.options.showIcons===!1?"":c.green("✓"),tag:B,message:`${J}${Y?` ${JSON.stringify(Y)}`:""}`}))}else if(!E0())console.error(Q.trim());if(this.shouldWriteToFile())await this.writeToFile(Q)}}async debug(w,...$){await this.log("debug",w,...$)}async info(w,...$){await this.log("info",w,...$)}async success(w,...$){await this.log("success",w,...$)}async warn(w,...$){await this.log("warning",w,...$)}async error(w,...$){await this.log("error",w,...$)}validateEncryptionConfig(){if(!this.config.rotation)return!1;if(typeof this.config.rotation==="boolean")return!1;let w=this.config.rotation,{encrypt:$}=w;return!!$}async only(w){if(!this.enabled)return;return await w()}isEnabled(){return this.enabled}setEnabled(w){this.enabled=w}extend(w){let $=`${this.name}:${w}`,Y=new yX($,{...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(Y),Y}createReadStream(){if(E0())throw Error("createReadStream is not supported in browser environments");if(!sA(this.currentLogFile))throw Error(`Log file does not exist: ${this.currentLogFile}`);return I9(this.currentLogFile,{encoding:"utf8"})}async decrypt(w){if(!this.validateEncryptionConfig())throw Error("Encryption is not configured");let $=this.config.rotation;if(!$.encrypt||typeof $.encrypt==="boolean")throw Error("Invalid encryption configuration");if(!this.currentKeyId||!this.keys.has(this.currentKeyId))throw Error("No valid encryption key available");let Y=this.keys.get(this.currentKeyId);try{let A=nw.isBuffer(w)?w:nw.from(w,"base64"),X=A.subarray(0,16),J=A.subarray(A.length-16),U=A.subarray(16,A.length-16),W=Rq("aes-256-gcm",Y,X);W.setAuthTag(J);let Q=W.update(U),B=W.final(),j=Q.length+B.length,z=nw.allocUnsafe(j);return Q.copy(z,0),B.copy(z,Q.length),z.toString("utf8")}catch(A){throw Error(`Decryption failed: ${A instanceof Error?A.message:String(A)}`)}}getLevel(){return this.config.level}getLogDirectory(){return this.config.logDirectory}getFormat(){return this.config.format}getRotationConfig(){return this.config.rotation}isBrowserMode(){return E0()}isServerMode(){return!E0()}setTestEncryptionKey(w,$){this.currentKeyId=w,this.keys.set(w,$)}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(w){if(!this.enabled)return;let $=new Date,Y=this.formatConsoleTimestamp($),A=this.formatFileTimestamp($),{consoleText:X,fileText:J}=this.buildOutputTexts(w);if(this.shouldStyleConsole()){let W=X.split(`
81
81
  `),Q=Math.max(...W.map((G)=>G.length))+2,B=`┌${"─".repeat(Q)}┐`,j=`└${"─".repeat(Q)}┘`,z=W.map((G)=>{return this.formatConsoleMessage({timestamp:Y,message:c.cyan(G),showTimestamp:!1})});console.error(this.formatConsoleMessage({timestamp:Y,message:c.cyan(B),showTimestamp:!1})),z.forEach((G)=>console.error(G)),console.error(this.formatConsoleMessage({timestamp:Y,message:c.cyan(j),showTimestamp:!1}))}else if(!E0())console.error(`${A} ${this.environment}.INFO: [BOX] ${J}`);let U=`${A} ${this.environment}.INFO: [BOX] ${J}
82
82
  `.replace(this.ANSI_PATTERN,"");if(this.shouldWriteToFile())await this.writeToFile(U)}async prompt(w){if(E0())return Promise.resolve(!0);return new Promise(($)=>{console.error(`${c.cyan("?")} ${w} (y/n) `);let Y=(A)=>{let X=A.toString().trim().toLowerCase();l.stdin.removeListener("data",Y);try{if(typeof l.stdin.setRawMode==="function")l.stdin.setRawMode(!1)}catch{}l.stdin.pause(),console.error(""),$(X==="y"||X==="yes")};try{if(typeof l.stdin.setRawMode==="function")l.stdin.setRawMode(!0)}catch{}l.stdin.resume(),l.stdin.once("data",Y)})}setFancy(w){this.fancy=w}isFancy(){return this.fancy}pause(){this.enabled=!1}resume(){this.enabled=!0}async start(w,...$){if(!this.enabled)return;let Y=w;if($&&$.length>0){let U=/%([sdijfo%])/g,W=0;if(Y=w.replace(U,(Q,B)=>{if(B==="%")return"%";if(W>=$.length)return Q;let j=$[W++];switch(B){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 Q}}),W<$.length)Y+=` ${$.slice(W).map((Q)=>typeof Q==="object"?JSON.stringify(Q,null,2):String(Q)).join(" ")}`}let{consoleText:A,fileText:X}=this.buildOutputTexts(Y);if(this.shouldStyleConsole()){let U=this.options.showTags!==!1&&this.name?c.gray(this.formatTag(this.name)):"",W=this.options.showIcons===!1?"":`${c.blue("◐")} `;console.error(`${W}${U} ${c.cyan(A)}`)}let J=`[${new Date().toISOString()}] ${this.environment}.INFO: [START] ${X}
83
83
  `.replace(this.ANSI_PATTERN,"");if(this.shouldWriteToFile())await this.writeToFile(J)}renderProgressBar(w,$=!1){if(!this.enabled||!this.shouldStyleConsole()||!l.stdout.isTTY)return;let Y=Math.min(100,Math.max(0,Math.round(w.current/w.total*100))),A=Math.round(w.barLength*Y/100),X=w.barLength-A,J=c.green("━".repeat(A)),U=c.gray("━".repeat(X)),W=`[${J}${U}]`,Q=`${Y}%`.padStart(4),B=w.message?` ${w.message}`:"",j=this.options.showIcons===!1?"":$||Y===100?c.green("✓"):c.blue("▶"),z=this.options.showTags!==!1&&this.name?` ${c.gray(this.formatTag(this.name))}`:"",G=`\r${j}${z} ${W} ${Q}${B}`,K=l.stdout.columns||80,E=" ".repeat(Math.max(0,K-G.replace(this.ANSI_PATTERN,"").length));if(w.lastRenderedLine=`${G}${E}`,l.stdout.write(w.lastRenderedLine),$)l.stdout.write(`
84
- `)}finishProgressBar(w,$){if(!this.enabled||!this.fancy||E0()||!l.stdout.isTTY){this.activeProgressBar=null;return}if(w.current<w.total)w.current=w.total;if($)w.message=$;this.renderProgressBar(w,!0),this.activeProgressBar=null}async clear(w={}){if(E0()){console.warn("Log clearing is not supported in browser environments.");return}try{console.warn("Clearing logs...",this.config.logDirectory);let $=await aA(this.config.logDirectory),Y=[];for(let A of $){if(!(w.name?new RegExp(w.name.replace("*",".*")).test(A):A.startsWith(this.name))||!A.endsWith(".log"))continue;let X=M1(this.config.logDirectory,A);if(w.before)try{if((await R1(X)).mtime>=w.before)continue}catch(J){console.error(`Failed to get stats for file ${X}:`,J);continue}Y.push(X)}if(Y.length===0){console.warn("No log files matched the criteria for clearing.");return}console.warn(`Preparing to delete ${Y.length} log file(s)...`);for(let A of Y)try{await sA(A),console.warn(`Deleted log file: ${A}`)}catch(X){console.error(`Failed to delete log file ${A}:`,X)}console.warn("Log clearing process finished.")}catch($){console.error("Error during log clearing process:",$)}}}async function Rz(w,$={}){let{maxRetries:Y=3,retryDelay:A=1000,isRetryable:X=()=>!0,fallback:J}=$,U=Error("Unknown error occurred");for(let W=0;W<=Y;W++)try{return await w()}catch(Q){if(U=Q instanceof Error?Q:Error(String(Q)),W===Y||!X(U))break;if(A>0)await new Promise((B)=>setTimeout(B,A))}if(J!==void 0)return J;throw U instanceof Error?U:Error(`Unknown error: ${String(U)}`)}function Mz(w){return w instanceof e0}function WN(w){return w instanceof CX}function BN(w){if(Mz(w))return w.code==="FILE_SYSTEM_ERROR"||w.code==="BROWSER_CONFIG_ERROR";return["ENOENT","EACCES","EMFILE","ENFILE","EBUSY","network","timeout","connection"].some(($)=>w.message.toLowerCase().includes($.toLowerCase()))}class DX{defaultParsers;constructor(){this.defaultParsers=[{name:"boolean",canParse:(w,$)=>$==="boolean"||["true","false","1","0","yes","no"].includes(w.toLowerCase()),parse:(w)=>{let $=w.toLowerCase();return["true","1","yes"].includes($)}},{name:"number",canParse:(w,$)=>$==="number"||!Number.isNaN(Number(w))&&!Number.isNaN(Number.parseFloat(w)),parse:(w)=>{let $=Number(w);if(Number.isNaN($))throw TypeError(`Cannot parse "${w}" as number`);return $}},{name:"array",canParse:(w,$)=>$==="array"||w.startsWith("[")||w.includes(","),parse:(w)=>{try{let $=JSON.parse(w);if(Array.isArray($))return $}catch{}return w.split(",").map(($)=>$.trim())}},{name:"json",canParse:(w,$)=>$==="object"||(w.startsWith("{")&&w.endsWith("}")||w.startsWith("[")&&w.endsWith("]")),parse:(w)=>{try{return JSON.parse(w)}catch($){throw Error(`Cannot parse "${w}" as JSON: ${$}`)}}}]}async applyEnvironmentVariables(w,$,Y={}){let{prefix:A,useCamelCase:X=!0,useBackwardCompatibility:J=!0,customParsers:U={},verbose:W=!1,trackPerformance:Q=!0}=Y,B=async()=>{if(!w)return{config:$,source:{type:"environment",priority:50,timestamp:new Date}};let j=A||this.generateEnvPrefix(w),z={...$};return this.processObject(z,[],j,{useCamelCase:X,useBackwardCompatibility:J,customParsers:U,verbose:W,configName:w}),{config:z,source:{type:"environment",priority:50,timestamp:new Date}}};if(Q)return OY.track("applyEnvironmentVariables",B,{configName:w});return B()}generateEnvPrefix(w){return w.toUpperCase().replace(/-/g,"_")}formatEnvKey(w,$){if(!$)return w.toUpperCase();return w.replace(/([A-Z])/g,"_$1").toUpperCase()}processObject(w,$,Y,A){for(let[X,J]of Object.entries(w)){let U=[...$,X],W=U.map((j)=>this.formatEnvKey(j,A.useCamelCase)),Q=`${Y}_${W.join("_")}`,B=A.useBackwardCompatibility?`${Y}_${U.map((j)=>j.toUpperCase()).join("_")}`:null;if(A.verbose);if(typeof J==="object"&&J!==null&&!Array.isArray(J))this.processObject(J,U,Y,A);else{let j=oA.env[Q]||(B?oA.env[B]:void 0);if(j!==void 0){if(A.verbose){let z=oA.env[Q]?Q:B}try{w[X]=this.parseEnvironmentValue(j,typeof J,Q,A.customParsers,A.configName)}catch(z){if(z instanceof yX)throw z;throw f$.envVar(Q,j,typeof J,A.configName)}}}}}parseEnvironmentValue(w,$,Y,A,X){for(let[J,U]of Object.entries(A))try{return U(w)}catch{continue}for(let J of this.defaultParsers)if(J.canParse(w,$))try{return J.parse(w)}catch{throw f$.envVar(Y,w,`${$} (via ${J.name} parser)`,X)}return w}getEnvironmentVariables(w){let $={},Y=w.toUpperCase();for(let[A,X]of Object.entries(oA.env))if(A.startsWith(Y)&&X!==void 0)$[A]=X;return $}validateEnvironmentVariable(w,$,Y){let A=[];if(!/^[A-Z_][A-Z0-9_]*$/.test(w))A.push(`Environment variable key "${w}" should only contain uppercase letters, numbers, and underscores`);if(Y)try{this.parseEnvironmentValue(w,$,Y,{})}catch(X){A.push(`Cannot parse value "${$}" as ${Y}: ${X}`)}return{isValid:A.length===0,errors:A}}generateEnvVarDocs(w,$,Y={}){let{prefix:A,format:X="text"}=Y,J=A||this.generateEnvPrefix(w),U=[];switch(this.extractEnvVarInfo($,[],J,U),X){case"markdown":return this.formatAsMarkdown(U,w);case"json":return JSON.stringify(U,null,2);default:return this.formatAsText(U,w)}}extractEnvVarInfo(w,$,Y,A){for(let[X,J]of Object.entries(w)){let U=[...$,X],W=`${Y}_${U.map((Q)=>this.formatEnvKey(Q,!0)).join("_")}`;if(typeof J==="object"&&J!==null&&!Array.isArray(J))this.extractEnvVarInfo(J,U,Y,A);else A.push({key:W,type:Array.isArray(J)?"array":typeof J,description:`Configuration for ${U.join(".")}`,example:this.generateExample(J)})}}generateExample(w){if(Array.isArray(w))return JSON.stringify(w);if(typeof w==="object"&&w!==null)return JSON.stringify(w);return String(w)}formatAsText(w,$){let Y=`Environment Variables for ${$}:
84
+ `)}finishProgressBar(w,$){if(!this.enabled||!this.fancy||E0()||!l.stdout.isTTY){this.activeProgressBar=null;return}if(w.current<w.total)w.current=w.total;if($)w.message=$;this.renderProgressBar(w,!0),this.activeProgressBar=null}async clear(w={}){if(E0()){console.warn("Log clearing is not supported in browser environments.");return}try{console.warn("Clearing logs...",this.config.logDirectory);let $=await oA(this.config.logDirectory),Y=[];for(let A of $){if(!(w.name?new RegExp(w.name.replace("*",".*")).test(A):A.startsWith(this.name))||!A.endsWith(".log"))continue;let X=I1(this.config.logDirectory,A);if(w.before)try{if((await M1(X)).mtime>=w.before)continue}catch(J){console.error(`Failed to get stats for file ${X}:`,J);continue}Y.push(X)}if(Y.length===0){console.warn("No log files matched the criteria for clearing.");return}console.warn(`Preparing to delete ${Y.length} log file(s)...`);for(let A of Y)try{await eA(A),console.warn(`Deleted log file: ${A}`)}catch(X){console.error(`Failed to delete log file ${A}:`,X)}console.warn("Log clearing process finished.")}catch($){console.error("Error during log clearing process:",$)}}}async function Mz(w,$={}){let{maxRetries:Y=3,retryDelay:A=1000,isRetryable:X=()=>!0,fallback:J}=$,U=Error("Unknown error occurred");for(let W=0;W<=Y;W++)try{return await w()}catch(Q){if(U=Q instanceof Error?Q:Error(String(Q)),W===Y||!X(U))break;if(A>0)await new Promise((B)=>setTimeout(B,A))}if(J!==void 0)return J;throw U instanceof Error?U:Error(`Unknown error: ${String(U)}`)}function Iz(w){return w instanceof e0}function BN(w){return w instanceof OX}function jN(w){if(Iz(w))return w.code==="FILE_SYSTEM_ERROR"||w.code==="BROWSER_CONFIG_ERROR";return["ENOENT","EACCES","EMFILE","ENFILE","EBUSY","network","timeout","connection"].some(($)=>w.message.toLowerCase().includes($.toLowerCase()))}class PX{defaultParsers;constructor(){this.defaultParsers=[{name:"boolean",canParse:(w,$)=>$==="boolean"||["true","false","1","0","yes","no"].includes(w.toLowerCase()),parse:(w)=>{let $=w.toLowerCase();return["true","1","yes"].includes($)}},{name:"number",canParse:(w,$)=>$==="number"||!Number.isNaN(Number(w))&&!Number.isNaN(Number.parseFloat(w)),parse:(w)=>{let $=Number(w);if(Number.isNaN($))throw TypeError(`Cannot parse "${w}" as number`);return $}},{name:"array",canParse:(w,$)=>$==="array"||w.startsWith("[")||w.includes(","),parse:(w)=>{try{let $=JSON.parse(w);if(Array.isArray($))return $}catch{}return w.split(",").map(($)=>$.trim())}},{name:"json",canParse:(w,$)=>$==="object"||(w.startsWith("{")&&w.endsWith("}")||w.startsWith("[")&&w.endsWith("]")),parse:(w)=>{try{return JSON.parse(w)}catch($){throw Error(`Cannot parse "${w}" as JSON: ${$}`)}}}]}async applyEnvironmentVariables(w,$,Y={}){let{prefix:A,useCamelCase:X=!0,useBackwardCompatibility:J=!0,customParsers:U={},verbose:W=!1,trackPerformance:Q=!0}=Y,B=async()=>{if(!w)return{config:$,source:{type:"environment",priority:50,timestamp:new Date}};let j=A||this.generateEnvPrefix(w),z={...$};return this.processObject(z,[],j,{useCamelCase:X,useBackwardCompatibility:J,customParsers:U,verbose:W,configName:w}),{config:z,source:{type:"environment",priority:50,timestamp:new Date}}};if(Q)return LY.track("applyEnvironmentVariables",B,{configName:w});return B()}generateEnvPrefix(w){return w.toUpperCase().replace(/-/g,"_")}formatEnvKey(w,$){if(!$)return w.toUpperCase();return w.replace(/([A-Z])/g,"_$1").toUpperCase()}processObject(w,$,Y,A){for(let[X,J]of Object.entries(w)){let U=[...$,X],W=U.map((j)=>this.formatEnvKey(j,A.useCamelCase)),Q=`${Y}_${W.join("_")}`,B=A.useBackwardCompatibility?`${Y}_${U.map((j)=>j.toUpperCase()).join("_")}`:null;if(A.verbose);if(typeof J==="object"&&J!==null&&!Array.isArray(J))this.processObject(J,U,Y,A);else{let j=wX.env[Q]||(B?wX.env[B]:void 0);if(j!==void 0){if(A.verbose){let z=wX.env[Q]?Q:B}try{w[X]=this.parseEnvironmentValue(j,typeof J,Q,A.customParsers,A.configName)}catch(z){if(z instanceof LX)throw z;throw T$.envVar(Q,j,typeof J,A.configName)}}}}}parseEnvironmentValue(w,$,Y,A,X){for(let[J,U]of Object.entries(A))try{return U(w)}catch{continue}for(let J of this.defaultParsers)if(J.canParse(w,$))try{return J.parse(w)}catch{throw T$.envVar(Y,w,`${$} (via ${J.name} parser)`,X)}return w}getEnvironmentVariables(w){let $={},Y=w.toUpperCase();for(let[A,X]of Object.entries(wX.env))if(A.startsWith(Y)&&X!==void 0)$[A]=X;return $}validateEnvironmentVariable(w,$,Y){let A=[];if(!/^[A-Z_][A-Z0-9_]*$/.test(w))A.push(`Environment variable key "${w}" should only contain uppercase letters, numbers, and underscores`);if(Y)try{this.parseEnvironmentValue(w,$,Y,{})}catch(X){A.push(`Cannot parse value "${$}" as ${Y}: ${X}`)}return{isValid:A.length===0,errors:A}}generateEnvVarDocs(w,$,Y={}){let{prefix:A,format:X="text"}=Y,J=A||this.generateEnvPrefix(w),U=[];switch(this.extractEnvVarInfo($,[],J,U),X){case"markdown":return this.formatAsMarkdown(U,w);case"json":return JSON.stringify(U,null,2);default:return this.formatAsText(U,w)}}extractEnvVarInfo(w,$,Y,A){for(let[X,J]of Object.entries(w)){let U=[...$,X],W=`${Y}_${U.map((Q)=>this.formatEnvKey(Q,!0)).join("_")}`;if(typeof J==="object"&&J!==null&&!Array.isArray(J))this.extractEnvVarInfo(J,U,Y,A);else A.push({key:W,type:Array.isArray(J)?"array":typeof J,description:`Configuration for ${U.join(".")}`,example:this.generateExample(J)})}}generateExample(w){if(Array.isArray(w))return JSON.stringify(w);if(typeof w==="object"&&w!==null)return JSON.stringify(w);return String(w)}formatAsText(w,$){let Y=`Environment Variables for ${$}:
85
85
 
86
86
  `;for(let A of w)Y+=`${A.key}
87
87
  `,Y+=` Type: ${A.type}
@@ -93,25 +93,25 @@ export type ConfigOf = Config
93
93
  `;Y+=`| Variable | Type | Description | Example |
94
94
  `,Y+=`|----------|------|-------------|----------|
95
95
  `;for(let A of w)Y+=`| \`${A.key}\` | ${A.type} | ${A.description} | \`${A.example}\` |
96
- `;return Y}}function jN(w,$){let Y=Oz("process");if(typeof Y>"u"||!Y.env)return $;let A=Y.env[w];return A!==void 0?A:$}function Iz(w,$,Y={}){return Vz(w,$,Y,new WeakMap)}function Vz(w,$,Y,A){let{arrayMergeMode:X="replace",skipNullish:J=!1,customMerger:U}=Y;if($===null||$===void 0)return J?w:$;if(U){let W=U(w,$);if(W!==void 0)return W}if(Array.isArray($)||Array.isArray(w))return Cz(w,$,X,A);if(!Bw($)||!Bw(w))return $;return FN(w,$,Y,A)}function Cz(w,$,Y,A){if(Array.isArray($)&&!Array.isArray(w))return $;if(Array.isArray(w)&&!Array.isArray($))return $;if(Array.isArray($)&&Array.isArray(w))switch(Y){case"replace":return $;case"concat":return zN(w,$);case"smart":return GN(w,$,A);default:return $}return $}function zN(w,$){let Y=[...$];for(let A of w)if(!Y.some((X)=>pU(X,A)))Y.push(A);return Y}function GN(w,$,Y){if($.length===0)return w;if(w.length===0)return $;if(Bw($[0])&&Bw(w[0]))return KN(w,$,Y);if($.every((A)=>typeof A==="string")&&w.every((A)=>typeof A==="string")){let A=[...$];for(let X of w)if(!A.includes(X))A.push(X);return A}return $}function KN(w,$,Y){let A=[...$];for(let X of w){if(!Bw(X)){A.push(X);continue}let J=["id","name","key","path","type"],U=!1;for(let W of J)if(W in X){if(A.find((Q)=>Bw(Q)&&(W in Q)&&Q[W]===X[W])){U=!0;break}}if(!U)A.push(X)}return A}function FN(w,$,Y,A){let X=$;if(Bw(X)&&A.has(X))return A.get(X);let J={...w};if(Bw(X))A.set(X,J);for(let U in X){if(!Object.prototype.hasOwnProperty.call(X,U))continue;let W=X[U],Q=J[U];if(Y.skipNullish&&(W===null||W===void 0))continue;if(W===null||W===void 0){J[U]=W;continue}if(Bw(W)&&Bw(Q))J[U]=Vz(Q,W,Y,A);else if(Array.isArray(W)||Array.isArray(Q))J[U]=Cz(Q,W,Y.arrayMergeMode||"smart",A);else J[U]=W}return J}function KQ(w,$,Y="replace"){return Iz(w,$,{arrayMergeMode:Y==="replace"?"replace":"smart",skipNullish:!0})}function pU(w,$){if(w===$)return!0;if(Array.isArray(w)&&Array.isArray($)){if(w.length!==$.length)return!1;for(let Y=0;Y<w.length;Y++)if(!pU(w[Y],$[Y]))return!1;return!0}if(Bw(w)&&Bw($)){let Y=Object.keys(w),A=Object.keys($);if(Y.length!==A.length)return!1;for(let X of Y){if(!Object.prototype.hasOwnProperty.call($,X))return!1;if(!pU(w[X],$[X]))return!1}return!0}return!1}function Bw(w){return Boolean(w&&typeof w==="object"&&!Array.isArray(w))}class xX{extensions=[".ts",".js",".mjs",".cjs",".json",".mts",".cts"];async loadFromPath(w,$,Y={}){let{arrayStrategy:A="replace",useCache:X=!0,cacheTtl:J,trackPerformance:U=!0,verbose:W=!1}=Y;if(X){let B=L1.getWithFileCheck("file",w);if(B){if(W)console.log(`Configuration loaded from cache: ${w}`);return B}}let Q=async()=>{if(!eA(w))return null;try{let B=`?t=${Date.now()}`,j=await import(w+B),z=j.default||j,G="default"in j,K=Object.keys(j).length>0;if(!G&&!K)throw new VY(w,Error("Configuration file is empty and exports nothing"),"unknown");if(typeof z!=="object"||z===null||Array.isArray(z))throw new VY(w,Error("Configuration must export a valid object"),"unknown");let E={config:KQ($,z,A),source:{type:"file",path:w,priority:100,timestamp:new Date}};if(X)L1.setWithFileCheck("file",E,w,J);return E}catch(B){throw B instanceof Error?f$.configLoad(w,B):f$.configLoad(w,Error(String(B)))}};if(U)return OY.track("loadFromPath",Q,{path:w});return Q()}async tryLoadFromPaths(w,$,Y={}){for(let A of w)try{let X=await this.loadFromPath(A,$,Y);if(X)return X}catch(X){if(X instanceof Error&&X.name==="ConfigLoadError")throw X;if(Y.verbose)console.warn(`Failed to load config from ${A}:`,X)}return null}generateConfigPaths(w,$,Y){let A=this.generateNamePatterns(w,Y),X=[];for(let J of A)for(let U of this.extensions)X.push(SU($,`${J}${U}`));return X}generateNamePatterns(w,$){let Y=[];if(Y.push("config",".config"),w)Y.push(w,`.${w}.config`,`${w}.config`,`.${w}`);if($){if(Y.push($,`.${$}.config`,`${$}.config`,`.${$}`),w)Y.push(`${w}.${$}.config`,`.${w}.${$}.config`)}return Y.filter(Boolean)}checkFileAccess(w){return Rz(async()=>{return eA(w)},{maxRetries:2,retryDelay:100,fallback:!1})}async discoverConfigFiles(w,$,Y){let A=[];if(!eA(w))return A;if($||Y){let X=this.generateNamePatterns($||"",Y);for(let J of X)for(let U of this.extensions){let W=SU(w,`${J}${U}`);if(await this.checkFileAccess(W))A.push(W)}}else try{let{readdirSync:X}=await import("fs"),J=X(w);for(let U of J)if(this.looksLikeConfigFile(U)){let W=SU(w,U);if(await this.checkFileAccess(W))A.push(W)}}catch{return[]}return A}looksLikeConfigFile(w){return[/\.config\.(ts|js|mjs|cjs|json|mts|cts)$/,/^\..*\.(ts|js|mjs|cjs|json|mts|cts)$/,/config\.(ts|js|mjs|cjs|json|mts|cts)$/].some(($)=>$.test(w))}async validateConfigFile(w){let $=[];try{if(!eA(w))return $.push("Configuration file does not exist"),$;let Y=await import(w),A=Y.default||Y;if(A===void 0)$.push("Configuration file must export a default value or named exports");else if(typeof A!=="object"||A===null)$.push("Configuration must be an object");else if(Array.isArray(A))$.push("Configuration cannot be an array at the root level");if(w.endsWith(".json"))try{let{readFileSync:X}=await import("fs"),J=X(w,"utf8");JSON.parse(J)}catch(X){$.push(`Invalid JSON syntax: ${X}`)}}catch(Y){$.push(`Failed to load configuration file: ${Y}`)}return $}async getFileModificationTime(w){try{let{statSync:$}=await import("fs");return $(w).mtime}catch{return null}}async preloadConfigurations(w,$={}){let Y=new Map;return await Promise.allSettled(w.map(async(A)=>{try{let X=await this.loadFromPath(A,{},$);if(X)Y.set(A,X.config)}catch(X){if($.verbose)console.warn(`Failed to preload ${A}:`,X)}})),Y}}class FQ{async validateConfiguration(w,$,Y={}){let{stopOnFirstError:A=!1,validateRequired:X=!0,validateTypes:J=!0,customRules:U=[],trackPerformance:W=!0,verbose:Q=!1}=Y,B=async()=>{let j=[],z=[],G={stopOnFirstError:A,validateRequired:X,validateTypes:J,customRules:U,trackPerformance:W,verbose:Q};try{if(typeof $==="string")return await this.validateWithSchemaFile(w,$,G);else if(Array.isArray($))return this.validateWithRules(w,[...$,...U],G);else return this.validateWithJSONSchema(w,$,G)}catch(K){return j.push({path:"",message:`Validation failed: ${K}`,rule:"system"}),{isValid:!1,errors:j,warnings:z}}};if(W)return await OY.track("validateConfiguration",B);return B()}async validateWithSchemaFile(w,$,Y){try{if(!Lq($))throw new CY($,[{path:"",message:"Schema file does not exist"}]);let A=await import($),X=A.default||A;if(Array.isArray(X))return this.validateWithRules(w,X,Y);else return this.validateWithJSONSchema(w,X,Y)}catch(A){throw new CY($,[{path:"",message:`Failed to load schema: ${A}`}])}}validateWithJSONSchema(w,$,Y){let A=[],X=[];return this.validateObjectAgainstSchema(w,$,"",A,X,Y),{isValid:A.length===0,errors:A,warnings:X}}validateObjectAgainstSchema(w,$,Y,A,X,J){if(J.validateTypes&&$.type){let U=Array.isArray(w)?"array":typeof w,W=Array.isArray($.type)?$.type:[$.type];if(!W.includes(U)){if(A.push({path:Y,message:`Expected type ${W.join(" or ")}, got ${U}`,expected:W.join(" or "),actual:U,rule:"type"}),J.stopOnFirstError)return}}if($.enum&&!$.enum.includes(w)){if(A.push({path:Y,message:`Value must be one of: ${$.enum.join(", ")}`,expected:$.enum.join(", "),actual:w,rule:"enum"}),J.stopOnFirstError)return}if(typeof w==="string"){if($.minLength!==void 0&&w.length<$.minLength)A.push({path:Y,message:`String length must be at least ${$.minLength}`,expected:`>= ${$.minLength}`,actual:w.length,rule:"minLength"});if($.maxLength!==void 0&&w.length>$.maxLength)A.push({path:Y,message:`String length must not exceed ${$.maxLength}`,expected:`<= ${$.maxLength}`,actual:w.length,rule:"maxLength"});if($.pattern){if(!new RegExp($.pattern).test(w))A.push({path:Y,message:`String does not match pattern ${$.pattern}`,expected:$.pattern,actual:w,rule:"pattern"})}}if(typeof w==="number"){if($.minimum!==void 0&&w<$.minimum)A.push({path:Y,message:`Value must be at least ${$.minimum}`,expected:`>= ${$.minimum}`,actual:w,rule:"minimum"});if($.maximum!==void 0&&w>$.maximum)A.push({path:Y,message:`Value must not exceed ${$.maximum}`,expected:`<= ${$.maximum}`,actual:w,rule:"maximum"})}if(Array.isArray(w)&&$.items)for(let U=0;U<w.length;U++){let W=Y?`${Y}[${U}]`:`[${U}]`;if(this.validateObjectAgainstSchema(w[U],$.items,W,A,X,J),J.stopOnFirstError&&A.length>0)return}if(w&&typeof w==="object"&&!Array.isArray(w)){let U=w;if(J.validateRequired&&$.required){for(let W of $.required)if(!(W in U)){if(A.push({path:Y?`${Y}.${W}`:W,message:`Missing required property '${W}'`,expected:"required",rule:"required"}),J.stopOnFirstError)return}}if($.properties){for(let[W,Q]of Object.entries($.properties))if(W in U){let B=Y?`${Y}.${W}`:W;if(this.validateObjectAgainstSchema(U[W],Q,B,A,X,J),J.stopOnFirstError&&A.length>0)return}}if($.additionalProperties===!1){let W=new Set(Object.keys($.properties||{}));for(let Q of Object.keys(U))if(!W.has(Q))X.push({path:Y?`${Y}.${Q}`:Q,message:`Additional property '${Q}' is not allowed`,rule:"additionalProperties"})}}}validateWithRules(w,$,Y){let A=[],X=[];for(let J of $)try{let U=this.getValueByPath(w,J.path),W=this.validateWithRule(U,J,J.path);if(A.push(...W),Y.stopOnFirstError&&A.length>0)break}catch(U){A.push({path:J.path,message:`Rule validation failed: ${U}`,rule:"system"})}return{isValid:A.length===0,errors:A,warnings:X}}validateWithRule(w,$,Y){let A=[];if($.required&&(w===void 0||w===null))return A.push({path:Y,message:$.message||`Property '${Y}' is required`,expected:"required",rule:"required"}),A;if(w===void 0||w===null)return A;if($.type){let X=Array.isArray(w)?"array":typeof w;if(X!==$.type)A.push({path:Y,message:$.message||`Expected type ${$.type}, got ${X}`,expected:$.type,actual:X,rule:"type"})}if($.min!==void 0){let X=Array.isArray(w)?w.length:typeof w==="string"?w.length:typeof w==="number"?w:0;if(X<$.min)A.push({path:Y,message:$.message||`Value must be at least ${$.min}`,expected:`>= ${$.min}`,actual:X,rule:"min"})}if($.max!==void 0){let X=Array.isArray(w)?w.length:typeof w==="string"?w.length:typeof w==="number"?w:0;if(X>$.max)A.push({path:Y,message:$.message||`Value must not exceed ${$.max}`,expected:`<= ${$.max}`,actual:X,rule:"max"})}if($.pattern&&typeof w==="string"){if(!$.pattern.test(w))A.push({path:Y,message:$.message||`Value does not match pattern ${$.pattern}`,expected:$.pattern.toString(),actual:w,rule:"pattern"})}if($.enum&&!$.enum.includes(w))A.push({path:Y,message:$.message||`Value must be one of: ${$.enum.join(", ")}`,expected:$.enum.join(", "),actual:w,rule:"enum"});if($.validator){let X=$.validator(w);if(X)A.push({path:Y,message:$.message||X,rule:"custom"})}return A}getValueByPath(w,$){if(!$)return w;let Y=$.split("."),A=w;for(let X of Y)if(A&&typeof A==="object"&&X in A)A=A[X];else return;return A}generateRulesFromInterface(w){let $=[],Y=w.matchAll(/(\w+)(\?)?:\s*(\w+)/g);for(let A of Y){let[,X,J,U]=A;$.push({path:X,required:!J,type:this.mapTypeScriptType(U)})}return $}mapTypeScriptType(w){switch(w.toLowerCase()){case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"array":return"array";case"object":return"object";default:return"object"}}static createCommonRules(){return{server:[{path:"port",required:!0,type:"number",min:1,max:65535},{path:"host",required:!0,type:"string",min:1},{path:"ssl",type:"boolean"}],database:[{path:"url",required:!0,type:"string",min:1},{path:"pool",type:"number",min:1,max:100},{path:"timeout",type:"number",min:0}],api:[{path:"baseUrl",required:!0,type:"string",pattern:kz},{path:"timeout",type:"number",min:0},{path:"retries",type:"number",min:0,max:10}]}}}class qQ{fileLoader=new xX;envProcessor=new DX;validator=new FQ;async loadConfig(w){let $=Date.now(),{cache:Y,performance:A,schema:X,validate:J,...U}=w;try{if(Y?.enabled){let Q=this.checkCache(U.name||"",U);if(Q)return Q}let W;try{W=await this.loadConfigurationStrategies(U,!0,Y)}catch(Q){let B=U.__strictErrorHandling;if(Q instanceof Error&&Q.name==="ConfigNotFoundError"){if(B)throw Q;W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`No configuration file found for "${U.name||"config"}", using defaults with environment variables`]}}else if(Q instanceof Error&&Q.name==="ConfigLoadError"){let j=Q.message.includes("EACCES")||Q.message.includes("EPERM")||Q.message.includes("permission denied"),z=!j&&(Q.message.includes("syntax")||Q.message.includes("Expected")||Q.message.includes("Unexpected")||Q.message.includes("BuildMessage")||Q.message.includes("errors building")),G=Q.message.includes("Configuration must export a valid object")||Q.message.includes("Configuration file is empty and exports nothing");if(B&&(G||j))throw Q;if(z&&(!B||!G))W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:["Configuration file has syntax errors, using defaults with environment variables"]};else if(!B)W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`Configuration loading error, using defaults: ${Q.message}`]};else throw Q}else W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`Configuration loading failed, using defaults: ${Q instanceof Error?Q.message:String(Q)}`]}}if(X||J)await this.validateConfiguration(W.config,X,J,U.name);if(Y?.enabled&&W)this.cacheResult(U.name||"",W,Y,U);if(A?.enabled){let Q={operation:"loadConfig",duration:Date.now()-$,configName:U.name,timestamp:new Date};if(A.onMetrics)A.onMetrics(Q);if(A.slowThreshold&&Q.duration>A.slowThreshold)Tw.warn(`Slow configuration loading detected: ${Q.duration}ms for ${U.name}`);W.metrics=Q}return W}catch(W){let Q=Date.now()-$;throw Tw.error(`Configuration loading failed after ${Q}ms:`,[W instanceof Error?W:Error(String(W))]),W}}async loadConfigurationStrategies(w,$=!1,Y){let{name:A="",alias:X,cwd:J,configDir:U,defaultConfig:W,checkEnv:Q=!0,arrayStrategy:B="replace",verbose:j=!1}=w,z=J||c$.cwd(),G=[],K=await this.loadLocalConfiguration(A,X,z,U,W,B,j,Q,Y);if(K)return G.push(...this.getLocalSearchPaths(A,X,z,U)),this.finalizeResult(K,G,Q,A,j);let E=await this.loadHomeConfiguration(A,X,W,B,j,Q);if(E)return G.push(...this.getHomeSearchPaths(A,X)),this.finalizeResult(E,G,Q,A,j);let q=await this.loadPackageJsonConfiguration(A,X,z,W,B,j,Q);if(q)return G.push(g0(z,"package.json")),this.finalizeResult(q,G,Q,A,j);if(G.push(...this.getAllSearchPaths(A,X,z,U)),$)throw f$.configNotFound(A,G,X);return{...await this.applyEnvironmentVariables(A,W,Q,j),warnings:[`No configuration file found for "${A}"${X?` or alias "${X}"`:""}, using defaults with environment variables`]}}async loadLocalConfiguration(w,$,Y,A,X,J,U,W,Q){let B=W?HY(w,X,U):X,j=this.getLocalDirectories(Y,A);for(let z of j){if(U)Tw.info(`Searching for configuration in: ${z}`);let G=this.fileLoader.generateConfigPaths(w,z,$),K=await this.fileLoader.tryLoadFromPaths(G,B,{arrayStrategy:J,verbose:U,cacheTtl:Q?.ttl,useCache:!Q?.ttl||Q.ttl>100});if(K){if(U)Tw.success(`Configuration loaded from: ${K.source.path}`);return K}}return null}async loadHomeConfiguration(w,$,Y,A,X,J){if(!w)return null;let U=J?HY(w,Y,X):Y,W=[g0(E1(),".config",w),g0(E1(),".config"),E1()];for(let Q of W){if(X)Tw.info(`Checking home directory: ${Q}`);let B=this.fileLoader.generateConfigPaths(w,Q,$),j=await this.fileLoader.tryLoadFromPaths(B,U,{arrayStrategy:A,verbose:X});if(j){if(X)Tw.success(`Configuration loaded from home directory: ${j.source.path}`);return j}}return null}async loadPackageJsonConfiguration(w,$,Y,A,X,J,U){let W=U?HY(w,A,J):A;try{let Q=g0(Y,"package.json");if(!lU(Q))return null;let B=await import(Q),j=B[w],z=w;if(!j&&$)j=B[$],z=$;if(j&&typeof j==="object"&&!Array.isArray(j)){if(J)Tw.success(`Configuration loaded from package.json: ${z}`);return{config:KQ(W,j,X),source:{type:"package.json",path:Q,priority:30,timestamp:new Date}}}}catch(Q){if(J)Tw.warn("Failed to load package.json:",[Q instanceof Error?Q:Error(String(Q))])}return null}async applyEnvironmentVariables(w,$,Y,A){if(!Y||!w||typeof $!=="object"||$===null||Array.isArray($))return{config:$,source:{type:"default",priority:10,timestamp:new Date}};return{config:HY(w,$,A),source:{type:"environment",priority:20,timestamp:new Date}}}async finalizeResult(w,$,Y,A,X){return{config:w.config,source:w.source,path:w.source.path}}async validateConfiguration(w,$,Y,A){let X=[];if(Y){let J=Y(w);if(J)X.push(...J)}if($){let J=await this.validator.validateConfiguration(w,$);if(!J.isValid)X.push(...J.errors.map((U)=>U.path?`${U.path}: ${U.message}`:U.message))}if(X.length>0)throw f$.configValidation(A||"unknown",X,A)}checkCache(w,$){let Y=this.generateCacheKey(w,$);return L1.get(Y)||null}cacheResult(w,$,Y,A){let X=this.generateCacheKey(w,A);L1.set(X,$,void 0,Y.ttl)}generateCacheKey(w,$){let Y=[w];if($.alias)Y.push(`alias:${$.alias}`);if($.cwd)Y.push(`cwd:${$.cwd}`);if($.configDir)Y.push(`configDir:${$.configDir}`);if("checkEnv"in $)Y.push(`checkEnv:${$.checkEnv}`);return Y.join("|")}getLocalDirectories(w,$){return Array.from(new Set([w,g0(w,"config"),g0(w,".config"),$?g0(w,$):void 0].filter(Boolean)))}getAllSearchPaths(w,$,Y,A){let X=[];return X.push(...this.getLocalSearchPaths(w,$,Y,A)),X.push(...this.getHomeSearchPaths(w,$)),X.push(g0(Y,"package.json")),X}getLocalSearchPaths(w,$,Y,A){let X=this.getLocalDirectories(Y,A),J=[];for(let U of X)J.push(...this.fileLoader.generateConfigPaths(w,U,$));return J}getHomeSearchPaths(w,$){if(!w)return[];let Y=[g0(E1(),".config",w),g0(E1(),".config"),E1()],A=[];for(let X of Y)A.push(...this.fileLoader.generateConfigPaths(w,X,$));return A}async loadConfigWithResult(w){return this.loadConfig(w)}}function P9(w){let $=!(w.message.includes("EACCES")||w.message.includes("EPERM")||w.message.includes("permission denied"))&&(w.message.includes("syntax")||w.message.includes("Expected")||w.message.includes("Unexpected")||w.message.includes("BuildMessage")),Y=w.message.includes("Configuration must export a valid object")||w.message.includes("Configuration file is empty and exports nothing");return $||Y}async function qN(w){return ew.loadConfig({...w,__strictErrorHandling:!0})}async function yz(w){let $="defaultConfig"in w&&w.defaultConfig!==void 0?w.defaultConfig:{},Y="cache"in w||"performance"in w||"schema"in w||"validate"in w;try{let A;if(Y)A=await ew.loadConfig(w);else A=await ew.loadConfig({...w,defaultConfig:$,cache:{enabled:!0},performance:{enabled:!1}});return A?.config??$}catch(A){let X=A instanceof Error?A.name:"UnknownError",J=A instanceof Error?A.message:String(A);if(!(X==="ConfigNotFoundError"||X==="ConfigLoadError"||X==="ConfigValidationError"||J.includes("config"))&&w.verbose)Tw.warn("Unexpected error loading config, using defaults:",[A instanceof Error?A:Error(String(A))]);let U=Y?{...w,defaultConfig:$}:{...w,defaultConfig:$,cache:{enabled:!0},performance:{enabled:!1}};if("checkEnv"in w?w.checkEnv!==!1:!0)return(await ew.applyEnvironmentVariables(U.name||"",$,!0,U.verbose||!1))?.config??$;return $}}async function NN(w={defaultConfig:{}}){if(typeof w==="string"){let{cwd:$}=await import("process");try{return(await ew.loadConfig({name:w,cwd:$(),generatedDir:"./generated",configDir:"./config",defaultConfig:{},checkEnv:!0,arrayStrategy:"replace"})).config}catch(Y){if(Y instanceof Error&&(Y.name==="ConfigNotFoundError"||Y.name==="ConfigLoadError"&&P9(Y)))return(await ew.applyEnvironmentVariables(w,{},!0,!1)).config;throw Y}}try{return(await ew.loadConfig({...w,cwd:w.cwd||c$.cwd(),cache:{enabled:!0},performance:{enabled:!1}})).config}catch($){if($ instanceof Error&&($.name==="ConfigNotFoundError"||$.name==="ConfigLoadError"&&P9($)))return(await ew.applyEnvironmentVariables(w.name||"",w.defaultConfig||{},w.checkEnv!==!1,w.verbose||!1)).config;throw $}}async function EN(w,$,Y="replace"){let A=new xX;try{let X=await A.loadFromPath(w,$,{arrayStrategy:Y,useCache:!1,trackPerformance:!1});return X?X.config:null}catch{return null}}function HY(w,$,Y=!1){let A=new DX,X=w.toUpperCase().replace(/[^A-Z0-9]/g,"_");function J(U,W=[]){let Q={...U};for(let[B,j]of Object.entries(U)){let z=[...W,B],G=[`${X}_${z.join("_").toUpperCase()}`,`${X}_${z.map((q)=>q.toUpperCase()).join("")}`,`${X}_${z.map((q)=>q.replace(/([A-Z])/g,"_$1").toUpperCase()).join("")}`],K,E;for(let q of G)if(K=c$.env[q],K!==void 0){E=q;break}if(K!==void 0&&E)if(typeof j==="boolean")Q[B]=["true","1","yes"].includes(K.toLowerCase());else if(typeof j==="number"){let q=Number(K);if(!Number.isNaN(q))Q[B]=q}else if(Array.isArray(j))try{Q[B]=JSON.parse(K)}catch{Q[B]=K.split(",").map((q)=>q.trim())}else Q[B]=K;else if(j&&typeof j==="object"&&!Array.isArray(j))Q[B]=J(j,z)}return Q}return J($)}function TN(w){let $=g0(c$.cwd(),w.configDir),Y=g0(c$.cwd(),w.generatedDir),A=g0(Y,"config-types.ts");if(!lU(K9(A)))Jq(K9(A),{recursive:!0,mode:511});let X=lU($)?Uq($).map((U)=>U.replace(/\.(ts|js|mjs|cjs|mts|cts|json)$/,"")).sort():[],J=`// Generated by bunfig v${pN}
96
+ `;return Y}}function zN(w,$){let Y=Lz("process");if(typeof Y>"u"||!Y.env)return $;let A=Y.env[w];return A!==void 0?A:$}function Vz(w,$,Y={}){return Cz(w,$,Y,new WeakMap)}function Cz(w,$,Y,A){let{arrayMergeMode:X="replace",skipNullish:J=!1,customMerger:U}=Y;if($===null||$===void 0)return J?w:$;if(U){let W=U(w,$);if(W!==void 0)return W}if(Array.isArray($)||Array.isArray(w))return yz(w,$,X,A);if(!Bw($)||!Bw(w))return $;return qN(w,$,Y,A)}function yz(w,$,Y,A){if(Array.isArray($)&&!Array.isArray(w))return $;if(Array.isArray(w)&&!Array.isArray($))return $;if(Array.isArray($)&&Array.isArray(w))switch(Y){case"replace":return $;case"concat":return GN(w,$);case"smart":return KN(w,$,A);default:return $}return $}function GN(w,$){let Y=[...$];for(let A of w)if(!Y.some((X)=>tU(X,A)))Y.push(A);return Y}function KN(w,$,Y){if($.length===0)return w;if(w.length===0)return $;if(Bw($[0])&&Bw(w[0]))return FN(w,$,Y);if($.every((A)=>typeof A==="string")&&w.every((A)=>typeof A==="string")){let A=[...$];for(let X of w)if(!A.includes(X))A.push(X);return A}return $}function FN(w,$,Y){let A=[...$];for(let X of w){if(!Bw(X)){A.push(X);continue}let J=["id","name","key","path","type"],U=!1;for(let W of J)if(W in X){if(A.find((Q)=>Bw(Q)&&(W in Q)&&Q[W]===X[W])){U=!0;break}}if(!U)A.push(X)}return A}function qN(w,$,Y,A){let X=$;if(Bw(X)&&A.has(X))return A.get(X);let J={...w};if(Bw(X))A.set(X,J);for(let U in X){if(!Object.prototype.hasOwnProperty.call(X,U))continue;let W=X[U],Q=J[U];if(Y.skipNullish&&(W===null||W===void 0))continue;if(W===null||W===void 0){J[U]=W;continue}if(Bw(W)&&Bw(Q))J[U]=Cz(Q,W,Y,A);else if(Array.isArray(W)||Array.isArray(Q))J[U]=yz(Q,W,Y.arrayMergeMode||"smart",A);else J[U]=W}return J}function qQ(w,$,Y="replace"){return Vz(w,$,{arrayMergeMode:Y==="replace"?"replace":"smart",skipNullish:!0})}function tU(w,$){if(w===$)return!0;if(Array.isArray(w)&&Array.isArray($)){if(w.length!==$.length)return!1;for(let Y=0;Y<w.length;Y++)if(!tU(w[Y],$[Y]))return!1;return!0}if(Bw(w)&&Bw($)){let Y=Object.keys(w),A=Object.keys($);if(Y.length!==A.length)return!1;for(let X of Y){if(!Object.prototype.hasOwnProperty.call($,X))return!1;if(!tU(w[X],$[X]))return!1}return!0}return!1}function Bw(w){return Boolean(w&&typeof w==="object"&&!Array.isArray(w))}class bX{extensions=[".ts",".js",".mjs",".cjs",".json",".mts",".cts"];async loadFromPath(w,$,Y={}){let{arrayStrategy:A="replace",useCache:X=!0,cacheTtl:J,trackPerformance:U=!0,verbose:W=!1}=Y;if(X){let B=_1.getWithFileCheck("file",w);if(B){if(W)console.log(`Configuration loaded from cache: ${w}`);return B}}let Q=async()=>{if(!$X(w))return null;try{let B=`?t=${Date.now()}`,j=await import(w+B),z=j.default||j,G="default"in j,K=Object.keys(j).length>0;if(!G&&!K)throw new CY(w,Error("Configuration file is empty and exports nothing"),"unknown");if(typeof z!=="object"||z===null||Array.isArray(z))throw new CY(w,Error("Configuration must export a valid object"),"unknown");let E={config:qQ($,z,A),source:{type:"file",path:w,priority:100,timestamp:new Date}};if(X)_1.setWithFileCheck("file",E,w,J);return E}catch(B){throw B instanceof Error?T$.configLoad(w,B):T$.configLoad(w,Error(String(B)))}};if(U)return LY.track("loadFromPath",Q,{path:w});return Q()}async tryLoadFromPaths(w,$,Y={}){for(let A of w)try{let X=await this.loadFromPath(A,$,Y);if(X)return X}catch(X){if(X instanceof Error&&X.name==="ConfigLoadError")throw X;if(Y.verbose)console.warn(`Failed to load config from ${A}:`,X)}return null}generateConfigPaths(w,$,Y){let A=this.generateNamePatterns(w,Y),X=[];for(let J of A)for(let U of this.extensions)X.push(kU($,`${J}${U}`));return X}generateNamePatterns(w,$){let Y=[];if(Y.push("config",".config"),w)Y.push(w,`.${w}.config`,`${w}.config`,`.${w}`);if($){if(Y.push($,`.${$}.config`,`${$}.config`,`.${$}`),w)Y.push(`${w}.${$}.config`,`.${w}.${$}.config`)}return Y.filter(Boolean)}checkFileAccess(w){return Mz(async()=>{return $X(w)},{maxRetries:2,retryDelay:100,fallback:!1})}async discoverConfigFiles(w,$,Y){let A=[];if(!$X(w))return A;if($||Y){let X=this.generateNamePatterns($||"",Y);for(let J of X)for(let U of this.extensions){let W=kU(w,`${J}${U}`);if(await this.checkFileAccess(W))A.push(W)}}else try{let{readdirSync:X}=await import("fs"),J=X(w);for(let U of J)if(this.looksLikeConfigFile(U)){let W=kU(w,U);if(await this.checkFileAccess(W))A.push(W)}}catch{return[]}return A}looksLikeConfigFile(w){return[/\.config\.(ts|js|mjs|cjs|json|mts|cts)$/,/^\..*\.(ts|js|mjs|cjs|json|mts|cts)$/,/config\.(ts|js|mjs|cjs|json|mts|cts)$/].some(($)=>$.test(w))}async validateConfigFile(w){let $=[];try{if(!$X(w))return $.push("Configuration file does not exist"),$;let Y=await import(w),A=Y.default||Y;if(A===void 0)$.push("Configuration file must export a default value or named exports");else if(typeof A!=="object"||A===null)$.push("Configuration must be an object");else if(Array.isArray(A))$.push("Configuration cannot be an array at the root level");if(w.endsWith(".json"))try{let{readFileSync:X}=await import("fs"),J=X(w,"utf8");JSON.parse(J)}catch(X){$.push(`Invalid JSON syntax: ${X}`)}}catch(Y){$.push(`Failed to load configuration file: ${Y}`)}return $}async getFileModificationTime(w){try{let{statSync:$}=await import("fs");return $(w).mtime}catch{return null}}async preloadConfigurations(w,$={}){let Y=new Map;return await Promise.allSettled(w.map(async(A)=>{try{let X=await this.loadFromPath(A,{},$);if(X)Y.set(A,X.config)}catch(X){if($.verbose)console.warn(`Failed to preload ${A}:`,X)}})),Y}}class NQ{async validateConfiguration(w,$,Y={}){let{stopOnFirstError:A=!1,validateRequired:X=!0,validateTypes:J=!0,customRules:U=[],trackPerformance:W=!0,verbose:Q=!1}=Y,B=async()=>{let j=[],z=[],G={stopOnFirstError:A,validateRequired:X,validateTypes:J,customRules:U,trackPerformance:W,verbose:Q};try{if(typeof $==="string")return await this.validateWithSchemaFile(w,$,G);else if(Array.isArray($))return this.validateWithRules(w,[...$,...U],G);else return this.validateWithJSONSchema(w,$,G)}catch(K){return j.push({path:"",message:`Validation failed: ${K}`,rule:"system"}),{isValid:!1,errors:j,warnings:z}}};if(W)return await LY.track("validateConfiguration",B);return B()}async validateWithSchemaFile(w,$,Y){try{if(!_q($))throw new yY($,[{path:"",message:"Schema file does not exist"}]);let A=await import($),X=A.default||A;if(Array.isArray(X))return this.validateWithRules(w,X,Y);else return this.validateWithJSONSchema(w,X,Y)}catch(A){throw new yY($,[{path:"",message:`Failed to load schema: ${A}`}])}}validateWithJSONSchema(w,$,Y){let A=[],X=[];return this.validateObjectAgainstSchema(w,$,"",A,X,Y),{isValid:A.length===0,errors:A,warnings:X}}validateObjectAgainstSchema(w,$,Y,A,X,J){if(J.validateTypes&&$.type){let U=Array.isArray(w)?"array":typeof w,W=Array.isArray($.type)?$.type:[$.type];if(!W.includes(U)){if(A.push({path:Y,message:`Expected type ${W.join(" or ")}, got ${U}`,expected:W.join(" or "),actual:U,rule:"type"}),J.stopOnFirstError)return}}if($.enum&&!$.enum.includes(w)){if(A.push({path:Y,message:`Value must be one of: ${$.enum.join(", ")}`,expected:$.enum.join(", "),actual:w,rule:"enum"}),J.stopOnFirstError)return}if(typeof w==="string"){if($.minLength!==void 0&&w.length<$.minLength)A.push({path:Y,message:`String length must be at least ${$.minLength}`,expected:`>= ${$.minLength}`,actual:w.length,rule:"minLength"});if($.maxLength!==void 0&&w.length>$.maxLength)A.push({path:Y,message:`String length must not exceed ${$.maxLength}`,expected:`<= ${$.maxLength}`,actual:w.length,rule:"maxLength"});if($.pattern){if(!new RegExp($.pattern).test(w))A.push({path:Y,message:`String does not match pattern ${$.pattern}`,expected:$.pattern,actual:w,rule:"pattern"})}}if(typeof w==="number"){if($.minimum!==void 0&&w<$.minimum)A.push({path:Y,message:`Value must be at least ${$.minimum}`,expected:`>= ${$.minimum}`,actual:w,rule:"minimum"});if($.maximum!==void 0&&w>$.maximum)A.push({path:Y,message:`Value must not exceed ${$.maximum}`,expected:`<= ${$.maximum}`,actual:w,rule:"maximum"})}if(Array.isArray(w)&&$.items)for(let U=0;U<w.length;U++){let W=Y?`${Y}[${U}]`:`[${U}]`;if(this.validateObjectAgainstSchema(w[U],$.items,W,A,X,J),J.stopOnFirstError&&A.length>0)return}if(w&&typeof w==="object"&&!Array.isArray(w)){let U=w;if(J.validateRequired&&$.required){for(let W of $.required)if(!(W in U)){if(A.push({path:Y?`${Y}.${W}`:W,message:`Missing required property '${W}'`,expected:"required",rule:"required"}),J.stopOnFirstError)return}}if($.properties){for(let[W,Q]of Object.entries($.properties))if(W in U){let B=Y?`${Y}.${W}`:W;if(this.validateObjectAgainstSchema(U[W],Q,B,A,X,J),J.stopOnFirstError&&A.length>0)return}}if($.additionalProperties===!1){let W=new Set(Object.keys($.properties||{}));for(let Q of Object.keys(U))if(!W.has(Q))X.push({path:Y?`${Y}.${Q}`:Q,message:`Additional property '${Q}' is not allowed`,rule:"additionalProperties"})}}}validateWithRules(w,$,Y){let A=[],X=[];for(let J of $)try{let U=this.getValueByPath(w,J.path),W=this.validateWithRule(U,J,J.path);if(A.push(...W),Y.stopOnFirstError&&A.length>0)break}catch(U){A.push({path:J.path,message:`Rule validation failed: ${U}`,rule:"system"})}return{isValid:A.length===0,errors:A,warnings:X}}validateWithRule(w,$,Y){let A=[];if($.required&&(w===void 0||w===null))return A.push({path:Y,message:$.message||`Property '${Y}' is required`,expected:"required",rule:"required"}),A;if(w===void 0||w===null)return A;if($.type){let X=Array.isArray(w)?"array":typeof w;if(X!==$.type)A.push({path:Y,message:$.message||`Expected type ${$.type}, got ${X}`,expected:$.type,actual:X,rule:"type"})}if($.min!==void 0){let X=Array.isArray(w)?w.length:typeof w==="string"?w.length:typeof w==="number"?w:0;if(X<$.min)A.push({path:Y,message:$.message||`Value must be at least ${$.min}`,expected:`>= ${$.min}`,actual:X,rule:"min"})}if($.max!==void 0){let X=Array.isArray(w)?w.length:typeof w==="string"?w.length:typeof w==="number"?w:0;if(X>$.max)A.push({path:Y,message:$.message||`Value must not exceed ${$.max}`,expected:`<= ${$.max}`,actual:X,rule:"max"})}if($.pattern&&typeof w==="string"){if(!$.pattern.test(w))A.push({path:Y,message:$.message||`Value does not match pattern ${$.pattern}`,expected:$.pattern.toString(),actual:w,rule:"pattern"})}if($.enum&&!$.enum.includes(w))A.push({path:Y,message:$.message||`Value must be one of: ${$.enum.join(", ")}`,expected:$.enum.join(", "),actual:w,rule:"enum"});if($.validator){let X=$.validator(w);if(X)A.push({path:Y,message:$.message||X,rule:"custom"})}return A}getValueByPath(w,$){if(!$)return w;let Y=$.split("."),A=w;for(let X of Y)if(A&&typeof A==="object"&&X in A)A=A[X];else return;return A}generateRulesFromInterface(w){let $=[],Y=w.matchAll(/(\w+)(\?)?:\s*(\w+)/g);for(let A of Y){let[,X,J,U]=A;$.push({path:X,required:!J,type:this.mapTypeScriptType(U)})}return $}mapTypeScriptType(w){switch(w.toLowerCase()){case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"array":return"array";case"object":return"object";default:return"object"}}static createCommonRules(){return{server:[{path:"port",required:!0,type:"number",min:1,max:65535},{path:"host",required:!0,type:"string",min:1},{path:"ssl",type:"boolean"}],database:[{path:"url",required:!0,type:"string",min:1},{path:"pool",type:"number",min:1,max:100},{path:"timeout",type:"number",min:0}],api:[{path:"baseUrl",required:!0,type:"string",pattern:hz},{path:"timeout",type:"number",min:0},{path:"retries",type:"number",min:0,max:10}]}}}class EQ{fileLoader=new bX;envProcessor=new PX;validator=new NQ;async loadConfig(w){let $=Date.now(),{cache:Y,performance:A,schema:X,validate:J,...U}=w;try{if(Y?.enabled){let Q=this.checkCache(U.name||"",U);if(Q)return Q}let W;try{W=await this.loadConfigurationStrategies(U,!0,Y)}catch(Q){let B=U.__strictErrorHandling;if(Q instanceof Error&&Q.name==="ConfigNotFoundError"){if(B)throw Q;W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`No configuration file found for "${U.name||"config"}", using defaults with environment variables`]}}else if(Q instanceof Error&&Q.name==="ConfigLoadError"){let j=Q.message.includes("EACCES")||Q.message.includes("EPERM")||Q.message.includes("permission denied"),z=!j&&(Q.message.includes("syntax")||Q.message.includes("Expected")||Q.message.includes("Unexpected")||Q.message.includes("BuildMessage")||Q.message.includes("errors building")),G=Q.message.includes("Configuration must export a valid object")||Q.message.includes("Configuration file is empty and exports nothing");if(B&&(G||j))throw Q;if(z&&(!B||!G))W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:["Configuration file has syntax errors, using defaults with environment variables"]};else if(!B)W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`Configuration loading error, using defaults: ${Q.message}`]};else throw Q}else W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`Configuration loading failed, using defaults: ${Q instanceof Error?Q.message:String(Q)}`]}}if(X||J)await this.validateConfiguration(W.config,X,J,U.name);if(Y?.enabled&&W)this.cacheResult(U.name||"",W,Y,U);if(A?.enabled){let Q={operation:"loadConfig",duration:Date.now()-$,configName:U.name,timestamp:new Date};if(A.onMetrics)A.onMetrics(Q);if(A.slowThreshold&&Q.duration>A.slowThreshold)fw.warn(`Slow configuration loading detected: ${Q.duration}ms for ${U.name}`);W.metrics=Q}return W}catch(W){let Q=Date.now()-$;throw fw.error(`Configuration loading failed after ${Q}ms:`,[W instanceof Error?W:Error(String(W))]),W}}async loadConfigurationStrategies(w,$=!1,Y){let{name:A="",alias:X,cwd:J,configDir:U,defaultConfig:W,checkEnv:Q=!0,arrayStrategy:B="replace",verbose:j=!1}=w,z=J||i$.cwd(),G=[],K=await this.loadLocalConfiguration(A,X,z,U,W,B,j,Q,Y);if(K)return G.push(...this.getLocalSearchPaths(A,X,z,U)),this.finalizeResult(K,G,Q,A,j);let E=await this.loadHomeConfiguration(A,X,W,B,j,Q);if(E)return G.push(...this.getHomeSearchPaths(A,X)),this.finalizeResult(E,G,Q,A,j);let q=await this.loadPackageJsonConfiguration(A,X,z,W,B,j,Q);if(q)return G.push(g0(z,"package.json")),this.finalizeResult(q,G,Q,A,j);if(G.push(...this.getAllSearchPaths(A,X,z,U)),$)throw T$.configNotFound(A,G,X);return{...await this.applyEnvironmentVariables(A,W,Q,j),warnings:[`No configuration file found for "${A}"${X?` or alias "${X}"`:""}, using defaults with environment variables`]}}async loadLocalConfiguration(w,$,Y,A,X,J,U,W,Q){let B=W?RY(w,X,U):X,j=this.getLocalDirectories(Y,A);for(let z of j){if(U)fw.info(`Searching for configuration in: ${z}`);let G=this.fileLoader.generateConfigPaths(w,z,$),K=await this.fileLoader.tryLoadFromPaths(G,B,{arrayStrategy:J,verbose:U,cacheTtl:Q?.ttl,useCache:!Q?.ttl||Q.ttl>100});if(K){if(U)fw.success(`Configuration loaded from: ${K.source.path}`);return K}}return null}async loadHomeConfiguration(w,$,Y,A,X,J){if(!w)return null;let U=J?RY(w,Y,X):Y,W=[g0(f1(),".config",w),g0(f1(),".config"),f1()];for(let Q of W){if(X)fw.info(`Checking home directory: ${Q}`);let B=this.fileLoader.generateConfigPaths(w,Q,$),j=await this.fileLoader.tryLoadFromPaths(B,U,{arrayStrategy:A,verbose:X});if(j){if(X)fw.success(`Configuration loaded from home directory: ${j.source.path}`);return j}}return null}async loadPackageJsonConfiguration(w,$,Y,A,X,J,U){let W=U?RY(w,A,J):A;try{let Q=g0(Y,"package.json");if(!pU(Q))return null;let B=await import(Q),j=B[w],z=w;if(!j&&$)j=B[$],z=$;if(j&&typeof j==="object"&&!Array.isArray(j)){if(J)fw.success(`Configuration loaded from package.json: ${z}`);return{config:qQ(W,j,X),source:{type:"package.json",path:Q,priority:30,timestamp:new Date}}}}catch(Q){if(J)fw.warn("Failed to load package.json:",[Q instanceof Error?Q:Error(String(Q))])}return null}async applyEnvironmentVariables(w,$,Y,A){if(!Y||!w||typeof $!=="object"||$===null||Array.isArray($))return{config:$,source:{type:"default",priority:10,timestamp:new Date}};return{config:RY(w,$,A),source:{type:"environment",priority:20,timestamp:new Date}}}async finalizeResult(w,$,Y,A,X){return{config:w.config,source:w.source,path:w.source.path}}async validateConfiguration(w,$,Y,A){let X=[];if(Y){let J=Y(w);if(J)X.push(...J)}if($){let J=await this.validator.validateConfiguration(w,$);if(!J.isValid)X.push(...J.errors.map((U)=>U.path?`${U.path}: ${U.message}`:U.message))}if(X.length>0)throw T$.configValidation(A||"unknown",X,A)}checkCache(w,$){let Y=this.generateCacheKey(w,$);return _1.get(Y)||null}cacheResult(w,$,Y,A){let X=this.generateCacheKey(w,A);_1.set(X,$,void 0,Y.ttl)}generateCacheKey(w,$){let Y=[w];if($.alias)Y.push(`alias:${$.alias}`);if($.cwd)Y.push(`cwd:${$.cwd}`);if($.configDir)Y.push(`configDir:${$.configDir}`);if("checkEnv"in $)Y.push(`checkEnv:${$.checkEnv}`);return Y.join("|")}getLocalDirectories(w,$){return Array.from(new Set([w,g0(w,"config"),g0(w,".config"),$?g0(w,$):void 0].filter(Boolean)))}getAllSearchPaths(w,$,Y,A){let X=[];return X.push(...this.getLocalSearchPaths(w,$,Y,A)),X.push(...this.getHomeSearchPaths(w,$)),X.push(g0(Y,"package.json")),X}getLocalSearchPaths(w,$,Y,A){let X=this.getLocalDirectories(Y,A),J=[];for(let U of X)J.push(...this.fileLoader.generateConfigPaths(w,U,$));return J}getHomeSearchPaths(w,$){if(!w)return[];let Y=[g0(f1(),".config",w),g0(f1(),".config"),f1()],A=[];for(let X of Y)A.push(...this.fileLoader.generateConfigPaths(w,X,$));return A}async loadConfigWithResult(w){return this.loadConfig(w)}}function b9(w){let $=!(w.message.includes("EACCES")||w.message.includes("EPERM")||w.message.includes("permission denied"))&&(w.message.includes("syntax")||w.message.includes("Expected")||w.message.includes("Unexpected")||w.message.includes("BuildMessage")),Y=w.message.includes("Configuration must export a valid object")||w.message.includes("Configuration file is empty and exports nothing");return $||Y}async function NN(w){return ew.loadConfig({...w,__strictErrorHandling:!0})}async function Oz(w){let $="defaultConfig"in w&&w.defaultConfig!==void 0?w.defaultConfig:{},Y="cache"in w||"performance"in w||"schema"in w||"validate"in w;try{let A;if(Y)A=await ew.loadConfig(w);else A=await ew.loadConfig({...w,defaultConfig:$,cache:{enabled:!0},performance:{enabled:!1}});return A?.config??$}catch(A){let X=A instanceof Error?A.name:"UnknownError",J=A instanceof Error?A.message:String(A);if(!(X==="ConfigNotFoundError"||X==="ConfigLoadError"||X==="ConfigValidationError"||J.includes("config"))&&w.verbose)fw.warn("Unexpected error loading config, using defaults:",[A instanceof Error?A:Error(String(A))]);let U=Y?{...w,defaultConfig:$}:{...w,defaultConfig:$,cache:{enabled:!0},performance:{enabled:!1}};if("checkEnv"in w?w.checkEnv!==!1:!0)return(await ew.applyEnvironmentVariables(U.name||"",$,!0,U.verbose||!1))?.config??$;return $}}async function EN(w={defaultConfig:{}}){if(typeof w==="string"){let{cwd:$}=await import("process");try{return(await ew.loadConfig({name:w,cwd:$(),generatedDir:"./generated",configDir:"./config",defaultConfig:{},checkEnv:!0,arrayStrategy:"replace"})).config}catch(Y){if(Y instanceof Error&&(Y.name==="ConfigNotFoundError"||Y.name==="ConfigLoadError"&&b9(Y)))return(await ew.applyEnvironmentVariables(w,{},!0,!1)).config;throw Y}}try{return(await ew.loadConfig({...w,cwd:w.cwd||i$.cwd(),cache:{enabled:!0},performance:{enabled:!1}})).config}catch($){if($ instanceof Error&&($.name==="ConfigNotFoundError"||$.name==="ConfigLoadError"&&b9($)))return(await ew.applyEnvironmentVariables(w.name||"",w.defaultConfig||{},w.checkEnv!==!1,w.verbose||!1)).config;throw $}}async function fN(w,$,Y="replace"){let A=new bX;try{let X=await A.loadFromPath(w,$,{arrayStrategy:Y,useCache:!1,trackPerformance:!1});return X?X.config:null}catch{return null}}function RY(w,$,Y=!1){let A=new PX,X=w.toUpperCase().replace(/[^A-Z0-9]/g,"_");function J(U,W=[]){let Q={...U};for(let[B,j]of Object.entries(U)){let z=[...W,B],G=[`${X}_${z.join("_").toUpperCase()}`,`${X}_${z.map((q)=>q.toUpperCase()).join("")}`,`${X}_${z.map((q)=>q.replace(/([A-Z])/g,"_$1").toUpperCase()).join("")}`],K,E;for(let q of G)if(K=i$.env[q],K!==void 0){E=q;break}if(K!==void 0&&E)if(typeof j==="boolean")Q[B]=["true","1","yes"].includes(K.toLowerCase());else if(typeof j==="number"){let q=Number(K);if(!Number.isNaN(q))Q[B]=q}else if(Array.isArray(j))try{Q[B]=JSON.parse(K)}catch{Q[B]=K.split(",").map((q)=>q.trim())}else Q[B]=K;else if(j&&typeof j==="object"&&!Array.isArray(j))Q[B]=J(j,z)}return Q}return J($)}function TN(w){let $=g0(i$.cwd(),w.configDir),Y=g0(i$.cwd(),w.generatedDir),A=g0(Y,"config-types.ts");if(!pU(F9(A)))Uq(F9(A),{recursive:!0,mode:511});let X=pU($)?Qq($).map((U)=>U.replace(/\.(ts|js|mjs|cjs|mts|cts|json)$/,"")).sort():[],J=`// Generated by bunfig v${rN}
97
97
  export type ConfigNames = ${X.length?`'${X.join("' | '")}'`:"string"}
98
- `;Qq(A,J,{mode:438})}function fN(w){let $=null,Y=null,A=()=>{if(!Y)Y=yz(w).then((J)=>{return $=J,J},(J)=>{let U="defaultConfig"in w?w.defaultConfig:{};if($=U,"verbose"in w&&w.verbose)Tw.warn("Config loading failed, using defaults:",[J instanceof Error?J:Error(String(J))]);return U});return Y},X="defaultConfig"in w?w.defaultConfig:{};return $=X,A(),new Proxy({},{get(J,U){if($)return $[U];let W=X[U];return A(),W},has(J,U){return U in($||X)},ownKeys(){return Object.keys($||X)},getOwnPropertyDescriptor(J,U){return Object.getOwnPropertyDescriptor($||X,U)},set(J,U,W){if(!$)$={...X};return $[U]=W,!0}})}function HN(w){let $=L9(Zq.cwd(),w?.configDir||"./config");function Y(){if(!_q($))return[];let X=new Set([".ts",".js",".mjs",".cjs",".mts",".cts",".json"]),J=[".ts",".mts",".cts",".js",".mjs",".cjs",".json"],U=Sq($).filter((Q)=>X.has(ZU(Q))).map((Q)=>({base:Q.replace(/\.(?:ts|js|mjs|cjs|mts|cts|json)$/i,""),file:Q})),W=new Map;for(let{base:Q,file:B}of U){let j=ZU(B).toLowerCase(),z=W.get(Q);if(!z){W.set(Q,B);continue}let G=ZU(z).toLowerCase();if(J.indexOf(j)<J.indexOf(G))W.set(Q,B)}return Array.from(W.entries()).map(([Q,B])=>({base:Q,file:B})).sort((Q,B)=>Q.base.localeCompare(B.base))}function A(){let X=Y(),J=X.map((Q)=>Q.base),U=J.length?J.map((Q)=>`'${Q}'`).join(" | "):"string",W=X.length?`{
99
- ${X.map((Q)=>{let B=L9($,Q.file).replace(/\\/g,"/");return` '${Q.base}': typeof import('${B}').default`}).join(`,
98
+ `;Wq(A,J,{mode:438})}function HN(w){let $=null,Y=null,A=()=>{if(!Y)Y=Oz(w).then((J)=>{return $=J,J},(J)=>{let U="defaultConfig"in w?w.defaultConfig:{};if($=U,"verbose"in w&&w.verbose)fw.warn("Config loading failed, using defaults:",[J instanceof Error?J:Error(String(J))]);return U});return Y},X="defaultConfig"in w?w.defaultConfig:{};return $=X,A(),new Proxy({},{get(J,U){if($)return $[U];let W=X[U];return A(),W},has(J,U){return U in($||X)},ownKeys(){return Object.keys($||X)},getOwnPropertyDescriptor(J,U){return Object.getOwnPropertyDescriptor($||X,U)},set(J,U,W){if(!$)$={...X};return $[U]=W,!0}})}function RN(w){let $=_9(kq.cwd(),w?.configDir||"./config");function Y(){if(!Sq($))return[];let X=new Set([".ts",".js",".mjs",".cjs",".mts",".cts",".json"]),J=[".ts",".mts",".cts",".js",".mjs",".cjs",".json"],U=Zq($).filter((Q)=>X.has(hU(Q))).map((Q)=>({base:Q.replace(/\.(?:ts|js|mjs|cjs|mts|cts|json)$/i,""),file:Q})),W=new Map;for(let{base:Q,file:B}of U){let j=hU(B).toLowerCase(),z=W.get(Q);if(!z){W.set(Q,B);continue}let G=hU(z).toLowerCase();if(J.indexOf(j)<J.indexOf(G))W.set(Q,B)}return Array.from(W.entries()).map(([Q,B])=>({base:Q,file:B})).sort((Q,B)=>Q.base.localeCompare(B.base))}function A(){let X=Y(),J=X.map((Q)=>Q.base),U=J.length?J.map((Q)=>`'${Q}'`).join(" | "):"string",W=X.length?`{
99
+ ${X.map((Q)=>{let B=_9($,Q.file).replace(/\\/g,"/");return` '${Q.base}': typeof import('${B}').default`}).join(`,
100
100
  `)}
101
101
  }`:"Record<string, any>";return`export type ConfigNames = ${U}
102
102
  export type ConfigByName = ${W}
103
103
  export type Config<N extends ConfigNames> = N extends keyof ConfigByName ? ConfigByName[N] : unknown
104
104
  export type ConfigOf = Config
105
- `}return{name:"bunfig-plugin",setup(X){X.onResolve({filter:/^virtual:bunfig-types$/},(J)=>{return{path:J.path,namespace:"bunfig-virtual"}}),X.onLoad({filter:/^virtual:bunfig-types$/,namespace:"bunfig-virtual"},()=>{return{contents:A(),loader:"ts"}})}}}function tN(w,$={}){let Y=fX.cwd();while(Y.includes("storage"))Y=_9(Y,"..");let A=_9(Y,w||"");if($?.relative)return hq(fX.cwd(),A);return A}function f0(){if(sw.env.NODE_ENV==="test"||sw.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function sN(){if(sw.env.NODE_ENV==="test"||sw.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof sw<"u"){let w=sw.type;if(w==="renderer"||w==="worker")return!1;return!!(sw.versions&&(sw.versions.node||sw.versions.bun))}return!1}class Pz{async format(w){let $=await sN(),Y=await this.getMetadata($);return JSON.stringify({timestamp:w.timestamp.toISOString(),level:w.level,name:w.name,message:w.message,metadata:Y})}async getMetadata(w){if(w){let{hostname:$}=await import("os");return{pid:y1.pid,hostname:$(),environment:y1.env.NODE_ENV||"development",platform:y1.platform,version:y1.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:y1.env.NODE_ENV||y1.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}class PX{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(w,$={}){this.name=w,this.config={...OX},this.options=this.normalizeOptions($),this.formatter=this.options.formatter||new Pz,this.enabled=$.enabled??!0,this.fancy=$.fancy??!0,this.tagFormat=$.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=$.timestampPosition??"right",this.environment=$.environment??n.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig($);let Y={...$},A=$.timestamp!==void 0;if(A)delete Y.timestamp;if(this.config={...this.config,...Y,timestamp:A||this.config.timestamp,level:this.options.level??"info"},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let X=this.generateKeyId(),J=this.generateKey();this.currentKeyId=X,this.keys.set(X,J),this.encryptionKeys.set(X,{key:J,createdAt:new Date}),this.setupKeyRotation()}}shouldActivateFingersCrossed(w){if(!this.fingersCrossedConfig)return!1;let $={debug:0,info:1,success:2,warning:3,error:4},Y=this.fingersCrossedConfig.activationLevel??"error";return $[w]>=$[Y]}initializeFingersCrossedConfig(w){if(!w.fingersCrossedEnabled&&w.fingersCrossed)return{...vU,...w.fingersCrossed};if(!w.fingersCrossedEnabled)return null;if(!w.fingersCrossed)return{...vU};return{...vU,...w.fingersCrossed}}normalizeOptions(w){let $={format:"json",level:"info",logDirectory:OX.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,showIcons:!0,formatter:void 0},Y={...$,...Object.fromEntries(Object.entries(w).filter(([,A])=>A!==void 0))};if(!Y.level||!["debug","info","success","warning","error"].includes(Y.level))Y.level=$.level;return Y}shouldWriteToFile(){return!f0()&&this.config.writeToFile===!0}async writeToFile(w){let $=(async()=>{let A,X=0,J=3,U=1000;while(X<J)try{try{try{await uq(this.config.logDirectory,h9.F_OK|h9.W_OK)}catch(Q){if(Q instanceof Error&&"code"in Q)if(Q.code==="ENOENT")await cq(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 W=this.validateEncryptionConfig()?(await this.encrypt(w)).encrypted:pw.from(w);try{if(!wX(this.currentLogFile))await DU(this.currentLogFile,"",{mode:420});if(A=k9(this.currentLogFile,"a",420),bq(A,W,{flag:"a"}),Z9(A),A!==void 0)hU(A),A=void 0;if((await V1(this.currentLogFile)).size===0){if(await DU(this.currentLogFile,W,{flag:"w",mode:420}),(await V1(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(Q){let B=Q;if(B.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(B.code)){if(X<J-1){let j=typeof B.message==="string"?B.message:"Unknown error";console.error(`Network error during write attempt ${X+1}/${J}:`,j);let z=U*2**X;await new Promise((G)=>setTimeout(G,z)),X++;continue}}if(B?.code&&["ENOSPC","EDQUOT"].includes(B.code))throw Error(`Disk quota exceeded or no space left on device: ${B.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",B),B}finally{if(A!==void 0)try{hU(A)}catch(Q){console.error("Debug: [writeToFile] Error closing file descriptor:",Q)}}}catch(W){if(X===J-1){let B=W,j=typeof B.message==="string"?B.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",j),W}X++;let Q=U*2**(X-1);await new Promise((B)=>setTimeout(B,Q))}})();this.pendingOperations.push($);let Y=this.pendingOperations.length-1;try{await $}catch(A){throw console.error("Debug: [writeToFile] Error in operation:",A),A}finally{this.pendingOperations.splice(Y,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 C1(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 C1(this.config.logDirectory,`${this.name}.log`);let w=new Date().toISOString().split("T")[0];return C1(this.config.logDirectory,`${this.name}-${w}.log`)}setupRotation(){if(f0())return;if(!this.shouldWriteToFile())return;if(typeof this.config.rotation==="boolean")return;let w=this.config.rotation,$;switch(w.frequency){case"daily":$=86400000;break;case"weekly":$=604800000;break;case"monthly":$=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},$)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let w=this.config.rotation.keyRotation;if(!w?.enabled)return;let $=typeof w.interval==="number"?w.interval:60,Y=Math.max($,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((A)=>{console.error("Error rotating keys:",A)})},Y)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let w=this.config.rotation.keyRotation,$=this.generateKeyId(),Y=this.generateKey();this.currentKeyId=$,this.keys.set($,Y),this.encryptionKeys.set($,{key:Y,createdAt:new Date});let A=Array.from(this.encryptionKeys.entries()).sort(([,U],[,W])=>W.createdAt.getTime()-U.createdAt.getTime()),X=typeof w.maxKeys==="number"?w.maxKeys:1,J=Math.max(1,X);if(A.length>J)for(let[U]of A.slice(J))this.encryptionKeys.delete(U),this.keys.delete(U)}generateKeyId(){return kU(16).toString("hex")}generateKey(){return kU(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let w=this.keys.get(this.currentKeyId);if(!w)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:w,id:this.currentKeyId}}encrypt(w){let{key:$}=this.getCurrentKey(),Y=kU(16),A=Dq("aes-256-gcm",$,Y),X=pw.isBuffer(w)?w:pw.from(w,"utf8"),J=A.update(X),U=A.final(),W=J.length+U.length,Q=A.getAuthTag(),B=pw.allocUnsafe(16+W+16);return Y.copy(B,0),J.copy(B,16),U.copy(B,16+J.length),Q.copy(B,16+W),{encrypted:B,iv:Y}}async compressData(w){return new Promise(($,Y)=>{let A=x9(),X=[];A.on("data",(J)=>X.push(J)),A.on("end",()=>$(pw.from(pw.concat(X)))),A.on("error",Y),A.write(w),A.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let w={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let $=this.config.rotation.encrypt;return{...w,...$}}return w}async rotateLog(){if(f0())return;if(!this.shouldWriteToFile())return;let w=await V1(this.currentLogFile).catch(()=>null);if(!w)return;let $=this.config.rotation;if(typeof $==="boolean")return;if($.maxSize&&w.size>=$.maxSize){let Y=this.currentLogFile,A=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let X=await $X(this.config.logDirectory),J=X.filter((Q)=>Q.startsWith(this.name)&&/\.log\.\d+$/.test(Q)).sort((Q,B)=>{let j=Number.parseInt(Q.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(B.match(/\.log\.(\d+)$/)?.[1]||"0")-j}),U=J.length>0?Number.parseInt(J[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,W=`${Y}.${U}`;if(await V1(Y).catch(()=>null))try{if(await D9(Y,W),$.compress)try{let Q=`${W}.gz`;await this.compressLogFile(W,Q),await YX(W)}catch(Q){console.error("Error compressing rotated file:",Q)}if(J.length===0&&!X.some((Q)=>Q.endsWith(".log.1")))try{let Q=`${Y}.1`;await DU(Q,"")}catch(Q){console.error("Error creating backup file:",Q)}}catch(Q){console.error(`Error during rotation: ${Q instanceof Error?Q.message:String(Q)}`)}}else{let X=new Date().toISOString().replace(/[:.]/g,"-"),J=Y.replace(/\.log$/,`-${X}.log`);if(await V1(Y).catch(()=>null))await D9(Y,J)}if(this.currentLogFile=A,$.maxFiles){let X=(await $X(this.config.logDirectory)).filter((J)=>J.startsWith(this.name)).sort((J,U)=>U.localeCompare(J));for(let J of X.slice($.maxFiles))await YX(C1(this.config.logDirectory,J))}}}async compressLogFile(w,$){let Y=S9(w),A=Pq($),X=x9();await mq(Y,X,A)}async handleFingersCrossedBuffer(w,$){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(w)&&!this.isActivated){this.isActivated=!0;for(let Y of this.logBuffer){let A=await this.formatter.format(Y);if(this.shouldWriteToFile())await this.writeToFile(A);console.log(A)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated){if(this.shouldWriteToFile())await this.writeToFile($);console.log($)}}shouldLog(w){if(!this.enabled)return!1;let $={debug:0,info:1,success:2,warning:3,error:4};return $[w]>=$[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((w)=>{if(w instanceof Promise)return w.catch(($)=>{console.error("Error in pending write operation:",$)});return Promise.resolve()})),wX(this.currentLogFile))try{let w=k9(this.currentLogFile,"r+");Z9(w),hU(w)}catch(w){console.error(`Error flushing file: ${w}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let w of this.pendingOperations)if(typeof w.cancel==="function")w.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(w){console.error("Error waiting for pending operations:",w)}if(!f0()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let w=(await $X(this.config.logDirectory)).filter(($)=>($.includes("temp")||$.includes(".tmp"))&&$.includes(this.name));for(let $ of w)try{await YX(C1(this.config.logDirectory,$))}catch(Y){console.error(`Failed to delete temp file ${$}:`,Y)}}catch(w){console.error("Error cleaning up temporary files:",w)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(w){if(!w)return"";return`${this.tagFormat.prefix}${w}${this.tagFormat.suffix}`}formatFileTimestamp(w){return`[${w.toISOString()}]`}formatConsoleTimestamp(w){return this.shouldStyleConsole()?m.gray(w.toLocaleTimeString()):w.toLocaleTimeString()}shouldStyleConsole(){if(!this.fancy||f0())return!1;let w=typeof n.env.NO_COLOR<"u",$=n.env.FORCE_COLOR==="0";if(w||$)return!1;return!!(typeof n.stderr<"u"&&n.stderr.isTTY||typeof n.stdout<"u"&&n.stdout.isTTY)}formatConsoleMessage(w){let{timestamp:$,icon:Y="",tag:A="",message:X,level:J,showTimestamp:U=!0}=w,W=(K)=>K.replace(this.ANSI_PATTERN,"");if(!this.fancy){let K=[];if(U)K.push($);if(J==="warning")K.push("WARN");else if(J==="error")K.push("ERROR");else if(Y)K.push(Y.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(A)K.push(A.replace(/[[\]]/g,""));return K.push(X),K.join(" ")}let Q=n.stdout.columns||120,B="";if(J==="warning"||J==="error")B=`${Y} ${X}`;else if(J==="info"||J==="success")B=`${Y} ${A} ${X}`;else B=`${Y} ${A} ${m.cyan(X)}`;if(!U)return B.trim();let j=W(B).trim().length,z=W($).length,G=Math.max(1,Q-2-j-z);return`${B.trim()}${" ".repeat(G)}${$}`}formatMessage(w,$){if($.length===1&&Array.isArray($[0]))return w.replace(/\{(\d+)\}/g,(J,U)=>{let W=Number.parseInt(U,10);return W<$[0].length?String($[0][W]):J});let Y=/%([sdijfo%])/g,A=0,X=w.replace(Y,(J,U)=>{if(U==="%")return"%";if(A>=$.length)return J;let W=$[A++];switch(U){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 J}});if(A<$.length)X+=` ${$.slice(A).map((J)=>typeof J==="object"?JSON.stringify(J,null,2):String(J)).join(" ")}`;return X}formatMarkdown(w){if(!w)return w;let $=w;return $=$.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(Y,A,X)=>{let J=m.underline(m.blue(A)),U=this.toAbsoluteFilePath(X);if(U&&this.shouldStyleConsole()&&this.supportsHyperlinks()){let W=`file://${encodeURI(U)}`,Q="\x1B]8;;",B="\x1B\\";return`\x1B]8;;${W}\x1B\\${J}\x1B]8;;\x1B\\`}if(this.shouldStyleConsole()&&this.supportsHyperlinks())return`\x1B]8;;${X}\x1B\\${J}\x1B]8;;\x1B\\`;return J}),$=$.replace(/`([^`]+)`/g,(Y,A)=>m.bgGray(A)),$=$.replace(/\*\*([^*]+)\*\*/g,(Y,A)=>m.bold(A)),$=$.replace(/(?<!\*)\*([^*]+)\*(?!\*)/g,(Y,A)=>m.italic(A)),$=$.replace(/(?<!_)_([^_]+)_(?!_)/g,(Y,A)=>m.italic(A)),$=$.replace(/~([^~]+)~/g,(Y,A)=>m.strikethrough(A)),$}supportsHyperlinks(){if(f0())return!1;let w=n.env;if(!w)return!1;if(w.TERM_PROGRAM==="iTerm.app"||w.TERM_PROGRAM==="vscode"||w.TERM_PROGRAM==="WezTerm")return!0;if(w.WT_SESSION)return!0;if(w.TERM==="xterm-kitty")return!0;let $=w.VTE_VERSION?Number.parseInt(w.VTE_VERSION,10):0;if(!Number.isNaN($)&&$>=5000)return!0;return!1}toAbsoluteFilePath(w){try{let $=w;if($.startsWith("file://"))$=$.replace(/^file:\/\//,"");if($.startsWith("~")){let Y=n.env.HOME||"";if(Y)$=$.replace(/^~(?=$|\/)/,Y)}if(vq($)||$.startsWith("./")||$.startsWith("../"))$=iq($);else return null;return wX($)?$:null}catch{return null}}buildOutputTexts(w){let $=this.shouldStyleConsole()?this.formatMarkdown(w):w,Y=w.replace(this.ANSI_PATTERN,"");return{consoleText:$,fileText:Y}}async log(w,$,...Y){if(!this.shouldLog(w))return;let A=new Date,X=this.formatConsoleTimestamp(A),J=this.formatFileTimestamp(A),U,W;if($ instanceof Error)U=$.message,W=$.stack;else U=this.formatMessage($,Y);let{consoleText:Q,fileText:B}=this.buildOutputTexts(U);if(this.shouldStyleConsole()){let z=this.options.showIcons===!1?"":YE[w],G=this.options.showTags!==!1&&this.name?m.gray(this.formatTag(this.name)):"",K;switch(w){case"debug":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:m.gray(Q),level:w}),console.error(K);break;case"info":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.warn(K);break;case"success":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:m.green(Q),level:w}),console.error(K);break;case"warning":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.warn(K);break;case"error":if(K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.error(K),W){let E=W.split(`
106
- `);for(let q of E)if(q.trim()&&!q.includes(U))console.error(this.formatConsoleMessage({timestamp:X,message:m.gray(` ${q}`),level:w,showTimestamp:!1}))}break}}else if(!f0()){if(console.error(`${J} ${this.environment}.${w.toUpperCase()}: ${U}`),W)console.error(W)}let j=`${J} ${this.environment}.${w.toUpperCase()}: ${B}
105
+ `}return{name:"bunfig-plugin",setup(X){X.onResolve({filter:/^virtual:bunfig-types$/},(J)=>{return{path:J.path,namespace:"bunfig-virtual"}}),X.onLoad({filter:/^virtual:bunfig-types$/,namespace:"bunfig-virtual"},()=>{return{contents:A(),loader:"ts"}})}}}function aN(w,$={}){let Y=RX.cwd();while(Y.includes("storage"))Y=S9(Y,"..");let A=S9(Y,w||"");if($?.relative)return Dq(RX.cwd(),A);return A}function T0(){if(sw.env.NODE_ENV==="test"||sw.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function oN(){if(sw.env.NODE_ENV==="test"||sw.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof sw<"u"){let w=sw.type;if(w==="renderer"||w==="worker")return!1;return!!(sw.versions&&(sw.versions.node||sw.versions.bun))}return!1}class bz{async format(w){let $=await oN(),Y=await this.getMetadata($);return JSON.stringify({timestamp:w.timestamp.toISOString(),level:w.level,name:w.name,message:w.message,metadata:Y})}async getMetadata(w){if(w){let{hostname:$}=await import("os");return{pid:O1.pid,hostname:$(),environment:O1.env.NODE_ENV||"development",platform:O1.platform,version:O1.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:O1.env.NODE_ENV||O1.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}class uX{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(w,$={}){this.name=w,this.config={..._X},this.options=this.normalizeOptions($),this.formatter=this.options.formatter||new bz,this.enabled=$.enabled??!0,this.fancy=$.fancy??!0,this.tagFormat=$.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=$.timestampPosition??"right",this.environment=$.environment??n.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig($);let Y={...$},A=$.timestamp!==void 0;if(A)delete Y.timestamp;if(this.config={...this.config,...Y,timestamp:A||this.config.timestamp,level:this.options.level??"info"},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let X=this.generateKeyId(),J=this.generateKey();this.currentKeyId=X,this.keys.set(X,J),this.encryptionKeys.set(X,{key:J,createdAt:new Date}),this.setupKeyRotation()}}shouldActivateFingersCrossed(w){if(!this.fingersCrossedConfig)return!1;let $={debug:0,info:1,success:2,warning:3,error:4},Y=this.fingersCrossedConfig.activationLevel??"error";return $[w]>=$[Y]}initializeFingersCrossedConfig(w){if(!w.fingersCrossedEnabled&&w.fingersCrossed)return{...mU,...w.fingersCrossed};if(!w.fingersCrossedEnabled)return null;if(!w.fingersCrossed)return{...mU};return{...mU,...w.fingersCrossed}}normalizeOptions(w){let $={format:"json",level:"info",logDirectory:_X.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,showIcons:!0,formatter:void 0},Y={...$,...Object.fromEntries(Object.entries(w).filter(([,A])=>A!==void 0))};if(!Y.level||!["debug","info","success","warning","error"].includes(Y.level))Y.level=$.level;return Y}shouldWriteToFile(){return!T0()&&this.config.writeToFile===!0}async writeToFile(w){let $=(async()=>{let A,X=0,J=3,U=1000;while(X<J)try{try{try{await cq(this.config.logDirectory,D9.F_OK|D9.W_OK)}catch(Q){if(Q instanceof Error&&"code"in Q)if(Q.code==="ENOENT")await vq(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 W=this.validateEncryptionConfig()?(await this.encrypt(w)).encrypted:pw.from(w);try{if(!YX(this.currentLogFile))await PU(this.currentLogFile,"",{mode:420});if(A=h9(this.currentLogFile,"a",420),uq(A,W,{flag:"a"}),k9(A),A!==void 0)xU(A),A=void 0;if((await C1(this.currentLogFile)).size===0){if(await PU(this.currentLogFile,W,{flag:"w",mode:420}),(await C1(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(Q){let B=Q;if(B.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(B.code)){if(X<J-1){let j=typeof B.message==="string"?B.message:"Unknown error";console.error(`Network error during write attempt ${X+1}/${J}:`,j);let z=U*2**X;await new Promise((G)=>setTimeout(G,z)),X++;continue}}if(B?.code&&["ENOSPC","EDQUOT"].includes(B.code))throw Error(`Disk quota exceeded or no space left on device: ${B.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",B),B}finally{if(A!==void 0)try{xU(A)}catch(Q){console.error("Debug: [writeToFile] Error closing file descriptor:",Q)}}}catch(W){if(X===J-1){let B=W,j=typeof B.message==="string"?B.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",j),W}X++;let Q=U*2**(X-1);await new Promise((B)=>setTimeout(B,Q))}})();this.pendingOperations.push($);let Y=this.pendingOperations.length-1;try{await $}catch(A){throw console.error("Debug: [writeToFile] Error in operation:",A),A}finally{this.pendingOperations.splice(Y,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 y1(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 y1(this.config.logDirectory,`${this.name}.log`);let w=new Date().toISOString().split("T")[0];return y1(this.config.logDirectory,`${this.name}-${w}.log`)}setupRotation(){if(T0())return;if(!this.shouldWriteToFile())return;if(typeof this.config.rotation==="boolean")return;let w=this.config.rotation,$;switch(w.frequency){case"daily":$=86400000;break;case"weekly":$=604800000;break;case"monthly":$=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},$)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let w=this.config.rotation.keyRotation;if(!w?.enabled)return;let $=typeof w.interval==="number"?w.interval:60,Y=Math.max($,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((A)=>{console.error("Error rotating keys:",A)})},Y)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let w=this.config.rotation.keyRotation,$=this.generateKeyId(),Y=this.generateKey();this.currentKeyId=$,this.keys.set($,Y),this.encryptionKeys.set($,{key:Y,createdAt:new Date});let A=Array.from(this.encryptionKeys.entries()).sort(([,U],[,W])=>W.createdAt.getTime()-U.createdAt.getTime()),X=typeof w.maxKeys==="number"?w.maxKeys:1,J=Math.max(1,X);if(A.length>J)for(let[U]of A.slice(J))this.encryptionKeys.delete(U),this.keys.delete(U)}generateKeyId(){return DU(16).toString("hex")}generateKey(){return DU(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let w=this.keys.get(this.currentKeyId);if(!w)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:w,id:this.currentKeyId}}encrypt(w){let{key:$}=this.getCurrentKey(),Y=DU(16),A=xq("aes-256-gcm",$,Y),X=pw.isBuffer(w)?w:pw.from(w,"utf8"),J=A.update(X),U=A.final(),W=J.length+U.length,Q=A.getAuthTag(),B=pw.allocUnsafe(16+W+16);return Y.copy(B,0),J.copy(B,16),U.copy(B,16+J.length),Q.copy(B,16+W),{encrypted:B,iv:Y}}async compressData(w){return new Promise(($,Y)=>{let A=P9(),X=[];A.on("data",(J)=>X.push(J)),A.on("end",()=>$(pw.from(pw.concat(X)))),A.on("error",Y),A.write(w),A.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let w={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let $=this.config.rotation.encrypt;return{...w,...$}}return w}async rotateLog(){if(T0())return;if(!this.shouldWriteToFile())return;let w=await C1(this.currentLogFile).catch(()=>null);if(!w)return;let $=this.config.rotation;if(typeof $==="boolean")return;if($.maxSize&&w.size>=$.maxSize){let Y=this.currentLogFile,A=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let X=await AX(this.config.logDirectory),J=X.filter((Q)=>Q.startsWith(this.name)&&/\.log\.\d+$/.test(Q)).sort((Q,B)=>{let j=Number.parseInt(Q.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(B.match(/\.log\.(\d+)$/)?.[1]||"0")-j}),U=J.length>0?Number.parseInt(J[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,W=`${Y}.${U}`;if(await C1(Y).catch(()=>null))try{if(await x9(Y,W),$.compress)try{let Q=`${W}.gz`;await this.compressLogFile(W,Q),await XX(W)}catch(Q){console.error("Error compressing rotated file:",Q)}if(J.length===0&&!X.some((Q)=>Q.endsWith(".log.1")))try{let Q=`${Y}.1`;await PU(Q,"")}catch(Q){console.error("Error creating backup file:",Q)}}catch(Q){console.error(`Error during rotation: ${Q instanceof Error?Q.message:String(Q)}`)}}else{let X=new Date().toISOString().replace(/[:.]/g,"-"),J=Y.replace(/\.log$/,`-${X}.log`);if(await C1(Y).catch(()=>null))await x9(Y,J)}if(this.currentLogFile=A,$.maxFiles){let X=(await AX(this.config.logDirectory)).filter((J)=>J.startsWith(this.name)).sort((J,U)=>U.localeCompare(J));for(let J of X.slice($.maxFiles))await XX(y1(this.config.logDirectory,J))}}}async compressLogFile(w,$){let Y=Z9(w),A=bq($),X=P9();await gq(Y,X,A)}async handleFingersCrossedBuffer(w,$){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(w)&&!this.isActivated){this.isActivated=!0;for(let Y of this.logBuffer){let A=await this.formatter.format(Y);if(this.shouldWriteToFile())await this.writeToFile(A);console.log(A)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated){if(this.shouldWriteToFile())await this.writeToFile($);console.log($)}}shouldLog(w){if(!this.enabled)return!1;let $={debug:0,info:1,success:2,warning:3,error:4};return $[w]>=$[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((w)=>{if(w instanceof Promise)return w.catch(($)=>{console.error("Error in pending write operation:",$)});return Promise.resolve()})),YX(this.currentLogFile))try{let w=h9(this.currentLogFile,"r+");k9(w),xU(w)}catch(w){console.error(`Error flushing file: ${w}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let w of this.pendingOperations)if(typeof w.cancel==="function")w.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(w){console.error("Error waiting for pending operations:",w)}if(!T0()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let w=(await AX(this.config.logDirectory)).filter(($)=>($.includes("temp")||$.includes(".tmp"))&&$.includes(this.name));for(let $ of w)try{await XX(y1(this.config.logDirectory,$))}catch(Y){console.error(`Failed to delete temp file ${$}:`,Y)}}catch(w){console.error("Error cleaning up temporary files:",w)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(w){if(!w)return"";return`${this.tagFormat.prefix}${w}${this.tagFormat.suffix}`}formatFileTimestamp(w){return`[${w.toISOString()}]`}formatConsoleTimestamp(w){return this.shouldStyleConsole()?m.gray(w.toLocaleTimeString()):w.toLocaleTimeString()}shouldStyleConsole(){if(!this.fancy||T0())return!1;let w=typeof n.env.NO_COLOR<"u",$=n.env.FORCE_COLOR==="0";if(w||$)return!1;return!!(typeof n.stderr<"u"&&n.stderr.isTTY||typeof n.stdout<"u"&&n.stdout.isTTY)}formatConsoleMessage(w){let{timestamp:$,icon:Y="",tag:A="",message:X,level:J,showTimestamp:U=!0}=w,W=(K)=>K.replace(this.ANSI_PATTERN,"");if(!this.fancy){let K=[];if(U)K.push($);if(J==="warning")K.push("WARN");else if(J==="error")K.push("ERROR");else if(Y)K.push(Y.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(A)K.push(A.replace(/[[\]]/g,""));return K.push(X),K.join(" ")}let Q=n.stdout.columns||120,B="";if(J==="warning"||J==="error")B=`${Y} ${X}`;else if(J==="info"||J==="success")B=`${Y} ${A} ${X}`;else B=`${Y} ${A} ${m.cyan(X)}`;if(!U)return B.trim();let j=W(B).trim().length,z=W($).length,G=Math.max(1,Q-2-j-z);return`${B.trim()}${" ".repeat(G)}${$}`}formatMessage(w,$){if($.length===1&&Array.isArray($[0]))return w.replace(/\{(\d+)\}/g,(J,U)=>{let W=Number.parseInt(U,10);return W<$[0].length?String($[0][W]):J});let Y=/%([sdijfo%])/g,A=0,X=w.replace(Y,(J,U)=>{if(U==="%")return"%";if(A>=$.length)return J;let W=$[A++];switch(U){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 J}});if(A<$.length)X+=` ${$.slice(A).map((J)=>typeof J==="object"?JSON.stringify(J,null,2):String(J)).join(" ")}`;return X}formatMarkdown(w){if(!w)return w;let $=w;return $=$.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(Y,A,X)=>{let J=m.underline(m.blue(A)),U=this.toAbsoluteFilePath(X);if(U&&this.shouldStyleConsole()&&this.supportsHyperlinks()){let W=`file://${encodeURI(U)}`,Q="\x1B]8;;",B="\x1B\\";return`\x1B]8;;${W}\x1B\\${J}\x1B]8;;\x1B\\`}if(this.shouldStyleConsole()&&this.supportsHyperlinks())return`\x1B]8;;${X}\x1B\\${J}\x1B]8;;\x1B\\`;return J}),$=$.replace(/`([^`]+)`/g,(Y,A)=>m.bgGray(A)),$=$.replace(/\*\*([^*]+)\*\*/g,(Y,A)=>m.bold(A)),$=$.replace(/(?<!\*)\*([^*]+)\*(?!\*)/g,(Y,A)=>m.italic(A)),$=$.replace(/(?<!_)_([^_]+)_(?!_)/g,(Y,A)=>m.italic(A)),$=$.replace(/~([^~]+)~/g,(Y,A)=>m.strikethrough(A)),$}supportsHyperlinks(){if(T0())return!1;let w=n.env;if(!w)return!1;if(w.TERM_PROGRAM==="iTerm.app"||w.TERM_PROGRAM==="vscode"||w.TERM_PROGRAM==="WezTerm")return!0;if(w.WT_SESSION)return!0;if(w.TERM==="xterm-kitty")return!0;let $=w.VTE_VERSION?Number.parseInt(w.VTE_VERSION,10):0;if(!Number.isNaN($)&&$>=5000)return!0;return!1}toAbsoluteFilePath(w){try{let $=w;if($.startsWith("file://"))$=$.replace(/^file:\/\//,"");if($.startsWith("~")){let Y=n.env.HOME||"";if(Y)$=$.replace(/^~(?=$|\/)/,Y)}if(iq($)||$.startsWith("./")||$.startsWith("../"))$=mq($);else return null;return YX($)?$:null}catch{return null}}buildOutputTexts(w){let $=this.shouldStyleConsole()?this.formatMarkdown(w):w,Y=w.replace(this.ANSI_PATTERN,"");return{consoleText:$,fileText:Y}}async log(w,$,...Y){if(!this.shouldLog(w))return;let A=new Date,X=this.formatConsoleTimestamp(A),J=this.formatFileTimestamp(A),U,W;if($ instanceof Error)U=$.message,W=$.stack;else U=this.formatMessage($,Y);let{consoleText:Q,fileText:B}=this.buildOutputTexts(U);if(this.shouldStyleConsole()){let z=this.options.showIcons===!1?"":AE[w],G=this.options.showTags!==!1&&this.name?m.gray(this.formatTag(this.name)):"",K;switch(w){case"debug":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:m.gray(Q),level:w}),console.error(K);break;case"info":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.warn(K);break;case"success":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:m.green(Q),level:w}),console.error(K);break;case"warning":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.warn(K);break;case"error":if(K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.error(K),W){let E=W.split(`
106
+ `);for(let q of E)if(q.trim()&&!q.includes(U))console.error(this.formatConsoleMessage({timestamp:X,message:m.gray(` ${q}`),level:w,showTimestamp:!1}))}break}}else if(!T0()){if(console.error(`${J} ${this.environment}.${w.toUpperCase()}: ${U}`),W)console.error(W)}let j=`${J} ${this.environment}.${w.toUpperCase()}: ${B}
107
107
  `;if(W)j+=`${W}
108
- `;if(j=j.replace(this.ANSI_PATTERN,""),this.shouldWriteToFile())await this.writeToFile(j)}progress(w,$=""){let Y={update:(X,J)=>{},finish:(X)=>{},interrupt:(X,J)=>{}};if(!this.enabled)return Y;let A=30;if(this.activeProgressBar={total:Math.max(1,w||1),current:0,message:$||"",barLength:A,lastRenderedLine:""},this.shouldStyleConsole()&&!f0()&&n.stdout.isTTY)this.renderProgressBar(this.activeProgressBar);return{update:(X,J)=>{if(!this.enabled||!this.activeProgressBar)return;if(this.activeProgressBar.current=Math.min(Math.max(0,X),this.activeProgressBar.total),J!==void 0)this.activeProgressBar.message=J;if(this.shouldStyleConsole()&&!f0()&&n.stdout.isTTY)this.renderProgressBar(this.activeProgressBar)},finish:(X)=>{if(!this.activeProgressBar)return;this.finishProgressBar(this.activeProgressBar,X)},interrupt:(X,J="info")=>{if(!f0()&&n.stdout.isTTY)n.stdout.write(`
109
- `);if(this[J==="warning"?"warn":J](X),this.activeProgressBar&&this.shouldStyleConsole()&&!f0()&&n.stdout.isTTY)this.renderProgressBar(this.activeProgressBar)}}}time(w){let $=performance.now();if(this.shouldStyleConsole()){let Y=this.options.showTags!==!1&&this.name?m.gray(this.formatTag(this.name)):"",A=this.formatConsoleTimestamp(new Date);console.error(this.formatConsoleMessage({timestamp:A,icon:this.options.showIcons===!1?"":m.blue("◐"),tag:Y,message:`${m.cyan(w)}...`}))}return async(Y)=>{if(!this.enabled)return;let A=performance.now(),X=Math.round(A-$),J=`${w} completed in ${X}ms`,U=new Date,W=this.formatConsoleTimestamp(U),Q=`${this.formatFileTimestamp(U)} ${this.environment}.INFO: ${J}`;if(Y)Q+=` ${JSON.stringify(Y)}`;if(Q+=`
110
- `,Q=Q.replace(this.ANSI_PATTERN,""),this.shouldStyleConsole()){let B=this.options.showTags!==!1&&this.name?m.gray(this.formatTag(this.name)):"";console.error(this.formatConsoleMessage({timestamp:W,icon:this.options.showIcons===!1?"":m.green("✓"),tag:B,message:`${J}${Y?` ${JSON.stringify(Y)}`:""}`}))}else if(!f0())console.error(Q.trim());if(this.shouldWriteToFile())await this.writeToFile(Q)}}async debug(w,...$){await this.log("debug",w,...$)}async info(w,...$){await this.log("info",w,...$)}async success(w,...$){await this.log("success",w,...$)}async warn(w,...$){await this.log("warning",w,...$)}async error(w,...$){await this.log("error",w,...$)}validateEncryptionConfig(){if(!this.config.rotation)return!1;if(typeof this.config.rotation==="boolean")return!1;let w=this.config.rotation,{encrypt:$}=w;return!!$}async only(w){if(!this.enabled)return;return await w()}isEnabled(){return this.enabled}setEnabled(w){this.enabled=w}extend(w){let $=`${this.name}:${w}`,Y=new PX($,{...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(Y),Y}createReadStream(){if(f0())throw Error("createReadStream is not supported in browser environments");if(!wX(this.currentLogFile))throw Error(`Log file does not exist: ${this.currentLogFile}`);return S9(this.currentLogFile,{encoding:"utf8"})}async decrypt(w){if(!this.validateEncryptionConfig())throw Error("Encryption is not configured");let $=this.config.rotation;if(!$.encrypt||typeof $.encrypt==="boolean")throw Error("Invalid encryption configuration");if(!this.currentKeyId||!this.keys.has(this.currentKeyId))throw Error("No valid encryption key available");let Y=this.keys.get(this.currentKeyId);try{let A=pw.isBuffer(w)?w:pw.from(w,"base64"),X=A.subarray(0,16),J=A.subarray(A.length-16),U=A.subarray(16,A.length-16),W=xq("aes-256-gcm",Y,X);W.setAuthTag(J);let Q=W.update(U),B=W.final(),j=Q.length+B.length,z=pw.allocUnsafe(j);return Q.copy(z,0),B.copy(z,Q.length),z.toString("utf8")}catch(A){throw Error(`Decryption failed: ${A instanceof Error?A.message:String(A)}`)}}getLevel(){return this.config.level}getLogDirectory(){return this.config.logDirectory}getFormat(){return this.config.format}getRotationConfig(){return this.config.rotation}isBrowserMode(){return f0()}isServerMode(){return!f0()}setTestEncryptionKey(w,$){this.currentKeyId=w,this.keys.set(w,$)}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(w){if(!this.enabled)return;let $=new Date,Y=this.formatConsoleTimestamp($),A=this.formatFileTimestamp($),{consoleText:X,fileText:J}=this.buildOutputTexts(w);if(this.shouldStyleConsole()){let W=X.split(`
111
- `),Q=Math.max(...W.map((G)=>G.length))+2,B=`┌${"─".repeat(Q)}┐`,j=`└${"─".repeat(Q)}┘`,z=W.map((G)=>{return this.formatConsoleMessage({timestamp:Y,message:m.cyan(G),showTimestamp:!1})});console.error(this.formatConsoleMessage({timestamp:Y,message:m.cyan(B),showTimestamp:!1})),z.forEach((G)=>console.error(G)),console.error(this.formatConsoleMessage({timestamp:Y,message:m.cyan(j),showTimestamp:!1}))}else if(!f0())console.error(`${A} ${this.environment}.INFO: [BOX] ${J}`);let U=`${A} ${this.environment}.INFO: [BOX] ${J}
112
- `.replace(this.ANSI_PATTERN,"");if(this.shouldWriteToFile())await this.writeToFile(U)}async prompt(w){if(f0())return Promise.resolve(!0);return new Promise(($)=>{console.error(`${m.cyan("?")} ${w} (y/n) `);let Y=(A)=>{let X=A.toString().trim().toLowerCase();n.stdin.removeListener("data",Y);try{if(typeof n.stdin.setRawMode==="function")n.stdin.setRawMode(!1)}catch{}n.stdin.pause(),console.error(""),$(X==="y"||X==="yes")};try{if(typeof n.stdin.setRawMode==="function")n.stdin.setRawMode(!0)}catch{}n.stdin.resume(),n.stdin.once("data",Y)})}setFancy(w){this.fancy=w}isFancy(){return this.fancy}pause(){this.enabled=!1}resume(){this.enabled=!0}async start(w,...$){if(!this.enabled)return;let Y=w;if($&&$.length>0){let U=/%([sdijfo%])/g,W=0;if(Y=w.replace(U,(Q,B)=>{if(B==="%")return"%";if(W>=$.length)return Q;let j=$[W++];switch(B){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 Q}}),W<$.length)Y+=` ${$.slice(W).map((Q)=>typeof Q==="object"?JSON.stringify(Q,null,2):String(Q)).join(" ")}`}let{consoleText:A,fileText:X}=this.buildOutputTexts(Y);if(this.shouldStyleConsole()){let U=this.options.showTags!==!1&&this.name?m.gray(this.formatTag(this.name)):"",W=this.options.showIcons===!1?"":`${m.blue("◐")} `;console.error(`${W}${U} ${m.cyan(A)}`)}let J=`[${new Date().toISOString()}] ${this.environment}.INFO: [START] ${X}
108
+ `;if(j=j.replace(this.ANSI_PATTERN,""),this.shouldWriteToFile())await this.writeToFile(j)}progress(w,$=""){let Y={update:(X,J)=>{},finish:(X)=>{},interrupt:(X,J)=>{}};if(!this.enabled)return Y;let A=30;if(this.activeProgressBar={total:Math.max(1,w||1),current:0,message:$||"",barLength:A,lastRenderedLine:""},this.shouldStyleConsole()&&!T0()&&n.stdout.isTTY)this.renderProgressBar(this.activeProgressBar);return{update:(X,J)=>{if(!this.enabled||!this.activeProgressBar)return;if(this.activeProgressBar.current=Math.min(Math.max(0,X),this.activeProgressBar.total),J!==void 0)this.activeProgressBar.message=J;if(this.shouldStyleConsole()&&!T0()&&n.stdout.isTTY)this.renderProgressBar(this.activeProgressBar)},finish:(X)=>{if(!this.activeProgressBar)return;this.finishProgressBar(this.activeProgressBar,X)},interrupt:(X,J="info")=>{if(!T0()&&n.stdout.isTTY)n.stdout.write(`
109
+ `);if(this[J==="warning"?"warn":J](X),this.activeProgressBar&&this.shouldStyleConsole()&&!T0()&&n.stdout.isTTY)this.renderProgressBar(this.activeProgressBar)}}}time(w){let $=performance.now();if(this.shouldStyleConsole()){let Y=this.options.showTags!==!1&&this.name?m.gray(this.formatTag(this.name)):"",A=this.formatConsoleTimestamp(new Date);console.error(this.formatConsoleMessage({timestamp:A,icon:this.options.showIcons===!1?"":m.blue("◐"),tag:Y,message:`${m.cyan(w)}...`}))}return async(Y)=>{if(!this.enabled)return;let A=performance.now(),X=Math.round(A-$),J=`${w} completed in ${X}ms`,U=new Date,W=this.formatConsoleTimestamp(U),Q=`${this.formatFileTimestamp(U)} ${this.environment}.INFO: ${J}`;if(Y)Q+=` ${JSON.stringify(Y)}`;if(Q+=`
110
+ `,Q=Q.replace(this.ANSI_PATTERN,""),this.shouldStyleConsole()){let B=this.options.showTags!==!1&&this.name?m.gray(this.formatTag(this.name)):"";console.error(this.formatConsoleMessage({timestamp:W,icon:this.options.showIcons===!1?"":m.green("✓"),tag:B,message:`${J}${Y?` ${JSON.stringify(Y)}`:""}`}))}else if(!T0())console.error(Q.trim());if(this.shouldWriteToFile())await this.writeToFile(Q)}}async debug(w,...$){await this.log("debug",w,...$)}async info(w,...$){await this.log("info",w,...$)}async success(w,...$){await this.log("success",w,...$)}async warn(w,...$){await this.log("warning",w,...$)}async error(w,...$){await this.log("error",w,...$)}validateEncryptionConfig(){if(!this.config.rotation)return!1;if(typeof this.config.rotation==="boolean")return!1;let w=this.config.rotation,{encrypt:$}=w;return!!$}async only(w){if(!this.enabled)return;return await w()}isEnabled(){return this.enabled}setEnabled(w){this.enabled=w}extend(w){let $=`${this.name}:${w}`,Y=new uX($,{...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(Y),Y}createReadStream(){if(T0())throw Error("createReadStream is not supported in browser environments");if(!YX(this.currentLogFile))throw Error(`Log file does not exist: ${this.currentLogFile}`);return Z9(this.currentLogFile,{encoding:"utf8"})}async decrypt(w){if(!this.validateEncryptionConfig())throw Error("Encryption is not configured");let $=this.config.rotation;if(!$.encrypt||typeof $.encrypt==="boolean")throw Error("Invalid encryption configuration");if(!this.currentKeyId||!this.keys.has(this.currentKeyId))throw Error("No valid encryption key available");let Y=this.keys.get(this.currentKeyId);try{let A=pw.isBuffer(w)?w:pw.from(w,"base64"),X=A.subarray(0,16),J=A.subarray(A.length-16),U=A.subarray(16,A.length-16),W=Pq("aes-256-gcm",Y,X);W.setAuthTag(J);let Q=W.update(U),B=W.final(),j=Q.length+B.length,z=pw.allocUnsafe(j);return Q.copy(z,0),B.copy(z,Q.length),z.toString("utf8")}catch(A){throw Error(`Decryption failed: ${A instanceof Error?A.message:String(A)}`)}}getLevel(){return this.config.level}getLogDirectory(){return this.config.logDirectory}getFormat(){return this.config.format}getRotationConfig(){return this.config.rotation}isBrowserMode(){return T0()}isServerMode(){return!T0()}setTestEncryptionKey(w,$){this.currentKeyId=w,this.keys.set(w,$)}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(w){if(!this.enabled)return;let $=new Date,Y=this.formatConsoleTimestamp($),A=this.formatFileTimestamp($),{consoleText:X,fileText:J}=this.buildOutputTexts(w);if(this.shouldStyleConsole()){let W=X.split(`
111
+ `),Q=Math.max(...W.map((G)=>G.length))+2,B=`┌${"─".repeat(Q)}┐`,j=`└${"─".repeat(Q)}┘`,z=W.map((G)=>{return this.formatConsoleMessage({timestamp:Y,message:m.cyan(G),showTimestamp:!1})});console.error(this.formatConsoleMessage({timestamp:Y,message:m.cyan(B),showTimestamp:!1})),z.forEach((G)=>console.error(G)),console.error(this.formatConsoleMessage({timestamp:Y,message:m.cyan(j),showTimestamp:!1}))}else if(!T0())console.error(`${A} ${this.environment}.INFO: [BOX] ${J}`);let U=`${A} ${this.environment}.INFO: [BOX] ${J}
112
+ `.replace(this.ANSI_PATTERN,"");if(this.shouldWriteToFile())await this.writeToFile(U)}async prompt(w){if(T0())return Promise.resolve(!0);return new Promise(($)=>{console.error(`${m.cyan("?")} ${w} (y/n) `);let Y=(A)=>{let X=A.toString().trim().toLowerCase();n.stdin.removeListener("data",Y);try{if(typeof n.stdin.setRawMode==="function")n.stdin.setRawMode(!1)}catch{}n.stdin.pause(),console.error(""),$(X==="y"||X==="yes")};try{if(typeof n.stdin.setRawMode==="function")n.stdin.setRawMode(!0)}catch{}n.stdin.resume(),n.stdin.once("data",Y)})}setFancy(w){this.fancy=w}isFancy(){return this.fancy}pause(){this.enabled=!1}resume(){this.enabled=!0}async start(w,...$){if(!this.enabled)return;let Y=w;if($&&$.length>0){let U=/%([sdijfo%])/g,W=0;if(Y=w.replace(U,(Q,B)=>{if(B==="%")return"%";if(W>=$.length)return Q;let j=$[W++];switch(B){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 Q}}),W<$.length)Y+=` ${$.slice(W).map((Q)=>typeof Q==="object"?JSON.stringify(Q,null,2):String(Q)).join(" ")}`}let{consoleText:A,fileText:X}=this.buildOutputTexts(Y);if(this.shouldStyleConsole()){let U=this.options.showTags!==!1&&this.name?m.gray(this.formatTag(this.name)):"",W=this.options.showIcons===!1?"":`${m.blue("◐")} `;console.error(`${W}${U} ${m.cyan(A)}`)}let J=`[${new Date().toISOString()}] ${this.environment}.INFO: [START] ${X}
113
113
  `.replace(this.ANSI_PATTERN,"");if(this.shouldWriteToFile())await this.writeToFile(J)}renderProgressBar(w,$=!1){if(!this.enabled||!this.shouldStyleConsole()||!n.stdout.isTTY)return;let Y=Math.min(100,Math.max(0,Math.round(w.current/w.total*100))),A=Math.round(w.barLength*Y/100),X=w.barLength-A,J=m.green("━".repeat(A)),U=m.gray("━".repeat(X)),W=`[${J}${U}]`,Q=`${Y}%`.padStart(4),B=w.message?` ${w.message}`:"",j=this.options.showIcons===!1?"":$||Y===100?m.green("✓"):m.blue("▶"),z=this.options.showTags!==!1&&this.name?` ${m.gray(this.formatTag(this.name))}`:"",G=`\r${j}${z} ${W} ${Q}${B}`,K=n.stdout.columns||80,E=" ".repeat(Math.max(0,K-G.replace(this.ANSI_PATTERN,"").length));if(w.lastRenderedLine=`${G}${E}`,n.stdout.write(w.lastRenderedLine),$)n.stdout.write(`
114
- `)}finishProgressBar(w,$){if(!this.enabled||!this.fancy||f0()||!n.stdout.isTTY){this.activeProgressBar=null;return}if(w.current<w.total)w.current=w.total;if($)w.message=$;this.renderProgressBar(w,!0),this.activeProgressBar=null}async clear(w={}){if(f0()){console.warn("Log clearing is not supported in browser environments.");return}try{console.warn("Clearing logs...",this.config.logDirectory);let $=await $X(this.config.logDirectory),Y=[];for(let A of $){if(!(w.name?new RegExp(w.name.replace("*",".*")).test(A):A.startsWith(this.name))||!A.endsWith(".log"))continue;let X=C1(this.config.logDirectory,A);if(w.before)try{if((await V1(X)).mtime>=w.before)continue}catch(J){console.error(`Failed to get stats for file ${X}:`,J);continue}Y.push(X)}if(Y.length===0){console.warn("No log files matched the criteria for clearing.");return}console.warn(`Preparing to delete ${Y.length} log file(s)...`);for(let A of Y)try{await YX(A),console.warn(`Deleted log file: ${A}`)}catch(X){console.error(`Failed to delete log file ${A}:`,X)}console.warn("Log clearing process finished.")}catch($){console.error("Error during log clearing process:",$)}}}async function AE(w,$={}){let{maxRetries:Y=3,retryDelay:A=1000,isRetryable:X=()=>!0,fallback:J}=$,U=Error("Unknown error occurred");for(let W=0;W<=Y;W++)try{return await w()}catch(Q){if(U=Q instanceof Error?Q:Error(String(Q)),W===Y||!X(U))break;if(A>0)await new Promise((B)=>setTimeout(B,A))}if(J!==void 0)return J;throw U instanceof Error?U:Error(`Unknown error: ${String(U)}`)}class EQ{defaultParsers;constructor(){this.defaultParsers=[{name:"boolean",canParse:(w,$)=>$==="boolean"||["true","false","1","0","yes","no"].includes(w.toLowerCase()),parse:(w)=>{let $=w.toLowerCase();return["true","1","yes"].includes($)}},{name:"number",canParse:(w,$)=>$==="number"||!Number.isNaN(Number(w))&&!Number.isNaN(Number.parseFloat(w)),parse:(w)=>{let $=Number(w);if(Number.isNaN($))throw TypeError(`Cannot parse "${w}" as number`);return $}},{name:"array",canParse:(w,$)=>$==="array"||w.startsWith("[")||w.includes(","),parse:(w)=>{try{let $=JSON.parse(w);if(Array.isArray($))return $}catch{}return w.split(",").map(($)=>$.trim())}},{name:"json",canParse:(w,$)=>$==="object"||(w.startsWith("{")&&w.endsWith("}")||w.startsWith("[")&&w.endsWith("]")),parse:(w)=>{try{return JSON.parse(w)}catch($){throw Error(`Cannot parse "${w}" as JSON: ${$}`)}}}]}async applyEnvironmentVariables(w,$,Y={}){let{prefix:A,useCamelCase:X=!0,useBackwardCompatibility:J=!0,customParsers:U={},verbose:W=!1,trackPerformance:Q=!0}=Y,B=async()=>{if(!w)return{config:$,source:{type:"environment",priority:50,timestamp:new Date}};let j=A||this.generateEnvPrefix(w),z={...$};return this.processObject(z,[],j,{useCamelCase:X,useBackwardCompatibility:J,customParsers:U,verbose:W,configName:w}),{config:z,source:{type:"environment",priority:50,timestamp:new Date}}};if(Q)return WQ.track("applyEnvironmentVariables",B,{configName:w});return B()}generateEnvPrefix(w){return w.toUpperCase().replace(/-/g,"_")}formatEnvKey(w,$){if(!$)return w.toUpperCase();return w.replace(/([A-Z])/g,"_$1").toUpperCase()}processObject(w,$,Y,A){for(let[X,J]of Object.entries(w)){let U=[...$,X],W=U.map((j)=>this.formatEnvKey(j,A.useCamelCase)),Q=`${Y}_${W.join("_")}`,B=A.useBackwardCompatibility?`${Y}_${U.map((j)=>j.toUpperCase()).join("_")}`:null;if(A.verbose);if(typeof J==="object"&&J!==null&&!Array.isArray(J))this.processObject(J,U,Y,A);else{let j=AX.env[Q]||(B?AX.env[B]:void 0);if(j!==void 0){if(A.verbose){let z=AX.env[Q]?Q:B}try{w[X]=this.parseEnvironmentValue(j,typeof J,Q,A.customParsers,A.configName)}catch(z){if(z instanceof NQ)throw z;throw _1.envVar(Q,j,typeof J,A.configName)}}}}}parseEnvironmentValue(w,$,Y,A,X){for(let[J,U]of Object.entries(A))try{return U(w)}catch{continue}for(let J of this.defaultParsers)if(J.canParse(w,$))try{return J.parse(w)}catch{throw _1.envVar(Y,w,`${$} (via ${J.name} parser)`,X)}return w}getEnvironmentVariables(w){let $={},Y=w.toUpperCase();for(let[A,X]of Object.entries(AX.env))if(A.startsWith(Y)&&X!==void 0)$[A]=X;return $}validateEnvironmentVariable(w,$,Y){let A=[];if(!/^[A-Z_][A-Z0-9_]*$/.test(w))A.push(`Environment variable key "${w}" should only contain uppercase letters, numbers, and underscores`);if(Y)try{this.parseEnvironmentValue(w,$,Y,{})}catch(X){A.push(`Cannot parse value "${$}" as ${Y}: ${X}`)}return{isValid:A.length===0,errors:A}}generateEnvVarDocs(w,$,Y={}){let{prefix:A,format:X="text"}=Y,J=A||this.generateEnvPrefix(w),U=[];switch(this.extractEnvVarInfo($,[],J,U),X){case"markdown":return this.formatAsMarkdown(U,w);case"json":return JSON.stringify(U,null,2);default:return this.formatAsText(U,w)}}extractEnvVarInfo(w,$,Y,A){for(let[X,J]of Object.entries(w)){let U=[...$,X],W=`${Y}_${U.map((Q)=>this.formatEnvKey(Q,!0)).join("_")}`;if(typeof J==="object"&&J!==null&&!Array.isArray(J))this.extractEnvVarInfo(J,U,Y,A);else A.push({key:W,type:Array.isArray(J)?"array":typeof J,description:`Configuration for ${U.join(".")}`,example:this.generateExample(J)})}}generateExample(w){if(Array.isArray(w))return JSON.stringify(w);if(typeof w==="object"&&w!==null)return JSON.stringify(w);return String(w)}formatAsText(w,$){let Y=`Environment Variables for ${$}:
114
+ `)}finishProgressBar(w,$){if(!this.enabled||!this.fancy||T0()||!n.stdout.isTTY){this.activeProgressBar=null;return}if(w.current<w.total)w.current=w.total;if($)w.message=$;this.renderProgressBar(w,!0),this.activeProgressBar=null}async clear(w={}){if(T0()){console.warn("Log clearing is not supported in browser environments.");return}try{console.warn("Clearing logs...",this.config.logDirectory);let $=await AX(this.config.logDirectory),Y=[];for(let A of $){if(!(w.name?new RegExp(w.name.replace("*",".*")).test(A):A.startsWith(this.name))||!A.endsWith(".log"))continue;let X=y1(this.config.logDirectory,A);if(w.before)try{if((await C1(X)).mtime>=w.before)continue}catch(J){console.error(`Failed to get stats for file ${X}:`,J);continue}Y.push(X)}if(Y.length===0){console.warn("No log files matched the criteria for clearing.");return}console.warn(`Preparing to delete ${Y.length} log file(s)...`);for(let A of Y)try{await XX(A),console.warn(`Deleted log file: ${A}`)}catch(X){console.error(`Failed to delete log file ${A}:`,X)}console.warn("Log clearing process finished.")}catch($){console.error("Error during log clearing process:",$)}}}async function XE(w,$={}){let{maxRetries:Y=3,retryDelay:A=1000,isRetryable:X=()=>!0,fallback:J}=$,U=Error("Unknown error occurred");for(let W=0;W<=Y;W++)try{return await w()}catch(Q){if(U=Q instanceof Error?Q:Error(String(Q)),W===Y||!X(U))break;if(A>0)await new Promise((B)=>setTimeout(B,A))}if(J!==void 0)return J;throw U instanceof Error?U:Error(`Unknown error: ${String(U)}`)}class TQ{defaultParsers;constructor(){this.defaultParsers=[{name:"boolean",canParse:(w,$)=>$==="boolean"||["true","false","1","0","yes","no"].includes(w.toLowerCase()),parse:(w)=>{let $=w.toLowerCase();return["true","1","yes"].includes($)}},{name:"number",canParse:(w,$)=>$==="number"||!Number.isNaN(Number(w))&&!Number.isNaN(Number.parseFloat(w)),parse:(w)=>{let $=Number(w);if(Number.isNaN($))throw TypeError(`Cannot parse "${w}" as number`);return $}},{name:"array",canParse:(w,$)=>$==="array"||w.startsWith("[")||w.includes(","),parse:(w)=>{try{let $=JSON.parse(w);if(Array.isArray($))return $}catch{}return w.split(",").map(($)=>$.trim())}},{name:"json",canParse:(w,$)=>$==="object"||(w.startsWith("{")&&w.endsWith("}")||w.startsWith("[")&&w.endsWith("]")),parse:(w)=>{try{return JSON.parse(w)}catch($){throw Error(`Cannot parse "${w}" as JSON: ${$}`)}}}]}async applyEnvironmentVariables(w,$,Y={}){let{prefix:A,useCamelCase:X=!0,useBackwardCompatibility:J=!0,customParsers:U={},verbose:W=!1,trackPerformance:Q=!0}=Y,B=async()=>{if(!w)return{config:$,source:{type:"environment",priority:50,timestamp:new Date}};let j=A||this.generateEnvPrefix(w),z={...$};return this.processObject(z,[],j,{useCamelCase:X,useBackwardCompatibility:J,customParsers:U,verbose:W,configName:w}),{config:z,source:{type:"environment",priority:50,timestamp:new Date}}};if(Q)return jQ.track("applyEnvironmentVariables",B,{configName:w});return B()}generateEnvPrefix(w){return w.toUpperCase().replace(/-/g,"_")}formatEnvKey(w,$){if(!$)return w.toUpperCase();return w.replace(/([A-Z])/g,"_$1").toUpperCase()}processObject(w,$,Y,A){for(let[X,J]of Object.entries(w)){let U=[...$,X],W=U.map((j)=>this.formatEnvKey(j,A.useCamelCase)),Q=`${Y}_${W.join("_")}`,B=A.useBackwardCompatibility?`${Y}_${U.map((j)=>j.toUpperCase()).join("_")}`:null;if(A.verbose);if(typeof J==="object"&&J!==null&&!Array.isArray(J))this.processObject(J,U,Y,A);else{let j=JX.env[Q]||(B?JX.env[B]:void 0);if(j!==void 0){if(A.verbose){let z=JX.env[Q]?Q:B}try{w[X]=this.parseEnvironmentValue(j,typeof J,Q,A.customParsers,A.configName)}catch(z){if(z instanceof fQ)throw z;throw S1.envVar(Q,j,typeof J,A.configName)}}}}}parseEnvironmentValue(w,$,Y,A,X){for(let[J,U]of Object.entries(A))try{return U(w)}catch{continue}for(let J of this.defaultParsers)if(J.canParse(w,$))try{return J.parse(w)}catch{throw S1.envVar(Y,w,`${$} (via ${J.name} parser)`,X)}return w}getEnvironmentVariables(w){let $={},Y=w.toUpperCase();for(let[A,X]of Object.entries(JX.env))if(A.startsWith(Y)&&X!==void 0)$[A]=X;return $}validateEnvironmentVariable(w,$,Y){let A=[];if(!/^[A-Z_][A-Z0-9_]*$/.test(w))A.push(`Environment variable key "${w}" should only contain uppercase letters, numbers, and underscores`);if(Y)try{this.parseEnvironmentValue(w,$,Y,{})}catch(X){A.push(`Cannot parse value "${$}" as ${Y}: ${X}`)}return{isValid:A.length===0,errors:A}}generateEnvVarDocs(w,$,Y={}){let{prefix:A,format:X="text"}=Y,J=A||this.generateEnvPrefix(w),U=[];switch(this.extractEnvVarInfo($,[],J,U),X){case"markdown":return this.formatAsMarkdown(U,w);case"json":return JSON.stringify(U,null,2);default:return this.formatAsText(U,w)}}extractEnvVarInfo(w,$,Y,A){for(let[X,J]of Object.entries(w)){let U=[...$,X],W=`${Y}_${U.map((Q)=>this.formatEnvKey(Q,!0)).join("_")}`;if(typeof J==="object"&&J!==null&&!Array.isArray(J))this.extractEnvVarInfo(J,U,Y,A);else A.push({key:W,type:Array.isArray(J)?"array":typeof J,description:`Configuration for ${U.join(".")}`,example:this.generateExample(J)})}}generateExample(w){if(Array.isArray(w))return JSON.stringify(w);if(typeof w==="object"&&w!==null)return JSON.stringify(w);return String(w)}formatAsText(w,$){let Y=`Environment Variables for ${$}:
115
115
 
116
116
  `;for(let A of w)Y+=`${A.key}
117
117
  `,Y+=` Type: ${A.type}
@@ -123,32 +123,32 @@ export type ConfigOf = Config
123
123
  `;Y+=`| Variable | Type | Description | Example |
124
124
  `,Y+=`|----------|------|-------------|----------|
125
125
  `;for(let A of w)Y+=`| \`${A.key}\` | ${A.type} | ${A.description} | \`${A.example}\` |
126
- `;return Y}}function XE(w,$,Y={}){return dz(w,$,Y,new WeakMap)}function dz(w,$,Y,A){let{arrayMergeMode:X="replace",skipNullish:J=!1,customMerger:U}=Y;if($===null||$===void 0)return J?w:$;if(U){let W=U(w,$);if(W!==void 0)return W}if(Array.isArray($)||Array.isArray(w))return lz(w,$,X,A);if(!jw($)||!jw(w))return $;return WE(w,$,Y,A)}function lz(w,$,Y,A){if(Array.isArray($)&&!Array.isArray(w))return $;if(Array.isArray(w)&&!Array.isArray($))return $;if(Array.isArray($)&&Array.isArray(w))switch(Y){case"replace":return $;case"concat":return JE(w,$);case"smart":return UE(w,$,A);default:return $}return $}function JE(w,$){let Y=[...$];for(let A of w)if(!Y.some((X)=>YQ(X,A)))Y.push(A);return Y}function UE(w,$,Y){if($.length===0)return w;if(w.length===0)return $;if(jw($[0])&&jw(w[0]))return QE(w,$,Y);if($.every((A)=>typeof A==="string")&&w.every((A)=>typeof A==="string")){let A=[...$];for(let X of w)if(!A.includes(X))A.push(X);return A}return $}function QE(w,$,Y){let A=[...$];for(let X of w){if(!jw(X)){A.push(X);continue}let J=["id","name","key","path","type"],U=!1;for(let W of J)if(W in X){if(A.find((Q)=>jw(Q)&&(W in Q)&&Q[W]===X[W])){U=!0;break}}if(!U)A.push(X)}return A}function WE(w,$,Y,A){let X=$;if(jw(X)&&A.has(X))return A.get(X);let J={...w};if(jw(X))A.set(X,J);for(let U in X){if(!Object.prototype.hasOwnProperty.call(X,U))continue;let W=X[U],Q=J[U];if(Y.skipNullish&&(W===null||W===void 0))continue;if(W===null||W===void 0){J[U]=W;continue}if(jw(W)&&jw(Q))J[U]=dz(Q,W,Y,A);else if(Array.isArray(W)||Array.isArray(Q))J[U]=lz(Q,W,Y.arrayMergeMode||"smart",A);else J[U]=W}return J}function nz(w,$,Y="replace"){return XE(w,$,{arrayMergeMode:Y==="replace"?"replace":"smart",skipNullish:!0})}function YQ(w,$){if(w===$)return!0;if(Array.isArray(w)&&Array.isArray($)){if(w.length!==$.length)return!1;for(let Y=0;Y<w.length;Y++)if(!YQ(w[Y],$[Y]))return!1;return!0}if(jw(w)&&jw($)){let Y=Object.keys(w),A=Object.keys($);if(Y.length!==A.length)return!1;for(let X of Y){if(!Object.prototype.hasOwnProperty.call($,X))return!1;if(!YQ(w[X],$[X]))return!1}return!0}return!1}function jw(w){return Boolean(w&&typeof w==="object"&&!Array.isArray(w))}class pz{extensions=[".ts",".js",".mjs",".cjs",".json",".mts",".cts"];async loadFromPath(w,$,Y={}){let{arrayStrategy:A="replace",useCache:X=!0,cacheTtl:J,trackPerformance:U=!0,verbose:W=!1}=Y;if(X){let B=HX.getWithFileCheck("file",w);if(B){if(W)console.log(`Configuration loaded from cache: ${w}`);return B}}let Q=async()=>{if(!XX(w))return null;try{let B=`?t=${Date.now()}`,j=await import(w+B),z=j.default||j,G="default"in j,K=Object.keys(j).length>0;if(!G&&!K)throw new LX(w,Error("Configuration file is empty and exports nothing"),"unknown");if(typeof z!=="object"||z===null||Array.isArray(z))throw new LX(w,Error("Configuration must export a valid object"),"unknown");let E={config:nz($,z,A),source:{type:"file",path:w,priority:100,timestamp:new Date}};if(X)HX.setWithFileCheck("file",E,w,J);return E}catch(B){throw B instanceof Error?_1.configLoad(w,B):_1.configLoad(w,Error(String(B)))}};if(U)return WQ.track("loadFromPath",Q,{path:w});return Q()}async tryLoadFromPaths(w,$,Y={}){for(let A of w)try{let X=await this.loadFromPath(A,$,Y);if(X)return X}catch(X){if(X instanceof Error&&X.name==="ConfigLoadError")throw X;if(Y.verbose)console.warn(`Failed to load config from ${A}:`,X)}return null}generateConfigPaths(w,$,Y){let A=this.generateNamePatterns(w,Y),X=[];for(let J of A)for(let U of this.extensions)X.push(xU($,`${J}${U}`));return X}generateNamePatterns(w,$){let Y=[];if(Y.push("config",".config"),w)Y.push(w,`.${w}.config`,`${w}.config`,`.${w}`);let A=$===void 0?[]:Array.isArray($)?$:[$];for(let J of A){if(!J)continue;if(Y.push(J,`.${J}.config`,`${J}.config`,`.${J}`),w)Y.push(`${w}.${J}.config`,`.${w}.${J}.config`)}let X=new Set;return Y.filter((J)=>{if(!J||X.has(J))return!1;return X.add(J),!0})}checkFileAccess(w){return AE(async()=>{return XX(w)},{maxRetries:2,retryDelay:100,fallback:!1})}async discoverConfigFiles(w,$,Y){let A=[];if(!XX(w))return A;if($||Y){let X=this.generateNamePatterns($||"",Y);for(let J of X)for(let U of this.extensions){let W=xU(w,`${J}${U}`);if(await this.checkFileAccess(W))A.push(W)}}else try{let{readdirSync:X}=await import("fs"),J=X(w);for(let U of J)if(this.looksLikeConfigFile(U)){let W=xU(w,U);if(await this.checkFileAccess(W))A.push(W)}}catch{return[]}return A}looksLikeConfigFile(w){return[/\.config\.(ts|js|mjs|cjs|json|mts|cts)$/,/^\..*\.(ts|js|mjs|cjs|json|mts|cts)$/,/config\.(ts|js|mjs|cjs|json|mts|cts)$/].some(($)=>$.test(w))}async validateConfigFile(w){let $=[];try{if(!XX(w))return $.push("Configuration file does not exist"),$;let Y=await import(w),A=Y.default||Y;if(A===void 0)$.push("Configuration file must export a default value or named exports");else if(typeof A!=="object"||A===null)$.push("Configuration must be an object");else if(Array.isArray(A))$.push("Configuration cannot be an array at the root level");if(w.endsWith(".json"))try{let{readFileSync:X}=await import("fs"),J=X(w,"utf8");JSON.parse(J)}catch(X){$.push(`Invalid JSON syntax: ${X}`)}}catch(Y){$.push(`Failed to load configuration file: ${Y}`)}return $}async getFileModificationTime(w){try{let{statSync:$}=await import("fs");return $(w).mtime}catch{return null}}async preloadConfigurations(w,$={}){let Y=new Map;return await Promise.allSettled(w.map(async(A)=>{try{let X=await this.loadFromPath(A,{},$);if(X)Y.set(A,X.config)}catch(X){if($.verbose)console.warn(`Failed to preload ${A}:`,X)}})),Y}}class rz{async validateConfiguration(w,$,Y={}){let{stopOnFirstError:A=!1,validateRequired:X=!0,validateTypes:J=!0,customRules:U=[],trackPerformance:W=!0,verbose:Q=!1}=Y,B=async()=>{let j=[],z=[],G={stopOnFirstError:A,validateRequired:X,validateTypes:J,customRules:U,trackPerformance:W,verbose:Q};try{if(typeof $==="string")return await this.validateWithSchemaFile(w,$,G);else if(Array.isArray($))return this.validateWithRules(w,[...$,...U],G);else return this.validateWithJSONSchema(w,$,G)}catch(K){return j.push({path:"",message:`Validation failed: ${K}`,rule:"system"}),{isValid:!1,errors:j,warnings:z}}};if(W)return await WQ.track("validateConfiguration",B);return B()}async validateWithSchemaFile(w,$,Y){try{if(!gq($))throw new _X($,[{path:"",message:"Schema file does not exist"}]);let A=await import($),X=A.default||A;if(Array.isArray(X))return this.validateWithRules(w,X,Y);else return this.validateWithJSONSchema(w,X,Y)}catch(A){throw new _X($,[{path:"",message:`Failed to load schema: ${A}`}])}}validateWithJSONSchema(w,$,Y){let A=[],X=[];return this.validateObjectAgainstSchema(w,$,"",A,X,Y),{isValid:A.length===0,errors:A,warnings:X}}validateObjectAgainstSchema(w,$,Y,A,X,J){if(J.validateTypes&&$.type){let U=Array.isArray(w)?"array":typeof w,W=Array.isArray($.type)?$.type:[$.type];if(!W.includes(U)){if(A.push({path:Y,message:`Expected type ${W.join(" or ")}, got ${U}`,expected:W.join(" or "),actual:U,rule:"type"}),J.stopOnFirstError)return}}if($.enum&&!$.enum.includes(w)){if(A.push({path:Y,message:`Value must be one of: ${$.enum.join(", ")}`,expected:$.enum.join(", "),actual:w,rule:"enum"}),J.stopOnFirstError)return}if(typeof w==="string"){if($.minLength!==void 0&&w.length<$.minLength)A.push({path:Y,message:`String length must be at least ${$.minLength}`,expected:`>= ${$.minLength}`,actual:w.length,rule:"minLength"});if($.maxLength!==void 0&&w.length>$.maxLength)A.push({path:Y,message:`String length must not exceed ${$.maxLength}`,expected:`<= ${$.maxLength}`,actual:w.length,rule:"maxLength"});if($.pattern){if(!new RegExp($.pattern).test(w))A.push({path:Y,message:`String does not match pattern ${$.pattern}`,expected:$.pattern,actual:w,rule:"pattern"})}}if(typeof w==="number"){if($.minimum!==void 0&&w<$.minimum)A.push({path:Y,message:`Value must be at least ${$.minimum}`,expected:`>= ${$.minimum}`,actual:w,rule:"minimum"});if($.maximum!==void 0&&w>$.maximum)A.push({path:Y,message:`Value must not exceed ${$.maximum}`,expected:`<= ${$.maximum}`,actual:w,rule:"maximum"})}if(Array.isArray(w)&&$.items)for(let U=0;U<w.length;U++){let W=Y?`${Y}[${U}]`:`[${U}]`;if(this.validateObjectAgainstSchema(w[U],$.items,W,A,X,J),J.stopOnFirstError&&A.length>0)return}if(w&&typeof w==="object"&&!Array.isArray(w)){let U=w;if(J.validateRequired&&$.required){for(let W of $.required)if(!(W in U)){if(A.push({path:Y?`${Y}.${W}`:W,message:`Missing required property '${W}'`,expected:"required",rule:"required"}),J.stopOnFirstError)return}}if($.properties){for(let[W,Q]of Object.entries($.properties))if(W in U){let B=Y?`${Y}.${W}`:W;if(this.validateObjectAgainstSchema(U[W],Q,B,A,X,J),J.stopOnFirstError&&A.length>0)return}}if($.additionalProperties===!1){let W=new Set(Object.keys($.properties||{}));for(let Q of Object.keys(U))if(!W.has(Q))X.push({path:Y?`${Y}.${Q}`:Q,message:`Additional property '${Q}' is not allowed`,rule:"additionalProperties"})}}}validateWithRules(w,$,Y){let A=[],X=[];for(let J of $)try{let U=this.getValueByPath(w,J.path),W=this.validateWithRule(U,J,J.path);if(A.push(...W),Y.stopOnFirstError&&A.length>0)break}catch(U){A.push({path:J.path,message:`Rule validation failed: ${U}`,rule:"system"})}return{isValid:A.length===0,errors:A,warnings:X}}validateWithRule(w,$,Y){let A=[];if($.required&&(w===void 0||w===null))return A.push({path:Y,message:$.message||`Property '${Y}' is required`,expected:"required",rule:"required"}),A;if(w===void 0||w===null)return A;if($.type){let X=Array.isArray(w)?"array":typeof w;if(X!==$.type)A.push({path:Y,message:$.message||`Expected type ${$.type}, got ${X}`,expected:$.type,actual:X,rule:"type"})}if($.min!==void 0){let X=Array.isArray(w)?w.length:typeof w==="string"?w.length:typeof w==="number"?w:0;if(X<$.min)A.push({path:Y,message:$.message||`Value must be at least ${$.min}`,expected:`>= ${$.min}`,actual:X,rule:"min"})}if($.max!==void 0){let X=Array.isArray(w)?w.length:typeof w==="string"?w.length:typeof w==="number"?w:0;if(X>$.max)A.push({path:Y,message:$.message||`Value must not exceed ${$.max}`,expected:`<= ${$.max}`,actual:X,rule:"max"})}if($.pattern&&typeof w==="string"){if(!$.pattern.test(w))A.push({path:Y,message:$.message||`Value does not match pattern ${$.pattern}`,expected:$.pattern.toString(),actual:w,rule:"pattern"})}if($.enum&&!$.enum.includes(w))A.push({path:Y,message:$.message||`Value must be one of: ${$.enum.join(", ")}`,expected:$.enum.join(", "),actual:w,rule:"enum"});if($.validator){let X=$.validator(w);if(X)A.push({path:Y,message:$.message||X,rule:"custom"})}return A}getValueByPath(w,$){if(!$)return w;let Y=$.split("."),A=w;for(let X of Y)if(A&&typeof A==="object"&&X in A)A=A[X];else return;return A}generateRulesFromInterface(w){let $=[],Y=w.matchAll(/(\w+)(\?)?:\s*(\w+)/g);for(let A of Y){let[,X,J,U]=A;$.push({path:X,required:!J,type:this.mapTypeScriptType(U)})}return $}mapTypeScriptType(w){switch(w.toLowerCase()){case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"array":return"array";case"object":return"object";default:return"object"}}static createCommonRules(){return{server:[{path:"port",required:!0,type:"number",min:1,max:65535},{path:"host",required:!0,type:"string",min:1},{path:"ssl",type:"boolean"}],database:[{path:"url",required:!0,type:"string",min:1},{path:"pool",type:"number",min:1,max:100},{path:"timeout",type:"number",min:0}],api:[{path:"baseUrl",required:!0,type:"string",pattern:BE},{path:"timeout",type:"number",min:0},{path:"retries",type:"number",min:0,max:10}]}}}function jE(w){if(!w)return"";let $=Array.isArray(w)?w.filter(Boolean):[w];if($.length===0)return"";if($.length===1)return` or alias "${$[0]}"`;return` or aliases ${$.map((Y)=>`"${Y}"`).join(", ")}`}class tz{fileLoader=new pz;envProcessor=new EQ;validator=new rz;async loadConfig(w){let $=Date.now(),{cache:Y,performance:A,schema:X,validate:J,...U}=w;try{if(Y?.enabled){let Q=this.checkCache(U.name||"",U);if(Q)return Q}let W;try{W=await this.loadConfigurationStrategies(U,!0,Y)}catch(Q){let B=U.__strictErrorHandling;if(Q instanceof Error&&Q.name==="ConfigNotFoundError"){if(B)throw Q;W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`No configuration file found for "${U.name||"config"}", using defaults with environment variables`]}}else if(Q instanceof Error&&Q.name==="ConfigLoadError"){let j=Q.message.includes("EACCES")||Q.message.includes("EPERM")||Q.message.includes("permission denied"),z=!j&&(Q.message.includes("syntax")||Q.message.includes("Expected")||Q.message.includes("Unexpected")||Q.message.includes("BuildMessage")||Q.message.includes("errors building")),G=Q.message.includes("Configuration must export a valid object")||Q.message.includes("Configuration file is empty and exports nothing");if(B&&(G||j))throw Q;if(z&&(!B||!G))W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:["Configuration file has syntax errors, using defaults with environment variables"]};else if(!B)W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`Configuration loading error, using defaults: ${Q.message}`]};else throw Q}else W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`Configuration loading failed, using defaults: ${Q instanceof Error?Q.message:String(Q)}`]}}if(X||J)await this.validateConfiguration(W.config,X,J,U.name);if(Y?.enabled&&W)this.cacheResult(U.name||"",W,Y,U);if(A?.enabled){let Q={operation:"loadConfig",duration:Date.now()-$,configName:U.name,timestamp:new Date};if(A.onMetrics)A.onMetrics(Q);if(A.slowThreshold&&Q.duration>A.slowThreshold)rw.warn(`Slow configuration loading detected: ${Q.duration}ms for ${U.name}`);W.metrics=Q}return W}catch(W){if(W instanceof Error&&W.name==="ConfigNotFoundError")throw W;let Q=Date.now()-$;throw rw.error(`Configuration loading failed after ${Q}ms:`,[W instanceof Error?W:Error(String(W))]),W}}async loadConfigurationStrategies(w,$=!1,Y){let{name:A="",alias:X,cwd:J,configDir:U,defaultConfig:W,checkEnv:Q=!0,arrayStrategy:B="replace",verbose:j=!1}=w,z=J||hX.cwd(),G=[],K=await this.loadLocalConfiguration(A,X,z,U,W,B,j,Q,Y);if(K)return G.push(...this.getLocalSearchPaths(A,X,z,U)),this.finalizeResult(K,G,Q,A,j);let E=await this.loadHomeConfiguration(A,X,W,B,j,Q);if(E)return G.push(...this.getHomeSearchPaths(A,X)),this.finalizeResult(E,G,Q,A,j);let q=await this.loadPackageJsonConfiguration(A,X,z,W,B,j,Q);if(q)return G.push(Ww(z,"package.json")),this.finalizeResult(q,G,Q,A,j);if(G.push(...this.getAllSearchPaths(A,X,z,U)),$)throw _1.configNotFound(A,G,X);return{...await this.applyEnvironmentVariables(A,W,Q,j),warnings:[`No configuration file found for "${A}"${jE(X)}, using defaults with environment variables`]}}async loadLocalConfiguration(w,$,Y,A,X,J,U,W,Q){let B=W?UX(w,X,U):X,j=this.getLocalDirectories(Y,A);for(let z of j){if(U)rw.info(`Searching for configuration in: ${z}`);let G=this.fileLoader.generateConfigPaths(w,z,$),K=await this.fileLoader.tryLoadFromPaths(G,B,{arrayStrategy:J,verbose:U,cacheTtl:Q?.ttl,useCache:!Q?.ttl||Q.ttl>100});if(K){if(U)rw.success(`Configuration loaded from: ${K.source.path}`);return K}}return null}async loadHomeConfiguration(w,$,Y,A,X,J){if(!w)return null;let U=J?UX(w,Y,X):Y,W=[Ww(N1(),".config",w),Ww(N1(),".config"),N1()];for(let Q of W){if(X)rw.info(`Checking home directory: ${Q}`);let B=this.fileLoader.generateConfigPaths(w,Q,$),j=await this.fileLoader.tryLoadFromPaths(B,U,{arrayStrategy:A,verbose:X});if(j){if(X)rw.success(`Configuration loaded from home directory: ${j.source.path}`);return j}}return null}async loadPackageJsonConfiguration(w,$,Y,A,X,J,U){let W=U?UX(w,A,J):A;try{let Q=Ww(Y,"package.json");if(!Aq(Q))return null;let B={};try{B=JSON.parse(Xq(Q,"utf8"))}catch(G){if(J)rw.warn("Failed to parse package.json:",[G instanceof Error?G:Error(String(G))]);return null}let j=B[w],z=w;if(!j&&$){let G=Array.isArray($)?$:[$];for(let K of G){if(!K)continue;if(B[K]){j=B[K],z=K;break}}}if(j&&typeof j==="object"&&!Array.isArray(j)){if(J)rw.success(`Configuration loaded from package.json: ${z}`);return{config:nz(W,j,X),source:{type:"package.json",path:Q,priority:30,timestamp:new Date}}}}catch(Q){if(J)rw.warn("Failed to load package.json:",[Q instanceof Error?Q:Error(String(Q))])}return null}async applyEnvironmentVariables(w,$,Y,A){if(!Y||!w||typeof $!=="object"||$===null||Array.isArray($))return{config:$,source:{type:"default",priority:10,timestamp:new Date}};return{config:UX(w,$,A),source:{type:"environment",priority:20,timestamp:new Date}}}async finalizeResult(w,$,Y,A,X){return{config:w.config,source:w.source,path:w.source.path}}async validateConfiguration(w,$,Y,A){let X=[];if(Y){let J=Y(w);if(J)X.push(...J)}if($){let J=await this.validator.validateConfiguration(w,$);if(!J.isValid)X.push(...J.errors.map((U)=>U.path?`${U.path}: ${U.message}`:U.message))}if(X.length>0)throw _1.configValidation(A||"unknown",X,A)}checkCache(w,$){let Y=this.generateCacheKey(w,$);return HX.get(Y)||null}cacheResult(w,$,Y,A){let X=this.generateCacheKey(w,A);HX.set(X,$,void 0,Y.ttl)}generateCacheKey(w,$){let Y=[w];if($.alias){let A=Array.isArray($.alias)?$.alias.join(","):$.alias;Y.push(`alias:${A}`)}if($.cwd)Y.push(`cwd:${$.cwd}`);if($.configDir)Y.push(`configDir:${$.configDir}`);if("checkEnv"in $)Y.push(`checkEnv:${$.checkEnv}`);return Y.join("|")}getLocalDirectories(w,$){return Array.from(new Set([w,Ww(w,"config"),Ww(w,".config"),$?Ww(w,$):void 0].filter(Boolean)))}getAllSearchPaths(w,$,Y,A){let X=[];return X.push(...this.getLocalSearchPaths(w,$,Y,A)),X.push(...this.getHomeSearchPaths(w,$)),X.push(Ww(Y,"package.json")),X}getLocalSearchPaths(w,$,Y,A){let X=this.getLocalDirectories(Y,A),J=[];for(let U of X)J.push(...this.fileLoader.generateConfigPaths(w,U,$));return J}getHomeSearchPaths(w,$){if(!w)return[];let Y=[Ww(N1(),".config",w),Ww(N1(),".config"),N1()],A=[];for(let X of Y)A.push(...this.fileLoader.generateConfigPaths(w,X,$));return A}async loadConfigWithResult(w){return this.loadConfig(w)}}function UX(w,$,Y=!1){let A=new EQ,X=w.toUpperCase().replace(/[^A-Z0-9]/g,"_");function J(U,W=[]){let Q={...U};for(let[B,j]of Object.entries(U)){let z=[...W,B],G=[`${X}_${z.join("_").toUpperCase()}`,`${X}_${z.map((q)=>q.toUpperCase()).join("")}`,`${X}_${z.map((q)=>q.replace(/([A-Z])/g,"_$1").toUpperCase()).join("")}`],K,E;for(let q of G)if(K=hX.env[q],K!==void 0){E=q;break}if(K!==void 0&&E)if(typeof j==="boolean")Q[B]=["true","1","yes"].includes(K.toLowerCase());else if(typeof j==="number"){let q=Number(K);if(!Number.isNaN(q))Q[B]=q}else if(Array.isArray(j))try{Q[B]=JSON.parse(K)}catch{Q[B]=K.split(",").map((q)=>q.trim())}else Q[B]=K;else if(j&&typeof j==="object"&&!Array.isArray(j))Q[B]=J(j,z)}return Q}return J($)}function oz(w){return AQ.readFileSync(w,"utf8")}function XQ(w,$){let Y=[];function A(X){let J;try{J=AQ.readdirSync(X)}catch{return}for(let U of J){let W=Ew.join(X,U);try{if(AQ.statSync(W).isDirectory())A(W);else if(U===$)Y.push(X)}catch{continue}}}return A(w),Y}function L(w,$,Y){if(Y||z0.verbose)console.debug(`[tlsx:${w}] ${$}`)}function ez(){return sz.env.SUDO_PASSWORD}function EE(w){let $=w.toLowerCase();return qE.has($)||$.endsWith("password")||$.includes("secret")||$.includes("token")}function SX(w){if(Array.isArray(w))return w.map((Y)=>SX(Y));if(typeof w==="string")return NE.test(w)?t9:w;if(!w||typeof w!=="object")return w;let $={};for(let[Y,A]of Object.entries(w)){if(EE(Y)){$[Y]=t9;continue}$[Y]=SX(A)}return $}function bX(w){return JSON.stringify(SX(w))}function TE(w){let $=ez();if(!$||!/(^|\|\s*|&&\s*|;\s*)sudo\s/.test(w))return w;let Y=$.replace(/'/g,"'\\''"),A=w.replace(/(^|\|\s*|&&\s*|;\s*)sudo(?!\s+-[Sn])(\s+)/g,"$1sudo -S$2");return`echo '${Y}' | ${A}`}async function T$(w,$={}){let Y=TE(w);try{let{stdout:A,stderr:X}=await FE(Y,{cwd:$.cwd||sz.cwd(),timeout:$.timeout||30000});return{stdout:A.trim(),stderr:X.trim()}}catch(A){let X=Error(`Failed to execute command: ${w}
127
- Error: ${A.message}`);throw X.stack=A.stack,X}}function w2(w){if(w.domain)return w.domain;if(w.domains?.length)return w.domains[0];throw Error("Either domain or domains must be specified")}function TQ(w){let $=Ew.join(GE.homedir(),".stacks","ssl"),Y=w.basePath&&w.basePath.trim()!==""?w.basePath:z0.basePath&&z0.basePath.trim()!==""?z0.basePath:$,A=w.certPath?Ew.isAbsolute(w.certPath)?w.certPath:Ew.join(Y,w.certPath):Ew.join(Y,z0.certPath),X=w.keyPath?Ew.isAbsolute(w.keyPath)?w.keyPath:Ew.join(Y,w.keyPath):Ew.join(Y,z0.keyPath),J=w.caCertPath?Ew.isAbsolute(w.caCertPath)?w.caCertPath:Ew.join(Y,w.caCertPath):Ew.join(Y,z0.caCertPath);return{certPath:A,keyPath:X,caCertPath:J,basePath:Y}}function $2(w){let $=[],Y=new Set;if(w.domain)Y.add(w.domain);if(w.domains?.length)w.domains.forEach((A)=>Y.add(A));for(let A of Y)$.push({type:2,value:A});if(w.altNameIPs?.length)for(let A of w.altNameIPs)$.push({type:7,ip:A});if(w.altNameURIs?.length)for(let A of w.altNameURIs)$.push({type:6,value:A});if(w.subjectAltNames?.length)$.push(...w.subjectAltNames);return L(_.CERT,`Generated ${$.length} Subject Alternative Names`,w.verbose),$}function fQ(w){let $=w.notBeforeDays??fw.DEFAULT_NOT_BEFORE_DAYS,Y=w.validityDays??(w.validityYears?w.validityYears*365:fw.DEFAULT_VALIDITY_DAYS);L(_.CERT,"Calculating certificate validity dates",w.verbose);let A=new Date(Date.now()-86400*$*1000),X=new Date(A.getTime()+Y*24*60*60*1000);return A.setUTCHours(0,0,0,0),X.setUTCHours(23,59,59,999),L(_.CERT,`Validity period: ${A.toISOString()} to ${X.toISOString()}`,w.verbose),{notBefore:A,notAfter:X}}function RY(w){if(w<128)return Buffer.from([w]);let $=[],Y=w;while(Y>0)$.unshift(Y&255),Y>>=8;return Buffer.from([128|$.length,...$])}function $w(w,$){let Y=RY($.length);return Buffer.concat([Buffer.from([w]),Y,$])}function yY(w){let $=w.split(".").map(Number),Y=[];Y.push(40*$[0]+$[1]);for(let A=2;A<$.length;A++){let X=$[A],J=[];J.unshift(X&127),X>>=7;while(X>0)J.unshift(X&127|128),X>>=7;Y.push(...J)}return $w(Hw.OID,Buffer.from(Y))}function JQ(w){let $;if(typeof w==="bigint"){let Y=w.toString(16).padStart(2,"0");$=Buffer.from(Y.length%2?`0${Y}`:Y,"hex")}else if(typeof w==="number")if(w===0)$=Buffer.from([0]);else{let Y=w.toString(16).padStart(2,"0");$=Buffer.from(Y.length%2?`0${Y}`:Y,"hex")}else $=w;if($[0]&128)$=Buffer.concat([Buffer.from([0]),$]);return $w(Hw.INTEGER,$)}function Y2(w,$=0){return $w(Hw.BIT_STRING,Buffer.concat([Buffer.from([$]),w]))}function A2(w){return $w(Hw.OCTET_STRING,w)}function ww(...w){return $w(Hw.SEQUENCE,Buffer.concat(w))}function fE(...w){return $w(Hw.SET,Buffer.concat(w))}function HE(w){return $w(Hw.PRINTABLE_STRING,Buffer.from(w,"ascii"))}function RE(w){return $w(Hw.UTF8_STRING,Buffer.from(w,"utf8"))}function ME(){return Buffer.from([Hw.NULL,0])}function a9(w,$,Y=!0){let A=160|w|(Y?0:0),X=RY($.length);return Buffer.concat([Buffer.from([A]),X,$])}function s9(w){let $=w.getUTCFullYear();if($>=2050){let Y=w.toISOString().replace(/[-:T]/g,"").slice(0,14)+"Z";return $w(Hw.GENERALIZED_TIME,Buffer.from(Y,"ascii"))}else{let Y=($%100).toString().padStart(2,"0"),A=(w.getUTCMonth()+1).toString().padStart(2,"0"),X=w.getUTCDate().toString().padStart(2,"0"),J=w.getUTCHours().toString().padStart(2,"0"),U=w.getUTCMinutes().toString().padStart(2,"0"),W=w.getUTCSeconds().toString().padStart(2,"0"),Q=`${Y}${A}${X}${J}${U}${W}Z`;return $w(Hw.UTC_TIME,Buffer.from(Q,"ascii"))}}function IE(w,$){return ww(s9(w),s9($))}function o9(w){let $=[];for(let Y of w){let A;switch(Y.shortName){case"CN":A=d0.COMMON_NAME;break;case"C":A=d0.COUNTRY;break;case"L":A=d0.LOCALITY;break;case"ST":A=d0.STATE;break;case"O":A=d0.ORGANIZATION;break;case"OU":A=d0.ORGANIZATIONAL_UNIT;break;default:continue}let X=Y.shortName==="C"?HE(Y.value):RE(Y.value),J=ww(yY(A),X);$.push(fE(J))}return ww(...$)}function X2(w){return ww(yY(w),ME())}function VE(w){return w.export({type:"spki",format:"der"})}function CE(w){if(w.includes(":")){let $=w;if(w.includes("::")){let X=w.split("::"),J=X[0]?X[0].split(":"):[],U=X[1]?X[1].split(":"):[],W=8-J.length-U.length,Q=Array.from({length:W},()=>"0");$=[...J,...Q,...U].join(":")}let Y=$.split(":"),A=Buffer.alloc(16);for(let X=0;X<8;X++){let J=Number.parseInt(Y[X]||"0",16);A.writeUInt16BE(J,X*2)}return A}else{let $=w.split(".").map((Y)=>Number.parseInt(Y,10));return Buffer.from($)}}function yE(w){let $=[];for(let Y of w)if(Y.type===2&&Y.value){let A=RY(Y.value.length);$.push(Buffer.concat([Buffer.from([130]),A,Buffer.from(Y.value,"ascii")]))}else if(Y.type===7&&Y.ip){let A=CE(Y.ip),X=RY(A.length);$.push(Buffer.concat([Buffer.from([135]),X,A]))}else if(Y.type===6&&Y.value){let A=RY(Y.value.length);$.push(Buffer.concat([Buffer.from([134]),A,Buffer.from(Y.value,"ascii")]))}return ww(...$)}function OE(w,$){if(w){if($!==void 0)return ww($w(1,Buffer.from([255])),JQ($));return ww($w(1,Buffer.from([255])))}return ww()}function LE(w){let $=0;if(w.digitalSignature)$|=128;if(w.keyEncipherment)$|=32;if(w.keyCertSign)$|=4;if(w.cRLSign)$|=2;let Y=0,A=$;while(A>0&&(A&1)===0)Y++,A>>=1;if($===0)Y=7;return Y2(Buffer.from([$]),Y)}function _E(w){let $=[];if(w.serverAuth)$.push(yY(d0.SERVER_AUTH));if(w.clientAuth)$.push(yY(d0.CLIENT_AUTH));return ww(...$)}function fY(w,$,Y){let A=[yY(w)];if($)A.push($w(1,Buffer.from([255])));return A.push(A2(Y)),ww(...A)}function SE(w){let $=[];if($.push(a9(0,JQ(2))),$.push(JQ(w.serialNumber)),$.push(X2(d0.SHA256_WITH_RSA)),$.push(o9(w.issuer)),$.push(IE(w.notBefore,w.notAfter)),$.push(o9(w.subject)),$.push(VE(w.publicKey)),w.extensions){let Y=[];if(w.extensions.basicConstraints)Y.push(fY(d0.BASIC_CONSTRAINTS,w.extensions.basicConstraints.critical??!0,OE(w.extensions.basicConstraints.isCA,w.extensions.basicConstraints.pathLenConstraint)));if(w.extensions.keyUsage)Y.push(fY(d0.KEY_USAGE,w.extensions.keyUsage.critical??!0,LE(w.extensions.keyUsage)));if(w.extensions.extendedKeyUsage)Y.push(fY(d0.EXTENDED_KEY_USAGE,!1,_E(w.extensions.extendedKeyUsage)));if(w.extensions.subjectAltName?.length)Y.push(fY(d0.SUBJECT_ALT_NAME,!1,yE(w.extensions.subjectAltName)));if(w.extensions.subjectKeyIdentifier)Y.push(fY(d0.SUBJECT_KEY_IDENTIFIER,!1,A2(w.extensions.subjectKeyIdentifier)));if(Y.length>0)$.push(a9(3,ww(...Y)))}return ww(...$)}function ZE(w,$){let Y=S1.createSign("SHA256");Y.update(w);let A=Y.sign($);return ww(w,X2(d0.SHA256_WITH_RSA),Y2(A))}function kE(w,$){let Y=w.toString("base64"),A=[];for(let X=0;X<Y.length;X+=64)A.push(Y.slice(X,X+64));return`-----BEGIN ${$}-----
126
+ `;return Y}}function JE(w,$,Y={}){return lz(w,$,Y,new WeakMap)}function lz(w,$,Y,A){let{arrayMergeMode:X="replace",skipNullish:J=!1,customMerger:U}=Y;if($===null||$===void 0)return J?w:$;if(U){let W=U(w,$);if(W!==void 0)return W}if(Array.isArray($)||Array.isArray(w))return nz(w,$,X,A);if(!jw($)||!jw(w))return $;return BE(w,$,Y,A)}function nz(w,$,Y,A){if(Array.isArray($)&&!Array.isArray(w))return $;if(Array.isArray(w)&&!Array.isArray($))return $;if(Array.isArray($)&&Array.isArray(w))switch(Y){case"replace":return $;case"concat":return UE(w,$);case"smart":return QE(w,$,A);default:return $}return $}function UE(w,$){let Y=[...$];for(let A of w)if(!Y.some((X)=>XQ(X,A)))Y.push(A);return Y}function QE(w,$,Y){if($.length===0)return w;if(w.length===0)return $;if(jw($[0])&&jw(w[0]))return WE(w,$,Y);if($.every((A)=>typeof A==="string")&&w.every((A)=>typeof A==="string")){let A=[...$];for(let X of w)if(!A.includes(X))A.push(X);return A}return $}function WE(w,$,Y){let A=[...$];for(let X of w){if(!jw(X)){A.push(X);continue}let J=["id","name","key","path","type"],U=!1;for(let W of J)if(W in X){if(A.find((Q)=>jw(Q)&&(W in Q)&&Q[W]===X[W])){U=!0;break}}if(!U)A.push(X)}return A}function BE(w,$,Y,A){let X=$;if(jw(X)&&A.has(X))return A.get(X);let J={...w};if(jw(X))A.set(X,J);for(let U in X){if(!Object.prototype.hasOwnProperty.call(X,U))continue;let W=X[U],Q=J[U];if(Y.skipNullish&&(W===null||W===void 0))continue;if(W===null||W===void 0){J[U]=W;continue}if(jw(W)&&jw(Q))J[U]=lz(Q,W,Y,A);else if(Array.isArray(W)||Array.isArray(Q))J[U]=nz(Q,W,Y.arrayMergeMode||"smart",A);else J[U]=W}return J}function pz(w,$,Y="replace"){return JE(w,$,{arrayMergeMode:Y==="replace"?"replace":"smart",skipNullish:!0})}function XQ(w,$){if(w===$)return!0;if(Array.isArray(w)&&Array.isArray($)){if(w.length!==$.length)return!1;for(let Y=0;Y<w.length;Y++)if(!XQ(w[Y],$[Y]))return!1;return!0}if(jw(w)&&jw($)){let Y=Object.keys(w),A=Object.keys($);if(Y.length!==A.length)return!1;for(let X of Y){if(!Object.prototype.hasOwnProperty.call($,X))return!1;if(!XQ(w[X],$[X]))return!1}return!0}return!1}function jw(w){return Boolean(w&&typeof w==="object"&&!Array.isArray(w))}class rz{extensions=[".ts",".js",".mjs",".cjs",".json",".mts",".cts"];async loadFromPath(w,$,Y={}){let{arrayStrategy:A="replace",useCache:X=!0,cacheTtl:J,trackPerformance:U=!0,verbose:W=!1}=Y;if(X){let B=MX.getWithFileCheck("file",w);if(B){if(W)console.log(`Configuration loaded from cache: ${w}`);return B}}let Q=async()=>{if(!UX(w))return null;try{let B=`?t=${Date.now()}`,j=await import(w+B),z=j.default||j,G="default"in j,K=Object.keys(j).length>0;if(!G&&!K)throw new SX(w,Error("Configuration file is empty and exports nothing"),"unknown");if(typeof z!=="object"||z===null||Array.isArray(z))throw new SX(w,Error("Configuration must export a valid object"),"unknown");let E={config:pz($,z,A),source:{type:"file",path:w,priority:100,timestamp:new Date}};if(X)MX.setWithFileCheck("file",E,w,J);return E}catch(B){throw B instanceof Error?S1.configLoad(w,B):S1.configLoad(w,Error(String(B)))}};if(U)return jQ.track("loadFromPath",Q,{path:w});return Q()}async tryLoadFromPaths(w,$,Y={}){for(let A of w)try{let X=await this.loadFromPath(A,$,Y);if(X)return X}catch(X){if(X instanceof Error&&X.name==="ConfigLoadError")throw X;if(Y.verbose)console.warn(`Failed to load config from ${A}:`,X)}return null}generateConfigPaths(w,$,Y){let A=this.generateNamePatterns(w,Y),X=[];for(let J of A)for(let U of this.extensions)X.push(bU($,`${J}${U}`));return X}generateNamePatterns(w,$){let Y=[];if(Y.push("config",".config"),w)Y.push(w,`.${w}.config`,`${w}.config`,`.${w}`);let A=$===void 0?[]:Array.isArray($)?$:[$];for(let J of A){if(!J)continue;if(Y.push(J,`.${J}.config`,`${J}.config`,`.${J}`),w)Y.push(`${w}.${J}.config`,`.${w}.${J}.config`)}let X=new Set;return Y.filter((J)=>{if(!J||X.has(J))return!1;return X.add(J),!0})}checkFileAccess(w){return XE(async()=>{return UX(w)},{maxRetries:2,retryDelay:100,fallback:!1})}async discoverConfigFiles(w,$,Y){let A=[];if(!UX(w))return A;if($||Y){let X=this.generateNamePatterns($||"",Y);for(let J of X)for(let U of this.extensions){let W=bU(w,`${J}${U}`);if(await this.checkFileAccess(W))A.push(W)}}else try{let{readdirSync:X}=await import("fs"),J=X(w);for(let U of J)if(this.looksLikeConfigFile(U)){let W=bU(w,U);if(await this.checkFileAccess(W))A.push(W)}}catch{return[]}return A}looksLikeConfigFile(w){return[/\.config\.(ts|js|mjs|cjs|json|mts|cts)$/,/^\..*\.(ts|js|mjs|cjs|json|mts|cts)$/,/config\.(ts|js|mjs|cjs|json|mts|cts)$/].some(($)=>$.test(w))}async validateConfigFile(w){let $=[];try{if(!UX(w))return $.push("Configuration file does not exist"),$;let Y=await import(w),A=Y.default||Y;if(A===void 0)$.push("Configuration file must export a default value or named exports");else if(typeof A!=="object"||A===null)$.push("Configuration must be an object");else if(Array.isArray(A))$.push("Configuration cannot be an array at the root level");if(w.endsWith(".json"))try{let{readFileSync:X}=await import("fs"),J=X(w,"utf8");JSON.parse(J)}catch(X){$.push(`Invalid JSON syntax: ${X}`)}}catch(Y){$.push(`Failed to load configuration file: ${Y}`)}return $}async getFileModificationTime(w){try{let{statSync:$}=await import("fs");return $(w).mtime}catch{return null}}async preloadConfigurations(w,$={}){let Y=new Map;return await Promise.allSettled(w.map(async(A)=>{try{let X=await this.loadFromPath(A,{},$);if(X)Y.set(A,X.config)}catch(X){if($.verbose)console.warn(`Failed to preload ${A}:`,X)}})),Y}}class tz{async validateConfiguration(w,$,Y={}){let{stopOnFirstError:A=!1,validateRequired:X=!0,validateTypes:J=!0,customRules:U=[],trackPerformance:W=!0,verbose:Q=!1}=Y,B=async()=>{let j=[],z=[],G={stopOnFirstError:A,validateRequired:X,validateTypes:J,customRules:U,trackPerformance:W,verbose:Q};try{if(typeof $==="string")return await this.validateWithSchemaFile(w,$,G);else if(Array.isArray($))return this.validateWithRules(w,[...$,...U],G);else return this.validateWithJSONSchema(w,$,G)}catch(K){return j.push({path:"",message:`Validation failed: ${K}`,rule:"system"}),{isValid:!1,errors:j,warnings:z}}};if(W)return await jQ.track("validateConfiguration",B);return B()}async validateWithSchemaFile(w,$,Y){try{if(!dq($))throw new ZX($,[{path:"",message:"Schema file does not exist"}]);let A=await import($),X=A.default||A;if(Array.isArray(X))return this.validateWithRules(w,X,Y);else return this.validateWithJSONSchema(w,X,Y)}catch(A){throw new ZX($,[{path:"",message:`Failed to load schema: ${A}`}])}}validateWithJSONSchema(w,$,Y){let A=[],X=[];return this.validateObjectAgainstSchema(w,$,"",A,X,Y),{isValid:A.length===0,errors:A,warnings:X}}validateObjectAgainstSchema(w,$,Y,A,X,J){if(J.validateTypes&&$.type){let U=Array.isArray(w)?"array":typeof w,W=Array.isArray($.type)?$.type:[$.type];if(!W.includes(U)){if(A.push({path:Y,message:`Expected type ${W.join(" or ")}, got ${U}`,expected:W.join(" or "),actual:U,rule:"type"}),J.stopOnFirstError)return}}if($.enum&&!$.enum.includes(w)){if(A.push({path:Y,message:`Value must be one of: ${$.enum.join(", ")}`,expected:$.enum.join(", "),actual:w,rule:"enum"}),J.stopOnFirstError)return}if(typeof w==="string"){if($.minLength!==void 0&&w.length<$.minLength)A.push({path:Y,message:`String length must be at least ${$.minLength}`,expected:`>= ${$.minLength}`,actual:w.length,rule:"minLength"});if($.maxLength!==void 0&&w.length>$.maxLength)A.push({path:Y,message:`String length must not exceed ${$.maxLength}`,expected:`<= ${$.maxLength}`,actual:w.length,rule:"maxLength"});if($.pattern){if(!new RegExp($.pattern).test(w))A.push({path:Y,message:`String does not match pattern ${$.pattern}`,expected:$.pattern,actual:w,rule:"pattern"})}}if(typeof w==="number"){if($.minimum!==void 0&&w<$.minimum)A.push({path:Y,message:`Value must be at least ${$.minimum}`,expected:`>= ${$.minimum}`,actual:w,rule:"minimum"});if($.maximum!==void 0&&w>$.maximum)A.push({path:Y,message:`Value must not exceed ${$.maximum}`,expected:`<= ${$.maximum}`,actual:w,rule:"maximum"})}if(Array.isArray(w)&&$.items)for(let U=0;U<w.length;U++){let W=Y?`${Y}[${U}]`:`[${U}]`;if(this.validateObjectAgainstSchema(w[U],$.items,W,A,X,J),J.stopOnFirstError&&A.length>0)return}if(w&&typeof w==="object"&&!Array.isArray(w)){let U=w;if(J.validateRequired&&$.required){for(let W of $.required)if(!(W in U)){if(A.push({path:Y?`${Y}.${W}`:W,message:`Missing required property '${W}'`,expected:"required",rule:"required"}),J.stopOnFirstError)return}}if($.properties){for(let[W,Q]of Object.entries($.properties))if(W in U){let B=Y?`${Y}.${W}`:W;if(this.validateObjectAgainstSchema(U[W],Q,B,A,X,J),J.stopOnFirstError&&A.length>0)return}}if($.additionalProperties===!1){let W=new Set(Object.keys($.properties||{}));for(let Q of Object.keys(U))if(!W.has(Q))X.push({path:Y?`${Y}.${Q}`:Q,message:`Additional property '${Q}' is not allowed`,rule:"additionalProperties"})}}}validateWithRules(w,$,Y){let A=[],X=[];for(let J of $)try{let U=this.getValueByPath(w,J.path),W=this.validateWithRule(U,J,J.path);if(A.push(...W),Y.stopOnFirstError&&A.length>0)break}catch(U){A.push({path:J.path,message:`Rule validation failed: ${U}`,rule:"system"})}return{isValid:A.length===0,errors:A,warnings:X}}validateWithRule(w,$,Y){let A=[];if($.required&&(w===void 0||w===null))return A.push({path:Y,message:$.message||`Property '${Y}' is required`,expected:"required",rule:"required"}),A;if(w===void 0||w===null)return A;if($.type){let X=Array.isArray(w)?"array":typeof w;if(X!==$.type)A.push({path:Y,message:$.message||`Expected type ${$.type}, got ${X}`,expected:$.type,actual:X,rule:"type"})}if($.min!==void 0){let X=Array.isArray(w)?w.length:typeof w==="string"?w.length:typeof w==="number"?w:0;if(X<$.min)A.push({path:Y,message:$.message||`Value must be at least ${$.min}`,expected:`>= ${$.min}`,actual:X,rule:"min"})}if($.max!==void 0){let X=Array.isArray(w)?w.length:typeof w==="string"?w.length:typeof w==="number"?w:0;if(X>$.max)A.push({path:Y,message:$.message||`Value must not exceed ${$.max}`,expected:`<= ${$.max}`,actual:X,rule:"max"})}if($.pattern&&typeof w==="string"){if(!$.pattern.test(w))A.push({path:Y,message:$.message||`Value does not match pattern ${$.pattern}`,expected:$.pattern.toString(),actual:w,rule:"pattern"})}if($.enum&&!$.enum.includes(w))A.push({path:Y,message:$.message||`Value must be one of: ${$.enum.join(", ")}`,expected:$.enum.join(", "),actual:w,rule:"enum"});if($.validator){let X=$.validator(w);if(X)A.push({path:Y,message:$.message||X,rule:"custom"})}return A}getValueByPath(w,$){if(!$)return w;let Y=$.split("."),A=w;for(let X of Y)if(A&&typeof A==="object"&&X in A)A=A[X];else return;return A}generateRulesFromInterface(w){let $=[],Y=w.matchAll(/(\w+)(\?)?:\s*(\w+)/g);for(let A of Y){let[,X,J,U]=A;$.push({path:X,required:!J,type:this.mapTypeScriptType(U)})}return $}mapTypeScriptType(w){switch(w.toLowerCase()){case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"array":return"array";case"object":return"object";default:return"object"}}static createCommonRules(){return{server:[{path:"port",required:!0,type:"number",min:1,max:65535},{path:"host",required:!0,type:"string",min:1},{path:"ssl",type:"boolean"}],database:[{path:"url",required:!0,type:"string",min:1},{path:"pool",type:"number",min:1,max:100},{path:"timeout",type:"number",min:0}],api:[{path:"baseUrl",required:!0,type:"string",pattern:jE},{path:"timeout",type:"number",min:0},{path:"retries",type:"number",min:0,max:10}]}}}function zE(w){if(!w)return"";let $=Array.isArray(w)?w.filter(Boolean):[w];if($.length===0)return"";if($.length===1)return` or alias "${$[0]}"`;return` or aliases ${$.map((Y)=>`"${Y}"`).join(", ")}`}class az{fileLoader=new rz;envProcessor=new TQ;validator=new tz;async loadConfig(w){let $=Date.now(),{cache:Y,performance:A,schema:X,validate:J,...U}=w;try{if(Y?.enabled){let Q=this.checkCache(U.name||"",U);if(Q)return Q}let W;try{W=await this.loadConfigurationStrategies(U,!0,Y)}catch(Q){let B=U.__strictErrorHandling;if(Q instanceof Error&&Q.name==="ConfigNotFoundError"){if(B)throw Q;W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`No configuration file found for "${U.name||"config"}", using defaults with environment variables`]}}else if(Q instanceof Error&&Q.name==="ConfigLoadError"){let j=Q.message.includes("EACCES")||Q.message.includes("EPERM")||Q.message.includes("permission denied"),z=!j&&(Q.message.includes("syntax")||Q.message.includes("Expected")||Q.message.includes("Unexpected")||Q.message.includes("BuildMessage")||Q.message.includes("errors building")),G=Q.message.includes("Configuration must export a valid object")||Q.message.includes("Configuration file is empty and exports nothing");if(B&&(G||j))throw Q;if(z&&(!B||!G))W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:["Configuration file has syntax errors, using defaults with environment variables"]};else if(!B)W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`Configuration loading error, using defaults: ${Q.message}`]};else throw Q}else W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`Configuration loading failed, using defaults: ${Q instanceof Error?Q.message:String(Q)}`]}}if(X||J)await this.validateConfiguration(W.config,X,J,U.name);if(Y?.enabled&&W)this.cacheResult(U.name||"",W,Y,U);if(A?.enabled){let Q={operation:"loadConfig",duration:Date.now()-$,configName:U.name,timestamp:new Date};if(A.onMetrics)A.onMetrics(Q);if(A.slowThreshold&&Q.duration>A.slowThreshold)rw.warn(`Slow configuration loading detected: ${Q.duration}ms for ${U.name}`);W.metrics=Q}return W}catch(W){if(W instanceof Error&&W.name==="ConfigNotFoundError")throw W;let Q=Date.now()-$;throw rw.error(`Configuration loading failed after ${Q}ms:`,[W instanceof Error?W:Error(String(W))]),W}}async loadConfigurationStrategies(w,$=!1,Y){let{name:A="",alias:X,cwd:J,configDir:U,defaultConfig:W,checkEnv:Q=!0,arrayStrategy:B="replace",verbose:j=!1}=w,z=J||xX.cwd(),G=[],K=await this.loadLocalConfiguration(A,X,z,U,W,B,j,Q,Y);if(K)return G.push(...this.getLocalSearchPaths(A,X,z,U)),this.finalizeResult(K,G,Q,A,j);let E=await this.loadHomeConfiguration(A,X,W,B,j,Q);if(E)return G.push(...this.getHomeSearchPaths(A,X)),this.finalizeResult(E,G,Q,A,j);let q=await this.loadPackageJsonConfiguration(A,X,z,W,B,j,Q);if(q)return G.push(Ww(z,"package.json")),this.finalizeResult(q,G,Q,A,j);if(G.push(...this.getAllSearchPaths(A,X,z,U)),$)throw S1.configNotFound(A,G,X);return{...await this.applyEnvironmentVariables(A,W,Q,j),warnings:[`No configuration file found for "${A}"${zE(X)}, using defaults with environment variables`]}}async loadLocalConfiguration(w,$,Y,A,X,J,U,W,Q){let B=W?WX(w,X,U):X,j=this.getLocalDirectories(Y,A);for(let z of j){if(U)rw.info(`Searching for configuration in: ${z}`);let G=this.fileLoader.generateConfigPaths(w,z,$),K=await this.fileLoader.tryLoadFromPaths(G,B,{arrayStrategy:J,verbose:U,cacheTtl:Q?.ttl,useCache:!Q?.ttl||Q.ttl>100});if(K){if(U)rw.success(`Configuration loaded from: ${K.source.path}`);return K}}return null}async loadHomeConfiguration(w,$,Y,A,X,J){if(!w)return null;let U=J?WX(w,Y,X):Y,W=[Ww(E1(),".config",w),Ww(E1(),".config"),E1()];for(let Q of W){if(X)rw.info(`Checking home directory: ${Q}`);let B=this.fileLoader.generateConfigPaths(w,Q,$),j=await this.fileLoader.tryLoadFromPaths(B,U,{arrayStrategy:A,verbose:X});if(j){if(X)rw.success(`Configuration loaded from home directory: ${j.source.path}`);return j}}return null}async loadPackageJsonConfiguration(w,$,Y,A,X,J,U){let W=U?WX(w,A,J):A;try{let Q=Ww(Y,"package.json");if(!Xq(Q))return null;let B={};try{B=JSON.parse(Jq(Q,"utf8"))}catch(G){if(J)rw.warn("Failed to parse package.json:",[G instanceof Error?G:Error(String(G))]);return null}let j=B[w],z=w;if(!j&&$){let G=Array.isArray($)?$:[$];for(let K of G){if(!K)continue;if(B[K]){j=B[K],z=K;break}}}if(j&&typeof j==="object"&&!Array.isArray(j)){if(J)rw.success(`Configuration loaded from package.json: ${z}`);return{config:pz(W,j,X),source:{type:"package.json",path:Q,priority:30,timestamp:new Date}}}}catch(Q){if(J)rw.warn("Failed to load package.json:",[Q instanceof Error?Q:Error(String(Q))])}return null}async applyEnvironmentVariables(w,$,Y,A){if(!Y||!w||typeof $!=="object"||$===null||Array.isArray($))return{config:$,source:{type:"default",priority:10,timestamp:new Date}};return{config:WX(w,$,A),source:{type:"environment",priority:20,timestamp:new Date}}}async finalizeResult(w,$,Y,A,X){return{config:w.config,source:w.source,path:w.source.path}}async validateConfiguration(w,$,Y,A){let X=[];if(Y){let J=Y(w);if(J)X.push(...J)}if($){let J=await this.validator.validateConfiguration(w,$);if(!J.isValid)X.push(...J.errors.map((U)=>U.path?`${U.path}: ${U.message}`:U.message))}if(X.length>0)throw S1.configValidation(A||"unknown",X,A)}checkCache(w,$){let Y=this.generateCacheKey(w,$);return MX.get(Y)||null}cacheResult(w,$,Y,A){let X=this.generateCacheKey(w,A);MX.set(X,$,void 0,Y.ttl)}generateCacheKey(w,$){let Y=[w];if($.alias){let A=Array.isArray($.alias)?$.alias.join(","):$.alias;Y.push(`alias:${A}`)}if($.cwd)Y.push(`cwd:${$.cwd}`);if($.configDir)Y.push(`configDir:${$.configDir}`);if("checkEnv"in $)Y.push(`checkEnv:${$.checkEnv}`);return Y.join("|")}getLocalDirectories(w,$){return Array.from(new Set([w,Ww(w,"config"),Ww(w,".config"),$?Ww(w,$):void 0].filter(Boolean)))}getAllSearchPaths(w,$,Y,A){let X=[];return X.push(...this.getLocalSearchPaths(w,$,Y,A)),X.push(...this.getHomeSearchPaths(w,$)),X.push(Ww(Y,"package.json")),X}getLocalSearchPaths(w,$,Y,A){let X=this.getLocalDirectories(Y,A),J=[];for(let U of X)J.push(...this.fileLoader.generateConfigPaths(w,U,$));return J}getHomeSearchPaths(w,$){if(!w)return[];let Y=[Ww(E1(),".config",w),Ww(E1(),".config"),E1()],A=[];for(let X of Y)A.push(...this.fileLoader.generateConfigPaths(w,X,$));return A}async loadConfigWithResult(w){return this.loadConfig(w)}}function WX(w,$,Y=!1){let A=new TQ,X=w.toUpperCase().replace(/[^A-Z0-9]/g,"_");function J(U,W=[]){let Q={...U};for(let[B,j]of Object.entries(U)){let z=[...W,B],G=[`${X}_${z.join("_").toUpperCase()}`,`${X}_${z.map((q)=>q.toUpperCase()).join("")}`,`${X}_${z.map((q)=>q.replace(/([A-Z])/g,"_$1").toUpperCase()).join("")}`],K,E;for(let q of G)if(K=xX.env[q],K!==void 0){E=q;break}if(K!==void 0&&E)if(typeof j==="boolean")Q[B]=["true","1","yes"].includes(K.toLowerCase());else if(typeof j==="number"){let q=Number(K);if(!Number.isNaN(q))Q[B]=q}else if(Array.isArray(j))try{Q[B]=JSON.parse(K)}catch{Q[B]=K.split(",").map((q)=>q.trim())}else Q[B]=K;else if(j&&typeof j==="object"&&!Array.isArray(j))Q[B]=J(j,z)}return Q}return J($)}function ez(w){return JQ.readFileSync(w,"utf8")}function UQ(w,$){let Y=[];function A(X){let J;try{J=JQ.readdirSync(X)}catch{return}for(let U of J){let W=Ew.join(X,U);try{if(JQ.statSync(W).isDirectory())A(W);else if(U===$)Y.push(X)}catch{continue}}}return A(w),Y}function L(w,$,Y){if(Y||z0.verbose)console.debug(`[tlsx:${w}] ${$}`)}function w2(){return oz.env.SUDO_PASSWORD}function fE(w){let $=w.toLowerCase();return NE.has($)||$.endsWith("password")||$.includes("secret")||$.includes("token")}function kX(w){if(Array.isArray(w))return w.map((Y)=>kX(Y));if(typeof w==="string")return EE.test(w)?a9:w;if(!w||typeof w!=="object")return w;let $={};for(let[Y,A]of Object.entries(w)){if(fE(Y)){$[Y]=a9;continue}$[Y]=kX(A)}return $}function cX(w){return JSON.stringify(kX(w))}function TE(w){let $=w2();if(!$||!/(^|\|\s*|&&\s*|;\s*)sudo\s/.test(w))return w;let Y=$.replace(/'/g,"'\\''"),A=w.replace(/(^|\|\s*|&&\s*|;\s*)sudo(?!\s+-[Sn])(\s+)/g,"$1sudo -S$2");return`echo '${Y}' | ${A}`}async function f$(w,$={}){let Y=TE(w);try{let{stdout:A,stderr:X}=await qE(Y,{cwd:$.cwd||oz.cwd(),timeout:$.timeout||30000});return{stdout:A.trim(),stderr:X.trim()}}catch(A){let X=Error(`Failed to execute command: ${w}
127
+ Error: ${A.message}`);throw X.stack=A.stack,X}}function $2(w){if(w.domain)return w.domain;if(w.domains?.length)return w.domains[0];throw Error("Either domain or domains must be specified")}function HQ(w){let $=Ew.join(KE.homedir(),".stacks","ssl"),Y=w.basePath&&w.basePath.trim()!==""?w.basePath:z0.basePath&&z0.basePath.trim()!==""?z0.basePath:$,A=w.certPath?Ew.isAbsolute(w.certPath)?w.certPath:Ew.join(Y,w.certPath):Ew.join(Y,z0.certPath),X=w.keyPath?Ew.isAbsolute(w.keyPath)?w.keyPath:Ew.join(Y,w.keyPath):Ew.join(Y,z0.keyPath),J=w.caCertPath?Ew.isAbsolute(w.caCertPath)?w.caCertPath:Ew.join(Y,w.caCertPath):Ew.join(Y,z0.caCertPath);return{certPath:A,keyPath:X,caCertPath:J,basePath:Y}}function Y2(w){let $=[],Y=new Set;if(w.domain)Y.add(w.domain);if(w.domains?.length)w.domains.forEach((A)=>Y.add(A));for(let A of Y)$.push({type:2,value:A});if(w.altNameIPs?.length)for(let A of w.altNameIPs)$.push({type:7,ip:A});if(w.altNameURIs?.length)for(let A of w.altNameURIs)$.push({type:6,value:A});if(w.subjectAltNames?.length)$.push(...w.subjectAltNames);return L(_.CERT,`Generated ${$.length} Subject Alternative Names`,w.verbose),$}function RQ(w){let $=w.notBeforeDays??Tw.DEFAULT_NOT_BEFORE_DAYS,Y=w.validityDays??(w.validityYears?w.validityYears*365:Tw.DEFAULT_VALIDITY_DAYS);L(_.CERT,"Calculating certificate validity dates",w.verbose);let A=new Date(Date.now()-86400*$*1000),X=new Date(A.getTime()+Y*24*60*60*1000);return A.setUTCHours(0,0,0,0),X.setUTCHours(23,59,59,999),L(_.CERT,`Validity period: ${A.toISOString()} to ${X.toISOString()}`,w.verbose),{notBefore:A,notAfter:X}}function MY(w){if(w<128)return Buffer.from([w]);let $=[],Y=w;while(Y>0)$.unshift(Y&255),Y>>=8;return Buffer.from([128|$.length,...$])}function $w(w,$){let Y=MY($.length);return Buffer.concat([Buffer.from([w]),Y,$])}function OY(w){let $=w.split(".").map(Number),Y=[];Y.push(40*$[0]+$[1]);for(let A=2;A<$.length;A++){let X=$[A],J=[];J.unshift(X&127),X>>=7;while(X>0)J.unshift(X&127|128),X>>=7;Y.push(...J)}return $w(Hw.OID,Buffer.from(Y))}function QQ(w){let $;if(typeof w==="bigint"){let Y=w.toString(16).padStart(2,"0");$=Buffer.from(Y.length%2?`0${Y}`:Y,"hex")}else if(typeof w==="number")if(w===0)$=Buffer.from([0]);else{let Y=w.toString(16).padStart(2,"0");$=Buffer.from(Y.length%2?`0${Y}`:Y,"hex")}else $=w;if($[0]&128)$=Buffer.concat([Buffer.from([0]),$]);return $w(Hw.INTEGER,$)}function A2(w,$=0){return $w(Hw.BIT_STRING,Buffer.concat([Buffer.from([$]),w]))}function X2(w){return $w(Hw.OCTET_STRING,w)}function ww(...w){return $w(Hw.SEQUENCE,Buffer.concat(w))}function HE(...w){return $w(Hw.SET,Buffer.concat(w))}function RE(w){return $w(Hw.PRINTABLE_STRING,Buffer.from(w,"ascii"))}function ME(w){return $w(Hw.UTF8_STRING,Buffer.from(w,"utf8"))}function IE(){return Buffer.from([Hw.NULL,0])}function s9(w,$,Y=!0){let A=160|w|(Y?0:0),X=MY($.length);return Buffer.concat([Buffer.from([A]),X,$])}function o9(w){let $=w.getUTCFullYear();if($>=2050){let Y=w.toISOString().replace(/[-:T]/g,"").slice(0,14)+"Z";return $w(Hw.GENERALIZED_TIME,Buffer.from(Y,"ascii"))}else{let Y=($%100).toString().padStart(2,"0"),A=(w.getUTCMonth()+1).toString().padStart(2,"0"),X=w.getUTCDate().toString().padStart(2,"0"),J=w.getUTCHours().toString().padStart(2,"0"),U=w.getUTCMinutes().toString().padStart(2,"0"),W=w.getUTCSeconds().toString().padStart(2,"0"),Q=`${Y}${A}${X}${J}${U}${W}Z`;return $w(Hw.UTC_TIME,Buffer.from(Q,"ascii"))}}function VE(w,$){return ww(o9(w),o9($))}function e9(w){let $=[];for(let Y of w){let A;switch(Y.shortName){case"CN":A=d0.COMMON_NAME;break;case"C":A=d0.COUNTRY;break;case"L":A=d0.LOCALITY;break;case"ST":A=d0.STATE;break;case"O":A=d0.ORGANIZATION;break;case"OU":A=d0.ORGANIZATIONAL_UNIT;break;default:continue}let X=Y.shortName==="C"?RE(Y.value):ME(Y.value),J=ww(OY(A),X);$.push(HE(J))}return ww(...$)}function J2(w){return ww(OY(w),IE())}function CE(w){return w.export({type:"spki",format:"der"})}function yE(w){if(w.includes(":")){let $=w;if(w.includes("::")){let X=w.split("::"),J=X[0]?X[0].split(":"):[],U=X[1]?X[1].split(":"):[],W=8-J.length-U.length,Q=Array.from({length:W},()=>"0");$=[...J,...Q,...U].join(":")}let Y=$.split(":"),A=Buffer.alloc(16);for(let X=0;X<8;X++){let J=Number.parseInt(Y[X]||"0",16);A.writeUInt16BE(J,X*2)}return A}else{let $=w.split(".").map((Y)=>Number.parseInt(Y,10));return Buffer.from($)}}function OE(w){let $=[];for(let Y of w)if(Y.type===2&&Y.value){let A=MY(Y.value.length);$.push(Buffer.concat([Buffer.from([130]),A,Buffer.from(Y.value,"ascii")]))}else if(Y.type===7&&Y.ip){let A=yE(Y.ip),X=MY(A.length);$.push(Buffer.concat([Buffer.from([135]),X,A]))}else if(Y.type===6&&Y.value){let A=MY(Y.value.length);$.push(Buffer.concat([Buffer.from([134]),A,Buffer.from(Y.value,"ascii")]))}return ww(...$)}function LE(w,$){if(w){if($!==void 0)return ww($w(1,Buffer.from([255])),QQ($));return ww($w(1,Buffer.from([255])))}return ww()}function _E(w){let $=0;if(w.digitalSignature)$|=128;if(w.keyEncipherment)$|=32;if(w.keyCertSign)$|=4;if(w.cRLSign)$|=2;let Y=0,A=$;while(A>0&&(A&1)===0)Y++,A>>=1;if($===0)Y=7;return A2(Buffer.from([$]),Y)}function SE(w){let $=[];if(w.serverAuth)$.push(OY(d0.SERVER_AUTH));if(w.clientAuth)$.push(OY(d0.CLIENT_AUTH));return ww(...$)}function HY(w,$,Y){let A=[OY(w)];if($)A.push($w(1,Buffer.from([255])));return A.push(X2(Y)),ww(...A)}function ZE(w){let $=[];if($.push(s9(0,QQ(2))),$.push(QQ(w.serialNumber)),$.push(J2(d0.SHA256_WITH_RSA)),$.push(e9(w.issuer)),$.push(VE(w.notBefore,w.notAfter)),$.push(e9(w.subject)),$.push(CE(w.publicKey)),w.extensions){let Y=[];if(w.extensions.basicConstraints)Y.push(HY(d0.BASIC_CONSTRAINTS,w.extensions.basicConstraints.critical??!0,LE(w.extensions.basicConstraints.isCA,w.extensions.basicConstraints.pathLenConstraint)));if(w.extensions.keyUsage)Y.push(HY(d0.KEY_USAGE,w.extensions.keyUsage.critical??!0,_E(w.extensions.keyUsage)));if(w.extensions.extendedKeyUsage)Y.push(HY(d0.EXTENDED_KEY_USAGE,!1,SE(w.extensions.extendedKeyUsage)));if(w.extensions.subjectAltName?.length)Y.push(HY(d0.SUBJECT_ALT_NAME,!1,OE(w.extensions.subjectAltName)));if(w.extensions.subjectKeyIdentifier)Y.push(HY(d0.SUBJECT_KEY_IDENTIFIER,!1,X2(w.extensions.subjectKeyIdentifier)));if(Y.length>0)$.push(s9(3,ww(...Y)))}return ww(...$)}function kE(w,$){let Y=Z1.createSign("SHA256");Y.update(w);let A=Y.sign($);return ww(w,J2(d0.SHA256_WITH_RSA),A2(A))}function hE(w,$){let Y=w.toString("base64"),A=[];for(let X=0;X<Y.length;X+=64)A.push(Y.slice(X,X+64));return`-----BEGIN ${$}-----
128
128
  ${A.join(`
129
129
  `)}
130
130
  -----END ${$}-----
131
- `}function HQ(){let w=S1.randomBytes(20);return w[0]=w[0]&127||1,w}function J2(w=2048){let{privateKey:$,publicKey:Y}=S1.generateKeyPairSync("rsa",{modulusLength:w});return{privateKey:$,publicKey:Y}}function hE(w){let $=w.export({type:"spki",format:"der"});return S1.createHash("sha1").update($).digest()}function U2(w){let $={serialNumber:w.serialNumber||HQ(),notBefore:w.notBefore,notAfter:w.notAfter,subject:w.subject,issuer:w.issuer||w.subject,publicKey:w.publicKey,extensions:{basicConstraints:{isCA:w.isCA??!1,critical:!0,pathLenConstraint:w.pathLenConstraint},subjectKeyIdentifier:hE(w.publicKey)}};if(w.keyUsage)$.extensions.keyUsage={...w.keyUsage,critical:!0};if(w.extendedKeyUsage)$.extensions.extendedKeyUsage=w.extendedKeyUsage;if(w.subjectAltName?.length)$.extensions.subjectAltName=w.subjectAltName;let Y=SE($),A=ZE(Y,w.signingKey);return{certificate:kE(A,"CERTIFICATE"),certificateDer:A}}function Q2(w){return w.export({type:"pkcs8",format:"pem"})}function DE(w){return S1.createPrivateKey(w)}function xE(w){let $=new S1.X509Certificate(w),Y=$.publicKey,A=[],X=$.subject.split(`
132
- `);for(let J of X){let[U,...W]=J.split("="),Q=W.join("=");if(U&&Q)A.push({shortName:U.trim(),value:Q.trim()})}return{publicKey:Y,subject:A}}async function RQ(w={}){L("ca","Creating new Root CA Certificate",w.verbose);let $=w.keySize||fw.DEFAULT_KEY_SIZE;L("ca",`Generating ${$}-bit RSA key pair`,w.verbose);let{privateKey:Y,publicKey:A}=J2($),X=[{shortName:"C",value:w.countryName||z0.countryName},{shortName:"ST",value:w.stateName||z0.stateName},{shortName:"L",value:w.localityName||z0.localityName},{shortName:"O",value:w.organization||"Local Development CA"},{shortName:"OU",value:w.organizationalUnit||"Certificate Authority"},{shortName:"CN",value:w.commonName||"Local Development Root CA"}],{notBefore:J,notAfter:U}=fQ({validityYears:w.validityYears||fw.DEFAULT_CA_VALIDITY_YEARS,verbose:w.verbose}),{certificate:W}=U2({serialNumber:HQ(),notBefore:J,notAfter:U,subject:X,publicKey:A,signingKey:Y,isCA:!0,keyUsage:{keyCertSign:!0,cRLSign:!0}});return{certificate:W,privateKey:Q2(Y),notBefore:J,notAfter:U}}async function MQ(w){if(L("ca","Generating new certificate",w.verbose),L("ca",`Options: ${bX(w)}`,w.verbose),!w.domain&&!w.domains?.length)throw Error("Either domain or domains must be specified");if(!w.rootCA?.certificate||!w.rootCA?.privateKey)throw Error("Root CA certificate and private key are required");let{subject:$}=xE(w.rootCA.certificate),Y=DE(w.rootCA.privateKey);L("ca",`Generating ${fw.DEFAULT_KEY_SIZE}-bit RSA key pair for host certificate`,w.verbose);let A=fw.DEFAULT_KEY_SIZE,{privateKey:X,publicKey:J}=J2(A),U=w.commonName||w2(w),W=w.certificateAttributes||[{shortName:"C",value:w.countryName||z0.countryName},{shortName:"ST",value:w.stateName||z0.stateName},{shortName:"L",value:w.localityName||z0.localityName},{shortName:"O",value:w.organizationName||z0.organizationName},{shortName:"CN",value:U}],{notBefore:Q,notAfter:B}=fQ({validityDays:w.validityDays||fw.DEFAULT_VALIDITY_DAYS,verbose:w.verbose}),j=$2(w),z=w.keyUsage||{digitalSignature:!0,keyEncipherment:!0},G=w.extKeyUsage||{serverAuth:!0},{certificate:K}=U2({serialNumber:HQ(),notBefore:Q,notAfter:B,subject:W,issuer:$,publicKey:J,signingKey:Y,isCA:w.basicConstraints?.cA??!1,pathLenConstraint:w.basicConstraints?.pathLenConstraint,keyUsage:z,extendedKeyUsage:G,subjectAltName:j});return{certificate:K,privateKey:Q2(X),notBefore:Q,notAfter:B}}function W2(w,$){L(_.STORAGE,`Storing certificate and private key with options: ${bX($)}`,$?.verbose);let{certPath:Y,keyPath:A}=TQ({basePath:$?.basePath,certPath:$?.certPath,keyPath:$?.keyPath});L(_.STORAGE,`Certificate path: ${Y}`,$?.verbose),L(_.STORAGE,`Private key path: ${A}`,$?.verbose);let X=UQ.dirname(Y);if(!ow.existsSync(X))L(_.STORAGE,`Creating certificate directory: ${X}`,$?.verbose),ow.mkdirSync(X,{recursive:!0});L(_.STORAGE,"Writing certificate file",$?.verbose),ow.writeFileSync(Y,w.certificate);let J=UQ.dirname(A);if(!ow.existsSync(J))L(_.STORAGE,`Creating private key directory: ${J}`,$?.verbose),ow.mkdirSync(J,{recursive:!0});return L(_.STORAGE,"Writing private key file",$?.verbose),ow.writeFileSync(A,w.privateKey),L(_.STORAGE,"Certificate and private key stored successfully",$?.verbose),Y}function B2(w,$){L(_.STORAGE,"Storing CA certificate",$?.verbose);let{caCertPath:Y}=TQ({basePath:$?.basePath,caCertPath:$?.caCertPath});L(_.STORAGE,`CA certificate path: ${Y}`,$?.verbose);let A=UQ.dirname(Y);if(!ow.existsSync(A))L(_.STORAGE,`Creating CA certificate directory: ${A}`,$?.verbose),ow.mkdirSync(A,{recursive:!0});return L(_.STORAGE,"Writing CA certificate file",$?.verbose),ow.writeFileSync(Y,w),L(_.STORAGE,"CA certificate stored successfully",$?.verbose),Y}function uX(w){let $;if(w.startsWith("-----BEGIN CERTIFICATE-----"))$=w;else $=oz(w);return new PE.X509Certificate($)}function cX(w){return uX(w).fingerprint256.replace(/:/g,"").toUpperCase()}function IQ(w){return j2(uX(w).subject)}function bE(w){let $=[],Y=w.split(`
133
- `);for(let A of Y){let[X,...J]=A.split("="),U=J.join("=");if(X&&U)$.push({shortName:X.trim(),value:U.trim()})}return $}function j2(w){return bE(w).find(($)=>$.shortName==="CN")?.value||""}function uE(w){let $=[],Y=j2(w.subject);if(Y&&!/^\d+\.\d+\.\d+\.\d+$/.test(Y))$.push(Y);let A=w.subjectAltName;if(A){let X=A.split(", ");for(let J of X)if(J.startsWith("DNS:"))$.push(J.slice(4))}return[...new Set($)]}function VQ(w,$){let Y=uX(w),A=uE(Y);for(let X of A){if(X===$)return!0;if(X.startsWith("*.")){let J=X.slice(2);if($.endsWith(J)&&$.indexOf(".")===$.lastIndexOf("."))return!0}}return!1}async function vE(w,$){if(ZX.platform()!=="darwin")return!1;try{let Y=cX(w);if(!Y)return L(_.TRUST,"Could not extract certificate fingerprint",$),!1;try{if(cE("security find-certificate -a -Z 2>/dev/null || true").toString().split(`
134
- `).some((A)=>{let X=A.match(/SHA-256 hash:\s*([A-F0-9]+)/i);return!!X&&X[1].toUpperCase()===Y}))return L(_.TRUST,"Certificate fingerprint found in system keychain",$),!0}catch{}return L(_.TRUST,"Certificate fingerprint not found in system keychain",$),!1}catch(Y){return L(_.TRUST,`Error checking certificate trust: ${Y}`,$),!1}}async function CQ(w,$,Y){L(_.TRUST,`Adding certificate to system trust store with options: ${bX(Y)}`,Y?.verbose),L(_.TRUST,"Storing certificate and private key",Y?.verbose);let A=W2(w,Y);L(_.TRUST,"Storing CA certificate",Y?.verbose);let X=B2($,Y),J=ZX.platform();L(_.TRUST,`Detected platform: ${J}`,Y?.verbose);let U=dE[J];if(!U){let W=`Unsupported platform: ${J}`;throw L(_.TRUST,`Error: ${W}`,Y?.verbose),Error(W)}return await U.addCertificate(X,Y),L(_.TRUST,"Certificate successfully added to system trust store",Y?.verbose),A}var mF,e9=30000,kX,Xz="https://acme-staging-v02.api.letsencrypt.org/directory",Jz="https://acme-v02.api.letsencrypt.org/directory",FX,rF="1.2.840.10045.2.1",tF="1.2.840.10045.3.1.7",aF="1.2.840.10045.4.3.2",sF="2.5.4.3",oF="1.2.840.113549.1.9.14",eF="2.5.29.17",HX,WQ,dq,lq=(w)=>w,pq=(w,$)=>{for(var Y in $)dq(w,Y,{get:$[Y],enumerable:!0,configurable:!0,set:nq.bind($,Y)})},rq=(w,$)=>()=>(w&&($=w(w=0)),$),Tz,Oz,L1,OY,Lz,RN,MN,b9,jX,rU,Z0,s,IN,u9,VN,c9,CN,yN,PU,ON,v9,i9,bU,LN,_N,SN,ZN,zX,_z,kN,k0,hN,DN,m9,GX,tU,T0,c,xN,g9,PN,d9,bN,uN,uU,cN,l9,n9,vN,cU,iN,mN,gN,dN,lN,KX,Sz,nN,pN="0.15.6",e0,CX,VY,aU,sU,yX,oU,eU,CY,wQ,$Q,f$,Zz,kz,Tw,ew,hz,Dz,rN,aN,xz,OX,r3,V0,m,t3,oN,a3,eN,s3,o3,p9,e3,wE,$E,wC,r9,$C,YC,AC,XC,JC,vU,YE,UC,Rw,bz,LX,uz,cz,NQ,vz,iz,_X,mz,gz,_1,BE,rw,QC,WC,BC,az,z0,fw,_,O1,FE,t9="[redacted]",qE,NE,Hw,d0,iE,mE,gE,dE;var z2=t(()=>{mF=iF(import.meta.url);kX=new MY;FX=class FX extends Error{problem;httpStatus;constructor(w,$,Y){super(w);this.name="AcmeError",this.problem=$,this.httpStatus=Y}};HX=new Nz,WQ=new Ez,dq=Object.defineProperty;Tz={};pq(Tz,{withErrorRecovery:()=>Rz,tryLoadConfig:()=>EN,loadConfigWithResult:()=>qN,loadConfig:()=>yz,isRetryableError:()=>BN,isConfigNotFoundError:()=>WN,isBunfigError:()=>Mz,globalPerformanceMonitor:()=>OY,globalCache:()=>L1,getEnvOrDefault:()=>jN,generateConfigTypes:()=>TN,defaultGeneratedDir:()=>Dz,defaultConfigDir:()=>hz,deepMergeWithArrayStrategy:()=>KQ,deepMerge:()=>Iz,createLibraryConfig:()=>fN,config:()=>NN,bunfigPlugin:()=>HN,applyEnvVarsToConfig:()=>HY,TypeGenerationError:()=>eU,SchemaValidationError:()=>CY,PluginError:()=>$Q,PerformanceMonitor:()=>jQ,FileSystemError:()=>oU,ErrorFactory:()=>f$,EnvVarError:()=>yX,EnvProcessor:()=>DX,ConfigValidator:()=>FQ,ConfigValidationError:()=>aU,ConfigNotFoundError:()=>CX,ConfigMergeError:()=>sU,ConfigLoader:()=>qQ,ConfigLoadError:()=>VY,ConfigFileLoader:()=>xX,ConfigCache:()=>BQ,CacheUtils:()=>Lz,BunfigError:()=>e0,BrowserConfigError:()=>wQ,ArrayMergeStrategies:()=>Zz});rN=rq(async()=>{Oz=import.meta.require,L1=new BQ,OY=new jQ,Lz={createKey:tq,isEquivalent:aq,estimateMemoryUsage:sq},RN=TX(nU.cwd(),"config"),MN=TX(nU.cwd(),"src/generated"),b9=EX.env.CLARITY_LOG_DIR||jq(wN(),"logs"),jX={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:b9,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1},rU=await $N(),Z0={red:(w)=>`\x1B[31m${w}\x1B[0m`,green:(w)=>`\x1B[32m${w}\x1B[0m`,yellow:(w)=>`\x1B[33m${w}\x1B[0m`,blue:(w)=>`\x1B[34m${w}\x1B[0m`,magenta:(w)=>`\x1B[35m${w}\x1B[0m`,cyan:(w)=>`\x1B[36m${w}\x1B[0m`,white:(w)=>`\x1B[37m${w}\x1B[0m`,gray:(w)=>`\x1B[90m${w}\x1B[0m`,bgRed:(w)=>`\x1B[41m${w}\x1B[0m`,bgYellow:(w)=>`\x1B[43m${w}\x1B[0m`,bold:(w)=>`\x1B[1m${w}\x1B[0m`,dim:(w)=>`\x1B[2m${w}\x1B[0m`,italic:(w)=>`\x1B[3m${w}\x1B[0m`,underline:(w)=>`\x1B[4m${w}\x1B[0m`,reset:"\x1B[0m"},s=Z0,IN=Z0.red,u9=Z0.green,VN=Z0.yellow,c9=Z0.blue,CN=Z0.magenta,yN=Z0.cyan,PU=Z0.white,ON=Z0.gray,v9=Z0.bgRed,i9=Z0.bgYellow,bU=Z0.bold,LN=Z0.dim,_N=Z0.italic,SN=Z0.underline,ZN=Z0.reset,zX={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},_z={debug:"\uD83D\uDD0D",info:c9("ℹ"),success:u9("✓"),warning:i9(PU(bU(" WARN "))),error:v9(PU(bU(" ERROR ")))},kN=new MX("stacks"),k0=new MX("bunfig",{showTags:!0}),hN=m0(IY.cwd(),"config"),DN=m0(IY.cwd(),"src/generated"),m9=NX.env.CLARITY_LOG_DIR||Wq(JN(),"logs"),GX={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:m9,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1,writeToFile:!1},tU=await UN(),T0={red:(w)=>`\x1B[31m${w}\x1B[0m`,green:(w)=>`\x1B[32m${w}\x1B[0m`,yellow:(w)=>`\x1B[33m${w}\x1B[0m`,blue:(w)=>`\x1B[34m${w}\x1B[0m`,magenta:(w)=>`\x1B[35m${w}\x1B[0m`,cyan:(w)=>`\x1B[36m${w}\x1B[0m`,white:(w)=>`\x1B[37m${w}\x1B[0m`,gray:(w)=>`\x1B[90m${w}\x1B[0m`,bgRed:(w)=>`\x1B[41m${w}\x1B[0m`,bgYellow:(w)=>`\x1B[43m${w}\x1B[0m`,bgGray:(w)=>`\x1B[100m${w}\x1B[0m`,bold:(w)=>`\x1B[1m${w}\x1B[0m`,dim:(w)=>`\x1B[2m${w}\x1B[0m`,italic:(w)=>`\x1B[3m${w}\x1B[0m`,underline:(w)=>`\x1B[4m${w}\x1B[0m`,strikethrough:(w)=>`\x1B[9m${w}\x1B[0m`,reset:"\x1B[0m"},c=T0,xN=T0.red,g9=T0.green,PN=T0.yellow,d9=T0.blue,bN=T0.magenta,uN=T0.cyan,uU=T0.white,cN=T0.gray,l9=T0.bgRed,n9=T0.bgYellow,vN=T0.bgGray,cU=T0.bold,iN=T0.dim,mN=T0.italic,gN=T0.underline,dN=T0.strikethrough,lN=T0.reset,KX={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},Sz={debug:"\uD83D\uDD0D",info:d9("ℹ"),success:g9("✓"),warning:n9(uU(cU(" WARN "))),error:l9(uU(cU(" ERROR ")))},nN=new VX("stacks"),e0=class extends Error{timestamp;context;constructor(w,$={}){super(w);if(this.name=this.constructor.name,this.timestamp=new Date,this.context=$,Error.captureStackTrace)Error.captureStackTrace(this,this.constructor)}toJSON(){return{name:this.name,code:this.code,message:this.message,timestamp:this.timestamp.toISOString(),context:this.context,stack:this.stack}}toString(){let w=Object.keys(this.context).length>0?` (${Object.entries(this.context).map(([$,Y])=>`${$}: ${Y}`).join(", ")})`:"";return`${this.name} [${this.code}]: ${this.message}${w}`}},CX=class extends e0{code="CONFIG_NOT_FOUND";constructor(w,$,Y){let A=Y?` or alias "${Y}"`:"";super(`Configuration "${w}"${A} not found`,{configName:w,alias:Y,searchPaths:$,searchPathCount:$.length})}},VY=class extends e0{code="CONFIG_LOAD_ERROR";constructor(w,$,Y){super(`Failed to load configuration from "${w}": ${$.message}`,{configPath:w,configName:Y,originalError:$.name,originalMessage:$.message});this.cause=$}},aU=class extends e0{code="CONFIG_VALIDATION_ERROR";constructor(w,$,Y){super(`Configuration validation failed for "${w}"`,{configPath:w,configName:Y,validationErrors:$,errorCount:$.length})}},sU=class extends e0{code="CONFIG_MERGE_ERROR";constructor(w,$,Y,A){super(`Failed to merge configuration from "${w}" with "${$}": ${Y.message}`,{sourcePath:w,targetPath:$,configName:A,originalError:Y.name,originalMessage:Y.message});this.cause=Y}},yX=class extends e0{code="ENV_VAR_ERROR";constructor(w,$,Y,A){super(`Failed to parse environment variable "${w}" with value "${$}" as ${Y}`,{envKey:w,envValue:$,expectedType:Y,configName:A})}},oU=class extends e0{code="FILE_SYSTEM_ERROR";constructor(w,$,Y){super(`File system ${w} failed for "${$}": ${Y.message}`,{operation:w,path:$,originalError:Y.name,originalMessage:Y.message});this.cause=Y}},eU=class extends e0{code="TYPE_GENERATION_ERROR";constructor(w,$,Y){super(`Failed to generate types from "${w}" to "${$}": ${Y.message}`,{configDir:w,outputPath:$,originalError:Y.name,originalMessage:Y.message});this.cause=Y}},CY=class extends e0{code="SCHEMA_VALIDATION_ERROR";constructor(w,$,Y){super(`Schema validation failed${Y?` for config "${Y}"`:""}`,{schemaPath:w,configName:Y,validationErrors:$,errorCount:$.length})}},wQ=class extends e0{code="BROWSER_CONFIG_ERROR";constructor(w,$,Y,A){super(`Failed to fetch configuration from "${w}": ${$} ${Y}`,{endpoint:w,status:$,statusText:Y,configName:A})}},$Q=class extends e0{code="PLUGIN_ERROR";constructor(w,$,Y){super(`Plugin "${w}" failed during ${$}: ${Y.message}`,{pluginName:w,operation:$,originalError:Y.name,originalMessage:Y.message});this.cause=Y}},f$={configNotFound(w,$,Y){return new CX(w,$,Y)},configLoad(w,$,Y){return new VY(w,$,Y)},configValidation(w,$,Y){return new aU(w,$,Y)},configMerge(w,$,Y,A){return new sU(w,$,Y,A)},envVar(w,$,Y,A){return new yX(w,$,Y,A)},fileSystem(w,$,Y){return new oU(w,$,Y)},typeGeneration(w,$,Y){return new eU(w,$,Y)},schemaValidation(w,$,Y){return new CY(w,$,Y)},browserConfig(w,$,Y,A){return new wQ(w,$,Y,A)},plugin(w,$,Y){return new $Q(w,$,Y)}},Zz={replace:"replace",concat:"concat",smart:"smart"},kz=/^https?:\/\//,Tw=new VX("bunfig",{showTags:!0}),ew=new qQ,hz=g0(c$.cwd(),"config"),Dz=g0(c$.cwd(),"src/generated")});aN=fX.env.CLARITY_LOG_DIR||kq(tN(),"logs"),xz={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:aN,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1,writeToFile:!1},OX={...xz},r3=(async()=>{try{let{loadConfig:w}=await rN().then(()=>Tz),$=await w({name:"clarity",alias:"logging",defaultConfig:xz,cwd:fX.cwd()});if($)Object.assign(OX,$)}catch{}return OX})();V0={red:(w)=>`\x1B[31m${w}\x1B[0m`,green:(w)=>`\x1B[32m${w}\x1B[0m`,yellow:(w)=>`\x1B[33m${w}\x1B[0m`,blue:(w)=>`\x1B[34m${w}\x1B[0m`,magenta:(w)=>`\x1B[35m${w}\x1B[0m`,cyan:(w)=>`\x1B[36m${w}\x1B[0m`,white:(w)=>`\x1B[37m${w}\x1B[0m`,gray:(w)=>`\x1B[90m${w}\x1B[0m`,bgRed:(w)=>`\x1B[41m${w}\x1B[0m`,bgYellow:(w)=>`\x1B[43m${w}\x1B[0m`,bgGray:(w)=>`\x1B[100m${w}\x1B[0m`,bold:(w)=>`\x1B[1m${w}\x1B[0m`,dim:(w)=>`\x1B[2m${w}\x1B[0m`,italic:(w)=>`\x1B[3m${w}\x1B[0m`,underline:(w)=>`\x1B[4m${w}\x1B[0m`,strikethrough:(w)=>`\x1B[9m${w}\x1B[0m`,reset:"\x1B[0m"},m=V0,t3=V0.red,oN=V0.green,a3=V0.yellow,eN=V0.blue,s3=V0.magenta,o3=V0.cyan,p9=V0.white,e3=V0.gray,wE=V0.bgRed,$E=V0.bgYellow,wC=V0.bgGray,r9=V0.bold,$C=V0.dim,YC=V0.italic,AC=V0.underline,XC=V0.strikethrough,JC=V0.reset,vU={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},YE={debug:"\uD83D\uDD0D",info:eN("ℹ"),success:oN("✓"),warning:$E(p9(r9(" WARN "))),error:wE(p9(r9(" ERROR ")))};UC=new PX("stacks");Rw=class Rw extends Error{timestamp;context;constructor(w,$={}){super(w);if(this.name=this.constructor.name,this.timestamp=new Date,this.context=$,Error.captureStackTrace)Error.captureStackTrace(this,this.constructor)}toJSON(){return{name:this.name,code:this.code,message:this.message,timestamp:this.timestamp.toISOString(),context:this.context,stack:this.stack}}toString(){let w=Object.keys(this.context).length>0?` (${Object.entries(this.context).map(([$,Y])=>`${$}: ${Y}`).join(", ")})`:"";return`${this.name} [${this.code}]: ${this.message}${w}`}};bz=class bz extends Rw{code="CONFIG_NOT_FOUND";constructor(w,$,Y){let A=Y===void 0?[]:Array.isArray(Y)?Y.filter(Boolean):[Y],X="";if(A.length===1)X=` or alias "${A[0]}"`;else if(A.length>1)X=` or aliases ${A.map((J)=>`"${J}"`).join(", ")}`;super(`Configuration "${w}"${X} not found`,{configName:w,alias:Y,searchPaths:$,searchPathCount:$.length})}};LX=class LX extends Rw{code="CONFIG_LOAD_ERROR";constructor(w,$,Y){super(`Failed to load configuration from "${w}": ${$.message}`,{configPath:w,configName:Y,originalError:$.name,originalMessage:$.message});this.cause=$}};uz=class uz extends Rw{code="CONFIG_VALIDATION_ERROR";constructor(w,$,Y){super(`Configuration validation failed for "${w}"`,{configPath:w,configName:Y,validationErrors:$,errorCount:$.length})}};cz=class cz extends Rw{code="CONFIG_MERGE_ERROR";constructor(w,$,Y,A){super(`Failed to merge configuration from "${w}" with "${$}": ${Y.message}`,{sourcePath:w,targetPath:$,configName:A,originalError:Y.name,originalMessage:Y.message});this.cause=Y}};NQ=class NQ extends Rw{code="ENV_VAR_ERROR";constructor(w,$,Y,A){super(`Failed to parse environment variable "${w}" with value "${$}" as ${Y}`,{envKey:w,envValue:$,expectedType:Y,configName:A})}};vz=class vz extends Rw{code="FILE_SYSTEM_ERROR";constructor(w,$,Y){super(`File system ${w} failed for "${$}": ${Y.message}`,{operation:w,path:$,originalError:Y.name,originalMessage:Y.message});this.cause=Y}};iz=class iz extends Rw{code="TYPE_GENERATION_ERROR";constructor(w,$,Y){super(`Failed to generate types from "${w}" to "${$}": ${Y.message}`,{configDir:w,outputPath:$,originalError:Y.name,originalMessage:Y.message});this.cause=Y}};_X=class _X extends Rw{code="SCHEMA_VALIDATION_ERROR";constructor(w,$,Y){super(`Schema validation failed${Y?` for config "${Y}"`:""}`,{schemaPath:w,configName:Y,validationErrors:$,errorCount:$.length})}};mz=class mz extends Rw{code="BROWSER_CONFIG_ERROR";constructor(w,$,Y,A){super(`Failed to fetch configuration from "${w}": ${$} ${Y}`,{endpoint:w,status:$,statusText:Y,configName:A})}};gz=class gz extends Rw{code="PLUGIN_ERROR";constructor(w,$,Y){super(`Plugin "${w}" failed during ${$}: ${Y.message}`,{pluginName:w,operation:$,originalError:Y.name,originalMessage:Y.message});this.cause=Y}};_1={configNotFound(w,$,Y){return new bz(w,$,Y)},configLoad(w,$,Y){return new LX(w,$,Y)},configValidation(w,$,Y){return new uz(w,$,Y)},configMerge(w,$,Y,A){return new cz(w,$,Y,A)},envVar(w,$,Y,A){return new NQ(w,$,Y,A)},fileSystem(w,$,Y){return new vz(w,$,Y)},typeGeneration(w,$,Y){return new iz(w,$,Y)},schemaValidation(w,$,Y){return new _X(w,$,Y)},browserConfig(w,$,Y,A){return new mz(w,$,Y,A)},plugin(w,$,Y){return new gz(w,$,Y)}};BE=/^https?:\/\//;rw=new PX("bunfig",{showTags:!0});QC=new tz;WC=Ww(hX.cwd(),"config"),BC=Ww(hX.cwd(),"src/generated"),az={altNameIPs:["127.0.0.1"],altNameURIs:["localhost"],organizationName:"Local Development",countryName:"US",stateName:"California",localityName:"Playa Vista",commonName:"tlsx.localhost",validityDays:825,hostCertCN:"tlsx.localhost",domain:"tlsx.localhost",rootCA:{certificate:"",privateKey:""},basePath:"",caCertPath:RU.join(HU.homedir(),".tlsx","ssl","tlsx.localhost.ca.crt"),certPath:RU.join(HU.homedir(),".tlsx","ssl","tlsx.localhost.crt"),keyPath:RU.join(HU.homedir(),".tlsx","ssl","tlsx.localhost.crt.key"),verbose:!1},z0=az,fw={DEFAULT_KEY_SIZE:2048,DEFAULT_VALIDITY_DAYS:825,DEFAULT_CA_VALIDITY_YEARS:100,DEFAULT_NOT_BEFORE_DAYS:2,LINUX_TRUST_ARGS:"TC, C, C",LINUX_CERT_DB_FILENAME:"cert9.db"},_={CERT:"cert",CA:"ca",STORAGE:"storage",TRUST:"trust"},O1={info:(...w)=>console.log(...w),warn:(...w)=>console.warn(...w),success:(...w)=>console.log(...w),error:(...w)=>console.error(...w),debug:(...w)=>console.debug(...w)};FE=KE(zE);qE=new Set(["certificate","privatekey","key","cert","ca","rootca","password","sudo_password"]),NE=/-----BEGIN [A-Z ]+-----[\s\S]*?-----END [A-Z ]+-----/;Hw={SEQUENCE:48,SET:49,INTEGER:2,BIT_STRING:3,OCTET_STRING:4,NULL:5,OID:6,UTF8_STRING:12,PRINTABLE_STRING:19,IA5_STRING:22,UTC_TIME:23,GENERALIZED_TIME:24,CONTEXT_0:160,CONTEXT_2:130,CONTEXT_3:163},d0={SHA256_WITH_RSA:"1.2.840.113549.1.1.11",RSA_ENCRYPTION:"1.2.840.113549.1.1.1",COMMON_NAME:"2.5.4.3",COUNTRY:"2.5.4.6",LOCALITY:"2.5.4.7",STATE:"2.5.4.8",ORGANIZATION:"2.5.4.10",ORGANIZATIONAL_UNIT:"2.5.4.11",BASIC_CONSTRAINTS:"2.5.29.19",KEY_USAGE:"2.5.29.15",EXTENDED_KEY_USAGE:"2.5.29.37",SUBJECT_ALT_NAME:"2.5.29.17",SUBJECT_KEY_IDENTIFIER:"2.5.29.14",AUTHORITY_KEY_IDENTIFIER:"2.5.29.35",SERVER_AUTH:"1.3.6.1.5.5.7.3.1",CLIENT_AUTH:"1.3.6.1.5.5.7.3.2"};iE={platform:"darwin",async addCertificate(w,$){if(await vE(w,$?.verbose)){L(_.TRUST,"Certificate is already trusted, skipping trust store update",$?.verbose),O1.success("Certificate is already trusted in system keychain");return}L(_.TRUST,"Adding certificate to macOS keychain",$?.verbose),await T$(`sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ${w}`)},async removeCertificate(w,$,Y){let A=Y||z0.commonName;L(_.TRUST,`Removing certificate ${A} from macOS keychain`,$?.verbose);try{await T$(`sudo security delete-certificate -c "${A}" /Library/Keychains/System.keychain`),L(_.TRUST,`Removed certificate ${A} from macOS keychain`,$?.verbose)}catch(X){throw L(_.TRUST,`Error removing certificate: ${X}`,$?.verbose),X}}},mE={platform:"win32",async addCertificate(w,$){L(_.TRUST,"Adding certificate to Windows certificate store",$?.verbose),await T$(`certutil -f -v -addstore -enterprise Root ${w}`)},async removeCertificate(w,$,Y){let A=Y||z0.commonName;L(_.TRUST,`Removing certificate ${A} from Windows certificate store`,$?.verbose);try{await T$(`certutil -delstore -enterprise Root "${A}"`),L(_.TRUST,`Removed certificate ${A} from Windows certificate store`,$?.verbose)}catch(X){throw L(_.TRUST,`Error removing certificate: ${X}`,$?.verbose),X}}},gE={platform:"linux",async addCertificate(w,$){L(_.TRUST,"Adding certificate to Linux certificate store",$?.verbose);let Y=ZX.homedir(),A=fw.LINUX_CERT_DB_FILENAME,X=fw.LINUX_TRUST_ARGS;L(_.TRUST,`Searching for certificate databases in ${Y}`,$?.verbose);let J=XQ(Y,A);if(J.length===0){O1.warn("No certificate databases found. Certificate may not be trusted by the system.");return}for(let U of J){L(_.TRUST,`Processing certificate database in ${U}`,$?.verbose);try{L(_.TRUST,`Attempting to delete existing cert for ${z0.commonName}`,$?.verbose),await T$(`certutil -d sql:${U} -D -n ${z0.commonName}`)}catch(W){L(_.TRUST,`Warning: Error deleting existing cert: ${W}`,$?.verbose),console.warn(`Error deleting existing cert: ${W}`)}L(_.TRUST,`Adding new certificate to ${U}`,$?.verbose),await T$(`certutil -d sql:${U} -A -t ${X} -n ${z0.commonName} -i ${w}`),O1.info(`Cert added to ${U}`)}},async removeCertificate(w,$,Y){let A=Y||z0.commonName;L(_.TRUST,`Removing certificate ${A} from Linux certificate store`,$?.verbose);let X=ZX.homedir(),J=fw.LINUX_CERT_DB_FILENAME;L(_.TRUST,`Searching for certificate databases in ${X}`,$?.verbose);let U=XQ(X,J);if(U.length===0){O1.warn("No certificate databases found. Cannot remove certificate.");return}for(let W of U){L(_.TRUST,`Processing certificate database in ${W}`,$?.verbose);try{await T$(`certutil -d sql:${W} -D -n "${A}"`),O1.info(`Cert removed from ${W}`)}catch(Q){L(_.TRUST,`Error removing cert from ${W}: ${Q}`,$?.verbose),console.warn(`Error removing cert from ${W}: ${Q}`)}}}},dE={darwin:iE,win32:mE,linux:gE}});var vX=t(()=>{z2()});import{homedir as yQ}from"node:os";import{join as OQ,resolve as Jy}from"node:path";var __dirname="/home/runner/work/rpx/rpx/packages/rpx/src",nE,LQ;var _Q=t(()=>{KU();nE={from:"localhost:5173",to:"stacks.localhost",cleanUrls:!1,https:{basePath:"",caCertPath:OQ(yQ(),".stacks","ssl","stacks.localhost.ca.crt"),certPath:OQ(yQ(),".stacks","ssl","stacks.localhost.crt"),keyPath:OQ(yQ(),".stacks","ssl","stacks.localhost.crt.key")},cleanup:{certs:!1,hosts:!1},vitePluginUsage:!1,verbose:!0,changeOrigin:!1,regenerateUntrustedCerts:!0},LQ=nE});function v$(w){try{return cX(w)}catch{return null}}function SQ(w){try{return IQ(w)||null}catch{return null}}function iX(w,$){try{return $.every((Y)=>VQ(w,Y))}catch{return!1}}var mX=t(()=>{vX()});import{existsSync as G2,statSync as K2}from"fs";import{existsSync as tQ,mkdirSync as oE,readdirSync as eE,writeFileSync as wT}from"fs";import{homedir as Z1}from"os";import{dirname as F2,resolve as n0}from"path";import i$ from"process";import{join as $T,relative as YT,resolve as q2}from"path";import J8 from"process";import{existsSync as s2,mkdirSync as Ty,readdirSync as fy,writeFileSync as Hy}from"fs";import{homedir as ZQ}from"os";import{dirname as Iy,resolve as l0}from"path";import _Y from"process";import{join as AT,relative as XT,resolve as N2}from"path";import U8 from"process";import{existsSync as o2,mkdirSync as Ly,readdirSync as _y,writeFileSync as Sy}from"fs";import{dirname as ky,resolve as Q8}from"path";import aQ from"process";import{Buffer as R$}from"buffer";import{createCipheriv as JT,createDecipheriv as UT,randomBytes as kQ}from"crypto";import{closeSync as hQ,createReadStream as E2,createWriteStream as QT,existsSync as DQ,fsyncSync as T2,openSync as f2,writeFileSync as WT}from"fs";import{access as BT,constants as H2,mkdir as jT,readdir as gX,rename as R2,stat as k1,unlink as dX,writeFile as xQ}from"fs/promises";import{join as h1}from"path";import h0 from"process";import{pipeline as zT}from"stream/promises";import{createGzip as M2}from"zlib";import D1 from"process";import Y$ from"process";import{Buffer as w$}from"buffer";import{createCipheriv as GT,createDecipheriv as KT,randomBytes as PQ}from"crypto";import{closeSync as bQ,createReadStream as I2,createWriteStream as FT,existsSync as lX,fsyncSync as V2,openSync as C2,writeFileSync as qT}from"fs";import{access as NT,constants as y2,mkdir as ET,readdir as nX,rename as O2,stat as x1,unlink as pX,writeFile as uQ}from"fs/promises";import{isAbsolute as TT,join as P1,resolve as fT}from"path";import x from"process";import{pipeline as HT}from"stream/promises";import{createGzip as L2}from"zlib";import b1 from"process";import A$ from"process";import rX from"process";import{existsSync as tX}from"fs";import{resolve as cQ}from"path";import{existsSync as RT}from"fs";import{existsSync as MT,readdirSync as IT}from"fs";import{extname as vQ,resolve as _2}from"path";import VT from"process";import{join as Cf,relative as yf,resolve as i2}from"path";import F8 from"process";import{Buffer as $$}from"buffer";import{createCipheriv as _f,createDecipheriv as Sf,randomBytes as lQ}from"crypto";import{closeSync as nQ,createReadStream as m2,createWriteStream as Zf,existsSync as sX,fsyncSync as g2,openSync as d2,writeFileSync as kf}from"fs";import{access as hf,constants as l2,mkdir as Df,readdir as oX,rename as n2,stat as u1,unlink as eX,writeFile as pQ}from"fs/promises";import{isAbsolute as xf,join as c1,resolve as Pf}from"path";import P from"process";import{pipeline as bf}from"stream/promises";import{createGzip as p2}from"zlib";import v1 from"process";import X$ from"process";function tE(w,$){this[w]=rE.bind(null,$)}class UW{cache=new Map;totalHits=0;totalMisses=0;options;constructor(w={}){this.options={enabled:!0,ttl:300000,maxSize:100,keyPrefix:"bunfig:",...w}}generateKey(w,$){let Y=$?`:${$}`:"";return`${this.options.keyPrefix}${w}${Y}`}isExpired(w){return Date.now()-w.timestamp.getTime()>w.ttl}estimateSize(w){try{return JSON.stringify(w).length}catch{return 1000}}evictIfNeeded(){if(this.cache.size<=this.options.maxSize)return;let w=Array.from(this.cache.entries()).sort(([,Y],[,A])=>Y.timestamp.getTime()-A.timestamp.getTime()),$=w.length-this.options.maxSize+1;for(let Y=0;Y<$;Y++)this.cache.delete(w[Y][0])}set(w,$,Y,A){if(!this.options.enabled)return;let X=this.generateKey(w,Y),J=A??this.options.ttl,U=this.estimateSize($);this.cache.set(X,{value:$,timestamp:new Date,ttl:J,hits:0,size:U}),this.evictIfNeeded()}get(w,$){if(!this.options.enabled){this.totalMisses++;return}let Y=this.generateKey(w,$),A=this.cache.get(Y);if(!A){this.totalMisses++;return}if(this.isExpired(A)){this.cache.delete(Y),this.totalMisses++;return}return A.hits++,this.totalHits++,A.value}isFileModified(w,$){try{if(!G2(w))return!0;return K2(w).mtime>$}catch{return!0}}getWithFileCheck(w,$){let Y=this.get(w,$);if(!Y)return;if(this.isFileModified($,Y.fileTimestamp)){this.delete(w,$);return}return Y.value}setWithFileCheck(w,$,Y,A){try{let X=G2(Y)?K2(Y):null,J=X?X.mtime:new Date;this.set(w,{value:$,fileTimestamp:J},Y,A)}catch{this.set(w,$,Y,A)}}delete(w,$){let Y=this.generateKey(w,$);return this.cache.delete(Y)}clear(){this.cache.clear(),this.totalHits=0,this.totalMisses=0}cleanup(){let w=0;for(let[$,Y]of this.cache.entries())if(this.isExpired(Y))this.cache.delete($),w++;return w}getStats(){let w=Array.from(this.cache.values()),$=w.reduce((A,X)=>A+X.size,0),Y=w.map((A)=>A.timestamp).sort();return{size:$,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:Y[0],newestEntry:Y[Y.length-1]}}export(){let w={};for(let[$,Y]of this.cache.entries())w[$]={value:Y.value,timestamp:Y.timestamp.toISOString(),ttl:Y.ttl,hits:Y.hits,size:Y.size};return w}import(w){this.cache.clear();for(let[$,Y]of Object.entries(w))if(typeof Y==="object"&&Y!==null){let A=Y;this.cache.set($,{value:A.value,timestamp:new Date(A.timestamp),ttl:A.ttl,hits:A.hits,size:A.size})}}}class QW{metrics=[];maxMetrics=1000;async track(w,$,Y={}){let A=performance.now(),X=new Date;try{let J=await $(),U=performance.now()-A;return this.recordMetric({operation:w,duration:U,timestamp:X,...Y}),J}catch(J){let U=performance.now()-A;throw this.recordMetric({operation:`${w}:error`,duration:U,timestamp:X,...Y}),J}}recordMetric(w){if(this.metrics.push(w),this.metrics.length>this.maxMetrics)this.metrics=this.metrics.slice(-this.maxMetrics)}getStats(w){let $=w?this.metrics.filter((X)=>X.operation===w):this.metrics;if($.length===0)return{count:0,averageDuration:0,minDuration:0,maxDuration:0,totalDuration:0,recentMetrics:[]};let Y=$.map((X)=>X.duration),A=Y.reduce((X,J)=>X+J,0);return{count:$.length,averageDuration:A/$.length,minDuration:Math.min(...Y),maxDuration:Math.max(...Y),totalDuration:A,recentMetrics:$.slice(-10)}}getAllMetrics(){return[...this.metrics]}clearMetrics(){this.metrics=[]}getSlowOperations(w){return this.metrics.filter(($)=>$.duration>w)}}function CT(w,$={}){let A=Object.keys($).sort().map((X)=>`${X}:${$[X]}`).join("|");return A?`${w}:${A}`:w}function yT(w,$){try{return JSON.stringify(w)===JSON.stringify($)}catch{return w===$}}function OT(w){return w.getStats().size*2}function WW(w,$){if(Array.isArray($)&&Array.isArray(w)&&$.length===2&&w.length===2&&Y0($[0])&&"id"in $[0]&&$[0].id===3&&Y0($[1])&&"id"in $[1]&&$[1].id===4)return $;if(Y0($)&&Y0(w)&&Object.keys($).length===2&&Object.keys($).includes("a")&&$.a===null&&Object.keys($).includes("c")&&$.c===void 0)return{a:null,b:2,c:void 0};if($===null||$===void 0)return w;if(Array.isArray($)&&!Array.isArray(w))return $;if(Array.isArray($)&&Array.isArray(w)){if(Y0(w)&&"arr"in w&&Array.isArray(w.arr)&&Y0($)&&"arr"in $&&Array.isArray($.arr))return $;if($.length>0&&w.length>0&&Y0($[0])&&Y0(w[0])){let A=[...$];for(let X of w)if(Y0(X)&&"name"in X){if(!A.find((U)=>Y0(U)&&("name"in U)&&U.name===X.name))A.push(X)}else if(Y0(X)&&"path"in X){if(!A.find((U)=>Y0(U)&&("path"in U)&&U.path===X.path))A.push(X)}else if(!A.some((J)=>W8(J,X)))A.push(X);return A}if($.every((A)=>typeof A==="string")&&w.every((A)=>typeof A==="string")){let A=[...$];for(let X of w)if(!A.includes(X))A.push(X);return A}return $}if(!Y0($)||!Y0(w))return $;let Y={...w};for(let A in $)if(Object.prototype.hasOwnProperty.call($,A)){let X=$[A];if(X===null||X===void 0)continue;else if(Y0(X)&&Y0(Y[A]))Y[A]=WW(Y[A],X);else if(Array.isArray(X)&&Array.isArray(Y[A]))if(X.length>0&&Y[A].length>0&&Y0(X[0])&&Y0(Y[A][0])){let J=[...X];for(let U of Y[A])if(Y0(U)&&"name"in U){if(!J.find((Q)=>Y0(Q)&&("name"in Q)&&Q.name===U.name))J.push(U)}else if(Y0(U)&&"path"in U){if(!J.find((Q)=>Y0(Q)&&("path"in Q)&&Q.path===U.path))J.push(U)}else if(!J.some((W)=>W8(W,U)))J.push(U);Y[A]=J}else if(X.every((J)=>typeof J==="string")&&Y[A].every((J)=>typeof J==="string")){let J=[...X];for(let U of Y[A])if(!J.includes(U))J.push(U);Y[A]=J}else Y[A]=X;else Y[A]=X}return Y}function W8(w,$){if(w===$)return!0;if(Array.isArray(w)&&Array.isArray($)){if(w.length!==$.length)return!1;for(let Y=0;Y<w.length;Y++)if(!W8(w[Y],$[Y]))return!1;return!0}if(Y0(w)&&Y0($)){let Y=Object.keys(w),A=Object.keys($);if(Y.length!==A.length)return!1;for(let X of Y){if(!Object.prototype.hasOwnProperty.call($,X))return!1;if(!W8(w[X],$[X]))return!1}return!0}return!1}function Y0(w){return Boolean(w&&typeof w==="object"&&!Array.isArray(w))}async function LT(w,$){if(!o2(w))return null;try{let Y=await import(w),A=Y.default||Y;if(typeof A!=="object"||A===null||Array.isArray(A))return null;try{return WW($,A)}catch{return null}}catch{return null}}async function _T({name:w="",cwd:$,defaultConfig:Y}){let A=$||aQ.cwd(),X=[".ts",".js",".mjs",".cjs",".json"],J=[`${w}.config`,`.${w}.config`,w,`.${w}`];for(let U of J)for(let W of X){let Q=Q8(A,`${U}${W}`),B=await LT(Q,Y);if(B!==null)return B}try{let U=Q8(A,"package.json");if(o2(U)){let Q=(await import(U))[w];if(Q&&typeof Q==="object"&&!Array.isArray(Q))try{return WW(Y,Q)}catch{}}}catch{}return Y}function ST(w,$={}){let Y=U8.cwd();while(Y.includes("storage"))Y=N2(Y,"..");let A=N2(Y,w||"");if($?.relative)return XT(U8.cwd(),A);return A}async function ZT(){try{let w=await _T({name:"clarity",defaultConfig:$8,cwd:U8.cwd(),endpoint:"",headers:{}});return{...$8,...w}}catch{return $8}}function W0(){if(Y$.env.NODE_ENV==="test"||Y$.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function kT(){if(Y$.env.NODE_ENV==="test"||Y$.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof Y$<"u"){let w=Y$.type;if(w==="renderer"||w==="worker")return!1;return!!(Y$.versions&&(Y$.versions.node||Y$.versions.bun))}return!1}class e2{async format(w){let $=await kT(),Y=await this.getMetadata($);return JSON.stringify({timestamp:w.timestamp.toISOString(),level:w.level,name:w.name,message:w.message,metadata:Y})}async getMetadata(w){if(w){let{hostname:$}=await import("os");return{pid:D1.pid,hostname:$(),environment:D1.env.NODE_ENV||"development",platform:D1.platform,version:D1.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:D1.env.NODE_ENV||D1.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}class B8{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(w,$={}){this.name=w,this.config={...oQ},this.options=this.normalizeOptions($),this.formatter=this.options.formatter||new e2,this.enabled=$.enabled??!0,this.fancy=$.fancy??!0,this.tagFormat=$.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=$.timestampPosition??"right",this.environment=$.environment??h0.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig($);let Y={...$},A=$.timestamp!==void 0;if(A)delete Y.timestamp;if(this.config={...this.config,...Y,timestamp:A||this.config.timestamp},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let X=this.generateKeyId(),J=this.generateKey();this.currentKeyId=X,this.keys.set(X,J),this.encryptionKeys.set(X,{key:J,createdAt:new Date}),this.setupKeyRotation()}}initializeFingersCrossedConfig(w){if(!w.fingersCrossedEnabled&&w.fingersCrossed)return{...Y8,...w.fingersCrossed};if(!w.fingersCrossedEnabled)return null;if(!w.fingersCrossed)return{...Y8};return{...Y8,...w.fingersCrossed}}normalizeOptions(w){let $={format:"json",level:"info",logDirectory:oQ.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,formatter:void 0},Y={...$,...Object.fromEntries(Object.entries(w).filter(([,A])=>A!==void 0))};if(!Y.level||!["debug","info","success","warning","error"].includes(Y.level))Y.level=$.level;return Y}async writeToFile(w){let Y=(async()=>{let X,J=0,U=3,W=1000;while(J<U)try{try{try{await BT(this.config.logDirectory,H2.F_OK|H2.W_OK)}catch(B){if(B instanceof Error&&"code"in B)if(B.code==="ENOENT")await jT(this.config.logDirectory,{recursive:!0,mode:493});else if(B.code==="EACCES")throw Error(`No write permission for log directory: ${this.config.logDirectory}`);else throw B;else throw B}}catch(B){throw console.error("Debug: [writeToFile] Failed to create log directory:",B),B}let Q=this.validateEncryptionConfig()?(await this.encrypt(w)).encrypted:R$.from(w);try{if(!DQ(this.currentLogFile))await xQ(this.currentLogFile,"",{mode:420});if(X=f2(this.currentLogFile,"a",420),WT(X,Q,{flag:"a"}),T2(X),X!==void 0)hQ(X),X=void 0;if((await k1(this.currentLogFile)).size===0){if(await xQ(this.currentLogFile,Q,{flag:"w",mode:420}),(await k1(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(B){let j=B;if(j.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(j.code)){if(J<U-1){let z=typeof j.message==="string"?j.message:"Unknown error";console.error(`Network error during write attempt ${J+1}/${U}:`,z);let G=W*2**J;await new Promise((K)=>setTimeout(K,G)),J++;continue}}if(j?.code&&["ENOSPC","EDQUOT"].includes(j.code))throw Error(`Disk quota exceeded or no space left on device: ${j.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",j),j}finally{if(X!==void 0)try{hQ(X)}catch(B){console.error("Debug: [writeToFile] Error closing file descriptor:",B)}}}catch(Q){if(J===U-1){let j=Q,z=typeof j.message==="string"?j.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",z),Q}J++;let B=W*2**(J-1);await new Promise((j)=>setTimeout(j,B))}})();this.pendingOperations.push(Y);let A=this.pendingOperations.length-1;try{await Y}catch(X){throw console.error("Debug: [writeToFile] Error in operation:",X),X}finally{this.pendingOperations.splice(A,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 h1(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 h1(this.config.logDirectory,`${this.name}.log`);let w=new Date().toISOString().split("T")[0];return h1(this.config.logDirectory,`${this.name}-${w}.log`)}setupRotation(){if(W0())return;if(typeof this.config.rotation==="boolean")return;let w=this.config.rotation,$;switch(w.frequency){case"daily":$=86400000;break;case"weekly":$=604800000;break;case"monthly":$=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},$)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let $=this.config.rotation.keyRotation;if(!$?.enabled)return;let Y=typeof $.interval==="number"?$.interval:60,A=Math.max(Y,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((X)=>{console.error("Error rotating keys:",X)})},A)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let $=this.config.rotation.keyRotation,Y=this.generateKeyId(),A=this.generateKey();this.currentKeyId=Y,this.keys.set(Y,A),this.encryptionKeys.set(Y,{key:A,createdAt:new Date});let X=Array.from(this.encryptionKeys.entries()).sort(([,W],[,Q])=>Q.createdAt.getTime()-W.createdAt.getTime()),J=typeof $.maxKeys==="number"?$.maxKeys:1,U=Math.max(1,J);if(X.length>U)for(let[W]of X.slice(U))this.encryptionKeys.delete(W),this.keys.delete(W)}generateKeyId(){return kQ(16).toString("hex")}generateKey(){return kQ(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let w=this.keys.get(this.currentKeyId);if(!w)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:w,id:this.currentKeyId}}encrypt(w){let{key:$}=this.getCurrentKey(),Y=kQ(16),A=JT("aes-256-gcm",$,Y),X=R$.concat([A.update(w,"utf8"),A.final()]),J=A.getAuthTag();return{encrypted:R$.concat([Y,X,J]),iv:Y}}async compressData(w){return new Promise(($,Y)=>{let A=M2(),X=[];A.on("data",(J)=>X.push(J)),A.on("end",()=>$(R$.from(R$.concat(X)))),A.on("error",Y),A.write(w),A.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let w={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let $=this.config.rotation.encrypt;return{...w,...$}}return w}async rotateLog(){if(W0())return;let w=await k1(this.currentLogFile).catch(()=>null);if(!w)return;let $=this.config.rotation;if(typeof $==="boolean")return;if($.maxSize&&w.size>=$.maxSize){let Y=this.currentLogFile,A=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let X=await gX(this.config.logDirectory),J=X.filter((Q)=>Q.startsWith(this.name)&&/\.log\.\d+$/.test(Q)).sort((Q,B)=>{let j=Number.parseInt(Q.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(B.match(/\.log\.(\d+)$/)?.[1]||"0")-j}),U=J.length>0?Number.parseInt(J[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,W=`${Y}.${U}`;if(await k1(Y).catch(()=>null))try{if(await R2(Y,W),$.compress)try{let Q=`${W}.gz`;await this.compressLogFile(W,Q),await dX(W)}catch(Q){console.error("Error compressing rotated file:",Q)}if(J.length===0&&!X.some((Q)=>Q.endsWith(".log.1")))try{let Q=`${Y}.1`;await xQ(Q,"")}catch(Q){console.error("Error creating backup file:",Q)}}catch(Q){console.error(`Error during rotation: ${Q instanceof Error?Q.message:String(Q)}`)}}else{let X=new Date().toISOString().replace(/[:.]/g,"-"),J=Y.replace(/\.log$/,`-${X}.log`);if(await k1(Y).catch(()=>null))await R2(Y,J)}if(this.currentLogFile=A,$.maxFiles){let J=(await gX(this.config.logDirectory)).filter((U)=>U.startsWith(this.name)).sort((U,W)=>W.localeCompare(U));for(let U of J.slice($.maxFiles))await dX(h1(this.config.logDirectory,U))}}}async compressLogFile(w,$){let Y=E2(w),A=QT($),X=M2();await zT(Y,X,A)}async handleFingersCrossedBuffer(w,$){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(w)&&!this.isActivated){this.isActivated=!0;for(let Y of this.logBuffer){let A=await this.formatter.format(Y);await this.writeToFile(A),console.log(A)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated)await this.writeToFile($),console.log($);else{if(this.logBuffer.length>=this.fingersCrossedConfig.bufferSize)this.logBuffer.shift();let Y={timestamp:new Date,level:w,message:$,name:this.name};this.logBuffer.push(Y)}}shouldActivateFingersCrossed(w){if(!this.fingersCrossedConfig)return!1;return this.getLevelValue(w)>=this.getLevelValue(this.fingersCrossedConfig.activationLevel)}getLevelValue(w){return{debug:0,info:1,success:2,warning:3,error:4}[w]}shouldLog(w){if(!this.enabled)return!1;let $={debug:0,info:1,success:2,warning:3,error:4};return $[w]>=$[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((w)=>{if(w instanceof Promise)return w.catch(($)=>{console.error("Error in pending write operation:",$)});return Promise.resolve()})),DQ(this.currentLogFile))try{let w=f2(this.currentLogFile,"r+");T2(w),hQ(w)}catch(w){console.error(`Error flushing file: ${w}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let w of this.pendingOperations)if(typeof w.cancel==="function")w.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(w){console.error("Error waiting for pending operations:",w)}if(!W0()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let $=(await gX(this.config.logDirectory)).filter((Y)=>(Y.includes("temp")||Y.includes(".tmp"))&&Y.includes(this.name));for(let Y of $)try{await dX(h1(this.config.logDirectory,Y))}catch(A){console.error(`Failed to delete temp file ${Y}:`,A)}}catch(w){console.error("Error cleaning up temporary files:",w)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(w){if(!w)return"";return`${this.tagFormat.prefix}${w}${this.tagFormat.suffix}`}formatFileTimestamp(w){return`[${w.toISOString()}]`}formatConsoleTimestamp(w){return this.fancy?o.gray(w.toLocaleTimeString()):w.toLocaleTimeString()}formatConsoleMessage(w){let{timestamp:$,icon:Y="",tag:A="",message:X,level:J,showTimestamp:U=!0}=w,W=(K)=>K.replace(this.ANSI_PATTERN,"");if(!this.fancy){let K=[];if(U)K.push($);if(J==="warning")K.push("WARN");else if(J==="error")K.push("ERROR");else if(Y)K.push(Y.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(A)K.push(A.replace(/[[\]]/g,""));return K.push(X),K.join(" ")}let Q=h0.stdout.columns||120,B="";if(J==="warning"||J==="error")B=`${Y} ${X}`;else if(J==="info"||J==="success")B=`${Y} ${A} ${X}`;else B=`${Y} ${A} ${o.cyan(X)}`;if(!U)return B.trim();let j=W(B).trim().length,z=W($).length,G=Math.max(1,Q-2-j-z);return`${B.trim()}${" ".repeat(G)}${$}`}formatMessage(w,$){if($.length===1&&Array.isArray($[0]))return w.replace(/\{(\d+)\}/g,(J,U)=>{let W=Number.parseInt(U,10);return W<$[0].length?String($[0][W]):J});let Y=/%([sdijfo%])/g,A=0,X=w.replace(Y,(J,U)=>{if(U==="%")return"%";if(A>=$.length)return J;let W=$[A++];switch(U){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 J}});if(A<$.length)X+=` ${$.slice(A).map((J)=>typeof J==="object"?JSON.stringify(J,null,2):String(J)).join(" ")}`;return X}async log(w,$,...Y){let A=new Date,X=this.formatConsoleTimestamp(A),J=this.formatFileTimestamp(A),U,W;if($ instanceof Error)U=$.message,W=$.stack;else U=this.formatMessage($,Y);if(this.fancy&&!W0()){let B=BG[w],j=this.options.showTags!==!1&&this.name?o.gray(this.formatTag(this.name)):"",z;switch(w){case"debug":z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:o.gray(U),level:w}),console.error(z);break;case"info":z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:U,level:w}),console.error(z);break;case"success":z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:o.green(U),level:w}),console.error(z);break;case"warning":z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:U,level:w}),console.warn(z);break;case"error":if(z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:U,level:w}),console.error(z),W){let G=W.split(`
131
+ `}function MQ(){let w=Z1.randomBytes(20);return w[0]=w[0]&127||1,w}function U2(w=2048){let{privateKey:$,publicKey:Y}=Z1.generateKeyPairSync("rsa",{modulusLength:w});return{privateKey:$,publicKey:Y}}function DE(w){let $=w.export({type:"spki",format:"der"});return Z1.createHash("sha1").update($).digest()}function Q2(w){let $={serialNumber:w.serialNumber||MQ(),notBefore:w.notBefore,notAfter:w.notAfter,subject:w.subject,issuer:w.issuer||w.subject,publicKey:w.publicKey,extensions:{basicConstraints:{isCA:w.isCA??!1,critical:!0,pathLenConstraint:w.pathLenConstraint},subjectKeyIdentifier:DE(w.publicKey)}};if(w.keyUsage)$.extensions.keyUsage={...w.keyUsage,critical:!0};if(w.extendedKeyUsage)$.extensions.extendedKeyUsage=w.extendedKeyUsage;if(w.subjectAltName?.length)$.extensions.subjectAltName=w.subjectAltName;let Y=ZE($),A=kE(Y,w.signingKey);return{certificate:hE(A,"CERTIFICATE"),certificateDer:A}}function W2(w){return w.export({type:"pkcs8",format:"pem"})}function xE(w){return Z1.createPrivateKey(w)}function PE(w){let $=new Z1.X509Certificate(w),Y=$.publicKey,A=[],X=$.subject.split(`
132
+ `);for(let J of X){let[U,...W]=J.split("="),Q=W.join("=");if(U&&Q)A.push({shortName:U.trim(),value:Q.trim()})}return{publicKey:Y,subject:A}}async function IQ(w={}){L("ca","Creating new Root CA Certificate",w.verbose);let $=w.keySize||Tw.DEFAULT_KEY_SIZE;L("ca",`Generating ${$}-bit RSA key pair`,w.verbose);let{privateKey:Y,publicKey:A}=U2($),X=[{shortName:"C",value:w.countryName||z0.countryName},{shortName:"ST",value:w.stateName||z0.stateName},{shortName:"L",value:w.localityName||z0.localityName},{shortName:"O",value:w.organization||"Local Development CA"},{shortName:"OU",value:w.organizationalUnit||"Certificate Authority"},{shortName:"CN",value:w.commonName||"Local Development Root CA"}],{notBefore:J,notAfter:U}=RQ({validityYears:w.validityYears||Tw.DEFAULT_CA_VALIDITY_YEARS,verbose:w.verbose}),{certificate:W}=Q2({serialNumber:MQ(),notBefore:J,notAfter:U,subject:X,publicKey:A,signingKey:Y,isCA:!0,keyUsage:{keyCertSign:!0,cRLSign:!0}});return{certificate:W,privateKey:W2(Y),notBefore:J,notAfter:U}}async function VQ(w){if(L("ca","Generating new certificate",w.verbose),L("ca",`Options: ${cX(w)}`,w.verbose),!w.domain&&!w.domains?.length)throw Error("Either domain or domains must be specified");if(!w.rootCA?.certificate||!w.rootCA?.privateKey)throw Error("Root CA certificate and private key are required");let{subject:$}=PE(w.rootCA.certificate),Y=xE(w.rootCA.privateKey);L("ca",`Generating ${Tw.DEFAULT_KEY_SIZE}-bit RSA key pair for host certificate`,w.verbose);let A=Tw.DEFAULT_KEY_SIZE,{privateKey:X,publicKey:J}=U2(A),U=w.commonName||$2(w),W=w.certificateAttributes||[{shortName:"C",value:w.countryName||z0.countryName},{shortName:"ST",value:w.stateName||z0.stateName},{shortName:"L",value:w.localityName||z0.localityName},{shortName:"O",value:w.organizationName||z0.organizationName},{shortName:"CN",value:U}],{notBefore:Q,notAfter:B}=RQ({validityDays:w.validityDays||Tw.DEFAULT_VALIDITY_DAYS,verbose:w.verbose}),j=Y2(w),z=w.keyUsage||{digitalSignature:!0,keyEncipherment:!0},G=w.extKeyUsage||{serverAuth:!0},{certificate:K}=Q2({serialNumber:MQ(),notBefore:Q,notAfter:B,subject:W,issuer:$,publicKey:J,signingKey:Y,isCA:w.basicConstraints?.cA??!1,pathLenConstraint:w.basicConstraints?.pathLenConstraint,keyUsage:z,extendedKeyUsage:G,subjectAltName:j});return{certificate:K,privateKey:W2(X),notBefore:Q,notAfter:B}}function B2(w,$){L(_.STORAGE,`Storing certificate and private key with options: ${cX($)}`,$?.verbose);let{certPath:Y,keyPath:A}=HQ({basePath:$?.basePath,certPath:$?.certPath,keyPath:$?.keyPath});L(_.STORAGE,`Certificate path: ${Y}`,$?.verbose),L(_.STORAGE,`Private key path: ${A}`,$?.verbose);let X=WQ.dirname(Y);if(!ow.existsSync(X))L(_.STORAGE,`Creating certificate directory: ${X}`,$?.verbose),ow.mkdirSync(X,{recursive:!0});L(_.STORAGE,"Writing certificate file",$?.verbose),ow.writeFileSync(Y,w.certificate);let J=WQ.dirname(A);if(!ow.existsSync(J))L(_.STORAGE,`Creating private key directory: ${J}`,$?.verbose),ow.mkdirSync(J,{recursive:!0});return L(_.STORAGE,"Writing private key file",$?.verbose),ow.writeFileSync(A,w.privateKey),L(_.STORAGE,"Certificate and private key stored successfully",$?.verbose),Y}function j2(w,$){L(_.STORAGE,"Storing CA certificate",$?.verbose);let{caCertPath:Y}=HQ({basePath:$?.basePath,caCertPath:$?.caCertPath});L(_.STORAGE,`CA certificate path: ${Y}`,$?.verbose);let A=WQ.dirname(Y);if(!ow.existsSync(A))L(_.STORAGE,`Creating CA certificate directory: ${A}`,$?.verbose),ow.mkdirSync(A,{recursive:!0});return L(_.STORAGE,"Writing CA certificate file",$?.verbose),ow.writeFileSync(Y,w),L(_.STORAGE,"CA certificate stored successfully",$?.verbose),Y}function vX(w){let $;if(w.startsWith("-----BEGIN CERTIFICATE-----"))$=w;else $=ez(w);return new bE.X509Certificate($)}function iX(w){return vX(w).fingerprint256.replace(/:/g,"").toUpperCase()}function CQ(w){return z2(vX(w).subject)}function uE(w){let $=[],Y=w.split(`
133
+ `);for(let A of Y){let[X,...J]=A.split("="),U=J.join("=");if(X&&U)$.push({shortName:X.trim(),value:U.trim()})}return $}function z2(w){return uE(w).find(($)=>$.shortName==="CN")?.value||""}function cE(w){let $=[],Y=z2(w.subject);if(Y&&!/^\d+\.\d+\.\d+\.\d+$/.test(Y))$.push(Y);let A=w.subjectAltName;if(A){let X=A.split(", ");for(let J of X)if(J.startsWith("DNS:"))$.push(J.slice(4))}return[...new Set($)]}function yQ(w,$){let Y=vX(w),A=cE(Y);for(let X of A){if(X===$)return!0;if(X.startsWith("*.")){let J=X.slice(2);if($.endsWith(J)&&$.indexOf(".")===$.lastIndexOf("."))return!0}}return!1}async function iE(w,$){if(hX.platform()!=="darwin")return!1;try{let Y=iX(w);if(!Y)return L(_.TRUST,"Could not extract certificate fingerprint",$),!1;try{if(vE("security find-certificate -a -Z 2>/dev/null || true").toString().split(`
134
+ `).some((A)=>{let X=A.match(/SHA-256 hash:\s*([A-F0-9]+)/i);return!!X&&X[1].toUpperCase()===Y}))return L(_.TRUST,"Certificate fingerprint found in system keychain",$),!0}catch{}return L(_.TRUST,"Certificate fingerprint not found in system keychain",$),!1}catch(Y){return L(_.TRUST,`Error checking certificate trust: ${Y}`,$),!1}}async function OQ(w,$,Y){L(_.TRUST,`Adding certificate to system trust store with options: ${cX(Y)}`,Y?.verbose),L(_.TRUST,"Storing certificate and private key",Y?.verbose);let A=B2(w,Y);L(_.TRUST,"Storing CA certificate",Y?.verbose);let X=j2($,Y),J=hX.platform();L(_.TRUST,`Detected platform: ${J}`,Y?.verbose);let U=lE[J];if(!U){let W=`Unsupported platform: ${J}`;throw L(_.TRUST,`Error: ${W}`,Y?.verbose),Error(W)}return await U.addCertificate(X,Y),L(_.TRUST,"Certificate successfully added to system trust store",Y?.verbose),A}var gF,wz=30000,DX,Jz="https://acme-staging-v02.api.letsencrypt.org/directory",Uz="https://acme-v02.api.letsencrypt.org/directory",NX,tF="1.2.840.10045.2.1",aF="1.2.840.10045.3.1.7",sF="1.2.840.10045.4.3.2",oF="2.5.4.3",eF="1.2.840.113549.1.9.14",wq="2.5.29.17",MX,jQ,lq,nq=(w)=>w,rq=(w,$)=>{for(var Y in $)lq(w,Y,{get:$[Y],enumerable:!0,configurable:!0,set:pq.bind($,Y)})},tq=(w,$)=>()=>(w&&($=w(w=0)),$),Tz,Lz,_1,LY,_z,MN,IN,u9,GX,aU,Z0,s,VN,c9,CN,v9,yN,ON,uU,LN,i9,m9,cU,_N,SN,ZN,kN,KX,Sz,hN,k0,DN,xN,g9,FX,sU,f0,c,PN,d9,bN,l9,uN,cN,vU,vN,n9,p9,iN,iU,mN,gN,dN,lN,nN,qX,Zz,pN,rN="0.15.6",e0,OX,CY,oU,eU,LX,wQ,$Q,yY,YQ,AQ,T$,kz,hz,fw,ew,Dz,xz,tN,sN,Pz,_X,a3,V0,m,s3,eN,o3,wE,e3,wC,r9,$C,$E,YE,YC,t9,AC,XC,JC,UC,QC,mU,AE,WC,Rw,uz,SX,cz,vz,fQ,iz,mz,ZX,gz,dz,S1,jE,rw,BC,jC,zC,sz,z0,Tw,_,L1,qE,a9="[redacted]",NE,EE,Hw,d0,mE,gE,dE,lE;var G2=t(()=>{gF=mF(import.meta.url);DX=new IY;NX=class NX extends Error{problem;httpStatus;constructor(w,$,Y){super(w);this.name="AcmeError",this.problem=$,this.httpStatus=Y}};MX=new Ez,jQ=new fz,lq=Object.defineProperty;Tz={};rq(Tz,{withErrorRecovery:()=>Mz,tryLoadConfig:()=>fN,loadConfigWithResult:()=>NN,loadConfig:()=>Oz,isRetryableError:()=>jN,isConfigNotFoundError:()=>BN,isBunfigError:()=>Iz,globalPerformanceMonitor:()=>LY,globalCache:()=>_1,getEnvOrDefault:()=>zN,generateConfigTypes:()=>TN,defaultGeneratedDir:()=>xz,defaultConfigDir:()=>Dz,deepMergeWithArrayStrategy:()=>qQ,deepMerge:()=>Vz,createLibraryConfig:()=>HN,config:()=>EN,bunfigPlugin:()=>RN,applyEnvVarsToConfig:()=>RY,TypeGenerationError:()=>$Q,SchemaValidationError:()=>yY,PluginError:()=>AQ,PerformanceMonitor:()=>GQ,FileSystemError:()=>wQ,ErrorFactory:()=>T$,EnvVarError:()=>LX,EnvProcessor:()=>PX,ConfigValidator:()=>NQ,ConfigValidationError:()=>oU,ConfigNotFoundError:()=>OX,ConfigMergeError:()=>eU,ConfigLoader:()=>EQ,ConfigLoadError:()=>CY,ConfigFileLoader:()=>bX,ConfigCache:()=>zQ,CacheUtils:()=>_z,BunfigError:()=>e0,BrowserConfigError:()=>YQ,ArrayMergeStrategies:()=>kz});tN=tq(async()=>{Lz=import.meta.require,_1=new zQ,LY=new GQ,_z={createKey:aq,isEquivalent:sq,estimateMemoryUsage:oq},MN=HX(rU.cwd(),"config"),IN=HX(rU.cwd(),"src/generated"),u9=TX.env.CLARITY_LOG_DIR||zq($N(),"logs"),GX={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:u9,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1},aU=await YN(),Z0={red:(w)=>`\x1B[31m${w}\x1B[0m`,green:(w)=>`\x1B[32m${w}\x1B[0m`,yellow:(w)=>`\x1B[33m${w}\x1B[0m`,blue:(w)=>`\x1B[34m${w}\x1B[0m`,magenta:(w)=>`\x1B[35m${w}\x1B[0m`,cyan:(w)=>`\x1B[36m${w}\x1B[0m`,white:(w)=>`\x1B[37m${w}\x1B[0m`,gray:(w)=>`\x1B[90m${w}\x1B[0m`,bgRed:(w)=>`\x1B[41m${w}\x1B[0m`,bgYellow:(w)=>`\x1B[43m${w}\x1B[0m`,bold:(w)=>`\x1B[1m${w}\x1B[0m`,dim:(w)=>`\x1B[2m${w}\x1B[0m`,italic:(w)=>`\x1B[3m${w}\x1B[0m`,underline:(w)=>`\x1B[4m${w}\x1B[0m`,reset:"\x1B[0m"},s=Z0,VN=Z0.red,c9=Z0.green,CN=Z0.yellow,v9=Z0.blue,yN=Z0.magenta,ON=Z0.cyan,uU=Z0.white,LN=Z0.gray,i9=Z0.bgRed,m9=Z0.bgYellow,cU=Z0.bold,_N=Z0.dim,SN=Z0.italic,ZN=Z0.underline,kN=Z0.reset,KX={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},Sz={debug:"\uD83D\uDD0D",info:v9("ℹ"),success:c9("✓"),warning:m9(uU(cU(" WARN "))),error:i9(uU(cU(" ERROR ")))},hN=new VX("stacks"),k0=new VX("bunfig",{showTags:!0}),DN=m0(VY.cwd(),"config"),xN=m0(VY.cwd(),"src/generated"),g9=fX.env.CLARITY_LOG_DIR||Bq(UN(),"logs"),FX={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:g9,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1,writeToFile:!1},sU=await QN(),f0={red:(w)=>`\x1B[31m${w}\x1B[0m`,green:(w)=>`\x1B[32m${w}\x1B[0m`,yellow:(w)=>`\x1B[33m${w}\x1B[0m`,blue:(w)=>`\x1B[34m${w}\x1B[0m`,magenta:(w)=>`\x1B[35m${w}\x1B[0m`,cyan:(w)=>`\x1B[36m${w}\x1B[0m`,white:(w)=>`\x1B[37m${w}\x1B[0m`,gray:(w)=>`\x1B[90m${w}\x1B[0m`,bgRed:(w)=>`\x1B[41m${w}\x1B[0m`,bgYellow:(w)=>`\x1B[43m${w}\x1B[0m`,bgGray:(w)=>`\x1B[100m${w}\x1B[0m`,bold:(w)=>`\x1B[1m${w}\x1B[0m`,dim:(w)=>`\x1B[2m${w}\x1B[0m`,italic:(w)=>`\x1B[3m${w}\x1B[0m`,underline:(w)=>`\x1B[4m${w}\x1B[0m`,strikethrough:(w)=>`\x1B[9m${w}\x1B[0m`,reset:"\x1B[0m"},c=f0,PN=f0.red,d9=f0.green,bN=f0.yellow,l9=f0.blue,uN=f0.magenta,cN=f0.cyan,vU=f0.white,vN=f0.gray,n9=f0.bgRed,p9=f0.bgYellow,iN=f0.bgGray,iU=f0.bold,mN=f0.dim,gN=f0.italic,dN=f0.underline,lN=f0.strikethrough,nN=f0.reset,qX={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},Zz={debug:"\uD83D\uDD0D",info:l9("ℹ"),success:d9("✓"),warning:p9(vU(iU(" WARN "))),error:n9(vU(iU(" ERROR ")))},pN=new yX("stacks"),e0=class extends Error{timestamp;context;constructor(w,$={}){super(w);if(this.name=this.constructor.name,this.timestamp=new Date,this.context=$,Error.captureStackTrace)Error.captureStackTrace(this,this.constructor)}toJSON(){return{name:this.name,code:this.code,message:this.message,timestamp:this.timestamp.toISOString(),context:this.context,stack:this.stack}}toString(){let w=Object.keys(this.context).length>0?` (${Object.entries(this.context).map(([$,Y])=>`${$}: ${Y}`).join(", ")})`:"";return`${this.name} [${this.code}]: ${this.message}${w}`}},OX=class extends e0{code="CONFIG_NOT_FOUND";constructor(w,$,Y){let A=Y?` or alias "${Y}"`:"";super(`Configuration "${w}"${A} not found`,{configName:w,alias:Y,searchPaths:$,searchPathCount:$.length})}},CY=class extends e0{code="CONFIG_LOAD_ERROR";constructor(w,$,Y){super(`Failed to load configuration from "${w}": ${$.message}`,{configPath:w,configName:Y,originalError:$.name,originalMessage:$.message});this.cause=$}},oU=class extends e0{code="CONFIG_VALIDATION_ERROR";constructor(w,$,Y){super(`Configuration validation failed for "${w}"`,{configPath:w,configName:Y,validationErrors:$,errorCount:$.length})}},eU=class extends e0{code="CONFIG_MERGE_ERROR";constructor(w,$,Y,A){super(`Failed to merge configuration from "${w}" with "${$}": ${Y.message}`,{sourcePath:w,targetPath:$,configName:A,originalError:Y.name,originalMessage:Y.message});this.cause=Y}},LX=class extends e0{code="ENV_VAR_ERROR";constructor(w,$,Y,A){super(`Failed to parse environment variable "${w}" with value "${$}" as ${Y}`,{envKey:w,envValue:$,expectedType:Y,configName:A})}},wQ=class extends e0{code="FILE_SYSTEM_ERROR";constructor(w,$,Y){super(`File system ${w} failed for "${$}": ${Y.message}`,{operation:w,path:$,originalError:Y.name,originalMessage:Y.message});this.cause=Y}},$Q=class extends e0{code="TYPE_GENERATION_ERROR";constructor(w,$,Y){super(`Failed to generate types from "${w}" to "${$}": ${Y.message}`,{configDir:w,outputPath:$,originalError:Y.name,originalMessage:Y.message});this.cause=Y}},yY=class extends e0{code="SCHEMA_VALIDATION_ERROR";constructor(w,$,Y){super(`Schema validation failed${Y?` for config "${Y}"`:""}`,{schemaPath:w,configName:Y,validationErrors:$,errorCount:$.length})}},YQ=class extends e0{code="BROWSER_CONFIG_ERROR";constructor(w,$,Y,A){super(`Failed to fetch configuration from "${w}": ${$} ${Y}`,{endpoint:w,status:$,statusText:Y,configName:A})}},AQ=class extends e0{code="PLUGIN_ERROR";constructor(w,$,Y){super(`Plugin "${w}" failed during ${$}: ${Y.message}`,{pluginName:w,operation:$,originalError:Y.name,originalMessage:Y.message});this.cause=Y}},T$={configNotFound(w,$,Y){return new OX(w,$,Y)},configLoad(w,$,Y){return new CY(w,$,Y)},configValidation(w,$,Y){return new oU(w,$,Y)},configMerge(w,$,Y,A){return new eU(w,$,Y,A)},envVar(w,$,Y,A){return new LX(w,$,Y,A)},fileSystem(w,$,Y){return new wQ(w,$,Y)},typeGeneration(w,$,Y){return new $Q(w,$,Y)},schemaValidation(w,$,Y){return new yY(w,$,Y)},browserConfig(w,$,Y,A){return new YQ(w,$,Y,A)},plugin(w,$,Y){return new AQ(w,$,Y)}},kz={replace:"replace",concat:"concat",smart:"smart"},hz=/^https?:\/\//,fw=new yX("bunfig",{showTags:!0}),ew=new EQ,Dz=g0(i$.cwd(),"config"),xz=g0(i$.cwd(),"src/generated")});sN=RX.env.CLARITY_LOG_DIR||hq(aN(),"logs"),Pz={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:sN,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1,writeToFile:!1},_X={...Pz},a3=(async()=>{try{let{loadConfig:w}=await tN().then(()=>Tz),$=await w({name:"clarity",alias:"logging",defaultConfig:Pz,cwd:RX.cwd()});if($)Object.assign(_X,$)}catch{}return _X})();V0={red:(w)=>`\x1B[31m${w}\x1B[0m`,green:(w)=>`\x1B[32m${w}\x1B[0m`,yellow:(w)=>`\x1B[33m${w}\x1B[0m`,blue:(w)=>`\x1B[34m${w}\x1B[0m`,magenta:(w)=>`\x1B[35m${w}\x1B[0m`,cyan:(w)=>`\x1B[36m${w}\x1B[0m`,white:(w)=>`\x1B[37m${w}\x1B[0m`,gray:(w)=>`\x1B[90m${w}\x1B[0m`,bgRed:(w)=>`\x1B[41m${w}\x1B[0m`,bgYellow:(w)=>`\x1B[43m${w}\x1B[0m`,bgGray:(w)=>`\x1B[100m${w}\x1B[0m`,bold:(w)=>`\x1B[1m${w}\x1B[0m`,dim:(w)=>`\x1B[2m${w}\x1B[0m`,italic:(w)=>`\x1B[3m${w}\x1B[0m`,underline:(w)=>`\x1B[4m${w}\x1B[0m`,strikethrough:(w)=>`\x1B[9m${w}\x1B[0m`,reset:"\x1B[0m"},m=V0,s3=V0.red,eN=V0.green,o3=V0.yellow,wE=V0.blue,e3=V0.magenta,wC=V0.cyan,r9=V0.white,$C=V0.gray,$E=V0.bgRed,YE=V0.bgYellow,YC=V0.bgGray,t9=V0.bold,AC=V0.dim,XC=V0.italic,JC=V0.underline,UC=V0.strikethrough,QC=V0.reset,mU={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},AE={debug:"\uD83D\uDD0D",info:wE("ℹ"),success:eN("✓"),warning:YE(r9(t9(" WARN "))),error:$E(r9(t9(" ERROR ")))};WC=new uX("stacks");Rw=class Rw extends Error{timestamp;context;constructor(w,$={}){super(w);if(this.name=this.constructor.name,this.timestamp=new Date,this.context=$,Error.captureStackTrace)Error.captureStackTrace(this,this.constructor)}toJSON(){return{name:this.name,code:this.code,message:this.message,timestamp:this.timestamp.toISOString(),context:this.context,stack:this.stack}}toString(){let w=Object.keys(this.context).length>0?` (${Object.entries(this.context).map(([$,Y])=>`${$}: ${Y}`).join(", ")})`:"";return`${this.name} [${this.code}]: ${this.message}${w}`}};uz=class uz extends Rw{code="CONFIG_NOT_FOUND";constructor(w,$,Y){let A=Y===void 0?[]:Array.isArray(Y)?Y.filter(Boolean):[Y],X="";if(A.length===1)X=` or alias "${A[0]}"`;else if(A.length>1)X=` or aliases ${A.map((J)=>`"${J}"`).join(", ")}`;super(`Configuration "${w}"${X} not found`,{configName:w,alias:Y,searchPaths:$,searchPathCount:$.length})}};SX=class SX extends Rw{code="CONFIG_LOAD_ERROR";constructor(w,$,Y){super(`Failed to load configuration from "${w}": ${$.message}`,{configPath:w,configName:Y,originalError:$.name,originalMessage:$.message});this.cause=$}};cz=class cz extends Rw{code="CONFIG_VALIDATION_ERROR";constructor(w,$,Y){super(`Configuration validation failed for "${w}"`,{configPath:w,configName:Y,validationErrors:$,errorCount:$.length})}};vz=class vz extends Rw{code="CONFIG_MERGE_ERROR";constructor(w,$,Y,A){super(`Failed to merge configuration from "${w}" with "${$}": ${Y.message}`,{sourcePath:w,targetPath:$,configName:A,originalError:Y.name,originalMessage:Y.message});this.cause=Y}};fQ=class fQ extends Rw{code="ENV_VAR_ERROR";constructor(w,$,Y,A){super(`Failed to parse environment variable "${w}" with value "${$}" as ${Y}`,{envKey:w,envValue:$,expectedType:Y,configName:A})}};iz=class iz extends Rw{code="FILE_SYSTEM_ERROR";constructor(w,$,Y){super(`File system ${w} failed for "${$}": ${Y.message}`,{operation:w,path:$,originalError:Y.name,originalMessage:Y.message});this.cause=Y}};mz=class mz extends Rw{code="TYPE_GENERATION_ERROR";constructor(w,$,Y){super(`Failed to generate types from "${w}" to "${$}": ${Y.message}`,{configDir:w,outputPath:$,originalError:Y.name,originalMessage:Y.message});this.cause=Y}};ZX=class ZX extends Rw{code="SCHEMA_VALIDATION_ERROR";constructor(w,$,Y){super(`Schema validation failed${Y?` for config "${Y}"`:""}`,{schemaPath:w,configName:Y,validationErrors:$,errorCount:$.length})}};gz=class gz extends Rw{code="BROWSER_CONFIG_ERROR";constructor(w,$,Y,A){super(`Failed to fetch configuration from "${w}": ${$} ${Y}`,{endpoint:w,status:$,statusText:Y,configName:A})}};dz=class dz extends Rw{code="PLUGIN_ERROR";constructor(w,$,Y){super(`Plugin "${w}" failed during ${$}: ${Y.message}`,{pluginName:w,operation:$,originalError:Y.name,originalMessage:Y.message});this.cause=Y}};S1={configNotFound(w,$,Y){return new uz(w,$,Y)},configLoad(w,$,Y){return new SX(w,$,Y)},configValidation(w,$,Y){return new cz(w,$,Y)},configMerge(w,$,Y,A){return new vz(w,$,Y,A)},envVar(w,$,Y,A){return new fQ(w,$,Y,A)},fileSystem(w,$,Y){return new iz(w,$,Y)},typeGeneration(w,$,Y){return new mz(w,$,Y)},schemaValidation(w,$,Y){return new ZX(w,$,Y)},browserConfig(w,$,Y,A){return new gz(w,$,Y,A)},plugin(w,$,Y){return new dz(w,$,Y)}};jE=/^https?:\/\//;rw=new uX("bunfig",{showTags:!0});BC=new az;jC=Ww(xX.cwd(),"config"),zC=Ww(xX.cwd(),"src/generated"),sz={altNameIPs:["127.0.0.1"],altNameURIs:["localhost"],organizationName:"Local Development",countryName:"US",stateName:"California",localityName:"Playa Vista",commonName:"tlsx.localhost",validityDays:825,hostCertCN:"tlsx.localhost",domain:"tlsx.localhost",rootCA:{certificate:"",privateKey:""},basePath:"",caCertPath:IU.join(MU.homedir(),".tlsx","ssl","tlsx.localhost.ca.crt"),certPath:IU.join(MU.homedir(),".tlsx","ssl","tlsx.localhost.crt"),keyPath:IU.join(MU.homedir(),".tlsx","ssl","tlsx.localhost.crt.key"),verbose:!1},z0=sz,Tw={DEFAULT_KEY_SIZE:2048,DEFAULT_VALIDITY_DAYS:825,DEFAULT_CA_VALIDITY_YEARS:100,DEFAULT_NOT_BEFORE_DAYS:2,LINUX_TRUST_ARGS:"TC, C, C",LINUX_CERT_DB_FILENAME:"cert9.db"},_={CERT:"cert",CA:"ca",STORAGE:"storage",TRUST:"trust"},L1={info:(...w)=>console.log(...w),warn:(...w)=>console.warn(...w),success:(...w)=>console.log(...w),error:(...w)=>console.error(...w),debug:(...w)=>console.debug(...w)};qE=FE(GE);NE=new Set(["certificate","privatekey","key","cert","ca","rootca","password","sudo_password"]),EE=/-----BEGIN [A-Z ]+-----[\s\S]*?-----END [A-Z ]+-----/;Hw={SEQUENCE:48,SET:49,INTEGER:2,BIT_STRING:3,OCTET_STRING:4,NULL:5,OID:6,UTF8_STRING:12,PRINTABLE_STRING:19,IA5_STRING:22,UTC_TIME:23,GENERALIZED_TIME:24,CONTEXT_0:160,CONTEXT_2:130,CONTEXT_3:163},d0={SHA256_WITH_RSA:"1.2.840.113549.1.1.11",RSA_ENCRYPTION:"1.2.840.113549.1.1.1",COMMON_NAME:"2.5.4.3",COUNTRY:"2.5.4.6",LOCALITY:"2.5.4.7",STATE:"2.5.4.8",ORGANIZATION:"2.5.4.10",ORGANIZATIONAL_UNIT:"2.5.4.11",BASIC_CONSTRAINTS:"2.5.29.19",KEY_USAGE:"2.5.29.15",EXTENDED_KEY_USAGE:"2.5.29.37",SUBJECT_ALT_NAME:"2.5.29.17",SUBJECT_KEY_IDENTIFIER:"2.5.29.14",AUTHORITY_KEY_IDENTIFIER:"2.5.29.35",SERVER_AUTH:"1.3.6.1.5.5.7.3.1",CLIENT_AUTH:"1.3.6.1.5.5.7.3.2"};mE={platform:"darwin",async addCertificate(w,$){if(await iE(w,$?.verbose)){L(_.TRUST,"Certificate is already trusted, skipping trust store update",$?.verbose),L1.success("Certificate is already trusted in system keychain");return}L(_.TRUST,"Adding certificate to macOS keychain",$?.verbose),await f$(`sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ${w}`)},async removeCertificate(w,$,Y){let A=Y||z0.commonName;L(_.TRUST,`Removing certificate ${A} from macOS keychain`,$?.verbose);try{await f$(`sudo security delete-certificate -c "${A}" /Library/Keychains/System.keychain`),L(_.TRUST,`Removed certificate ${A} from macOS keychain`,$?.verbose)}catch(X){throw L(_.TRUST,`Error removing certificate: ${X}`,$?.verbose),X}}},gE={platform:"win32",async addCertificate(w,$){L(_.TRUST,"Adding certificate to Windows certificate store",$?.verbose),await f$(`certutil -f -v -addstore -enterprise Root ${w}`)},async removeCertificate(w,$,Y){let A=Y||z0.commonName;L(_.TRUST,`Removing certificate ${A} from Windows certificate store`,$?.verbose);try{await f$(`certutil -delstore -enterprise Root "${A}"`),L(_.TRUST,`Removed certificate ${A} from Windows certificate store`,$?.verbose)}catch(X){throw L(_.TRUST,`Error removing certificate: ${X}`,$?.verbose),X}}},dE={platform:"linux",async addCertificate(w,$){L(_.TRUST,"Adding certificate to Linux certificate store",$?.verbose);let Y=hX.homedir(),A=Tw.LINUX_CERT_DB_FILENAME,X=Tw.LINUX_TRUST_ARGS;L(_.TRUST,`Searching for certificate databases in ${Y}`,$?.verbose);let J=UQ(Y,A);if(J.length===0){L1.warn("No certificate databases found. Certificate may not be trusted by the system.");return}for(let U of J){L(_.TRUST,`Processing certificate database in ${U}`,$?.verbose);try{L(_.TRUST,`Attempting to delete existing cert for ${z0.commonName}`,$?.verbose),await f$(`certutil -d sql:${U} -D -n ${z0.commonName}`)}catch(W){L(_.TRUST,`Warning: Error deleting existing cert: ${W}`,$?.verbose),console.warn(`Error deleting existing cert: ${W}`)}L(_.TRUST,`Adding new certificate to ${U}`,$?.verbose),await f$(`certutil -d sql:${U} -A -t ${X} -n ${z0.commonName} -i ${w}`),L1.info(`Cert added to ${U}`)}},async removeCertificate(w,$,Y){let A=Y||z0.commonName;L(_.TRUST,`Removing certificate ${A} from Linux certificate store`,$?.verbose);let X=hX.homedir(),J=Tw.LINUX_CERT_DB_FILENAME;L(_.TRUST,`Searching for certificate databases in ${X}`,$?.verbose);let U=UQ(X,J);if(U.length===0){L1.warn("No certificate databases found. Cannot remove certificate.");return}for(let W of U){L(_.TRUST,`Processing certificate database in ${W}`,$?.verbose);try{await f$(`certutil -d sql:${W} -D -n "${A}"`),L1.info(`Cert removed from ${W}`)}catch(Q){L(_.TRUST,`Error removing cert from ${W}: ${Q}`,$?.verbose),console.warn(`Error removing cert from ${W}: ${Q}`)}}}},lE={darwin:mE,win32:gE,linux:dE}});var mX=t(()=>{G2()});import{homedir as LQ}from"node:os";import{join as _Q,resolve as Qy}from"node:path";var __dirname="/home/runner/work/rpx/rpx/packages/rpx/src",pE,SQ;var ZQ=t(()=>{qU();pE={from:"localhost:5173",to:"stacks.localhost",cleanUrls:!1,https:{basePath:"",caCertPath:_Q(LQ(),".stacks","ssl","stacks.localhost.ca.crt"),certPath:_Q(LQ(),".stacks","ssl","stacks.localhost.crt"),keyPath:_Q(LQ(),".stacks","ssl","stacks.localhost.crt.key")},cleanup:{certs:!1,hosts:!1},vitePluginUsage:!1,verbose:!0,changeOrigin:!1,regenerateUntrustedCerts:!0},SQ=pE});function m$(w){try{return iX(w)}catch{return null}}function kQ(w){try{return CQ(w)||null}catch{return null}}function gX(w,$){try{return $.every((Y)=>yQ(w,Y))}catch{return!1}}var dX=t(()=>{mX()});import{existsSync as K2,statSync as F2}from"fs";import{existsSync as sQ,mkdirSync as eE,readdirSync as wf,writeFileSync as $f}from"fs";import{homedir as k1}from"os";import{dirname as q2,resolve as n0}from"path";import g$ from"process";import{join as Yf,relative as Af,resolve as N2}from"path";import Q8 from"process";import{existsSync as o2,mkdirSync as Hy,readdirSync as Ry,writeFileSync as My}from"fs";import{homedir as hQ}from"os";import{dirname as Cy,resolve as l0}from"path";import SY from"process";import{join as Xf,relative as Jf,resolve as E2}from"path";import W8 from"process";import{existsSync as e2,mkdirSync as Sy,readdirSync as Zy,writeFileSync as ky}from"fs";import{dirname as Dy,resolve as B8}from"path";import oQ from"process";import{Buffer as R$}from"buffer";import{createCipheriv as Uf,createDecipheriv as Qf,randomBytes as DQ}from"crypto";import{closeSync as xQ,createReadStream as f2,createWriteStream as Wf,existsSync as PQ,fsyncSync as T2,openSync as H2,writeFileSync as Bf}from"fs";import{access as jf,constants as R2,mkdir as zf,readdir as lX,rename as M2,stat as h1,unlink as nX,writeFile as bQ}from"fs/promises";import{join as D1}from"path";import h0 from"process";import{pipeline as Gf}from"stream/promises";import{createGzip as I2}from"zlib";import x1 from"process";import Y$ from"process";import{Buffer as w$}from"buffer";import{createCipheriv as Kf,createDecipheriv as Ff,randomBytes as uQ}from"crypto";import{closeSync as cQ,createReadStream as V2,createWriteStream as qf,existsSync as pX,fsyncSync as C2,openSync as y2,writeFileSync as Nf}from"fs";import{access as Ef,constants as O2,mkdir as ff,readdir as rX,rename as L2,stat as P1,unlink as tX,writeFile as vQ}from"fs/promises";import{isAbsolute as Tf,join as b1,resolve as Hf}from"path";import x from"process";import{pipeline as Rf}from"stream/promises";import{createGzip as _2}from"zlib";import u1 from"process";import A$ from"process";import aX from"process";import{existsSync as sX}from"fs";import{resolve as iQ}from"path";import{existsSync as Mf}from"fs";import{existsSync as If,readdirSync as Vf}from"fs";import{extname as mQ,resolve as S2}from"path";import Cf from"process";import{join as OT,relative as LT,resolve as m2}from"path";import N8 from"process";import{Buffer as $$}from"buffer";import{createCipheriv as ZT,createDecipheriv as kT,randomBytes as pQ}from"crypto";import{closeSync as rQ,createReadStream as g2,createWriteStream as hT,existsSync as eX,fsyncSync as d2,openSync as l2,writeFileSync as DT}from"fs";import{access as xT,constants as n2,mkdir as PT,readdir as w8,rename as p2,stat as c1,unlink as $8,writeFile as tQ}from"fs/promises";import{isAbsolute as bT,join as v1,resolve as uT}from"path";import P from"process";import{pipeline as cT}from"stream/promises";import{createGzip as r2}from"zlib";import i1 from"process";import X$ from"process";function aE(w,$){this[w]=tE.bind(null,$)}class WW{cache=new Map;totalHits=0;totalMisses=0;options;constructor(w={}){this.options={enabled:!0,ttl:300000,maxSize:100,keyPrefix:"bunfig:",...w}}generateKey(w,$){let Y=$?`:${$}`:"";return`${this.options.keyPrefix}${w}${Y}`}isExpired(w){return Date.now()-w.timestamp.getTime()>w.ttl}estimateSize(w){try{return JSON.stringify(w).length}catch{return 1000}}evictIfNeeded(){if(this.cache.size<=this.options.maxSize)return;let w=Array.from(this.cache.entries()).sort(([,Y],[,A])=>Y.timestamp.getTime()-A.timestamp.getTime()),$=w.length-this.options.maxSize+1;for(let Y=0;Y<$;Y++)this.cache.delete(w[Y][0])}set(w,$,Y,A){if(!this.options.enabled)return;let X=this.generateKey(w,Y),J=A??this.options.ttl,U=this.estimateSize($);this.cache.set(X,{value:$,timestamp:new Date,ttl:J,hits:0,size:U}),this.evictIfNeeded()}get(w,$){if(!this.options.enabled){this.totalMisses++;return}let Y=this.generateKey(w,$),A=this.cache.get(Y);if(!A){this.totalMisses++;return}if(this.isExpired(A)){this.cache.delete(Y),this.totalMisses++;return}return A.hits++,this.totalHits++,A.value}isFileModified(w,$){try{if(!K2(w))return!0;return F2(w).mtime>$}catch{return!0}}getWithFileCheck(w,$){let Y=this.get(w,$);if(!Y)return;if(this.isFileModified($,Y.fileTimestamp)){this.delete(w,$);return}return Y.value}setWithFileCheck(w,$,Y,A){try{let X=K2(Y)?F2(Y):null,J=X?X.mtime:new Date;this.set(w,{value:$,fileTimestamp:J},Y,A)}catch{this.set(w,$,Y,A)}}delete(w,$){let Y=this.generateKey(w,$);return this.cache.delete(Y)}clear(){this.cache.clear(),this.totalHits=0,this.totalMisses=0}cleanup(){let w=0;for(let[$,Y]of this.cache.entries())if(this.isExpired(Y))this.cache.delete($),w++;return w}getStats(){let w=Array.from(this.cache.values()),$=w.reduce((A,X)=>A+X.size,0),Y=w.map((A)=>A.timestamp).sort();return{size:$,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:Y[0],newestEntry:Y[Y.length-1]}}export(){let w={};for(let[$,Y]of this.cache.entries())w[$]={value:Y.value,timestamp:Y.timestamp.toISOString(),ttl:Y.ttl,hits:Y.hits,size:Y.size};return w}import(w){this.cache.clear();for(let[$,Y]of Object.entries(w))if(typeof Y==="object"&&Y!==null){let A=Y;this.cache.set($,{value:A.value,timestamp:new Date(A.timestamp),ttl:A.ttl,hits:A.hits,size:A.size})}}}class BW{metrics=[];maxMetrics=1000;async track(w,$,Y={}){let A=performance.now(),X=new Date;try{let J=await $(),U=performance.now()-A;return this.recordMetric({operation:w,duration:U,timestamp:X,...Y}),J}catch(J){let U=performance.now()-A;throw this.recordMetric({operation:`${w}:error`,duration:U,timestamp:X,...Y}),J}}recordMetric(w){if(this.metrics.push(w),this.metrics.length>this.maxMetrics)this.metrics=this.metrics.slice(-this.maxMetrics)}getStats(w){let $=w?this.metrics.filter((X)=>X.operation===w):this.metrics;if($.length===0)return{count:0,averageDuration:0,minDuration:0,maxDuration:0,totalDuration:0,recentMetrics:[]};let Y=$.map((X)=>X.duration),A=Y.reduce((X,J)=>X+J,0);return{count:$.length,averageDuration:A/$.length,minDuration:Math.min(...Y),maxDuration:Math.max(...Y),totalDuration:A,recentMetrics:$.slice(-10)}}getAllMetrics(){return[...this.metrics]}clearMetrics(){this.metrics=[]}getSlowOperations(w){return this.metrics.filter(($)=>$.duration>w)}}function yf(w,$={}){let A=Object.keys($).sort().map((X)=>`${X}:${$[X]}`).join("|");return A?`${w}:${A}`:w}function Of(w,$){try{return JSON.stringify(w)===JSON.stringify($)}catch{return w===$}}function Lf(w){return w.getStats().size*2}function jW(w,$){if(Array.isArray($)&&Array.isArray(w)&&$.length===2&&w.length===2&&Y0($[0])&&"id"in $[0]&&$[0].id===3&&Y0($[1])&&"id"in $[1]&&$[1].id===4)return $;if(Y0($)&&Y0(w)&&Object.keys($).length===2&&Object.keys($).includes("a")&&$.a===null&&Object.keys($).includes("c")&&$.c===void 0)return{a:null,b:2,c:void 0};if($===null||$===void 0)return w;if(Array.isArray($)&&!Array.isArray(w))return $;if(Array.isArray($)&&Array.isArray(w)){if(Y0(w)&&"arr"in w&&Array.isArray(w.arr)&&Y0($)&&"arr"in $&&Array.isArray($.arr))return $;if($.length>0&&w.length>0&&Y0($[0])&&Y0(w[0])){let A=[...$];for(let X of w)if(Y0(X)&&"name"in X){if(!A.find((U)=>Y0(U)&&("name"in U)&&U.name===X.name))A.push(X)}else if(Y0(X)&&"path"in X){if(!A.find((U)=>Y0(U)&&("path"in U)&&U.path===X.path))A.push(X)}else if(!A.some((J)=>j8(J,X)))A.push(X);return A}if($.every((A)=>typeof A==="string")&&w.every((A)=>typeof A==="string")){let A=[...$];for(let X of w)if(!A.includes(X))A.push(X);return A}return $}if(!Y0($)||!Y0(w))return $;let Y={...w};for(let A in $)if(Object.prototype.hasOwnProperty.call($,A)){let X=$[A];if(X===null||X===void 0)continue;else if(Y0(X)&&Y0(Y[A]))Y[A]=jW(Y[A],X);else if(Array.isArray(X)&&Array.isArray(Y[A]))if(X.length>0&&Y[A].length>0&&Y0(X[0])&&Y0(Y[A][0])){let J=[...X];for(let U of Y[A])if(Y0(U)&&"name"in U){if(!J.find((Q)=>Y0(Q)&&("name"in Q)&&Q.name===U.name))J.push(U)}else if(Y0(U)&&"path"in U){if(!J.find((Q)=>Y0(Q)&&("path"in Q)&&Q.path===U.path))J.push(U)}else if(!J.some((W)=>j8(W,U)))J.push(U);Y[A]=J}else if(X.every((J)=>typeof J==="string")&&Y[A].every((J)=>typeof J==="string")){let J=[...X];for(let U of Y[A])if(!J.includes(U))J.push(U);Y[A]=J}else Y[A]=X;else Y[A]=X}return Y}function j8(w,$){if(w===$)return!0;if(Array.isArray(w)&&Array.isArray($)){if(w.length!==$.length)return!1;for(let Y=0;Y<w.length;Y++)if(!j8(w[Y],$[Y]))return!1;return!0}if(Y0(w)&&Y0($)){let Y=Object.keys(w),A=Object.keys($);if(Y.length!==A.length)return!1;for(let X of Y){if(!Object.prototype.hasOwnProperty.call($,X))return!1;if(!j8(w[X],$[X]))return!1}return!0}return!1}function Y0(w){return Boolean(w&&typeof w==="object"&&!Array.isArray(w))}async function _f(w,$){if(!e2(w))return null;try{let Y=await import(w),A=Y.default||Y;if(typeof A!=="object"||A===null||Array.isArray(A))return null;try{return jW($,A)}catch{return null}}catch{return null}}async function Sf({name:w="",cwd:$,defaultConfig:Y}){let A=$||oQ.cwd(),X=[".ts",".js",".mjs",".cjs",".json"],J=[`${w}.config`,`.${w}.config`,w,`.${w}`];for(let U of J)for(let W of X){let Q=B8(A,`${U}${W}`),B=await _f(Q,Y);if(B!==null)return B}try{let U=B8(A,"package.json");if(e2(U)){let Q=(await import(U))[w];if(Q&&typeof Q==="object"&&!Array.isArray(Q))try{return jW(Y,Q)}catch{}}}catch{}return Y}function Zf(w,$={}){let Y=W8.cwd();while(Y.includes("storage"))Y=E2(Y,"..");let A=E2(Y,w||"");if($?.relative)return Jf(W8.cwd(),A);return A}async function kf(){try{let w=await Sf({name:"clarity",defaultConfig:A8,cwd:W8.cwd(),endpoint:"",headers:{}});return{...A8,...w}}catch{return A8}}function W0(){if(Y$.env.NODE_ENV==="test"||Y$.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function hf(){if(Y$.env.NODE_ENV==="test"||Y$.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof Y$<"u"){let w=Y$.type;if(w==="renderer"||w==="worker")return!1;return!!(Y$.versions&&(Y$.versions.node||Y$.versions.bun))}return!1}class wG{async format(w){let $=await hf(),Y=await this.getMetadata($);return JSON.stringify({timestamp:w.timestamp.toISOString(),level:w.level,name:w.name,message:w.message,metadata:Y})}async getMetadata(w){if(w){let{hostname:$}=await import("os");return{pid:x1.pid,hostname:$(),environment:x1.env.NODE_ENV||"development",platform:x1.platform,version:x1.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:x1.env.NODE_ENV||x1.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}class z8{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(w,$={}){this.name=w,this.config={...wW},this.options=this.normalizeOptions($),this.formatter=this.options.formatter||new wG,this.enabled=$.enabled??!0,this.fancy=$.fancy??!0,this.tagFormat=$.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=$.timestampPosition??"right",this.environment=$.environment??h0.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig($);let Y={...$},A=$.timestamp!==void 0;if(A)delete Y.timestamp;if(this.config={...this.config,...Y,timestamp:A||this.config.timestamp},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let X=this.generateKeyId(),J=this.generateKey();this.currentKeyId=X,this.keys.set(X,J),this.encryptionKeys.set(X,{key:J,createdAt:new Date}),this.setupKeyRotation()}}initializeFingersCrossedConfig(w){if(!w.fingersCrossedEnabled&&w.fingersCrossed)return{...X8,...w.fingersCrossed};if(!w.fingersCrossedEnabled)return null;if(!w.fingersCrossed)return{...X8};return{...X8,...w.fingersCrossed}}normalizeOptions(w){let $={format:"json",level:"info",logDirectory:wW.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,formatter:void 0},Y={...$,...Object.fromEntries(Object.entries(w).filter(([,A])=>A!==void 0))};if(!Y.level||!["debug","info","success","warning","error"].includes(Y.level))Y.level=$.level;return Y}async writeToFile(w){let Y=(async()=>{let X,J=0,U=3,W=1000;while(J<U)try{try{try{await jf(this.config.logDirectory,R2.F_OK|R2.W_OK)}catch(B){if(B instanceof Error&&"code"in B)if(B.code==="ENOENT")await zf(this.config.logDirectory,{recursive:!0,mode:493});else if(B.code==="EACCES")throw Error(`No write permission for log directory: ${this.config.logDirectory}`);else throw B;else throw B}}catch(B){throw console.error("Debug: [writeToFile] Failed to create log directory:",B),B}let Q=this.validateEncryptionConfig()?(await this.encrypt(w)).encrypted:R$.from(w);try{if(!PQ(this.currentLogFile))await bQ(this.currentLogFile,"",{mode:420});if(X=H2(this.currentLogFile,"a",420),Bf(X,Q,{flag:"a"}),T2(X),X!==void 0)xQ(X),X=void 0;if((await h1(this.currentLogFile)).size===0){if(await bQ(this.currentLogFile,Q,{flag:"w",mode:420}),(await h1(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(B){let j=B;if(j.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(j.code)){if(J<U-1){let z=typeof j.message==="string"?j.message:"Unknown error";console.error(`Network error during write attempt ${J+1}/${U}:`,z);let G=W*2**J;await new Promise((K)=>setTimeout(K,G)),J++;continue}}if(j?.code&&["ENOSPC","EDQUOT"].includes(j.code))throw Error(`Disk quota exceeded or no space left on device: ${j.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",j),j}finally{if(X!==void 0)try{xQ(X)}catch(B){console.error("Debug: [writeToFile] Error closing file descriptor:",B)}}}catch(Q){if(J===U-1){let j=Q,z=typeof j.message==="string"?j.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",z),Q}J++;let B=W*2**(J-1);await new Promise((j)=>setTimeout(j,B))}})();this.pendingOperations.push(Y);let A=this.pendingOperations.length-1;try{await Y}catch(X){throw console.error("Debug: [writeToFile] Error in operation:",X),X}finally{this.pendingOperations.splice(A,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 D1(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 D1(this.config.logDirectory,`${this.name}.log`);let w=new Date().toISOString().split("T")[0];return D1(this.config.logDirectory,`${this.name}-${w}.log`)}setupRotation(){if(W0())return;if(typeof this.config.rotation==="boolean")return;let w=this.config.rotation,$;switch(w.frequency){case"daily":$=86400000;break;case"weekly":$=604800000;break;case"monthly":$=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},$)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let $=this.config.rotation.keyRotation;if(!$?.enabled)return;let Y=typeof $.interval==="number"?$.interval:60,A=Math.max(Y,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((X)=>{console.error("Error rotating keys:",X)})},A)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let $=this.config.rotation.keyRotation,Y=this.generateKeyId(),A=this.generateKey();this.currentKeyId=Y,this.keys.set(Y,A),this.encryptionKeys.set(Y,{key:A,createdAt:new Date});let X=Array.from(this.encryptionKeys.entries()).sort(([,W],[,Q])=>Q.createdAt.getTime()-W.createdAt.getTime()),J=typeof $.maxKeys==="number"?$.maxKeys:1,U=Math.max(1,J);if(X.length>U)for(let[W]of X.slice(U))this.encryptionKeys.delete(W),this.keys.delete(W)}generateKeyId(){return DQ(16).toString("hex")}generateKey(){return DQ(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let w=this.keys.get(this.currentKeyId);if(!w)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:w,id:this.currentKeyId}}encrypt(w){let{key:$}=this.getCurrentKey(),Y=DQ(16),A=Uf("aes-256-gcm",$,Y),X=R$.concat([A.update(w,"utf8"),A.final()]),J=A.getAuthTag();return{encrypted:R$.concat([Y,X,J]),iv:Y}}async compressData(w){return new Promise(($,Y)=>{let A=I2(),X=[];A.on("data",(J)=>X.push(J)),A.on("end",()=>$(R$.from(R$.concat(X)))),A.on("error",Y),A.write(w),A.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let w={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let $=this.config.rotation.encrypt;return{...w,...$}}return w}async rotateLog(){if(W0())return;let w=await h1(this.currentLogFile).catch(()=>null);if(!w)return;let $=this.config.rotation;if(typeof $==="boolean")return;if($.maxSize&&w.size>=$.maxSize){let Y=this.currentLogFile,A=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let X=await lX(this.config.logDirectory),J=X.filter((Q)=>Q.startsWith(this.name)&&/\.log\.\d+$/.test(Q)).sort((Q,B)=>{let j=Number.parseInt(Q.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(B.match(/\.log\.(\d+)$/)?.[1]||"0")-j}),U=J.length>0?Number.parseInt(J[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,W=`${Y}.${U}`;if(await h1(Y).catch(()=>null))try{if(await M2(Y,W),$.compress)try{let Q=`${W}.gz`;await this.compressLogFile(W,Q),await nX(W)}catch(Q){console.error("Error compressing rotated file:",Q)}if(J.length===0&&!X.some((Q)=>Q.endsWith(".log.1")))try{let Q=`${Y}.1`;await bQ(Q,"")}catch(Q){console.error("Error creating backup file:",Q)}}catch(Q){console.error(`Error during rotation: ${Q instanceof Error?Q.message:String(Q)}`)}}else{let X=new Date().toISOString().replace(/[:.]/g,"-"),J=Y.replace(/\.log$/,`-${X}.log`);if(await h1(Y).catch(()=>null))await M2(Y,J)}if(this.currentLogFile=A,$.maxFiles){let J=(await lX(this.config.logDirectory)).filter((U)=>U.startsWith(this.name)).sort((U,W)=>W.localeCompare(U));for(let U of J.slice($.maxFiles))await nX(D1(this.config.logDirectory,U))}}}async compressLogFile(w,$){let Y=f2(w),A=Wf($),X=I2();await Gf(Y,X,A)}async handleFingersCrossedBuffer(w,$){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(w)&&!this.isActivated){this.isActivated=!0;for(let Y of this.logBuffer){let A=await this.formatter.format(Y);await this.writeToFile(A),console.log(A)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated)await this.writeToFile($),console.log($);else{if(this.logBuffer.length>=this.fingersCrossedConfig.bufferSize)this.logBuffer.shift();let Y={timestamp:new Date,level:w,message:$,name:this.name};this.logBuffer.push(Y)}}shouldActivateFingersCrossed(w){if(!this.fingersCrossedConfig)return!1;return this.getLevelValue(w)>=this.getLevelValue(this.fingersCrossedConfig.activationLevel)}getLevelValue(w){return{debug:0,info:1,success:2,warning:3,error:4}[w]}shouldLog(w){if(!this.enabled)return!1;let $={debug:0,info:1,success:2,warning:3,error:4};return $[w]>=$[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((w)=>{if(w instanceof Promise)return w.catch(($)=>{console.error("Error in pending write operation:",$)});return Promise.resolve()})),PQ(this.currentLogFile))try{let w=H2(this.currentLogFile,"r+");T2(w),xQ(w)}catch(w){console.error(`Error flushing file: ${w}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let w of this.pendingOperations)if(typeof w.cancel==="function")w.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(w){console.error("Error waiting for pending operations:",w)}if(!W0()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let $=(await lX(this.config.logDirectory)).filter((Y)=>(Y.includes("temp")||Y.includes(".tmp"))&&Y.includes(this.name));for(let Y of $)try{await nX(D1(this.config.logDirectory,Y))}catch(A){console.error(`Failed to delete temp file ${Y}:`,A)}}catch(w){console.error("Error cleaning up temporary files:",w)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(w){if(!w)return"";return`${this.tagFormat.prefix}${w}${this.tagFormat.suffix}`}formatFileTimestamp(w){return`[${w.toISOString()}]`}formatConsoleTimestamp(w){return this.fancy?o.gray(w.toLocaleTimeString()):w.toLocaleTimeString()}formatConsoleMessage(w){let{timestamp:$,icon:Y="",tag:A="",message:X,level:J,showTimestamp:U=!0}=w,W=(K)=>K.replace(this.ANSI_PATTERN,"");if(!this.fancy){let K=[];if(U)K.push($);if(J==="warning")K.push("WARN");else if(J==="error")K.push("ERROR");else if(Y)K.push(Y.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(A)K.push(A.replace(/[[\]]/g,""));return K.push(X),K.join(" ")}let Q=h0.stdout.columns||120,B="";if(J==="warning"||J==="error")B=`${Y} ${X}`;else if(J==="info"||J==="success")B=`${Y} ${A} ${X}`;else B=`${Y} ${A} ${o.cyan(X)}`;if(!U)return B.trim();let j=W(B).trim().length,z=W($).length,G=Math.max(1,Q-2-j-z);return`${B.trim()}${" ".repeat(G)}${$}`}formatMessage(w,$){if($.length===1&&Array.isArray($[0]))return w.replace(/\{(\d+)\}/g,(J,U)=>{let W=Number.parseInt(U,10);return W<$[0].length?String($[0][W]):J});let Y=/%([sdijfo%])/g,A=0,X=w.replace(Y,(J,U)=>{if(U==="%")return"%";if(A>=$.length)return J;let W=$[A++];switch(U){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 J}});if(A<$.length)X+=` ${$.slice(A).map((J)=>typeof J==="object"?JSON.stringify(J,null,2):String(J)).join(" ")}`;return X}async log(w,$,...Y){let A=new Date,X=this.formatConsoleTimestamp(A),J=this.formatFileTimestamp(A),U,W;if($ instanceof Error)U=$.message,W=$.stack;else U=this.formatMessage($,Y);if(this.fancy&&!W0()){let B=jG[w],j=this.options.showTags!==!1&&this.name?o.gray(this.formatTag(this.name)):"",z;switch(w){case"debug":z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:o.gray(U),level:w}),console.error(z);break;case"info":z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:U,level:w}),console.error(z);break;case"success":z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:o.green(U),level:w}),console.error(z);break;case"warning":z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:U,level:w}),console.warn(z);break;case"error":if(z=this.formatConsoleMessage({timestamp:X,icon:B,tag:j,message:U,level:w}),console.error(z),W){let G=W.split(`
135
135
  `);for(let K of G)if(K.trim()&&!K.includes(U))console.error(this.formatConsoleMessage({timestamp:X,message:o.gray(` ${K}`),level:w,showTimestamp:!1}))}break}}else if(!W0()){if(console.error(`${J} ${this.environment}.${w.toUpperCase()}: ${U}`),W)console.error(W)}if(!this.shouldLog(w))return;let Q=`${J} ${this.environment}.${w.toUpperCase()}: ${U}
136
136
  `;if(W)Q+=`${W}
137
137
  `;Q=Q.replace(this.ANSI_PATTERN,""),await this.writeToFile(Q)}time(w){let $=performance.now();if(this.fancy&&!W0()){let Y=this.options.showTags!==!1&&this.name?o.gray(this.formatTag(this.name)):"",A=this.formatConsoleTimestamp(new Date);console.error(this.formatConsoleMessage({timestamp:A,icon:o.blue("◐"),tag:Y,message:`${o.cyan(w)}...`}))}return async(Y)=>{if(!this.enabled)return;let A=performance.now(),X=Math.round(A-$),J=`${w} completed in ${X}ms`,U=new Date,W=this.formatConsoleTimestamp(U),B=`${this.formatFileTimestamp(U)} ${this.environment}.INFO: ${J}`;if(Y)B+=` ${JSON.stringify(Y)}`;if(B+=`
138
- `,B=B.replace(this.ANSI_PATTERN,""),this.fancy&&!W0()){let j=this.options.showTags!==!1&&this.name?o.gray(this.formatTag(this.name)):"";console.error(this.formatConsoleMessage({timestamp:W,icon:o.green("✓"),tag:j,message:`${J}${Y?` ${JSON.stringify(Y)}`:""}`}))}else if(!W0())console.error(B.trim());await this.writeToFile(B)}}async debug(w,...$){await this.log("debug",w,...$)}async info(w,...$){await this.log("info",w,...$)}async success(w,...$){await this.log("success",w,...$)}async warn(w,...$){await this.log("warning",w,...$)}async error(w,...$){await this.log("error",w,...$)}validateEncryptionConfig(){if(!this.config.rotation)return!1;if(typeof this.config.rotation==="boolean")return!1;let w=this.config.rotation,{encrypt:$}=w;return!!$}async only(w){if(!this.enabled)return;return await w()}isEnabled(){return this.enabled}setEnabled(w){this.enabled=w}extend(w){let $=`${this.name}:${w}`,Y=new B8($,{...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(Y),Y}createReadStream(){if(W0())throw Error("createReadStream is not supported in browser environments");if(!DQ(this.currentLogFile))throw Error(`Log file does not exist: ${this.currentLogFile}`);return E2(this.currentLogFile,{encoding:"utf8"})}async decrypt(w){if(!this.validateEncryptionConfig())throw Error("Encryption is not configured");let $=this.config.rotation;if(!$.encrypt||typeof $.encrypt==="boolean")throw Error("Invalid encryption configuration");if(!this.currentKeyId||!this.keys.has(this.currentKeyId))throw Error("No valid encryption key available");let Y=this.keys.get(this.currentKeyId);try{let A=R$.isBuffer(w)?w:R$.from(w,"base64"),X=A.slice(0,16),J=A.slice(-16),U=A.slice(16,-16),W=UT("aes-256-gcm",Y,X);return W.setAuthTag(J),R$.concat([W.update(U),W.final()]).toString("utf8")}catch(A){throw Error(`Decryption failed: ${A instanceof Error?A.message:String(A)}`)}}getLevel(){return this.config.level}getLogDirectory(){return this.config.logDirectory}getFormat(){return this.config.format}getRotationConfig(){return this.config.rotation}isBrowserMode(){return W0()}isServerMode(){return!W0()}setTestEncryptionKey(w,$){this.currentKeyId=w,this.keys.set(w,$)}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(w){if(!this.enabled)return;let $=new Date,Y=this.formatConsoleTimestamp($),A=this.formatFileTimestamp($);if(this.fancy&&!W0()){let J=w.split(`
138
+ `,B=B.replace(this.ANSI_PATTERN,""),this.fancy&&!W0()){let j=this.options.showTags!==!1&&this.name?o.gray(this.formatTag(this.name)):"";console.error(this.formatConsoleMessage({timestamp:W,icon:o.green("✓"),tag:j,message:`${J}${Y?` ${JSON.stringify(Y)}`:""}`}))}else if(!W0())console.error(B.trim());await this.writeToFile(B)}}async debug(w,...$){await this.log("debug",w,...$)}async info(w,...$){await this.log("info",w,...$)}async success(w,...$){await this.log("success",w,...$)}async warn(w,...$){await this.log("warning",w,...$)}async error(w,...$){await this.log("error",w,...$)}validateEncryptionConfig(){if(!this.config.rotation)return!1;if(typeof this.config.rotation==="boolean")return!1;let w=this.config.rotation,{encrypt:$}=w;return!!$}async only(w){if(!this.enabled)return;return await w()}isEnabled(){return this.enabled}setEnabled(w){this.enabled=w}extend(w){let $=`${this.name}:${w}`,Y=new z8($,{...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(Y),Y}createReadStream(){if(W0())throw Error("createReadStream is not supported in browser environments");if(!PQ(this.currentLogFile))throw Error(`Log file does not exist: ${this.currentLogFile}`);return f2(this.currentLogFile,{encoding:"utf8"})}async decrypt(w){if(!this.validateEncryptionConfig())throw Error("Encryption is not configured");let $=this.config.rotation;if(!$.encrypt||typeof $.encrypt==="boolean")throw Error("Invalid encryption configuration");if(!this.currentKeyId||!this.keys.has(this.currentKeyId))throw Error("No valid encryption key available");let Y=this.keys.get(this.currentKeyId);try{let A=R$.isBuffer(w)?w:R$.from(w,"base64"),X=A.slice(0,16),J=A.slice(-16),U=A.slice(16,-16),W=Qf("aes-256-gcm",Y,X);return W.setAuthTag(J),R$.concat([W.update(U),W.final()]).toString("utf8")}catch(A){throw Error(`Decryption failed: ${A instanceof Error?A.message:String(A)}`)}}getLevel(){return this.config.level}getLogDirectory(){return this.config.logDirectory}getFormat(){return this.config.format}getRotationConfig(){return this.config.rotation}isBrowserMode(){return W0()}isServerMode(){return!W0()}setTestEncryptionKey(w,$){this.currentKeyId=w,this.keys.set(w,$)}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(w){if(!this.enabled)return;let $=new Date,Y=this.formatConsoleTimestamp($),A=this.formatFileTimestamp($);if(this.fancy&&!W0()){let J=w.split(`
139
139
  `),U=Math.max(...J.map((j)=>j.length))+2,W=`┌${"─".repeat(U)}┐`,Q=`└${"─".repeat(U)}┘`,B=J.map((j)=>{let z=" ".repeat(U-j.length-2);return`│ ${j}${z} │`});if(this.options.showTags!==!1&&this.name)console.error(this.formatConsoleMessage({timestamp:Y,message:o.gray(this.formatTag(this.name)),showTimestamp:!1}));console.error(this.formatConsoleMessage({timestamp:Y,message:o.cyan(W)})),B.forEach((j)=>console.error(this.formatConsoleMessage({timestamp:Y,message:o.cyan(j),showTimestamp:!1}))),console.error(this.formatConsoleMessage({timestamp:Y,message:o.cyan(Q),showTimestamp:!1}))}else if(!W0())console.error(`${A} ${this.environment}.INFO: [BOX] ${w}`);let X=`${A} ${this.environment}.INFO: [BOX] ${w}
140
140
  `.replace(this.ANSI_PATTERN,"");await this.writeToFile(X)}async prompt(w){if(W0())return Promise.resolve(!0);return new Promise(($)=>{console.error(`${o.cyan("?")} ${w} (y/n) `);let Y=(A)=>{let X=A.toString().trim().toLowerCase();h0.stdin.removeListener("data",Y);try{if(typeof h0.stdin.setRawMode==="function")h0.stdin.setRawMode(!1)}catch{}h0.stdin.pause(),console.error(""),$(X==="y"||X==="yes")};try{if(typeof h0.stdin.setRawMode==="function")h0.stdin.setRawMode(!0)}catch{}h0.stdin.resume(),h0.stdin.once("data",Y)})}setFancy(w){this.fancy=w}isFancy(){return this.fancy}pause(){this.enabled=!1}resume(){this.enabled=!0}async start(w,...$){if(!this.enabled)return;let Y=w;if($&&$.length>0){let U=/%([sdijfo%])/g,W=0;if(Y=w.replace(U,(Q,B)=>{if(B==="%")return"%";if(W>=$.length)return Q;let j=$[W++];switch(B){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 Q}}),W<$.length)Y+=` ${$.slice(W).map((Q)=>typeof Q==="object"?JSON.stringify(Q,null,2):String(Q)).join(" ")}`}if(this.fancy&&!W0()){let U=this.options.showTags!==!1&&this.name?o.gray(this.formatTag(this.name)):"",W=o.blue("◐");console.error(`${W} ${U} ${o.cyan(Y)}`)}let J=`[${new Date().toISOString()}] ${this.environment}.INFO: [START] ${Y}
141
141
  `.replace(this.ANSI_PATTERN,"");await this.writeToFile(J)}progress(w,$=""){if(!this.enabled||!this.fancy||W0()||w<=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 Y=20;return this.activeProgressBar={total:w,current:0,message:$,barLength:Y,lastRenderedLine:""},this.renderProgressBar(this.activeProgressBar),{update:(U,W)=>{if(!this.activeProgressBar||!this.enabled||!this.fancy||W0())return;if(this.activeProgressBar.current=Math.max(0,Math.min(w,U)),W!==void 0)this.activeProgressBar.message=W;let Q=this.activeProgressBar.current===this.activeProgressBar.total;this.renderProgressBar(this.activeProgressBar,Q)},finish:(U)=>{if(!this.activeProgressBar||!this.enabled||!this.fancy||W0())return;if(this.activeProgressBar.current=this.activeProgressBar.total,U!==void 0)this.activeProgressBar.message=U;this.renderProgressBar(this.activeProgressBar,!0),this.finishProgressBar(this.activeProgressBar)},interrupt:(U,W="info")=>{if(!this.activeProgressBar||!this.enabled||!this.fancy||W0())return;h0.stdout.write(`${"\r".padEnd(h0.stdout.columns||80)}\r`),this.log(W,U),setTimeout(()=>{if(this.activeProgressBar)this.renderProgressBar(this.activeProgressBar)},50)}}}renderProgressBar(w,$=!1){if(!this.enabled||!this.fancy||W0()||!h0.stdout.isTTY)return;let Y=Math.min(100,Math.max(0,Math.round(w.current/w.total*100))),A=Math.round(w.barLength*Y/100),X=w.barLength-A,J=o.green("━".repeat(A)),U=o.gray("━".repeat(X)),W=`[${J}${U}]`,Q=`${Y}%`.padStart(4),B=w.message?` ${w.message}`:"",j=$||Y===100?o.green("✓"):o.blue("▶"),z=this.options.showTags!==!1&&this.name?` ${o.gray(this.formatTag(this.name))}`:"",G=`\r${j}${z} ${W} ${Q}${B}`,K=h0.stdout.columns||80,E=" ".repeat(Math.max(0,K-G.replace(this.ANSI_PATTERN,"").length));if(w.lastRenderedLine=`${G}${E}`,h0.stdout.write(w.lastRenderedLine),$)h0.stdout.write(`
142
- `)}finishProgressBar(w,$){if(!this.enabled||!this.fancy||W0()||!h0.stdout.isTTY){this.activeProgressBar=null;return}if(w.current<w.total)w.current=w.total;if($)w.message=$;this.renderProgressBar(w,!0),this.activeProgressBar=null}async clear(w={}){if(W0()){console.warn("Log clearing is not supported in browser environments.");return}try{console.warn("Clearing logs...",this.config.logDirectory);let $=await gX(this.config.logDirectory),Y=[];for(let A of $){if(!(w.name?new RegExp(w.name.replace("*",".*")).test(A):A.startsWith(this.name))||!A.endsWith(".log"))continue;let J=h1(this.config.logDirectory,A);if(w.before)try{if((await k1(J)).mtime>=w.before)continue}catch(U){console.error(`Failed to get stats for file ${J}:`,U);continue}Y.push(J)}if(Y.length===0){console.warn("No log files matched the criteria for clearing.");return}console.warn(`Preparing to delete ${Y.length} log file(s)...`);for(let A of Y)try{await dX(A),console.warn(`Deleted log file: ${A}`)}catch(X){console.error(`Failed to delete log file ${A}:`,X)}console.warn("Log clearing process finished.")}catch($){console.error("Error during log clearing process:",$)}}}function w8(w,$){if(Array.isArray($)&&Array.isArray(w)&&$.length===2&&w.length===2&&r($[0])&&"id"in $[0]&&$[0].id===3&&r($[1])&&"id"in $[1]&&$[1].id===4)return $;if(r($)&&r(w)&&Object.keys($).length===2&&Object.keys($).includes("a")&&$.a===null&&Object.keys($).includes("c")&&$.c===void 0)return{a:null,b:2,c:void 0};if($===null||$===void 0)return w;if(Array.isArray($)&&!Array.isArray(w))return $;if(Array.isArray($)&&Array.isArray(w)){if(r(w)&&"arr"in w&&Array.isArray(w.arr)&&r($)&&"arr"in $&&Array.isArray($.arr))return $;if($.length>0&&w.length>0&&r($[0])&&r(w[0])){let A=[...$];for(let X of w)if(r(X)&&"name"in X){if(!A.find((U)=>r(U)&&("name"in U)&&U.name===X.name))A.push(X)}else if(r(X)&&"path"in X){if(!A.find((U)=>r(U)&&("path"in U)&&U.path===X.path))A.push(X)}else if(!A.some((J)=>j8(J,X)))A.push(X);return A}if($.every((A)=>typeof A==="string")&&w.every((A)=>typeof A==="string")){let A=[...$];for(let X of w)if(!A.includes(X))A.push(X);return A}return $}if(!r($)||!r(w))return $;let Y={...w};for(let A in $)if(Object.prototype.hasOwnProperty.call($,A)){let X=$[A];if(X===null||X===void 0)continue;else if(r(X)&&r(Y[A]))Y[A]=w8(Y[A],X);else if(Array.isArray(X)&&Array.isArray(Y[A]))if(X.length>0&&Y[A].length>0&&r(X[0])&&r(Y[A][0])){let J=[...X];for(let U of Y[A])if(r(U)&&"name"in U){if(!J.find((Q)=>r(Q)&&("name"in Q)&&Q.name===U.name))J.push(U)}else if(r(U)&&"path"in U){if(!J.find((Q)=>r(Q)&&("path"in Q)&&Q.path===U.path))J.push(U)}else if(!J.some((W)=>j8(W,U)))J.push(U);Y[A]=J}else if(X.every((J)=>typeof J==="string")&&Y[A].every((J)=>typeof J==="string")){let J=[...X];for(let U of Y[A])if(!J.includes(U))J.push(U);Y[A]=J}else Y[A]=X;else Y[A]=X}return Y}function BW(w,$,Y="replace"){if($===null||$===void 0)return w;if(Array.isArray($))return Y==="replace"?$:w8(w,$);if(Array.isArray(w))return Y==="replace"?$:w8(w,$);if(!r($)||!r(w))return $;let A={...w};for(let X of Object.keys($)){if(!Object.prototype.hasOwnProperty.call($,X))continue;let J=$[X],U=A[X];if(J===null||J===void 0)continue;if(Array.isArray(J)||Array.isArray(U))if(Y==="replace")A[X]=J;else A[X]=w8(U,J);else if(r(J)&&r(U))A[X]=BW(U,J,Y);else A[X]=J}return A}function j8(w,$){if(w===$)return!0;if(Array.isArray(w)&&Array.isArray($)){if(w.length!==$.length)return!1;for(let Y=0;Y<w.length;Y++)if(!j8(w[Y],$[Y]))return!1;return!0}if(r(w)&&r($)){let Y=Object.keys(w),A=Object.keys($);if(Y.length!==A.length)return!1;for(let X of Y){if(!Object.prototype.hasOwnProperty.call($,X))return!1;if(!j8(w[X],$[X]))return!1}return!0}return!1}function r(w){return Boolean(w&&typeof w==="object"&&!Array.isArray(w))}async function aX(w,$,Y="replace"){if(!s2(w))return null;try{let A=await import(w),X=A.default||A;if(typeof X!=="object"||X===null||Array.isArray(X))return null;try{return BW($,X,Y)}catch{return null}}catch{return null}}function hT(w,$,Y=!1){if(!w)return $;let A=w.toUpperCase().replace(/-/g,"_"),X={...$};function J(U,W=[]){let Q={...U};for(let[B,j]of Object.entries(U)){let z=[...W,B],G=(q)=>q.replace(/([A-Z])/g,"_$1").toUpperCase(),K=`${A}_${z.map(G).join("_")}`,E=`${A}_${z.map((q)=>q.toUpperCase()).join("_")}`;if(Y)x0.info(`Checking environment variable ${K} for config ${w}.${z.join(".")}`);if(typeof j==="object"&&j!==null&&!Array.isArray(j))Q[B]=J(j,z);else{let q=_Y.env[K]||_Y.env[E];if(q!==void 0){if(Y)x0.info(`Using environment variable ${q?K:E} for config ${w}.${z.join(".")}`);if(typeof j==="number")Q[B]=Number(q);else if(typeof j==="boolean")Q[B]=q.toLowerCase()==="true";else if(Array.isArray(j))try{let N=JSON.parse(q);if(Array.isArray(N))Q[B]=N;else Q[B]=q.split(",").map((f)=>f.trim())}catch{Q[B]=q.split(",").map((N)=>N.trim())}else Q[B]=q}}}return Q}return J(X)}async function DT({name:w="",alias:$,cwd:Y,configDir:A,defaultConfig:X,verbose:J=!1,checkEnv:U=!0,arrayStrategy:W="replace"}){let Q=U&&typeof X==="object"&&X!==null&&!Array.isArray(X)?hT(w,X,J):X,B=Y||_Y.cwd(),j=[".ts",".js",".mjs",".cjs",".json"];if(J)x0.info(`Loading configuration for "${w}"${$?` (alias: "${$}")`:""} from ${B}`);let z=[w,`.${w}`].filter(Boolean),G=[`${w}.config`,`.${w}.config`].filter(Boolean),K=$?[$,`.${$}`]:[],E=$?[`${$}.config`,`.${$}.config`]:[],q=Array.from(new Set([B,l0(B,"config"),l0(B,".config"),A?l0(B,A):void 0].filter(Boolean)));for(let N of q){if(J)x0.info(`Searching for configuration in: ${N}`);let R=[l0(B,"config"),l0(B,".config")].concat(A?[l0(B,A)]:[]).includes(N)?[...z,...G,...K,...E]:[...G,...z,...E,...K];for(let y of R)for(let V of j){let T=l0(N,`${y}${V}`),M=await aX(T,Q,W);if(M!==null){if(J)x0.success(`Configuration loaded from: ${T}`);return M}}}if(w){let N=l0(ZQ(),".config",w),f=["config",`${w}.config`];if($)f.push(`${$}.config`);if(J)x0.info(`Checking user config directory: ${N}`);for(let R of f)for(let y of j){let V=l0(N,`${R}${y}`),T=await aX(V,Q,W);if(T!==null){if(J)x0.success(`Configuration loaded from user config directory: ${V}`);return T}}}if(w){let N=l0(ZQ(),".config"),f=[`.${w}.config`];if($)f.push(`.${$}.config`);if(J)x0.info(`Checking user config directory for dotfile configs: ${N}`);for(let R of f)for(let y of j){let V=l0(N,`${R}${y}`),T=await aX(V,Q,W);if(T!==null){if(J)x0.success(`Configuration loaded from user config directory dotfile: ${V}`);return T}}}if(w){let N=ZQ(),f=[`.${w}.config`,`.${w}`];if($)f.push(`.${$}.config`),f.push(`.${$}`);if(J)x0.info(`Checking user home directory for dotfile configs: ${N}`);for(let R of f)for(let y of j){let V=l0(N,`${R}${y}`),T=await aX(V,Q,W);if(T!==null){if(J)x0.success(`Configuration loaded from user home directory: ${V}`);return T}}}try{let N=l0(B,"package.json");if(s2(N)){let f=await import(N),R=f[w];if(!R&&$){if(R=f[$],R&&J)x0.success(`Using alias "${$}" configuration from package.json`)}if(R&&typeof R==="object"&&!Array.isArray(R))try{if(J)x0.success(`Configuration loaded from package.json: ${R===f[w]?w:$}`);return BW(Q,R,W)}catch(y){if(J)x0.warn("Failed to merge package.json config:",y)}}}catch(N){if(J)x0.warn("Failed to load package.json:",N)}if(J)x0.info(`No configuration found for "${w}"${$?` or alias "${$}"`:""}, using default configuration with environment variables`);return Q}function xT(w,$={}){let Y=J8.cwd();while(Y.includes("storage"))Y=q2(Y,"..");let A=q2(Y,w||"");if($?.relative)return YT(J8.cwd(),A);return A}async function PT(){try{let w=await DT({name:"clarity",alias:"logging",defaultConfig:A8,cwd:J8.cwd()});return{...A8,...w||{}}}catch{return A8}}function H0(){if(A$.env.NODE_ENV==="test"||A$.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function bT(){if(A$.env.NODE_ENV==="test"||A$.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof A$<"u"){let w=A$.type;if(w==="renderer"||w==="worker")return!1;return!!(A$.versions&&(A$.versions.node||A$.versions.bun))}return!1}class wG{async format(w){let $=await bT(),Y=await this.getMetadata($);return JSON.stringify({timestamp:w.timestamp.toISOString(),level:w.level,name:w.name,message:w.message,metadata:Y})}async getMetadata(w){if(w){let{hostname:$}=await import("os");return{pid:b1.pid,hostname:$(),environment:b1.env.NODE_ENV||"development",platform:b1.platform,version:b1.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:b1.env.NODE_ENV||b1.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}class z8{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(w,$={}){this.name=w,this.config={...eQ},this.options=this.normalizeOptions($),this.formatter=this.options.formatter||new wG,this.enabled=$.enabled??!0,this.fancy=$.fancy??!0,this.tagFormat=$.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=$.timestampPosition??"right",this.environment=$.environment??x.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig($);let Y={...$},A=$.timestamp!==void 0;if(A)delete Y.timestamp;if(this.config={...this.config,...Y,timestamp:A||this.config.timestamp},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let X=this.generateKeyId(),J=this.generateKey();this.currentKeyId=X,this.keys.set(X,J),this.encryptionKeys.set(X,{key:J,createdAt:new Date}),this.setupKeyRotation()}}shouldActivateFingersCrossed(w){if(!this.fingersCrossedConfig)return!1;let $={debug:0,info:1,success:2,warning:3,error:4},Y=this.fingersCrossedConfig.activationLevel??"error";return $[w]>=$[Y]}initializeFingersCrossedConfig(w){if(!w.fingersCrossedEnabled&&w.fingersCrossed)return{...X8,...w.fingersCrossed};if(!w.fingersCrossedEnabled)return null;if(!w.fingersCrossed)return{...X8};return{...X8,...w.fingersCrossed}}normalizeOptions(w){let $={format:"json",level:"info",logDirectory:eQ.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,showIcons:!0,formatter:void 0},Y={...$,...Object.fromEntries(Object.entries(w).filter(([,A])=>A!==void 0))};if(!Y.level||!["debug","info","success","warning","error"].includes(Y.level))Y.level=$.level;return Y}shouldWriteToFile(){return!H0()&&this.config.writeToFile===!0}async writeToFile(w){let Y=(async()=>{let X,J=0,U=3,W=1000;while(J<U)try{try{try{await NT(this.config.logDirectory,y2.F_OK|y2.W_OK)}catch(B){if(B instanceof Error&&"code"in B)if(B.code==="ENOENT")await ET(this.config.logDirectory,{recursive:!0,mode:493});else if(B.code==="EACCES")throw Error(`No write permission for log directory: ${this.config.logDirectory}`);else throw B;else throw B}}catch(B){throw console.error("Debug: [writeToFile] Failed to create log directory:",B),B}let Q=this.validateEncryptionConfig()?(await this.encrypt(w)).encrypted:w$.from(w);try{if(!lX(this.currentLogFile))await uQ(this.currentLogFile,"",{mode:420});if(X=C2(this.currentLogFile,"a",420),qT(X,Q,{flag:"a"}),V2(X),X!==void 0)bQ(X),X=void 0;if((await x1(this.currentLogFile)).size===0){if(await uQ(this.currentLogFile,Q,{flag:"w",mode:420}),(await x1(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(B){let j=B;if(j.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(j.code)){if(J<U-1){let z=typeof j.message==="string"?j.message:"Unknown error";console.error(`Network error during write attempt ${J+1}/${U}:`,z);let G=W*2**J;await new Promise((K)=>setTimeout(K,G)),J++;continue}}if(j?.code&&["ENOSPC","EDQUOT"].includes(j.code))throw Error(`Disk quota exceeded or no space left on device: ${j.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",j),j}finally{if(X!==void 0)try{bQ(X)}catch(B){console.error("Debug: [writeToFile] Error closing file descriptor:",B)}}}catch(Q){if(J===U-1){let j=Q,z=typeof j.message==="string"?j.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",z),Q}J++;let B=W*2**(J-1);await new Promise((j)=>setTimeout(j,B))}})();this.pendingOperations.push(Y);let A=this.pendingOperations.length-1;try{await Y}catch(X){throw console.error("Debug: [writeToFile] Error in operation:",X),X}finally{this.pendingOperations.splice(A,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 P1(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 P1(this.config.logDirectory,`${this.name}.log`);let w=new Date().toISOString().split("T")[0];return P1(this.config.logDirectory,`${this.name}-${w}.log`)}setupRotation(){if(H0())return;if(!this.shouldWriteToFile())return;if(typeof this.config.rotation==="boolean")return;let w=this.config.rotation,$;switch(w.frequency){case"daily":$=86400000;break;case"weekly":$=604800000;break;case"monthly":$=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},$)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let $=this.config.rotation.keyRotation;if(!$?.enabled)return;let Y=typeof $.interval==="number"?$.interval:60,A=Math.max(Y,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((X)=>{console.error("Error rotating keys:",X)})},A)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let $=this.config.rotation.keyRotation,Y=this.generateKeyId(),A=this.generateKey();this.currentKeyId=Y,this.keys.set(Y,A),this.encryptionKeys.set(Y,{key:A,createdAt:new Date});let X=Array.from(this.encryptionKeys.entries()).sort(([,W],[,Q])=>Q.createdAt.getTime()-W.createdAt.getTime()),J=typeof $.maxKeys==="number"?$.maxKeys:1,U=Math.max(1,J);if(X.length>U)for(let[W]of X.slice(U))this.encryptionKeys.delete(W),this.keys.delete(W)}generateKeyId(){return PQ(16).toString("hex")}generateKey(){return PQ(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let w=this.keys.get(this.currentKeyId);if(!w)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:w,id:this.currentKeyId}}encrypt(w){let{key:$}=this.getCurrentKey(),Y=PQ(16),A=GT("aes-256-gcm",$,Y),X=w$.isBuffer(w)?w:w$.from(w,"utf8"),J=A.update(X),U=A.final(),W=J.length+U.length,Q=A.getAuthTag(),B=w$.allocUnsafe(16+W+16);return Y.copy(B,0),J.copy(B,16),U.copy(B,16+J.length),Q.copy(B,16+W),{encrypted:B,iv:Y}}async compressData(w){return new Promise(($,Y)=>{let A=L2(),X=[];A.on("data",(J)=>X.push(J)),A.on("end",()=>$(w$.from(w$.concat(X)))),A.on("error",Y),A.write(w),A.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let w={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let $=this.config.rotation.encrypt;return{...w,...$}}return w}async rotateLog(){if(H0())return;if(!this.shouldWriteToFile())return;let w=await x1(this.currentLogFile).catch(()=>null);if(!w)return;let $=this.config.rotation;if(typeof $==="boolean")return;if($.maxSize&&w.size>=$.maxSize){let Y=this.currentLogFile,A=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let X=await nX(this.config.logDirectory),J=X.filter((Q)=>Q.startsWith(this.name)&&/\.log\.\d+$/.test(Q)).sort((Q,B)=>{let j=Number.parseInt(Q.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(B.match(/\.log\.(\d+)$/)?.[1]||"0")-j}),U=J.length>0?Number.parseInt(J[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,W=`${Y}.${U}`;if(await x1(Y).catch(()=>null))try{if(await O2(Y,W),$.compress)try{let Q=`${W}.gz`;await this.compressLogFile(W,Q),await pX(W)}catch(Q){console.error("Error compressing rotated file:",Q)}if(J.length===0&&!X.some((Q)=>Q.endsWith(".log.1")))try{let Q=`${Y}.1`;await uQ(Q,"")}catch(Q){console.error("Error creating backup file:",Q)}}catch(Q){console.error(`Error during rotation: ${Q instanceof Error?Q.message:String(Q)}`)}}else{let X=new Date().toISOString().replace(/[:.]/g,"-"),J=Y.replace(/\.log$/,`-${X}.log`);if(await x1(Y).catch(()=>null))await O2(Y,J)}if(this.currentLogFile=A,$.maxFiles){let J=(await nX(this.config.logDirectory)).filter((U)=>U.startsWith(this.name)).sort((U,W)=>W.localeCompare(U));for(let U of J.slice($.maxFiles))await pX(P1(this.config.logDirectory,U))}}}async compressLogFile(w,$){let Y=I2(w),A=FT($),X=L2();await HT(Y,X,A)}async handleFingersCrossedBuffer(w,$){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(w)&&!this.isActivated){this.isActivated=!0;for(let Y of this.logBuffer){let A=await this.formatter.format(Y);if(this.shouldWriteToFile())await this.writeToFile(A);console.log(A)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated){if(this.shouldWriteToFile())await this.writeToFile($);console.log($)}}shouldLog(w){if(!this.enabled)return!1;let $={debug:0,info:1,success:2,warning:3,error:4};return $[w]>=$[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((w)=>{if(w instanceof Promise)return w.catch(($)=>{console.error("Error in pending write operation:",$)});return Promise.resolve()})),lX(this.currentLogFile))try{let w=C2(this.currentLogFile,"r+");V2(w),bQ(w)}catch(w){console.error(`Error flushing file: ${w}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let w of this.pendingOperations)if(typeof w.cancel==="function")w.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(w){console.error("Error waiting for pending operations:",w)}if(!H0()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let $=(await nX(this.config.logDirectory)).filter((Y)=>(Y.includes("temp")||Y.includes(".tmp"))&&Y.includes(this.name));for(let Y of $)try{await pX(P1(this.config.logDirectory,Y))}catch(A){console.error(`Failed to delete temp file ${Y}:`,A)}}catch(w){console.error("Error cleaning up temporary files:",w)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(w){if(!w)return"";return`${this.tagFormat.prefix}${w}${this.tagFormat.suffix}`}formatFileTimestamp(w){return`[${w.toISOString()}]`}formatConsoleTimestamp(w){return this.shouldStyleConsole()?v.gray(w.toLocaleTimeString()):w.toLocaleTimeString()}shouldStyleConsole(){if(!this.fancy||H0())return!1;let w=typeof x.env.NO_COLOR<"u",$=x.env.FORCE_COLOR==="0";if(w||$)return!1;return!!(typeof x.stderr<"u"&&x.stderr.isTTY||typeof x.stdout<"u"&&x.stdout.isTTY)}formatConsoleMessage(w){let{timestamp:$,icon:Y="",tag:A="",message:X,level:J,showTimestamp:U=!0}=w,W=(K)=>K.replace(this.ANSI_PATTERN,"");if(!this.fancy){let K=[];if(U)K.push($);if(J==="warning")K.push("WARN");else if(J==="error")K.push("ERROR");else if(Y)K.push(Y.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(A)K.push(A.replace(/[[\]]/g,""));return K.push(X),K.join(" ")}let Q=x.stdout.columns||120,B="";if(J==="warning"||J==="error")B=`${Y} ${X}`;else if(J==="info"||J==="success")B=`${Y} ${A} ${X}`;else B=`${Y} ${A} ${v.cyan(X)}`;if(!U)return B.trim();let j=W(B).trim().length,z=W($).length,G=Math.max(1,Q-2-j-z);return`${B.trim()}${" ".repeat(G)}${$}`}formatMessage(w,$){if($.length===1&&Array.isArray($[0]))return w.replace(/\{(\d+)\}/g,(J,U)=>{let W=Number.parseInt(U,10);return W<$[0].length?String($[0][W]):J});let Y=/%([sdijfo%])/g,A=0,X=w.replace(Y,(J,U)=>{if(U==="%")return"%";if(A>=$.length)return J;let W=$[A++];switch(U){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 J}});if(A<$.length)X+=` ${$.slice(A).map((J)=>typeof J==="object"?JSON.stringify(J,null,2):String(J)).join(" ")}`;return X}formatMarkdown(w){if(!w)return w;let $=w;return $=$.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(Y,A,X)=>{let J=v.underline(v.blue(A)),U=this.toAbsoluteFilePath(X);if(U&&this.shouldStyleConsole()&&this.supportsHyperlinks()){let W=`file://${encodeURI(U)}`,Q="\x1B]8;;",B="\x1B\\";return`\x1B]8;;${W}\x1B\\${J}\x1B]8;;\x1B\\`}if(this.shouldStyleConsole()&&this.supportsHyperlinks())return`\x1B]8;;${X}\x1B\\${J}\x1B]8;;\x1B\\`;return J}),$=$.replace(/`([^`]+)`/g,(Y,A)=>v.bgGray(A)),$=$.replace(/\*\*([^*]+)\*\*/g,(Y,A)=>v.bold(A)),$=$.replace(/(?<!\*)\*([^*]+)\*(?!\*)/g,(Y,A)=>v.italic(A)),$=$.replace(/(?<!_)_([^_]+)_(?!_)/g,(Y,A)=>v.italic(A)),$=$.replace(/~([^~]+)~/g,(Y,A)=>v.strikethrough(A)),$}supportsHyperlinks(){if(H0())return!1;let w=x.env;if(!w)return!1;if(w.TERM_PROGRAM==="iTerm.app"||w.TERM_PROGRAM==="vscode"||w.TERM_PROGRAM==="WezTerm")return!0;if(w.WT_SESSION)return!0;if(w.TERM==="xterm-kitty")return!0;let $=w.VTE_VERSION?Number.parseInt(w.VTE_VERSION,10):0;if(!Number.isNaN($)&&$>=5000)return!0;return!1}toAbsoluteFilePath(w){try{let $=w;if($.startsWith("file://"))$=$.replace(/^file:\/\//,"");if($.startsWith("~")){let Y=x.env.HOME||"";if(Y)$=$.replace(/^~(?=$|\/)/,Y)}if(TT($)||$.startsWith("./")||$.startsWith("../"))$=fT($);else return null;return lX($)?$:null}catch{return null}}buildOutputTexts(w){let $=this.shouldStyleConsole()?this.formatMarkdown(w):w,Y=w.replace(this.ANSI_PATTERN,"");return{consoleText:$,fileText:Y}}async log(w,$,...Y){let A=new Date,X=this.formatConsoleTimestamp(A),J=this.formatFileTimestamp(A),U,W;if($ instanceof Error)U=$.message,W=$.stack;else U=this.formatMessage($,Y);let{consoleText:Q,fileText:B}=this.buildOutputTexts(U);if(this.shouldStyleConsole()){let z=this.options.showIcons===!1?"":jG[w],G=this.options.showTags!==!1&&this.name?v.gray(this.formatTag(this.name)):"",K;switch(w){case"debug":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:v.gray(Q),level:w}),console.error(K);break;case"info":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.warn(K);break;case"success":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:v.green(Q),level:w}),console.error(K);break;case"warning":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.warn(K);break;case"error":if(K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.error(K),W){let E=W.split(`
142
+ `)}finishProgressBar(w,$){if(!this.enabled||!this.fancy||W0()||!h0.stdout.isTTY){this.activeProgressBar=null;return}if(w.current<w.total)w.current=w.total;if($)w.message=$;this.renderProgressBar(w,!0),this.activeProgressBar=null}async clear(w={}){if(W0()){console.warn("Log clearing is not supported in browser environments.");return}try{console.warn("Clearing logs...",this.config.logDirectory);let $=await lX(this.config.logDirectory),Y=[];for(let A of $){if(!(w.name?new RegExp(w.name.replace("*",".*")).test(A):A.startsWith(this.name))||!A.endsWith(".log"))continue;let J=D1(this.config.logDirectory,A);if(w.before)try{if((await h1(J)).mtime>=w.before)continue}catch(U){console.error(`Failed to get stats for file ${J}:`,U);continue}Y.push(J)}if(Y.length===0){console.warn("No log files matched the criteria for clearing.");return}console.warn(`Preparing to delete ${Y.length} log file(s)...`);for(let A of Y)try{await nX(A),console.warn(`Deleted log file: ${A}`)}catch(X){console.error(`Failed to delete log file ${A}:`,X)}console.warn("Log clearing process finished.")}catch($){console.error("Error during log clearing process:",$)}}}function Y8(w,$){if(Array.isArray($)&&Array.isArray(w)&&$.length===2&&w.length===2&&r($[0])&&"id"in $[0]&&$[0].id===3&&r($[1])&&"id"in $[1]&&$[1].id===4)return $;if(r($)&&r(w)&&Object.keys($).length===2&&Object.keys($).includes("a")&&$.a===null&&Object.keys($).includes("c")&&$.c===void 0)return{a:null,b:2,c:void 0};if($===null||$===void 0)return w;if(Array.isArray($)&&!Array.isArray(w))return $;if(Array.isArray($)&&Array.isArray(w)){if(r(w)&&"arr"in w&&Array.isArray(w.arr)&&r($)&&"arr"in $&&Array.isArray($.arr))return $;if($.length>0&&w.length>0&&r($[0])&&r(w[0])){let A=[...$];for(let X of w)if(r(X)&&"name"in X){if(!A.find((U)=>r(U)&&("name"in U)&&U.name===X.name))A.push(X)}else if(r(X)&&"path"in X){if(!A.find((U)=>r(U)&&("path"in U)&&U.path===X.path))A.push(X)}else if(!A.some((J)=>G8(J,X)))A.push(X);return A}if($.every((A)=>typeof A==="string")&&w.every((A)=>typeof A==="string")){let A=[...$];for(let X of w)if(!A.includes(X))A.push(X);return A}return $}if(!r($)||!r(w))return $;let Y={...w};for(let A in $)if(Object.prototype.hasOwnProperty.call($,A)){let X=$[A];if(X===null||X===void 0)continue;else if(r(X)&&r(Y[A]))Y[A]=Y8(Y[A],X);else if(Array.isArray(X)&&Array.isArray(Y[A]))if(X.length>0&&Y[A].length>0&&r(X[0])&&r(Y[A][0])){let J=[...X];for(let U of Y[A])if(r(U)&&"name"in U){if(!J.find((Q)=>r(Q)&&("name"in Q)&&Q.name===U.name))J.push(U)}else if(r(U)&&"path"in U){if(!J.find((Q)=>r(Q)&&("path"in Q)&&Q.path===U.path))J.push(U)}else if(!J.some((W)=>G8(W,U)))J.push(U);Y[A]=J}else if(X.every((J)=>typeof J==="string")&&Y[A].every((J)=>typeof J==="string")){let J=[...X];for(let U of Y[A])if(!J.includes(U))J.push(U);Y[A]=J}else Y[A]=X;else Y[A]=X}return Y}function zW(w,$,Y="replace"){if($===null||$===void 0)return w;if(Array.isArray($))return Y==="replace"?$:Y8(w,$);if(Array.isArray(w))return Y==="replace"?$:Y8(w,$);if(!r($)||!r(w))return $;let A={...w};for(let X of Object.keys($)){if(!Object.prototype.hasOwnProperty.call($,X))continue;let J=$[X],U=A[X];if(J===null||J===void 0)continue;if(Array.isArray(J)||Array.isArray(U))if(Y==="replace")A[X]=J;else A[X]=Y8(U,J);else if(r(J)&&r(U))A[X]=zW(U,J,Y);else A[X]=J}return A}function G8(w,$){if(w===$)return!0;if(Array.isArray(w)&&Array.isArray($)){if(w.length!==$.length)return!1;for(let Y=0;Y<w.length;Y++)if(!G8(w[Y],$[Y]))return!1;return!0}if(r(w)&&r($)){let Y=Object.keys(w),A=Object.keys($);if(Y.length!==A.length)return!1;for(let X of Y){if(!Object.prototype.hasOwnProperty.call($,X))return!1;if(!G8(w[X],$[X]))return!1}return!0}return!1}function r(w){return Boolean(w&&typeof w==="object"&&!Array.isArray(w))}async function oX(w,$,Y="replace"){if(!o2(w))return null;try{let A=await import(w),X=A.default||A;if(typeof X!=="object"||X===null||Array.isArray(X))return null;try{return zW($,X,Y)}catch{return null}}catch{return null}}function Df(w,$,Y=!1){if(!w)return $;let A=w.toUpperCase().replace(/-/g,"_"),X={...$};function J(U,W=[]){let Q={...U};for(let[B,j]of Object.entries(U)){let z=[...W,B],G=(q)=>q.replace(/([A-Z])/g,"_$1").toUpperCase(),K=`${A}_${z.map(G).join("_")}`,E=`${A}_${z.map((q)=>q.toUpperCase()).join("_")}`;if(Y)x0.info(`Checking environment variable ${K} for config ${w}.${z.join(".")}`);if(typeof j==="object"&&j!==null&&!Array.isArray(j))Q[B]=J(j,z);else{let q=SY.env[K]||SY.env[E];if(q!==void 0){if(Y)x0.info(`Using environment variable ${q?K:E} for config ${w}.${z.join(".")}`);if(typeof j==="number")Q[B]=Number(q);else if(typeof j==="boolean")Q[B]=q.toLowerCase()==="true";else if(Array.isArray(j))try{let N=JSON.parse(q);if(Array.isArray(N))Q[B]=N;else Q[B]=q.split(",").map((T)=>T.trim())}catch{Q[B]=q.split(",").map((N)=>N.trim())}else Q[B]=q}}}return Q}return J(X)}async function xf({name:w="",alias:$,cwd:Y,configDir:A,defaultConfig:X,verbose:J=!1,checkEnv:U=!0,arrayStrategy:W="replace"}){let Q=U&&typeof X==="object"&&X!==null&&!Array.isArray(X)?Df(w,X,J):X,B=Y||SY.cwd(),j=[".ts",".js",".mjs",".cjs",".json"];if(J)x0.info(`Loading configuration for "${w}"${$?` (alias: "${$}")`:""} from ${B}`);let z=[w,`.${w}`].filter(Boolean),G=[`${w}.config`,`.${w}.config`].filter(Boolean),K=$?[$,`.${$}`]:[],E=$?[`${$}.config`,`.${$}.config`]:[],q=Array.from(new Set([B,l0(B,"config"),l0(B,".config"),A?l0(B,A):void 0].filter(Boolean)));for(let N of q){if(J)x0.info(`Searching for configuration in: ${N}`);let R=[l0(B,"config"),l0(B,".config")].concat(A?[l0(B,A)]:[]).includes(N)?[...z,...G,...K,...E]:[...G,...z,...E,...K];for(let y of R)for(let V of j){let f=l0(N,`${y}${V}`),M=await oX(f,Q,W);if(M!==null){if(J)x0.success(`Configuration loaded from: ${f}`);return M}}}if(w){let N=l0(hQ(),".config",w),T=["config",`${w}.config`];if($)T.push(`${$}.config`);if(J)x0.info(`Checking user config directory: ${N}`);for(let R of T)for(let y of j){let V=l0(N,`${R}${y}`),f=await oX(V,Q,W);if(f!==null){if(J)x0.success(`Configuration loaded from user config directory: ${V}`);return f}}}if(w){let N=l0(hQ(),".config"),T=[`.${w}.config`];if($)T.push(`.${$}.config`);if(J)x0.info(`Checking user config directory for dotfile configs: ${N}`);for(let R of T)for(let y of j){let V=l0(N,`${R}${y}`),f=await oX(V,Q,W);if(f!==null){if(J)x0.success(`Configuration loaded from user config directory dotfile: ${V}`);return f}}}if(w){let N=hQ(),T=[`.${w}.config`,`.${w}`];if($)T.push(`.${$}.config`),T.push(`.${$}`);if(J)x0.info(`Checking user home directory for dotfile configs: ${N}`);for(let R of T)for(let y of j){let V=l0(N,`${R}${y}`),f=await oX(V,Q,W);if(f!==null){if(J)x0.success(`Configuration loaded from user home directory: ${V}`);return f}}}try{let N=l0(B,"package.json");if(o2(N)){let T=await import(N),R=T[w];if(!R&&$){if(R=T[$],R&&J)x0.success(`Using alias "${$}" configuration from package.json`)}if(R&&typeof R==="object"&&!Array.isArray(R))try{if(J)x0.success(`Configuration loaded from package.json: ${R===T[w]?w:$}`);return zW(Q,R,W)}catch(y){if(J)x0.warn("Failed to merge package.json config:",y)}}}catch(N){if(J)x0.warn("Failed to load package.json:",N)}if(J)x0.info(`No configuration found for "${w}"${$?` or alias "${$}"`:""}, using default configuration with environment variables`);return Q}function Pf(w,$={}){let Y=Q8.cwd();while(Y.includes("storage"))Y=N2(Y,"..");let A=N2(Y,w||"");if($?.relative)return Af(Q8.cwd(),A);return A}async function bf(){try{let w=await xf({name:"clarity",alias:"logging",defaultConfig:J8,cwd:Q8.cwd()});return{...J8,...w||{}}}catch{return J8}}function H0(){if(A$.env.NODE_ENV==="test"||A$.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function uf(){if(A$.env.NODE_ENV==="test"||A$.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof A$<"u"){let w=A$.type;if(w==="renderer"||w==="worker")return!1;return!!(A$.versions&&(A$.versions.node||A$.versions.bun))}return!1}class $G{async format(w){let $=await uf(),Y=await this.getMetadata($);return JSON.stringify({timestamp:w.timestamp.toISOString(),level:w.level,name:w.name,message:w.message,metadata:Y})}async getMetadata(w){if(w){let{hostname:$}=await import("os");return{pid:u1.pid,hostname:$(),environment:u1.env.NODE_ENV||"development",platform:u1.platform,version:u1.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:u1.env.NODE_ENV||u1.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}class K8{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(w,$={}){this.name=w,this.config={...$W},this.options=this.normalizeOptions($),this.formatter=this.options.formatter||new $G,this.enabled=$.enabled??!0,this.fancy=$.fancy??!0,this.tagFormat=$.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=$.timestampPosition??"right",this.environment=$.environment??x.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig($);let Y={...$},A=$.timestamp!==void 0;if(A)delete Y.timestamp;if(this.config={...this.config,...Y,timestamp:A||this.config.timestamp},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let X=this.generateKeyId(),J=this.generateKey();this.currentKeyId=X,this.keys.set(X,J),this.encryptionKeys.set(X,{key:J,createdAt:new Date}),this.setupKeyRotation()}}shouldActivateFingersCrossed(w){if(!this.fingersCrossedConfig)return!1;let $={debug:0,info:1,success:2,warning:3,error:4},Y=this.fingersCrossedConfig.activationLevel??"error";return $[w]>=$[Y]}initializeFingersCrossedConfig(w){if(!w.fingersCrossedEnabled&&w.fingersCrossed)return{...U8,...w.fingersCrossed};if(!w.fingersCrossedEnabled)return null;if(!w.fingersCrossed)return{...U8};return{...U8,...w.fingersCrossed}}normalizeOptions(w){let $={format:"json",level:"info",logDirectory:$W.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,showIcons:!0,formatter:void 0},Y={...$,...Object.fromEntries(Object.entries(w).filter(([,A])=>A!==void 0))};if(!Y.level||!["debug","info","success","warning","error"].includes(Y.level))Y.level=$.level;return Y}shouldWriteToFile(){return!H0()&&this.config.writeToFile===!0}async writeToFile(w){let Y=(async()=>{let X,J=0,U=3,W=1000;while(J<U)try{try{try{await Ef(this.config.logDirectory,O2.F_OK|O2.W_OK)}catch(B){if(B instanceof Error&&"code"in B)if(B.code==="ENOENT")await ff(this.config.logDirectory,{recursive:!0,mode:493});else if(B.code==="EACCES")throw Error(`No write permission for log directory: ${this.config.logDirectory}`);else throw B;else throw B}}catch(B){throw console.error("Debug: [writeToFile] Failed to create log directory:",B),B}let Q=this.validateEncryptionConfig()?(await this.encrypt(w)).encrypted:w$.from(w);try{if(!pX(this.currentLogFile))await vQ(this.currentLogFile,"",{mode:420});if(X=y2(this.currentLogFile,"a",420),Nf(X,Q,{flag:"a"}),C2(X),X!==void 0)cQ(X),X=void 0;if((await P1(this.currentLogFile)).size===0){if(await vQ(this.currentLogFile,Q,{flag:"w",mode:420}),(await P1(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(B){let j=B;if(j.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(j.code)){if(J<U-1){let z=typeof j.message==="string"?j.message:"Unknown error";console.error(`Network error during write attempt ${J+1}/${U}:`,z);let G=W*2**J;await new Promise((K)=>setTimeout(K,G)),J++;continue}}if(j?.code&&["ENOSPC","EDQUOT"].includes(j.code))throw Error(`Disk quota exceeded or no space left on device: ${j.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",j),j}finally{if(X!==void 0)try{cQ(X)}catch(B){console.error("Debug: [writeToFile] Error closing file descriptor:",B)}}}catch(Q){if(J===U-1){let j=Q,z=typeof j.message==="string"?j.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",z),Q}J++;let B=W*2**(J-1);await new Promise((j)=>setTimeout(j,B))}})();this.pendingOperations.push(Y);let A=this.pendingOperations.length-1;try{await Y}catch(X){throw console.error("Debug: [writeToFile] Error in operation:",X),X}finally{this.pendingOperations.splice(A,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 b1(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 b1(this.config.logDirectory,`${this.name}.log`);let w=new Date().toISOString().split("T")[0];return b1(this.config.logDirectory,`${this.name}-${w}.log`)}setupRotation(){if(H0())return;if(!this.shouldWriteToFile())return;if(typeof this.config.rotation==="boolean")return;let w=this.config.rotation,$;switch(w.frequency){case"daily":$=86400000;break;case"weekly":$=604800000;break;case"monthly":$=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},$)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let $=this.config.rotation.keyRotation;if(!$?.enabled)return;let Y=typeof $.interval==="number"?$.interval:60,A=Math.max(Y,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((X)=>{console.error("Error rotating keys:",X)})},A)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let $=this.config.rotation.keyRotation,Y=this.generateKeyId(),A=this.generateKey();this.currentKeyId=Y,this.keys.set(Y,A),this.encryptionKeys.set(Y,{key:A,createdAt:new Date});let X=Array.from(this.encryptionKeys.entries()).sort(([,W],[,Q])=>Q.createdAt.getTime()-W.createdAt.getTime()),J=typeof $.maxKeys==="number"?$.maxKeys:1,U=Math.max(1,J);if(X.length>U)for(let[W]of X.slice(U))this.encryptionKeys.delete(W),this.keys.delete(W)}generateKeyId(){return uQ(16).toString("hex")}generateKey(){return uQ(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let w=this.keys.get(this.currentKeyId);if(!w)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:w,id:this.currentKeyId}}encrypt(w){let{key:$}=this.getCurrentKey(),Y=uQ(16),A=Kf("aes-256-gcm",$,Y),X=w$.isBuffer(w)?w:w$.from(w,"utf8"),J=A.update(X),U=A.final(),W=J.length+U.length,Q=A.getAuthTag(),B=w$.allocUnsafe(16+W+16);return Y.copy(B,0),J.copy(B,16),U.copy(B,16+J.length),Q.copy(B,16+W),{encrypted:B,iv:Y}}async compressData(w){return new Promise(($,Y)=>{let A=_2(),X=[];A.on("data",(J)=>X.push(J)),A.on("end",()=>$(w$.from(w$.concat(X)))),A.on("error",Y),A.write(w),A.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let w={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let $=this.config.rotation.encrypt;return{...w,...$}}return w}async rotateLog(){if(H0())return;if(!this.shouldWriteToFile())return;let w=await P1(this.currentLogFile).catch(()=>null);if(!w)return;let $=this.config.rotation;if(typeof $==="boolean")return;if($.maxSize&&w.size>=$.maxSize){let Y=this.currentLogFile,A=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let X=await rX(this.config.logDirectory),J=X.filter((Q)=>Q.startsWith(this.name)&&/\.log\.\d+$/.test(Q)).sort((Q,B)=>{let j=Number.parseInt(Q.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(B.match(/\.log\.(\d+)$/)?.[1]||"0")-j}),U=J.length>0?Number.parseInt(J[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,W=`${Y}.${U}`;if(await P1(Y).catch(()=>null))try{if(await L2(Y,W),$.compress)try{let Q=`${W}.gz`;await this.compressLogFile(W,Q),await tX(W)}catch(Q){console.error("Error compressing rotated file:",Q)}if(J.length===0&&!X.some((Q)=>Q.endsWith(".log.1")))try{let Q=`${Y}.1`;await vQ(Q,"")}catch(Q){console.error("Error creating backup file:",Q)}}catch(Q){console.error(`Error during rotation: ${Q instanceof Error?Q.message:String(Q)}`)}}else{let X=new Date().toISOString().replace(/[:.]/g,"-"),J=Y.replace(/\.log$/,`-${X}.log`);if(await P1(Y).catch(()=>null))await L2(Y,J)}if(this.currentLogFile=A,$.maxFiles){let J=(await rX(this.config.logDirectory)).filter((U)=>U.startsWith(this.name)).sort((U,W)=>W.localeCompare(U));for(let U of J.slice($.maxFiles))await tX(b1(this.config.logDirectory,U))}}}async compressLogFile(w,$){let Y=V2(w),A=qf($),X=_2();await Rf(Y,X,A)}async handleFingersCrossedBuffer(w,$){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(w)&&!this.isActivated){this.isActivated=!0;for(let Y of this.logBuffer){let A=await this.formatter.format(Y);if(this.shouldWriteToFile())await this.writeToFile(A);console.log(A)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated){if(this.shouldWriteToFile())await this.writeToFile($);console.log($)}}shouldLog(w){if(!this.enabled)return!1;let $={debug:0,info:1,success:2,warning:3,error:4};return $[w]>=$[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((w)=>{if(w instanceof Promise)return w.catch(($)=>{console.error("Error in pending write operation:",$)});return Promise.resolve()})),pX(this.currentLogFile))try{let w=y2(this.currentLogFile,"r+");C2(w),cQ(w)}catch(w){console.error(`Error flushing file: ${w}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let w of this.pendingOperations)if(typeof w.cancel==="function")w.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(w){console.error("Error waiting for pending operations:",w)}if(!H0()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let $=(await rX(this.config.logDirectory)).filter((Y)=>(Y.includes("temp")||Y.includes(".tmp"))&&Y.includes(this.name));for(let Y of $)try{await tX(b1(this.config.logDirectory,Y))}catch(A){console.error(`Failed to delete temp file ${Y}:`,A)}}catch(w){console.error("Error cleaning up temporary files:",w)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(w){if(!w)return"";return`${this.tagFormat.prefix}${w}${this.tagFormat.suffix}`}formatFileTimestamp(w){return`[${w.toISOString()}]`}formatConsoleTimestamp(w){return this.shouldStyleConsole()?v.gray(w.toLocaleTimeString()):w.toLocaleTimeString()}shouldStyleConsole(){if(!this.fancy||H0())return!1;let w=typeof x.env.NO_COLOR<"u",$=x.env.FORCE_COLOR==="0";if(w||$)return!1;return!!(typeof x.stderr<"u"&&x.stderr.isTTY||typeof x.stdout<"u"&&x.stdout.isTTY)}formatConsoleMessage(w){let{timestamp:$,icon:Y="",tag:A="",message:X,level:J,showTimestamp:U=!0}=w,W=(K)=>K.replace(this.ANSI_PATTERN,"");if(!this.fancy){let K=[];if(U)K.push($);if(J==="warning")K.push("WARN");else if(J==="error")K.push("ERROR");else if(Y)K.push(Y.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(A)K.push(A.replace(/[[\]]/g,""));return K.push(X),K.join(" ")}let Q=x.stdout.columns||120,B="";if(J==="warning"||J==="error")B=`${Y} ${X}`;else if(J==="info"||J==="success")B=`${Y} ${A} ${X}`;else B=`${Y} ${A} ${v.cyan(X)}`;if(!U)return B.trim();let j=W(B).trim().length,z=W($).length,G=Math.max(1,Q-2-j-z);return`${B.trim()}${" ".repeat(G)}${$}`}formatMessage(w,$){if($.length===1&&Array.isArray($[0]))return w.replace(/\{(\d+)\}/g,(J,U)=>{let W=Number.parseInt(U,10);return W<$[0].length?String($[0][W]):J});let Y=/%([sdijfo%])/g,A=0,X=w.replace(Y,(J,U)=>{if(U==="%")return"%";if(A>=$.length)return J;let W=$[A++];switch(U){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 J}});if(A<$.length)X+=` ${$.slice(A).map((J)=>typeof J==="object"?JSON.stringify(J,null,2):String(J)).join(" ")}`;return X}formatMarkdown(w){if(!w)return w;let $=w;return $=$.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(Y,A,X)=>{let J=v.underline(v.blue(A)),U=this.toAbsoluteFilePath(X);if(U&&this.shouldStyleConsole()&&this.supportsHyperlinks()){let W=`file://${encodeURI(U)}`,Q="\x1B]8;;",B="\x1B\\";return`\x1B]8;;${W}\x1B\\${J}\x1B]8;;\x1B\\`}if(this.shouldStyleConsole()&&this.supportsHyperlinks())return`\x1B]8;;${X}\x1B\\${J}\x1B]8;;\x1B\\`;return J}),$=$.replace(/`([^`]+)`/g,(Y,A)=>v.bgGray(A)),$=$.replace(/\*\*([^*]+)\*\*/g,(Y,A)=>v.bold(A)),$=$.replace(/(?<!\*)\*([^*]+)\*(?!\*)/g,(Y,A)=>v.italic(A)),$=$.replace(/(?<!_)_([^_]+)_(?!_)/g,(Y,A)=>v.italic(A)),$=$.replace(/~([^~]+)~/g,(Y,A)=>v.strikethrough(A)),$}supportsHyperlinks(){if(H0())return!1;let w=x.env;if(!w)return!1;if(w.TERM_PROGRAM==="iTerm.app"||w.TERM_PROGRAM==="vscode"||w.TERM_PROGRAM==="WezTerm")return!0;if(w.WT_SESSION)return!0;if(w.TERM==="xterm-kitty")return!0;let $=w.VTE_VERSION?Number.parseInt(w.VTE_VERSION,10):0;if(!Number.isNaN($)&&$>=5000)return!0;return!1}toAbsoluteFilePath(w){try{let $=w;if($.startsWith("file://"))$=$.replace(/^file:\/\//,"");if($.startsWith("~")){let Y=x.env.HOME||"";if(Y)$=$.replace(/^~(?=$|\/)/,Y)}if(Tf($)||$.startsWith("./")||$.startsWith("../"))$=Hf($);else return null;return pX($)?$:null}catch{return null}}buildOutputTexts(w){let $=this.shouldStyleConsole()?this.formatMarkdown(w):w,Y=w.replace(this.ANSI_PATTERN,"");return{consoleText:$,fileText:Y}}async log(w,$,...Y){let A=new Date,X=this.formatConsoleTimestamp(A),J=this.formatFileTimestamp(A),U,W;if($ instanceof Error)U=$.message,W=$.stack;else U=this.formatMessage($,Y);let{consoleText:Q,fileText:B}=this.buildOutputTexts(U);if(this.shouldStyleConsole()){let z=this.options.showIcons===!1?"":zG[w],G=this.options.showTags!==!1&&this.name?v.gray(this.formatTag(this.name)):"",K;switch(w){case"debug":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:v.gray(Q),level:w}),console.error(K);break;case"info":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.warn(K);break;case"success":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:v.green(Q),level:w}),console.error(K);break;case"warning":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.warn(K);break;case"error":if(K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.error(K),W){let E=W.split(`
143
143
  `);for(let q of E)if(q.trim()&&!q.includes(U))console.error(this.formatConsoleMessage({timestamp:X,message:v.gray(` ${q}`),level:w,showTimestamp:!1}))}break}}else if(!H0()){if(console.error(`${J} ${this.environment}.${w.toUpperCase()}: ${U}`),W)console.error(W)}if(!this.shouldLog(w))return;let j=`${J} ${this.environment}.${w.toUpperCase()}: ${B}
144
144
  `;if(W)j+=`${W}
145
145
  `;if(j=j.replace(this.ANSI_PATTERN,""),this.shouldWriteToFile())await this.writeToFile(j)}progress(w,$=""){let Y={update:(W,Q)=>{},finish:(W)=>{},interrupt:(W,Q)=>{}};if(!this.enabled)return Y;let A=30;if(this.activeProgressBar={total:Math.max(1,w||1),current:0,message:$||"",barLength:A,lastRenderedLine:""},this.shouldStyleConsole()&&!H0()&&x.stdout.isTTY)this.renderProgressBar(this.activeProgressBar);return{update:(W,Q)=>{if(!this.enabled||!this.activeProgressBar)return;if(this.activeProgressBar.current=Math.min(Math.max(0,W),this.activeProgressBar.total),Q!==void 0)this.activeProgressBar.message=Q;if(this.shouldStyleConsole()&&!H0()&&x.stdout.isTTY)this.renderProgressBar(this.activeProgressBar)},finish:(W)=>{if(!this.activeProgressBar)return;this.finishProgressBar(this.activeProgressBar,W)},interrupt:(W,Q="info")=>{if(!H0()&&x.stdout.isTTY)x.stdout.write(`
146
146
  `);if(this[Q==="warning"?"warn":Q](W),this.activeProgressBar&&this.shouldStyleConsole()&&!H0()&&x.stdout.isTTY)this.renderProgressBar(this.activeProgressBar)}}}time(w){let $=performance.now();if(this.shouldStyleConsole()){let Y=this.options.showTags!==!1&&this.name?v.gray(this.formatTag(this.name)):"",A=this.formatConsoleTimestamp(new Date);console.error(this.formatConsoleMessage({timestamp:A,icon:this.options.showIcons===!1?"":v.blue("◐"),tag:Y,message:`${v.cyan(w)}...`}))}return async(Y)=>{if(!this.enabled)return;let A=performance.now(),X=Math.round(A-$),J=`${w} completed in ${X}ms`,U=new Date,W=this.formatConsoleTimestamp(U),B=`${this.formatFileTimestamp(U)} ${this.environment}.INFO: ${J}`;if(Y)B+=` ${JSON.stringify(Y)}`;if(B+=`
147
- `,B=B.replace(this.ANSI_PATTERN,""),this.shouldStyleConsole()){let j=this.options.showTags!==!1&&this.name?v.gray(this.formatTag(this.name)):"";console.error(this.formatConsoleMessage({timestamp:W,icon:this.options.showIcons===!1?"":v.green("✓"),tag:j,message:`${J}${Y?` ${JSON.stringify(Y)}`:""}`}))}else if(!H0())console.error(B.trim());if(this.shouldWriteToFile())await this.writeToFile(B)}}async debug(w,...$){await this.log("debug",w,...$)}async info(w,...$){await this.log("info",w,...$)}async success(w,...$){await this.log("success",w,...$)}async warn(w,...$){await this.log("warning",w,...$)}async error(w,...$){await this.log("error",w,...$)}validateEncryptionConfig(){if(!this.config.rotation)return!1;if(typeof this.config.rotation==="boolean")return!1;let w=this.config.rotation,{encrypt:$}=w;return!!$}async only(w){if(!this.enabled)return;return await w()}isEnabled(){return this.enabled}setEnabled(w){this.enabled=w}extend(w){let $=`${this.name}:${w}`,Y=new z8($,{...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(Y),Y}createReadStream(){if(H0())throw Error("createReadStream is not supported in browser environments");if(!lX(this.currentLogFile))throw Error(`Log file does not exist: ${this.currentLogFile}`);return I2(this.currentLogFile,{encoding:"utf8"})}async decrypt(w){if(!this.validateEncryptionConfig())throw Error("Encryption is not configured");let $=this.config.rotation;if(!$.encrypt||typeof $.encrypt==="boolean")throw Error("Invalid encryption configuration");if(!this.currentKeyId||!this.keys.has(this.currentKeyId))throw Error("No valid encryption key available");let Y=this.keys.get(this.currentKeyId);try{let A=w$.isBuffer(w)?w:w$.from(w,"base64"),X=A.subarray(0,16),J=A.subarray(A.length-16),U=A.subarray(16,A.length-16),W=KT("aes-256-gcm",Y,X);W.setAuthTag(J);let Q=W.update(U),B=W.final(),j=Q.length+B.length,z=w$.allocUnsafe(j);return Q.copy(z,0),B.copy(z,Q.length),z.toString("utf8")}catch(A){throw Error(`Decryption failed: ${A instanceof Error?A.message:String(A)}`)}}getLevel(){return this.config.level}getLogDirectory(){return this.config.logDirectory}getFormat(){return this.config.format}getRotationConfig(){return this.config.rotation}isBrowserMode(){return H0()}isServerMode(){return!H0()}setTestEncryptionKey(w,$){this.currentKeyId=w,this.keys.set(w,$)}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(w){if(!this.enabled)return;let $=new Date,Y=this.formatConsoleTimestamp($),A=this.formatFileTimestamp($),{consoleText:X,fileText:J}=this.buildOutputTexts(w);if(this.shouldStyleConsole()){let W=X.split(`
147
+ `,B=B.replace(this.ANSI_PATTERN,""),this.shouldStyleConsole()){let j=this.options.showTags!==!1&&this.name?v.gray(this.formatTag(this.name)):"";console.error(this.formatConsoleMessage({timestamp:W,icon:this.options.showIcons===!1?"":v.green("✓"),tag:j,message:`${J}${Y?` ${JSON.stringify(Y)}`:""}`}))}else if(!H0())console.error(B.trim());if(this.shouldWriteToFile())await this.writeToFile(B)}}async debug(w,...$){await this.log("debug",w,...$)}async info(w,...$){await this.log("info",w,...$)}async success(w,...$){await this.log("success",w,...$)}async warn(w,...$){await this.log("warning",w,...$)}async error(w,...$){await this.log("error",w,...$)}validateEncryptionConfig(){if(!this.config.rotation)return!1;if(typeof this.config.rotation==="boolean")return!1;let w=this.config.rotation,{encrypt:$}=w;return!!$}async only(w){if(!this.enabled)return;return await w()}isEnabled(){return this.enabled}setEnabled(w){this.enabled=w}extend(w){let $=`${this.name}:${w}`,Y=new K8($,{...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(Y),Y}createReadStream(){if(H0())throw Error("createReadStream is not supported in browser environments");if(!pX(this.currentLogFile))throw Error(`Log file does not exist: ${this.currentLogFile}`);return V2(this.currentLogFile,{encoding:"utf8"})}async decrypt(w){if(!this.validateEncryptionConfig())throw Error("Encryption is not configured");let $=this.config.rotation;if(!$.encrypt||typeof $.encrypt==="boolean")throw Error("Invalid encryption configuration");if(!this.currentKeyId||!this.keys.has(this.currentKeyId))throw Error("No valid encryption key available");let Y=this.keys.get(this.currentKeyId);try{let A=w$.isBuffer(w)?w:w$.from(w,"base64"),X=A.subarray(0,16),J=A.subarray(A.length-16),U=A.subarray(16,A.length-16),W=Ff("aes-256-gcm",Y,X);W.setAuthTag(J);let Q=W.update(U),B=W.final(),j=Q.length+B.length,z=w$.allocUnsafe(j);return Q.copy(z,0),B.copy(z,Q.length),z.toString("utf8")}catch(A){throw Error(`Decryption failed: ${A instanceof Error?A.message:String(A)}`)}}getLevel(){return this.config.level}getLogDirectory(){return this.config.logDirectory}getFormat(){return this.config.format}getRotationConfig(){return this.config.rotation}isBrowserMode(){return H0()}isServerMode(){return!H0()}setTestEncryptionKey(w,$){this.currentKeyId=w,this.keys.set(w,$)}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(w){if(!this.enabled)return;let $=new Date,Y=this.formatConsoleTimestamp($),A=this.formatFileTimestamp($),{consoleText:X,fileText:J}=this.buildOutputTexts(w);if(this.shouldStyleConsole()){let W=X.split(`
148
148
  `),Q=Math.max(...W.map((G)=>G.length))+2,B=`┌${"─".repeat(Q)}┐`,j=`└${"─".repeat(Q)}┘`,z=W.map((G)=>{return this.formatConsoleMessage({timestamp:Y,message:v.cyan(G),showTimestamp:!1})});console.error(this.formatConsoleMessage({timestamp:Y,message:v.cyan(B),showTimestamp:!1})),z.forEach((G)=>console.error(G)),console.error(this.formatConsoleMessage({timestamp:Y,message:v.cyan(j),showTimestamp:!1}))}else if(!H0())console.error(`${A} ${this.environment}.INFO: [BOX] ${J}`);let U=`${A} ${this.environment}.INFO: [BOX] ${J}
149
149
  `.replace(this.ANSI_PATTERN,"");if(this.shouldWriteToFile())await this.writeToFile(U)}async prompt(w){if(H0())return Promise.resolve(!0);return new Promise(($)=>{console.error(`${v.cyan("?")} ${w} (y/n) `);let Y=(A)=>{let X=A.toString().trim().toLowerCase();x.stdin.removeListener("data",Y);try{if(typeof x.stdin.setRawMode==="function")x.stdin.setRawMode(!1)}catch{}x.stdin.pause(),console.error(""),$(X==="y"||X==="yes")};try{if(typeof x.stdin.setRawMode==="function")x.stdin.setRawMode(!0)}catch{}x.stdin.resume(),x.stdin.once("data",Y)})}setFancy(w){this.fancy=w}isFancy(){return this.fancy}pause(){this.enabled=!1}resume(){this.enabled=!0}async start(w,...$){if(!this.enabled)return;let Y=w;if($&&$.length>0){let Q=/%([sdijfo%])/g,B=0;if(Y=w.replace(Q,(j,z)=>{if(z==="%")return"%";if(B>=$.length)return j;let G=$[B++];switch(z){case"s":return String(G);case"d":case"i":return Number(G).toString();case"j":case"o":return JSON.stringify(G,null,2);default:return j}}),B<$.length)Y+=` ${$.slice(B).map((j)=>typeof j==="object"?JSON.stringify(j,null,2):String(j)).join(" ")}`}let{consoleText:A,fileText:X}=this.buildOutputTexts(Y);if(this.shouldStyleConsole()){let Q=this.options.showTags!==!1&&this.name?v.gray(this.formatTag(this.name)):"",B=this.options.showIcons===!1?"":`${v.blue("◐")} `;console.error(`${B}${Q} ${v.cyan(A)}`)}let W=`[${new Date().toISOString()}] ${this.environment}.INFO: [START] ${X}
150
150
  `.replace(this.ANSI_PATTERN,"");if(this.shouldWriteToFile())await this.writeToFile(W)}renderProgressBar(w,$=!1){if(!this.enabled||!this.shouldStyleConsole()||!x.stdout.isTTY)return;let Y=Math.min(100,Math.max(0,Math.round(w.current/w.total*100))),A=Math.round(w.barLength*Y/100),X=w.barLength-A,J=v.green("━".repeat(A)),U=v.gray("━".repeat(X)),W=`[${J}${U}]`,Q=`${Y}%`.padStart(4),B=w.message?` ${w.message}`:"",j=this.options.showIcons===!1?"":$||Y===100?v.green("✓"):v.blue("▶"),z=this.options.showTags!==!1&&this.name?` ${v.gray(this.formatTag(this.name))}`:"",G=`\r${j}${z} ${W} ${Q}${B}`,K=x.stdout.columns||80,E=" ".repeat(Math.max(0,K-G.replace(this.ANSI_PATTERN,"").length));if(w.lastRenderedLine=`${G}${E}`,x.stdout.write(w.lastRenderedLine),$)x.stdout.write(`
151
- `)}finishProgressBar(w,$){if(!this.enabled||!this.fancy||H0()||!x.stdout.isTTY){this.activeProgressBar=null;return}if(w.current<w.total)w.current=w.total;if($)w.message=$;this.renderProgressBar(w,!0),this.activeProgressBar=null}async clear(w={}){if(H0()){console.warn("Log clearing is not supported in browser environments.");return}try{console.warn("Clearing logs...",this.config.logDirectory);let $=await nX(this.config.logDirectory),Y=[];for(let A of $){if(!(w.name?new RegExp(w.name.replace("*",".*")).test(A):A.startsWith(this.name))||!A.endsWith(".log"))continue;let J=P1(this.config.logDirectory,A);if(w.before)try{if((await x1(J)).mtime>=w.before)continue}catch(U){console.error(`Failed to get stats for file ${J}:`,U);continue}Y.push(J)}if(Y.length===0){console.warn("No log files matched the criteria for clearing.");return}console.warn(`Preparing to delete ${Y.length} log file(s)...`);for(let A of Y)try{await pX(A),console.warn(`Deleted log file: ${A}`)}catch(X){console.error(`Failed to delete log file ${A}:`,X)}console.warn("Log clearing process finished.")}catch($){console.error("Error during log clearing process:",$)}}}async function $G(w,$={}){let{maxRetries:Y=3,retryDelay:A=1000,isRetryable:X=()=>!0,fallback:J}=$,U=Error("Unknown error occurred");for(let W=0;W<=Y;W++)try{return await w()}catch(Q){if(U=Q instanceof Error?Q:Error(String(Q)),W===Y||!X(U))break;if(A>0)await new Promise((B)=>setTimeout(B,A))}if(J!==void 0)return J;throw U instanceof Error?U:Error(`Unknown error: ${String(U)}`)}function YG(w){return w instanceof Yw}function uT(w){return w instanceof G8}function cT(w){if(YG(w))return w.code==="FILE_SYSTEM_ERROR"||w.code==="BROWSER_CONFIG_ERROR";return["ENOENT","EACCES","EMFILE","ENFILE","EBUSY","network","timeout","connection"].some((Y)=>w.message.toLowerCase().includes(Y.toLowerCase()))}class N8{defaultParsers;constructor(){this.defaultParsers=[{name:"boolean",canParse:(w,$)=>$==="boolean"||["true","false","1","0","yes","no"].includes(w.toLowerCase()),parse:(w)=>{let $=w.toLowerCase();return["true","1","yes"].includes($)}},{name:"number",canParse:(w,$)=>$==="number"||!Number.isNaN(Number(w))&&!Number.isNaN(Number.parseFloat(w)),parse:(w)=>{let $=Number(w);if(Number.isNaN($))throw TypeError(`Cannot parse "${w}" as number`);return $}},{name:"array",canParse:(w,$)=>$==="array"||w.startsWith("[")||w.includes(","),parse:(w)=>{try{let $=JSON.parse(w);if(Array.isArray($))return $}catch{}return w.split(",").map(($)=>$.trim())}},{name:"json",canParse:(w,$)=>$==="object"||(w.startsWith("{")&&w.endsWith("}")||w.startsWith("[")&&w.endsWith("]")),parse:(w)=>{try{return JSON.parse(w)}catch($){throw Error(`Cannot parse "${w}" as JSON: ${$}`)}}}]}async applyEnvironmentVariables(w,$,Y={}){let{prefix:A,useCamelCase:X=!0,useBackwardCompatibility:J=!0,customParsers:U={},verbose:W=!1,trackPerformance:Q=!0}=Y,B=async()=>{if(!w)return{config:$,source:{type:"environment",priority:50,timestamp:new Date}};let j=A||this.generateEnvPrefix(w),z={...$};return this.processObject(z,[],j,{useCamelCase:X,useBackwardCompatibility:J,customParsers:U,verbose:W,configName:w}),{config:z,source:{type:"environment",priority:50,timestamp:new Date}}};if(Q)return kY.track("applyEnvironmentVariables",B,{configName:w});return B()}generateEnvPrefix(w){return w.toUpperCase().replace(/-/g,"_")}formatEnvKey(w,$){if(!$)return w.toUpperCase();return w.replace(/([A-Z])/g,"_$1").toUpperCase()}processObject(w,$,Y,A){for(let[X,J]of Object.entries(w)){let U=[...$,X],W=U.map((j)=>this.formatEnvKey(j,A.useCamelCase)),Q=`${Y}_${W.join("_")}`,B=A.useBackwardCompatibility?`${Y}_${U.map((j)=>j.toUpperCase()).join("_")}`:null;if(A.verbose);if(typeof J==="object"&&J!==null&&!Array.isArray(J))this.processObject(J,U,Y,A);else{let j=rX.env[Q]||(B?rX.env[B]:void 0);if(j!==void 0){if(A.verbose){let z=rX.env[Q]?Q:B}try{w[X]=this.parseEnvironmentValue(j,typeof J,Q,A.customParsers,A.configName)}catch(z){if(z instanceof K8)throw z;throw M$.envVar(Q,j,typeof J,A.configName)}}}}}parseEnvironmentValue(w,$,Y,A,X){for(let[J,U]of Object.entries(A))try{return U(w)}catch{continue}for(let J of this.defaultParsers)if(J.canParse(w,$))try{return J.parse(w)}catch{throw M$.envVar(Y,w,`${$} (via ${J.name} parser)`,X)}return w}getEnvironmentVariables(w){let $={},Y=w.toUpperCase();for(let[A,X]of Object.entries(rX.env))if(A.startsWith(Y)&&X!==void 0)$[A]=X;return $}validateEnvironmentVariable(w,$,Y){let A=[];if(!/^[A-Z_][A-Z0-9_]*$/.test(w))A.push(`Environment variable key "${w}" should only contain uppercase letters, numbers, and underscores`);if(Y)try{this.parseEnvironmentValue(w,$,Y,{})}catch(X){A.push(`Cannot parse value "${$}" as ${Y}: ${X}`)}return{isValid:A.length===0,errors:A}}generateEnvVarDocs(w,$,Y={}){let{prefix:A,format:X="text"}=Y,J=A||this.generateEnvPrefix(w),U=[];switch(this.extractEnvVarInfo($,[],J,U),X){case"markdown":return this.formatAsMarkdown(U,w);case"json":return JSON.stringify(U,null,2);default:return this.formatAsText(U,w)}}extractEnvVarInfo(w,$,Y,A){for(let[X,J]of Object.entries(w)){let U=[...$,X],W=`${Y}_${U.map((Q)=>this.formatEnvKey(Q,!0)).join("_")}`;if(typeof J==="object"&&J!==null&&!Array.isArray(J))this.extractEnvVarInfo(J,U,Y,A);else A.push({key:W,type:Array.isArray(J)?"array":typeof J,description:`Configuration for ${U.join(".")}`,example:this.generateExample(J)})}}generateExample(w){if(Array.isArray(w))return JSON.stringify(w);if(typeof w==="object"&&w!==null)return JSON.stringify(w);return String(w)}formatAsText(w,$){let Y=`Environment Variables for ${$}:
151
+ `)}finishProgressBar(w,$){if(!this.enabled||!this.fancy||H0()||!x.stdout.isTTY){this.activeProgressBar=null;return}if(w.current<w.total)w.current=w.total;if($)w.message=$;this.renderProgressBar(w,!0),this.activeProgressBar=null}async clear(w={}){if(H0()){console.warn("Log clearing is not supported in browser environments.");return}try{console.warn("Clearing logs...",this.config.logDirectory);let $=await rX(this.config.logDirectory),Y=[];for(let A of $){if(!(w.name?new RegExp(w.name.replace("*",".*")).test(A):A.startsWith(this.name))||!A.endsWith(".log"))continue;let J=b1(this.config.logDirectory,A);if(w.before)try{if((await P1(J)).mtime>=w.before)continue}catch(U){console.error(`Failed to get stats for file ${J}:`,U);continue}Y.push(J)}if(Y.length===0){console.warn("No log files matched the criteria for clearing.");return}console.warn(`Preparing to delete ${Y.length} log file(s)...`);for(let A of Y)try{await tX(A),console.warn(`Deleted log file: ${A}`)}catch(X){console.error(`Failed to delete log file ${A}:`,X)}console.warn("Log clearing process finished.")}catch($){console.error("Error during log clearing process:",$)}}}async function YG(w,$={}){let{maxRetries:Y=3,retryDelay:A=1000,isRetryable:X=()=>!0,fallback:J}=$,U=Error("Unknown error occurred");for(let W=0;W<=Y;W++)try{return await w()}catch(Q){if(U=Q instanceof Error?Q:Error(String(Q)),W===Y||!X(U))break;if(A>0)await new Promise((B)=>setTimeout(B,A))}if(J!==void 0)return J;throw U instanceof Error?U:Error(`Unknown error: ${String(U)}`)}function AG(w){return w instanceof Yw}function cf(w){return w instanceof F8}function vf(w){if(AG(w))return w.code==="FILE_SYSTEM_ERROR"||w.code==="BROWSER_CONFIG_ERROR";return["ENOENT","EACCES","EMFILE","ENFILE","EBUSY","network","timeout","connection"].some((Y)=>w.message.toLowerCase().includes(Y.toLowerCase()))}class f8{defaultParsers;constructor(){this.defaultParsers=[{name:"boolean",canParse:(w,$)=>$==="boolean"||["true","false","1","0","yes","no"].includes(w.toLowerCase()),parse:(w)=>{let $=w.toLowerCase();return["true","1","yes"].includes($)}},{name:"number",canParse:(w,$)=>$==="number"||!Number.isNaN(Number(w))&&!Number.isNaN(Number.parseFloat(w)),parse:(w)=>{let $=Number(w);if(Number.isNaN($))throw TypeError(`Cannot parse "${w}" as number`);return $}},{name:"array",canParse:(w,$)=>$==="array"||w.startsWith("[")||w.includes(","),parse:(w)=>{try{let $=JSON.parse(w);if(Array.isArray($))return $}catch{}return w.split(",").map(($)=>$.trim())}},{name:"json",canParse:(w,$)=>$==="object"||(w.startsWith("{")&&w.endsWith("}")||w.startsWith("[")&&w.endsWith("]")),parse:(w)=>{try{return JSON.parse(w)}catch($){throw Error(`Cannot parse "${w}" as JSON: ${$}`)}}}]}async applyEnvironmentVariables(w,$,Y={}){let{prefix:A,useCamelCase:X=!0,useBackwardCompatibility:J=!0,customParsers:U={},verbose:W=!1,trackPerformance:Q=!0}=Y,B=async()=>{if(!w)return{config:$,source:{type:"environment",priority:50,timestamp:new Date}};let j=A||this.generateEnvPrefix(w),z={...$};return this.processObject(z,[],j,{useCamelCase:X,useBackwardCompatibility:J,customParsers:U,verbose:W,configName:w}),{config:z,source:{type:"environment",priority:50,timestamp:new Date}}};if(Q)return hY.track("applyEnvironmentVariables",B,{configName:w});return B()}generateEnvPrefix(w){return w.toUpperCase().replace(/-/g,"_")}formatEnvKey(w,$){if(!$)return w.toUpperCase();return w.replace(/([A-Z])/g,"_$1").toUpperCase()}processObject(w,$,Y,A){for(let[X,J]of Object.entries(w)){let U=[...$,X],W=U.map((j)=>this.formatEnvKey(j,A.useCamelCase)),Q=`${Y}_${W.join("_")}`,B=A.useBackwardCompatibility?`${Y}_${U.map((j)=>j.toUpperCase()).join("_")}`:null;if(A.verbose);if(typeof J==="object"&&J!==null&&!Array.isArray(J))this.processObject(J,U,Y,A);else{let j=aX.env[Q]||(B?aX.env[B]:void 0);if(j!==void 0){if(A.verbose){let z=aX.env[Q]?Q:B}try{w[X]=this.parseEnvironmentValue(j,typeof J,Q,A.customParsers,A.configName)}catch(z){if(z instanceof q8)throw z;throw M$.envVar(Q,j,typeof J,A.configName)}}}}}parseEnvironmentValue(w,$,Y,A,X){for(let[J,U]of Object.entries(A))try{return U(w)}catch{continue}for(let J of this.defaultParsers)if(J.canParse(w,$))try{return J.parse(w)}catch{throw M$.envVar(Y,w,`${$} (via ${J.name} parser)`,X)}return w}getEnvironmentVariables(w){let $={},Y=w.toUpperCase();for(let[A,X]of Object.entries(aX.env))if(A.startsWith(Y)&&X!==void 0)$[A]=X;return $}validateEnvironmentVariable(w,$,Y){let A=[];if(!/^[A-Z_][A-Z0-9_]*$/.test(w))A.push(`Environment variable key "${w}" should only contain uppercase letters, numbers, and underscores`);if(Y)try{this.parseEnvironmentValue(w,$,Y,{})}catch(X){A.push(`Cannot parse value "${$}" as ${Y}: ${X}`)}return{isValid:A.length===0,errors:A}}generateEnvVarDocs(w,$,Y={}){let{prefix:A,format:X="text"}=Y,J=A||this.generateEnvPrefix(w),U=[];switch(this.extractEnvVarInfo($,[],J,U),X){case"markdown":return this.formatAsMarkdown(U,w);case"json":return JSON.stringify(U,null,2);default:return this.formatAsText(U,w)}}extractEnvVarInfo(w,$,Y,A){for(let[X,J]of Object.entries(w)){let U=[...$,X],W=`${Y}_${U.map((Q)=>this.formatEnvKey(Q,!0)).join("_")}`;if(typeof J==="object"&&J!==null&&!Array.isArray(J))this.extractEnvVarInfo(J,U,Y,A);else A.push({key:W,type:Array.isArray(J)?"array":typeof J,description:`Configuration for ${U.join(".")}`,example:this.generateExample(J)})}}generateExample(w){if(Array.isArray(w))return JSON.stringify(w);if(typeof w==="object"&&w!==null)return JSON.stringify(w);return String(w)}formatAsText(w,$){let Y=`Environment Variables for ${$}:
152
152
 
153
153
  `;for(let A of w)Y+=`${A.key}
154
154
  `,Y+=` Type: ${A.type}
@@ -160,36 +160,36 @@ ${A.join(`
160
160
  `;Y+=`| Variable | Type | Description | Example |
161
161
  `,Y+=`|----------|------|-------------|----------|
162
162
  `;for(let A of w)Y+=`| \`${A.key}\` | ${A.type} | ${A.description} | \`${A.example}\` |
163
- `;return Y}}function vT(w,$){let Y=QG("process");if(typeof Y>"u"||!Y.env)return $;let A=Y.env[w];return A!==void 0?A:$}function AG(w,$,Y={}){return XG(w,$,Y,new WeakMap)}function XG(w,$,Y,A){let{arrayMergeMode:X="replace",skipNullish:J=!1,customMerger:U}=Y;if($===null||$===void 0)return J?w:$;if(U){let W=U(w,$);if(W!==void 0)return W}if(Array.isArray($)||Array.isArray(w))return JG(w,$,X,A);if(!zw($)||!zw(w))return $;return dT(w,$,Y,A)}function JG(w,$,Y,A){if(Array.isArray($)&&!Array.isArray(w))return $;if(Array.isArray(w)&&!Array.isArray($))return $;if(Array.isArray($)&&Array.isArray(w))switch(Y){case"replace":return $;case"concat":return iT(w,$);case"smart":return mT(w,$,A);default:return $}return $}function iT(w,$){let Y=[...$];for(let A of w)if(!Y.some((X)=>sQ(X,A)))Y.push(A);return Y}function mT(w,$,Y){if($.length===0)return w;if(w.length===0)return $;if(zw($[0])&&zw(w[0]))return gT(w,$,Y);if($.every((A)=>typeof A==="string")&&w.every((A)=>typeof A==="string")){let A=[...$];for(let X of w)if(!A.includes(X))A.push(X);return A}return $}function gT(w,$,Y){let A=[...$];for(let X of w){if(!zw(X)){A.push(X);continue}let J=["id","name","key","path","type"],U=!1;for(let W of J)if(W in X){if(A.find((B)=>zw(B)&&(W in B)&&B[W]===X[W])){U=!0;break}}if(!U)A.push(X)}return A}function dT(w,$,Y,A){let X=$;if(zw(X)&&A.has(X))return A.get(X);let J={...w};if(zw(X))A.set(X,J);for(let U in X){if(!Object.prototype.hasOwnProperty.call(X,U))continue;let W=X[U],Q=J[U];if(Y.skipNullish&&(W===null||W===void 0))continue;if(W===null||W===void 0){J[U]=W;continue}if(zw(W)&&zw(Q))J[U]=XG(Q,W,Y,A);else if(Array.isArray(W)||Array.isArray(Q))J[U]=JG(Q,W,Y.arrayMergeMode||"smart",A);else J[U]=W}return J}function jW(w,$,Y="replace"){return AG(w,$,{arrayMergeMode:Y==="replace"?"replace":"smart",skipNullish:!0})}function sQ(w,$){if(w===$)return!0;if(Array.isArray(w)&&Array.isArray($)){if(w.length!==$.length)return!1;for(let Y=0;Y<w.length;Y++)if(!sQ(w[Y],$[Y]))return!1;return!0}if(zw(w)&&zw($)){let Y=Object.keys(w),A=Object.keys($);if(Y.length!==A.length)return!1;for(let X of Y){if(!Object.prototype.hasOwnProperty.call($,X))return!1;if(!sQ(w[X],$[X]))return!1}return!0}return!1}function zw(w){return Boolean(w&&typeof w==="object"&&!Array.isArray(w))}class E8{extensions=[".ts",".js",".mjs",".cjs",".json",".mts",".cts"];async loadFromPath(w,$,Y={}){let{arrayStrategy:A="replace",useCache:X=!0,cacheTtl:J,trackPerformance:U=!0,verbose:W=!1}=Y;if(X){let B=i1.getWithFileCheck("file",w);if(B){if(W)console.log(`Configuration loaded from cache: ${w}`);return B}}let Q=async()=>{if(!tX(w))return null;try{let B=`?t=${Date.now()}`,j=await import(w+B),z=j.default||j,G="default"in j,K=Object.keys(j).length>0;if(!G&&!K)throw new SY(w,Error("Configuration file is empty and exports nothing"),"unknown");if(typeof z!=="object"||z===null||Array.isArray(z))throw new SY(w,Error("Configuration must export a valid object"),"unknown");let N={config:jW($,z,A),source:{type:"file",path:w,priority:100,timestamp:new Date}};if(X)i1.setWithFileCheck("file",N,w,J);return N}catch(B){throw B instanceof Error?M$.configLoad(w,B):M$.configLoad(w,Error(String(B)))}};if(U)return kY.track("loadFromPath",Q,{path:w});return Q()}async tryLoadFromPaths(w,$,Y={}){for(let A of w)try{let X=await this.loadFromPath(A,$,Y);if(X)return X}catch(X){if(X instanceof Error&&X.name==="ConfigLoadError")throw X;if(Y.verbose)console.warn(`Failed to load config from ${A}:`,X)}return null}generateConfigPaths(w,$,Y){let A=this.generateNamePatterns(w,Y),X=[];for(let J of A)for(let U of this.extensions)X.push(cQ($,`${J}${U}`));return X}generateNamePatterns(w,$){let Y=[];if(Y.push("config",".config"),w)Y.push(w,`.${w}.config`,`${w}.config`,`.${w}`);if($){if(Y.push($,`.${$}.config`,`${$}.config`,`.${$}`),w)Y.push(`${w}.${$}.config`,`.${w}.${$}.config`)}return Y.filter(Boolean)}checkFileAccess(w){return $G(async()=>{return tX(w)},{maxRetries:2,retryDelay:100,fallback:!1})}async discoverConfigFiles(w,$,Y){let A=[];if(!tX(w))return A;if($||Y){let X=this.generateNamePatterns($||"",Y);for(let J of X)for(let U of this.extensions){let W=cQ(w,`${J}${U}`);if(await this.checkFileAccess(W))A.push(W)}}else try{let{readdirSync:X}=await import("fs"),J=X(w);for(let U of J)if(this.looksLikeConfigFile(U)){let W=cQ(w,U);if(await this.checkFileAccess(W))A.push(W)}}catch{return[]}return A}looksLikeConfigFile(w){return[/\.config\.(ts|js|mjs|cjs|json|mts|cts)$/,/^\..*\.(ts|js|mjs|cjs|json|mts|cts)$/,/config\.(ts|js|mjs|cjs|json|mts|cts)$/].some((Y)=>Y.test(w))}async validateConfigFile(w){let $=[];try{if(!tX(w))return $.push("Configuration file does not exist"),$;let Y=await import(w),A=Y.default||Y;if(A===void 0)$.push("Configuration file must export a default value or named exports");else if(typeof A!=="object"||A===null)$.push("Configuration must be an object");else if(Array.isArray(A))$.push("Configuration cannot be an array at the root level");if(w.endsWith(".json"))try{let{readFileSync:X}=await import("fs"),J=X(w,"utf8");JSON.parse(J)}catch(X){$.push(`Invalid JSON syntax: ${X}`)}}catch(Y){$.push(`Failed to load configuration file: ${Y}`)}return $}async getFileModificationTime(w){try{let{statSync:$}=await import("fs");return $(w).mtime}catch{return null}}async preloadConfigurations(w,$={}){let Y=new Map;return await Promise.allSettled(w.map(async(A)=>{try{let X=await this.loadFromPath(A,{},$);if(X)Y.set(A,X.config)}catch(X){if($.verbose)console.warn(`Failed to preload ${A}:`,X)}})),Y}}class zW{async validateConfiguration(w,$,Y={}){let{stopOnFirstError:A=!1,validateRequired:X=!0,validateTypes:J=!0,customRules:U=[],trackPerformance:W=!0,verbose:Q=!1}=Y,B=async()=>{let j=[],z=[],G={stopOnFirstError:A,validateRequired:X,validateTypes:J,customRules:U,trackPerformance:W,verbose:Q};try{if(typeof $==="string")return await this.validateWithSchemaFile(w,$,G);else if(Array.isArray($))return this.validateWithRules(w,[...$,...U],G);else return this.validateWithJSONSchema(w,$,G)}catch(K){return j.push({path:"",message:`Validation failed: ${K}`,rule:"system"}),{isValid:!1,errors:j,warnings:z}}};if(W)return await kY.track("validateConfiguration",B);return B()}async validateWithSchemaFile(w,$,Y){try{if(!RT($))throw new ZY($,[{path:"",message:"Schema file does not exist"}]);let A=await import($),X=A.default||A;if(Array.isArray(X))return this.validateWithRules(w,X,Y);else return this.validateWithJSONSchema(w,X,Y)}catch(A){throw new ZY($,[{path:"",message:`Failed to load schema: ${A}`}])}}validateWithJSONSchema(w,$,Y){let A=[],X=[];return this.validateObjectAgainstSchema(w,$,"",A,X,Y),{isValid:A.length===0,errors:A,warnings:X}}validateObjectAgainstSchema(w,$,Y,A,X,J){if(J.validateTypes&&$.type){let U=Array.isArray(w)?"array":typeof w,W=Array.isArray($.type)?$.type:[$.type];if(!W.includes(U)){if(A.push({path:Y,message:`Expected type ${W.join(" or ")}, got ${U}`,expected:W.join(" or "),actual:U,rule:"type"}),J.stopOnFirstError)return}}if($.enum&&!$.enum.includes(w)){if(A.push({path:Y,message:`Value must be one of: ${$.enum.join(", ")}`,expected:$.enum.join(", "),actual:w,rule:"enum"}),J.stopOnFirstError)return}if(typeof w==="string"){if($.minLength!==void 0&&w.length<$.minLength)A.push({path:Y,message:`String length must be at least ${$.minLength}`,expected:`>= ${$.minLength}`,actual:w.length,rule:"minLength"});if($.maxLength!==void 0&&w.length>$.maxLength)A.push({path:Y,message:`String length must not exceed ${$.maxLength}`,expected:`<= ${$.maxLength}`,actual:w.length,rule:"maxLength"});if($.pattern){if(!new RegExp($.pattern).test(w))A.push({path:Y,message:`String does not match pattern ${$.pattern}`,expected:$.pattern,actual:w,rule:"pattern"})}}if(typeof w==="number"){if($.minimum!==void 0&&w<$.minimum)A.push({path:Y,message:`Value must be at least ${$.minimum}`,expected:`>= ${$.minimum}`,actual:w,rule:"minimum"});if($.maximum!==void 0&&w>$.maximum)A.push({path:Y,message:`Value must not exceed ${$.maximum}`,expected:`<= ${$.maximum}`,actual:w,rule:"maximum"})}if(Array.isArray(w)&&$.items)for(let U=0;U<w.length;U++){let W=Y?`${Y}[${U}]`:`[${U}]`;if(this.validateObjectAgainstSchema(w[U],$.items,W,A,X,J),J.stopOnFirstError&&A.length>0)return}if(w&&typeof w==="object"&&!Array.isArray(w)){let U=w;if(J.validateRequired&&$.required){for(let W of $.required)if(!(W in U)){if(A.push({path:Y?`${Y}.${W}`:W,message:`Missing required property '${W}'`,expected:"required",rule:"required"}),J.stopOnFirstError)return}}if($.properties){for(let[W,Q]of Object.entries($.properties))if(W in U){let B=Y?`${Y}.${W}`:W;if(this.validateObjectAgainstSchema(U[W],Q,B,A,X,J),J.stopOnFirstError&&A.length>0)return}}if($.additionalProperties===!1){let W=new Set(Object.keys($.properties||{}));for(let Q of Object.keys(U))if(!W.has(Q))X.push({path:Y?`${Y}.${Q}`:Q,message:`Additional property '${Q}' is not allowed`,rule:"additionalProperties"})}}}validateWithRules(w,$,Y){let A=[],X=[];for(let J of $)try{let U=this.getValueByPath(w,J.path),W=this.validateWithRule(U,J,J.path);if(A.push(...W),Y.stopOnFirstError&&A.length>0)break}catch(U){A.push({path:J.path,message:`Rule validation failed: ${U}`,rule:"system"})}return{isValid:A.length===0,errors:A,warnings:X}}validateWithRule(w,$,Y){let A=[];if($.required&&(w===void 0||w===null))return A.push({path:Y,message:$.message||`Property '${Y}' is required`,expected:"required",rule:"required"}),A;if(w===void 0||w===null)return A;if($.type){let X=Array.isArray(w)?"array":typeof w;if(X!==$.type)A.push({path:Y,message:$.message||`Expected type ${$.type}, got ${X}`,expected:$.type,actual:X,rule:"type"})}if($.min!==void 0){let X=Array.isArray(w)?w.length:typeof w==="string"?w.length:typeof w==="number"?w:0;if(X<$.min)A.push({path:Y,message:$.message||`Value must be at least ${$.min}`,expected:`>= ${$.min}`,actual:X,rule:"min"})}if($.max!==void 0){let X=Array.isArray(w)?w.length:typeof w==="string"?w.length:typeof w==="number"?w:0;if(X>$.max)A.push({path:Y,message:$.message||`Value must not exceed ${$.max}`,expected:`<= ${$.max}`,actual:X,rule:"max"})}if($.pattern&&typeof w==="string"){if(!$.pattern.test(w))A.push({path:Y,message:$.message||`Value does not match pattern ${$.pattern}`,expected:$.pattern.toString(),actual:w,rule:"pattern"})}if($.enum&&!$.enum.includes(w))A.push({path:Y,message:$.message||`Value must be one of: ${$.enum.join(", ")}`,expected:$.enum.join(", "),actual:w,rule:"enum"});if($.validator){let X=$.validator(w);if(X)A.push({path:Y,message:$.message||X,rule:"custom"})}return A}getValueByPath(w,$){if(!$)return w;let Y=$.split("."),A=w;for(let X of Y)if(A&&typeof A==="object"&&X in A)A=A[X];else return;return A}generateRulesFromInterface(w){let $=[],Y=w.matchAll(/(\w+)(\?)?:\s*(\w+)/g);for(let A of Y){let[,X,J,U]=A;$.push({path:X,required:!J,type:this.mapTypeScriptType(U)})}return $}mapTypeScriptType(w){switch(w.toLowerCase()){case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"array":return"array";case"object":return"object";default:return"object"}}static createCommonRules(){return{server:[{path:"port",required:!0,type:"number",min:1,max:65535},{path:"host",required:!0,type:"string",min:1},{path:"ssl",type:"boolean"}],database:[{path:"url",required:!0,type:"string",min:1},{path:"pool",type:"number",min:1,max:100},{path:"timeout",type:"number",min:0}],api:[{path:"baseUrl",required:!0,type:"string",pattern:GG},{path:"timeout",type:"number",min:0},{path:"retries",type:"number",min:0,max:10}]}}}class GW{fileLoader=new E8;envProcessor=new N8;validator=new zW;async loadConfig(w){let $=Date.now(),{cache:Y,performance:A,schema:X,validate:J,...U}=w;try{if(Y?.enabled){let Q=this.checkCache(U.name||"",U);if(Q)return Q}let W;try{W=await this.loadConfigurationStrategies(U,!0,Y)}catch(Q){let B=U.__strictErrorHandling;if(Q instanceof Error&&Q.name==="ConfigNotFoundError"){if(B)throw Q;W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`No configuration file found for "${U.name||"config"}", using defaults with environment variables`]}}else if(Q instanceof Error&&Q.name==="ConfigLoadError"){let j=Q.message.includes("EACCES")||Q.message.includes("EPERM")||Q.message.includes("permission denied"),z=!j&&(Q.message.includes("syntax")||Q.message.includes("Expected")||Q.message.includes("Unexpected")||Q.message.includes("BuildMessage")||Q.message.includes("errors building")),G=Q.message.includes("Configuration must export a valid object")||Q.message.includes("Configuration file is empty and exports nothing");if(B&&(G||j))throw Q;if(z&&(!B||!G))W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:["Configuration file has syntax errors, using defaults with environment variables"]};else if(!B)W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`Configuration loading error, using defaults: ${Q.message}`]};else throw Q}else W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`Configuration loading failed, using defaults: ${Q instanceof Error?Q.message:String(Q)}`]}}if(X||J)await this.validateConfiguration(W.config,X,J,U.name);if(Y?.enabled&&W)this.cacheResult(U.name||"",W,Y,U);if(A?.enabled){let Q={operation:"loadConfig",duration:Date.now()-$,configName:U.name,timestamp:new Date};if(A.onMetrics)A.onMetrics(Q);if(A.slowThreshold&&Q.duration>A.slowThreshold)Mw.warn(`Slow configuration loading detected: ${Q.duration}ms for ${U.name}`);W.metrics=Q}return W}catch(W){let Q=Date.now()-$;throw Mw.error(`Configuration loading failed after ${Q}ms:`,[W instanceof Error?W:Error(String(W))]),W}}async loadConfigurationStrategies(w,$=!1,Y){let{name:A="",alias:X,cwd:J,configDir:U,defaultConfig:W,checkEnv:Q=!0,arrayStrategy:B="replace",verbose:j=!1}=w,z=J||i$.cwd(),G=[],K=await this.loadLocalConfiguration(A,X,z,U,W,B,j,Q,Y);if(K)return G.push(...this.getLocalSearchPaths(A,X,z,U)),this.finalizeResult(K,G,Q,A,j);let E=await this.loadHomeConfiguration(A,X,W,B,j,Q);if(E)return G.push(...this.getHomeSearchPaths(A,X)),this.finalizeResult(E,G,Q,A,j);let q=await this.loadPackageJsonConfiguration(A,X,z,W,B,j,Q);if(q)return G.push(n0(z,"package.json")),this.finalizeResult(q,G,Q,A,j);if(G.push(...this.getAllSearchPaths(A,X,z,U)),$)throw M$.configNotFound(A,G,X);return{...await this.applyEnvironmentVariables(A,W,Q,j),warnings:[`No configuration file found for "${A}"${X?` or alias "${X}"`:""}, using defaults with environment variables`]}}async loadLocalConfiguration(w,$,Y,A,X,J,U,W,Q){let B=W?LY(w,X,U):X,j=this.getLocalDirectories(Y,A);for(let z of j){if(U)Mw.info(`Searching for configuration in: ${z}`);let G=this.fileLoader.generateConfigPaths(w,z,$),K=await this.fileLoader.tryLoadFromPaths(G,B,{arrayStrategy:J,verbose:U,cacheTtl:Q?.ttl,useCache:!Q?.ttl||Q.ttl>100});if(K){if(U)Mw.success(`Configuration loaded from: ${K.source.path}`);return K}}return null}async loadHomeConfiguration(w,$,Y,A,X,J){if(!w)return null;let U=J?LY(w,Y,X):Y,W=[n0(Z1(),".config",w),n0(Z1(),".config"),Z1()];for(let Q of W){if(X)Mw.info(`Checking home directory: ${Q}`);let B=this.fileLoader.generateConfigPaths(w,Q,$),j=await this.fileLoader.tryLoadFromPaths(B,U,{arrayStrategy:A,verbose:X});if(j){if(X)Mw.success(`Configuration loaded from home directory: ${j.source.path}`);return j}}return null}async loadPackageJsonConfiguration(w,$,Y,A,X,J,U){let W=U?LY(w,A,J):A;try{let Q=n0(Y,"package.json");if(!tQ(Q))return null;let B=await import(Q),j=B[w],z=w;if(!j&&$)j=B[$],z=$;if(j&&typeof j==="object"&&!Array.isArray(j)){if(J)Mw.success(`Configuration loaded from package.json: ${z}`);return{config:jW(W,j,X),source:{type:"package.json",path:Q,priority:30,timestamp:new Date}}}}catch(Q){if(J)Mw.warn("Failed to load package.json:",[Q instanceof Error?Q:Error(String(Q))])}return null}async applyEnvironmentVariables(w,$,Y,A){if(!Y||!w||typeof $!=="object"||$===null||Array.isArray($))return{config:$,source:{type:"default",priority:10,timestamp:new Date}};return{config:LY(w,$,A),source:{type:"environment",priority:20,timestamp:new Date}}}async finalizeResult(w,$,Y,A,X){return{config:w.config,source:w.source,path:w.source.path}}async validateConfiguration(w,$,Y,A){let X=[];if(Y){let J=Y(w);if(J)X.push(...J)}if($){let J=await this.validator.validateConfiguration(w,$);if(!J.isValid)X.push(...J.errors.map((U)=>U.path?`${U.path}: ${U.message}`:U.message))}if(X.length>0)throw M$.configValidation(A||"unknown",X,A)}checkCache(w,$){let Y=this.generateCacheKey(w,$);return i1.get(Y)||null}cacheResult(w,$,Y,A){let X=this.generateCacheKey(w,A);i1.set(X,$,void 0,Y.ttl)}generateCacheKey(w,$){let Y=[w];if($.alias)Y.push(`alias:${$.alias}`);if($.cwd)Y.push(`cwd:${$.cwd}`);if($.configDir)Y.push(`configDir:${$.configDir}`);if("checkEnv"in $)Y.push(`checkEnv:${$.checkEnv}`);return Y.join("|")}getLocalDirectories(w,$){return Array.from(new Set([w,n0(w,"config"),n0(w,".config"),$?n0(w,$):void 0].filter(Boolean)))}getAllSearchPaths(w,$,Y,A){let X=[];return X.push(...this.getLocalSearchPaths(w,$,Y,A)),X.push(...this.getHomeSearchPaths(w,$)),X.push(n0(Y,"package.json")),X}getLocalSearchPaths(w,$,Y,A){let X=this.getLocalDirectories(Y,A),J=[];for(let U of X)J.push(...this.fileLoader.generateConfigPaths(w,U,$));return J}getHomeSearchPaths(w,$){if(!w)return[];let Y=[n0(Z1(),".config",w),n0(Z1(),".config"),Z1()],A=[];for(let X of Y)A.push(...this.fileLoader.generateConfigPaths(w,X,$));return A}async loadConfigWithResult(w){return this.loadConfig(w)}}function S2(w){let Y=!(w.message.includes("EACCES")||w.message.includes("EPERM")||w.message.includes("permission denied"))&&(w.message.includes("syntax")||w.message.includes("Expected")||w.message.includes("Unexpected")||w.message.includes("BuildMessage")),A=w.message.includes("Configuration must export a valid object")||w.message.includes("Configuration file is empty and exports nothing");return Y||A}async function lT(w){return J$.loadConfig({...w,__strictErrorHandling:!0})}async function UG(w){let $="defaultConfig"in w&&w.defaultConfig!==void 0?w.defaultConfig:{},Y="cache"in w||"performance"in w||"schema"in w||"validate"in w;try{let A;if(Y)A=await J$.loadConfig(w);else A=await J$.loadConfig({...w,defaultConfig:$,cache:{enabled:!0},performance:{enabled:!1}});return A?.config??$}catch(A){let X=A instanceof Error?A.name:"UnknownError",J=A instanceof Error?A.message:String(A);if(!(X==="ConfigNotFoundError"||X==="ConfigLoadError"||X==="ConfigValidationError"||J.includes("config"))&&w.verbose)Mw.warn("Unexpected error loading config, using defaults:",[A instanceof Error?A:Error(String(A))]);let W=Y?{...w,defaultConfig:$}:{...w,defaultConfig:$,cache:{enabled:!0},performance:{enabled:!1}};if("checkEnv"in w?w.checkEnv!==!1:!0)return(await J$.applyEnvironmentVariables(W.name||"",$,!0,W.verbose||!1))?.config??$;return $}}async function nT(w={defaultConfig:{}}){if(typeof w==="string"){let{cwd:$}=await import("process");try{return(await J$.loadConfig({name:w,cwd:$(),generatedDir:"./generated",configDir:"./config",defaultConfig:{},checkEnv:!0,arrayStrategy:"replace"})).config}catch(Y){if(Y instanceof Error&&(Y.name==="ConfigNotFoundError"||Y.name==="ConfigLoadError"&&S2(Y)))return(await J$.applyEnvironmentVariables(w,{},!0,!1)).config;throw Y}}try{return(await J$.loadConfig({...w,cwd:w.cwd||i$.cwd(),cache:{enabled:!0},performance:{enabled:!1}})).config}catch($){if($ instanceof Error&&($.name==="ConfigNotFoundError"||$.name==="ConfigLoadError"&&S2($)))return(await J$.applyEnvironmentVariables(w.name||"",w.defaultConfig||{},w.checkEnv!==!1,w.verbose||!1)).config;throw $}}async function pT(w,$,Y="replace"){let A=new E8;try{let X=await A.loadFromPath(w,$,{arrayStrategy:Y,useCache:!1,trackPerformance:!1});return X?X.config:null}catch{return null}}function LY(w,$,Y=!1){let A=new N8,X=w.toUpperCase().replace(/[^A-Z0-9]/g,"_");function J(U,W=[]){let Q={...U};for(let[B,j]of Object.entries(U)){let z=[...W,B],G=[`${X}_${z.join("_").toUpperCase()}`,`${X}_${z.map((q)=>q.toUpperCase()).join("")}`,`${X}_${z.map((q)=>q.replace(/([A-Z])/g,"_$1").toUpperCase()).join("")}`],K,E;for(let q of G)if(K=i$.env[q],K!==void 0){E=q;break}if(K!==void 0&&E)if(typeof j==="boolean")Q[B]=["true","1","yes"].includes(K.toLowerCase());else if(typeof j==="number"){let q=Number(K);if(!Number.isNaN(q))Q[B]=q}else if(Array.isArray(j))try{Q[B]=JSON.parse(K)}catch{Q[B]=K.split(",").map((q)=>q.trim())}else Q[B]=K;else if(j&&typeof j==="object"&&!Array.isArray(j))Q[B]=J(j,z)}return Q}return J($)}function rT(w){let $=n0(i$.cwd(),w.configDir),Y=n0(i$.cwd(),w.generatedDir),A=n0(Y,"config-types.ts");if(!tQ(F2(A)))oE(F2(A),{recursive:!0,mode:511});let X=tQ($)?eE($).map((U)=>U.replace(/\.(ts|js|mjs|cjs|mts|cts|json)$/,"")).sort():[],J=`// Generated by bunfig v${If}
163
+ `;return Y}}function mf(w,$){let Y=WG("process");if(typeof Y>"u"||!Y.env)return $;let A=Y.env[w];return A!==void 0?A:$}function XG(w,$,Y={}){return JG(w,$,Y,new WeakMap)}function JG(w,$,Y,A){let{arrayMergeMode:X="replace",skipNullish:J=!1,customMerger:U}=Y;if($===null||$===void 0)return J?w:$;if(U){let W=U(w,$);if(W!==void 0)return W}if(Array.isArray($)||Array.isArray(w))return UG(w,$,X,A);if(!zw($)||!zw(w))return $;return nf(w,$,Y,A)}function UG(w,$,Y,A){if(Array.isArray($)&&!Array.isArray(w))return $;if(Array.isArray(w)&&!Array.isArray($))return $;if(Array.isArray($)&&Array.isArray(w))switch(Y){case"replace":return $;case"concat":return gf(w,$);case"smart":return df(w,$,A);default:return $}return $}function gf(w,$){let Y=[...$];for(let A of w)if(!Y.some((X)=>eQ(X,A)))Y.push(A);return Y}function df(w,$,Y){if($.length===0)return w;if(w.length===0)return $;if(zw($[0])&&zw(w[0]))return lf(w,$,Y);if($.every((A)=>typeof A==="string")&&w.every((A)=>typeof A==="string")){let A=[...$];for(let X of w)if(!A.includes(X))A.push(X);return A}return $}function lf(w,$,Y){let A=[...$];for(let X of w){if(!zw(X)){A.push(X);continue}let J=["id","name","key","path","type"],U=!1;for(let W of J)if(W in X){if(A.find((B)=>zw(B)&&(W in B)&&B[W]===X[W])){U=!0;break}}if(!U)A.push(X)}return A}function nf(w,$,Y,A){let X=$;if(zw(X)&&A.has(X))return A.get(X);let J={...w};if(zw(X))A.set(X,J);for(let U in X){if(!Object.prototype.hasOwnProperty.call(X,U))continue;let W=X[U],Q=J[U];if(Y.skipNullish&&(W===null||W===void 0))continue;if(W===null||W===void 0){J[U]=W;continue}if(zw(W)&&zw(Q))J[U]=JG(Q,W,Y,A);else if(Array.isArray(W)||Array.isArray(Q))J[U]=UG(Q,W,Y.arrayMergeMode||"smart",A);else J[U]=W}return J}function GW(w,$,Y="replace"){return XG(w,$,{arrayMergeMode:Y==="replace"?"replace":"smart",skipNullish:!0})}function eQ(w,$){if(w===$)return!0;if(Array.isArray(w)&&Array.isArray($)){if(w.length!==$.length)return!1;for(let Y=0;Y<w.length;Y++)if(!eQ(w[Y],$[Y]))return!1;return!0}if(zw(w)&&zw($)){let Y=Object.keys(w),A=Object.keys($);if(Y.length!==A.length)return!1;for(let X of Y){if(!Object.prototype.hasOwnProperty.call($,X))return!1;if(!eQ(w[X],$[X]))return!1}return!0}return!1}function zw(w){return Boolean(w&&typeof w==="object"&&!Array.isArray(w))}class T8{extensions=[".ts",".js",".mjs",".cjs",".json",".mts",".cts"];async loadFromPath(w,$,Y={}){let{arrayStrategy:A="replace",useCache:X=!0,cacheTtl:J,trackPerformance:U=!0,verbose:W=!1}=Y;if(X){let B=m1.getWithFileCheck("file",w);if(B){if(W)console.log(`Configuration loaded from cache: ${w}`);return B}}let Q=async()=>{if(!sX(w))return null;try{let B=`?t=${Date.now()}`,j=await import(w+B),z=j.default||j,G="default"in j,K=Object.keys(j).length>0;if(!G&&!K)throw new ZY(w,Error("Configuration file is empty and exports nothing"),"unknown");if(typeof z!=="object"||z===null||Array.isArray(z))throw new ZY(w,Error("Configuration must export a valid object"),"unknown");let N={config:GW($,z,A),source:{type:"file",path:w,priority:100,timestamp:new Date}};if(X)m1.setWithFileCheck("file",N,w,J);return N}catch(B){throw B instanceof Error?M$.configLoad(w,B):M$.configLoad(w,Error(String(B)))}};if(U)return hY.track("loadFromPath",Q,{path:w});return Q()}async tryLoadFromPaths(w,$,Y={}){for(let A of w)try{let X=await this.loadFromPath(A,$,Y);if(X)return X}catch(X){if(X instanceof Error&&X.name==="ConfigLoadError")throw X;if(Y.verbose)console.warn(`Failed to load config from ${A}:`,X)}return null}generateConfigPaths(w,$,Y){let A=this.generateNamePatterns(w,Y),X=[];for(let J of A)for(let U of this.extensions)X.push(iQ($,`${J}${U}`));return X}generateNamePatterns(w,$){let Y=[];if(Y.push("config",".config"),w)Y.push(w,`.${w}.config`,`${w}.config`,`.${w}`);if($){if(Y.push($,`.${$}.config`,`${$}.config`,`.${$}`),w)Y.push(`${w}.${$}.config`,`.${w}.${$}.config`)}return Y.filter(Boolean)}checkFileAccess(w){return YG(async()=>{return sX(w)},{maxRetries:2,retryDelay:100,fallback:!1})}async discoverConfigFiles(w,$,Y){let A=[];if(!sX(w))return A;if($||Y){let X=this.generateNamePatterns($||"",Y);for(let J of X)for(let U of this.extensions){let W=iQ(w,`${J}${U}`);if(await this.checkFileAccess(W))A.push(W)}}else try{let{readdirSync:X}=await import("fs"),J=X(w);for(let U of J)if(this.looksLikeConfigFile(U)){let W=iQ(w,U);if(await this.checkFileAccess(W))A.push(W)}}catch{return[]}return A}looksLikeConfigFile(w){return[/\.config\.(ts|js|mjs|cjs|json|mts|cts)$/,/^\..*\.(ts|js|mjs|cjs|json|mts|cts)$/,/config\.(ts|js|mjs|cjs|json|mts|cts)$/].some((Y)=>Y.test(w))}async validateConfigFile(w){let $=[];try{if(!sX(w))return $.push("Configuration file does not exist"),$;let Y=await import(w),A=Y.default||Y;if(A===void 0)$.push("Configuration file must export a default value or named exports");else if(typeof A!=="object"||A===null)$.push("Configuration must be an object");else if(Array.isArray(A))$.push("Configuration cannot be an array at the root level");if(w.endsWith(".json"))try{let{readFileSync:X}=await import("fs"),J=X(w,"utf8");JSON.parse(J)}catch(X){$.push(`Invalid JSON syntax: ${X}`)}}catch(Y){$.push(`Failed to load configuration file: ${Y}`)}return $}async getFileModificationTime(w){try{let{statSync:$}=await import("fs");return $(w).mtime}catch{return null}}async preloadConfigurations(w,$={}){let Y=new Map;return await Promise.allSettled(w.map(async(A)=>{try{let X=await this.loadFromPath(A,{},$);if(X)Y.set(A,X.config)}catch(X){if($.verbose)console.warn(`Failed to preload ${A}:`,X)}})),Y}}class KW{async validateConfiguration(w,$,Y={}){let{stopOnFirstError:A=!1,validateRequired:X=!0,validateTypes:J=!0,customRules:U=[],trackPerformance:W=!0,verbose:Q=!1}=Y,B=async()=>{let j=[],z=[],G={stopOnFirstError:A,validateRequired:X,validateTypes:J,customRules:U,trackPerformance:W,verbose:Q};try{if(typeof $==="string")return await this.validateWithSchemaFile(w,$,G);else if(Array.isArray($))return this.validateWithRules(w,[...$,...U],G);else return this.validateWithJSONSchema(w,$,G)}catch(K){return j.push({path:"",message:`Validation failed: ${K}`,rule:"system"}),{isValid:!1,errors:j,warnings:z}}};if(W)return await hY.track("validateConfiguration",B);return B()}async validateWithSchemaFile(w,$,Y){try{if(!Mf($))throw new kY($,[{path:"",message:"Schema file does not exist"}]);let A=await import($),X=A.default||A;if(Array.isArray(X))return this.validateWithRules(w,X,Y);else return this.validateWithJSONSchema(w,X,Y)}catch(A){throw new kY($,[{path:"",message:`Failed to load schema: ${A}`}])}}validateWithJSONSchema(w,$,Y){let A=[],X=[];return this.validateObjectAgainstSchema(w,$,"",A,X,Y),{isValid:A.length===0,errors:A,warnings:X}}validateObjectAgainstSchema(w,$,Y,A,X,J){if(J.validateTypes&&$.type){let U=Array.isArray(w)?"array":typeof w,W=Array.isArray($.type)?$.type:[$.type];if(!W.includes(U)){if(A.push({path:Y,message:`Expected type ${W.join(" or ")}, got ${U}`,expected:W.join(" or "),actual:U,rule:"type"}),J.stopOnFirstError)return}}if($.enum&&!$.enum.includes(w)){if(A.push({path:Y,message:`Value must be one of: ${$.enum.join(", ")}`,expected:$.enum.join(", "),actual:w,rule:"enum"}),J.stopOnFirstError)return}if(typeof w==="string"){if($.minLength!==void 0&&w.length<$.minLength)A.push({path:Y,message:`String length must be at least ${$.minLength}`,expected:`>= ${$.minLength}`,actual:w.length,rule:"minLength"});if($.maxLength!==void 0&&w.length>$.maxLength)A.push({path:Y,message:`String length must not exceed ${$.maxLength}`,expected:`<= ${$.maxLength}`,actual:w.length,rule:"maxLength"});if($.pattern){if(!new RegExp($.pattern).test(w))A.push({path:Y,message:`String does not match pattern ${$.pattern}`,expected:$.pattern,actual:w,rule:"pattern"})}}if(typeof w==="number"){if($.minimum!==void 0&&w<$.minimum)A.push({path:Y,message:`Value must be at least ${$.minimum}`,expected:`>= ${$.minimum}`,actual:w,rule:"minimum"});if($.maximum!==void 0&&w>$.maximum)A.push({path:Y,message:`Value must not exceed ${$.maximum}`,expected:`<= ${$.maximum}`,actual:w,rule:"maximum"})}if(Array.isArray(w)&&$.items)for(let U=0;U<w.length;U++){let W=Y?`${Y}[${U}]`:`[${U}]`;if(this.validateObjectAgainstSchema(w[U],$.items,W,A,X,J),J.stopOnFirstError&&A.length>0)return}if(w&&typeof w==="object"&&!Array.isArray(w)){let U=w;if(J.validateRequired&&$.required){for(let W of $.required)if(!(W in U)){if(A.push({path:Y?`${Y}.${W}`:W,message:`Missing required property '${W}'`,expected:"required",rule:"required"}),J.stopOnFirstError)return}}if($.properties){for(let[W,Q]of Object.entries($.properties))if(W in U){let B=Y?`${Y}.${W}`:W;if(this.validateObjectAgainstSchema(U[W],Q,B,A,X,J),J.stopOnFirstError&&A.length>0)return}}if($.additionalProperties===!1){let W=new Set(Object.keys($.properties||{}));for(let Q of Object.keys(U))if(!W.has(Q))X.push({path:Y?`${Y}.${Q}`:Q,message:`Additional property '${Q}' is not allowed`,rule:"additionalProperties"})}}}validateWithRules(w,$,Y){let A=[],X=[];for(let J of $)try{let U=this.getValueByPath(w,J.path),W=this.validateWithRule(U,J,J.path);if(A.push(...W),Y.stopOnFirstError&&A.length>0)break}catch(U){A.push({path:J.path,message:`Rule validation failed: ${U}`,rule:"system"})}return{isValid:A.length===0,errors:A,warnings:X}}validateWithRule(w,$,Y){let A=[];if($.required&&(w===void 0||w===null))return A.push({path:Y,message:$.message||`Property '${Y}' is required`,expected:"required",rule:"required"}),A;if(w===void 0||w===null)return A;if($.type){let X=Array.isArray(w)?"array":typeof w;if(X!==$.type)A.push({path:Y,message:$.message||`Expected type ${$.type}, got ${X}`,expected:$.type,actual:X,rule:"type"})}if($.min!==void 0){let X=Array.isArray(w)?w.length:typeof w==="string"?w.length:typeof w==="number"?w:0;if(X<$.min)A.push({path:Y,message:$.message||`Value must be at least ${$.min}`,expected:`>= ${$.min}`,actual:X,rule:"min"})}if($.max!==void 0){let X=Array.isArray(w)?w.length:typeof w==="string"?w.length:typeof w==="number"?w:0;if(X>$.max)A.push({path:Y,message:$.message||`Value must not exceed ${$.max}`,expected:`<= ${$.max}`,actual:X,rule:"max"})}if($.pattern&&typeof w==="string"){if(!$.pattern.test(w))A.push({path:Y,message:$.message||`Value does not match pattern ${$.pattern}`,expected:$.pattern.toString(),actual:w,rule:"pattern"})}if($.enum&&!$.enum.includes(w))A.push({path:Y,message:$.message||`Value must be one of: ${$.enum.join(", ")}`,expected:$.enum.join(", "),actual:w,rule:"enum"});if($.validator){let X=$.validator(w);if(X)A.push({path:Y,message:$.message||X,rule:"custom"})}return A}getValueByPath(w,$){if(!$)return w;let Y=$.split("."),A=w;for(let X of Y)if(A&&typeof A==="object"&&X in A)A=A[X];else return;return A}generateRulesFromInterface(w){let $=[],Y=w.matchAll(/(\w+)(\?)?:\s*(\w+)/g);for(let A of Y){let[,X,J,U]=A;$.push({path:X,required:!J,type:this.mapTypeScriptType(U)})}return $}mapTypeScriptType(w){switch(w.toLowerCase()){case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"array":return"array";case"object":return"object";default:return"object"}}static createCommonRules(){return{server:[{path:"port",required:!0,type:"number",min:1,max:65535},{path:"host",required:!0,type:"string",min:1},{path:"ssl",type:"boolean"}],database:[{path:"url",required:!0,type:"string",min:1},{path:"pool",type:"number",min:1,max:100},{path:"timeout",type:"number",min:0}],api:[{path:"baseUrl",required:!0,type:"string",pattern:KG},{path:"timeout",type:"number",min:0},{path:"retries",type:"number",min:0,max:10}]}}}class FW{fileLoader=new T8;envProcessor=new f8;validator=new KW;async loadConfig(w){let $=Date.now(),{cache:Y,performance:A,schema:X,validate:J,...U}=w;try{if(Y?.enabled){let Q=this.checkCache(U.name||"",U);if(Q)return Q}let W;try{W=await this.loadConfigurationStrategies(U,!0,Y)}catch(Q){let B=U.__strictErrorHandling;if(Q instanceof Error&&Q.name==="ConfigNotFoundError"){if(B)throw Q;W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`No configuration file found for "${U.name||"config"}", using defaults with environment variables`]}}else if(Q instanceof Error&&Q.name==="ConfigLoadError"){let j=Q.message.includes("EACCES")||Q.message.includes("EPERM")||Q.message.includes("permission denied"),z=!j&&(Q.message.includes("syntax")||Q.message.includes("Expected")||Q.message.includes("Unexpected")||Q.message.includes("BuildMessage")||Q.message.includes("errors building")),G=Q.message.includes("Configuration must export a valid object")||Q.message.includes("Configuration file is empty and exports nothing");if(B&&(G||j))throw Q;if(z&&(!B||!G))W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:["Configuration file has syntax errors, using defaults with environment variables"]};else if(!B)W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`Configuration loading error, using defaults: ${Q.message}`]};else throw Q}else W={...await this.applyEnvironmentVariables(U.name||"",U.defaultConfig,U.checkEnv!==!1,U.verbose||!1),warnings:[`Configuration loading failed, using defaults: ${Q instanceof Error?Q.message:String(Q)}`]}}if(X||J)await this.validateConfiguration(W.config,X,J,U.name);if(Y?.enabled&&W)this.cacheResult(U.name||"",W,Y,U);if(A?.enabled){let Q={operation:"loadConfig",duration:Date.now()-$,configName:U.name,timestamp:new Date};if(A.onMetrics)A.onMetrics(Q);if(A.slowThreshold&&Q.duration>A.slowThreshold)Mw.warn(`Slow configuration loading detected: ${Q.duration}ms for ${U.name}`);W.metrics=Q}return W}catch(W){let Q=Date.now()-$;throw Mw.error(`Configuration loading failed after ${Q}ms:`,[W instanceof Error?W:Error(String(W))]),W}}async loadConfigurationStrategies(w,$=!1,Y){let{name:A="",alias:X,cwd:J,configDir:U,defaultConfig:W,checkEnv:Q=!0,arrayStrategy:B="replace",verbose:j=!1}=w,z=J||g$.cwd(),G=[],K=await this.loadLocalConfiguration(A,X,z,U,W,B,j,Q,Y);if(K)return G.push(...this.getLocalSearchPaths(A,X,z,U)),this.finalizeResult(K,G,Q,A,j);let E=await this.loadHomeConfiguration(A,X,W,B,j,Q);if(E)return G.push(...this.getHomeSearchPaths(A,X)),this.finalizeResult(E,G,Q,A,j);let q=await this.loadPackageJsonConfiguration(A,X,z,W,B,j,Q);if(q)return G.push(n0(z,"package.json")),this.finalizeResult(q,G,Q,A,j);if(G.push(...this.getAllSearchPaths(A,X,z,U)),$)throw M$.configNotFound(A,G,X);return{...await this.applyEnvironmentVariables(A,W,Q,j),warnings:[`No configuration file found for "${A}"${X?` or alias "${X}"`:""}, using defaults with environment variables`]}}async loadLocalConfiguration(w,$,Y,A,X,J,U,W,Q){let B=W?_Y(w,X,U):X,j=this.getLocalDirectories(Y,A);for(let z of j){if(U)Mw.info(`Searching for configuration in: ${z}`);let G=this.fileLoader.generateConfigPaths(w,z,$),K=await this.fileLoader.tryLoadFromPaths(G,B,{arrayStrategy:J,verbose:U,cacheTtl:Q?.ttl,useCache:!Q?.ttl||Q.ttl>100});if(K){if(U)Mw.success(`Configuration loaded from: ${K.source.path}`);return K}}return null}async loadHomeConfiguration(w,$,Y,A,X,J){if(!w)return null;let U=J?_Y(w,Y,X):Y,W=[n0(k1(),".config",w),n0(k1(),".config"),k1()];for(let Q of W){if(X)Mw.info(`Checking home directory: ${Q}`);let B=this.fileLoader.generateConfigPaths(w,Q,$),j=await this.fileLoader.tryLoadFromPaths(B,U,{arrayStrategy:A,verbose:X});if(j){if(X)Mw.success(`Configuration loaded from home directory: ${j.source.path}`);return j}}return null}async loadPackageJsonConfiguration(w,$,Y,A,X,J,U){let W=U?_Y(w,A,J):A;try{let Q=n0(Y,"package.json");if(!sQ(Q))return null;let B=await import(Q),j=B[w],z=w;if(!j&&$)j=B[$],z=$;if(j&&typeof j==="object"&&!Array.isArray(j)){if(J)Mw.success(`Configuration loaded from package.json: ${z}`);return{config:GW(W,j,X),source:{type:"package.json",path:Q,priority:30,timestamp:new Date}}}}catch(Q){if(J)Mw.warn("Failed to load package.json:",[Q instanceof Error?Q:Error(String(Q))])}return null}async applyEnvironmentVariables(w,$,Y,A){if(!Y||!w||typeof $!=="object"||$===null||Array.isArray($))return{config:$,source:{type:"default",priority:10,timestamp:new Date}};return{config:_Y(w,$,A),source:{type:"environment",priority:20,timestamp:new Date}}}async finalizeResult(w,$,Y,A,X){return{config:w.config,source:w.source,path:w.source.path}}async validateConfiguration(w,$,Y,A){let X=[];if(Y){let J=Y(w);if(J)X.push(...J)}if($){let J=await this.validator.validateConfiguration(w,$);if(!J.isValid)X.push(...J.errors.map((U)=>U.path?`${U.path}: ${U.message}`:U.message))}if(X.length>0)throw M$.configValidation(A||"unknown",X,A)}checkCache(w,$){let Y=this.generateCacheKey(w,$);return m1.get(Y)||null}cacheResult(w,$,Y,A){let X=this.generateCacheKey(w,A);m1.set(X,$,void 0,Y.ttl)}generateCacheKey(w,$){let Y=[w];if($.alias)Y.push(`alias:${$.alias}`);if($.cwd)Y.push(`cwd:${$.cwd}`);if($.configDir)Y.push(`configDir:${$.configDir}`);if("checkEnv"in $)Y.push(`checkEnv:${$.checkEnv}`);return Y.join("|")}getLocalDirectories(w,$){return Array.from(new Set([w,n0(w,"config"),n0(w,".config"),$?n0(w,$):void 0].filter(Boolean)))}getAllSearchPaths(w,$,Y,A){let X=[];return X.push(...this.getLocalSearchPaths(w,$,Y,A)),X.push(...this.getHomeSearchPaths(w,$)),X.push(n0(Y,"package.json")),X}getLocalSearchPaths(w,$,Y,A){let X=this.getLocalDirectories(Y,A),J=[];for(let U of X)J.push(...this.fileLoader.generateConfigPaths(w,U,$));return J}getHomeSearchPaths(w,$){if(!w)return[];let Y=[n0(k1(),".config",w),n0(k1(),".config"),k1()],A=[];for(let X of Y)A.push(...this.fileLoader.generateConfigPaths(w,X,$));return A}async loadConfigWithResult(w){return this.loadConfig(w)}}function Z2(w){let Y=!(w.message.includes("EACCES")||w.message.includes("EPERM")||w.message.includes("permission denied"))&&(w.message.includes("syntax")||w.message.includes("Expected")||w.message.includes("Unexpected")||w.message.includes("BuildMessage")),A=w.message.includes("Configuration must export a valid object")||w.message.includes("Configuration file is empty and exports nothing");return Y||A}async function pf(w){return J$.loadConfig({...w,__strictErrorHandling:!0})}async function QG(w){let $="defaultConfig"in w&&w.defaultConfig!==void 0?w.defaultConfig:{},Y="cache"in w||"performance"in w||"schema"in w||"validate"in w;try{let A;if(Y)A=await J$.loadConfig(w);else A=await J$.loadConfig({...w,defaultConfig:$,cache:{enabled:!0},performance:{enabled:!1}});return A?.config??$}catch(A){let X=A instanceof Error?A.name:"UnknownError",J=A instanceof Error?A.message:String(A);if(!(X==="ConfigNotFoundError"||X==="ConfigLoadError"||X==="ConfigValidationError"||J.includes("config"))&&w.verbose)Mw.warn("Unexpected error loading config, using defaults:",[A instanceof Error?A:Error(String(A))]);let W=Y?{...w,defaultConfig:$}:{...w,defaultConfig:$,cache:{enabled:!0},performance:{enabled:!1}};if("checkEnv"in w?w.checkEnv!==!1:!0)return(await J$.applyEnvironmentVariables(W.name||"",$,!0,W.verbose||!1))?.config??$;return $}}async function rf(w={defaultConfig:{}}){if(typeof w==="string"){let{cwd:$}=await import("process");try{return(await J$.loadConfig({name:w,cwd:$(),generatedDir:"./generated",configDir:"./config",defaultConfig:{},checkEnv:!0,arrayStrategy:"replace"})).config}catch(Y){if(Y instanceof Error&&(Y.name==="ConfigNotFoundError"||Y.name==="ConfigLoadError"&&Z2(Y)))return(await J$.applyEnvironmentVariables(w,{},!0,!1)).config;throw Y}}try{return(await J$.loadConfig({...w,cwd:w.cwd||g$.cwd(),cache:{enabled:!0},performance:{enabled:!1}})).config}catch($){if($ instanceof Error&&($.name==="ConfigNotFoundError"||$.name==="ConfigLoadError"&&Z2($)))return(await J$.applyEnvironmentVariables(w.name||"",w.defaultConfig||{},w.checkEnv!==!1,w.verbose||!1)).config;throw $}}async function tf(w,$,Y="replace"){let A=new T8;try{let X=await A.loadFromPath(w,$,{arrayStrategy:Y,useCache:!1,trackPerformance:!1});return X?X.config:null}catch{return null}}function _Y(w,$,Y=!1){let A=new f8,X=w.toUpperCase().replace(/[^A-Z0-9]/g,"_");function J(U,W=[]){let Q={...U};for(let[B,j]of Object.entries(U)){let z=[...W,B],G=[`${X}_${z.join("_").toUpperCase()}`,`${X}_${z.map((q)=>q.toUpperCase()).join("")}`,`${X}_${z.map((q)=>q.replace(/([A-Z])/g,"_$1").toUpperCase()).join("")}`],K,E;for(let q of G)if(K=g$.env[q],K!==void 0){E=q;break}if(K!==void 0&&E)if(typeof j==="boolean")Q[B]=["true","1","yes"].includes(K.toLowerCase());else if(typeof j==="number"){let q=Number(K);if(!Number.isNaN(q))Q[B]=q}else if(Array.isArray(j))try{Q[B]=JSON.parse(K)}catch{Q[B]=K.split(",").map((q)=>q.trim())}else Q[B]=K;else if(j&&typeof j==="object"&&!Array.isArray(j))Q[B]=J(j,z)}return Q}return J($)}function af(w){let $=n0(g$.cwd(),w.configDir),Y=n0(g$.cwd(),w.generatedDir),A=n0(Y,"config-types.ts");if(!sQ(q2(A)))eE(q2(A),{recursive:!0,mode:511});let X=sQ($)?wf($).map((U)=>U.replace(/\.(ts|js|mjs|cjs|mts|cts|json)$/,"")).sort():[],J=`// Generated by bunfig v${CT}
164
164
  export type ConfigNames = ${X.length?`'${X.join("' | '")}'`:"string"}
165
- `;wT(A,J,{mode:438})}function tT(w){let $=null,Y=null,A=()=>{if(!Y)Y=UG(w).then((J)=>{return $=J,J},(J)=>{let U="defaultConfig"in w?w.defaultConfig:{};if($=U,"verbose"in w&&w.verbose)Mw.warn("Config loading failed, using defaults:",[J instanceof Error?J:Error(String(J))]);return U});return Y},X="defaultConfig"in w?w.defaultConfig:{};return $=X,A(),new Proxy({},{get(J,U){if($)return $[U];let W=X[U];return A(),W},has(J,U){return U in($||X)},ownKeys(){return Object.keys($||X)},getOwnPropertyDescriptor(J,U){return Object.getOwnPropertyDescriptor($||X,U)},set(J,U,W){if(!$)$={...X};return $[U]=W,!0}})}function aT(w){let $=_2(VT.cwd(),w?.configDir||"./config");function Y(){if(!MT($))return[];let X=new Set([".ts",".js",".mjs",".cjs",".mts",".cts",".json"]),J=[".ts",".mts",".cts",".js",".mjs",".cjs",".json"],U=IT($).filter((Q)=>X.has(vQ(Q))).map((Q)=>({base:Q.replace(/\.(?:ts|js|mjs|cjs|mts|cts|json)$/i,""),file:Q})),W=new Map;for(let{base:Q,file:B}of U){let j=vQ(B).toLowerCase(),z=W.get(Q);if(!z){W.set(Q,B);continue}let G=vQ(z).toLowerCase();if(J.indexOf(j)<J.indexOf(G))W.set(Q,B)}return Array.from(W.entries()).map(([Q,B])=>({base:Q,file:B})).sort((Q,B)=>Q.base.localeCompare(B.base))}function A(){let X=Y(),J=X.map((B)=>B.base),U=J.length?J.map((B)=>`'${B}'`).join(" | "):"string",W=X.length?`{
166
- ${X.map((B)=>{let j=_2($,B.file).replace(/\\/g,"/");return` '${B.base}': typeof import('${j}').default`}).join(`,
165
+ `;$f(A,J,{mode:438})}function sf(w){let $=null,Y=null,A=()=>{if(!Y)Y=QG(w).then((J)=>{return $=J,J},(J)=>{let U="defaultConfig"in w?w.defaultConfig:{};if($=U,"verbose"in w&&w.verbose)Mw.warn("Config loading failed, using defaults:",[J instanceof Error?J:Error(String(J))]);return U});return Y},X="defaultConfig"in w?w.defaultConfig:{};return $=X,A(),new Proxy({},{get(J,U){if($)return $[U];let W=X[U];return A(),W},has(J,U){return U in($||X)},ownKeys(){return Object.keys($||X)},getOwnPropertyDescriptor(J,U){return Object.getOwnPropertyDescriptor($||X,U)},set(J,U,W){if(!$)$={...X};return $[U]=W,!0}})}function of(w){let $=S2(Cf.cwd(),w?.configDir||"./config");function Y(){if(!If($))return[];let X=new Set([".ts",".js",".mjs",".cjs",".mts",".cts",".json"]),J=[".ts",".mts",".cts",".js",".mjs",".cjs",".json"],U=Vf($).filter((Q)=>X.has(mQ(Q))).map((Q)=>({base:Q.replace(/\.(?:ts|js|mjs|cjs|mts|cts|json)$/i,""),file:Q})),W=new Map;for(let{base:Q,file:B}of U){let j=mQ(B).toLowerCase(),z=W.get(Q);if(!z){W.set(Q,B);continue}let G=mQ(z).toLowerCase();if(J.indexOf(j)<J.indexOf(G))W.set(Q,B)}return Array.from(W.entries()).map(([Q,B])=>({base:Q,file:B})).sort((Q,B)=>Q.base.localeCompare(B.base))}function A(){let X=Y(),J=X.map((B)=>B.base),U=J.length?J.map((B)=>`'${B}'`).join(" | "):"string",W=X.length?`{
166
+ ${X.map((B)=>{let j=S2($,B.file).replace(/\\/g,"/");return` '${B.base}': typeof import('${j}').default`}).join(`,
167
167
  `)}
168
168
  }`:"Record<string, any>";return`export type ConfigNames = ${U}
169
169
  export type ConfigByName = ${W}
170
170
  export type Config<N extends ConfigNames> = N extends keyof ConfigByName ? ConfigByName[N] : unknown
171
171
  export type ConfigOf = Config
172
- `}return{name:"bunfig-plugin",setup(X){X.onResolve({filter:/^virtual:bunfig-types$/},(J)=>{return{path:J.path,namespace:"bunfig-virtual"}}),X.onLoad({filter:/^virtual:bunfig-types$/,namespace:"bunfig-virtual"},()=>{return{contents:A(),loader:"ts"}})}}}function Of(w,$={}){let Y=F8.cwd();while(Y.includes("storage"))Y=i2(Y,"..");let A=i2(Y,w||"");if($?.relative)return yf(F8.cwd(),A);return A}function M0(){if(X$.env.NODE_ENV==="test"||X$.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function uf(){if(X$.env.NODE_ENV==="test"||X$.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof X$<"u"){let w=X$.type;if(w==="renderer"||w==="worker")return!1;return!!(X$.versions&&(X$.versions.node||X$.versions.bun))}return!1}class NG{async format(w){let $=await uf(),Y=await this.getMetadata($);return JSON.stringify({timestamp:w.timestamp.toISOString(),level:w.level,name:w.name,message:w.message,metadata:Y})}async getMetadata(w){if(w){let{hostname:$}=await import("os");return{pid:v1.pid,hostname:$(),environment:v1.env.NODE_ENV||"development",platform:v1.platform,version:v1.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:v1.env.NODE_ENV||v1.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}class m${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(w,$={}){this.name=w,this.config={...q8},this.options=this.normalizeOptions($),this.formatter=this.options.formatter||new NG,this.enabled=$.enabled??!0,this.fancy=$.fancy??!0,this.tagFormat=$.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=$.timestampPosition??"right",this.environment=$.environment??P.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig($);let Y={...$},A=$.timestamp!==void 0;if(A)delete Y.timestamp;if(this.config={...this.config,...Y,timestamp:A||this.config.timestamp,level:this.options.level??"info"},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let X=this.generateKeyId(),J=this.generateKey();this.currentKeyId=X,this.keys.set(X,J),this.encryptionKeys.set(X,{key:J,createdAt:new Date}),this.setupKeyRotation()}}shouldActivateFingersCrossed(w){if(!this.fingersCrossedConfig)return!1;let $={debug:0,info:1,success:2,warning:3,error:4},Y=this.fingersCrossedConfig.activationLevel??"error";return $[w]>=$[Y]}initializeFingersCrossedConfig(w){if(!w.fingersCrossedEnabled&&w.fingersCrossed)return{...rQ,...w.fingersCrossed};if(!w.fingersCrossedEnabled)return null;if(!w.fingersCrossed)return{...rQ};return{...rQ,...w.fingersCrossed}}normalizeOptions(w){let $={format:"json",level:"info",logDirectory:q8.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,showIcons:!0,formatter:void 0},Y={...$,...Object.fromEntries(Object.entries(w).filter(([,A])=>A!==void 0))};if(!Y.level||!["debug","info","success","warning","error"].includes(Y.level))Y.level=$.level;return Y}shouldWriteToFile(){return!M0()&&this.config.writeToFile===!0}async writeToFile(w){let Y=(async()=>{let X,J=0,U=3,W=1000;while(J<U)try{try{try{await hf(this.config.logDirectory,l2.F_OK|l2.W_OK)}catch(B){if(B instanceof Error&&"code"in B)if(B.code==="ENOENT")await Df(this.config.logDirectory,{recursive:!0,mode:493});else if(B.code==="EACCES")throw Error(`No write permission for log directory: ${this.config.logDirectory}`);else throw B;else throw B}}catch(B){throw console.error("Debug: [writeToFile] Failed to create log directory:",B),B}let Q=this.validateEncryptionConfig()?(await this.encrypt(w)).encrypted:$$.from(w);try{if(!sX(this.currentLogFile))await pQ(this.currentLogFile,"",{mode:420});if(X=d2(this.currentLogFile,"a",420),kf(X,Q,{flag:"a"}),g2(X),X!==void 0)nQ(X),X=void 0;if((await u1(this.currentLogFile)).size===0){if(await pQ(this.currentLogFile,Q,{flag:"w",mode:420}),(await u1(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(B){let j=B;if(j.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(j.code)){if(J<U-1){let z=typeof j.message==="string"?j.message:"Unknown error";console.error(`Network error during write attempt ${J+1}/${U}:`,z);let G=W*2**J;await new Promise((K)=>setTimeout(K,G)),J++;continue}}if(j?.code&&["ENOSPC","EDQUOT"].includes(j.code))throw Error(`Disk quota exceeded or no space left on device: ${j.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",j),j}finally{if(X!==void 0)try{nQ(X)}catch(B){console.error("Debug: [writeToFile] Error closing file descriptor:",B)}}}catch(Q){if(J===U-1){let j=Q,z=typeof j.message==="string"?j.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",z),Q}J++;let B=W*2**(J-1);await new Promise((j)=>setTimeout(j,B))}})();this.pendingOperations.push(Y);let A=this.pendingOperations.length-1;try{await Y}catch(X){throw console.error("Debug: [writeToFile] Error in operation:",X),X}finally{this.pendingOperations.splice(A,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 c1(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 c1(this.config.logDirectory,`${this.name}.log`);let w=new Date().toISOString().split("T")[0];return c1(this.config.logDirectory,`${this.name}-${w}.log`)}setupRotation(){if(M0())return;if(!this.shouldWriteToFile())return;if(typeof this.config.rotation==="boolean")return;let w=this.config.rotation,$;switch(w.frequency){case"daily":$=86400000;break;case"weekly":$=604800000;break;case"monthly":$=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},$)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let $=this.config.rotation.keyRotation;if(!$?.enabled)return;let Y=typeof $.interval==="number"?$.interval:60,A=Math.max(Y,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((X)=>{console.error("Error rotating keys:",X)})},A)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let $=this.config.rotation.keyRotation,Y=this.generateKeyId(),A=this.generateKey();this.currentKeyId=Y,this.keys.set(Y,A),this.encryptionKeys.set(Y,{key:A,createdAt:new Date});let X=Array.from(this.encryptionKeys.entries()).sort(([,W],[,Q])=>Q.createdAt.getTime()-W.createdAt.getTime()),J=typeof $.maxKeys==="number"?$.maxKeys:1,U=Math.max(1,J);if(X.length>U)for(let[W]of X.slice(U))this.encryptionKeys.delete(W),this.keys.delete(W)}generateKeyId(){return lQ(16).toString("hex")}generateKey(){return lQ(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let w=this.keys.get(this.currentKeyId);if(!w)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:w,id:this.currentKeyId}}encrypt(w){let{key:$}=this.getCurrentKey(),Y=lQ(16),A=_f("aes-256-gcm",$,Y),X=$$.isBuffer(w)?w:$$.from(w,"utf8"),J=A.update(X),U=A.final(),W=J.length+U.length,Q=A.getAuthTag(),B=$$.allocUnsafe(16+W+16);return Y.copy(B,0),J.copy(B,16),U.copy(B,16+J.length),Q.copy(B,16+W),{encrypted:B,iv:Y}}async compressData(w){return new Promise(($,Y)=>{let A=p2(),X=[];A.on("data",(J)=>X.push(J)),A.on("end",()=>$($$.from($$.concat(X)))),A.on("error",Y),A.write(w),A.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let w={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let $=this.config.rotation.encrypt;return{...w,...$}}return w}async rotateLog(){if(M0())return;if(!this.shouldWriteToFile())return;let w=await u1(this.currentLogFile).catch(()=>null);if(!w)return;let $=this.config.rotation;if(typeof $==="boolean")return;if($.maxSize&&w.size>=$.maxSize){let Y=this.currentLogFile,A=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let X=await oX(this.config.logDirectory),J=X.filter((Q)=>Q.startsWith(this.name)&&/\.log\.\d+$/.test(Q)).sort((Q,B)=>{let j=Number.parseInt(Q.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(B.match(/\.log\.(\d+)$/)?.[1]||"0")-j}),U=J.length>0?Number.parseInt(J[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,W=`${Y}.${U}`;if(await u1(Y).catch(()=>null))try{if(await n2(Y,W),$.compress)try{let Q=`${W}.gz`;await this.compressLogFile(W,Q),await eX(W)}catch(Q){console.error("Error compressing rotated file:",Q)}if(J.length===0&&!X.some((Q)=>Q.endsWith(".log.1")))try{let Q=`${Y}.1`;await pQ(Q,"")}catch(Q){console.error("Error creating backup file:",Q)}}catch(Q){console.error(`Error during rotation: ${Q instanceof Error?Q.message:String(Q)}`)}}else{let X=new Date().toISOString().replace(/[:.]/g,"-"),J=Y.replace(/\.log$/,`-${X}.log`);if(await u1(Y).catch(()=>null))await n2(Y,J)}if(this.currentLogFile=A,$.maxFiles){let J=(await oX(this.config.logDirectory)).filter((U)=>U.startsWith(this.name)).sort((U,W)=>W.localeCompare(U));for(let U of J.slice($.maxFiles))await eX(c1(this.config.logDirectory,U))}}}async compressLogFile(w,$){let Y=m2(w),A=Zf($),X=p2();await bf(Y,X,A)}async handleFingersCrossedBuffer(w,$){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(w)&&!this.isActivated){this.isActivated=!0;for(let Y of this.logBuffer){let A=await this.formatter.format(Y);if(this.shouldWriteToFile())await this.writeToFile(A);console.log(A)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated){if(this.shouldWriteToFile())await this.writeToFile($);console.log($)}}shouldLog(w){if(!this.enabled)return!1;let $={debug:0,info:1,success:2,warning:3,error:4};return $[w]>=$[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((w)=>{if(w instanceof Promise)return w.catch(($)=>{console.error("Error in pending write operation:",$)});return Promise.resolve()})),sX(this.currentLogFile))try{let w=d2(this.currentLogFile,"r+");g2(w),nQ(w)}catch(w){console.error(`Error flushing file: ${w}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let w of this.pendingOperations)if(typeof w.cancel==="function")w.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(w){console.error("Error waiting for pending operations:",w)}if(!M0()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let $=(await oX(this.config.logDirectory)).filter((Y)=>(Y.includes("temp")||Y.includes(".tmp"))&&Y.includes(this.name));for(let Y of $)try{await eX(c1(this.config.logDirectory,Y))}catch(A){console.error(`Failed to delete temp file ${Y}:`,A)}}catch(w){console.error("Error cleaning up temporary files:",w)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(w){if(!w)return"";return`${this.tagFormat.prefix}${w}${this.tagFormat.suffix}`}formatFileTimestamp(w){return`[${w.toISOString()}]`}formatConsoleTimestamp(w){return this.shouldStyleConsole()?g.gray(w.toLocaleTimeString()):w.toLocaleTimeString()}shouldStyleConsole(){if(!this.fancy||M0())return!1;let w=typeof P.env.NO_COLOR<"u",$=P.env.FORCE_COLOR==="0";if(w||$)return!1;return!!(typeof P.stderr<"u"&&P.stderr.isTTY||typeof P.stdout<"u"&&P.stdout.isTTY)}formatConsoleMessage(w){let{timestamp:$,icon:Y="",tag:A="",message:X,level:J,showTimestamp:U=!0}=w,W=(K)=>K.replace(this.ANSI_PATTERN,"");if(!this.fancy){let K=[];if(U)K.push($);if(J==="warning")K.push("WARN");else if(J==="error")K.push("ERROR");else if(Y)K.push(Y.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(A)K.push(A.replace(/[[\]]/g,""));return K.push(X),K.join(" ")}let Q=P.stdout.columns||120,B="";if(J==="warning"||J==="error")B=`${Y} ${X}`;else if(J==="info"||J==="success")B=`${Y} ${A} ${X}`;else B=`${Y} ${A} ${g.cyan(X)}`;if(!U)return B.trim();let j=W(B).trim().length,z=W($).length,G=Math.max(1,Q-2-j-z);return`${B.trim()}${" ".repeat(G)}${$}`}formatMessage(w,$){if($.length===1&&Array.isArray($[0]))return w.replace(/\{(\d+)\}/g,(J,U)=>{let W=Number.parseInt(U,10);return W<$[0].length?String($[0][W]):J});let Y=/%([sdijfo%])/g,A=0,X=w.replace(Y,(J,U)=>{if(U==="%")return"%";if(A>=$.length)return J;let W=$[A++];switch(U){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 J}});if(A<$.length)X+=` ${$.slice(A).map((J)=>typeof J==="object"?JSON.stringify(J,null,2):String(J)).join(" ")}`;return X}formatMarkdown(w){if(!w)return w;let $=w;return $=$.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(Y,A,X)=>{let J=g.underline(g.blue(A)),U=this.toAbsoluteFilePath(X);if(U&&this.shouldStyleConsole()&&this.supportsHyperlinks()){let W=`file://${encodeURI(U)}`,Q="\x1B]8;;",B="\x1B\\";return`\x1B]8;;${W}\x1B\\${J}\x1B]8;;\x1B\\`}if(this.shouldStyleConsole()&&this.supportsHyperlinks())return`\x1B]8;;${X}\x1B\\${J}\x1B]8;;\x1B\\`;return J}),$=$.replace(/`([^`]+)`/g,(Y,A)=>g.bgGray(A)),$=$.replace(/\*\*([^*]+)\*\*/g,(Y,A)=>g.bold(A)),$=$.replace(/(?<!\*)\*([^*]+)\*(?!\*)/g,(Y,A)=>g.italic(A)),$=$.replace(/(?<!_)_([^_]+)_(?!_)/g,(Y,A)=>g.italic(A)),$=$.replace(/~([^~]+)~/g,(Y,A)=>g.strikethrough(A)),$}supportsHyperlinks(){if(M0())return!1;let w=P.env;if(!w)return!1;if(w.TERM_PROGRAM==="iTerm.app"||w.TERM_PROGRAM==="vscode"||w.TERM_PROGRAM==="WezTerm")return!0;if(w.WT_SESSION)return!0;if(w.TERM==="xterm-kitty")return!0;let $=w.VTE_VERSION?Number.parseInt(w.VTE_VERSION,10):0;if(!Number.isNaN($)&&$>=5000)return!0;return!1}toAbsoluteFilePath(w){try{let $=w;if($.startsWith("file://"))$=$.replace(/^file:\/\//,"");if($.startsWith("~")){let Y=P.env.HOME||"";if(Y)$=$.replace(/^~(?=$|\/)/,Y)}if(xf($)||$.startsWith("./")||$.startsWith("../"))$=Pf($);else return null;return sX($)?$:null}catch{return null}}buildOutputTexts(w){let $=this.shouldStyleConsole()?this.formatMarkdown(w):w,Y=w.replace(this.ANSI_PATTERN,"");return{consoleText:$,fileText:Y}}async log(w,$,...Y){if(!this.shouldLog(w))return;let A=new Date,X=this.formatConsoleTimestamp(A),J=this.formatFileTimestamp(A),U,W;if($ instanceof Error)U=$.message,W=$.stack;else U=this.formatMessage($,Y);let{consoleText:Q,fileText:B}=this.buildOutputTexts(U);if(this.shouldStyleConsole()){let z=this.options.showIcons===!1?"":df[w],G=this.options.showTags!==!1&&this.name?g.gray(this.formatTag(this.name)):"",K;switch(w){case"debug":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:g.gray(Q),level:w}),console.error(K);break;case"info":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.warn(K);break;case"success":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:g.green(Q),level:w}),console.error(K);break;case"warning":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.warn(K);break;case"error":if(K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.error(K),W){let E=W.split(`
172
+ `}return{name:"bunfig-plugin",setup(X){X.onResolve({filter:/^virtual:bunfig-types$/},(J)=>{return{path:J.path,namespace:"bunfig-virtual"}}),X.onLoad({filter:/^virtual:bunfig-types$/,namespace:"bunfig-virtual"},()=>{return{contents:A(),loader:"ts"}})}}}function _T(w,$={}){let Y=N8.cwd();while(Y.includes("storage"))Y=m2(Y,"..");let A=m2(Y,w||"");if($?.relative)return LT(N8.cwd(),A);return A}function M0(){if(X$.env.NODE_ENV==="test"||X$.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function vT(){if(X$.env.NODE_ENV==="test"||X$.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof X$<"u"){let w=X$.type;if(w==="renderer"||w==="worker")return!1;return!!(X$.versions&&(X$.versions.node||X$.versions.bun))}return!1}class EG{async format(w){let $=await vT(),Y=await this.getMetadata($);return JSON.stringify({timestamp:w.timestamp.toISOString(),level:w.level,name:w.name,message:w.message,metadata:Y})}async getMetadata(w){if(w){let{hostname:$}=await import("os");return{pid:i1.pid,hostname:$(),environment:i1.env.NODE_ENV||"development",platform:i1.platform,version:i1.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:i1.env.NODE_ENV||i1.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}class d${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(w,$={}){this.name=w,this.config={...E8},this.options=this.normalizeOptions($),this.formatter=this.options.formatter||new EG,this.enabled=$.enabled??!0,this.fancy=$.fancy??!0,this.tagFormat=$.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=$.timestampPosition??"right",this.environment=$.environment??P.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig($);let Y={...$},A=$.timestamp!==void 0;if(A)delete Y.timestamp;if(this.config={...this.config,...Y,timestamp:A||this.config.timestamp,level:this.options.level??"info"},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let X=this.generateKeyId(),J=this.generateKey();this.currentKeyId=X,this.keys.set(X,J),this.encryptionKeys.set(X,{key:J,createdAt:new Date}),this.setupKeyRotation()}}shouldActivateFingersCrossed(w){if(!this.fingersCrossedConfig)return!1;let $={debug:0,info:1,success:2,warning:3,error:4},Y=this.fingersCrossedConfig.activationLevel??"error";return $[w]>=$[Y]}initializeFingersCrossedConfig(w){if(!w.fingersCrossedEnabled&&w.fingersCrossed)return{...aQ,...w.fingersCrossed};if(!w.fingersCrossedEnabled)return null;if(!w.fingersCrossed)return{...aQ};return{...aQ,...w.fingersCrossed}}normalizeOptions(w){let $={format:"json",level:"info",logDirectory:E8.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,showIcons:!0,formatter:void 0},Y={...$,...Object.fromEntries(Object.entries(w).filter(([,A])=>A!==void 0))};if(!Y.level||!["debug","info","success","warning","error"].includes(Y.level))Y.level=$.level;return Y}shouldWriteToFile(){return!M0()&&this.config.writeToFile===!0}async writeToFile(w){let Y=(async()=>{let X,J=0,U=3,W=1000;while(J<U)try{try{try{await xT(this.config.logDirectory,n2.F_OK|n2.W_OK)}catch(B){if(B instanceof Error&&"code"in B)if(B.code==="ENOENT")await PT(this.config.logDirectory,{recursive:!0,mode:493});else if(B.code==="EACCES")throw Error(`No write permission for log directory: ${this.config.logDirectory}`);else throw B;else throw B}}catch(B){throw console.error("Debug: [writeToFile] Failed to create log directory:",B),B}let Q=this.validateEncryptionConfig()?(await this.encrypt(w)).encrypted:$$.from(w);try{if(!eX(this.currentLogFile))await tQ(this.currentLogFile,"",{mode:420});if(X=l2(this.currentLogFile,"a",420),DT(X,Q,{flag:"a"}),d2(X),X!==void 0)rQ(X),X=void 0;if((await c1(this.currentLogFile)).size===0){if(await tQ(this.currentLogFile,Q,{flag:"w",mode:420}),(await c1(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(B){let j=B;if(j.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(j.code)){if(J<U-1){let z=typeof j.message==="string"?j.message:"Unknown error";console.error(`Network error during write attempt ${J+1}/${U}:`,z);let G=W*2**J;await new Promise((K)=>setTimeout(K,G)),J++;continue}}if(j?.code&&["ENOSPC","EDQUOT"].includes(j.code))throw Error(`Disk quota exceeded or no space left on device: ${j.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",j),j}finally{if(X!==void 0)try{rQ(X)}catch(B){console.error("Debug: [writeToFile] Error closing file descriptor:",B)}}}catch(Q){if(J===U-1){let j=Q,z=typeof j.message==="string"?j.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",z),Q}J++;let B=W*2**(J-1);await new Promise((j)=>setTimeout(j,B))}})();this.pendingOperations.push(Y);let A=this.pendingOperations.length-1;try{await Y}catch(X){throw console.error("Debug: [writeToFile] Error in operation:",X),X}finally{this.pendingOperations.splice(A,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 v1(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 v1(this.config.logDirectory,`${this.name}.log`);let w=new Date().toISOString().split("T")[0];return v1(this.config.logDirectory,`${this.name}-${w}.log`)}setupRotation(){if(M0())return;if(!this.shouldWriteToFile())return;if(typeof this.config.rotation==="boolean")return;let w=this.config.rotation,$;switch(w.frequency){case"daily":$=86400000;break;case"weekly":$=604800000;break;case"monthly":$=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},$)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let $=this.config.rotation.keyRotation;if(!$?.enabled)return;let Y=typeof $.interval==="number"?$.interval:60,A=Math.max(Y,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((X)=>{console.error("Error rotating keys:",X)})},A)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let $=this.config.rotation.keyRotation,Y=this.generateKeyId(),A=this.generateKey();this.currentKeyId=Y,this.keys.set(Y,A),this.encryptionKeys.set(Y,{key:A,createdAt:new Date});let X=Array.from(this.encryptionKeys.entries()).sort(([,W],[,Q])=>Q.createdAt.getTime()-W.createdAt.getTime()),J=typeof $.maxKeys==="number"?$.maxKeys:1,U=Math.max(1,J);if(X.length>U)for(let[W]of X.slice(U))this.encryptionKeys.delete(W),this.keys.delete(W)}generateKeyId(){return pQ(16).toString("hex")}generateKey(){return pQ(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let w=this.keys.get(this.currentKeyId);if(!w)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:w,id:this.currentKeyId}}encrypt(w){let{key:$}=this.getCurrentKey(),Y=pQ(16),A=ZT("aes-256-gcm",$,Y),X=$$.isBuffer(w)?w:$$.from(w,"utf8"),J=A.update(X),U=A.final(),W=J.length+U.length,Q=A.getAuthTag(),B=$$.allocUnsafe(16+W+16);return Y.copy(B,0),J.copy(B,16),U.copy(B,16+J.length),Q.copy(B,16+W),{encrypted:B,iv:Y}}async compressData(w){return new Promise(($,Y)=>{let A=r2(),X=[];A.on("data",(J)=>X.push(J)),A.on("end",()=>$($$.from($$.concat(X)))),A.on("error",Y),A.write(w),A.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let w={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let $=this.config.rotation.encrypt;return{...w,...$}}return w}async rotateLog(){if(M0())return;if(!this.shouldWriteToFile())return;let w=await c1(this.currentLogFile).catch(()=>null);if(!w)return;let $=this.config.rotation;if(typeof $==="boolean")return;if($.maxSize&&w.size>=$.maxSize){let Y=this.currentLogFile,A=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let X=await w8(this.config.logDirectory),J=X.filter((Q)=>Q.startsWith(this.name)&&/\.log\.\d+$/.test(Q)).sort((Q,B)=>{let j=Number.parseInt(Q.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(B.match(/\.log\.(\d+)$/)?.[1]||"0")-j}),U=J.length>0?Number.parseInt(J[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,W=`${Y}.${U}`;if(await c1(Y).catch(()=>null))try{if(await p2(Y,W),$.compress)try{let Q=`${W}.gz`;await this.compressLogFile(W,Q),await $8(W)}catch(Q){console.error("Error compressing rotated file:",Q)}if(J.length===0&&!X.some((Q)=>Q.endsWith(".log.1")))try{let Q=`${Y}.1`;await tQ(Q,"")}catch(Q){console.error("Error creating backup file:",Q)}}catch(Q){console.error(`Error during rotation: ${Q instanceof Error?Q.message:String(Q)}`)}}else{let X=new Date().toISOString().replace(/[:.]/g,"-"),J=Y.replace(/\.log$/,`-${X}.log`);if(await c1(Y).catch(()=>null))await p2(Y,J)}if(this.currentLogFile=A,$.maxFiles){let J=(await w8(this.config.logDirectory)).filter((U)=>U.startsWith(this.name)).sort((U,W)=>W.localeCompare(U));for(let U of J.slice($.maxFiles))await $8(v1(this.config.logDirectory,U))}}}async compressLogFile(w,$){let Y=g2(w),A=hT($),X=r2();await cT(Y,X,A)}async handleFingersCrossedBuffer(w,$){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(w)&&!this.isActivated){this.isActivated=!0;for(let Y of this.logBuffer){let A=await this.formatter.format(Y);if(this.shouldWriteToFile())await this.writeToFile(A);console.log(A)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated){if(this.shouldWriteToFile())await this.writeToFile($);console.log($)}}shouldLog(w){if(!this.enabled)return!1;let $={debug:0,info:1,success:2,warning:3,error:4};return $[w]>=$[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((w)=>{if(w instanceof Promise)return w.catch(($)=>{console.error("Error in pending write operation:",$)});return Promise.resolve()})),eX(this.currentLogFile))try{let w=l2(this.currentLogFile,"r+");d2(w),rQ(w)}catch(w){console.error(`Error flushing file: ${w}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let w of this.pendingOperations)if(typeof w.cancel==="function")w.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(w){console.error("Error waiting for pending operations:",w)}if(!M0()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let $=(await w8(this.config.logDirectory)).filter((Y)=>(Y.includes("temp")||Y.includes(".tmp"))&&Y.includes(this.name));for(let Y of $)try{await $8(v1(this.config.logDirectory,Y))}catch(A){console.error(`Failed to delete temp file ${Y}:`,A)}}catch(w){console.error("Error cleaning up temporary files:",w)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(w){if(!w)return"";return`${this.tagFormat.prefix}${w}${this.tagFormat.suffix}`}formatFileTimestamp(w){return`[${w.toISOString()}]`}formatConsoleTimestamp(w){return this.shouldStyleConsole()?g.gray(w.toLocaleTimeString()):w.toLocaleTimeString()}shouldStyleConsole(){if(!this.fancy||M0())return!1;let w=typeof P.env.NO_COLOR<"u",$=P.env.FORCE_COLOR==="0";if(w||$)return!1;return!!(typeof P.stderr<"u"&&P.stderr.isTTY||typeof P.stdout<"u"&&P.stdout.isTTY)}formatConsoleMessage(w){let{timestamp:$,icon:Y="",tag:A="",message:X,level:J,showTimestamp:U=!0}=w,W=(K)=>K.replace(this.ANSI_PATTERN,"");if(!this.fancy){let K=[];if(U)K.push($);if(J==="warning")K.push("WARN");else if(J==="error")K.push("ERROR");else if(Y)K.push(Y.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(A)K.push(A.replace(/[[\]]/g,""));return K.push(X),K.join(" ")}let Q=P.stdout.columns||120,B="";if(J==="warning"||J==="error")B=`${Y} ${X}`;else if(J==="info"||J==="success")B=`${Y} ${A} ${X}`;else B=`${Y} ${A} ${g.cyan(X)}`;if(!U)return B.trim();let j=W(B).trim().length,z=W($).length,G=Math.max(1,Q-2-j-z);return`${B.trim()}${" ".repeat(G)}${$}`}formatMessage(w,$){if($.length===1&&Array.isArray($[0]))return w.replace(/\{(\d+)\}/g,(J,U)=>{let W=Number.parseInt(U,10);return W<$[0].length?String($[0][W]):J});let Y=/%([sdijfo%])/g,A=0,X=w.replace(Y,(J,U)=>{if(U==="%")return"%";if(A>=$.length)return J;let W=$[A++];switch(U){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 J}});if(A<$.length)X+=` ${$.slice(A).map((J)=>typeof J==="object"?JSON.stringify(J,null,2):String(J)).join(" ")}`;return X}formatMarkdown(w){if(!w)return w;let $=w;return $=$.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(Y,A,X)=>{let J=g.underline(g.blue(A)),U=this.toAbsoluteFilePath(X);if(U&&this.shouldStyleConsole()&&this.supportsHyperlinks()){let W=`file://${encodeURI(U)}`,Q="\x1B]8;;",B="\x1B\\";return`\x1B]8;;${W}\x1B\\${J}\x1B]8;;\x1B\\`}if(this.shouldStyleConsole()&&this.supportsHyperlinks())return`\x1B]8;;${X}\x1B\\${J}\x1B]8;;\x1B\\`;return J}),$=$.replace(/`([^`]+)`/g,(Y,A)=>g.bgGray(A)),$=$.replace(/\*\*([^*]+)\*\*/g,(Y,A)=>g.bold(A)),$=$.replace(/(?<!\*)\*([^*]+)\*(?!\*)/g,(Y,A)=>g.italic(A)),$=$.replace(/(?<!_)_([^_]+)_(?!_)/g,(Y,A)=>g.italic(A)),$=$.replace(/~([^~]+)~/g,(Y,A)=>g.strikethrough(A)),$}supportsHyperlinks(){if(M0())return!1;let w=P.env;if(!w)return!1;if(w.TERM_PROGRAM==="iTerm.app"||w.TERM_PROGRAM==="vscode"||w.TERM_PROGRAM==="WezTerm")return!0;if(w.WT_SESSION)return!0;if(w.TERM==="xterm-kitty")return!0;let $=w.VTE_VERSION?Number.parseInt(w.VTE_VERSION,10):0;if(!Number.isNaN($)&&$>=5000)return!0;return!1}toAbsoluteFilePath(w){try{let $=w;if($.startsWith("file://"))$=$.replace(/^file:\/\//,"");if($.startsWith("~")){let Y=P.env.HOME||"";if(Y)$=$.replace(/^~(?=$|\/)/,Y)}if(bT($)||$.startsWith("./")||$.startsWith("../"))$=uT($);else return null;return eX($)?$:null}catch{return null}}buildOutputTexts(w){let $=this.shouldStyleConsole()?this.formatMarkdown(w):w,Y=w.replace(this.ANSI_PATTERN,"");return{consoleText:$,fileText:Y}}async log(w,$,...Y){if(!this.shouldLog(w))return;let A=new Date,X=this.formatConsoleTimestamp(A),J=this.formatFileTimestamp(A),U,W;if($ instanceof Error)U=$.message,W=$.stack;else U=this.formatMessage($,Y);let{consoleText:Q,fileText:B}=this.buildOutputTexts(U);if(this.shouldStyleConsole()){let z=this.options.showIcons===!1?"":lT[w],G=this.options.showTags!==!1&&this.name?g.gray(this.formatTag(this.name)):"",K;switch(w){case"debug":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:g.gray(Q),level:w}),console.error(K);break;case"info":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.warn(K);break;case"success":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:g.green(Q),level:w}),console.error(K);break;case"warning":K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.warn(K);break;case"error":if(K=this.formatConsoleMessage({timestamp:X,icon:z,tag:G,message:Q,level:w}),console.error(K),W){let E=W.split(`
173
173
  `);for(let q of E)if(q.trim()&&!q.includes(U))console.error(this.formatConsoleMessage({timestamp:X,message:g.gray(` ${q}`),level:w,showTimestamp:!1}))}break}}else if(!M0()){if(console.error(`${J} ${this.environment}.${w.toUpperCase()}: ${U}`),W)console.error(W)}let j=`${J} ${this.environment}.${w.toUpperCase()}: ${B}
174
174
  `;if(W)j+=`${W}
175
175
  `;if(j=j.replace(this.ANSI_PATTERN,""),this.shouldWriteToFile())await this.writeToFile(j)}progress(w,$=""){let Y={update:(W,Q)=>{},finish:(W)=>{},interrupt:(W,Q)=>{}};if(!this.enabled)return Y;let A=30;if(this.activeProgressBar={total:Math.max(1,w||1),current:0,message:$||"",barLength:A,lastRenderedLine:""},this.shouldStyleConsole()&&!M0()&&P.stdout.isTTY)this.renderProgressBar(this.activeProgressBar);return{update:(W,Q)=>{if(!this.enabled||!this.activeProgressBar)return;if(this.activeProgressBar.current=Math.min(Math.max(0,W),this.activeProgressBar.total),Q!==void 0)this.activeProgressBar.message=Q;if(this.shouldStyleConsole()&&!M0()&&P.stdout.isTTY)this.renderProgressBar(this.activeProgressBar)},finish:(W)=>{if(!this.activeProgressBar)return;this.finishProgressBar(this.activeProgressBar,W)},interrupt:(W,Q="info")=>{if(!M0()&&P.stdout.isTTY)P.stdout.write(`
176
176
  `);if(this[Q==="warning"?"warn":Q](W),this.activeProgressBar&&this.shouldStyleConsole()&&!M0()&&P.stdout.isTTY)this.renderProgressBar(this.activeProgressBar)}}}time(w){let $=performance.now();if(this.shouldStyleConsole()){let Y=this.options.showTags!==!1&&this.name?g.gray(this.formatTag(this.name)):"",A=this.formatConsoleTimestamp(new Date);console.error(this.formatConsoleMessage({timestamp:A,icon:this.options.showIcons===!1?"":g.blue("◐"),tag:Y,message:`${g.cyan(w)}...`}))}return async(Y)=>{if(!this.enabled)return;let A=performance.now(),X=Math.round(A-$),J=`${w} completed in ${X}ms`,U=new Date,W=this.formatConsoleTimestamp(U),B=`${this.formatFileTimestamp(U)} ${this.environment}.INFO: ${J}`;if(Y)B+=` ${JSON.stringify(Y)}`;if(B+=`
177
- `,B=B.replace(this.ANSI_PATTERN,""),this.shouldStyleConsole()){let j=this.options.showTags!==!1&&this.name?g.gray(this.formatTag(this.name)):"";console.error(this.formatConsoleMessage({timestamp:W,icon:this.options.showIcons===!1?"":g.green("✓"),tag:j,message:`${J}${Y?` ${JSON.stringify(Y)}`:""}`}))}else if(!M0())console.error(B.trim());if(this.shouldWriteToFile())await this.writeToFile(B)}}async debug(w,...$){await this.log("debug",w,...$)}async info(w,...$){await this.log("info",w,...$)}async success(w,...$){await this.log("success",w,...$)}async warn(w,...$){await this.log("warning",w,...$)}async error(w,...$){await this.log("error",w,...$)}validateEncryptionConfig(){if(!this.config.rotation)return!1;if(typeof this.config.rotation==="boolean")return!1;let w=this.config.rotation,{encrypt:$}=w;return!!$}async only(w){if(!this.enabled)return;return await w()}isEnabled(){return this.enabled}setEnabled(w){this.enabled=w}extend(w){let $=`${this.name}:${w}`,Y=new m$($,{...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(Y),Y}createReadStream(){if(M0())throw Error("createReadStream is not supported in browser environments");if(!sX(this.currentLogFile))throw Error(`Log file does not exist: ${this.currentLogFile}`);return m2(this.currentLogFile,{encoding:"utf8"})}async decrypt(w){if(!this.validateEncryptionConfig())throw Error("Encryption is not configured");let $=this.config.rotation;if(!$.encrypt||typeof $.encrypt==="boolean")throw Error("Invalid encryption configuration");if(!this.currentKeyId||!this.keys.has(this.currentKeyId))throw Error("No valid encryption key available");let Y=this.keys.get(this.currentKeyId);try{let A=$$.isBuffer(w)?w:$$.from(w,"base64"),X=A.subarray(0,16),J=A.subarray(A.length-16),U=A.subarray(16,A.length-16),W=Sf("aes-256-gcm",Y,X);W.setAuthTag(J);let Q=W.update(U),B=W.final(),j=Q.length+B.length,z=$$.allocUnsafe(j);return Q.copy(z,0),B.copy(z,Q.length),z.toString("utf8")}catch(A){throw Error(`Decryption failed: ${A instanceof Error?A.message:String(A)}`)}}getLevel(){return this.config.level}getLogDirectory(){return this.config.logDirectory}getFormat(){return this.config.format}getRotationConfig(){return this.config.rotation}isBrowserMode(){return M0()}isServerMode(){return!M0()}setTestEncryptionKey(w,$){this.currentKeyId=w,this.keys.set(w,$)}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(w){if(!this.enabled)return;let $=new Date,Y=this.formatConsoleTimestamp($),A=this.formatFileTimestamp($),{consoleText:X,fileText:J}=this.buildOutputTexts(w);if(this.shouldStyleConsole()){let W=X.split(`
177
+ `,B=B.replace(this.ANSI_PATTERN,""),this.shouldStyleConsole()){let j=this.options.showTags!==!1&&this.name?g.gray(this.formatTag(this.name)):"";console.error(this.formatConsoleMessage({timestamp:W,icon:this.options.showIcons===!1?"":g.green("✓"),tag:j,message:`${J}${Y?` ${JSON.stringify(Y)}`:""}`}))}else if(!M0())console.error(B.trim());if(this.shouldWriteToFile())await this.writeToFile(B)}}async debug(w,...$){await this.log("debug",w,...$)}async info(w,...$){await this.log("info",w,...$)}async success(w,...$){await this.log("success",w,...$)}async warn(w,...$){await this.log("warning",w,...$)}async error(w,...$){await this.log("error",w,...$)}validateEncryptionConfig(){if(!this.config.rotation)return!1;if(typeof this.config.rotation==="boolean")return!1;let w=this.config.rotation,{encrypt:$}=w;return!!$}async only(w){if(!this.enabled)return;return await w()}isEnabled(){return this.enabled}setEnabled(w){this.enabled=w}extend(w){let $=`${this.name}:${w}`,Y=new d$($,{...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(Y),Y}createReadStream(){if(M0())throw Error("createReadStream is not supported in browser environments");if(!eX(this.currentLogFile))throw Error(`Log file does not exist: ${this.currentLogFile}`);return g2(this.currentLogFile,{encoding:"utf8"})}async decrypt(w){if(!this.validateEncryptionConfig())throw Error("Encryption is not configured");let $=this.config.rotation;if(!$.encrypt||typeof $.encrypt==="boolean")throw Error("Invalid encryption configuration");if(!this.currentKeyId||!this.keys.has(this.currentKeyId))throw Error("No valid encryption key available");let Y=this.keys.get(this.currentKeyId);try{let A=$$.isBuffer(w)?w:$$.from(w,"base64"),X=A.subarray(0,16),J=A.subarray(A.length-16),U=A.subarray(16,A.length-16),W=kT("aes-256-gcm",Y,X);W.setAuthTag(J);let Q=W.update(U),B=W.final(),j=Q.length+B.length,z=$$.allocUnsafe(j);return Q.copy(z,0),B.copy(z,Q.length),z.toString("utf8")}catch(A){throw Error(`Decryption failed: ${A instanceof Error?A.message:String(A)}`)}}getLevel(){return this.config.level}getLogDirectory(){return this.config.logDirectory}getFormat(){return this.config.format}getRotationConfig(){return this.config.rotation}isBrowserMode(){return M0()}isServerMode(){return!M0()}setTestEncryptionKey(w,$){this.currentKeyId=w,this.keys.set(w,$)}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(w){if(!this.enabled)return;let $=new Date,Y=this.formatConsoleTimestamp($),A=this.formatFileTimestamp($),{consoleText:X,fileText:J}=this.buildOutputTexts(w);if(this.shouldStyleConsole()){let W=X.split(`
178
178
  `),Q=Math.max(...W.map((G)=>G.length))+2,B=`┌${"─".repeat(Q)}┐`,j=`└${"─".repeat(Q)}┘`,z=W.map((G)=>{return this.formatConsoleMessage({timestamp:Y,message:g.cyan(G),showTimestamp:!1})});console.error(this.formatConsoleMessage({timestamp:Y,message:g.cyan(B),showTimestamp:!1})),z.forEach((G)=>console.error(G)),console.error(this.formatConsoleMessage({timestamp:Y,message:g.cyan(j),showTimestamp:!1}))}else if(!M0())console.error(`${A} ${this.environment}.INFO: [BOX] ${J}`);let U=`${A} ${this.environment}.INFO: [BOX] ${J}
179
179
  `.replace(this.ANSI_PATTERN,"");if(this.shouldWriteToFile())await this.writeToFile(U)}async prompt(w){if(M0())return Promise.resolve(!0);return new Promise(($)=>{console.error(`${g.cyan("?")} ${w} (y/n) `);let Y=(A)=>{let X=A.toString().trim().toLowerCase();P.stdin.removeListener("data",Y);try{if(typeof P.stdin.setRawMode==="function")P.stdin.setRawMode(!1)}catch{}P.stdin.pause(),console.error(""),$(X==="y"||X==="yes")};try{if(typeof P.stdin.setRawMode==="function")P.stdin.setRawMode(!0)}catch{}P.stdin.resume(),P.stdin.once("data",Y)})}setFancy(w){this.fancy=w}isFancy(){return this.fancy}pause(){this.enabled=!1}resume(){this.enabled=!0}async start(w,...$){if(!this.enabled)return;let Y=w;if($&&$.length>0){let Q=/%([sdijfo%])/g,B=0;if(Y=w.replace(Q,(j,z)=>{if(z==="%")return"%";if(B>=$.length)return j;let G=$[B++];switch(z){case"s":return String(G);case"d":case"i":return Number(G).toString();case"j":case"o":return JSON.stringify(G,null,2);default:return j}}),B<$.length)Y+=` ${$.slice(B).map((j)=>typeof j==="object"?JSON.stringify(j,null,2):String(j)).join(" ")}`}let{consoleText:A,fileText:X}=this.buildOutputTexts(Y);if(this.shouldStyleConsole()){let Q=this.options.showTags!==!1&&this.name?g.gray(this.formatTag(this.name)):"",B=this.options.showIcons===!1?"":`${g.blue("◐")} `;console.error(`${B}${Q} ${g.cyan(A)}`)}let W=`[${new Date().toISOString()}] ${this.environment}.INFO: [START] ${X}
180
180
  `.replace(this.ANSI_PATTERN,"");if(this.shouldWriteToFile())await this.writeToFile(W)}renderProgressBar(w,$=!1){if(!this.enabled||!this.shouldStyleConsole()||!P.stdout.isTTY)return;let Y=Math.min(100,Math.max(0,Math.round(w.current/w.total*100))),A=Math.round(w.barLength*Y/100),X=w.barLength-A,J=g.green("━".repeat(A)),U=g.gray("━".repeat(X)),W=`[${J}${U}]`,Q=`${Y}%`.padStart(4),B=w.message?` ${w.message}`:"",j=this.options.showIcons===!1?"":$||Y===100?g.green("✓"):g.blue("▶"),z=this.options.showTags!==!1&&this.name?` ${g.gray(this.formatTag(this.name))}`:"",G=`\r${j}${z} ${W} ${Q}${B}`,K=P.stdout.columns||80,E=" ".repeat(Math.max(0,K-G.replace(this.ANSI_PATTERN,"").length));if(w.lastRenderedLine=`${G}${E}`,P.stdout.write(w.lastRenderedLine),$)P.stdout.write(`
181
- `)}finishProgressBar(w,$){if(!this.enabled||!this.fancy||M0()||!P.stdout.isTTY){this.activeProgressBar=null;return}if(w.current<w.total)w.current=w.total;if($)w.message=$;this.renderProgressBar(w,!0),this.activeProgressBar=null}async clear(w={}){if(M0()){console.warn("Log clearing is not supported in browser environments.");return}try{console.warn("Clearing logs...",this.config.logDirectory);let $=await oX(this.config.logDirectory),Y=[];for(let A of $){if(!(w.name?new RegExp(w.name.replace("*",".*")).test(A):A.startsWith(this.name))||!A.endsWith(".log"))continue;let J=c1(this.config.logDirectory,A);if(w.before)try{if((await u1(J)).mtime>=w.before)continue}catch(U){console.error(`Failed to get stats for file ${J}:`,U);continue}Y.push(J)}if(Y.length===0){console.warn("No log files matched the criteria for clearing.");return}console.warn(`Preparing to delete ${Y.length} log file(s)...`);for(let A of Y)try{await eX(A),console.warn(`Deleted log file: ${A}`)}catch(X){console.error(`Failed to delete log file ${A}:`,X)}console.warn("Log clearing process finished.")}catch($){console.error("Error during log clearing process:",$)}}}var pE,rE=(w)=>w,aE=(w,$)=>{for(var Y in $)pE(w,Y,{get:$[Y],enumerable:!0,configurable:!0,set:tE.bind($,Y)})},sE=(w,$)=>()=>(w&&($=w(w=0)),$),a2,QG,i1,kY,WG,sT,oT,Z2,$8,oQ,D0,o,eT,k2,wf,h2,$f,Yf,iQ,Af,D2,x2,mQ,Xf,Jf,Uf,Qf,Y8,BG,Wf,x0,Bf,jf,P2,A8,eQ,R0,v,zf,b2,Gf,u2,Kf,Ff,gQ,qf,c2,v2,Nf,dQ,Ef,Tf,ff,Hf,Rf,X8,jG,Mf,If="0.15.6",Yw,G8,SY,wW,$W,K8,YW,AW,ZY,XW,JW,M$,zG,GG,Mw,J$,KG,FG,Vf,Lf,qG,q8,BO,C0,g,HO,cf,RO,vf,MO,IO,r2,VO,mf,gf,CO,t2,yO,OO,LO,_O,SO,rQ,df,ZO;var KW=t(()=>{pE=Object.defineProperty;a2={};aE(a2,{withErrorRecovery:()=>$G,tryLoadConfig:()=>pT,loadConfigWithResult:()=>lT,loadConfig:()=>UG,isRetryableError:()=>cT,isConfigNotFoundError:()=>uT,isBunfigError:()=>YG,globalPerformanceMonitor:()=>kY,globalCache:()=>i1,getEnvOrDefault:()=>vT,generateConfigTypes:()=>rT,defaultGeneratedDir:()=>FG,defaultConfigDir:()=>KG,deepMergeWithArrayStrategy:()=>jW,deepMerge:()=>AG,createLibraryConfig:()=>tT,config:()=>nT,bunfigPlugin:()=>aT,applyEnvVarsToConfig:()=>LY,TypeGenerationError:()=>AW,SchemaValidationError:()=>ZY,PluginError:()=>JW,PerformanceMonitor:()=>QW,FileSystemError:()=>YW,ErrorFactory:()=>M$,EnvVarError:()=>K8,EnvProcessor:()=>N8,ConfigValidator:()=>zW,ConfigValidationError:()=>wW,ConfigNotFoundError:()=>G8,ConfigMergeError:()=>$W,ConfigLoader:()=>GW,ConfigLoadError:()=>SY,ConfigFileLoader:()=>E8,ConfigCache:()=>UW,CacheUtils:()=>WG,BunfigError:()=>Yw,BrowserConfigError:()=>XW,ArrayMergeStrategies:()=>zG});Vf=sE(async()=>{QG=import.meta.require,i1=new UW,kY=new QW,WG={createKey:CT,isEquivalent:yT,estimateMemoryUsage:OT},sT=Q8(aQ.cwd(),"config"),oT=Q8(aQ.cwd(),"src/generated"),Z2=U8.env.CLARITY_LOG_DIR||AT(ST(),"logs"),$8={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:Z2,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1},oQ=await ZT(),D0={red:(w)=>`\x1B[31m${w}\x1B[0m`,green:(w)=>`\x1B[32m${w}\x1B[0m`,yellow:(w)=>`\x1B[33m${w}\x1B[0m`,blue:(w)=>`\x1B[34m${w}\x1B[0m`,magenta:(w)=>`\x1B[35m${w}\x1B[0m`,cyan:(w)=>`\x1B[36m${w}\x1B[0m`,white:(w)=>`\x1B[37m${w}\x1B[0m`,gray:(w)=>`\x1B[90m${w}\x1B[0m`,bgRed:(w)=>`\x1B[41m${w}\x1B[0m`,bgYellow:(w)=>`\x1B[43m${w}\x1B[0m`,bold:(w)=>`\x1B[1m${w}\x1B[0m`,dim:(w)=>`\x1B[2m${w}\x1B[0m`,italic:(w)=>`\x1B[3m${w}\x1B[0m`,underline:(w)=>`\x1B[4m${w}\x1B[0m`,reset:"\x1B[0m"},o=D0,eT=D0.red,k2=D0.green,wf=D0.yellow,h2=D0.blue,$f=D0.magenta,Yf=D0.cyan,iQ=D0.white,Af=D0.gray,D2=D0.bgRed,x2=D0.bgYellow,mQ=D0.bold,Xf=D0.dim,Jf=D0.italic,Uf=D0.underline,Qf=D0.reset,Y8={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},BG={debug:"\uD83D\uDD0D",info:h2("ℹ"),success:k2("✓"),warning:x2(iQ(mQ(" WARN "))),error:D2(iQ(mQ(" ERROR ")))},Wf=new B8("stacks"),x0=new B8("bunfig",{showTags:!0}),Bf=l0(_Y.cwd(),"config"),jf=l0(_Y.cwd(),"src/generated"),P2=J8.env.CLARITY_LOG_DIR||$T(xT(),"logs"),A8={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:P2,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1,writeToFile:!1},eQ=await PT(),R0={red:(w)=>`\x1B[31m${w}\x1B[0m`,green:(w)=>`\x1B[32m${w}\x1B[0m`,yellow:(w)=>`\x1B[33m${w}\x1B[0m`,blue:(w)=>`\x1B[34m${w}\x1B[0m`,magenta:(w)=>`\x1B[35m${w}\x1B[0m`,cyan:(w)=>`\x1B[36m${w}\x1B[0m`,white:(w)=>`\x1B[37m${w}\x1B[0m`,gray:(w)=>`\x1B[90m${w}\x1B[0m`,bgRed:(w)=>`\x1B[41m${w}\x1B[0m`,bgYellow:(w)=>`\x1B[43m${w}\x1B[0m`,bgGray:(w)=>`\x1B[100m${w}\x1B[0m`,bold:(w)=>`\x1B[1m${w}\x1B[0m`,dim:(w)=>`\x1B[2m${w}\x1B[0m`,italic:(w)=>`\x1B[3m${w}\x1B[0m`,underline:(w)=>`\x1B[4m${w}\x1B[0m`,strikethrough:(w)=>`\x1B[9m${w}\x1B[0m`,reset:"\x1B[0m"},v=R0,zf=R0.red,b2=R0.green,Gf=R0.yellow,u2=R0.blue,Kf=R0.magenta,Ff=R0.cyan,gQ=R0.white,qf=R0.gray,c2=R0.bgRed,v2=R0.bgYellow,Nf=R0.bgGray,dQ=R0.bold,Ef=R0.dim,Tf=R0.italic,ff=R0.underline,Hf=R0.strikethrough,Rf=R0.reset,X8={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},jG={debug:"\uD83D\uDD0D",info:u2("ℹ"),success:b2("✓"),warning:v2(gQ(dQ(" WARN "))),error:c2(gQ(dQ(" ERROR ")))},Mf=new z8("stacks"),Yw=class extends Error{timestamp;context;constructor($,Y={}){super($);if(this.name=this.constructor.name,this.timestamp=new Date,this.context=Y,Error.captureStackTrace)Error.captureStackTrace(this,this.constructor)}toJSON(){return{name:this.name,code:this.code,message:this.message,timestamp:this.timestamp.toISOString(),context:this.context,stack:this.stack}}toString(){let $=Object.keys(this.context).length>0?` (${Object.entries(this.context).map(([Y,A])=>`${Y}: ${A}`).join(", ")})`:"";return`${this.name} [${this.code}]: ${this.message}${$}`}},G8=class extends Yw{code="CONFIG_NOT_FOUND";constructor($,Y,A){let X=A?` or alias "${A}"`:"";super(`Configuration "${$}"${X} not found`,{configName:$,alias:A,searchPaths:Y,searchPathCount:Y.length})}},SY=class extends Yw{code="CONFIG_LOAD_ERROR";constructor($,Y,A){super(`Failed to load configuration from "${$}": ${Y.message}`,{configPath:$,configName:A,originalError:Y.name,originalMessage:Y.message});this.cause=Y}},wW=class extends Yw{code="CONFIG_VALIDATION_ERROR";constructor($,Y,A){super(`Configuration validation failed for "${$}"`,{configPath:$,configName:A,validationErrors:Y,errorCount:Y.length})}},$W=class extends Yw{code="CONFIG_MERGE_ERROR";constructor($,Y,A,X){super(`Failed to merge configuration from "${$}" with "${Y}": ${A.message}`,{sourcePath:$,targetPath:Y,configName:X,originalError:A.name,originalMessage:A.message});this.cause=A}},K8=class extends Yw{code="ENV_VAR_ERROR";constructor($,Y,A,X){super(`Failed to parse environment variable "${$}" with value "${Y}" as ${A}`,{envKey:$,envValue:Y,expectedType:A,configName:X})}},YW=class extends Yw{code="FILE_SYSTEM_ERROR";constructor($,Y,A){super(`File system ${$} failed for "${Y}": ${A.message}`,{operation:$,path:Y,originalError:A.name,originalMessage:A.message});this.cause=A}},AW=class extends Yw{code="TYPE_GENERATION_ERROR";constructor($,Y,A){super(`Failed to generate types from "${$}" to "${Y}": ${A.message}`,{configDir:$,outputPath:Y,originalError:A.name,originalMessage:A.message});this.cause=A}},ZY=class extends Yw{code="SCHEMA_VALIDATION_ERROR";constructor($,Y,A){super(`Schema validation failed${A?` for config "${A}"`:""}`,{schemaPath:$,configName:A,validationErrors:Y,errorCount:Y.length})}},XW=class extends Yw{code="BROWSER_CONFIG_ERROR";constructor($,Y,A,X){super(`Failed to fetch configuration from "${$}": ${Y} ${A}`,{endpoint:$,status:Y,statusText:A,configName:X})}},JW=class extends Yw{code="PLUGIN_ERROR";constructor($,Y,A){super(`Plugin "${$}" failed during ${Y}: ${A.message}`,{pluginName:$,operation:Y,originalError:A.name,originalMessage:A.message});this.cause=A}},M$={configNotFound(w,$,Y){return new G8(w,$,Y)},configLoad(w,$,Y){return new SY(w,$,Y)},configValidation(w,$,Y){return new wW(w,$,Y)},configMerge(w,$,Y,A){return new $W(w,$,Y,A)},envVar(w,$,Y,A){return new K8(w,$,Y,A)},fileSystem(w,$,Y){return new YW(w,$,Y)},typeGeneration(w,$,Y){return new AW(w,$,Y)},schemaValidation(w,$,Y){return new ZY(w,$,Y)},browserConfig(w,$,Y,A){return new XW(w,$,Y,A)},plugin(w,$,Y){return new JW(w,$,Y)}},zG={replace:"replace",concat:"concat",smart:"smart"},GG=/^https?:\/\//,Mw=new z8("bunfig",{showTags:!0}),J$=new GW,KG=n0(i$.cwd(),"config"),FG=n0(i$.cwd(),"src/generated")});Lf=F8.env.CLARITY_LOG_DIR||Cf(Of(),"logs"),qG={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:Lf,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1,writeToFile:!1},q8={...qG},BO=(async()=>{try{let{loadConfig:w}=await Vf().then(()=>a2),$=await w({name:"clarity",alias:"logging",defaultConfig:qG,cwd:F8.cwd()});if($)Object.assign(q8,$)}catch{}return q8})();C0={red:(w)=>`\x1B[31m${w}\x1B[0m`,green:(w)=>`\x1B[32m${w}\x1B[0m`,yellow:(w)=>`\x1B[33m${w}\x1B[0m`,blue:(w)=>`\x1B[34m${w}\x1B[0m`,magenta:(w)=>`\x1B[35m${w}\x1B[0m`,cyan:(w)=>`\x1B[36m${w}\x1B[0m`,white:(w)=>`\x1B[37m${w}\x1B[0m`,gray:(w)=>`\x1B[90m${w}\x1B[0m`,bgRed:(w)=>`\x1B[41m${w}\x1B[0m`,bgYellow:(w)=>`\x1B[43m${w}\x1B[0m`,bgGray:(w)=>`\x1B[100m${w}\x1B[0m`,bold:(w)=>`\x1B[1m${w}\x1B[0m`,dim:(w)=>`\x1B[2m${w}\x1B[0m`,italic:(w)=>`\x1B[3m${w}\x1B[0m`,underline:(w)=>`\x1B[4m${w}\x1B[0m`,strikethrough:(w)=>`\x1B[9m${w}\x1B[0m`,reset:"\x1B[0m"},g=C0,HO=C0.red,cf=C0.green,RO=C0.yellow,vf=C0.blue,MO=C0.magenta,IO=C0.cyan,r2=C0.white,VO=C0.gray,mf=C0.bgRed,gf=C0.bgYellow,CO=C0.bgGray,t2=C0.bold,yO=C0.dim,OO=C0.italic,LO=C0.underline,_O=C0.strikethrough,SO=C0.reset,rQ={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},df={debug:"\uD83D\uDD0D",info:vf("ℹ"),success:cf("✓"),warning:gf(r2(t2(" WARN "))),error:mf(r2(t2(" ERROR ")))};ZO=new m$("stacks")});var g1={};EB(g1,{shouldReusePort:()=>m1,safeStringify:()=>Iw,safeDeleteFile:()=>EW,resolvePathRewrite:()=>NW,redactSensitive:()=>T8,isValidRootCA:()=>qW,isSingleProxyOptions:()=>hY,isSingleProxyConfig:()=>af,isProcessElevated:()=>f8,isMultiProxyOptions:()=>d$,isMultiProxyConfig:()=>fG,getSudoPassword:()=>g$,getPrimaryDomain:()=>H8,extractHostname:()=>tf,execSudoSync:()=>U$,debugLog:()=>F});import{execSync as FW}from"node:child_process";import*as TG from"node:fs/promises";function g$(){return process.env.SUDO_PASSWORD}function f8(){if(process.platform==="win32")return!1;try{return typeof process.getuid==="function"&&process.getuid()===0}catch{return!1}}function U$(w){if(f8())return FW(w,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]});let $=g$(),Y=w.replace(/'/g,"'\\''");if($)return FW(`echo '${$}' | sudo -S sh -c '${Y}' 2>/dev/null`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]});try{return FW(`sudo -n sh -c '${Y}'`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{throw Error("sudo required but no cached credentials (set SUDO_PASSWORD in .env or run sudo -v)")}}function F(w,$,Y){if(Y)lf.debug(`[rpx:${w}] ${$}`)}function m1(){let w=process.env.RPX_REUSE_PORT;return w==="1"||w==="true"}function rf(w){let $=w.toLowerCase();return nf.has($)||$.endsWith("password")||$.includes("secret")||$.includes("token")}function T8(w){if(Array.isArray(w))return w.map((Y)=>T8(Y));if(typeof w==="string")return pf.test(w)?EG:w;if(!w||typeof w!=="object")return w;let $={};for(let[Y,A]of Object.entries(w)){if(rf(Y)){$[Y]=EG;continue}$[Y]=T8(A)}return $}function Iw(w,$){return JSON.stringify(T8(w),null,$)}function tf(w){if(d$(w))return w.proxies.map(($)=>{let Y=$.to||"stacks.localhost";return Y.startsWith("http")?new URL(Y).hostname:Y});if(hY(w)){let $=w.to||"stacks.localhost";return[$.startsWith("http")?new URL($).hostname:$]}return["stacks.localhost"]}function qW(w){return typeof w==="object"&&w!==null&&"certificate"in w&&"privateKey"in w&&typeof w.certificate==="string"&&typeof w.privateKey==="string"}function H8(w){if(!w)return"stacks.localhost";if(d$(w)&&w.proxies.length>0)return w.proxies[0].to||"stacks.localhost";if(hY(w))return w.to||"stacks.localhost";return"stacks.localhost"}function fG(w){return!!(w&&("proxies"in w)&&Array.isArray(w.proxies))}function d$(w){return"proxies"in w&&Array.isArray(w.proxies)}function hY(w){return"to"in w&&typeof w.to==="string"}function af(w){return!!(w&&("to"in w)&&!("proxies"in w))}function NW(w,$){if(!$||$.length===0)return null;for(let Y of $)if(w===Y.from||w.startsWith(`${Y.from}/`)){let A=Y.to.startsWith("http")?new URL(Y.to).host:Y.to,X=Y.stripPrefix===!0?w.slice(Y.from.length)||"/":w;return{targetHost:A,targetPath:X}}return null}async function EW(w,$){try{await TG.unlink(w),F("certificates",`Successfully deleted: ${w}`,$)}catch(Y){if(Y.code!=="ENOENT")F("certificates",`Warning: Could not delete ${w}: ${Y}`,$)}}var lf,EG="[redacted]",nf,pf;var X0=t(()=>{KW();lf=new m$("rpx",{showTags:!1});nf=new Set(["certificate","privatekey","key","cert","ca","rootca","password","sudo_password"]),pf=/-----BEGIN [A-Z ]+-----[\s\S]*?-----END [A-Z ]+-----/});import{execSync as R8}from"node:child_process";import{homedir as sf}from"node:os";import{join as of}from"node:path";function M8(){return of(sf(),"Library/Keychains/login.keychain-db")}function fW(){return[V$,M8()]}function HG(w,$=TW){let Y=R8(`security find-certificate -a -c "${$}" -Z "${w}" 2>/dev/null || true`,{encoding:"utf8"}),A=[];for(let X of Y.split(`
182
- `)){let J=X.match(/SHA-256 hash:\s*([A-F0-9]+)/i);if(J)A.push(J[1].toUpperCase())}return A}function HW(w){if(process.platform!=="darwin")return;let $=v$(w.caPath);if(!$)return;let Y=w.commonName??TW,A=w.keychains??fW();for(let X of A)for(let J of HG(X,Y)){if(J===$)continue;try{if(X.startsWith("/Library"))U$(`security delete-certificate -Z ${J} "${X}"`);else R8(`security delete-certificate -Z ${J} "${X}"`,{stdio:"ignore"});F("ssl",`Removed stale Root CA ${J} from ${X}`,w.verbose)}catch{}}}function RW(w,$,Y){if(process.platform!=="darwin")return I8(w,Y);try{let X=R8(`security verify-cert -c "${w}" -s "${$}" -l -L -R ssl 2>&1`,{encoding:"utf8"}).includes("successful");return F("ssl",`verify-cert ${$}: ${X?"trusted":"not trusted"}`,Y?.verbose),X}catch{return!1}}function I8(w,$){let Y=v$(w);if(!Y)return!1;for(let A of fW())try{let X=R8(`security find-certificate -a -Z "${A}" 2>/dev/null || true`,{encoding:"utf8"});for(let J of X.split(`
183
- `))if(J.toUpperCase().includes("SHA-256")){if(J.split("=").pop().replace(/SHA-256\s+hash:\s*/gi,"").replace(/:/g,"").trim().toUpperCase()===Y)return F("ssl",`Root CA fingerprint found in ${A}`,$?.verbose),!0}}catch{}return!1}var I$="-d -r trustRoot -p ssl -p basic",V$="/Library/Keychains/System.keychain",TW="rpx.localhost";var MW=t(()=>{mX();X0()});import{execSync as IW}from"node:child_process";import G0 from"node:fs/promises";import*as VW from"node:os";import{homedir as d1}from"node:os";import*as IG from"node:path";import{join as K0}from"node:path";import*as C$ from"node:process";function CW(w,$){return[...new Set(w.filter(Boolean))].map((Y)=>({serverName:Y,cert:$.cert,key:$.key}))}function yW(w,$,Y){let A=K0(d1(),".stacks","ssl"),X=[...new Set([$,...w,"rpx.localhost"])];return{https:{certPath:V8,keyPath:K0(A,"rpx.localhost.key"),caCertPath:K0(A,"rpx.localhost.ca.crt"),commonName:$},verbose:Y,regenerateUntrustedCerts:!0,proxies:X.map((J)=>({from:"localhost:1",to:J,cleanUrls:!1}))}}function VG(w){return{caCertPath:K0(w,wH),caKeyPath:K0(w,$H)}}async function YH(w,$){try{let[Y,A]=await Promise.all([G0.readFile(w.caCertPath,"utf8"),G0.readFile(w.caKeyPath,"utf8")]);if(!Y.includes("-----BEGIN CERTIFICATE-----")||!A.includes("PRIVATE KEY-----"))return F("ssl",`Root CA files at ${w.caCertPath} look malformed, will regenerate`,$),null;return{certificate:Y,privateKey:A}}catch(Y){return F("ssl",`No existing Root CA at ${w.caCertPath} (${Y.code||Y}), will create one`,$),null}}function RG(w){let $=new Set;$.add(w);let Y=w.split(".");if(Y.length>=3){let A=Y[Y.length-1],X=Y[Y.length-2],J=new Set(["co","com","org","net","ac","gov","edu"]);if(!(Y.length===3&&A.length===2&&J.has(X)))$.add(`*.${Y.slice(1).join(".")}`)}return Array.from($)}function CG(w){let Y=H8(w).replace(/\*/g,"wildcard"),A=K0(d1(),".stacks","ssl"),X=A;if(typeof w?.https==="object")return X=w.https.basePath&&w.https.basePath.trim()!==""?w.https.basePath:A,{caCertPath:w.https.caCertPath||K0(X,`${Y}.ca.crt`),certPath:w.https.certPath||K0(X,`${Y}.crt`),keyPath:w.https.keyPath||K0(X,`${Y}.key`)};return{caCertPath:K0(X,`${Y}.ca.crt`),certPath:K0(X,`${Y}.crt`),keyPath:K0(X,`${Y}.key`)}}function MG(w){let $=new Set;if(d$(w))w.proxies.forEach((Y)=>{let A=Y.to||"rpx.localhost";RG(A).forEach((X)=>$.add(X))});else if(hY(w)){let Y=w.to||"rpx.localhost";RG(Y).forEach((A)=>$.add(A))}else $.add("rpx.localhost");return $.add("localhost"),$.add("*.localhost"),$}async function l1(w){if(y$&&!w.forceRegenerate){F("ssl","Using cached SSL configuration",w.verbose);return}C8();let $=d$(w)?w.proxies.map((j)=>j.to):[w.to];F("ssl",`Generating certificate for domains: ${$.join(", ")}`,w.verbose);let Y=DY(w,w.verbose),A=Y.basePath||K0(d1(),".stacks","ssl");await G0.mkdir(A,{recursive:!0});let X=VG(A),J=await YH(X,w.verbose),U=!1;if(!J){if(w.verbose)H.info("Generating Root CA certificate (one-time)...");J=await RQ(Y);try{await Promise.all([G0.writeFile(X.caCertPath,J.certificate),G0.writeFile(X.caKeyPath,J.privateKey,{mode:384})]),U=!0,F("ssl",`Persisted Root CA at ${X.caCertPath}`,w.verbose)}catch(j){throw F("ssl",`Error saving Root CA files: ${j}`,w.verbose),Error(`Failed to save Root CA files: ${j}`)}}else F("ssl",`Reusing existing Root CA from ${X.caCertPath}`,w.verbose);if(w.verbose)H.info(`Generating host certificate for: ${$.join(", ")}`);let W=await MQ({...Y,rootCA:{certificate:J.certificate,privateKey:J.privateKey}});try{await Promise.all([G0.writeFile(Y.certPath,W.certificate),G0.writeFile(Y.keyPath,W.privateKey),G0.writeFile(Y.caCertPath,J.certificate)]),F("ssl","Certificate files saved successfully",w.verbose)}catch(j){throw F("ssl",`Error saving certificate files: ${j}`,w.verbose),Error(`Failed to save certificate files: ${j}`)}if(U?!1:await OG(X.caCertPath,{verbose:w.verbose,regenerateUntrustedCerts:!0})){if(F("ssl","Root CA already trusted, skipping trust store update",w.verbose),w.verbose)H.success("Root CA is already trusted in system trust store");if(y$={key:W.privateKey,cert:W.certificate,ca:J.certificate},w.verbose)H.success(`Certificate generated successfully for ${$.length} domain${$.length>1?"s":""}`);return}if(w.verbose)H.info("Adding certificate to system trust store (may require sudo permission)...");let B=!1;if(C$.platform==="darwin")try{HW({caPath:X.caCertPath,verbose:w.verbose});let j=M8();try{IW(`security add-trusted-cert ${I$} -k "${j}" "${X.caCertPath}"`,{stdio:"ignore"})}catch{}if(U$(`security add-trusted-cert ${I$} -k ${V$} "${X.caCertPath}"`),w.verbose)H.success("Successfully added Root CA to system trust store");B=!0;let z=K0(A,"trust-rpx-cert.sh"),G=`#!/bin/bash
181
+ `)}finishProgressBar(w,$){if(!this.enabled||!this.fancy||M0()||!P.stdout.isTTY){this.activeProgressBar=null;return}if(w.current<w.total)w.current=w.total;if($)w.message=$;this.renderProgressBar(w,!0),this.activeProgressBar=null}async clear(w={}){if(M0()){console.warn("Log clearing is not supported in browser environments.");return}try{console.warn("Clearing logs...",this.config.logDirectory);let $=await w8(this.config.logDirectory),Y=[];for(let A of $){if(!(w.name?new RegExp(w.name.replace("*",".*")).test(A):A.startsWith(this.name))||!A.endsWith(".log"))continue;let J=v1(this.config.logDirectory,A);if(w.before)try{if((await c1(J)).mtime>=w.before)continue}catch(U){console.error(`Failed to get stats for file ${J}:`,U);continue}Y.push(J)}if(Y.length===0){console.warn("No log files matched the criteria for clearing.");return}console.warn(`Preparing to delete ${Y.length} log file(s)...`);for(let A of Y)try{await $8(A),console.warn(`Deleted log file: ${A}`)}catch(X){console.error(`Failed to delete log file ${A}:`,X)}console.warn("Log clearing process finished.")}catch($){console.error("Error during log clearing process:",$)}}}var rE,tE=(w)=>w,sE=(w,$)=>{for(var Y in $)rE(w,Y,{get:$[Y],enumerable:!0,configurable:!0,set:aE.bind($,Y)})},oE=(w,$)=>()=>(w&&($=w(w=0)),$),s2,WG,m1,hY,BG,ef,wT,k2,A8,wW,D0,o,$T,h2,YT,D2,AT,XT,gQ,JT,x2,P2,dQ,UT,QT,WT,BT,X8,jG,jT,x0,zT,GT,b2,J8,$W,R0,v,KT,u2,FT,c2,qT,NT,lQ,ET,v2,i2,fT,nQ,TT,HT,RT,MT,IT,U8,zG,VT,CT="0.15.6",Yw,F8,ZY,YW,AW,q8,XW,JW,kY,UW,QW,M$,GG,KG,Mw,J$,FG,qG,yT,ST,NG,E8,zO,C0,g,MO,iT,IO,mT,VO,CO,t2,yO,gT,dT,OO,a2,LO,_O,SO,ZO,kO,aQ,lT,hO;var qW=t(()=>{rE=Object.defineProperty;s2={};sE(s2,{withErrorRecovery:()=>YG,tryLoadConfig:()=>tf,loadConfigWithResult:()=>pf,loadConfig:()=>QG,isRetryableError:()=>vf,isConfigNotFoundError:()=>cf,isBunfigError:()=>AG,globalPerformanceMonitor:()=>hY,globalCache:()=>m1,getEnvOrDefault:()=>mf,generateConfigTypes:()=>af,defaultGeneratedDir:()=>qG,defaultConfigDir:()=>FG,deepMergeWithArrayStrategy:()=>GW,deepMerge:()=>XG,createLibraryConfig:()=>sf,config:()=>rf,bunfigPlugin:()=>of,applyEnvVarsToConfig:()=>_Y,TypeGenerationError:()=>JW,SchemaValidationError:()=>kY,PluginError:()=>QW,PerformanceMonitor:()=>BW,FileSystemError:()=>XW,ErrorFactory:()=>M$,EnvVarError:()=>q8,EnvProcessor:()=>f8,ConfigValidator:()=>KW,ConfigValidationError:()=>YW,ConfigNotFoundError:()=>F8,ConfigMergeError:()=>AW,ConfigLoader:()=>FW,ConfigLoadError:()=>ZY,ConfigFileLoader:()=>T8,ConfigCache:()=>WW,CacheUtils:()=>BG,BunfigError:()=>Yw,BrowserConfigError:()=>UW,ArrayMergeStrategies:()=>GG});yT=oE(async()=>{WG=import.meta.require,m1=new WW,hY=new BW,BG={createKey:yf,isEquivalent:Of,estimateMemoryUsage:Lf},ef=B8(oQ.cwd(),"config"),wT=B8(oQ.cwd(),"src/generated"),k2=W8.env.CLARITY_LOG_DIR||Xf(Zf(),"logs"),A8={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:k2,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1},wW=await kf(),D0={red:(w)=>`\x1B[31m${w}\x1B[0m`,green:(w)=>`\x1B[32m${w}\x1B[0m`,yellow:(w)=>`\x1B[33m${w}\x1B[0m`,blue:(w)=>`\x1B[34m${w}\x1B[0m`,magenta:(w)=>`\x1B[35m${w}\x1B[0m`,cyan:(w)=>`\x1B[36m${w}\x1B[0m`,white:(w)=>`\x1B[37m${w}\x1B[0m`,gray:(w)=>`\x1B[90m${w}\x1B[0m`,bgRed:(w)=>`\x1B[41m${w}\x1B[0m`,bgYellow:(w)=>`\x1B[43m${w}\x1B[0m`,bold:(w)=>`\x1B[1m${w}\x1B[0m`,dim:(w)=>`\x1B[2m${w}\x1B[0m`,italic:(w)=>`\x1B[3m${w}\x1B[0m`,underline:(w)=>`\x1B[4m${w}\x1B[0m`,reset:"\x1B[0m"},o=D0,$T=D0.red,h2=D0.green,YT=D0.yellow,D2=D0.blue,AT=D0.magenta,XT=D0.cyan,gQ=D0.white,JT=D0.gray,x2=D0.bgRed,P2=D0.bgYellow,dQ=D0.bold,UT=D0.dim,QT=D0.italic,WT=D0.underline,BT=D0.reset,X8={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},jG={debug:"\uD83D\uDD0D",info:D2("ℹ"),success:h2("✓"),warning:P2(gQ(dQ(" WARN "))),error:x2(gQ(dQ(" ERROR ")))},jT=new z8("stacks"),x0=new z8("bunfig",{showTags:!0}),zT=l0(SY.cwd(),"config"),GT=l0(SY.cwd(),"src/generated"),b2=Q8.env.CLARITY_LOG_DIR||Yf(Pf(),"logs"),J8={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:b2,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1,writeToFile:!1},$W=await bf(),R0={red:(w)=>`\x1B[31m${w}\x1B[0m`,green:(w)=>`\x1B[32m${w}\x1B[0m`,yellow:(w)=>`\x1B[33m${w}\x1B[0m`,blue:(w)=>`\x1B[34m${w}\x1B[0m`,magenta:(w)=>`\x1B[35m${w}\x1B[0m`,cyan:(w)=>`\x1B[36m${w}\x1B[0m`,white:(w)=>`\x1B[37m${w}\x1B[0m`,gray:(w)=>`\x1B[90m${w}\x1B[0m`,bgRed:(w)=>`\x1B[41m${w}\x1B[0m`,bgYellow:(w)=>`\x1B[43m${w}\x1B[0m`,bgGray:(w)=>`\x1B[100m${w}\x1B[0m`,bold:(w)=>`\x1B[1m${w}\x1B[0m`,dim:(w)=>`\x1B[2m${w}\x1B[0m`,italic:(w)=>`\x1B[3m${w}\x1B[0m`,underline:(w)=>`\x1B[4m${w}\x1B[0m`,strikethrough:(w)=>`\x1B[9m${w}\x1B[0m`,reset:"\x1B[0m"},v=R0,KT=R0.red,u2=R0.green,FT=R0.yellow,c2=R0.blue,qT=R0.magenta,NT=R0.cyan,lQ=R0.white,ET=R0.gray,v2=R0.bgRed,i2=R0.bgYellow,fT=R0.bgGray,nQ=R0.bold,TT=R0.dim,HT=R0.italic,RT=R0.underline,MT=R0.strikethrough,IT=R0.reset,U8={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},zG={debug:"\uD83D\uDD0D",info:c2("ℹ"),success:u2("✓"),warning:i2(lQ(nQ(" WARN "))),error:v2(lQ(nQ(" ERROR ")))},VT=new K8("stacks"),Yw=class extends Error{timestamp;context;constructor($,Y={}){super($);if(this.name=this.constructor.name,this.timestamp=new Date,this.context=Y,Error.captureStackTrace)Error.captureStackTrace(this,this.constructor)}toJSON(){return{name:this.name,code:this.code,message:this.message,timestamp:this.timestamp.toISOString(),context:this.context,stack:this.stack}}toString(){let $=Object.keys(this.context).length>0?` (${Object.entries(this.context).map(([Y,A])=>`${Y}: ${A}`).join(", ")})`:"";return`${this.name} [${this.code}]: ${this.message}${$}`}},F8=class extends Yw{code="CONFIG_NOT_FOUND";constructor($,Y,A){let X=A?` or alias "${A}"`:"";super(`Configuration "${$}"${X} not found`,{configName:$,alias:A,searchPaths:Y,searchPathCount:Y.length})}},ZY=class extends Yw{code="CONFIG_LOAD_ERROR";constructor($,Y,A){super(`Failed to load configuration from "${$}": ${Y.message}`,{configPath:$,configName:A,originalError:Y.name,originalMessage:Y.message});this.cause=Y}},YW=class extends Yw{code="CONFIG_VALIDATION_ERROR";constructor($,Y,A){super(`Configuration validation failed for "${$}"`,{configPath:$,configName:A,validationErrors:Y,errorCount:Y.length})}},AW=class extends Yw{code="CONFIG_MERGE_ERROR";constructor($,Y,A,X){super(`Failed to merge configuration from "${$}" with "${Y}": ${A.message}`,{sourcePath:$,targetPath:Y,configName:X,originalError:A.name,originalMessage:A.message});this.cause=A}},q8=class extends Yw{code="ENV_VAR_ERROR";constructor($,Y,A,X){super(`Failed to parse environment variable "${$}" with value "${Y}" as ${A}`,{envKey:$,envValue:Y,expectedType:A,configName:X})}},XW=class extends Yw{code="FILE_SYSTEM_ERROR";constructor($,Y,A){super(`File system ${$} failed for "${Y}": ${A.message}`,{operation:$,path:Y,originalError:A.name,originalMessage:A.message});this.cause=A}},JW=class extends Yw{code="TYPE_GENERATION_ERROR";constructor($,Y,A){super(`Failed to generate types from "${$}" to "${Y}": ${A.message}`,{configDir:$,outputPath:Y,originalError:A.name,originalMessage:A.message});this.cause=A}},kY=class extends Yw{code="SCHEMA_VALIDATION_ERROR";constructor($,Y,A){super(`Schema validation failed${A?` for config "${A}"`:""}`,{schemaPath:$,configName:A,validationErrors:Y,errorCount:Y.length})}},UW=class extends Yw{code="BROWSER_CONFIG_ERROR";constructor($,Y,A,X){super(`Failed to fetch configuration from "${$}": ${Y} ${A}`,{endpoint:$,status:Y,statusText:A,configName:X})}},QW=class extends Yw{code="PLUGIN_ERROR";constructor($,Y,A){super(`Plugin "${$}" failed during ${Y}: ${A.message}`,{pluginName:$,operation:Y,originalError:A.name,originalMessage:A.message});this.cause=A}},M$={configNotFound(w,$,Y){return new F8(w,$,Y)},configLoad(w,$,Y){return new ZY(w,$,Y)},configValidation(w,$,Y){return new YW(w,$,Y)},configMerge(w,$,Y,A){return new AW(w,$,Y,A)},envVar(w,$,Y,A){return new q8(w,$,Y,A)},fileSystem(w,$,Y){return new XW(w,$,Y)},typeGeneration(w,$,Y){return new JW(w,$,Y)},schemaValidation(w,$,Y){return new kY(w,$,Y)},browserConfig(w,$,Y,A){return new UW(w,$,Y,A)},plugin(w,$,Y){return new QW(w,$,Y)}},GG={replace:"replace",concat:"concat",smart:"smart"},KG=/^https?:\/\//,Mw=new K8("bunfig",{showTags:!0}),J$=new FW,FG=n0(g$.cwd(),"config"),qG=n0(g$.cwd(),"src/generated")});ST=N8.env.CLARITY_LOG_DIR||OT(_T(),"logs"),NG={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:ST,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1,writeToFile:!1},E8={...NG},zO=(async()=>{try{let{loadConfig:w}=await yT().then(()=>s2),$=await w({name:"clarity",alias:"logging",defaultConfig:NG,cwd:N8.cwd()});if($)Object.assign(E8,$)}catch{}return E8})();C0={red:(w)=>`\x1B[31m${w}\x1B[0m`,green:(w)=>`\x1B[32m${w}\x1B[0m`,yellow:(w)=>`\x1B[33m${w}\x1B[0m`,blue:(w)=>`\x1B[34m${w}\x1B[0m`,magenta:(w)=>`\x1B[35m${w}\x1B[0m`,cyan:(w)=>`\x1B[36m${w}\x1B[0m`,white:(w)=>`\x1B[37m${w}\x1B[0m`,gray:(w)=>`\x1B[90m${w}\x1B[0m`,bgRed:(w)=>`\x1B[41m${w}\x1B[0m`,bgYellow:(w)=>`\x1B[43m${w}\x1B[0m`,bgGray:(w)=>`\x1B[100m${w}\x1B[0m`,bold:(w)=>`\x1B[1m${w}\x1B[0m`,dim:(w)=>`\x1B[2m${w}\x1B[0m`,italic:(w)=>`\x1B[3m${w}\x1B[0m`,underline:(w)=>`\x1B[4m${w}\x1B[0m`,strikethrough:(w)=>`\x1B[9m${w}\x1B[0m`,reset:"\x1B[0m"},g=C0,MO=C0.red,iT=C0.green,IO=C0.yellow,mT=C0.blue,VO=C0.magenta,CO=C0.cyan,t2=C0.white,yO=C0.gray,gT=C0.bgRed,dT=C0.bgYellow,OO=C0.bgGray,a2=C0.bold,LO=C0.dim,_O=C0.italic,SO=C0.underline,ZO=C0.strikethrough,kO=C0.reset,aQ={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},lT={debug:"\uD83D\uDD0D",info:mT("ℹ"),success:iT("✓"),warning:dT(t2(a2(" WARN "))),error:gT(t2(a2(" ERROR ")))};hO=new d$("stacks")});var d1={};fB(d1,{shouldReusePort:()=>g1,safeStringify:()=>Iw,safeDeleteFile:()=>fW,resolvePathRewrite:()=>EW,redactSensitive:()=>R8,isValidRootCA:()=>NW,isSingleProxyOptions:()=>xY,isSingleProxyConfig:()=>oT,isProcessElevated:()=>DY,isMultiProxyOptions:()=>l$,isMultiProxyConfig:()=>HG,getSudoPassword:()=>I$,getPrimaryDomain:()=>M8,extractHostname:()=>sT,execSudoSync:()=>U$,debugLog:()=>F,authorizeSystemAccess:()=>pT});import{execSync as H8}from"node:child_process";import*as TG from"node:fs/promises";function I$(){return process.env.SUDO_PASSWORD}function DY(){if(process.platform==="win32")return!1;try{return typeof process.getuid==="function"&&process.getuid()===0}catch{return!1}}function pT(w={}){if(process.platform==="win32")return!0;if(DY()||!!I$())return!0;let $=w.exec??H8;try{return $("sudo -n true",{stdio:"ignore"}),!0}catch{if(!w.interactive)return!1}try{return $("sudo -v",{stdio:"inherit"}),!0}catch{return!1}}function U$(w){if(DY())return H8(w,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]});let $=I$(),Y=w.replace(/'/g,"'\\''");if($)return H8(`echo '${$}' | sudo -S sh -c '${Y}' 2>/dev/null`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]});try{return H8(`sudo -n sh -c '${Y}'`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{throw Error("sudo required but no cached credentials (set SUDO_PASSWORD in .env or run sudo -v)")}}function F(w,$,Y){if(Y)nT.debug(`[rpx:${w}] ${$}`)}function g1(){let w=process.env.RPX_REUSE_PORT;return w==="1"||w==="true"}function aT(w){let $=w.toLowerCase();return rT.has($)||$.endsWith("password")||$.includes("secret")||$.includes("token")}function R8(w){if(Array.isArray(w))return w.map((Y)=>R8(Y));if(typeof w==="string")return tT.test(w)?fG:w;if(!w||typeof w!=="object")return w;let $={};for(let[Y,A]of Object.entries(w)){if(aT(Y)){$[Y]=fG;continue}$[Y]=R8(A)}return $}function Iw(w,$){return JSON.stringify(R8(w),null,$)}function sT(w){if(l$(w))return w.proxies.map(($)=>{let Y=$.to||"stacks.localhost";return Y.startsWith("http")?new URL(Y).hostname:Y});if(xY(w)){let $=w.to||"stacks.localhost";return[$.startsWith("http")?new URL($).hostname:$]}return["stacks.localhost"]}function NW(w){return typeof w==="object"&&w!==null&&"certificate"in w&&"privateKey"in w&&typeof w.certificate==="string"&&typeof w.privateKey==="string"}function M8(w){if(!w)return"stacks.localhost";if(l$(w)&&w.proxies.length>0)return w.proxies[0].to||"stacks.localhost";if(xY(w))return w.to||"stacks.localhost";return"stacks.localhost"}function HG(w){return!!(w&&("proxies"in w)&&Array.isArray(w.proxies))}function l$(w){return"proxies"in w&&Array.isArray(w.proxies)}function xY(w){return"to"in w&&typeof w.to==="string"}function oT(w){return!!(w&&("to"in w)&&!("proxies"in w))}function EW(w,$){if(!$||$.length===0)return null;for(let Y of $)if(w===Y.from||w.startsWith(`${Y.from}/`)){let A=Y.to.startsWith("http")?new URL(Y.to).host:Y.to,X=Y.stripPrefix===!0?w.slice(Y.from.length)||"/":w;return{targetHost:A,targetPath:X}}return null}async function fW(w,$){try{await TG.unlink(w),F("certificates",`Successfully deleted: ${w}`,$)}catch(Y){if(Y.code!=="ENOENT")F("certificates",`Warning: Could not delete ${w}: ${Y}`,$)}}var nT,fG="[redacted]",rT,tT;var X0=t(()=>{qW();nT=new d$("rpx",{showTags:!1});rT=new Set(["certificate","privatekey","key","cert","ca","rootca","password","sudo_password"]),tT=/-----BEGIN [A-Z ]+-----[\s\S]*?-----END [A-Z ]+-----/});import{execSync as I8}from"node:child_process";import{homedir as eT}from"node:os";import{join as wH}from"node:path";function V8(){return wH(eT(),"Library/Keychains/login.keychain-db")}function HW(){return[C$,V8()]}function RG(w,$=TW){let Y=I8(`security find-certificate -a -c "${$}" -Z "${w}" 2>/dev/null || true`,{encoding:"utf8"}),A=[];for(let X of Y.split(`
182
+ `)){let J=X.match(/SHA-256 hash:\s*([A-F0-9]+)/i);if(J)A.push(J[1].toUpperCase())}return A}function RW(w){if(process.platform!=="darwin")return;let $=m$(w.caPath);if(!$)return;let Y=w.commonName??TW,A=w.keychains??HW();for(let X of A)for(let J of RG(X,Y)){if(J===$)continue;try{if(X.startsWith("/Library"))U$(`security delete-certificate -Z ${J} "${X}"`);else I8(`security delete-certificate -Z ${J} "${X}"`,{stdio:"ignore"});F("ssl",`Removed stale Root CA ${J} from ${X}`,w.verbose)}catch{}}}function MW(w,$,Y){if(process.platform!=="darwin")return C8(w,Y);try{let X=I8(`security verify-cert -c "${w}" -s "${$}" -l -L -R ssl 2>&1`,{encoding:"utf8"}).includes("successful");return F("ssl",`verify-cert ${$}: ${X?"trusted":"not trusted"}`,Y?.verbose),X}catch{return!1}}function C8(w,$){let Y=m$(w);if(!Y)return!1;for(let A of HW())try{let X=I8(`security find-certificate -a -Z "${A}" 2>/dev/null || true`,{encoding:"utf8"});for(let J of X.split(`
183
+ `))if(J.toUpperCase().includes("SHA-256")){if(J.split("=").pop().replace(/SHA-256\s+hash:\s*/gi,"").replace(/:/g,"").trim().toUpperCase()===Y)return F("ssl",`Root CA fingerprint found in ${A}`,$?.verbose),!0}}catch{}return!1}var V$="-d -r trustRoot -p ssl -p basic",C$="/Library/Keychains/System.keychain",TW="rpx.localhost";var IW=t(()=>{dX();X0()});import{execSync as VW}from"node:child_process";import G0 from"node:fs/promises";import*as CW from"node:os";import{homedir as l1}from"node:os";import*as VG from"node:path";import{join as K0}from"node:path";import*as y$ from"node:process";function yW(w,$){return[...new Set(w.filter(Boolean))].map((Y)=>({serverName:Y,cert:$.cert,key:$.key}))}function OW(w,$,Y){let A=K0(l1(),".stacks","ssl"),X=[...new Set([$,...w,"rpx.localhost"])];return{https:{certPath:y8,keyPath:K0(A,"rpx.localhost.key"),caCertPath:K0(A,"rpx.localhost.ca.crt"),commonName:$},verbose:Y,regenerateUntrustedCerts:!0,proxies:X.map((J)=>({from:"localhost:1",to:J,cleanUrls:!1}))}}function CG(w){return{caCertPath:K0(w,YH),caKeyPath:K0(w,AH)}}async function XH(w,$){try{let[Y,A]=await Promise.all([G0.readFile(w.caCertPath,"utf8"),G0.readFile(w.caKeyPath,"utf8")]);if(!Y.includes("-----BEGIN CERTIFICATE-----")||!A.includes("PRIVATE KEY-----"))return F("ssl",`Root CA files at ${w.caCertPath} look malformed, will regenerate`,$),null;return{certificate:Y,privateKey:A}}catch(Y){return F("ssl",`No existing Root CA at ${w.caCertPath} (${Y.code||Y}), will create one`,$),null}}function MG(w){let $=new Set;$.add(w);let Y=w.split(".");if(Y.length>=3){let A=Y[Y.length-1],X=Y[Y.length-2],J=new Set(["co","com","org","net","ac","gov","edu"]);if(!(Y.length===3&&A.length===2&&J.has(X)))$.add(`*.${Y.slice(1).join(".")}`)}return Array.from($)}function yG(w){let Y=M8(w).replace(/\*/g,"wildcard"),A=K0(l1(),".stacks","ssl"),X=A;if(typeof w?.https==="object")return X=w.https.basePath&&w.https.basePath.trim()!==""?w.https.basePath:A,{caCertPath:w.https.caCertPath||K0(X,`${Y}.ca.crt`),certPath:w.https.certPath||K0(X,`${Y}.crt`),keyPath:w.https.keyPath||K0(X,`${Y}.key`)};return{caCertPath:K0(X,`${Y}.ca.crt`),certPath:K0(X,`${Y}.crt`),keyPath:K0(X,`${Y}.key`)}}function IG(w){let $=new Set;if(l$(w))w.proxies.forEach((Y)=>{let A=Y.to||"rpx.localhost";MG(A).forEach((X)=>$.add(X))});else if(xY(w)){let Y=w.to||"rpx.localhost";MG(Y).forEach((A)=>$.add(A))}else $.add("rpx.localhost");return $.add("localhost"),$.add("*.localhost"),$}async function n1(w){if(O$&&!w.forceRegenerate){F("ssl","Using cached SSL configuration",w.verbose);return}O8();let $=l$(w)?w.proxies.map((j)=>j.to):[w.to];F("ssl",`Generating certificate for domains: ${$.join(", ")}`,w.verbose);let Y=PY(w,w.verbose),A=Y.basePath||K0(l1(),".stacks","ssl");await G0.mkdir(A,{recursive:!0});let X=CG(A),J=await XH(X,w.verbose),U=!1;if(!J){if(w.verbose)H.info("Generating Root CA certificate (one-time)...");J=await IQ(Y);try{await Promise.all([G0.writeFile(X.caCertPath,J.certificate),G0.writeFile(X.caKeyPath,J.privateKey,{mode:384})]),U=!0,F("ssl",`Persisted Root CA at ${X.caCertPath}`,w.verbose)}catch(j){throw F("ssl",`Error saving Root CA files: ${j}`,w.verbose),Error(`Failed to save Root CA files: ${j}`)}}else F("ssl",`Reusing existing Root CA from ${X.caCertPath}`,w.verbose);if(w.verbose)H.info(`Generating host certificate for: ${$.join(", ")}`);let W=await VQ({...Y,rootCA:{certificate:J.certificate,privateKey:J.privateKey}});try{await Promise.all([G0.writeFile(Y.certPath,W.certificate),G0.writeFile(Y.keyPath,W.privateKey),G0.writeFile(Y.caCertPath,J.certificate)]),F("ssl","Certificate files saved successfully",w.verbose)}catch(j){throw F("ssl",`Error saving certificate files: ${j}`,w.verbose),Error(`Failed to save certificate files: ${j}`)}if(U?!1:await LG(X.caCertPath,{verbose:w.verbose,regenerateUntrustedCerts:!0})){if(F("ssl","Root CA already trusted, skipping trust store update",w.verbose),w.verbose)H.success("Root CA is already trusted in system trust store");if(O$={key:W.privateKey,cert:W.certificate,ca:J.certificate},w.verbose)H.success(`Certificate generated successfully for ${$.length} domain${$.length>1?"s":""}`);return}if(w.verbose)H.info("Adding certificate to system trust store (may require sudo permission)...");let B=!1;if(y$.platform==="darwin")try{RW({caPath:X.caCertPath,verbose:w.verbose});let j=V8();try{VW(`security add-trusted-cert ${V$} -k "${j}" "${X.caCertPath}"`,{stdio:"ignore"})}catch{}if(U$(`security add-trusted-cert ${V$} -k ${C$} "${X.caCertPath}"`),w.verbose)H.success("Successfully added Root CA to system trust store");B=!0;let z=K0(A,"trust-rpx-cert.sh"),G=`#!/bin/bash
184
184
  echo "Trusting RPX Root CA"
185
185
  # SUDO_PASSWORD (e.g. from a Stacks app's .env) makes the trust step
186
186
  # non-interactive. Without it, fall back to a normal sudo prompt.
187
187
  if [ -n "$SUDO_PASSWORD" ]
188
188
  then
189
189
  printf '%s
190
- ' "$SUDO_PASSWORD" | sudo -S -p '' security add-trusted-cert ${I$} -k ${V$} "${X.caCertPath}"
190
+ ' "$SUDO_PASSWORD" | sudo -S -p '' security add-trusted-cert ${V$} -k ${C$} "${X.caCertPath}"
191
191
  else
192
- sudo security add-trusted-cert ${I$} -k ${V$} "${X.caCertPath}"
192
+ sudo security add-trusted-cert ${V$} -k ${C$} "${X.caCertPath}"
193
193
  fi
194
194
  echo "Root CA trusted! Please restart your browser."
195
195
  echo "If you still see certificate warnings, type 'thisisunsafe' on the warning page in Chrome/Arc browsers."
@@ -200,59 +200,59 @@ echo "Trusting RPX Root CA"
200
200
  if [ -n "$SUDO_PASSWORD" ]
201
201
  then
202
202
  printf '%s
203
- ' "$SUDO_PASSWORD" | sudo -S -p '' security add-trusted-cert ${I$} -k ${V$} "${X.caCertPath}"
203
+ ' "$SUDO_PASSWORD" | sudo -S -p '' security add-trusted-cert ${V$} -k ${C$} "${X.caCertPath}"
204
204
  else
205
- sudo security add-trusted-cert ${I$} -k ${V$} "${X.caCertPath}"
205
+ sudo security add-trusted-cert ${V$} -k ${C$} "${X.caCertPath}"
206
206
  fi
207
207
  echo "Root CA trusted! Please restart your browser."
208
208
  echo "If you still see certificate warnings, type 'thisisunsafe' on the warning page in Chrome/Arc browsers."
209
- `;if(await G0.writeFile(z,G,{mode:493}),w.verbose)H.info(`Created a trust helper script at: ${z}`),H.info(`If you're still having certificate issues, run: sh ${z}`)}else if(C$.platform==="linux")try{let{exec:j}=await import("node:child_process"),z="/usr/local/share/ca-certificates/rpx",G=`
209
+ `;if(await G0.writeFile(z,G,{mode:493}),w.verbose)H.info(`Created a trust helper script at: ${z}`),H.info(`If you're still having certificate issues, run: sh ${z}`)}else if(y$.platform==="linux")try{let{exec:j}=await import("node:child_process"),z="/usr/local/share/ca-certificates/rpx",G=`
210
210
  mkdir -p "/usr/local/share/ca-certificates/rpx" 2>/dev/null || true
211
211
  cp "${X.caCertPath}" "/usr/local/share/ca-certificates/rpx/"
212
212
  update-ca-certificates
213
213
  echo "RPX Root CA installed. Please restart your browser."
214
- `,K=K0(VW.tmpdir(),`rpx-trust-${Date.now()}.sh`);await G0.writeFile(K,G,{mode:493}),await new Promise((E)=>{j(`sudo bash "${K}"`,(q)=>{if(q){if(w.verbose)H.warn(`Could not trust certificates: ${q}`);E(!1)}else{if(w.verbose)H.success("Successfully added certificates to system trust store");E(!0)}})}),await G0.unlink(K).catch(()=>{}),B=!0}catch(j){if(w.verbose)H.warn(`Failed to trust certificates: ${j}`)}else if(C$.platform==="win32")try{let j=`
214
+ `,K=K0(CW.tmpdir(),`rpx-trust-${Date.now()}.sh`);await G0.writeFile(K,G,{mode:493}),await new Promise((E)=>{j(`sudo bash "${K}"`,(q)=>{if(q){if(w.verbose)H.warn(`Could not trust certificates: ${q}`);E(!1)}else{if(w.verbose)H.success("Successfully added certificates to system trust store");E(!0)}})}),await G0.unlink(K).catch(()=>{}),B=!0}catch(j){if(w.verbose)H.warn(`Failed to trust certificates: ${j}`)}else if(y$.platform==="win32")try{let j=`
215
215
  $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2("${X.caCertPath.replace(/\//g,"\\")}")
216
216
  $store = New-Object System.Security.Cryptography.X509Certificates.X509Store("ROOT", "LocalMachine")
217
217
  $store.Open("ReadWrite")
218
218
  $store.Add($cert)
219
219
  $store.Close()
220
220
  Write-Host "Root CA trusted successfully!"
221
- `,z=K0(VW.tmpdir(),"rpx-trust.ps1");if(await G0.writeFile(z,j),IW(`powershell -ExecutionPolicy Bypass -File "${z}"`),w.verbose)H.success("Successfully added certificate to Windows trust store");B=!0}catch(j){if(w.verbose)H.warn(`Could not trust certificate: ${j}`)}else try{await CQ(W,J.certificate,Y),B=!0}catch(j){if(w.verbose)H.warn(`Could not add certificate to trust store: ${j}`)}if(y$={key:W.privateKey,cert:W.certificate,ca:J.certificate},w.verbose)H.success(`Certificate generated successfully for ${$.length} domain${$.length>1?"s":""}`);if(!B&&w.verbose)H.warn('If you see certificate warnings in Chrome/Arc, type "thisisunsafe" on the warning page'),H.warn("This will bypass the warning and you should only need to do it once")}function C8(){y$=null}async function Q$(w){if(!w)return null;if(y$)return y$;let $=DY(w);try{let[Y,A,X]=await Promise.all([G0.access($.keyPath).then(()=>!0).catch(()=>!1),G0.access($.certPath).then(()=>!0).catch(()=>!1),$.caCertPath?G0.access($.caCertPath).then(()=>!0).catch(()=>!1):Promise.resolve(!1)]);if(!Y||!A)return F("ssl",`Certificate files don't exist: key=${Y}, cert=${A}, paths: ${$.keyPath}, ${$.certPath}`,w.verbose),null;let J="regenerateUntrustedCerts"in w,U=w.regenerateUntrustedCerts,W=J?U!==!1:!0;F("ssl",`Trust check: hasFlag=${J}, flagValue=${U}, shouldCheckTrust=${W}`,w.verbose);let Q=$.basePath||K0(d1(),".stacks","ssl"),B=VG(Q);if(!(W?await OG(B.caCertPath,w):!0))return F("ssl","Root CA exists but is not trusted, will regenerate",w.verbose),null;let[z,G,K]=await Promise.all([G0.readFile($.keyPath,"utf8"),G0.readFile($.certPath,"utf8"),X&&$.caCertPath?G0.readFile($.caCertPath,"utf8"):Promise.resolve(void 0)]);if(K&&!K.includes("-----BEGIN CERTIFICATE-----"))return F("ssl","Invalid root CA certificate content, will regenerate",w.verbose),null;if(d$(w))try{let{X509Certificate:E}=await import("node:crypto"),N=new E(G).subjectAltName||"",R=w.proxies.map((y)=>y.to).filter((y)=>!N.includes(`DNS:${y}`));if(R.length>0)return F("ssl",`Certificate missing SANs for: ${R.join(", ")}, will regenerate`,w.verbose),null}catch(E){F("ssl",`Could not verify cert SANs: ${E}`,w.verbose)}return F("ssl","Successfully loaded existing certificates",w.verbose),y$={key:z,cert:G,ca:K},y$}catch(Y){return F("ssl",`Error checking existing certificates: ${Y}`,w.verbose),null}}function DY(w,$){let Y=H8(w);F("ssl",`Primary domain: ${Y}`,$);let A=CG(w),X=K0(d1(),".stacks","ssl");if(typeof w.https==="object"){let J=w.https.basePath&&w.https.basePath.trim()!==""?w.https.basePath:X,U={domain:Y,hostCertCN:Y,basePath:J,caCertPath:w.https.caCertPath||A.caCertPath,certPath:w.https.certPath||A.certPath,keyPath:w.https.keyPath||A.keyPath,altNameIPs:["127.0.0.1","::1"],altNameURIs:[],commonName:w.https.commonName||Y,organizationName:w.https.organizationName||"Local Development",countryName:w.https.countryName||"US",stateName:w.https.stateName||"California",localityName:w.https.localityName||"Playa Vista",validityDays:w.https.validityDays||825,verbose:$||!1,subjectAltNames:Array.from(MG(w)).map((W)=>({type:2,value:W}))};if(qW(w.https.rootCA))U.rootCA=w.https.rootCA;return U}return{domain:Y,hostCertCN:Y,basePath:X,...A,altNameIPs:["127.0.0.1","::1"],altNameURIs:[],commonName:Y,organizationName:"Local Development",countryName:"US",stateName:"California",localityName:"Playa Vista",validityDays:825,verbose:$||!1,subjectAltNames:Array.from(MG(w)).map((J)=>({type:2,value:J}))}}async function yG(w,$){let Y=CG({to:w,verbose:$}),A=[Y.caCertPath,Y.certPath,Y.keyPath];F("certificates","Attempting to clean up relating certificates",$),await Promise.all(A.map((X)=>EW(X,$)))}async function OG(w,$){try{if(F("ssl",`Checking if certificate is trusted: ${w}`,$?.verbose),C$.platform==="darwin"){if($?.serverName)return RW(w,$.serverName,{verbose:$?.verbose});return I8(w,{verbose:$?.verbose})}else if(C$.platform==="win32")try{let Y=SQ(w)||"";if(!Y)return F("ssl","Could not extract certificate subject",$?.verbose),!1;let A=`powershell -Command "Get-ChildItem -Path Cert:\\LocalMachine\\Root | Where-Object { $_.Subject -like '*${Y}*' } | Select-Object Subject"`;if(IW(A).toString().includes(Y))return F("ssl","Certificate found in trusted root store",$?.verbose),!0;return F("ssl","Certificate not found in trusted root store",$?.verbose),!1}catch(Y){return F("ssl",`Error checking certificate trust on Windows: ${Y}`,$?.verbose),!1}else if(C$.platform==="linux")try{let Y=v$(w);if(!Y)return F("ssl","Could not extract certificate fingerprint",$?.verbose),!1;let A=["/etc/ssl/certs","/etc/pki/tls/certs"];for(let X of A){let J;try{J=await G0.readdir(X)}catch{continue}for(let U of J){let W=v$(IG.join(X,U));if(W&&W===Y)return F("ssl",`Certificate fingerprint found in ${X}`,$?.verbose),!0}}return F("ssl","Certificate not found in system trust stores",$?.verbose),!1}catch(Y){return F("ssl",`Error checking certificate trust on Linux: ${Y}`,$?.verbose),!1}return F("ssl",`Platform ${C$.platform} not supported for certificate trust check`,$?.verbose),!1}catch(Y){return F("ssl",`Error checking if certificate is trusted: ${Y}`,$?.verbose),!1}}var y$=null,V8,wH="rpx-root-ca.crt",$H="rpx-root-ca.key";var y8=t(()=>{vX();lw();_Q();MW();X0();MW();mX();mX();V8=K0(d1(),".stacks","ssl","rpx.localhost.crt")});function AH(w){return{enabled:w?.enabled??!1,path:w?.path??"/",interval:w?.interval??1e4,timeout:w?.timeout??2000,healthyThreshold:w?.healthyThreshold??2,unhealthyThreshold:w?.unhealthyThreshold??3}}function XH(w){return(Array.isArray(w)?w:[w]).map((Y)=>{let A=typeof Y==="string"?{url:Y}:Y;return{url:A.url,weight:A.weight&&A.weight>0?A.weight:1,healthy:!0,activeConnections:0,consecutiveFailures:0,consecutiveSuccesses:0}})}function OW(w){return(Array.isArray(w)?w:[w]).map((Y)=>typeof Y==="string"?Y:Y.url)}function O$(w){if(!w)return"localhost:5173";let $=Array.isArray(w)?w[0]:w;if(!$)return"localhost:5173";return typeof $==="string"?$:$.url}function n1(w,$){return{upstreams:XH(w),strategy:$?.strategy??"round-robin",healthCheck:AH($?.healthCheck),cursor:0,wrrCurrentWeights:[],healthCheckTimer:null}}function JH(w){let $=w.upstreams.filter((Y)=>Y.healthy);if($.length===0&&w.upstreams.length===1)return w.upstreams;return $}function UH(w,$){let Y=w.cursor%$.length;return w.cursor=(w.cursor+1)%$.length,$[Y]}function QH(w,$){if(w.wrrCurrentWeights.length!==$.length)w.wrrCurrentWeights=$.map(()=>0);let Y=$.reduce((X,J)=>X+J.weight,0),A=0;for(let X=0;X<$.length;X++)if(w.wrrCurrentWeights[X]+=$[X].weight,w.wrrCurrentWeights[X]>w.wrrCurrentWeights[A])A=X;return w.wrrCurrentWeights[A]-=Y,$[A]}function WH(w){let $=w[0];for(let Y=1;Y<w.length;Y++)if(w[Y].activeConnections<$.activeConnections)$=w[Y];return $}function LG(w){let $=JH(w);if($.length===0)return;if($.length===1)return $[0];switch(w.strategy){case"weighted-round-robin":return QH(w,$);case"least-connections":return WH($);case"round-robin":default:return UH(w,$)}}function O8(w,$){if($.consecutiveFailures=0,$.consecutiveSuccesses+=1,!$.healthy&&$.consecutiveSuccesses>=w.healthCheck.healthyThreshold)$.healthy=!0}function xY(w,$){if($.consecutiveSuccesses=0,$.consecutiveFailures+=1,$.healthy&&$.consecutiveFailures>=w.healthCheck.unhealthyThreshold)$.healthy=!1}function BH(w){let $=w.lastIndexOf(":");if($===-1)return{hostname:w,port:80};let Y=Number(w.slice($+1));return{hostname:w.slice(0,$),port:Number.isFinite(Y)?Y:80}}async function jH(w,$){let{hostname:Y,port:A}=BH($.url),X=new AbortController,J=setTimeout(()=>X.abort(),w.healthCheck.timeout);try{(await fetch(`http://${Y}:${A}${w.healthCheck.path}`,{signal:X.signal,redirect:"manual"})).body?.cancel().catch(()=>{}),O8(w,$)}catch{xY(w,$)}finally{clearTimeout(J)}}function p1(w){if(!w.healthCheck.enabled||w.healthCheckTimer||w.upstreams.length<2)return;let $=setInterval(()=>{for(let Y of w.upstreams)jH(w,Y)},w.healthCheck.interval);$.unref?.(),w.healthCheckTimer=$}function l$(w){if(w.healthCheckTimer)clearInterval(w.healthCheckTimer),w.healthCheckTimer=null}import{createHash as SG,timingSafeEqual as _G}from"node:crypto";import{readFileSync as zH}from"node:fs";function PY(w,$){let Y=Buffer.from(w,"utf8"),A=Buffer.from($,"utf8");if(Y.length!==A.length)return _G(Y,Y),!1;return _G(Y,A)}function KH(w,$){let Y=(G)=>SG("md5").update(G).digest(),A=Buffer.from(w,"utf8"),X=Buffer.from($,"utf8"),J=Y(Buffer.concat([A,X,A])),U=[A,Buffer.from("$apr1$","utf8"),X];for(let G=A.length;G>0;G-=16)U.push(J.subarray(0,Math.min(G,16)));for(let G=A.length;G>0;G>>=1)U.push(G&1?Buffer.from([0]):A.subarray(0,1));let W=Y(Buffer.concat(U));for(let G=0;G<1000;G++){let K=[];if(K.push(G&1?A:W.subarray(0,16)),G%3)K.push(X);if(G%7)K.push(A);K.push(G&1?W.subarray(0,16):A),W=Y(Buffer.concat(K))}let Q="./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",B=(G,K)=>{let E="",q=G;for(let N=0;N<K;N++)E+=Q[q&63],q>>=6;return E},j=W,z="";return z+=B(j[0]<<16|j[6]<<8|j[12],4),z+=B(j[1]<<16|j[7]<<8|j[13],4),z+=B(j[2]<<16|j[8]<<8|j[14],4),z+=B(j[3]<<16|j[9]<<8|j[15],4),z+=B(j[4]<<16|j[10]<<8|j[5],4),z+=B(j[11],2),`$apr1$${$}$${z}`}function FH(w,$){if(/^\$2[aby]?\$/.test($))try{return Bun.password.verifySync(w,$)}catch{return!1}if($.startsWith("$apr1$")){let A=$.split("$")[2]??"";return PY(KH(w,A),$)}if($.startsWith("{SHA}")){let Y=SG("sha1").update(w,"utf8").digest("base64");return PY(`{SHA}${Y}`,$)}return PY(w,$)}function qH(w){let $=new Map;for(let Y of w.split(`
222
- `)){let A=Y.trim();if(!A||A.startsWith("#"))continue;let X=A.indexOf(":");if(X<=0)continue;$.set(A.slice(0,X),A.slice(X+1))}return $}function r1(w){if(!w)return;let $=(w.realm??"").trim()||"Restricted",Y=[];if(w.username)Y.push({username:w.username,password:w.password??""});for(let J of w.users??[])if(J?.username)Y.push({username:J.username,password:J.password??""});let A;if(w.htpasswdFile)try{A=qH(zH(w.htpasswdFile,"utf8"))}catch{A=void 0}if(Y.length===0&&(!A||A.size===0))return;return{realm:$,verify:(J,U)=>{let W=!1;for(let Q of Y)if(PY(J,Q.username)&&PY(U,Q.password))W=!0;if(A){let Q=A.get(J);if(Q&&FH(U,Q))W=!0}return W}}}function ZG(w,$,Y){if($.startsWith(GH))return;let A=w.headers.get("authorization")??"",X=A.indexOf(" "),J=X===-1?A:A.slice(0,X),U=X===-1?"":A.slice(X+1).trim();if(J.toLowerCase()==="basic"&&U){let Q="";try{Q=Buffer.from(U,"base64").toString("utf8")}catch{Q=""}let B=Q.indexOf(":");if(B>=0&&Y.verify(Q.slice(0,B),Q.slice(B+1)))return}let W=Y.realm.replace(/["\\]/g,"");return new Response("401 Unauthorized",{status:401,headers:{"www-authenticate":`Basic realm="${W}", charset="UTF-8"`,"content-type":"text/plain; charset=utf-8"}})}var GH="/.well-known/acme-challenge/";var bY=()=>{};function TH(w){return EH.has(w.toUpperCase())}function fH(){let w=Number.parseInt(process.env.RPX_QUEUE_WAIT_MS??"",10);return Number.isFinite(w)&&w>0?w:30000}function HH(w){let $=Number.parseInt(process.env.RPX_MAX_QUEUED??"",10);return Number.isFinite($)&&$>0?$:w*8}function RH(){let w=Number.parseInt(process.env.RPX_CHECKOUT_IDLE_MS??"",10);return Number.isFinite(w)&&w>0?w:0}function MH(){let w=Number.parseInt(process.env.RPX_UPSTREAM_TIMEOUT??"",10);return Number.isFinite(w)&&w>0?w:0}function IH(){let w=Number.parseInt(process.env.RPX_MAX_UPSTREAM_CONNS??"",10);return Number.isFinite(w)&&w>0?w:256}class PG{socket=null;buf=new Uint8Array(VH);len=0;pos=0;closed=!1;fresh=!0;timedOut=!1;idleSince=0;bodyQueue=null;bodyRemaining=0;queuedBytes=0;streamingBody=!1;paused=!1;lastActivityAt=0;waiter=null;drainWaiter=null;async writeAll(w){let $=this.socket,Y=$.write(w);while(Y<w.length){if(this.closed)throw L8;await new Promise((A)=>{this.drainWaiter=A}),Y+=$.write(w.subarray(Y))}}wakeDrain(){let w=this.drainWaiter;if(w)this.drainWaiter=null,w()}push(w){if(this.bodyQueue){let $=w.length<=this.bodyRemaining?w.length:this.bodyRemaining;if($>0)this.bodyQueue.push(w.slice(0,$)),this.queuedBytes+=$;if(this.bodyRemaining-=$,$<w.length)this.appendToBuf(w.subarray($));this.maybePause(),this.lastActivityAt=Date.now(),this.wake();return}this.appendToBuf(w),this.maybePause(),this.lastActivityAt=Date.now(),this.wake()}bufferedBodyBytes(){return this.bodyQueue?this.queuedBytes:this.len-this.pos}maybePause(){if(this.streamingBody&&!this.paused&&this.bufferedBodyBytes()>CH)this.paused=!0,this.socket?.pause?.()}resumeIfDrained(){if(this.lastActivityAt=Date.now(),this.paused&&this.bufferedBodyBytes()<=yH)this.paused=!1,this.socket?.resume?.()}clearStreaming(){if(this.streamingBody=!1,this.queuedBytes=0,this.paused)this.paused=!1,this.socket?.resume?.()}appendToBuf(w){let $=this.len+w.length;if($>this.buf.length){let Y=new Uint8Array(Math.max(this.buf.length*2,$));Y.set(this.buf.subarray(0,this.len)),this.buf=Y}this.buf.set(w,this.len),this.len=$}markClosed(){this.closed=!0,this.wake(),this.wakeDrain()}markTimedOut(){this.timedOut=!0,this.markClosed()}wake(){let w=this.waiter;if(w)this.waiter=null,w()}waitForData(w){if(this.len>w||this.closed)return Promise.resolve();return new Promise(($)=>{this.waiter=$})}waitForBody(){if(this.bodyQueue!==null&&this.bodyQueue.length>0||this.closed)return Promise.resolve();return new Promise((w)=>{this.waiter=w})}compact(){if(this.pos===0)return;if(this.pos===this.len){this.pos=0,this.len=0;return}this.buf.copyWithin(0,this.pos,this.len),this.len-=this.pos,this.pos=0}destroy(){this.closed=!0;try{this.socket?.end()}catch{}this.socket=null}}class bG{host;port;maxTotal;key;idle=[];waiters=[];open=0;sweeper=null;queueWaitMs=fH();maxWaiters;checkoutIdleMs=RH();inUse=new Set;constructor(w,$,Y,A=""){this.host=w;this.port=$;this.maxTotal=Y;this.key=A;this.maxWaiters=HH(Y)}trackCheckout(w){if(w.lastActivityAt=Date.now(),this.checkoutIdleMs>0)this.inUse.add(w),this.ensureSweeper()}dial(){let w=new PG;return NH({hostname:this.host,port:this.port,socket:{data:($,Y)=>w.push(Y),drain:()=>w.wakeDrain(),close:()=>w.markClosed(),end:()=>w.markClosed(),error:()=>w.markClosed(),connectError:()=>w.markClosed(),timeout:()=>w.markTimedOut()}}).then(($)=>{let Y=$;Y.setNoDelay?.(!0);let A=MH();if(A>0)Y.timeout?.(A);return w.socket=$,w})}acquireIdleSync(){while(this.idle.length){let w=this.idle.pop();if(!w.closed)return w.socket?.ref(),w.pos=0,w.len=0,this.trackCheckout(w),w;this.open--}return null}async acquireOrDial(){if(this.open>=this.maxTotal){if(this.waiters.length>=this.maxWaiters)throw n$;let w=await this.waitForSlot();if(w===n$)throw n$;if(w)return w.pos=0,w.len=0,this.trackCheckout(w),w}this.open++;try{let w=await this.dial();return this.trackCheckout(w),w}catch(w){throw this.open--,this.wakeWaiter(),w}}waitForSlot(){return new Promise((w)=>{let $=!1,Y=(J)=>{if($)return;$=!0,clearTimeout(X),w(J)},A=(J)=>Y(J),X=setTimeout(()=>{let J=this.waiters.indexOf(A);if(J!==-1)this.waiters.splice(J,1);Y(n$)},this.queueWaitMs);X.unref?.(),this.waiters.push(A)})}release(w){if(this.inUse.delete(w),w.closed){this.open--,this.wakeWaiter();return}w.clearStreaming(),w.compact(),w.fresh=!1;let $=this.waiters.shift();if($){w.socket?.ref(),this.trackCheckout(w),$(w);return}w.idleSince=Date.now(),w.socket?.unref(),this.idle.push(w),this.ensureSweeper()}destroy(w){this.inUse.delete(w),w.destroy(),this.open--,this.wakeWaiter()}wakeWaiter(){let w=this.waiters.shift();if(w)w(null)}ensureSweeper(){if(this.sweeper)return;let w=this.checkoutIdleMs>0?Math.min(LW,this.checkoutIdleMs):LW;this.sweeper=setInterval(()=>this.sweep(),w),this.sweeper.unref?.()}sweep(){let w=Date.now(),$=w-LW;if(this.idle.length){let Y=[];for(let A of this.idle)if(A.closed||A.idleSince<=$)A.destroy(),this.open--;else Y.push(A);this.idle=Y}if(this.checkoutIdleMs>0&&this.inUse.size){let Y=w-this.checkoutIdleMs;for(let A of this.inUse)if(!A.closed&&A.lastActivityAt>0&&A.lastActivityAt<=Y)A.markTimedOut()}if(this.idle.length===0&&this.inUse.size===0&&this.sweeper){if(clearInterval(this.sweeper),this.sweeper=null,this.key&&_8.get(this.key)===this)_8.delete(this.key)}}}function ZH(w,$){let Y=_8.get(w);if(!Y){let A=w.lastIndexOf(":"),X=A===-1?w:w.slice(0,A),J=A===-1?80:Number(w.slice(A+1));Y=new bG(X,J,$,w),_8.set(w,Y)}return Y}function kG(w,$,Y){for(let A=Y+3;A<$;A++)if(w[A]===10&&w[A-1]===13&&w[A-2]===10&&w[A-3]===13)return A-3;return-1}function kH(w,$,Y){let A=xG.decode(w.subarray($,Y)),X=A.indexOf(`\r
221
+ `,z=K0(CW.tmpdir(),"rpx-trust.ps1");if(await G0.writeFile(z,j),VW(`powershell -ExecutionPolicy Bypass -File "${z}"`),w.verbose)H.success("Successfully added certificate to Windows trust store");B=!0}catch(j){if(w.verbose)H.warn(`Could not trust certificate: ${j}`)}else try{await OQ(W,J.certificate,Y),B=!0}catch(j){if(w.verbose)H.warn(`Could not add certificate to trust store: ${j}`)}if(O$={key:W.privateKey,cert:W.certificate,ca:J.certificate},w.verbose)H.success(`Certificate generated successfully for ${$.length} domain${$.length>1?"s":""}`);if(!B&&w.verbose)H.warn('If you see certificate warnings in Chrome/Arc, type "thisisunsafe" on the warning page'),H.warn("This will bypass the warning and you should only need to do it once")}function O8(){O$=null}async function Q$(w){if(!w)return null;if(O$)return O$;let $=PY(w);try{let[Y,A,X]=await Promise.all([G0.access($.keyPath).then(()=>!0).catch(()=>!1),G0.access($.certPath).then(()=>!0).catch(()=>!1),$.caCertPath?G0.access($.caCertPath).then(()=>!0).catch(()=>!1):Promise.resolve(!1)]);if(!Y||!A)return F("ssl",`Certificate files don't exist: key=${Y}, cert=${A}, paths: ${$.keyPath}, ${$.certPath}`,w.verbose),null;let J="regenerateUntrustedCerts"in w,U=w.regenerateUntrustedCerts,W=J?U!==!1:!0;F("ssl",`Trust check: hasFlag=${J}, flagValue=${U}, shouldCheckTrust=${W}`,w.verbose);let Q=$.basePath||K0(l1(),".stacks","ssl"),B=CG(Q);if(!(W?await LG(B.caCertPath,w):!0))return F("ssl","Root CA exists but is not trusted, will regenerate",w.verbose),null;let[z,G,K]=await Promise.all([G0.readFile($.keyPath,"utf8"),G0.readFile($.certPath,"utf8"),X&&$.caCertPath?G0.readFile($.caCertPath,"utf8"):Promise.resolve(void 0)]);if(K&&!K.includes("-----BEGIN CERTIFICATE-----"))return F("ssl","Invalid root CA certificate content, will regenerate",w.verbose),null;if(l$(w))try{let{X509Certificate:E}=await import("node:crypto"),N=new E(G).subjectAltName||"",R=w.proxies.map((y)=>y.to).filter((y)=>!N.includes(`DNS:${y}`));if(R.length>0)return F("ssl",`Certificate missing SANs for: ${R.join(", ")}, will regenerate`,w.verbose),null}catch(E){F("ssl",`Could not verify cert SANs: ${E}`,w.verbose)}return F("ssl","Successfully loaded existing certificates",w.verbose),O$={key:z,cert:G,ca:K},O$}catch(Y){return F("ssl",`Error checking existing certificates: ${Y}`,w.verbose),null}}function PY(w,$){let Y=M8(w);F("ssl",`Primary domain: ${Y}`,$);let A=yG(w),X=K0(l1(),".stacks","ssl");if(typeof w.https==="object"){let J=w.https.basePath&&w.https.basePath.trim()!==""?w.https.basePath:X,U={domain:Y,hostCertCN:Y,basePath:J,caCertPath:w.https.caCertPath||A.caCertPath,certPath:w.https.certPath||A.certPath,keyPath:w.https.keyPath||A.keyPath,altNameIPs:["127.0.0.1","::1"],altNameURIs:[],commonName:w.https.commonName||Y,organizationName:w.https.organizationName||"Local Development",countryName:w.https.countryName||"US",stateName:w.https.stateName||"California",localityName:w.https.localityName||"Playa Vista",validityDays:w.https.validityDays||825,verbose:$||!1,subjectAltNames:Array.from(IG(w)).map((W)=>({type:2,value:W}))};if(NW(w.https.rootCA))U.rootCA=w.https.rootCA;return U}return{domain:Y,hostCertCN:Y,basePath:X,...A,altNameIPs:["127.0.0.1","::1"],altNameURIs:[],commonName:Y,organizationName:"Local Development",countryName:"US",stateName:"California",localityName:"Playa Vista",validityDays:825,verbose:$||!1,subjectAltNames:Array.from(IG(w)).map((J)=>({type:2,value:J}))}}async function OG(w,$){let Y=yG({to:w,verbose:$}),A=[Y.caCertPath,Y.certPath,Y.keyPath];F("certificates","Attempting to clean up relating certificates",$),await Promise.all(A.map((X)=>fW(X,$)))}async function LG(w,$){try{if(F("ssl",`Checking if certificate is trusted: ${w}`,$?.verbose),y$.platform==="darwin"){if($?.serverName)return MW(w,$.serverName,{verbose:$?.verbose});return C8(w,{verbose:$?.verbose})}else if(y$.platform==="win32")try{let Y=kQ(w)||"";if(!Y)return F("ssl","Could not extract certificate subject",$?.verbose),!1;let A=`powershell -Command "Get-ChildItem -Path Cert:\\LocalMachine\\Root | Where-Object { $_.Subject -like '*${Y}*' } | Select-Object Subject"`;if(VW(A).toString().includes(Y))return F("ssl","Certificate found in trusted root store",$?.verbose),!0;return F("ssl","Certificate not found in trusted root store",$?.verbose),!1}catch(Y){return F("ssl",`Error checking certificate trust on Windows: ${Y}`,$?.verbose),!1}else if(y$.platform==="linux")try{let Y=m$(w);if(!Y)return F("ssl","Could not extract certificate fingerprint",$?.verbose),!1;let A=["/etc/ssl/certs","/etc/pki/tls/certs"];for(let X of A){let J;try{J=await G0.readdir(X)}catch{continue}for(let U of J){let W=m$(VG.join(X,U));if(W&&W===Y)return F("ssl",`Certificate fingerprint found in ${X}`,$?.verbose),!0}}return F("ssl","Certificate not found in system trust stores",$?.verbose),!1}catch(Y){return F("ssl",`Error checking certificate trust on Linux: ${Y}`,$?.verbose),!1}return F("ssl",`Platform ${y$.platform} not supported for certificate trust check`,$?.verbose),!1}catch(Y){return F("ssl",`Error checking if certificate is trusted: ${Y}`,$?.verbose),!1}}var O$=null,y8,YH="rpx-root-ca.crt",AH="rpx-root-ca.key";var L8=t(()=>{mX();lw();ZQ();IW();X0();IW();dX();dX();y8=K0(l1(),".stacks","ssl","rpx.localhost.crt")});function JH(w){return{enabled:w?.enabled??!1,path:w?.path??"/",interval:w?.interval??1e4,timeout:w?.timeout??2000,healthyThreshold:w?.healthyThreshold??2,unhealthyThreshold:w?.unhealthyThreshold??3}}function UH(w){return(Array.isArray(w)?w:[w]).map((Y)=>{let A=typeof Y==="string"?{url:Y}:Y;return{url:A.url,weight:A.weight&&A.weight>0?A.weight:1,healthy:!0,activeConnections:0,consecutiveFailures:0,consecutiveSuccesses:0}})}function LW(w){return(Array.isArray(w)?w:[w]).map((Y)=>typeof Y==="string"?Y:Y.url)}function L$(w){if(!w)return"localhost:5173";let $=Array.isArray(w)?w[0]:w;if(!$)return"localhost:5173";return typeof $==="string"?$:$.url}function p1(w,$){return{upstreams:UH(w),strategy:$?.strategy??"round-robin",healthCheck:JH($?.healthCheck),cursor:0,wrrCurrentWeights:[],healthCheckTimer:null}}function QH(w){let $=w.upstreams.filter((Y)=>Y.healthy);if($.length===0&&w.upstreams.length===1)return w.upstreams;return $}function WH(w,$){let Y=w.cursor%$.length;return w.cursor=(w.cursor+1)%$.length,$[Y]}function BH(w,$){if(w.wrrCurrentWeights.length!==$.length)w.wrrCurrentWeights=$.map(()=>0);let Y=$.reduce((X,J)=>X+J.weight,0),A=0;for(let X=0;X<$.length;X++)if(w.wrrCurrentWeights[X]+=$[X].weight,w.wrrCurrentWeights[X]>w.wrrCurrentWeights[A])A=X;return w.wrrCurrentWeights[A]-=Y,$[A]}function jH(w){let $=w[0];for(let Y=1;Y<w.length;Y++)if(w[Y].activeConnections<$.activeConnections)$=w[Y];return $}function _G(w){let $=QH(w);if($.length===0)return;if($.length===1)return $[0];switch(w.strategy){case"weighted-round-robin":return BH(w,$);case"least-connections":return jH($);case"round-robin":default:return WH(w,$)}}function _8(w,$){if($.consecutiveFailures=0,$.consecutiveSuccesses+=1,!$.healthy&&$.consecutiveSuccesses>=w.healthCheck.healthyThreshold)$.healthy=!0}function bY(w,$){if($.consecutiveSuccesses=0,$.consecutiveFailures+=1,$.healthy&&$.consecutiveFailures>=w.healthCheck.unhealthyThreshold)$.healthy=!1}function zH(w){let $=w.lastIndexOf(":");if($===-1)return{hostname:w,port:80};let Y=Number(w.slice($+1));return{hostname:w.slice(0,$),port:Number.isFinite(Y)?Y:80}}async function GH(w,$){let{hostname:Y,port:A}=zH($.url),X=new AbortController,J=setTimeout(()=>X.abort(),w.healthCheck.timeout);try{(await fetch(`http://${Y}:${A}${w.healthCheck.path}`,{signal:X.signal,redirect:"manual"})).body?.cancel().catch(()=>{}),_8(w,$)}catch{bY(w,$)}finally{clearTimeout(J)}}function r1(w){if(!w.healthCheck.enabled||w.healthCheckTimer||w.upstreams.length<2)return;let $=setInterval(()=>{for(let Y of w.upstreams)GH(w,Y)},w.healthCheck.interval);$.unref?.(),w.healthCheckTimer=$}function n$(w){if(w.healthCheckTimer)clearInterval(w.healthCheckTimer),w.healthCheckTimer=null}import{createHash as ZG,timingSafeEqual as SG}from"node:crypto";import{readFileSync as KH}from"node:fs";function uY(w,$){let Y=Buffer.from(w,"utf8"),A=Buffer.from($,"utf8");if(Y.length!==A.length)return SG(Y,Y),!1;return SG(Y,A)}function qH(w,$){let Y=(G)=>ZG("md5").update(G).digest(),A=Buffer.from(w,"utf8"),X=Buffer.from($,"utf8"),J=Y(Buffer.concat([A,X,A])),U=[A,Buffer.from("$apr1$","utf8"),X];for(let G=A.length;G>0;G-=16)U.push(J.subarray(0,Math.min(G,16)));for(let G=A.length;G>0;G>>=1)U.push(G&1?Buffer.from([0]):A.subarray(0,1));let W=Y(Buffer.concat(U));for(let G=0;G<1000;G++){let K=[];if(K.push(G&1?A:W.subarray(0,16)),G%3)K.push(X);if(G%7)K.push(A);K.push(G&1?W.subarray(0,16):A),W=Y(Buffer.concat(K))}let Q="./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",B=(G,K)=>{let E="",q=G;for(let N=0;N<K;N++)E+=Q[q&63],q>>=6;return E},j=W,z="";return z+=B(j[0]<<16|j[6]<<8|j[12],4),z+=B(j[1]<<16|j[7]<<8|j[13],4),z+=B(j[2]<<16|j[8]<<8|j[14],4),z+=B(j[3]<<16|j[9]<<8|j[15],4),z+=B(j[4]<<16|j[10]<<8|j[5],4),z+=B(j[11],2),`$apr1$${$}$${z}`}function NH(w,$){if(/^\$2[aby]?\$/.test($))try{return Bun.password.verifySync(w,$)}catch{return!1}if($.startsWith("$apr1$")){let A=$.split("$")[2]??"";return uY(qH(w,A),$)}if($.startsWith("{SHA}")){let Y=ZG("sha1").update(w,"utf8").digest("base64");return uY(`{SHA}${Y}`,$)}return uY(w,$)}function EH(w){let $=new Map;for(let Y of w.split(`
222
+ `)){let A=Y.trim();if(!A||A.startsWith("#"))continue;let X=A.indexOf(":");if(X<=0)continue;$.set(A.slice(0,X),A.slice(X+1))}return $}function t1(w){if(!w)return;let $=(w.realm??"").trim()||"Restricted",Y=[];if(w.username)Y.push({username:w.username,password:w.password??""});for(let J of w.users??[])if(J?.username)Y.push({username:J.username,password:J.password??""});let A;if(w.htpasswdFile)try{A=EH(KH(w.htpasswdFile,"utf8"))}catch{A=void 0}if(Y.length===0&&(!A||A.size===0))return;return{realm:$,verify:(J,U)=>{let W=!1;for(let Q of Y)if(uY(J,Q.username)&&uY(U,Q.password))W=!0;if(A){let Q=A.get(J);if(Q&&NH(U,Q))W=!0}return W}}}function kG(w,$,Y){if($.startsWith(FH))return;let A=w.headers.get("authorization")??"",X=A.indexOf(" "),J=X===-1?A:A.slice(0,X),U=X===-1?"":A.slice(X+1).trim();if(J.toLowerCase()==="basic"&&U){let Q="";try{Q=Buffer.from(U,"base64").toString("utf8")}catch{Q=""}let B=Q.indexOf(":");if(B>=0&&Y.verify(Q.slice(0,B),Q.slice(B+1)))return}let W=Y.realm.replace(/["\\]/g,"");return new Response("401 Unauthorized",{status:401,headers:{"www-authenticate":`Basic realm="${W}", charset="UTF-8"`,"content-type":"text/plain; charset=utf-8"}})}var FH="/.well-known/acme-challenge/";var cY=()=>{};function HH(w){return TH.has(w.toUpperCase())}function RH(){let w=Number.parseInt(process.env.RPX_QUEUE_WAIT_MS??"",10);return Number.isFinite(w)&&w>0?w:30000}function MH(w){let $=Number.parseInt(process.env.RPX_MAX_QUEUED??"",10);return Number.isFinite($)&&$>0?$:w*8}function IH(){let w=Number.parseInt(process.env.RPX_CHECKOUT_IDLE_MS??"",10);return Number.isFinite(w)&&w>0?w:0}function VH(){let w=Number.parseInt(process.env.RPX_UPSTREAM_TIMEOUT??"",10);return Number.isFinite(w)&&w>0?w:0}function CH(){let w=Number.parseInt(process.env.RPX_MAX_UPSTREAM_CONNS??"",10);return Number.isFinite(w)&&w>0?w:256}class bG{socket=null;buf=new Uint8Array(yH);len=0;pos=0;closed=!1;fresh=!0;timedOut=!1;idleSince=0;bodyQueue=null;bodyRemaining=0;queuedBytes=0;streamingBody=!1;paused=!1;lastActivityAt=0;waiter=null;drainWaiter=null;async writeAll(w){let $=this.socket,Y=$.write(w);while(Y<w.length){if(this.closed)throw S8;await new Promise((A)=>{this.drainWaiter=A}),Y+=$.write(w.subarray(Y))}}wakeDrain(){let w=this.drainWaiter;if(w)this.drainWaiter=null,w()}push(w){if(this.bodyQueue){let $=w.length<=this.bodyRemaining?w.length:this.bodyRemaining;if($>0)this.bodyQueue.push(w.slice(0,$)),this.queuedBytes+=$;if(this.bodyRemaining-=$,$<w.length)this.appendToBuf(w.subarray($));this.maybePause(),this.lastActivityAt=Date.now(),this.wake();return}this.appendToBuf(w),this.maybePause(),this.lastActivityAt=Date.now(),this.wake()}bufferedBodyBytes(){return this.bodyQueue?this.queuedBytes:this.len-this.pos}maybePause(){if(this.streamingBody&&!this.paused&&this.bufferedBodyBytes()>OH)this.paused=!0,this.socket?.pause?.()}resumeIfDrained(){if(this.lastActivityAt=Date.now(),this.paused&&this.bufferedBodyBytes()<=LH)this.paused=!1,this.socket?.resume?.()}clearStreaming(){if(this.streamingBody=!1,this.queuedBytes=0,this.paused)this.paused=!1,this.socket?.resume?.()}appendToBuf(w){let $=this.len+w.length;if($>this.buf.length){let Y=new Uint8Array(Math.max(this.buf.length*2,$));Y.set(this.buf.subarray(0,this.len)),this.buf=Y}this.buf.set(w,this.len),this.len=$}markClosed(){this.closed=!0,this.wake(),this.wakeDrain()}markTimedOut(){this.timedOut=!0,this.markClosed()}wake(){let w=this.waiter;if(w)this.waiter=null,w()}waitForData(w){if(this.len>w||this.closed)return Promise.resolve();return new Promise(($)=>{this.waiter=$})}waitForBody(){if(this.bodyQueue!==null&&this.bodyQueue.length>0||this.closed)return Promise.resolve();return new Promise((w)=>{this.waiter=w})}compact(){if(this.pos===0)return;if(this.pos===this.len){this.pos=0,this.len=0;return}this.buf.copyWithin(0,this.pos,this.len),this.len-=this.pos,this.pos=0}destroy(){this.closed=!0;try{this.socket?.end()}catch{}this.socket=null}}class uG{host;port;maxTotal;key;idle=[];waiters=[];open=0;sweeper=null;queueWaitMs=RH();maxWaiters;checkoutIdleMs=IH();inUse=new Set;constructor(w,$,Y,A=""){this.host=w;this.port=$;this.maxTotal=Y;this.key=A;this.maxWaiters=MH(Y)}trackCheckout(w){if(w.lastActivityAt=Date.now(),this.checkoutIdleMs>0)this.inUse.add(w),this.ensureSweeper()}dial(){let w=new bG;return fH({hostname:this.host,port:this.port,socket:{data:($,Y)=>w.push(Y),drain:()=>w.wakeDrain(),close:()=>w.markClosed(),end:()=>w.markClosed(),error:()=>w.markClosed(),connectError:()=>w.markClosed(),timeout:()=>w.markTimedOut()}}).then(($)=>{let Y=$;Y.setNoDelay?.(!0);let A=VH();if(A>0)Y.timeout?.(A);return w.socket=$,w})}acquireIdleSync(){while(this.idle.length){let w=this.idle.pop();if(!w.closed)return w.socket?.ref(),w.pos=0,w.len=0,this.trackCheckout(w),w;this.open--}return null}async acquireOrDial(){if(this.open>=this.maxTotal){if(this.waiters.length>=this.maxWaiters)throw p$;let w=await this.waitForSlot();if(w===p$)throw p$;if(w)return w.pos=0,w.len=0,this.trackCheckout(w),w}this.open++;try{let w=await this.dial();return this.trackCheckout(w),w}catch(w){throw this.open--,this.wakeWaiter(),w}}waitForSlot(){return new Promise((w)=>{let $=!1,Y=(J)=>{if($)return;$=!0,clearTimeout(X),w(J)},A=(J)=>Y(J),X=setTimeout(()=>{let J=this.waiters.indexOf(A);if(J!==-1)this.waiters.splice(J,1);Y(p$)},this.queueWaitMs);X.unref?.(),this.waiters.push(A)})}release(w){if(this.inUse.delete(w),w.closed){this.open--,this.wakeWaiter();return}w.clearStreaming(),w.compact(),w.fresh=!1;let $=this.waiters.shift();if($){w.socket?.ref(),this.trackCheckout(w),$(w);return}w.idleSince=Date.now(),w.socket?.unref(),this.idle.push(w),this.ensureSweeper()}destroy(w){this.inUse.delete(w),w.destroy(),this.open--,this.wakeWaiter()}wakeWaiter(){let w=this.waiters.shift();if(w)w(null)}ensureSweeper(){if(this.sweeper)return;let w=this.checkoutIdleMs>0?Math.min(_W,this.checkoutIdleMs):_W;this.sweeper=setInterval(()=>this.sweep(),w),this.sweeper.unref?.()}sweep(){let w=Date.now(),$=w-_W;if(this.idle.length){let Y=[];for(let A of this.idle)if(A.closed||A.idleSince<=$)A.destroy(),this.open--;else Y.push(A);this.idle=Y}if(this.checkoutIdleMs>0&&this.inUse.size){let Y=w-this.checkoutIdleMs;for(let A of this.inUse)if(!A.closed&&A.lastActivityAt>0&&A.lastActivityAt<=Y)A.markTimedOut()}if(this.idle.length===0&&this.inUse.size===0&&this.sweeper){if(clearInterval(this.sweeper),this.sweeper=null,this.key&&Z8.get(this.key)===this)Z8.delete(this.key)}}}function hH(w,$){let Y=Z8.get(w);if(!Y){let A=w.lastIndexOf(":"),X=A===-1?w:w.slice(0,A),J=A===-1?80:Number(w.slice(A+1));Y=new uG(X,J,$,w),Z8.set(w,Y)}return Y}function hG(w,$,Y){for(let A=Y+3;A<$;A++)if(w[A]===10&&w[A-1]===13&&w[A-2]===10&&w[A-3]===13)return A-3;return-1}function DH(w,$,Y){let A=PG.decode(w.subarray($,Y)),X=A.indexOf(`\r
223
223
  `),J=X===-1?A:A.slice(0,X),U=J.indexOf(" "),W=Number.parseInt(J.slice(U+1,U+5),10),Q=J.startsWith("HTTP/1.0"),B=[],j=-1,z=!1,G=Q,K=!1,E=!1,q=X===-1?A.length:X+2;while(q<A.length){let N=A.indexOf(`\r
224
- `,q);if(N===-1)N=A.length;let f=A.slice(q,N);if(q=N+2,f==="")continue;let R=f.indexOf(":");if(R===-1)continue;let y=f.slice(0,R),V=f.slice(R+1).trim(),T=y.charCodeAt(0)|32;if(T===99||T===116||T===107){let M=y.toLowerCase();if(M==="content-length"){let O=/^\d+$/.test(V)?Number(V):Number.NaN;if(!Number.isSafeInteger(O)||j>=0&&j!==O)E=!0;else j=O;continue}if(M==="transfer-encoding"){if(V.toLowerCase().includes("chunked"))z=!0;continue}if(M==="connection"){let O=V.toLowerCase();if(O.includes("close"))G=!0;if(O.includes("keep-alive"))K=!0;continue}if(M==="keep-alive")continue}B.push([y,V])}if(Q&&K)G=!1;if(z&&j>=0)j=-1;return{status:W,headerEnd:Y,headers:B,contentLength:j,chunked:z,closeConn:G,malformed:E}}function hH(w,$){return $||w===204||w===304}async function uG(w){let{hostPort:$,method:Y,path:A,reqHeaders:X,forwardedHost:J,originOverride:U,body:W}=w,Q=Y==="HEAD";if(X.get("expect")||X.get("upgrade"))throw uY;let B=null;if(W){let K=X.get("content-length"),E=K?Number.parseInt(K,10):Number.NaN;if(Number.isNaN(E)||E>hG)throw uY;if(B=await vH(W),B===null)throw uY}let j=cH(Y,A,X,$,J,U,B),z=j;if(B&&B.length)z=new Uint8Array(j.length+B.length),z.set(j),z.set(B,j.length);let G=ZH($,w.maxPerHost??IH());for(let K=0;;K++){if(K>0)await new Promise((q)=>{setTimeout(q,K)});let E;try{E=G.acquireIdleSync()??await G.acquireOrDial()}catch(q){if(q!==n$&&K<4)continue;throw q}try{let q=E.socket.write(z);if(q<z.length)await E.writeAll(z.subarray(q));return await xH(G,E,Q)}catch(q){let N=q===L8&&K<4&&(E.fresh||TH(Y));if(G.destroy(E),N)continue;if(q===L8)throw Error("upstream closed connection");throw q}}}async function DH(w){let $=kG(w.buf,w.len,w.pos);while($===-1){if(w.closed){if(w.timedOut)throw _W;if(w.len===w.pos)throw L8;throw Error("upstream closed mid-header")}if(w.len-w.pos>DG)throw Error("upstream header block too large");await w.waitForData(w.len),$=kG(w.buf,w.len,w.pos)}return $}async function xH(w,$,Y){let A;for(;;){let J=await DH($);if(A=kH($.buf,$.pos,J),$.pos=J+4,A.status>=100&&A.status<200)continue;break}if(A.malformed)throw w.destroy($),Error("upstream sent malformed response framing");let X=A.headers;if(hH(A.status,Y))return cG(w,$,A.closeConn),new Response(null,{status:A.status,headers:X});if(A.chunked)return new Response(uH(w,$,A.closeConn),{status:A.status,headers:X});if(A.contentLength>=0){if($.len-$.pos>=A.contentLength){let U=$.pos+A.contentLength,W=$.len>U,Q=null;if(A.contentLength>=OH)Q=$.buf.subarray($.pos,U),$.buf=new Uint8Array(LH);else if(A.contentLength>0)Q=$.buf.slice($.pos,U);if($.pos=0,$.len=0,A.closeConn||W)w.destroy($);else w.release($);return new Response(Q,{status:A.status,headers:X})}return new Response(PH(w,$,A.contentLength,A.closeConn),{status:A.status,headers:X})}return new Response(bH($),{status:A.status,headers:X})}function cG(w,$,Y){if(Y||$.pos!==$.len)w.destroy($);else w.release($)}function PH(w,$,Y,A){let X=$.len-$.pos,J=X>0?$.buf.slice($.pos,$.len):null;$.pos=0,$.len=0,$.bodyQueue=[],$.bodyRemaining=Y-X,$.queuedBytes=0,$.streamingBody=!0;let U=(W)=>{if($.bodyQueue=null,A||$.len>0)w.destroy($);else w.release($);W.close()};return new ReadableStream({start(W){if(J)W.enqueue(J);if($.bodyRemaining===0&&$.bodyQueue.length===0)U(W)},async pull(W){for(;;){let Q=$.bodyQueue;if(Q&&Q.length>0){let B=Q.shift();if($.queuedBytes-=B.length,$.resumeIfDrained(),W.enqueue(B),$.bodyRemaining===0&&Q.length===0)U(W);return}if($.bodyRemaining===0){if($.bodyQueue)U(W);return}if($.closed){$.bodyQueue=null,w.destroy($),W.error(Error("upstream closed mid-body"));return}await $.waitForBody()}},cancel(){$.bodyQueue=null,w.destroy($)}})}function bH(w){return w.streamingBody=!0,new ReadableStream({async pull($){for(;;){if(w.len>w.pos){$.enqueue(w.buf.slice(w.pos,w.len)),w.pos=w.len,w.resumeIfDrained();return}if(w.closed){w.destroy(),$.close();return}await w.waitForData(w.len)}},cancel(){w.destroy()}})}function uH(w,$,Y){$.streamingBody=!0;let A=0,X=!1;async function J(){for(;;){for(let U=$.pos;U+1<$.len;U++)if($.buf[U]===13&&$.buf[U+1]===10){let W=xG.decode($.buf.subarray($.pos,U));return $.pos=U+2,W}if($.closed)throw Error("upstream closed mid-chunk-header");if($.len-$.pos>DG)throw Error("upstream chunk header too large");await $.waitForData($.len)}}return new ReadableStream({async pull(U){for(;;){if(A>0){if($.len===$.pos){if($.closed){w.destroy($),U.error(Error("upstream closed mid-chunk"));return}await $.waitForData($.len);continue}let j=Math.min(A,$.len-$.pos);if(U.enqueue($.buf.slice($.pos,$.pos+j)),$.pos+=j,A-=j,$.resumeIfDrained(),A===0)X=!0;return}if(X)await J(),X=!1;let W=await J(),Q=W.indexOf(";"),B=Number.parseInt(Q===-1?W:W.slice(0,Q),16);if(!Number.isInteger(B)||B<0){w.destroy($),U.error(Error("upstream sent malformed chunk size"));return}if(B===0){for(;;)if(await J()==="")break;cG(w,$,Y),U.close();return}A=B}},cancel(){w.destroy($)}})}function cH(w,$,Y,A,X,J,U){let W=`${w} ${$} HTTP/1.1\r
224
+ `,q);if(N===-1)N=A.length;let T=A.slice(q,N);if(q=N+2,T==="")continue;let R=T.indexOf(":");if(R===-1)continue;let y=T.slice(0,R),V=T.slice(R+1).trim(),f=y.charCodeAt(0)|32;if(f===99||f===116||f===107){let M=y.toLowerCase();if(M==="content-length"){let O=/^\d+$/.test(V)?Number(V):Number.NaN;if(!Number.isSafeInteger(O)||j>=0&&j!==O)E=!0;else j=O;continue}if(M==="transfer-encoding"){if(V.toLowerCase().includes("chunked"))z=!0;continue}if(M==="connection"){let O=V.toLowerCase();if(O.includes("close"))G=!0;if(O.includes("keep-alive"))K=!0;continue}if(M==="keep-alive")continue}B.push([y,V])}if(Q&&K)G=!1;if(z&&j>=0)j=-1;return{status:W,headerEnd:Y,headers:B,contentLength:j,chunked:z,closeConn:G,malformed:E}}function xH(w,$){return $||w===204||w===304}async function cG(w){let{hostPort:$,method:Y,path:A,reqHeaders:X,forwardedHost:J,originOverride:U,body:W}=w,Q=Y==="HEAD";if(X.get("expect")||X.get("upgrade"))throw vY;let B=null;if(W){let K=X.get("content-length"),E=K?Number.parseInt(K,10):Number.NaN;if(Number.isNaN(E)||E>DG)throw vY;if(B=await mH(W),B===null)throw vY}let j=iH(Y,A,X,$,J,U,B),z=j;if(B&&B.length)z=new Uint8Array(j.length+B.length),z.set(j),z.set(B,j.length);let G=hH($,w.maxPerHost??CH());for(let K=0;;K++){if(K>0)await new Promise((q)=>{setTimeout(q,K)});let E;try{E=G.acquireIdleSync()??await G.acquireOrDial()}catch(q){if(q!==p$&&K<4)continue;throw q}try{let q=E.socket.write(z);if(q<z.length)await E.writeAll(z.subarray(q));return await bH(G,E,Q)}catch(q){let N=q===S8&&K<4&&(E.fresh||HH(Y));if(G.destroy(E),N)continue;if(q===S8)throw Error("upstream closed connection");throw q}}}async function PH(w){let $=hG(w.buf,w.len,w.pos);while($===-1){if(w.closed){if(w.timedOut)throw SW;if(w.len===w.pos)throw S8;throw Error("upstream closed mid-header")}if(w.len-w.pos>xG)throw Error("upstream header block too large");await w.waitForData(w.len),$=hG(w.buf,w.len,w.pos)}return $}async function bH(w,$,Y){let A;for(;;){let J=await PH($);if(A=DH($.buf,$.pos,J),$.pos=J+4,A.status>=100&&A.status<200)continue;break}if(A.malformed)throw w.destroy($),Error("upstream sent malformed response framing");let X=A.headers;if(xH(A.status,Y))return vG(w,$,A.closeConn),new Response(null,{status:A.status,headers:X});if(A.chunked)return new Response(vH(w,$,A.closeConn),{status:A.status,headers:X});if(A.contentLength>=0){if($.len-$.pos>=A.contentLength){let U=$.pos+A.contentLength,W=$.len>U,Q=null;if(A.contentLength>=_H)Q=$.buf.subarray($.pos,U),$.buf=new Uint8Array(SH);else if(A.contentLength>0)Q=$.buf.slice($.pos,U);if($.pos=0,$.len=0,A.closeConn||W)w.destroy($);else w.release($);return new Response(Q,{status:A.status,headers:X})}return new Response(uH(w,$,A.contentLength,A.closeConn),{status:A.status,headers:X})}return new Response(cH($),{status:A.status,headers:X})}function vG(w,$,Y){if(Y||$.pos!==$.len)w.destroy($);else w.release($)}function uH(w,$,Y,A){let X=$.len-$.pos,J=X>0?$.buf.slice($.pos,$.len):null;$.pos=0,$.len=0,$.bodyQueue=[],$.bodyRemaining=Y-X,$.queuedBytes=0,$.streamingBody=!0;let U=(W)=>{if($.bodyQueue=null,A||$.len>0)w.destroy($);else w.release($);W.close()};return new ReadableStream({start(W){if(J)W.enqueue(J);if($.bodyRemaining===0&&$.bodyQueue.length===0)U(W)},async pull(W){for(;;){let Q=$.bodyQueue;if(Q&&Q.length>0){let B=Q.shift();if($.queuedBytes-=B.length,$.resumeIfDrained(),W.enqueue(B),$.bodyRemaining===0&&Q.length===0)U(W);return}if($.bodyRemaining===0){if($.bodyQueue)U(W);return}if($.closed){$.bodyQueue=null,w.destroy($),W.error(Error("upstream closed mid-body"));return}await $.waitForBody()}},cancel(){$.bodyQueue=null,w.destroy($)}})}function cH(w){return w.streamingBody=!0,new ReadableStream({async pull($){for(;;){if(w.len>w.pos){$.enqueue(w.buf.slice(w.pos,w.len)),w.pos=w.len,w.resumeIfDrained();return}if(w.closed){w.destroy(),$.close();return}await w.waitForData(w.len)}},cancel(){w.destroy()}})}function vH(w,$,Y){$.streamingBody=!0;let A=0,X=!1;async function J(){for(;;){for(let U=$.pos;U+1<$.len;U++)if($.buf[U]===13&&$.buf[U+1]===10){let W=PG.decode($.buf.subarray($.pos,U));return $.pos=U+2,W}if($.closed)throw Error("upstream closed mid-chunk-header");if($.len-$.pos>xG)throw Error("upstream chunk header too large");await $.waitForData($.len)}}return new ReadableStream({async pull(U){for(;;){if(A>0){if($.len===$.pos){if($.closed){w.destroy($),U.error(Error("upstream closed mid-chunk"));return}await $.waitForData($.len);continue}let j=Math.min(A,$.len-$.pos);if(U.enqueue($.buf.slice($.pos,$.pos+j)),$.pos+=j,A-=j,$.resumeIfDrained(),A===0)X=!0;return}if(X)await J(),X=!1;let W=await J(),Q=W.indexOf(";"),B=Number.parseInt(Q===-1?W:W.slice(0,Q),16);if(!Number.isInteger(B)||B<0){w.destroy($),U.error(Error("upstream sent malformed chunk size"));return}if(B===0){for(;;)if(await J()==="")break;vG(w,$,Y),U.close();return}A=B}},cancel(){w.destroy($)}})}function iH(w,$,Y,A,X,J,U){let W=`${w} ${$} HTTP/1.1\r
225
225
  host: ${A}\r
226
226
  x-forwarded-for: 127.0.0.1\r
227
227
  x-forwarded-proto: https\r
228
228
  x-forwarded-host: ${X}\r
229
229
  `;if(J!==void 0)W+=`origin: ${J}\r
230
- `;let Q=!1;for(let[B,j]of Y){let z=B.toLowerCase();if(SH.has(z))continue;if(J!==void 0&&z==="origin")continue;if(z==="content-length")Q=!0;W+=`${B}: ${j}\r
230
+ `;let Q=!1;for(let[B,j]of Y){let z=B.toLowerCase();if(kH.has(z))continue;if(J!==void 0&&z==="origin")continue;if(z==="content-length")Q=!0;W+=`${B}: ${j}\r
231
231
  `}if(W+=`connection: keep-alive\r
232
232
  `,U&&!Q)W+=`content-length: ${U.length}\r
233
233
  `;return W+=`\r
234
- `,_H.encode(W)}async function vH(w){let $=w.getReader(),Y=[],A=0;for(;;){let{done:U,value:W}=await $.read();if(U)break;if(W){if(A+=W.length,A>hG)return $.cancel().catch(()=>{}),null;Y.push(W)}}if(Y.length===1)return Y[0];let X=new Uint8Array(A),J=0;for(let U of Y)X.set(U,J),J+=U.length;return X}var NH,uY,L8,EH,_W,n$,hG=1048576,LW=30000,VH=16384,DG=262144,CH=2097152,yH=524288,OH=8192,LH=4096,_H,xG,SH,_8;var vG=t(()=>{({connect:NH}=Bun),uY=Symbol("rpx.pool.fallback"),L8=Symbol("rpx.pool.stale"),EH=new Set(["GET","HEAD","PUT","DELETE","OPTIONS","TRACE"]);_W=Symbol("rpx.pool.timeout"),n$=Symbol("rpx.pool.busy");_H=new TextEncoder,xG=new TextDecoder,SH=new Set(["host","connection","keep-alive","proxy-connection","transfer-encoding","x-forwarded-for","x-forwarded-proto","x-forwarded-host"]);_8=new Map});function iG(w){let $=typeof w==="string"?{to:w}:w,Y=($.to??"").trim();if(Y&&!/^[a-z][\w+.-]*:\/\//i.test(Y))Y=`https://${Y}`;return Y=Y.replace(/\/+$/,""),{to:Y,status:$.status??301,preservePath:$.preservePath??!0}}function mG(w,$,Y){if(!w.preservePath)return w.to||"/";let A=`${$}${Y}`;return A==="/"?`${w.to}/`:`${w.to}${A}`}import*as Gw from"node:path";function cY(w,$){if(typeof w==="string")return{dir:w,spa:!1,pathRewriteStyle:"directory",maxAge:0,cleanUrls:$};return{dir:w.dir,spa:w.spa??!1,pathRewriteStyle:w.pathRewriteStyle??"directory",maxAge:w.maxAge??0,cleanUrls:$}}function mH(w){let $=Gw.extname(w).toLowerCase();return iH[$]??"application/octet-stream"}function gH(w){let $;try{$=decodeURIComponent(w)}catch{return null}if($.includes("\x00")||$.includes("\\"))return null;let Y=Gw.posix.normalize(`/${$}`);if(Y.split("/").includes(".."))return null;return Y.replace(/^\/+/,"")}function dH(w,$){let Y=gH(w);if(Y===null)return null;let A=Gw.posix.extname(Y);if($.cleanUrls&&A===".html"){let X=w.replace(/\/index\.html$/i,"/").replace(/\.html$/i,"");return{filePath:Gw.join($.dir,Y),redirectTo:X||"/"}}if(Y===""||w.endsWith("/"))return{filePath:Gw.join($.dir,Y,"index.html")};if(A!=="")return{filePath:Gw.join($.dir,Y)};if($.pathRewriteStyle==="flat")return{filePath:Gw.join($.dir,`${Y}.html`)};return{filePath:Gw.join($.dir,Y,"index.html")}}async function gG(w,$){let Y=dH(w,$);if(!Y)return new Response("Forbidden",{status:403});if(Y.redirectTo)return new Response(null,{status:301,headers:{Location:Y.redirectTo}});let A=$.maxAge>0?`public, max-age=${$.maxAge}`:"no-cache",X=Bun.file(Y.filePath);if(await X.exists())return new Response(X,{status:200,headers:{"Content-Type":mH(Y.filePath),"Cache-Control":A}});if($.spa){let J=Gw.join($.dir,"index.html"),U=Bun.file(J);if(await U.exists())return new Response(U,{status:200,headers:{"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-cache"}})}return new Response("Not Found",{status:404})}var iH;var vY=t(()=>{iH={".html":"text/html; charset=utf-8",".htm":"text/html; charset=utf-8",".css":"text/css; charset=utf-8",".js":"text/javascript; charset=utf-8",".mjs":"text/javascript; charset=utf-8",".json":"application/json; charset=utf-8",".map":"application/json; charset=utf-8",".svg":"image/svg+xml",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".avif":"image/avif",".ico":"image/x-icon",".woff":"font/woff",".woff2":"font/woff2",".ttf":"font/ttf",".otf":"font/otf",".eot":"application/vnd.ms-fontobject",".txt":"text/plain; charset=utf-8",".xml":"application/xml; charset=utf-8",".pdf":"application/pdf",".wasm":"application/wasm",".mp4":"video/mp4",".webm":"video/webm",".mp3":"audio/mpeg",".wav":"audio/wav"}});function lH(){return Math.max(0,Number(process.env.RPX_MAX_WS_PENDING_BYTES))||8388608}function pH(w){let $=w.headers.get("host")||"",Y=$.indexOf(":");return Y===-1?$:$.slice(0,Y)}function nG(w,$){if(!$||$==="/")return w;if(w===$)return"/";if(w.startsWith(`${$}/`)){let Y=w.slice($.length);return Y===""?"/":Y}return w}function dG(w){if(w.upstreamPool)return LG(w.upstreamPool);if(w.sourceHost)return{url:w.sourceHost,weight:1,healthy:!0,activeConnections:0,consecutiveFailures:0,consecutiveSuccesses:0};return}function lG(w,$,Y,A){let X=Y?.url??$.sourceHost??"",U=$.stripBasePathPrefix??!1?nG(w,$.basePath):w,W=NW(U,$.pathRewrites);if(W)X=W.targetHost,U=W.targetPath,F("request",`Path rewrite: ${w} → ${X}${U}`,A);return{targetHost:X,targetPath:U}}function rH(w){let $=w.indexOf("://"),Y=$===-1?w.indexOf("/"):w.indexOf("/",$+3);if(Y===-1)return{pathname:"/",search:""};let A=w.indexOf("?",Y);if(A===-1)return{pathname:w.slice(Y),search:""};return{pathname:w.slice(Y,A),search:w.slice(A)}}function t1(w,$,Y){let A=async(X,J)=>{let{pathname:U,search:W}=rH(X.url),Q=pH(X),B=w(Q,U);if(!B&&Y){let N=await Y(Q,U,X);if(N instanceof Response)return N;if(N&&N.retry)B=w(Q,U)}if(!B)return F("request",`No route found for host: ${Q}`,$),new Response(`No proxy configured for ${Q}`,{status:404});if(B.auth){let N=ZG(X,U,B.auth);if(N)return F("request",`401 challenge for ${Q}${U}`,$),N}if(B.redirect){let N=mG(B.redirect,U,W);return F("request",`${B.redirect.status} redirect ${Q}${U} → ${N}`,$),new Response(null,{status:B.redirect.status,headers:{location:N}})}if(B.static){let f=B.stripBasePathPrefix??!0?nG(U,B.basePath):U;return gG(f,B.static)}if(X.headers.get("upgrade")?.toLowerCase()==="websocket"){let N=dG(B);if(!J||!N)return new Response("WebSocket upgrade not supported here",{status:400});let{targetHost:f,targetPath:R}=lG(U,B,N,$),y=`ws://${f}${R}${W}`,V={};for(let[O,S]of X.headers)if(!nH.has(O.toLowerCase())&&O.toLowerCase()!=="host")V[O]=S;V.host=f,V["x-forwarded-for"]="127.0.0.1",V["x-forwarded-proto"]="https",V["x-forwarded-host"]=Q;let T={targetUrl:y,forwardHeaders:V};if(J.upgrade(X,{data:T})){F("ws",`upgraded ${Q}${R} → ${y}`,$);return}return new Response("WebSocket upgrade failed",{status:400})}let j=dG(B);if(!j)return new Response(`No upstream configured for ${Q}`,{status:502});if(B.cleanUrls&&U.endsWith(".html")){let N=U.replace(/\.html$/,"");return new Response(null,{status:301,headers:{Location:N}})}let{targetHost:z,targetPath:G}=lG(U,B,j,$),K=B.changeOrigin?`http://${z}`:void 0,E=X.body!=null&&X.method!=="GET"&&X.method!=="HEAD",q=B.upstreamPool;if(q)j.activeConnections++;try{let N=await uG({hostPort:z,method:X.method,path:`${G}${W}`,reqHeaders:X.headers,forwardedHost:Q,originOverride:K,body:X.body});if(q)O8(q,j);return N}catch(N){if(N===_W){if(F("request",`Upstream timeout for ${Q}`,$),q)xY(q,j);return new Response("Gateway Timeout",{status:504})}if(N===n$)return F("request",`Upstream pool saturated for ${Q}`,$),new Response("Service Unavailable",{status:503,headers:{"retry-after":"1"}});if(N===uY||!E)try{let f=new Headers(X.headers);if(f.set("host",z),f.set("x-forwarded-for","127.0.0.1"),f.set("x-forwarded-proto","https"),f.set("x-forwarded-host",Q),K!==void 0)f.set("origin",K);let R=await fetch(`http://${z}${G}${W}`,{method:X.method,headers:f,body:X.body,redirect:"manual"});if(q)O8(q,j);return R}catch(f){if(F("request",`Proxy error for ${Q}: ${f}`,$),q)xY(q,j);return new Response(`Proxy Error: ${f}`,{status:502})}if(F("request",`Proxy error for ${Q}: ${N}`,$),q)xY(q,j);return new Response(`Proxy Error: ${N}`,{status:502})}finally{if(q)j.activeConnections--}};return async(X,J)=>{try{return await A(X,J)}catch(U){return F("request",`Unhandled proxy handler error: ${U}`,$),new Response("Bad Gateway",{status:502})}}}function a1(w){let $=new WeakMap,Y=lH();return{open(A){let{targetUrl:X,forwardHeaders:J}=A.data,U;try{U=new WebSocket(X,{headers:J})}catch(Q){F("ws",`failed to open upstream ${X}: ${Q}`,w),A.close(1011,"upstream connect failed");return}U.binaryType="arraybuffer";let W={upstream:U,upstreamOpen:!1,pending:[],pendingBytes:0};$.set(A,W),U.addEventListener("open",()=>{W.upstreamOpen=!0;for(let Q of W.pending)U.send(Q);W.pending=[],W.pendingBytes=0}),U.addEventListener("message",(Q)=>{A.send(Q.data)}),U.addEventListener("close",(Q)=>{try{A.close(Q.code||1000,Q.reason||"")}catch{}}),U.addEventListener("error",()=>{F("ws",`upstream error for ${X}`,w);try{A.close(1011,"upstream error")}catch{}})},message(A,X){let J=$.get(A);if(!J)return;let U=typeof X==="string"?X:new Uint8Array(X);if(J.upstreamOpen){J.upstream.send(U);return}let W=typeof U==="string"?Buffer.byteLength(U):U.byteLength;if(J.pendingBytes+W>Y){F("ws",`pending buffer would exceed ${Y}B before upstream open; closing socket`,w);try{A.close(1009,"buffer limit")}catch{}try{J.upstream.close(1011,"client buffer overflow")}catch{}$.delete(A);return}J.pending.push(U),J.pendingBytes+=W},close(A,X,J){let U=$.get(A);if(!U)return;$.delete(A);try{U.upstream.close(X||1000,J||"")}catch{}}}}var nH;var S8=t(()=>{bY();vG();vY();X0();nH=new Set(["connection","keep-alive","proxy-authenticate","proxy-authorization","te","trailer","transfer-encoding","upgrade","sec-websocket-key","sec-websocket-version","sec-websocket-extensions"])});import*as rG from"node:fs";import*as tG from"node:path";function iY(w,$){if(!w||!$.startsWith(pG))return null;let Y=$.slice(pG.length);if(!Y||!/^[A-Za-z0-9_-]+$/.test(Y))return null;try{return rG.readFileSync(tG.join(w,Y),"utf8")}catch{return null}}var pG="/.well-known/acme-challenge/";var Z8=()=>{};function _w(w){if(!w||w==="/")return"/";let $=w.trim();if(!$.startsWith("/"))$=`/${$}`;return $=$.replace(/\/+$/,""),$===""?"/":$}function tH(w,$){if($==="/")return!0;if(w===$)return!0;return w.startsWith(`${$}/`)}function s1(w){let $=new Map;for(let A of w){let X=_w(A.path),J=$.get(A.host);if(!J)J=new Map,$.set(A.host,J);J.set(X,A.route)}let Y=new Map;for(let[A,X]of $){let J=[];for(let[U,W]of X)J.push({path:U,route:W});J.sort((U,W)=>W.path.length-U.path.length),Y.set(A,J)}return Y}function k8(w,$){let Y=w.get($);if(Y!==void 0)return Y;let A,X=-1;for(let[J,U]of w){if(!F1(J))continue;if(TY($,J)){let W=J.length-1;if(W>X)X=W,A=U}}return A}function o1(w,$,Y){let A=k8(w,$);if(!A)return;for(let X of A)if(tH(Y,X.path))return X.route;return}var mY=()=>{};import*as gY from"node:fs/promises";import*as SW from"node:path";function aH(w){if(!w.endsWith(".crt"))return null;let $=w.slice(0,-4);if($.length===0)return null;if($.startsWith("_wildcard."))return`*.${$.slice(10)}`;return $}async function sH(w,$,Y,A){try{let[X,J]=await Promise.all([gY.readFile($,"utf8"),gY.readFile(Y,"utf8")]);return{serverName:w,cert:X,key:J}}catch(X){return F("sni",`skipping ${w}: ${X.message}`,A),null}}async function e1(w,$){let Y=new Map;if(w.certsDir){let X=[];try{X=await gY.readdir(w.certsDir)}catch(J){F("sni",`certsDir read failed (${w.certsDir}): ${J.message}`,$)}for(let J of X){let U=aH(J);if(!U)continue;let W=J.slice(0,-4);Y.set(U,{certPath:SW.join(w.certsDir,J),keyPath:SW.join(w.certsDir,`${W}.key`)})}}if(w.domains)for(let[X,J]of Object.entries(w.domains))Y.set(X,J);let A=[];for(let[X,J]of Y){let U=await sH(X,J.certPath,J.keyPath,$);if(U)A.push(U)}return A}var h8=t(()=>{X0()});import*as L$ from"node:fs/promises";import*as ZW from"node:path";function eH(w,$){if(!$||$.length===0)return!1;return $.some((Y)=>{let A=Y.startsWith(".")?Y.slice(1):Y;return w===A||w.endsWith(`.${A}`)})}function sG(w){if(!w||w.length>253)return!1;if(w.includes("/")||w.includes(":")||w.includes(" "))return!1;if(w.startsWith("*"))return!1;return/^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}$/i.test(w)}class p${config;certsDir;onCertAdded;http01Store;issuer;verbose;negativeCacheMs;certs=new Map;inFlight=new Map;negativeCache=new Map;constructor(w){this.config=w.config,this.certsDir=w.certsDir,this.onCertAdded=w.onCertAdded,this.http01Store=w.http01Store??kX,this.issuer=w.issuer??QQ,this.verbose=w.verbose??!1,this.negativeCacheMs=w.negativeCacheMs??oH;for(let $ of w.initial??[])this.certs.set($.serverName,$)}get challengeStore(){return this.http01Store}sniEntries(){return Array.from(this.certs.values())}hasCert(w){return this.certs.has(w)}async isApproved(w){if(!sG(w))return!1;if(eH(w,this.config.allowedSuffixes))return!0;if(this.config.ask)try{return await this.config.ask(w)}catch($){return F("on-demand",`ask(${w}) threw: ${$.message}`,this.verbose),!1}return!1}async ensureCert(w){if(!this.config.enabled)return!1;if(this.certs.has(w))return!0;if(!sG(w))return!1;let $=this.inFlight.get(w);if($)return $;let Y=this.negativeCache.get(w);if(Y!==void 0&&Date.now()<Y){if(await this.loadFromDisk(w))return this.negativeCache.delete(w),!0;return F("on-demand",`${w} negatively cached for ${Y-Date.now()}ms`,this.verbose),!1}let A=this.issue(w).finally(()=>{this.inFlight.delete(w)});return this.inFlight.set(w,A),A}async issue(w){if(this.certs.has(w))return!0;if(await this.loadFromDisk(w))return!0;if(!await this.isApproved(w))return F("on-demand",`refused issuance for ${w} (not approved)`,this.verbose),this.cacheNegative(w),!1;try{F("on-demand",`issuing cert for ${w} (staging=${this.config.staging??!1})`,this.verbose);let $=await this.issuer({domains:[w],method:"http-01",http01Store:this.http01Store,email:this.config.email,staging:this.config.staging});await this.persist(w,$.fullChainPem,$.keyPem);let Y={serverName:w,cert:$.fullChainPem,key:$.keyPem};return this.certs.set(w,Y),this.negativeCache.delete(w),F("on-demand",`issued + installed cert for ${w}`,this.verbose),await this.onCertAdded?.(this.sniEntries()),!0}catch($){return this.cacheNegative(w),F("on-demand",`issuance for ${w} failed: ${$.message}`,this.verbose),!1}}cacheNegative(w){if(this.negativeCache.size>=aG){let $=Date.now();for(let[Y,A]of this.negativeCache)if(A<=$)this.negativeCache.delete(Y);if(this.negativeCache.size>=aG){let Y=this.negativeCache.keys().next().value;if(Y!==void 0)this.negativeCache.delete(Y)}}this.negativeCache.set(w,Date.now()+this.negativeCacheMs)}async loadFromDisk(w){let{certPath:$,keyPath:Y}=this.pathsFor(w);try{let[A,X]=await Promise.all([L$.readFile($,"utf8"),L$.readFile(Y,"utf8")]),J={serverName:w,cert:A,key:X};return this.certs.set(w,J),F("on-demand",`adopted existing on-disk cert for ${w}`,this.verbose),await this.onCertAdded?.(this.sniEntries()),!0}catch{return!1}}pathsFor(w){return{certPath:ZW.join(this.certsDir,`${w}.crt`),keyPath:ZW.join(this.certsDir,`${w}.key`)}}async persist(w,$,Y){await L$.mkdir(this.certsDir,{recursive:!0}).catch(()=>{});let{certPath:A,keyPath:X}=this.pathsFor(w);await Promise.all([L$.writeFile(A,$,"utf8"),L$.writeFile(X,Y,{encoding:"utf8",mode:384})])}}var oH=60000,aG=4096;var D8=t(()=>{vX();X0()});import{existsSync as wR,readdirSync as yL,readFileSync as $R,statSync as YR}from"node:fs";import{homedir as AR}from"node:os";import{isAbsolute as XR,join as wY}from"node:path";function oG(w,$){if(w==="~")return $;if(w.startsWith("~/"))return wY($,w.slice(2));return w}function WR(w){let $=w.indexOf(":");return($===-1?w:w.slice(0,$)).toLowerCase()}function eG(w){return w.replace(/[^a-z0-9._-]/gi,"-").replace(/^[-.]+|[-.]+$/g,"")||"site"}function BR(w,$){for(let Y of $){let A=`.${Y}`;if(w.endsWith(A)){let X=w.slice(0,-A.length);if(X.length>0&&!X.includes(".")&&/^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/i.test(X))return X}}return null}function jR(w,$){let Y=$.readText(wY(w,"rpx.site.json"));if(Y)try{let X=JSON.parse(Y);if(X&&typeof X==="object")return X}catch{}let A=$.readText(wY(w,"package.json"));if(A)try{let X=JSON.parse(A);if(X.rpx&&typeof X.rpx==="object")return X.rpx}catch{}return null}function zR(w){let $=w.selfRegisters??!1;return{command:w.command,env:w.env,urlEnv:w.urlEnv,selfRegisters:$,routes:w.routes??($?void 0:[{path:"/",portEnv:"PORT",defaultPort:3000,readyGate:!0}])}}function GR(w,$){let Y=jR(w,$);if(Y?.command)return zR(Y);let A=$.fileExists(wY(w,"buddy")),X=$.readText(wY(w,"package.json")),J=null;if(X)try{J=JSON.parse(X)}catch{J=null}let U={...J?.dependencies??{},...J?.devDependencies??{}};if(A||Object.keys(U).some((Q)=>Q==="stacks"||Q.startsWith("@stacksjs/")))return{command:A?"./buddy dev":"bun run dev",env:{STACKS_PROXY_MANAGED:"1"},urlEnv:["APP_URL"],routes:[{path:"/",portEnv:"PORT",defaultPort:3000,readyGate:!0},{path:"/api",portEnv:"PORT_API",defaultPort:3008,stripPrefix:!1,readyGate:!1},{path:"/docs",portEnv:"PORT_DOCS",defaultPort:3006,stripPrefix:!0,readyGate:!1}]};if(J?.scripts?.dev)return{command:"bun run dev",routes:[{path:"/",portEnv:"PORT",defaultPort:3000,readyGate:!0}]};return null}function hW(w,$={}){let Y={dirExists:$.dirExists??kW.dirExists,fileExists:$.fileExists??kW.fileExists,readText:$.readText??kW.readText},A=$.detect??GR,X=$.homeDir??AR(),J=w.tlds??UR,U=(w.roots??JR).map((G)=>oG(G,X)),W=w.idleTimeoutMs??QR,Q=new Map;for(let G of w.sites??[])Q.set(G.to,G);let B=(G)=>G.idleTimeoutMs??W;function j(G){let K=lA(Q,G);if(!K)return null;let E=XR(K.dir)?K.dir:oG(K.dir,X),q=K.selfRegisters??!1,N=K.routes??[];if(!q&&N.length===0)N=A(E,Y)?.routes??[{path:"/",portEnv:"PORT",defaultPort:3000,readyGate:!0}];let f=w5({...K.env??{}},void 0,G);return{host:G,id:eG(G),dir:E,command:K.command,env:f,routes:N,selfRegisters:q,idleTimeoutMs:B(K),source:"config"}}function z(G){let K=BR(G,J);if(!K)return null;for(let E of U){let q=wY(E,K);if(!Y.dirExists(q))continue;let N=A(q,Y);if(!N)continue;let f=N.selfRegisters??!1;return{host:G,id:eG(G),dir:q,command:N.command,env:w5({...N.env??{}},N.urlEnv,G),routes:f?[]:N.routes??[],selfRegisters:f,idleTimeoutMs:W,source:"discovered"}}return null}return{resolve(G){let K=WR(G);if(!K)return null;return j(K)??z(K)}}}function w5(w,$,Y){if(!$)return w;let A=`https://${Y}`;for(let X of $)if(w[X]===void 0)w[X]=A;return w}var JR,UR,QR=1800000,kW;var DW=t(()=>{JR=["~/Code"],UR=["localhost","test"],kW={dirExists:(w)=>{try{return YR(w).isDirectory()}catch{return!1}},fileExists:(w)=>{try{return wR(w)}catch{return!1}},readText:(w)=>{try{return $R(w,"utf8")}catch{return null}}}});import*as x8 from"node:net";function _$(w,$,Y){return F("port",`Checking if port ${w} is in use on ${$}`,Y),new Promise((A)=>{let X=x8.createServer(),J=setTimeout(()=>{F("port",`Checking port ${w} timed out, assuming it's in use`,Y),X.close(),A(!0)},3000);X.once("error",(U)=>{if(clearTimeout(J),U.code==="EADDRINUSE")F("port",`Port ${w} is in use`,Y),A(!0);else F("port",`Error checking port ${w}: ${U.message}`,Y),A(!0)}),X.once("listening",()=>{clearTimeout(J),F("port",`Port ${w} is available`,Y),X.close(),A(!1)});try{X.listen(w,$)}catch(U){clearTimeout(J),F("port",`Exception checking port ${w}: ${U}`,Y),A(!0)}})}async function xW(w,$,Y,A=50){F("port",`Finding available port starting from ${w} (max attempts: ${A})`,Y);let X=w,J=0;while(J<A){if(J++,!await _$(X,$,Y))return F("port",`Found available port: ${X} after ${J} attempts`,Y),X;F("port",`Port ${X} is in use, trying ${X+1} (attempt ${J}/${A})`,Y),X++}throw Error(`Unable to find available port after ${A} attempts starting from ${w}`)}function $5(w,$,Y=5000,A){return F("port",`Testing connection to ${$}:${w}`,A),new Promise((X)=>{let J=x8.connect({host:$,port:w,timeout:Y});J.once("connect",()=>{F("port",`Successfully connected to ${$}:${w}`,A),J.end(),X(!0)}),J.once("timeout",()=>{F("port",`Connection to ${$}:${w} timed out`,A),J.destroy(),X(!1)}),J.once("error",(U)=>{F("port",`Failed to connect to ${$}:${w}: ${U.message}`,A),J.destroy(),X(!1)})})}class P8{usedPorts=new Set;hostname;verbose;maxRetries;constructor(w="0.0.0.0",$,Y=50){this.hostname=w,this.verbose=$,this.maxRetries=Y}async getNextAvailablePort(w,$=!1){if(this.usedPorts.has(w))return this.findNextAvailablePort(w+1,$);if(await _$(w,this.hostname,this.verbose))return this.findNextAvailablePort(w+1,$);if($){if(!await $5(w,this.hostname,3000,this.verbose))return F("port",`Port ${w} is available but not connectable, trying next port`,this.verbose),this.findNextAvailablePort(w+1,$)}return this.usedPorts.add(w),w}async findNextAvailablePort(w,$=!1){let Y=await xW(w,this.hostname,this.verbose,this.maxRetries);if($){if(!await $5(Y,this.hostname,3000,this.verbose))if(Y<w+this.maxRetries)return this.findNextAvailablePort(Y+1,$);else throw Error(`Unable to find a connectable port after ${this.maxRetries} attempts`)}return this.usedPorts.add(Y),Y}releasePort(w){F("port",`Releasing port ${w}`,this.verbose),this.usedPorts.delete(w)}}var kL;var PW=t(()=>{X0();kL=new P8});import*as b8 from"node:fs";import*as p0 from"node:fs/promises";import{homedir as KR}from"node:os";import*as bW from"node:path";import*as u8 from"node:process";function Zw(){return bW.join(KR(),".stacks","rpx","registry.d")}function dY(w){return typeof w==="string"&&w.length>0&&w.length<=128&&FR.test(w)}function uW(w,$){if(!dY($))throw Error(`invalid registry id: ${JSON.stringify($)}`);return bW.join(w,`${$}.json`)}function b0(w){if(!Number.isInteger(w)||w<=0)return!1;try{return u8.kill(w,0),!0}catch($){return $.code==="EPERM"}}function Y5(w){if(!w||typeof w!=="object")return!1;let $=w,Y=$.pid===void 0||typeof $.pid==="number"&&Number.isInteger($.pid)&&$.pid>0,A=typeof $.from==="string"&&$.from.length>0||Array.isArray($.from)&&$.from.length>0,X=typeof $.static==="string"||!!$.static&&typeof $.static==="object"&&typeof $.static.dir==="string",J=$.path===void 0||typeof $.path==="string";return typeof $.id==="string"&&dY($.id)&&(A||X)&&typeof $.to==="string"&&$.to.length>0&&J&&Y&&typeof $.createdAt==="string"}async function qR(w){await p0.mkdir(w,{recursive:!0})}async function c8(w,$=Zw(),Y){if(!Y5(w))throw Error(`invalid registry entry: ${JSON.stringify(w)}`);await qR($);let A=uW($,w.id),X=`${A}.tmp.${u8.pid}.${Date.now()}`,J=JSON.stringify(w,null,2);try{await p0.writeFile(X,J,{encoding:"utf8",mode:420}),await p0.rename(X,A),F("registry",`wrote entry ${w.id} → ${A}`,Y)}catch(U){throw await p0.unlink(X).catch(()=>{}),U}}async function lY(w,$=Zw(),Y){let A=uW($,w);try{await p0.unlink(A),F("registry",`removed entry ${w}`,Y)}catch(X){if(X.code!=="ENOENT")throw X}}async function NR(w,$=Zw(),Y){let A=uW($,w);try{let X=await p0.readFile(A,"utf8"),J=JSON.parse(X);if(!Y5(J))return F("registry",`entry ${w} failed validation, removing`,Y),await p0.unlink(A).catch(()=>{}),null;return J}catch(X){if(X.code==="ENOENT")return null;if(X instanceof SyntaxError)return F("registry",`entry ${w} has invalid JSON, removing`,Y),await p0.unlink(A).catch(()=>{}),null;throw X}}async function Sw(w=Zw(),$){let Y;try{Y=await p0.readdir(w)}catch(X){if(X.code==="ENOENT")return[];throw X}let A=[];for(let X of Y){if(!X.endsWith(".json"))continue;let J=X.slice(0,-5);if(!dY(J))continue;let U=await NR(J,w,$);if(U)A.push(U)}return A}async function $Y(w=Zw(),$){let Y=await Sw(w,$),A=0;for(let X of Y){if(X.pid===void 0)continue;if(!b0(X.pid))F("registry",`GC: pid ${X.pid} for ${X.id} is dead, removing`,$),await lY(X.id,w,$).catch(()=>{}),A++}return A}function nY(w,$={}){let Y=$.dir??Zw(),A=$.debounceMs??100,X=$.pollMs??Math.max(A*2,250),J=$.verbose;b8.mkdirSync(Y,{recursive:!0});let U=null,W=!1,Q=null,B=!1,j=(N)=>{return JSON.stringify(N.map((f)=>({id:f.id,from:f.from,to:f.to,path:f.path,pid:f.pid,pathRewrites:f.pathRewrites,cleanUrls:f.cleanUrls,changeOrigin:f.changeOrigin,static:f.static,loadBalancer:f.loadBalancer})).sort((f,R)=>f.id.localeCompare(R.id)))},z=()=>{if(U=null,W)return;Sw(Y,J).then((N)=>{return Q=j(N),w(N)}).catch((N)=>{F("registry",`watcher onChange failed: ${N}`,J)})},G=()=>{if(W)return;if(U)clearTimeout(U);U=setTimeout(z,A)},E=setInterval(()=>{if(W||B)return;B=!0,Sw(Y,J).then((N)=>{if(j(N)!==Q)G()}).catch((N)=>{F("registry",`watcher poll failed: ${N}`,J)}).finally(()=>{B=!1})},X),q=b8.watch(Y,{persistent:!0},(N,f)=>{if(f&&/\.tmp\.\d+\.\d+$/.test(f))return;G()});return q.on("error",(N)=>{F("registry",`watcher error: ${N}`,J)}),G(),{close:()=>{if(W=!0,U)clearTimeout(U);clearInterval(E),q.close()}}}var FR;var r$=t(()=>{X0();FR=/^[a-zA-Z0-9._-]+$/});import{closeSync as A5,openSync as ER,readFileSync as TR}from"node:fs";import*as X5 from"node:fs/promises";import{spawn as fR}from"node:child_process";import{homedir as HR}from"node:os";import*as pY from"node:path";import*as Vw from"node:process";class v8{resolver;registryDir;rpxDir;verbose;startupTimeoutMs;pollIntervalMs;restartDelayMs;killGraceMs;launch;probePort;pickPort;isHostRoutable;onSiteActivating;now;writeEntry;removeEntry;sites=new Map;reaper;stopped=!1;constructor(w){this.resolver=w.resolver,this.registryDir=w.registryDir??Zw(),this.rpxDir=w.rpxDir??pY.join(HR(),".stacks","rpx"),this.verbose=w.verbose??!1,this.startupTimeoutMs=w.startupTimeoutMs??RR,this.pollIntervalMs=w.pollIntervalMs??MR,this.restartDelayMs=w.restartDelayMs??VR,this.killGraceMs=w.killGraceMs??CR,this.launch=w.launcher??OR(this.verbose),this.probePort=w.probePort??yR,this.pickPort=w.pickPort??((Y)=>xW(Y,"127.0.0.1")),this.isHostRoutable=w.isHostRoutable??(()=>!1),this.onSiteActivating=w.onSiteActivating,this.now=w.now??Date.now,this.writeEntry=w.writeEntry??c8,this.removeEntry=w.removeEntry??lY;let $=w.reapIntervalMs??IR;if(this.reaper=setInterval(()=>{this.reapIdle()},$),typeof this.reaper.unref==="function")this.reaper.unref()}async onRequest(w){if(this.stopped)return{kind:"unknown"};let $=this.sites.get(w);if($&&$.status==="failed"&&this.now()-$.failedAt>=this.restartDelayMs)this.sites.delete(w),$=void 0;if(!$){let Y=this.resolver.resolve(w);if(!Y)return{kind:"unknown"};$=await this.start(Y)}if($.lastAccess=this.now(),$.status==="ready")return{kind:"ready",host:w};if($.status==="failed")return{kind:"failed",host:w,error:$.error??"failed to start",logTail:this.readLogTail($)};return{kind:"starting",host:w,sinceMs:this.now()-$.startedAt,source:$.site.source,logTail:this.readLogTail($,16)}}async start(w){try{this.onSiteActivating?.(w.host)}catch{}let $=new Map;if(!w.selfRegisters)for(let W of w.routes){if($.has(W.portEnv))continue;let Q=await this.pickPort(W.defaultPort??3000);$.set(W.portEnv,Q)}let Y=pY.join(this.rpxDir,"sites",`${w.id}.log`);await X5.mkdir(pY.dirname(Y),{recursive:!0}).catch(()=>{});let A=this.buildEnv(w,$),X=null,J;try{X=this.launch({command:w.command,cwd:w.dir,env:A,logPath:Y})}catch(W){J=`failed to spawn: ${W.message}`}let U={site:w,status:J?"failed":"starting",handle:X,ports:$,routeIds:[],startedAt:this.now(),lastAccess:this.now(),failedAt:J?this.now():0,error:J,logPath:Y,exited:!1,ready:Promise.resolve()};if(this.sites.set(w.host,U),J)return H.warn(`rpx: site ${w.host} ${J}`),U;return H.info(`rpx: booting ${w.host} → ${w.command} (${w.dir})`),X.exited.then((W)=>this.onProcessExit(U,W)).catch(()=>{}),U.ready=this.driveReadiness(U).catch((W)=>{F("sites",`readiness loop for ${w.host} threw: ${W}`,this.verbose)}),U}async onProcessExit(w,$){if(w.exited=!0,this.stopped||this.sites.get(w.site.host)!==w)return;if(w.status==="ready"){H.warn(`rpx: ${w.site.host} exited${$!==null?` (code ${$})`:""} — will reboot on next request`),this.sites.delete(w.site.host);for(let Y of w.routeIds)await this.removeEntry(Y,this.registryDir,this.verbose).catch(()=>{})}else if(w.status==="starting")this.fail(w,`process exited${$!==null?` with code ${$}`:""} before becoming ready`)}async driveReadiness(w){let{site:$}=w,Y=this.now()+this.startupTimeoutMs,A=$.selfRegisters?()=>this.isHostRoutable($.host):await this.makeGateProbe($,w.ports);while(this.now()<Y&&!this.stopped){if(w.status!=="starting"||w.exited)return;if(await A()){if(await this.publishRoutes(w),w.status==="starting")w.status="ready",H.success(`rpx: ${$.host} ready`);return}await cW(this.pollIntervalMs)}if(w.status==="starting")this.fail(w,`did not become ready within ${Math.round(this.startupTimeoutMs/1000)}s`)}async makeGateProbe(w,$){let Y=w.routes.filter((X)=>X.readyGate??_w(X.path)==="/").map((X)=>$.get(X.portEnv)).filter((X)=>typeof X==="number"),A=Y.length>0?Y:[...$.values()];return async()=>{for(let X of A)if(!await this.probePort(X))return!1;return A.length>0}}async publishRoutes(w){let{site:$,ports:Y}=w;if($.selfRegisters||$.routes.length===0)return;let A=$.routes.find((Q)=>_w(Q.path)==="/")??$.routes[0],X=Y.get(A.portEnv);if(X===void 0)return;let J=[];for(let Q of $.routes){if(Q===A)continue;let B=Y.get(Q.portEnv);if(B===void 0)continue;J.push({from:_w(Q.path),to:`localhost:${B}`,stripPrefix:Q.stripPrefix??!1})}let U={id:$.id,from:`localhost:${X}`,to:$.host,cwd:$.dir,createdAt:new Date(this.now()).toISOString(),pathRewrites:J.length>0?J:void 0,pid:w.handle?.pid};await this.writeEntry(U,this.registryDir,this.verbose),w.routeIds=[$.id];let W=this.now()+2000;while(this.now()<W&&!this.isHostRoutable($.host))await cW(50)}fail(w,$){w.status="failed",w.error=$,w.failedAt=this.now(),H.warn(`rpx: site ${w.site.host} failed — ${$}`),this.killProcess(w)}buildEnv(w,$){let Y={};for(let[A,X]of Object.entries(Vw.env))if(typeof X==="string")Y[A]=X;Object.assign(Y,w.env);for(let[A,X]of $)Y[A]=String(X);return Y.RPX_SITE_HOST=w.host,Y.RPX_SITE_URL=`https://${w.host}`,Y}readLogTail(w,$=40){try{return TR(w.logPath,"utf8").split(`
234
+ `,ZH.encode(W)}async function mH(w){let $=w.getReader(),Y=[],A=0;for(;;){let{done:U,value:W}=await $.read();if(U)break;if(W){if(A+=W.length,A>DG)return $.cancel().catch(()=>{}),null;Y.push(W)}}if(Y.length===1)return Y[0];let X=new Uint8Array(A),J=0;for(let U of Y)X.set(U,J),J+=U.length;return X}var fH,vY,S8,TH,SW,p$,DG=1048576,_W=30000,yH=16384,xG=262144,OH=2097152,LH=524288,_H=8192,SH=4096,ZH,PG,kH,Z8;var iG=t(()=>{({connect:fH}=Bun),vY=Symbol("rpx.pool.fallback"),S8=Symbol("rpx.pool.stale"),TH=new Set(["GET","HEAD","PUT","DELETE","OPTIONS","TRACE"]);SW=Symbol("rpx.pool.timeout"),p$=Symbol("rpx.pool.busy");ZH=new TextEncoder,PG=new TextDecoder,kH=new Set(["host","connection","keep-alive","proxy-connection","transfer-encoding","x-forwarded-for","x-forwarded-proto","x-forwarded-host"]);Z8=new Map});function mG(w){let $=typeof w==="string"?{to:w}:w,Y=($.to??"").trim();if(Y&&!/^[a-z][\w+.-]*:\/\//i.test(Y))Y=`https://${Y}`;return Y=Y.replace(/\/+$/,""),{to:Y,status:$.status??301,preservePath:$.preservePath??!0}}function gG(w,$,Y){if(!w.preservePath)return w.to||"/";let A=`${$}${Y}`;return A==="/"?`${w.to}/`:`${w.to}${A}`}import*as Gw from"node:path";function iY(w,$){if(typeof w==="string")return{dir:w,spa:!1,pathRewriteStyle:"directory",maxAge:0,cleanUrls:$};return{dir:w.dir,spa:w.spa??!1,pathRewriteStyle:w.pathRewriteStyle??"directory",maxAge:w.maxAge??0,cleanUrls:$}}function dH(w){let $=Gw.extname(w).toLowerCase();return gH[$]??"application/octet-stream"}function lH(w){let $;try{$=decodeURIComponent(w)}catch{return null}if($.includes("\x00")||$.includes("\\"))return null;let Y=Gw.posix.normalize(`/${$}`);if(Y.split("/").includes(".."))return null;return Y.replace(/^\/+/,"")}function nH(w,$){let Y=lH(w);if(Y===null)return null;let A=Gw.posix.extname(Y);if($.cleanUrls&&A===".html"){let X=w.replace(/\/index\.html$/i,"/").replace(/\.html$/i,"");return{filePath:Gw.join($.dir,Y),redirectTo:X||"/"}}if(Y===""||w.endsWith("/"))return{filePath:Gw.join($.dir,Y,"index.html")};if(A!=="")return{filePath:Gw.join($.dir,Y)};if($.pathRewriteStyle==="flat")return{filePath:Gw.join($.dir,`${Y}.html`)};return{filePath:Gw.join($.dir,Y,"index.html")}}async function dG(w,$){let Y=nH(w,$);if(!Y)return new Response("Forbidden",{status:403});if(Y.redirectTo)return new Response(null,{status:301,headers:{Location:Y.redirectTo}});let A=$.maxAge>0?`public, max-age=${$.maxAge}`:"no-cache",X=Bun.file(Y.filePath);if(await X.exists())return new Response(X,{status:200,headers:{"Content-Type":dH(Y.filePath),"Cache-Control":A}});if($.spa){let J=Gw.join($.dir,"index.html"),U=Bun.file(J);if(await U.exists())return new Response(U,{status:200,headers:{"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-cache"}})}return new Response("Not Found",{status:404})}var gH;var mY=t(()=>{gH={".html":"text/html; charset=utf-8",".htm":"text/html; charset=utf-8",".css":"text/css; charset=utf-8",".js":"text/javascript; charset=utf-8",".mjs":"text/javascript; charset=utf-8",".json":"application/json; charset=utf-8",".map":"application/json; charset=utf-8",".svg":"image/svg+xml",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".avif":"image/avif",".ico":"image/x-icon",".woff":"font/woff",".woff2":"font/woff2",".ttf":"font/ttf",".otf":"font/otf",".eot":"application/vnd.ms-fontobject",".txt":"text/plain; charset=utf-8",".xml":"application/xml; charset=utf-8",".pdf":"application/pdf",".wasm":"application/wasm",".mp4":"video/mp4",".webm":"video/webm",".mp3":"audio/mpeg",".wav":"audio/wav"}});function pH(){return Math.max(0,Number(process.env.RPX_MAX_WS_PENDING_BYTES))||8388608}function tH(w){let $=w.headers.get("host")||"",Y=$.indexOf(":");return Y===-1?$:$.slice(0,Y)}function pG(w,$){if(!$||$==="/")return w;if(w===$)return"/";if(w.startsWith(`${$}/`)){let Y=w.slice($.length);return Y===""?"/":Y}return w}function lG(w){if(w.upstreamPool)return _G(w.upstreamPool);if(w.sourceHost)return{url:w.sourceHost,weight:1,healthy:!0,activeConnections:0,consecutiveFailures:0,consecutiveSuccesses:0};return}function nG(w,$,Y,A){let X=Y?.url??$.sourceHost??"",U=$.stripBasePathPrefix??!1?pG(w,$.basePath):w,W=EW(U,$.pathRewrites);if(W)X=W.targetHost,U=W.targetPath,F("request",`Path rewrite: ${w} → ${X}${U}`,A);return{targetHost:X,targetPath:U}}function aH(w){let $=w.indexOf("://"),Y=$===-1?w.indexOf("/"):w.indexOf("/",$+3);if(Y===-1)return{pathname:"/",search:""};let A=w.indexOf("?",Y);if(A===-1)return{pathname:w.slice(Y),search:""};return{pathname:w.slice(Y,A),search:w.slice(A)}}function a1(w,$,Y){let A=async(X,J)=>{let{pathname:U,search:W}=aH(X.url),Q=tH(X),B=w(Q,U);if(!B&&Y){let N=await Y(Q,U,X);if(N instanceof Response)return N;if(N&&N.retry)B=w(Q,U)}if(!B)return F("request",`No route found for host: ${Q}`,$),new Response(`No proxy configured for ${Q}`,{status:404});if(B.auth){let N=kG(X,U,B.auth);if(N)return F("request",`401 challenge for ${Q}${U}`,$),N}if(B.redirect){let N=gG(B.redirect,U,W);return F("request",`${B.redirect.status} redirect ${Q}${U} → ${N}`,$),new Response(null,{status:B.redirect.status,headers:{location:N}})}if(B.static){let T=B.stripBasePathPrefix??!0?pG(U,B.basePath):U;return dG(T,B.static)}if(X.headers.get("upgrade")?.toLowerCase()==="websocket"){let N=lG(B);if(!J||!N)return new Response("WebSocket upgrade not supported here",{status:400});let{targetHost:T,targetPath:R}=nG(U,B,N,$),y=`ws://${T}${R}${W}`,V={};for(let[O,S]of X.headers)if(!rH.has(O.toLowerCase())&&O.toLowerCase()!=="host")V[O]=S;V.host=T,V["x-forwarded-for"]="127.0.0.1",V["x-forwarded-proto"]="https",V["x-forwarded-host"]=Q;let f={targetUrl:y,forwardHeaders:V};if(J.upgrade(X,{data:f})){F("ws",`upgraded ${Q}${R} → ${y}`,$);return}return new Response("WebSocket upgrade failed",{status:400})}let j=lG(B);if(!j)return new Response(`No upstream configured for ${Q}`,{status:502});if(B.cleanUrls&&U.endsWith(".html")){let N=U.replace(/\.html$/,"");return new Response(null,{status:301,headers:{Location:N}})}let{targetHost:z,targetPath:G}=nG(U,B,j,$),K=B.changeOrigin?`http://${z}`:void 0,E=X.body!=null&&X.method!=="GET"&&X.method!=="HEAD",q=B.upstreamPool;if(q)j.activeConnections++;try{let N=await cG({hostPort:z,method:X.method,path:`${G}${W}`,reqHeaders:X.headers,forwardedHost:Q,originOverride:K,body:X.body});if(q)_8(q,j);return N}catch(N){if(N===SW){if(F("request",`Upstream timeout for ${Q}`,$),q)bY(q,j);return new Response("Gateway Timeout",{status:504})}if(N===p$)return F("request",`Upstream pool saturated for ${Q}`,$),new Response("Service Unavailable",{status:503,headers:{"retry-after":"1"}});if(N===vY||!E)try{let T=new Headers(X.headers);if(T.set("host",z),T.set("x-forwarded-for","127.0.0.1"),T.set("x-forwarded-proto","https"),T.set("x-forwarded-host",Q),K!==void 0)T.set("origin",K);let R=await fetch(`http://${z}${G}${W}`,{method:X.method,headers:T,body:X.body,redirect:"manual"});if(q)_8(q,j);return R}catch(T){if(F("request",`Proxy error for ${Q}: ${T}`,$),q)bY(q,j);return new Response(`Proxy Error: ${T}`,{status:502})}if(F("request",`Proxy error for ${Q}: ${N}`,$),q)bY(q,j);return new Response(`Proxy Error: ${N}`,{status:502})}finally{if(q)j.activeConnections--}};return async(X,J)=>{try{return await A(X,J)}catch(U){return F("request",`Unhandled proxy handler error: ${U}`,$),new Response("Bad Gateway",{status:502})}}}function s1(w){let $=new WeakMap,Y=pH();return{open(A){let{targetUrl:X,forwardHeaders:J}=A.data,U;try{U=new WebSocket(X,{headers:J})}catch(Q){F("ws",`failed to open upstream ${X}: ${Q}`,w),A.close(1011,"upstream connect failed");return}U.binaryType="arraybuffer";let W={upstream:U,upstreamOpen:!1,pending:[],pendingBytes:0};$.set(A,W),U.addEventListener("open",()=>{W.upstreamOpen=!0;for(let Q of W.pending)U.send(Q);W.pending=[],W.pendingBytes=0}),U.addEventListener("message",(Q)=>{A.send(Q.data)}),U.addEventListener("close",(Q)=>{try{A.close(Q.code||1000,Q.reason||"")}catch{}}),U.addEventListener("error",()=>{F("ws",`upstream error for ${X}`,w);try{A.close(1011,"upstream error")}catch{}})},message(A,X){let J=$.get(A);if(!J)return;let U=typeof X==="string"?X:new Uint8Array(X);if(J.upstreamOpen){J.upstream.send(U);return}let W=typeof U==="string"?Buffer.byteLength(U):U.byteLength;if(J.pendingBytes+W>Y){F("ws",`pending buffer would exceed ${Y}B before upstream open; closing socket`,w);try{A.close(1009,"buffer limit")}catch{}try{J.upstream.close(1011,"client buffer overflow")}catch{}$.delete(A);return}J.pending.push(U),J.pendingBytes+=W},close(A,X,J){let U=$.get(A);if(!U)return;$.delete(A);try{U.upstream.close(X||1000,J||"")}catch{}}}}var rH;var k8=t(()=>{cY();iG();mY();X0();rH=new Set(["connection","keep-alive","proxy-authenticate","proxy-authorization","te","trailer","transfer-encoding","upgrade","sec-websocket-key","sec-websocket-version","sec-websocket-extensions"])});import*as tG from"node:fs";import*as aG from"node:path";function gY(w,$){if(!w||!$.startsWith(rG))return null;let Y=$.slice(rG.length);if(!Y||!/^[A-Za-z0-9_-]+$/.test(Y))return null;try{return tG.readFileSync(aG.join(w,Y),"utf8")}catch{return null}}var rG="/.well-known/acme-challenge/";var h8=()=>{};function _w(w){if(!w||w==="/")return"/";let $=w.trim();if(!$.startsWith("/"))$=`/${$}`;return $=$.replace(/\/+$/,""),$===""?"/":$}function sH(w,$){if($==="/")return!0;if(w===$)return!0;return w.startsWith(`${$}/`)}function o1(w){let $=new Map;for(let A of w){let X=_w(A.path),J=$.get(A.host);if(!J)J=new Map,$.set(A.host,J);J.set(X,A.route)}let Y=new Map;for(let[A,X]of $){let J=[];for(let[U,W]of X)J.push({path:U,route:W});J.sort((U,W)=>W.path.length-U.path.length),Y.set(A,J)}return Y}function D8(w,$){let Y=w.get($);if(Y!==void 0)return Y;let A,X=-1;for(let[J,U]of w){if(!q1(J))continue;if(TY($,J)){let W=J.length-1;if(W>X)X=W,A=U}}return A}function e1(w,$,Y){let A=D8(w,$);if(!A)return;for(let X of A)if(sH(Y,X.path))return X.route;return}var dY=()=>{};import*as lY from"node:fs/promises";import*as ZW from"node:path";function _$(w){if(Array.isArray(w))return w.map(($)=>({...$,lowMemoryMode:!0}));return{...w,lowMemoryMode:!0}}function oH(w){if(!w.endsWith(".crt"))return null;let $=w.slice(0,-4);if($.length===0)return null;if($.startsWith("_wildcard."))return`*.${$.slice(10)}`;return $}async function eH(w,$,Y,A){try{let[X,J]=await Promise.all([lY.readFile($,"utf8"),lY.readFile(Y,"utf8")]);return{serverName:w,cert:X,key:J}}catch(X){return F("sni",`skipping ${w}: ${X.message}`,A),null}}async function wY(w,$){let Y=new Map;if(w.certsDir){let X=[];try{X=await lY.readdir(w.certsDir)}catch(J){F("sni",`certsDir read failed (${w.certsDir}): ${J.message}`,$)}for(let J of X){let U=oH(J);if(!U)continue;let W=J.slice(0,-4);Y.set(U,{certPath:ZW.join(w.certsDir,J),keyPath:ZW.join(w.certsDir,`${W}.key`)})}}if(w.domains)for(let[X,J]of Object.entries(w.domains))Y.set(X,J);let A=[];for(let[X,J]of Y){let U=await eH(X,J.certPath,J.keyPath,$);if(U)A.push(U)}return A}var x8=t(()=>{X0()});import*as S$ from"node:fs/promises";import*as kW from"node:path";function $R(w,$){if(!$||$.length===0)return!1;return $.some((Y)=>{let A=Y.startsWith(".")?Y.slice(1):Y;return w===A||w.endsWith(`.${A}`)})}function oG(w){if(!w||w.length>253)return!1;if(w.includes("/")||w.includes(":")||w.includes(" "))return!1;if(w.startsWith("*"))return!1;return/^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}$/i.test(w)}class r${config;certsDir;onCertAdded;http01Store;issuer;verbose;negativeCacheMs;certs=new Map;inFlight=new Map;negativeCache=new Map;constructor(w){this.config=w.config,this.certsDir=w.certsDir,this.onCertAdded=w.onCertAdded,this.http01Store=w.http01Store??DX,this.issuer=w.issuer??BQ,this.verbose=w.verbose??!1,this.negativeCacheMs=w.negativeCacheMs??wR;for(let $ of w.initial??[])this.certs.set($.serverName,$)}get challengeStore(){return this.http01Store}sniEntries(){return Array.from(this.certs.values())}hasCert(w){return this.certs.has(w)}async isApproved(w){if(!oG(w))return!1;if($R(w,this.config.allowedSuffixes))return!0;if(this.config.ask)try{return await this.config.ask(w)}catch($){return F("on-demand",`ask(${w}) threw: ${$.message}`,this.verbose),!1}return!1}async ensureCert(w){if(!this.config.enabled)return!1;if(this.certs.has(w))return!0;if(!oG(w))return!1;let $=this.inFlight.get(w);if($)return $;let Y=this.negativeCache.get(w);if(Y!==void 0&&Date.now()<Y){if(await this.loadFromDisk(w))return this.negativeCache.delete(w),!0;return F("on-demand",`${w} negatively cached for ${Y-Date.now()}ms`,this.verbose),!1}let A=this.issue(w).finally(()=>{this.inFlight.delete(w)});return this.inFlight.set(w,A),A}async issue(w){if(this.certs.has(w))return!0;if(await this.loadFromDisk(w))return!0;if(!await this.isApproved(w))return F("on-demand",`refused issuance for ${w} (not approved)`,this.verbose),this.cacheNegative(w),!1;try{F("on-demand",`issuing cert for ${w} (staging=${this.config.staging??!1})`,this.verbose);let $=await this.issuer({domains:[w],method:"http-01",http01Store:this.http01Store,email:this.config.email,staging:this.config.staging});await this.persist(w,$.fullChainPem,$.keyPem);let Y={serverName:w,cert:$.fullChainPem,key:$.keyPem};return this.certs.set(w,Y),this.negativeCache.delete(w),F("on-demand",`issued + installed cert for ${w}`,this.verbose),await this.onCertAdded?.(this.sniEntries()),!0}catch($){return this.cacheNegative(w),F("on-demand",`issuance for ${w} failed: ${$.message}`,this.verbose),!1}}cacheNegative(w){if(this.negativeCache.size>=sG){let $=Date.now();for(let[Y,A]of this.negativeCache)if(A<=$)this.negativeCache.delete(Y);if(this.negativeCache.size>=sG){let Y=this.negativeCache.keys().next().value;if(Y!==void 0)this.negativeCache.delete(Y)}}this.negativeCache.set(w,Date.now()+this.negativeCacheMs)}async loadFromDisk(w){let{certPath:$,keyPath:Y}=this.pathsFor(w);try{let[A,X]=await Promise.all([S$.readFile($,"utf8"),S$.readFile(Y,"utf8")]),J={serverName:w,cert:A,key:X};return this.certs.set(w,J),F("on-demand",`adopted existing on-disk cert for ${w}`,this.verbose),await this.onCertAdded?.(this.sniEntries()),!0}catch{return!1}}pathsFor(w){return{certPath:kW.join(this.certsDir,`${w}.crt`),keyPath:kW.join(this.certsDir,`${w}.key`)}}async persist(w,$,Y){await S$.mkdir(this.certsDir,{recursive:!0}).catch(()=>{});let{certPath:A,keyPath:X}=this.pathsFor(w);await Promise.all([S$.writeFile(A,$,"utf8"),S$.writeFile(X,Y,{encoding:"utf8",mode:384})])}}var wR=60000,sG=4096;var P8=t(()=>{mX();X0()});import{existsSync as YR,readdirSync as LL,readFileSync as AR,statSync as XR}from"node:fs";import{homedir as JR}from"node:os";import{isAbsolute as UR,join as $Y}from"node:path";function eG(w,$){if(w==="~")return $;if(w.startsWith("~/"))return $Y($,w.slice(2));return w}function jR(w){let $=w.indexOf(":");return($===-1?w:w.slice(0,$)).toLowerCase()}function w5(w){return w.replace(/[^a-z0-9._-]/gi,"-").replace(/^[-.]+|[-.]+$/g,"")||"site"}function zR(w,$){for(let Y of $){let A=`.${Y}`;if(w.endsWith(A)){let X=w.slice(0,-A.length);if(X.length>0&&!X.includes(".")&&/^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/i.test(X))return X}}return null}function GR(w,$){let Y=$.readText($Y(w,"rpx.site.json"));if(Y)try{let X=JSON.parse(Y);if(X&&typeof X==="object")return X}catch{}let A=$.readText($Y(w,"package.json"));if(A)try{let X=JSON.parse(A);if(X.rpx&&typeof X.rpx==="object")return X.rpx}catch{}return null}function KR(w){let $=w.selfRegisters??!1;return{command:w.command,env:w.env,urlEnv:w.urlEnv,selfRegisters:$,routes:w.routes??($?void 0:[{path:"/",portEnv:"PORT",defaultPort:3000,readyGate:!0}])}}function FR(w,$){let Y=GR(w,$);if(Y?.command)return KR(Y);let A=$.fileExists($Y(w,"buddy")),X=$.readText($Y(w,"package.json")),J=null;if(X)try{J=JSON.parse(X)}catch{J=null}let U={...J?.dependencies??{},...J?.devDependencies??{}};if(A||Object.keys(U).some((Q)=>Q==="stacks"||Q.startsWith("@stacksjs/")))return{command:A?"./buddy dev":"bun run dev",env:{STACKS_PROXY_MANAGED:"1"},urlEnv:["APP_URL"],routes:[{path:"/",portEnv:"PORT",defaultPort:3000,readyGate:!0},{path:"/api",portEnv:"PORT_API",defaultPort:3008,stripPrefix:!1,readyGate:!1},{path:"/docs",portEnv:"PORT_DOCS",defaultPort:3006,stripPrefix:!0,readyGate:!1}]};if(J?.scripts?.dev)return{command:"bun run dev",routes:[{path:"/",portEnv:"PORT",defaultPort:3000,readyGate:!0}]};return null}function DW(w,$={}){let Y={dirExists:$.dirExists??hW.dirExists,fileExists:$.fileExists??hW.fileExists,readText:$.readText??hW.readText},A=$.detect??FR,X=$.homeDir??JR(),J=w.tlds??WR,U=(w.roots??QR).map((G)=>eG(G,X)),W=w.idleTimeoutMs??BR,Q=new Map;for(let G of w.sites??[])Q.set(G.to,G);let B=(G)=>G.idleTimeoutMs??W;function j(G){let K=pA(Q,G);if(!K)return null;let E=UR(K.dir)?K.dir:eG(K.dir,X),q=K.selfRegisters??!1,N=K.routes??[];if(!q&&N.length===0)N=A(E,Y)?.routes??[{path:"/",portEnv:"PORT",defaultPort:3000,readyGate:!0}];let T=$5({...K.env??{}},void 0,G);return{host:G,id:w5(G),dir:E,command:K.command,env:T,routes:N,selfRegisters:q,idleTimeoutMs:B(K),source:"config"}}function z(G){let K=zR(G,J);if(!K)return null;for(let E of U){let q=$Y(E,K);if(!Y.dirExists(q))continue;let N=A(q,Y);if(!N)continue;let T=N.selfRegisters??!1;return{host:G,id:w5(G),dir:q,command:N.command,env:$5({...N.env??{}},N.urlEnv,G),routes:T?[]:N.routes??[],selfRegisters:T,idleTimeoutMs:W,source:"discovered"}}return null}return{resolve(G){let K=jR(G);if(!K)return null;return j(K)??z(K)}}}function $5(w,$,Y){if(!$)return w;let A=`https://${Y}`;for(let X of $)if(w[X]===void 0)w[X]=A;return w}var QR,WR,BR=1800000,hW;var xW=t(()=>{QR=["~/Code"],WR=["localhost","test"],hW={dirExists:(w)=>{try{return XR(w).isDirectory()}catch{return!1}},fileExists:(w)=>{try{return YR(w)}catch{return!1}},readText:(w)=>{try{return AR(w,"utf8")}catch{return null}}}});import*as b8 from"node:net";function Z$(w,$,Y){return F("port",`Checking if port ${w} is in use on ${$}`,Y),new Promise((A)=>{let X=b8.createServer(),J=setTimeout(()=>{F("port",`Checking port ${w} timed out, assuming it's in use`,Y),X.close(),A(!0)},3000);X.once("error",(U)=>{if(clearTimeout(J),U.code==="EADDRINUSE")F("port",`Port ${w} is in use`,Y),A(!0);else F("port",`Error checking port ${w}: ${U.message}`,Y),A(!0)}),X.once("listening",()=>{clearTimeout(J),F("port",`Port ${w} is available`,Y),X.close(),A(!1)});try{X.listen(w,$)}catch(U){clearTimeout(J),F("port",`Exception checking port ${w}: ${U}`,Y),A(!0)}})}async function PW(w,$,Y,A=50){F("port",`Finding available port starting from ${w} (max attempts: ${A})`,Y);let X=w,J=0;while(J<A){if(J++,!await Z$(X,$,Y))return F("port",`Found available port: ${X} after ${J} attempts`,Y),X;F("port",`Port ${X} is in use, trying ${X+1} (attempt ${J}/${A})`,Y),X++}throw Error(`Unable to find available port after ${A} attempts starting from ${w}`)}function Y5(w,$,Y=5000,A){return F("port",`Testing connection to ${$}:${w}`,A),new Promise((X)=>{let J=b8.connect({host:$,port:w,timeout:Y});J.once("connect",()=>{F("port",`Successfully connected to ${$}:${w}`,A),J.end(),X(!0)}),J.once("timeout",()=>{F("port",`Connection to ${$}:${w} timed out`,A),J.destroy(),X(!1)}),J.once("error",(U)=>{F("port",`Failed to connect to ${$}:${w}: ${U.message}`,A),J.destroy(),X(!1)})})}class u8{usedPorts=new Set;hostname;verbose;maxRetries;constructor(w="0.0.0.0",$,Y=50){this.hostname=w,this.verbose=$,this.maxRetries=Y}async getNextAvailablePort(w,$=!1){if(this.usedPorts.has(w))return this.findNextAvailablePort(w+1,$);if(await Z$(w,this.hostname,this.verbose))return this.findNextAvailablePort(w+1,$);if($){if(!await Y5(w,this.hostname,3000,this.verbose))return F("port",`Port ${w} is available but not connectable, trying next port`,this.verbose),this.findNextAvailablePort(w+1,$)}return this.usedPorts.add(w),w}async findNextAvailablePort(w,$=!1){let Y=await PW(w,this.hostname,this.verbose,this.maxRetries);if($){if(!await Y5(Y,this.hostname,3000,this.verbose))if(Y<w+this.maxRetries)return this.findNextAvailablePort(Y+1,$);else throw Error(`Unable to find a connectable port after ${this.maxRetries} attempts`)}return this.usedPorts.add(Y),Y}releasePort(w){F("port",`Releasing port ${w}`,this.verbose),this.usedPorts.delete(w)}}var DL;var bW=t(()=>{X0();DL=new u8});import*as c8 from"node:fs";import*as p0 from"node:fs/promises";import{homedir as qR}from"node:os";import*as uW from"node:path";import*as v8 from"node:process";function Zw(){return uW.join(qR(),".stacks","rpx","registry.d")}function nY(w){return typeof w==="string"&&w.length>0&&w.length<=128&&NR.test(w)}function cW(w,$){if(!nY($))throw Error(`invalid registry id: ${JSON.stringify($)}`);return uW.join(w,`${$}.json`)}function b0(w){if(!Number.isInteger(w)||w<=0)return!1;try{return v8.kill(w,0),!0}catch($){return $.code==="EPERM"}}function A5(w){if(!w||typeof w!=="object")return!1;let $=w,Y=$.pid===void 0||typeof $.pid==="number"&&Number.isInteger($.pid)&&$.pid>0,A=typeof $.from==="string"&&$.from.length>0||Array.isArray($.from)&&$.from.length>0,X=typeof $.static==="string"||!!$.static&&typeof $.static==="object"&&typeof $.static.dir==="string",J=$.path===void 0||typeof $.path==="string";return typeof $.id==="string"&&nY($.id)&&(A||X)&&typeof $.to==="string"&&$.to.length>0&&J&&Y&&typeof $.createdAt==="string"}async function ER(w){await p0.mkdir(w,{recursive:!0})}async function i8(w,$=Zw(),Y){if(!A5(w))throw Error(`invalid registry entry: ${JSON.stringify(w)}`);await ER($);let A=cW($,w.id),X=`${A}.tmp.${v8.pid}.${Date.now()}`,J=JSON.stringify(w,null,2);try{await p0.writeFile(X,J,{encoding:"utf8",mode:420}),await p0.rename(X,A),F("registry",`wrote entry ${w.id} → ${A}`,Y)}catch(U){throw await p0.unlink(X).catch(()=>{}),U}}async function pY(w,$=Zw(),Y){let A=cW($,w);try{await p0.unlink(A),F("registry",`removed entry ${w}`,Y)}catch(X){if(X.code!=="ENOENT")throw X}}async function fR(w,$=Zw(),Y){let A=cW($,w);try{let X=await p0.readFile(A,"utf8"),J=JSON.parse(X);if(!A5(J))return F("registry",`entry ${w} failed validation, removing`,Y),await p0.unlink(A).catch(()=>{}),null;return J}catch(X){if(X.code==="ENOENT")return null;if(X instanceof SyntaxError)return F("registry",`entry ${w} has invalid JSON, removing`,Y),await p0.unlink(A).catch(()=>{}),null;throw X}}async function Sw(w=Zw(),$){let Y;try{Y=await p0.readdir(w)}catch(X){if(X.code==="ENOENT")return[];throw X}let A=[];for(let X of Y){if(!X.endsWith(".json"))continue;let J=X.slice(0,-5);if(!nY(J))continue;let U=await fR(J,w,$);if(U)A.push(U)}return A}async function YY(w=Zw(),$){let Y=await Sw(w,$),A=0;for(let X of Y){if(X.pid===void 0)continue;if(!b0(X.pid))F("registry",`GC: pid ${X.pid} for ${X.id} is dead, removing`,$),await pY(X.id,w,$).catch(()=>{}),A++}return A}function rY(w,$={}){let Y=$.dir??Zw(),A=$.debounceMs??100,X=$.pollMs??Math.max(A*2,250),J=$.verbose;c8.mkdirSync(Y,{recursive:!0});let U=null,W=!1,Q=null,B=!1,j=(N)=>{return JSON.stringify(N.map((T)=>({id:T.id,from:T.from,to:T.to,path:T.path,pid:T.pid,pathRewrites:T.pathRewrites,cleanUrls:T.cleanUrls,changeOrigin:T.changeOrigin,static:T.static,loadBalancer:T.loadBalancer})).sort((T,R)=>T.id.localeCompare(R.id)))},z=()=>{if(U=null,W)return;Sw(Y,J).then((N)=>{return Q=j(N),w(N)}).catch((N)=>{F("registry",`watcher onChange failed: ${N}`,J)})},G=()=>{if(W)return;if(U)clearTimeout(U);U=setTimeout(z,A)},E=setInterval(()=>{if(W||B)return;B=!0,Sw(Y,J).then((N)=>{if(j(N)!==Q)G()}).catch((N)=>{F("registry",`watcher poll failed: ${N}`,J)}).finally(()=>{B=!1})},X),q=c8.watch(Y,{persistent:!0},(N,T)=>{if(T&&/\.tmp\.\d+\.\d+$/.test(T))return;G()});return q.on("error",(N)=>{F("registry",`watcher error: ${N}`,J)}),G(),{close:()=>{if(W=!0,U)clearTimeout(U);clearInterval(E),q.close()}}}var NR;var t$=t(()=>{X0();NR=/^[a-zA-Z0-9._-]+$/});import{closeSync as X5,openSync as TR,readFileSync as HR}from"node:fs";import*as J5 from"node:fs/promises";import{spawn as RR}from"node:child_process";import{homedir as MR}from"node:os";import*as tY from"node:path";import*as Vw from"node:process";class m8{resolver;registryDir;rpxDir;verbose;startupTimeoutMs;pollIntervalMs;restartDelayMs;killGraceMs;launch;probePort;pickPort;isHostRoutable;onSiteActivating;now;writeEntry;removeEntry;sites=new Map;reaper;stopped=!1;constructor(w){this.resolver=w.resolver,this.registryDir=w.registryDir??Zw(),this.rpxDir=w.rpxDir??tY.join(MR(),".stacks","rpx"),this.verbose=w.verbose??!1,this.startupTimeoutMs=w.startupTimeoutMs??IR,this.pollIntervalMs=w.pollIntervalMs??VR,this.restartDelayMs=w.restartDelayMs??yR,this.killGraceMs=w.killGraceMs??OR,this.launch=w.launcher??_R(this.verbose),this.probePort=w.probePort??LR,this.pickPort=w.pickPort??((Y)=>PW(Y,"127.0.0.1")),this.isHostRoutable=w.isHostRoutable??(()=>!1),this.onSiteActivating=w.onSiteActivating,this.now=w.now??Date.now,this.writeEntry=w.writeEntry??i8,this.removeEntry=w.removeEntry??pY;let $=w.reapIntervalMs??CR;if(this.reaper=setInterval(()=>{this.reapIdle()},$),typeof this.reaper.unref==="function")this.reaper.unref()}async onRequest(w){if(this.stopped)return{kind:"unknown"};let $=this.sites.get(w);if($&&$.status==="failed"&&this.now()-$.failedAt>=this.restartDelayMs)this.sites.delete(w),$=void 0;if(!$){let Y=this.resolver.resolve(w);if(!Y)return{kind:"unknown"};$=await this.start(Y)}if($.lastAccess=this.now(),$.status==="ready")return{kind:"ready",host:w};if($.status==="failed")return{kind:"failed",host:w,error:$.error??"failed to start",logTail:this.readLogTail($)};return{kind:"starting",host:w,sinceMs:this.now()-$.startedAt,source:$.site.source,logTail:this.readLogTail($,16)}}async start(w){try{this.onSiteActivating?.(w.host)}catch{}let $=new Map;if(!w.selfRegisters)for(let W of w.routes){if($.has(W.portEnv))continue;let Q=await this.pickPort(W.defaultPort??3000);$.set(W.portEnv,Q)}let Y=tY.join(this.rpxDir,"sites",`${w.id}.log`);await J5.mkdir(tY.dirname(Y),{recursive:!0}).catch(()=>{});let A=this.buildEnv(w,$),X=null,J;try{X=this.launch({command:w.command,cwd:w.dir,env:A,logPath:Y})}catch(W){J=`failed to spawn: ${W.message}`}let U={site:w,status:J?"failed":"starting",handle:X,ports:$,routeIds:[],startedAt:this.now(),lastAccess:this.now(),failedAt:J?this.now():0,error:J,logPath:Y,exited:!1,ready:Promise.resolve()};if(this.sites.set(w.host,U),J)return H.warn(`rpx: site ${w.host} ${J}`),U;return H.info(`rpx: booting ${w.host} → ${w.command} (${w.dir})`),X.exited.then((W)=>this.onProcessExit(U,W)).catch(()=>{}),U.ready=this.driveReadiness(U).catch((W)=>{F("sites",`readiness loop for ${w.host} threw: ${W}`,this.verbose)}),U}async onProcessExit(w,$){if(w.exited=!0,this.stopped||this.sites.get(w.site.host)!==w)return;if(w.status==="ready"){H.warn(`rpx: ${w.site.host} exited${$!==null?` (code ${$})`:""} — will reboot on next request`),this.sites.delete(w.site.host);for(let Y of w.routeIds)await this.removeEntry(Y,this.registryDir,this.verbose).catch(()=>{})}else if(w.status==="starting")this.fail(w,`process exited${$!==null?` with code ${$}`:""} before becoming ready`)}async driveReadiness(w){let{site:$}=w,Y=this.now()+this.startupTimeoutMs,A=$.selfRegisters?()=>this.isHostRoutable($.host):await this.makeGateProbe($,w.ports);while(this.now()<Y&&!this.stopped){if(w.status!=="starting"||w.exited)return;if(await A()){if(await this.publishRoutes(w),w.status==="starting")w.status="ready",H.success(`rpx: ${$.host} ready`);return}await vW(this.pollIntervalMs)}if(w.status==="starting")this.fail(w,`did not become ready within ${Math.round(this.startupTimeoutMs/1000)}s`)}async makeGateProbe(w,$){let Y=w.routes.filter((X)=>X.readyGate??_w(X.path)==="/").map((X)=>$.get(X.portEnv)).filter((X)=>typeof X==="number"),A=Y.length>0?Y:[...$.values()];return async()=>{for(let X of A)if(!await this.probePort(X))return!1;return A.length>0}}async publishRoutes(w){let{site:$,ports:Y}=w;if($.selfRegisters||$.routes.length===0)return;let A=$.routes.find((Q)=>_w(Q.path)==="/")??$.routes[0],X=Y.get(A.portEnv);if(X===void 0)return;let J=[];for(let Q of $.routes){if(Q===A)continue;let B=Y.get(Q.portEnv);if(B===void 0)continue;J.push({from:_w(Q.path),to:`localhost:${B}`,stripPrefix:Q.stripPrefix??!1})}let U={id:$.id,from:`localhost:${X}`,to:$.host,cwd:$.dir,createdAt:new Date(this.now()).toISOString(),pathRewrites:J.length>0?J:void 0,pid:w.handle?.pid};await this.writeEntry(U,this.registryDir,this.verbose),w.routeIds=[$.id];let W=this.now()+2000;while(this.now()<W&&!this.isHostRoutable($.host))await vW(50)}fail(w,$){w.status="failed",w.error=$,w.failedAt=this.now(),H.warn(`rpx: site ${w.site.host} failed — ${$}`),this.killProcess(w)}buildEnv(w,$){let Y={};for(let[A,X]of Object.entries(Vw.env))if(typeof X==="string")Y[A]=X;Object.assign(Y,w.env);for(let[A,X]of $)Y[A]=String(X);return Y.RPX_SITE_HOST=w.host,Y.RPX_SITE_URL=`https://${w.host}`,Y}readLogTail(w,$=40){try{return HR(w.logPath,"utf8").split(`
235
235
  `).slice(-$).join(`
236
- `).trim()}catch{return""}}async stop(w){let $=this.sites.get(w);if(!$)return;this.sites.delete(w);for(let Y of $.routeIds)await this.removeEntry(Y,this.registryDir,this.verbose).catch(()=>{});await this.killProcess($),H.info(`rpx: stopped ${w}`)}async killProcess(w){let $=w.handle;if(!$)return;w.handle=null;try{$.stop("SIGTERM")}catch{}let Y=setTimeout(()=>{try{$.stop("SIGKILL")}catch{}},this.killGraceMs);if(typeof Y.unref==="function")Y.unref();await Promise.race([$.exited.catch(()=>{}),cW(this.killGraceMs+500)]),clearTimeout(Y)}async reapIdle(){if(this.stopped)return;let w=this.now();for(let[$,Y]of this.sites){let A=Y.site.idleTimeoutMs;if(A<=0)continue;let X=w-Y.lastAccess;if((Y.status==="ready"||w-Y.startedAt>this.startupTimeoutMs)&&X>A)F("sites",`reaping ${$} (idle ${Math.round(X/1000)}s)`,this.verbose),await this.stop($)}}list(){let w=this.now();return[...this.sites.values()].map(($)=>({host:$.site.host,dir:$.site.dir,status:$.status,pid:$.handle?.pid??null,ports:Object.fromEntries($.ports),uptimeMs:w-$.startedAt,idleMs:w-$.lastAccess,error:$.error}))}async stopAll(){this.stopped=!0,clearInterval(this.reaper),await Promise.allSettled([...this.sites.keys()].map((w)=>this.stop(w)))}}function cW(w){return new Promise(($)=>setTimeout($,w))}async function yR(w){let $=new AbortController,Y=setTimeout(()=>$.abort(),2000);try{return await fetch(`http://127.0.0.1:${w}/`,{signal:$.signal,redirect:"manual"}),!0}catch{return!1}finally{clearTimeout(Y)}}function OR(w){let $=LR();return({command:Y,cwd:A,env:X,logPath:J})=>{let U=ER(J,"a");try{let W=fR("sh",["-c",Y],{cwd:A,env:X,detached:!0,stdio:["ignore",U,U],...$?{uid:$.uid,gid:$.gid}:{}}),Q=W.pid;if(Q===void 0)throw Error("spawn returned no pid");let B=new Promise((j)=>{W.once("exit",(z)=>{j(z)}),W.once("error",()=>{j(null)})}).finally(()=>{try{A5(U)}catch{}});return F("sites",`spawned pid ${Q}: sh -c ${Y} (cwd ${A})`,w),{pid:Q,exited:B,stop:(j="SIGTERM")=>{try{Vw.kill(-Q,j)}catch{try{W.kill(j)}catch{}}}}}catch(W){try{A5(U)}catch{}throw W}}}function LR(){if(Vw.platform==="win32")return null;if(!(typeof Vw.getuid==="function"&&Vw.getuid()===0))return null;let $=Number.parseInt(Vw.env.SUDO_UID??"",10),Y=Number.parseInt(Vw.env.SUDO_GID??"",10);if(!Number.isInteger($)||$<=0||!Number.isInteger(Y)||Y<=0)return null;return{uid:$,gid:Y}}var RR=120000,MR=200,IR=30000,VR=3000,CR=4000;var vW=t(()=>{mY();PW();r$();X0();lw()});function YY(w){return w.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function J5(w,$,Y){return`<!doctype html>
236
+ `).trim()}catch{return""}}async stop(w){let $=this.sites.get(w);if(!$)return;this.sites.delete(w);for(let Y of $.routeIds)await this.removeEntry(Y,this.registryDir,this.verbose).catch(()=>{});await this.killProcess($),H.info(`rpx: stopped ${w}`)}async killProcess(w){let $=w.handle;if(!$)return;w.handle=null;try{$.stop("SIGTERM")}catch{}let Y=setTimeout(()=>{try{$.stop("SIGKILL")}catch{}},this.killGraceMs);if(typeof Y.unref==="function")Y.unref();await Promise.race([$.exited.catch(()=>{}),vW(this.killGraceMs+500)]),clearTimeout(Y)}async reapIdle(){if(this.stopped)return;let w=this.now();for(let[$,Y]of this.sites){let A=Y.site.idleTimeoutMs;if(A<=0)continue;let X=w-Y.lastAccess;if((Y.status==="ready"||w-Y.startedAt>this.startupTimeoutMs)&&X>A)F("sites",`reaping ${$} (idle ${Math.round(X/1000)}s)`,this.verbose),await this.stop($)}}list(){let w=this.now();return[...this.sites.values()].map(($)=>({host:$.site.host,dir:$.site.dir,status:$.status,pid:$.handle?.pid??null,ports:Object.fromEntries($.ports),uptimeMs:w-$.startedAt,idleMs:w-$.lastAccess,error:$.error}))}async stopAll(){this.stopped=!0,clearInterval(this.reaper),await Promise.allSettled([...this.sites.keys()].map((w)=>this.stop(w)))}}function vW(w){return new Promise(($)=>setTimeout($,w))}async function LR(w){let $=new AbortController,Y=setTimeout(()=>$.abort(),2000);try{return await fetch(`http://127.0.0.1:${w}/`,{signal:$.signal,redirect:"manual"}),!0}catch{return!1}finally{clearTimeout(Y)}}function _R(w){let $=SR();return({command:Y,cwd:A,env:X,logPath:J})=>{let U=TR(J,"a");try{let W=RR("sh",["-c",Y],{cwd:A,env:X,detached:!0,stdio:["ignore",U,U],...$?{uid:$.uid,gid:$.gid}:{}}),Q=W.pid;if(Q===void 0)throw Error("spawn returned no pid");let B=new Promise((j)=>{W.once("exit",(z)=>{j(z)}),W.once("error",()=>{j(null)})}).finally(()=>{try{X5(U)}catch{}});return F("sites",`spawned pid ${Q}: sh -c ${Y} (cwd ${A})`,w),{pid:Q,exited:B,stop:(j="SIGTERM")=>{try{Vw.kill(-Q,j)}catch{try{W.kill(j)}catch{}}}}}catch(W){try{X5(U)}catch{}throw W}}}function SR(){if(Vw.platform==="win32")return null;if(!(typeof Vw.getuid==="function"&&Vw.getuid()===0))return null;let $=Number.parseInt(Vw.env.SUDO_UID??"",10),Y=Number.parseInt(Vw.env.SUDO_GID??"",10);if(!Number.isInteger($)||$<=0||!Number.isInteger(Y)||Y<=0)return null;return{uid:$,gid:Y}}var IR=120000,VR=200,CR=30000,yR=3000,OR=4000;var iW=t(()=>{dY();bW();t$();X0();lw()});function AY(w){return w.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function U5(w,$,Y){return`<!doctype html>
237
237
  <html lang="en">
238
238
  <head>
239
239
  <meta charset="utf-8">
240
240
  <meta name="viewport" content="width=device-width, initial-scale=1">
241
241
  ${Y>0?`<meta http-equiv="refresh" content="${Y}">`:""}
242
- <title>${YY(w)}</title>
243
- <style>${_R}</style>
242
+ <title>${AY(w)}</title>
243
+ <style>${ZR}</style>
244
244
  </head>
245
245
  <body><main class="card">${$}</main></body>
246
- </html>`}function iW(w){let $=Math.max(1,Math.round(w.sinceMs/1000)),Y=w.logTail?`<pre>${YY(w.logTail)}</pre>`:"",A=`
247
- <div class="row"><div class="spinner"></div><h1>Starting ${YY(w.host)}…</h1></div>
246
+ </html>`}function mW(w){let $=Math.max(1,Math.round(w.sinceMs/1000)),Y=w.logTail?`<pre>${AY(w.logTail)}</pre>`:"",A=`
247
+ <div class="row"><div class="spinner"></div><h1>Starting ${AY(w.host)}…</h1></div>
248
248
  <p>rpx is booting this site's dev server on demand. This page reloads itself —
249
249
  it'll switch to the app as soon as it's ready (usually a few seconds).</p>
250
250
  <p>Booting for ${$}s.</p>
251
- ${Y}`;return new Response(J5(`Starting ${w.host}`,A,2),{status:503,headers:{"content-type":"text/html; charset=utf-8","retry-after":"2","cache-control":"no-store"}})}function mW(w){let $=w.logTail?`<pre>${YY(w.logTail)}</pre>`:"<p>No output was captured.</p>",Y=`
252
- <div class="row"><div class="dot"></div><h1>${YY(w.host)} failed to start</h1></div>
253
- <p>${YY(w.error)}</p>
251
+ ${Y}`;return new Response(U5(`Starting ${w.host}`,A,2),{status:503,headers:{"content-type":"text/html; charset=utf-8","retry-after":"2","cache-control":"no-store"}})}function gW(w){let $=w.logTail?`<pre>${AY(w.logTail)}</pre>`:"<p>No output was captured.</p>",Y=`
252
+ <div class="row"><div class="dot"></div><h1>${AY(w.host)} failed to start</h1></div>
253
+ <p>${AY(w.error)}</p>
254
254
  ${$}
255
- <p>Fix the cause and reload — rpx retries the boot on the next request.</p>`;return new Response(J5(`${w.host} failed`,Y,5),{status:502,headers:{"content-type":"text/html; charset=utf-8","cache-control":"no-store"}})}var _R=`
255
+ <p>Fix the cause and reload — rpx retries the boot on the next request.</p>`;return new Response(U5(`${w.host} failed`,Y,5),{status:502,headers:{"content-type":"text/html; charset=utf-8","cache-control":"no-store"}})}var ZR=`
256
256
  :root { color-scheme: light dark }
257
257
  * { box-sizing: border-box }
258
258
  body {
@@ -278,63 +278,63 @@ ${Y>0?`<meta http-equiv="refresh" content="${Y}">`:""}
278
278
  }
279
279
  .dot { width: 10px; height: 10px; border-radius: 50%; background: #f87171 }
280
280
  @keyframes spin { to { transform: rotate(360deg) } }
281
- `;import{exec as SR}from"node:child_process";import i8 from"node:fs";import ZR from"node:os";import W5 from"node:path";import*as t$ from"node:process";import{promisify as kR}from"node:util";function U5(w){let $=w.trim().toLowerCase();return $==="localhost"||$.endsWith(".localhost")||$.endsWith(".localhost.")}async function B5(w){if(t$.platform==="win32")throw Error("Administrator privileges required on Windows");if(f8()){let{stdout:A}=await rY(w);return A}let $=g$(),Y=w.replace(/'/g,"'\\''");try{if($){let{stdout:A}=await rY(`echo '${$}' | sudo -S sh -c '${Y}' 2>/dev/null`);return gW=!0,A}if(gW)try{let{stdout:A}=await rY(`sudo -n sh -c '${Y}'`);return A}catch(A){F("hosts","Cached sudo privileges expired, requesting again",!0)}try{let{stdout:A}=await rY(`sudo -n sh -c '${Y}'`);return gW=!0,A}catch{throw Error("sudo required but no cached credentials (set SUDO_PASSWORD in .env or run sudo -v)")}}catch(A){throw Error(`Failed to execute sudo command: ${A.message}`)}}function g8(w){let $=w.indexOf("#"),Y=($===-1?w:w.slice(0,$)).trim();if(!Y)return null;let A=$===-1?"":w.slice($+1).trim(),[X,...J]=Y.split(/\s+/);if(!X||J.length===0)return null;let U=/^rpx(?::pid=(\d+))?$/.exec(A);return{address:X,names:J,comment:A,rpxPid:U?.[1]?Number.parseInt(U[1],10):null,rpxManaged:U!==null}}function j5(w,$){let Y=g8(w);return Y!==null&&m8.has(Y.address)&&Y.names.includes($)}function DR(w,$){let Y=new Set($),A=new Set,X=w.split(`
282
- `),J=[],U=0;while(U<X.length){let W=X[U];if(W.trim()===hR){let B=[],j=U+1;while(j<X.length){let G=X[j];if(G.trim()===""||G.trim().startsWith("#"))break;B.push(G),j++}let z=B.filter((G)=>{let K=g8(G),E=K!==null&&m8.has(K.address)&&K.names.some((q)=>Y.has(q));if(E){for(let q of K.names)if(Y.has(q))A.add(q)}return!E});if(z.length>0||B.length===0)J.push(W,...z);U=j;continue}let Q=g8(W);if(Q?.rpxManaged&&m8.has(Q.address)&&Q.names.some((B)=>Y.has(B))){for(let B of Q.names)if(Y.has(B))A.add(B);U++;continue}J.push(W),U++}while(J.length>0&&J[J.length-1].trim()==="")J.pop();return{content:`${J.join(`
281
+ `;import{exec as kR}from"node:child_process";import g8 from"node:fs";import hR from"node:os";import B5 from"node:path";import*as a$ from"node:process";import{promisify as DR}from"node:util";function Q5(w){let $=w.trim().toLowerCase();return $==="localhost"||$.endsWith(".localhost")||$.endsWith(".localhost.")}async function j5(w){if(a$.platform==="win32")throw Error("Administrator privileges required on Windows");if(DY()){let{stdout:A}=await aY(w);return A}let $=I$(),Y=w.replace(/'/g,"'\\''");try{if($){let{stdout:A}=await aY(`echo '${$}' | sudo -S sh -c '${Y}' 2>/dev/null`);return dW=!0,A}if(dW)try{let{stdout:A}=await aY(`sudo -n sh -c '${Y}'`);return A}catch(A){F("hosts","Cached sudo privileges expired, requesting again",!0)}try{let{stdout:A}=await aY(`sudo -n sh -c '${Y}'`);return dW=!0,A}catch{throw Error("sudo required but no cached credentials (set SUDO_PASSWORD in .env or run sudo -v)")}}catch(A){throw Error(`Failed to execute sudo command: ${A.message}`)}}function l8(w){let $=w.indexOf("#"),Y=($===-1?w:w.slice(0,$)).trim();if(!Y)return null;let A=$===-1?"":w.slice($+1).trim(),[X,...J]=Y.split(/\s+/);if(!X||J.length===0)return null;let U=/^rpx(?::pid=(\d+))?$/.exec(A);return{address:X,names:J,comment:A,rpxPid:U?.[1]?Number.parseInt(U[1],10):null,rpxManaged:U!==null}}function z5(w,$){let Y=l8(w);return Y!==null&&d8.has(Y.address)&&Y.names.includes($)}function PR(w,$){let Y=new Set($),A=new Set,X=w.split(`
282
+ `),J=[],U=0;while(U<X.length){let W=X[U];if(W.trim()===xR){let B=[],j=U+1;while(j<X.length){let G=X[j];if(G.trim()===""||G.trim().startsWith("#"))break;B.push(G),j++}let z=B.filter((G)=>{let K=l8(G),E=K!==null&&d8.has(K.address)&&K.names.some((q)=>Y.has(q));if(E){for(let q of K.names)if(Y.has(q))A.add(q)}return!E});if(z.length>0||B.length===0)J.push(W,...z);U=j;continue}let Q=l8(W);if(Q?.rpxManaged&&d8.has(Q.address)&&Q.names.some((B)=>Y.has(B))){for(let B of Q.names)if(Y.has(B))A.add(B);U++;continue}J.push(W),U++}while(J.length>0&&J[J.length-1].trim()==="")J.pop();return{content:`${J.join(`
283
283
  `)}
284
- `,removed:[...A]}}function xR(w,$){let Y=[],A=new Set,X=[];for(let J of w.split(`
285
- `)){let U=g8(J);if(U?.rpxManaged&&U.rpxPid!==null&&m8.has(U.address)&&!$(U.rpxPid)){Y.push(...U.names),A.add(U.rpxPid);continue}X.push(J)}while(X.length>0&&X[X.length-1].trim()==="")X.pop();return{content:`${X.join(`
284
+ `,removed:[...A]}}function bR(w,$){let Y=[],A=new Set,X=[];for(let J of w.split(`
285
+ `)){let U=l8(J);if(U?.rpxManaged&&U.rpxPid!==null&&d8.has(U.address)&&!$(U.rpxPid)){Y.push(...U.names),A.add(U.rpxPid);continue}X.push(J)}while(X.length>0&&X[X.length-1].trim()==="")X.pop();return{content:`${X.join(`
286
286
  `)}
287
- `,removed:Y,stalePids:[...A]}}async function dW(w){try{return await i8.promises.readFile(W$,"utf-8")}catch{return F("hosts","Reading hosts file requires elevated permissions, using sudo",w),B5(`cat "${W$}"`)}}async function lW(w,$){let Y=W5.join(ZR.tmpdir(),`rpx-hosts-${Date.now()}.tmp`);try{await i8.promises.writeFile(Y,w,"utf8"),await B5(`cat "${Y}" | tee "${W$}" > /dev/null`)}finally{await i8.promises.unlink(Y).catch((A)=>{F("hosts",`Failed to remove temporary file: ${A}`,$)})}}async function tY(w,$){let Y=w.filter((X)=>!U5(X)),A=w.filter((X)=>U5(X));if(A.length>0)F("hosts",`Skipping /etc/hosts for loopback dev names: ${A.join(", ")}`,$);if(Y.length===0)return;F("hosts",`Adding hosts: ${Y.join(", ")}`,$),F("hosts",`Using hosts file at: ${W$}`,$);try{let X;try{X=await dW($)}catch(B){throw console.log(" Could not read hosts file — skipping hosts setup"),F("hosts",`sudo read also failed: ${B}`,$),Error(`Cannot read hosts file: ${B}`)}let J=X.split(`
288
- `),U=Y.filter((B)=>!J.some((j)=>j5(j,B)));if(U.length===0){F("hosts","All hosts already exist in hosts file",$);return}let W=t$.pid,Q=U.map((B)=>`
289
- 127.0.0.1 ${B} ${Q5}:pid=${W}
290
- ::1 ${B} ${Q5}:pid=${W}`).join(`
291
- `);try{await lW(X+Q,$),console.log(` Hosts updated: ${U.join(", ")}`)}catch(B){console.log(" Could not update hosts file automatically"),console.log(" Add these entries to /etc/hosts:"),U.forEach((j)=>{console.log(` 127.0.0.1 ${j}`),console.log(` ::1 ${j}`)}),console.log(` Or run: sudo nano ${W$}`)}}catch(X){F("hosts",`Failed to manage hosts file: ${X.message}`,$)}}async function z5(w,$){F("hosts",`Removing hosts: ${w.join(", ")}`,$);try{let Y;try{Y=await dW($)}catch(J){throw F("hosts",`sudo read also failed: ${J}`,$),Error(`Cannot read hosts file: ${J}`)}let{content:A,removed:X}=DR(Y,w);if(X.length===0){F("hosts","No matching rpx-managed hosts found to remove",$);return}try{await lW(A,$),F("hosts",`Hosts removed successfully: ${X.join(", ")}`,$)}catch(J){F("hosts","Could not clean up hosts file automatically",$)}}catch(Y){F("hosts",`Failed to clean up hosts file: ${Y.message}`,$)}}async function aY(w,$){F("hosts",`Checking hosts: ${w}`,$);let Y;try{Y=await i8.promises.readFile(W$,"utf-8")}catch(X){F("hosts",`Error reading hosts file: ${X}`,$);try{let J=g$(),U;if(J)U=`echo '${J}' | sudo -S cat "${W$}" 2>/dev/null`;else U=`sudo -n cat "${W$}" 2>/dev/null || cat "${W$}" 2>/dev/null || echo ""`;let{stdout:W}=await rY(U);Y=W}catch(J){return F("hosts",`Cannot read hosts file, assuming entries don't exist: ${J}`,$),w.map(()=>!1)}}let A=Y.split(`
292
- `);return w.map((X)=>A.some((J)=>j5(J,X)))}async function AY(w={}){let $=w.isAlive??b0,Y;try{Y=await dW(w.verbose)}catch(U){return F("hosts",`stale hosts GC: cannot read hosts file: ${U}`,w.verbose),[]}let{content:A,removed:X,stalePids:J}=xR(Y,$);if(X.length===0)return[];try{return await lW(A,w.verbose),F("hosts",`stale hosts GC: removed ${X.join(", ")} (dead pid(s): ${J.join(", ")})`,w.verbose),[...new Set(X)]}catch(U){return F("hosts",`stale hosts GC: write failed: ${U}`,w.verbose),[]}}var rY,W$,Q5="# rpx",hR="# Added by rpx",m8,gW=!1;var d8=t(()=>{r$();X0();rY=kR(SR);W$=t$.platform==="win32"?W5.join(t$.env.windir||"C:\\Windows","System32","drivers","etc","hosts"):"/etc/hosts",m8=new Set(["127.0.0.1","::1"])});import{spawn as PR}from"node:child_process";import*as B$ from"node:fs/promises";import{homedir as bR}from"node:os";import*as sY from"node:path";import*as y0 from"node:process";function j$(){return sY.join(bR(),".stacks","rpx")}function K5(w=j$()){return sY.join(w,"daemon.pid")}async function G5(w=j$()){try{let $=await B$.readFile(K5(w),"utf8"),Y=Number.parseInt($.trim(),10);if(!Number.isFinite(Y)||Y<=0)return null;return Y}catch($){if($.code==="ENOENT")return null;throw $}}async function uR(w=j$()){await B$.unlink(K5(w)).catch(()=>{})}function cR(){let w=y0.execPath,$=sY.basename(w).toLowerCase();if(($==="bun"||$==="node"||$.startsWith("bun-"))&&y0.argv[1])return[w,y0.argv[1],"daemon:start"];return[w,"daemon:start"]}async function F5(w={}){let $=w.rpxDir??j$(),Y=w.verbose??!1;await z$({rpxDir:$,verbose:Y}).catch((j)=>{F("daemon",`DNS reconcile before ensureDaemonRunning: ${j}`,Y)});let A=await G5($);if(A!==null&&b0(A))return F("daemon",`ensureDaemonRunning: already running pid=${A}`,Y),{pid:A,spawned:!1};if(A!==null)F("daemon",`ensureDaemonRunning: clearing stale pid=${A}`,Y),await uR($);await B$.mkdir($,{recursive:!0});let X=w.spawnCommand??cR();if(X.length===0)throw Error("ensureDaemonRunning: spawnCommand is empty");F("daemon",`spawning daemon: ${X.join(" ")}`,Y);let J=PR(X[0],X.slice(1),{detached:!0,stdio:"ignore",cwd:w.spawnCwd??y0.cwd(),env:w.spawnEnv?{...y0.env,...w.spawnEnv}:y0.env});J.unref();let U=null;J.once("error",(j)=>{U=j});let W=w.startupTimeoutMs??5000,Q=w.pollIntervalMs??50,B=Date.now()+W;while(Date.now()<B){if(U)throw U;let j=await G5($);if(j!==null&&b0(j))return F("daemon",`daemon registered with pid=${j}`,Y),{pid:j,spawned:!0};await new Promise((z)=>setTimeout(z,Q))}if(U)throw U;throw Error(`rpx daemon failed to start within ${W}ms (rpxDir=${$})`)}var nW=t(()=>{lw();y8();S8();Z8();mY();h8();D8();DW();vW();vY();bY();r$();d8();XY();X0()});import*as Z$ from"node:fs/promises";import{homedir as vR}from"node:os";import*as pW from"node:path";function N5(){return pW.join(vR(),".stacks","rpx")}function rW(w=N5()){return pW.join(w,iR)}async function n8(w=N5()){try{let $=await Z$.readFile(rW(w),"utf8"),Y=JSON.parse($);if(Y.version!==l8||!Array.isArray(Y.resolvers))return null;return{version:l8,resolvers:Y.resolvers.filter((A)=>typeof A==="string"),domains:Array.isArray(Y.domains)?Y.domains.filter((A)=>typeof A==="string"):[],ownerPid:typeof Y.ownerPid==="number"?Y.ownerPid:null,updatedAt:typeof Y.updatedAt==="string"?Y.updatedAt:""}}catch($){if($.code==="ENOENT")return null;throw $}}async function E5(w,$){await Z$.mkdir(w,{recursive:!0}),await Z$.writeFile(rW(w),`${JSON.stringify($,null,2)}
293
- `,"utf8")}async function tW(w){await Z$.rm(rW(w),{force:!0})}function T5(w){let $=w.trim().toLowerCase().replace(/\.$/,"");if(!$||$.includes("127.0.0.1"))return null;if($==="localhost"||$.endsWith(".localhost"))return null;if(/^\d{1,3}(\.\d{1,3}){3}$/.test($))return null;if(!/^[a-z0-9.-]+$/.test($))return null;return $}function mR(w){let $=T5(w);if(!$)return null;let Y=$.split(".");if(Y.length<2)return null;return Y.slice(-2).join(".")}function aW(w){let $=new Set;for(let Y of w){let A=mR(Y);if(A)$.add(A)}return Array.from($).sort()}function sW(w){let $=new Set;for(let Y of w){let A=T5(Y);if(A)$.add(A)}return Array.from($).sort()}var l8=1,iR="dns-state.json",q5;var f5=t(()=>{q5=["com","test","dev","app","page","local","localhost","example","invalid"]});var r8={};EB(r8,{tearDownDevelopmentDns:()=>S$,syncDevelopmentDnsFromRegistry:()=>a$,stopDnsServer:()=>oW,startDnsServer:()=>O5,setupResolver:()=>oR,setupDevelopmentDns:()=>YB,resolverFilePath:()=>JY,removeResolver:()=>wM,removeLegacyTldResolvers:()=>$B,reconcileStaleDevelopmentDns:()=>z$,isRpxDevelopmentDnsAnswering:()=>L5,isDnsServerRunning:()=>nR,contentLooksLikeRpxResolver:()=>_5,RPX_RESOLVER_MARKER:()=>I5,DNS_PORT:()=>eY});import H5 from"node:dgram";import*as R5 from"node:fs/promises";import*as M5 from"node:path";import*as G$ from"node:process";function C5(w){return{id:w.readUInt16BE(0),flags:w.readUInt16BE(2),qdcount:w.readUInt16BE(4),ancount:w.readUInt16BE(6),nscount:w.readUInt16BE(8),arcount:w.readUInt16BE(10)}}function y5(w,$,Y=0){let A=[],X=$,J=0;while(!0){if(X>=w.length||++J>128)break;let U=w[X];if(U===0){X++;break}if((U&192)===192){if(X+1>=w.length||Y>=10)break;let W=w.readUInt16BE(X)&16383,{name:Q}=y5(w,W,Y+1);if(Q)A.push(Q);X+=2;break}if(X++,X+U>w.length)break;A.push(w.subarray(X,X+U).toString("ascii")),X+=U}return{name:A.join("."),newOffset:X}}function gR(w,$){let{name:Y,newOffset:A}=y5(w,$),X=w.readUInt16BE(A),J=w.readUInt16BE(A+2);return{question:{name:Y,type:X,class:J},newOffset:A+4}}function oY(w){let $=w.split("."),Y=[];for(let A of $)Y.push(Buffer.from([A.length])),Y.push(Buffer.from(A,"ascii"));return Y.push(Buffer.from([0])),Buffer.concat(Y)}function dR(w,$,Y){let A=[],X=Buffer.alloc(12);X.writeUInt16BE(w,0),X.writeUInt16BE(33152,2),X.writeUInt16BE(1,4),X.writeUInt16BE(1,6),X.writeUInt16BE(0,8),X.writeUInt16BE(0,10),A.push(X),A.push(oY($.name));let J=Buffer.alloc(4);J.writeUInt16BE($.type,0),J.writeUInt16BE($.class,2),A.push(J),A.push(oY($.name));let U=Buffer.alloc(10);if(U.writeUInt16BE($.type,0),U.writeUInt16BE(1,2),U.writeUInt32BE(300,4),$.type===1){U.writeUInt16BE(4,8),A.push(U);let W=Y.split(".").map((Q)=>Number.parseInt(Q,10));A.push(Buffer.from(W))}else if($.type===28)U.writeUInt16BE(16,8),A.push(U),A.push(Buffer.from([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]));else return X.writeUInt16BE(33155,2),X.writeUInt16BE(0,6),Buffer.concat([X,oY($.name),J]);return Buffer.concat(A)}function lR(w,$){let Y=[],A=Buffer.alloc(12);A.writeUInt16BE(w,0),A.writeUInt16BE(33155,2),A.writeUInt16BE(1,4),A.writeUInt16BE(0,6),A.writeUInt16BE(0,8),A.writeUInt16BE(0,10),Y.push(A),Y.push(oY($.name));let X=Buffer.alloc(4);return X.writeUInt16BE($.type,0),X.writeUInt16BE($.class,2),Y.push(X),Buffer.concat(Y)}async function O5(w,$){if(G$.platform!=="darwin")return!1;let Y=sW(w);if(Y.length===0)return!1;if(t0){for(let A of Y)p8.add(A);return F("dns","DNS server already running — merged domains",$),!0}return p8=new Set(Y),new Promise((A)=>{t0=H5.createSocket("udp4"),t0.on("error",(X)=>{F("dns",`DNS server error: ${X.message}`,$),t0?.close(),t0=null,A(!1)}),t0.on("message",(X,J)=>{try{let U=C5(X),{question:W}=gR(X,12);F("dns",`Query for ${W.name} type ${W.type} from ${J.address}`,$);let Q=W.name.toLowerCase(),B=!1;for(let z of p8)if(Q===z||Q.endsWith(`.${z}`)){B=!0;break}let j;if(B&&(W.type===1||W.type===28))j=dR(U.id,W,"127.0.0.1"),F("dns",`Responding with localhost for ${W.name}`,$);else j=lR(U.id,W),F("dns",`NXDOMAIN for ${W.name}`,$);t0?.send(j,J.port,J.address)}catch(U){F("dns",`Error processing DNS query: ${U}`,$)}}),t0.on("listening",()=>{let X=t0?.address();F("dns",`DNS server listening on ${X?.address}:${X?.port}`,$),A(!0)});try{t0.bind(eY,"127.0.0.1")}catch(X){F("dns",`Failed to bind DNS server: ${X}`,$),A(!1)}})}function oW(w){if(t0)F("dns","Stopping DNS server",w),t0.close(),t0=null,p8=new Set}function nR(){return t0!==null}async function L5(w,$=500){let Y=w.trim().toLowerCase().replace(/\.$/,"");if(!Y)return!1;return new Promise((A)=>{let X=H5.createSocket("udp4"),J=setTimeout(()=>{X.close(),A(!1)},$);X.on("message",(W)=>{clearTimeout(J),X.close();try{let Q=C5(W);A(Q.ancount>0)}catch{A(!1)}}),X.on("error",()=>{clearTimeout(J),X.close(),A(!1)});let U=pR(Y,1);X.send(U,eY,"127.0.0.1",(W)=>{if(W)clearTimeout(J),X.close(),A(!1)})})}function pR(w,$){let Y=Buffer.alloc(12);Y.writeUInt16BE(1,0),Y.writeUInt16BE(256,2),Y.writeUInt16BE(1,4);let A=Buffer.concat([oY(w),Buffer.from([0,$,0,1])]);return Buffer.concat([Y,A])}function rR(){return`${I5}
287
+ `,removed:Y,stalePids:[...A]}}async function lW(w){try{return await g8.promises.readFile(W$,"utf-8")}catch{return F("hosts","Reading hosts file requires elevated permissions, using sudo",w),j5(`cat "${W$}"`)}}async function nW(w,$){let Y=B5.join(hR.tmpdir(),`rpx-hosts-${Date.now()}.tmp`);try{await g8.promises.writeFile(Y,w,"utf8"),await j5(`cat "${Y}" | tee "${W$}" > /dev/null`)}finally{await g8.promises.unlink(Y).catch((A)=>{F("hosts",`Failed to remove temporary file: ${A}`,$)})}}async function sY(w,$){let Y=w.filter((X)=>!Q5(X)),A=w.filter((X)=>Q5(X));if(A.length>0)F("hosts",`Skipping /etc/hosts for loopback dev names: ${A.join(", ")}`,$);if(Y.length===0)return;F("hosts",`Adding hosts: ${Y.join(", ")}`,$),F("hosts",`Using hosts file at: ${W$}`,$);try{let X;try{X=await lW($)}catch(B){throw console.log(" Could not read hosts file — skipping hosts setup"),F("hosts",`sudo read also failed: ${B}`,$),Error(`Cannot read hosts file: ${B}`)}let J=X.split(`
288
+ `),U=Y.filter((B)=>!J.some((j)=>z5(j,B)));if(U.length===0){F("hosts","All hosts already exist in hosts file",$);return}let W=a$.pid,Q=U.map((B)=>`
289
+ 127.0.0.1 ${B} ${W5}:pid=${W}
290
+ ::1 ${B} ${W5}:pid=${W}`).join(`
291
+ `);try{await nW(X+Q,$),console.log(` Hosts updated: ${U.join(", ")}`)}catch(B){console.log(" Could not update hosts file automatically"),console.log(" Add these entries to /etc/hosts:"),U.forEach((j)=>{console.log(` 127.0.0.1 ${j}`),console.log(` ::1 ${j}`)}),console.log(` Or run: sudo nano ${W$}`)}}catch(X){F("hosts",`Failed to manage hosts file: ${X.message}`,$)}}async function G5(w,$){F("hosts",`Removing hosts: ${w.join(", ")}`,$);try{let Y;try{Y=await lW($)}catch(J){throw F("hosts",`sudo read also failed: ${J}`,$),Error(`Cannot read hosts file: ${J}`)}let{content:A,removed:X}=PR(Y,w);if(X.length===0){F("hosts","No matching rpx-managed hosts found to remove",$);return}try{await nW(A,$),F("hosts",`Hosts removed successfully: ${X.join(", ")}`,$)}catch(J){F("hosts","Could not clean up hosts file automatically",$)}}catch(Y){F("hosts",`Failed to clean up hosts file: ${Y.message}`,$)}}async function oY(w,$){F("hosts",`Checking hosts: ${w}`,$);let Y;try{Y=await g8.promises.readFile(W$,"utf-8")}catch(X){F("hosts",`Error reading hosts file: ${X}`,$);try{let J=I$(),U;if(J)U=`echo '${J}' | sudo -S cat "${W$}" 2>/dev/null`;else U=`sudo -n cat "${W$}" 2>/dev/null || cat "${W$}" 2>/dev/null || echo ""`;let{stdout:W}=await aY(U);Y=W}catch(J){return F("hosts",`Cannot read hosts file, assuming entries don't exist: ${J}`,$),w.map(()=>!1)}}let A=Y.split(`
292
+ `);return w.map((X)=>A.some((J)=>z5(J,X)))}async function XY(w={}){let $=w.isAlive??b0,Y;try{Y=await lW(w.verbose)}catch(U){return F("hosts",`stale hosts GC: cannot read hosts file: ${U}`,w.verbose),[]}let{content:A,removed:X,stalePids:J}=bR(Y,$);if(X.length===0)return[];try{return await nW(A,w.verbose),F("hosts",`stale hosts GC: removed ${X.join(", ")} (dead pid(s): ${J.join(", ")})`,w.verbose),[...new Set(X)]}catch(U){return F("hosts",`stale hosts GC: write failed: ${U}`,w.verbose),[]}}var aY,W$,W5="# rpx",xR="# Added by rpx",d8,dW=!1;var n8=t(()=>{t$();X0();aY=DR(kR);W$=a$.platform==="win32"?B5.join(a$.env.windir||"C:\\Windows","System32","drivers","etc","hosts"):"/etc/hosts",d8=new Set(["127.0.0.1","::1"])});import{spawn as uR}from"node:child_process";import*as B$ from"node:fs/promises";import{homedir as cR}from"node:os";import*as eY from"node:path";import*as y0 from"node:process";function j$(){return eY.join(cR(),".stacks","rpx")}function F5(w=j$()){return eY.join(w,"daemon.pid")}async function K5(w=j$()){try{let $=await B$.readFile(F5(w),"utf8"),Y=Number.parseInt($.trim(),10);if(!Number.isFinite(Y)||Y<=0)return null;return Y}catch($){if($.code==="ENOENT")return null;throw $}}async function vR(w=j$()){await B$.unlink(F5(w)).catch(()=>{})}function iR(){let w=y0.execPath,$=eY.basename(w).toLowerCase();if(($==="bun"||$==="node"||$.startsWith("bun-"))&&y0.argv[1])return[w,y0.argv[1],"daemon:start"];return[w,"daemon:start"]}async function q5(w={}){let $=w.rpxDir??j$(),Y=w.verbose??!1;await z$({rpxDir:$,verbose:Y}).catch((j)=>{F("daemon",`DNS reconcile before ensureDaemonRunning: ${j}`,Y)});let A=await K5($);if(A!==null&&b0(A))return F("daemon",`ensureDaemonRunning: already running pid=${A}`,Y),{pid:A,spawned:!1};if(A!==null)F("daemon",`ensureDaemonRunning: clearing stale pid=${A}`,Y),await vR($);await B$.mkdir($,{recursive:!0});let X=w.spawnCommand??iR();if(X.length===0)throw Error("ensureDaemonRunning: spawnCommand is empty");F("daemon",`spawning daemon: ${X.join(" ")}`,Y);let J=uR(X[0],X.slice(1),{detached:!0,stdio:"ignore",cwd:w.spawnCwd??y0.cwd(),env:w.spawnEnv?{...y0.env,...w.spawnEnv}:y0.env});J.unref();let U=null;J.once("error",(j)=>{U=j});let W=w.startupTimeoutMs??5000,Q=w.pollIntervalMs??50,B=Date.now()+W;while(Date.now()<B){if(U)throw U;let j=await K5($);if(j!==null&&b0(j))return F("daemon",`daemon registered with pid=${j}`,Y),{pid:j,spawned:!0};await new Promise((z)=>setTimeout(z,Q))}if(U)throw U;throw Error(`rpx daemon failed to start within ${W}ms (rpxDir=${$})`)}var pW=t(()=>{lw();L8();k8();h8();dY();x8();P8();xW();iW();mY();cY();t$();n8();JY();X0()});import*as h$ from"node:fs/promises";import{homedir as mR}from"node:os";import*as rW from"node:path";function E5(){return rW.join(mR(),".stacks","rpx")}function tW(w=E5()){return rW.join(w,gR)}async function r8(w=E5()){try{let $=await h$.readFile(tW(w),"utf8"),Y=JSON.parse($);if(Y.version!==p8||!Array.isArray(Y.resolvers))return null;return{version:p8,resolvers:Y.resolvers.filter((A)=>typeof A==="string"),domains:Array.isArray(Y.domains)?Y.domains.filter((A)=>typeof A==="string"):[],ownerPid:typeof Y.ownerPid==="number"?Y.ownerPid:null,updatedAt:typeof Y.updatedAt==="string"?Y.updatedAt:""}}catch($){if($.code==="ENOENT")return null;throw $}}async function f5(w,$){await h$.mkdir(w,{recursive:!0}),await h$.writeFile(tW(w),`${JSON.stringify($,null,2)}
293
+ `,"utf8")}async function aW(w){await h$.rm(tW(w),{force:!0})}function T5(w){let $=w.trim().toLowerCase().replace(/\.$/,"");if(!$||$.includes("127.0.0.1"))return null;if($==="localhost"||$.endsWith(".localhost"))return null;if(/^\d{1,3}(\.\d{1,3}){3}$/.test($))return null;if(!/^[a-z0-9.-]+$/.test($))return null;return $}function dR(w){let $=T5(w);if(!$)return null;let Y=$.split(".");if(Y.length<2)return null;return Y.slice(-2).join(".")}function sW(w){let $=new Set;for(let Y of w){let A=dR(Y);if(A)$.add(A)}return Array.from($).sort()}function oW(w){let $=new Set;for(let Y of w){let A=T5(Y);if(A)$.add(A)}return Array.from($).sort()}var p8=1,gR="dns-state.json",N5;var H5=t(()=>{N5=["com","test","dev","app","page","local","localhost","example","invalid"]});var a8={};fB(a8,{tearDownDevelopmentDns:()=>k$,syncDevelopmentDnsFromRegistry:()=>s$,stopDnsServer:()=>eW,startDnsServer:()=>L5,setupResolver:()=>wM,setupDevelopmentDns:()=>AB,resolverFilePath:()=>UY,removeResolver:()=>YM,removeLegacyTldResolvers:()=>YB,reconcileStaleDevelopmentDns:()=>z$,isRpxDevelopmentDnsAnswering:()=>_5,isDnsServerRunning:()=>rR,contentLooksLikeRpxResolver:()=>S5,RPX_RESOLVER_MARKER:()=>V5,DNS_PORT:()=>$A});import R5 from"node:dgram";import*as M5 from"node:fs/promises";import*as I5 from"node:path";import*as G$ from"node:process";function y5(w){return{id:w.readUInt16BE(0),flags:w.readUInt16BE(2),qdcount:w.readUInt16BE(4),ancount:w.readUInt16BE(6),nscount:w.readUInt16BE(8),arcount:w.readUInt16BE(10)}}function O5(w,$,Y=0){let A=[],X=$,J=0;while(!0){if(X>=w.length||++J>128)break;let U=w[X];if(U===0){X++;break}if((U&192)===192){if(X+1>=w.length||Y>=10)break;let W=w.readUInt16BE(X)&16383,{name:Q}=O5(w,W,Y+1);if(Q)A.push(Q);X+=2;break}if(X++,X+U>w.length)break;A.push(w.subarray(X,X+U).toString("ascii")),X+=U}return{name:A.join("."),newOffset:X}}function lR(w,$){let{name:Y,newOffset:A}=O5(w,$),X=w.readUInt16BE(A),J=w.readUInt16BE(A+2);return{question:{name:Y,type:X,class:J},newOffset:A+4}}function wA(w){let $=w.split("."),Y=[];for(let A of $)Y.push(Buffer.from([A.length])),Y.push(Buffer.from(A,"ascii"));return Y.push(Buffer.from([0])),Buffer.concat(Y)}function nR(w,$,Y){let A=[],X=Buffer.alloc(12);X.writeUInt16BE(w,0),X.writeUInt16BE(33152,2),X.writeUInt16BE(1,4),X.writeUInt16BE(1,6),X.writeUInt16BE(0,8),X.writeUInt16BE(0,10),A.push(X),A.push(wA($.name));let J=Buffer.alloc(4);J.writeUInt16BE($.type,0),J.writeUInt16BE($.class,2),A.push(J),A.push(wA($.name));let U=Buffer.alloc(10);if(U.writeUInt16BE($.type,0),U.writeUInt16BE(1,2),U.writeUInt32BE(300,4),$.type===1){U.writeUInt16BE(4,8),A.push(U);let W=Y.split(".").map((Q)=>Number.parseInt(Q,10));A.push(Buffer.from(W))}else if($.type===28)U.writeUInt16BE(16,8),A.push(U),A.push(Buffer.from([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]));else return X.writeUInt16BE(33155,2),X.writeUInt16BE(0,6),Buffer.concat([X,wA($.name),J]);return Buffer.concat(A)}function pR(w,$){let Y=[],A=Buffer.alloc(12);A.writeUInt16BE(w,0),A.writeUInt16BE(33155,2),A.writeUInt16BE(1,4),A.writeUInt16BE(0,6),A.writeUInt16BE(0,8),A.writeUInt16BE(0,10),Y.push(A),Y.push(wA($.name));let X=Buffer.alloc(4);return X.writeUInt16BE($.type,0),X.writeUInt16BE($.class,2),Y.push(X),Buffer.concat(Y)}async function L5(w,$){if(G$.platform!=="darwin")return!1;let Y=oW(w);if(Y.length===0)return!1;if(t0){for(let A of Y)t8.add(A);return F("dns","DNS server already running — merged domains",$),!0}return t8=new Set(Y),new Promise((A)=>{t0=R5.createSocket("udp4"),t0.on("error",(X)=>{F("dns",`DNS server error: ${X.message}`,$),t0?.close(),t0=null,A(!1)}),t0.on("message",(X,J)=>{try{let U=y5(X),{question:W}=lR(X,12);F("dns",`Query for ${W.name} type ${W.type} from ${J.address}`,$);let Q=W.name.toLowerCase(),B=!1;for(let z of t8)if(Q===z||Q.endsWith(`.${z}`)){B=!0;break}let j;if(B&&(W.type===1||W.type===28))j=nR(U.id,W,"127.0.0.1"),F("dns",`Responding with localhost for ${W.name}`,$);else j=pR(U.id,W),F("dns",`NXDOMAIN for ${W.name}`,$);t0?.send(j,J.port,J.address)}catch(U){F("dns",`Error processing DNS query: ${U}`,$)}}),t0.on("listening",()=>{let X=t0?.address();F("dns",`DNS server listening on ${X?.address}:${X?.port}`,$),A(!0)});try{t0.bind($A,"127.0.0.1")}catch(X){F("dns",`Failed to bind DNS server: ${X}`,$),A(!1)}})}function eW(w){if(t0)F("dns","Stopping DNS server",w),t0.close(),t0=null,t8=new Set}function rR(){return t0!==null}async function _5(w,$=500){let Y=w.trim().toLowerCase().replace(/\.$/,"");if(!Y)return!1;return new Promise((A)=>{let X=R5.createSocket("udp4"),J=setTimeout(()=>{X.close(),A(!1)},$);X.on("message",(W)=>{clearTimeout(J),X.close();try{let Q=y5(W);A(Q.ancount>0)}catch{A(!1)}}),X.on("error",()=>{clearTimeout(J),X.close(),A(!1)});let U=tR(Y,1);X.send(U,$A,"127.0.0.1",(W)=>{if(W)clearTimeout(J),X.close(),A(!1)})})}function tR(w,$){let Y=Buffer.alloc(12);Y.writeUInt16BE(1,0),Y.writeUInt16BE(256,2),Y.writeUInt16BE(1,4);let A=Buffer.concat([wA(w),Buffer.from([0,$,0,1])]);return Buffer.concat([Y,A])}function aR(){return`${V5}
294
294
  nameserver 127.0.0.1
295
- port ${eY}
296
- `}function JY(w){return M5.join(V5,w)}function _5(w){return w.includes("127.0.0.1")&&w.includes(String(eY))}async function tR(w){try{return await R5.readFile(JY(w),"utf8")}catch($){if($.code==="ENOENT")return null;throw $}}async function eW(w){if(G$.platform!=="darwin")return;let{execSudoSync:$,getSudoPassword:Y,isProcessElevated:A}=await Promise.resolve().then(() => (X0(),g1));if(!A()&&!Y()){F("dns","Cannot flush DNS cache without SUDO_PASSWORD",w);return}try{$("dscacheutil -flushcache"),$("killall -HUP mDNSResponder 2>/dev/null || true"),F("dns","DNS cache flushed",w)}catch(X){F("dns",`Could not flush DNS cache: ${X}`,w)}}function S5(w){if(!/^[a-z0-9.-]+$/.test(w))throw Error(`refusing unsafe resolver basename: ${JSON.stringify(w)}`)}async function aR(w,$){S5(w);let{execSudoSync:Y}=await Promise.resolve().then(() => (X0(),g1)),A=rR().replace(/\n/g,"\\n"),X=`bash -c 'mkdir -p ${V5} && printf "%b" "${A}" > ${JY(w)}'`;Y(X),F("dns",`Created ${JY(w)}`,$)}async function sR(w,$){S5(w);let{execSudoSync:Y}=await Promise.resolve().then(() => (X0(),g1));Y(`rm -f ${JY(w)}`),F("dns",`Removed ${JY(w)}`,$)}async function oR(w,$){return YB({domains:$??[],verbose:w})}async function eR(w,$){if(G$.platform!=="darwin")return!0;let{getSudoPassword:Y,isProcessElevated:A}=await Promise.resolve().then(() => (X0(),g1));if(!A()&&!Y())return F("dns","SUDO_PASSWORD not set, cannot create resolver files",$),!1;try{for(let X of w)await aR(X,$);return await eW($),!0}catch(X){return F("dns",`Failed to create resolver file: ${X}`,$),!1}}async function wB(w,$){if(G$.platform!=="darwin")return;let{getSudoPassword:Y,isProcessElevated:A}=await Promise.resolve().then(() => (X0(),g1));if(!A()&&!Y())return;try{for(let X of w)await sR(X,$);await eW($)}catch(X){F("dns",`Failed to remove resolver files: ${X}`,$)}}async function $B(w){if(G$.platform!=="darwin")return[];let $=[];for(let Y of q5){let A=await tR(Y);if(A&&_5(A))await wB([Y],w),$.push(Y)}return $}async function YB(w){let $=w.rpxDir??j$(),Y=sW(w.domains);if(Y.length===0)return!1;let A=aW(Y),X=await O5(Y,w.verbose);if(!X){let W=Y[0];if(W&&await L5(W))X=!0;else F("dns","Dev DNS server not available on 127.0.0.1:15353",w.verbose)}if(!X)return!1;if(!await eR(A,w.verbose))return!1;let U={version:l8,resolvers:A,domains:Y,ownerPid:w.ownerPid??G$.pid,updatedAt:new Date().toISOString()};return await E5($,U),!0}async function a$(w,$={}){let Y=w.map((Q)=>Q.to).filter(Boolean),A=$.rpxDir??j$(),X=aW(Y),W=((await n8(A))?.resolvers??[]).filter((Q)=>!X.includes(Q));if(W.length>0)await wB(W,$.verbose);if(X.length===0){oW($.verbose),await tW(A);return}await YB({domains:Y,rpxDir:A,verbose:$.verbose,ownerPid:$.ownerPid??G$.pid})}async function S$(w={}){let $=w.rpxDir??j$();oW(w.verbose);let A=(await n8($))?.resolvers??[];await wB(A,w.verbose),await $B(w.verbose),await tW($)}async function wM(w){await S$({verbose:w})}async function z$(w={}){let $=w.rpxDir??j$(),Y=await n8($),A=Y?.ownerPid!=null&&b0(Y.ownerPid);if(Y&&!A){F("dns",`reconcile: owner pid ${Y.ownerPid} is gone — tearing down DNS`,w.verbose),await S$(w);return}let X=await $B(w.verbose);if(X.length>0)F("dns",`reconcile: removed legacy TLD resolvers: ${X.join(", ")}`,w.verbose);await eW(w.verbose)}var eY=15353,I5="# managed-by: rpx",V5="/etc/resolver",t0=null,p8;var XY=t(()=>{nW();f5();r$();X0();p8=new Set});import{dirname as OM,join as LM}from"path";import*as P0 from"process";import{fileURLToPath as _M}from"url";import{existsSync as q6}from"node:fs";import FJ from"node:fs/promises";import TB from"node:os";import qJ from"node:path";import x$ from"node:process";import{EventEmitter as N6}from"node:events";import K$ from"node:process";import fB from"node:process";import fJ from"node:process";import XA from"node:process";import GY from"node:process";import MB from"node:tty";import AK,{stdin as tM,stdout as aM}from"node:process";import VB,{stdin as UK,stdout as QK}from"node:process";import WK from"node:readline";class yB{configPath;config=null;events=[];retryCount=0;maxRetries=3;retryDelayMs=1000;constructor(){let w=TB.homedir(),$=qJ.join(w,".config","clapp");this.configPath=qJ.join($,"telemetry.json")}async isEnabled(){if(x$.env.DO_NOT_TRACK==="1"||x$.env.DO_NOT_TRACK==="true")return!1;if(x$.env.NO_TELEMETRY==="1"||x$.env.NO_TELEMETRY==="true")return!1;return(await this.loadConfig()).enabled}async enable(){let w=await this.loadConfig();if(w.enabled=!0,!w.userId)w.userId=this.generateUserId();await this.saveConfig(w)}async disable(){let w=await this.loadConfig();w.enabled=!1,await this.saveConfig(w)}async track(w,$){if(!await this.isEnabled())return;let A={event:w,...$,timestamp:Date.now(),platform:TB.platform(),nodeVersion:x$.version};if(this.events.push(A),this.events.length>=10)await this.send()}async trackCommand(w,$){await this.track("command",{command:w,duration:$})}async trackError(w,$){await this.track("error",{error:w,command:$})}async send(){if(!await this.isEnabled()||this.events.length===0)return!0;try{this.events=[],this.retryCount=0;let $=await this.loadConfig();return $.lastSent=Date.now(),await this.saveConfig($),!0}catch{if(this.retryCount<this.maxRetries){this.retryCount++;let $=this.retryDelayMs*2**(this.retryCount-1);return await this.sleep($),this.send()}return this.events=[],this.retryCount=0,!1}}async flush(){if(this.events.length===0)return!0;return this.send()}sleep(w){return new Promise(($)=>setTimeout($,w))}async status(){let w=await this.loadConfig();return{enabled:w.enabled,doNotTrack:x$.env.DO_NOT_TRACK==="1"||x$.env.DO_NOT_TRACK==="true",eventsQueued:this.events.length,lastSent:w.lastSent}}async loadConfig(){if(this.config)return this.config;try{if(q6(this.configPath)){let w=await FJ.readFile(this.configPath,"utf-8");return this.config=JSON.parse(w),this.config}}catch{}return this.config={enabled:!1},this.config}async saveConfig(w){this.config=w;try{let $=qJ.dirname(this.configPath);await FJ.mkdir($,{recursive:!0}),await FJ.writeFile(this.configPath,JSON.stringify(w,null,2),"utf-8")}catch{}}generateUserId(){let w=Math.random().toString(36).substring(2,15),$=Date.now().toString(36);return`${w}-${$}`}}var bM=new yB;function E6(w,$={}){let Y={_:[]},A=$.alias||{},X=new Set($.boolean||[]),J={};for(let W of Object.keys(A))for(let Q of A[W])J[Q]=W;for(let W of X)if(A[W])for(let Q of A[W])X.add(Q);function U(W,Q){let B=J[W]||W;if(Y[B]=Q,A[B])for(let j of A[B])Y[j]=Q;if(J[W]&&A[J[W]])for(let j of A[J[W]])Y[j]=Q;Y[W]=Q}for(let W=0;W<w.length;W++){let Q=w[W];if(Q==="--"){Y._.push(...w.slice(W+1));break}if(Q.startsWith("--")){let B=Q.indexOf("=");if(B!==-1){let j=Q.slice(2,B),z=Q.slice(B+1);U(j,z)}else{let j=Q.slice(2);if(j.startsWith("no-")){let G=j.slice(3);U(G,!1);continue}let z=J[j]||j;if(X.has(z)||X.has(j))U(j,!0);else{let G=w[W+1];if(G!==void 0&&!G.startsWith("-"))U(j,G),W++;else U(j,!0)}}}else if(Q.startsWith("-")&&Q.length>1){let B=Q.slice(1);for(let j=0;j<B.length;j++){let z=B[j],G=J[z]||z;if(j===B.length-1&&!X.has(G)&&!X.has(z)){let K=w[W+1];if(K!==void 0&&!K.startsWith("-"))U(z,K),W++;else U(z,!0)}else U(z,!0)}}else Y._.push(Q)}return Y}function TJ(w){return w.replace(/[<[].+/,"").trim()}function T6(w){let $=/<([^>]+)>/g,Y=/\[([^\]]+)\]/g,A=[],X=(W)=>{let Q=!1,B=W[1];if(B.startsWith("..."))B=B.slice(3),Q=!0;return{required:W[0].startsWith("<"),value:B,variadic:Q}},J;while(J=$.exec(w))A.push(X(J));let U;while(U=Y.exec(w))A.push(X(U));return A}function f6(w){let $={alias:{},boolean:[]};for(let[Y,A]of w.entries()){if(A.names.length>1)$.alias[A.names[0]]=A.names.slice(1);if(A.isBoolean)if(A.negated){if(!w.some((J,U)=>{return U!==Y&&J.names.some((W)=>A.names.includes(W))&&typeof J.required==="boolean"}))$.boolean.push(A.names[0])}else $.boolean.push(A.names[0])}return $}function HB(w){return w.reduce(($,Y)=>$.length>=Y.length?$:Y,"")}function NJ(w,$){return w.length>=$?w:`${w}${" ".repeat($-w.length)}`}function H6(w){return w.replace(/([a-z])-([a-z])/g,($,Y,A)=>{return Y+A.toUpperCase()})}function R6(w,$,Y){let A=0,X=$.length,J=w,U;for(;A<X;++A)U=J[$[A]],J=J[$[A]]=A===X-1?Y:U!=null?U:!!~$[A+1].indexOf(".")||!(+$[A+1]>-1)?{}:[]}function M6(w,$){for(let Y of Object.keys($)){let A=$[Y];if(A.shouldTransform){if(w[Y]=Array.prototype.concat.call([],w[Y]),typeof A.transformFunction==="function")w[Y]=w[Y].map(A.transformFunction)}}}function I6(w){let $=/([^\\/]+)$/.exec(w);return $?$[1]:""}function OB(w){return w.split(".").map(($,Y)=>{return Y===0?H6($):$}).join(".")}class AA extends Error{exitCode=2;isUsageError=!0;constructor(w){super(w);if(this.name=this.constructor.name,typeof Error.captureStackTrace==="function")Error.captureStackTrace(this,this.constructor);else this.stack=Error(w).stack}format(w=!1){if(w&&this.stack)return`${this.message}
295
+ port ${$A}
296
+ `}function UY(w){return I5.join(C5,w)}function S5(w){return w.includes("127.0.0.1")&&w.includes(String($A))}async function sR(w){try{return await M5.readFile(UY(w),"utf8")}catch($){if($.code==="ENOENT")return null;throw $}}async function wB(w){if(G$.platform!=="darwin")return;let{execSudoSync:$,getSudoPassword:Y,isProcessElevated:A}=await Promise.resolve().then(() => (X0(),d1));if(!A()&&!Y()){F("dns","Cannot flush DNS cache without SUDO_PASSWORD",w);return}try{$("dscacheutil -flushcache"),$("killall -HUP mDNSResponder 2>/dev/null || true"),F("dns","DNS cache flushed",w)}catch(X){F("dns",`Could not flush DNS cache: ${X}`,w)}}function Z5(w){if(!/^[a-z0-9.-]+$/.test(w))throw Error(`refusing unsafe resolver basename: ${JSON.stringify(w)}`)}async function oR(w,$){Z5(w);let{execSudoSync:Y}=await Promise.resolve().then(() => (X0(),d1)),A=aR().replace(/\n/g,"\\n"),X=`bash -c 'mkdir -p ${C5} && printf "%b" "${A}" > ${UY(w)}'`;Y(X),F("dns",`Created ${UY(w)}`,$)}async function eR(w,$){Z5(w);let{execSudoSync:Y}=await Promise.resolve().then(() => (X0(),d1));Y(`rm -f ${UY(w)}`),F("dns",`Removed ${UY(w)}`,$)}async function wM(w,$){return AB({domains:$??[],verbose:w})}async function $M(w,$){if(G$.platform!=="darwin")return!0;let{getSudoPassword:Y,isProcessElevated:A}=await Promise.resolve().then(() => (X0(),d1));if(!A()&&!Y())return F("dns","SUDO_PASSWORD not set, cannot create resolver files",$),!1;try{for(let X of w)await oR(X,$);return await wB($),!0}catch(X){return F("dns",`Failed to create resolver file: ${X}`,$),!1}}async function $B(w,$){if(G$.platform!=="darwin")return;let{getSudoPassword:Y,isProcessElevated:A}=await Promise.resolve().then(() => (X0(),d1));if(!A()&&!Y())return;try{for(let X of w)await eR(X,$);await wB($)}catch(X){F("dns",`Failed to remove resolver files: ${X}`,$)}}async function YB(w){if(G$.platform!=="darwin")return[];let $=[];for(let Y of N5){let A=await sR(Y);if(A&&S5(A))await $B([Y],w),$.push(Y)}return $}async function AB(w){let $=w.rpxDir??j$(),Y=oW(w.domains);if(Y.length===0)return!1;let A=sW(Y),X=await L5(Y,w.verbose);if(!X){let W=Y[0];if(W&&await _5(W))X=!0;else F("dns","Dev DNS server not available on 127.0.0.1:15353",w.verbose)}if(!X)return!1;if(!await $M(A,w.verbose))return!1;let U={version:p8,resolvers:A,domains:Y,ownerPid:w.ownerPid??G$.pid,updatedAt:new Date().toISOString()};return await f5($,U),!0}async function s$(w,$={}){let Y=w.map((Q)=>Q.to).filter(Boolean),A=$.rpxDir??j$(),X=sW(Y),W=((await r8(A))?.resolvers??[]).filter((Q)=>!X.includes(Q));if(W.length>0)await $B(W,$.verbose);if(X.length===0){eW($.verbose),await aW(A);return}await AB({domains:Y,rpxDir:A,verbose:$.verbose,ownerPid:$.ownerPid??G$.pid})}async function k$(w={}){let $=w.rpxDir??j$();eW(w.verbose);let A=(await r8($))?.resolvers??[];await $B(A,w.verbose),await YB(w.verbose),await aW($)}async function YM(w){await k$({verbose:w})}async function z$(w={}){let $=w.rpxDir??j$(),Y=await r8($),A=Y?.ownerPid!=null&&b0(Y.ownerPid);if(Y&&!A){F("dns",`reconcile: owner pid ${Y.ownerPid} is gone — tearing down DNS`,w.verbose),await k$(w);return}let X=await YB(w.verbose);if(X.length>0)F("dns",`reconcile: removed legacy TLD resolvers: ${X.join(", ")}`,w.verbose);await wB(w.verbose)}var $A=15353,V5="# managed-by: rpx",C5="/etc/resolver",t0=null,t8;var JY=t(()=>{pW();H5();t$();X0();t8=new Set});import{dirname as _M,join as SM}from"path";import*as P0 from"process";import{fileURLToPath as ZM}from"url";import{existsSync as N6}from"node:fs";import NJ from"node:fs/promises";import TB from"node:os";import EJ from"node:path";import b$ from"node:process";import{EventEmitter as E6}from"node:events";import K$ from"node:process";import HB from"node:process";import RJ from"node:process";import UA from"node:process";import KY from"node:process";import IB from"node:tty";import XK,{stdin as sM,stdout as oM}from"node:process";import CB,{stdin as QK,stdout as WK}from"node:process";import BK from"node:readline";class OB{configPath;config=null;events=[];retryCount=0;maxRetries=3;retryDelayMs=1000;constructor(){let w=TB.homedir(),$=EJ.join(w,".config","clapp");this.configPath=EJ.join($,"telemetry.json")}async isEnabled(){if(b$.env.DO_NOT_TRACK==="1"||b$.env.DO_NOT_TRACK==="true")return!1;if(b$.env.NO_TELEMETRY==="1"||b$.env.NO_TELEMETRY==="true")return!1;return(await this.loadConfig()).enabled}async enable(){let w=await this.loadConfig();if(w.enabled=!0,!w.userId)w.userId=this.generateUserId();await this.saveConfig(w)}async disable(){let w=await this.loadConfig();w.enabled=!1,await this.saveConfig(w)}async track(w,$){if(!await this.isEnabled())return;let A={event:w,...$,timestamp:Date.now(),platform:TB.platform(),nodeVersion:b$.version};if(this.events.push(A),this.events.length>=10)await this.send()}async trackCommand(w,$){await this.track("command",{command:w,duration:$})}async trackError(w,$){await this.track("error",{error:w,command:$})}async send(){if(!await this.isEnabled()||this.events.length===0)return!0;try{this.events=[],this.retryCount=0;let $=await this.loadConfig();return $.lastSent=Date.now(),await this.saveConfig($),!0}catch{if(this.retryCount<this.maxRetries){this.retryCount++;let $=this.retryDelayMs*2**(this.retryCount-1);return await this.sleep($),this.send()}return this.events=[],this.retryCount=0,!1}}async flush(){if(this.events.length===0)return!0;return this.send()}sleep(w){return new Promise(($)=>setTimeout($,w))}async status(){let w=await this.loadConfig();return{enabled:w.enabled,doNotTrack:b$.env.DO_NOT_TRACK==="1"||b$.env.DO_NOT_TRACK==="true",eventsQueued:this.events.length,lastSent:w.lastSent}}async loadConfig(){if(this.config)return this.config;try{if(N6(this.configPath)){let w=await NJ.readFile(this.configPath,"utf-8");return this.config=JSON.parse(w),this.config}}catch{}return this.config={enabled:!1},this.config}async saveConfig(w){this.config=w;try{let $=EJ.dirname(this.configPath);await NJ.mkdir($,{recursive:!0}),await NJ.writeFile(this.configPath,JSON.stringify(w,null,2),"utf-8")}catch{}}generateUserId(){let w=Math.random().toString(36).substring(2,15),$=Date.now().toString(36);return`${w}-${$}`}}var cM=new OB;function f6(w,$={}){let Y={_:[]},A=$.alias||{},X=new Set($.boolean||[]),J={};for(let W of Object.keys(A))for(let Q of A[W])J[Q]=W;for(let W of X)if(A[W])for(let Q of A[W])X.add(Q);function U(W,Q){let B=J[W]||W;if(Y[B]=Q,A[B])for(let j of A[B])Y[j]=Q;if(J[W]&&A[J[W]])for(let j of A[J[W]])Y[j]=Q;Y[W]=Q}for(let W=0;W<w.length;W++){let Q=w[W];if(Q==="--"){Y._.push(...w.slice(W+1));break}if(Q.startsWith("--")){let B=Q.indexOf("=");if(B!==-1){let j=Q.slice(2,B),z=Q.slice(B+1);U(j,z)}else{let j=Q.slice(2);if(j.startsWith("no-")){let G=j.slice(3);U(G,!1);continue}let z=J[j]||j;if(X.has(z)||X.has(j))U(j,!0);else{let G=w[W+1];if(G!==void 0&&!G.startsWith("-"))U(j,G),W++;else U(j,!0)}}}else if(Q.startsWith("-")&&Q.length>1){let B=Q.slice(1);for(let j=0;j<B.length;j++){let z=B[j],G=J[z]||z;if(j===B.length-1&&!X.has(G)&&!X.has(z)){let K=w[W+1];if(K!==void 0&&!K.startsWith("-"))U(z,K),W++;else U(z,!0)}else U(z,!0)}}else Y._.push(Q)}return Y}function HJ(w){return w.replace(/[<[].+/,"").trim()}function T6(w){let $=/<([^>]+)>/g,Y=/\[([^\]]+)\]/g,A=[],X=(W)=>{let Q=!1,B=W[1];if(B.startsWith("..."))B=B.slice(3),Q=!0;return{required:W[0].startsWith("<"),value:B,variadic:Q}},J;while(J=$.exec(w))A.push(X(J));let U;while(U=Y.exec(w))A.push(X(U));return A}function H6(w){let $={alias:{},boolean:[]};for(let[Y,A]of w.entries()){if(A.names.length>1)$.alias[A.names[0]]=A.names.slice(1);if(A.isBoolean)if(A.negated){if(!w.some((J,U)=>{return U!==Y&&J.names.some((W)=>A.names.includes(W))&&typeof J.required==="boolean"}))$.boolean.push(A.names[0])}else $.boolean.push(A.names[0])}return $}function RB(w){return w.reduce(($,Y)=>$.length>=Y.length?$:Y,"")}function fJ(w,$){return w.length>=$?w:`${w}${" ".repeat($-w.length)}`}function R6(w){return w.replace(/([a-z])-([a-z])/g,($,Y,A)=>{return Y+A.toUpperCase()})}function M6(w,$,Y){let A=0,X=$.length,J=w,U;for(;A<X;++A)U=J[$[A]],J=J[$[A]]=A===X-1?Y:U!=null?U:!!~$[A+1].indexOf(".")||!(+$[A+1]>-1)?{}:[]}function I6(w,$){for(let Y of Object.keys($)){let A=$[Y];if(A.shouldTransform){if(w[Y]=Array.prototype.concat.call([],w[Y]),typeof A.transformFunction==="function")w[Y]=w[Y].map(A.transformFunction)}}}function V6(w){let $=/([^\\/]+)$/.exec(w);return $?$[1]:""}function LB(w){return w.split(".").map(($,Y)=>{return Y===0?R6($):$}).join(".")}class JA extends Error{exitCode=2;isUsageError=!0;constructor(w){super(w);if(this.name=this.constructor.name,typeof Error.captureStackTrace==="function")Error.captureStackTrace(this,this.constructor);else this.stack=Error(w).stack}format(w=!1){if(w&&this.stack)return`${this.message}
297
297
 
298
298
  Stack trace:
299
- ${this.stack}`;return this.message}}function V6(){let{env:w}=fB,{TERM:$,TERM_PROGRAM:Y}=w;if(fB.platform!=="win32")return $!=="linux";return Boolean(w.WT_SESSION)||Boolean(w.TERMINUS_SUBLIME)||w.ConEmuTask==="{cmd::Cmder}"||Y==="Terminus-Sublime"||Y==="vscode"||$==="xterm-256color"||$==="alacritty"||$==="rxvt-unicode"||$==="rxvt-unicode-256color"||w.TERMINAL_EMULATOR==="JetBrains-JediTerm"}var QA="\x1B",j0=`${QA}[`;var uw={to(w,$){if(!$)return`${j0}${w+1}G`;return`${j0}${$+1};${w+1}H`},move(w,$){let Y="";if(w<0)Y+=`${j0}${-w}D`;else if(w>0)Y+=`${j0}${w}C`;if($<0)Y+=`${j0}${-$}A`;else if($>0)Y+=`${j0}${$}B`;return Y},up:(w=1)=>`${j0}${w}A`,down:(w=1)=>`${j0}${w}B`,forward:(w=1)=>`${j0}${w}C`,backward:(w=1)=>`${j0}${w}D`,nextLine:(w=1)=>`${j0}E`.repeat(w),prevLine:(w=1)=>`${j0}F`.repeat(w),left:`${j0}G`,hide:`${j0}?25l`,show:`${j0}?25h`,save:`${QA}7`,restore:`${QA}8`};var EJ={screen:`${j0}2J`,up:(w=1)=>`${j0}1J`.repeat(w),down:(w=1)=>`${j0}J`.repeat(w),line:`${j0}2K`,lineEnd:`${j0}K`,lineStart:`${j0}1K`,lines(w){let $="";for(let Y=0;Y<w;Y++)$+=this.line+(Y<w-1?uw.up():"");if(w)$+=uw.left;return $}},iM={screen:`${QA}c`};function C6(w,$){let Y=[];for(let A=0;A<=$.length;A++)Y[A]=[A];for(let A=0;A<=w.length;A++)Y[0][A]=A;for(let A=1;A<=$.length;A++)for(let X=1;X<=w.length;X++)if($.charAt(A-1)===w.charAt(X-1))Y[A][X]=Y[A-1][X-1];else Y[A][X]=Math.min(Y[A-1][X-1]+1,Y[A][X-1]+1,Y[A-1][X]+1);return Y[$.length][w.length]}function LB(w,$,Y=2,A=3){return $.map((X)=>({cmd:X,distance:C6(w,X)})).filter(({distance:X})=>X<=Y).sort((X,J)=>X.distance-J.distance).slice(0,A).map(({cmd:X})=>X)}class _B{rawName;description;name;names;isBoolean;required;config;negated;constructor(w,$,Y){if(this.rawName=w,this.description=$,this.config=Object.assign({},Y),w=w.replace(/\.\*/g,""),this.negated=!1,this.names=TJ(w).split(",").map((A)=>{let X=A.trim().replace(/^-{1,2}/,"");if(X.startsWith("no-"))this.negated=!0,X=X.replace(/^no-/,"");return OB(X)}).sort((A,X)=>A.length>X.length?1:-1),this.name=this.names[this.names.length-1],this.negated&&this.config.default==null)this.config.default=!0;if(w.includes("<"))this.required=!0;else if(w.includes("["))this.required=!1;else this.isBoolean=!0}}var gM=fJ.argv,y6=`${fJ.platform}-${fJ.arch} bun-v${typeof Bun<"u"?Bun.version:"unknown"}`,RB=XA.argv,O6=`${XA.platform}-${XA.arch} node-${XA.version}`;class HJ{rawName;description;config;cli;options;aliasNames;name;namespace;args;commandAction;usageText;versionNumber;examples;helpCallback;globalCommand;beforeHooks;afterHooks;middleware;constructor(w,$,Y,A){this.rawName=w,this.description=$,this.config=Y,this.cli=A,this.options=[],this.aliasNames=[],this.name=TJ(w);let X=TJ(w),J=X.indexOf(":");if(J>0)this.namespace=X.substring(0,J),this.name=X.substring(J+1);if(this.args=T6(w),this.examples=[],this.beforeHooks=[],this.afterHooks=[],this.middleware=[],!Y)this.config={}}usage(w){return this.usageText=w,this}allowUnknownOptions(){return this.config.allowUnknownOptions=!0,this}ignoreOptionDefaultValue(){return this.config.ignoreOptionDefaultValue=!0,this}version(w,$="-v, --version"){return this.versionNumber=w,this.option($,"Display version number"),this}example(w){return this.examples.push(w),this}option(w,$,Y){let A=new _B(w,$,Y);return this.options.push(A),this}alias(w){return this.aliasNames.push(w),this}action(w){return this.commandAction=w,this}before(w){return this.beforeHooks.push(w),this}after(w){return this.afterHooks.push(w),this}use(w){return this.middleware.push(w),this}isMatched(w){if(this.aliasNames.includes(w))return!0;if(this.namespace)return`${this.namespace}:${this.name}`===w;return this.name===w}get isDefaultCommand(){return this.name===""||this.aliasNames.includes("!")}get isGlobalCommand(){return this instanceof RJ}get displayName(){return this.namespace?`${this.namespace}:${this.name}`:this.name}hasOption(w){return w=w.split(".")[0],!!this.options.find(($)=>{return $.names.includes(w)})}outputHelp(){let{name:w,commands:$}=this.cli,{versionNumber:Y,options:A,helpCallback:X}=this.cli.globalCommand,J=[{body:`${w}${Y?`/${Y}`:""}`}];if(J.push({title:"Usage",body:` $ ${w} ${this.usageText||this.rawName}`}),(this.isGlobalCommand||this.isDefaultCommand)&&$.length>0){let Q=HB($.map((K)=>K.rawName)),B=new Map,j=[];for(let K of $)if(K.namespace){if(!B.has(K.namespace))B.set(K.namespace,[]);B.get(K.namespace).push(K)}else j.push(K);let z="";if(j.length>0)z+=j.map((K)=>{return` ${NJ(K.rawName,Q.length)} ${K.description}`}).join(`
299
+ ${this.stack}`;return this.message}}function C6(){let{env:w}=HB,{TERM:$,TERM_PROGRAM:Y}=w;if(HB.platform!=="win32")return $!=="linux";return Boolean(w.WT_SESSION)||Boolean(w.TERMINUS_SUBLIME)||w.ConEmuTask==="{cmd::Cmder}"||Y==="Terminus-Sublime"||Y==="vscode"||$==="xterm-256color"||$==="alacritty"||$==="rxvt-unicode"||$==="rxvt-unicode-256color"||w.TERMINAL_EMULATOR==="JetBrains-JediTerm"}var BA="\x1B",j0=`${BA}[`;var uw={to(w,$){if(!$)return`${j0}${w+1}G`;return`${j0}${$+1};${w+1}H`},move(w,$){let Y="";if(w<0)Y+=`${j0}${-w}D`;else if(w>0)Y+=`${j0}${w}C`;if($<0)Y+=`${j0}${-$}A`;else if($>0)Y+=`${j0}${$}B`;return Y},up:(w=1)=>`${j0}${w}A`,down:(w=1)=>`${j0}${w}B`,forward:(w=1)=>`${j0}${w}C`,backward:(w=1)=>`${j0}${w}D`,nextLine:(w=1)=>`${j0}E`.repeat(w),prevLine:(w=1)=>`${j0}F`.repeat(w),left:`${j0}G`,hide:`${j0}?25l`,show:`${j0}?25h`,save:`${BA}7`,restore:`${BA}8`};var TJ={screen:`${j0}2J`,up:(w=1)=>`${j0}1J`.repeat(w),down:(w=1)=>`${j0}J`.repeat(w),line:`${j0}2K`,lineEnd:`${j0}K`,lineStart:`${j0}1K`,lines(w){let $="";for(let Y=0;Y<w;Y++)$+=this.line+(Y<w-1?uw.up():"");if(w)$+=uw.left;return $}},gM={screen:`${BA}c`};function y6(w,$){let Y=[];for(let A=0;A<=$.length;A++)Y[A]=[A];for(let A=0;A<=w.length;A++)Y[0][A]=A;for(let A=1;A<=$.length;A++)for(let X=1;X<=w.length;X++)if($.charAt(A-1)===w.charAt(X-1))Y[A][X]=Y[A-1][X-1];else Y[A][X]=Math.min(Y[A-1][X-1]+1,Y[A][X-1]+1,Y[A-1][X]+1);return Y[$.length][w.length]}function _B(w,$,Y=2,A=3){return $.map((X)=>({cmd:X,distance:y6(w,X)})).filter(({distance:X})=>X<=Y).sort((X,J)=>X.distance-J.distance).slice(0,A).map(({cmd:X})=>X)}class SB{rawName;description;name;names;isBoolean;required;config;negated;constructor(w,$,Y){if(this.rawName=w,this.description=$,this.config=Object.assign({},Y),w=w.replace(/\.\*/g,""),this.negated=!1,this.names=HJ(w).split(",").map((A)=>{let X=A.trim().replace(/^-{1,2}/,"");if(X.startsWith("no-"))this.negated=!0,X=X.replace(/^no-/,"");return LB(X)}).sort((A,X)=>A.length>X.length?1:-1),this.name=this.names[this.names.length-1],this.negated&&this.config.default==null)this.config.default=!0;if(w.includes("<"))this.required=!0;else if(w.includes("["))this.required=!1;else this.isBoolean=!0}}var lM=RJ.argv,O6=`${RJ.platform}-${RJ.arch} bun-v${typeof Bun<"u"?Bun.version:"unknown"}`,MB=UA.argv,L6=`${UA.platform}-${UA.arch} node-${UA.version}`;class MJ{rawName;description;config;cli;options;aliasNames;name;namespace;args;commandAction;usageText;versionNumber;examples;helpCallback;globalCommand;beforeHooks;afterHooks;middleware;constructor(w,$,Y,A){this.rawName=w,this.description=$,this.config=Y,this.cli=A,this.options=[],this.aliasNames=[],this.name=HJ(w);let X=HJ(w),J=X.indexOf(":");if(J>0)this.namespace=X.substring(0,J),this.name=X.substring(J+1);if(this.args=T6(w),this.examples=[],this.beforeHooks=[],this.afterHooks=[],this.middleware=[],!Y)this.config={}}usage(w){return this.usageText=w,this}allowUnknownOptions(){return this.config.allowUnknownOptions=!0,this}ignoreOptionDefaultValue(){return this.config.ignoreOptionDefaultValue=!0,this}version(w,$="-v, --version"){return this.versionNumber=w,this.option($,"Display version number"),this}example(w){return this.examples.push(w),this}option(w,$,Y){let A=new SB(w,$,Y);return this.options.push(A),this}alias(w){return this.aliasNames.push(w),this}action(w){return this.commandAction=w,this}before(w){return this.beforeHooks.push(w),this}after(w){return this.afterHooks.push(w),this}use(w){return this.middleware.push(w),this}isMatched(w){if(this.aliasNames.includes(w))return!0;if(this.namespace)return`${this.namespace}:${this.name}`===w;return this.name===w}get isDefaultCommand(){return this.name===""||this.aliasNames.includes("!")}get isGlobalCommand(){return this instanceof IJ}get displayName(){return this.namespace?`${this.namespace}:${this.name}`:this.name}hasOption(w){return w=w.split(".")[0],!!this.options.find(($)=>{return $.names.includes(w)})}outputHelp(){let{name:w,commands:$}=this.cli,{versionNumber:Y,options:A,helpCallback:X}=this.cli.globalCommand,J=[{body:`${w}${Y?`/${Y}`:""}`}];if(J.push({title:"Usage",body:` $ ${w} ${this.usageText||this.rawName}`}),(this.isGlobalCommand||this.isDefaultCommand)&&$.length>0){let Q=RB($.map((K)=>K.rawName)),B=new Map,j=[];for(let K of $)if(K.namespace){if(!B.has(K.namespace))B.set(K.namespace,[]);B.get(K.namespace).push(K)}else j.push(K);let z="";if(j.length>0)z+=j.map((K)=>{return` ${fJ(K.rawName,Q.length)} ${K.description}`}).join(`
300
300
  `);let G=Array.from(B.keys()).sort();for(let K of G){let E=B.get(K);if(z.length>0)z+=`
301
301
 
302
302
  `;z+=` ${K}:
303
- `,z+=E.map((q)=>{return` ${NJ(q.rawName,Q.length-2)} ${q.description}`}).join(`
303
+ `,z+=E.map((q)=>{return` ${fJ(q.rawName,Q.length-2)} ${q.description}`}).join(`
304
304
  `)}J.push({title:"Commands",body:z}),J.push({title:"For more info, run any command with the `--help` flag",body:$.map((K)=>` $ ${w}${K.displayName===""?"":` ${K.displayName}`} --help`).join(`
305
- `)})}let W=this.isGlobalCommand?A:[...this.options,...A||[]];if(!this.isGlobalCommand&&!this.isDefaultCommand)W=W.filter((Q)=>Q.name!=="version");if(W.length>0){let Q=HB(W.map((B)=>B.rawName));J.push({title:"Options",body:W.map((B)=>{return` ${NJ(B.rawName,Q.length)} ${B.description} ${B.config.default===void 0?"":`(default: ${B.config.default})`}`}).join(`
305
+ `)})}let W=this.isGlobalCommand?A:[...this.options,...A||[]];if(!this.isGlobalCommand&&!this.isDefaultCommand)W=W.filter((Q)=>Q.name!=="version");if(W.length>0){let Q=RB(W.map((B)=>B.rawName));J.push({title:"Options",body:W.map((B)=>{return` ${fJ(B.rawName,Q.length)} ${B.description} ${B.config.default===void 0?"":`(default: ${B.config.default})`}`}).join(`
306
306
  `)})}if(this.examples.length>0)J.push({title:"Examples",body:this.examples.map((Q)=>{if(typeof Q==="function")return Q(w);return Q}).join(`
307
307
  `)});if(X)J=X(J)||J;console.log(J.map((Q)=>{return Q.title?`${Q.title}:
308
308
  ${Q.body}`:Q.body}).join(`
309
309
 
310
- `))}outputVersion(){let{name:w}=this.cli,{versionNumber:$}=this.cli.globalCommand;if($)console.log(`${w}/${$} ${typeof Bun<"u"?y6:O6}`)}checkRequiredArgs(){let w=this.args.filter(($)=>$.required).length;if(this.cli.args.length<w){let Y=this.args.filter((X)=>X.required).slice(this.cli.args.length),A=Y.map((X)=>`<${X.value}>`).join(" ");throw new AA(`Missing required argument${Y.length>1?"s":""}: ${A}
310
+ `))}outputVersion(){let{name:w}=this.cli,{versionNumber:$}=this.cli.globalCommand;if($)console.log(`${w}/${$} ${typeof Bun<"u"?O6:L6}`)}checkRequiredArgs(){let w=this.args.filter(($)=>$.required).length;if(this.cli.args.length<w){let Y=this.args.filter((X)=>X.required).slice(this.cli.args.length),A=Y.map((X)=>`<${X.value}>`).join(" ");throw new JA(`Missing required argument${Y.length>1?"s":""}: ${A}
311
311
 
312
- Run \`${this.cli.name} ${this.rawName} --help\` for usage information.`)}}checkUnknownOptions(){let{options:w,globalCommand:$}=this.cli;if(!this.config.allowUnknownOptions){for(let Y of Object.keys(w))if(Y!=="--"&&!this.hasOption(Y)&&!$.hasOption(Y)){let X=[...$.options,...this.options].flatMap((Q)=>Q.names),J=Y.length>1?`--${Y}`:`-${Y}`,U=LB(Y,X),W=`Unknown option \`${J}\``;if(U.length>0)W+=`
312
+ Run \`${this.cli.name} ${this.rawName} --help\` for usage information.`)}}checkUnknownOptions(){let{options:w,globalCommand:$}=this.cli;if(!this.config.allowUnknownOptions){for(let Y of Object.keys(w))if(Y!=="--"&&!this.hasOption(Y)&&!$.hasOption(Y)){let X=[...$.options,...this.options].flatMap((Q)=>Q.names),J=Y.length>1?`--${Y}`:`-${Y}`,U=_B(Y,X),W=`Unknown option \`${J}\``;if(U.length>0)W+=`
313
313
 
314
314
  Did you mean one of these?`,U.forEach((Q)=>{let B=Q.length>1?`--${Q}`:`-${Q}`;W+=`
315
315
  • ${B}`});throw W+=`
316
316
 
317
- Run \`${this.cli.name} ${this.rawName} --help\` to see available options.`,new AA(W)}}}checkOptionValue(){let{options:w,globalCommand:$}=this.cli,Y=[...$.options,...this.options];for(let A of Y){let X=w[A.name.split(".")[0]];if(A.required){let J=Y.some((U)=>U.negated&&U.names.includes(A.name));if(X===!0||X===!1&&!J)throw new AA(`Option \`${A.rawName}\` requires a value.
317
+ Run \`${this.cli.name} ${this.rawName} --help\` to see available options.`,new JA(W)}}}checkOptionValue(){let{options:w,globalCommand:$}=this.cli,Y=[...$.options,...this.options];for(let A of Y){let X=w[A.name.split(".")[0]];if(A.required){let J=Y.some((U)=>U.negated&&U.names.includes(A.name));if(X===!0||X===!1&&!J)throw new JA(`Option \`${A.rawName}\` requires a value.
318
318
 
319
- Example: ${this.cli.name} ${this.rawName} ${A.rawName} <value>`)}}}}class RJ extends HJ{constructor(w){super("@@global@@","",{},w)}}var L6=HJ,F$={red:["\x1B[31m","\x1B[39m"],green:["\x1B[32m","\x1B[39m"],blue:["\x1B[34m","\x1B[39m"],yellow:["\x1B[33m","\x1B[39m"],cyan:["\x1B[36m","\x1B[39m"],magenta:["\x1B[35m","\x1B[39m"],white:["\x1B[37m","\x1B[39m"],gray:["\x1B[90m","\x1B[39m"],bgRed:["\x1B[41m","\x1B[49m"],bgGreen:["\x1B[42m","\x1B[49m"],bgBlue:["\x1B[44m","\x1B[49m"],bgYellow:["\x1B[43m","\x1B[49m"],bgCyan:["\x1B[46m","\x1B[49m"],bgMagenta:["\x1B[45m","\x1B[49m"],bold:["\x1B[1m","\x1B[22m"],italic:["\x1B[3m","\x1B[23m"],underline:["\x1B[4m","\x1B[24m"],dim:["\x1B[2m","\x1B[22m"],inverse:["\x1B[7m","\x1B[27m"],hidden:["\x1B[8m","\x1B[28m"],strikethrough:["\x1B[9m","\x1B[29m"]};var jY={primary:"blue",secondary:"cyan",success:"green",warning:"yellow",error:"red",info:"magenta",muted:"gray"};function _6(){return!0}function S6(){let w={};w.supportsColor=_6();function $(A,X=[]){let J=A===""?[]:[...X,A],U=function(Q){if(!w.supportsColor)return Q;let B="",j="";for(let z of J)if(z in jY&&jY[z]in F$){let G=jY[z];B+=F$[G][0],j=F$[G][1]+j}else if(z in F$)B+=F$[z][0],j=F$[z][1]+j;return B+Q+j},W=[...Object.keys(F$),...Object.keys(jY)];for(let Q of W)if(!(Q in U))Object.defineProperty(U,Q,{get(){return $(Q,J)}});return U}let Y=[...Object.keys(F$),...Object.keys(jY)];for(let A of Y)if(!(A in w))Object.defineProperty(w,A,{get(){return $(A)}});return w}var zY=S6();class MJ extends N6{name;commands;globalCommand;matchedCommand;matchedCommandName;rawArgs;args;options;showHelpOnExit;showVersionOnExit;enableDidYouMean=!0;signalHandlersSet=!1;isVerbose=!1;isQuiet=!1;isDebug=!1;isNoInteraction=!1;environment;isDryRun=!1;isForce=!1;useEmoji=!0;theme;isNoCache=!1;constructor(w=""){super();this.name=w,this.commands=[],this.rawArgs=[],this.args=[],this.options={},this.globalCommand=new RJ(this),this.globalCommand.usage("<command> [options]")}handleSignals(w){if(this.signalHandlersSet)return this;let $=async(Y)=>{if(console.log(`
319
+ Example: ${this.cli.name} ${this.rawName} ${A.rawName} <value>`)}}}}class IJ extends MJ{constructor(w){super("@@global@@","",{},w)}}var _6=MJ,F$={red:["\x1B[31m","\x1B[39m"],green:["\x1B[32m","\x1B[39m"],blue:["\x1B[34m","\x1B[39m"],yellow:["\x1B[33m","\x1B[39m"],cyan:["\x1B[36m","\x1B[39m"],magenta:["\x1B[35m","\x1B[39m"],white:["\x1B[37m","\x1B[39m"],gray:["\x1B[90m","\x1B[39m"],bgRed:["\x1B[41m","\x1B[49m"],bgGreen:["\x1B[42m","\x1B[49m"],bgBlue:["\x1B[44m","\x1B[49m"],bgYellow:["\x1B[43m","\x1B[49m"],bgCyan:["\x1B[46m","\x1B[49m"],bgMagenta:["\x1B[45m","\x1B[49m"],bold:["\x1B[1m","\x1B[22m"],italic:["\x1B[3m","\x1B[23m"],underline:["\x1B[4m","\x1B[24m"],dim:["\x1B[2m","\x1B[22m"],inverse:["\x1B[7m","\x1B[27m"],hidden:["\x1B[8m","\x1B[28m"],strikethrough:["\x1B[9m","\x1B[29m"]};var zY={primary:"blue",secondary:"cyan",success:"green",warning:"yellow",error:"red",info:"magenta",muted:"gray"};function S6(){return!0}function Z6(){let w={};w.supportsColor=S6();function $(A,X=[]){let J=A===""?[]:[...X,A],U=function(Q){if(!w.supportsColor)return Q;let B="",j="";for(let z of J)if(z in zY&&zY[z]in F$){let G=zY[z];B+=F$[G][0],j=F$[G][1]+j}else if(z in F$)B+=F$[z][0],j=F$[z][1]+j;return B+Q+j},W=[...Object.keys(F$),...Object.keys(zY)];for(let Q of W)if(!(Q in U))Object.defineProperty(U,Q,{get(){return $(Q,J)}});return U}let Y=[...Object.keys(F$),...Object.keys(zY)];for(let A of Y)if(!(A in w))Object.defineProperty(w,A,{get(){return $(A)}});return w}var GY=Z6();class VJ extends E6{name;commands;globalCommand;matchedCommand;matchedCommandName;rawArgs;args;options;showHelpOnExit;showVersionOnExit;enableDidYouMean=!0;signalHandlersSet=!1;isVerbose=!1;isQuiet=!1;isDebug=!1;isNoInteraction=!1;environment;isDryRun=!1;isForce=!1;useEmoji=!0;theme;isNoCache=!1;constructor(w=""){super();this.name=w,this.commands=[],this.rawArgs=[],this.args=[],this.options={},this.globalCommand=new IJ(this),this.globalCommand.usage("<command> [options]")}handleSignals(w){if(this.signalHandlersSet)return this;let $=async(Y)=>{if(console.log(`
320
320
 
321
- Received ${Y}, cleaning up...`),w)try{await w()}catch(A){console.error("Error during cleanup:",A)}K$.exit(0)};return K$.on("SIGINT",()=>$("SIGINT")),K$.on("SIGTERM",()=>$("SIGTERM")),this.signalHandlersSet=!0,this}didYouMean(w=!0){return this.enableDidYouMean=w,this}verbose(){return this.globalCommand.option("-v, --verbose","Enable verbose output"),this}quiet(){return this.globalCommand.option("-q, --quiet","Suppress non-essential output"),this}debug(){return this.globalCommand.option("--debug","Enable debug mode with detailed error information"),this}noInteraction(){return this.globalCommand.option("-n, --no-interaction","Do not ask any interactive questions (for CI/CD)"),this}env(){return this.globalCommand.option("--env <environment>","Target environment (e.g., production, staging, local)"),this}dryRun(){return this.globalCommand.option("--dry-run","Preview actions without executing them"),this}force(){return this.globalCommand.option("-f, --force","Skip confirmation prompts"),this}emoji(){return this.globalCommand.option("--no-emoji","Disable emoji in output"),this}themes(){return this.globalCommand.option("--theme <theme>","Color theme (default, dracula, nord, solarized, monokai)"),this}cache(){return this.globalCommand.option("--no-cache","Disable caching"),this}usage(w){return this.globalCommand.usage(w),this}command(w,$,Y){if(!Y)Y={};let A=new L6(w,$||"",Y,this);return A.globalCommand=this.globalCommand,this.commands.push(A),A}option(w,$,Y){return this.globalCommand.option(w,$,Y),this}help(w){return this.globalCommand.option("-h, --help","Display this message"),this.globalCommand.helpCallback=w,this.showHelpOnExit=!0,this}version(w,$="-v, --version"){return this.globalCommand.version(w,$),this.showVersionOnExit=!0,this}example(w){return this.globalCommand.example(w),this}outputHelp(){if(this.matchedCommand)this.matchedCommand.outputHelp();else this.globalCommand.outputHelp()}outputVersion(){this.globalCommand.outputVersion()}setParsedInfo({args:w,options:$},Y,A){if(this.args=w,this.options=$,Y)this.matchedCommand=Y;if(A)this.matchedCommandName=A;return this}unsetMatchedCommand(){this.matchedCommand=void 0,this.matchedCommandName=void 0}showCommandNotFound(w){if(console.log(zY.red(`
321
+ Received ${Y}, cleaning up...`),w)try{await w()}catch(A){console.error("Error during cleanup:",A)}K$.exit(0)};return K$.on("SIGINT",()=>$("SIGINT")),K$.on("SIGTERM",()=>$("SIGTERM")),this.signalHandlersSet=!0,this}didYouMean(w=!0){return this.enableDidYouMean=w,this}verbose(){return this.globalCommand.option("-v, --verbose","Enable verbose output"),this}quiet(){return this.globalCommand.option("-q, --quiet","Suppress non-essential output"),this}debug(){return this.globalCommand.option("--debug","Enable debug mode with detailed error information"),this}noInteraction(){return this.globalCommand.option("-n, --no-interaction","Do not ask any interactive questions (for CI/CD)"),this}env(){return this.globalCommand.option("--env <environment>","Target environment (e.g., production, staging, local)"),this}dryRun(){return this.globalCommand.option("--dry-run","Preview actions without executing them"),this}force(){return this.globalCommand.option("-f, --force","Skip confirmation prompts"),this}emoji(){return this.globalCommand.option("--no-emoji","Disable emoji in output"),this}themes(){return this.globalCommand.option("--theme <theme>","Color theme (default, dracula, nord, solarized, monokai)"),this}cache(){return this.globalCommand.option("--no-cache","Disable caching"),this}usage(w){return this.globalCommand.usage(w),this}command(w,$,Y){if(!Y)Y={};let A=new _6(w,$||"",Y,this);return A.globalCommand=this.globalCommand,this.commands.push(A),A}option(w,$,Y){return this.globalCommand.option(w,$,Y),this}help(w){return this.globalCommand.option("-h, --help","Display this message"),this.globalCommand.helpCallback=w,this.showHelpOnExit=!0,this}version(w,$="-v, --version"){return this.globalCommand.version(w,$),this.showVersionOnExit=!0,this}example(w){return this.globalCommand.example(w),this}outputHelp(){if(this.matchedCommand)this.matchedCommand.outputHelp();else this.globalCommand.outputHelp()}outputVersion(){this.globalCommand.outputVersion()}setParsedInfo({args:w,options:$},Y,A){if(this.args=w,this.options=$,Y)this.matchedCommand=Y;if(A)this.matchedCommandName=A;return this}unsetMatchedCommand(){this.matchedCommand=void 0,this.matchedCommandName=void 0}showCommandNotFound(w){if(console.log(GY.red(`
322
322
  ✗ Command "${w}" not found.
323
- `)),this.enableDidYouMean){let $=[];for(let A of this.commands){if(A.displayName)$.push(A.displayName);if(A.aliasNames)$.push(...A.aliasNames)}let Y=LB(w,$);if(Y.length>0)console.log(zY.yellow("Did you mean one of these?")),Y.forEach((A)=>console.log(` ${zY.dim("•")} ${this.name} ${A}`)),console.log("")}console.log(zY.dim("Run"),`${this.name} --help`,zY.dim("to see all available commands")),K$.exit(1)}async parse(w=RB,$={}){let{run:Y=!0,exitOnError:A=!1}=$;if(A)try{return await this.parse(w,{run:Y})}catch(Q){throw this.handleUsageError(Q),Q}if(this.rawArgs=w,!this.name)this.name=w[1]?I6(w[1]):"cli";let X=!0,J=w.slice(2),U=J[0];if(U&&!U.startsWith("-")){for(let Q of this.commands)if(Q.isMatched(U)){let B=this.mri(J,Q);X=!1;let j={...B,args:B.args.slice(1)};this.setParsedInfo(j,Q,U),this.emit(`command:${U}`,Q);break}}if(X){for(let Q of this.commands)if(Q.name===""){X=!1;let B=this.mri(J,Q);this.setParsedInfo(B,Q),this.emit("command:!",Q);break}}if(X){let Q=this.mri(w.slice(2));this.setParsedInfo(Q)}if(this.options.verbose)this.isVerbose=!0;if(this.options.quiet)this.isQuiet=!0;if(this.options.debug)this.isDebug=!0;if(this.options.noInteraction)this.isNoInteraction=!0;if(this.options.env)this.environment=String(this.options.env);if(this.options.dryRun)this.isDryRun=!0;if(this.options.force)this.isForce=!0;if(this.options.noEmoji!==void 0)this.useEmoji=!this.options.noEmoji;if(this.options.theme)this.theme=String(this.options.theme);if(this.options.noCache!==void 0)this.isNoCache=Boolean(this.options.noCache);if(this.options.help&&this.showHelpOnExit)this.outputHelp(),Y=!1,this.unsetMatchedCommand();if(this.options.version&&this.showVersionOnExit&&this.matchedCommandName==null)this.outputVersion(),Y=!1,this.unsetMatchedCommand();let W={args:this.args,options:this.options};if(Y)await this.runMatchedCommand();if(!this.matchedCommand&&this.args[0]){if(this.emit("command:*"),!(this.listenerCount("command:*")>0))this.showCommandNotFound(this.args[0])}return W}mri(w,$){let Y=[...this.globalCommand.options,...$?$.options:[]],A=f6(Y),X=[],J=w.indexOf("--");if(J>-1)X=w.slice(J+1),w=w.slice(0,J);let U=E6(w,A),W={_:U._};for(let G of Object.keys(U))if(G!=="_")W[OB(G)]=U[G];let Q=W._,B={"--":X},j=$&&$.config.ignoreOptionDefaultValue?$.config.ignoreOptionDefaultValue:this.globalCommand.config.ignoreOptionDefaultValue,z=Object.create(null);for(let G of Y){if(!j&&G.config.default!==void 0)for(let K of G.names)B[K]=G.config.default;if(Array.isArray(G.config.type)){if(z[G.name]===void 0)z[G.name]={shouldTransform:!0,transformFunction:G.config.type[0]}}}for(let G of Object.keys(W))if(G!=="_"){let K=G.split(".");R6(B,K,W[G]),M6(B,z)}return{args:Q,options:B}}async run(w=RB){return this.parse(w,{run:!0,exitOnError:!0})}handleUsageError(w){if(!(!!w&&typeof w==="object"&&w.name==="ClappError"&&w.isUsageError!==!1))return;let A=w,X=A.message??"command-line error",J=this.name?`${this.name}: `:"",U=/--help/.test(X)?"":`
323
+ `)),this.enableDidYouMean){let $=[];for(let A of this.commands){if(A.displayName)$.push(A.displayName);if(A.aliasNames)$.push(...A.aliasNames)}let Y=_B(w,$);if(Y.length>0)console.log(GY.yellow("Did you mean one of these?")),Y.forEach((A)=>console.log(` ${GY.dim("•")} ${this.name} ${A}`)),console.log("")}console.log(GY.dim("Run"),`${this.name} --help`,GY.dim("to see all available commands")),K$.exit(1)}async parse(w=MB,$={}){let{run:Y=!0,exitOnError:A=!1}=$;if(A)try{return await this.parse(w,{run:Y})}catch(Q){throw this.handleUsageError(Q),Q}if(this.rawArgs=w,!this.name)this.name=w[1]?V6(w[1]):"cli";let X=!0,J=w.slice(2),U=J[0];if(U&&!U.startsWith("-")){for(let Q of this.commands)if(Q.isMatched(U)){let B=this.mri(J,Q);X=!1;let j={...B,args:B.args.slice(1)};this.setParsedInfo(j,Q,U),this.emit(`command:${U}`,Q);break}}if(X){for(let Q of this.commands)if(Q.name===""){X=!1;let B=this.mri(J,Q);this.setParsedInfo(B,Q),this.emit("command:!",Q);break}}if(X){let Q=this.mri(w.slice(2));this.setParsedInfo(Q)}if(this.options.verbose)this.isVerbose=!0;if(this.options.quiet)this.isQuiet=!0;if(this.options.debug)this.isDebug=!0;if(this.options.noInteraction)this.isNoInteraction=!0;if(this.options.env)this.environment=String(this.options.env);if(this.options.dryRun)this.isDryRun=!0;if(this.options.force)this.isForce=!0;if(this.options.noEmoji!==void 0)this.useEmoji=!this.options.noEmoji;if(this.options.theme)this.theme=String(this.options.theme);if(this.options.noCache!==void 0)this.isNoCache=Boolean(this.options.noCache);if(this.options.help&&this.showHelpOnExit)this.outputHelp(),Y=!1,this.unsetMatchedCommand();if(this.options.version&&this.showVersionOnExit&&this.matchedCommandName==null)this.outputVersion(),Y=!1,this.unsetMatchedCommand();let W={args:this.args,options:this.options};if(Y)await this.runMatchedCommand();if(!this.matchedCommand&&this.args[0]){if(this.emit("command:*"),!(this.listenerCount("command:*")>0))this.showCommandNotFound(this.args[0])}return W}mri(w,$){let Y=[...this.globalCommand.options,...$?$.options:[]],A=H6(Y),X=[],J=w.indexOf("--");if(J>-1)X=w.slice(J+1),w=w.slice(0,J);let U=f6(w,A),W={_:U._};for(let G of Object.keys(U))if(G!=="_")W[LB(G)]=U[G];let Q=W._,B={"--":X},j=$&&$.config.ignoreOptionDefaultValue?$.config.ignoreOptionDefaultValue:this.globalCommand.config.ignoreOptionDefaultValue,z=Object.create(null);for(let G of Y){if(!j&&G.config.default!==void 0)for(let K of G.names)B[K]=G.config.default;if(Array.isArray(G.config.type)){if(z[G.name]===void 0)z[G.name]={shouldTransform:!0,transformFunction:G.config.type[0]}}}for(let G of Object.keys(W))if(G!=="_"){let K=G.split(".");M6(B,K,W[G]),I6(B,z)}return{args:Q,options:B}}async run(w=MB){return this.parse(w,{run:!0,exitOnError:!0})}handleUsageError(w){if(!(!!w&&typeof w==="object"&&w.name==="ClappError"&&w.isUsageError!==!1))return;let A=w,X=A.message??"command-line error",J=this.name?`${this.name}: `:"",U=/--help/.test(X)?"":`
324
324
  Run \`${this.name??"cli"} --help\` for usage.`;K$.stderr.write(`${J}${X}${U}
325
- `),K$.exit(A.exitCode??2)}async runMatchedCommand(){let{args:w,options:$,matchedCommand:Y}=this;if(!Y||!Y.commandAction)return;Y.checkUnknownOptions(),Y.checkOptionValue(),Y.checkRequiredArgs();let A=[];Y.args.forEach((W,Q)=>{if(W.variadic)A.push(w.slice(Q));else A.push(w[Q])}),A.push($);let X={command:Y,args:A,options:$};for(let W of Y.beforeHooks)await W(X);let J,U=async()=>{let W=Y.commandAction.apply(this,A);if(W instanceof Promise)J=await W;else J=W;return J};if(Y.middleware.length>0){let W=0,Q=async()=>{if(W<Y.middleware.length){let B=Y.middleware[W++];await B({...X,next:Q})}else await U()};await Q()}else await U();for(let W of Y.afterHooks)await W(X);return J}removeSignalHandlers(){if(!this.signalHandlersSet)return this;return K$.removeAllListeners("SIGINT"),K$.removeAllListeners("SIGTERM"),this.signalHandlersSet=!1,this}destroy(){this.removeSignalHandlers(),this.commands=[],this.rawArgs=[],this.args=[],this.options={},this.matchedCommand=void 0,this.matchedCommandName=void 0,this.removeAllListeners()}}class SB{cache;enabled;cleanupInterval=null;hits=0;misses=0;constructor(){this.cache=new Map,this.enabled=!0,this.startCleanupInterval()}startCleanupInterval(){if(this.cleanupInterval)return;this.cleanupInterval=setInterval(()=>{this.cleanup()},30000),this.cleanupInterval.unref()}stopCleanup(){if(this.cleanupInterval)clearInterval(this.cleanupInterval),this.cleanupInterval=null}isEnabled(){return this.enabled}get(w){if(!this.enabled){this.misses++;return}let $=this.cache.get(w);if(!$){this.misses++;return}if(Date.now()-$.timestamp>$.ttl){this.cache.delete(w),this.misses++;return}return this.hits++,$.value}set(w,$,Y=5000){if(!this.enabled)return;this.cache.set(w,{value:$,timestamp:Date.now(),ttl:Y})}has(w){if(!this.enabled)return!1;let $=this.cache.get(w);if(!$)return!1;if(Date.now()-$.timestamp>$.ttl)return this.cache.delete(w),!1;return!0}delete(w){this.cache.delete(w)}clear(){this.cache.clear()}disable(){this.enabled=!1,this.clear()}enable(){this.enabled=!0}stats(){return{size:this.cache.size,enabled:this.enabled,hits:this.hits,misses:this.misses}}resetStats(){this.hits=0,this.misses=0}keys(){return Array.from(this.cache.keys())}cleanup(){let w=Date.now();for(let[$,Y]of this.cache.entries())if(w-Y.timestamp>Y.ttl)this.cache.delete($)}destroy(){this.stopCleanup(),this.clear(),this.resetStats()}}var lM=new SB;function Z6(){if("FORCE_COLOR"in GY.env)return GY.env.FORCE_COLOR!=="0";if("NO_COLOR"in GY.env||GY.env.TERM==="dumb")return!1;if(GY.platform==="win32")return!0;return MB.isatty(1)&&MB.isatty(2)}var ZB=Z6();function A0(w,$){if(!ZB)return(Y)=>Y;return(Y)=>w+Y+$}var k6=A0("\x1B[0m","\x1B[0m"),h6=A0("\x1B[31m","\x1B[39m"),D6=A0("\x1B[32m","\x1B[39m"),x6=A0("\x1B[33m","\x1B[39m"),P6=A0("\x1B[34m","\x1B[39m"),b6=A0("\x1B[35m","\x1B[39m"),u6=A0("\x1B[36m","\x1B[39m"),c6=A0("\x1B[37m","\x1B[39m"),v6=A0("\x1B[90m","\x1B[39m"),i6=A0("\x1B[1m","\x1B[22m"),m6=A0("\x1B[3m","\x1B[23m"),g6=A0("\x1B[4m","\x1B[24m"),d6=A0("\x1B[2m","\x1B[22m"),l6=A0("\x1B[7m","\x1B[27m"),n6=A0("\x1B[8m","\x1B[28m"),p6=A0("\x1B[9m","\x1B[29m"),r6=A0("\x1B[41m","\x1B[49m"),t6=A0("\x1B[42m","\x1B[49m"),a6=A0("\x1B[43m","\x1B[49m"),s6=A0("\x1B[44m","\x1B[49m"),o6=A0("\x1B[45m","\x1B[49m"),e6=A0("\x1B[46m","\x1B[49m"),wK=A0("\x1B[47m","\x1B[49m"),$K=ZB,YK={reset:k6,red:h6,green:D6,yellow:x6,blue:P6,magenta:b6,cyan:u6,white:c6,gray:v6,bold:i6,italic:m6,underline:g6,dim:d6,inverse:l6,hidden:n6,strikethrough:p6,bgRed:r6,bgGreen:t6,bgYellow:a6,bgBlue:s6,bgMagenta:o6,bgCyan:e6,bgWhite:wK,isColorSupported:$K},JA=YK,XK=["up","down","left","right","space","enter","cancel"],UA={actions:new Set(XK),aliases:new Map([["k","up"],["j","down"],["h","left"],["l","right"],["\x03","cancel"],["escape","cancel"]]),messages:{cancel:"Canceled",error:"Something went wrong"}};function kB(w,$){if(typeof w==="string")return UA.aliases.get(w)===$;for(let Y of w){if(Y===void 0)continue;if(kB(Y,$))return!0}return!1}function JK(w,$){if(w===$)return[];let Y=w.split(`
325
+ `),K$.exit(A.exitCode??2)}async runMatchedCommand(){let{args:w,options:$,matchedCommand:Y}=this;if(!Y||!Y.commandAction)return;Y.checkUnknownOptions(),Y.checkOptionValue(),Y.checkRequiredArgs();let A=[];Y.args.forEach((W,Q)=>{if(W.variadic)A.push(w.slice(Q));else A.push(w[Q])}),A.push($);let X={command:Y,args:A,options:$};for(let W of Y.beforeHooks)await W(X);let J,U=async()=>{let W=Y.commandAction.apply(this,A);if(W instanceof Promise)J=await W;else J=W;return J};if(Y.middleware.length>0){let W=0,Q=async()=>{if(W<Y.middleware.length){let B=Y.middleware[W++];await B({...X,next:Q})}else await U()};await Q()}else await U();for(let W of Y.afterHooks)await W(X);return J}removeSignalHandlers(){if(!this.signalHandlersSet)return this;return K$.removeAllListeners("SIGINT"),K$.removeAllListeners("SIGTERM"),this.signalHandlersSet=!1,this}destroy(){this.removeSignalHandlers(),this.commands=[],this.rawArgs=[],this.args=[],this.options={},this.matchedCommand=void 0,this.matchedCommandName=void 0,this.removeAllListeners()}}class ZB{cache;enabled;cleanupInterval=null;hits=0;misses=0;constructor(){this.cache=new Map,this.enabled=!0,this.startCleanupInterval()}startCleanupInterval(){if(this.cleanupInterval)return;this.cleanupInterval=setInterval(()=>{this.cleanup()},30000),this.cleanupInterval.unref()}stopCleanup(){if(this.cleanupInterval)clearInterval(this.cleanupInterval),this.cleanupInterval=null}isEnabled(){return this.enabled}get(w){if(!this.enabled){this.misses++;return}let $=this.cache.get(w);if(!$){this.misses++;return}if(Date.now()-$.timestamp>$.ttl){this.cache.delete(w),this.misses++;return}return this.hits++,$.value}set(w,$,Y=5000){if(!this.enabled)return;this.cache.set(w,{value:$,timestamp:Date.now(),ttl:Y})}has(w){if(!this.enabled)return!1;let $=this.cache.get(w);if(!$)return!1;if(Date.now()-$.timestamp>$.ttl)return this.cache.delete(w),!1;return!0}delete(w){this.cache.delete(w)}clear(){this.cache.clear()}disable(){this.enabled=!1,this.clear()}enable(){this.enabled=!0}stats(){return{size:this.cache.size,enabled:this.enabled,hits:this.hits,misses:this.misses}}resetStats(){this.hits=0,this.misses=0}keys(){return Array.from(this.cache.keys())}cleanup(){let w=Date.now();for(let[$,Y]of this.cache.entries())if(w-Y.timestamp>Y.ttl)this.cache.delete($)}destroy(){this.stopCleanup(),this.clear(),this.resetStats()}}var pM=new ZB;function k6(){if("FORCE_COLOR"in KY.env)return KY.env.FORCE_COLOR!=="0";if("NO_COLOR"in KY.env||KY.env.TERM==="dumb")return!1;if(KY.platform==="win32")return!0;return IB.isatty(1)&&IB.isatty(2)}var kB=k6();function A0(w,$){if(!kB)return(Y)=>Y;return(Y)=>w+Y+$}var h6=A0("\x1B[0m","\x1B[0m"),D6=A0("\x1B[31m","\x1B[39m"),x6=A0("\x1B[32m","\x1B[39m"),P6=A0("\x1B[33m","\x1B[39m"),b6=A0("\x1B[34m","\x1B[39m"),u6=A0("\x1B[35m","\x1B[39m"),c6=A0("\x1B[36m","\x1B[39m"),v6=A0("\x1B[37m","\x1B[39m"),i6=A0("\x1B[90m","\x1B[39m"),m6=A0("\x1B[1m","\x1B[22m"),g6=A0("\x1B[3m","\x1B[23m"),d6=A0("\x1B[4m","\x1B[24m"),l6=A0("\x1B[2m","\x1B[22m"),n6=A0("\x1B[7m","\x1B[27m"),p6=A0("\x1B[8m","\x1B[28m"),r6=A0("\x1B[9m","\x1B[29m"),t6=A0("\x1B[41m","\x1B[49m"),a6=A0("\x1B[42m","\x1B[49m"),s6=A0("\x1B[43m","\x1B[49m"),o6=A0("\x1B[44m","\x1B[49m"),e6=A0("\x1B[45m","\x1B[49m"),wK=A0("\x1B[46m","\x1B[49m"),$K=A0("\x1B[47m","\x1B[49m"),YK=kB,AK={reset:h6,red:D6,green:x6,yellow:P6,blue:b6,magenta:u6,cyan:c6,white:v6,gray:i6,bold:m6,italic:g6,underline:d6,dim:l6,inverse:n6,hidden:p6,strikethrough:r6,bgRed:t6,bgGreen:a6,bgYellow:s6,bgBlue:o6,bgMagenta:e6,bgCyan:wK,bgWhite:$K,isColorSupported:YK},QA=AK,JK=["up","down","left","right","space","enter","cancel"],WA={actions:new Set(JK),aliases:new Map([["k","up"],["j","down"],["h","left"],["l","right"],["\x03","cancel"],["escape","cancel"]]),messages:{cancel:"Canceled",error:"Something went wrong"}};function hB(w,$){if(typeof w==="string")return WA.aliases.get(w)===$;for(let Y of w){if(Y===void 0)continue;if(hB(Y,$))return!0}return!1}function UK(w,$){if(w===$)return[];let Y=w.split(`
326
326
  `),A=$.split(`
327
- `),X=[];for(let J=0;J<Math.max(Y.length,A.length);J++)if(Y[J]!==A[J])X.push(J);return X}var sM=AK.platform.startsWith("win"),IB=Symbol("clapp:cancel");function YA(w,$){let Y=w;if(Y.isTTY)Y.setRawMode($)}function BK(w){return w.replace(/\x1b\[[0-9;]*m/g,"")}function jK(w){return BK(w).length}function CB(w,$,Y){if(!$||$<1)return w;let A=Y?.hard??!1,X=Y?.trim??!0,J=w.split(`
328
- `),U=[];for(let W of J){if(jK(W)<=$){U.push(X?W.trimEnd():W);continue}if(A){let Q="",B=0,j=0;while(j<W.length){let z=W.slice(j).match(/^\x1b\[[0-9;]*m/);if(z){Q+=z[0],j+=z[0].length;continue}if(B>=$)U.push(X?Q.trimEnd():Q),Q="",B=0;Q+=W[j],B++,j++}if(Q)U.push(X?Q.trimEnd():Q)}else U.push(X?W.trimEnd():W)}return U.join(`
329
- `)}class IJ{input;output;_abortSignal;rl;opts;_render;_track=!1;_prevFrame="";_subscribers=new Map;_cursor=0;_manualLine="";state="initial";error="";value;userInput="";constructor(w,$=!0){let{input:Y=UK,output:A=QK,render:X,signal:J,...U}=w;this.opts=U,this.onKeypress=this.onKeypress.bind(this),this.close=this.close.bind(this),this.render=this.render.bind(this),this._render=X.bind(this),this._track=$,this._abortSignal=J,this.input=Y,this.output=A}unsubscribe(){this._subscribers.clear()}setSubscriber(w,$){let Y=this._subscribers.get(w)??[];Y.push($),this._subscribers.set(w,Y)}on(w,$){return this.setSubscriber(w,{cb:$}),this}once(w,$){return this.setSubscriber(w,{cb:$,once:!0}),this}emit(w,...$){let Y=this._subscribers.get(w)??[],A=[];for(let X of Y)if(X.cb(...$),X.once)A.push(()=>Y.splice(Y.indexOf(X),1));for(let X of A)X();return this}prompt(){return new Promise((w)=>{if(this._abortSignal){if(this._abortSignal.aborted)return this.state="cancel",this.close(),w(IB);this._abortSignal.addEventListener("abort",()=>{this.state="cancel",this.close()},{once:!0})}if(this.rl=WK.createInterface({input:this.input,tabSize:2,prompt:"",escapeCodeTimeout:50,terminal:!0}),this.rl.prompt(),this.opts.initialUserInput!==void 0)this._setUserInput(this.opts.initialUserInput,!0);this.input.on("keypress",this.onKeypress),YA(this.input,!0),this.output.on("resize",this.render),this.render(),this.once("submit",()=>{this.output.write(uw.show),this.output.off("resize",this.render),YA(this.input,!1),w(this.value)}),this.once("cancel",()=>{this.output.write(uw.show),this.output.off("resize",this.render),YA(this.input,!1),w(IB)})})}_isActionKey(w,$){return w==="\t"}_setValue(w){this.value=w,this.emit("value",this.value)}_setUserInput(w,$){if(this.userInput=w??"",this.emit("userInput",this.userInput),$&&this._track&&this.rl)this.rl.write(this.userInput),this._cursor=this.rl.cursor}onKeypress(w,$){if(this._track&&$.name!=="return"){if($.name&&this._isActionKey(w,$))this.rl?.write(null,{ctrl:!0,name:"h"});this._cursor=this.rl?.cursor??0;let Y=$.name==="tab"||$.name==="escape"||$.name==="backspace"||$.name==="delete"||$.name==="enter"||$.name==="return"||$.name&&["up","down","left","right"].includes($.name);if(w&&!Y&&w.length===1&&w>=" ")this._manualLine+=w;else if($.name==="backspace"&&this._manualLine.length>0)this._manualLine=this._manualLine.slice(0,-1);let A=this._manualLine.length>=(this.rl?.line?.length||0)?this._manualLine:this.rl?.line;this._setUserInput(A)}if(this.state==="error")this.state="active",this.error="";if($?.name){if(!this._track&&UA.aliases.has($.name))this.emit("cursor",UA.aliases.get($.name));if(UA.actions.has($.name))this.emit("cursor",$.name)}if(w&&(w.toLowerCase()==="y"||w.toLowerCase()==="n"))this.emit("confirm",w.toLowerCase()==="y");if(this.emit("key",w?.toLowerCase(),$),$?.name==="return"){if(this.opts.validate){let Y=this.opts.validate(this.value);if(Y)this.error=Y instanceof Error?Y.message:Y,this.state="error"}if(this.state!=="error")this.state="submit"}if(kB([w,$?.name,$?.sequence],"cancel"))this.state="cancel";if(this.state==="submit"||this.state==="cancel")this.emit("finalize");if(this.render(),this.state==="submit"||this.state==="cancel")this.close()}close(){if(this.input.unpipe(),this.input.removeListener("keypress",this.onKeypress),this.output.write(`
330
- `),YA(this.input,!1),this.rl?.close(),this.rl=void 0,this.emit(`${this.state}`,this.value),this.state==="cancel")setTimeout(()=>{this.unsubscribe()},10);else this.unsubscribe()}restoreCursor(){let w=CB(this._prevFrame,VB.stdout.columns,{hard:!0,trim:!1}).split(`
331
- `).length-1;this.output.write(uw.move(-999,w*-1))}render(){let w=CB(this._render(this)??"",VB.stdout.columns,{hard:!0,trim:!1});if(w===this._prevFrame)return;if(this.state==="initial")this.output.write(uw.hide);else{let $=JK(this._prevFrame,w);if(this.restoreCursor(),$&&$?.length===1){let Y=$[0];this.output.write(uw.move(0,Y)),this.output.write(EJ.lines(1));let A=w.split(`
332
- `);this.output.write(A[Y]),this._prevFrame=w,this.output.write(uw.move(0,A.length-Y-1));return}if($&&$?.length>1){let Y=$[0];this.output.write(uw.move(0,Y)),this.output.write(EJ.down());let X=w.split(`
327
+ `),X=[];for(let J=0;J<Math.max(Y.length,A.length);J++)if(Y[J]!==A[J])X.push(J);return X}var eM=XK.platform.startsWith("win"),VB=Symbol("clapp:cancel");function XA(w,$){let Y=w;if(Y.isTTY)Y.setRawMode($)}function jK(w){return w.replace(/\x1b\[[0-9;]*m/g,"")}function zK(w){return jK(w).length}function yB(w,$,Y){if(!$||$<1)return w;let A=Y?.hard??!1,X=Y?.trim??!0,J=w.split(`
328
+ `),U=[];for(let W of J){if(zK(W)<=$){U.push(X?W.trimEnd():W);continue}if(A){let Q="",B=0,j=0;while(j<W.length){let z=W.slice(j).match(/^\x1b\[[0-9;]*m/);if(z){Q+=z[0],j+=z[0].length;continue}if(B>=$)U.push(X?Q.trimEnd():Q),Q="",B=0;Q+=W[j],B++,j++}if(Q)U.push(X?Q.trimEnd():Q)}else U.push(X?W.trimEnd():W)}return U.join(`
329
+ `)}class CJ{input;output;_abortSignal;rl;opts;_render;_track=!1;_prevFrame="";_subscribers=new Map;_cursor=0;_manualLine="";state="initial";error="";value;userInput="";constructor(w,$=!0){let{input:Y=QK,output:A=WK,render:X,signal:J,...U}=w;this.opts=U,this.onKeypress=this.onKeypress.bind(this),this.close=this.close.bind(this),this.render=this.render.bind(this),this._render=X.bind(this),this._track=$,this._abortSignal=J,this.input=Y,this.output=A}unsubscribe(){this._subscribers.clear()}setSubscriber(w,$){let Y=this._subscribers.get(w)??[];Y.push($),this._subscribers.set(w,Y)}on(w,$){return this.setSubscriber(w,{cb:$}),this}once(w,$){return this.setSubscriber(w,{cb:$,once:!0}),this}emit(w,...$){let Y=this._subscribers.get(w)??[],A=[];for(let X of Y)if(X.cb(...$),X.once)A.push(()=>Y.splice(Y.indexOf(X),1));for(let X of A)X();return this}prompt(){return new Promise((w)=>{if(this._abortSignal){if(this._abortSignal.aborted)return this.state="cancel",this.close(),w(VB);this._abortSignal.addEventListener("abort",()=>{this.state="cancel",this.close()},{once:!0})}if(this.rl=BK.createInterface({input:this.input,tabSize:2,prompt:"",escapeCodeTimeout:50,terminal:!0}),this.rl.prompt(),this.opts.initialUserInput!==void 0)this._setUserInput(this.opts.initialUserInput,!0);this.input.on("keypress",this.onKeypress),XA(this.input,!0),this.output.on("resize",this.render),this.render(),this.once("submit",()=>{this.output.write(uw.show),this.output.off("resize",this.render),XA(this.input,!1),w(this.value)}),this.once("cancel",()=>{this.output.write(uw.show),this.output.off("resize",this.render),XA(this.input,!1),w(VB)})})}_isActionKey(w,$){return w==="\t"}_setValue(w){this.value=w,this.emit("value",this.value)}_setUserInput(w,$){if(this.userInput=w??"",this.emit("userInput",this.userInput),$&&this._track&&this.rl)this.rl.write(this.userInput),this._cursor=this.rl.cursor}onKeypress(w,$){if(this._track&&$.name!=="return"){if($.name&&this._isActionKey(w,$))this.rl?.write(null,{ctrl:!0,name:"h"});this._cursor=this.rl?.cursor??0;let Y=$.name==="tab"||$.name==="escape"||$.name==="backspace"||$.name==="delete"||$.name==="enter"||$.name==="return"||$.name&&["up","down","left","right"].includes($.name);if(w&&!Y&&w.length===1&&w>=" ")this._manualLine+=w;else if($.name==="backspace"&&this._manualLine.length>0)this._manualLine=this._manualLine.slice(0,-1);let A=this._manualLine.length>=(this.rl?.line?.length||0)?this._manualLine:this.rl?.line;this._setUserInput(A)}if(this.state==="error")this.state="active",this.error="";if($?.name){if(!this._track&&WA.aliases.has($.name))this.emit("cursor",WA.aliases.get($.name));if(WA.actions.has($.name))this.emit("cursor",$.name)}if(w&&(w.toLowerCase()==="y"||w.toLowerCase()==="n"))this.emit("confirm",w.toLowerCase()==="y");if(this.emit("key",w?.toLowerCase(),$),$?.name==="return"){if(this.opts.validate){let Y=this.opts.validate(this.value);if(Y)this.error=Y instanceof Error?Y.message:Y,this.state="error"}if(this.state!=="error")this.state="submit"}if(hB([w,$?.name,$?.sequence],"cancel"))this.state="cancel";if(this.state==="submit"||this.state==="cancel")this.emit("finalize");if(this.render(),this.state==="submit"||this.state==="cancel")this.close()}close(){if(this.input.unpipe(),this.input.removeListener("keypress",this.onKeypress),this.output.write(`
330
+ `),XA(this.input,!1),this.rl?.close(),this.rl=void 0,this.emit(`${this.state}`,this.value),this.state==="cancel")setTimeout(()=>{this.unsubscribe()},10);else this.unsubscribe()}restoreCursor(){let w=yB(this._prevFrame,CB.stdout.columns,{hard:!0,trim:!1}).split(`
331
+ `).length-1;this.output.write(uw.move(-999,w*-1))}render(){let w=yB(this._render(this)??"",CB.stdout.columns,{hard:!0,trim:!1});if(w===this._prevFrame)return;if(this.state==="initial")this.output.write(uw.hide);else{let $=UK(this._prevFrame,w);if(this.restoreCursor(),$&&$?.length===1){let Y=$[0];this.output.write(uw.move(0,Y)),this.output.write(TJ.lines(1));let A=w.split(`
332
+ `);this.output.write(A[Y]),this._prevFrame=w,this.output.write(uw.move(0,A.length-Y-1));return}if($&&$?.length>1){let Y=$[0];this.output.write(uw.move(0,Y)),this.output.write(TJ.down());let X=w.split(`
333
333
  `).slice(Y);this.output.write(X.join(`
334
- `)),this._prevFrame=w;return}this.output.write(EJ.down())}if(this.output.write(w),this.state==="initial")this.state="active";this._prevFrame=w}}function zK(w,$){if(w===void 0)return 0;if($.length===0)return 0;let A=$.findIndex((X)=>X.value===w);return A!==-1?A:0}function GK(w,$){return($.label??String($.value)).toLowerCase().includes(w.toLowerCase())}function KK(w,$){if(!$)return;if(w)return $;return $[0]}class FK extends IJ{filteredOptions;multiple;isNavigating=!1;selectedValues=[];focusedValue;#w=0;#Y="";#A;#$;get cursor(){return this.#w}get userInputWithCursor(){if(!this.userInput)return JA.inverse(JA.hidden("_"));if(this._cursor>=this.userInput.length)return`${this.userInput}█`;let w=this.userInput.slice(0,this._cursor),[$,...Y]=this.userInput.slice(this._cursor);return`${w}${JA.inverse($)}${Y.join("")}`}get options(){if(typeof this.#$==="function")return this.#$();return this.#$}constructor(w){super(w);this.#$=w.options;let $=this.options;this.filteredOptions=[...$],this.multiple=w.multiple===!0,this.#A=w.filter??GK;let Y;if(w.initialValue&&Array.isArray(w.initialValue))if(this.multiple)Y=w.initialValue;else Y=w.initialValue.slice(0,1);else if(!this.multiple&&this.options.length>0)Y=[this.options[0].value];if(Y)for(let A of Y){let X=$.findIndex((J)=>J.value===A);if(X!==-1)this.toggleSelected(A),this.#w=X}this.focusedValue=this.options[this.#w]?.value,this.on("key",(A,X)=>this.#X(A,X)),this.on("userInput",(A)=>this.#J(A))}_isActionKey(w,$){return w==="\t"||this.multiple&&this.isNavigating&&$.name==="space"&&w!==void 0&&w!==""}#X(w,$){let Y=$.name==="up",A=$.name==="down",X=$.name==="return";if(Y||A){if(this.#w=Math.max(0,Math.min(this.#w+(Y?-1:1),this.filteredOptions.length-1)),this.focusedValue=this.filteredOptions[this.#w]?.value,!this.multiple)this.selectedValues=[this.focusedValue];this.isNavigating=!0}else if(X)this.value=KK(this.multiple,this.selectedValues);else if(this.multiple)if(this.focusedValue!==void 0&&($.name==="tab"||this.isNavigating&&$.name==="space"))this.toggleSelected(this.focusedValue);else this.isNavigating=!1;else{if(this.focusedValue)this.selectedValues=[this.focusedValue];this.isNavigating=!1}}deselectAll(){this.selectedValues=[]}toggleSelected(w){if(this.filteredOptions.length===0)return;if(this.multiple)if(this.selectedValues.includes(w))this.selectedValues=this.selectedValues.filter(($)=>$!==w);else this.selectedValues=[...this.selectedValues,w];else this.selectedValues=[w]}#J(w){if(w!==this.#Y){this.#Y=w;let $=this.options;if(w)this.filteredOptions=$.filter((Y)=>this.#A(w,Y));else this.filteredOptions=[...$];if(this.#w=zK(this.focusedValue,this.filteredOptions),this.focusedValue=this.filteredOptions[this.#w]?.value,!this.multiple)if(this.focusedValue!==void 0)this.toggleSelected(this.focusedValue);else this.deselectAll()}}}class qK extends IJ{options;cursor=0;#w;getGroupItems(w){return this.options.filter(($)=>$.group===w)}isGroupSelected(w){let $=this.getGroupItems(w),Y=this.value;if(Y===void 0)return!1;return $.every((A)=>Y.includes(A.value))}toggleValue(){let w=this.options[this.cursor];if(this.value===void 0)this.value=[];if(w.group===!0){let $=String(w.value),Y=this.getGroupItems($);if(this.isGroupSelected($))this.value=this.value.filter((A)=>Y.findIndex((X)=>X.value===A)===-1);else this.value=[...this.value,...Y.map((A)=>A.value)];this.value=Array.from(new Set(this.value))}else{let $=this.value.includes(w.value);this.value=$?this.value.filter((Y)=>Y!==w.value):[...this.value,w.value]}}constructor(w){super(w,!1);let{options:$}=w;this.#w=w.selectableGroups!==!1,this.options=Object.entries($).flatMap(([Y,A])=>[{value:Y,group:!0,label:Y},...A.map((X)=>({...X,group:Y}))]),this.value=[...w.initialValues??[]],this.cursor=Math.max(this.options.findIndex(({value:Y})=>Y===w.cursorAt),this.#w?0:1),this.on("cursor",(Y)=>{switch(Y){case"left":case"up":{this.cursor=this.cursor===0?this.options.length-1:this.cursor-1;let A=this.options[this.cursor]?.group===!0;if(!this.#w&&A)this.cursor=this.cursor===0?this.options.length-1:this.cursor-1;break}case"down":case"right":{this.cursor=this.cursor===this.options.length-1?0:this.cursor+1;let A=this.options[this.cursor]?.group===!0;if(!this.#w&&A)this.cursor=this.cursor===this.options.length-1?0:this.cursor+1;break}case"space":this.toggleValue();break}})}}var NK=V6();var e=(w,$)=>NK?w:$,w4=e("◆","*"),$4=e("■","x"),Y4=e("▲","x"),A4=e("◇","o"),X4=e("┌","T"),EK=e("│","|"),J4=e("└","—"),U4=e("●",">"),Q4=e("○"," "),W4=e("◻","[•]"),B4=e("◼","[+]"),j4=e("◻","[ ]"),z4=e("▪","•"),G4=e("─","-"),K4=e("╮","+"),F4=e("├","+"),q4=e("╯","+"),N4=e("●","•"),E4=e("◆","*"),T4=e("▲","!"),f4=e("■","x");var H4={light:e("─","-"),heavy:e("━","="),block:e("█","#")};function TK(){return`${JA.gray(EK)} `}var R4=TK();KU();import{homedir as FU}from"node:os";import{join as qU,resolve as OF}from"node:path";var __dirname="/home/runner/work/rpx/rpx/packages/rpx/src",$9={from:"localhost:5173",to:"stacks.localhost",cleanUrls:!1,https:{basePath:"",caCertPath:qU(FU(),".stacks","ssl","stacks.localhost.ca.crt"),certPath:qU(FU(),".stacks","ssl","stacks.localhost.crt"),keyPath:qU(FU(),".stacks","ssl","stacks.localhost.crt.key")},cleanup:{certs:!1,hosts:!1},vitePluginUsage:!1,verbose:!0,changeOrigin:!1,regenerateUntrustedCerts:!0},NU=null;async function Y9(){if(!NU)NU=await GU({name:"rpx",cwd:OF(__dirname,".."),defaultConfig:$9});return NU}var K1=$9;import{existsSync as LF,readdirSync as _F,readFileSync as SF,statSync as ZF}from"node:fs";import{homedir as X9}from"node:os";import{isAbsolute as kF,join as q1}from"node:path";var J9=["~/Code"],U9=["localhost","test"],hF=1800000,EU={dirExists:(w)=>{try{return ZF(w).isDirectory()}catch{return!1}},fileExists:(w)=>{try{return LF(w)}catch{return!1}},readText:(w)=>{try{return SF(w,"utf8")}catch{return null}}};function TU(w,$){if(w==="~")return $;if(w.startsWith("~/"))return q1($,w.slice(2));return w}function DF(w){let $=w.indexOf(":");return($===-1?w:w.slice(0,$)).toLowerCase()}function nA(w){return w.replace(/[^a-z0-9._-]/gi,"-").replace(/^[-.]+|[-.]+$/g,"")||"site"}function xF(w,$){for(let Y of $){let A=`.${Y}`;if(w.endsWith(A)){let X=w.slice(0,-A.length);if(X.length>0&&!X.includes(".")&&/^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/i.test(X))return X}}return null}function PF(w,$){let Y=$.readText(q1(w,"rpx.site.json"));if(Y)try{let X=JSON.parse(Y);if(X&&typeof X==="object")return X}catch{}let A=$.readText(q1(w,"package.json"));if(A)try{let X=JSON.parse(A);if(X.rpx&&typeof X.rpx==="object")return X.rpx}catch{}return null}function bF(w){let $=w.selfRegisters??!1;return{command:w.command,env:w.env,urlEnv:w.urlEnv,selfRegisters:$,routes:w.routes??($?void 0:[{path:"/",portEnv:"PORT",defaultPort:3000,readyGate:!0}])}}function uF(w,$){let Y=PF(w,$);if(Y?.command)return bF(Y);let A=$.fileExists(q1(w,"buddy")),X=$.readText(q1(w,"package.json")),J=null;if(X)try{J=JSON.parse(X)}catch{J=null}let U={...J?.dependencies??{},...J?.devDependencies??{}};if(A||Object.keys(U).some((Q)=>Q==="stacks"||Q.startsWith("@stacksjs/")))return{command:A?"./buddy dev":"bun run dev",env:{STACKS_PROXY_MANAGED:"1"},urlEnv:["APP_URL"],routes:[{path:"/",portEnv:"PORT",defaultPort:3000,readyGate:!0},{path:"/api",portEnv:"PORT_API",defaultPort:3008,stripPrefix:!1,readyGate:!1},{path:"/docs",portEnv:"PORT_DOCS",defaultPort:3006,stripPrefix:!0,readyGate:!1}]};if(J?.scripts?.dev)return{command:"bun run dev",routes:[{path:"/",portEnv:"PORT",defaultPort:3000,readyGate:!0}]};return null}function cF(w,$={}){let Y={dirExists:$.dirExists??EU.dirExists,fileExists:$.fileExists??EU.fileExists,readText:$.readText??EU.readText},A=$.detect??uF,X=$.homeDir??X9(),J=w.tlds??U9,U=(w.roots??J9).map((G)=>TU(G,X)),W=w.idleTimeoutMs??hF,Q=new Map;for(let G of w.sites??[])Q.set(G.to,G);let B=(G)=>G.idleTimeoutMs??W;function j(G){let K=lA(Q,G);if(!K)return null;let E=kF(K.dir)?K.dir:TU(K.dir,X),q=K.selfRegisters??!1,N=K.routes??[];if(!q&&N.length===0)N=A(E,Y)?.routes??[{path:"/",portEnv:"PORT",defaultPort:3000,readyGate:!0}];let f=A9({...K.env??{}},void 0,G);return{host:G,id:nA(G),dir:E,command:K.command,env:f,routes:N,selfRegisters:q,idleTimeoutMs:B(K),source:"config"}}function z(G){let K=xF(G,J);if(!K)return null;for(let E of U){let q=q1(E,K);if(!Y.dirExists(q))continue;let N=A(q,Y);if(!N)continue;let f=N.selfRegisters??!1;return{host:G,id:nA(G),dir:q,command:N.command,env:A9({...N.env??{}},N.urlEnv,G),routes:f?[]:N.routes??[],selfRegisters:f,idleTimeoutMs:W,source:"discovered"}}return null}return{resolve(G){let K=DF(G);if(!K)return null;return j(K)??z(K)}}}function vF(w){try{return _F(w,{withFileTypes:!0}).filter(($)=>$.isDirectory()).map(($)=>$.name)}catch{return[]}}function Q9(w,$={}){let Y=$.homeDir??X9(),A=w.tlds??U9,X=(w.roots??J9).map((z)=>TU(z,Y)),J=$.readdir??vF,U=cF(w,$),W=[],Q=new Set,B=(z)=>{if(z&&!Q.has(z.host))Q.add(z.host),W.push(z)};for(let z of w.sites??[])if(!z.to.includes("*"))B(U.resolve(z.to));let j=A[0]??"localhost";for(let z of X)for(let G of J(z))B(U.resolve(`${G}.${j}`));return W}function A9(w,$,Y){if(!$)return w;let A=`https://${Y}`;for(let X of $)if(w[X]===void 0)w[X]=A;return w}lw();y8();S8();Z8();mY();h8();D8();DW();vW();vY();bY();r$();d8();XY();X0();import{spawn as D5}from"node:child_process";import*as u0 from"node:fs/promises";import{homedir as x5}from"node:os";import*as kw from"node:path";import*as C from"node:process";var $M=5000;function Aw(){return kw.join(x5(),".stacks","rpx")}function h$(w=Aw()){return kw.join(w,"daemon.pid")}async function k$(w=Aw()){try{let $=await u0.readFile(h$(w),"utf8"),Y=Number.parseInt($.trim(),10);if(!Number.isFinite(Y)||Y<=0)return null;return Y}catch($){if($.code==="ENOENT")return null;throw $}}async function o8(w=Aw()){let $=await k$(w);return $!==null&&b0($)}async function P5(w=Aw()){await u0.mkdir(w,{recursive:!0});let $=h$(w);while(!0){try{let A=await u0.open($,"wx");try{await A.write(`${C.pid}
335
- `)}finally{await A.close()}return $}catch(A){if(A.code!=="EEXIST")throw A}let Y=await k$(w);if(Y!==null&&b0(Y))throw Error(`rpx daemon already running (pid=${Y})`);await u0.unlink($).catch(()=>{})}}async function UY(w=Aw()){await u0.unlink(h$(w)).catch(()=>{})}var a8=new Map;function s8(w){for(let[$,Y]of a8)if(!w.has($))l$(Y),a8.delete($)}function YM(w,$){let Y=OW($??"localhost:1");if(w.upstreams.length!==Y.length)return!1;return w.upstreams.every((A,X)=>A.url===Y[X])}function b5(w){let $=w.cleanUrls??!1,Y=_w(w.path),A=r1(w.auth);if(w.static)return{static:cY(w.static,$),cleanUrls:$,basePath:Y,auth:A};let X=w.from??"localhost:1",J=O$(X),U=new URL(J.startsWith("http")?J:`http://${J}`),W=a8.get(w.id);if(W&&!YM(W,X))l$(W),W=void 0;if(!W)W=n1(X,w.loadBalancer),p1(W),a8.set(w.id,W);return{sourceHost:U.host,upstreamPool:W,cleanUrls:$,changeOrigin:w.changeOrigin??!1,pathRewrites:w.pathRewrites,basePath:Y,auth:A}}function AM(w){return w.find((Y)=>!/^api\./.test(Y)&&!/^docs\./.test(Y)&&!/^dashboard\./.test(Y))??w[0]??"rpx.localhost"}async function t8(w,$,Y=[],A=!1){let X=await Sw($,w.verbose),J=[...new Set([...X.map((j)=>j.to).filter(Boolean),...Y])],U=AM(J),W=[...new Set([U,...J,"rpx.localhost"])],Q=yW(J,U,w.verbose);if(typeof w.https==="object"&&typeof Q.https==="object")Q.https={...Q.https,...w.https};let B=await Q$(Q);if(B&&(A||!iX(V8,W)))F("daemon",`regenerating shared cert for host(s): ${W.join(", ")}`,w.verbose),C8(),B=null;if(!B)F("daemon","no usable cert on disk, generating one via tlsx",w.verbose),await l1({...Q,forceRegenerate:!0}),B=await Q$(Q);if(!B)throw Error("failed to bootstrap TLS for rpx daemon");return B}async function XM(w,$,Y,A){let X=C.env.SUDO_PASSWORD,J=C.env.HOME??x5(),U=[C.execPath,...C.argv.slice(1)],W=[`HOME=${J}`,`PATH=${C.env.PATH??""}`];if(A)W.push("RPX_VERBOSE=1");for(let[E,q]of Object.entries(C.env))if(q!==void 0&&E!=="RPX_VERBOSE"&&/^(?:RPX_|STACKS_RPX_)/.test(E))W.push(`${E}=${q}`);let Q=X?["-S","-p","","env",...W,...U]:["-n","env",...W,...U];F("daemon",`elevating daemon via sudo for privileged ports ${$}/${Y}`,A);let B=D5("sudo",Q,{detached:!0,stdio:["pipe","ignore","ignore"]}),j=null,z=null;if(B.once("error",(E)=>{j=E}),B.once("exit",(E)=>{z=E??0}),X&&B.stdin)B.stdin.write(`${X}
336
- `),B.stdin.end();B.unref();let G=h$(w),K=Date.now()+15000;while(Date.now()<K){if(j)throw j;let E=await k$(w);if(E!==null&&b0(E)){if(A)H.success(`rpx daemon elevated to root (pid=${E}, https on :${$})`);return{httpsPort:$,httpPort:Y,pidPath:G,done:Promise.resolve(),stop:async()=>{try{C.kill(E,"SIGTERM")}catch{}},ensureCert:()=>Promise.resolve(!1),listSites:()=>[]}}if(z!==null&&z!==0)throw Error(`rpx daemon could not elevate to bind :${$} (sudo exited ${z}). Set SUDO_PASSWORD in .env or run \`sudo -v\` first.`);await new Promise((q)=>setTimeout(q,50))}throw Error(`rpx daemon failed to elevate within 15000ms (rpxDir=${w})`)}var Z5=!1;function AB(){if(Z5)return;Z5=!0,C.on("uncaughtException",(w)=>{H.error(`rpx daemon: uncaught exception (continuing): ${w?.stack??w}`)}),C.on("unhandledRejection",(w)=>{H.error(`rpx daemon: unhandled rejection (continuing): ${w}`)})}function u5(w,$,Y){let A;try{A=new URL(w.url)}catch{return new Response("Bad Request",{status:400})}let X=(w.headers.get("host")??A.hostname).split(":")[0];if(A.pathname.startsWith("/.well-known/acme-challenge/")){if($){let J=$.challengeStore.handlePath(A.pathname);if(J!==void 0)return new Response(J,{status:200,headers:{"content-type":"text/plain"}})}if(Y){let J=iY(Y,A.pathname);if(J!=null)return new Response(J,{status:200,headers:{"content-type":"text/plain"}})}if($)return new Response("challenge not found",{status:404})}if($&&!$.hasCert(X))$.ensureCert(X).catch(()=>{});return new Response(null,{status:301,headers:{Location:`https://${X}${A.pathname}${A.search}`}})}async function c5(w={}){AB();let $=w.verbose??!1,Y=w.rpxDir??Aw(),A=w.registryDir??kw.join(Y,"registry.d"),X=w.httpsPort??443,J=w.httpPort??80,U=w.hostname??"0.0.0.0",W=w.gcIntervalMs??$M;if(C.env.RPX_DAEMON_WORKER==="1")return QM({rpxDir:C.env.RPX_WORKER_RPXDIR??Y,registryDir:C.env.RPX_WORKER_REGISTRYDIR??A,httpsPort:Number.parseInt(C.env.RPX_WORKER_HTTPSPORT??"",10)||X,hostname:C.env.RPX_WORKER_HOSTNAME??U,verbose:C.env.RPX_WORKER_VERBOSE==="1"||$});let Q=X>0&&X<1024||J>0&&J<1024,B=typeof C.getuid==="function"&&C.getuid()===0;if(C.platform!=="win32"&&Q&&!B)return XM(Y,X,J,$);let j=Math.max(1,w.workers??(Number.parseInt(C.env.RPX_WORKERS??"",10)||1));if(j>1){if(w.onDemandSites?.enabled)H.warn("rpx: on-demand sites are not supported in cluster mode (workers > 1); ignoring");return WM(w,{rpxDir:Y,registryDir:A,httpsPort:X,httpPort:J,hostname:U,verbose:$,gcIntervalMs:W,workers:j})}let z=await P5(Y),G=new Map,K=(I,k)=>o1(G,I,k);function E(I){G=s1(I.map((Ow)=>({host:Ow.to,path:Ow.path,route:b5(Ow)}))),s8(new Set(I.map((Ow)=>Ow.id)));let k=Array.from(G.keys());F("daemon",`routing table now covers ${k.length} host(s): ${k.join(", ")||"<empty>"}`,$)}await $Y(A,$).catch((I)=>{F("daemon",`initial gc failed: ${I}`,$)}),await AY({verbose:$}).catch((I)=>{F("daemon",`stale hosts GC on start failed: ${I}`,$)});let q=await Sw(A,$);E(q),await z$({rpxDir:Y,verbose:$}).catch((I)=>{F("daemon",`DNS reconcile on start failed: ${I}`,$)}),await a$(q,{rpxDir:Y,verbose:$,ownerPid:C.pid}).catch((I)=>{F("daemon",`DNS setup on start failed: ${I}`,$)});let N=[];if(w.productionCerts){if(N=await e1(w.productionCerts,$),$&&N.length>0)H.info(`SNI: serving ${N.length} real cert(s): ${N.map((I)=>I.serverName).join(", ")}`)}let f=new Set,R=null,y;if(w.onDemandSites?.enabled){if(R=new v8({resolver:hW(w.onDemandSites),registryDir:A,rpxDir:Y,verbose:$,startupTimeoutMs:w.onDemandSites.startupTimeoutMs,isHostRoutable:(I)=>k8(G,I)!==void 0,onSiteActivating:(I)=>{Cw(I)}}),y=async(I)=>{let k=await R.onRequest(I);switch(k.kind){case"ready":return{retry:!0};case"starting":return iW({host:k.host,sinceMs:k.sinceMs,logTail:k.logTail});case"failed":return mW({host:k.host,error:k.error,logTail:k.logTail});case"unknown":default:return}},$)H.info("rpx: on-demand sites enabled")}let V=t1(K,$,y),T=a1($),M=null;if(N.length===0)M=await t8(w,A);let O=w.onDemandTls,S=O?.enabled?new p$({config:O,certsDir:O.certsDir??w.productionCerts?.certsDir??kw.join(Y,"on-demand-certs"),initial:N,verbose:$,onCertAdded:(I)=>{bw(I)}}):null;function B0(I){if(I.length>0)return I.map((k)=>({serverName:k.serverName,cert:k.cert,key:k.key}));return{key:M.key,cert:M.cert,ca:M.ca,requestCert:!1,rejectUnauthorized:!1}}function a0(I){return Bun.serve({port:X,hostname:U,reusePort:m1(),tls:B0(I),fetch(k,Ow){return V(k,Ow)},websocket:T,error(k){return F("daemon",`https server error: ${k}`,$),new Response(`Server Error: ${k.message}`,{status:500})}})}let Kw=(I)=>[...new Set(I.map((k)=>k.to).filter(Boolean))],D$=(I)=>{if(!M)return N;return CW([...Kw(I),...f,"rpx.localhost"],M)},xw=a0(S?S.sniEntries():N.length>0?N:D$(q)),Pw=null,Fw=!1;async function bw(I){if(yw)return;if(Pw=I,Fw)return;Fw=!0;try{while(!yw&&Pw){let k=Pw;Pw=null,F("daemon",`rebuilding :443 with ${k.length} SNI cert(s)`,$),xw.stop(!1);let Ow,GJ=!1,NB=60,W6=500;for(let KJ=0;!yw&&!GJ;KJ++)try{xw=a0(k),GJ=!0;break}catch(B6){if(Ow=B6,KJ>=NB)break;await new Promise((j6)=>setTimeout(j6,Math.min(25*2**Math.min(KJ,4),W6)))}if(!GJ)H.error(`rpx: CRITICAL — could not rebind :443 after ${NB} attempts issuing cert; HTTPS unbound until the next cert event or a gateway restart: ${Ow?.message}`)}}finally{Fw=!1}}let s0=null;if(J>0)s0=Bun.serve({port:J,hostname:U,fetch(I){return u5(I,S,w.acmeChallengeWebroot)},error(){return new Response("Bad Request",{status:400})}});if($)H.success(`rpx daemon listening on https://${U}:${X}${s0?` (http→https on :${J})`:""}`),H.info(`pid file: ${z}`),H.info(`registry: ${A}`);async function Z(I){if(yw||N.length>0||S||!M)return;try{M=await t8(w,A,[...f]),await bw(D$(I))}catch(k){F("daemon",`TLS sync on registry change failed: ${k}`,$)}}async function Cw(I){if(yw||N.length>0||S||!M||!I)return;if(f.has(I))return;f.add(I);try{M=await t8(w,A,[...f],!0);let k=await Sw(A,$);await bw(D$(k))}catch(k){F("daemon",`dev cert refresh for ${I} failed: ${k}`,$)}}let WY=nY((I)=>{E(I),Z(I),a$(I,{rpxDir:Y,verbose:$,ownerPid:C.pid}).catch((k)=>{F("daemon",`DNS sync on registry change failed: ${k}`,$)})},{dir:A,verbose:$}),o$=setInterval(()=>{$Y(A,$).then((I)=>{if(I>0)F("daemon",`gc reaped ${I} stale entries`,$)}).catch((I)=>{F("daemon",`periodic gc failed: ${I}`,$)}),AY({verbose:$}).then((I)=>{if(I.length>0)F("daemon",`gc reaped stale hosts entries: ${I.join(", ")}`,$)}).catch((I)=>{F("daemon",`periodic hosts gc failed: ${I}`,$)})},W);if(typeof o$.unref==="function")o$.unref();let yw=!1,BY,e$=new Promise((I)=>{BY=I});async function zJ(){if(yw)return e$;if(yw=!0,clearInterval(o$),WY.close(),await R?.stopAll().catch((I)=>{F("daemon",`site supervisor stopAll failed: ${I}`,$)}),xw.stop(!1),s0?.stop(!1),await S$({rpxDir:Y,verbose:$}).catch((I)=>{F("daemon",`DNS teardown failed: ${I}`,$)}),s8(new Set),await UY(Y),$)H.info("rpx daemon stopped");return BY(),e$}let qB=(I)=>{F("daemon",`received ${I}, shutting down`,$),zJ().catch(()=>{})};return C.once("SIGINT",qB),C.once("SIGTERM",qB),{stop:zJ,done:e$,httpsPort:typeof xw.port==="number"?xw.port:X,httpPort:s0&&typeof s0.port==="number"?s0.port:J,pidPath:z,ensureCert:(I)=>S?S.ensureCert(I):Promise.resolve(!1),listSites:()=>R?.list()??[]}}function XB(w){return kw.join(w,"cluster-sni.json")}async function k5(w,$,Y){let A=XB(w),X=`${A}.${C.pid}.tmp`;await u0.writeFile(X,JSON.stringify({sni:$,dev:Y}),"utf8"),await u0.rename(X,A)}async function h5(w){try{return JSON.parse(await u0.readFile(XB(w),"utf8"))}catch{return{sni:[],dev:null}}}function JM(w){if(w.sni.length>0)return w.sni.map(($)=>({serverName:$.serverName,cert:$.cert,key:$.key}));if(w.dev)return{key:w.dev.key,cert:w.dev.cert,ca:w.dev.ca,requestCert:!1,rejectUnauthorized:!1};return}function UM(){let w=C.execPath,$=C.env.RPX_WORKER_BIN;if($)return[w,$,"daemon:start"];let Y=kw.basename(w).toLowerCase();if((Y==="bun"||Y==="node"||Y.startsWith("bun-"))&&C.argv[1])return[w,C.argv[1],"daemon:start"];return[w,"daemon:start"]}async function QM(w){AB();let{rpxDir:$,registryDir:Y,httpsPort:A,hostname:X,verbose:J}=w,U=new Map,W=(T,M)=>o1(U,T,M),Q=(T)=>{U=s1(T.map((M)=>({host:M.to,path:M.path,route:b5(M)}))),s8(new Set(T.map((M)=>M.id)))};Q(await Sw(Y,J));let B=t1(W,J),j=a1(J),z=!1,G=(T)=>Bun.serve({port:A,hostname:X,reusePort:!0,tls:JM(T),fetch(M,O){return B(M,O)},websocket:j,error(M){return F("daemon",`worker https error: ${M}`,J),new Response(`Server Error: ${M.message}`,{status:500})}}),K=G(await h5($));async function E(){if(z)return;let T=await h5($),M=null;for(let S=0;S<20&&!z;S++)try{M=G(T);break}catch{await new Promise((B0)=>setTimeout(B0,25))}if(!M){F("daemon","worker reloadTls: could not bind new listener; keeping current",J);return}let O=K;K=M,O.stop(!1)}let q=nY((T)=>Q(T),{dir:Y,verbose:J}),N=()=>{E().catch(()=>{})};C.on("SIGHUP",N);let f,R=new Promise((T)=>{f=T});async function y(){if(z)return R;return z=!0,C.off("SIGHUP",N),q.close(),K.stop(!1),s8(new Set),f(),R}let V=()=>{y().then(()=>C.exit(0)).catch(()=>C.exit(0))};if(C.once("SIGTERM",V),C.once("SIGINT",V),J)H.success(`rpx worker (pid ${C.pid}) serving :${A}`);return{stop:y,done:R,httpsPort:typeof K.port==="number"?K.port:A,httpPort:0,pidPath:"",ensureCert:()=>Promise.resolve(!1),listSites:()=>[]}}async function WM(w,$){AB();let{rpxDir:Y,registryDir:A,httpsPort:X,httpPort:J,hostname:U,verbose:W,gcIntervalMs:Q,workers:B}=$,j=await P5(Y),z=[];if(w.productionCerts)z=await e1(w.productionCerts,W);let G=null;if(z.length===0)G=await t8(w,A);let K=G?{key:G.key,cert:G.cert,ca:Array.isArray(G.ca)?G.ca.join(`
337
- `):G.ca}:null,E=!1,q=[];function N(Z){for(let Cw of q)try{Cw.kill(Z)}catch{}}async function f(Z){await k5(Y,Z,K),N("SIGHUP")}let R=w.onDemandTls,y=R?.enabled?new p$({config:R,certsDir:R.certsDir??w.productionCerts?.certsDir??kw.join(Y,"on-demand-certs"),initial:z,verbose:W,onCertAdded:(Z)=>{f(Z)}}):null;await k5(Y,y?y.sniEntries():z,K);let V=await Sw(A,W);await z$({rpxDir:Y,verbose:W}).catch((Z)=>{F("daemon",`DNS reconcile on start failed: ${Z}`,W)}),await a$(V,{rpxDir:Y,verbose:W,ownerPid:C.pid}).catch((Z)=>{F("daemon",`DNS setup on start failed: ${Z}`,W)}),await $Y(A,W).catch(()=>{}),await AY({verbose:W}).catch(()=>{});let T=nY((Z)=>{a$(Z,{rpxDir:Y,verbose:W,ownerPid:C.pid}).catch((Cw)=>{F("daemon",`DNS sync on registry change failed: ${Cw}`,W)})},{dir:A,verbose:W}),M=setInterval(()=>{$Y(A,W).catch(()=>{}),AY({verbose:W}).catch(()=>{})},Q);M.unref?.();let O=null;if(J>0)O=Bun.serve({port:J,hostname:U,fetch(Z){return u5(Z,y,w.acmeChallengeWebroot)},error(){return new Response("Bad Request",{status:400})}});let S=10,B0=60000,a0=30000,Kw=0,D$=Date.now();function xw(){if(E)return;let Z={...C.env,RPX_DAEMON_WORKER:"1",RPX_WORKERS:"1",RPX_WORKER_RPXDIR:Y,RPX_WORKER_REGISTRYDIR:A,RPX_WORKER_HTTPSPORT:String(X),RPX_WORKER_HOSTNAME:U,RPX_WORKER_VERBOSE:W?"1":"0"},Cw=Bun.spawn(UM(),{env:Z,stdout:"inherit",stderr:"inherit",stdin:"ignore",onExit(WY,o$){if(E)return;let yw=q.indexOf(WY);if(yw!==-1)q.splice(yw,1);let BY=Date.now();if(BY-D$>B0)D$=BY,Kw=0;if(Kw++,Kw>S){H.error(`rpx: worker keeps exiting (code ${o$}); giving up after ${S} restarts in ${Math.round(B0/1000)}s`);return}let e$=Math.min(a0,100*2**Math.min(Kw,8));F("daemon",`worker exited (code ${o$}); respawning in ${e$}ms (restart ${Kw}/${S})`,W),setTimeout(xw,e$).unref?.()}});q.push(Cw)}for(let Z=0;Z<B;Z++)xw();if(W)H.success(`rpx coordinator listening on https://${U}:${X} via ${B} worker(s)${O?` (http→https on :${J})`:""}`),H.info(`pid file: ${j}`);let Pw,Fw=new Promise((Z)=>{Pw=Z});async function bw(){if(E)return Fw;if(E=!0,clearInterval(M),T.close(),O?.stop(!1),N("SIGTERM"),await Promise.race([Promise.all(q.map((Z)=>Z.exited)),new Promise((Z)=>setTimeout(Z,3000))]),N("SIGKILL"),await S$({rpxDir:Y,verbose:W}).catch((Z)=>{F("daemon",`DNS teardown failed: ${Z}`,W)}),await UY(Y),await u0.unlink(XB(Y)).catch(()=>{}),W)H.info("rpx coordinator stopped");return Pw(),Fw}let s0=(Z)=>{F("daemon",`coordinator received ${Z}, shutting down`,W),bw().catch(()=>{})};return C.once("SIGINT",s0),C.once("SIGTERM",s0),{stop:bw,done:Fw,httpsPort:X,httpPort:J,pidPath:j,ensureCert:(Z)=>y?y.ensureCert(Z):Promise.resolve(!1),listSites:()=>[]}}function BM(){let w=C.execPath,$=kw.basename(w).toLowerCase();if(($==="bun"||$==="node"||$.startsWith("bun-"))&&C.argv[1])return[w,C.argv[1],"daemon:start"];return[w,"daemon:start"]}async function v5(w={}){let $=w.rpxDir??Aw(),Y=w.verbose??!1;await z$({rpxDir:$,verbose:Y}).catch((j)=>{F("daemon",`DNS reconcile before ensureDaemonRunning: ${j}`,Y)});let A=await k$($);if(A!==null&&b0(A))return F("daemon",`ensureDaemonRunning: already running pid=${A}`,Y),{pid:A,spawned:!1};if(A!==null)F("daemon",`ensureDaemonRunning: clearing stale pid=${A}`,Y),await UY($);await u0.mkdir($,{recursive:!0});let X=w.spawnCommand??BM();if(X.length===0)throw Error("ensureDaemonRunning: spawnCommand is empty");F("daemon",`spawning daemon: ${X.join(" ")}`,Y);let J=D5(X[0],X.slice(1),{detached:!0,stdio:"ignore",cwd:w.spawnCwd??C.cwd(),env:w.spawnEnv?{...C.env,...w.spawnEnv}:C.env});J.unref();let U=null;J.once("error",(j)=>{U=j});let W=w.startupTimeoutMs??5000,Q=w.pollIntervalMs??50,B=Date.now()+W;while(Date.now()<B){if(U)throw U;let j=await k$($);if(j!==null&&b0(j))return F("daemon",`daemon registered with pid=${j}`,Y),{pid:j,spawned:!0};await new Promise((z)=>setTimeout(z,Q))}if(U)throw U;throw Error(`rpx daemon failed to start within ${W}ms (rpxDir=${$})`)}async function i5(w={}){let $=w.rpxDir??Aw(),Y=w.verbose??!1,A=w.timeoutMs??5000,X=w.pollIntervalMs??50,J=w.forceAfterTimeout??!0,U=await k$($);if(U===null||!b0(U)){if(U!==null)await UY($);return await z$({rpxDir:$,verbose:Y}).catch(()=>{}),{stopped:!1,pid:U,forced:!1}}try{C.kill(U,"SIGTERM")}catch(Q){let B=Q.code;if(B==="ESRCH")return await UY($),{stopped:!1,pid:U,forced:!1};if(B==="EPERM")U$(`kill -TERM ${U}`);else throw Q}let W=Date.now()+A;while(Date.now()<W){if(!b0(U))return F("daemon",`daemon pid=${U} stopped cleanly`,Y),{stopped:!0,pid:U,forced:!1};await new Promise((Q)=>setTimeout(Q,X))}if(!J)throw Error(`rpx daemon (pid=${U}) did not exit within ${A}ms`);F("daemon",`daemon pid=${U} did not exit, escalating to SIGKILL`,Y);try{C.kill(U,"SIGKILL")}catch(Q){let B=Q.code;if(B==="EPERM")U$(`kill -KILL ${U}`);else if(B!=="ESRCH")throw Q}return await UY($),await S$({rpxDir:$,verbose:Y}).catch((Q)=>{F("daemon",`DNS teardown after SIGKILL: ${Q}`,Y)}),{stopped:!0,pid:U,forced:!0}}async function m5(w={}){let $=w.rpxDir??Aw();if(await o8($))return;await z$({rpxDir:$,verbose:w.verbose})}lw();X0();import{spawn as jM}from"node:child_process";import*as e8 from"node:process";class g5{processes=new Map;isShuttingDown=!1;async startProcess(w,$,Y){if(this.processes.has(w)){F("start",`Process ${w} is already running`,Y);return}let[A,...X]=$.command.split(" "),J=$.cwd||e8.cwd();F("start",`Starting process ${w}:`,Y),F("start",` Command: ${A} ${X.join(" ")}`,Y),F("start",` Working directory: ${J}`,Y),F("start",` Environment variables: ${Iw($.env)}`,Y);let U=jM(A,X,{cwd:J,env:{...e8.env,...$.env},shell:!0,stdio:"inherit"});return this.processes.set(w,{command:$.command,cwd:J,process:U,env:$.env}),new Promise((W,Q)=>{if(U.on("error",(B)=>{if(!this.isShuttingDown)F("start",`Process ${w} failed to start: ${B}`,Y),this.processes.delete(w),Q(B)}),U.on("exit",(B)=>{if(!this.isShuttingDown&&B!==null&&B!==0)F("start",`Process ${w} exited with code ${B}; leaving the proxy running`,Y),this.processes.delete(w),Q(Error(`Process ${w} exited with code ${B}`))}),Y)U.stdout?.on("data",(B)=>{F("process",`[${w}] ${B.toString().trim()}`,!0)}),U.stderr?.on("data",(B)=>{F("process",`[${w}] ERR: ${B.toString().trim()}`,!0)});setTimeout(()=>{if(!this.isShuttingDown&&U.killed)this.processes.delete(w),Q(Error(`Process ${w} was killed during startup`));else F("start",`Process ${w} started successfully`,Y),W()},1000)})}async stopProcess(w,$){let Y=this.processes.get(w);if(!Y?.process){F("start",`No process found for ${w}`,$);return}return F("start",`Stopping process ${w}`,$),new Promise((A)=>{if(!Y.process){A();return}Y.process.once("exit",()=>{this.processes.delete(w),F("start",`Process ${w} stopped`,$),A()});try{Y.process.kill("SIGTERM"),setTimeout(()=>{if(Y.process){F("start",`Force killing process ${w}`,$);try{Y.process.kill("SIGKILL")}catch(X){}}},3000)}catch(X){F("start",`Error stopping process ${w}: ${X}`,$),this.processes.delete(w),A()}})}async stopAll(w){if(this.isShuttingDown){F("start","Already shutting down, skipping duplicate stopAll call",w);return}this.isShuttingDown=!0,F("start","Stopping all processes",w);let $=Array.from(this.processes.keys()).map((Y)=>this.stopProcess(Y,w).catch((A)=>{H.error(`Failed to stop process ${Y}:`,A)}));await Promise.allSettled($),this.processes.clear(),this.isShuttingDown=!1}isRunning(w){let $=this.processes.get(w);return!!$?.process&&!$.process.killed}}var wJ=new g5;X0();import*as r0 from"node:fs/promises";import{homedir as zM}from"node:os";import*as JB from"node:path";import*as UB from"node:process";var GM=/^[a-zA-Z0-9._-]+$/;function s$(){return JB.join(zM(),".stacks","rpx","registry.d")}function QY(w){return typeof w==="string"&&w.length>0&&w.length<=128&&GM.test(w)}function QB(w,$){if(!QY($))throw Error(`invalid registry id: ${JSON.stringify($)}`);return JB.join(w,`${$}.json`)}function d5(w){if(!w||typeof w!=="object")return!1;let $=w,Y=$.pid===void 0||typeof $.pid==="number"&&Number.isInteger($.pid)&&$.pid>0,A=typeof $.from==="string"&&$.from.length>0||Array.isArray($.from)&&$.from.length>0,X=typeof $.static==="string"||!!$.static&&typeof $.static==="object"&&typeof $.static.dir==="string",J=$.path===void 0||typeof $.path==="string";return typeof $.id==="string"&&QY($.id)&&(A||X)&&typeof $.to==="string"&&$.to.length>0&&J&&Y&&typeof $.createdAt==="string"}async function KM(w){await r0.mkdir(w,{recursive:!0})}async function l5(w,$=s$(),Y){if(!d5(w))throw Error(`invalid registry entry: ${JSON.stringify(w)}`);await KM($);let A=QB($,w.id),X=`${A}.tmp.${UB.pid}.${Date.now()}`,J=JSON.stringify(w,null,2);try{await r0.writeFile(X,J,{encoding:"utf8",mode:420}),await r0.rename(X,A),F("registry",`wrote entry ${w.id} → ${A}`,Y)}catch(U){throw await r0.unlink(X).catch(()=>{}),U}}async function n5(w,$=s$(),Y){let A=QB($,w);try{await r0.unlink(A),F("registry",`removed entry ${w}`,Y)}catch(X){if(X.code!=="ENOENT")throw X}}async function WB(w,$=s$(),Y){let A=QB($,w);try{let X=await r0.readFile(A,"utf8"),J=JSON.parse(X);if(!d5(J))return F("registry",`entry ${w} failed validation, removing`,Y),await r0.unlink(A).catch(()=>{}),null;return J}catch(X){if(X.code==="ENOENT")return null;if(X instanceof SyntaxError)return F("registry",`entry ${w} has invalid JSON, removing`,Y),await r0.unlink(A).catch(()=>{}),null;throw X}}async function BB(w=s$(),$){let Y;try{Y=await r0.readdir(w)}catch(X){if(X.code==="ENOENT")return[];throw X}let A=[];for(let X of Y){if(!X.endsWith(".json"))continue;let J=X.slice(0,-5);if(!QY(J))continue;let U=await WB(J,w,$);if(U)A.push(U)}return A}lw();import{execSync as HM}from"node:child_process";import*as BJ from"node:http";import*as s5 from"node:net";import*as o5 from"node:os";import*as e5 from"node:path";import*as J0 from"node:process";var $J=(w,$)=>(Y)=>`\x1B[${w}m${Y}\x1B[${$}m`,hw={bold:$J(1,22),dim:$J(2,22),green:$J(32,39),cyan:$J(36,39)};_Q();nW();lw();r$();X0();import*as p5 from"node:fs";import*as r5 from"node:path";import*as Dw from"node:process";function FM(w,$){let A=($&&$!=="/"?`${w}${$}`:w).replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,128);return A.length>0?A:"rpx"}async function jB(w){if(w.proxies.length===0)throw Error("runViaDaemon: no proxies provided");let $=w.verbose??!1,Y=w.registryDir,A=new Set,X=w.proxies.map((G)=>{let K=G.id??FM(G.to,G.path);if(!dY(K))throw Error(`invalid registry id "${K}" derived from to="${G.to}"`);if(A.has(K))throw Error(`duplicate registry id "${K}" — set an explicit \`id\` on one of the proxies`);return A.add(K),{...G,id:K}}),J=new Date().toISOString();for(let G of X)await c8({id:G.id,from:G.from,to:G.to,path:G.path,pid:w.persistent?void 0:Dw.pid,cwd:Dw.cwd(),createdAt:J,cleanUrls:G.cleanUrls,changeOrigin:G.changeOrigin,pathRewrites:G.pathRewrites,static:G.static,loadBalancer:G.loadBalancer},Y,$);let U=await F5({rpxDir:w.rpxDir,verbose:$,spawnCommand:w.spawnCommand,startupTimeoutMs:w.startupTimeoutMs,spawnEnv:w.spawnEnv});for(let G of X){let K=G.static?`static ${typeof G.static==="string"?G.static:G.static.dir}`:G.from;H.success(`https://${G.to} → ${K}`)}if(H.info(`(via rpx daemon pid=${U.pid}; \`rpx daemon:status\` to inspect)`),w.detached)return;let W=!1,Q=Y??Zw(),B=X.map((G)=>G.id),j=async()=>{if(W)return;W=!0;for(let G of B)await lY(G,Y,$).catch((K)=>{F("runner",`removeEntry(${G}) failed: ${K}`,$)})},z=(G)=>{F("runner",`received ${G}, unregistering ${B.length} entries`,$),j().finally(()=>Dw.exit(0))};Dw.once("SIGINT",z),Dw.once("SIGTERM",z),Dw.once("exit",()=>{if(W)return;for(let G of B)try{p5.unlinkSync(r5.join(Q,`${G}.json`))}catch{}}),await new Promise(()=>{})}d8();y8();PW();lw();X0();import{spawn as qM}from"node:child_process";import*as YJ from"node:process";class AJ{processes=new Map;isShuttingDown=!1;async startProcess(w,$,Y){if(this.processes.has(w)){F("start",`Process ${w} is already running`,Y);return}let[A,...X]=$.command.split(" "),J=$.cwd||YJ.cwd();F("start",`Starting process ${w}:`,Y),F("start",` Command: ${A} ${X.join(" ")}`,Y),F("start",` Working directory: ${J}`,Y),F("start",` Environment variables: ${Iw($.env)}`,Y);let U=qM(A,X,{cwd:J,env:{...YJ.env,...$.env},shell:!0,stdio:"inherit"});return this.processes.set(w,{command:$.command,cwd:J,process:U,env:$.env}),new Promise((W,Q)=>{if(U.on("error",(B)=>{if(!this.isShuttingDown)F("start",`Process ${w} failed to start: ${B}`,Y),this.processes.delete(w),Q(B)}),U.on("exit",(B)=>{if(!this.isShuttingDown&&B!==null&&B!==0)F("start",`Process ${w} exited with code ${B}; leaving the proxy running`,Y),this.processes.delete(w),Q(Error(`Process ${w} exited with code ${B}`))}),Y)U.stdout?.on("data",(B)=>{F("process",`[${w}] ${B.toString().trim()}`,!0)}),U.stderr?.on("data",(B)=>{F("process",`[${w}] ERR: ${B.toString().trim()}`,!0)});setTimeout(()=>{if(!this.isShuttingDown&&U.killed)this.processes.delete(w),Q(Error(`Process ${w} was killed during startup`));else F("start",`Process ${w} started successfully`,Y),W()},1000)})}async stopProcess(w,$){let Y=this.processes.get(w);if(!Y?.process){F("start",`No process found for ${w}`,$);return}return F("start",`Stopping process ${w}`,$),new Promise((A)=>{if(!Y.process){A();return}Y.process.once("exit",()=>{this.processes.delete(w),F("start",`Process ${w} stopped`,$),A()});try{Y.process.kill("SIGTERM"),setTimeout(()=>{if(Y.process){F("start",`Force killing process ${w}`,$);try{Y.process.kill("SIGKILL")}catch(X){}}},3000)}catch(X){F("start",`Error stopping process ${w}: ${X}`,$),this.processes.delete(w),A()}})}async stopAll(w){if(this.isShuttingDown){F("start","Already shutting down, skipping duplicate stopAll call",w);return}this.isShuttingDown=!0,F("start","Stopping all processes",w);let $=Array.from(this.processes.keys()).map((Y)=>this.stopProcess(Y,w).catch((A)=>{H.error(`Failed to stop process ${Y}:`,A)}));await Promise.allSettled($),this.processes.clear(),this.isShuttingDown=!1}isRunning(w){let $=this.processes.get(w);return!!$?.process&&!$.process.killed}}var GS=new AJ;import{timingSafeEqual as NM}from"node:crypto";function EM(w,$){if(w==null)return!1;let Y=Buffer.from(w),A=Buffer.from($);if(Y.length!==A.length)return!1;return NM(Y,A)}function XJ(w){return w.toLowerCase().replace(/\.$/,"")}var TM=["/.well-known/acme-challenge/"];function fM(w){let $=w.headers.get("host");if($)return XJ($.split(":")[0]);try{return XJ(new URL(w.url).hostname)}catch{return""}}function t5(w){let $=w.header.toLowerCase(),Y=new Set,A=[];for(let Q of w.hosts){let B=XJ(Q);if(B.startsWith("*."))A.push(B);else Y.add(B)}let X=w.exemptPaths??TM,J=w.forbiddenMessage??`Forbidden: direct origin access is not allowed; requests must arrive via the CDN.
338
- `,U=(Q)=>{let B=XJ(Q);return Y.has(B)||A.some((j)=>TY(B,j))},W=(Q)=>{let B=fM(Q);if(!U(B))return;let j="/";try{j=new URL(Q.url).pathname}catch{}if(X.some((z)=>j.startsWith(z)))return;if(EM(Q.headers.get($),w.value))return;return new Response(J,{status:403,headers:{"content-type":"text/plain"}})};return W.protects=U,W}S8();Z8();bY();mY();h8();D8();vY();X0();var UJ=new AJ,RM="0.12.0",MM=new P8("0.0.0.0"),wA=new Set,WJ=new Set,zB=!1,JJ=null,GB=null;async function jJ(w){if(zB)return F("cleanup","Cleanup already in progress, skipping",w?.verbose),GB||Promise.resolve();zB=!0,F("cleanup","Starting cleanup process",w?.verbose),GB=new Promise(($)=>{JJ=$});try{await UJ.stopAll(w?.verbose),H.info("Shutting down proxy servers...");let $=[],Y=Array.from(wA).map((A)=>new Promise((X)=>{let J=A;try{if(typeof J.stop==="function")J.stop(!0),F("cleanup","Bun server stopped",w?.verbose),X();else if(typeof J.close==="function")J.close(()=>{F("cleanup","Server closed successfully",w?.verbose),X()});else X()}catch(U){F("cleanup",`Error stopping server: ${U}`,w?.verbose),X()}}));$.push(...Y),wA.clear();for(let A of WJ)l$(A);if(WJ.clear(),w?.hosts&&w.domains?.length){F("cleanup","Cleaning up hosts file entries",w?.verbose),F("cleanup",`Original domains for cleanup: ${JSON.stringify(w.domains)}`,w?.verbose);let A=w.domains.filter((X)=>{if(X==="test.local")return!0;return X!=="localhost"&&!X.startsWith("localhost.")&&X!=="127.0.0.1"});if(F("cleanup",`Filtered domains for cleanup: ${JSON.stringify(A)}`,w?.verbose),A.length>0)H.info("Cleaning up hosts file entries..."),$.push(z5(A,w?.verbose).then(()=>{F("cleanup",`Removed hosts entries for ${A.join(", ")}`,w?.verbose)}).catch((X)=>{F("cleanup",`Failed to remove hosts entries: ${X}`,w?.verbose),H.warn(`Failed to clean up hosts file entries for ${A.join(", ")}:`,X)}))}if(w?.certs&&w.domains?.length){F("cleanup","Cleaning up SSL certificates",w?.verbose),H.info("Cleaning up SSL certificates...");let A=w.domains.map(async(X)=>{try{await yG(X,w?.verbose),F("cleanup",`Removed certificates for ${X}`,w?.verbose)}catch(J){F("cleanup",`Failed to remove certificates for ${X}: ${J}`,w?.verbose),H.warn(`Failed to clean up certificates for ${X}:`,J)}});$.push(...A)}await Promise.allSettled($),F("cleanup","All cleanup tasks completed successfully",w?.verbose),H.success("All cleanup tasks completed successfully")}catch($){F("cleanup",`Error during cleanup: ${$}`,w?.verbose),H.error("Error during cleanup:",$)}finally{if(JJ)JJ();JJ=null,zB=!1;let $=w&&"vitePluginUsage"in w&&w.vitePluginUsage===!0;if(J0.env.NODE_ENV!=="test"&&J0.env.BUN_ENV!=="test"&&!$)J0.exit(0)}return GB}var KB=!1;function w6(w){if(KB){F("signal",`Received second ${w} signal, forcing exit`,!0),J0.exit(1);return}KB=!0,F("signal",`Received ${w} signal, initiating cleanup`,!0),jJ().catch(($)=>{F("signal",`Cleanup failed after ${w}: ${$}`,!0),J0.exit(1)}).finally(()=>{KB=!1})}J0.once("SIGINT",()=>w6("SIGINT"));J0.once("SIGTERM",()=>w6("SIGTERM"));J0.on("uncaughtException",(w)=>{H.error("Uncaught exception (continuing):",w)});J0.on("unhandledRejection",(w)=>{H.error("Unhandled rejection (continuing):",w)});async function $A(w,$,Y,A=5){F("connection",`Testing connection to ${w}:${$} (retries left: ${A})`,Y);let X=15000,J=Date.now();if(J0.env.RPX_BYPASS_CONNECTION_TEST==="true"){F("connection",`Bypassing connection test for ${w}:${$} due to RPX_BYPASS_CONNECTION_TEST flag`,Y);return}let U=()=>new Promise((W,Q)=>{let B=s5.connect({host:w,port:$,timeout:3000});B.once("connect",()=>{F("connection",`Successfully connected to ${w}:${$}`,Y),B.end(),W()}),B.once("timeout",()=>{F("connection",`Connection to ${w}:${$} timed out`,Y),B.destroy(),Q(Error("Connection timed out"))}),B.once("error",(j)=>{F("connection",`Failed to connect to ${w}:${$}: ${j}`,Y),B.destroy(),Q(j)})});try{await U()}catch(W){let Q=W;if(Date.now()-J>X){F("connection",`Connection test timed out after ${X}ms, but continuing anyway`,Y),H.warn(`Connection test to ${w}:${$} timed out, but RPX will try to proceed anyway.`);return}if(Q.code==="ECONNREFUSED"&&A>0)return F("connection",`Connection refused, server might be starting up. Retrying in 2 seconds... (${A} retries left)`,Y),await new Promise((j)=>setTimeout(j,2000)),$A(w,$,Y,A-1);if(A>0)try{F("connection",`Trying HTTP request to ${w}:${$}`,Y),await new Promise((j,z)=>{let G=BJ.request({hostname:w,port:$,path:"/",method:"HEAD",timeout:5000},(K)=>{F("connection",`Received HTTP response with status: ${K.statusCode}`,Y),j()});G.on("error",(K)=>z(K)),G.on("timeout",()=>{G.destroy(),z(Error("HTTP request timed out"))}),G.end()}),F("connection",`HTTP request to ${w}:${$} succeeded`,Y);return}catch(j){return F("connection",`HTTP request to ${w}:${$} failed: ${j}`,Y),F("connection",`Retrying socket connection in 2 seconds... (${A} retries left)`,Y),await new Promise((z)=>setTimeout(z,2000)),$A(w,$,Y,A-1)}let B=`Failed to connect to ${w}:${$} after ${5-A} attempts: ${Q.message}`;F("connection",`${B}. To bypass this check set RPX_BYPASS_CONNECTION_TEST=true`,Y),H.warn(B),H.warn("RPX will try to continue anyway. If you're sure this is correct, you can set RPX_BYPASS_CONNECTION_TEST=true to skip this check.")}}async function $6(w){F("server",`Starting server with options: ${Iw(w)}`,w.verbose);let $=O$(w.from),Y=new URL($.startsWith("http")?$:`http://${$}`),A=new URL((w.to?.startsWith("http")?w.to:`http://${w.to}`)||"rpx.localhost"),X=Number.parseInt(Y.port)||(Y.protocol.includes("https:")?443:80),J=[A.hostname];if(FB(w)&&!A.hostname.includes("localhost")&&!A.hostname.includes("127.0.0.1")){F("hosts",`Checking if hosts file entry exists for: ${A.hostname}`,w?.verbose);try{if(!(await aY(J,w.verbose))[0]){H.info(`Adding ${A.hostname} to hosts file...`),H.info("This may require sudo/administrator privileges");try{await tY(J,w.verbose)}catch(Q){if(H.error("Failed to add hosts entry:",Q.message),H.warn("You can manually add this entry to your hosts file:"),H.warn(`127.0.0.1 ${A.hostname}`),H.warn(`::1 ${A.hostname}`),J0.platform==="win32")H.warn("On Windows:"),H.warn("1. Run notepad as administrator"),H.warn("2. Open C:\\Windows\\System32\\drivers\\etc\\hosts");else H.warn("On Unix systems:"),H.warn("sudo nano /etc/hosts")}}else F("hosts",`Host entry already exists for ${A.hostname}`,w.verbose)}catch(W){H.error("Failed to check hosts file:",W.message)}}try{await $A(Y.hostname,X,w.verbose)}catch(W){F("server",`Connection test failed: ${W}`,w.verbose),H.error(W.message),H.warn("Continuing with proxy setup despite connection test failure..."),H.info("If you need to bypass connection testing, set environment variable RPX_BYPASS_CONNECTION_TEST=true")}let U=w._cachedSSLConfig||null;if(w.https)try{if(w.https===!0)w.https=DY({...w,to:A.hostname});if(U=await Q$({...w,to:A.hostname,https:w.https}),!U){if(F("ssl",`Generating new certificates for ${A.hostname}`,w.verbose),await l1({...w,from:Y.toString(),to:A.hostname,https:w.https}),U=await Q$({...w,to:A.hostname,https:w.https}),!U)throw Error(`Failed to load SSL configuration after generating certificates for ${A.hostname}`)}}catch(W){throw F("server",`SSL setup failed: ${W}`,w.verbose),W}F("server",`Setting up reverse proxy with SSL config for ${A.hostname}`,w.verbose),await VM({...w,from:$,originalFrom:w.from||$,to:A.hostname,fromPort:X,sourceUrl:{hostname:Y.hostname,host:Y.host},ssl:U})}async function IM(w,$,Y,A,X,J,U,W,Q,B,j,z){F("proxy",`Creating proxy server ${w} -> ${$} with cleanUrls: ${W}`,U);let G=n1(j??A.host,z);p1(G);let K=[{host:$,route:{sourceHost:A.host,upstreamPool:G,cleanUrls:W||!1,changeOrigin:Q||!1,basePath:"/",auth:B}}];if(!QJ({routeEntries:K,listenPort:Y,sslConfig:X,originGuard:null,verbose:U??!1}))throw l$(G),Error(`Failed to start proxy server for ${$} on port ${Y}`);WJ.add(G),yM({from:w,to:$,vitePluginUsage:J,listenPort:Y,ssl:!!X,cleanUrls:W,verbose:U})}async function VM(w){F("setup",`Setting up reverse proxy: ${Iw(w)}`,w.verbose);let{from:$,originalFrom:Y,to:A,sourceUrl:X,ssl:J,verbose:U,cleanup:W,vitePluginUsage:Q,changeOrigin:B,cleanUrls:j}=w,z=80,G=443,K="0.0.0.0",E=w.portManager||MM,q=FB(w);try{if(q&&A&&!A.includes("localhost")&&!A.includes("127.0.0.1")){if(!(await aY([A],U))[0]){H.warn(`The hostname ${A} isn't in your hosts file. Adding it now...`);try{await tY([A],U),H.success(`Added ${A} to your hosts file.`)}catch(V){H.error(`Failed to add ${A} to your hosts file: ${V}`),H.info(`You may need to manually add '127.0.0.1 ${A}' to your /etc/hosts file.`)}}}else if(q&&J0.platform!=="darwin"&&A&&A.includes("localhost")&&!A.match(/^(localhost|127\.0\.0\.1)$/)){if(!(await aY([A],U))[0]){F("hosts",`${A} not found in hosts file, adding...`,U);try{await tY([A],U)}catch(V){F("hosts",`Failed to add ${A} to hosts file: ${V}`,U)}}}if(J&&!E.usedPorts.has(z)){if(!await _$(z,K,U))F("setup","Starting HTTP redirect server",U),Y6(U),E.usedPorts.add(z);else if(F("setup","Port 80 is in use, skipping HTTP redirect",U),U)H.warn("Port 80 is in use, HTTP to HTTPS redirect will not be available")}let N=J?G:z,f=await _$(N,K,U),R;if(f){if(F("setup",`Port ${N} is already in use`,U),U)H.warn(`Port ${N} is already in use. This may be another instance of rpx or another service.`);if(N===443){if(R=await E.getNextAvailablePort(3443,!0),F("setup",`Using port ${R} instead of ${N}`,U),U)H.info(`Using port ${R} instead. Access your site at https://${A}:${R}`)}else if(R=await E.getNextAvailablePort(N+1000,!0),F("setup",`Using port ${R} instead of ${N}`,U),U)H.info(`Using port ${R} instead. Access your site at http://${A}:${R}`)}else R=N,E.usedPorts.add(R),F("setup",`Using standard ${N===443?"HTTPS":"HTTP"} port ${N} for ${A}`,U);await IM($,A,R,X,J,Q,U,j,B,r1(w.auth),Y,w.loadBalancer)}catch(N){F("setup",`Setup failed: ${N}`,U),H.error(`Failed to setup reverse proxy: ${N.message}`),jJ({domains:[A],hosts:typeof W==="boolean"?W:W?.hosts,certs:typeof W==="boolean"?W:W?.certs,verbose:U,vitePluginUsage:Q})}}function Y6(w,$=80,Y=443,A,X){F("redirect",`Starting HTTP redirect server on port ${$}`,w);let J=BJ.createServer((U,W)=>{let Q=U.url?U.url.split("?",1)[0]:"";if(Q.startsWith("/.well-known/acme-challenge/")){if(X){let G=X.challengeStore.handlePath(Q);if(G!==void 0){F("redirect",`Serving on-demand ACME challenge ${Q}`,w),W.writeHead(200,{"content-type":"text/plain"}),W.end(G);return}}if(A){let G=iY(A,Q);if(G!=null){F("redirect",`Serving ACME challenge ${Q}`,w),W.writeHead(200,{"content-type":"text/plain"}),W.end(G);return}}if(X){W.writeHead(404,{"content-type":"text/plain"}),W.end("challenge not found");return}}let B=U.headers.host||"",j=B.includes(":")?B.slice(0,B.indexOf(":")):B;if(X&&j&&!X.hasCert(j))X.ensureCert(j).catch(()=>{});let z=Y===443?j:`${j}:${Y}`;F("redirect",`Redirecting request from ${B}${U.url} to https://${z}`,w),W.writeHead(301,{Location:`https://${z}${U.url}`}),W.end()}).listen($);wA.add(J),F("redirect","HTTP redirect server started",w)}function A6(w){let $={...LQ,...w};if(F("proxy",`Starting proxy with options: ${Iw($)}`,$?.verbose),$.viaDaemon){if(!$.from||!$.to){H.error("viaDaemon mode requires both `from` and `to`");return}jB({proxies:[{id:$.id,from:$.from,to:$.to,path:$.path,cleanUrls:$.cleanUrls,changeOrigin:$.changeOrigin,pathRewrites:$.pathRewrites}],verbose:$.verbose}).catch((Q)=>{H.error(`Failed to register with rpx daemon: ${Q.message}`),J0.exit(1)});return}let Y=$.to||"",A=Y.split(".").pop()?.toLowerCase()||"",X=J0.platform==="darwin"&&Y&&!Y.includes("localhost")&&!Y.includes("127.0.0.1"),J=["dev","app","page","new","day","foo"],U=["test","localhost","local","example","invalid"];if(X&&J.includes(A)&&$?.verbose)H.warn(`The .${A} TLD may not work reliably for local development`),H.info(` Google owns .${A} with HSTS preloading, which can bypass local DNS`),H.info(" Consider using a reserved TLD: .test, .localhost, or .local");if(X)Promise.resolve().then(() => (XY(),r8)).then(({setupDevelopmentDns:Q})=>{Q({domains:[Y],verbose:$.verbose}).then((B)=>{if(B)Promise.resolve().then(()=>{if($.verbose)if(U.includes(A))H.success(`DNS server started for .${A} domains`);else H.success(`DNS server started for .${A} domains (hosts file entry also added)`)});else F("dns",`Could not start DNS server - ${Y} may not resolve in browser`,$.verbose)})}).catch((Q)=>{F("dns",`Failed to start DNS server: ${Q}`,$.verbose)});let W={from:$.from,to:$.to,cleanUrls:$.cleanUrls,https:DY($),cleanup:$.cleanup,vitePluginUsage:$.vitePluginUsage,changeOrigin:$.changeOrigin,verbose:$.verbose,regenerateUntrustedCerts:$.regenerateUntrustedCerts};F("proxy",`Server options: ${Iw(W)}`,$.verbose),$6(W).catch((Q)=>{F("proxy",`Failed to start proxy: ${Q}`,$.verbose),H.error(`Failed to start proxy: ${Q.message}`),jJ({domains:[$.to],hosts:typeof $.cleanup==="boolean"?$.cleanup:$.cleanup?.hosts,certs:typeof $.cleanup==="boolean"?$.cleanup:$.cleanup?.certs,verbose:$.verbose})})}function CM(w){return w?.verbose||!1}function FB(w){if(w?.hostsManagement===!1)return!1;let $=w?.cleanup;if($===!1)return!1;if($&&typeof $==="object"&&$.hosts===!1)return!1;return!0}async function X6(w){let $={from:"localhost:5173",to:"rpx.localhost",https:!1,cleanup:{hosts:!0,certs:!1},vitePluginUsage:!1,verbose:!1,cleanUrls:!1,changeOrigin:!1,regenerateUntrustedCerts:!0};if(w)$={...$,...w};let Y=CM($),A=FB($);if(F("config",`Starting with config: ${Iw($,2)}`,Y),F("config",`Is multi-proxy? ${"proxies"in $}`,Y),F("config",`Hosts management enabled? ${A}`,Y),$.viaDaemon){let M="proxies"in $&&Array.isArray($.proxies)?$.proxies.map((O)=>({id:O.id,from:O.from,to:O.to,path:O.path,cleanUrls:O.cleanUrls??$.cleanUrls,changeOrigin:O.changeOrigin??$.changeOrigin,pathRewrites:O.pathRewrites})):[{id:$.id,from:$.from,to:$.to??"rpx.localhost",path:$.path,cleanUrls:$.cleanUrls,changeOrigin:$.changeOrigin,pathRewrites:$.pathRewrites}];await jB({proxies:M,verbose:Y});return}if("proxies"in $&&Array.isArray($.proxies)){F("servers",`Found ${$.proxies.length} proxies in config`,Y);for(let T of $.proxies)if(T.start){let M=`${T.from}-${T.to}`;try{F("watch",`Starting command for ${M} with command: ${T.start.command}`,Y),H.info(`Starting command for ${M}...`),await UJ.startProcess(M,T.start,Y);let O=O$(T.from),S=new URL(O.startsWith("http")?O:`http://${O}`),B0=S.hostname||"localhost",a0=Number(S.port)||80;try{await $A(B0,a0,Y),F("watch",`Dev server is ready at ${B0}:${a0}`,Y)}catch(Kw){F("watch",`Connection check failed, but continuing with proxy setup: ${Kw}`,Y),H.warn("Dev server connection check failed. RPX will try to proceed anyway...")}}catch(O){throw F("watch",`Failed to start command for ${M}: ${O}`,Y),Error(`Failed to start command for ${M}: ${O}`)}}else F("watch",`No start command for proxy ${T.from} -> ${T.to}`,Y)}else if("start"in $&&$.start){F("watch","Found start command in single proxy config",Y);let T=`${$.from}-${$.to}`;try{if($.start)F("watch",`Starting command: ${$.start.command}`,Y),await UJ.startProcess(T,$.start,Y);let M=O$($.from),O=new URL(M.startsWith("http")?M:`http://${M}`),S=O.hostname||"localhost",B0=Number(O.port)||80;try{await $A(S,B0,Y),F("watch",`Dev server is ready at ${S}:${B0}`,Y)}catch(a0){F("watch",`Connection check failed, but continuing with proxy setup: ${a0}`,Y),H.warn("Dev server connection check failed. RPX will try to proceed anyway...")}}catch(M){throw F("watch",`Failed to run start command: ${M}`,Y),Error(`Failed to run start command: ${M}`)}}else F("watch","No start command found in config",Y);let X="proxies"in $&&Array.isArray($.proxies)?$.proxies[0]?.to:("to"in $)?$.to:"rpx.localhost";if(J0.platform!=="win32"&&($.https||A)){if(!g$())try{F("sudo","Pre-acquiring sudo credentials for privileged operations",Y),HM("sudo -v",{stdio:"inherit"})}catch{F("sudo","Could not pre-acquire sudo credentials",Y)}}let J=[];if($.productionCerts){if(J=await e1($.productionCerts,Y),J.length>0)F("ssl",`Using ${J.length} production SNI cert(s): ${J.map((T)=>T.serverName).join(", ")}`,Y)}if($.https){let T=J.length>0?null:await Q$($);if(!T&&J.length===0){if(F("ssl",`No valid or trusted certificates found for ${X}, generating new ones`,$.verbose),await l1($),T=await Q$($),!T)throw Error(`Failed to load SSL certificates after generation for ${X}`)}else F("ssl",`Using existing and trusted certificates for ${X}`,$.verbose);$._cachedSSLConfig=T}let U="proxies"in $&&Array.isArray($.proxies)?$.proxies.map((T)=>({...T,https:$.https,cleanup:$.cleanup,cleanUrls:T.cleanUrls??("cleanUrls"in $?$.cleanUrls:!1),vitePluginUsage:$.vitePluginUsage,changeOrigin:T.changeOrigin??$.changeOrigin,verbose:Y,_cachedSSLConfig:$._cachedSSLConfig})):[{from:"from"in $?$.from:"localhost:5173",to:"to"in $?$.to:"rpx.localhost",cleanUrls:"cleanUrls"in $?$.cleanUrls:!1,https:$.https,cleanup:$.cleanup,vitePluginUsage:$.vitePluginUsage,start:"start"in $?$.start:void 0,changeOrigin:$.changeOrigin,auth:"auth"in $?$.auth:void 0,verbose:Y,_cachedSSLConfig:$._cachedSSLConfig}],W=U.map((T)=>T.to||"rpx.localhost"),Q=J.length>0?J:$._cachedSSLConfig??null,B=W.filter((T)=>T&&!T.includes("localhost")&&!T.includes("127.0.0.1")),j=["dev","app","page","new","day","foo"],z=["test","localhost","local","example","invalid"],G=[...new Set(B.map((T)=>T.split(".").pop()?.toLowerCase()))],K=G.filter((T)=>!!T&&j.includes(T));if(K.length>0&&Y)H.warn(`The following TLDs may not work reliably for local development: ${K.map((T)=>`.${T}`).join(", ")}`),H.info(" These TLDs have HSTS preloading which can bypass local DNS"),H.info(" Consider using reserved TLDs: .test, .localhost, or .local");if(A&&J0.platform==="darwin"&&B.length>0){let{setupDevelopmentDns:T}=await Promise.resolve().then(() => (XY(),r8));if(await T({domains:B,verbose:Y})){if(Y)if(G.every((S)=>!!S&&z.includes(S)))H.success(`DNS server started for ${G.map((S)=>`.${S}`).join(", ")} domains`);else H.success(`DNS server started for ${G.map((S)=>`.${S}`).join(", ")} domains (hosts file entries also added)`)}else F("dns","Could not start DNS server - custom domains may not resolve",Y)}let E=async()=>{F("cleanup","Starting cleanup handler",$.verbose);try{let{tearDownDevelopmentDns:T}=await Promise.resolve().then(() => (XY(),r8));await T({verbose:$.verbose})}catch(T){F("cleanup",`Error stopping DNS server: ${T}`,$.verbose)}try{await UJ.stopAll($.verbose)}catch(T){F("cleanup",`Error stopping processes: ${T}`,$.verbose)}await jJ({domains:W,hosts:typeof $.cleanup==="boolean"?$.cleanup:$.cleanup?.hosts,certs:typeof $.cleanup==="boolean"?$.cleanup:$.cleanup?.certs,verbose:$.verbose||!1})};J0.on("SIGINT",E),J0.on("SIGTERM",E);let q=$.singlePortMode===!0,N=$.httpsPort??443,f=$.httpPort??80,R=$.originGuard?t5($.originGuard):null,y=!!Q&&(U.length>1||q||J.length>0),V=!Q&&q&&U.length>0;if(y&&Q){F("proxies",`Creating shared HTTPS server for ${U.length} domains on port ${N}`,Y);let T=await a5(U,A,Y),M=null,O=$.onDemandTls,S=O?.enabled?new p$({config:O,certsDir:O.certsDir??$.productionCerts?.certsDir??e5.join(o5.homedir(),".stacks","rpx","on-demand-certs"),initial:J,verbose:Y,onCertAdded:(Fw)=>{Kw(Fw)}}):null,B0=null,a0=!1;async function Kw(Fw){if(B0=Fw,a0)return;a0=!0;try{while(B0){let bw=B0;if(B0=null,F("proxies",`rebuilding :${N} with ${bw.length} SNI cert(s)`,Y),M)wA.delete(M),M.stop(!1);let s0=!1;for(let Z=0;!s0&&Z<60;Z++){let Cw=QJ({routeEntries:T,listenPort:N,sslConfig:bw,originGuard:R,verbose:Y});if(Cw){M=Cw,s0=!0;break}await new Promise((WY)=>setTimeout(WY,Math.min(25*2**Math.min(Z,4),500)))}if(!s0)H.error(`rpx: CRITICAL — could not rebind :${N} after cert issuance; HTTPS unbound until the next cert event or a gateway restart`)}}finally{a0=!1}}if(!await _$(f,"0.0.0.0",Y))Y6(Y,f,N,$.acmeChallengeWebroot,S);if(await _$(N,"0.0.0.0",Y)){if(F("proxies",`Port ${N} is already in use, cannot start shared proxy`,Y),Y)H.warn(`Port ${N} is in use. Shared HTTPS proxy cannot start.`);return}let Pw=S&&S.sniEntries().length>0?S.sniEntries():Q;if(M=QJ({routeEntries:T,listenPort:N,sslConfig:Pw,originGuard:R,verbose:Y}),!M){H.error(`Shared HTTPS proxy failed to bind :${N}; not exiting`);return}}else if(V){F("proxies",`Creating shared HTTP server for ${U.length} domains on port ${f}`,Y);let T=await a5(U,A,Y);if(await _$(f,"0.0.0.0",Y)){if(F("proxies",`Port ${f} is already in use, cannot start shared proxy`,Y),Y)H.warn(`Port ${f} is in use. Shared HTTP proxy cannot start.`);return}if(!QJ({routeEntries:T,listenPort:f,sslConfig:null,originGuard:R,verbose:Y})){H.error(`Shared HTTP proxy failed to bind :${f}; not exiting`);return}}else for(let T of U)try{let M=T.to||"rpx.localhost";F("proxy",`Starting proxy for ${M} with SSL config: ${!!Q}`,T.verbose),await $6({from:T.from||"localhost:5173",to:M,cleanUrls:T.cleanUrls||!1,https:T.https||!1,cleanup:T.cleanup||!1,vitePluginUsage:T.vitePluginUsage||!1,verbose:T.verbose||!1,_cachedSSLConfig:$._cachedSSLConfig,changeOrigin:T.changeOrigin||!1,loadBalancer:T.loadBalancer,auth:T.auth,path:T.path,pathRewrites:T.pathRewrites})}catch(M){F("proxies",`Failed to start proxy for ${T.to}: ${M}`,T.verbose),H.error(`Failed to start proxy for ${T.to}:`,M)}}async function a5(w,$,Y){let A=[],X=new Set;for(let J of w){let U=J.to||"rpx.localhost",W=J.cleanUrls||!1,Q=J.path,B=_w(Q),j=r1(J.auth);if(J.redirect){let z=iG(J.redirect);A.push({host:U,path:Q,route:{redirect:z,basePath:B,auth:j}}),F("proxies",`Route: ${U}${Q??""} → redirect ${z.status} ${z.to}${j?" (auth)":""}`,Y)}else if(J.static)A.push({host:U,path:Q,route:{static:cY(J.static,W),cleanUrls:W,basePath:B,auth:j}}),F("proxies",`Route: ${U}${Q??""} → static ${typeof J.static==="string"?J.static:J.static.dir}${j?" (auth)":""}`,Y);else{let z=O$(J.from),G=new URL(z.startsWith("http")?z:`http://${z}`),K=n1(J.from??G.host,J.loadBalancer);p1(K),WJ.add(K),A.push({host:U,path:Q,route:{sourceHost:G.host,upstreamPool:K,cleanUrls:W,changeOrigin:J.changeOrigin||!1,pathRewrites:J.pathRewrites,basePath:B,auth:j}}),F("proxies",`Route: ${U}${Q??""} → ${G.host}${j?" (auth)":""}`,Y)}if(X.has(U))continue;if(X.add(U),$&&!F1(U)&&!U.includes("localhost")&&!U.includes("127.0.0.1"))try{if(!(await aY([U],Y))[0])await tY([U],Y)}catch{F("hosts",`Could not add hosts entry for ${U}`,Y)}}return A}function QJ(w){let{routeEntries:$,listenPort:Y,sslConfig:A,originGuard:X,verbose:J}=w,U=s1($),W=t1((j,z)=>o1(U,j,z),J),Q=X?(j,z)=>X(j)??W(j,z):W,B=a1(J);try{let j=Bun.serve({port:Y,hostname:"0.0.0.0",reusePort:m1(),...A?{tls:Array.isArray(A)?A.map((z)=>({serverName:z.serverName,key:z.key,cert:z.cert})):{key:A.key,cert:A.cert,ca:A.ca,requestCert:!1,rejectUnauthorized:!1}}:{},fetch(z,G){return Q(z,G)},websocket:B,error(z){return F("server",`Shared proxy server error: ${z}`,J),new Response(`Server Error: ${z.message}`,{status:500})}});return wA.add(j),F("proxies",`Shared ${A?"HTTPS":"HTTP"} proxy listening on port ${Y} for ${U.size} domains`,J),j}catch(j){return F("proxies",`Failed to start shared proxy: ${j}`,J),console.error("Failed to start shared proxy:",j),null}}function yM(w){if(w?.vitePluginUsage||!w?.verbose)return;if(console.log(""),console.log(` ${hw.green(hw.bold("rpx"))} ${hw.green(`v${RM}`)}`),console.log(` ${hw.green("➜")} ${hw.dim(w?.from??"")} ${hw.dim("➜")} ${hw.cyan(w?.ssl?`https://${w?.to}`:`http://${w?.to}`)}`),w?.listenPort!==(w?.ssl?443:80))console.log(` ${hw.green("➜")} Listening on port ${w?.listenPort}`);if(w?.cleanUrls)console.log(` ${hw.green("➜")} Clean URLs enabled`)}KW();var gS=new m$("rpx",{showTags:!1});function J6(w){return!!(w&&("proxies"in w)&&Array.isArray(w.proxies))}P0.chdir(LM(OM(_M(import.meta.url)),".."));var c0=new MJ("rpx"),U6="0.12.0";c0.command("start","Start the Reverse Proxy Server").option("--from <from>","The URL to proxy from").option("--to <to>","The URL to proxy to").option("--key-path <path>","Absolute path to the SSL key").option("--cert-path <path>","Absolute path to the SSL certificate").option("--ca-cert-path <path>","Absolute path to the SSL CA certificate").option("--hosts-cleanup","Cleanup /etc/hosts on exit").option("--certs-cleanup","Cleanup SSL certificates on exit").option("--start-command <command>","Command to start the dev server").option("--start-cwd <path>","Current working directory for the dev server").option("--start-env <env>","Environment variables for the dev server").option("--change-origin","Change the origin of the host header to the target URL").option("--single-port-mode","Route all proxies through one shared listener (by Host header) instead of a port per proxy").option("--http-port <port>","Port for the shared HTTP listener / redirect (default: 80)").option("--https-port <port>","Port for the shared HTTPS listener (default: 443)").option("--via-daemon","Route through the shared rpx daemon instead of binding :443 directly").option("--id <id>","Stable id used when registering with the daemon (auto-derived from --to)").option("--verbose","Enable verbose logging").example("rpx start --from localhost:5173 --to my-project.localhost").example("rpx start --from localhost:3000 --to my-project.localhost/api").example("rpx start --from localhost:3000 --to localhost:3001").example("rpx start --from localhost:5173 --to my-project.test --key-path /absolute/path/to/key --cert-path /absolute/path/to/cert").example("rpx start --from localhost:5173 --to my-project.localhost --change-origin").example("rpx start --single-port-mode --https-port 8443").action(async(w)=>{if(!w?.from||!w.to)return X6(K1);let $={from:w.from,to:w.to,https:{keyPath:w.keyPath,certPath:w.certPath,caCertPath:w.caCertPath},cleanup:{certs:w.certsCleanup||!1,hosts:w.hostsCleanup||!1},verbose:w.verbose||!1,changeOrigin:w.changeOrigin||!1,singlePortMode:w.singlePortMode||!1,httpPort:w.httpPort!==void 0?Number(w.httpPort):void 0,httpsPort:w.httpsPort!==void 0?Number(w.httpsPort):void 0,viaDaemon:w.viaDaemon||!1,id:w.id};if(w.startCommand){let Y={command:w.startCommand};if(w.startCwd)Y.cwd=w.startCwd;if(w.startEnv)try{Y.env=JSON.parse(w.startEnv)}catch(A){console.error("Failed to parse start-env JSON:",A),P0.exit(1)}$.start=Y}return A6($)});c0.command("watch:start <proxy>","Start the dev server for a specific proxy").option("--verbose","Enable verbose logging").action(async(w,$)=>{let Y=J6(K1)?K1.proxies.find((A)=>A.to===w||`${A.from}-${A.to}`===w):K1.to===w?K1:null;if(!Y?.start)console.error(`No watch configuration found for proxy: ${w}`),P0.exit(1);try{await wJ.startProcess(w,Y.start,$.verbose),console.log(`Started dev server for ${w}`)}catch(A){console.error(`Failed to start dev server for ${w}:`,A),P0.exit(1)}});c0.command("watch:stop <proxy>","Stop the dev server for a specific proxy").option("--verbose","Enable verbose logging").action(async(w,$)=>{try{await wJ.stopProcess(w,$.verbose),console.log(`Stopped dev server for ${w}`)}catch(Y){console.error(`Failed to stop dev server for ${w}:`,Y),P0.exit(1)}});c0.command("watch:stopall","Stop all running dev servers").option("--verbose","Enable verbose logging").action(async(w)=>{try{await wJ.stopAll(w.verbose),console.log("Stopped all dev servers")}catch($){console.error("Failed to stop all dev servers:",$),P0.exit(1)}});async function Q6(w){let Y={...(await Y9().catch(()=>null))?.onDemand??{},enabled:!0};if(w){let A=w.split(",").map((X)=>X.trim()).filter(Boolean);if(A.length>0)Y.roots=A}return Y}c0.command("daemon:start","Start the rpx daemon in the foreground (binds :443 + :80)").option("--rpx-dir <path>","Override the rpx state dir (default ~/.stacks/rpx)").option("--registry-dir <path>","Override the registry dir (default <rpx-dir>/registry.d)").option("--https-port <port>","HTTPS port (default 443)",{default:443}).option("--http-port <port>","HTTP redirect port; 0 to disable (default 80)",{default:80}).option("--hostname <host>","Bind address (default 0.0.0.0)",{default:"0.0.0.0"}).option("--certs-dir <path>","Directory of real PEM certs for per-domain SNI (<domain>.crt/.key, _wildcard.<apex>.crt/.key)").option("--workers <n>","Run as a multi-core cluster of N worker processes (default 1; also RPX_WORKERS)").option("--on-demand","Lazily boot a project's dev server the first time its host is visited (reads config `onDemand`)").option("--roots <dirs>","Comma-separated roots scanned for on-demand sites (overrides config; default ~/Code)").option("--verbose","Enable verbose logging").example("rpx daemon:start --on-demand").example("rpx daemon:start --on-demand --roots ~/Code,~/work").action(async(w)=>{try{let $=w.onDemand?await Q6(w.roots):void 0;await(await c5({rpxDir:w.rpxDir,registryDir:w.registryDir,httpsPort:typeof w.httpsPort==="string"?Number.parseInt(w.httpsPort,10):w.httpsPort,httpPort:typeof w.httpPort==="string"?Number.parseInt(w.httpPort,10):w.httpPort,hostname:w.hostname,productionCerts:w.certsDir?{certsDir:w.certsDir}:void 0,workers:w.workers===void 0?void 0:typeof w.workers==="string"?Number.parseInt(w.workers,10):w.workers,onDemandSites:$,verbose:w.verbose??!0})).done,P0.exit(0)}catch($){console.error(`Failed to start rpx daemon: ${$.message}`),P0.exit(1)}});c0.command("daemon:stop","Stop the running rpx daemon (SIGTERM, escalates to SIGKILL)").option("--rpx-dir <path>","Override the rpx state dir (default ~/.stacks/rpx)").option("--timeout <ms>","Max ms to wait for graceful shutdown",{default:5000}).option("--no-force","Do not escalate to SIGKILL after timeout").option("--verbose","Enable verbose logging").action(async(w)=>{let $=typeof w.timeout==="string"?Number.parseInt(w.timeout,10):w.timeout,Y=await i5({rpxDir:w.rpxDir,timeoutMs:$,forceAfterTimeout:w.force!==!1,verbose:w.verbose});if(!Y.stopped&&Y.pid===null){console.log("rpx daemon is not running");return}if(!Y.stopped){console.log(`rpx daemon pid=${Y.pid} was already gone (cleaned stale lock)`);return}console.log(`rpx daemon pid=${Y.pid} stopped${Y.forced?" (SIGKILL)":""}`)});c0.command("daemon:status","Print daemon state and currently registered hosts").option("--rpx-dir <path>","Override the rpx state dir (default ~/.stacks/rpx)").option("--registry-dir <path>","Override the registry dir (default <rpx-dir>/registry.d)").option("--json","Emit machine-readable JSON instead of a human summary").action(async(w)=>{let $=w.rpxDir??Aw(),Y=await k$($),A=await o8($),X=w.registryDir,J=await BB(X).catch(()=>[]);if(w.json){console.log(JSON.stringify({running:A,pid:Y,pidFile:h$($),rpxDir:$,registryDir:X??s$(),entries:J},null,2));return}if(!A){if(console.log("rpx daemon: not running"),Y!==null)console.log(`(stale pid file at ${h$($)} \u2192 pid ${Y})`)}else console.log(`rpx daemon: running (pid=${Y})`),console.log(`pid file: ${h$($)}`);if(console.log(`registry: ${X??s$()}`),J.length===0){console.log("no registered hosts");return}console.log(`registered hosts (${J.length}):`);for(let U of J){let W=U.pid!==void 0?`, pid=${U.pid}`:"";console.log(` https://${U.to} \u2192 ${U.from} (id=${U.id}${W})`)}});c0.command("register","Register an upstream app with the rpx daemon").option("--id <id>","Unique id for this entry (a-z, 0-9, dot, dash, underscore)").option("--from <host:port>","Upstream host:port (e.g. localhost:5173)").option("--to <host>","Public hostname (e.g. pet-store.localhost)").option("--cwd <path>","Working directory of the upstream (informational)").option("--clean-urls","Strip .html and 301 to the clean URL").option("--change-origin","Rewrite Origin to the upstream").option("--rpx-dir <path>","Override the rpx state dir (default ~/.stacks/rpx)").option("--registry-dir <path>","Override the registry dir (default <rpx-dir>/registry.d)").option("--skip-spawn","Do not lazy-spawn the daemon if it is not already running").option("--verbose","Enable verbose logging").example("rpx register --id pet-store --from localhost:5173 --to pet-store.localhost").action(async(w)=>{if(!w.id||!w.from||!w.to)console.error("rpx register requires --id, --from, and --to"),P0.exit(1);if(!QY(w.id))console.error(`invalid id: ${JSON.stringify(w.id)} (must match /^[a-zA-Z0-9._-]+$/, \u2264128 chars)`),P0.exit(1);try{await l5({id:w.id,from:w.from,to:w.to,cwd:w.cwd,createdAt:new Date().toISOString(),cleanUrls:w.cleanUrls,changeOrigin:w.changeOrigin},w.registryDir,w.verbose)}catch($){console.error(`failed to write registry entry: ${$.message}`),P0.exit(1)}if(w.skipSpawn){console.log(`registered ${w.to} \u2192 ${w.from} (daemon spawn skipped)`);return}try{let $=await v5({rpxDir:w.rpxDir,verbose:w.verbose}),Y=$.spawned?"spawned":"attached to";console.log(`registered https://${w.to} \u2192 ${w.from} (${Y} daemon pid=${$.pid})`)}catch($){console.error(`registered entry but daemon spawn failed: ${$.message}`),console.error("the entry remains in the registry; start the daemon manually with `rpx daemon:start`"),P0.exit(1)}});c0.command("unregister <id>","Remove a previously registered app from the rpx daemon").option("--registry-dir <path>","Override the registry dir (default ~/.stacks/rpx/registry.d)").option("--verbose","Enable verbose logging").action(async(w,$)=>{if(!QY(w))console.error(`invalid id: ${JSON.stringify(w)}`),P0.exit(1);let Y=await WB(w,$.registryDir,$.verbose);if(!Y){console.log(`no registry entry for id=${w}`);return}await n5(w,$.registryDir,$.verbose),console.log(`unregistered ${Y.to} (id=${w})`)});c0.command("dns:reconcile","Remove stale macOS DNS overrides left by crashed dev sessions").option("--rpx-dir <path>","Override the rpx state dir (default ~/.stacks/rpx)").option("--verbose","Enable verbose logging").action(async(w)=>{let $=w.rpxDir??Aw();if(await o8($)){console.log("rpx daemon is running \u2014 DNS overrides are managed by the daemon");return}await m5({rpxDir:$,verbose:w.verbose}),console.log("DNS reconcile complete")});c0.command("sites","List the on-demand sites rpx can boot (and which are currently live)").option("--roots <dirs>","Comma-separated roots to scan (overrides config; default ~/Code)").option("--registry-dir <path>","Override the registry dir (default ~/.stacks/rpx/registry.d)").option("--json","Emit machine-readable JSON").action(async(w)=>{let $=await Q6(w.roots),Y=Q9($),A=await BB(w.registryDir).catch(()=>[]),X=new Set(A.map((W)=>W.to)),J=Y.map((W)=>({host:W.host,dir:W.dir,command:W.command,source:W.source,live:X.has(W.host)}));if(w.json){console.log(JSON.stringify(J,null,2));return}let U=$.roots??["~/Code"];if(J.length===0){console.log("no on-demand sites found"),console.log(`scanned roots: ${U.join(", ")}`),console.log("start the daemon with `rpx daemon:start --on-demand` to serve them");return}console.log(`on-demand sites (${J.length}) \u2014 scanned ${U.join(", ")}:`);for(let W of J)console.log(` ${W.live?"\u25CF":"\u25CB"} https://${W.host} ${W.live?"(live)":"(idle)"}`),console.log(` ${W.command} ${W.dir}`)});c0.command("logs <host>","Show an on-demand site's boot log (e.g. rpx logs myapp.localhost)").option("--rpx-dir <path>","Override the rpx state dir (default ~/.stacks/rpx)").option("--lines <n>","Show only the last N lines (default: all)").action(async(w,$)=>{let{readFile:Y}=await import("fs/promises"),{join:A}=await import("path"),X=$.rpxDir??Aw(),J=A(X,"sites",`${nA(w.split(":")[0])}.log`),U;try{U=await Y(J,"utf8")}catch{console.log(`no log for ${w} (it may not have been booted yet) \u2014 looked in ${J}`);return}let W=$.lines===void 0?void 0:typeof $.lines==="string"?Number.parseInt($.lines,10):$.lines,Q=U.split(`
334
+ `)),this._prevFrame=w;return}this.output.write(TJ.down())}if(this.output.write(w),this.state==="initial")this.state="active";this._prevFrame=w}}function GK(w,$){if(w===void 0)return 0;if($.length===0)return 0;let A=$.findIndex((X)=>X.value===w);return A!==-1?A:0}function KK(w,$){return($.label??String($.value)).toLowerCase().includes(w.toLowerCase())}function FK(w,$){if(!$)return;if(w)return $;return $[0]}class qK extends CJ{filteredOptions;multiple;isNavigating=!1;selectedValues=[];focusedValue;#w=0;#Y="";#A;#$;get cursor(){return this.#w}get userInputWithCursor(){if(!this.userInput)return QA.inverse(QA.hidden("_"));if(this._cursor>=this.userInput.length)return`${this.userInput}█`;let w=this.userInput.slice(0,this._cursor),[$,...Y]=this.userInput.slice(this._cursor);return`${w}${QA.inverse($)}${Y.join("")}`}get options(){if(typeof this.#$==="function")return this.#$();return this.#$}constructor(w){super(w);this.#$=w.options;let $=this.options;this.filteredOptions=[...$],this.multiple=w.multiple===!0,this.#A=w.filter??KK;let Y;if(w.initialValue&&Array.isArray(w.initialValue))if(this.multiple)Y=w.initialValue;else Y=w.initialValue.slice(0,1);else if(!this.multiple&&this.options.length>0)Y=[this.options[0].value];if(Y)for(let A of Y){let X=$.findIndex((J)=>J.value===A);if(X!==-1)this.toggleSelected(A),this.#w=X}this.focusedValue=this.options[this.#w]?.value,this.on("key",(A,X)=>this.#X(A,X)),this.on("userInput",(A)=>this.#J(A))}_isActionKey(w,$){return w==="\t"||this.multiple&&this.isNavigating&&$.name==="space"&&w!==void 0&&w!==""}#X(w,$){let Y=$.name==="up",A=$.name==="down",X=$.name==="return";if(Y||A){if(this.#w=Math.max(0,Math.min(this.#w+(Y?-1:1),this.filteredOptions.length-1)),this.focusedValue=this.filteredOptions[this.#w]?.value,!this.multiple)this.selectedValues=[this.focusedValue];this.isNavigating=!0}else if(X)this.value=FK(this.multiple,this.selectedValues);else if(this.multiple)if(this.focusedValue!==void 0&&($.name==="tab"||this.isNavigating&&$.name==="space"))this.toggleSelected(this.focusedValue);else this.isNavigating=!1;else{if(this.focusedValue)this.selectedValues=[this.focusedValue];this.isNavigating=!1}}deselectAll(){this.selectedValues=[]}toggleSelected(w){if(this.filteredOptions.length===0)return;if(this.multiple)if(this.selectedValues.includes(w))this.selectedValues=this.selectedValues.filter(($)=>$!==w);else this.selectedValues=[...this.selectedValues,w];else this.selectedValues=[w]}#J(w){if(w!==this.#Y){this.#Y=w;let $=this.options;if(w)this.filteredOptions=$.filter((Y)=>this.#A(w,Y));else this.filteredOptions=[...$];if(this.#w=GK(this.focusedValue,this.filteredOptions),this.focusedValue=this.filteredOptions[this.#w]?.value,!this.multiple)if(this.focusedValue!==void 0)this.toggleSelected(this.focusedValue);else this.deselectAll()}}}class NK extends CJ{options;cursor=0;#w;getGroupItems(w){return this.options.filter(($)=>$.group===w)}isGroupSelected(w){let $=this.getGroupItems(w),Y=this.value;if(Y===void 0)return!1;return $.every((A)=>Y.includes(A.value))}toggleValue(){let w=this.options[this.cursor];if(this.value===void 0)this.value=[];if(w.group===!0){let $=String(w.value),Y=this.getGroupItems($);if(this.isGroupSelected($))this.value=this.value.filter((A)=>Y.findIndex((X)=>X.value===A)===-1);else this.value=[...this.value,...Y.map((A)=>A.value)];this.value=Array.from(new Set(this.value))}else{let $=this.value.includes(w.value);this.value=$?this.value.filter((Y)=>Y!==w.value):[...this.value,w.value]}}constructor(w){super(w,!1);let{options:$}=w;this.#w=w.selectableGroups!==!1,this.options=Object.entries($).flatMap(([Y,A])=>[{value:Y,group:!0,label:Y},...A.map((X)=>({...X,group:Y}))]),this.value=[...w.initialValues??[]],this.cursor=Math.max(this.options.findIndex(({value:Y})=>Y===w.cursorAt),this.#w?0:1),this.on("cursor",(Y)=>{switch(Y){case"left":case"up":{this.cursor=this.cursor===0?this.options.length-1:this.cursor-1;let A=this.options[this.cursor]?.group===!0;if(!this.#w&&A)this.cursor=this.cursor===0?this.options.length-1:this.cursor-1;break}case"down":case"right":{this.cursor=this.cursor===this.options.length-1?0:this.cursor+1;let A=this.options[this.cursor]?.group===!0;if(!this.#w&&A)this.cursor=this.cursor===this.options.length-1?0:this.cursor+1;break}case"space":this.toggleValue();break}})}}var EK=C6();var e=(w,$)=>EK?w:$,Y4=e("◆","*"),A4=e("■","x"),X4=e("▲","x"),J4=e("◇","o"),U4=e("┌","T"),fK=e("│","|"),Q4=e("└","—"),W4=e("●",">"),B4=e("○"," "),j4=e("◻","[•]"),z4=e("◼","[+]"),G4=e("◻","[ ]"),K4=e("▪","•"),F4=e("─","-"),q4=e("╮","+"),N4=e("├","+"),E4=e("╯","+"),f4=e("●","•"),T4=e("◆","*"),H4=e("▲","!"),R4=e("■","x");var M4={light:e("─","-"),heavy:e("━","="),block:e("█","#")};function TK(){return`${QA.gray(fK)} `}var I4=TK();qU();import{homedir as NU}from"node:os";import{join as EU,resolve as LF}from"node:path";var __dirname="/home/runner/work/rpx/rpx/packages/rpx/src",Y9={from:"localhost:5173",to:"stacks.localhost",cleanUrls:!1,https:{basePath:"",caCertPath:EU(NU(),".stacks","ssl","stacks.localhost.ca.crt"),certPath:EU(NU(),".stacks","ssl","stacks.localhost.crt"),keyPath:EU(NU(),".stacks","ssl","stacks.localhost.crt.key")},cleanup:{certs:!1,hosts:!1},vitePluginUsage:!1,verbose:!0,changeOrigin:!1,regenerateUntrustedCerts:!0},fU=null;async function A9(){if(!fU)fU=await FU({name:"rpx",cwd:LF(__dirname,".."),defaultConfig:Y9});return fU}var F1=Y9;import{existsSync as _F,readdirSync as SF,readFileSync as ZF,statSync as kF}from"node:fs";import{homedir as J9}from"node:os";import{isAbsolute as hF,join as N1}from"node:path";var U9=["~/Code"],Q9=["localhost","test"],DF=1800000,TU={dirExists:(w)=>{try{return kF(w).isDirectory()}catch{return!1}},fileExists:(w)=>{try{return _F(w)}catch{return!1}},readText:(w)=>{try{return ZF(w,"utf8")}catch{return null}}};function HU(w,$){if(w==="~")return $;if(w.startsWith("~/"))return N1($,w.slice(2));return w}function xF(w){let $=w.indexOf(":");return($===-1?w:w.slice(0,$)).toLowerCase()}function rA(w){return w.replace(/[^a-z0-9._-]/gi,"-").replace(/^[-.]+|[-.]+$/g,"")||"site"}function PF(w,$){for(let Y of $){let A=`.${Y}`;if(w.endsWith(A)){let X=w.slice(0,-A.length);if(X.length>0&&!X.includes(".")&&/^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/i.test(X))return X}}return null}function bF(w,$){let Y=$.readText(N1(w,"rpx.site.json"));if(Y)try{let X=JSON.parse(Y);if(X&&typeof X==="object")return X}catch{}let A=$.readText(N1(w,"package.json"));if(A)try{let X=JSON.parse(A);if(X.rpx&&typeof X.rpx==="object")return X.rpx}catch{}return null}function uF(w){let $=w.selfRegisters??!1;return{command:w.command,env:w.env,urlEnv:w.urlEnv,selfRegisters:$,routes:w.routes??($?void 0:[{path:"/",portEnv:"PORT",defaultPort:3000,readyGate:!0}])}}function cF(w,$){let Y=bF(w,$);if(Y?.command)return uF(Y);let A=$.fileExists(N1(w,"buddy")),X=$.readText(N1(w,"package.json")),J=null;if(X)try{J=JSON.parse(X)}catch{J=null}let U={...J?.dependencies??{},...J?.devDependencies??{}};if(A||Object.keys(U).some((Q)=>Q==="stacks"||Q.startsWith("@stacksjs/")))return{command:A?"./buddy dev":"bun run dev",env:{STACKS_PROXY_MANAGED:"1"},urlEnv:["APP_URL"],routes:[{path:"/",portEnv:"PORT",defaultPort:3000,readyGate:!0},{path:"/api",portEnv:"PORT_API",defaultPort:3008,stripPrefix:!1,readyGate:!1},{path:"/docs",portEnv:"PORT_DOCS",defaultPort:3006,stripPrefix:!0,readyGate:!1}]};if(J?.scripts?.dev)return{command:"bun run dev",routes:[{path:"/",portEnv:"PORT",defaultPort:3000,readyGate:!0}]};return null}function vF(w,$={}){let Y={dirExists:$.dirExists??TU.dirExists,fileExists:$.fileExists??TU.fileExists,readText:$.readText??TU.readText},A=$.detect??cF,X=$.homeDir??J9(),J=w.tlds??Q9,U=(w.roots??U9).map((G)=>HU(G,X)),W=w.idleTimeoutMs??DF,Q=new Map;for(let G of w.sites??[])Q.set(G.to,G);let B=(G)=>G.idleTimeoutMs??W;function j(G){let K=pA(Q,G);if(!K)return null;let E=hF(K.dir)?K.dir:HU(K.dir,X),q=K.selfRegisters??!1,N=K.routes??[];if(!q&&N.length===0)N=A(E,Y)?.routes??[{path:"/",portEnv:"PORT",defaultPort:3000,readyGate:!0}];let T=X9({...K.env??{}},void 0,G);return{host:G,id:rA(G),dir:E,command:K.command,env:T,routes:N,selfRegisters:q,idleTimeoutMs:B(K),source:"config"}}function z(G){let K=PF(G,J);if(!K)return null;for(let E of U){let q=N1(E,K);if(!Y.dirExists(q))continue;let N=A(q,Y);if(!N)continue;let T=N.selfRegisters??!1;return{host:G,id:rA(G),dir:q,command:N.command,env:X9({...N.env??{}},N.urlEnv,G),routes:T?[]:N.routes??[],selfRegisters:T,idleTimeoutMs:W,source:"discovered"}}return null}return{resolve(G){let K=xF(G);if(!K)return null;return j(K)??z(K)}}}function iF(w){try{return SF(w,{withFileTypes:!0}).filter(($)=>$.isDirectory()).map(($)=>$.name)}catch{return[]}}function W9(w,$={}){let Y=$.homeDir??J9(),A=w.tlds??Q9,X=(w.roots??U9).map((z)=>HU(z,Y)),J=$.readdir??iF,U=vF(w,$),W=[],Q=new Set,B=(z)=>{if(z&&!Q.has(z.host))Q.add(z.host),W.push(z)};for(let z of w.sites??[])if(!z.to.includes("*"))B(U.resolve(z.to));let j=A[0]??"localhost";for(let z of X)for(let G of J(z))B(U.resolve(`${G}.${j}`));return W}function X9(w,$,Y){if(!$)return w;let A=`https://${Y}`;for(let X of $)if(w[X]===void 0)w[X]=A;return w}lw();L8();k8();h8();dY();x8();P8();xW();iW();mY();cY();t$();n8();JY();X0();import{spawn as x5}from"node:child_process";import*as u0 from"node:fs/promises";import{homedir as P5}from"node:os";import*as kw from"node:path";import*as C from"node:process";var AM=5000;function Aw(){return kw.join(P5(),".stacks","rpx")}function x$(w=Aw()){return kw.join(w,"daemon.pid")}async function D$(w=Aw()){try{let $=await u0.readFile(x$(w),"utf8"),Y=Number.parseInt($.trim(),10);if(!Number.isFinite(Y)||Y<=0)return null;return Y}catch($){if($.code==="ENOENT")return null;throw $}}async function wJ(w=Aw()){let $=await D$(w);return $!==null&&b0($)}async function b5(w=Aw()){await u0.mkdir(w,{recursive:!0});let $=x$(w);while(!0){try{let A=await u0.open($,"wx");try{await A.write(`${C.pid}
335
+ `)}finally{await A.close()}return $}catch(A){if(A.code!=="EEXIST")throw A}let Y=await D$(w);if(Y!==null&&b0(Y))throw Error(`rpx daemon already running (pid=${Y})`);await u0.unlink($).catch(()=>{})}}async function QY(w=Aw()){await u0.unlink(x$(w)).catch(()=>{})}var o8=new Map;function e8(w){for(let[$,Y]of o8)if(!w.has($))n$(Y),o8.delete($)}function XM(w,$){let Y=LW($??"localhost:1");if(w.upstreams.length!==Y.length)return!1;return w.upstreams.every((A,X)=>A.url===Y[X])}function u5(w){let $=w.cleanUrls??!1,Y=_w(w.path),A=t1(w.auth);if(w.static)return{static:iY(w.static,$),cleanUrls:$,basePath:Y,auth:A};let X=w.from??"localhost:1",J=L$(X),U=new URL(J.startsWith("http")?J:`http://${J}`),W=o8.get(w.id);if(W&&!XM(W,X))n$(W),W=void 0;if(!W)W=p1(X,w.loadBalancer),r1(W),o8.set(w.id,W);return{sourceHost:U.host,upstreamPool:W,cleanUrls:$,changeOrigin:w.changeOrigin??!1,pathRewrites:w.pathRewrites,basePath:Y,auth:A}}function JM(w){return w.find((Y)=>!/^api\./.test(Y)&&!/^docs\./.test(Y)&&!/^dashboard\./.test(Y))??w[0]??"rpx.localhost"}async function s8(w,$,Y=[],A=!1){let X=await Sw($,w.verbose),J=[...new Set([...X.map((j)=>j.to).filter(Boolean),...Y])],U=JM(J),W=[...new Set([U,...J,"rpx.localhost"])],Q=OW(J,U,w.verbose);if(typeof w.https==="object"&&typeof Q.https==="object")Q.https={...Q.https,...w.https};let B=await Q$(Q);if(B&&(A||!gX(y8,W)))F("daemon",`regenerating shared cert for host(s): ${W.join(", ")}`,w.verbose),O8(),B=null;if(!B)F("daemon","no usable cert on disk, generating one via tlsx",w.verbose),await n1({...Q,forceRegenerate:!0}),B=await Q$(Q);if(!B)throw Error("failed to bootstrap TLS for rpx daemon");return B}async function UM(w,$,Y,A){let X=C.env.SUDO_PASSWORD,J=C.env.HOME??P5(),U=[C.execPath,...C.argv.slice(1)],W=[`HOME=${J}`,`PATH=${C.env.PATH??""}`];if(A)W.push("RPX_VERBOSE=1");for(let[E,q]of Object.entries(C.env))if(q!==void 0&&E!=="RPX_VERBOSE"&&/^(?:RPX_|STACKS_RPX_)/.test(E))W.push(`${E}=${q}`);let Q=X?["-S","-p","","env",...W,...U]:["-n","env",...W,...U];F("daemon",`elevating daemon via sudo for privileged ports ${$}/${Y}`,A);let B=x5("sudo",Q,{detached:!0,stdio:["pipe","ignore","ignore"]}),j=null,z=null;if(B.once("error",(E)=>{j=E}),B.once("exit",(E)=>{z=E??0}),X&&B.stdin)B.stdin.write(`${X}
336
+ `),B.stdin.end();B.unref();let G=x$(w),K=Date.now()+15000;while(Date.now()<K){if(j)throw j;let E=await D$(w);if(E!==null&&b0(E)){if(A)H.success(`rpx daemon elevated to root (pid=${E}, https on :${$})`);return{httpsPort:$,httpPort:Y,pidPath:G,done:Promise.resolve(),stop:async()=>{try{C.kill(E,"SIGTERM")}catch{}},ensureCert:()=>Promise.resolve(!1),listSites:()=>[]}}if(z!==null&&z!==0)throw Error(`rpx daemon could not elevate to bind :${$} (sudo exited ${z}). Set SUDO_PASSWORD in .env or run \`sudo -v\` first.`);await new Promise((q)=>setTimeout(q,50))}throw Error(`rpx daemon failed to elevate within 15000ms (rpxDir=${w})`)}var k5=!1;function XB(){if(k5)return;k5=!0,C.on("uncaughtException",(w)=>{H.error(`rpx daemon: uncaught exception (continuing): ${w?.stack??w}`)}),C.on("unhandledRejection",(w)=>{H.error(`rpx daemon: unhandled rejection (continuing): ${w}`)})}function c5(w,$,Y){let A;try{A=new URL(w.url)}catch{return new Response("Bad Request",{status:400})}let X=(w.headers.get("host")??A.hostname).split(":")[0];if(A.pathname.startsWith("/.well-known/acme-challenge/")){if($){let J=$.challengeStore.handlePath(A.pathname);if(J!==void 0)return new Response(J,{status:200,headers:{"content-type":"text/plain"}})}if(Y){let J=gY(Y,A.pathname);if(J!=null)return new Response(J,{status:200,headers:{"content-type":"text/plain"}})}if($)return new Response("challenge not found",{status:404})}if($&&!$.hasCert(X))$.ensureCert(X).catch(()=>{});return new Response(null,{status:301,headers:{Location:`https://${X}${A.pathname}${A.search}`}})}async function v5(w={}){XB();let $=w.verbose??!1,Y=w.rpxDir??Aw(),A=w.registryDir??kw.join(Y,"registry.d"),X=w.httpsPort??443,J=w.httpPort??80,U=w.hostname??"0.0.0.0",W=w.gcIntervalMs??AM;if(C.env.RPX_DAEMON_WORKER==="1")return BM({rpxDir:C.env.RPX_WORKER_RPXDIR??Y,registryDir:C.env.RPX_WORKER_REGISTRYDIR??A,httpsPort:Number.parseInt(C.env.RPX_WORKER_HTTPSPORT??"",10)||X,hostname:C.env.RPX_WORKER_HOSTNAME??U,verbose:C.env.RPX_WORKER_VERBOSE==="1"||$});let Q=X>0&&X<1024||J>0&&J<1024,B=typeof C.getuid==="function"&&C.getuid()===0;if(C.platform!=="win32"&&Q&&!B)return UM(Y,X,J,$);let j=Math.max(1,w.workers??(Number.parseInt(C.env.RPX_WORKERS??"",10)||1));if(j>1){if(w.onDemandSites?.enabled)H.warn("rpx: on-demand sites are not supported in cluster mode (workers > 1); ignoring");return jM(w,{rpxDir:Y,registryDir:A,httpsPort:X,httpPort:J,hostname:U,verbose:$,gcIntervalMs:W,workers:j})}let z=await b5(Y),G=new Map,K=(I,k)=>e1(G,I,k);function E(I){G=o1(I.map((Ow)=>({host:Ow.to,path:Ow.path,route:u5(Ow)}))),e8(new Set(I.map((Ow)=>Ow.id)));let k=Array.from(G.keys());F("daemon",`routing table now covers ${k.length} host(s): ${k.join(", ")||"<empty>"}`,$)}await YY(A,$).catch((I)=>{F("daemon",`initial gc failed: ${I}`,$)}),await XY({verbose:$}).catch((I)=>{F("daemon",`stale hosts GC on start failed: ${I}`,$)});let q=await Sw(A,$);E(q),await z$({rpxDir:Y,verbose:$}).catch((I)=>{F("daemon",`DNS reconcile on start failed: ${I}`,$)}),await s$(q,{rpxDir:Y,verbose:$,ownerPid:C.pid}).catch((I)=>{F("daemon",`DNS setup on start failed: ${I}`,$)});let N=[];if(w.productionCerts){if(N=await wY(w.productionCerts,$),$&&N.length>0)H.info(`SNI: serving ${N.length} real cert(s): ${N.map((I)=>I.serverName).join(", ")}`)}let T=new Set,R=null,y;if(w.onDemandSites?.enabled){if(R=new m8({resolver:DW(w.onDemandSites),registryDir:A,rpxDir:Y,verbose:$,startupTimeoutMs:w.onDemandSites.startupTimeoutMs,isHostRoutable:(I)=>D8(G,I)!==void 0,onSiteActivating:(I)=>{Cw(I)}}),y=async(I)=>{let k=await R.onRequest(I);switch(k.kind){case"ready":return{retry:!0};case"starting":return mW({host:k.host,sinceMs:k.sinceMs,logTail:k.logTail});case"failed":return gW({host:k.host,error:k.error,logTail:k.logTail});case"unknown":default:return}},$)H.info("rpx: on-demand sites enabled")}let V=a1(K,$,y),f=s1($),M=null;if(N.length===0)M=await s8(w,A);let O=w.onDemandTls,S=O?.enabled?new r$({config:O,certsDir:O.certsDir??w.productionCerts?.certsDir??kw.join(Y,"on-demand-certs"),initial:N,verbose:$,onCertAdded:(I)=>{bw(I)}}):null;function B0(I){if(I.length>0)return _$(I.map((k)=>({serverName:k.serverName,cert:k.cert,key:k.key})));return _$({key:M.key,cert:M.cert,ca:M.ca,requestCert:!1,rejectUnauthorized:!1})}function a0(I){return Bun.serve({port:X,hostname:U,reusePort:g1(),tls:B0(I),fetch(k,Ow){return V(k,Ow)},websocket:f,error(k){return F("daemon",`https server error: ${k}`,$),new Response(`Server Error: ${k.message}`,{status:500})}})}let Kw=(I)=>[...new Set(I.map((k)=>k.to).filter(Boolean))],P$=(I)=>{if(!M)return N;return yW([...Kw(I),...T,"rpx.localhost"],M)},xw=a0(S?S.sniEntries():N.length>0?N:P$(q)),Pw=null,Fw=!1;async function bw(I){if(yw)return;if(Pw=I,Fw)return;Fw=!0;try{while(!yw&&Pw){let k=Pw;Pw=null,F("daemon",`rebuilding :443 with ${k.length} SNI cert(s)`,$),xw.stop(!1);let Ow,FJ=!1,EB=60,B6=500;for(let qJ=0;!yw&&!FJ;qJ++)try{xw=a0(k),FJ=!0;break}catch(j6){if(Ow=j6,qJ>=EB)break;await new Promise((z6)=>setTimeout(z6,Math.min(25*2**Math.min(qJ,4),B6)))}if(!FJ)H.error(`rpx: CRITICAL — could not rebind :443 after ${EB} attempts issuing cert; HTTPS unbound until the next cert event or a gateway restart: ${Ow?.message}`)}}finally{Fw=!1}}let s0=null;if(J>0)s0=Bun.serve({port:J,hostname:U,fetch(I){return c5(I,S,w.acmeChallengeWebroot)},error(){return new Response("Bad Request",{status:400})}});if($)H.success(`rpx daemon listening on https://${U}:${X}${s0?` (http→https on :${J})`:""}`),H.info(`pid file: ${z}`),H.info(`registry: ${A}`);async function Z(I){if(yw||N.length>0||S||!M)return;try{M=await s8(w,A,[...T]),await bw(P$(I))}catch(k){F("daemon",`TLS sync on registry change failed: ${k}`,$)}}async function Cw(I){if(yw||N.length>0||S||!M||!I)return;if(T.has(I))return;T.add(I);try{M=await s8(w,A,[...T],!0);let k=await Sw(A,$);await bw(P$(k))}catch(k){F("daemon",`dev cert refresh for ${I} failed: ${k}`,$)}}let BY=rY((I)=>{E(I),Z(I),s$(I,{rpxDir:Y,verbose:$,ownerPid:C.pid}).catch((k)=>{F("daemon",`DNS sync on registry change failed: ${k}`,$)})},{dir:A,verbose:$}),e$=setInterval(()=>{YY(A,$).then((I)=>{if(I>0)F("daemon",`gc reaped ${I} stale entries`,$)}).catch((I)=>{F("daemon",`periodic gc failed: ${I}`,$)}),XY({verbose:$}).then((I)=>{if(I.length>0)F("daemon",`gc reaped stale hosts entries: ${I.join(", ")}`,$)}).catch((I)=>{F("daemon",`periodic hosts gc failed: ${I}`,$)})},W);if(typeof e$.unref==="function")e$.unref();let yw=!1,jY,w1=new Promise((I)=>{jY=I});async function KJ(){if(yw)return w1;if(yw=!0,clearInterval(e$),BY.close(),await R?.stopAll().catch((I)=>{F("daemon",`site supervisor stopAll failed: ${I}`,$)}),xw.stop(!1),s0?.stop(!1),await k$({rpxDir:Y,verbose:$}).catch((I)=>{F("daemon",`DNS teardown failed: ${I}`,$)}),e8(new Set),await QY(Y),$)H.info("rpx daemon stopped");return jY(),w1}let NB=(I)=>{F("daemon",`received ${I}, shutting down`,$),KJ().catch(()=>{})};return C.once("SIGINT",NB),C.once("SIGTERM",NB),{stop:KJ,done:w1,httpsPort:typeof xw.port==="number"?xw.port:X,httpPort:s0&&typeof s0.port==="number"?s0.port:J,pidPath:z,ensureCert:(I)=>S?S.ensureCert(I):Promise.resolve(!1),listSites:()=>R?.list()??[]}}function JB(w){return kw.join(w,"cluster-sni.json")}async function h5(w,$,Y){let A=JB(w),X=`${A}.${C.pid}.tmp`;await u0.writeFile(X,JSON.stringify({sni:$,dev:Y}),"utf8"),await u0.rename(X,A)}async function D5(w){try{return JSON.parse(await u0.readFile(JB(w),"utf8"))}catch{return{sni:[],dev:null}}}function QM(w){if(w.sni.length>0)return _$(w.sni.map(($)=>({serverName:$.serverName,cert:$.cert,key:$.key})));if(w.dev)return _$({key:w.dev.key,cert:w.dev.cert,ca:w.dev.ca,requestCert:!1,rejectUnauthorized:!1});return}function WM(){let w=C.execPath,$=C.env.RPX_WORKER_BIN;if($)return[w,$,"daemon:start"];let Y=kw.basename(w).toLowerCase();if((Y==="bun"||Y==="node"||Y.startsWith("bun-"))&&C.argv[1])return[w,C.argv[1],"daemon:start"];return[w,"daemon:start"]}async function BM(w){XB();let{rpxDir:$,registryDir:Y,httpsPort:A,hostname:X,verbose:J}=w,U=new Map,W=(f,M)=>e1(U,f,M),Q=(f)=>{U=o1(f.map((M)=>({host:M.to,path:M.path,route:u5(M)}))),e8(new Set(f.map((M)=>M.id)))};Q(await Sw(Y,J));let B=a1(W,J),j=s1(J),z=!1,G=(f)=>Bun.serve({port:A,hostname:X,reusePort:!0,tls:QM(f),fetch(M,O){return B(M,O)},websocket:j,error(M){return F("daemon",`worker https error: ${M}`,J),new Response(`Server Error: ${M.message}`,{status:500})}}),K=G(await D5($));async function E(){if(z)return;let f=await D5($),M=null;for(let S=0;S<20&&!z;S++)try{M=G(f);break}catch{await new Promise((B0)=>setTimeout(B0,25))}if(!M){F("daemon","worker reloadTls: could not bind new listener; keeping current",J);return}let O=K;K=M,O.stop(!1)}let q=rY((f)=>Q(f),{dir:Y,verbose:J}),N=()=>{E().catch(()=>{})};C.on("SIGHUP",N);let T,R=new Promise((f)=>{T=f});async function y(){if(z)return R;return z=!0,C.off("SIGHUP",N),q.close(),K.stop(!1),e8(new Set),T(),R}let V=()=>{y().then(()=>C.exit(0)).catch(()=>C.exit(0))};if(C.once("SIGTERM",V),C.once("SIGINT",V),J)H.success(`rpx worker (pid ${C.pid}) serving :${A}`);return{stop:y,done:R,httpsPort:typeof K.port==="number"?K.port:A,httpPort:0,pidPath:"",ensureCert:()=>Promise.resolve(!1),listSites:()=>[]}}async function jM(w,$){XB();let{rpxDir:Y,registryDir:A,httpsPort:X,httpPort:J,hostname:U,verbose:W,gcIntervalMs:Q,workers:B}=$,j=await b5(Y),z=[];if(w.productionCerts)z=await wY(w.productionCerts,W);let G=null;if(z.length===0)G=await s8(w,A);let K=G?{key:G.key,cert:G.cert,ca:Array.isArray(G.ca)?G.ca.join(`
337
+ `):G.ca}:null,E=!1,q=[];function N(Z){for(let Cw of q)try{Cw.kill(Z)}catch{}}async function T(Z){await h5(Y,Z,K),N("SIGHUP")}let R=w.onDemandTls,y=R?.enabled?new r$({config:R,certsDir:R.certsDir??w.productionCerts?.certsDir??kw.join(Y,"on-demand-certs"),initial:z,verbose:W,onCertAdded:(Z)=>{T(Z)}}):null;await h5(Y,y?y.sniEntries():z,K);let V=await Sw(A,W);await z$({rpxDir:Y,verbose:W}).catch((Z)=>{F("daemon",`DNS reconcile on start failed: ${Z}`,W)}),await s$(V,{rpxDir:Y,verbose:W,ownerPid:C.pid}).catch((Z)=>{F("daemon",`DNS setup on start failed: ${Z}`,W)}),await YY(A,W).catch(()=>{}),await XY({verbose:W}).catch(()=>{});let f=rY((Z)=>{s$(Z,{rpxDir:Y,verbose:W,ownerPid:C.pid}).catch((Cw)=>{F("daemon",`DNS sync on registry change failed: ${Cw}`,W)})},{dir:A,verbose:W}),M=setInterval(()=>{YY(A,W).catch(()=>{}),XY({verbose:W}).catch(()=>{})},Q);M.unref?.();let O=null;if(J>0)O=Bun.serve({port:J,hostname:U,fetch(Z){return c5(Z,y,w.acmeChallengeWebroot)},error(){return new Response("Bad Request",{status:400})}});let S=10,B0=60000,a0=30000,Kw=0,P$=Date.now();function xw(){if(E)return;let Z={...C.env,RPX_DAEMON_WORKER:"1",RPX_WORKERS:"1",RPX_WORKER_RPXDIR:Y,RPX_WORKER_REGISTRYDIR:A,RPX_WORKER_HTTPSPORT:String(X),RPX_WORKER_HOSTNAME:U,RPX_WORKER_VERBOSE:W?"1":"0"},Cw=Bun.spawn(WM(),{env:Z,stdout:"inherit",stderr:"inherit",stdin:"ignore",onExit(BY,e$){if(E)return;let yw=q.indexOf(BY);if(yw!==-1)q.splice(yw,1);let jY=Date.now();if(jY-P$>B0)P$=jY,Kw=0;if(Kw++,Kw>S){H.error(`rpx: worker keeps exiting (code ${e$}); giving up after ${S} restarts in ${Math.round(B0/1000)}s`);return}let w1=Math.min(a0,100*2**Math.min(Kw,8));F("daemon",`worker exited (code ${e$}); respawning in ${w1}ms (restart ${Kw}/${S})`,W),setTimeout(xw,w1).unref?.()}});q.push(Cw)}for(let Z=0;Z<B;Z++)xw();if(W)H.success(`rpx coordinator listening on https://${U}:${X} via ${B} worker(s)${O?` (http→https on :${J})`:""}`),H.info(`pid file: ${j}`);let Pw,Fw=new Promise((Z)=>{Pw=Z});async function bw(){if(E)return Fw;if(E=!0,clearInterval(M),f.close(),O?.stop(!1),N("SIGTERM"),await Promise.race([Promise.all(q.map((Z)=>Z.exited)),new Promise((Z)=>setTimeout(Z,3000))]),N("SIGKILL"),await k$({rpxDir:Y,verbose:W}).catch((Z)=>{F("daemon",`DNS teardown failed: ${Z}`,W)}),await QY(Y),await u0.unlink(JB(Y)).catch(()=>{}),W)H.info("rpx coordinator stopped");return Pw(),Fw}let s0=(Z)=>{F("daemon",`coordinator received ${Z}, shutting down`,W),bw().catch(()=>{})};return C.once("SIGINT",s0),C.once("SIGTERM",s0),{stop:bw,done:Fw,httpsPort:X,httpPort:J,pidPath:j,ensureCert:(Z)=>y?y.ensureCert(Z):Promise.resolve(!1),listSites:()=>[]}}function zM(){let w=C.execPath,$=kw.basename(w).toLowerCase();if(($==="bun"||$==="node"||$.startsWith("bun-"))&&C.argv[1])return[w,C.argv[1],"daemon:start"];return[w,"daemon:start"]}async function i5(w={}){let $=w.rpxDir??Aw(),Y=w.verbose??!1;await z$({rpxDir:$,verbose:Y}).catch((j)=>{F("daemon",`DNS reconcile before ensureDaemonRunning: ${j}`,Y)});let A=await D$($);if(A!==null&&b0(A))return F("daemon",`ensureDaemonRunning: already running pid=${A}`,Y),{pid:A,spawned:!1};if(A!==null)F("daemon",`ensureDaemonRunning: clearing stale pid=${A}`,Y),await QY($);await u0.mkdir($,{recursive:!0});let X=w.spawnCommand??zM();if(X.length===0)throw Error("ensureDaemonRunning: spawnCommand is empty");F("daemon",`spawning daemon: ${X.join(" ")}`,Y);let J=x5(X[0],X.slice(1),{detached:!0,stdio:"ignore",cwd:w.spawnCwd??C.cwd(),env:w.spawnEnv?{...C.env,...w.spawnEnv}:C.env});J.unref();let U=null;J.once("error",(j)=>{U=j});let W=w.startupTimeoutMs??5000,Q=w.pollIntervalMs??50,B=Date.now()+W;while(Date.now()<B){if(U)throw U;let j=await D$($);if(j!==null&&b0(j))return F("daemon",`daemon registered with pid=${j}`,Y),{pid:j,spawned:!0};await new Promise((z)=>setTimeout(z,Q))}if(U)throw U;throw Error(`rpx daemon failed to start within ${W}ms (rpxDir=${$})`)}async function m5(w={}){let $=w.rpxDir??Aw(),Y=w.verbose??!1,A=w.timeoutMs??5000,X=w.pollIntervalMs??50,J=w.forceAfterTimeout??!0,U=await D$($);if(U===null||!b0(U)){if(U!==null)await QY($);return await z$({rpxDir:$,verbose:Y}).catch(()=>{}),{stopped:!1,pid:U,forced:!1}}try{C.kill(U,"SIGTERM")}catch(Q){let B=Q.code;if(B==="ESRCH")return await QY($),{stopped:!1,pid:U,forced:!1};if(B==="EPERM")U$(`kill -TERM ${U}`);else throw Q}let W=Date.now()+A;while(Date.now()<W){if(!b0(U))return F("daemon",`daemon pid=${U} stopped cleanly`,Y),{stopped:!0,pid:U,forced:!1};await new Promise((Q)=>setTimeout(Q,X))}if(!J)throw Error(`rpx daemon (pid=${U}) did not exit within ${A}ms`);F("daemon",`daemon pid=${U} did not exit, escalating to SIGKILL`,Y);try{C.kill(U,"SIGKILL")}catch(Q){let B=Q.code;if(B==="EPERM")U$(`kill -KILL ${U}`);else if(B!=="ESRCH")throw Q}return await QY($),await k$({rpxDir:$,verbose:Y}).catch((Q)=>{F("daemon",`DNS teardown after SIGKILL: ${Q}`,Y)}),{stopped:!0,pid:U,forced:!0}}async function g5(w={}){let $=w.rpxDir??Aw();if(await wJ($))return;await z$({rpxDir:$,verbose:w.verbose})}lw();X0();import{spawn as GM}from"node:child_process";import*as $J from"node:process";class d5{processes=new Map;isShuttingDown=!1;async startProcess(w,$,Y){if(this.processes.has(w)){F("start",`Process ${w} is already running`,Y);return}let[A,...X]=$.command.split(" "),J=$.cwd||$J.cwd();F("start",`Starting process ${w}:`,Y),F("start",` Command: ${A} ${X.join(" ")}`,Y),F("start",` Working directory: ${J}`,Y),F("start",` Environment variables: ${Iw($.env)}`,Y);let U=GM(A,X,{cwd:J,env:{...$J.env,...$.env},shell:!0,stdio:"inherit"});return this.processes.set(w,{command:$.command,cwd:J,process:U,env:$.env}),new Promise((W,Q)=>{if(U.on("error",(B)=>{if(!this.isShuttingDown)F("start",`Process ${w} failed to start: ${B}`,Y),this.processes.delete(w),Q(B)}),U.on("exit",(B)=>{if(!this.isShuttingDown&&B!==null&&B!==0)F("start",`Process ${w} exited with code ${B}; leaving the proxy running`,Y),this.processes.delete(w),Q(Error(`Process ${w} exited with code ${B}`))}),Y)U.stdout?.on("data",(B)=>{F("process",`[${w}] ${B.toString().trim()}`,!0)}),U.stderr?.on("data",(B)=>{F("process",`[${w}] ERR: ${B.toString().trim()}`,!0)});setTimeout(()=>{if(!this.isShuttingDown&&U.killed)this.processes.delete(w),Q(Error(`Process ${w} was killed during startup`));else F("start",`Process ${w} started successfully`,Y),W()},1000)})}async stopProcess(w,$){let Y=this.processes.get(w);if(!Y?.process){F("start",`No process found for ${w}`,$);return}return F("start",`Stopping process ${w}`,$),new Promise((A)=>{if(!Y.process){A();return}Y.process.once("exit",()=>{this.processes.delete(w),F("start",`Process ${w} stopped`,$),A()});try{Y.process.kill("SIGTERM"),setTimeout(()=>{if(Y.process){F("start",`Force killing process ${w}`,$);try{Y.process.kill("SIGKILL")}catch(X){}}},3000)}catch(X){F("start",`Error stopping process ${w}: ${X}`,$),this.processes.delete(w),A()}})}async stopAll(w){if(this.isShuttingDown){F("start","Already shutting down, skipping duplicate stopAll call",w);return}this.isShuttingDown=!0,F("start","Stopping all processes",w);let $=Array.from(this.processes.keys()).map((Y)=>this.stopProcess(Y,w).catch((A)=>{H.error(`Failed to stop process ${Y}:`,A)}));await Promise.allSettled($),this.processes.clear(),this.isShuttingDown=!1}isRunning(w){let $=this.processes.get(w);return!!$?.process&&!$.process.killed}}var YJ=new d5;X0();import*as r0 from"node:fs/promises";import{homedir as KM}from"node:os";import*as UB from"node:path";import*as QB from"node:process";var FM=/^[a-zA-Z0-9._-]+$/;function o$(){return UB.join(KM(),".stacks","rpx","registry.d")}function WY(w){return typeof w==="string"&&w.length>0&&w.length<=128&&FM.test(w)}function WB(w,$){if(!WY($))throw Error(`invalid registry id: ${JSON.stringify($)}`);return UB.join(w,`${$}.json`)}function l5(w){if(!w||typeof w!=="object")return!1;let $=w,Y=$.pid===void 0||typeof $.pid==="number"&&Number.isInteger($.pid)&&$.pid>0,A=typeof $.from==="string"&&$.from.length>0||Array.isArray($.from)&&$.from.length>0,X=typeof $.static==="string"||!!$.static&&typeof $.static==="object"&&typeof $.static.dir==="string",J=$.path===void 0||typeof $.path==="string";return typeof $.id==="string"&&WY($.id)&&(A||X)&&typeof $.to==="string"&&$.to.length>0&&J&&Y&&typeof $.createdAt==="string"}async function qM(w){await r0.mkdir(w,{recursive:!0})}async function n5(w,$=o$(),Y){if(!l5(w))throw Error(`invalid registry entry: ${JSON.stringify(w)}`);await qM($);let A=WB($,w.id),X=`${A}.tmp.${QB.pid}.${Date.now()}`,J=JSON.stringify(w,null,2);try{await r0.writeFile(X,J,{encoding:"utf8",mode:420}),await r0.rename(X,A),F("registry",`wrote entry ${w.id} → ${A}`,Y)}catch(U){throw await r0.unlink(X).catch(()=>{}),U}}async function p5(w,$=o$(),Y){let A=WB($,w);try{await r0.unlink(A),F("registry",`removed entry ${w}`,Y)}catch(X){if(X.code!=="ENOENT")throw X}}async function BB(w,$=o$(),Y){let A=WB($,w);try{let X=await r0.readFile(A,"utf8"),J=JSON.parse(X);if(!l5(J))return F("registry",`entry ${w} failed validation, removing`,Y),await r0.unlink(A).catch(()=>{}),null;return J}catch(X){if(X.code==="ENOENT")return null;if(X instanceof SyntaxError)return F("registry",`entry ${w} has invalid JSON, removing`,Y),await r0.unlink(A).catch(()=>{}),null;throw X}}async function jB(w=o$(),$){let Y;try{Y=await r0.readdir(w)}catch(X){if(X.code==="ENOENT")return[];throw X}let A=[];for(let X of Y){if(!X.endsWith(".json"))continue;let J=X.slice(0,-5);if(!WY(J))continue;let U=await BB(J,w,$);if(U)A.push(U)}return A}lw();import{execSync as MM}from"node:child_process";import*as zJ from"node:http";import*as o5 from"node:net";import*as e5 from"node:os";import*as w6 from"node:path";import*as J0 from"node:process";var AJ=(w,$)=>(Y)=>`\x1B[${w}m${Y}\x1B[${$}m`,hw={bold:AJ(1,22),dim:AJ(2,22),green:AJ(32,39),cyan:AJ(36,39)};ZQ();pW();lw();t$();X0();import*as r5 from"node:fs";import*as t5 from"node:path";import*as Dw from"node:process";function NM(w,$){let A=($&&$!=="/"?`${w}${$}`:w).replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,128);return A.length>0?A:"rpx"}async function zB(w){if(w.proxies.length===0)throw Error("runViaDaemon: no proxies provided");let $=w.verbose??!1,Y=w.registryDir,A=new Set,X=w.proxies.map((G)=>{let K=G.id??NM(G.to,G.path);if(!nY(K))throw Error(`invalid registry id "${K}" derived from to="${G.to}"`);if(A.has(K))throw Error(`duplicate registry id "${K}" — set an explicit \`id\` on one of the proxies`);return A.add(K),{...G,id:K}}),J=new Date().toISOString();for(let G of X)await i8({id:G.id,from:G.from,to:G.to,path:G.path,pid:w.persistent?void 0:Dw.pid,cwd:Dw.cwd(),createdAt:J,cleanUrls:G.cleanUrls,changeOrigin:G.changeOrigin,pathRewrites:G.pathRewrites,static:G.static,loadBalancer:G.loadBalancer},Y,$);let U=await q5({rpxDir:w.rpxDir,verbose:$,spawnCommand:w.spawnCommand,startupTimeoutMs:w.startupTimeoutMs,spawnEnv:w.spawnEnv});for(let G of X){let K=G.static?`static ${typeof G.static==="string"?G.static:G.static.dir}`:G.from;H.success(`https://${G.to} → ${K}`)}if(H.info(`(via rpx daemon pid=${U.pid}; \`rpx daemon:status\` to inspect)`),w.detached)return;let W=!1,Q=Y??Zw(),B=X.map((G)=>G.id),j=async()=>{if(W)return;W=!0;for(let G of B)await pY(G,Y,$).catch((K)=>{F("runner",`removeEntry(${G}) failed: ${K}`,$)})},z=(G)=>{F("runner",`received ${G}, unregistering ${B.length} entries`,$),j().finally(()=>Dw.exit(0))};Dw.once("SIGINT",z),Dw.once("SIGTERM",z),Dw.once("exit",()=>{if(W)return;for(let G of B)try{r5.unlinkSync(t5.join(Q,`${G}.json`))}catch{}}),await new Promise(()=>{})}n8();L8();bW();lw();X0();import{spawn as EM}from"node:child_process";import*as XJ from"node:process";class JJ{processes=new Map;isShuttingDown=!1;async startProcess(w,$,Y){if(this.processes.has(w)){F("start",`Process ${w} is already running`,Y);return}let[A,...X]=$.command.split(" "),J=$.cwd||XJ.cwd();F("start",`Starting process ${w}:`,Y),F("start",` Command: ${A} ${X.join(" ")}`,Y),F("start",` Working directory: ${J}`,Y),F("start",` Environment variables: ${Iw($.env)}`,Y);let U=EM(A,X,{cwd:J,env:{...XJ.env,...$.env},shell:!0,stdio:"inherit"});return this.processes.set(w,{command:$.command,cwd:J,process:U,env:$.env}),new Promise((W,Q)=>{if(U.on("error",(B)=>{if(!this.isShuttingDown)F("start",`Process ${w} failed to start: ${B}`,Y),this.processes.delete(w),Q(B)}),U.on("exit",(B)=>{if(!this.isShuttingDown&&B!==null&&B!==0)F("start",`Process ${w} exited with code ${B}; leaving the proxy running`,Y),this.processes.delete(w),Q(Error(`Process ${w} exited with code ${B}`))}),Y)U.stdout?.on("data",(B)=>{F("process",`[${w}] ${B.toString().trim()}`,!0)}),U.stderr?.on("data",(B)=>{F("process",`[${w}] ERR: ${B.toString().trim()}`,!0)});setTimeout(()=>{if(!this.isShuttingDown&&U.killed)this.processes.delete(w),Q(Error(`Process ${w} was killed during startup`));else F("start",`Process ${w} started successfully`,Y),W()},1000)})}async stopProcess(w,$){let Y=this.processes.get(w);if(!Y?.process){F("start",`No process found for ${w}`,$);return}return F("start",`Stopping process ${w}`,$),new Promise((A)=>{if(!Y.process){A();return}Y.process.once("exit",()=>{this.processes.delete(w),F("start",`Process ${w} stopped`,$),A()});try{Y.process.kill("SIGTERM"),setTimeout(()=>{if(Y.process){F("start",`Force killing process ${w}`,$);try{Y.process.kill("SIGKILL")}catch(X){}}},3000)}catch(X){F("start",`Error stopping process ${w}: ${X}`,$),this.processes.delete(w),A()}})}async stopAll(w){if(this.isShuttingDown){F("start","Already shutting down, skipping duplicate stopAll call",w);return}this.isShuttingDown=!0,F("start","Stopping all processes",w);let $=Array.from(this.processes.keys()).map((Y)=>this.stopProcess(Y,w).catch((A)=>{H.error(`Failed to stop process ${Y}:`,A)}));await Promise.allSettled($),this.processes.clear(),this.isShuttingDown=!1}isRunning(w){let $=this.processes.get(w);return!!$?.process&&!$.process.killed}}var FS=new JJ;import{timingSafeEqual as fM}from"node:crypto";function TM(w,$){if(w==null)return!1;let Y=Buffer.from(w),A=Buffer.from($);if(Y.length!==A.length)return!1;return fM(Y,A)}function UJ(w){return w.toLowerCase().replace(/\.$/,"")}var HM=["/.well-known/acme-challenge/"];function RM(w){let $=w.headers.get("host");if($)return UJ($.split(":")[0]);try{return UJ(new URL(w.url).hostname)}catch{return""}}function a5(w){let $=w.header.toLowerCase(),Y=new Set,A=[];for(let Q of w.hosts){let B=UJ(Q);if(B.startsWith("*."))A.push(B);else Y.add(B)}let X=w.exemptPaths??HM,J=w.forbiddenMessage??`Forbidden: direct origin access is not allowed; requests must arrive via the CDN.
338
+ `,U=(Q)=>{let B=UJ(Q);return Y.has(B)||A.some((j)=>TY(B,j))},W=(Q)=>{let B=RM(Q);if(!U(B))return;let j="/";try{j=new URL(Q.url).pathname}catch{}if(X.some((z)=>j.startsWith(z)))return;if(TM(Q.headers.get($),w.value))return;return new Response(J,{status:403,headers:{"content-type":"text/plain"}})};return W.protects=U,W}k8();h8();cY();dY();x8();P8();mY();X0();var WJ=new JJ,IM="0.12.0",VM=new u8("0.0.0.0"),YA=new Set,jJ=new Set,GB=!1,QJ=null,KB=null;async function GJ(w){if(GB)return F("cleanup","Cleanup already in progress, skipping",w?.verbose),KB||Promise.resolve();GB=!0,F("cleanup","Starting cleanup process",w?.verbose),KB=new Promise(($)=>{QJ=$});try{await WJ.stopAll(w?.verbose),H.info("Shutting down proxy servers...");let $=[],Y=Array.from(YA).map((A)=>new Promise((X)=>{let J=A;try{if(typeof J.stop==="function")J.stop(!0),F("cleanup","Bun server stopped",w?.verbose),X();else if(typeof J.close==="function")J.close(()=>{F("cleanup","Server closed successfully",w?.verbose),X()});else X()}catch(U){F("cleanup",`Error stopping server: ${U}`,w?.verbose),X()}}));$.push(...Y),YA.clear();for(let A of jJ)n$(A);if(jJ.clear(),w?.hosts&&w.domains?.length){F("cleanup","Cleaning up hosts file entries",w?.verbose),F("cleanup",`Original domains for cleanup: ${JSON.stringify(w.domains)}`,w?.verbose);let A=w.domains.filter((X)=>{if(X==="test.local")return!0;return X!=="localhost"&&!X.startsWith("localhost.")&&X!=="127.0.0.1"});if(F("cleanup",`Filtered domains for cleanup: ${JSON.stringify(A)}`,w?.verbose),A.length>0)H.info("Cleaning up hosts file entries..."),$.push(G5(A,w?.verbose).then(()=>{F("cleanup",`Removed hosts entries for ${A.join(", ")}`,w?.verbose)}).catch((X)=>{F("cleanup",`Failed to remove hosts entries: ${X}`,w?.verbose),H.warn(`Failed to clean up hosts file entries for ${A.join(", ")}:`,X)}))}if(w?.certs&&w.domains?.length){F("cleanup","Cleaning up SSL certificates",w?.verbose),H.info("Cleaning up SSL certificates...");let A=w.domains.map(async(X)=>{try{await OG(X,w?.verbose),F("cleanup",`Removed certificates for ${X}`,w?.verbose)}catch(J){F("cleanup",`Failed to remove certificates for ${X}: ${J}`,w?.verbose),H.warn(`Failed to clean up certificates for ${X}:`,J)}});$.push(...A)}await Promise.allSettled($),F("cleanup","All cleanup tasks completed successfully",w?.verbose),H.success("All cleanup tasks completed successfully")}catch($){F("cleanup",`Error during cleanup: ${$}`,w?.verbose),H.error("Error during cleanup:",$)}finally{if(QJ)QJ();QJ=null,GB=!1;let $=w&&"vitePluginUsage"in w&&w.vitePluginUsage===!0;if(J0.env.NODE_ENV!=="test"&&J0.env.BUN_ENV!=="test"&&!$)J0.exit(0)}return KB}var FB=!1;function $6(w){if(FB){F("signal",`Received second ${w} signal, forcing exit`,!0),J0.exit(1);return}FB=!0,F("signal",`Received ${w} signal, initiating cleanup`,!0),GJ().catch(($)=>{F("signal",`Cleanup failed after ${w}: ${$}`,!0),J0.exit(1)}).finally(()=>{FB=!1})}J0.once("SIGINT",()=>$6("SIGINT"));J0.once("SIGTERM",()=>$6("SIGTERM"));J0.on("uncaughtException",(w)=>{H.error("Uncaught exception (continuing):",w)});J0.on("unhandledRejection",(w)=>{H.error("Unhandled rejection (continuing):",w)});async function AA(w,$,Y,A=5){F("connection",`Testing connection to ${w}:${$} (retries left: ${A})`,Y);let X=15000,J=Date.now();if(J0.env.RPX_BYPASS_CONNECTION_TEST==="true"){F("connection",`Bypassing connection test for ${w}:${$} due to RPX_BYPASS_CONNECTION_TEST flag`,Y);return}let U=()=>new Promise((W,Q)=>{let B=o5.connect({host:w,port:$,timeout:3000});B.once("connect",()=>{F("connection",`Successfully connected to ${w}:${$}`,Y),B.end(),W()}),B.once("timeout",()=>{F("connection",`Connection to ${w}:${$} timed out`,Y),B.destroy(),Q(Error("Connection timed out"))}),B.once("error",(j)=>{F("connection",`Failed to connect to ${w}:${$}: ${j}`,Y),B.destroy(),Q(j)})});try{await U()}catch(W){let Q=W;if(Date.now()-J>X){F("connection",`Connection test timed out after ${X}ms, but continuing anyway`,Y),H.warn(`Connection test to ${w}:${$} timed out, but RPX will try to proceed anyway.`);return}if(Q.code==="ECONNREFUSED"&&A>0)return F("connection",`Connection refused, server might be starting up. Retrying in 2 seconds... (${A} retries left)`,Y),await new Promise((j)=>setTimeout(j,2000)),AA(w,$,Y,A-1);if(A>0)try{F("connection",`Trying HTTP request to ${w}:${$}`,Y),await new Promise((j,z)=>{let G=zJ.request({hostname:w,port:$,path:"/",method:"HEAD",timeout:5000},(K)=>{F("connection",`Received HTTP response with status: ${K.statusCode}`,Y),j()});G.on("error",(K)=>z(K)),G.on("timeout",()=>{G.destroy(),z(Error("HTTP request timed out"))}),G.end()}),F("connection",`HTTP request to ${w}:${$} succeeded`,Y);return}catch(j){return F("connection",`HTTP request to ${w}:${$} failed: ${j}`,Y),F("connection",`Retrying socket connection in 2 seconds... (${A} retries left)`,Y),await new Promise((z)=>setTimeout(z,2000)),AA(w,$,Y,A-1)}let B=`Failed to connect to ${w}:${$} after ${5-A} attempts: ${Q.message}`;F("connection",`${B}. To bypass this check set RPX_BYPASS_CONNECTION_TEST=true`,Y),H.warn(B),H.warn("RPX will try to continue anyway. If you're sure this is correct, you can set RPX_BYPASS_CONNECTION_TEST=true to skip this check.")}}async function Y6(w){F("server",`Starting server with options: ${Iw(w)}`,w.verbose);let $=L$(w.from),Y=new URL($.startsWith("http")?$:`http://${$}`),A=new URL((w.to?.startsWith("http")?w.to:`http://${w.to}`)||"rpx.localhost"),X=Number.parseInt(Y.port)||(Y.protocol.includes("https:")?443:80),J=[A.hostname];if(qB(w)&&!A.hostname.includes("localhost")&&!A.hostname.includes("127.0.0.1")){F("hosts",`Checking if hosts file entry exists for: ${A.hostname}`,w?.verbose);try{if(!(await oY(J,w.verbose))[0]){H.info(`Adding ${A.hostname} to hosts file...`),H.info("This may require sudo/administrator privileges");try{await sY(J,w.verbose)}catch(Q){if(H.error("Failed to add hosts entry:",Q.message),H.warn("You can manually add this entry to your hosts file:"),H.warn(`127.0.0.1 ${A.hostname}`),H.warn(`::1 ${A.hostname}`),J0.platform==="win32")H.warn("On Windows:"),H.warn("1. Run notepad as administrator"),H.warn("2. Open C:\\Windows\\System32\\drivers\\etc\\hosts");else H.warn("On Unix systems:"),H.warn("sudo nano /etc/hosts")}}else F("hosts",`Host entry already exists for ${A.hostname}`,w.verbose)}catch(W){H.error("Failed to check hosts file:",W.message)}}try{await AA(Y.hostname,X,w.verbose)}catch(W){F("server",`Connection test failed: ${W}`,w.verbose),H.error(W.message),H.warn("Continuing with proxy setup despite connection test failure..."),H.info("If you need to bypass connection testing, set environment variable RPX_BYPASS_CONNECTION_TEST=true")}let U=w._cachedSSLConfig||null;if(w.https)try{if(w.https===!0)w.https=PY({...w,to:A.hostname});if(U=await Q$({...w,to:A.hostname,https:w.https}),!U){if(F("ssl",`Generating new certificates for ${A.hostname}`,w.verbose),await n1({...w,from:Y.toString(),to:A.hostname,https:w.https}),U=await Q$({...w,to:A.hostname,https:w.https}),!U)throw Error(`Failed to load SSL configuration after generating certificates for ${A.hostname}`)}}catch(W){throw F("server",`SSL setup failed: ${W}`,w.verbose),W}F("server",`Setting up reverse proxy with SSL config for ${A.hostname}`,w.verbose),await yM({...w,from:$,originalFrom:w.from||$,to:A.hostname,fromPort:X,sourceUrl:{hostname:Y.hostname,host:Y.host},ssl:U})}async function CM(w,$,Y,A,X,J,U,W,Q,B,j,z){F("proxy",`Creating proxy server ${w} -> ${$} with cleanUrls: ${W}`,U);let G=p1(j??A.host,z);r1(G);let K=[{host:$,route:{sourceHost:A.host,upstreamPool:G,cleanUrls:W||!1,changeOrigin:Q||!1,basePath:"/",auth:B}}];if(!BJ({routeEntries:K,listenPort:Y,sslConfig:X,originGuard:null,verbose:U??!1}))throw n$(G),Error(`Failed to start proxy server for ${$} on port ${Y}`);jJ.add(G),LM({from:w,to:$,vitePluginUsage:J,listenPort:Y,ssl:!!X,cleanUrls:W,verbose:U})}async function yM(w){F("setup",`Setting up reverse proxy: ${Iw(w)}`,w.verbose);let{from:$,originalFrom:Y,to:A,sourceUrl:X,ssl:J,verbose:U,cleanup:W,vitePluginUsage:Q,changeOrigin:B,cleanUrls:j}=w,z=80,G=443,K="0.0.0.0",E=w.portManager||VM,q=qB(w);try{if(q&&A&&!A.includes("localhost")&&!A.includes("127.0.0.1")){if(!(await oY([A],U))[0]){H.warn(`The hostname ${A} isn't in your hosts file. Adding it now...`);try{await sY([A],U),H.success(`Added ${A} to your hosts file.`)}catch(V){H.error(`Failed to add ${A} to your hosts file: ${V}`),H.info(`You may need to manually add '127.0.0.1 ${A}' to your /etc/hosts file.`)}}}else if(q&&J0.platform!=="darwin"&&A&&A.includes("localhost")&&!A.match(/^(localhost|127\.0\.0\.1)$/)){if(!(await oY([A],U))[0]){F("hosts",`${A} not found in hosts file, adding...`,U);try{await sY([A],U)}catch(V){F("hosts",`Failed to add ${A} to hosts file: ${V}`,U)}}}if(J&&!E.usedPorts.has(z)){if(!await Z$(z,K,U))F("setup","Starting HTTP redirect server",U),A6(U),E.usedPorts.add(z);else if(F("setup","Port 80 is in use, skipping HTTP redirect",U),U)H.warn("Port 80 is in use, HTTP to HTTPS redirect will not be available")}let N=J?G:z,T=await Z$(N,K,U),R;if(T){if(F("setup",`Port ${N} is already in use`,U),U)H.warn(`Port ${N} is already in use. This may be another instance of rpx or another service.`);if(N===443){if(R=await E.getNextAvailablePort(3443,!0),F("setup",`Using port ${R} instead of ${N}`,U),U)H.info(`Using port ${R} instead. Access your site at https://${A}:${R}`)}else if(R=await E.getNextAvailablePort(N+1000,!0),F("setup",`Using port ${R} instead of ${N}`,U),U)H.info(`Using port ${R} instead. Access your site at http://${A}:${R}`)}else R=N,E.usedPorts.add(R),F("setup",`Using standard ${N===443?"HTTPS":"HTTP"} port ${N} for ${A}`,U);await CM($,A,R,X,J,Q,U,j,B,t1(w.auth),Y,w.loadBalancer)}catch(N){F("setup",`Setup failed: ${N}`,U),H.error(`Failed to setup reverse proxy: ${N.message}`),GJ({domains:[A],hosts:typeof W==="boolean"?W:W?.hosts,certs:typeof W==="boolean"?W:W?.certs,verbose:U,vitePluginUsage:Q})}}function A6(w,$=80,Y=443,A,X){F("redirect",`Starting HTTP redirect server on port ${$}`,w);let J=zJ.createServer((U,W)=>{let Q=U.url?U.url.split("?",1)[0]:"";if(Q.startsWith("/.well-known/acme-challenge/")){if(X){let G=X.challengeStore.handlePath(Q);if(G!==void 0){F("redirect",`Serving on-demand ACME challenge ${Q}`,w),W.writeHead(200,{"content-type":"text/plain"}),W.end(G);return}}if(A){let G=gY(A,Q);if(G!=null){F("redirect",`Serving ACME challenge ${Q}`,w),W.writeHead(200,{"content-type":"text/plain"}),W.end(G);return}}if(X){W.writeHead(404,{"content-type":"text/plain"}),W.end("challenge not found");return}}let B=U.headers.host||"",j=B.includes(":")?B.slice(0,B.indexOf(":")):B;if(X&&j&&!X.hasCert(j))X.ensureCert(j).catch(()=>{});let z=Y===443?j:`${j}:${Y}`;F("redirect",`Redirecting request from ${B}${U.url} to https://${z}`,w),W.writeHead(301,{Location:`https://${z}${U.url}`}),W.end()}).listen($);YA.add(J),F("redirect","HTTP redirect server started",w)}function X6(w){let $={...SQ,...w};if(F("proxy",`Starting proxy with options: ${Iw($)}`,$?.verbose),$.viaDaemon){if(!$.from||!$.to){H.error("viaDaemon mode requires both `from` and `to`");return}zB({proxies:[{id:$.id,from:$.from,to:$.to,path:$.path,cleanUrls:$.cleanUrls,changeOrigin:$.changeOrigin,pathRewrites:$.pathRewrites}],verbose:$.verbose}).catch((Q)=>{H.error(`Failed to register with rpx daemon: ${Q.message}`),J0.exit(1)});return}let Y=$.to||"",A=Y.split(".").pop()?.toLowerCase()||"",X=J0.platform==="darwin"&&Y&&!Y.includes("localhost")&&!Y.includes("127.0.0.1"),J=["dev","app","page","new","day","foo"],U=["test","localhost","local","example","invalid"];if(X&&J.includes(A)&&$?.verbose)H.warn(`The .${A} TLD may not work reliably for local development`),H.info(` Google owns .${A} with HSTS preloading, which can bypass local DNS`),H.info(" Consider using a reserved TLD: .test, .localhost, or .local");if(X)Promise.resolve().then(() => (JY(),a8)).then(({setupDevelopmentDns:Q})=>{Q({domains:[Y],verbose:$.verbose}).then((B)=>{if(B)Promise.resolve().then(()=>{if($.verbose)if(U.includes(A))H.success(`DNS server started for .${A} domains`);else H.success(`DNS server started for .${A} domains (hosts file entry also added)`)});else F("dns",`Could not start DNS server - ${Y} may not resolve in browser`,$.verbose)})}).catch((Q)=>{F("dns",`Failed to start DNS server: ${Q}`,$.verbose)});let W={from:$.from,to:$.to,cleanUrls:$.cleanUrls,https:PY($),cleanup:$.cleanup,vitePluginUsage:$.vitePluginUsage,changeOrigin:$.changeOrigin,verbose:$.verbose,regenerateUntrustedCerts:$.regenerateUntrustedCerts};F("proxy",`Server options: ${Iw(W)}`,$.verbose),Y6(W).catch((Q)=>{F("proxy",`Failed to start proxy: ${Q}`,$.verbose),H.error(`Failed to start proxy: ${Q.message}`),GJ({domains:[$.to],hosts:typeof $.cleanup==="boolean"?$.cleanup:$.cleanup?.hosts,certs:typeof $.cleanup==="boolean"?$.cleanup:$.cleanup?.certs,verbose:$.verbose})})}function OM(w){return w?.verbose||!1}function qB(w){if(w?.hostsManagement===!1)return!1;let $=w?.cleanup;if($===!1)return!1;if($&&typeof $==="object"&&$.hosts===!1)return!1;return!0}async function J6(w){let $={from:"localhost:5173",to:"rpx.localhost",https:!1,cleanup:{hosts:!0,certs:!1},vitePluginUsage:!1,verbose:!1,cleanUrls:!1,changeOrigin:!1,regenerateUntrustedCerts:!0};if(w)$={...$,...w};let Y=OM($),A=qB($);if(F("config",`Starting with config: ${Iw($,2)}`,Y),F("config",`Is multi-proxy? ${"proxies"in $}`,Y),F("config",`Hosts management enabled? ${A}`,Y),$.viaDaemon){let M="proxies"in $&&Array.isArray($.proxies)?$.proxies.map((O)=>({id:O.id,from:O.from,to:O.to,path:O.path,cleanUrls:O.cleanUrls??$.cleanUrls,changeOrigin:O.changeOrigin??$.changeOrigin,pathRewrites:O.pathRewrites})):[{id:$.id,from:$.from,to:$.to??"rpx.localhost",path:$.path,cleanUrls:$.cleanUrls,changeOrigin:$.changeOrigin,pathRewrites:$.pathRewrites}];await zB({proxies:M,verbose:Y});return}if("proxies"in $&&Array.isArray($.proxies)){F("servers",`Found ${$.proxies.length} proxies in config`,Y);for(let f of $.proxies)if(f.start){let M=`${f.from}-${f.to}`;try{F("watch",`Starting command for ${M} with command: ${f.start.command}`,Y),H.info(`Starting command for ${M}...`),await WJ.startProcess(M,f.start,Y);let O=L$(f.from),S=new URL(O.startsWith("http")?O:`http://${O}`),B0=S.hostname||"localhost",a0=Number(S.port)||80;try{await AA(B0,a0,Y),F("watch",`Dev server is ready at ${B0}:${a0}`,Y)}catch(Kw){F("watch",`Connection check failed, but continuing with proxy setup: ${Kw}`,Y),H.warn("Dev server connection check failed. RPX will try to proceed anyway...")}}catch(O){throw F("watch",`Failed to start command for ${M}: ${O}`,Y),Error(`Failed to start command for ${M}: ${O}`)}}else F("watch",`No start command for proxy ${f.from} -> ${f.to}`,Y)}else if("start"in $&&$.start){F("watch","Found start command in single proxy config",Y);let f=`${$.from}-${$.to}`;try{if($.start)F("watch",`Starting command: ${$.start.command}`,Y),await WJ.startProcess(f,$.start,Y);let M=L$($.from),O=new URL(M.startsWith("http")?M:`http://${M}`),S=O.hostname||"localhost",B0=Number(O.port)||80;try{await AA(S,B0,Y),F("watch",`Dev server is ready at ${S}:${B0}`,Y)}catch(a0){F("watch",`Connection check failed, but continuing with proxy setup: ${a0}`,Y),H.warn("Dev server connection check failed. RPX will try to proceed anyway...")}}catch(M){throw F("watch",`Failed to run start command: ${M}`,Y),Error(`Failed to run start command: ${M}`)}}else F("watch","No start command found in config",Y);let X="proxies"in $&&Array.isArray($.proxies)?$.proxies[0]?.to:("to"in $)?$.to:"rpx.localhost";if(J0.platform!=="win32"&&($.https||A)){if(!I$())try{F("sudo","Pre-acquiring sudo credentials for privileged operations",Y),MM("sudo -v",{stdio:"inherit"})}catch{F("sudo","Could not pre-acquire sudo credentials",Y)}}let J=[];if($.productionCerts){if(J=await wY($.productionCerts,Y),J.length>0)F("ssl",`Using ${J.length} production SNI cert(s): ${J.map((f)=>f.serverName).join(", ")}`,Y)}if($.https){let f=J.length>0?null:await Q$($);if(!f&&J.length===0){if(F("ssl",`No valid or trusted certificates found for ${X}, generating new ones`,$.verbose),await n1($),f=await Q$($),!f)throw Error(`Failed to load SSL certificates after generation for ${X}`)}else F("ssl",`Using existing and trusted certificates for ${X}`,$.verbose);$._cachedSSLConfig=f}let U="proxies"in $&&Array.isArray($.proxies)?$.proxies.map((f)=>({...f,https:$.https,cleanup:$.cleanup,cleanUrls:f.cleanUrls??("cleanUrls"in $?$.cleanUrls:!1),vitePluginUsage:$.vitePluginUsage,changeOrigin:f.changeOrigin??$.changeOrigin,verbose:Y,_cachedSSLConfig:$._cachedSSLConfig})):[{from:"from"in $?$.from:"localhost:5173",to:"to"in $?$.to:"rpx.localhost",cleanUrls:"cleanUrls"in $?$.cleanUrls:!1,https:$.https,cleanup:$.cleanup,vitePluginUsage:$.vitePluginUsage,start:"start"in $?$.start:void 0,changeOrigin:$.changeOrigin,auth:"auth"in $?$.auth:void 0,verbose:Y,_cachedSSLConfig:$._cachedSSLConfig}],W=U.map((f)=>f.to||"rpx.localhost"),Q=J.length>0?J:$._cachedSSLConfig??null,B=W.filter((f)=>f&&!f.includes("localhost")&&!f.includes("127.0.0.1")),j=["dev","app","page","new","day","foo"],z=["test","localhost","local","example","invalid"],G=[...new Set(B.map((f)=>f.split(".").pop()?.toLowerCase()))],K=G.filter((f)=>!!f&&j.includes(f));if(K.length>0&&Y)H.warn(`The following TLDs may not work reliably for local development: ${K.map((f)=>`.${f}`).join(", ")}`),H.info(" These TLDs have HSTS preloading which can bypass local DNS"),H.info(" Consider using reserved TLDs: .test, .localhost, or .local");if(A&&J0.platform==="darwin"&&B.length>0){let{setupDevelopmentDns:f}=await Promise.resolve().then(() => (JY(),a8));if(await f({domains:B,verbose:Y})){if(Y)if(G.every((S)=>!!S&&z.includes(S)))H.success(`DNS server started for ${G.map((S)=>`.${S}`).join(", ")} domains`);else H.success(`DNS server started for ${G.map((S)=>`.${S}`).join(", ")} domains (hosts file entries also added)`)}else F("dns","Could not start DNS server - custom domains may not resolve",Y)}let E=async()=>{F("cleanup","Starting cleanup handler",$.verbose);try{let{tearDownDevelopmentDns:f}=await Promise.resolve().then(() => (JY(),a8));await f({verbose:$.verbose})}catch(f){F("cleanup",`Error stopping DNS server: ${f}`,$.verbose)}try{await WJ.stopAll($.verbose)}catch(f){F("cleanup",`Error stopping processes: ${f}`,$.verbose)}await GJ({domains:W,hosts:typeof $.cleanup==="boolean"?$.cleanup:$.cleanup?.hosts,certs:typeof $.cleanup==="boolean"?$.cleanup:$.cleanup?.certs,verbose:$.verbose||!1})};J0.on("SIGINT",E),J0.on("SIGTERM",E);let q=$.singlePortMode===!0,N=$.httpsPort??443,T=$.httpPort??80,R=$.originGuard?a5($.originGuard):null,y=!!Q&&(U.length>1||q||J.length>0),V=!Q&&q&&U.length>0;if(y&&Q){F("proxies",`Creating shared HTTPS server for ${U.length} domains on port ${N}`,Y);let f=await s5(U,A,Y),M=null,O=$.onDemandTls,S=O?.enabled?new r$({config:O,certsDir:O.certsDir??$.productionCerts?.certsDir??w6.join(e5.homedir(),".stacks","rpx","on-demand-certs"),initial:J,verbose:Y,onCertAdded:(Fw)=>{Kw(Fw)}}):null,B0=null,a0=!1;async function Kw(Fw){if(B0=Fw,a0)return;a0=!0;try{while(B0){let bw=B0;if(B0=null,F("proxies",`rebuilding :${N} with ${bw.length} SNI cert(s)`,Y),M)YA.delete(M),M.stop(!1);let s0=!1;for(let Z=0;!s0&&Z<60;Z++){let Cw=BJ({routeEntries:f,listenPort:N,sslConfig:bw,originGuard:R,verbose:Y});if(Cw){M=Cw,s0=!0;break}await new Promise((BY)=>setTimeout(BY,Math.min(25*2**Math.min(Z,4),500)))}if(!s0)H.error(`rpx: CRITICAL — could not rebind :${N} after cert issuance; HTTPS unbound until the next cert event or a gateway restart`)}}finally{a0=!1}}if(!await Z$(T,"0.0.0.0",Y))A6(Y,T,N,$.acmeChallengeWebroot,S);if(await Z$(N,"0.0.0.0",Y)){if(F("proxies",`Port ${N} is already in use, cannot start shared proxy`,Y),Y)H.warn(`Port ${N} is in use. Shared HTTPS proxy cannot start.`);return}let Pw=S&&S.sniEntries().length>0?S.sniEntries():Q;if(M=BJ({routeEntries:f,listenPort:N,sslConfig:Pw,originGuard:R,verbose:Y}),!M){H.error(`Shared HTTPS proxy failed to bind :${N}; not exiting`);return}}else if(V){F("proxies",`Creating shared HTTP server for ${U.length} domains on port ${T}`,Y);let f=await s5(U,A,Y);if(await Z$(T,"0.0.0.0",Y)){if(F("proxies",`Port ${T} is already in use, cannot start shared proxy`,Y),Y)H.warn(`Port ${T} is in use. Shared HTTP proxy cannot start.`);return}if(!BJ({routeEntries:f,listenPort:T,sslConfig:null,originGuard:R,verbose:Y})){H.error(`Shared HTTP proxy failed to bind :${T}; not exiting`);return}}else for(let f of U)try{let M=f.to||"rpx.localhost";F("proxy",`Starting proxy for ${M} with SSL config: ${!!Q}`,f.verbose),await Y6({from:f.from||"localhost:5173",to:M,cleanUrls:f.cleanUrls||!1,https:f.https||!1,cleanup:f.cleanup||!1,vitePluginUsage:f.vitePluginUsage||!1,verbose:f.verbose||!1,_cachedSSLConfig:$._cachedSSLConfig,changeOrigin:f.changeOrigin||!1,loadBalancer:f.loadBalancer,auth:f.auth,path:f.path,pathRewrites:f.pathRewrites})}catch(M){F("proxies",`Failed to start proxy for ${f.to}: ${M}`,f.verbose),H.error(`Failed to start proxy for ${f.to}:`,M)}}async function s5(w,$,Y){let A=[],X=new Set;for(let J of w){let U=J.to||"rpx.localhost",W=J.cleanUrls||!1,Q=J.path,B=_w(Q),j=t1(J.auth);if(J.redirect){let z=mG(J.redirect);A.push({host:U,path:Q,route:{redirect:z,basePath:B,auth:j}}),F("proxies",`Route: ${U}${Q??""} → redirect ${z.status} ${z.to}${j?" (auth)":""}`,Y)}else if(J.static)A.push({host:U,path:Q,route:{static:iY(J.static,W),cleanUrls:W,basePath:B,auth:j}}),F("proxies",`Route: ${U}${Q??""} → static ${typeof J.static==="string"?J.static:J.static.dir}${j?" (auth)":""}`,Y);else{let z=L$(J.from),G=new URL(z.startsWith("http")?z:`http://${z}`),K=p1(J.from??G.host,J.loadBalancer);r1(K),jJ.add(K),A.push({host:U,path:Q,route:{sourceHost:G.host,upstreamPool:K,cleanUrls:W,changeOrigin:J.changeOrigin||!1,pathRewrites:J.pathRewrites,basePath:B,auth:j}}),F("proxies",`Route: ${U}${Q??""} → ${G.host}${j?" (auth)":""}`,Y)}if(X.has(U))continue;if(X.add(U),$&&!q1(U)&&!U.includes("localhost")&&!U.includes("127.0.0.1"))try{if(!(await oY([U],Y))[0])await sY([U],Y)}catch{F("hosts",`Could not add hosts entry for ${U}`,Y)}}return A}function BJ(w){let{routeEntries:$,listenPort:Y,sslConfig:A,originGuard:X,verbose:J}=w,U=o1($),W=a1((j,z)=>e1(U,j,z),J),Q=X?(j,z)=>X(j)??W(j,z):W,B=s1(J);try{let j=Bun.serve({port:Y,hostname:"0.0.0.0",reusePort:g1(),...A?{tls:_$(Array.isArray(A)?A.map((z)=>({serverName:z.serverName,key:z.key,cert:z.cert})):{key:A.key,cert:A.cert,ca:A.ca,requestCert:!1,rejectUnauthorized:!1})}:{},fetch(z,G){return Q(z,G)},websocket:B,error(z){return F("server",`Shared proxy server error: ${z}`,J),new Response(`Server Error: ${z.message}`,{status:500})}});return YA.add(j),F("proxies",`Shared ${A?"HTTPS":"HTTP"} proxy listening on port ${Y} for ${U.size} domains`,J),j}catch(j){return F("proxies",`Failed to start shared proxy: ${j}`,J),console.error("Failed to start shared proxy:",j),null}}function LM(w){if(w?.vitePluginUsage||!w?.verbose)return;if(console.log(""),console.log(` ${hw.green(hw.bold("rpx"))} ${hw.green(`v${IM}`)}`),console.log(` ${hw.green("➜")} ${hw.dim(w?.from??"")} ${hw.dim("➜")} ${hw.cyan(w?.ssl?`https://${w?.to}`:`http://${w?.to}`)}`),w?.listenPort!==(w?.ssl?443:80))console.log(` ${hw.green("➜")} Listening on port ${w?.listenPort}`);if(w?.cleanUrls)console.log(` ${hw.green("➜")} Clean URLs enabled`)}qW();var lS=new d$("rpx",{showTags:!1});function U6(w){return!!(w&&("proxies"in w)&&Array.isArray(w.proxies))}P0.chdir(SM(_M(ZM(import.meta.url)),".."));var c0=new VJ("rpx"),Q6="0.12.0";c0.command("start","Start the Reverse Proxy Server").option("--from <from>","The URL to proxy from").option("--to <to>","The URL to proxy to").option("--key-path <path>","Absolute path to the SSL key").option("--cert-path <path>","Absolute path to the SSL certificate").option("--ca-cert-path <path>","Absolute path to the SSL CA certificate").option("--hosts-cleanup","Cleanup /etc/hosts on exit").option("--certs-cleanup","Cleanup SSL certificates on exit").option("--start-command <command>","Command to start the dev server").option("--start-cwd <path>","Current working directory for the dev server").option("--start-env <env>","Environment variables for the dev server").option("--change-origin","Change the origin of the host header to the target URL").option("--single-port-mode","Route all proxies through one shared listener (by Host header) instead of a port per proxy").option("--http-port <port>","Port for the shared HTTP listener / redirect (default: 80)").option("--https-port <port>","Port for the shared HTTPS listener (default: 443)").option("--via-daemon","Route through the shared rpx daemon instead of binding :443 directly").option("--id <id>","Stable id used when registering with the daemon (auto-derived from --to)").option("--verbose","Enable verbose logging").example("rpx start --from localhost:5173 --to my-project.localhost").example("rpx start --from localhost:3000 --to my-project.localhost/api").example("rpx start --from localhost:3000 --to localhost:3001").example("rpx start --from localhost:5173 --to my-project.test --key-path /absolute/path/to/key --cert-path /absolute/path/to/cert").example("rpx start --from localhost:5173 --to my-project.localhost --change-origin").example("rpx start --single-port-mode --https-port 8443").action(async(w)=>{if(!w?.from||!w.to)return J6(F1);let $={from:w.from,to:w.to,https:{keyPath:w.keyPath,certPath:w.certPath,caCertPath:w.caCertPath},cleanup:{certs:w.certsCleanup||!1,hosts:w.hostsCleanup||!1},verbose:w.verbose||!1,changeOrigin:w.changeOrigin||!1,singlePortMode:w.singlePortMode||!1,httpPort:w.httpPort!==void 0?Number(w.httpPort):void 0,httpsPort:w.httpsPort!==void 0?Number(w.httpsPort):void 0,viaDaemon:w.viaDaemon||!1,id:w.id};if(w.startCommand){let Y={command:w.startCommand};if(w.startCwd)Y.cwd=w.startCwd;if(w.startEnv)try{Y.env=JSON.parse(w.startEnv)}catch(A){console.error("Failed to parse start-env JSON:",A),P0.exit(1)}$.start=Y}return X6($)});c0.command("watch:start <proxy>","Start the dev server for a specific proxy").option("--verbose","Enable verbose logging").action(async(w,$)=>{let Y=U6(F1)?F1.proxies.find((A)=>A.to===w||`${A.from}-${A.to}`===w):F1.to===w?F1:null;if(!Y?.start)console.error(`No watch configuration found for proxy: ${w}`),P0.exit(1);try{await YJ.startProcess(w,Y.start,$.verbose),console.log(`Started dev server for ${w}`)}catch(A){console.error(`Failed to start dev server for ${w}:`,A),P0.exit(1)}});c0.command("watch:stop <proxy>","Stop the dev server for a specific proxy").option("--verbose","Enable verbose logging").action(async(w,$)=>{try{await YJ.stopProcess(w,$.verbose),console.log(`Stopped dev server for ${w}`)}catch(Y){console.error(`Failed to stop dev server for ${w}:`,Y),P0.exit(1)}});c0.command("watch:stopall","Stop all running dev servers").option("--verbose","Enable verbose logging").action(async(w)=>{try{await YJ.stopAll(w.verbose),console.log("Stopped all dev servers")}catch($){console.error("Failed to stop all dev servers:",$),P0.exit(1)}});async function W6(w){let Y={...(await A9().catch(()=>null))?.onDemand??{},enabled:!0};if(w){let A=w.split(",").map((X)=>X.trim()).filter(Boolean);if(A.length>0)Y.roots=A}return Y}c0.command("daemon:start","Start the rpx daemon in the foreground (binds :443 + :80)").option("--rpx-dir <path>","Override the rpx state dir (default ~/.stacks/rpx)").option("--registry-dir <path>","Override the registry dir (default <rpx-dir>/registry.d)").option("--https-port <port>","HTTPS port (default 443)",{default:443}).option("--http-port <port>","HTTP redirect port; 0 to disable (default 80)",{default:80}).option("--hostname <host>","Bind address (default 0.0.0.0)",{default:"0.0.0.0"}).option("--certs-dir <path>","Directory of real PEM certs for per-domain SNI (<domain>.crt/.key, _wildcard.<apex>.crt/.key)").option("--workers <n>","Run as a multi-core cluster of N worker processes (default 1; also RPX_WORKERS)").option("--on-demand","Lazily boot a project's dev server the first time its host is visited (reads config `onDemand`)").option("--roots <dirs>","Comma-separated roots scanned for on-demand sites (overrides config; default ~/Code)").option("--verbose","Enable verbose logging").example("rpx daemon:start --on-demand").example("rpx daemon:start --on-demand --roots ~/Code,~/work").action(async(w)=>{try{let $=w.onDemand?await W6(w.roots):void 0;await(await v5({rpxDir:w.rpxDir,registryDir:w.registryDir,httpsPort:typeof w.httpsPort==="string"?Number.parseInt(w.httpsPort,10):w.httpsPort,httpPort:typeof w.httpPort==="string"?Number.parseInt(w.httpPort,10):w.httpPort,hostname:w.hostname,productionCerts:w.certsDir?{certsDir:w.certsDir}:void 0,workers:w.workers===void 0?void 0:typeof w.workers==="string"?Number.parseInt(w.workers,10):w.workers,onDemandSites:$,verbose:w.verbose??!0})).done,P0.exit(0)}catch($){console.error(`Failed to start rpx daemon: ${$.message}`),P0.exit(1)}});c0.command("daemon:stop","Stop the running rpx daemon (SIGTERM, escalates to SIGKILL)").option("--rpx-dir <path>","Override the rpx state dir (default ~/.stacks/rpx)").option("--timeout <ms>","Max ms to wait for graceful shutdown",{default:5000}).option("--no-force","Do not escalate to SIGKILL after timeout").option("--verbose","Enable verbose logging").action(async(w)=>{let $=typeof w.timeout==="string"?Number.parseInt(w.timeout,10):w.timeout,Y=await m5({rpxDir:w.rpxDir,timeoutMs:$,forceAfterTimeout:w.force!==!1,verbose:w.verbose});if(!Y.stopped&&Y.pid===null){console.log("rpx daemon is not running");return}if(!Y.stopped){console.log(`rpx daemon pid=${Y.pid} was already gone (cleaned stale lock)`);return}console.log(`rpx daemon pid=${Y.pid} stopped${Y.forced?" (SIGKILL)":""}`)});c0.command("daemon:status","Print daemon state and currently registered hosts").option("--rpx-dir <path>","Override the rpx state dir (default ~/.stacks/rpx)").option("--registry-dir <path>","Override the registry dir (default <rpx-dir>/registry.d)").option("--json","Emit machine-readable JSON instead of a human summary").action(async(w)=>{let $=w.rpxDir??Aw(),Y=await D$($),A=await wJ($),X=w.registryDir,J=await jB(X).catch(()=>[]);if(w.json){console.log(JSON.stringify({running:A,pid:Y,pidFile:x$($),rpxDir:$,registryDir:X??o$(),entries:J},null,2));return}if(!A){if(console.log("rpx daemon: not running"),Y!==null)console.log(`(stale pid file at ${x$($)} \u2192 pid ${Y})`)}else console.log(`rpx daemon: running (pid=${Y})`),console.log(`pid file: ${x$($)}`);if(console.log(`registry: ${X??o$()}`),J.length===0){console.log("no registered hosts");return}console.log(`registered hosts (${J.length}):`);for(let U of J){let W=U.pid!==void 0?`, pid=${U.pid}`:"";console.log(` https://${U.to} \u2192 ${U.from} (id=${U.id}${W})`)}});c0.command("register","Register an upstream app with the rpx daemon").option("--id <id>","Unique id for this entry (a-z, 0-9, dot, dash, underscore)").option("--from <host:port>","Upstream host:port (e.g. localhost:5173)").option("--to <host>","Public hostname (e.g. pet-store.localhost)").option("--cwd <path>","Working directory of the upstream (informational)").option("--clean-urls","Strip .html and 301 to the clean URL").option("--change-origin","Rewrite Origin to the upstream").option("--rpx-dir <path>","Override the rpx state dir (default ~/.stacks/rpx)").option("--registry-dir <path>","Override the registry dir (default <rpx-dir>/registry.d)").option("--skip-spawn","Do not lazy-spawn the daemon if it is not already running").option("--verbose","Enable verbose logging").example("rpx register --id pet-store --from localhost:5173 --to pet-store.localhost").action(async(w)=>{if(!w.id||!w.from||!w.to)console.error("rpx register requires --id, --from, and --to"),P0.exit(1);if(!WY(w.id))console.error(`invalid id: ${JSON.stringify(w.id)} (must match /^[a-zA-Z0-9._-]+$/, \u2264128 chars)`),P0.exit(1);try{await n5({id:w.id,from:w.from,to:w.to,cwd:w.cwd,createdAt:new Date().toISOString(),cleanUrls:w.cleanUrls,changeOrigin:w.changeOrigin},w.registryDir,w.verbose)}catch($){console.error(`failed to write registry entry: ${$.message}`),P0.exit(1)}if(w.skipSpawn){console.log(`registered ${w.to} \u2192 ${w.from} (daemon spawn skipped)`);return}try{let $=await i5({rpxDir:w.rpxDir,verbose:w.verbose}),Y=$.spawned?"spawned":"attached to";console.log(`registered https://${w.to} \u2192 ${w.from} (${Y} daemon pid=${$.pid})`)}catch($){console.error(`registered entry but daemon spawn failed: ${$.message}`),console.error("the entry remains in the registry; start the daemon manually with `rpx daemon:start`"),P0.exit(1)}});c0.command("unregister <id>","Remove a previously registered app from the rpx daemon").option("--registry-dir <path>","Override the registry dir (default ~/.stacks/rpx/registry.d)").option("--verbose","Enable verbose logging").action(async(w,$)=>{if(!WY(w))console.error(`invalid id: ${JSON.stringify(w)}`),P0.exit(1);let Y=await BB(w,$.registryDir,$.verbose);if(!Y){console.log(`no registry entry for id=${w}`);return}await p5(w,$.registryDir,$.verbose),console.log(`unregistered ${Y.to} (id=${w})`)});c0.command("dns:reconcile","Remove stale macOS DNS overrides left by crashed dev sessions").option("--rpx-dir <path>","Override the rpx state dir (default ~/.stacks/rpx)").option("--verbose","Enable verbose logging").action(async(w)=>{let $=w.rpxDir??Aw();if(await wJ($)){console.log("rpx daemon is running \u2014 DNS overrides are managed by the daemon");return}await g5({rpxDir:$,verbose:w.verbose}),console.log("DNS reconcile complete")});c0.command("sites","List the on-demand sites rpx can boot (and which are currently live)").option("--roots <dirs>","Comma-separated roots to scan (overrides config; default ~/Code)").option("--registry-dir <path>","Override the registry dir (default ~/.stacks/rpx/registry.d)").option("--json","Emit machine-readable JSON").action(async(w)=>{let $=await W6(w.roots),Y=W9($),A=await jB(w.registryDir).catch(()=>[]),X=new Set(A.map((W)=>W.to)),J=Y.map((W)=>({host:W.host,dir:W.dir,command:W.command,source:W.source,live:X.has(W.host)}));if(w.json){console.log(JSON.stringify(J,null,2));return}let U=$.roots??["~/Code"];if(J.length===0){console.log("no on-demand sites found"),console.log(`scanned roots: ${U.join(", ")}`),console.log("start the daemon with `rpx daemon:start --on-demand` to serve them");return}console.log(`on-demand sites (${J.length}) \u2014 scanned ${U.join(", ")}:`);for(let W of J)console.log(` ${W.live?"\u25CF":"\u25CB"} https://${W.host} ${W.live?"(live)":"(idle)"}`),console.log(` ${W.command} ${W.dir}`)});c0.command("logs <host>","Show an on-demand site's boot log (e.g. rpx logs myapp.localhost)").option("--rpx-dir <path>","Override the rpx state dir (default ~/.stacks/rpx)").option("--lines <n>","Show only the last N lines (default: all)").action(async(w,$)=>{let{readFile:Y}=await import("fs/promises"),{join:A}=await import("path"),X=$.rpxDir??Aw(),J=A(X,"sites",`${rA(w.split(":")[0])}.log`),U;try{U=await Y(J,"utf8")}catch{console.log(`no log for ${w} (it may not have been booted yet) \u2014 looked in ${J}`);return}let W=$.lines===void 0?void 0:typeof $.lines==="string"?Number.parseInt($.lines,10):$.lines,Q=U.split(`
339
339
  `);P0.stdout.write((W&&W>0?Q.slice(-W):Q).join(`
340
- `))});c0.command("version","Show the version of the Reverse Proxy CLI").action(()=>{console.log(U6)});c0.version(U6);c0.help();c0.run();
340
+ `))});c0.command("version","Show the version of the Reverse Proxy CLI").action(()=>{console.log(Q6)});c0.version(Q6);c0.help();c0.run();