@stacksjs/launchpad
Version:
Like Homebrew, but faster.
12 lines (11 loc) • 36.4 kB
JavaScript
// @bun
import{bb as RH,cb as _H}from"./chunk-8pxdwzvm.js";import AH from"fs";import{homedir as r}from"os";import S from"path";import z from"process";import{existsSync as GH,mkdirSync as mH,readdirSync as gH,writeFileSync as cH}from"fs";import{homedir as KH}from"os";import{dirname as iH,resolve as O}from"path";import P from"process";import{join as LH,relative as DH,resolve as s}from"path";import b from"process";import{existsSync as NH,mkdirSync as tH,readdirSync as eH,writeFileSync as HQ}from"fs";import{dirname as UQ,resolve as y}from"path";import i from"process";import{Buffer as V}from"buffer";import{createCipheriv as TH,createDecipheriv as BH,randomBytes as u}from"crypto";import{closeSync as m,createReadStream as t,createWriteStream as EH,existsSync as g,fsyncSync as e,openSync as HH,writeFileSync as FH}from"fs";import{access as wH,constants as QH,mkdir as MH,readdir as k,rename as UH,stat as j,unlink as h,writeFile as c}from"fs/promises";import{join as x}from"path";import T from"process";import{pipeline as VH}from"stream/promises";import{createGzip as XH}from"zlib";import C from"process";import M from"process";function o(H,Q){if(Array.isArray(Q)&&Array.isArray(H)&&Q.length===2&&H.length===2&&K(Q[0])&&"id"in Q[0]&&Q[0].id===3&&K(Q[1])&&"id"in Q[1]&&Q[1].id===4)return Q;if(K(Q)&&K(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(K(H)&&"arr"in H&&Array.isArray(H.arr)&&K(Q)&&"arr"in Q&&Array.isArray(Q.arr))return Q;if(Q.length>0&&H.length>0&&K(Q[0])&&K(H[0])){let U=[...Q];for(let Z of H)if(K(Z)&&"name"in Z){if(!U.find(($)=>K($)&&("name"in $)&&$.name===Z.name))U.push(Z)}else if(K(Z)&&"path"in Z){if(!U.find(($)=>K($)&&("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(!K(Q)||!K(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(K(Z)&&K(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&&K(Z[0])&&K(X[U][0])){let Y=[...Z];for(let $ of X[U])if(K($)&&"name"in $){if(!Y.find((J)=>K(J)&&("name"in J)&&J.name===$.name))Y.push($)}else if(K($)&&"path"in $){if(!Y.find((J)=>K(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(K(H)&&K(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 K(H){return Boolean(H&&typeof H==="object"&&!Array.isArray(H))}async function IH(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 jH({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 IH(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"),_Q=y(i.cwd(),"src/generated");function xH(H,Q={}){let X=b.cwd();while(X.includes("storage"))X=s(X,"..");let U=s(X,H||"");if(Q?.relative)return DH(b.cwd(),U);return U}var CH=b.env.CLARITY_LOG_DIR||LH(xH(),"logs"),n={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:CH,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1};async function OH(){try{let H=await jH({name:"clarity",defaultConfig:n,cwd:b.cwd(),endpoint:"",headers:{}});return{...n,...H}}catch{return n}}var ZH=await OH();function L(){if(M.env.NODE_ENV==="test"||M.env.BUN_ENV==="test")return!1;return typeof window!=="undefined"}async function SH(){if(M.env.NODE_ENV==="test"||M.env.BUN_ENV==="test")return!0;if(typeof navigator!=="undefined"&&navigator.product==="ReactNative")return!0;if(typeof M!=="undefined"){let H=M.type;if(H==="renderer"||H==="worker")return!1;return!!(M.versions&&(M.versions.node||M.versions.bun))}return!1}class qH{async format(H){let Q=await SH(),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:C.pid,hostname:Q(),environment:C.env.NODE_ENV||"development",platform:C.platform,version:C.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:C.env.NODE_ENV||C.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}var B={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"},_=B,KQ=B.red,PH=B.green,LQ=B.yellow,kH=B.blue,DQ=B.magenta,TQ=B.cyan,$H=B.white,BQ=B.gray,hH=B.bgRed,vH=B.bgYellow,YH=B.bold,EQ=B.dim,FQ=B.italic,wQ=B.underline,MQ=B.reset,l={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},bH={debug:"\uD83D\uDD0D",info:kH("\u2139"),success:PH("\u2713"),warning:vH($H(YH(" WARN "))),error:hH($H(YH(" ERROR ")))};class p{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={...ZH},this.options=this.normalizeOptions(Q),this.formatter=this.options.formatter||new qH,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??T.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:ZH.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 wH(this.config.logDirectory,QH.F_OK|QH.W_OK)}catch(N){if(N instanceof Error&&"code"in N)if(N.code==="ENOENT")await MH(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:V.from(H);try{if(!g(this.currentLogFile))await c(this.currentLogFile,"",{mode:420});if(Z=HH(this.currentLogFile,"a",420),FH(Z,J,{flag:"a"}),e(Z),Z!==void 0)m(Z),Z=void 0;if((await j(this.currentLogFile)).size===0){if(await c(this.currentLogFile,J,{flag:"w",mode:420}),(await j(this.currentLogFile)).size===0)throw new Error("File exists but is empty after retry write")}return}catch(N){let q=N;if(q.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(q.code)){if(Y<$-1){let A=typeof q.message==="string"?q.message:"Unknown error";console.error(`Network error during write attempt ${Y+1}/${$}:`,A);let D=G*2**Y;await new Promise((W)=>setTimeout(W,D)),Y++;continue}}if(q?.code&&["ENOSPC","EDQUOT"].includes(q.code))throw new Error(`Disk quota exceeded or no space left on device: ${q.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",q),q}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 q=J,A=typeof q.message==="string"?q.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",A),J}Y++;let N=G*2**(Y-1);await new Promise((q)=>setTimeout(q,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 x(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 x(this.config.logDirectory,`${this.name}.log`);let H=new Date().toISOString().split("T")[0];return x(this.config.logDirectory,`${this.name}-${H}.log`)}setupRotation(){if(L())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=TH("aes-256-gcm",Q,X),Z=V.concat([U.update(H,"utf8"),U.final()]),Y=U.getAuthTag();return{encrypted:V.concat([X,Z,Y]),iv:X}}async compressData(H){return new Promise((Q,X)=>{let U=XH(),Z=[];U.on("data",(Y)=>Z.push(Y)),U.on("end",()=>Q(V.from(V.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(L())return;let H=await j(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 q=Number.parseInt(J.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(N.match(/\.log\.(\d+)$/)?.[1]||"0")-q}),$=Y.length>0?Number.parseInt(Y[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,G=`${X}.${$}`;if(await j(X).catch(()=>null))try{if(await UH(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 c(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 j(X).catch(()=>null))await UH(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(x(this.config.logDirectory,$))}}}async compressLogFile(H,Q){let X=t(H),U=EH(Q),Z=XH();await VH(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()})),g(this.currentLogFile))try{let H=HH(this.currentLogFile,"r+");e(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(!L()&&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(x(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?_.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=T.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} ${_.cyan(Z)}`;if(!$)return N.trim();let q=G(N).trim().length,A=G(Q).length,D=Math.max(1,J-2-q-A);return`${N.trim()}${" ".repeat(D)}${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&&!L()){let N=bH[H],q=this.options.showTags!==!1&&this.name?_.gray(this.formatTag(this.name)):"",A;switch(H){case"debug":A=this.formatConsoleMessage({timestamp:Z,icon:N,tag:q,message:_.gray($),level:H}),console.error(A);break;case"info":A=this.formatConsoleMessage({timestamp:Z,icon:N,tag:q,message:$,level:H}),console.error(A);break;case"success":A=this.formatConsoleMessage({timestamp:Z,icon:N,tag:q,message:_.green($),level:H}),console.error(A);break;case"warning":A=this.formatConsoleMessage({timestamp:Z,icon:N,tag:q,message:$,level:H}),console.warn(A);break;case"error":if(A=this.formatConsoleMessage({timestamp:Z,icon:N,tag:q,message:$,level:H}),console.error(A),G){let D=G.split(`
`);for(let W of D)if(W.trim()&&!W.includes($))console.error(this.formatConsoleMessage({timestamp:Z,message:_.gray(` ${W}`),level:H,showTimestamp:!1}))}break}}else if(!L()){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&&!L()){let X=this.options.showTags!==!1&&this.name?_.gray(this.formatTag(this.name)):"",U=this.formatConsoleTimestamp(new Date);console.error(this.formatConsoleMessage({timestamp:U,icon:_.blue("\u25D0"),tag:X,message:`${_.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&&!L()){let q=this.options.showTags!==!1&&this.name?_.gray(this.formatTag(this.name)):"";console.error(this.formatConsoleMessage({timestamp:G,icon:_.green("\u2713"),tag:q,message:`${Y}${X?` ${JSON.stringify(X)}`:""}`}))}else if(!L())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 p(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(L())throw new Error("createReadStream is not supported in browser environments");if(!g(this.currentLogFile))throw new Error(`Log file does not exist: ${this.currentLogFile}`);return t(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=V.isBuffer(H)?H:V.from(H,"base64"),Z=U.slice(0,16),Y=U.slice(-16),$=U.slice(16,-16),G=BH("aes-256-gcm",X,Z);return G.setAuthTag(Y),V.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 L()}isServerMode(){return!L()}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&&!L()){let Y=H.split(`
`),$=Math.max(...Y.map((q)=>q.length))+2,G=`\u250C${"\u2500".repeat($)}\u2510`,J=`\u2514${"\u2500".repeat($)}\u2518`,N=Y.map((q)=>{let A=" ".repeat($-q.length-2);return`\u2502 ${q}${A} \u2502`});if(this.options.showTags!==!1&&this.name)console.error(this.formatConsoleMessage({timestamp:X,message:_.gray(this.formatTag(this.name)),showTimestamp:!1}));console.error(this.formatConsoleMessage({timestamp:X,message:_.cyan(G)})),N.forEach((q)=>console.error(this.formatConsoleMessage({timestamp:X,message:_.cyan(q),showTimestamp:!1}))),console.error(this.formatConsoleMessage({timestamp:X,message:_.cyan(J),showTimestamp:!1}))}else if(!L())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(L())return Promise.resolve(!0);return new Promise((Q)=>{console.error(`${_.cyan("?")} ${H} (y/n) `);let X=(U)=>{let Z=U.toString().trim().toLowerCase();T.stdin.removeListener("data",X);try{if(typeof T.stdin.setRawMode==="function")T.stdin.setRawMode(!1)}catch{}T.stdin.pause(),console.error(""),Q(Z==="y"||Z==="yes")};try{if(typeof T.stdin.setRawMode==="function")T.stdin.setRawMode(!0)}catch{}T.stdin.resume(),T.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 q=Q[G++];switch(N){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 J}}),G<Q.length)X+=` ${Q.slice(G).map((J)=>typeof J==="object"?JSON.stringify(J,null,2):String(J)).join(" ")}`}if(this.fancy&&!L()){let $=this.options.showTags!==!1&&this.name?_.gray(this.formatTag(this.name)):"",G=_.blue("\u25D0");console.error(`${G} ${$} ${_.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||L()||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||L())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||L())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||L())return;T.stdout.write(`${"\r".padEnd(T.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||L()||!T.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=_.green("\u2501".repeat(U)),$=_.gray("\u2501".repeat(Z)),G=`[${Y}${$}]`,J=`${X}%`.padStart(4),N=H.message?` ${H.message}`:"",q=Q||X===100?_.green("\u2713"):_.blue("\u25B6"),A=this.options.showTags!==!1&&this.name?` ${_.gray(this.formatTag(this.name))}`:"",D=`\r${q}${A} ${G} ${J}${N}`,W=T.stdout.columns||80,F=" ".repeat(Math.max(0,W-D.replace(this.ANSI_PATTERN,"").length));if(H.lastRenderedLine=`${D}${F}`,T.stdout.write(H.lastRenderedLine),Q)T.stdout.write(`
`)}finishProgressBar(H,Q){if(!this.enabled||!this.fancy||L()||!T.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(L()){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=x(this.config.logDirectory,U);if(H.before)try{if((await j(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 VQ=new p("stacks");function v(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)=>d(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]=v(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)=>d(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 a(H,Q,X="replace"){if(Q===null||Q===void 0)return H;if(Array.isArray(Q))return X==="replace"?Q:v(H,Q);if(Array.isArray(H))return X==="replace"?Q:v(H,Q);if(!R(Q)||!R(H))return Q;let U={...H};for(let Z of Object.keys(Q)){if(!Object.prototype.hasOwnProperty.call(Q,Z))continue;let Y=Q[Z],$=U[Z];if(Y===null||Y===void 0)continue;if(Array.isArray(Y)||Array.isArray($))if(X==="replace")U[Z]=Y;else U[Z]=v($,Y);else if(R(Y)&&R($))U[Z]=a($,Y,X);else U[Z]=Y}return U}function d(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(!d(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(!d(H[Z],Q[Z]))return!1}return!0}return!1}function R(H){return Boolean(H&&typeof H==="object"&&!Array.isArray(H))}var w=new p("bunfig",{showTags:!0});async function JH(H,Q,X="replace"){if(!GH(H))return null;try{let U=await import(H),Z=U.default||U;if(typeof Z!=="object"||Z===null||Array.isArray(Z))return null;try{return a(Q,Z,X)}catch{return null}}catch{return null}}function yH(H,Q,X=!1){if(!H)return Q;let U=H.toUpperCase().replace(/-/g,"_"),Z={...Q};function Y($,G=[]){let J={...$};for(let[N,q]of Object.entries($)){let A=[...G,N],D=(E)=>E.replace(/([A-Z])/g,"_$1").toUpperCase(),W=`${U}_${A.map(D).join("_")}`,F=`${U}_${A.map((E)=>E.toUpperCase()).join("_")}`;if(X)w.info(`Checking environment variable ${W} for config ${H}.${A.join(".")}`);if(typeof q==="object"&&q!==null&&!Array.isArray(q))J[N]=Y(q,A);else{let E=P.env[W]||P.env[F];if(E!==void 0){if(X)w.info(`Using environment variable ${E?W:F} for config ${H}.${A.join(".")}`);if(typeof q==="number")J[N]=Number(E);else if(typeof q==="boolean")J[N]=E.toLowerCase()==="true";else if(Array.isArray(q))try{let I=JSON.parse(E);if(Array.isArray(I))J[N]=I;else J[N]=E.split(",").map((WH)=>WH.trim())}catch{J[N]=E.split(",").map((I)=>I.trim())}else J[N]=E}}}return J}return Y(Z)}async function zH({name:H="",alias:Q,cwd:X,defaultConfig:U,verbose:Z=!1,checkEnv:Y=!0,arrayStrategy:$="replace"}){let G=Y&&typeof U==="object"&&U!==null&&!Array.isArray(U)?yH(H,U,Z):U,J=X||P.cwd(),N=[".ts",".js",".mjs",".cjs",".json"];if(Z)w.info(`Loading configuration for "${H}"${Q?` (alias: "${Q}")`:""} from ${J}`);let q=[];if(q.push(`${H}.config`),q.push(`.${H}.config`),q.push(H),q.push(`.${H}`),Q)q.push(`${Q}.config`),q.push(`.${Q}.config`),q.push(Q),q.push(`.${Q}`);for(let A of q)for(let D of N){let W=O(J,`${A}${D}`),F=await JH(W,G,$);if(F!==null){if(Z)w.success(`Configuration loaded from: ${A}${D}`);return F}}if(H){let A=O(KH(),".config",H),D=["config",`${H}.config`];if(Q)D.push(`${Q}.config`);if(Z)w.info(`Checking user config directory: ${A}`);for(let W of D)for(let F of N){let E=O(A,`${W}${F}`),I=await JH(E,G,$);if(I!==null){if(Z)w.success(`Configuration loaded from user config directory: ${E}`);return I}}}try{let A=O(J,"package.json");if(GH(A)){let D=await import(A),W=D[H];if(!W&&Q){if(W=D[Q],W&&Z)w.success(`Using alias "${Q}" configuration from package.json`)}if(W&&typeof W==="object"&&!Array.isArray(W))try{if(Z)w.success(`Configuration loaded from package.json: ${W===D[H]?H:Q}`);return a(G,W,$)}catch(F){if(Z)w.warn("Failed to merge package.json config:",F)}}}catch(A){if(Z)w.warn("Failed to load package.json:",A)}if(Z)w.info(`No configuration found for "${H}"${Q?` or alias "${Q}"`:""}, using default configuration with environment variables`);return G}var IQ=O(P.cwd(),"config"),jQ=O(P.cwd(),"src/generated");function fH(){if(z.env.LAUNCHPAD_INSTALL_PATH)return z.env.LAUNCHPAD_INSTALL_PATH;try{let H=S.join("/usr/local",".writable_test");return AH.mkdirSync(H,{recursive:!0}),AH.rmdirSync(H),"/usr/local"}catch{let H=z.env.HOME||z.env.USERPROFILE||"~";return S.join(H,".local")}}function dH(){if(z.env.LAUNCHPAD_SHIM_PATH)return z.env.LAUNCHPAD_SHIM_PATH;let H=z.env.HOME||z.env.USERPROFILE||"~";return S.join(H,".local","bin")}var pH={verbose:z.env.LAUNCHPAD_VERBOSE==="true"||z.env.CI==="true"||z.env.GITHUB_ACTIONS==="true"||!1,sudoPassword:z.env.SUDO_PASSWORD||"",devAware:!0,maxRetries:z.env.CI==="true"||z.env.GITHUB_ACTIONS==="true"?5:3,timeout:z.env.CI==="true"||z.env.GITHUB_ACTIONS==="true"?120000:60000,symlinkVersions:!0,forceReinstall:!1,shimPath:dH(),autoAddToPath:z.env.LAUNCHPAD_AUTO_ADD_PATH!=="false",showShellMessages:z.env.LAUNCHPAD_SHOW_ENV_MESSAGES!=="false",shellActivationMessage:z.env.LAUNCHPAD_SHELL_ACTIVATION_MESSAGE||"\u2705 Environment activated for \x1B[3m{path}\x1B[0m",shellDeactivationMessage:z.env.LAUNCHPAD_SHELL_DEACTIVATION_MESSAGE||"\u26AA Environment deactivated",useRegistry:!0,installMethod:"curl",installPath:fH(),postSetup:{enabled:z.env.LAUNCHPAD_POST_SETUP_ENABLED!=="false",commands:[]},preSetup:{enabled:z.env.LAUNCHPAD_PRE_SETUP_ENABLED!=="false",commands:[]},preActivation:{enabled:z.env.LAUNCHPAD_PRE_ACTIVATION_ENABLED!=="false",commands:[]},postActivation:{enabled:z.env.LAUNCHPAD_POST_ACTIVATION_ENABLED!=="false",commands:[]},services:{enabled:z.env.LAUNCHPAD_SERVICES_ENABLED!=="false",dataDir:z.env.LAUNCHPAD_SERVICES_DATA_DIR||S.join(r(),".local","share","launchpad","services"),logDir:z.env.LAUNCHPAD_SERVICES_LOG_DIR||S.join(r(),".local","share","launchpad","logs"),configDir:z.env.LAUNCHPAD_SERVICES_CONFIG_DIR||S.join(r(),".local","share","launchpad","services","config"),autoRestart:z.env.LAUNCHPAD_SERVICES_AUTO_RESTART!=="false",startupTimeout:Number.parseInt(z.env.LAUNCHPAD_SERVICES_STARTUP_TIMEOUT||"30",10),shutdownTimeout:Number.parseInt(z.env.LAUNCHPAD_SERVICES_SHUTDOWN_TIMEOUT||"10",10),infer:z.env.LAUNCHPAD_SERVICES_INFER!=="false",database:{username:z.env.LAUNCHPAD_DB_USERNAME||"root",password:z.env.LAUNCHPAD_DB_PASSWORD||"password",authMethod:z.env.LAUNCHPAD_DB_AUTH_METHOD||"trust"},frameworks:{enabled:z.env.LAUNCHPAD_FRAMEWORKS_ENABLED!=="false",laravel:{enabled:z.env.LAUNCHPAD_LARAVEL_ENABLED!=="false",autoDetect:z.env.LAUNCHPAD_LARAVEL_AUTO_DETECT!=="false"},stacks:{enabled:z.env.LAUNCHPAD_STACKS_ENABLED!=="false",autoDetect:z.env.LAUNCHPAD_STACKS_AUTO_DETECT!=="false"}},php:{enabled:z.env.LAUNCHPAD_PHP_ENABLED!=="false",strategy:z.env.LAUNCHPAD_PHP_STRATEGY||"auto-detect",version:z.env.LAUNCHPAD_PHP_VERSION||"8.4.0",autoDetect:{enabled:z.env.LAUNCHPAD_PHP_AUTO_DETECT!=="false",includeAllDatabases:z.env.LAUNCHPAD_PHP_ALL_DATABASES==="true",includeEnterprise:z.env.LAUNCHPAD_PHP_ENTERPRISE==="true"},configuration:z.env.LAUNCHPAD_PHP_CONFIGURATION||"full-stack"}}},hQ=await zH({name:"launchpad",defaultConfig:pH});export{pH as defaultConfig,hQ as config};
export{pH as $a,hQ as ab};