@elysiumjs/core 0.5.3 → 0.5.4

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/command.d.ts CHANGED
@@ -77,7 +77,7 @@ type CommandArgumentMetadata = CommandArgumentProps & {
77
77
  * Type for a command class.
78
78
  * @author Axel Nana <axel.nana@workbud.com>
79
79
  */
80
- export type CommandClass = Class<Command> & {
80
+ export type CommandClass<T extends Command = Command> = Class<T> & {
81
81
  /**
82
82
  * The name of the command.
83
83
  */
package/dist/index.js CHANGED
@@ -3,10 +3,10 @@ var $X=Object.defineProperty;var _X=(Q,X)=>{for(var Y in X)$X(Q,Y,{get:X[Y],enum
3
3
  `:""))}newLine(){this.write(`
4
4
  `,!1)}info(Q){this.write(`${this.format("\u2139",4)} ${Q}`)}success(Q){this.write(`${this.format("\u2714",2)} ${Q}`)}warning(Q){this.write(`${this.format("\u26A0",3)} ${Q}`)}error(Q){this.write(`${this.format("\u2716",1)} ${Q}`,!0,process.stderr)}debug(Q){if(process.env.DEBUG)this.write(`\uD83D\uDD0D ${Q}`)}trace(Q,X){if(!Q)return;let Y=Q.name||"Error",Z=Q.message||"An error occurred",$=Q.stack||"";if(X)this.title(X);else this.newLine();if(this.write(this.format(`${Y}: ${Z}`,1)),Q.stack)this.write(this.format("Stack Trace:",9)),this.write(this.format($.split(`
5
5
  `).map((U)=>` ${U}`).join(`
6
- `),8));let _=GX(Q,["name","message","stack"]);if(!UX(_))this.write(this.format("Additional Information:",9)),Object.keys(_).forEach((U)=>{let G=Q[U];this.write(` ${U}: ${JSON.stringify(G)}`)});this.newLine()}title(Q){this.newLine(),this.write(this.format(Q,9,10)),this.newLine()}section(Q){this.newLine(),this.write(`\x1B[1m${Q}\x1B[0m`)}table(Q,X){if(Q.length===0){this.info("No data to display");return}let Y=Object.keys(X||Q[0]),Z={};for(let U of Y){let G=X?.[U];if(G?.width){Z[U]=G.width;continue}let M=(G?.header||String(U)).length,H=Math.max(...Q.map((L)=>{let z=L[U];if(G?.format)return G.format(z).length;return String(z===null||z===void 0?"":z).length}));Z[U]=Math.max(M,H)}let $="",_="";for(let U of Y){let M=X?.[U]?.header||String(U),H=Z[U];$+=`| ${M.padEnd(H)} `,_+=`| ${"-".repeat(H)} `}$+="|",_+="|",this.write($),this.write(_);for(let U of Q){let G="";for(let M of Y){let H=X?.[M],L=Z[M],z=U[M],R;if(H?.format)R=H.format(z);else R=String(z===null||z===void 0?"":z);G+=`| ${R.padEnd(L)} `}G+="|",this.write(G)}this.newLine()}format(Q,...X){return`${X.map((Z)=>LX[Z]).join("")}${Q}\x1B[0m`}bold(Q){return this.format(Q,9)}italic(Q){return this.format(Q,11)}underline(Q){return this.format(Q,10)}clear(){process.stdout.write("\x1Bc")}moveCursor(Q,X){process.stdout.moveCursor(Q,X)}clearLine(){process.stdout.clearLine(0),process.stdout.cursorTo(0)}async prompt(Q,X){let Y=WQ.createInterface({input:process.stdin,output:process.stdout}),Z=X?` (default: ${X})`:"";return new Promise(($)=>{Y.question(`${Q}${Z}: `,(_)=>{Y.close(),$(_||X||"")})})}async promptPassword(Q){let X=WQ.createInterface({input:process.stdin,output:process.stdout});return process.stdin.setRawMode?.(!0),new Promise((Y)=>{let Z="";process.stdout.write(`${Q}: `),process.stdin.on("data",($)=>{let _=$.toString();if(_==="\r"||_===`
6
+ `),8));let _=GX(Q,["name","message","stack"]);if(!UX(_))this.write(this.format("Additional Information:",9)),Object.keys(_).forEach((U)=>{let G=Q[U];this.write(` ${U}: ${JSON.stringify(G)}`)});this.newLine()}title(Q){this.newLine(),this.write(this.format(Q,9,10)),this.newLine()}section(Q){this.newLine(),this.write(`\x1B[1m${Q}\x1B[0m`)}table(Q,X){if(Q.length===0){this.info("No data to display");return}let Y=Object.keys(X||Q[0]),Z={};for(let U of Y){let G=X?.[U];if(G?.width){Z[U]=G.width;continue}let M=(G?.header||String(U)).length,L=Math.max(...Q.map((P)=>{let H=P[U];if(G?.format)return G.format(H).length;return String(H===null||H===void 0?"":H).length}));Z[U]=Math.max(M,L)}let $="",_="";for(let U of Y){let M=X?.[U]?.header||String(U),L=Z[U];$+=`| ${M.padEnd(L)} `,_+=`| ${"-".repeat(L)} `}$+="|",_+="|",this.write($),this.write(_);for(let U of Q){let G="";for(let M of Y){let L=X?.[M],P=Z[M],H=U[M],B;if(L?.format)B=L.format(H);else B=String(H===null||H===void 0?"":H);G+=`| ${B.padEnd(P)} `}G+="|",this.write(G)}this.newLine()}format(Q,...X){return`${X.map((Z)=>LX[Z]).join("")}${Q}\x1B[0m`}bold(Q){return this.format(Q,9)}italic(Q){return this.format(Q,11)}underline(Q){return this.format(Q,10)}clear(){process.stdout.write("\x1Bc")}moveCursor(Q,X){process.stdout.moveCursor(Q,X)}clearLine(){process.stdout.clearLine(0),process.stdout.cursorTo(0)}async prompt(Q,X){let Y=WQ.createInterface({input:process.stdin,output:process.stdout}),Z=X?` (default: ${X})`:"";return new Promise(($)=>{Y.question(`${Q}${Z}: `,(_)=>{Y.close(),$(_||X||"")})})}async promptPassword(Q){let X=WQ.createInterface({input:process.stdin,output:process.stdout});return process.stdin.setRawMode?.(!0),new Promise((Y)=>{let Z="";process.stdout.write(`${Q}: `),process.stdin.on("data",($)=>{let _=$.toString();if(_==="\r"||_===`
7
7
  `){process.stdout.write(`
8
- `),process.stdin.setRawMode?.(!1),process.stdin.removeAllListeners("data"),X.close(),Y(Z);return}if(_==="\b"||_==="\x7F"){if(Z.length>0)Z=Z.slice(0,-1),process.stdout.write("\b \b");return}Z+=_,process.stdout.write("*")})})}async confirm(Q,X=!1){let Y=X?"Y/n":"y/N",Z=await this.prompt(`${Q} [${Y}]`);if(!Z)return X;return Z.toLowerCase()==="y"||Z.toLowerCase()==="yes"}async select(Q,X,Y=0){if(X.length===0)throw new Error("No options provided for selection");this.write(Q),X.forEach((_,U)=>{let G=U===Y;this.write(` ${U+1}. ${_}${G?" (default)":""}`)});let Z=await this.prompt("Enter your choice (number)");if(!Z)return X[Y];let $=parseInt(Z,10)-1;if(isNaN($)||$<0||$>=X.length)return this.warning(`Invalid selection. Using default: ${X[Y]}`),X[Y];return X[$]}formatTime(Q){if(Q<60)return`${Q.toFixed(1)}s`;if(Q<3600)return`${Math.floor(Q/60)}m ${Math.floor(Q%60)}s`;return`${Math.floor(Q/3600)}h ${Math.floor(Q%3600/60)}m`}}var OQ,LX;var e=_Q(()=>{((P)=>{P[P.BLACK=0]="BLACK";P[P.RED=1]="RED";P[P.GREEN=2]="GREEN";P[P.YELLOW=3]="YELLOW";P[P.BLUE=4]="BLUE";P[P.MAGENTA=5]="MAGENTA";P[P.CYAN=6]="CYAN";P[P.WHITE=7]="WHITE";P[P.GRAY=8]="GRAY";P[P.BOLD=9]="BOLD";P[P.UNDERLINE=10]="UNDERLINE";P[P.ITALIC=11]="ITALIC";P[P.INVERSE=12]="INVERSE"})(OQ||={});LX={[0]:Bun.color("black","ansi")||Bun.color("black","ansi-256")||"",[1]:Bun.color("red","ansi")||Bun.color("red","ansi-256")||"",[2]:Bun.color("green","ansi")||Bun.color("green","ansi-256")||"",[3]:Bun.color("yellow","ansi")||Bun.color("yellow","ansi-256")||"",[4]:Bun.color("blue","ansi")||Bun.color("blue","ansi-256")||"",[5]:Bun.color("magenta","ansi")||Bun.color("magenta","ansi-256")||"",[6]:Bun.color("cyan","ansi")||Bun.color("cyan","ansi-256")||"",[7]:Bun.color("white","ansi")||Bun.color("white","ansi-256")||"",[8]:Bun.color("gray","ansi")||Bun.color("gray","ansi-256")||"",[9]:"\x1B[1m",[10]:"\x1B[4m",[11]:"\x1B[3m",[12]:"\x1B[7m"}});import{isObject as UQ,isPrimitive as OX}from"radash";function o(Q,...X){if(!X.length)return Q;let Y=X.shift();if(Y===void 0)return Q;if(UQ(Q)&&UQ(Y))for(let Z in Y)if(UQ(Y[Z])){if(!Q[Z])Object.assign(Q,{[Z]:Y[Z]})}else if(Array.isArray(Y[Z])){if(!Array.isArray(Q[Z]))Q[Z]=[];if(Y[Z].length>0&&!UQ(Y[Z][0]))Q[Z]=[...new Set([...Q[Z],...Y[Z]])];else Y[Z].forEach(($,_)=>{if(UQ($)&&Q[Z][_])Q[Z][_]=o(Q[Z][_],$);else if(!Q[Z].includes($))Q[Z].push($)})}else if(OX(Y[Z]))Q[Z]??=Y[Z];else o(Q[Z],Y[Z]);return o(Q,...X)}var O,n=()=>new Promise((Q)=>process.nextTick(Q));var g=_Q(()=>{((T)=>(T.app=Symbol("elysium:Application"),T.controller=Symbol("elysium:Controller"),T.middlewares=Symbol("elysium:MiddlewaresList"),T.services=Symbol("elysium:ServicesList"),T.websocket=Symbol("elysium:WebSocket"),T.wamp=Symbol("elysium:Wamp"),T.http=Symbol("elysium:Http"),T.job=Symbol("elysium:Job"),T.arg=Symbol("elysium:CommandArguments"),T.elysiaPlugin=Symbol("elysium:ElysiaPlugin"),T.middlewareGuards=Symbol("elysium:MiddlewareGuards")))(O||={})});import{isString as QQ}from"radash";var NQ,PX=(Q)=>{return typeof Q==="function"&&Q.prototype&&Q.prototype.constructor===Q},s,B;var d=_Q(()=>{g();((Y)=>{Y[Y.SINGLETON=0]="SINGLETON";Y[Y.FACTORY=1]="FACTORY"})(NQ||={});s=new Map;((E)=>{E.register=(L)=>{return function(z){let R=L?.name??z.name,P=L?.scope??0;if(B.exists(R))console.error(`A service with the name ${R} has already been registered.`),process.exit(1);let j=()=>B.make(z);if(P===0){let C=j();s.set(R,{scope:P,factory(){return C}})}else s.set(R,{scope:P,factory:j})}},E.inject=(L)=>{return function(z,R,P){let j=Reflect.getMetadata(O.services,z,R)??[],C=Reflect.getMetadata("design:paramtypes",z,R)??[],y=QQ(L)?L:L?.name??C[P].name;j.push({name:y,index:P}),Reflect.defineMetadata(O.services,j,z,R)}},E.get=(L)=>{let z=QQ(L)?L:L.name;if(E.exists(z))return s.get(z).factory();return null},E.make=(L)=>{let z=Reflect.getMetadata(O.services,L)??[],R=[];return z.forEach((P)=>{let j=E.get(P.name);if(j===null)console.error(`Cannot inject service ${P.name}. No service was registered with the name: ${P.name}`),process.exit(1);R[P.index]=j}),new L(...R)},E.bind=(L,z)=>{let R=E.make(L);return E.instance(z??L.name,R)};function _(L,z){let R=QQ(L)?L:z??L.name;if(E.exists(R))console.error(`A service with the name ${R} has already been registered.`),process.exit(1);let P=()=>{return PX(L)?E.make(L):z()};return s.set(R,{scope:1,factory:P}),P()}E.factory=_,E.instance=(L,z)=>{let R=QQ(L)?L:L.name;if(E.exists(R))console.error(`A service with the name ${R} has already been registered.`),process.exit(1);return s.set(R,{scope:0,factory(){return z}}),z},E.remove=(L)=>{let z=QQ(L)?L:L.name;s.delete(z)},E.exists=(L)=>{let z=QQ(L)?L:L.name;return s.has(z)},E.clear=()=>{s.clear()}})(B||={})});import"reflect-metadata";import{assign as jX,uid as FX}from"radash";var dQ;var FQ=_Q(()=>{e();d();g();dQ=class dQ extends k{#Q;#X;#Y="pending";#Z;static register(Q={}){return function(X){Q=jX({name:X.name,queue:"default"},Q);let Y=`job.${Q.name}`;B.instance(Y,X),Reflect.defineMetadata(O.job,{name:Y,queue:Q.queue},X)}}id;createdAt;get startedAt(){return this.#Q}get completedAt(){return this.#X}get status(){return this.#Y}constructor(Q){super();this.id=Q||this.generateJobId(),this.createdAt=new Date}async run(){try{this.#Y="running",this.#Q=new Date,this.debug(`Job ${this.id} started at ${this.#Q.toISOString()}`),await this.execute(),this.#Y="completed",this.#X=new Date,this.debug(`Job ${this.id} completed at ${this.#X.toISOString()}`)}catch(Q){if(this.#Z=Q instanceof Error?Q:new Error(String(Q)),this.#Y!=="cancelled")this.#Y="failed";this.#X=new Date,this.trace(this.#Z)}}cancel(){this.#Y="cancelled"}generateJobId(){return`job_${Date.now()}_${FX(8)}`}}});var pQ={};_X(pQ,{WorkerPool:()=>zQ,Worker:()=>AQ});import{uid as AX}from"radash";var lQ,AQ,zQ;var EQ=_Q(()=>{e();FQ();d();g();lQ=globalThis.Worker;AQ=class AQ extends k{#Q;queues=new Map;defaultQueueName="default";static spawn(Q,X=["default"],Y){let Z=new this;Z.debug(`Worker ${Z.id} starting with queues: ${X.join(", ")}`);for(let $ of X)Z.createQueue({name:$,concurrency:Y?.concurrency??1,maxRetries:Y?.maxRetries??5,retryDelay:Y?.retryDelay??5000,pauseOnError:Y?.pauseOnError??!1});return Q.addEventListener("message",async($)=>{let{type:_="job:process",jobId:U,job:G,args:M,queue:H="default"}=$.data;switch(_){case"job:cancel":let L=Z.cancelJob(U,H);Q.postMessage({type:"job:canceled",jobId:U,queue:H,success:L,count:L?1:0});break;case"job:cancelAll":let z=Z.cancelAllJobs(H);Q.postMessage({type:"jobs:canceled",queue:H,count:z});break;case"job:process":Z.debug(`Worker ${Z.id} received job ${G} for queue ${H}`);try{let R=B.get(G);if(!R)throw Z.error(`Job class ${G} not found`),new Error(`Job class ${G} not found`);let P=new R(...M||[]);Z.addJob(P,H),Q.postMessage({type:"job:received",jobId:P.id,queue:H})}catch(R){Z.trace({...R,...Y??{}},`Error while adding job '${G}' to queue '${H}' with worker ${Z.id}`),Q.postMessage({type:"job:error",jobName:G,error:R.message})}break}}),Q.addEventListener("error",($)=>{Z.trace({...$.error,filename:$.filename},`Worker ${Z.id} error:`)}),Q.addEventListener("unhandledrejection",($)=>{Z.trace($,`Worker ${Z.id} unhandled rejection:`)}),Q.postMessage({type:"worker:ready",id:Z.id,queues:X}),Z}constructor(){super();this.#Q=AX(24),this.createQueue({name:this.defaultQueueName})}get id(){return this.#Q}createQueue(Q){if(this.queues.has(Q.name))return this.debug(`Queue with name '${Q.name}' already exists`),this;let X={options:{...Q,concurrency:Q.concurrency||1,maxRetries:Q.maxRetries||0,retryDelay:Q.retryDelay||1000,pauseOnError:Q.pauseOnError||!1},jobs:[],processing:0,paused:!1,draining:!1};return this.queues.set(Q.name,X),this.debug(`Created queue '${Q.name}'`),this}addJob(Q,X=this.defaultQueueName){let Y=this.queues.get(X);if(!Y)return this.error(`Queue '${X}' does not exist`),this;if(Y.draining)return this.warning(`Queue '${X}' is draining, job ${Q.id} will not be added`),this;let Z={job:Q,retries:0,queueName:X};if(Y.jobs.push(Z),this.debug(`Added job ${Q.id} to queue '${X}'`),!Y.paused&&Y.processing<Y.options.concurrency)this.processNextJob(X);return this}pause(Q){if(Q){let X=this.queues.get(Q);if(X)X.paused=!0,this.info(`Paused queue '${Q}'`)}else for(let[X]of this.queues.entries())this.pause(X);return this}resume(Q){if(Q){let X=this.queues.get(Q);if(X)X.paused=!1,this.info(`Resumed queue '${Q}'`),this.processQueueJobs(Q)}else for(let[X]of this.queues.entries())this.resume(X);return this}drain(Q){if(Q){let X=this.queues.get(Q);if(X)X.draining=!0,this.info(`Draining queue '${Q}'`)}else for(let[X]of this.queues.entries())this.drain(X);return this}clear(Q){if(Q){let X=this.queues.get(Q);if(X){let Y=X.jobs.length;X.jobs=[],this.info(`Cleared ${Y} jobs from queue '${Q}'`)}}else for(let[X,Y]of this.queues.entries()){let Z=Y.jobs.length;Y.jobs=[],this.info(`Cleared ${Z} jobs from queue '${X}'`)}return this}size(Q=this.defaultQueueName){let X=this.queues.get(Q);if(!X)throw new Error(`Queue '${Q}' does not exist`);return X.jobs.length}totalSize(){let Q=0;for(let X of this.queues.values())Q+=X.jobs.length;return Q}async processNextJob(Q){let X=this.queues.get(Q);if(!X||X.paused||X.processing>=X.options.concurrency)return;let Y=X.jobs.shift();if(!Y)return;if(Y.job.status==="cancelled"){this.info(`Skipping cancelled job ${Y.job.id}`),X.processing--,this.processQueueJobs(Q);return}X.processing++;try{if(this.debug(`Processing job ${Y.job.id} from queue '${Q}'`),await Y.job.run(),Y.job.status==="failed"){if(Y.retries<X.options.maxRetries)Y.retries++,this.warning(`Job ${Y.job.id} failed, retrying (${Y.retries}/${X.options.maxRetries})`),setTimeout(()=>{if(Y.job.status!=="cancelled")X.jobs.push(Y),this.processQueueJobs(Q);else this.info(`Skipping cancelled job ${Y.job.id} during retry delay`)},X.options.retryDelay);else if(this.error(`Job ${Y.job.id} failed after ${Y.retries} retries`),X.options.pauseOnError)this.pause(Q),this.warning(`Queue '${Q}' paused due to job failure`)}else if(Y.job.status==="completed")this.success(`Job ${Y.job.id} completed successfully`);else this.info(`Job ${Y.job.id} cancelled while running`)}catch(Z){if(this.error(`Unexpected error processing job ${Y.job.id}: ${Z}`),X.options.pauseOnError)this.pause(Q),this.warning(`Queue '${Q}' paused due to unexpected error`)}finally{X.processing--,this.processQueueJobs(Q)}}processQueueJobs(Q){let X=this.queues.get(Q);if(!X||X.paused)return;while(X.jobs.length>0&&X.processing<X.options.concurrency)this.processNextJob(Q)}getStats(){let Q={};for(let[X,Y]of this.queues.entries())Q[X]={waiting:Y.jobs.length,processing:Y.processing,paused:Y.paused,draining:Y.draining};return Q}cancelJob(Q,X){if(X)return this.cancelJobInQueue(Q,X);else{let Y=!1;for(let[Z]of this.queues.entries())if(this.cancelJobInQueue(Q,Z)){Y=!0;break}return Y}}cancelJobInQueue(Q,X){let Y=this.queues.get(X);if(!Y)return!1;let Z=Y.jobs.findIndex(($)=>$.job.id===Q);if(Z>=0)return Y.jobs[Z].job.cancel(),this.info(`Canceled job ${Q} in queue '${X}'`),!0;return!1}cancelAllJobs(Q){let X=0;if(Q){let Y=this.queues.get(Q);if(Y)X=Y.jobs.length,Y.jobs.forEach((Z)=>{Z.job.cancel()}),this.info(`Canceled ${X} jobs in queue '${Q}'`)}else for(let[Y,Z]of this.queues.entries()){let $=Z.jobs.length;Z.jobs.forEach((_)=>{_.job.cancel()}),X+=$,this.info(`Canceled ${$} jobs in queue '${Y}'`)}return X}};zQ=class zQ extends k{workers=[];currentWorkerIndex=0;queueWorkerMap=new Map;static instance=new zQ;constructor(){super()}async init(){}async addWorker(Q=[]){let X;if(ELYSIUM_BUILD)X=new lQ("./index.js",{argv:["work",...Q.map((Y)=>`--queue=${Y}`)]});else{let Y=await Array.fromAsync(new Bun.Glob("./src/**/*.job.ts").scan());X=new lQ("./index.ts",{preload:Y,argv:["work",...Q.map((Z)=>`--queue=${Z}`)]})}X.addEventListener("error",(Y)=>{this.trace({message:"An error occurred inside a worker process",stack:Y.message,name:"WorkerError"}),this.removeWorker(X),this.addWorker(Q)}),X.addEventListener("messageerror",(Y)=>{this.error(`Worker message error: ${Y}`)}),X.addEventListener("message",(Y)=>{if(Y.data.type==="worker:ready")this.debug(`Worker ${Y.data.id} ready with queues: ${Y.data.queues.join(", ")}`);else if(Y.data.type==="job:received")this.debug(`Job ${Y.data.jobId} received by worker for queue ${Y.data.queue}`);else if(Y.data.type==="job:error")this.error(`Error processing job ${Y.data.jobName}: ${Y.data.error}`);else this.debug(`Worker message: ${JSON.stringify(Y.data)}`)}),this.workers.push(X);for(let Y of Q){if(!this.queueWorkerMap.has(Y))this.queueWorkerMap.set(Y,[]);this.queueWorkerMap.get(Y).push(X)}}removeWorker(Q){let X=Q??this.workers.pop();if(!X)return;X.terminate();for(let[Y,Z]of this.queueWorkerMap.entries())this.queueWorkerMap.set(Y,Z.filter(($)=>$!==X));if(Q)this.workers=this.workers.filter((Y)=>Y!==X)}terminate(){while(this.workers.length>0)this.removeWorker();this.queueWorkerMap.clear()}runJob(Q,...X){if(!Reflect.hasMetadata(O.job,Q))throw new Error(`Job ${Q.name} is not marked with @job() decorator`);let{name:Y,queue:Z="default"}=Reflect.getMetadata(O.job,Q),$=this.queueWorkerMap.get(Z)||this.workers;if($.length===0)throw new Error(`No workers available for queue '${Z}'`);let _=this.currentWorkerIndex%$.length;$[_].postMessage({job:Y,args:X,queue:Z}),this.currentWorkerIndex=(this.currentWorkerIndex+1)%this.workers.length}cancelJob(Q,X){for(let Y of this.workers)Y.postMessage({type:"job:cancel",jobId:Q,queue:X});return this.workers.length>0}cancelAllJobs(Q){for(let X of this.workers)X.postMessage({type:"job:cancelAll",queue:Q});return this.workers.length>0}}});global.ELYSIUM_BUILD=typeof ELYSIUM_BUILD!=="undefined";import{t as vZ}from"elysia";e();import{AsyncLocalStorage as EX}from"async_hooks";import{parseArgs as IX}from"util";import{swagger as TX}from"@elysiajs/swagger";import{Value as GQ}from"@sinclair/typebox/value";import{Elysia as xX}from"elysia";import{first as wX}from"radash";import{getTableName as qQ,is as hQ,Table as bQ}from"drizzle-orm";import{drizzle as MX}from"drizzle-orm/bun-sql";import{Cache as JX}from"drizzle-orm/cache/core";import{createCache as SQ}from"cache-manager";import{KeyvCacheableMemory as BX}from"cacheable";import{Keyv as CQ}from"keyv";import{alphabetical as VX}from"radash";import{EventEmitter as zX}from"events";import{omit as RX}from"radash";import{EventEmitter as HX}from"events";import{isString as fQ}from"radash";class q extends HX{static instance=new q;constructor(){super();this.on("error",(Q)=>this.emitError(Q))}emitError(Q){this.emit("elysium:error",{data:Q,source:null})}emitEvent(Q,X,Y=null){this.emit(Q,{data:X,source:Y})}}var w;((m)=>{m.emit=(U,G,M=null)=>{q.instance.emitEvent(U,G,M)};function X(U,G){if(fQ(U))q.instance.on(U,G);else return function(M,H,L){let z=async function(P){try{await L.value(P)}catch(j){q.instance.emitError(j)}};if(U.prepend??!1)q.instance.prependListener(U.event,z);else q.instance.on(U.event,z)}}m.on=X;function Y(U,G){if(fQ(U))q.instance.once(U,G);else return function(M,H,L){let z=async function(P){try{await L.value(P)}catch(j){q.instance.emitError(j)}};if(U.prepend??!1)q.instance.prependOnceListener(U.event,z);else q.instance.once(U.event,z)}}m.once=Y,m.off=(U)=>{q.instance.removeAllListeners(U)},m.clear=()=>{q.instance.removeAllListeners()},m.listen=(U)=>{if(U.mode==="on")return X(U);else if(U.mode==="once")return Y(U);return function(G,M,H){console.error("Unknown mode provided to @listen. Use either 'on' or 'once'.")}}})(w||={});d();class DQ extends zX{#Q;#X;#Y="::";#Z=1000;#$=!0;#_=!1;#U;constructor(Q){super();w.once("elysium:app:launched",()=>{this.#Q=r.getConnection(Q.connection)}),this.#U=Q.connection,this.#X=Q.namespace,this.#Y=Q.keyPrefixSeparator??"::",this.#Z=Q.clearBatchSize??1000,this.#$=Q.useUnlink??!0,this.#_=Q.noNamespaceAffectsAll??!1,this.on("error",(X)=>{w.emit("elysium:error",X)})}get client(){return this.#Q}get opts(){return{namespace:this.#X,keyPrefixSeparator:this.#Y,clearBatchSize:this.#Z,noNamespaceAffectsAll:this.#_,dialect:"redis",url:this.#U}}get namespace(){return this.#X}set namespace(Q){this.#X=Q}async get(Q){Q=this.createKeyPrefix(Q,this.#X);let X=await this.client.get(Q);return X===null?void 0:X}async set(Q,X,Y){if(Q=this.createKeyPrefix(Q,this.#X),Y)await this.client.set(Q,X,"PX",Y);else await this.client.set(Q,X)}async setMany(Q){let X=[];for(let{key:Y,value:Z,ttl:$}of Q){let _=this.createKeyPrefix(Y,this.#X);if($)X.push(this.client.set(_,Z,"PX",$));else X.push(this.client.set(_,Z))}await Promise.all(X)}async delete(Q){return Q=this.createKeyPrefix(Q,this.#X),await(this.#$?this.client.send("UNLINK",[Q]):this.client.del(Q))>0}async clear(){try{if(!this.#X&&this.#_){await this.client.send("FLUSHDB",[]);return}let Q="0",X=this.#Z,Y=this.#X?`${this.#X}${this.#Y}*`:"*",Z=[];do{let $=await this.client.send("SCAN",[Q,"MATCH",Y,"COUNT",X.toString(),"TYPE","string"]),[_,U]=$;if(Q=_.toString(),U.length===0)continue;if(!this.#X)U=U.filter((G)=>!G.includes(this.#Y));Z.push(U.map((G)=>this.client.del(G)))}while(Q!=="0");await Promise.all(Z)}catch(Q){this.emit("error",Q)}}async has(Q){return Q=this.createKeyPrefix(Q,this.#X),this.client.exists(Q)}async hasMany(Q){let X=[];for(let Y of Q){let Z=this.createKeyPrefix(Y,this.#X);X.push(this.client.exists(Z))}return Promise.all(X)}async getMany(Q){if(Q.length===0)return[];return Q=Q.map((Y)=>this.createKeyPrefix(Y,this.#X)),await this.client.mget(...Q)}async disconnect(){this.client.close()}async deleteMany(Q){let X=!1,Y=[];for(let $ of Q){let _=this.createKeyPrefix($,this.#X);if(this.#$)Y.push(this.client.send("UNLINK",[_]));else Y.push(this.client.del(_))}let Z=await Promise.all(Y);for(let $ of Z)if(typeof $==="number"&&$>0)X=!0;return X}async*iterator(Q){let X=Q?`${Q}${this.#Y}*`:"*",Y="0";do{let Z=await this.client.send("SCAN",[Y,"MATCH",X,"TYPE","string"]),[$,_]=Z;if(Y=$.toString(),!Q&&!this.#_)_=_.filter((U)=>!U.includes(this.#Y));if(_.length>0){let U=await this.client.mget(..._);for(let G of _.keys()){let M=this.getKeyWithoutPrefix(_[G],Q),H=U[G];yield[M,H]}}}while(Y!=="0")}createKeyPrefix(Q,X){return X?`${X}${this.#Y}${Q}`:Q}getKeyWithoutPrefix(Q,X){return X?Q.replace(`${X}${this.#Y}`,""):Q}}var r;((h)=>{let Q=(U)=>{return`redis.connection.${U}`};h.getConnection=(U)=>{if(!B.exists(Q(U)))console.error(`No Redis connection with name ${U} found. Please make sure to register the connection before using it.`),process.exit(1);return B.get(Q(U))},h.registerConnection=(U,G)=>{if(B.exists(Q(U)))console.error(`A Redis connection with the name ${U} has already been registered.`),process.exit(1);return B.instance(Q(U),new Bun.RedisClient(G.url,RX(G,["url"])))},h.connectionExists=(U)=>{return B.exists(Q(U))},h.getDefaultConnection=()=>{return h.getConnection("default")},h.setDefaultConnection=(U)=>{let G=Q("default");return B.remove(G),B.instance(G,h.getConnection(U))}})(r||={});var kQ=(Q)=>{let X=SQ({stores:[new CQ({store:Q,namespace:"cache"})]}),Y=new Map;return{...X,tags(...Z){let $=`cache__${VX(Z,(U)=>U).join("__")}`,_=Y.get($);if(!_)_=SQ({stores:[new CQ({store:Q,namespace:$})]}),Y.set($,_);return _}}};class l{static#Q;static#X;static weak=Object.seal({map:new WeakMap,get(Q){if(!this.map.has(Q))this.map.set(Q,{});return this.map.get(Q)},del(Q){this.map.delete(Q)}});static get redis(){if(!l.#Q)l.#Q=kQ(new DQ({connection:"cache"}));return l.#Q}static get memory(){if(!l.#X)l.#X=kQ(new BX({ttl:60000,lruSize:5000}));return l.#X}}d();class KQ extends JX{cacheStrategy;globalTtl;#Q;usedTablesPerKey={};constructor(Q="explicit",X=1,Y="redis"){super();this.cacheStrategy=Q;this.globalTtl=X;this.#Q=l[Y].tags("database")}strategy(){return this.cacheStrategy}async get(Q){return await this.#Q.get(Q)??void 0}async put(Q,X,Y,Z,$){await this.#Q.set(Q,X,($?.ex??this.globalTtl)*1000);for(let _ of Y){let U=this.usedTablesPerKey[_];if(U===void 0)this.usedTablesPerKey[_]=[Q];else U.push(Q)}}async onMutate(Q){let X=Q.tags?Array.isArray(Q.tags)?Q.tags:[Q.tags]:[],Y=Q.tables?Array.isArray(Q.tables)?Q.tables:[Q.tables]:[],Z=new Set;for(let $ of Y){let _=hQ($,bQ)?qQ($):$,U=this.usedTablesPerKey[_]??[];for(let G of U)Z.add(G)}if(Z.size>0||X.length>0){await this.#Q.mdel(X),await this.#Q.mdel([...Z]);for(let $ of Y){let _=hQ($,bQ)?qQ($):$;this.usedTablesPerKey[_]=[]}}}}var p;((b)=>{let Q=(U)=>{return`db.connection.${U}`};b.getConnection=(U)=>{if(!B.exists(Q(U)))console.error(`No connection with name ${U} found. Please make sure to register the connection before using it.`),process.exit(1);return B.get(Q(U))},b.registerConnection=(U,G)=>{if(B.exists(Q(U)))console.error(`A connection with the name ${U} has already been registered.`),process.exit(1);return B.instance(Q(U),MX({...G,cache:G.cache===void 0?void 0:G.cache===!0?new KQ:G.cache.enabled?new KQ(G.cache.strategy,G.cache.ttl,G.cache.storage):void 0}))},b.connectionExists=(U)=>{return B.exists(Q(U))},b.getDefaultConnection=()=>{return b.getConnection("default")},b.setDefaultConnection=(U)=>{let G=Q("default");return B.remove(G),B.instance(G,b.getConnection(U))}})(p||={});var PQ=new Map,jQ=(Q)=>{for(let[X,Y]of Object.entries(Q))PQ.set(X,Y)},vQ;((XQ)=>(XQ.get=(Z,$)=>{return PQ.get(Z)??$},XQ.exists=(Z)=>{return PQ.has(Z)},XQ.clear=()=>{PQ.clear()}))(vQ||={});d();g();var u=(Q,X,Y)=>{return N.context.run(new Map([["tenant",X.tenant],["http:context",X]]),async()=>{for(let Z of Q)try{let $=await Z[Y](X);if($!==void 0)return $}catch($){throw $}})},YQ=(Q,X)=>{let Y=Q.map((Z)=>B.make(Z));X.onRequest((Z)=>{return u(Y,Z,"onRequest")}),X.onTransform((Z)=>{return u(Y,Z,"onTransform")}),X.onBeforeHandle((Z)=>{return u(Y,Z,"onBeforeHandle")}),X.onAfterHandle((Z)=>{return u(Y,Z,"onAfterHandle")}),X.onAfterResponse((Z)=>{return u(Y,Z,"onAfterResponse")})};class yQ{static register(...Q){return function(X,Y,Z){if(Y===void 0&&Z===void 0){let $=Reflect.getMetadata(O.middlewares,X)??[];$.push(...Q),Reflect.defineMetadata(O.middlewares,$,X)}else{let $=Reflect.getMetadata(O.middlewares,X,Y)??[];$.push(...Q),Reflect.defineMetadata(O.middlewares,$,X,Y)}}}static guards(Q){class X extends this{}return Reflect.defineMetadata(O.middlewareGuards,Q,X),X}get guards(){return Reflect.getMetadata(O.middlewareGuards,this.constructor)??[]}onRequest(Q){}onTransform(Q){}onAfterHandle(Q){}onBeforeHandle(Q){}onAfterResponse(Q){}}d();g();import{Elysia as WX}from"elysia";import{omit as DX}from"radash";import KX from"wampy";d();g();class gQ extends WebSocket{protocols;constructor(Q,X){super(Q,X);this.protocols=X}get protocol(){return this.protocols?.[0]??"wamp.2.json"}}var t;((f)=>{let Q=(H)=>{return`wamp.connection.${H}`};f.getConnection=(H)=>{if(!B.exists(Q(H)))console.error(`No WAMP connection with name ${H} found. Please make sure to register the connection before using it.`),process.exit(1);return B.get(Q(H))},f.registerConnection=(H,L)=>{if(B.exists(Q(H)))console.error(`A WAMP connection with name ${H} already exists. Please ensure to register a new connection before overwriting it.`),process.exit(1);let z=new KX(L.url,{ws:gQ,...DX(L,["url"]),onError(){L.onError?.(),w.emit("elysium:error",new Error(`An error occurred in WAMP connection ${H}`))}}),R=L.maxRetries??5,P=L.retryInterval??5000,j=0,C=async()=>{try{await z.connect()}catch(y){if(console.error(`Failed to connect to WAMP server (attempt ${j+1}/${R}):`,y),j<R)j++,setTimeout(C,P);else console.error(`Max retry attempts (${R}) reached. Giving up.`),w.emit("elysium:error",new Error(`Failed to establish WAMP connection ${H} after ${R} attempts`))}};return C(),B.instance(Q(H),z)},f.connectionExists=(H)=>{return B.exists(Q(H))},f.getDefaultConnection=()=>{return f.getConnection("default")},f.setDefaultConnection=(H)=>{let L=Q("default");return B.remove(L),B.instance(L,f.getConnection(H))},f.controller=(H)=>{return function(L){async function z(){console.log(`Registering Wamp controller for connection ${H.connection} using ${L.name}`),await n();let R=B.make(L),P=Reflect.getMetadata(O.wamp,L)??{},j=t.getConnection(H.connection??"default"),C=new WX;return C.onStart(async(y)=>{let V=P.registrations??[],W=P.subscriptions??[];for(let J of V)j.register(J.topic,J.handler.bind(R),J.options).then((I)=>{console.log(`Registered ${J.topic} with id ${I.registrationId}`)});for(let J of W)j.subscribe(J.topic,J.handler.bind(R),J.options).then((I)=>{console.log(`Subscribed ${J.topic} with id ${I.subscriptionId}`)})}),C}Reflect.defineMetadata(O.elysiaPlugin,z,L)}},f.register=(H,L)=>{return function(z,R,P){let j=Reflect.getMetadata(O.wamp,z.constructor)??{};j.registrations??=[],j.registrations.push({topic:H,options:L,handler:P.value}),Reflect.defineMetadata(O.wamp,j,z.constructor)}},f.subscribe=(H,L)=>{return function(z,R,P){let j=Reflect.getMetadata(O.wamp,z.constructor)??{};j.subscriptions??=[],j.subscriptions.push({topic:H,options:L,handler:P.value}),Reflect.defineMetadata(O.wamp,j,z.constructor)}}})(t||={});class N extends k{#Q;#X;_appContextStorage=new EX;static get instance(){return B.get("elysium.app")}static get context(){return N.instance._appContextStorage}static register(Q={}){return function(X){let Y,Z=Object.getPrototypeOf(X);while(Z&&Z!==Object.prototype){let _=Reflect.getMetadata(O.app,Z);if(_){Y=_;break}Z=Object.getPrototypeOf(Z)}if(Y)Q=o(Y,Q);let $=Reflect.getMetadata(O.app,X);if($)Q=o($,Q);Q=o({modules:[],swagger:!1},Q),Reflect.defineMetadata(O.app,Q,X)}}constructor(){super();let{env:Q,debug:X}=Reflect.getMetadata(O.app,this.constructor)??{};if(this.#X=X??!1,Q){let _=GQ.Convert(Q,GQ.Clone(Bun.env));if(this.#X&&!GQ.Check(Q,_)){let U=GQ.Errors(Q,_).First();this.trace(U,"Invalid environment configuration")}jQ(GQ.Clean(Q,_))}else jQ(Bun.env);B.instance("elysium.app",this);let{database:Y,redis:Z,wamp:$}=Reflect.getMetadata(O.app,this.constructor);if(Z){for(let _ in Z.connections)r.registerConnection(_,Z.connections[_]);if(r.connectionExists(Z.default))r.setDefaultConnection(Z.default)}if(Y){for(let _ in Y.connections)p.registerConnection(_,Y.connections[_]);if(p.connectionExists(Y.default))p.setDefaultConnection(Y.default)}if($){for(let _ in $.connections)t.registerConnection(_,$.connections[_]);if(t.connectionExists($.default))t.setDefaultConnection($.default)}this.run().then(()=>w.emit("elysium:app:launched",this,this)).catch((_)=>{w.emit("elysium:error",_),this.trace(_,"An error occurred while launching the application"),process.exit(1)})}get elysia(){return this.#Q}get isDebug(){return this.#X}set isDebug(Q){this.#X=Q}async onError(Q){return!0}async onStart(Q){}async onStop(Q){}async run(){let Q=process.argv.slice(2),X=Q[0];if(!X)this.commandDescribe();else{let{commands:Y}=Reflect.getMetadata(O.app,this.constructor);switch(X){case"serve":return this.commandServe();case"work":return this.commandWork(Q.slice(1));case"help":{let Z=Q[1];if(Z){let $=Y?.find((_)=>_.command===Z);if($){let _=B.make($);return this.write(await _.help()),process.exit(0)}console.error(`Command <${Z}> not found.`)}else console.error("No command provided. Usage: styx help <command>");this.commandList();break}case"list":{this.write(this.bold("Available commands:")),this.commandList();break}default:{let Z=Q.slice(1);return this.commandExec(X,Z)}}}return process.exit(0)}getConfig(Q){return Reflect.getMetadata(O.app,this.constructor)?.[Q]??null}async commandExec(Q,X){let{commands:Y}=Reflect.getMetadata(O.app,this.constructor),Z=Y?.find(($)=>$.command===Q);if(!Z)return console.error(`Command ${Q} not found`),this.commandList(),process.exit(1);try{let $=B.make(Z);if(await $.init(...X))await $.run();else{let U=await $.help();this.write(U)}return process.exit(0)}catch($){return console.error($.message),process.exit(1)}}async commandWork(Q){this.info("Starting worker process...");let{values:X}=IX({args:Q,options:{queue:{type:"string",multiple:!0,default:["default"],short:"q"},concurrency:{type:"string",default:"1",short:"c"},["max-retries"]:{type:"string",default:"5",short:"r"},["retry-delay"]:{type:"string",default:"5000",short:"d"},["pause-on-error"]:{type:"boolean",default:!1,short:"p"}}}),{Worker:Y}=await Promise.resolve().then(() => (EQ(),pQ)),Z=X.queue.map((_)=>_.split(",")).reduce((_,U)=>_.concat(U),[]),$=Y.spawn(self,Z,{concurrency:parseInt(X.concurrency,10),maxRetries:parseInt(X["max-retries"],10),retryDelay:parseInt(X["retry-delay"],10),pauseOnError:X["pause-on-error"]});this.success(`Worker process ${this.format($.id,2)} started with queues: ${Z.map((_)=>this.format(_,6)).join(", ")}`)}async commandServe(){let{server:Q,modules:X,swagger:Y,plugins:Z}=Reflect.getMetadata(O.app,this.constructor);if(this.#Q=new xX(Q).onRequest((_)=>{if(this.isDebug)console.log(_.request.method,_.request.url)}),w.emit("elysium:server:before-init",this,this),this.#Q.resolve({as:"global"},({request:_})=>({tenant:_.headers.get("x-tenant-id")??"public"})),Y)this.#Q.use(TX(Y));if(Z&&Z.length>0){this.debug("Registering plugins...");for(let _ of Z)this.#Q.use(await _(this))}this.#Q.onError({as:"global"},async(_)=>{if(await this.onError(_)){w.emit("elysium:error",_),this.trace({name:"HttpError",message:"Unexpected error while handling HTTP request",stack:_.error.stack,..._.error});let U={};if(typeof _.code==="number")return _.error.response;else switch(_.code){case"VALIDATION":{U={scope:_.error.type,code:_.error.message};break}case"INTERNAL_SERVER_ERROR":{U={message:_.error.message};break}}return{type:_.code,data:U}}}).onStart(async(_)=>{await this.onStart(_),w.emit("elysium:server:start",_,this)}).onStop(async(_)=>{await this.onStop(_),w.emit("elysium:server:stop",_,this),this._appContextStorage.disable()});let $=Reflect.getMetadata(O.middlewares,this.constructor)??[];YQ($,this.#Q);for(let _ of X){let U=Reflect.getMetadata(O.elysiaPlugin,_);if(U===void 0)return console.error(`Invalid module class ${_.name} registered in app ${this.constructor.name}. Ensure that you used the @module() decorator on the module.`),process.exit(1);let G=B.bind(_);await G.beforeRegister(),this.#Q.use(await U(G)),await G.afterRegister()}w.emit("elysium:server:after-init",this,this),this.#Q.listen(Q?.port??(parseInt(process.env.PORT,10)||3000)),process.on("SIGINT",()=>{this.#Q.stop().then(()=>process.exit(0))})}commandDescribe(){this.section(`${this.bold("Usage:")} ${this.format("styx",5)} <command> [options]`),this.section(this.bold("Core Commands:")),this.newLine(),this.commandDescription("serve","","Starts the server."),this.commandDescription("help","<command>","Displays help for a command."),this.commandDescription("list","","List all available application commands."),this.section(this.bold("Application Commands:")),this.commandList()}commandList(){let{commands:Q}=Reflect.getMetadata(O.app,this.constructor),X=(Q??[]).reduce((Y,Z)=>{let $=wX(Z.command.split(":")),_=Y.get($)??[];return _.push(Z),Y.set($,_),Y},new Map);for(let[Y,Z]of X){this.section(this.format(Y,4));for(let $ of Z)this.commandDescription($.command,"",$.description)}}commandDescription(Q,X,Y,Z=k.SPACE_WIDTH){X=X.length===0?" ":` ${X} `,this.write(` ${this.format(Q,6)}${X}${"\u2219".repeat(Z-Q.length-X.length)} ${Y}`)}}e();g();import{isArray as fX,trim as NX}from"radash";var uQ;((_)=>{_.STRING="string";_.NUMBER="number";_.BOOLEAN="boolean";_.ENUM="enum";_.ARRAY="array"})(uQ||={});class cQ extends k{static command="command";static description="Command description";static arg(Q={}){return function(X,Y){let Z=Reflect.getMetadata(O.arg,X.constructor)??[],$=Reflect.getMetadata("design:type",X,Y),_=Q.type;if(!_&&$){if($===Array){if(_="array",!Q.arrayType)Q={...Q,arrayType:"string"}}else if($.constructor!==Object)switch($.name.toLowerCase()){case"number":_="number";break;case"boolean":_="boolean";break;case"string":_="string";break;default:_=void 0}else if(Object.values($).length>0){if(_="enum",!Q.enum)Q={...Q,enum:Object.values($)}}}Z.push({name:Q.name??Y,description:Q.description,required:Q.required??!1,default:Q.default,type:_,enum:Q.enum,arrayType:Q.arrayType,propertyKey:Y}),Reflect.defineMetadata(O.arg,Z,X.constructor)}}async init(...Q){let X=this.processArgs(Q),Y=this.validateArgs(X);if(!Y.valid){if(Y.missing.length>0)console.error(`Missing required arguments: ${Y.missing.join(", ")}
9
- `);return!1}if(Object.keys(X).includes("help"))return!1;let Z=this.getArguments();for(let $ of Z)if(X[$.name]!==void 0)this[$.propertyKey]=X[$.name];return!0}getArguments(){return Reflect.getMetadata(O.arg,this.constructor)||[]}async help(){let Q=`${this.bold("Command:")} ${this.format(this.constructor.command,5)}
8
+ `),process.stdin.setRawMode?.(!1),process.stdin.removeAllListeners("data"),X.close(),Y(Z);return}if(_==="\b"||_==="\x7F"){if(Z.length>0)Z=Z.slice(0,-1),process.stdout.write("\b \b");return}Z+=_,process.stdout.write("*")})})}async confirm(Q,X=!1){let Y=X?"Y/n":"y/N",Z=await this.prompt(`${Q} [${Y}]`);if(!Z)return X;return Z.toLowerCase()==="y"||Z.toLowerCase()==="yes"}async select(Q,X,Y=0){if(X.length===0)throw new Error("No options provided for selection");this.write(Q),X.forEach((_,U)=>{let G=U===Y;this.write(` ${U+1}. ${_}${G?" (default)":""}`)});let Z=await this.prompt("Enter your choice (number)");if(!Z)return X[Y];let $=parseInt(Z,10)-1;if(isNaN($)||$<0||$>=X.length)return this.warning(`Invalid selection. Using default: ${X[Y]}`),X[Y];return X[$]}formatTime(Q){if(Q<60)return`${Q.toFixed(1)}s`;if(Q<3600)return`${Math.floor(Q/60)}m ${Math.floor(Q%60)}s`;return`${Math.floor(Q/3600)}h ${Math.floor(Q%3600/60)}m`}}var OQ,LX;var e=_Q(()=>{((O)=>{O[O.BLACK=0]="BLACK";O[O.RED=1]="RED";O[O.GREEN=2]="GREEN";O[O.YELLOW=3]="YELLOW";O[O.BLUE=4]="BLUE";O[O.MAGENTA=5]="MAGENTA";O[O.CYAN=6]="CYAN";O[O.WHITE=7]="WHITE";O[O.GRAY=8]="GRAY";O[O.BOLD=9]="BOLD";O[O.UNDERLINE=10]="UNDERLINE";O[O.ITALIC=11]="ITALIC";O[O.INVERSE=12]="INVERSE"})(OQ||={});LX={[0]:Bun.color("black","ansi")||Bun.color("black","ansi-256")||"",[1]:Bun.color("red","ansi")||Bun.color("red","ansi-256")||"",[2]:Bun.color("green","ansi")||Bun.color("green","ansi-256")||"",[3]:Bun.color("yellow","ansi")||Bun.color("yellow","ansi-256")||"",[4]:Bun.color("blue","ansi")||Bun.color("blue","ansi-256")||"",[5]:Bun.color("magenta","ansi")||Bun.color("magenta","ansi-256")||"",[6]:Bun.color("cyan","ansi")||Bun.color("cyan","ansi-256")||"",[7]:Bun.color("white","ansi")||Bun.color("white","ansi-256")||"",[8]:Bun.color("gray","ansi")||Bun.color("gray","ansi-256")||"",[9]:"\x1B[1m",[10]:"\x1B[4m",[11]:"\x1B[3m",[12]:"\x1B[7m"}});import{isObject as UQ,isPrimitive as OX}from"radash";function o(Q,...X){if(!X.length)return Q;let Y=X.shift();if(Y===void 0)return Q;if(UQ(Q)&&UQ(Y))for(let Z in Y)if(UQ(Y[Z])){if(!Q[Z])Object.assign(Q,{[Z]:Y[Z]})}else if(Array.isArray(Y[Z])){if(!Array.isArray(Q[Z]))Q[Z]=[];if(Y[Z].length>0&&!UQ(Y[Z][0]))Q[Z]=[...new Set([...Q[Z],...Y[Z]])];else Y[Z].forEach(($,_)=>{if(UQ($)&&Q[Z][_])Q[Z][_]=o(Q[Z][_],$);else if(!Q[Z].includes($))Q[Z].push($)})}else if(OX(Y[Z]))Q[Z]??=Y[Z];else o(Q[Z],Y[Z]);return o(Q,...X)}var z,s=()=>new Promise((Q)=>process.nextTick(Q));var g=_Q(()=>{((T)=>(T.app=Symbol("elysium:Application"),T.controller=Symbol("elysium:Controller"),T.middlewares=Symbol("elysium:MiddlewaresList"),T.services=Symbol("elysium:ServicesList"),T.websocket=Symbol("elysium:WebSocket"),T.wamp=Symbol("elysium:Wamp"),T.http=Symbol("elysium:Http"),T.job=Symbol("elysium:Job"),T.arg=Symbol("elysium:CommandArguments"),T.elysiaPlugin=Symbol("elysium:ElysiaPlugin"),T.middlewareGuards=Symbol("elysium:MiddlewareGuards")))(z||={})});import{isString as QQ}from"radash";var NQ,zX=(Q)=>{return typeof Q==="function"&&Q.prototype&&Q.prototype.constructor===Q},i,V;var d=_Q(()=>{g();((Y)=>{Y[Y.SINGLETON=0]="SINGLETON";Y[Y.FACTORY=1]="FACTORY"})(NQ||={});i=new Map;((A)=>{A.register=(H)=>{return function(B){let O=H?.name??B.name,K=H?.scope??0;if(V.exists(O))console.error(`A service with the name ${O} has already been registered.`),process.exit(1);let x=()=>V.make(B);if(K===0){let q=x();i.set(O,{scope:K,factory(){return q}})}else i.set(O,{scope:K,factory:x})}},A.inject=(H)=>{return function(B,O,K){let x=Reflect.getMetadata(z.services,B,O)??[],q=Reflect.getMetadata("design:paramtypes",B,O)??[],R=QQ(H)?H:H?.name??q[K].name;x.push({name:R,index:K}),Reflect.defineMetadata(z.services,x,B,O)}},A.get=(H)=>{let B=QQ(H)?H:H.name;if(A.exists(B))return i.get(B).factory();return null},A.make=(H)=>{let B=Reflect.getMetadata(z.services,H)??[],O=[];return B.forEach((K)=>{let x=A.get(K.name);if(x===null)console.error(`Cannot inject service ${K.name}. No service was registered with the name: ${K.name}`),process.exit(1);O[K.index]=x}),new H(...O)},A.bind=(H,B)=>{let O=A.make(H);return A.instance(B??H.name,O)};function _(H,B){let O=QQ(H)?H:B??H.name;if(A.exists(O))console.error(`A service with the name ${O} has already been registered.`),process.exit(1);let K=()=>{return zX(H)?A.make(H):B()};return i.set(O,{scope:1,factory:K}),K()}A.factory=_,A.instance=(H,B)=>{let O=QQ(H)?H:H.name;if(A.exists(O))console.error(`A service with the name ${O} has already been registered.`),process.exit(1);return i.set(O,{scope:0,factory(){return B}}),B},A.remove=(H)=>{let B=QQ(H)?H:H.name;i.delete(B)},A.exists=(H)=>{let B=QQ(H)?H:H.name;return i.has(B)},A.clear=()=>{i.clear()},A.keys=(H)=>{let B="^"+H.replace(/[-[\]{}()+.,\\^$|#\s]/g,"\\$&").replace(/\*/g,".*").replace(/\?/g,".")+"$",O=new RegExp(B);return Array.from(i.keys()).filter((K)=>O.test(K))}})(V||={})});import"reflect-metadata";import{assign as jX,uid as FX}from"radash";var dQ;var FQ=_Q(()=>{e();d();g();dQ=class dQ extends k{#Q;#X;#Y="pending";#Z;static register(Q={}){return function(X){Q=jX({name:X.name,queue:"default"},Q);let Y=`job.${Q.name}`;V.instance(Y,X),Reflect.defineMetadata(z.job,{name:Y,queue:Q.queue},X)}}id;createdAt;get startedAt(){return this.#Q}get completedAt(){return this.#X}get status(){return this.#Y}constructor(Q){super();this.id=Q||this.generateJobId(),this.createdAt=new Date}async run(){try{this.#Y="running",this.#Q=new Date,this.debug(`Job ${this.id} started at ${this.#Q.toISOString()}`),await this.execute(),this.#Y="completed",this.#X=new Date,this.debug(`Job ${this.id} completed at ${this.#X.toISOString()}`)}catch(Q){if(this.#Z=Q instanceof Error?Q:new Error(String(Q)),this.#Y!=="cancelled")this.#Y="failed";this.#X=new Date,this.trace(this.#Z)}}cancel(){this.#Y="cancelled"}generateJobId(){return`job_${Date.now()}_${FX(8)}`}}});var uQ={};_X(uQ,{WorkerPool:()=>PQ,Worker:()=>AQ});import{uid as AX}from"radash";var lQ,AQ,PQ;var EQ=_Q(()=>{e();FQ();d();g();lQ=globalThis.Worker;AQ=class AQ extends k{#Q;queues=new Map;defaultQueueName="default";static spawn(Q,X=["default"],Y){let Z=new this;Z.debug(`Worker ${Z.id} starting with queues: ${X.join(", ")}`);for(let $ of X)Z.createQueue({name:$,concurrency:Y?.concurrency??1,maxRetries:Y?.maxRetries??5,retryDelay:Y?.retryDelay??5000,pauseOnError:Y?.pauseOnError??!1});return Q.addEventListener("message",async($)=>{let{type:_="job:process",jobId:U,job:G,args:M,queue:L="default"}=$.data;switch(_){case"job:cancel":let P=Z.cancelJob(U,L);Q.postMessage({type:"job:canceled",jobId:U,queue:L,success:P,count:P?1:0});break;case"job:cancelAll":let H=Z.cancelAllJobs(L);Q.postMessage({type:"jobs:canceled",queue:L,count:H});break;case"job:process":Z.debug(`Worker ${Z.id} received job ${G} for queue ${L}`);try{let B=V.get(G);if(!B)throw Z.error(`Job class ${G} not found`),new Error(`Job class ${G} not found`);let O=new B(...M||[]);Z.addJob(O,L),Q.postMessage({type:"job:received",jobId:O.id,queue:L})}catch(B){Z.trace({...B,...Y??{}},`Error while adding job '${G}' to queue '${L}' with worker ${Z.id}`),Q.postMessage({type:"job:error",jobName:G,error:B.message})}break}}),Q.addEventListener("error",($)=>{Z.trace({...$.error,filename:$.filename},`Worker ${Z.id} error:`)}),Q.addEventListener("unhandledrejection",($)=>{Z.trace($,`Worker ${Z.id} unhandled rejection:`)}),Q.postMessage({type:"worker:ready",id:Z.id,queues:X}),Z}constructor(){super();this.#Q=AX(24),this.createQueue({name:this.defaultQueueName})}get id(){return this.#Q}createQueue(Q){if(this.queues.has(Q.name))return this.debug(`Queue with name '${Q.name}' already exists`),this;let X={options:{...Q,concurrency:Q.concurrency||1,maxRetries:Q.maxRetries||0,retryDelay:Q.retryDelay||1000,pauseOnError:Q.pauseOnError||!1},jobs:[],processing:0,paused:!1,draining:!1};return this.queues.set(Q.name,X),this.debug(`Created queue '${Q.name}'`),this}addJob(Q,X=this.defaultQueueName){let Y=this.queues.get(X);if(!Y)return this.error(`Queue '${X}' does not exist`),this;if(Y.draining)return this.warning(`Queue '${X}' is draining, job ${Q.id} will not be added`),this;let Z={job:Q,retries:0,queueName:X};if(Y.jobs.push(Z),this.debug(`Added job ${Q.id} to queue '${X}'`),!Y.paused&&Y.processing<Y.options.concurrency)this.processNextJob(X);return this}pause(Q){if(Q){let X=this.queues.get(Q);if(X)X.paused=!0,this.info(`Paused queue '${Q}'`)}else for(let[X]of this.queues.entries())this.pause(X);return this}resume(Q){if(Q){let X=this.queues.get(Q);if(X)X.paused=!1,this.info(`Resumed queue '${Q}'`),this.processQueueJobs(Q)}else for(let[X]of this.queues.entries())this.resume(X);return this}drain(Q){if(Q){let X=this.queues.get(Q);if(X)X.draining=!0,this.info(`Draining queue '${Q}'`)}else for(let[X]of this.queues.entries())this.drain(X);return this}clear(Q){if(Q){let X=this.queues.get(Q);if(X){let Y=X.jobs.length;X.jobs=[],this.info(`Cleared ${Y} jobs from queue '${Q}'`)}}else for(let[X,Y]of this.queues.entries()){let Z=Y.jobs.length;Y.jobs=[],this.info(`Cleared ${Z} jobs from queue '${X}'`)}return this}size(Q=this.defaultQueueName){let X=this.queues.get(Q);if(!X)throw new Error(`Queue '${Q}' does not exist`);return X.jobs.length}totalSize(){let Q=0;for(let X of this.queues.values())Q+=X.jobs.length;return Q}async processNextJob(Q){let X=this.queues.get(Q);if(!X||X.paused||X.processing>=X.options.concurrency)return;let Y=X.jobs.shift();if(!Y)return;if(Y.job.status==="cancelled"){this.info(`Skipping cancelled job ${Y.job.id}`),X.processing--,this.processQueueJobs(Q);return}X.processing++;try{if(this.debug(`Processing job ${Y.job.id} from queue '${Q}'`),await Y.job.run(),Y.job.status==="failed"){if(Y.retries<X.options.maxRetries)Y.retries++,this.warning(`Job ${Y.job.id} failed, retrying (${Y.retries}/${X.options.maxRetries})`),setTimeout(()=>{if(Y.job.status!=="cancelled")X.jobs.push(Y),this.processQueueJobs(Q);else this.info(`Skipping cancelled job ${Y.job.id} during retry delay`)},X.options.retryDelay);else if(this.error(`Job ${Y.job.id} failed after ${Y.retries} retries`),X.options.pauseOnError)this.pause(Q),this.warning(`Queue '${Q}' paused due to job failure`)}else if(Y.job.status==="completed")this.success(`Job ${Y.job.id} completed successfully`);else this.info(`Job ${Y.job.id} cancelled while running`)}catch(Z){if(this.error(`Unexpected error processing job ${Y.job.id}: ${Z}`),X.options.pauseOnError)this.pause(Q),this.warning(`Queue '${Q}' paused due to unexpected error`)}finally{X.processing--,this.processQueueJobs(Q)}}processQueueJobs(Q){let X=this.queues.get(Q);if(!X||X.paused)return;while(X.jobs.length>0&&X.processing<X.options.concurrency)this.processNextJob(Q)}getStats(){let Q={};for(let[X,Y]of this.queues.entries())Q[X]={waiting:Y.jobs.length,processing:Y.processing,paused:Y.paused,draining:Y.draining};return Q}cancelJob(Q,X){if(X)return this.cancelJobInQueue(Q,X);else{let Y=!1;for(let[Z]of this.queues.entries())if(this.cancelJobInQueue(Q,Z)){Y=!0;break}return Y}}cancelJobInQueue(Q,X){let Y=this.queues.get(X);if(!Y)return!1;let Z=Y.jobs.findIndex(($)=>$.job.id===Q);if(Z>=0)return Y.jobs[Z].job.cancel(),this.info(`Canceled job ${Q} in queue '${X}'`),!0;return!1}cancelAllJobs(Q){let X=0;if(Q){let Y=this.queues.get(Q);if(Y)X=Y.jobs.length,Y.jobs.forEach((Z)=>{Z.job.cancel()}),this.info(`Canceled ${X} jobs in queue '${Q}'`)}else for(let[Y,Z]of this.queues.entries()){let $=Z.jobs.length;Z.jobs.forEach((_)=>{_.job.cancel()}),X+=$,this.info(`Canceled ${$} jobs in queue '${Y}'`)}return X}};PQ=class PQ extends k{workers=[];currentWorkerIndex=0;queueWorkerMap=new Map;static instance=new PQ;constructor(){super()}async init(){}async addWorker(Q=[]){let X;if(ELYSIUM_BUILD)X=new lQ("./index.js",{argv:["work",...Q.map((Y)=>`--queue=${Y}`)]});else{let Y=await Array.fromAsync(new Bun.Glob("./src/**/*.job.ts").scan());X=new lQ("./index.ts",{preload:Y,argv:["work",...Q.map((Z)=>`--queue=${Z}`)]})}X.addEventListener("error",(Y)=>{this.trace({message:"An error occurred inside a worker process",stack:Y.message,name:"WorkerError"}),this.removeWorker(X),this.addWorker(Q)}),X.addEventListener("messageerror",(Y)=>{this.error(`Worker message error: ${Y}`)}),X.addEventListener("message",(Y)=>{if(Y.data.type==="worker:ready")this.debug(`Worker ${Y.data.id} ready with queues: ${Y.data.queues.join(", ")}`);else if(Y.data.type==="job:received")this.debug(`Job ${Y.data.jobId} received by worker for queue ${Y.data.queue}`);else if(Y.data.type==="job:error")this.error(`Error processing job ${Y.data.jobName}: ${Y.data.error}`);else this.debug(`Worker message: ${JSON.stringify(Y.data)}`)}),this.workers.push(X);for(let Y of Q){if(!this.queueWorkerMap.has(Y))this.queueWorkerMap.set(Y,[]);this.queueWorkerMap.get(Y).push(X)}}removeWorker(Q){let X=Q??this.workers.pop();if(!X)return;X.terminate();for(let[Y,Z]of this.queueWorkerMap.entries())this.queueWorkerMap.set(Y,Z.filter(($)=>$!==X));if(Q)this.workers=this.workers.filter((Y)=>Y!==X)}terminate(){while(this.workers.length>0)this.removeWorker();this.queueWorkerMap.clear()}runJob(Q,...X){if(!Reflect.hasMetadata(z.job,Q))throw new Error(`Job ${Q.name} is not marked with @job() decorator`);let{name:Y,queue:Z="default"}=Reflect.getMetadata(z.job,Q),$=this.queueWorkerMap.get(Z)||this.workers;if($.length===0)throw new Error(`No workers available for queue '${Z}'`);let _=this.currentWorkerIndex%$.length;$[_].postMessage({job:Y,args:X,queue:Z}),this.currentWorkerIndex=(this.currentWorkerIndex+1)%this.workers.length}cancelJob(Q,X){for(let Y of this.workers)Y.postMessage({type:"job:cancel",jobId:Q,queue:X});return this.workers.length>0}cancelAllJobs(Q){for(let X of this.workers)X.postMessage({type:"job:cancelAll",queue:Q});return this.workers.length>0}}});global.ELYSIUM_BUILD=typeof ELYSIUM_BUILD!=="undefined";import{t as vZ}from"elysia";e();import{AsyncLocalStorage as EX}from"async_hooks";import{parseArgs as IX}from"util";import{swagger as TX}from"@elysiajs/swagger";import{Value as GQ}from"@sinclair/typebox/value";import{Elysia as xX}from"elysia";import{first as wX}from"radash";import{getTableName as qQ,is as hQ,Table as bQ}from"drizzle-orm";import{drizzle as MX}from"drizzle-orm/bun-sql";import{Cache as JX}from"drizzle-orm/cache/core";import{createCache as CQ}from"cache-manager";import{KeyvCacheableMemory as RX}from"cacheable";import{Keyv as SQ}from"keyv";import{alphabetical as VX}from"radash";import{EventEmitter as PX}from"events";import{omit as BX}from"radash";import{EventEmitter as HX}from"events";import{isString as fQ}from"radash";class h extends HX{static instance=new h;constructor(){super();this.on("error",(Q)=>this.emitError(Q))}emitError(Q){this.emit("elysium:error",{data:Q,source:null})}emitEvent(Q,X,Y=null){this.emit(Q,{data:X,source:Y})}}var f;((n)=>{n.emit=(U,G,M=null)=>{h.instance.emitEvent(U,G,M)};function X(U,G){if(fQ(U))h.instance.on(U,G);else return function(M,L,P){let H=async function(O){try{await P.value(O)}catch(K){h.instance.emitError(K)}};if(U.prepend??!1)h.instance.prependListener(U.event,H);else h.instance.on(U.event,H)}}n.on=X;function Y(U,G){if(fQ(U))h.instance.once(U,G);else return function(M,L,P){let H=async function(O){try{await P.value(O)}catch(K){h.instance.emitError(K)}};if(U.prepend??!1)h.instance.prependOnceListener(U.event,H);else h.instance.once(U.event,H)}}n.once=Y,n.off=(U)=>{h.instance.removeAllListeners(U)},n.clear=()=>{h.instance.removeAllListeners()},n.listen=(U)=>{if(U.mode==="on")return X(U);else if(U.mode==="once")return Y(U);return function(G,M,L){console.error("Unknown mode provided to @listen. Use either 'on' or 'once'.")}}})(f||={});d();class DQ extends PX{#Q;#X;#Y="::";#Z=1000;#$=!0;#_=!1;#U;constructor(Q){super();f.once("elysium:app:launched",()=>{this.#Q=r.getConnection(Q.connection)}),this.#U=Q.connection,this.#X=Q.namespace,this.#Y=Q.keyPrefixSeparator??"::",this.#Z=Q.clearBatchSize??1000,this.#$=Q.useUnlink??!0,this.#_=Q.noNamespaceAffectsAll??!1,this.on("error",(X)=>{f.emit("elysium:error",X)})}get client(){return this.#Q}get opts(){return{namespace:this.#X,keyPrefixSeparator:this.#Y,clearBatchSize:this.#Z,noNamespaceAffectsAll:this.#_,dialect:"redis",url:this.#U}}get namespace(){return this.#X}set namespace(Q){this.#X=Q}async get(Q){Q=this.createKeyPrefix(Q,this.#X);let X=await this.client.get(Q);return X===null?void 0:X}async set(Q,X,Y){if(Q=this.createKeyPrefix(Q,this.#X),Y)await this.client.set(Q,X,"PX",Y);else await this.client.set(Q,X)}async setMany(Q){let X=[];for(let{key:Y,value:Z,ttl:$}of Q){let _=this.createKeyPrefix(Y,this.#X);if($)X.push(this.client.set(_,Z,"PX",$));else X.push(this.client.set(_,Z))}await Promise.all(X)}async delete(Q){return Q=this.createKeyPrefix(Q,this.#X),await(this.#$?this.client.send("UNLINK",[Q]):this.client.del(Q))>0}async clear(){try{if(!this.#X&&this.#_){await this.client.send("FLUSHDB",[]);return}let Q="0",X=this.#Z,Y=this.#X?`${this.#X}${this.#Y}*`:"*",Z=[];do{let $=await this.client.send("SCAN",[Q,"MATCH",Y,"COUNT",X.toString(),"TYPE","string"]),[_,U]=$;if(Q=_.toString(),U.length===0)continue;if(!this.#X)U=U.filter((G)=>!G.includes(this.#Y));Z.push(U.map((G)=>this.client.del(G)))}while(Q!=="0");await Promise.all(Z)}catch(Q){this.emit("error",Q)}}async has(Q){return Q=this.createKeyPrefix(Q,this.#X),this.client.exists(Q)}async hasMany(Q){let X=[];for(let Y of Q){let Z=this.createKeyPrefix(Y,this.#X);X.push(this.client.exists(Z))}return Promise.all(X)}async getMany(Q){if(Q.length===0)return[];return Q=Q.map((Y)=>this.createKeyPrefix(Y,this.#X)),await this.client.mget(...Q)}async disconnect(){this.client.close()}async deleteMany(Q){let X=!1,Y=[];for(let $ of Q){let _=this.createKeyPrefix($,this.#X);if(this.#$)Y.push(this.client.send("UNLINK",[_]));else Y.push(this.client.del(_))}let Z=await Promise.all(Y);for(let $ of Z)if(typeof $==="number"&&$>0)X=!0;return X}async*iterator(Q){let X=Q?`${Q}${this.#Y}*`:"*",Y="0";do{let Z=await this.client.send("SCAN",[Y,"MATCH",X,"TYPE","string"]),[$,_]=Z;if(Y=$.toString(),!Q&&!this.#_)_=_.filter((U)=>!U.includes(this.#Y));if(_.length>0){let U=await this.client.mget(..._);for(let G of _.keys()){let M=this.getKeyWithoutPrefix(_[G],Q),L=U[G];yield[M,L]}}}while(Y!=="0")}createKeyPrefix(Q,X){return X?`${X}${this.#Y}${Q}`:Q}getKeyWithoutPrefix(Q,X){return X?Q.replace(`${X}${this.#Y}`,""):Q}}var r;((b)=>{let Q=(U)=>{return`redis.connection.${U}`};b.getConnection=(U)=>{if(!V.exists(Q(U)))console.error(`No Redis connection with name ${U} found. Please make sure to register the connection before using it.`),process.exit(1);return V.get(Q(U))},b.registerConnection=(U,G)=>{if(V.exists(Q(U)))console.error(`A Redis connection with the name ${U} has already been registered.`),process.exit(1);return V.instance(Q(U),new Bun.RedisClient(G.url,BX(G,["url"])))},b.connectionExists=(U)=>{return V.exists(Q(U))},b.getDefaultConnection=()=>{return b.getConnection("default")},b.setDefaultConnection=(U)=>{let G=Q("default");return V.remove(G),V.instance(G,b.getConnection(U))}})(r||={});var kQ=(Q)=>{let X=CQ({stores:[new SQ({store:Q,namespace:"cache"})]}),Y=new Map;return{...X,tags(...Z){let $=`cache__${VX(Z,(U)=>U).join("__")}`,_=Y.get($);if(!_)_=CQ({stores:[new SQ({store:Q,namespace:$})]}),Y.set($,_);return _}}};class l{static#Q;static#X;static weak=Object.seal({map:new WeakMap,get(Q){if(!this.map.has(Q))this.map.set(Q,{});return this.map.get(Q)},del(Q){this.map.delete(Q)}});static get redis(){if(!l.#Q)l.#Q=kQ(new DQ({connection:"cache"}));return l.#Q}static get memory(){if(!l.#X)l.#X=kQ(new RX({ttl:60000,lruSize:5000}));return l.#X}}d();class KQ extends JX{cacheStrategy;globalTtl;#Q;usedTablesPerKey={};constructor(Q="explicit",X=1,Y="redis"){super();this.cacheStrategy=Q;this.globalTtl=X;this.#Q=l[Y].tags("database")}strategy(){return this.cacheStrategy}async get(Q){return await this.#Q.get(Q)??void 0}async put(Q,X,Y,Z,$){await this.#Q.set(Q,X,($?.ex??this.globalTtl)*1000);for(let _ of Y){let U=this.usedTablesPerKey[_];if(U===void 0)this.usedTablesPerKey[_]=[Q];else U.push(Q)}}async onMutate(Q){let X=Q.tags?Array.isArray(Q.tags)?Q.tags:[Q.tags]:[],Y=Q.tables?Array.isArray(Q.tables)?Q.tables:[Q.tables]:[],Z=new Set;for(let $ of Y){let _=hQ($,bQ)?qQ($):$,U=this.usedTablesPerKey[_]??[];for(let G of U)Z.add(G)}if(Z.size>0||X.length>0){await this.#Q.mdel(X),await this.#Q.mdel([...Z]);for(let $ of Y){let _=hQ($,bQ)?qQ($):$;this.usedTablesPerKey[_]=[]}}}}var u;((v)=>{let Q=(U)=>{return`db.connection.${U}`};v.getConnection=(U)=>{if(!V.exists(Q(U)))console.error(`No connection with name ${U} found. Please make sure to register the connection before using it.`),process.exit(1);return V.get(Q(U))},v.registerConnection=(U,G)=>{if(V.exists(Q(U)))console.error(`A connection with the name ${U} has already been registered.`),process.exit(1);return V.instance(Q(U),MX({...G,cache:G.cache===void 0?void 0:G.cache===!0?new KQ:G.cache.enabled?new KQ(G.cache.strategy,G.cache.ttl,G.cache.storage):void 0}))},v.connectionExists=(U)=>{return V.exists(Q(U))},v.getDefaultConnection=()=>{return v.getConnection("default")},v.setDefaultConnection=(U)=>{let G=Q("default");return V.remove(G),V.instance(G,v.getConnection(U))}})(u||={});var zQ=new Map,jQ=(Q)=>{for(let[X,Y]of Object.entries(Q))zQ.set(X,Y)},vQ;((XQ)=>(XQ.get=(Z,$)=>{return zQ.get(Z)??$},XQ.exists=(Z)=>{return zQ.has(Z)},XQ.clear=()=>{zQ.clear()}))(vQ||={});d();g();var p=(Q,X,Y)=>{return C.context.run(new Map([["tenant",X.tenant],["http:context",X]]),async()=>{for(let Z of Q)try{let $=await Z[Y](X);if($!==void 0)return $}catch($){throw $}})},YQ=(Q,X)=>{let Y=Q.map((Z)=>V.make(Z));X.onRequest((Z)=>{return p(Y,Z,"onRequest")}),X.onTransform((Z)=>{return p(Y,Z,"onTransform")}),X.onBeforeHandle((Z)=>{return p(Y,Z,"onBeforeHandle")}),X.onAfterHandle((Z)=>{return p(Y,Z,"onAfterHandle")}),X.onAfterResponse((Z)=>{return p(Y,Z,"onAfterResponse")})};class yQ{static register(...Q){return function(X,Y,Z){if(Y===void 0&&Z===void 0){let $=Reflect.getMetadata(z.middlewares,X)??[];$.push(...Q),Reflect.defineMetadata(z.middlewares,$,X)}else{let $=Reflect.getMetadata(z.middlewares,X,Y)??[];$.push(...Q),Reflect.defineMetadata(z.middlewares,$,X,Y)}}}static guards(Q){class X extends this{}return Reflect.defineMetadata(z.middlewareGuards,Q,X),X}get guards(){return Reflect.getMetadata(z.middlewareGuards,this.constructor)??[]}onRequest(Q){}onTransform(Q){}onAfterHandle(Q){}onBeforeHandle(Q){}onAfterResponse(Q){}}d();g();import{Elysia as WX}from"elysia";import{omit as DX}from"radash";import KX from"wampy";d();g();class gQ extends WebSocket{protocols;constructor(Q,X){super(Q,X);this.protocols=X}get protocol(){return this.protocols?.[0]??"wamp.2.json"}}var t;((N)=>{let Q=(L)=>{return`wamp.connection.${L}`};N.getConnection=(L)=>{if(!V.exists(Q(L)))console.error(`No WAMP connection with name ${L} found. Please make sure to register the connection before using it.`),process.exit(1);return V.get(Q(L))},N.registerConnection=(L,P)=>{if(V.exists(Q(L)))console.error(`A WAMP connection with name ${L} already exists. Please ensure to register a new connection before overwriting it.`),process.exit(1);let H=new KX(P.url,{ws:gQ,...DX(P,["url"]),onError(){P.onError?.(),f.emit("elysium:error",new Error(`An error occurred in WAMP connection ${L}`))}}),B=P.maxRetries??5,O=P.retryInterval??5000,K=0,x=async()=>{try{await H.connect()}catch(q){if(console.error(`Failed to connect to WAMP server (attempt ${K+1}/${B}):`,q),K<B)K++,setTimeout(x,O);else console.error(`Max retry attempts (${B}) reached. Giving up.`),f.emit("elysium:error",new Error(`Failed to establish WAMP connection ${L} after ${B} attempts`))}};return x(),V.instance(Q(L),H)},N.connectionExists=(L)=>{return V.exists(Q(L))},N.getDefaultConnection=()=>{return N.getConnection("default")},N.setDefaultConnection=(L)=>{let P=Q("default");return V.remove(P),V.instance(P,N.getConnection(L))},N.controller=(L)=>{return function(P){async function H(){console.log(`Registering Wamp controller for connection ${L.connection} using ${P.name}`),await s();let B=V.make(P),O=Reflect.getMetadata(z.wamp,P)??{},K=t.getConnection(L.connection??"default"),x=new WX;return x.onStart(async(q)=>{let R=O.registrations??[],W=O.subscriptions??[];for(let J of R)K.register(J.topic,J.handler.bind(B),J.options).then((I)=>{console.log(`Registered ${J.topic} with id ${I.registrationId}`)});for(let J of W)K.subscribe(J.topic,J.handler.bind(B),J.options).then((I)=>{console.log(`Subscribed ${J.topic} with id ${I.subscriptionId}`)})}),x}Reflect.defineMetadata(z.elysiaPlugin,H,P)}},N.register=(L,P)=>{return function(H,B,O){let K=Reflect.getMetadata(z.wamp,H.constructor)??{};K.registrations??=[],K.registrations.push({topic:L,options:P,handler:O.value}),Reflect.defineMetadata(z.wamp,K,H.constructor)}},N.subscribe=(L,P)=>{return function(H,B,O){let K=Reflect.getMetadata(z.wamp,H.constructor)??{};K.subscriptions??=[],K.subscriptions.push({topic:L,options:P,handler:O.value}),Reflect.defineMetadata(z.wamp,K,H.constructor)}}})(t||={});class C extends k{#Q;#X;_appContextStorage=new EX;static get instance(){return V.get("elysium.app")}static get context(){return C.instance._appContextStorage}static register(Q={}){return function(X){let Y,Z=Object.getPrototypeOf(X);while(Z&&Z!==Object.prototype){let _=Reflect.getMetadata(z.app,Z);if(_){Y=_;break}Z=Object.getPrototypeOf(Z)}if(Y)Q=o(Y,Q);let $=Reflect.getMetadata(z.app,X);if($)Q=o($,Q);Q=o({modules:[],swagger:!1},Q),Reflect.defineMetadata(z.app,Q,X)}}constructor(){super();let{env:Q,debug:X}=Reflect.getMetadata(z.app,this.constructor)??{};if(this.#X=X??!1,Q){let _=GQ.Convert(Q,GQ.Clone(Bun.env));if(this.#X&&!GQ.Check(Q,_)){let U=GQ.Errors(Q,_).First();this.trace(U,"Invalid environment configuration")}jQ(GQ.Clean(Q,_))}else jQ(Bun.env);V.instance("elysium.app",this);let{database:Y,redis:Z,wamp:$}=Reflect.getMetadata(z.app,this.constructor);if(Z){for(let _ in Z.connections)r.registerConnection(_,Z.connections[_]);if(r.connectionExists(Z.default))r.setDefaultConnection(Z.default)}if(Y){for(let _ in Y.connections)u.registerConnection(_,Y.connections[_]);if(u.connectionExists(Y.default))u.setDefaultConnection(Y.default)}if($){for(let _ in $.connections)t.registerConnection(_,$.connections[_]);if(t.connectionExists($.default))t.setDefaultConnection($.default)}this.run().then(()=>f.emit("elysium:app:launched",this,this)).catch((_)=>{f.emit("elysium:error",_),this.trace(_,"An error occurred while launching the application"),process.exit(1)})}get elysia(){return this.#Q}get isDebug(){return this.#X}set isDebug(Q){this.#X=Q}async onError(Q){return!0}async onStart(Q){}async onStop(Q){}async run(){let Q=process.argv.slice(2),X=Q[0];if(!X)this.commandDescribe();else{let{commands:Y}=Reflect.getMetadata(z.app,this.constructor);switch(X){case"serve":return this.commandServe();case"work":return this.commandWork(Q.slice(1));case"help":{let Z=Q[1];if(Z){let $=Y?.find((_)=>_.command===Z);if($){let _=V.make($);return this.write(await _.help()),process.exit(0)}console.error(`Command <${Z}> not found.`)}else console.error("No command provided. Usage: styx help <command>");this.commandList();break}case"list":{this.write(this.bold("Available commands:")),this.commandList();break}default:{let Z=Q.slice(1);return this.commandExec(X,Z)}}}return process.exit(0)}getConfig(Q){return Reflect.getMetadata(z.app,this.constructor)?.[Q]??null}async commandExec(Q,X){let{commands:Y}=Reflect.getMetadata(z.app,this.constructor),Z=Y?.find(($)=>$.command===Q);if(!Z)return console.error(`Command ${Q} not found`),this.commandList(),process.exit(1);try{let $=V.make(Z);if(await $.init(...X))await $.run();else{let U=await $.help();this.write(U)}return process.exit(0)}catch($){return console.error($.message),process.exit(1)}}async commandWork(Q){this.info("Starting worker process...");let{values:X}=IX({args:Q,options:{queue:{type:"string",multiple:!0,default:["default"],short:"q"},concurrency:{type:"string",default:"1",short:"c"},["max-retries"]:{type:"string",default:"5",short:"r"},["retry-delay"]:{type:"string",default:"5000",short:"d"},["pause-on-error"]:{type:"boolean",default:!1,short:"p"}}}),{Worker:Y}=await Promise.resolve().then(() => (EQ(),uQ)),Z=X.queue.map((_)=>_.split(",")).reduce((_,U)=>_.concat(U),[]),$=Y.spawn(self,Z,{concurrency:parseInt(X.concurrency,10),maxRetries:parseInt(X["max-retries"],10),retryDelay:parseInt(X["retry-delay"],10),pauseOnError:X["pause-on-error"]});this.success(`Worker process ${this.format($.id,2)} started with queues: ${Z.map((_)=>this.format(_,6)).join(", ")}`)}async commandServe(){let{server:Q,modules:X,swagger:Y,plugins:Z}=Reflect.getMetadata(z.app,this.constructor);if(this.#Q=new xX(Q).onRequest((_)=>{if(this.isDebug)console.log(_.request.method,_.request.url)}),f.emit("elysium:server:before-init",this,this),this.#Q.resolve({as:"global"},({request:_})=>({tenant:_.headers.get("x-tenant-id")??"public"})),Y)this.#Q.use(TX(Y));if(Z&&Z.length>0){this.debug("Registering plugins...");for(let _ of Z)this.#Q.use(await _(this))}this.#Q.onError({as:"global"},async(_)=>{if(await this.onError(_)){f.emit("elysium:error",_),this.trace({name:"HttpError",message:"Unexpected error while handling HTTP request",stack:_.error.stack,..._.error});let U={};if(typeof _.code==="number")return _.error.response;else switch(_.code){case"VALIDATION":{U={scope:_.error.type,code:_.error.message};break}case"INTERNAL_SERVER_ERROR":{U={message:_.error.message};break}}return{type:_.code,data:U}}}).onStart(async(_)=>{await this.onStart(_),f.emit("elysium:server:start",_,this)}).onStop(async(_)=>{await this.onStop(_),f.emit("elysium:server:stop",_,this),this._appContextStorage.disable()});let $=Reflect.getMetadata(z.middlewares,this.constructor)??[];YQ($,this.#Q);for(let _ of X){let U=Reflect.getMetadata(z.elysiaPlugin,_);if(U===void 0)return console.error(`Invalid module class ${_.name} registered in app ${this.constructor.name}. Ensure that you used the @module() decorator on the module.`),process.exit(1);let G=V.bind(_);await G.beforeRegister(),this.#Q.use(await U(G)),await G.afterRegister()}f.emit("elysium:server:after-init",this,this),this.#Q.listen(Q?.port??(parseInt(process.env.PORT,10)||3000)),process.on("SIGINT",()=>{this.#Q.stop().then(()=>process.exit(0))})}commandDescribe(){this.section(`${this.bold("Usage:")} ${this.format("styx",5)} <command> [options]`),this.section(this.bold("Core Commands:")),this.newLine(),this.commandDescription("serve","","Starts the server."),this.commandDescription("help","<command>","Displays help for a command."),this.commandDescription("list","","List all available application commands."),this.section(this.bold("Application Commands:")),this.commandList()}commandList(){let{commands:Q}=Reflect.getMetadata(z.app,this.constructor),X=(Q??[]).reduce((Y,Z)=>{let $=wX(Z.command.split(":")),_=Y.get($)??[];return _.push(Z),Y.set($,_),Y},new Map);for(let[Y,Z]of X){this.section(this.format(Y,4));for(let $ of Z)this.commandDescription($.command,"",$.description)}}commandDescription(Q,X,Y,Z=k.SPACE_WIDTH){X=X.length===0?" ":` ${X} `,this.write(` ${this.format(Q,6)}${X}${"\u2219".repeat(Z-Q.length-X.length)} ${Y}`)}}e();g();import{isArray as fX,trim as NX}from"radash";var pQ;((_)=>{_.STRING="string";_.NUMBER="number";_.BOOLEAN="boolean";_.ENUM="enum";_.ARRAY="array"})(pQ||={});class cQ extends k{static command="command";static description="Command description";static arg(Q={}){return function(X,Y){let Z=Reflect.getMetadata(z.arg,X.constructor)??[],$=Reflect.getMetadata("design:type",X,Y),_=Q.type;if(!_&&$){if($===Array){if(_="array",!Q.arrayType)Q={...Q,arrayType:"string"}}else if($.constructor!==Object)switch($.name.toLowerCase()){case"number":_="number";break;case"boolean":_="boolean";break;case"string":_="string";break;default:_=void 0}else if(Object.values($).length>0){if(_="enum",!Q.enum)Q={...Q,enum:Object.values($)}}}Z.push({name:Q.name??Y,description:Q.description,required:Q.required??!1,default:Q.default,type:_,enum:Q.enum,arrayType:Q.arrayType,propertyKey:Y}),Reflect.defineMetadata(z.arg,Z,X.constructor)}}async init(...Q){let X=this.processArgs(Q),Y=this.validateArgs(X);if(!Y.valid){if(Y.missing.length>0)console.error(`Missing required arguments: ${Y.missing.join(", ")}
9
+ `);return!1}if(Object.keys(X).includes("help"))return!1;let Z=this.getArguments();for(let $ of Z)if(X[$.name]!==void 0)this[$.propertyKey]=X[$.name];return!0}getArguments(){return Reflect.getMetadata(z.arg,this.constructor)||[]}async help(){let Q=`${this.bold("Command:")} ${this.format(this.constructor.command,5)}
10
10
  `;Q+=`${this.bold("Description:")} ${this.constructor.description}
11
11
 
12
12
  `;let X=this.getArguments();if(X.length>0){Q+=`${this.bold("Arguments:")}
@@ -16,4 +16,4 @@ var $X=Object.defineProperty;var _X=(Q,X)=>{for(var Y in X)$X(Q,Y,{get:X[Y],enum
16
16
  `}}else Q+=`This command has no arguments.
17
17
  `;return NX(Q,`
18
18
  `)}validateArgs(Q){let X=[],Y=[],Z=this.getArguments();if(Object.keys(Q).includes("help"))return{valid:!0,missing:[]};for(let $ of Z){if($.required&&(Q[$.name]===void 0||Q[$.name]===null)){X.push($.name);continue}if(Q[$.name]===void 0)continue;if($.type==="enum"&&$.enum&&!$.enum.includes(Q[$.name]))Y.push(`${$.name} (must be one of: ${$.enum.join(", ")})`);if($.type==="array"&&$.arrayType==="enum"&&$.enum){let _=Q[$.name].filter((U)=>!$.enum.includes(U));if(_.length>0)Y.push(`${$.name} (contains invalid values: ${_.join(", ")}. Must be one of: ${$.enum.join(", ")})`)}}if(Y.length>0)console.error(`Invalid argument values: ${Y.join(", ")}
19
- `);return{valid:X.length===0&&Y.length===0,missing:X}}processArgs(Q){let X={},Y=this.getArguments();for(let Z=0;Z<Q.length;Z++){let $=Q[Z];if($.startsWith("--")){let _=$.slice(2);if(Z+1<Q.length&&!Q[Z+1].startsWith("--"))X[_]=Q[Z+1],Z++;else X[_]=!0}}for(let Z of Y){if(X[Z.name]===void 0&&Z.default!==void 0){X[Z.name]=Z.default;continue}if(X[Z.name]===void 0)continue;if(typeof X[Z.name]==="string")switch(Z.type||this.inferType(Z.default)){case"number":X[Z.name]=Number(X[Z.name]);break;case"boolean":let _=X[Z.name].toLowerCase();X[Z.name]=_==="true"||_==="1"||_==="yes";break;case"enum":if(Z.enum&&Z.enum.length>0&&typeof Z.enum[0]==="number")X[Z.name]=Number(X[Z.name]);break;case"array":let U=X[Z.name].split(",").map((G)=>G.trim());if(Z.arrayType)X[Z.name]=U.map((G)=>{switch(Z.arrayType){case"number":return Number(G);case"boolean":return G.toLowerCase()==="true"||G.toLowerCase()==="1"||G.toLowerCase()==="yes";case"enum":return G;default:return G}});else X[Z.name]=U;break;case"string":default:break}}return X}progress(Q,X="Processing"){return new iQ(Q,X)}spinner(Q="Processing",X,Y){return new mQ(Q,X,Y)}inferType(Q){if(Q===void 0)return"string";switch(typeof Q){case"number":return"number";case"boolean":return"boolean";default:return fX(Q)?"array":"string"}}}class iQ extends k{#Q=!1;#X=0;#Y=0;#Z="";#$=0;constructor(Q=0,X="Processing"){super();this.#X=Q,this.#Z=X,this.#Q=!0,this.#Y=0,this.#$=Date.now(),this.update(0)}update(Q=1,X){if(!this.#Q)return;if(this.#Y+=Q,X)this.#Z=X;let Y=Math.min(100,Math.floor(this.#Y/this.#X*100)),$=(Date.now()-this.#$)/1000,_=0,U=0,G="";if(this.#Y>0)_=$/this.#Y*this.#X,U=Math.max(0,_-$),G=` | ${this.formatTime($)} elapsed | ${this.formatTime(U)} remaining`;let M=30,H=Math.floor(Y/100*M),L=M-H,z="["+"=".repeat(H)+(L>0?">":"")+" ".repeat(Math.max(0,L-(L>0?1:0)))+"]",R=`${this.#Z}: ${z} ${Y}% (${this.#Y}/${this.#X})${G}`;if(this.clearLine(),this.write(R,!1),this.#Y>=this.#X)this.complete()}complete(Q){if(!this.#Q)return;this.#Y=this.#X;let Y=(Date.now()-this.#$)/1000;if(this.clearLine(),Q)this.write(`${Q} (completed in ${this.formatTime(Y)})`);else this.write(`${this.#Z} completed in ${this.formatTime(Y)}`);this.#Q=!1}pause(Q){if(!this.#Q)return;this.newLine(),this.write(Q),this.update(0)}isActive(){return this.#Q}getCurrent(){return this.#Y}getTotal(){return this.#X}getPercentage(){return Math.min(100,Math.floor(this.#Y/this.#X*100))}}class mQ extends k{#Q=!1;#X="";#Y=0;#Z=null;#$=0;#_=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];#U=80;constructor(Q="Processing",X,Y){super();if(this.#X=Q,X)this.#_=X;if(Y)this.#U=Y;if(this.#Q)return;this.#Q=!0,this.#Y=Date.now(),this.#$=0,this.#Z=setInterval(()=>{this.render()},this.#U),this.render()}update(Q){if(!this.#Q)return;this.#X=Q}complete(Q,X=!0){if(!this.#Q)return;if(this.#Z)clearInterval(this.#Z),this.#Z=null;let Z=(Date.now()-this.#Y)/1000;this.clearLine();let $=this.formatTime(Z);if(Q)this[X?"success":"error"](`${Q} (${$})`);else this[X?"success":"error"](`${this.#X} completed in ${$}`);this.#Q=!1}fail(Q){this.complete(Q,!1)}pause(Q){if(!this.#Q)return;if(this.#Z)clearInterval(this.#Z),this.#Z=null;this.clearLine(),this.write(Q),this.#Z=setInterval(()=>{this.render()},this.#U)}isActive(){return this.#Q}getElapsedTime(){return(Date.now()-this.#Y)/1000}render(){if(!this.#Q)return;let Q=this.getElapsedTime(),X=this.#_[this.#$];this.#$=(this.#$+1)%this.#_.length,this.clearLine(),this.write(`${X} ${this.#X} (${this.formatTime(Q)})`,!1)}}e();import{Elysia as SX,sse as CX,t as nQ}from"elysia";import{assign as kX,isEmpty as RQ,objectify as qX}from"radash";d();g();var hX=(Q)=>{let X=Reflect.getMetadata("http:body",Q.target,Q.propertyKey),Y=Reflect.getMetadata("http:params",Q.target,Q.propertyKey)??[],Z=Reflect.getMetadata("http:query",Q.target,Q.propertyKey),$=Reflect.getMetadata("http:rawContext",Q.target,Q.propertyKey),_=Reflect.getMetadata("http:customDecorators",Q.target,Q.propertyKey)??[],U=Reflect.getMetadata(O.middlewares,Q.target,Q.propertyKey)??[],G=Reflect.getMetadata(O.services,Q.target,Q.propertyKey)??[],{path:M,method:H,handler:L,target:z,response:R,operationId:P,description:j,transactional:C}=Q,y=Reflect.getMetadata(O.http,z.constructor)??[];y.push({path:M,method:H,body:X,params:Y,query:Z,customDecorators:_,rawContext:$,handler:L,middlewares:U,response:R,operationId:P,description:j,services:G,transactional:C}),Reflect.defineMetadata(O.http,y,z.constructor)},sQ;((Y)=>{Y[Y.SERVER=0]="SERVER";Y[Y.REQUEST=1]="REQUEST"})(sQ||={});var oQ;((D)=>(D.controller=(V={path:"/"})=>{return function(W){async function J(){console.log(`Registering HTTP controller for ${V.path} using ${W.name}`),await n(),V=kX({path:"/",scope:0,tags:[]},V);let I=new SX({prefix:V.path,name:W.name}),c=(()=>{if(V.scope===0)return()=>{let K=B.make(W);return()=>K};else if(V.scope===1)return()=>()=>B.make(W);else throw new Error(`Invalid scope for controller: ${W.name}`)})();I.resolve({as:"local"},()=>({controller:c()}));let ZQ=Reflect.getMetadata("http:onRequest",W)??{};if(ZQ.handler)I.onRequest((K)=>{let a=c()();return ZQ.handler.call(a,K)});let eQ=Reflect.getMetadata(O.middlewares,W)??[];YQ(eQ,I);let QX=Reflect.getMetadata(O.http,W)??[];for(let K of QX){let a=async(A)=>{let F=[];if(K.rawContext)F[K.rawContext.index]=A;if(K.body)F[K.body.index]=A.body;if(K.query)F[K.query.index]=A.query;if(!RQ(K.params))for(let x of K.params)F[x.index]=A.params[x.slug];if(!RQ(K.customDecorators))for(let x of K.customDecorators)F[x.index]=await x.handler(A);if(!RQ(K.services))for(let x of K.services)F[x.index]=B.get(x.name);return F},XX=K.handler.constructor.name.includes("GeneratorFunction"),xQ=K.method==="elysium:SSE",YX=K.transactional??V.transactional??!1,JQ=K.body&&K.body.schema===void 0&&K.body.validator!==void 0;K.method=xQ?"GET":K.method;let ZX=()=>{let A=(F)=>{if(YX)return function(...x){return p.getDefaultConnection().transaction((HQ)=>{return N.context.run(new Map([["tenant",F.tenant],["http:context",F],["db:tx",HQ]]),()=>{try{return K.handler.call(F.controller(),...x)}catch($Q){throw HQ.rollback(),$Q}})})};return function(...x){return N.context.run(new Map([["tenant",F.tenant],["http:context",F]]),()=>K.handler.call(F.controller(),...x))}};if(XX)return async function*(F){let x=A(F),HQ=await a(F);try{for await(let $Q of x(...HQ))yield $Q}catch($Q){yield $Q}};if(xQ)return async function*(F){let x=A(F);F.set.headers["content-type"]="text/event-stream",F.set.headers["cache-control"]="no-cache",F.set.headers.connection="keep-alive";while(!0)yield CX(await x(...await a(F))),await Bun.sleep(10)};if(JQ)return async function(F){if(await K.body.validator.validate(F))return await A(F)(...await a(F));throw F.status(400,"Invalid request body")};return async function(F){return await A(F)(...await a(F))}},wQ=qX(K.params??[],(A)=>A.slug,(A)=>A.schema),LQ=K.middlewares.map((A)=>B.make(A));I.route(K.method,K.path,ZX(),{config:{},async transform(A){if(JQ&&!await K.body.validator.authorize(A))throw A.status(401,"Unauthorized");return u(LQ,A,"onTransform")},beforeHandle(A){return u(LQ,A,"onBeforeHandle")},afterHandle(A){return u(LQ,A,"onAfterHandle")},afterResponse(A){return u(LQ,A,"onAfterResponse")},detail:{tags:V.tags,description:K.description,operationId:K.operationId},body:JQ?K.body?.validator?.schema:K.body?.schema,response:K.response,params:RQ(wQ)?void 0:nQ.Object(wQ)})}return I}Reflect.defineMetadata(O.elysiaPlugin,J,W)}},D.sse=(V={})=>{let{path:W="/",...J}=V;return D.custom({method:"elysium:SSE",path:W,...J})},D.get=(V={})=>{let{path:W="/",...J}=V;return D.custom({method:"GET",path:W,...J})},D.post=(V={})=>{let{path:W="/",...J}=V;return D.custom({method:"POST",path:W,...J})},D.put=(V={})=>{let{path:W="/",...J}=V;return D.custom({method:"PUT",path:W,...J})},D.del=(V={})=>{let{path:W="/",...J}=V;return D.custom({method:"DELETE",path:W,...J})},D.patch=(V={})=>{let{path:W="/",...J}=V;return D.custom({method:"PATCH",path:W,...J})},D.head=(V={})=>{let{path:W="/",...J}=V??{};return D.custom({method:"HEAD",path:W,...J})},D.options=(V={})=>{let{path:W="/",...J}=V;return D.custom({method:"OPTIONS",path:W,...J})},D.trace=(V={})=>{let{path:W="/",...J}=V;return D.custom({method:"TRACE",path:W,...J})},D.custom=({path:V="/",...W})=>{return function(J,I,c){process.nextTick(()=>{hX({path:V,handler:c.value,target:J,propertyKey:I,...W})})}},D.onRequest=()=>{return function(V,W,J){let I=Reflect.getMetadata("http:onRequest",V.constructor)??{};I.handler=J.value,Reflect.defineMetadata("http:onRequest",I,V.constructor)}},D.context=()=>{return function(V,W,J){Reflect.defineMetadata("http:rawContext",{index:J},V,W)}},D.param=(V,W)=>{return function(J,I,c){let ZQ=Reflect.getMetadata("http:params",J,I)??[];ZQ.push({slug:V,schema:W??nQ.String(),index:c}),Reflect.defineMetadata("http:params",ZQ,J,I)}},D.query=(V)=>{return function(W,J,I){Reflect.defineMetadata("http:query",{schema:V,index:I},W,J)}},D.body=(V)=>{return function(W,J,I){if(typeof V==="function")Reflect.defineMetadata("http:body",{validator:V,index:I},W,J);else Reflect.defineMetadata("http:body",{schema:V,index:I},W,J)}},D.decorate=(V)=>{return()=>{return function(W,J,I){let c=Reflect.getMetadata("http:customDecorators",W,J)??[];c.push({handler:V,index:I}),Reflect.defineMetadata("http:customDecorators",c,W,J)}}}))(oQ||={});FQ();import{getTableConfig as bX,pgSchema as vX,pgTable as rQ}from"drizzle-orm/pg-core";import{t as S}from"elysia";var IQ=(Q,{mode:X="select"}={})=>{let{columns:Y}=bX(Q);if(Y===void 0)return S.Object({});let Z={};for(let $ of Y){if(["create","update"].includes(X)&&$.primary)continue;if(Z[$.name]=yX($),!$.notNull)Z[$.name]=S.Nullable(Z[$.name]);if(X==="update"||$.hasDefault||!$.notNull)Z[$.name]=S.Optional(Z[$.name])}return S.Object(Z)},yX=(Q)=>{let X=(()=>{switch(Q.dataType){case"string":return S.String({format:Q.columnType==="PgUUID"?"uuid":void 0});case"number":return S.Number();case"boolean":return S.Boolean();case"array":return S.Array(S.Any());case"json":return S.Object({});case"date":case"localDate":case"localDateTime":return S.String({format:Q.dataType==="date"?"date":"date-time"});case"bigint":return S.BigInt();case"buffer":return S.File();default:return S.Never()}})();if(!Q.notNull)X=S.Optional(X);else X=S.Required(X);return X},gX=(Q,X,Y)=>{let Z=rQ(Q,X,Y);class ${static $inferSelect=Z.$inferSelect;static $inferInsert=Z.$inferInsert;static $inferUpdate=Z.$inferInsert;static get table(){if(!N.instance||!N.context.getStore)return Z;if(this.supportTenancy){let _=VQ.getCurrentTenant()??"public";return VQ.wrapTenant(_,this)}return Z}static tableName=Q;static columns=X;static extraConfig=Y;static insertSchema=IQ(Z,{mode:"create"});static updateSchema=IQ(Z,{mode:"update"});static selectSchema=IQ(Z,{mode:"select"});static supportTenancy=!1}return $},TQ=new Map,BQ=new Map,VQ;((i)=>{let Q=(_)=>{return BQ.get(_)??i.registerTenant(_)};i.getCurrentTenant=()=>{return N.context.getStore()?.get("tenant")??null},i.wrapTenant=(_,U)=>{if(_==="public")return rQ(U.tableName,U.columns);let G=`${_}.${U.tableName}`;if(TQ.has(G))return TQ.get(G);let H=Q(_).table(U.tableName,U.columns);return TQ.set(G,H),H},i.registerTenant=(_)=>{if(BQ.has(_))return BQ.get(_);let U=vX(_);return BQ.set(_,U),U},i.withTenant=(_,U)=>{let G=N.context.getStore(),M=new Map(G);return M.set("tenant",_),N.context.run(M,U)}})(VQ||={});import{Elysia as dX}from"elysia";import{assign as lX}from"radash";g();class tQ{static register(Q={}){return function(X){async function Y(Z){console.log(`Registering module ${X.name}`),await n();let $=lX({controllers:[]},Q),_=new dX({name:X.name,prefix:Q.prefix});_.resolve({as:"local"},()=>({module:Z}));let U=Reflect.getMetadata(O.middlewares,X)??[];YQ(U,_);for(let G of $.controllers){let M=Reflect.getMetadata(O.elysiaPlugin,G);if(M===void 0)console.error(`Invalid controller class ${G.name} registered in module ${X.name}. Ensure that you either used the @Http.controller(), the @Websocket.controller(), or the @Wamp.controller() decorators on the class.`),process.exit(1);else _.use(await M())}return _}Reflect.defineMetadata(O.elysiaPlugin,Y,X)}}beforeRegister(){return Promise.resolve()}afterRegister(){return Promise.resolve()}}import{eq as MQ}from"drizzle-orm";var pX=(Q)=>{class X{static Model=Q;static connection="default";get db(){let Y=this.constructor.connection,Z=null;if(Y==="default")Z=N.context.getStore()?.get("db:tx")??null;return Z??p.getConnection(Y)}async all(){return await this.db.select().from(Q.table)}async paginate(Y,Z=1){let $=await this.db.$count(Q.table),_=Math.max(Z-1,0)*Y;return{page:Z,total:$,data:await this.db.select().from(Q.table).offset(_).limit(Y)}}async find(Y){let[Z]=await this.db.select().from(Q.table).where(MQ(Q.table.id,Y));return Z??null}async findBy(Y,Z){let[$]=await this.db.select().from(Q.table).where(MQ(Q.table[Y],Z));return $??null}async insert(Y){let[Z]=await this.db.insert(Q.table).values(Y).returning();return Z}async update(Y,Z){let[$]=await this.db.update(Q.table).set(Z).where(MQ(Q.table.id,Y)).returning();return $}async updateAll(Y){return await this.db.update(Q.table).set(Y).returning()}async delete(Y){let[Z]=await this.db.delete(Q.table).where(MQ(Q.table.id,Y)).returning();return Z}async deleteAll(){return await this.db.delete(Q.table).returning()}}return X};d();import{Elysia as uX}from"elysia";d();g();var aQ;((v)=>(v.controller=(U)=>{return function(G){async function M(){console.log(`Registering Websocket route for ${U.path} using ${G.name}`),await n();let H=B.make(G),L=Reflect.getMetadata(O.websocket,G)??{},z=L.open?.bind(H),R=L.close?.bind(H),P=L.message?.bind(H),j=L.drain?.bind(H),C=L.error?.bind(H)??((V)=>w.emit("elysium:error",V.error)),y=new uX;return y.ws(U.path,{open:z,close:R,message:P,drain:j,error:C,body:L.body,...U.options}),y}Reflect.defineMetadata(O.elysiaPlugin,M,G)}},v.onOpen=()=>{return function(U,G,M){let H=Reflect.getMetadata(O.websocket,U.constructor)??{};H.open=M.value,Reflect.defineMetadata(O.websocket,H,U.constructor)}},v.onClose=()=>{return function(U,G,M){let H=Reflect.getMetadata(O.websocket,U.constructor)??{};H.close=M.value,Reflect.defineMetadata(O.websocket,H,U.constructor)}},v.onMessage=(U)=>{return function(G,M,H){let L=Reflect.getMetadata(O.websocket,G.constructor)??{};L.message=H.value,L.body=U,Reflect.defineMetadata(O.websocket,L,G.constructor)}},v.onDrain=()=>{return function(U,G,M){let H=Reflect.getMetadata(O.websocket,U.constructor)??{};H.drain=M.value,Reflect.defineMetadata(O.websocket,H,U.constructor)}},v.onError=()=>{return function(U,G,M){let H=Reflect.getMetadata(O.websocket,U.constructor)??{};H.error=M.value,Reflect.defineMetadata(O.websocket,H,U.constructor)}}))(aQ||={});EQ();export{vZ as t,zQ as WorkerPool,AQ as Worker,aQ as Websocket,t as Wamp,VQ as Tenancy,NQ as ServiceScope,B as Service,pX as Repository,r as Redis,tQ as Module,gX as Model,yQ as Middleware,dQ as Job,k as InteractsWithConsole,sQ as HttpControllerScope,oQ as Http,w as Event,vQ as Env,p as Database,OQ as ConsoleFormat,uQ as CommandArgumentType,cQ as Command,l as Cache,N as Application};
19
+ `);return{valid:X.length===0&&Y.length===0,missing:X}}processArgs(Q){let X={},Y=this.getArguments();for(let Z=0;Z<Q.length;Z++){let $=Q[Z];if($.startsWith("--")){let _=$.slice(2);if(Z+1<Q.length&&!Q[Z+1].startsWith("--"))X[_]=Q[Z+1],Z++;else X[_]=!0}}for(let Z of Y){if(X[Z.name]===void 0&&Z.default!==void 0){X[Z.name]=Z.default;continue}if(X[Z.name]===void 0)continue;if(typeof X[Z.name]==="string")switch(Z.type||this.inferType(Z.default)){case"number":X[Z.name]=Number(X[Z.name]);break;case"boolean":let _=X[Z.name].toLowerCase();X[Z.name]=_==="true"||_==="1"||_==="yes";break;case"enum":if(Z.enum&&Z.enum.length>0&&typeof Z.enum[0]==="number")X[Z.name]=Number(X[Z.name]);break;case"array":let U=X[Z.name].split(",").map((G)=>G.trim());if(Z.arrayType)X[Z.name]=U.map((G)=>{switch(Z.arrayType){case"number":return Number(G);case"boolean":return G.toLowerCase()==="true"||G.toLowerCase()==="1"||G.toLowerCase()==="yes";case"enum":return G;default:return G}});else X[Z.name]=U;break;case"string":default:break}}return X}progress(Q,X="Processing"){return new iQ(Q,X)}spinner(Q="Processing",X,Y){return new mQ(Q,X,Y)}inferType(Q){if(Q===void 0)return"string";switch(typeof Q){case"number":return"number";case"boolean":return"boolean";default:return fX(Q)?"array":"string"}}}class iQ extends k{#Q=!1;#X=0;#Y=0;#Z="";#$=0;constructor(Q=0,X="Processing"){super();this.#X=Q,this.#Z=X,this.#Q=!0,this.#Y=0,this.#$=Date.now(),this.update(0)}update(Q=1,X){if(!this.#Q)return;if(this.#Y+=Q,X)this.#Z=X;let Y=Math.min(100,Math.floor(this.#Y/this.#X*100)),$=(Date.now()-this.#$)/1000,_=0,U=0,G="";if(this.#Y>0)_=$/this.#Y*this.#X,U=Math.max(0,_-$),G=` | ${this.formatTime($)} elapsed | ${this.formatTime(U)} remaining`;let M=30,L=Math.floor(Y/100*M),P=M-L,H="["+"=".repeat(L)+(P>0?">":"")+" ".repeat(Math.max(0,P-(P>0?1:0)))+"]",B=`${this.#Z}: ${H} ${Y}% (${this.#Y}/${this.#X})${G}`;if(this.clearLine(),this.write(B,!1),this.#Y>=this.#X)this.complete()}complete(Q){if(!this.#Q)return;this.#Y=this.#X;let Y=(Date.now()-this.#$)/1000;if(this.clearLine(),Q)this.write(`${Q} (completed in ${this.formatTime(Y)})`);else this.write(`${this.#Z} completed in ${this.formatTime(Y)}`);this.#Q=!1}pause(Q){if(!this.#Q)return;this.newLine(),this.write(Q),this.update(0)}isActive(){return this.#Q}getCurrent(){return this.#Y}getTotal(){return this.#X}getPercentage(){return Math.min(100,Math.floor(this.#Y/this.#X*100))}}class mQ extends k{#Q=!1;#X="";#Y=0;#Z=null;#$=0;#_=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];#U=80;constructor(Q="Processing",X,Y){super();if(this.#X=Q,X)this.#_=X;if(Y)this.#U=Y;if(this.#Q)return;this.#Q=!0,this.#Y=Date.now(),this.#$=0,this.#Z=setInterval(()=>{this.render()},this.#U),this.render()}update(Q){if(!this.#Q)return;this.#X=Q}complete(Q,X=!0){if(!this.#Q)return;if(this.#Z)clearInterval(this.#Z),this.#Z=null;let Z=(Date.now()-this.#Y)/1000;this.clearLine();let $=this.formatTime(Z);if(Q)this[X?"success":"error"](`${Q} (${$})`);else this[X?"success":"error"](`${this.#X} completed in ${$}`);this.#Q=!1}fail(Q){this.complete(Q,!1)}pause(Q){if(!this.#Q)return;if(this.#Z)clearInterval(this.#Z),this.#Z=null;this.clearLine(),this.write(Q),this.#Z=setInterval(()=>{this.render()},this.#U)}isActive(){return this.#Q}getElapsedTime(){return(Date.now()-this.#Y)/1000}render(){if(!this.#Q)return;let Q=this.getElapsedTime(),X=this.#_[this.#$];this.#$=(this.#$+1)%this.#_.length,this.clearLine(),this.write(`${X} ${this.#X} (${this.formatTime(Q)})`,!1)}}e();import{Elysia as CX,sse as SX,t as nQ}from"elysia";import{assign as kX,isEmpty as BQ,objectify as qX}from"radash";d();g();var hX=(Q)=>{let X=Reflect.getMetadata("http:body",Q.target,Q.propertyKey),Y=Reflect.getMetadata("http:params",Q.target,Q.propertyKey)??[],Z=Reflect.getMetadata("http:query",Q.target,Q.propertyKey),$=Reflect.getMetadata("http:rawContext",Q.target,Q.propertyKey),_=Reflect.getMetadata("http:customDecorators",Q.target,Q.propertyKey)??[],U=Reflect.getMetadata(z.middlewares,Q.target,Q.propertyKey)??[],G=Reflect.getMetadata(z.services,Q.target,Q.propertyKey)??[],{path:M,method:L,handler:P,target:H,response:B,operationId:O,description:K,transactional:x}=Q,q=Reflect.getMetadata(z.http,H.constructor)??[];q.push({path:M,method:L,body:X,params:Y,query:Z,customDecorators:_,rawContext:$,handler:P,middlewares:U,response:B,operationId:O,description:K,services:G,transactional:x}),Reflect.defineMetadata(z.http,q,H.constructor)},sQ;((Y)=>{Y[Y.SERVER=0]="SERVER";Y[Y.REQUEST=1]="REQUEST"})(sQ||={});var oQ;((D)=>(D.controller=(R={path:"/"})=>{return function(W){async function J(){console.log(`Registering HTTP controller for ${R.path} using ${W.name}`),await s(),R=kX({path:"/",scope:0,tags:[]},R);let I=new CX({prefix:R.path,name:W.name}),c=(()=>{if(R.scope===0)return()=>{let j=V.make(W);return()=>j};else if(R.scope===1)return()=>()=>V.make(W);else throw new Error(`Invalid scope for controller: ${W.name}`)})();I.resolve({as:"local"},()=>({controller:c()}));let ZQ=Reflect.getMetadata("http:onRequest",W)??{};if(ZQ.handler)I.onRequest((j)=>{let a=c()();return ZQ.handler.call(a,j)});let eQ=Reflect.getMetadata(z.middlewares,W)??[];YQ(eQ,I);let QX=Reflect.getMetadata(z.http,W)??[];for(let j of QX){let a=async(E)=>{let F=[];if(j.rawContext)F[j.rawContext.index]=E;if(j.body)F[j.body.index]=E.body;if(j.query)F[j.query.index]=E.query;if(!BQ(j.params))for(let w of j.params)F[w.index]=E.params[w.slug];if(!BQ(j.customDecorators))for(let w of j.customDecorators)F[w.index]=await w.handler(E);if(!BQ(j.services))for(let w of j.services)F[w.index]=V.get(w.name);return F},XX=j.handler.constructor.name.includes("GeneratorFunction"),xQ=j.method==="elysium:SSE",YX=j.transactional??R.transactional??!1,JQ=j.body&&j.body.schema===void 0&&j.body.validator!==void 0;j.method=xQ?"GET":j.method;let ZX=()=>{let E=(F)=>{if(YX)return function(...w){return u.getDefaultConnection().transaction((HQ)=>{return C.context.run(new Map([["tenant",F.tenant],["http:context",F],["db:tx",HQ]]),()=>{try{return j.handler.call(F.controller(),...w)}catch($Q){throw HQ.rollback(),$Q}})})};return function(...w){return C.context.run(new Map([["tenant",F.tenant],["http:context",F]]),()=>j.handler.call(F.controller(),...w))}};if(XX)return async function*(F){let w=E(F),HQ=await a(F);try{for await(let $Q of w(...HQ))yield $Q}catch($Q){yield $Q}};if(xQ)return async function*(F){let w=E(F);F.set.headers["content-type"]="text/event-stream",F.set.headers["cache-control"]="no-cache",F.set.headers.connection="keep-alive";while(!0)yield SX(await w(...await a(F))),await Bun.sleep(10)};if(JQ)return async function(F){if(await j.body.validator.validate(F))return await E(F)(...await a(F));throw F.status(400,"Invalid request body")};return async function(F){return await E(F)(...await a(F))}},wQ=qX(j.params??[],(E)=>E.slug,(E)=>E.schema),LQ=j.middlewares.map((E)=>V.make(E));I.route(j.method,j.path,ZX(),{config:{},async transform(E){if(JQ&&!await j.body.validator.authorize(E))throw E.status(401,"Unauthorized");return p(LQ,E,"onTransform")},beforeHandle(E){return p(LQ,E,"onBeforeHandle")},afterHandle(E){return p(LQ,E,"onAfterHandle")},afterResponse(E){return p(LQ,E,"onAfterResponse")},detail:{tags:R.tags,description:j.description,operationId:j.operationId},body:JQ?j.body?.validator?.schema:j.body?.schema,response:j.response,params:BQ(wQ)?void 0:nQ.Object(wQ)})}return I}Reflect.defineMetadata(z.elysiaPlugin,J,W)}},D.sse=(R={})=>{let{path:W="/",...J}=R;return D.custom({method:"elysium:SSE",path:W,...J})},D.get=(R={})=>{let{path:W="/",...J}=R;return D.custom({method:"GET",path:W,...J})},D.post=(R={})=>{let{path:W="/",...J}=R;return D.custom({method:"POST",path:W,...J})},D.put=(R={})=>{let{path:W="/",...J}=R;return D.custom({method:"PUT",path:W,...J})},D.del=(R={})=>{let{path:W="/",...J}=R;return D.custom({method:"DELETE",path:W,...J})},D.patch=(R={})=>{let{path:W="/",...J}=R;return D.custom({method:"PATCH",path:W,...J})},D.head=(R={})=>{let{path:W="/",...J}=R??{};return D.custom({method:"HEAD",path:W,...J})},D.options=(R={})=>{let{path:W="/",...J}=R;return D.custom({method:"OPTIONS",path:W,...J})},D.trace=(R={})=>{let{path:W="/",...J}=R;return D.custom({method:"TRACE",path:W,...J})},D.custom=({path:R="/",...W})=>{return function(J,I,c){process.nextTick(()=>{hX({path:R,handler:c.value,target:J,propertyKey:I,...W})})}},D.onRequest=()=>{return function(R,W,J){let I=Reflect.getMetadata("http:onRequest",R.constructor)??{};I.handler=J.value,Reflect.defineMetadata("http:onRequest",I,R.constructor)}},D.context=()=>{return function(R,W,J){Reflect.defineMetadata("http:rawContext",{index:J},R,W)}},D.param=(R,W)=>{return function(J,I,c){let ZQ=Reflect.getMetadata("http:params",J,I)??[];ZQ.push({slug:R,schema:W??nQ.String(),index:c}),Reflect.defineMetadata("http:params",ZQ,J,I)}},D.query=(R)=>{return function(W,J,I){Reflect.defineMetadata("http:query",{schema:R,index:I},W,J)}},D.body=(R)=>{return function(W,J,I){if(typeof R==="function")Reflect.defineMetadata("http:body",{validator:R,index:I},W,J);else Reflect.defineMetadata("http:body",{schema:R,index:I},W,J)}},D.decorate=(R)=>{return()=>{return function(W,J,I){let c=Reflect.getMetadata("http:customDecorators",W,J)??[];c.push({handler:R,index:I}),Reflect.defineMetadata("http:customDecorators",c,W,J)}}}))(oQ||={});FQ();import{getTableConfig as bX,pgSchema as vX,pgTable as rQ}from"drizzle-orm/pg-core";import{t as S}from"elysia";var IQ=(Q,{mode:X="select"}={})=>{let{columns:Y}=bX(Q);if(Y===void 0)return S.Object({});let Z={};for(let $ of Y){if(["create","update"].includes(X)&&$.primary)continue;if(Z[$.name]=yX($),!$.notNull)Z[$.name]=S.Nullable(Z[$.name]);if(X==="update"||$.hasDefault||!$.notNull)Z[$.name]=S.Optional(Z[$.name])}return S.Object(Z)},yX=(Q)=>{let X=(()=>{switch(Q.dataType){case"string":return S.String({format:Q.columnType==="PgUUID"?"uuid":void 0});case"number":return S.Number();case"boolean":return S.Boolean();case"array":return S.Array(S.Any());case"json":return S.Object({});case"date":case"localDate":case"localDateTime":return S.String({format:Q.dataType==="date"?"date":"date-time"});case"bigint":return S.BigInt();case"buffer":return S.File();default:return S.Never()}})();if(!Q.notNull)X=S.Optional(X);else X=S.Required(X);return X},gX=(Q,X,Y)=>{let Z=rQ(Q,X,Y);class ${static $inferSelect=Z.$inferSelect;static $inferInsert=Z.$inferInsert;static $inferUpdate=Z.$inferInsert;static get table(){if(!C.instance||!C.context.getStore)return Z;if(this.supportTenancy){let _=VQ.getCurrentTenant()??"public";return VQ.wrapTenant(_,this)}return Z}static tableName=Q;static columns=X;static extraConfig=Y;static insertSchema=IQ(Z,{mode:"create"});static updateSchema=IQ(Z,{mode:"update"});static selectSchema=IQ(Z,{mode:"select"});static supportTenancy=!1}return $},TQ=new Map,RQ=new Map,VQ;((m)=>{let Q=(_)=>{return RQ.get(_)??m.registerTenant(_)};m.getCurrentTenant=()=>{return C.context.getStore()?.get("tenant")??null},m.wrapTenant=(_,U)=>{if(_==="public")return rQ(U.tableName,U.columns);let G=`${_}.${U.tableName}`;if(TQ.has(G))return TQ.get(G);let L=Q(_).table(U.tableName,U.columns);return TQ.set(G,L),L},m.registerTenant=(_)=>{if(RQ.has(_))return RQ.get(_);let U=vX(_);return RQ.set(_,U),U},m.withTenant=(_,U)=>{let G=C.context.getStore(),M=new Map(G);return M.set("tenant",_),C.context.run(M,U)}})(VQ||={});import{Elysia as dX}from"elysia";import{assign as lX}from"radash";g();class tQ{static register(Q={}){return function(X){async function Y(Z){console.log(`Registering module ${X.name}`),await s();let $=lX({controllers:[]},Q),_=new dX({name:X.name,prefix:Q.prefix});_.resolve({as:"local"},()=>({module:Z}));let U=Reflect.getMetadata(z.middlewares,X)??[];YQ(U,_);for(let G of $.controllers){let M=Reflect.getMetadata(z.elysiaPlugin,G);if(M===void 0)console.error(`Invalid controller class ${G.name} registered in module ${X.name}. Ensure that you either used the @Http.controller(), the @Websocket.controller(), or the @Wamp.controller() decorators on the class.`),process.exit(1);else _.use(await M())}return _}Reflect.defineMetadata(z.elysiaPlugin,Y,X)}}beforeRegister(){return Promise.resolve()}afterRegister(){return Promise.resolve()}}import{eq as MQ}from"drizzle-orm";var uX=(Q)=>{class X{static Model=Q;static connection="default";get db(){let Y=this.constructor.connection,Z=null;if(Y==="default")Z=C.context.getStore()?.get("db:tx")??null;return Z??u.getConnection(Y)}async all(){return await this.db.select().from(Q.table)}async paginate(Y,Z=1){let $=await this.db.$count(Q.table),_=Math.max(Z-1,0)*Y;return{page:Z,total:$,data:await this.db.select().from(Q.table).offset(_).limit(Y)}}async find(Y){let[Z]=await this.db.select().from(Q.table).where(MQ(Q.table.id,Y));return Z??null}async findBy(Y,Z){let[$]=await this.db.select().from(Q.table).where(MQ(Q.table[Y],Z));return $??null}async insert(Y){let[Z]=await this.db.insert(Q.table).values(Y).returning();return Z}async update(Y,Z){let[$]=await this.db.update(Q.table).set(Z).where(MQ(Q.table.id,Y)).returning();return $}async updateAll(Y){return await this.db.update(Q.table).set(Y).returning()}async delete(Y){let[Z]=await this.db.delete(Q.table).where(MQ(Q.table.id,Y)).returning();return Z}async deleteAll(){return await this.db.delete(Q.table).returning()}}return X};d();import{Elysia as pX}from"elysia";d();g();var aQ;((y)=>(y.controller=(U)=>{return function(G){async function M(){console.log(`Registering Websocket route for ${U.path} using ${G.name}`),await s();let L=V.make(G),P=Reflect.getMetadata(z.websocket,G)??{},H=P.open?.bind(L),B=P.close?.bind(L),O=P.message?.bind(L),K=P.drain?.bind(L),x=P.error?.bind(L)??((R)=>f.emit("elysium:error",R.error)),q=new pX;return q.ws(U.path,{open:H,close:B,message:O,drain:K,error:x,body:P.body,...U.options}),q}Reflect.defineMetadata(z.elysiaPlugin,M,G)}},y.onOpen=()=>{return function(U,G,M){let L=Reflect.getMetadata(z.websocket,U.constructor)??{};L.open=M.value,Reflect.defineMetadata(z.websocket,L,U.constructor)}},y.onClose=()=>{return function(U,G,M){let L=Reflect.getMetadata(z.websocket,U.constructor)??{};L.close=M.value,Reflect.defineMetadata(z.websocket,L,U.constructor)}},y.onMessage=(U)=>{return function(G,M,L){let P=Reflect.getMetadata(z.websocket,G.constructor)??{};P.message=L.value,P.body=U,Reflect.defineMetadata(z.websocket,P,G.constructor)}},y.onDrain=()=>{return function(U,G,M){let L=Reflect.getMetadata(z.websocket,U.constructor)??{};L.drain=M.value,Reflect.defineMetadata(z.websocket,L,U.constructor)}},y.onError=()=>{return function(U,G,M){let L=Reflect.getMetadata(z.websocket,U.constructor)??{};L.error=M.value,Reflect.defineMetadata(z.websocket,L,U.constructor)}}))(aQ||={});EQ();export{vZ as t,PQ as WorkerPool,AQ as Worker,aQ as Websocket,t as Wamp,VQ as Tenancy,NQ as ServiceScope,V as Service,uX as Repository,r as Redis,tQ as Module,gX as Model,yQ as Middleware,dQ as Job,k as InteractsWithConsole,sQ as HttpControllerScope,oQ as Http,f as Event,vQ as Env,u as Database,OQ as ConsoleFormat,pQ as CommandArgumentType,cQ as Command,l as Cache,C as Application};
package/dist/service.d.ts CHANGED
@@ -127,5 +127,13 @@ export declare namespace Service {
127
127
  * @author Axel Nana <axel.nana@workbud.com>
128
128
  */
129
129
  const clear: () => void;
130
+ /**
131
+ * Returns an array of registered service names matching the given pattern.
132
+ * Pattern supports '*' (any sequence) and '?' (any single character), similarly to Redis KEYS.
133
+ * @author Axel Nana <axel.nana@workbud.com>
134
+ * @param pattern The glob-like pattern to match service names.
135
+ * @returns Array of matching service names.
136
+ */
137
+ const keys: (pattern: string) => string[];
130
138
  }
131
139
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elysiumjs/core",
3
- "version": "0.5.3",
3
+ "version": "0.5.4",
4
4
  "license": "Apache-2.0",
5
5
  "description": "A super-charged web framework for Bun, built on top of ElysiaJS.",
6
6
  "private": false,