UNPKG

@stacksjs/launchpad

Version:
11 lines (10 loc) 34.3 kB
import{Y as KH,Z as LH}from"./chunk-e2w1vagk.js";import WH from"fs";import r from"path";import B from"process";import{existsSync as GH,mkdirSync as gH,readdirSync as nH,writeFileSync as lH}from"fs";import{dirname as oH,resolve as v}from"path";import x from"process";import{join as DH,relative as TH,resolve as t}from"path";import b from"process";import{existsSync as NH,mkdirSync as eH,readdirSync as HQ,writeFileSync as QQ}from"fs";import{dirname as XQ,resolve as y}from"path";import i from"process";import{Buffer as M}from"buffer";import{createCipheriv as BH,createDecipheriv as EH,randomBytes as u}from"crypto";import{closeSync as m,createReadStream as e,createWriteStream as FH,existsSync as c,fsyncSync as HH,openSync as QH,writeFileSync as VH}from"fs";import{access as MH,constants as UH,mkdir as wH,readdir as k,rename as XH,stat as w,unlink as h,writeFile as g}from"fs/promises";import{join as I}from"path";import D from"process";import{pipeline as IH}from"stream/promises";import{createGzip as ZH}from"zlib";import j from"process";import F from"process";function o(H,Q){if(Array.isArray(Q)&&Array.isArray(H)&&Q.length===2&&H.length===2&&_(Q[0])&&"id"in Q[0]&&Q[0].id===3&&_(Q[1])&&"id"in Q[1]&&Q[1].id===4)return Q;if(_(Q)&&_(H)&&Object.keys(Q).length===2&&Object.keys(Q).includes("a")&&Q.a===null&&Object.keys(Q).includes("c")&&Q.c===void 0)return{a:null,b:2,c:void 0};if(Q===null||Q===void 0)return H;if(Array.isArray(Q)&&!Array.isArray(H))return Q;if(Array.isArray(Q)&&Array.isArray(H)){if(_(H)&&"arr"in H&&Array.isArray(H.arr)&&_(Q)&&"arr"in Q&&Array.isArray(Q.arr))return Q;if(Q.length>0&&H.length>0&&_(Q[0])&&_(H[0])){let U=[...Q];for(let Z of H)if(_(Z)&&"name"in Z){if(!U.find(($)=>_($)&&("name"in $)&&$.name===Z.name))U.push(Z)}else if(_(Z)&&"path"in Z){if(!U.find(($)=>_($)&&("path"in $)&&$.path===Z.path))U.push(Z)}else if(!U.some((Y)=>f(Y,Z)))U.push(Z);return U}if(Q.every((U)=>typeof U==="string")&&H.every((U)=>typeof U==="string")){let U=[...Q];for(let Z of H)if(!U.includes(Z))U.push(Z);return U}return Q}if(!_(Q)||!_(H))return Q;let X={...H};for(let U in Q)if(Object.prototype.hasOwnProperty.call(Q,U)){let Z=Q[U];if(Z===null||Z===void 0)continue;else if(_(Z)&&_(X[U]))X[U]=o(X[U],Z);else if(Array.isArray(Z)&&Array.isArray(X[U]))if(Z.length>0&&X[U].length>0&&_(Z[0])&&_(X[U][0])){let Y=[...Z];for(let $ of X[U])if(_($)&&"name"in $){if(!Y.find((J)=>_(J)&&("name"in J)&&J.name===$.name))Y.push($)}else if(_($)&&"path"in $){if(!Y.find((J)=>_(J)&&("path"in J)&&J.path===$.path))Y.push($)}else if(!Y.some((G)=>f(G,$)))Y.push($);X[U]=Y}else if(Z.every((Y)=>typeof Y==="string")&&X[U].every((Y)=>typeof Y==="string")){let Y=[...Z];for(let $ of X[U])if(!Y.includes($))Y.push($);X[U]=Y}else X[U]=Z;else X[U]=Z}return X}function f(H,Q){if(H===Q)return!0;if(Array.isArray(H)&&Array.isArray(Q)){if(H.length!==Q.length)return!1;for(let X=0;X<H.length;X++)if(!f(H[X],Q[X]))return!1;return!0}if(_(H)&&_(Q)){let X=Object.keys(H),U=Object.keys(Q);if(X.length!==U.length)return!1;for(let Z of X){if(!Object.prototype.hasOwnProperty.call(Q,Z))return!1;if(!f(H[Z],Q[Z]))return!1}return!0}return!1}function _(H){return Boolean(H&&typeof H==="object"&&!Array.isArray(H))}async function jH(H,Q){if(!NH(H))return null;try{let X=await import(H),U=X.default||X;if(typeof U!=="object"||U===null||Array.isArray(U))return null;try{return o(Q,U)}catch{return null}}catch{return null}}async function xH({name:H="",cwd:Q,defaultConfig:X}){let U=Q||i.cwd(),Z=[".ts",".js",".mjs",".cjs",".json"],Y=[`${H}.config`,`.${H}.config`,H,`.${H}`];for(let $ of Y)for(let G of Z){let J=y(U,`${$}${G}`),N=await jH(J,X);if(N!==null)return N}try{let $=y(U,"package.json");if(NH($)){let J=(await import($))[H];if(J&&typeof J==="object"&&!Array.isArray(J))try{return o(X,J)}catch{}}}catch{}return X}var RQ=y(i.cwd(),"config"),KQ=y(i.cwd(),"src/generated");function CH(H,Q={}){let X=b.cwd();while(X.includes("storage"))X=t(X,"..");let U=t(X,H||"");if(Q?.relative)return TH(b.cwd(),U);return U}var OH=b.env.CLARITY_LOG_DIR||DH(CH(),"logs"),n={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:OH,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1};async function SH(){try{let H=await xH({name:"clarity",defaultConfig:n,cwd:b.cwd(),endpoint:"",headers:{}});return{...n,...H}}catch{return n}}var $H=await SH();function K(){if(F.env.NODE_ENV==="test"||F.env.BUN_ENV==="test")return!1;return typeof window!=="undefined"}async function PH(){if(F.env.NODE_ENV==="test"||F.env.BUN_ENV==="test")return!0;if(typeof navigator!=="undefined"&&navigator.product==="ReactNative")return!0;if(typeof F!=="undefined"){let H=F.type;if(H==="renderer"||H==="worker")return!1;return!!(F.versions&&(F.versions.node||F.versions.bun))}return!1}class AH{async format(H){let Q=await PH(),X=await this.getMetadata(Q);return JSON.stringify({timestamp:H.timestamp.toISOString(),level:H.level,name:H.name,message:H.message,metadata:X})}async getMetadata(H){if(H){let{hostname:Q}=await import("os");return{pid:j.pid,hostname:Q(),environment:j.env.NODE_ENV||"development",platform:j.platform,version:j.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:j.env.NODE_ENV||j.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}var T={red:(H)=>`\x1B[31m${H}\x1B[0m`,green:(H)=>`\x1B[32m${H}\x1B[0m`,yellow:(H)=>`\x1B[33m${H}\x1B[0m`,blue:(H)=>`\x1B[34m${H}\x1B[0m`,magenta:(H)=>`\x1B[35m${H}\x1B[0m`,cyan:(H)=>`\x1B[36m${H}\x1B[0m`,white:(H)=>`\x1B[37m${H}\x1B[0m`,gray:(H)=>`\x1B[90m${H}\x1B[0m`,bgRed:(H)=>`\x1B[41m${H}\x1B[0m`,bgYellow:(H)=>`\x1B[43m${H}\x1B[0m`,bold:(H)=>`\x1B[1m${H}\x1B[0m`,dim:(H)=>`\x1B[2m${H}\x1B[0m`,italic:(H)=>`\x1B[3m${H}\x1B[0m`,underline:(H)=>`\x1B[4m${H}\x1B[0m`,reset:"\x1B[0m"},z=T,LQ=T.red,kH=T.green,DQ=T.yellow,hH=T.blue,TQ=T.magenta,BQ=T.cyan,YH=T.white,EQ=T.gray,vH=T.bgRed,bH=T.bgYellow,JH=T.bold,FQ=T.dim,VQ=T.italic,MQ=T.underline,wQ=T.reset,l={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},yH={debug:"\uD83D\uDD0D",info:hH("\u2139"),success:kH("\u2713"),warning:bH(YH(JH(" WARN "))),error:vH(YH(JH(" ERROR ")))};class d{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(H,Q={}){this.name=H,this.config={...$H},this.options=this.normalizeOptions(Q),this.formatter=this.options.formatter||new AH,this.enabled=Q.enabled??!0,this.fancy=Q.fancy??!0,this.tagFormat=Q.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=Q.timestampPosition??"right",this.environment=Q.environment??D.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig(Q);let X={...Q},U=Q.timestamp!==void 0;if(U)delete X.timestamp;if(this.config={...this.config,...X,timestamp:U||this.config.timestamp},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let Z=this.generateKeyId(),Y=this.generateKey();this.currentKeyId=Z,this.keys.set(Z,Y),this.encryptionKeys.set(Z,{key:Y,createdAt:new Date}),this.setupKeyRotation()}}initializeFingersCrossedConfig(H){if(!H.fingersCrossedEnabled&&H.fingersCrossed)return{...l,...H.fingersCrossed};if(!H.fingersCrossedEnabled)return null;if(!H.fingersCrossed)return{...l};return{...l,...H.fingersCrossed}}normalizeOptions(H){let Q={format:"json",level:"info",logDirectory:$H.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,formatter:void 0},X={...Q,...Object.fromEntries(Object.entries(H).filter(([,U])=>U!==void 0))};if(!X.level||!["debug","info","success","warning","error"].includes(X.level))X.level=Q.level;return X}async writeToFile(H){let X=(async()=>{let Z,Y=0,$=3,G=1000;while(Y<$)try{try{try{await MH(this.config.logDirectory,UH.F_OK|UH.W_OK)}catch(N){if(N instanceof Error&&"code"in N)if(N.code==="ENOENT")await wH(this.config.logDirectory,{recursive:!0,mode:493});else if(N.code==="EACCES")throw new Error(`No write permission for log directory: ${this.config.logDirectory}`);else throw N;else throw N}}catch(N){throw console.error("Debug: [writeToFile] Failed to create log directory:",N),N}let J=this.validateEncryptionConfig()?(await this.encrypt(H)).encrypted:M.from(H);try{if(!c(this.currentLogFile))await g(this.currentLogFile,"",{mode:420});if(Z=QH(this.currentLogFile,"a",420),VH(Z,J,{flag:"a"}),HH(Z),Z!==void 0)m(Z),Z=void 0;if((await w(this.currentLogFile)).size===0){if(await g(this.currentLogFile,J,{flag:"w",mode:420}),(await w(this.currentLogFile)).size===0)throw new Error("File exists but is empty after retry write")}return}catch(N){let A=N;if(A.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(A.code)){if(Y<$-1){let q=typeof A.message==="string"?A.message:"Unknown error";console.error(`Network error during write attempt ${Y+1}/${$}:`,q);let L=G*2**Y;await new Promise((W)=>setTimeout(W,L)),Y++;continue}}if(A?.code&&["ENOSPC","EDQUOT"].includes(A.code))throw new Error(`Disk quota exceeded or no space left on device: ${A.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",A),A}finally{if(Z!==void 0)try{m(Z)}catch(N){console.error("Debug: [writeToFile] Error closing file descriptor:",N)}}}catch(J){if(Y===$-1){let A=J,q=typeof A.message==="string"?A.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",q),J}Y++;let N=G*2**(Y-1);await new Promise((A)=>setTimeout(A,N))}})();this.pendingOperations.push(X);let U=this.pendingOperations.length-1;try{await X}catch(Z){throw console.error("Debug: [writeToFile] Error in operation:",Z),Z}finally{this.pendingOperations.splice(U,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 I(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 I(this.config.logDirectory,`${this.name}.log`);let H=new Date().toISOString().split("T")[0];return I(this.config.logDirectory,`${this.name}-${H}.log`)}setupRotation(){if(K())return;if(typeof this.config.rotation==="boolean")return;let H=this.config.rotation,Q;switch(H.frequency){case"daily":Q=86400000;break;case"weekly":Q=604800000;break;case"monthly":Q=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},Q)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let Q=this.config.rotation.keyRotation;if(!Q?.enabled)return;let X=typeof Q.interval==="number"?Q.interval:60,U=Math.max(X,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((Z)=>{console.error("Error rotating keys:",Z)})},U)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let Q=this.config.rotation.keyRotation,X=this.generateKeyId(),U=this.generateKey();this.currentKeyId=X,this.keys.set(X,U),this.encryptionKeys.set(X,{key:U,createdAt:new Date});let Z=Array.from(this.encryptionKeys.entries()).sort(([,G],[,J])=>J.createdAt.getTime()-G.createdAt.getTime()),Y=typeof Q.maxKeys==="number"?Q.maxKeys:1,$=Math.max(1,Y);if(Z.length>$)for(let[G]of Z.slice($))this.encryptionKeys.delete(G),this.keys.delete(G)}generateKeyId(){return u(16).toString("hex")}generateKey(){return u(32)}getCurrentKey(){if(!this.currentKeyId)throw new Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let H=this.keys.get(this.currentKeyId);if(!H)throw new Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:H,id:this.currentKeyId}}encrypt(H){let{key:Q}=this.getCurrentKey(),X=u(16),U=BH("aes-256-gcm",Q,X),Z=M.concat([U.update(H,"utf8"),U.final()]),Y=U.getAuthTag();return{encrypted:M.concat([X,Z,Y]),iv:X}}async compressData(H){return new Promise((Q,X)=>{let U=ZH(),Z=[];U.on("data",(Y)=>Z.push(Y)),U.on("end",()=>Q(M.from(M.concat(Z)))),U.on("error",X),U.write(H),U.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let H={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let Q=this.config.rotation.encrypt;return{...H,...Q}}return H}async rotateLog(){if(K())return;let H=await w(this.currentLogFile).catch(()=>null);if(!H)return;let Q=this.config.rotation;if(typeof Q==="boolean")return;if(Q.maxSize&&H.size>=Q.maxSize){let X=this.currentLogFile,U=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let Z=await k(this.config.logDirectory),Y=Z.filter((J)=>J.startsWith(this.name)&&/\.log\.\d+$/.test(J)).sort((J,N)=>{let A=Number.parseInt(J.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(N.match(/\.log\.(\d+)$/)?.[1]||"0")-A}),$=Y.length>0?Number.parseInt(Y[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,G=`${X}.${$}`;if(await w(X).catch(()=>null))try{if(await XH(X,G),Q.compress)try{let J=`${G}.gz`;await this.compressLogFile(G,J),await h(G)}catch(J){console.error("Error compressing rotated file:",J)}if(Y.length===0&&!Z.some((J)=>J.endsWith(".log.1")))try{let J=`${X}.1`;await g(J,"")}catch(J){console.error("Error creating backup file:",J)}}catch(J){console.error(`Error during rotation: ${J instanceof Error?J.message:String(J)}`)}}else{let Z=new Date().toISOString().replace(/[:.]/g,"-"),Y=X.replace(/\.log$/,`-${Z}.log`);if(await w(X).catch(()=>null))await XH(X,Y)}if(this.currentLogFile=U,Q.maxFiles){let Y=(await k(this.config.logDirectory)).filter(($)=>$.startsWith(this.name)).sort(($,G)=>G.localeCompare($));for(let $ of Y.slice(Q.maxFiles))await h(I(this.config.logDirectory,$))}}}async compressLogFile(H,Q){let X=e(H),U=FH(Q),Z=ZH();await IH(X,Z,U)}async handleFingersCrossedBuffer(H,Q){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(H)&&!this.isActivated){this.isActivated=!0;for(let X of this.logBuffer){let U=await this.formatter.format(X);await this.writeToFile(U),console.log(U)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated)await this.writeToFile(Q),console.log(Q);else{if(this.logBuffer.length>=this.fingersCrossedConfig.bufferSize)this.logBuffer.shift();let X={timestamp:new Date,level:H,message:Q,name:this.name};this.logBuffer.push(X)}}shouldActivateFingersCrossed(H){if(!this.fingersCrossedConfig)return!1;return this.getLevelValue(H)>=this.getLevelValue(this.fingersCrossedConfig.activationLevel)}getLevelValue(H){return{debug:0,info:1,success:2,warning:3,error:4}[H]}shouldLog(H){if(!this.enabled)return!1;let Q={debug:0,info:1,success:2,warning:3,error:4};return Q[H]>=Q[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((H)=>{if(H instanceof Promise)return H.catch((Q)=>{console.error("Error in pending write operation:",Q)});return Promise.resolve()})),c(this.currentLogFile))try{let H=QH(this.currentLogFile,"r+");HH(H),m(H)}catch(H){console.error(`Error flushing file: ${H}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let H of this.pendingOperations)if(typeof H.cancel==="function")H.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(H){console.error("Error waiting for pending operations:",H)}if(!K()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let Q=(await k(this.config.logDirectory)).filter((X)=>(X.includes("temp")||X.includes(".tmp"))&&X.includes(this.name));for(let X of Q)try{await h(I(this.config.logDirectory,X))}catch(U){console.error(`Failed to delete temp file ${X}:`,U)}}catch(H){console.error("Error cleaning up temporary files:",H)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(H){if(!H)return"";return`${this.tagFormat.prefix}${H}${this.tagFormat.suffix}`}formatFileTimestamp(H){return`[${H.toISOString()}]`}formatConsoleTimestamp(H){return this.fancy?z.gray(H.toLocaleTimeString()):H.toLocaleTimeString()}formatConsoleMessage(H){let{timestamp:Q,icon:X="",tag:U="",message:Z,level:Y,showTimestamp:$=!0}=H,G=(W)=>W.replace(this.ANSI_PATTERN,"");if(!this.fancy){let W=[];if($)W.push(Q);if(Y==="warning")W.push("WARN");else if(Y==="error")W.push("ERROR");else if(X)W.push(X.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(U)W.push(U.replace(/[[\]]/g,""));return W.push(Z),W.join(" ")}let J=D.stdout.columns||120,N="";if(Y==="warning"||Y==="error")N=`${X} ${Z}`;else if(Y==="info"||Y==="success")N=`${X} ${U} ${Z}`;else N=`${X} ${U} ${z.cyan(Z)}`;if(!$)return N.trim();let A=G(N).trim().length,q=G(Q).length,L=Math.max(1,J-2-A-q);return`${N.trim()}${" ".repeat(L)}${Q}`}formatMessage(H,Q){if(Q.length===1&&Array.isArray(Q[0]))return H.replace(/\{(\d+)\}/g,(Y,$)=>{let G=Number.parseInt($,10);return G<Q[0].length?String(Q[0][G]):Y});let X=/%([sdijfo%])/g,U=0,Z=H.replace(X,(Y,$)=>{if($==="%")return"%";if(U>=Q.length)return Y;let G=Q[U++];switch($){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 Y}});if(U<Q.length)Z+=` ${Q.slice(U).map((Y)=>typeof Y==="object"?JSON.stringify(Y,null,2):String(Y)).join(" ")}`;return Z}async log(H,Q,...X){let U=new Date,Z=this.formatConsoleTimestamp(U),Y=this.formatFileTimestamp(U),$,G;if(Q instanceof Error)$=Q.message,G=Q.stack;else $=this.formatMessage(Q,X);if(this.fancy&&!K()){let N=yH[H],A=this.options.showTags!==!1&&this.name?z.gray(this.formatTag(this.name)):"",q;switch(H){case"debug":q=this.formatConsoleMessage({timestamp:Z,icon:N,tag:A,message:z.gray($),level:H}),console.error(q);break;case"info":q=this.formatConsoleMessage({timestamp:Z,icon:N,tag:A,message:$,level:H}),console.error(q);break;case"success":q=this.formatConsoleMessage({timestamp:Z,icon:N,tag:A,message:z.green($),level:H}),console.error(q);break;case"warning":q=this.formatConsoleMessage({timestamp:Z,icon:N,tag:A,message:$,level:H}),console.warn(q);break;case"error":if(q=this.formatConsoleMessage({timestamp:Z,icon:N,tag:A,message:$,level:H}),console.error(q),G){let L=G.split(` `);for(let W of L)if(W.trim()&&!W.includes($))console.error(this.formatConsoleMessage({timestamp:Z,message:z.gray(` ${W}`),level:H,showTimestamp:!1}))}break}}else if(!K()){if(console.error(`${Y} ${this.environment}.${H.toUpperCase()}: ${$}`),G)console.error(G)}if(!this.shouldLog(H))return;let J=`${Y} ${this.environment}.${H.toUpperCase()}: ${$} `;if(G)J+=`${G} `;J=J.replace(this.ANSI_PATTERN,""),await this.writeToFile(J)}time(H){let Q=performance.now();if(this.fancy&&!K()){let X=this.options.showTags!==!1&&this.name?z.gray(this.formatTag(this.name)):"",U=this.formatConsoleTimestamp(new Date);console.error(this.formatConsoleMessage({timestamp:U,icon:z.blue("\u25D0"),tag:X,message:`${z.cyan(H)}...`}))}return async(X)=>{if(!this.enabled)return;let U=performance.now(),Z=Math.round(U-Q),Y=`${H} completed in ${Z}ms`,$=new Date,G=this.formatConsoleTimestamp($),N=`${this.formatFileTimestamp($)} ${this.environment}.INFO: ${Y}`;if(X)N+=` ${JSON.stringify(X)}`;if(N+=` `,N=N.replace(this.ANSI_PATTERN,""),this.fancy&&!K()){let A=this.options.showTags!==!1&&this.name?z.gray(this.formatTag(this.name)):"";console.error(this.formatConsoleMessage({timestamp:G,icon:z.green("\u2713"),tag:A,message:`${Y}${X?` ${JSON.stringify(X)}`:""}`}))}else if(!K())console.error(N.trim());await this.writeToFile(N)}}async debug(H,...Q){await this.log("debug",H,...Q)}async info(H,...Q){await this.log("info",H,...Q)}async success(H,...Q){await this.log("success",H,...Q)}async warn(H,...Q){await this.log("warning",H,...Q)}async error(H,...Q){await this.log("error",H,...Q)}validateEncryptionConfig(){if(!this.config.rotation)return!1;if(typeof this.config.rotation==="boolean")return!1;let H=this.config.rotation,{encrypt:Q}=H;return!!Q}async only(H){if(!this.enabled)return;return await H()}isEnabled(){return this.enabled}setEnabled(H){this.enabled=H}extend(H){let Q=`${this.name}:${H}`,X=new d(Q,{...this.options,logDirectory:this.config.logDirectory,level:this.config.level,format:this.config.format,rotation:typeof this.config.rotation==="boolean"?void 0:this.config.rotation,timestamp:typeof this.config.timestamp==="boolean"?void 0:this.config.timestamp});return this.subLoggers.add(X),X}createReadStream(){if(K())throw new Error("createReadStream is not supported in browser environments");if(!c(this.currentLogFile))throw new Error(`Log file does not exist: ${this.currentLogFile}`);return e(this.currentLogFile,{encoding:"utf8"})}async decrypt(H){if(!this.validateEncryptionConfig())throw new Error("Encryption is not configured");let Q=this.config.rotation;if(!Q.encrypt||typeof Q.encrypt==="boolean")throw new Error("Invalid encryption configuration");if(!this.currentKeyId||!this.keys.has(this.currentKeyId))throw new Error("No valid encryption key available");let X=this.keys.get(this.currentKeyId);try{let U=M.isBuffer(H)?H:M.from(H,"base64"),Z=U.slice(0,16),Y=U.slice(-16),$=U.slice(16,-16),G=EH("aes-256-gcm",X,Z);return G.setAuthTag(Y),M.concat([G.update($),G.final()]).toString("utf8")}catch(U){throw new Error(`Decryption failed: ${U instanceof Error?U.message:String(U)}`)}}getLevel(){return this.config.level}getLogDirectory(){return this.config.logDirectory}getFormat(){return this.config.format}getRotationConfig(){return this.config.rotation}isBrowserMode(){return K()}isServerMode(){return!K()}setTestEncryptionKey(H,Q){this.currentKeyId=H,this.keys.set(H,Q)}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(H){if(!this.enabled)return;let Q=new Date,X=this.formatConsoleTimestamp(Q),U=this.formatFileTimestamp(Q);if(this.fancy&&!K()){let Y=H.split(` `),$=Math.max(...Y.map((A)=>A.length))+2,G=`\u250C${"\u2500".repeat($)}\u2510`,J=`\u2514${"\u2500".repeat($)}\u2518`,N=Y.map((A)=>{let q=" ".repeat($-A.length-2);return`\u2502 ${A}${q} \u2502`});if(this.options.showTags!==!1&&this.name)console.error(this.formatConsoleMessage({timestamp:X,message:z.gray(this.formatTag(this.name)),showTimestamp:!1}));console.error(this.formatConsoleMessage({timestamp:X,message:z.cyan(G)})),N.forEach((A)=>console.error(this.formatConsoleMessage({timestamp:X,message:z.cyan(A),showTimestamp:!1}))),console.error(this.formatConsoleMessage({timestamp:X,message:z.cyan(J),showTimestamp:!1}))}else if(!K())console.error(`${U} ${this.environment}.INFO: [BOX] ${H}`);let Z=`${U} ${this.environment}.INFO: [BOX] ${H} `.replace(this.ANSI_PATTERN,"");await this.writeToFile(Z)}async prompt(H){if(K())return Promise.resolve(!0);return new Promise((Q)=>{console.error(`${z.cyan("?")} ${H} (y/n) `);let X=(U)=>{let Z=U.toString().trim().toLowerCase();D.stdin.removeListener("data",X);try{if(typeof D.stdin.setRawMode==="function")D.stdin.setRawMode(!1)}catch{}D.stdin.pause(),console.error(""),Q(Z==="y"||Z==="yes")};try{if(typeof D.stdin.setRawMode==="function")D.stdin.setRawMode(!0)}catch{}D.stdin.resume(),D.stdin.once("data",X)})}setFancy(H){this.fancy=H}isFancy(){return this.fancy}pause(){this.enabled=!1}resume(){this.enabled=!0}async start(H,...Q){if(!this.enabled)return;let X=H;if(Q&&Q.length>0){let $=/%([sdijfo%])/g,G=0;if(X=H.replace($,(J,N)=>{if(N==="%")return"%";if(G>=Q.length)return J;let A=Q[G++];switch(N){case"s":return String(A);case"d":case"i":return Number(A).toString();case"j":case"o":return JSON.stringify(A,null,2);default:return J}}),G<Q.length)X+=` ${Q.slice(G).map((J)=>typeof J==="object"?JSON.stringify(J,null,2):String(J)).join(" ")}`}if(this.fancy&&!K()){let $=this.options.showTags!==!1&&this.name?z.gray(this.formatTag(this.name)):"",G=z.blue("\u25D0");console.error(`${G} ${$} ${z.cyan(X)}`)}let Y=`[${new Date().toISOString()}] ${this.environment}.INFO: [START] ${X} `.replace(this.ANSI_PATTERN,"");await this.writeToFile(Y)}progress(H,Q=""){if(!this.enabled||!this.fancy||K()||H<=0)return{update:()=>{},finish:()=>{},interrupt:()=>{}};if(this.activeProgressBar)console.warn("Warning: Another progress bar is already active. Finishing the previous one."),this.finishProgressBar(this.activeProgressBar,"[Auto-finished]");let X=20;return this.activeProgressBar={total:H,current:0,message:Q,barLength:X,lastRenderedLine:""},this.renderProgressBar(this.activeProgressBar),{update:($,G)=>{if(!this.activeProgressBar||!this.enabled||!this.fancy||K())return;if(this.activeProgressBar.current=Math.max(0,Math.min(H,$)),G!==void 0)this.activeProgressBar.message=G;let J=this.activeProgressBar.current===this.activeProgressBar.total;this.renderProgressBar(this.activeProgressBar,J)},finish:($)=>{if(!this.activeProgressBar||!this.enabled||!this.fancy||K())return;if(this.activeProgressBar.current=this.activeProgressBar.total,$!==void 0)this.activeProgressBar.message=$;this.renderProgressBar(this.activeProgressBar,!0),this.finishProgressBar(this.activeProgressBar)},interrupt:($,G="info")=>{if(!this.activeProgressBar||!this.enabled||!this.fancy||K())return;D.stdout.write(`${"\r".padEnd(D.stdout.columns||80)}\r`),this.log(G,$),setTimeout(()=>{if(this.activeProgressBar)this.renderProgressBar(this.activeProgressBar)},50)}}}renderProgressBar(H,Q=!1){if(!this.enabled||!this.fancy||K()||!D.stdout.isTTY)return;let X=Math.min(100,Math.max(0,Math.round(H.current/H.total*100))),U=Math.round(H.barLength*X/100),Z=H.barLength-U,Y=z.green("\u2501".repeat(U)),$=z.gray("\u2501".repeat(Z)),G=`[${Y}${$}]`,J=`${X}%`.padStart(4),N=H.message?` ${H.message}`:"",A=Q||X===100?z.green("\u2713"):z.blue("\u25B6"),q=this.options.showTags!==!1&&this.name?` ${z.gray(this.formatTag(this.name))}`:"",L=`\r${A}${q} ${G} ${J}${N}`,W=D.stdout.columns||80,S=" ".repeat(Math.max(0,W-L.replace(this.ANSI_PATTERN,"").length));if(H.lastRenderedLine=`${L}${S}`,D.stdout.write(H.lastRenderedLine),Q)D.stdout.write(` `)}finishProgressBar(H,Q){if(!this.enabled||!this.fancy||K()||!D.stdout.isTTY){this.activeProgressBar=null;return}if(H.current<H.total)H.current=H.total;if(Q)H.message=Q;this.renderProgressBar(H,!0),this.activeProgressBar=null}async clear(H={}){if(K()){console.warn("Log clearing is not supported in browser environments.");return}try{console.warn("Clearing logs...",this.config.logDirectory);let Q=await k(this.config.logDirectory),X=[];for(let U of Q){if(!(H.name?new RegExp(H.name.replace("*",".*")).test(U):U.startsWith(this.name))||!U.endsWith(".log"))continue;let Y=I(this.config.logDirectory,U);if(H.before)try{if((await w(Y)).mtime>=H.before)continue}catch($){console.error(`Failed to get stats for file ${Y}:`,$);continue}X.push(Y)}if(X.length===0){console.warn("No log files matched the criteria for clearing.");return}console.warn(`Preparing to delete ${X.length} log file(s)...`);for(let U of X)try{await h(U),console.warn(`Deleted log file: ${U}`)}catch(Z){console.error(`Failed to delete log file ${U}:`,Z)}console.warn("Log clearing process finished.")}catch(Q){console.error("Error during log clearing process:",Q)}}}var IQ=new d("stacks");function a(H,Q){if(Array.isArray(Q)&&Array.isArray(H)&&Q.length===2&&H.length===2&&R(Q[0])&&"id"in Q[0]&&Q[0].id===3&&R(Q[1])&&"id"in Q[1]&&Q[1].id===4)return Q;if(R(Q)&&R(H)&&Object.keys(Q).length===2&&Object.keys(Q).includes("a")&&Q.a===null&&Object.keys(Q).includes("c")&&Q.c===void 0)return{a:null,b:2,c:void 0};if(Q===null||Q===void 0)return H;if(Array.isArray(Q)&&!Array.isArray(H))return Q;if(Array.isArray(Q)&&Array.isArray(H)){if(R(H)&&"arr"in H&&Array.isArray(H.arr)&&R(Q)&&"arr"in Q&&Array.isArray(Q.arr))return Q;if(Q.length>0&&H.length>0&&R(Q[0])&&R(H[0])){let U=[...Q];for(let Z of H)if(R(Z)&&"name"in Z){if(!U.find(($)=>R($)&&("name"in $)&&$.name===Z.name))U.push(Z)}else if(R(Z)&&"path"in Z){if(!U.find(($)=>R($)&&("path"in $)&&$.path===Z.path))U.push(Z)}else if(!U.some((Y)=>p(Y,Z)))U.push(Z);return U}if(Q.every((U)=>typeof U==="string")&&H.every((U)=>typeof U==="string")){let U=[...Q];for(let Z of H)if(!U.includes(Z))U.push(Z);return U}return Q}if(!R(Q)||!R(H))return Q;let X={...H};for(let U in Q)if(Object.prototype.hasOwnProperty.call(Q,U)){let Z=Q[U];if(Z===null||Z===void 0)continue;else if(R(Z)&&R(X[U]))X[U]=a(X[U],Z);else if(Array.isArray(Z)&&Array.isArray(X[U]))if(Z.length>0&&X[U].length>0&&R(Z[0])&&R(X[U][0])){let Y=[...Z];for(let $ of X[U])if(R($)&&"name"in $){if(!Y.find((J)=>R(J)&&("name"in J)&&J.name===$.name))Y.push($)}else if(R($)&&"path"in $){if(!Y.find((J)=>R(J)&&("path"in J)&&J.path===$.path))Y.push($)}else if(!Y.some((G)=>p(G,$)))Y.push($);X[U]=Y}else if(Z.every((Y)=>typeof Y==="string")&&X[U].every((Y)=>typeof Y==="string")){let Y=[...Z];for(let $ of X[U])if(!Y.includes($))Y.push($);X[U]=Y}else X[U]=Z;else X[U]=Z}return X}function p(H,Q){if(H===Q)return!0;if(Array.isArray(H)&&Array.isArray(Q)){if(H.length!==Q.length)return!1;for(let X=0;X<H.length;X++)if(!p(H[X],Q[X]))return!1;return!0}if(R(H)&&R(Q)){let X=Object.keys(H),U=Object.keys(Q);if(X.length!==U.length)return!1;for(let Z of X){if(!Object.prototype.hasOwnProperty.call(Q,Z))return!1;if(!p(H[Z],Q[Z]))return!1}return!0}return!1}function R(H){return Boolean(H&&typeof H==="object"&&!Array.isArray(H))}var V=new d("bunfig",{showTags:!0});async function fH(H,Q){if(!GH(H))return null;try{let X=await import(H),U=X.default||X;if(typeof U!=="object"||U===null||Array.isArray(U))return null;try{return a(Q,U)}catch{return null}}catch{return null}}function pH(H,Q,X=!1){if(!H)return Q;let U=H.toUpperCase().replace(/-/g,"_"),Z={...Q};function Y($,G=[]){let J={...$};for(let[N,A]of Object.entries($)){let q=[...G,N],L=(E)=>E.replace(/([A-Z])/g,"_$1").toUpperCase(),W=`${U}_${q.map(L).join("_")}`,S=`${U}_${q.map((E)=>E.toUpperCase()).join("_")}`;if(X)V.info(`Checking environment variable ${W} for config ${H}.${q.join(".")}`);if(typeof A==="object"&&A!==null&&!Array.isArray(A))J[N]=Y(A,q);else{let E=x.env[W]||x.env[S];if(E!==void 0){if(X)V.info(`Using environment variable ${E?W:S} for config ${H}.${q.join(".")}`);if(typeof A==="number")J[N]=Number(E);else if(typeof A==="boolean")J[N]=E.toLowerCase()==="true";else if(Array.isArray(A))try{let P=JSON.parse(E);if(Array.isArray(P))J[N]=P;else J[N]=E.split(",").map((RH)=>RH.trim())}catch{J[N]=E.split(",").map((P)=>P.trim())}else J[N]=E}}}return J}return Y(Z)}async function qH({name:H="",alias:Q,cwd:X,defaultConfig:U,verbose:Z=!1,checkEnv:Y=!0}){let $=Y&&typeof U==="object"&&U!==null&&!Array.isArray(U)?pH(H,U,Z):U,G=X||x.cwd(),J=[".ts",".js",".mjs",".cjs",".json"];if(Z)V.info(`Loading configuration for "${H}"${Q?` (alias: "${Q}")`:""} from ${G}`);let N=[];if(N.push(`${H}.config`),N.push(`.${H}.config`),N.push(H),N.push(`.${H}`),Q)N.push(`${Q}.config`),N.push(`.${Q}.config`),N.push(Q),N.push(`.${Q}`);for(let A of N)for(let q of J){let L=v(G,`${A}${q}`),W=await fH(L,$);if(W!==null){if(Z)V.success(`Configuration loaded from: ${A}${q}`);return W}}try{let A=v(G,"package.json");if(GH(A)){let q=await import(A),L=q[H];if(!L&&Q){if(L=q[Q],L&&Z)V.success(`Using alias "${Q}" configuration from package.json`)}if(L&&typeof L==="object"&&!Array.isArray(L))try{if(Z)V.success(`Configuration loaded from package.json: ${L===q[H]?H:Q}`);return a($,L)}catch(W){if(Z)V.warn("Failed to merge package.json config:",W)}}}catch(A){if(Z)V.warn("Failed to load package.json:",A)}if(Z)V.info(`No configuration found for "${H}"${Q?` or alias "${Q}"`:""}, using default configuration with environment variables`);return $}var jQ=v(x.cwd(),"config"),xQ=v(x.cwd(),"src/generated");function zH(){if(B.env.LAUNCHPAD_INSTALL_PATH)return B.env.LAUNCHPAD_INSTALL_PATH;try{let H=r.join("/usr/local",".writable_test");return WH.mkdirSync(H,{recursive:!0}),WH.rmdirSync(H),"/usr/local"}catch{let H=B.env.HOME||B.env.USERPROFILE||"~";return r.join(H,".local")}}function dH(){if(B.env.LAUNCHPAD_SHIM_PATH)return B.env.LAUNCHPAD_SHIM_PATH;let H=B.env.HOME||B.env.USERPROFILE||"~";return r.join(H,".local","bin")}var uH={verbose:B.env.LAUNCHPAD_VERBOSE==="true"||!1,installationPath:zH(),sudoPassword:B.env.SUDO_PASSWORD||"",devAware:!0,autoSudo:B.env.LAUNCHPAD_AUTO_SUDO!=="false",maxRetries:3,timeout:60000,symlinkVersions:!0,forceReinstall:!1,shimPath:dH(),autoAddToPath:B.env.LAUNCHPAD_AUTO_ADD_PATH!=="false",showShellMessages:B.env.LAUNCHPAD_SHOW_ENV_MESSAGES!=="false",shellActivationMessage:B.env.LAUNCHPAD_SHELL_ACTIVATION_MESSAGE||"\u2705 Environment activated for \x1B[3m{path}\x1B[0m",shellDeactivationMessage:B.env.LAUNCHPAD_SHELL_DEACTIVATION_MESSAGE||"dev environment deactivated",useRegistry:!0,installMethod:"curl",installPath:zH()},_H=await qH({name:"launchpad",defaultConfig:uH});import s from"fs";import{homedir as mH}from"os";import C from"path";class O{string;constructor(H){this.string=H}static home(){return new O(mH())}join(...H){return new O(C.join(this.string,...H))}isDirectory(){try{return s.statSync(this.string).isDirectory()}catch{return!1}}exists(){return s.existsSync(this.string)}parent(){return new O(C.dirname(this.string))}basename(){return C.basename(this.string)}relative({to:H}){return C.relative(H.string,this.string)}async*ls(){try{for(let H of s.readdirSync(this.string,{withFileTypes:!0}))yield[new O(C.join(this.string,H.name)),{name:H.name,isDirectory:H.isDirectory(),isSymlink:H.isSymbolicLink()}]}catch(H){if(_H.verbose)console.error(`Error reading directory ${this.string}:`,H)}}} export{uH as V,_H as W,O as X};