@ooneex/cli 1.2.3 → 1.2.5

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/index.js CHANGED
@@ -1,38 +1,38 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- var ai=Object.create;var{getPrototypeOf:ii,defineProperty:Lt,getOwnPropertyNames:ni}=Object;var li=Object.prototype.hasOwnProperty;function di(e){return this[e]}var mi,ci,te=(e,t,s)=>{var r=e!=null&&typeof e==="object";if(r){var o=t?mi??=new WeakMap:ci??=new WeakMap,a=o.get(e);if(a)return a}s=e!=null?ai(ii(e)):{};let i=t||!e||!e.__esModule?Lt(s,"default",{value:e,enumerable:!0}):s;for(let n of ni(e))if(!li.call(i,n))Lt(i,n,{get:di.bind(e,n),enumerable:!0});if(r)o.set(e,i);return i};var x=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var y=function(e,t,s,r){var o=arguments.length,a=o<3?t:r===null?r=Object.getOwnPropertyDescriptor(t,s):r,i;if(typeof Reflect==="object"&&typeof Reflect.decorate==="function")a=Reflect.decorate(e,t,s,r);else for(var n=e.length-1;n>=0;n--)if(i=e[n])a=(o<3?i(a):o>3?i(t,s,a):i(t,s))||a;return o>3&&a&&Object.defineProperty(t,s,a),a};var he=import.meta.require;var Kt=x((Ic,fe)=>{var xi=typeof process<"u"&&process.env.TERM_PROGRAM==="Hyper",wi=typeof process<"u"&&process.platform==="win32",Wt=typeof process<"u"&&process.platform==="linux",st={ballotDisabled:"\u2612",ballotOff:"\u2610",ballotOn:"\u2611",bullet:"\u2022",bulletWhite:"\u25E6",fullBlock:"\u2588",heart:"\u2764",identicalTo:"\u2261",line:"\u2500",mark:"\u203B",middot:"\xB7",minus:"\uFF0D",multiplication:"\xD7",obelus:"\xF7",pencilDownRight:"\u270E",pencilRight:"\u270F",pencilUpRight:"\u2710",percent:"%",pilcrow2:"\u2761",pilcrow:"\xB6",plusMinus:"\xB1",question:"?",section:"\xA7",starsOff:"\u2606",starsOn:"\u2605",upDownArrow:"\u2195"},qt=Object.assign({},st,{check:"\u221A",cross:"\xD7",ellipsisLarge:"...",ellipsis:"...",info:"i",questionSmall:"?",pointer:">",pointerSmall:"\xBB",radioOff:"( )",radioOn:"(*)",warning:"\u203C"}),kt=Object.assign({},st,{ballotCross:"\u2718",check:"\u2714",cross:"\u2716",ellipsisLarge:"\u22EF",ellipsis:"\u2026",info:"\u2139",questionFull:"\uFF1F",questionSmall:"\uFE56",pointer:Wt?"\u25B8":"\u276F",pointerSmall:Wt?"\u2023":"\u203A",radioOff:"\u25EF",radioOn:"\u25C9",warning:"\u26A0"});fe.exports=wi&&!xi?qt:kt;Reflect.defineProperty(fe.exports,"common",{enumerable:!1,value:st});Reflect.defineProperty(fe.exports,"windows",{enumerable:!1,value:qt});Reflect.defineProperty(fe.exports,"other",{enumerable:!1,value:kt})});var ve=x((Lc,rt)=>{var Ei=(e)=>e!==null&&typeof e==="object"&&!Array.isArray(e),Ai=/[\u001b\u009b][[\]#;?()]*(?:(?:(?:[^\W_]*;?[^\W_]*)\u0007)|(?:(?:[0-9]{1,4}(;[0-9]{0,4})*)?[~0-9=<>cf-nqrtyA-PRZ]))/g,Ni=()=>{if(typeof process<"u")return process.env.FORCE_COLOR!=="0";return!1},Ht=()=>{let e={enabled:Ni(),visible:!0,styles:{},keys:{}},t=(a)=>{let i=a.open=`\x1B[${a.codes[0]}m`,n=a.close=`\x1B[${a.codes[1]}m`,l=a.regex=new RegExp(`\\u001b\\[${a.codes[1]}m`,"g");return a.wrap=(d,u)=>{if(d.includes(n))d=d.replace(l,n+i);let c=i+d+n;return u?c.replace(/\r*\n/g,`${n}$&${i}`):c},a},s=(a,i,n)=>{return typeof a==="function"?a(i):a.wrap(i,n)},r=(a,i)=>{if(a===""||a==null)return"";if(e.enabled===!1)return a;if(e.visible===!1)return"";let n=""+a,l=n.includes(`
4
- `),d=i.length;if(d>0&&i.includes("unstyle"))i=[...new Set(["unstyle",...i])].reverse();while(d-- >0)n=s(e.styles[i[d]],n,l);return n},o=(a,i,n)=>{e.styles[a]=t({name:a,codes:i}),(e.keys[n]||(e.keys[n]=[])).push(a),Reflect.defineProperty(e,a,{configurable:!0,enumerable:!0,set(d){e.alias(a,d)},get(){let d=(u)=>r(u,d.stack);return Reflect.setPrototypeOf(d,e),d.stack=this.stack?this.stack.concat(a):[a],d}})};return o("reset",[0,0],"modifier"),o("bold",[1,22],"modifier"),o("dim",[2,22],"modifier"),o("italic",[3,23],"modifier"),o("underline",[4,24],"modifier"),o("inverse",[7,27],"modifier"),o("hidden",[8,28],"modifier"),o("strikethrough",[9,29],"modifier"),o("black",[30,39],"color"),o("red",[31,39],"color"),o("green",[32,39],"color"),o("yellow",[33,39],"color"),o("blue",[34,39],"color"),o("magenta",[35,39],"color"),o("cyan",[36,39],"color"),o("white",[37,39],"color"),o("gray",[90,39],"color"),o("grey",[90,39],"color"),o("bgBlack",[40,49],"bg"),o("bgRed",[41,49],"bg"),o("bgGreen",[42,49],"bg"),o("bgYellow",[43,49],"bg"),o("bgBlue",[44,49],"bg"),o("bgMagenta",[45,49],"bg"),o("bgCyan",[46,49],"bg"),o("bgWhite",[47,49],"bg"),o("blackBright",[90,39],"bright"),o("redBright",[91,39],"bright"),o("greenBright",[92,39],"bright"),o("yellowBright",[93,39],"bright"),o("blueBright",[94,39],"bright"),o("magentaBright",[95,39],"bright"),o("cyanBright",[96,39],"bright"),o("whiteBright",[97,39],"bright"),o("bgBlackBright",[100,49],"bgBright"),o("bgRedBright",[101,49],"bgBright"),o("bgGreenBright",[102,49],"bgBright"),o("bgYellowBright",[103,49],"bgBright"),o("bgBlueBright",[104,49],"bgBright"),o("bgMagentaBright",[105,49],"bgBright"),o("bgCyanBright",[106,49],"bgBright"),o("bgWhiteBright",[107,49],"bgBright"),e.ansiRegex=Ai,e.hasColor=e.hasAnsi=(a)=>{return e.ansiRegex.lastIndex=0,typeof a==="string"&&a!==""&&e.ansiRegex.test(a)},e.alias=(a,i)=>{let n=typeof i==="string"?e[i]:i;if(typeof n!=="function")throw TypeError("Expected alias to be the name of an existing color (string) or a function");if(!n.stack)Reflect.defineProperty(n,"name",{value:a}),e.styles[a]=n,n.stack=[a];Reflect.defineProperty(e,a,{configurable:!0,enumerable:!0,set(l){e.alias(a,l)},get(){let l=(d)=>r(d,l.stack);return Reflect.setPrototypeOf(l,e),l.stack=this.stack?this.stack.concat(n.stack):n.stack,l}})},e.theme=(a)=>{if(!Ei(a))throw TypeError("Expected theme to be an object");for(let i of Object.keys(a))e.alias(i,a[i]);return e},e.alias("unstyle",(a)=>{if(typeof a==="string"&&a!=="")return e.ansiRegex.lastIndex=0,a.replace(e.ansiRegex,"");return""}),e.alias("noop",(a)=>a),e.none=e.clear=e.noop,e.stripColor=e.unstyle,e.symbols=Kt(),e.define=o,e};rt.exports=Ht();rt.exports.create=Ht});var C=x((Ti)=>{var vi=Object.prototype.toString,I=ve(),Vt=!1,ge=new Set,Yt={yellow:"blue",cyan:"red",green:"magenta",black:"white",blue:"yellow",red:"cyan",magenta:"green",white:"black"};Ti.longest=(e,t)=>{return e.reduce((s,r)=>Math.max(s,t?r[t].length:r.length),0)};Ti.hasColor=(e)=>!!e&&I.hasColor(e);var Te=Ti.isObject=(e)=>{return e!==null&&typeof e==="object"&&!Array.isArray(e)};Ti.nativeType=(e)=>{return vi.call(e).slice(8,-1).toLowerCase().replace(/\s/g,"")};Ti.isAsyncFn=(e)=>{return Ti.nativeType(e)==="asyncfunction"};Ti.isPrimitive=(e)=>{return e!=null&&typeof e!=="object"&&typeof e!=="function"};Ti.resolve=(e,t,...s)=>{if(typeof t==="function")return t.call(e,...s);return t};Ti.scrollDown=(e=[])=>[...e.slice(1),e[0]];Ti.scrollUp=(e=[])=>[e.pop(),...e];Ti.reorder=(e=[])=>{let t=e.slice();return t.sort((s,r)=>{if(s.index>r.index)return 1;if(s.index<r.index)return-1;return 0}),t};Ti.swap=(e,t,s)=>{let r=e.length,o=s===r?0:s<0?r-1:s,a=e[t];e[t]=e[o],e[o]=a};Ti.width=(e,t=80)=>{let s=e&&e.columns?e.columns:t;if(e&&typeof e.getWindowSize==="function")s=e.getWindowSize()[0];if(process.platform==="win32")return s-1;return s};Ti.height=(e,t=20)=>{let s=e&&e.rows?e.rows:t;if(e&&typeof e.getWindowSize==="function")s=e.getWindowSize()[1];return s};Ti.wordWrap=(e,t={})=>{if(!e)return e;if(typeof t==="number")t={width:t};let{indent:s="",newline:r=`
5
- `+s,width:o=80}=t,a=(r+s).match(/[^\S\n]/g)||[];o-=a.length;let i=`.{1,${o}}([\\s\\u200B]+|$)|[^\\s\\u200B]+?([\\s\\u200B]+|$)`,n=e.trim(),l=new RegExp(i,"g"),d=n.match(l)||[];if(d=d.map((u)=>u.replace(/\n$/,"")),t.padEnd)d=d.map((u)=>u.padEnd(o," "));if(t.padStart)d=d.map((u)=>u.padStart(o," "));return s+d.join(r)};Ti.unmute=(e)=>{let t=e.stack.find((r)=>I.keys.color.includes(r));if(t)return I[t];if(e.stack.find((r)=>r.slice(2)==="bg"))return I[t.slice(2)];return(r)=>r};Ti.pascal=(e)=>e?e[0].toUpperCase()+e.slice(1):"";Ti.inverse=(e)=>{if(!e||!e.stack)return e;let t=e.stack.find((r)=>I.keys.color.includes(r));if(t){let r=I["bg"+Ti.pascal(t)];return r?r.black:e}let s=e.stack.find((r)=>r.slice(0,2)==="bg");if(s)return I[s.slice(2).toLowerCase()]||e;return I.none};Ti.complement=(e)=>{if(!e||!e.stack)return e;let t=e.stack.find((r)=>I.keys.color.includes(r)),s=e.stack.find((r)=>r.slice(0,2)==="bg");if(t&&!s)return I[Yt[t]||t];if(s){let r=s.slice(2).toLowerCase(),o=Yt[r];if(!o)return e;return I["bg"+Ti.pascal(o)]||e}return I.none};Ti.meridiem=(e)=>{let t=e.getHours(),s=e.getMinutes(),r=t>=12?"pm":"am";t=t%12;let o=t===0?12:t,a=s<10?"0"+s:s;return o+":"+a+" "+r};Ti.set=(e={},t="",s)=>{return t.split(".").reduce((r,o,a,i)=>{let n=i.length-1>a?r[o]||{}:s;if(!Ti.isObject(n)&&a<i.length-1)n={};return r[o]=n},e)};Ti.get=(e={},t="",s)=>{let r=e[t]==null?t.split(".").reduce((o,a)=>o&&o[a],e):e[t];return r==null?s:r};Ti.mixin=(e,t)=>{if(!Te(e))return t;if(!Te(t))return e;for(let s of Object.keys(t)){let r=Object.getOwnPropertyDescriptor(t,s);if(hasOwnProperty.call(r,"value"))if(hasOwnProperty.call(e,s)&&Te(r.value)){let o=Object.getOwnPropertyDescriptor(e,s);if(Te(o.value)&&o.value!==r.value)e[s]=Ti.merge({},e[s],t[s]);else Reflect.defineProperty(e,s,r)}else Reflect.defineProperty(e,s,r);else Reflect.defineProperty(e,s,r)}return e};Ti.merge=(...e)=>{let t={};for(let s of e)Ti.mixin(t,s);return t};Ti.mixinEmitter=(e,t)=>{let s=t.constructor.prototype;for(let r of Object.keys(s)){let o=s[r];if(typeof o==="function")Ti.define(e,r,o.bind(t));else Ti.define(e,r,o)}};var Se=(e,t)=>{if(Vt)return;if(Vt=!0,ge.forEach((s)=>s()),e===!0)process.exit(128+t)},Ft=Se.bind(null,!0,15),jt=Se.bind(null,!0,2);Ti.onExit=(e)=>{if(ge.size===0)process.once("SIGTERM",Ft),process.once("SIGINT",jt),process.once("exit",Se);return ge.add(e),()=>{if(ge.delete(e),ge.size===0)process.off("SIGTERM",Ft),process.off("SIGINT",jt),process.off("exit",Se)}};Ti.define=(e,t,s)=>{Reflect.defineProperty(e,t,{value:s})};Ti.defineExport=(e,t,s)=>{let r;Reflect.defineProperty(e,t,{enumerable:!0,configurable:!0,set(o){r=o},get(){return r?r():s()}})}});var Jt=x((Gc,Xt)=>{Xt.exports=({onlyFirst:e=!1}={})=>{let t=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(t,e?void 0:"g")}});var se=x(($c,es)=>{var zi=Jt();es.exports=(e)=>typeof e==="string"?e.replace(zi(),""):e});var ts=x((Zi)=>{Zi.ctrl={a:"first",b:"backward",c:"cancel",d:"deleteForward",e:"last",f:"forward",g:"reset",i:"tab",k:"cutForward",l:"reset",n:"newItem",m:"cancel",j:"submit",p:"search",r:"remove",s:"save",u:"undo",w:"cutLeft",x:"toggleCursor",v:"paste"};Zi.shift={up:"shiftUp",down:"shiftDown",left:"shiftLeft",right:"shiftRight",tab:"prev"};Zi.fn={up:"pageUp",down:"pageDown",left:"pageLeft",right:"pageRight",delete:"deleteForward"};Zi.option={b:"backward",f:"forward",d:"cutRight",left:"cutLeft",up:"altUp",down:"altDown"};Zi.keys={pageup:"pageUp",pagedown:"pageDown",home:"home",end:"end",cancel:"cancel",delete:"deleteForward",backspace:"delete",down:"down",enter:"submit",escape:"cancel",left:"left",space:"space",number:"number",return:"submit",right:"right",tab:"next",up:"up"}});var rs=x((qc,ss)=>{ss.exports=class{_queue=[];_executing=!1;_jobRunner=null;constructor(t){this._jobRunner=t}enqueue=(...t)=>{this._queue.push(t),this._dequeue()};destroy(){this._queue.length=0,this._jobRunner=null}_dequeue(){if(this._executing||!this._queue.length)return;this._executing=!0,this._jobRunner(...this._queue.shift()),setTimeout(()=>{this._executing=!1,this._dequeue()})}}});var at=x((kc,as)=>{var os=he("readline"),sn=ts(),rn=rs(),on=/^(?:\x1b)([a-zA-Z0-9])$/,an=/^(?:\x1b+)(O|N|\[|\[\[)(?:(\d+)(?:;(\d+))?([~^$])|(?:1;)?(\d+)?([a-zA-Z]))/,nn={OP:"f1",OQ:"f2",OR:"f3",OS:"f4","[11~":"f1","[12~":"f2","[13~":"f3","[14~":"f4","[[A":"f1","[[B":"f2","[[C":"f3","[[D":"f4","[[E":"f5","[15~":"f5","[17~":"f6","[18~":"f7","[19~":"f8","[20~":"f9","[21~":"f10","[23~":"f11","[24~":"f12","[A":"up","[B":"down","[C":"right","[D":"left","[E":"clear","[F":"end","[H":"home",OA:"up",OB:"down",OC:"right",OD:"left",OE:"clear",OF:"end",OH:"home","[1~":"home","[2~":"insert","[3~":"delete","[4~":"end","[5~":"pageup","[6~":"pagedown","[[5~":"pageup","[[6~":"pagedown","[7~":"home","[8~":"end","[a":"up","[b":"down","[c":"right","[d":"left","[e":"clear","[2$":"insert","[3$":"delete","[5$":"pageup","[6$":"pagedown","[7$":"home","[8$":"end",Oa:"up",Ob:"down",Oc:"right",Od:"left",Oe:"clear","[2^":"insert","[3^":"delete","[5^":"pageup","[6^":"pagedown","[7^":"home","[8^":"end","[Z":"tab"};function ln(e){return["[a","[b","[c","[d","[e","[2$","[3$","[5$","[6$","[7$","[8$","[Z"].includes(e)}function dn(e){return["Oa","Ob","Oc","Od","Oe","[2^","[3^","[5^","[6^","[7^","[8^"].includes(e)}var Me=(e="",t={})=>{let s,r={name:t.name,ctrl:!1,meta:!1,shift:!1,option:!1,sequence:e,raw:e,...t};if(Buffer.isBuffer(e))if(e[0]>127&&e[1]===void 0)e[0]-=128,e="\x1B"+String(e);else e=String(e);else if(e!==void 0&&typeof e!=="string")e=String(e);else if(!e)e=r.sequence||"";if(r.sequence=r.sequence||e||r.name,e==="\r")r.raw=void 0,r.name="return";else if(e===`
6
- `)r.name="enter";else if(e==="\t")r.name="tab";else if(e==="\b"||e==="\x7F"||e==="\x1B\x7F"||e==="\x1B\b")r.name="backspace",r.meta=e.charAt(0)==="\x1B";else if(e==="\x1B"||e==="\x1B\x1B")r.name="escape",r.meta=e.length===2;else if(e===" "||e==="\x1B ")r.name="space",r.meta=e.length===2;else if(e<="\x1A")r.name=String.fromCharCode(e.charCodeAt(0)+97-1),r.ctrl=!0;else if(e.length===1&&e>="0"&&e<="9")r.name="number";else if(e.length===1&&e>="a"&&e<="z")r.name=e;else if(e.length===1&&e>="A"&&e<="Z")r.name=e.toLowerCase(),r.shift=!0;else if(s=on.exec(e))r.meta=!0,r.shift=/^[A-Z]$/.test(s[1]);else if(s=an.exec(e)){let o=[...e];if(o[0]==="\x1B"&&o[1]==="\x1B")r.option=!0;let a=[s[1],s[2],s[4],s[6]].filter(Boolean).join(""),i=(s[3]||s[5]||1)-1;r.ctrl=!!(i&4),r.meta=!!(i&10),r.shift=!!(i&1),r.code=a,r.name=nn[a],r.shift=ln(a)||r.shift,r.ctrl=dn(a)||r.ctrl}return r};Me.listen=(e={},t)=>{let{stdin:s}=e;if(!s||s!==process.stdin&&!s.isTTY)throw Error("Invalid stream passed");let r=os.createInterface({terminal:!0,input:s});os.emitKeypressEvents(s,r);let o=new rn((n,l)=>t(n,Me(n,l),r)),a=s.isRaw;if(s.isTTY)s.setRawMode(!0);return s.on("keypress",o.enqueue),r.resume(),()=>{if(s.isTTY)s.setRawMode(a);s.removeListener("keypress",o.enqueue),o.destroy(),r.pause(),r.close()}};Me.action=(e,t,s)=>{let r={...sn,...s};if(t.ctrl)return t.action=r.ctrl[t.name],t;if(t.option&&r.option)return t.action=r.option[t.name],t;if(t.shift)return t.action=r.shift[t.name],t;return t.action=r.keys[t.name],t};as.exports=Me});var ns=x((Kc,is)=>{is.exports=(e)=>{e.timers=e.timers||{};let t=e.options.timers;if(!t)return;for(let s of Object.keys(t)){let r=t[s];if(typeof r==="number")r={interval:r};mn(e,s,r)}};function mn(e,t,s={}){let r=e.timers[t]={name:t,start:Date.now(),ms:0,tick:0},o=s.interval||120;r.frames=s.frames||[],r.loading=!0;let a=setInterval(()=>{r.ms=Date.now()-r.start,r.tick++,e.render()},o);return r.stop=()=>{r.loading=!1,clearInterval(a)},Reflect.defineProperty(r,"interval",{value:a}),e.once("close",()=>r.stop()),r.stop}});var ms=x((Hc,ds)=>{var{define:cn,width:pn}=C();class ls{constructor(e){let t=e.options;cn(this,"_prompt",e),this.type=e.type,this.name=e.name,this.message="",this.header="",this.footer="",this.error="",this.hint="",this.input="",this.cursor=0,this.index=0,this.lines=0,this.tick=0,this.prompt="",this.buffer="",this.width=pn(t.stdout||process.stdout),Object.assign(this,t),this.name=this.name||this.message,this.message=this.message||this.name,this.symbols=e.symbols,this.styles=e.styles,this.required=new Set,this.cancelled=!1,this.submitted=!1}clone(){let e={...this};return e.status=this.status,e.buffer=Buffer.from(e.buffer),delete e.clone,e}set color(e){this._color=e}get color(){let e=this.prompt.styles;if(this.cancelled)return e.cancelled;if(this.submitted)return e.submitted;let t=this._color||e[this.status];return typeof t==="function"?t:e.pending}set loading(e){this._loading=e}get loading(){if(typeof this._loading==="boolean")return this._loading;if(this.loadingChoices)return"choices";return!1}get status(){if(this.cancelled)return"cancelled";if(this.submitted)return"submitted";return"pending"}}ds.exports=ls});var ps=x((Vc,cs)=>{var it=C(),M=ve(),nt={default:M.noop,noop:M.noop,set inverse(e){this._inverse=e},get inverse(){return this._inverse||it.inverse(this.primary)},set complement(e){this._complement=e},get complement(){return this._complement||it.complement(this.primary)},primary:M.cyan,success:M.green,danger:M.magenta,strong:M.bold,warning:M.yellow,muted:M.dim,disabled:M.gray,dark:M.dim.gray,underline:M.underline,set info(e){this._info=e},get info(){return this._info||this.primary},set em(e){this._em=e},get em(){return this._em||this.primary.underline},set heading(e){this._heading=e},get heading(){return this._heading||this.muted.underline},set pending(e){this._pending=e},get pending(){return this._pending||this.primary},set submitted(e){this._submitted=e},get submitted(){return this._submitted||this.success},set cancelled(e){this._cancelled=e},get cancelled(){return this._cancelled||this.danger},set typing(e){this._typing=e},get typing(){return this._typing||this.dim},set placeholder(e){this._placeholder=e},get placeholder(){return this._placeholder||this.primary.dim},set highlight(e){this._highlight=e},get highlight(){return this._highlight||this.inverse}};nt.merge=(e={})=>{if(e.styles&&typeof e.styles.enabled==="boolean")M.enabled=e.styles.enabled;if(e.styles&&typeof e.styles.visible==="boolean")M.visible=e.styles.visible;let t=it.merge({},nt,e.styles);delete t.merge;for(let s of Object.keys(M))if(!hasOwnProperty.call(t,s))Reflect.defineProperty(t,s,{get:()=>M[s]});for(let s of Object.keys(M.styles))if(!hasOwnProperty.call(t,s))Reflect.defineProperty(t,s,{get:()=>M[s]});return t};cs.exports=nt});var hs=x((Yc,us)=>{var lt=process.platform==="win32",H=ve(),un=C(),dt={...H.symbols,upDownDoubleArrow:"\u21D5",upDownDoubleArrow2:"\u2B0D",upDownArrow:"\u2195",asterisk:"*",asterism:"\u2042",bulletWhite:"\u25E6",electricArrow:"\u2301",ellipsisLarge:"\u22EF",ellipsisSmall:"\u2026",fullBlock:"\u2588",identicalTo:"\u2261",indicator:H.symbols.check,leftAngle:"\u2039",mark:"\u203B",minus:"\u2212",multiplication:"\xD7",obelus:"\xF7",percent:"%",pilcrow:"\xB6",pilcrow2:"\u2761",pencilUpRight:"\u2710",pencilDownRight:"\u270E",pencilRight:"\u270F",plus:"+",plusMinus:"\xB1",pointRight:"\u261E",rightAngle:"\u203A",section:"\xA7",hexagon:{off:"\u2B21",on:"\u2B22",disabled:"\u2B22"},ballot:{on:"\u2611",off:"\u2610",disabled:"\u2612"},stars:{on:"\u2605",off:"\u2606",disabled:"\u2606"},folder:{on:"\u25BC",off:"\u25B6",disabled:"\u25B6"},prefix:{pending:H.symbols.question,submitted:H.symbols.check,cancelled:H.symbols.cross},separator:{pending:H.symbols.pointerSmall,submitted:H.symbols.middot,cancelled:H.symbols.middot},radio:{off:lt?"( )":"\u25EF",on:lt?"(*)":"\u25C9",disabled:lt?"(|)":"\u24BE"},numbers:["\u24EA","\u2460","\u2461","\u2462","\u2463","\u2464","\u2465","\u2466","\u2467","\u2468","\u2469","\u246A","\u246B","\u246C","\u246D","\u246E","\u246F","\u2470","\u2471","\u2472","\u2473","\u3251","\u3252","\u3253","\u3254","\u3255","\u3256","\u3257","\u3258","\u3259","\u325A","\u325B","\u325C","\u325D","\u325E","\u325F","\u32B1","\u32B2","\u32B3","\u32B4","\u32B5","\u32B6","\u32B7","\u32B8","\u32B9","\u32BA","\u32BB","\u32BC","\u32BD","\u32BE","\u32BF"]};dt.merge=(e)=>{let t=un.merge({},H.symbols,dt,e.symbols);return delete t.merge,t};us.exports=dt});var gs=x((Fc,fs)=>{var hn=ps(),fn=hs(),gn=C();fs.exports=(e)=>{e.options=gn.merge({},e.options.theme,e.options),e.symbols=fn.merge(e.options),e.styles=hn.merge(e.options)}});var ws=x((bs,xs)=>{var ys=process.env.TERM_PROGRAM==="Apple_Terminal",yn=se(),mt=C(),L=xs.exports=bs,ct=!1,re=L.code={bell:"\x07",beep:"\x07",beginning:"\x1B[G",down:"\x1B[J",esc:"\x1B[",getPosition:"\x1B[6n",hide:"\x1B[?25l",line:"\x1B[2K",lineEnd:"\x1B[K",lineStart:"\x1B[1K",restorePosition:"\x1B["+(ys?"8":"u"),savePosition:"\x1B["+(ys?"7":"s"),screen:"\x1B[2J",show:"\x1B[?25h",up:"\x1B[1J"},ne=L.cursor={get hidden(){return ct},hide(){return ct=!0,re.hide},show(){return ct=!1,re.show},forward:(e=1)=>`\x1B[${e}C`,backward:(e=1)=>`\x1B[${e}D`,nextLine:(e=1)=>"\x1B[E".repeat(e),prevLine:(e=1)=>"\x1B[F".repeat(e),up:(e=1)=>e?`\x1B[${e}A`:"",down:(e=1)=>e?`\x1B[${e}B`:"",right:(e=1)=>e?`\x1B[${e}C`:"",left:(e=1)=>e?`\x1B[${e}D`:"",to(e,t){return t?`\x1B[${t+1};${e+1}H`:`\x1B[${e+1}G`},move(e=0,t=0){let s="";return s+=e<0?ne.left(-e):e>0?ne.right(e):"",s+=t<0?ne.up(-t):t>0?ne.down(t):"",s},strLen(e){var t=0,s=e.length,r=-1;for(var o=0;o<s;o++)if(r=e.charCodeAt(o),r>=0&&r<=128)t+=1;else t+=2;return t},restore(e={}){let{after:t,cursor:s,initial:r,input:o,prompt:a,size:i,value:n}=e;if(r=mt.isPrimitive(r)?String(r):"",o=mt.isPrimitive(o)?String(o):"",n=mt.isPrimitive(n)?String(n):"",i){let l=L.cursor.up(i)+L.cursor.to(this.strLen(a)),d=o.length-s;if(d>0)l+=L.cursor.left(d);return l}if(n||t){let l=!o&&!!r?-this.strLen(r):-this.strLen(o)+s;if(t)l-=this.strLen(t);if(o===""&&r&&!a.includes(r))l+=this.strLen(r);return L.cursor.move(l)}}},pt=L.erase={screen:re.screen,up:re.up,down:re.down,line:re.line,lineEnd:re.lineEnd,lineStart:re.lineStart,lines(e){let t="";for(let s=0;s<e;s++)t+=L.erase.line+(s<e-1?L.cursor.up(1):"");if(e)t+=L.code.beginning;return t}};L.clear=(e="",t=process.stdout.columns)=>{if(!t)return pt.line+ne.to(0);let s=(a)=>[...yn(a)].length,r=e.split(/\r?\n/),o=0;for(let a of r)o+=1+Math.floor(Math.max(s(a)-1,0)/t);return(pt.line+ne.prevLine()).repeat(o-1)+pt.line+ne.to(0)}});var ce=x((jc,As)=>{var bn=he("events"),Es=se(),ut=at(),xn=ns(),wn=ms(),En=gs(),D=C(),le=ws();class ht extends bn{constructor(e={}){super();this.name=e.name,this.type=e.type,this.options=e,En(this),xn(this),this.state=new wn(this),this.initial=[e.initial,e.default].find((t)=>t!=null),this.stdout=e.stdout||process.stdout,this.stdin=e.stdin||process.stdin,this.scale=e.scale||1,this.term=this.options.term||process.env.TERM_PROGRAM,this.margin=Nn(this.options.margin),this.setMaxListeners(0),An(this)}async keypress(e,t={}){this.keypressed=!0;let s=ut.action(e,ut(e,t),this.options.actions);this.state.keypress=s,this.emit("keypress",e,s),this.emit("state",this.state.clone());let r=this.options[s.action]||this[s.action]||this.dispatch;if(typeof r==="function")return await r.call(this,e,s);this.alert()}alert(){if(delete this.state.alert,this.options.show===!1)this.emit("alert");else this.stdout.write(le.code.beep)}cursorHide(){this.stdout.write(le.cursor.hide());let e=D.onExit(()=>this.cursorShow());this.on("close",()=>{this.cursorShow(),e()})}cursorShow(){this.stdout.write(le.cursor.show())}write(e){if(!e)return;if(this.stdout&&this.state.show!==!1)this.stdout.write(e);this.state.buffer+=e}clear(e=0){let t=this.state.buffer;if(this.state.buffer="",!t&&!e||this.options.show===!1)return;this.stdout.write(le.cursor.down(e)+le.clear(t,this.width))}restore(){if(this.state.closed||this.options.show===!1)return;let{prompt:e,after:t,rest:s}=this.sections(),{cursor:r,initial:o="",input:a="",value:i=""}=this,n=this.state.size=s.length,l={after:t,cursor:r,initial:o,input:a,prompt:e,size:n,value:i},d=le.cursor.restore(l);if(d)this.stdout.write(d)}sections(){let{buffer:e,input:t,prompt:s}=this.state;s=Es(s);let r=Es(e),o=r.indexOf(s),a=r.slice(0,o),n=r.slice(o).split(`
7
- `),l=n[0],d=n[n.length-1],c=(s+(t?" "+t:"")).length,p=c<l.length?l.slice(c+1):"";return{header:a,prompt:l,after:p,rest:n.slice(1),last:d}}async submit(){if(this.state.submitted=!0,this.state.validating=!0,this.options.onSubmit)await this.options.onSubmit.call(this,this.name,this.value,this);let e=this.state.error||await this.validate(this.value,this.state);if(e!==!0){let t=`
3
+ var ai=Object.create;var{getPrototypeOf:ii,defineProperty:Lt,getOwnPropertyNames:ni}=Object;var li=Object.prototype.hasOwnProperty;function di(e){return this[e]}var mi,ci,te=(e,t,s)=>{var o=e!=null&&typeof e==="object";if(o){var r=t?mi??=new WeakMap:ci??=new WeakMap,a=r.get(e);if(a)return a}s=e!=null?ai(ii(e)):{};let i=t||!e||!e.__esModule?Lt(s,"default",{value:e,enumerable:!0}):s;for(let n of ni(e))if(!li.call(i,n))Lt(i,n,{get:di.bind(e,n),enumerable:!0});if(o)r.set(e,i);return i};var w=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var g=function(e,t,s,o){var r=arguments.length,a=r<3?t:o===null?o=Object.getOwnPropertyDescriptor(t,s):o,i;if(typeof Reflect==="object"&&typeof Reflect.decorate==="function")a=Reflect.decorate(e,t,s,o);else for(var n=e.length-1;n>=0;n--)if(i=e[n])a=(r<3?i(a):r>3?i(t,s,a):i(t,s))||a;return r>3&&a&&Object.defineProperty(t,s,a),a};var he=import.meta.require;var Kt=w((Bc,fe)=>{var wi=typeof process<"u"&&process.env.TERM_PROGRAM==="Hyper",xi=typeof process<"u"&&process.platform==="win32",kt=typeof process<"u"&&process.platform==="linux",rt={ballotDisabled:"\u2612",ballotOff:"\u2610",ballotOn:"\u2611",bullet:"\u2022",bulletWhite:"\u25E6",fullBlock:"\u2588",heart:"\u2764",identicalTo:"\u2261",line:"\u2500",mark:"\u203B",middot:"\xB7",minus:"\uFF0D",multiplication:"\xD7",obelus:"\xF7",pencilDownRight:"\u270E",pencilRight:"\u270F",pencilUpRight:"\u2710",percent:"%",pilcrow2:"\u2761",pilcrow:"\xB6",plusMinus:"\xB1",question:"?",section:"\xA7",starsOff:"\u2606",starsOn:"\u2605",upDownArrow:"\u2195"},Wt=Object.assign({},rt,{check:"\u221A",cross:"\xD7",ellipsisLarge:"...",ellipsis:"...",info:"i",questionSmall:"?",pointer:">",pointerSmall:"\xBB",radioOff:"( )",radioOn:"(*)",warning:"\u203C"}),qt=Object.assign({},rt,{ballotCross:"\u2718",check:"\u2714",cross:"\u2716",ellipsisLarge:"\u22EF",ellipsis:"\u2026",info:"\u2139",questionFull:"\uFF1F",questionSmall:"\uFE56",pointer:kt?"\u25B8":"\u276F",pointerSmall:kt?"\u2023":"\u203A",radioOff:"\u25EF",radioOn:"\u25C9",warning:"\u26A0"});fe.exports=xi&&!wi?Wt:qt;Reflect.defineProperty(fe.exports,"common",{enumerable:!1,value:rt});Reflect.defineProperty(fe.exports,"windows",{enumerable:!1,value:Wt});Reflect.defineProperty(fe.exports,"other",{enumerable:!1,value:qt})});var Ne=w((Lc,at)=>{var Ei=(e)=>e!==null&&typeof e==="object"&&!Array.isArray(e),Ai=/[\u001b\u009b][[\]#;?()]*(?:(?:(?:[^\W_]*;?[^\W_]*)\u0007)|(?:(?:[0-9]{1,4}(;[0-9]{0,4})*)?[~0-9=<>cf-nqrtyA-PRZ]))/g,vi=()=>{if(typeof process<"u")return process.env.FORCE_COLOR!=="0";return!1},Ht=()=>{let e={enabled:vi(),visible:!0,styles:{},keys:{}},t=(a)=>{let i=a.open=`\x1B[${a.codes[0]}m`,n=a.close=`\x1B[${a.codes[1]}m`,l=a.regex=new RegExp(`\\u001b\\[${a.codes[1]}m`,"g");return a.wrap=(d,m)=>{if(d.includes(n))d=d.replace(l,n+i);let u=i+d+n;return m?u.replace(/\r*\n/g,`${n}$&${i}`):u},a},s=(a,i,n)=>{return typeof a==="function"?a(i):a.wrap(i,n)},o=(a,i)=>{if(a===""||a==null)return"";if(e.enabled===!1)return a;if(e.visible===!1)return"";let n=""+a,l=n.includes(`
4
+ `),d=i.length;if(d>0&&i.includes("unstyle"))i=[...new Set(["unstyle",...i])].reverse();while(d-- >0)n=s(e.styles[i[d]],n,l);return n},r=(a,i,n)=>{e.styles[a]=t({name:a,codes:i}),(e.keys[n]||(e.keys[n]=[])).push(a),Reflect.defineProperty(e,a,{configurable:!0,enumerable:!0,set(d){e.alias(a,d)},get(){let d=(m)=>o(m,d.stack);return Reflect.setPrototypeOf(d,e),d.stack=this.stack?this.stack.concat(a):[a],d}})};return r("reset",[0,0],"modifier"),r("bold",[1,22],"modifier"),r("dim",[2,22],"modifier"),r("italic",[3,23],"modifier"),r("underline",[4,24],"modifier"),r("inverse",[7,27],"modifier"),r("hidden",[8,28],"modifier"),r("strikethrough",[9,29],"modifier"),r("black",[30,39],"color"),r("red",[31,39],"color"),r("green",[32,39],"color"),r("yellow",[33,39],"color"),r("blue",[34,39],"color"),r("magenta",[35,39],"color"),r("cyan",[36,39],"color"),r("white",[37,39],"color"),r("gray",[90,39],"color"),r("grey",[90,39],"color"),r("bgBlack",[40,49],"bg"),r("bgRed",[41,49],"bg"),r("bgGreen",[42,49],"bg"),r("bgYellow",[43,49],"bg"),r("bgBlue",[44,49],"bg"),r("bgMagenta",[45,49],"bg"),r("bgCyan",[46,49],"bg"),r("bgWhite",[47,49],"bg"),r("blackBright",[90,39],"bright"),r("redBright",[91,39],"bright"),r("greenBright",[92,39],"bright"),r("yellowBright",[93,39],"bright"),r("blueBright",[94,39],"bright"),r("magentaBright",[95,39],"bright"),r("cyanBright",[96,39],"bright"),r("whiteBright",[97,39],"bright"),r("bgBlackBright",[100,49],"bgBright"),r("bgRedBright",[101,49],"bgBright"),r("bgGreenBright",[102,49],"bgBright"),r("bgYellowBright",[103,49],"bgBright"),r("bgBlueBright",[104,49],"bgBright"),r("bgMagentaBright",[105,49],"bgBright"),r("bgCyanBright",[106,49],"bgBright"),r("bgWhiteBright",[107,49],"bgBright"),e.ansiRegex=Ai,e.hasColor=e.hasAnsi=(a)=>{return e.ansiRegex.lastIndex=0,typeof a==="string"&&a!==""&&e.ansiRegex.test(a)},e.alias=(a,i)=>{let n=typeof i==="string"?e[i]:i;if(typeof n!=="function")throw TypeError("Expected alias to be the name of an existing color (string) or a function");if(!n.stack)Reflect.defineProperty(n,"name",{value:a}),e.styles[a]=n,n.stack=[a];Reflect.defineProperty(e,a,{configurable:!0,enumerable:!0,set(l){e.alias(a,l)},get(){let l=(d)=>o(d,l.stack);return Reflect.setPrototypeOf(l,e),l.stack=this.stack?this.stack.concat(n.stack):n.stack,l}})},e.theme=(a)=>{if(!Ei(a))throw TypeError("Expected theme to be an object");for(let i of Object.keys(a))e.alias(i,a[i]);return e},e.alias("unstyle",(a)=>{if(typeof a==="string"&&a!=="")return e.ansiRegex.lastIndex=0,a.replace(e.ansiRegex,"");return""}),e.alias("noop",(a)=>a),e.none=e.clear=e.noop,e.stripColor=e.unstyle,e.symbols=Kt(),e.define=r,e};at.exports=Ht();at.exports.create=Ht});var R=w((Ti)=>{var Ni=Object.prototype.toString,O=Ne(),Ft=!1,ye=new Set,Vt={yellow:"blue",cyan:"red",green:"magenta",black:"white",blue:"yellow",red:"cyan",magenta:"green",white:"black"};Ti.longest=(e,t)=>{return e.reduce((s,o)=>Math.max(s,t?o[t].length:o.length),0)};Ti.hasColor=(e)=>!!e&&O.hasColor(e);var Te=Ti.isObject=(e)=>{return e!==null&&typeof e==="object"&&!Array.isArray(e)};Ti.nativeType=(e)=>{return Ni.call(e).slice(8,-1).toLowerCase().replace(/\s/g,"")};Ti.isAsyncFn=(e)=>{return Ti.nativeType(e)==="asyncfunction"};Ti.isPrimitive=(e)=>{return e!=null&&typeof e!=="object"&&typeof e!=="function"};Ti.resolve=(e,t,...s)=>{if(typeof t==="function")return t.call(e,...s);return t};Ti.scrollDown=(e=[])=>[...e.slice(1),e[0]];Ti.scrollUp=(e=[])=>[e.pop(),...e];Ti.reorder=(e=[])=>{let t=e.slice();return t.sort((s,o)=>{if(s.index>o.index)return 1;if(s.index<o.index)return-1;return 0}),t};Ti.swap=(e,t,s)=>{let o=e.length,r=s===o?0:s<0?o-1:s,a=e[t];e[t]=e[r],e[r]=a};Ti.width=(e,t=80)=>{let s=e&&e.columns?e.columns:t;if(e&&typeof e.getWindowSize==="function")s=e.getWindowSize()[0];if(process.platform==="win32")return s-1;return s};Ti.height=(e,t=20)=>{let s=e&&e.rows?e.rows:t;if(e&&typeof e.getWindowSize==="function")s=e.getWindowSize()[1];return s};Ti.wordWrap=(e,t={})=>{if(!e)return e;if(typeof t==="number")t={width:t};let{indent:s="",newline:o=`
5
+ `+s,width:r=80}=t,a=(o+s).match(/[^\S\n]/g)||[];r-=a.length;let i=`.{1,${r}}([\\s\\u200B]+|$)|[^\\s\\u200B]+?([\\s\\u200B]+|$)`,n=e.trim(),l=new RegExp(i,"g"),d=n.match(l)||[];if(d=d.map((m)=>m.replace(/\n$/,"")),t.padEnd)d=d.map((m)=>m.padEnd(r," "));if(t.padStart)d=d.map((m)=>m.padStart(r," "));return s+d.join(o)};Ti.unmute=(e)=>{let t=e.stack.find((o)=>O.keys.color.includes(o));if(t)return O[t];if(e.stack.find((o)=>o.slice(2)==="bg"))return O[t.slice(2)];return(o)=>o};Ti.pascal=(e)=>e?e[0].toUpperCase()+e.slice(1):"";Ti.inverse=(e)=>{if(!e||!e.stack)return e;let t=e.stack.find((o)=>O.keys.color.includes(o));if(t){let o=O["bg"+Ti.pascal(t)];return o?o.black:e}let s=e.stack.find((o)=>o.slice(0,2)==="bg");if(s)return O[s.slice(2).toLowerCase()]||e;return O.none};Ti.complement=(e)=>{if(!e||!e.stack)return e;let t=e.stack.find((o)=>O.keys.color.includes(o)),s=e.stack.find((o)=>o.slice(0,2)==="bg");if(t&&!s)return O[Vt[t]||t];if(s){let o=s.slice(2).toLowerCase(),r=Vt[o];if(!r)return e;return O["bg"+Ti.pascal(r)]||e}return O.none};Ti.meridiem=(e)=>{let t=e.getHours(),s=e.getMinutes(),o=t>=12?"pm":"am";t=t%12;let r=t===0?12:t,a=s<10?"0"+s:s;return r+":"+a+" "+o};Ti.set=(e={},t="",s)=>{return t.split(".").reduce((o,r,a,i)=>{let n=i.length-1>a?o[r]||{}:s;if(!Ti.isObject(n)&&a<i.length-1)n={};return o[r]=n},e)};Ti.get=(e={},t="",s)=>{let o=e[t]==null?t.split(".").reduce((r,a)=>r&&r[a],e):e[t];return o==null?s:o};Ti.mixin=(e,t)=>{if(!Te(e))return t;if(!Te(t))return e;for(let s of Object.keys(t)){let o=Object.getOwnPropertyDescriptor(t,s);if(hasOwnProperty.call(o,"value"))if(hasOwnProperty.call(e,s)&&Te(o.value)){let r=Object.getOwnPropertyDescriptor(e,s);if(Te(r.value)&&r.value!==o.value)e[s]=Ti.merge({},e[s],t[s]);else Reflect.defineProperty(e,s,o)}else Reflect.defineProperty(e,s,o);else Reflect.defineProperty(e,s,o)}return e};Ti.merge=(...e)=>{let t={};for(let s of e)Ti.mixin(t,s);return t};Ti.mixinEmitter=(e,t)=>{let s=t.constructor.prototype;for(let o of Object.keys(s)){let r=s[o];if(typeof r==="function")Ti.define(e,o,r.bind(t));else Ti.define(e,o,r)}};var Se=(e,t)=>{if(Ft)return;if(Ft=!0,ye.forEach((s)=>s()),e===!0)process.exit(128+t)},Yt=Se.bind(null,!0,15),jt=Se.bind(null,!0,2);Ti.onExit=(e)=>{if(ye.size===0)process.once("SIGTERM",Yt),process.once("SIGINT",jt),process.once("exit",Se);return ye.add(e),()=>{if(ye.delete(e),ye.size===0)process.off("SIGTERM",Yt),process.off("SIGINT",jt),process.off("exit",Se)}};Ti.define=(e,t,s)=>{Reflect.defineProperty(e,t,{value:s})};Ti.defineExport=(e,t,s)=>{let o;Reflect.defineProperty(e,t,{enumerable:!0,configurable:!0,set(r){o=r},get(){return o?o():s()}})}});var Jt=w((Gc,Xt)=>{Xt.exports=({onlyFirst:e=!1}={})=>{let t=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(t,e?void 0:"g")}});var se=w(($c,es)=>{var zi=Jt();es.exports=(e)=>typeof e==="string"?e.replace(zi(),""):e});var ts=w((Zi)=>{Zi.ctrl={a:"first",b:"backward",c:"cancel",d:"deleteForward",e:"last",f:"forward",g:"reset",i:"tab",k:"cutForward",l:"reset",n:"newItem",m:"cancel",j:"submit",p:"search",r:"remove",s:"save",u:"undo",w:"cutLeft",x:"toggleCursor",v:"paste"};Zi.shift={up:"shiftUp",down:"shiftDown",left:"shiftLeft",right:"shiftRight",tab:"prev"};Zi.fn={up:"pageUp",down:"pageDown",left:"pageLeft",right:"pageRight",delete:"deleteForward"};Zi.option={b:"backward",f:"forward",d:"cutRight",left:"cutLeft",up:"altUp",down:"altDown"};Zi.keys={pageup:"pageUp",pagedown:"pageDown",home:"home",end:"end",cancel:"cancel",delete:"deleteForward",backspace:"delete",down:"down",enter:"submit",escape:"cancel",left:"left",space:"space",number:"number",return:"submit",right:"right",tab:"next",up:"up"}});var os=w((Wc,ss)=>{ss.exports=class{_queue=[];_executing=!1;_jobRunner=null;constructor(t){this._jobRunner=t}enqueue=(...t)=>{this._queue.push(t),this._dequeue()};destroy(){this._queue.length=0,this._jobRunner=null}_dequeue(){if(this._executing||!this._queue.length)return;this._executing=!0,this._jobRunner(...this._queue.shift()),setTimeout(()=>{this._executing=!1,this._dequeue()})}}});var nt=w((qc,as)=>{var rs=he("readline"),sn=ts(),on=os(),rn=/^(?:\x1b)([a-zA-Z0-9])$/,an=/^(?:\x1b+)(O|N|\[|\[\[)(?:(\d+)(?:;(\d+))?([~^$])|(?:1;)?(\d+)?([a-zA-Z]))/,nn={OP:"f1",OQ:"f2",OR:"f3",OS:"f4","[11~":"f1","[12~":"f2","[13~":"f3","[14~":"f4","[[A":"f1","[[B":"f2","[[C":"f3","[[D":"f4","[[E":"f5","[15~":"f5","[17~":"f6","[18~":"f7","[19~":"f8","[20~":"f9","[21~":"f10","[23~":"f11","[24~":"f12","[A":"up","[B":"down","[C":"right","[D":"left","[E":"clear","[F":"end","[H":"home",OA:"up",OB:"down",OC:"right",OD:"left",OE:"clear",OF:"end",OH:"home","[1~":"home","[2~":"insert","[3~":"delete","[4~":"end","[5~":"pageup","[6~":"pagedown","[[5~":"pageup","[[6~":"pagedown","[7~":"home","[8~":"end","[a":"up","[b":"down","[c":"right","[d":"left","[e":"clear","[2$":"insert","[3$":"delete","[5$":"pageup","[6$":"pagedown","[7$":"home","[8$":"end",Oa:"up",Ob:"down",Oc:"right",Od:"left",Oe:"clear","[2^":"insert","[3^":"delete","[5^":"pageup","[6^":"pagedown","[7^":"home","[8^":"end","[Z":"tab"};function ln(e){return["[a","[b","[c","[d","[e","[2$","[3$","[5$","[6$","[7$","[8$","[Z"].includes(e)}function dn(e){return["Oa","Ob","Oc","Od","Oe","[2^","[3^","[5^","[6^","[7^","[8^"].includes(e)}var Ce=(e="",t={})=>{let s,o={name:t.name,ctrl:!1,meta:!1,shift:!1,option:!1,sequence:e,raw:e,...t};if(Buffer.isBuffer(e))if(e[0]>127&&e[1]===void 0)e[0]-=128,e="\x1B"+String(e);else e=String(e);else if(e!==void 0&&typeof e!=="string")e=String(e);else if(!e)e=o.sequence||"";if(o.sequence=o.sequence||e||o.name,e==="\r")o.raw=void 0,o.name="return";else if(e===`
6
+ `)o.name="enter";else if(e==="\t")o.name="tab";else if(e==="\b"||e==="\x7F"||e==="\x1B\x7F"||e==="\x1B\b")o.name="backspace",o.meta=e.charAt(0)==="\x1B";else if(e==="\x1B"||e==="\x1B\x1B")o.name="escape",o.meta=e.length===2;else if(e===" "||e==="\x1B ")o.name="space",o.meta=e.length===2;else if(e<="\x1A")o.name=String.fromCharCode(e.charCodeAt(0)+97-1),o.ctrl=!0;else if(e.length===1&&e>="0"&&e<="9")o.name="number";else if(e.length===1&&e>="a"&&e<="z")o.name=e;else if(e.length===1&&e>="A"&&e<="Z")o.name=e.toLowerCase(),o.shift=!0;else if(s=rn.exec(e))o.meta=!0,o.shift=/^[A-Z]$/.test(s[1]);else if(s=an.exec(e)){let r=[...e];if(r[0]==="\x1B"&&r[1]==="\x1B")o.option=!0;let a=[s[1],s[2],s[4],s[6]].filter(Boolean).join(""),i=(s[3]||s[5]||1)-1;o.ctrl=!!(i&4),o.meta=!!(i&10),o.shift=!!(i&1),o.code=a,o.name=nn[a],o.shift=ln(a)||o.shift,o.ctrl=dn(a)||o.ctrl}return o};Ce.listen=(e={},t)=>{let{stdin:s}=e;if(!s||s!==process.stdin&&!s.isTTY)throw Error("Invalid stream passed");let o=rs.createInterface({terminal:!0,input:s});rs.emitKeypressEvents(s,o);let r=new on((n,l)=>t(n,Ce(n,l),o)),a=s.isRaw;if(s.isTTY)s.setRawMode(!0);return s.on("keypress",r.enqueue),o.resume(),()=>{if(s.isTTY)s.setRawMode(a);s.removeListener("keypress",r.enqueue),r.destroy(),o.pause(),o.close()}};Ce.action=(e,t,s)=>{let o={...sn,...s};if(t.ctrl)return t.action=o.ctrl[t.name],t;if(t.option&&o.option)return t.action=o.option[t.name],t;if(t.shift)return t.action=o.shift[t.name],t;return t.action=o.keys[t.name],t};as.exports=Ce});var ns=w((Kc,is)=>{is.exports=(e)=>{e.timers=e.timers||{};let t=e.options.timers;if(!t)return;for(let s of Object.keys(t)){let o=t[s];if(typeof o==="number")o={interval:o};mn(e,s,o)}};function mn(e,t,s={}){let o=e.timers[t]={name:t,start:Date.now(),ms:0,tick:0},r=s.interval||120;o.frames=s.frames||[],o.loading=!0;let a=setInterval(()=>{o.ms=Date.now()-o.start,o.tick++,e.render()},r);return o.stop=()=>{o.loading=!1,clearInterval(a)},Reflect.defineProperty(o,"interval",{value:a}),e.once("close",()=>o.stop()),o.stop}});var ms=w((Hc,ds)=>{var{define:cn,width:pn}=R();class ls{constructor(e){let t=e.options;cn(this,"_prompt",e),this.type=e.type,this.name=e.name,this.message="",this.header="",this.footer="",this.error="",this.hint="",this.input="",this.cursor=0,this.index=0,this.lines=0,this.tick=0,this.prompt="",this.buffer="",this.width=pn(t.stdout||process.stdout),Object.assign(this,t),this.name=this.name||this.message,this.message=this.message||this.name,this.symbols=e.symbols,this.styles=e.styles,this.required=new Set,this.cancelled=!1,this.submitted=!1}clone(){let e={...this};return e.status=this.status,e.buffer=Buffer.from(e.buffer),delete e.clone,e}set color(e){this._color=e}get color(){let e=this.prompt.styles;if(this.cancelled)return e.cancelled;if(this.submitted)return e.submitted;let t=this._color||e[this.status];return typeof t==="function"?t:e.pending}set loading(e){this._loading=e}get loading(){if(typeof this._loading==="boolean")return this._loading;if(this.loadingChoices)return"choices";return!1}get status(){if(this.cancelled)return"cancelled";if(this.submitted)return"submitted";return"pending"}}ds.exports=ls});var ps=w((Fc,cs)=>{var lt=R(),C=Ne(),dt={default:C.noop,noop:C.noop,set inverse(e){this._inverse=e},get inverse(){return this._inverse||lt.inverse(this.primary)},set complement(e){this._complement=e},get complement(){return this._complement||lt.complement(this.primary)},primary:C.cyan,success:C.green,danger:C.magenta,strong:C.bold,warning:C.yellow,muted:C.dim,disabled:C.gray,dark:C.dim.gray,underline:C.underline,set info(e){this._info=e},get info(){return this._info||this.primary},set em(e){this._em=e},get em(){return this._em||this.primary.underline},set heading(e){this._heading=e},get heading(){return this._heading||this.muted.underline},set pending(e){this._pending=e},get pending(){return this._pending||this.primary},set submitted(e){this._submitted=e},get submitted(){return this._submitted||this.success},set cancelled(e){this._cancelled=e},get cancelled(){return this._cancelled||this.danger},set typing(e){this._typing=e},get typing(){return this._typing||this.dim},set placeholder(e){this._placeholder=e},get placeholder(){return this._placeholder||this.primary.dim},set highlight(e){this._highlight=e},get highlight(){return this._highlight||this.inverse}};dt.merge=(e={})=>{if(e.styles&&typeof e.styles.enabled==="boolean")C.enabled=e.styles.enabled;if(e.styles&&typeof e.styles.visible==="boolean")C.visible=e.styles.visible;let t=lt.merge({},dt,e.styles);delete t.merge;for(let s of Object.keys(C))if(!hasOwnProperty.call(t,s))Reflect.defineProperty(t,s,{get:()=>C[s]});for(let s of Object.keys(C.styles))if(!hasOwnProperty.call(t,s))Reflect.defineProperty(t,s,{get:()=>C[s]});return t};cs.exports=dt});var hs=w((Vc,us)=>{var mt=process.platform==="win32",H=Ne(),un=R(),ct={...H.symbols,upDownDoubleArrow:"\u21D5",upDownDoubleArrow2:"\u2B0D",upDownArrow:"\u2195",asterisk:"*",asterism:"\u2042",bulletWhite:"\u25E6",electricArrow:"\u2301",ellipsisLarge:"\u22EF",ellipsisSmall:"\u2026",fullBlock:"\u2588",identicalTo:"\u2261",indicator:H.symbols.check,leftAngle:"\u2039",mark:"\u203B",minus:"\u2212",multiplication:"\xD7",obelus:"\xF7",percent:"%",pilcrow:"\xB6",pilcrow2:"\u2761",pencilUpRight:"\u2710",pencilDownRight:"\u270E",pencilRight:"\u270F",plus:"+",plusMinus:"\xB1",pointRight:"\u261E",rightAngle:"\u203A",section:"\xA7",hexagon:{off:"\u2B21",on:"\u2B22",disabled:"\u2B22"},ballot:{on:"\u2611",off:"\u2610",disabled:"\u2612"},stars:{on:"\u2605",off:"\u2606",disabled:"\u2606"},folder:{on:"\u25BC",off:"\u25B6",disabled:"\u25B6"},prefix:{pending:H.symbols.question,submitted:H.symbols.check,cancelled:H.symbols.cross},separator:{pending:H.symbols.pointerSmall,submitted:H.symbols.middot,cancelled:H.symbols.middot},radio:{off:mt?"( )":"\u25EF",on:mt?"(*)":"\u25C9",disabled:mt?"(|)":"\u24BE"},numbers:["\u24EA","\u2460","\u2461","\u2462","\u2463","\u2464","\u2465","\u2466","\u2467","\u2468","\u2469","\u246A","\u246B","\u246C","\u246D","\u246E","\u246F","\u2470","\u2471","\u2472","\u2473","\u3251","\u3252","\u3253","\u3254","\u3255","\u3256","\u3257","\u3258","\u3259","\u325A","\u325B","\u325C","\u325D","\u325E","\u325F","\u32B1","\u32B2","\u32B3","\u32B4","\u32B5","\u32B6","\u32B7","\u32B8","\u32B9","\u32BA","\u32BB","\u32BC","\u32BD","\u32BE","\u32BF"]};ct.merge=(e)=>{let t=un.merge({},H.symbols,ct,e.symbols);return delete t.merge,t};us.exports=ct});var ys=w((Yc,fs)=>{var hn=ps(),fn=hs(),yn=R();fs.exports=(e)=>{e.options=yn.merge({},e.options.theme,e.options),e.symbols=fn.merge(e.options),e.styles=hn.merge(e.options)}});var xs=w((bs,ws)=>{var gs=process.env.TERM_PROGRAM==="Apple_Terminal",gn=se(),pt=R(),B=ws.exports=bs,ut=!1,oe=B.code={bell:"\x07",beep:"\x07",beginning:"\x1B[G",down:"\x1B[J",esc:"\x1B[",getPosition:"\x1B[6n",hide:"\x1B[?25l",line:"\x1B[2K",lineEnd:"\x1B[K",lineStart:"\x1B[1K",restorePosition:"\x1B["+(gs?"8":"u"),savePosition:"\x1B["+(gs?"7":"s"),screen:"\x1B[2J",show:"\x1B[?25h",up:"\x1B[1J"},ne=B.cursor={get hidden(){return ut},hide(){return ut=!0,oe.hide},show(){return ut=!1,oe.show},forward:(e=1)=>`\x1B[${e}C`,backward:(e=1)=>`\x1B[${e}D`,nextLine:(e=1)=>"\x1B[E".repeat(e),prevLine:(e=1)=>"\x1B[F".repeat(e),up:(e=1)=>e?`\x1B[${e}A`:"",down:(e=1)=>e?`\x1B[${e}B`:"",right:(e=1)=>e?`\x1B[${e}C`:"",left:(e=1)=>e?`\x1B[${e}D`:"",to(e,t){return t?`\x1B[${t+1};${e+1}H`:`\x1B[${e+1}G`},move(e=0,t=0){let s="";return s+=e<0?ne.left(-e):e>0?ne.right(e):"",s+=t<0?ne.up(-t):t>0?ne.down(t):"",s},strLen(e){var t=0,s=e.length,o=-1;for(var r=0;r<s;r++)if(o=e.charCodeAt(r),o>=0&&o<=128)t+=1;else t+=2;return t},restore(e={}){let{after:t,cursor:s,initial:o,input:r,prompt:a,size:i,value:n}=e;if(o=pt.isPrimitive(o)?String(o):"",r=pt.isPrimitive(r)?String(r):"",n=pt.isPrimitive(n)?String(n):"",i){let l=B.cursor.up(i)+B.cursor.to(this.strLen(a)),d=r.length-s;if(d>0)l+=B.cursor.left(d);return l}if(n||t){let l=!r&&!!o?-this.strLen(o):-this.strLen(r)+s;if(t)l-=this.strLen(t);if(r===""&&o&&!a.includes(o))l+=this.strLen(o);return B.cursor.move(l)}}},ht=B.erase={screen:oe.screen,up:oe.up,down:oe.down,line:oe.line,lineEnd:oe.lineEnd,lineStart:oe.lineStart,lines(e){let t="";for(let s=0;s<e;s++)t+=B.erase.line+(s<e-1?B.cursor.up(1):"");if(e)t+=B.code.beginning;return t}};B.clear=(e="",t=process.stdout.columns)=>{if(!t)return ht.line+ne.to(0);let s=(a)=>[...gn(a)].length,o=e.split(/\r?\n/),r=0;for(let a of o)r+=1+Math.floor(Math.max(s(a)-1,0)/t);return(ht.line+ne.prevLine()).repeat(r-1)+ht.line+ne.to(0)}});var ce=w((jc,As)=>{var bn=he("events"),Es=se(),ft=nt(),wn=ns(),xn=ms(),En=ys(),D=R(),le=xs();class yt extends bn{constructor(e={}){super();this.name=e.name,this.type=e.type,this.options=e,En(this),wn(this),this.state=new xn(this),this.initial=[e.initial,e.default].find((t)=>t!=null),this.stdout=e.stdout||process.stdout,this.stdin=e.stdin||process.stdin,this.scale=e.scale||1,this.term=this.options.term||process.env.TERM_PROGRAM,this.margin=vn(this.options.margin),this.setMaxListeners(0),An(this)}async keypress(e,t={}){this.keypressed=!0;let s=ft.action(e,ft(e,t),this.options.actions);this.state.keypress=s,this.emit("keypress",e,s),this.emit("state",this.state.clone());let o=this.options[s.action]||this[s.action]||this.dispatch;if(typeof o==="function")return await o.call(this,e,s);this.alert()}alert(){if(delete this.state.alert,this.options.show===!1)this.emit("alert");else this.stdout.write(le.code.beep)}cursorHide(){this.stdout.write(le.cursor.hide());let e=D.onExit(()=>this.cursorShow());this.on("close",()=>{this.cursorShow(),e()})}cursorShow(){this.stdout.write(le.cursor.show())}write(e){if(!e)return;if(this.stdout&&this.state.show!==!1)this.stdout.write(e);this.state.buffer+=e}clear(e=0){let t=this.state.buffer;if(this.state.buffer="",!t&&!e||this.options.show===!1)return;this.stdout.write(le.cursor.down(e)+le.clear(t,this.width))}restore(){if(this.state.closed||this.options.show===!1)return;let{prompt:e,after:t,rest:s}=this.sections(),{cursor:o,initial:r="",input:a="",value:i=""}=this,n=this.state.size=s.length,l={after:t,cursor:o,initial:r,input:a,prompt:e,size:n,value:i},d=le.cursor.restore(l);if(d)this.stdout.write(d)}sections(){let{buffer:e,input:t,prompt:s}=this.state;s=Es(s);let o=Es(e),r=o.indexOf(s),a=o.slice(0,r),n=o.slice(r).split(`
7
+ `),l=n[0],d=n[n.length-1],u=(s+(t?" "+t:"")).length,p=u<l.length?l.slice(u+1):"";return{header:a,prompt:l,after:p,rest:n.slice(1),last:d}}async submit(){if(this.state.submitted=!0,this.state.validating=!0,this.options.onSubmit)await this.options.onSubmit.call(this,this.name,this.value,this);let e=this.state.error||await this.validate(this.value,this.state);if(e!==!0){let t=`
8
8
  `+this.symbols.pointer+" ";if(typeof e==="string")t+=e.trim();else t+="Invalid input";this.state.error=`
9
9
  `+this.styles.danger(t),this.state.submitted=!1,await this.render(),await this.alert(),this.state.validating=!1,this.state.error=void 0;return}this.state.validating=!1,await this.render(),await this.close(),this.value=await this.result(this.value),this.emit("submit",this.value)}async cancel(e){if(this.state.cancelled=this.state.submitted=!0,await this.render(),await this.close(),typeof this.options.onCancel==="function")await this.options.onCancel.call(this,this.name,this.value,this);this.emit("cancel",await this.error(e))}async close(){this.state.closed=!0;try{let e=this.sections(),t=Math.ceil(e.prompt.length/this.width);if(e.rest)this.write(le.cursor.down(e.rest.length));this.write(`
10
- `.repeat(t))}catch(e){}this.emit("close")}start(){if(!this.stop&&this.options.show!==!1)this.stop=ut.listen(this,this.keypress.bind(this)),this.once("close",this.stop),this.emit("start",this)}async skip(){if(this.skipped=this.options.skip===!0,typeof this.options.skip==="function")this.skipped=await this.options.skip.call(this,this.name,this.value);return this.skipped}async initialize(){let{format:e,options:t,result:s}=this;if(this.format=()=>e.call(this,this.value),this.result=()=>s.call(this,this.value),typeof t.initial==="function")this.initial=await t.initial.call(this,this);if(typeof t.onRun==="function")await t.onRun.call(this,this);if(typeof t.onSubmit==="function"){let r=t.onSubmit.bind(this),o=this.submit.bind(this);delete this.options.onSubmit,this.submit=async()=>{return await r(this.name,this.value,this),o()}}await this.start(),await this.render()}render(){throw Error("expected prompt to have a custom render method")}run(){return new Promise(async(e,t)=>{if(this.once("submit",e),this.once("cancel",t),await this.skip())return this.render=()=>{},this.submit();await this.initialize(),this.emit("run")})}async element(e,t,s){let{options:r,state:o,symbols:a,timers:i}=this,n=i&&i[e];o.timer=n;let l=r[e]||o[e]||a[e],d=t&&t[e]!=null?t[e]:await l;if(d==="")return d;let u=await this.resolve(d,o,t,s);if(!u&&t&&t[e])return this.resolve(l,o,t,s);return u}async prefix(){let e=await this.element("prefix")||this.symbols,t=this.timers&&this.timers.prefix,s=this.state;if(s.timer=t,D.isObject(e))e=e[s.status]||e.pending;if(!D.hasColor(e))return(this.styles[s.status]||this.styles.pending)(e);return e}async message(){let e=await this.element("message");if(!D.hasColor(e))return this.styles.strong(e);return e}async separator(){let e=await this.element("separator")||this.symbols,t=this.timers&&this.timers.separator,s=this.state;s.timer=t;let r=e[s.status]||e.pending||s.separator,o=await this.resolve(r,s);if(D.isObject(o))o=o[s.status]||o.pending;if(!D.hasColor(o))return this.styles.muted(o);return o}async pointer(e,t){let s=await this.element("pointer",e,t);if(typeof s==="string"&&D.hasColor(s))return s;if(s){let r=this.styles,o=this.index===t,a=o?r.primary:(l)=>l,i=await this.resolve(s[o?"on":"off"]||s,this.state),n=!D.hasColor(i)?a(i):i;return o?n:" ".repeat(i.length)}}async indicator(e,t){let s=await this.element("indicator",e,t);if(typeof s==="string"&&D.hasColor(s))return s;if(s){let r=this.styles,o=e.enabled===!0,a=o?r.success:r.dark,i=s[o?"on":"off"]||s;return!D.hasColor(i)?a(i):i}return""}body(){return null}footer(){if(this.state.status==="pending")return this.element("footer")}header(){if(this.state.status==="pending")return this.element("header")}async hint(){if(this.state.status==="pending"&&!this.isValue(this.state.input)){let e=await this.element("hint");if(!D.hasColor(e))return this.styles.muted(e);return e}}error(e){return!this.state.submitted?e||this.state.error:""}format(e){return e}result(e){return e}validate(e){if(this.options.required===!0)return this.isValue(e);return!0}isValue(e){return e!=null&&e!==""}resolve(e,...t){return D.resolve(this,e,...t)}get base(){return ht.prototype}get style(){return this.styles[this.state.status]}get height(){return this.options.rows||D.height(this.stdout,25)}get width(){return this.options.columns||D.width(this.stdout,80)}get size(){return{width:this.width,height:this.height}}set cursor(e){this.state.cursor=e}get cursor(){return this.state.cursor}set input(e){this.state.input=e}get input(){return this.state.input}set value(e){this.state.value=e}get value(){let{input:e,value:t}=this.state,s=[t,e].find(this.isValue.bind(this));return this.isValue(s)?s:this.initial}static get prompt(){return(e)=>new this(e).run()}}function An(e){let t=(o)=>{return e[o]===void 0||typeof e[o]==="function"},s=["actions","choices","initial","margin","roles","styles","symbols","theme","timers","value"],r=["body","footer","error","header","hint","indicator","message","prefix","separator","skip"];for(let o of Object.keys(e.options)){if(s.includes(o))continue;if(/^on[A-Z]/.test(o))continue;let a=e.options[o];if(typeof a==="function"&&t(o)){if(!r.includes(o))e[o]=a.bind(e)}else if(typeof e[o]!=="function")e[o]=a}}function Nn(e){if(typeof e==="number")e=[e,e,e,e];let t=[].concat(e||[]),s=(o)=>o%2===0?`
11
- `:" ",r=[];for(let o=0;o<4;o++){let a=s(o);if(t[o])r.push(a.repeat(t[o]));else r.push("")}return r}As.exports=ht});var Ts=x((zc,vs)=>{var vn=C(),Ns={default(e,t){return t},checkbox(e,t){throw Error("checkbox role is not implemented yet")},editable(e,t){throw Error("editable role is not implemented yet")},expandable(e,t){throw Error("expandable role is not implemented yet")},heading(e,t){return t.disabled="",t.indicator=[t.indicator," "].find((s)=>s!=null),t.message=t.message||"",t},input(e,t){throw Error("input role is not implemented yet")},option(e,t){return Ns.default(e,t)},radio(e,t){throw Error("radio role is not implemented yet")},separator(e,t){return t.disabled="",t.indicator=[t.indicator," "].find((s)=>s!=null),t.message=t.message||e.symbols.line.repeat(5),t},spacer(e,t){return t}};vs.exports=(e,t={})=>{let s=vn.merge({},Ns,t.roles);return s[e]||s.default}});var ye=x((Zc,Cs)=>{var Tn=se(),Sn=ce(),Mn=Ts(),Re=C(),{reorder:ft,scrollUp:Rn,scrollDown:Cn,isObject:Ss,swap:_n}=Re;class Rs extends Sn{constructor(e){super(e);this.cursorHide(),this.maxSelected=e.maxSelected||1/0,this.multiple=e.multiple||!1,this.initial=e.initial||0,this.delay=e.delay||0,this.longest=0,this.num=""}async initialize(){if(typeof this.options.initial==="function")this.initial=await this.options.initial.call(this);await this.reset(!0),await super.initialize()}async reset(){let{choices:e,initial:t,autofocus:s,suggest:r}=this.options;if(this.state._choices=[],this.state.choices=[],this.choices=await Promise.all(await this.toChoices(e)),this.choices.forEach((o)=>o.enabled=!1),typeof r!=="function"&&this.selectable.length===0)throw Error("At least one choice must be selectable");if(Ss(t))t=Object.keys(t);if(Array.isArray(t)){if(s!=null)this.index=this.findIndex(s);t.forEach((o)=>this.enable(this.find(o))),await this.render()}else{if(s!=null)t=s;if(typeof t==="string")t=this.findIndex(t);if(typeof t==="number"&&t>-1)this.index=Math.max(0,Math.min(t,this.choices.length)),this.enable(this.find(this.index))}if(this.isDisabled(this.focused))await this.down()}async toChoices(e,t){this.state.loadingChoices=!0;let s=[],r=0,o=async(a,i)=>{if(typeof a==="function")a=await a.call(this);if(a instanceof Promise)a=await a;for(let n=0;n<a.length;n++){let l=a[n]=await this.toChoice(a[n],r++,i);if(s.push(l),l.choices)await o(l.choices,l)}return s};return o(e,t).then((a)=>{return this.state.loadingChoices=!1,a})}async toChoice(e,t,s){if(typeof e==="function")e=await e.call(this,this);if(e instanceof Promise)e=await e;if(typeof e==="string")e={name:e};if(e.normalized)return e;e.normalized=!0;let r=e.value;if(e=Mn(e.role,this.options)(this,e),typeof e.disabled==="string"&&!e.hint)e.hint=e.disabled,e.disabled=!0;if(e.disabled===!0&&e.hint==null)e.hint="(disabled)";if(e.index!=null)return e;if(e.name=e.name||e.key||e.title||e.value||e.message,e.message=e.message||e.name||"",e.value=[e.value,e.name].find(this.isValue.bind(this)),e.input="",e.index=t,e.cursor=0,Re.define(e,"parent",s),e.level=s?s.level+1:1,e.indent==null)e.indent=s?s.indent+" ":e.indent||"";if(e.path=s?s.path+"."+e.name:e.name,e.enabled=!!(this.multiple&&!this.isDisabled(e)&&(e.enabled||this.isSelected(e))),!this.isDisabled(e))this.longest=Math.max(this.longest,Tn(e.message).length);let a={...e};if(e.reset=(i=a.input,n=a.value)=>{for(let l of Object.keys(a))e[l]=a[l];e.input=i,e.value=n},r==null&&typeof e.initial==="function")e.input=await e.initial.call(this,this.state,e,t);return e}async onChoice(e,t){if(this.emit("choice",e,t,this),typeof e.onChoice==="function")await e.onChoice.call(this,this.state,e,t)}async addChoice(e,t,s){let r=await this.toChoice(e,t,s);return this.choices.push(r),this.index=this.choices.length-1,this.limit=this.choices.length,r}async newItem(e,t,s){let r={name:"New choice name?",editable:!0,newChoice:!0,...e},o=await this.addChoice(r,t,s);return o.updateChoice=()=>{delete o.newChoice,o.name=o.message=o.input,o.input="",o.cursor=0},this.render()}indent(e){if(e.indent==null)return e.level>1?" ".repeat(e.level-1):"";return e.indent}dispatch(e,t){if(this.multiple&&this[t.name])return this[t.name]();this.alert()}focus(e,t){if(typeof t!=="boolean")t=e.enabled;if(t&&!e.enabled&&this.selected.length>=this.maxSelected)return this.alert();return this.index=e.index,e.enabled=t&&!this.isDisabled(e),e}space(){if(!this.multiple)return this.alert();if(!this.focused)return;return this.toggle(this.focused),this.render()}a(){if(this.maxSelected<this.choices.length)return this.alert();let e=this.selectable.every((t)=>t.enabled);return this.choices.forEach((t)=>t.enabled=!e),this.render()}i(){if(this.choices.length-this.selected.length>this.maxSelected)return this.alert();return this.choices.forEach((e)=>e.enabled=!e.enabled),this.render()}g(){if(!this.choices.some((t)=>!!t.parent))return this.a();let e=this.focused;return this.toggle(e.parent&&!e.choices?e.parent:e),this.render()}toggle(e,t){if(!e.enabled&&this.selected.length>=this.maxSelected)return this.alert();if(typeof t!=="boolean")t=!e.enabled;if(e.enabled=t,e.choices)e.choices.forEach((r)=>this.toggle(r,t));let s=e.parent;while(s){let r=s.choices.filter((o)=>this.isDisabled(o));s.enabled=r.every((o)=>o.enabled===!0),s=s.parent}return Ms(this,this.choices),this.emit("toggle",e,this),e}enable(e){if(this.selected.length>=this.maxSelected)return this.alert();return e.enabled=!this.isDisabled(e),e.choices&&e.choices.forEach(this.enable.bind(this)),e}disable(e){return e.enabled=!1,e.choices&&e.choices.forEach(this.disable.bind(this)),e}number(e){this.num+=e;let t=(s)=>{let r=Number(s);if(r>this.choices.length-1)return this.alert();let o=this.focused,a=this.choices.find((i)=>r===i.index);if(!a.enabled&&this.selected.length>=this.maxSelected)return this.alert();if(this.visible.indexOf(a)===-1){let i=ft(this.choices),n=i.indexOf(a);if(o.index>n){let l=i.slice(n,n+this.limit),d=i.filter((u)=>!l.includes(u));this.choices=l.concat(d)}else{let l=n-this.limit+1;this.choices=i.slice(l).concat(i.slice(0,l))}}return this.index=this.choices.indexOf(a),this.toggle(this.focused),this.render()};return clearTimeout(this.numberTimeout),new Promise((s)=>{let r=this.choices.length,o=this.num,a=(i=!1,n)=>{if(clearTimeout(this.numberTimeout),i)n=t(o);this.num="",s(n)};if(o==="0"||o.length===1&&Number(o+"0")>r)return a(!0);if(Number(o)>r)return a(!1,this.alert());this.numberTimeout=setTimeout(()=>a(!0),this.delay)})}home(){return this.choices=ft(this.choices),this.index=0,this.render()}end(){let e=this.choices.length-this.limit,t=ft(this.choices);return this.choices=t.slice(e).concat(t.slice(0,e)),this.index=this.limit-1,this.render()}first(){return this.index=0,this.render()}last(){return this.index=this.visible.length-1,this.render()}prev(){if(this.visible.length<=1)return this.alert();return this.up()}next(){if(this.visible.length<=1)return this.alert();return this.down()}right(){if(this.cursor>=this.input.length)return this.alert();return this.cursor++,this.render()}left(){if(this.cursor<=0)return this.alert();return this.cursor--,this.render()}up(){let e=this.choices.length,t=this.visible.length,s=this.index;if(this.options.scroll===!1&&s===0)return this.alert();if(e>t&&s===0)return this.scrollUp();if(this.index=(s-1%e+e)%e,this.isDisabled()&&!this.allChoicesAreDisabled())return this.up();return this.render()}down(){let e=this.choices.length,t=this.visible.length,s=this.index;if(this.options.scroll===!1&&s===t-1)return this.alert();if(e>t&&s===t-1)return this.scrollDown();if(this.index=(s+1)%e,this.isDisabled()&&!this.allChoicesAreDisabled())return this.down();return this.render()}scrollUp(e=0){if(this.choices=Rn(this.choices),this.index=e,this.isDisabled())return this.up();return this.render()}scrollDown(e=this.visible.length-1){if(this.choices=Cn(this.choices),this.index=e,this.isDisabled())return this.down();return this.render()}async shiftUp(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index-1),await this.up(),this.sorting=!1;return}return this.scrollUp(this.index)}async shiftDown(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index+1),await this.down(),this.sorting=!1;return}return this.scrollDown(this.index)}pageUp(){if(this.visible.length<=1)return this.alert();if(this.limit=Math.max(this.limit-1,0),this.index=Math.min(this.limit-1,this.index),this._limit=this.limit,this.isDisabled())return this.up();return this.render()}pageDown(){if(this.visible.length>=this.choices.length)return this.alert();if(this.index=Math.max(0,this.index),this.limit=Math.min(this.limit+1,this.choices.length),this._limit=this.limit,this.isDisabled())return this.down();return this.render()}swap(e){_n(this.choices,this.index,e)}allChoicesAreDisabled(e=this.choices){return e.every((t)=>this.isDisabled(t))}isDisabled(e=this.focused){if(e&&["disabled","collapsed","hidden","completing","readonly"].some((s)=>e[s]===!0))return!0;return e&&e.role==="heading"}isEnabled(e=this.focused){if(Array.isArray(e))return e.every((t)=>this.isEnabled(t));if(e.choices){let t=e.choices.filter((s)=>!this.isDisabled(s));return e.enabled&&t.every((s)=>this.isEnabled(s))}return e.enabled&&!this.isDisabled(e)}isChoice(e,t){return e.name===t||e.index===Number(t)}isSelected(e){if(Array.isArray(this.initial))return this.initial.some((t)=>this.isChoice(e,t));return this.isChoice(e,this.initial)}map(e=[],t="value"){return[].concat(e||[]).reduce((s,r)=>{return s[r]=this.find(r,t),s},{})}filter(e,t){let r=typeof e==="function"?e:(i,n)=>[i.name,n].includes(e),a=(this.options.multiple?this.state._choices:this.choices).filter(r);if(t)return a.map((i)=>i[t]);return a}find(e,t){if(Ss(e))return t?e[t]:e;let r=typeof e==="function"?e:(a,i)=>[a.name,i].includes(e),o=this.choices.find(r);if(o)return t?o[t]:o}findIndex(e){return this.choices.indexOf(this.find(e))}async submit(){let e=this.focused;if(!e)return this.alert();if(e.newChoice){if(!e.input)return this.alert();return e.updateChoice(),this.render()}if(this.choices.some((a)=>a.newChoice))return this.alert();let{reorder:t,sort:s}=this.options,r=this.multiple===!0,o=this.selected;if(o===void 0)return this.alert();if(Array.isArray(o)&&t!==!1&&s!==!0)o=Re.reorder(o);return this.value=r?o.map((a)=>a.name):o.name,super.submit()}set choices(e=[]){this.state._choices=this.state._choices||[],this.state.choices=e;for(let t of e)if(!this.state._choices.some((s)=>s.name===t.name))this.state._choices.push(t);if(!this._initial&&this.options.initial){this._initial=!0;let t=this.initial;if(typeof t==="string"||typeof t==="number"){let s=this.find(t);if(s)this.initial=s.index,this.focus(s,!0)}}}get choices(){return Ms(this,this.state.choices||[])}set visible(e){this.state.visible=e}get visible(){return(this.state.visible||this.choices).slice(0,this.limit)}set limit(e){this.state.limit=e}get limit(){let{state:e,options:t,choices:s}=this,r=e.limit||this._limit||t.limit||s.length;return Math.min(r,this.height)}set value(e){super.value=e}get value(){if(typeof super.value!=="string"&&super.value===this.initial)return this.input;return super.value}set index(e){this.state.index=e}get index(){return Math.max(0,this.state?this.state.index:0)}get enabled(){return this.filter(this.isEnabled.bind(this))}get focused(){let e=this.choices[this.index];if(e&&this.state.submitted&&this.multiple!==!0)e.enabled=!0;return e}get selectable(){return this.choices.filter((e)=>!this.isDisabled(e))}get selected(){return this.multiple?this.enabled:this.focused}}function Ms(e,t){if(t instanceof Promise)return t;if(typeof t==="function"){if(Re.isAsyncFn(t))return t;t=t.call(e,e)}for(let s of t){if(Array.isArray(s.choices)){let r=s.choices.filter((o)=>!e.isDisabled(o));s.enabled=r.every((o)=>o.enabled===!0)}if(e.isDisabled(s)===!0)delete s.enabled}return t}Cs.exports=Rs});var oe=x((Qc,Ds)=>{var Dn=ye(),gt=C();class _s extends Dn{constructor(e){super(e);this.emptyError=this.options.emptyError||"No items were selected"}async dispatch(e,t){if(this.multiple)return this[t.name]?await this[t.name](e,t):await super.dispatch(e,t);this.alert()}separator(){if(this.options.separator)return super.separator();let e=this.styles.muted(this.symbols.ellipsis);return this.state.submitted?super.separator():e}pointer(e,t){return!this.multiple||this.options.pointer?super.pointer(e,t):""}indicator(e,t){return this.multiple?super.indicator(e,t):""}choiceMessage(e,t){let s=this.resolve(e.message,this.state,e,t);if(e.role==="heading"&&!gt.hasColor(s))s=this.styles.strong(s);return this.resolve(s,this.state,e,t)}choiceSeparator(){return":"}async renderChoice(e,t){await this.onChoice(e,t);let s=this.index===t,r=await this.pointer(e,t),o=await this.indicator(e,t)+(e.pad||""),a=await this.resolve(e.hint,this.state,e,t);if(a&&!gt.hasColor(a))a=this.styles.muted(a);let i=this.indent(e),n=await this.choiceMessage(e,t),l=()=>[this.margin[3],i+r+o,n,this.margin[1],a].filter(Boolean).join(" ");if(e.role==="heading")return l();if(e.disabled){if(!gt.hasColor(n))n=this.styles.disabled(n);return l()}if(s)n=this.styles.em(n);return l()}async renderChoices(){if(this.state.loading==="choices")return this.styles.warning("Loading choices");if(this.state.submitted)return"";let e=this.visible.map(async(o,a)=>await this.renderChoice(o,a)),t=await Promise.all(e);if(!t.length)t.push(this.styles.danger("No matching choices"));let s=this.margin[0]+t.join(`
12
- `),r;if(this.options.choicesHeader)r=await this.resolve(this.options.choicesHeader,this.state);return[r,s].filter(Boolean).join(`
13
- `)}format(){if(!this.state.submitted||this.state.cancelled)return"";if(Array.isArray(this.selected))return this.selected.map((e)=>this.styles.primary(e.name)).join(", ");return this.styles.primary(this.selected.name)}async render(){let{submitted:e,size:t}=this.state,s="",r=await this.header(),o=await this.prefix(),a=await this.separator(),i=await this.message();if(this.options.promptLine!==!1)s=[o,i,a,""].join(" "),this.state.prompt=s;let n=await this.format(),l=await this.error()||await this.hint(),d=await this.renderChoices(),u=await this.footer();if(n)s+=n;if(l&&!s.includes(l))s+=" "+l;if(e&&!n&&!d.trim()&&this.multiple&&this.emptyError!=null)s+=this.styles.danger(this.emptyError);this.clear(t),this.write([r,s,d,u].filter(Boolean).join(`
14
- `)),this.write(this.margin[2]),this.restore()}}Ds.exports=_s});var Bs=x((Xc,Os)=>{var Pn=oe(),On=(e,t)=>{let s=e?new RegExp(e,"ig"):/$^/;return(r)=>{return e?r.replace(s,(o)=>t(o)):r}};class Ps extends Pn{constructor(e){super(e);this.cursorShow()}moveCursor(e){this.state.cursor+=e}dispatch(e){return this.append(e)}space(e){return this.options.multiple?super.space(e):this.append(e)}append(e){let{cursor:t,input:s}=this.state;return this.input=s.slice(0,t)+e+s.slice(t),this.moveCursor(1),this.complete()}delete(){let{cursor:e,input:t}=this.state;if(!t)return this.alert();return this.input=t.slice(0,e-1)+t.slice(e),this.moveCursor(-1),this.complete()}deleteForward(){let{cursor:e,input:t}=this.state;if(t[e]===void 0)return this.alert();return this.input=`${t}`.slice(0,e)+`${t}`.slice(e+1),this.complete()}number(e){return this.append(e)}async complete(){this.completing=!0,this.choices=await this.suggest(this.input,this.state._choices),this.state.limit=void 0,this.index=Math.min(Math.max(this.visible.length-1,0),this.index),await this.render(),this.completing=!1}suggest(e=this.input,t=this.state._choices){if(typeof this.options.suggest==="function")return this.options.suggest.call(this,e,t);let s=e.toLowerCase();return t.filter((r)=>r.message.toLowerCase().includes(s))}pointer(){return""}format(){if(!this.focused)return this.input;if(this.options.multiple&&this.state.submitted)return this.selected.map((e)=>this.styles.primary(e.message)).join(", ");if(this.state.submitted){let e=this.value=this.input=this.focused.value;return this.styles.primary(e)}return this.input}async render(){if(this.state.status!=="pending")return super.render();let e=this.options.highlight||this.styles.complement,t=(o,a)=>{if(!o)return o;if(e.stack)return e(o);return e.call(this,o)},s=On(this.input,t),r=this.choices;this.choices=r.map((o)=>({...o,message:s(o.message)})),await super.render(),this.choices=r}submit(){if(this.options.multiple)this.value=this.selected.map((e)=>e.name);return super.submit()}}Os.exports=Ps});var bt=x((Jc,Is)=>{var yt=C();Is.exports=(e,t={})=>{e.cursorHide();let{input:s="",initial:r="",pos:o,showCursor:a=!0,color:i}=t,n=i||e.styles.placeholder,l=yt.inverse(e.styles.primary),d=(f)=>l(e.styles.black(f)),u=s,c=" ",p=d(c);if(e.blink&&e.blink.off===!0)d=(f)=>f,p="";if(a&&o===0&&r===""&&s==="")return d(c);if(a&&o===0&&(s===r||s===""))return d(r[0])+n(r.slice(1));r=yt.isPrimitive(r)?`${r}`:"",s=yt.isPrimitive(s)?`${s}`:"";let m=r&&r.startsWith(s)&&r!==s,h=m?d(r[s.length]):p;if(o!==s.length&&a===!0)u=s.slice(0,o)+d(s[o])+s.slice(o+1),h="";if(a===!1)h="";if(m){let f=e.styles.unstyle(u+h);return u+h+n(r.slice(f.length))}return u+h}});var Ce=x((ep,Us)=>{var Bn=se(),In=oe(),Ln=bt();class Ls extends In{constructor(e){super({...e,multiple:!0});this.type="form",this.initial=this.options.initial,this.align=[this.options.align,"right"].find((t)=>t!=null),this.emptyError="",this.values={}}async reset(e){if(await super.reset(),e===!0)this._index=this.index;return this.index=this._index,this.values={},this.choices.forEach((t)=>t.reset&&t.reset()),this.render()}dispatch(e){return!!e&&this.append(e)}append(e){let t=this.focused;if(!t)return this.alert();let{cursor:s,input:r}=t;return t.value=t.input=r.slice(0,s)+e+r.slice(s),t.cursor++,this.render()}delete(){let e=this.focused;if(!e||e.cursor<=0)return this.alert();let{cursor:t,input:s}=e;return e.value=e.input=s.slice(0,t-1)+s.slice(t),e.cursor--,this.render()}deleteForward(){let e=this.focused;if(!e)return this.alert();let{cursor:t,input:s}=e;if(s[t]===void 0)return this.alert();let r=`${s}`.slice(0,t)+`${s}`.slice(t+1);return e.value=e.input=r,this.render()}right(){let e=this.focused;if(!e)return this.alert();if(e.cursor>=e.input.length)return this.alert();return e.cursor++,this.render()}left(){let e=this.focused;if(!e)return this.alert();if(e.cursor<=0)return this.alert();return e.cursor--,this.render()}space(e,t){return this.dispatch(e,t)}number(e,t){return this.dispatch(e,t)}next(){let e=this.focused;if(!e)return this.alert();let{initial:t,input:s}=e;if(t&&t.startsWith(s)&&s!==t)return e.value=e.input=t,e.cursor=e.value.length,this.render();return super.next()}prev(){let e=this.focused;if(!e)return this.alert();if(e.cursor===0)return super.prev();return e.value=e.input="",e.cursor=0,this.render()}separator(){return""}format(e){return!this.state.submitted?super.format(e):""}pointer(){return""}indicator(e){return e.input?"\u29BF":"\u2299"}async choiceSeparator(e,t){let s=await this.resolve(e.separator,this.state,e,t)||":";return s?" "+this.styles.disabled(s):""}async renderChoice(e,t){await this.onChoice(e,t);let{state:s,styles:r}=this,{cursor:o,initial:a="",name:i,input:n=""}=e,{muted:l,submitted:d,primary:u,danger:c}=r,p=this.index===t,m=e.validate||(()=>!0),h=await this.choiceSeparator(e,t),f=e.message;if(this.align==="right")f=f.padStart(this.longest+1," ");if(this.align==="left")f=f.padEnd(this.longest+1," ");let w=this.values[i]=n||a,g=n?"success":"dark";if(await m.call(e,w,this.state)!==!0)g="danger";let E=r[g],A=E(await this.indicator(e,t))+(e.pad||""),v=this.indent(e),S=()=>[v,A,f+h,n].filter(Boolean).join(" ");if(s.submitted)return f=Bn(f),n=d(n),S();if(e.format)n=await e.format.call(this,n,e,t);else{let _=this.styles.muted;n=Ln(this,{input:n,initial:a,pos:o,showCursor:p,color:_})}if(!this.isValue(n))n=this.styles.muted(this.symbols.ellipsis);if(e.result)this.values[i]=await e.result.call(this,w,e,t);if(p)f=u(f);if(e.error)n+=(n?" ":"")+c(e.error.trim());else if(e.hint)n+=(n?" ":"")+l(e.hint.trim());return S()}async submit(){return this.value=this.values,super.base.submit.call(this)}}Us.exports=Ls});var xt=x((tp,$s)=>{var Un=Ce(),Gn=()=>{throw Error("expected prompt to have a custom authenticate method")},Gs=(e=Gn)=>{class t extends Un{constructor(s){super(s)}async submit(){this.value=await e.call(this,this.values,this.state),super.base.submit.call(this)}static create(s){return Gs(s)}}return t};$s.exports=Gs()});var ks=x((sp,qs)=>{var $n=xt();function Wn(e,t){if(e.username===this.options.username&&e.password===this.options.password)return!0;return!1}var Ws=(e=Wn)=>{let t=[{name:"username",message:"username"},{name:"password",message:"password",format(r){if(this.options.showPassword)return r;return(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(r.length))}}];class s extends $n.create(e){constructor(r){super({...r,choices:t})}static create(r){return Ws(r)}}return s};qs.exports=Ws()});var _e=x((rp,Hs)=>{var qn=ce(),{isPrimitive:kn,hasColor:Kn}=C();class Ks extends qn{constructor(e){super(e);this.cursorHide()}async initialize(){let e=await this.resolve(this.initial,this.state);this.input=await this.cast(e),await super.initialize()}dispatch(e){if(!this.isValue(e))return this.alert();return this.input=e,this.submit()}format(e){let{styles:t,state:s}=this;return!s.submitted?t.primary(e):t.success(e)}cast(e){return this.isTrue(e)}isTrue(e){return/^[ty1]/i.test(e)}isFalse(e){return/^[fn0]/i.test(e)}isValue(e){return kn(e)&&(this.isTrue(e)||this.isFalse(e))}async hint(){if(this.state.status==="pending"){let e=await this.element("hint");if(!Kn(e))return this.styles.muted(e);return e}}async render(){let{input:e,size:t}=this.state,s=await this.prefix(),r=await this.separator(),o=await this.message(),a=this.styles.muted(this.default),i=[s,o,a,r].filter(Boolean).join(" ");this.state.prompt=i;let n=await this.header(),l=this.value=this.cast(e),d=await this.format(l),u=await this.error()||await this.hint(),c=await this.footer();if(u&&!i.includes(u))d+=" "+u;i+=" "+d,this.clear(t),this.write([n,i,c].filter(Boolean).join(`
15
- `)),this.restore()}set value(e){super.value=e}get value(){return this.cast(super.value)}}Hs.exports=Ks});var Fs=x((op,Ys)=>{var Hn=_e();class Vs extends Hn{constructor(e){super(e);this.default=this.options.default||(this.initial?"(Y/n)":"(y/N)")}}Ys.exports=Vs});var Zs=x((ap,zs)=>{var Vn=oe(),Yn=Ce(),pe=Yn.prototype;class js extends Vn{constructor(e){super({...e,multiple:!0});this.align=[this.options.align,"left"].find((t)=>t!=null),this.emptyError="",this.values={}}dispatch(e,t){let s=this.focused,r=s.parent||{};if(!s.editable&&!r.editable){if(e==="a"||e==="i")return super[e]()}return pe.dispatch.call(this,e,t)}append(e,t){return pe.append.call(this,e,t)}delete(e,t){return pe.delete.call(this,e,t)}space(e){return this.focused.editable?this.append(e):super.space()}number(e){return this.focused.editable?this.append(e):super.number(e)}next(){return this.focused.editable?pe.next.call(this):super.next()}prev(){return this.focused.editable?pe.prev.call(this):super.prev()}async indicator(e,t){let s=e.indicator||"",r=e.editable?s:super.indicator(e,t);return await this.resolve(r,this.state,e,t)||""}indent(e){return e.role==="heading"?"":e.editable?" ":" "}async renderChoice(e,t){if(e.indent="",e.editable)return pe.renderChoice.call(this,e,t);return super.renderChoice(e,t)}error(){return""}footer(){return this.state.error}async validate(){let e=!0;for(let t of this.choices){if(typeof t.validate!=="function")continue;if(t.role==="heading")continue;let s=t.parent?this.value[t.parent.name]:this.value;if(t.editable)s=t.value===t.name?t.initial||"":t.value;else if(!this.isDisabled(t))s=t.enabled===!0;if(e=await t.validate(s,this.state),e!==!0)break}if(e!==!0)this.state.error=typeof e==="string"?e:"Invalid Input";return e}submit(){if(this.focused.newChoice===!0)return super.submit();if(this.choices.some((e)=>e.newChoice))return this.alert();this.value={};for(let e of this.choices){let t=e.parent?this.value[e.parent.name]:this.value;if(e.role==="heading"){this.value[e.name]={};continue}if(e.editable)t[e.name]=e.value===e.name?e.initial||"":e.value;else if(!this.isDisabled(e))t[e.name]=e.enabled===!0}return this.base.submit.call(this)}}zs.exports=js});var de=x((ip,Xs)=>{var Fn=ce(),jn=at(),zn=bt(),{isPrimitive:Zn}=C();class Qs extends Fn{constructor(e){super(e);if(this.initial=Zn(this.initial)?String(this.initial):"",this.initial)this.cursorHide();this.state.prevCursor=0,this.state.clipboard=[],this.keypressTimeout=this.options.keypressTimeout!==void 0?this.options.keypressTimeout:null}async keypress(e,t=e?jn(e,{}):{}){let s=Date.now(),r=s-this.lastKeypress;this.lastKeypress=s;let o=t.name==="return"||t.name==="enter",a=this.state.prevKeypress,i;if(this.state.prevKeypress=t,this.keypressTimeout!=null&&o){if(r<this.keypressTimeout)return this.submit();this.state.multilineBuffer=this.state.multilineBuffer||"",this.state.multilineBuffer+=e,i=!0,a=null}if(i||this.options.multiline&&o){if(!a||a.name!=="return")return this.append(`
16
- `,t)}return super.keypress(e,t)}moveCursor(e){this.cursor+=e}reset(){return this.input=this.value="",this.cursor=0,this.render()}dispatch(e,t){if(!e||t.ctrl||t.code)return this.alert();this.append(e)}append(e){let{cursor:t,input:s}=this.state;this.input=`${s}`.slice(0,t)+e+`${s}`.slice(t),this.moveCursor(String(e).length),this.render()}insert(e){this.append(e)}delete(){let{cursor:e,input:t}=this.state;if(e<=0)return this.alert();this.input=`${t}`.slice(0,e-1)+`${t}`.slice(e),this.moveCursor(-1),this.render()}deleteForward(){let{cursor:e,input:t}=this.state;if(t[e]===void 0)return this.alert();this.input=`${t}`.slice(0,e)+`${t}`.slice(e+1),this.render()}cutForward(){let e=this.cursor;if(this.input.length<=e)return this.alert();this.state.clipboard.push(this.input.slice(e)),this.input=this.input.slice(0,e),this.render()}cutLeft(){let e=this.cursor;if(e===0)return this.alert();let t=this.input.slice(0,e),s=this.input.slice(e),r=t.split(" ");this.state.clipboard.push(r.pop()),this.input=r.join(" "),this.cursor=this.input.length,this.input+=s,this.render()}paste(){if(!this.state.clipboard.length)return this.alert();this.insert(this.state.clipboard.pop()),this.render()}toggleCursor(){if(this.state.prevCursor)this.cursor=this.state.prevCursor,this.state.prevCursor=0;else this.state.prevCursor=this.cursor,this.cursor=0;this.render()}first(){this.cursor=0,this.render()}last(){this.cursor=this.input.length-1,this.render()}next(){let e=this.initial!=null?String(this.initial):"";if(!e||!e.startsWith(this.input))return this.alert();this.input=this.initial,this.cursor=this.initial.length,this.render()}prev(){if(!this.input)return this.alert();this.reset()}backward(){return this.left()}forward(){return this.right()}right(){if(this.cursor>=this.input.length)return this.alert();return this.moveCursor(1),this.render()}left(){if(this.cursor<=0)return this.alert();return this.moveCursor(-1),this.render()}isValue(e){return!!e}async format(e=this.value){let t=await this.resolve(this.initial,this.state);if(!this.state.submitted)return zn(this,{input:e,initial:t,pos:this.cursor});return this.styles.submitted(e||t)}async render(){let e=this.state.size,t=await this.prefix(),s=await this.separator(),r=await this.message(),o=[t,r,s].filter(Boolean).join(" ");this.state.prompt=o;let a=await this.header(),i=await this.format(),n=await this.error()||await this.hint(),l=await this.footer();if(n&&!i.includes(n))i+=" "+n;o+=" "+i,this.clear(e),this.write([a,o,l].filter(Boolean).join(`
17
- `)),this.restore()}}Xs.exports=Qs});var er=x((np,Js)=>{var Qn=(e)=>e.filter((t,s)=>e.lastIndexOf(t)===s),De=(e)=>Qn(e).filter(Boolean);Js.exports=(e,t={},s="")=>{let{past:r=[],present:o=""}=t,a,i;switch(e){case"prev":case"undo":return a=r.slice(0,r.length-1),i=r[r.length-1]||"",{past:De([s,...a]),present:i};case"next":case"redo":return a=r.slice(1),i=r[0]||"",{past:De([...a,s]),present:i};case"save":return{past:De([...r,s]),present:""};case"remove":if(i=De(r.filter((n)=>n!==s)),o="",i.length)o=i.pop();return{past:i,present:o};default:throw Error(`Invalid action: "${e}"`)}}});var wt=x((lp,rr)=>{var Xn=de(),tr=er();class sr extends Xn{constructor(e){super(e);let t=this.options.history;if(t&&t.store){let s=t.values||this.initial;this.autosave=!!t.autosave,this.store=t.store,this.data=this.store.get("values")||{past:[],present:s},this.initial=this.data.present||this.data.past[this.data.past.length-1]}}completion(e){if(!this.store)return this.alert();if(this.data=tr(e,this.data,this.input),!this.data.present)return this.alert();return this.input=this.data.present,this.cursor=this.input.length,this.render()}altUp(){return this.completion("prev")}altDown(){return this.completion("next")}prev(){return this.save(),super.prev()}save(){if(!this.store)return;this.data=tr("save",this.data,this.input),this.store.set("values",this.data)}submit(){if(this.store&&this.autosave===!0)this.save();return super.submit()}}rr.exports=sr});var ir=x((dp,ar)=>{var Jn=de();class or extends Jn{format(){return""}}ar.exports=or});var dr=x((mp,lr)=>{var el=de();class nr extends el{constructor(e={}){super(e);this.sep=this.options.separator||/, */,this.initial=e.initial||""}split(e=this.value){return e?String(e).split(this.sep):[]}format(){let e=this.state.submitted?this.styles.primary:(t)=>t;return this.list.map(e).join(", ")}async submit(e){let t=this.state.error||await this.validate(this.list,this.state);if(t!==!0)return this.state.error=t,super.submit();return this.value=this.list,super.submit()}get list(){return this.split()}}lr.exports=nr});var pr=x((cp,cr)=>{var tl=oe();class mr extends tl{constructor(e){super({...e,multiple:!0})}}cr.exports=mr});var Et=x((pp,hr)=>{var sl=de();class ur extends sl{constructor(e={}){super({style:"number",...e});this.min=this.isValue(e.min)?this.toNumber(e.min):-1/0,this.max=this.isValue(e.max)?this.toNumber(e.max):1/0,this.delay=e.delay!=null?e.delay:1000,this.float=e.float!==!1,this.round=e.round===!0||e.float===!1,this.major=e.major||10,this.minor=e.minor||1,this.initial=e.initial!=null?e.initial:"",this.input=String(this.initial),this.cursor=this.input.length,this.cursorShow()}append(e){if(!/[-+.]/.test(e)||e==="."&&this.input.includes("."))return this.alert("invalid number");return super.append(e)}number(e){return super.append(e)}next(){if(this.input&&this.input!==this.initial)return this.alert();if(!this.isValue(this.initial))return this.alert();return this.input=this.initial,this.cursor=String(this.initial).length,this.render()}up(e){let t=e||this.minor,s=this.toNumber(this.input);if(s>this.max+t)return this.alert();return this.input=`${s+t}`,this.render()}down(e){let t=e||this.minor,s=this.toNumber(this.input);if(s<this.min-t)return this.alert();return this.input=`${s-t}`,this.render()}shiftDown(){return this.down(this.major)}shiftUp(){return this.up(this.major)}format(e=this.input){if(typeof this.options.format==="function")return this.options.format.call(this,e);return this.styles.info(e)}toNumber(e=""){return this.float?+e:Math.round(+e)}isValue(e){return/^[-+]?[0-9]+((\.)|(\.[0-9]+))?$/.test(e)}submit(){let e=[this.input,this.initial].find((t)=>this.isValue(t));return this.value=this.toNumber(e||0),super.submit()}}hr.exports=ur});var yr=x((up,gr)=>{var rl=de();class fr extends rl{constructor(e){super(e);this.cursorShow()}format(e=this.input){if(!this.keypressed)return"";return(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(e.length))}}gr.exports=fr});var Er=x((hp,wr)=>{var ol=se(),al=ye(),br=C();class xr extends al{constructor(e={}){super(e);this.widths=[].concat(e.messageWidth||50),this.align=[].concat(e.align||"left"),this.linebreak=e.linebreak||!1,this.edgeLength=e.edgeLength||3,this.newline=e.newline||`
18
- `;let t=e.startNumber||1;if(typeof this.scale==="number")this.scaleKey=!1,this.scale=Array(this.scale).fill(0).map((s,r)=>({name:r+t}))}async reset(){return this.tableized=!1,await super.reset(),this.render()}tableize(){if(this.tableized===!0)return;this.tableized=!0;let e=0;for(let t of this.choices){e=Math.max(e,t.message.length),t.scaleIndex=t.initial||2,t.scale=[];for(let s=0;s<this.scale.length;s++)t.scale.push({index:s})}this.widths[0]=Math.min(this.widths[0],e+3)}async dispatch(e,t){if(this.multiple)return this[t.name]?await this[t.name](e,t):await super.dispatch(e,t);this.alert()}heading(e,t,s){return this.styles.strong(e)}separator(){return this.styles.muted(this.symbols.ellipsis)}right(){let e=this.focused;if(e.scaleIndex>=this.scale.length-1)return this.alert();return e.scaleIndex++,this.render()}left(){let e=this.focused;if(e.scaleIndex<=0)return this.alert();return e.scaleIndex--,this.render()}indent(){return""}format(){if(this.state.submitted)return this.choices.map((t)=>this.styles.info(t.index)).join(", ");return""}pointer(){return""}renderScaleKey(){if(this.scaleKey===!1)return"";if(this.state.submitted)return"";return["",...this.scale.map((s)=>` ${s.name} - ${s.message}`)].map((s)=>this.styles.muted(s)).join(`
19
- `)}renderScaleHeading(e){let t=this.scale.map((n)=>n.name);if(typeof this.options.renderScaleHeading==="function")t=this.options.renderScaleHeading.call(this,e);let s=this.scaleLength-t.join("").length,r=Math.round(s/(t.length-1)),a=t.map((n)=>this.styles.strong(n)).join(" ".repeat(r)),i=" ".repeat(this.widths[0]);return this.margin[3]+i+this.margin[1]+a}scaleIndicator(e,t,s){if(typeof this.options.scaleIndicator==="function")return this.options.scaleIndicator.call(this,e,t,s);let r=e.scaleIndex===t.index;if(t.disabled)return this.styles.hint(this.symbols.radio.disabled);if(r)return this.styles.success(this.symbols.radio.on);return this.symbols.radio.off}renderScale(e,t){let s=e.scale.map((o)=>this.scaleIndicator(e,o,t)),r=this.term==="Hyper"?"":" ";return s.join(r+this.symbols.line.repeat(this.edgeLength))}async renderChoice(e,t){await this.onChoice(e,t);let s=this.index===t,r=await this.pointer(e,t),o=await e.hint;if(o&&!br.hasColor(o))o=this.styles.muted(o);let a=(m)=>this.margin[3]+m.replace(/\s+$/,"").padEnd(this.widths[0]," "),i=this.newline,n=this.indent(e),l=await this.resolve(e.message,this.state,e,t),d=await this.renderScale(e,t),u=this.margin[1]+this.margin[3];this.scaleLength=ol(d).length,this.widths[0]=Math.min(this.widths[0],this.width-this.scaleLength-u.length);let p=br.wordWrap(l,{width:this.widths[0],newline:i}).split(`
20
- `).map((m)=>a(m)+this.margin[1]);if(s)d=this.styles.info(d),p=p.map((m)=>this.styles.info(m));if(p[0]+=d,this.linebreak)p.push("");return[n+r,p.join(`
21
- `)].filter(Boolean)}async renderChoices(){if(this.state.submitted)return"";this.tableize();let e=this.visible.map(async(r,o)=>await this.renderChoice(r,o)),t=await Promise.all(e),s=await this.renderScaleHeading();return this.margin[0]+[s,...t.map((r)=>r.join(" "))].join(`
22
- `)}async render(){let{submitted:e,size:t}=this.state,s=await this.prefix(),r=await this.separator(),o=await this.message(),a="";if(this.options.promptLine!==!1)a=[s,o,r,""].join(" "),this.state.prompt=a;let i=await this.header(),n=await this.format(),l=await this.renderScaleKey(),d=await this.error()||await this.hint(),u=await this.renderChoices(),c=await this.footer(),p=this.emptyError;if(n)a+=n;if(d&&!a.includes(d))a+=" "+d;if(e&&!n&&!u.trim()&&this.multiple&&p!=null)a+=this.styles.danger(p);if(this.clear(t),this.write([i,a,l,u,c].filter(Boolean).join(`
23
- `)),!this.state.submitted)this.write(this.margin[2]);this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIndex;return this.base.submit.call(this)}}wr.exports=xr});var Tr=x((fp,vr)=>{var Ar=se(),il=(e="")=>{return typeof e==="string"?e.replace(/^['"]|['"]$/g,""):""};class Nr{constructor(e){this.name=e.key,this.field=e.field||{},this.value=il(e.initial||this.field.initial||""),this.message=e.message||this.name,this.cursor=0,this.input="",this.lines=[]}}var nl=async(e={},t={},s=(r)=>r)=>{let r=new Set,o=e.fields||[],a=e.template,i=[],n=[],l=[],d=1;if(typeof a==="function")a=await a();let u=-1,c=()=>a[++u],p=()=>a[u+1],m=(h)=>{h.line=d,i.push(h)};m({type:"bos",value:""});while(u<a.length-1){let h=c();if(/^[^\S\n ]$/.test(h)){m({type:"text",value:h});continue}if(h===`
24
- `){m({type:"newline",value:h}),d++;continue}if(h==="\\"){h+=c(),m({type:"text",value:h});continue}if((h==="$"||h==="#"||h==="{")&&p()==="{"){let w=c();h+=w;let g={type:"template",open:h,inner:"",close:"",value:h},E;while(E=c()){if(E==="}"){if(p()==="}")E+=c();g.value+=E,g.close=E;break}if(E===":")g.initial="",g.key=g.inner;else if(g.initial!==void 0)g.initial+=E;g.value+=E,g.inner+=E}if(g.template=g.open+(g.initial||g.inner)+g.close,g.key=g.key||g.inner,hasOwnProperty.call(t,g.key))g.initial=t[g.key];g=s(g),m(g),l.push(g.key),r.add(g.key);let A=n.find((v)=>v.name===g.key);if(g.field=o.find((v)=>v.name===g.key),!A)A=new Nr(g),n.push(A);A.lines.push(g.line-1);continue}let f=i[i.length-1];if(f.type==="text"&&f.line===d)f.value+=h;else m({type:"text",value:h})}return m({type:"eos",value:""}),{input:a,tabstops:i,unique:r,keys:l,items:n}};vr.exports=async(e)=>{let t=e.options,s=new Set(t.required===!0?[]:t.required||[]),r={...t.values,...t.initial},{tabstops:o,items:a,keys:i}=await nl(t,r),n=At("result",e,t),l=At("format",e,t),d=At("validate",e,t,!0),u=e.isValue.bind(e);return async(c={},p=!1)=>{let m=0;c.required=s,c.items=a,c.keys=i,c.output="";let h=async(E,A,v,S)=>{let _=await d(E,A,v,S);if(_===!1)return"Invalid field "+v.name;return _};for(let E of o){let{value:A,key:v}=E;if(E.type!=="template"){if(A)c.output+=A;continue}if(E.type==="template"){let S=a.find((me)=>me.name===v);if(t.required===!0)c.required.add(S.name);let _=[S.input,c.values[S.value],S.value,A].find(u),ee=(S.field||{}).message||E.inner;if(p){let me=await h(c.values[v],c,S,m);if(me&&typeof me==="string"||me===!1){c.invalid.set(v,me);continue}c.invalid.delete(v);let oi=await n(c.values[v],c,S,m);c.output+=Ar(oi);continue}S.placeholder=!1;let ri=A;if(A=await l(A,c,S,m),_!==A)c.values[v]=_,A=e.styles.typing(_),c.missing.delete(ee);else if(c.values[v]=void 0,_=`<${ee}>`,A=e.styles.primary(_),S.placeholder=!0,c.required.has(v))c.missing.add(ee);if(c.missing.has(ee)&&c.validating)A=e.styles.warning(_);if(c.invalid.has(v)&&c.validating)A=e.styles.danger(_);if(m===c.index)if(ri!==A)A=e.styles.underline(A);else A=e.styles.heading(Ar(A));m++}if(A)c.output+=A}let f=c.output.split(`
25
- `).map((E)=>" "+E),w=a.length,g=0;for(let E of a){if(c.invalid.has(E.name))E.lines.forEach((A)=>{if(f[A][0]!==" ")return;f[A]=c.styles.danger(c.symbols.bullet)+f[A].slice(1)});if(e.isValue(c.values[E.name]))g++}return c.completed=(g/w*100).toFixed(0),c.output=f.join(`
26
- `),c.output}};function At(e,t,s,r){return(o,a,i,n)=>{if(typeof i.field[e]==="function")return i.field[e].call(t,o,a,i,n);return[r,o].find((l)=>t.isValue(l))}}});var Rr=x((gp,Mr)=>{var ll=se(),dl=Tr(),ml=ce();class Sr extends ml{constructor(e){super(e);this.cursorHide(),this.reset(!0)}async initialize(){this.interpolate=await dl(this),await super.initialize()}async reset(e){if(this.state.keys=[],this.state.invalid=new Map,this.state.missing=new Set,this.state.completed=0,this.state.values={},e!==!0)await this.initialize(),await this.render()}moveCursor(e){let t=this.getItem();this.cursor+=e,t.cursor+=e}dispatch(e,t){if(!t.code&&!t.ctrl&&e!=null&&this.getItem()){this.append(e,t);return}this.alert()}append(e,t){let s=this.getItem(),r=s.input.slice(0,this.cursor),o=s.input.slice(this.cursor);this.input=s.input=`${r}${e}${o}`,this.moveCursor(1),this.render()}delete(){let e=this.getItem();if(this.cursor<=0||!e.input)return this.alert();let t=e.input.slice(this.cursor),s=e.input.slice(0,this.cursor-1);this.input=e.input=`${s}${t}`,this.moveCursor(-1),this.render()}increment(e){return e>=this.state.keys.length-1?0:e+1}decrement(e){return e<=0?this.state.keys.length-1:e-1}first(){this.state.index=0,this.render()}last(){this.state.index=this.state.keys.length-1,this.render()}right(){if(this.cursor>=this.input.length)return this.alert();this.moveCursor(1),this.render()}left(){if(this.cursor<=0)return this.alert();this.moveCursor(-1),this.render()}prev(){this.state.index=this.decrement(this.state.index),this.getItem(),this.render()}next(){this.state.index=this.increment(this.state.index),this.getItem(),this.render()}up(){this.prev()}down(){this.next()}format(e){let t=this.state.completed<100?this.styles.warning:this.styles.success;if(this.state.submitted===!0&&this.state.completed!==100)t=this.styles.danger;return t(`${this.state.completed}% completed`)}async render(){let{index:e,keys:t=[],submitted:s,size:r}=this.state,o=[this.options.newline,`
27
- `].find((g)=>g!=null),a=await this.prefix(),i=await this.separator(),n=await this.message(),l=[a,n,i].filter(Boolean).join(" ");this.state.prompt=l;let d=await this.header(),u=await this.error()||"",c=await this.hint()||"",p=s?"":await this.interpolate(this.state),m=this.state.key=t[e]||"",h=await this.format(m),f=await this.footer();if(h)l+=" "+h;if(c&&!h&&this.state.completed===0)l+=" "+c;this.clear(r);let w=[d,l,p,f,u.trim()];this.write(w.filter(Boolean).join(o)),this.restore()}getItem(e){let{items:t,keys:s,index:r}=this.state,o=t.find((a)=>a.name===s[r]);if(o&&o.input!=null)this.input=o.input,this.cursor=o.cursor;return o}async submit(){if(typeof this.interpolate!=="function")await this.initialize();await this.interpolate(this.state,!0);let{invalid:e,missing:t,output:s,values:r}=this.state;if(e.size){let i="";for(let[n,l]of e)i+=`Invalid ${n}: ${l}
10
+ `.repeat(t))}catch(e){}this.emit("close")}start(){if(!this.stop&&this.options.show!==!1)this.stop=ft.listen(this,this.keypress.bind(this)),this.once("close",this.stop),this.emit("start",this)}async skip(){if(this.skipped=this.options.skip===!0,typeof this.options.skip==="function")this.skipped=await this.options.skip.call(this,this.name,this.value);return this.skipped}async initialize(){let{format:e,options:t,result:s}=this;if(this.format=()=>e.call(this,this.value),this.result=()=>s.call(this,this.value),typeof t.initial==="function")this.initial=await t.initial.call(this,this);if(typeof t.onRun==="function")await t.onRun.call(this,this);if(typeof t.onSubmit==="function"){let o=t.onSubmit.bind(this),r=this.submit.bind(this);delete this.options.onSubmit,this.submit=async()=>{return await o(this.name,this.value,this),r()}}await this.start(),await this.render()}render(){throw Error("expected prompt to have a custom render method")}run(){return new Promise(async(e,t)=>{if(this.once("submit",e),this.once("cancel",t),await this.skip())return this.render=()=>{},this.submit();await this.initialize(),this.emit("run")})}async element(e,t,s){let{options:o,state:r,symbols:a,timers:i}=this,n=i&&i[e];r.timer=n;let l=o[e]||r[e]||a[e],d=t&&t[e]!=null?t[e]:await l;if(d==="")return d;let m=await this.resolve(d,r,t,s);if(!m&&t&&t[e])return this.resolve(l,r,t,s);return m}async prefix(){let e=await this.element("prefix")||this.symbols,t=this.timers&&this.timers.prefix,s=this.state;if(s.timer=t,D.isObject(e))e=e[s.status]||e.pending;if(!D.hasColor(e))return(this.styles[s.status]||this.styles.pending)(e);return e}async message(){let e=await this.element("message");if(!D.hasColor(e))return this.styles.strong(e);return e}async separator(){let e=await this.element("separator")||this.symbols,t=this.timers&&this.timers.separator,s=this.state;s.timer=t;let o=e[s.status]||e.pending||s.separator,r=await this.resolve(o,s);if(D.isObject(r))r=r[s.status]||r.pending;if(!D.hasColor(r))return this.styles.muted(r);return r}async pointer(e,t){let s=await this.element("pointer",e,t);if(typeof s==="string"&&D.hasColor(s))return s;if(s){let o=this.styles,r=this.index===t,a=r?o.primary:(l)=>l,i=await this.resolve(s[r?"on":"off"]||s,this.state),n=!D.hasColor(i)?a(i):i;return r?n:" ".repeat(i.length)}}async indicator(e,t){let s=await this.element("indicator",e,t);if(typeof s==="string"&&D.hasColor(s))return s;if(s){let o=this.styles,r=e.enabled===!0,a=r?o.success:o.dark,i=s[r?"on":"off"]||s;return!D.hasColor(i)?a(i):i}return""}body(){return null}footer(){if(this.state.status==="pending")return this.element("footer")}header(){if(this.state.status==="pending")return this.element("header")}async hint(){if(this.state.status==="pending"&&!this.isValue(this.state.input)){let e=await this.element("hint");if(!D.hasColor(e))return this.styles.muted(e);return e}}error(e){return!this.state.submitted?e||this.state.error:""}format(e){return e}result(e){return e}validate(e){if(this.options.required===!0)return this.isValue(e);return!0}isValue(e){return e!=null&&e!==""}resolve(e,...t){return D.resolve(this,e,...t)}get base(){return yt.prototype}get style(){return this.styles[this.state.status]}get height(){return this.options.rows||D.height(this.stdout,25)}get width(){return this.options.columns||D.width(this.stdout,80)}get size(){return{width:this.width,height:this.height}}set cursor(e){this.state.cursor=e}get cursor(){return this.state.cursor}set input(e){this.state.input=e}get input(){return this.state.input}set value(e){this.state.value=e}get value(){let{input:e,value:t}=this.state,s=[t,e].find(this.isValue.bind(this));return this.isValue(s)?s:this.initial}static get prompt(){return(e)=>new this(e).run()}}function An(e){let t=(r)=>{return e[r]===void 0||typeof e[r]==="function"},s=["actions","choices","initial","margin","roles","styles","symbols","theme","timers","value"],o=["body","footer","error","header","hint","indicator","message","prefix","separator","skip"];for(let r of Object.keys(e.options)){if(s.includes(r))continue;if(/^on[A-Z]/.test(r))continue;let a=e.options[r];if(typeof a==="function"&&t(r)){if(!o.includes(r))e[r]=a.bind(e)}else if(typeof e[r]!=="function")e[r]=a}}function vn(e){if(typeof e==="number")e=[e,e,e,e];let t=[].concat(e||[]),s=(r)=>r%2===0?`
11
+ `:" ",o=[];for(let r=0;r<4;r++){let a=s(r);if(t[r])o.push(a.repeat(t[r]));else o.push("")}return o}As.exports=yt});var Ts=w((zc,Ns)=>{var Nn=R(),vs={default(e,t){return t},checkbox(e,t){throw Error("checkbox role is not implemented yet")},editable(e,t){throw Error("editable role is not implemented yet")},expandable(e,t){throw Error("expandable role is not implemented yet")},heading(e,t){return t.disabled="",t.indicator=[t.indicator," "].find((s)=>s!=null),t.message=t.message||"",t},input(e,t){throw Error("input role is not implemented yet")},option(e,t){return vs.default(e,t)},radio(e,t){throw Error("radio role is not implemented yet")},separator(e,t){return t.disabled="",t.indicator=[t.indicator," "].find((s)=>s!=null),t.message=t.message||e.symbols.line.repeat(5),t},spacer(e,t){return t}};Ns.exports=(e,t={})=>{let s=Nn.merge({},vs,t.roles);return s[e]||s.default}});var ge=w((Zc,Rs)=>{var Tn=se(),Sn=ce(),Cn=Ts(),Me=R(),{reorder:gt,scrollUp:Mn,scrollDown:Rn,isObject:Ss,swap:_n}=Me;class Ms extends Sn{constructor(e){super(e);this.cursorHide(),this.maxSelected=e.maxSelected||1/0,this.multiple=e.multiple||!1,this.initial=e.initial||0,this.delay=e.delay||0,this.longest=0,this.num=""}async initialize(){if(typeof this.options.initial==="function")this.initial=await this.options.initial.call(this);await this.reset(!0),await super.initialize()}async reset(){let{choices:e,initial:t,autofocus:s,suggest:o}=this.options;if(this.state._choices=[],this.state.choices=[],this.choices=await Promise.all(await this.toChoices(e)),this.choices.forEach((r)=>r.enabled=!1),typeof o!=="function"&&this.selectable.length===0)throw Error("At least one choice must be selectable");if(Ss(t))t=Object.keys(t);if(Array.isArray(t)){if(s!=null)this.index=this.findIndex(s);t.forEach((r)=>this.enable(this.find(r))),await this.render()}else{if(s!=null)t=s;if(typeof t==="string")t=this.findIndex(t);if(typeof t==="number"&&t>-1)this.index=Math.max(0,Math.min(t,this.choices.length)),this.enable(this.find(this.index))}if(this.isDisabled(this.focused))await this.down()}async toChoices(e,t){this.state.loadingChoices=!0;let s=[],o=0,r=async(a,i)=>{if(typeof a==="function")a=await a.call(this);if(a instanceof Promise)a=await a;for(let n=0;n<a.length;n++){let l=a[n]=await this.toChoice(a[n],o++,i);if(s.push(l),l.choices)await r(l.choices,l)}return s};return r(e,t).then((a)=>{return this.state.loadingChoices=!1,a})}async toChoice(e,t,s){if(typeof e==="function")e=await e.call(this,this);if(e instanceof Promise)e=await e;if(typeof e==="string")e={name:e};if(e.normalized)return e;e.normalized=!0;let o=e.value;if(e=Cn(e.role,this.options)(this,e),typeof e.disabled==="string"&&!e.hint)e.hint=e.disabled,e.disabled=!0;if(e.disabled===!0&&e.hint==null)e.hint="(disabled)";if(e.index!=null)return e;if(e.name=e.name||e.key||e.title||e.value||e.message,e.message=e.message||e.name||"",e.value=[e.value,e.name].find(this.isValue.bind(this)),e.input="",e.index=t,e.cursor=0,Me.define(e,"parent",s),e.level=s?s.level+1:1,e.indent==null)e.indent=s?s.indent+" ":e.indent||"";if(e.path=s?s.path+"."+e.name:e.name,e.enabled=!!(this.multiple&&!this.isDisabled(e)&&(e.enabled||this.isSelected(e))),!this.isDisabled(e))this.longest=Math.max(this.longest,Tn(e.message).length);let a={...e};if(e.reset=(i=a.input,n=a.value)=>{for(let l of Object.keys(a))e[l]=a[l];e.input=i,e.value=n},o==null&&typeof e.initial==="function")e.input=await e.initial.call(this,this.state,e,t);return e}async onChoice(e,t){if(this.emit("choice",e,t,this),typeof e.onChoice==="function")await e.onChoice.call(this,this.state,e,t)}async addChoice(e,t,s){let o=await this.toChoice(e,t,s);return this.choices.push(o),this.index=this.choices.length-1,this.limit=this.choices.length,o}async newItem(e,t,s){let o={name:"New choice name?",editable:!0,newChoice:!0,...e},r=await this.addChoice(o,t,s);return r.updateChoice=()=>{delete r.newChoice,r.name=r.message=r.input,r.input="",r.cursor=0},this.render()}indent(e){if(e.indent==null)return e.level>1?" ".repeat(e.level-1):"";return e.indent}dispatch(e,t){if(this.multiple&&this[t.name])return this[t.name]();this.alert()}focus(e,t){if(typeof t!=="boolean")t=e.enabled;if(t&&!e.enabled&&this.selected.length>=this.maxSelected)return this.alert();return this.index=e.index,e.enabled=t&&!this.isDisabled(e),e}space(){if(!this.multiple)return this.alert();if(!this.focused)return;return this.toggle(this.focused),this.render()}a(){if(this.maxSelected<this.choices.length)return this.alert();let e=this.selectable.every((t)=>t.enabled);return this.choices.forEach((t)=>t.enabled=!e),this.render()}i(){if(this.choices.length-this.selected.length>this.maxSelected)return this.alert();return this.choices.forEach((e)=>e.enabled=!e.enabled),this.render()}g(){if(!this.choices.some((t)=>!!t.parent))return this.a();let e=this.focused;return this.toggle(e.parent&&!e.choices?e.parent:e),this.render()}toggle(e,t){if(!e.enabled&&this.selected.length>=this.maxSelected)return this.alert();if(typeof t!=="boolean")t=!e.enabled;if(e.enabled=t,e.choices)e.choices.forEach((o)=>this.toggle(o,t));let s=e.parent;while(s){let o=s.choices.filter((r)=>this.isDisabled(r));s.enabled=o.every((r)=>r.enabled===!0),s=s.parent}return Cs(this,this.choices),this.emit("toggle",e,this),e}enable(e){if(this.selected.length>=this.maxSelected)return this.alert();return e.enabled=!this.isDisabled(e),e.choices&&e.choices.forEach(this.enable.bind(this)),e}disable(e){return e.enabled=!1,e.choices&&e.choices.forEach(this.disable.bind(this)),e}number(e){this.num+=e;let t=(s)=>{let o=Number(s);if(o>this.choices.length-1)return this.alert();let r=this.focused,a=this.choices.find((i)=>o===i.index);if(!a.enabled&&this.selected.length>=this.maxSelected)return this.alert();if(this.visible.indexOf(a)===-1){let i=gt(this.choices),n=i.indexOf(a);if(r.index>n){let l=i.slice(n,n+this.limit),d=i.filter((m)=>!l.includes(m));this.choices=l.concat(d)}else{let l=n-this.limit+1;this.choices=i.slice(l).concat(i.slice(0,l))}}return this.index=this.choices.indexOf(a),this.toggle(this.focused),this.render()};return clearTimeout(this.numberTimeout),new Promise((s)=>{let o=this.choices.length,r=this.num,a=(i=!1,n)=>{if(clearTimeout(this.numberTimeout),i)n=t(r);this.num="",s(n)};if(r==="0"||r.length===1&&Number(r+"0")>o)return a(!0);if(Number(r)>o)return a(!1,this.alert());this.numberTimeout=setTimeout(()=>a(!0),this.delay)})}home(){return this.choices=gt(this.choices),this.index=0,this.render()}end(){let e=this.choices.length-this.limit,t=gt(this.choices);return this.choices=t.slice(e).concat(t.slice(0,e)),this.index=this.limit-1,this.render()}first(){return this.index=0,this.render()}last(){return this.index=this.visible.length-1,this.render()}prev(){if(this.visible.length<=1)return this.alert();return this.up()}next(){if(this.visible.length<=1)return this.alert();return this.down()}right(){if(this.cursor>=this.input.length)return this.alert();return this.cursor++,this.render()}left(){if(this.cursor<=0)return this.alert();return this.cursor--,this.render()}up(){let e=this.choices.length,t=this.visible.length,s=this.index;if(this.options.scroll===!1&&s===0)return this.alert();if(e>t&&s===0)return this.scrollUp();if(this.index=(s-1%e+e)%e,this.isDisabled()&&!this.allChoicesAreDisabled())return this.up();return this.render()}down(){let e=this.choices.length,t=this.visible.length,s=this.index;if(this.options.scroll===!1&&s===t-1)return this.alert();if(e>t&&s===t-1)return this.scrollDown();if(this.index=(s+1)%e,this.isDisabled()&&!this.allChoicesAreDisabled())return this.down();return this.render()}scrollUp(e=0){if(this.choices=Mn(this.choices),this.index=e,this.isDisabled())return this.up();return this.render()}scrollDown(e=this.visible.length-1){if(this.choices=Rn(this.choices),this.index=e,this.isDisabled())return this.down();return this.render()}async shiftUp(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index-1),await this.up(),this.sorting=!1;return}return this.scrollUp(this.index)}async shiftDown(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index+1),await this.down(),this.sorting=!1;return}return this.scrollDown(this.index)}pageUp(){if(this.visible.length<=1)return this.alert();if(this.limit=Math.max(this.limit-1,0),this.index=Math.min(this.limit-1,this.index),this._limit=this.limit,this.isDisabled())return this.up();return this.render()}pageDown(){if(this.visible.length>=this.choices.length)return this.alert();if(this.index=Math.max(0,this.index),this.limit=Math.min(this.limit+1,this.choices.length),this._limit=this.limit,this.isDisabled())return this.down();return this.render()}swap(e){_n(this.choices,this.index,e)}allChoicesAreDisabled(e=this.choices){return e.every((t)=>this.isDisabled(t))}isDisabled(e=this.focused){if(e&&["disabled","collapsed","hidden","completing","readonly"].some((s)=>e[s]===!0))return!0;return e&&e.role==="heading"}isEnabled(e=this.focused){if(Array.isArray(e))return e.every((t)=>this.isEnabled(t));if(e.choices){let t=e.choices.filter((s)=>!this.isDisabled(s));return e.enabled&&t.every((s)=>this.isEnabled(s))}return e.enabled&&!this.isDisabled(e)}isChoice(e,t){return e.name===t||e.index===Number(t)}isSelected(e){if(Array.isArray(this.initial))return this.initial.some((t)=>this.isChoice(e,t));return this.isChoice(e,this.initial)}map(e=[],t="value"){return[].concat(e||[]).reduce((s,o)=>{return s[o]=this.find(o,t),s},{})}filter(e,t){let o=typeof e==="function"?e:(i,n)=>[i.name,n].includes(e),a=(this.options.multiple?this.state._choices:this.choices).filter(o);if(t)return a.map((i)=>i[t]);return a}find(e,t){if(Ss(e))return t?e[t]:e;let o=typeof e==="function"?e:(a,i)=>[a.name,i].includes(e),r=this.choices.find(o);if(r)return t?r[t]:r}findIndex(e){return this.choices.indexOf(this.find(e))}async submit(){let e=this.focused;if(!e)return this.alert();if(e.newChoice){if(!e.input)return this.alert();return e.updateChoice(),this.render()}if(this.choices.some((a)=>a.newChoice))return this.alert();let{reorder:t,sort:s}=this.options,o=this.multiple===!0,r=this.selected;if(r===void 0)return this.alert();if(Array.isArray(r)&&t!==!1&&s!==!0)r=Me.reorder(r);return this.value=o?r.map((a)=>a.name):r.name,super.submit()}set choices(e=[]){this.state._choices=this.state._choices||[],this.state.choices=e;for(let t of e)if(!this.state._choices.some((s)=>s.name===t.name))this.state._choices.push(t);if(!this._initial&&this.options.initial){this._initial=!0;let t=this.initial;if(typeof t==="string"||typeof t==="number"){let s=this.find(t);if(s)this.initial=s.index,this.focus(s,!0)}}}get choices(){return Cs(this,this.state.choices||[])}set visible(e){this.state.visible=e}get visible(){return(this.state.visible||this.choices).slice(0,this.limit)}set limit(e){this.state.limit=e}get limit(){let{state:e,options:t,choices:s}=this,o=e.limit||this._limit||t.limit||s.length;return Math.min(o,this.height)}set value(e){super.value=e}get value(){if(typeof super.value!=="string"&&super.value===this.initial)return this.input;return super.value}set index(e){this.state.index=e}get index(){return Math.max(0,this.state?this.state.index:0)}get enabled(){return this.filter(this.isEnabled.bind(this))}get focused(){let e=this.choices[this.index];if(e&&this.state.submitted&&this.multiple!==!0)e.enabled=!0;return e}get selectable(){return this.choices.filter((e)=>!this.isDisabled(e))}get selected(){return this.multiple?this.enabled:this.focused}}function Cs(e,t){if(t instanceof Promise)return t;if(typeof t==="function"){if(Me.isAsyncFn(t))return t;t=t.call(e,e)}for(let s of t){if(Array.isArray(s.choices)){let o=s.choices.filter((r)=>!e.isDisabled(r));s.enabled=o.every((r)=>r.enabled===!0)}if(e.isDisabled(s)===!0)delete s.enabled}return t}Rs.exports=Ms});var re=w((Qc,Ds)=>{var Dn=ge(),bt=R();class _s extends Dn{constructor(e){super(e);this.emptyError=this.options.emptyError||"No items were selected"}async dispatch(e,t){if(this.multiple)return this[t.name]?await this[t.name](e,t):await super.dispatch(e,t);this.alert()}separator(){if(this.options.separator)return super.separator();let e=this.styles.muted(this.symbols.ellipsis);return this.state.submitted?super.separator():e}pointer(e,t){return!this.multiple||this.options.pointer?super.pointer(e,t):""}indicator(e,t){return this.multiple?super.indicator(e,t):""}choiceMessage(e,t){let s=this.resolve(e.message,this.state,e,t);if(e.role==="heading"&&!bt.hasColor(s))s=this.styles.strong(s);return this.resolve(s,this.state,e,t)}choiceSeparator(){return":"}async renderChoice(e,t){await this.onChoice(e,t);let s=this.index===t,o=await this.pointer(e,t),r=await this.indicator(e,t)+(e.pad||""),a=await this.resolve(e.hint,this.state,e,t);if(a&&!bt.hasColor(a))a=this.styles.muted(a);let i=this.indent(e),n=await this.choiceMessage(e,t),l=()=>[this.margin[3],i+o+r,n,this.margin[1],a].filter(Boolean).join(" ");if(e.role==="heading")return l();if(e.disabled){if(!bt.hasColor(n))n=this.styles.disabled(n);return l()}if(s)n=this.styles.em(n);return l()}async renderChoices(){if(this.state.loading==="choices")return this.styles.warning("Loading choices");if(this.state.submitted)return"";let e=this.visible.map(async(r,a)=>await this.renderChoice(r,a)),t=await Promise.all(e);if(!t.length)t.push(this.styles.danger("No matching choices"));let s=this.margin[0]+t.join(`
12
+ `),o;if(this.options.choicesHeader)o=await this.resolve(this.options.choicesHeader,this.state);return[o,s].filter(Boolean).join(`
13
+ `)}format(){if(!this.state.submitted||this.state.cancelled)return"";if(Array.isArray(this.selected))return this.selected.map((e)=>this.styles.primary(e.name)).join(", ");return this.styles.primary(this.selected.name)}async render(){let{submitted:e,size:t}=this.state,s="",o=await this.header(),r=await this.prefix(),a=await this.separator(),i=await this.message();if(this.options.promptLine!==!1)s=[r,i,a,""].join(" "),this.state.prompt=s;let n=await this.format(),l=await this.error()||await this.hint(),d=await this.renderChoices(),m=await this.footer();if(n)s+=n;if(l&&!s.includes(l))s+=" "+l;if(e&&!n&&!d.trim()&&this.multiple&&this.emptyError!=null)s+=this.styles.danger(this.emptyError);this.clear(t),this.write([o,s,d,m].filter(Boolean).join(`
14
+ `)),this.write(this.margin[2]),this.restore()}}Ds.exports=_s});var Os=w((Xc,Ps)=>{var In=re(),Pn=(e,t)=>{let s=e?new RegExp(e,"ig"):/$^/;return(o)=>{return e?o.replace(s,(r)=>t(r)):o}};class Is extends In{constructor(e){super(e);this.cursorShow()}moveCursor(e){this.state.cursor+=e}dispatch(e){return this.append(e)}space(e){return this.options.multiple?super.space(e):this.append(e)}append(e){let{cursor:t,input:s}=this.state;return this.input=s.slice(0,t)+e+s.slice(t),this.moveCursor(1),this.complete()}delete(){let{cursor:e,input:t}=this.state;if(!t)return this.alert();return this.input=t.slice(0,e-1)+t.slice(e),this.moveCursor(-1),this.complete()}deleteForward(){let{cursor:e,input:t}=this.state;if(t[e]===void 0)return this.alert();return this.input=`${t}`.slice(0,e)+`${t}`.slice(e+1),this.complete()}number(e){return this.append(e)}async complete(){this.completing=!0,this.choices=await this.suggest(this.input,this.state._choices),this.state.limit=void 0,this.index=Math.min(Math.max(this.visible.length-1,0),this.index),await this.render(),this.completing=!1}suggest(e=this.input,t=this.state._choices){if(typeof this.options.suggest==="function")return this.options.suggest.call(this,e,t);let s=e.toLowerCase();return t.filter((o)=>o.message.toLowerCase().includes(s))}pointer(){return""}format(){if(!this.focused)return this.input;if(this.options.multiple&&this.state.submitted)return this.selected.map((e)=>this.styles.primary(e.message)).join(", ");if(this.state.submitted){let e=this.value=this.input=this.focused.value;return this.styles.primary(e)}return this.input}async render(){if(this.state.status!=="pending")return super.render();let e=this.options.highlight||this.styles.complement,t=(r,a)=>{if(!r)return r;if(e.stack)return e(r);return e.call(this,r)},s=Pn(this.input,t),o=this.choices;this.choices=o.map((r)=>({...r,message:s(r.message)})),await super.render(),this.choices=o}submit(){if(this.options.multiple)this.value=this.selected.map((e)=>e.name);return super.submit()}}Ps.exports=Is});var xt=w((Jc,Bs)=>{var wt=R();Bs.exports=(e,t={})=>{e.cursorHide();let{input:s="",initial:o="",pos:r,showCursor:a=!0,color:i}=t,n=i||e.styles.placeholder,l=wt.inverse(e.styles.primary),d=(f)=>l(e.styles.black(f)),m=s,u=" ",p=d(u);if(e.blink&&e.blink.off===!0)d=(f)=>f,p="";if(a&&r===0&&o===""&&s==="")return d(u);if(a&&r===0&&(s===o||s===""))return d(o[0])+n(o.slice(1));o=wt.isPrimitive(o)?`${o}`:"",s=wt.isPrimitive(s)?`${s}`:"";let c=o&&o.startsWith(s)&&o!==s,h=c?d(o[s.length]):p;if(r!==s.length&&a===!0)m=s.slice(0,r)+d(s[r])+s.slice(r+1),h="";if(a===!1)h="";if(c){let f=e.styles.unstyle(m+h);return m+h+n(o.slice(f.length))}return m+h}});var Re=w((ep,Us)=>{var On=se(),Bn=re(),Ln=xt();class Ls extends Bn{constructor(e){super({...e,multiple:!0});this.type="form",this.initial=this.options.initial,this.align=[this.options.align,"right"].find((t)=>t!=null),this.emptyError="",this.values={}}async reset(e){if(await super.reset(),e===!0)this._index=this.index;return this.index=this._index,this.values={},this.choices.forEach((t)=>t.reset&&t.reset()),this.render()}dispatch(e){return!!e&&this.append(e)}append(e){let t=this.focused;if(!t)return this.alert();let{cursor:s,input:o}=t;return t.value=t.input=o.slice(0,s)+e+o.slice(s),t.cursor++,this.render()}delete(){let e=this.focused;if(!e||e.cursor<=0)return this.alert();let{cursor:t,input:s}=e;return e.value=e.input=s.slice(0,t-1)+s.slice(t),e.cursor--,this.render()}deleteForward(){let e=this.focused;if(!e)return this.alert();let{cursor:t,input:s}=e;if(s[t]===void 0)return this.alert();let o=`${s}`.slice(0,t)+`${s}`.slice(t+1);return e.value=e.input=o,this.render()}right(){let e=this.focused;if(!e)return this.alert();if(e.cursor>=e.input.length)return this.alert();return e.cursor++,this.render()}left(){let e=this.focused;if(!e)return this.alert();if(e.cursor<=0)return this.alert();return e.cursor--,this.render()}space(e,t){return this.dispatch(e,t)}number(e,t){return this.dispatch(e,t)}next(){let e=this.focused;if(!e)return this.alert();let{initial:t,input:s}=e;if(t&&t.startsWith(s)&&s!==t)return e.value=e.input=t,e.cursor=e.value.length,this.render();return super.next()}prev(){let e=this.focused;if(!e)return this.alert();if(e.cursor===0)return super.prev();return e.value=e.input="",e.cursor=0,this.render()}separator(){return""}format(e){return!this.state.submitted?super.format(e):""}pointer(){return""}indicator(e){return e.input?"\u29BF":"\u2299"}async choiceSeparator(e,t){let s=await this.resolve(e.separator,this.state,e,t)||":";return s?" "+this.styles.disabled(s):""}async renderChoice(e,t){await this.onChoice(e,t);let{state:s,styles:o}=this,{cursor:r,initial:a="",name:i,input:n=""}=e,{muted:l,submitted:d,primary:m,danger:u}=o,p=this.index===t,c=e.validate||(()=>!0),h=await this.choiceSeparator(e,t),f=e.message;if(this.align==="right")f=f.padStart(this.longest+1," ");if(this.align==="left")f=f.padEnd(this.longest+1," ");let E=this.values[i]=n||a,y=n?"success":"dark";if(await c.call(e,E,this.state)!==!0)y="danger";let x=o[y],A=x(await this.indicator(e,t))+(e.pad||""),N=this.indent(e),S=()=>[N,A,f+h,n].filter(Boolean).join(" ");if(s.submitted)return f=On(f),n=d(n),S();if(e.format)n=await e.format.call(this,n,e,t);else{let _=this.styles.muted;n=Ln(this,{input:n,initial:a,pos:r,showCursor:p,color:_})}if(!this.isValue(n))n=this.styles.muted(this.symbols.ellipsis);if(e.result)this.values[i]=await e.result.call(this,E,e,t);if(p)f=m(f);if(e.error)n+=(n?" ":"")+u(e.error.trim());else if(e.hint)n+=(n?" ":"")+l(e.hint.trim());return S()}async submit(){return this.value=this.values,super.base.submit.call(this)}}Us.exports=Ls});var Et=w((tp,$s)=>{var Un=Re(),Gn=()=>{throw Error("expected prompt to have a custom authenticate method")},Gs=(e=Gn)=>{class t extends Un{constructor(s){super(s)}async submit(){this.value=await e.call(this,this.values,this.state),super.base.submit.call(this)}static create(s){return Gs(s)}}return t};$s.exports=Gs()});var qs=w((sp,Ws)=>{var $n=Et();function kn(e,t){if(e.username===this.options.username&&e.password===this.options.password)return!0;return!1}var ks=(e=kn)=>{let t=[{name:"username",message:"username"},{name:"password",message:"password",format(o){if(this.options.showPassword)return o;return(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(o.length))}}];class s extends $n.create(e){constructor(o){super({...o,choices:t})}static create(o){return ks(o)}}return s};Ws.exports=ks()});var _e=w((op,Hs)=>{var Wn=ce(),{isPrimitive:qn,hasColor:Kn}=R();class Ks extends Wn{constructor(e){super(e);this.cursorHide()}async initialize(){let e=await this.resolve(this.initial,this.state);this.input=await this.cast(e),await super.initialize()}dispatch(e){if(!this.isValue(e))return this.alert();return this.input=e,this.submit()}format(e){let{styles:t,state:s}=this;return!s.submitted?t.primary(e):t.success(e)}cast(e){return this.isTrue(e)}isTrue(e){return/^[ty1]/i.test(e)}isFalse(e){return/^[fn0]/i.test(e)}isValue(e){return qn(e)&&(this.isTrue(e)||this.isFalse(e))}async hint(){if(this.state.status==="pending"){let e=await this.element("hint");if(!Kn(e))return this.styles.muted(e);return e}}async render(){let{input:e,size:t}=this.state,s=await this.prefix(),o=await this.separator(),r=await this.message(),a=this.styles.muted(this.default),i=[s,r,a,o].filter(Boolean).join(" ");this.state.prompt=i;let n=await this.header(),l=this.value=this.cast(e),d=await this.format(l),m=await this.error()||await this.hint(),u=await this.footer();if(m&&!i.includes(m))d+=" "+m;i+=" "+d,this.clear(t),this.write([n,i,u].filter(Boolean).join(`
15
+ `)),this.restore()}set value(e){super.value=e}get value(){return this.cast(super.value)}}Hs.exports=Ks});var Ys=w((rp,Vs)=>{var Hn=_e();class Fs extends Hn{constructor(e){super(e);this.default=this.options.default||(this.initial?"(Y/n)":"(y/N)")}}Vs.exports=Fs});var Zs=w((ap,zs)=>{var Fn=re(),Vn=Re(),pe=Vn.prototype;class js extends Fn{constructor(e){super({...e,multiple:!0});this.align=[this.options.align,"left"].find((t)=>t!=null),this.emptyError="",this.values={}}dispatch(e,t){let s=this.focused,o=s.parent||{};if(!s.editable&&!o.editable){if(e==="a"||e==="i")return super[e]()}return pe.dispatch.call(this,e,t)}append(e,t){return pe.append.call(this,e,t)}delete(e,t){return pe.delete.call(this,e,t)}space(e){return this.focused.editable?this.append(e):super.space()}number(e){return this.focused.editable?this.append(e):super.number(e)}next(){return this.focused.editable?pe.next.call(this):super.next()}prev(){return this.focused.editable?pe.prev.call(this):super.prev()}async indicator(e,t){let s=e.indicator||"",o=e.editable?s:super.indicator(e,t);return await this.resolve(o,this.state,e,t)||""}indent(e){return e.role==="heading"?"":e.editable?" ":" "}async renderChoice(e,t){if(e.indent="",e.editable)return pe.renderChoice.call(this,e,t);return super.renderChoice(e,t)}error(){return""}footer(){return this.state.error}async validate(){let e=!0;for(let t of this.choices){if(typeof t.validate!=="function")continue;if(t.role==="heading")continue;let s=t.parent?this.value[t.parent.name]:this.value;if(t.editable)s=t.value===t.name?t.initial||"":t.value;else if(!this.isDisabled(t))s=t.enabled===!0;if(e=await t.validate(s,this.state),e!==!0)break}if(e!==!0)this.state.error=typeof e==="string"?e:"Invalid Input";return e}submit(){if(this.focused.newChoice===!0)return super.submit();if(this.choices.some((e)=>e.newChoice))return this.alert();this.value={};for(let e of this.choices){let t=e.parent?this.value[e.parent.name]:this.value;if(e.role==="heading"){this.value[e.name]={};continue}if(e.editable)t[e.name]=e.value===e.name?e.initial||"":e.value;else if(!this.isDisabled(e))t[e.name]=e.enabled===!0}return this.base.submit.call(this)}}zs.exports=js});var de=w((ip,Xs)=>{var Yn=ce(),jn=nt(),zn=xt(),{isPrimitive:Zn}=R();class Qs extends Yn{constructor(e){super(e);if(this.initial=Zn(this.initial)?String(this.initial):"",this.initial)this.cursorHide();this.state.prevCursor=0,this.state.clipboard=[],this.keypressTimeout=this.options.keypressTimeout!==void 0?this.options.keypressTimeout:null}async keypress(e,t=e?jn(e,{}):{}){let s=Date.now(),o=s-this.lastKeypress;this.lastKeypress=s;let r=t.name==="return"||t.name==="enter",a=this.state.prevKeypress,i;if(this.state.prevKeypress=t,this.keypressTimeout!=null&&r){if(o<this.keypressTimeout)return this.submit();this.state.multilineBuffer=this.state.multilineBuffer||"",this.state.multilineBuffer+=e,i=!0,a=null}if(i||this.options.multiline&&r){if(!a||a.name!=="return")return this.append(`
16
+ `,t)}return super.keypress(e,t)}moveCursor(e){this.cursor+=e}reset(){return this.input=this.value="",this.cursor=0,this.render()}dispatch(e,t){if(!e||t.ctrl||t.code)return this.alert();this.append(e)}append(e){let{cursor:t,input:s}=this.state;this.input=`${s}`.slice(0,t)+e+`${s}`.slice(t),this.moveCursor(String(e).length),this.render()}insert(e){this.append(e)}delete(){let{cursor:e,input:t}=this.state;if(e<=0)return this.alert();this.input=`${t}`.slice(0,e-1)+`${t}`.slice(e),this.moveCursor(-1),this.render()}deleteForward(){let{cursor:e,input:t}=this.state;if(t[e]===void 0)return this.alert();this.input=`${t}`.slice(0,e)+`${t}`.slice(e+1),this.render()}cutForward(){let e=this.cursor;if(this.input.length<=e)return this.alert();this.state.clipboard.push(this.input.slice(e)),this.input=this.input.slice(0,e),this.render()}cutLeft(){let e=this.cursor;if(e===0)return this.alert();let t=this.input.slice(0,e),s=this.input.slice(e),o=t.split(" ");this.state.clipboard.push(o.pop()),this.input=o.join(" "),this.cursor=this.input.length,this.input+=s,this.render()}paste(){if(!this.state.clipboard.length)return this.alert();this.insert(this.state.clipboard.pop()),this.render()}toggleCursor(){if(this.state.prevCursor)this.cursor=this.state.prevCursor,this.state.prevCursor=0;else this.state.prevCursor=this.cursor,this.cursor=0;this.render()}first(){this.cursor=0,this.render()}last(){this.cursor=this.input.length-1,this.render()}next(){let e=this.initial!=null?String(this.initial):"";if(!e||!e.startsWith(this.input))return this.alert();this.input=this.initial,this.cursor=this.initial.length,this.render()}prev(){if(!this.input)return this.alert();this.reset()}backward(){return this.left()}forward(){return this.right()}right(){if(this.cursor>=this.input.length)return this.alert();return this.moveCursor(1),this.render()}left(){if(this.cursor<=0)return this.alert();return this.moveCursor(-1),this.render()}isValue(e){return!!e}async format(e=this.value){let t=await this.resolve(this.initial,this.state);if(!this.state.submitted)return zn(this,{input:e,initial:t,pos:this.cursor});return this.styles.submitted(e||t)}async render(){let e=this.state.size,t=await this.prefix(),s=await this.separator(),o=await this.message(),r=[t,o,s].filter(Boolean).join(" ");this.state.prompt=r;let a=await this.header(),i=await this.format(),n=await this.error()||await this.hint(),l=await this.footer();if(n&&!i.includes(n))i+=" "+n;r+=" "+i,this.clear(e),this.write([a,r,l].filter(Boolean).join(`
17
+ `)),this.restore()}}Xs.exports=Qs});var eo=w((np,Js)=>{var Qn=(e)=>e.filter((t,s)=>e.lastIndexOf(t)===s),De=(e)=>Qn(e).filter(Boolean);Js.exports=(e,t={},s="")=>{let{past:o=[],present:r=""}=t,a,i;switch(e){case"prev":case"undo":return a=o.slice(0,o.length-1),i=o[o.length-1]||"",{past:De([s,...a]),present:i};case"next":case"redo":return a=o.slice(1),i=o[0]||"",{past:De([...a,s]),present:i};case"save":return{past:De([...o,s]),present:""};case"remove":if(i=De(o.filter((n)=>n!==s)),r="",i.length)r=i.pop();return{past:i,present:r};default:throw Error(`Invalid action: "${e}"`)}}});var At=w((lp,oo)=>{var Xn=de(),to=eo();class so extends Xn{constructor(e){super(e);let t=this.options.history;if(t&&t.store){let s=t.values||this.initial;this.autosave=!!t.autosave,this.store=t.store,this.data=this.store.get("values")||{past:[],present:s},this.initial=this.data.present||this.data.past[this.data.past.length-1]}}completion(e){if(!this.store)return this.alert();if(this.data=to(e,this.data,this.input),!this.data.present)return this.alert();return this.input=this.data.present,this.cursor=this.input.length,this.render()}altUp(){return this.completion("prev")}altDown(){return this.completion("next")}prev(){return this.save(),super.prev()}save(){if(!this.store)return;this.data=to("save",this.data,this.input),this.store.set("values",this.data)}submit(){if(this.store&&this.autosave===!0)this.save();return super.submit()}}oo.exports=so});var io=w((dp,ao)=>{var Jn=de();class ro extends Jn{format(){return""}}ao.exports=ro});var mo=w((mp,lo)=>{var el=de();class no extends el{constructor(e={}){super(e);this.sep=this.options.separator||/, */,this.initial=e.initial||""}split(e=this.value){return e?String(e).split(this.sep):[]}format(){let e=this.state.submitted?this.styles.primary:(t)=>t;return this.list.map(e).join(", ")}async submit(e){let t=this.state.error||await this.validate(this.list,this.state);if(t!==!0)return this.state.error=t,super.submit();return this.value=this.list,super.submit()}get list(){return this.split()}}lo.exports=no});var uo=w((cp,po)=>{var tl=re();class co extends tl{constructor(e){super({...e,multiple:!0})}}po.exports=co});var vt=w((pp,fo)=>{var sl=de();class ho extends sl{constructor(e={}){super({style:"number",...e});this.min=this.isValue(e.min)?this.toNumber(e.min):-1/0,this.max=this.isValue(e.max)?this.toNumber(e.max):1/0,this.delay=e.delay!=null?e.delay:1000,this.float=e.float!==!1,this.round=e.round===!0||e.float===!1,this.major=e.major||10,this.minor=e.minor||1,this.initial=e.initial!=null?e.initial:"",this.input=String(this.initial),this.cursor=this.input.length,this.cursorShow()}append(e){if(!/[-+.]/.test(e)||e==="."&&this.input.includes("."))return this.alert("invalid number");return super.append(e)}number(e){return super.append(e)}next(){if(this.input&&this.input!==this.initial)return this.alert();if(!this.isValue(this.initial))return this.alert();return this.input=this.initial,this.cursor=String(this.initial).length,this.render()}up(e){let t=e||this.minor,s=this.toNumber(this.input);if(s>this.max+t)return this.alert();return this.input=`${s+t}`,this.render()}down(e){let t=e||this.minor,s=this.toNumber(this.input);if(s<this.min-t)return this.alert();return this.input=`${s-t}`,this.render()}shiftDown(){return this.down(this.major)}shiftUp(){return this.up(this.major)}format(e=this.input){if(typeof this.options.format==="function")return this.options.format.call(this,e);return this.styles.info(e)}toNumber(e=""){return this.float?+e:Math.round(+e)}isValue(e){return/^[-+]?[0-9]+((\.)|(\.[0-9]+))?$/.test(e)}submit(){let e=[this.input,this.initial].find((t)=>this.isValue(t));return this.value=this.toNumber(e||0),super.submit()}}fo.exports=ho});var bo=w((up,go)=>{var ol=de();class yo extends ol{constructor(e){super(e);this.cursorShow()}format(e=this.input){if(!this.keypressed)return"";return(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(e.length))}}go.exports=yo});var Ao=w((hp,Eo)=>{var rl=se(),al=ge(),wo=R();class xo extends al{constructor(e={}){super(e);this.widths=[].concat(e.messageWidth||50),this.align=[].concat(e.align||"left"),this.linebreak=e.linebreak||!1,this.edgeLength=e.edgeLength||3,this.newline=e.newline||`
18
+ `;let t=e.startNumber||1;if(typeof this.scale==="number")this.scaleKey=!1,this.scale=Array(this.scale).fill(0).map((s,o)=>({name:o+t}))}async reset(){return this.tableized=!1,await super.reset(),this.render()}tableize(){if(this.tableized===!0)return;this.tableized=!0;let e=0;for(let t of this.choices){e=Math.max(e,t.message.length),t.scaleIndex=t.initial||2,t.scale=[];for(let s=0;s<this.scale.length;s++)t.scale.push({index:s})}this.widths[0]=Math.min(this.widths[0],e+3)}async dispatch(e,t){if(this.multiple)return this[t.name]?await this[t.name](e,t):await super.dispatch(e,t);this.alert()}heading(e,t,s){return this.styles.strong(e)}separator(){return this.styles.muted(this.symbols.ellipsis)}right(){let e=this.focused;if(e.scaleIndex>=this.scale.length-1)return this.alert();return e.scaleIndex++,this.render()}left(){let e=this.focused;if(e.scaleIndex<=0)return this.alert();return e.scaleIndex--,this.render()}indent(){return""}format(){if(this.state.submitted)return this.choices.map((t)=>this.styles.info(t.index)).join(", ");return""}pointer(){return""}renderScaleKey(){if(this.scaleKey===!1)return"";if(this.state.submitted)return"";return["",...this.scale.map((s)=>` ${s.name} - ${s.message}`)].map((s)=>this.styles.muted(s)).join(`
19
+ `)}renderScaleHeading(e){let t=this.scale.map((n)=>n.name);if(typeof this.options.renderScaleHeading==="function")t=this.options.renderScaleHeading.call(this,e);let s=this.scaleLength-t.join("").length,o=Math.round(s/(t.length-1)),a=t.map((n)=>this.styles.strong(n)).join(" ".repeat(o)),i=" ".repeat(this.widths[0]);return this.margin[3]+i+this.margin[1]+a}scaleIndicator(e,t,s){if(typeof this.options.scaleIndicator==="function")return this.options.scaleIndicator.call(this,e,t,s);let o=e.scaleIndex===t.index;if(t.disabled)return this.styles.hint(this.symbols.radio.disabled);if(o)return this.styles.success(this.symbols.radio.on);return this.symbols.radio.off}renderScale(e,t){let s=e.scale.map((r)=>this.scaleIndicator(e,r,t)),o=this.term==="Hyper"?"":" ";return s.join(o+this.symbols.line.repeat(this.edgeLength))}async renderChoice(e,t){await this.onChoice(e,t);let s=this.index===t,o=await this.pointer(e,t),r=await e.hint;if(r&&!wo.hasColor(r))r=this.styles.muted(r);let a=(c)=>this.margin[3]+c.replace(/\s+$/,"").padEnd(this.widths[0]," "),i=this.newline,n=this.indent(e),l=await this.resolve(e.message,this.state,e,t),d=await this.renderScale(e,t),m=this.margin[1]+this.margin[3];this.scaleLength=rl(d).length,this.widths[0]=Math.min(this.widths[0],this.width-this.scaleLength-m.length);let p=wo.wordWrap(l,{width:this.widths[0],newline:i}).split(`
20
+ `).map((c)=>a(c)+this.margin[1]);if(s)d=this.styles.info(d),p=p.map((c)=>this.styles.info(c));if(p[0]+=d,this.linebreak)p.push("");return[n+o,p.join(`
21
+ `)].filter(Boolean)}async renderChoices(){if(this.state.submitted)return"";this.tableize();let e=this.visible.map(async(o,r)=>await this.renderChoice(o,r)),t=await Promise.all(e),s=await this.renderScaleHeading();return this.margin[0]+[s,...t.map((o)=>o.join(" "))].join(`
22
+ `)}async render(){let{submitted:e,size:t}=this.state,s=await this.prefix(),o=await this.separator(),r=await this.message(),a="";if(this.options.promptLine!==!1)a=[s,r,o,""].join(" "),this.state.prompt=a;let i=await this.header(),n=await this.format(),l=await this.renderScaleKey(),d=await this.error()||await this.hint(),m=await this.renderChoices(),u=await this.footer(),p=this.emptyError;if(n)a+=n;if(d&&!a.includes(d))a+=" "+d;if(e&&!n&&!m.trim()&&this.multiple&&p!=null)a+=this.styles.danger(p);if(this.clear(t),this.write([i,a,l,m,u].filter(Boolean).join(`
23
+ `)),!this.state.submitted)this.write(this.margin[2]);this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIndex;return this.base.submit.call(this)}}Eo.exports=xo});var So=w((fp,To)=>{var vo=se(),il=(e="")=>{return typeof e==="string"?e.replace(/^['"]|['"]$/g,""):""};class No{constructor(e){this.name=e.key,this.field=e.field||{},this.value=il(e.initial||this.field.initial||""),this.message=e.message||this.name,this.cursor=0,this.input="",this.lines=[]}}var nl=async(e={},t={},s=(o)=>o)=>{let o=new Set,r=e.fields||[],a=e.template,i=[],n=[],l=[],d=1;if(typeof a==="function")a=await a();let m=-1,u=()=>a[++m],p=()=>a[m+1],c=(h)=>{h.line=d,i.push(h)};c({type:"bos",value:""});while(m<a.length-1){let h=u();if(/^[^\S\n ]$/.test(h)){c({type:"text",value:h});continue}if(h===`
24
+ `){c({type:"newline",value:h}),d++;continue}if(h==="\\"){h+=u(),c({type:"text",value:h});continue}if((h==="$"||h==="#"||h==="{")&&p()==="{"){let E=u();h+=E;let y={type:"template",open:h,inner:"",close:"",value:h},x;while(x=u()){if(x==="}"){if(p()==="}")x+=u();y.value+=x,y.close=x;break}if(x===":")y.initial="",y.key=y.inner;else if(y.initial!==void 0)y.initial+=x;y.value+=x,y.inner+=x}if(y.template=y.open+(y.initial||y.inner)+y.close,y.key=y.key||y.inner,hasOwnProperty.call(t,y.key))y.initial=t[y.key];y=s(y),c(y),l.push(y.key),o.add(y.key);let A=n.find((N)=>N.name===y.key);if(y.field=r.find((N)=>N.name===y.key),!A)A=new No(y),n.push(A);A.lines.push(y.line-1);continue}let f=i[i.length-1];if(f.type==="text"&&f.line===d)f.value+=h;else c({type:"text",value:h})}return c({type:"eos",value:""}),{input:a,tabstops:i,unique:o,keys:l,items:n}};To.exports=async(e)=>{let t=e.options,s=new Set(t.required===!0?[]:t.required||[]),o={...t.values,...t.initial},{tabstops:r,items:a,keys:i}=await nl(t,o),n=Nt("result",e,t),l=Nt("format",e,t),d=Nt("validate",e,t,!0),m=e.isValue.bind(e);return async(u={},p=!1)=>{let c=0;u.required=s,u.items=a,u.keys=i,u.output="";let h=async(x,A,N,S)=>{let _=await d(x,A,N,S);if(_===!1)return"Invalid field "+N.name;return _};for(let x of r){let{value:A,key:N}=x;if(x.type!=="template"){if(A)u.output+=A;continue}if(x.type==="template"){let S=a.find((me)=>me.name===N);if(t.required===!0)u.required.add(S.name);let _=[S.input,u.values[S.value],S.value,A].find(m),ee=(S.field||{}).message||x.inner;if(p){let me=await h(u.values[N],u,S,c);if(me&&typeof me==="string"||me===!1){u.invalid.set(N,me);continue}u.invalid.delete(N);let ri=await n(u.values[N],u,S,c);u.output+=vo(ri);continue}S.placeholder=!1;let oi=A;if(A=await l(A,u,S,c),_!==A)u.values[N]=_,A=e.styles.typing(_),u.missing.delete(ee);else if(u.values[N]=void 0,_=`<${ee}>`,A=e.styles.primary(_),S.placeholder=!0,u.required.has(N))u.missing.add(ee);if(u.missing.has(ee)&&u.validating)A=e.styles.warning(_);if(u.invalid.has(N)&&u.validating)A=e.styles.danger(_);if(c===u.index)if(oi!==A)A=e.styles.underline(A);else A=e.styles.heading(vo(A));c++}if(A)u.output+=A}let f=u.output.split(`
25
+ `).map((x)=>" "+x),E=a.length,y=0;for(let x of a){if(u.invalid.has(x.name))x.lines.forEach((A)=>{if(f[A][0]!==" ")return;f[A]=u.styles.danger(u.symbols.bullet)+f[A].slice(1)});if(e.isValue(u.values[x.name]))y++}return u.completed=(y/E*100).toFixed(0),u.output=f.join(`
26
+ `),u.output}};function Nt(e,t,s,o){return(r,a,i,n)=>{if(typeof i.field[e]==="function")return i.field[e].call(t,r,a,i,n);return[o,r].find((l)=>t.isValue(l))}}});var Ro=w((yp,Mo)=>{var ll=se(),dl=So(),ml=ce();class Co extends ml{constructor(e){super(e);this.cursorHide(),this.reset(!0)}async initialize(){this.interpolate=await dl(this),await super.initialize()}async reset(e){if(this.state.keys=[],this.state.invalid=new Map,this.state.missing=new Set,this.state.completed=0,this.state.values={},e!==!0)await this.initialize(),await this.render()}moveCursor(e){let t=this.getItem();this.cursor+=e,t.cursor+=e}dispatch(e,t){if(!t.code&&!t.ctrl&&e!=null&&this.getItem()){this.append(e,t);return}this.alert()}append(e,t){let s=this.getItem(),o=s.input.slice(0,this.cursor),r=s.input.slice(this.cursor);this.input=s.input=`${o}${e}${r}`,this.moveCursor(1),this.render()}delete(){let e=this.getItem();if(this.cursor<=0||!e.input)return this.alert();let t=e.input.slice(this.cursor),s=e.input.slice(0,this.cursor-1);this.input=e.input=`${s}${t}`,this.moveCursor(-1),this.render()}increment(e){return e>=this.state.keys.length-1?0:e+1}decrement(e){return e<=0?this.state.keys.length-1:e-1}first(){this.state.index=0,this.render()}last(){this.state.index=this.state.keys.length-1,this.render()}right(){if(this.cursor>=this.input.length)return this.alert();this.moveCursor(1),this.render()}left(){if(this.cursor<=0)return this.alert();this.moveCursor(-1),this.render()}prev(){this.state.index=this.decrement(this.state.index),this.getItem(),this.render()}next(){this.state.index=this.increment(this.state.index),this.getItem(),this.render()}up(){this.prev()}down(){this.next()}format(e){let t=this.state.completed<100?this.styles.warning:this.styles.success;if(this.state.submitted===!0&&this.state.completed!==100)t=this.styles.danger;return t(`${this.state.completed}% completed`)}async render(){let{index:e,keys:t=[],submitted:s,size:o}=this.state,r=[this.options.newline,`
27
+ `].find((y)=>y!=null),a=await this.prefix(),i=await this.separator(),n=await this.message(),l=[a,n,i].filter(Boolean).join(" ");this.state.prompt=l;let d=await this.header(),m=await this.error()||"",u=await this.hint()||"",p=s?"":await this.interpolate(this.state),c=this.state.key=t[e]||"",h=await this.format(c),f=await this.footer();if(h)l+=" "+h;if(u&&!h&&this.state.completed===0)l+=" "+u;this.clear(o);let E=[d,l,p,f,m.trim()];this.write(E.filter(Boolean).join(r)),this.restore()}getItem(e){let{items:t,keys:s,index:o}=this.state,r=t.find((a)=>a.name===s[o]);if(r&&r.input!=null)this.input=r.input,this.cursor=r.cursor;return r}async submit(){if(typeof this.interpolate!=="function")await this.initialize();await this.interpolate(this.state,!0);let{invalid:e,missing:t,output:s,values:o}=this.state;if(e.size){let i="";for(let[n,l]of e)i+=`Invalid ${n}: ${l}
28
28
  `;return this.state.error=i,super.submit()}if(t.size)return this.state.error="Required: "+[...t.keys()].join(", "),super.submit();let a=ll(s).split(`
29
29
  `).map((i)=>i.slice(1)).join(`
30
- `);return this.value={values:r,result:a},super.submit()}}Mr.exports=Sr});var Dr=x((yp,_r)=>{var cl=oe();class Cr extends cl{constructor(e){super({...e,reorder:!1,sort:!0,multiple:!0});this.state.hint=[this.options.hint,"(Use <shift>+<up/down> to sort)"].find(this.isValue.bind(this))}indicator(){return""}async renderChoice(e,t){let s=await super.renderChoice(e,t),r=this.symbols.identicalTo+" ",o=this.index===t&&this.sorting?this.styles.muted(r):" ";if(this.options.drag===!1)o="";if(this.options.numbered===!0)return o+`${t+1} - `+s;return o+s}get selected(){return this.choices}submit(){return this.value=this.choices.map((e)=>e.value),super.submit()}}_r.exports=Cr});var Br=x((bp,Or)=>{var pl=ye();class Pr extends pl{constructor(e={}){super(e);if(this.emptyError=e.emptyError||"No items were selected",this.term=process.env.TERM_PROGRAM,!this.options.header){let t=["","4 - Strongly Agree","3 - Agree","2 - Neutral","1 - Disagree","0 - Strongly Disagree",""];t=t.map((s)=>this.styles.muted(s)),this.state.header=t.join(`
31
- `)}}async toChoices(...e){if(this.createdScales)return!1;this.createdScales=!0;let t=await super.toChoices(...e);for(let s of t)s.scale=ul(5,this.options),s.scaleIdx=2;return t}dispatch(){this.alert()}space(){let e=this.focused,t=e.scale[e.scaleIdx],s=t.selected;return e.scale.forEach((r)=>r.selected=!1),t.selected=!s,this.render()}indicator(){return""}pointer(){return""}separator(){return this.styles.muted(this.symbols.ellipsis)}right(){let e=this.focused;if(e.scaleIdx>=e.scale.length-1)return this.alert();return e.scaleIdx++,this.render()}left(){let e=this.focused;if(e.scaleIdx<=0)return this.alert();return e.scaleIdx--,this.render()}indent(){return" "}async renderChoice(e,t){await this.onChoice(e,t);let s=this.index===t,r=this.term==="Hyper",o=!r?8:9,a=!r?" ":"",i=this.symbols.line.repeat(o),n=" ".repeat(o+(r?0:1)),l=(E)=>(E?this.styles.success("\u25C9"):"\u25EF")+a,d=t+1+".",u=s?this.styles.heading:this.styles.noop,c=await this.resolve(e.message,this.state,e,t),p=this.indent(e),m=p+e.scale.map((E,A)=>l(A===e.scaleIdx)).join(i),h=(E)=>E===e.scaleIdx?u(E):E,f=p+e.scale.map((E,A)=>h(A)).join(n),w=()=>[d,c].filter(Boolean).join(" "),g=()=>[w(),m,f," "].filter(Boolean).join(`
32
- `);if(s)m=this.styles.cyan(m),f=this.styles.cyan(f);return g()}async renderChoices(){if(this.state.submitted)return"";let e=this.visible.map(async(s,r)=>await this.renderChoice(s,r)),t=await Promise.all(e);if(!t.length)t.push(this.styles.danger("No matching choices"));return t.join(`
33
- `)}format(){if(this.state.submitted)return this.choices.map((t)=>this.styles.info(t.scaleIdx)).join(", ");return""}async render(){let{submitted:e,size:t}=this.state,s=await this.prefix(),r=await this.separator(),o=await this.message(),a=[s,o,r].filter(Boolean).join(" ");this.state.prompt=a;let i=await this.header(),n=await this.format(),l=await this.error()||await this.hint(),d=await this.renderChoices(),u=await this.footer();if(n||!l)a+=" "+n;if(l&&!a.includes(l))a+=" "+l;if(e&&!n&&!d&&this.multiple&&this.type!=="form")a+=this.styles.danger(this.emptyError);this.clear(t),this.write([a,i,d,u].filter(Boolean).join(`
34
- `)),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIdx;return this.base.submit.call(this)}}function ul(e,t={}){if(Array.isArray(t.scale))return t.scale.map((r)=>({...r}));let s=[];for(let r=1;r<e+1;r++)s.push({i:r,selected:!1});return s}Or.exports=Pr});var Ur=x((xp,Lr)=>{var hl=_e();class Ir extends hl{async initialize(){await super.initialize(),this.value=this.initial=this.resolve(this.options.initial),this.disabled=this.options.disabled||"no",this.enabled=this.options.enabled||"yes",await this.render()}reset(){this.value=this.initial,this.render()}delete(){this.alert()}toggle(){this.value=!this.value,this.render()}enable(){if(this.value===!0)return this.alert();this.value=!0,this.render()}disable(){if(this.value===!1)return this.alert();this.value=!1,this.render()}up(){this.toggle()}down(){this.toggle()}right(){this.toggle()}left(){this.toggle()}next(){this.toggle()}prev(){this.toggle()}dispatch(e="",t){switch(e.toLowerCase()){case" ":return this.toggle();case"1":case"y":case"t":return this.enable();case"0":case"n":case"f":return this.disable();default:return this.alert()}}format(){let e=(s)=>this.styles.primary.underline(s);return[this.value?this.disabled:e(this.disabled),this.value?e(this.enabled):this.enabled].join(this.styles.muted(" / "))}async render(){let{size:e}=this.state,t=await this.header(),s=await this.prefix(),r=await this.separator(),o=await this.message(),a=await this.format(),i=await this.error()||await this.hint(),n=await this.footer(),l=[s,o,r,a].join(" ");if(this.state.prompt=l,i&&!l.includes(i))l+=" "+i;this.clear(e),this.write([t,l,n].filter(Boolean).join(`
35
- `)),this.write(this.margin[2]),this.restore()}}Lr.exports=Ir});var Wr=x((wp,$r)=>{var fl=oe();class Gr extends fl{constructor(e){super(e);if(typeof this.options.correctChoice!=="number"||this.options.correctChoice<0)throw Error("Please specify the index of the correct answer from the list of choices")}async toChoices(e,t){let s=await super.toChoices(e,t);if(s.length<2)throw Error("Please give at least two choices to the user");if(this.options.correctChoice>s.length)throw Error("Please specify the index of the correct answer from the list of choices");return s}check(e){return e.index===this.options.correctChoice}async result(e){return{selectedAnswer:e,correctAnswer:this.options.choices[this.options.correctChoice].value,correct:await this.check(this.state)}}}$r.exports=Gr});var kr=x((Nt)=>{var qr=C(),T=(e,t)=>{qr.defineExport(Nt,e,t),qr.defineExport(Nt,e.toLowerCase(),t)};T("AutoComplete",()=>Bs());T("BasicAuth",()=>ks());T("Confirm",()=>Fs());T("Editable",()=>Zs());T("Form",()=>Ce());T("Input",()=>wt());T("Invisible",()=>ir());T("List",()=>dr());T("MultiSelect",()=>pr());T("Numeral",()=>Et());T("Password",()=>yr());T("Scale",()=>Er());T("Select",()=>oe());T("Snippet",()=>Rr());T("Sort",()=>Dr());T("Survey",()=>Br());T("Text",()=>wt());T("Toggle",()=>Ur());T("Quiz",()=>Wr())});var Hr=x((Ap,Kr)=>{Kr.exports={ArrayPrompt:ye(),AuthPrompt:xt(),BooleanPrompt:_e(),NumberPrompt:Et(),StringPrompt:de()}});var ie=x((Np,Yr)=>{var Vr=he("assert"),Tt=he("events"),ae=C();class U extends Tt{constructor(e,t){super();this.options=ae.merge({},e),this.answers={...t}}register(e,t){if(ae.isObject(e)){for(let r of Object.keys(e))this.register(r,e[r]);return this}Vr.equal(typeof t,"function","expected a function");let s=e.toLowerCase();if(t.prototype instanceof this.Prompt)this.prompts[s]=t;else this.prompts[s]=t(this.Prompt,this);return this}async prompt(e=[]){for(let t of[].concat(e))try{if(typeof t==="function")t=await t.call(this);await this.ask(ae.merge({},this.options,t))}catch(s){return Promise.reject(s)}return this.answers}async ask(e){if(typeof e==="function")e=await e.call(this);let t=ae.merge({},this.options,e),{type:s,name:r}=e,{set:o,get:a}=ae;if(typeof s==="function")s=await s.call(this,e,this.answers);if(!s)return this.answers[r];if(s==="number")s="numeral";Vr(this.prompts[s],`Prompt "${s}" is not registered`);let i=new this.prompts[s](t),n=a(this.answers,r);if(i.state.answers=this.answers,i.enquirer=this,r)i.on("submit",(d)=>{this.emit("answer",r,d,i),o(this.answers,r,d)});let l=i.emit.bind(i);if(i.emit=(...d)=>{return this.emit.call(this,...d),l(...d)},this.emit("prompt",i,this),t.autofill&&n!=null){if(i.value=i.input=n,t.autofill==="show")await i.submit()}else n=i.value=await i.run();return n}use(e){return e.call(this,this),this}set Prompt(e){this._Prompt=e}get Prompt(){return this._Prompt||this.constructor.Prompt}get prompts(){return this.constructor.prompts}static set Prompt(e){this._Prompt=e}static get Prompt(){return this._Prompt||ce()}static get prompts(){return kr()}static get types(){return Hr()}static get prompt(){let e=(t,...s)=>{let r=new this(...s),o=r.emit.bind(r);return r.emit=(...a)=>{return e.emit(...a),o(...a)},r.prompt(t)};return ae.mixinEmitter(e,new Tt),e}}ae.mixinEmitter(U,new Tt);var vt=U.prompts;for(let e of Object.keys(vt)){let t=e.toLowerCase(),s=(r)=>new vt[e](r).run();if(U.prompt[t]=s,U[t]=s,!U[e])Reflect.defineProperty(U,e,{get:()=>vt[e]})}var be=(e)=>{ae.defineExport(U,e,()=>U.types[e])};be("ArrayPrompt");be("AuthPrompt");be("BooleanPrompt");be("NumberPrompt");be("StringPrompt");Yr.exports=U});var Ta=x((Dt,Pt)=>{(function(e,t){if(typeof Dt==="object"&&typeof Pt==="object")Pt.exports=t();else if(typeof define==="function"&&define.amd)define(function(){return t()});else e.pluralize=t()})(Dt,function(){var e=[],t=[],s={},r={},o={};function a(m){if(typeof m==="string")return new RegExp("^"+m+"$","i");return m}function i(m,h){if(m===h)return h;if(m===m.toLowerCase())return h.toLowerCase();if(m===m.toUpperCase())return h.toUpperCase();if(m[0]===m[0].toUpperCase())return h.charAt(0).toUpperCase()+h.substr(1).toLowerCase();return h.toLowerCase()}function n(m,h){return m.replace(/\$(\d{1,2})/g,function(f,w){return h[w]||""})}function l(m,h){return m.replace(h[0],function(f,w){var g=n(h[1],arguments);if(f==="")return i(m[w-1],g);return i(f,g)})}function d(m,h,f){if(!m.length||s.hasOwnProperty(m))return h;var w=f.length;while(w--){var g=f[w];if(g[0].test(h))return l(h,g)}return h}function u(m,h,f){return function(w){var g=w.toLowerCase();if(h.hasOwnProperty(g))return i(w,g);if(m.hasOwnProperty(g))return i(w,m[g]);return d(g,w,f)}}function c(m,h,f,w){return function(g){var E=g.toLowerCase();if(h.hasOwnProperty(E))return!0;if(m.hasOwnProperty(E))return!1;return d(E,E,f)===E}}function p(m,h,f){var w=h===1?p.singular(m):p.plural(m);return(f?h+" ":"")+w}return p.plural=u(o,r,e),p.isPlural=c(o,r,e),p.singular=u(r,o,t),p.isSingular=c(r,o,t),p.addPluralRule=function(m,h){e.push([a(m),h])},p.addSingularRule=function(m,h){t.push([a(m),h])},p.addUncountableRule=function(m){if(typeof m==="string"){s[m.toLowerCase()]=!0;return}p.addPluralRule(m,"$0"),p.addSingularRule(m,"$0")},p.addIrregularRule=function(m,h){h=h.toLowerCase(),m=m.toLowerCase(),o[m]=h,r[h]=m},[["I","we"],["me","us"],["he","they"],["she","they"],["them","them"],["myself","ourselves"],["yourself","yourselves"],["itself","themselves"],["herself","themselves"],["himself","themselves"],["themself","themselves"],["is","are"],["was","were"],["has","have"],["this","these"],["that","those"],["echo","echoes"],["dingo","dingoes"],["volcano","volcanoes"],["tornado","tornadoes"],["torpedo","torpedoes"],["genus","genera"],["viscus","viscera"],["stigma","stigmata"],["stoma","stomata"],["dogma","dogmata"],["lemma","lemmata"],["schema","schemata"],["anathema","anathemata"],["ox","oxen"],["axe","axes"],["die","dice"],["yes","yeses"],["foot","feet"],["eave","eaves"],["goose","geese"],["tooth","teeth"],["quiz","quizzes"],["human","humans"],["proof","proofs"],["carve","carves"],["valve","valves"],["looey","looies"],["thief","thieves"],["groove","grooves"],["pickaxe","pickaxes"],["passerby","passersby"]].forEach(function(m){return p.addIrregularRule(m[0],m[1])}),[[/s?$/i,"s"],[/[^\u0000-\u007F]$/i,"$0"],[/([^aeiou]ese)$/i,"$1"],[/(ax|test)is$/i,"$1es"],[/(alias|[^aou]us|t[lm]as|gas|ris)$/i,"$1es"],[/(e[mn]u)s?$/i,"$1s"],[/([^l]ias|[aeiou]las|[ejzr]as|[iu]am)$/i,"$1"],[/(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i,"$1i"],[/(alumn|alg|vertebr)(?:a|ae)$/i,"$1ae"],[/(seraph|cherub)(?:im)?$/i,"$1im"],[/(her|at|gr)o$/i,"$1oes"],[/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|automat|quor)(?:a|um)$/i,"$1a"],[/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)(?:a|on)$/i,"$1a"],[/sis$/i,"ses"],[/(?:(kni|wi|li)fe|(ar|l|ea|eo|oa|hoo)f)$/i,"$1$2ves"],[/([^aeiouy]|qu)y$/i,"$1ies"],[/([^ch][ieo][ln])ey$/i,"$1ies"],[/(x|ch|ss|sh|zz)$/i,"$1es"],[/(matr|cod|mur|sil|vert|ind|append)(?:ix|ex)$/i,"$1ices"],[/\b((?:tit)?m|l)(?:ice|ouse)$/i,"$1ice"],[/(pe)(?:rson|ople)$/i,"$1ople"],[/(child)(?:ren)?$/i,"$1ren"],[/eaux$/i,"$0"],[/m[ae]n$/i,"men"],["thou","you"]].forEach(function(m){return p.addPluralRule(m[0],m[1])}),[[/s$/i,""],[/(ss)$/i,"$1"],[/(wi|kni|(?:after|half|high|low|mid|non|night|[^\w]|^)li)ves$/i,"$1fe"],[/(ar|(?:wo|[ae])l|[eo][ao])ves$/i,"$1f"],[/ies$/i,"y"],[/\b([pl]|zomb|(?:neck|cross)?t|coll|faer|food|gen|goon|group|lass|talk|goal|cut)ies$/i,"$1ie"],[/\b(mon|smil)ies$/i,"$1ey"],[/\b((?:tit)?m|l)ice$/i,"$1ouse"],[/(seraph|cherub)im$/i,"$1"],[/(x|ch|ss|sh|zz|tto|go|cho|alias|[^aou]us|t[lm]as|gas|(?:her|at|gr)o|[aeiou]ris)(?:es)?$/i,"$1"],[/(analy|diagno|parenthe|progno|synop|the|empha|cri|ne)(?:sis|ses)$/i,"$1sis"],[/(movie|twelve|abuse|e[mn]u)s$/i,"$1"],[/(test)(?:is|es)$/i,"$1is"],[/(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i,"$1us"],[/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|quor)a$/i,"$1um"],[/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)a$/i,"$1on"],[/(alumn|alg|vertebr)ae$/i,"$1a"],[/(cod|mur|sil|vert|ind)ices$/i,"$1ex"],[/(matr|append)ices$/i,"$1ix"],[/(pe)(rson|ople)$/i,"$1rson"],[/(child)ren$/i,"$1"],[/(eau)x?$/i,"$1"],[/men$/i,"man"]].forEach(function(m){return p.addSingularRule(m[0],m[1])}),["adulthood","advice","agenda","aid","aircraft","alcohol","ammo","analytics","anime","athletics","audio","bison","blood","bream","buffalo","butter","carp","cash","chassis","chess","clothing","cod","commerce","cooperation","corps","debris","diabetes","digestion","elk","energy","equipment","excretion","expertise","firmware","flounder","fun","gallows","garbage","graffiti","hardware","headquarters","health","herpes","highjinks","homework","housework","information","jeans","justice","kudos","labour","literature","machinery","mackerel","mail","media","mews","moose","music","mud","manga","news","only","personnel","pike","plankton","pliers","police","pollution","premises","rain","research","rice","salmon","scissors","series","sewage","shambles","shrimp","software","species","staff","swine","tennis","traffic","transportation","trout","tuna","wealth","welfare","whiting","wildebeest","wildlife","you",/pok[e\u00E9]mon$/i,/[^aeiou]ese$/i,/deer$/i,/fish$/i,/measles$/i,/o[iu]s$/i,/pox$/i,/sheep$/i].forEach(p.addUncountableRule),p})});import{parseArgs as uc}from"util";import{Exception as ei}from"@ooneex/exception";import{TerminalLogger as hc}from"@ooneex/logger";import{container as pi}from"@ooneex/container";var Ae=[];var Ut=(e)=>{let t=null;return Ae.find((s)=>{return t=pi.get(s),t.getName()===e}),t};import{homedir as yi}from"os";import{join as tt}from"path";import{TerminalLogger as bi}from"@ooneex/logger";import{container as ui,EContainerScope as hi}from"@ooneex/container";var b={command:(e=hi.Singleton)=>{return(t)=>{ui.add(t,e),Ae.push(t)}}};var Gt=`#compdef oo ooneex
30
+ `);return this.value={values:o,result:a},super.submit()}}Mo.exports=Co});var Io=w((gp,Do)=>{var cl=re();class _o extends cl{constructor(e){super({...e,reorder:!1,sort:!0,multiple:!0});this.state.hint=[this.options.hint,"(Use <shift>+<up/down> to sort)"].find(this.isValue.bind(this))}indicator(){return""}async renderChoice(e,t){let s=await super.renderChoice(e,t),o=this.symbols.identicalTo+" ",r=this.index===t&&this.sorting?this.styles.muted(o):" ";if(this.options.drag===!1)r="";if(this.options.numbered===!0)return r+`${t+1} - `+s;return r+s}get selected(){return this.choices}submit(){return this.value=this.choices.map((e)=>e.value),super.submit()}}Do.exports=_o});var Bo=w((bp,Oo)=>{var pl=ge();class Po extends pl{constructor(e={}){super(e);if(this.emptyError=e.emptyError||"No items were selected",this.term=process.env.TERM_PROGRAM,!this.options.header){let t=["","4 - Strongly Agree","3 - Agree","2 - Neutral","1 - Disagree","0 - Strongly Disagree",""];t=t.map((s)=>this.styles.muted(s)),this.state.header=t.join(`
31
+ `)}}async toChoices(...e){if(this.createdScales)return!1;this.createdScales=!0;let t=await super.toChoices(...e);for(let s of t)s.scale=ul(5,this.options),s.scaleIdx=2;return t}dispatch(){this.alert()}space(){let e=this.focused,t=e.scale[e.scaleIdx],s=t.selected;return e.scale.forEach((o)=>o.selected=!1),t.selected=!s,this.render()}indicator(){return""}pointer(){return""}separator(){return this.styles.muted(this.symbols.ellipsis)}right(){let e=this.focused;if(e.scaleIdx>=e.scale.length-1)return this.alert();return e.scaleIdx++,this.render()}left(){let e=this.focused;if(e.scaleIdx<=0)return this.alert();return e.scaleIdx--,this.render()}indent(){return" "}async renderChoice(e,t){await this.onChoice(e,t);let s=this.index===t,o=this.term==="Hyper",r=!o?8:9,a=!o?" ":"",i=this.symbols.line.repeat(r),n=" ".repeat(r+(o?0:1)),l=(x)=>(x?this.styles.success("\u25C9"):"\u25EF")+a,d=t+1+".",m=s?this.styles.heading:this.styles.noop,u=await this.resolve(e.message,this.state,e,t),p=this.indent(e),c=p+e.scale.map((x,A)=>l(A===e.scaleIdx)).join(i),h=(x)=>x===e.scaleIdx?m(x):x,f=p+e.scale.map((x,A)=>h(A)).join(n),E=()=>[d,u].filter(Boolean).join(" "),y=()=>[E(),c,f," "].filter(Boolean).join(`
32
+ `);if(s)c=this.styles.cyan(c),f=this.styles.cyan(f);return y()}async renderChoices(){if(this.state.submitted)return"";let e=this.visible.map(async(s,o)=>await this.renderChoice(s,o)),t=await Promise.all(e);if(!t.length)t.push(this.styles.danger("No matching choices"));return t.join(`
33
+ `)}format(){if(this.state.submitted)return this.choices.map((t)=>this.styles.info(t.scaleIdx)).join(", ");return""}async render(){let{submitted:e,size:t}=this.state,s=await this.prefix(),o=await this.separator(),r=await this.message(),a=[s,r,o].filter(Boolean).join(" ");this.state.prompt=a;let i=await this.header(),n=await this.format(),l=await this.error()||await this.hint(),d=await this.renderChoices(),m=await this.footer();if(n||!l)a+=" "+n;if(l&&!a.includes(l))a+=" "+l;if(e&&!n&&!d&&this.multiple&&this.type!=="form")a+=this.styles.danger(this.emptyError);this.clear(t),this.write([a,i,d,m].filter(Boolean).join(`
34
+ `)),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIdx;return this.base.submit.call(this)}}function ul(e,t={}){if(Array.isArray(t.scale))return t.scale.map((o)=>({...o}));let s=[];for(let o=1;o<e+1;o++)s.push({i:o,selected:!1});return s}Oo.exports=Po});var Go=w((wp,Uo)=>{var hl=_e();class Lo extends hl{async initialize(){await super.initialize(),this.value=this.initial=this.resolve(this.options.initial),this.disabled=this.options.disabled||"no",this.enabled=this.options.enabled||"yes",await this.render()}reset(){this.value=this.initial,this.render()}delete(){this.alert()}toggle(){this.value=!this.value,this.render()}enable(){if(this.value===!0)return this.alert();this.value=!0,this.render()}disable(){if(this.value===!1)return this.alert();this.value=!1,this.render()}up(){this.toggle()}down(){this.toggle()}right(){this.toggle()}left(){this.toggle()}next(){this.toggle()}prev(){this.toggle()}dispatch(e="",t){switch(e.toLowerCase()){case" ":return this.toggle();case"1":case"y":case"t":return this.enable();case"0":case"n":case"f":return this.disable();default:return this.alert()}}format(){let e=(s)=>this.styles.primary.underline(s);return[this.value?this.disabled:e(this.disabled),this.value?e(this.enabled):this.enabled].join(this.styles.muted(" / "))}async render(){let{size:e}=this.state,t=await this.header(),s=await this.prefix(),o=await this.separator(),r=await this.message(),a=await this.format(),i=await this.error()||await this.hint(),n=await this.footer(),l=[s,r,o,a].join(" ");if(this.state.prompt=l,i&&!l.includes(i))l+=" "+i;this.clear(e),this.write([t,l,n].filter(Boolean).join(`
35
+ `)),this.write(this.margin[2]),this.restore()}}Uo.exports=Lo});var Wo=w((xp,ko)=>{var fl=re();class $o extends fl{constructor(e){super(e);if(typeof this.options.correctChoice!=="number"||this.options.correctChoice<0)throw Error("Please specify the index of the correct answer from the list of choices")}async toChoices(e,t){let s=await super.toChoices(e,t);if(s.length<2)throw Error("Please give at least two choices to the user");if(this.options.correctChoice>s.length)throw Error("Please specify the index of the correct answer from the list of choices");return s}check(e){return e.index===this.options.correctChoice}async result(e){return{selectedAnswer:e,correctAnswer:this.options.choices[this.options.correctChoice].value,correct:await this.check(this.state)}}}ko.exports=$o});var Ko=w((Tt)=>{var qo=R(),T=(e,t)=>{qo.defineExport(Tt,e,t),qo.defineExport(Tt,e.toLowerCase(),t)};T("AutoComplete",()=>Os());T("BasicAuth",()=>qs());T("Confirm",()=>Ys());T("Editable",()=>Zs());T("Form",()=>Re());T("Input",()=>At());T("Invisible",()=>io());T("List",()=>mo());T("MultiSelect",()=>uo());T("Numeral",()=>vt());T("Password",()=>bo());T("Scale",()=>Ao());T("Select",()=>re());T("Snippet",()=>Ro());T("Sort",()=>Io());T("Survey",()=>Bo());T("Text",()=>At());T("Toggle",()=>Go());T("Quiz",()=>Wo())});var Fo=w((Ap,Ho)=>{Ho.exports={ArrayPrompt:ge(),AuthPrompt:Et(),BooleanPrompt:_e(),NumberPrompt:vt(),StringPrompt:de()}});var ie=w((vp,Yo)=>{var Vo=he("assert"),Ct=he("events"),ae=R();class U extends Ct{constructor(e,t){super();this.options=ae.merge({},e),this.answers={...t}}register(e,t){if(ae.isObject(e)){for(let o of Object.keys(e))this.register(o,e[o]);return this}Vo.equal(typeof t,"function","expected a function");let s=e.toLowerCase();if(t.prototype instanceof this.Prompt)this.prompts[s]=t;else this.prompts[s]=t(this.Prompt,this);return this}async prompt(e=[]){for(let t of[].concat(e))try{if(typeof t==="function")t=await t.call(this);await this.ask(ae.merge({},this.options,t))}catch(s){return Promise.reject(s)}return this.answers}async ask(e){if(typeof e==="function")e=await e.call(this);let t=ae.merge({},this.options,e),{type:s,name:o}=e,{set:r,get:a}=ae;if(typeof s==="function")s=await s.call(this,e,this.answers);if(!s)return this.answers[o];if(s==="number")s="numeral";Vo(this.prompts[s],`Prompt "${s}" is not registered`);let i=new this.prompts[s](t),n=a(this.answers,o);if(i.state.answers=this.answers,i.enquirer=this,o)i.on("submit",(d)=>{this.emit("answer",o,d,i),r(this.answers,o,d)});let l=i.emit.bind(i);if(i.emit=(...d)=>{return this.emit.call(this,...d),l(...d)},this.emit("prompt",i,this),t.autofill&&n!=null){if(i.value=i.input=n,t.autofill==="show")await i.submit()}else n=i.value=await i.run();return n}use(e){return e.call(this,this),this}set Prompt(e){this._Prompt=e}get Prompt(){return this._Prompt||this.constructor.Prompt}get prompts(){return this.constructor.prompts}static set Prompt(e){this._Prompt=e}static get Prompt(){return this._Prompt||ce()}static get prompts(){return Ko()}static get types(){return Fo()}static get prompt(){let e=(t,...s)=>{let o=new this(...s),r=o.emit.bind(o);return o.emit=(...a)=>{return e.emit(...a),r(...a)},o.prompt(t)};return ae.mixinEmitter(e,new Ct),e}}ae.mixinEmitter(U,new Ct);var St=U.prompts;for(let e of Object.keys(St)){let t=e.toLowerCase(),s=(o)=>new St[e](o).run();if(U.prompt[t]=s,U[t]=s,!U[e])Reflect.defineProperty(U,e,{get:()=>St[e]})}var be=(e)=>{ae.defineExport(U,e,()=>U.types[e])};be("ArrayPrompt");be("AuthPrompt");be("BooleanPrompt");be("NumberPrompt");be("StringPrompt");Yo.exports=U});var va=w((Pt,Ot)=>{(function(e,t){if(typeof Pt==="object"&&typeof Ot==="object")Ot.exports=t();else if(typeof define==="function"&&define.amd)define(function(){return t()});else e.pluralize=t()})(Pt,function(){var e=[],t=[],s={},o={},r={};function a(c){if(typeof c==="string")return new RegExp("^"+c+"$","i");return c}function i(c,h){if(c===h)return h;if(c===c.toLowerCase())return h.toLowerCase();if(c===c.toUpperCase())return h.toUpperCase();if(c[0]===c[0].toUpperCase())return h.charAt(0).toUpperCase()+h.substr(1).toLowerCase();return h.toLowerCase()}function n(c,h){return c.replace(/\$(\d{1,2})/g,function(f,E){return h[E]||""})}function l(c,h){return c.replace(h[0],function(f,E){var y=n(h[1],arguments);if(f==="")return i(c[E-1],y);return i(f,y)})}function d(c,h,f){if(!c.length||s.hasOwnProperty(c))return h;var E=f.length;while(E--){var y=f[E];if(y[0].test(h))return l(h,y)}return h}function m(c,h,f){return function(E){var y=E.toLowerCase();if(h.hasOwnProperty(y))return i(E,y);if(c.hasOwnProperty(y))return i(E,c[y]);return d(y,E,f)}}function u(c,h,f,E){return function(y){var x=y.toLowerCase();if(h.hasOwnProperty(x))return!0;if(c.hasOwnProperty(x))return!1;return d(x,x,f)===x}}function p(c,h,f){var E=h===1?p.singular(c):p.plural(c);return(f?h+" ":"")+E}return p.plural=m(r,o,e),p.isPlural=u(r,o,e),p.singular=m(o,r,t),p.isSingular=u(o,r,t),p.addPluralRule=function(c,h){e.push([a(c),h])},p.addSingularRule=function(c,h){t.push([a(c),h])},p.addUncountableRule=function(c){if(typeof c==="string"){s[c.toLowerCase()]=!0;return}p.addPluralRule(c,"$0"),p.addSingularRule(c,"$0")},p.addIrregularRule=function(c,h){h=h.toLowerCase(),c=c.toLowerCase(),r[c]=h,o[h]=c},[["I","we"],["me","us"],["he","they"],["she","they"],["them","them"],["myself","ourselves"],["yourself","yourselves"],["itself","themselves"],["herself","themselves"],["himself","themselves"],["themself","themselves"],["is","are"],["was","were"],["has","have"],["this","these"],["that","those"],["echo","echoes"],["dingo","dingoes"],["volcano","volcanoes"],["tornado","tornadoes"],["torpedo","torpedoes"],["genus","genera"],["viscus","viscera"],["stigma","stigmata"],["stoma","stomata"],["dogma","dogmata"],["lemma","lemmata"],["schema","schemata"],["anathema","anathemata"],["ox","oxen"],["axe","axes"],["die","dice"],["yes","yeses"],["foot","feet"],["eave","eaves"],["goose","geese"],["tooth","teeth"],["quiz","quizzes"],["human","humans"],["proof","proofs"],["carve","carves"],["valve","valves"],["looey","looies"],["thief","thieves"],["groove","grooves"],["pickaxe","pickaxes"],["passerby","passersby"]].forEach(function(c){return p.addIrregularRule(c[0],c[1])}),[[/s?$/i,"s"],[/[^\u0000-\u007F]$/i,"$0"],[/([^aeiou]ese)$/i,"$1"],[/(ax|test)is$/i,"$1es"],[/(alias|[^aou]us|t[lm]as|gas|ris)$/i,"$1es"],[/(e[mn]u)s?$/i,"$1s"],[/([^l]ias|[aeiou]las|[ejzr]as|[iu]am)$/i,"$1"],[/(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i,"$1i"],[/(alumn|alg|vertebr)(?:a|ae)$/i,"$1ae"],[/(seraph|cherub)(?:im)?$/i,"$1im"],[/(her|at|gr)o$/i,"$1oes"],[/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|automat|quor)(?:a|um)$/i,"$1a"],[/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)(?:a|on)$/i,"$1a"],[/sis$/i,"ses"],[/(?:(kni|wi|li)fe|(ar|l|ea|eo|oa|hoo)f)$/i,"$1$2ves"],[/([^aeiouy]|qu)y$/i,"$1ies"],[/([^ch][ieo][ln])ey$/i,"$1ies"],[/(x|ch|ss|sh|zz)$/i,"$1es"],[/(matr|cod|mur|sil|vert|ind|append)(?:ix|ex)$/i,"$1ices"],[/\b((?:tit)?m|l)(?:ice|ouse)$/i,"$1ice"],[/(pe)(?:rson|ople)$/i,"$1ople"],[/(child)(?:ren)?$/i,"$1ren"],[/eaux$/i,"$0"],[/m[ae]n$/i,"men"],["thou","you"]].forEach(function(c){return p.addPluralRule(c[0],c[1])}),[[/s$/i,""],[/(ss)$/i,"$1"],[/(wi|kni|(?:after|half|high|low|mid|non|night|[^\w]|^)li)ves$/i,"$1fe"],[/(ar|(?:wo|[ae])l|[eo][ao])ves$/i,"$1f"],[/ies$/i,"y"],[/\b([pl]|zomb|(?:neck|cross)?t|coll|faer|food|gen|goon|group|lass|talk|goal|cut)ies$/i,"$1ie"],[/\b(mon|smil)ies$/i,"$1ey"],[/\b((?:tit)?m|l)ice$/i,"$1ouse"],[/(seraph|cherub)im$/i,"$1"],[/(x|ch|ss|sh|zz|tto|go|cho|alias|[^aou]us|t[lm]as|gas|(?:her|at|gr)o|[aeiou]ris)(?:es)?$/i,"$1"],[/(analy|diagno|parenthe|progno|synop|the|empha|cri|ne)(?:sis|ses)$/i,"$1sis"],[/(movie|twelve|abuse|e[mn]u)s$/i,"$1"],[/(test)(?:is|es)$/i,"$1is"],[/(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i,"$1us"],[/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|quor)a$/i,"$1um"],[/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)a$/i,"$1on"],[/(alumn|alg|vertebr)ae$/i,"$1a"],[/(cod|mur|sil|vert|ind)ices$/i,"$1ex"],[/(matr|append)ices$/i,"$1ix"],[/(pe)(rson|ople)$/i,"$1rson"],[/(child)ren$/i,"$1"],[/(eau)x?$/i,"$1"],[/men$/i,"man"]].forEach(function(c){return p.addSingularRule(c[0],c[1])}),["adulthood","advice","agenda","aid","aircraft","alcohol","ammo","analytics","anime","athletics","audio","bison","blood","bream","buffalo","butter","carp","cash","chassis","chess","clothing","cod","commerce","cooperation","corps","debris","diabetes","digestion","elk","energy","equipment","excretion","expertise","firmware","flounder","fun","gallows","garbage","graffiti","hardware","headquarters","health","herpes","highjinks","homework","housework","information","jeans","justice","kudos","labour","literature","machinery","mackerel","mail","media","mews","moose","music","mud","manga","news","only","personnel","pike","plankton","pliers","police","pollution","premises","rain","research","rice","salmon","scissors","series","sewage","shambles","shrimp","software","species","staff","swine","tennis","traffic","transportation","trout","tuna","wealth","welfare","whiting","wildebeest","wildlife","you",/pok[e\u00E9]mon$/i,/[^aeiou]ese$/i,/deer$/i,/fish$/i,/measles$/i,/o[iu]s$/i,/pox$/i,/sheep$/i].forEach(p.addUncountableRule),p})});import{parseArgs as uc}from"util";import{Exception as ei}from"@ooneex/exception";import{TerminalLogger as hc}from"@ooneex/logger";import{container as pi}from"@ooneex/container";var Ae=[];var Ut=(e)=>{let t=null;return Ae.find((s)=>{return t=pi.get(s),t.getName()===e}),t};import{homedir as gi}from"os";import{join as ot}from"path";import{TerminalLogger as bi}from"@ooneex/logger";import{container as ui,EContainerScope as hi}from"@ooneex/container";var b={command:(e=hi.Singleton)=>{return(t)=>{ui.add(t,e),Ae.push(t)}}};var Gt=`#compdef oo ooneex
36
36
 
37
37
  _oo_modules() {
38
38
  local -a modules
@@ -110,14 +110,12 @@ _oo() {
110
110
  ;;
111
111
  make:migration)
112
112
  _arguments -s \\
113
- '--module=[Module name]:module:_oo_modules' \\
114
- '--dir=[Directory]:dir:_files -/'
113
+ '--module=[Module name]:module:_oo_modules'
115
114
  ;;
116
115
  make:seed)
117
116
  _arguments -s \\
118
117
  '--name=[Name of the resource]:name' \\
119
- '--module=[Module name]:module:_oo_modules' \\
120
- '--dir=[Directory]:dir:_files -/'
118
+ '--module=[Module name]:module:_oo_modules'
121
119
  ;;
122
120
  make:module)
123
121
  _arguments -s \\
@@ -224,14 +222,12 @@ _ooneex() {
224
222
  ;;
225
223
  make:migration)
226
224
  _arguments -s \\
227
- '--module=[Module name]:module:_ooneex_modules' \\
228
- '--dir=[Directory]:dir:_files -/'
225
+ '--module=[Module name]:module:_ooneex_modules'
229
226
  ;;
230
227
  make:seed)
231
228
  _arguments -s \\
232
229
  '--name=[Name of the resource]:name' \\
233
- '--module=[Module name]:module:_ooneex_modules' \\
234
- '--dir=[Directory]:dir:_files -/'
230
+ '--module=[Module name]:module:_ooneex_modules'
235
231
  ;;
236
232
  make:module)
237
233
  _arguments -s \\
@@ -260,9 +256,9 @@ _ooneex() {
260
256
  }
261
257
 
262
258
  _ooneex "$@"
263
- `;class Ne{getName(){return"completion:zsh"}getDescription(){return"Install Zsh completion for oo command"}async run(){let e=tt(yi(),".zsh"),t=tt(e,"_oo");await Bun.write(t,Gt);let s=tt(e,"_ooneex");await Bun.write(s,$t);let r=new bi;r.success(`${t} created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),r.success(`${s} created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),r.info(`Add the following to your .zshrc if not already present:
259
+ `;class ve{getName(){return"completion:zsh"}getDescription(){return"Install Zsh completion for oo command"}async run(){let e=ot(gi(),".zsh"),t=ot(e,"_oo");await Bun.write(t,Gt);let s=ot(e,"_ooneex");await Bun.write(s,$t);let o=new bi;o.success(`${t} created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),o.success(`${s} created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),o.info(`Add the following to your .zshrc if not already present:
264
260
  fpath=(~/.zsh $fpath)
265
- autoload -Uz compinit && compinit`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}Ne=y([b.command()],Ne);import{join as V}from"path";import{TerminalLogger as Al}from"@ooneex/logger";import{toPascalCase as Nl}from"@ooneex/utils";var Fr=te(ie(),1);import{Assert as gl,Validation as yl}from"@ooneex/validation";var bl=1,xl=/^[a-zA-Z][a-zA-Z0-9-]*$/;class xe extends yl{getConstraint(){return gl(`string >= ${bl}`)}getErrorMessage(){return"Name must start with a letter and contain only letters, numbers, and hyphens"}validate(e,t){let s=super.validate(e,t);if(!s.isValid)return s;let r=e;if(!xl.test(r))return{isValid:!1,message:this.getErrorMessage()||"Invalid name format"};return{isValid:!0}}}var N=async(e)=>{return(await Fr.prompt({type:"input",name:"name",message:e.message,validate:(s)=>{let o=new xe().validate(s);if(!o.isValid)return o.message||"Controller name is invalid";return!0}})).name};var jr=`import { describe, expect, test } from "bun:test";
261
+ autoload -Uz compinit && compinit`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}ve=g([b.command()],ve);import{join as F}from"path";import{TerminalLogger as Al}from"@ooneex/logger";import{toPascalCase as vl}from"@ooneex/utils";var jo=te(ie(),1);import{Assert as yl,Validation as gl}from"@ooneex/validation";var bl=1,wl=/^[a-zA-Z][a-zA-Z0-9-]*$/;class we extends gl{getConstraint(){return yl(`string >= ${bl}`)}getErrorMessage(){return"Name must start with a letter and contain only letters, numbers, and hyphens"}validate(e,t){let s=super.validate(e,t);if(!s.isValid)return s;let o=e;if(!wl.test(o))return{isValid:!1,message:this.getErrorMessage()||"Invalid name format"};return{isValid:!0}}}var v=async(e)=>{return(await jo.prompt({type:"input",name:"name",message:e.message,validate:(s)=>{let r=new we().validate(s);if(!r.isValid)return r.message||"Controller name is invalid";return!0}})).name};var zo=`import { describe, expect, test } from "bun:test";
266
262
  import { {{NAME}}Ai } from "@/ai/{{NAME}}Ai";
267
263
 
268
264
  describe("{{NAME}}Ai", () => {
@@ -280,7 +276,7 @@ describe("{{NAME}}Ai", () => {
280
276
  expect(typeof {{NAME}}Ai.prototype.runStream).toBe("function");
281
277
  });
282
278
  });
283
- `;var zr=`import { decorator, type IAiChat, OpenAi, type OpenAiConfigType } from "@ooneex/ai";
279
+ `;var Zo=`import { decorator, type IAiChat, OpenAi, type OpenAiConfigType } from "@ooneex/ai";
284
280
  import { inject } from "@ooneex/container";
285
281
 
286
282
  @decorator.ai()
@@ -298,7 +294,7 @@ export class {{NAME}}Ai implements IAiChat<OpenAiConfigType> {
298
294
  yield* this.ai.runStream(prompt || "My prompt", config);
299
295
  }
300
296
  }
301
- `;class Pe{getName(){return"make:ai"}getDescription(){return"Generate a new AI class"}async run(e){let{name:t,module:s}=e;if(!t)t=await N({message:"Enter name"});t=Nl(t).replace(/Ai$/,"");let r=zr.replace(/{{NAME}}/g,t),o=s?V("modules",s):".",a=V(o,"src","ai"),i=V(process.cwd(),a),n=V(i,`${t}Ai.ts`);await Bun.write(n,r);let l=jr.replace(/{{NAME}}/g,t),d=V(o,"tests","ai"),u=V(process.cwd(),d),c=V(u,`${t}Ai.spec.ts`);await Bun.write(c,l);let p=new Al;p.success(`${V(a,t)}Ai.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),p.success(`${V(d,t)}Ai.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}Pe=y([b.command()],Pe);import{join as Y}from"path";import{TerminalLogger as Sl}from"@ooneex/logger";import{toPascalCase as Ml}from"@ooneex/utils";var Zr=`import { describe, expect, test } from "bun:test";
297
+ `;class Ie{getName(){return"make:ai"}getDescription(){return"Generate a new AI class"}async run(e){let{name:t,module:s}=e;if(!t)t=await v({message:"Enter name"});t=vl(t).replace(/Ai$/,"");let o=Zo.replace(/{{NAME}}/g,t),r=s?F("modules",s):".",a=F(r,"src","ai"),i=F(process.cwd(),a),n=F(i,`${t}Ai.ts`);await Bun.write(n,o);let l=zo.replace(/{{NAME}}/g,t),d=F(r,"tests","ai"),m=F(process.cwd(),d),u=F(m,`${t}Ai.spec.ts`);await Bun.write(u,l);let p=new Al;p.success(`${F(a,t)}Ai.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),p.success(`${F(d,t)}Ai.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}Ie=g([b.command()],Ie);import{join as V}from"path";import{TerminalLogger as Sl}from"@ooneex/logger";import{toPascalCase as Cl}from"@ooneex/utils";var Qo=`import { describe, expect, test } from "bun:test";
302
298
  import { {{NAME}}Analytics } from "@/analytics/{{NAME}}Analytics";
303
299
 
304
300
  describe("{{NAME}}Analytics", () => {
@@ -311,7 +307,7 @@ describe("{{NAME}}Analytics", () => {
311
307
  expect(typeof {{NAME}}Analytics.prototype.capture).toBe("function");
312
308
  });
313
309
  });
314
- `;var Qr=`import { decorator } from "@ooneex/analytics";
310
+ `;var Xo=`import { decorator } from "@ooneex/analytics";
315
311
  import type { IAnalytics } from "@ooneex/analytics";
316
312
 
317
313
  type CaptureOptionsType = Record<string, unknown>;
@@ -322,7 +318,7 @@ export class {{NAME}}Analytics<T extends CaptureOptionsType = CaptureOptionsType
322
318
  // console.log("Analytics captured:", options);
323
319
  }
324
320
  }
325
- `;class Oe{getName(){return"make:analytics"}getDescription(){return"Generate a new analytics class"}async run(e){let{name:t,module:s}=e;if(!t)t=await N({message:"Enter analytics name"});t=Ml(t).replace(/Analytics$/,"");let r=Qr.replace(/{{NAME}}/g,t),o=s?Y("modules",s):".",a=Y(o,"src","analytics"),i=Y(process.cwd(),a),n=Y(i,`${t}Analytics.ts`);await Bun.write(n,r);let l=Zr.replace(/{{NAME}}/g,t),d=Y(o,"tests","analytics"),u=Y(process.cwd(),d),c=Y(u,`${t}Analytics.spec.ts`);await Bun.write(c,l);let p=new Sl;p.success(`${Y(a,t)}Analytics.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),p.success(`${Y(d,t)}Analytics.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}Oe=y([b.command()],Oe);import{join as R}from"path";import{TerminalLogger as zl}from"@ooneex/logger";import{toKebabCase as Zl,toSnakeCase as Ql}from"@ooneex/utils";var Xr=te(ie(),1);var Jr=async(e)=>{let t=new xe;return(await Xr.prompt({type:"input",name:"destination",message:e.message,initial:e.initial||".",validate:(r)=>{let o=t.validate(r);if(!o.isValid)return o.message||"Invalid destination";return!0}})).destination};var eo=`import { RuleConfigSeverity, type UserConfig } from "@commitlint/types";
321
+ `;class Pe{getName(){return"make:analytics"}getDescription(){return"Generate a new analytics class"}async run(e){let{name:t,module:s}=e;if(!t)t=await v({message:"Enter analytics name"});t=Cl(t).replace(/Analytics$/,"");let o=Xo.replace(/{{NAME}}/g,t),r=s?V("modules",s):".",a=V(r,"src","analytics"),i=V(process.cwd(),a),n=V(i,`${t}Analytics.ts`);await Bun.write(n,o);let l=Qo.replace(/{{NAME}}/g,t),d=V(r,"tests","analytics"),m=V(process.cwd(),d),u=V(m,`${t}Analytics.spec.ts`);await Bun.write(u,l);let p=new Sl;p.success(`${V(a,t)}Analytics.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),p.success(`${V(d,t)}Analytics.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}Pe=g([b.command()],Pe);import{join as M}from"path";import{TerminalLogger as Yl}from"@ooneex/logger";import{toKebabCase as jl,toSnakeCase as zl}from"@ooneex/utils";var Jo=te(ie(),1);var er=async(e)=>{let t=new we;return(await Jo.prompt({type:"input",name:"destination",message:e.message,initial:e.initial||".",validate:(o)=>{let r=t.validate(o);if(!r.isValid)return r.message||"Invalid destination";return!0}})).destination};var tr=`import { RuleConfigSeverity, type UserConfig } from "@commitlint/types";
326
322
 
327
323
  const Configuration: UserConfig = {
328
324
  extends: ["@commitlint/config-conventional"],
@@ -463,7 +459,7 @@ const Configuration: UserConfig = {
463
459
  };
464
460
 
465
461
  export default Configuration;
466
- `;var to=`# Logs
462
+ `;var sr=`# Logs
467
463
  logs
468
464
  *.log
469
465
  npm-debug.log*
@@ -613,7 +609,7 @@ vite.config.ts.timestamp-*
613
609
 
614
610
  # Application
615
611
  var/
616
- `;var so=`import { inject } from "@ooneex/container";
612
+ `;var or=`import { inject } from "@ooneex/container";
617
613
  import { AppEnv } from "@ooneex/app-env";
618
614
  import { DataSource } from "typeorm";
619
615
  import { TypeormDatabase, DatabaseException, decorator } from "@ooneex/database";
@@ -647,7 +643,7 @@ export class AppDatabase extends TypeormDatabase {
647
643
  return this.source;
648
644
  }
649
645
  }
650
- `;var ro=`{
646
+ `;var rr=`{
651
647
  "$schema": "./node_modules/@biomejs/biome/configuration_schema.json",
652
648
  "vcs": {
653
649
  "enabled": true,
@@ -726,7 +722,7 @@ export class AppDatabase extends TypeormDatabase {
726
722
  }
727
723
  }
728
724
  }
729
- `;var oo=`[test]
725
+ `;var ar=`[test]
730
726
  coverage = true
731
727
 
732
728
  [workspace]
@@ -757,7 +753,7 @@ buildDependencies = [
757
753
  "@swc/core",
758
754
  "nx",
759
755
  ]
760
- `;var ao=`# use the official Bun image
756
+ `;var ir=`# use the official Bun image
761
757
  # see all versions at https://hub.docker.com/r/oven/bun/tags
762
758
  FROM oven/bun:1 AS base
763
759
  WORKDIR /{{NAME}}
@@ -770,7 +766,7 @@ ENV DATABASE_URL=\${DATABASE_URL}
770
766
 
771
767
  # install dependencies into temp directory
772
768
  # this will cache them and speed up future builds
773
- FROM base AS install
769
+ FROM base AS build
774
770
  RUN mkdir -p /temp/dev
775
771
  COPY package.json bun.lock /temp/dev/
776
772
  RUN cd /temp/dev && bun install --frozen-lockfile
@@ -783,24 +779,28 @@ RUN cd /temp/prod && bun install --frozen-lockfile --production
783
779
  # copy node_modules from temp directory
784
780
  # then copy all (non-ignored) project files into the image
785
781
  FROM base AS prerelease
786
- COPY --from=install /temp/dev/node_modules node_modules
782
+ COPY --from=build /temp/dev/node_modules node_modules
787
783
  COPY . .
788
784
 
785
+ # run migrations and seed
786
+ RUN bun run migration:up
787
+ RUN bun run seed:run
788
+
789
789
  # build
790
790
  ENV NODE_ENV=production
791
791
  RUN bun run build
792
792
 
793
793
  # copy production dependencies and source code into final image
794
794
  FROM base AS release
795
- COPY --from=install /temp/prod/node_modules node_modules
796
- COPY --from=prerelease /ooneex/dist .
797
- COPY --from=prerelease /ooneex/package.json .
795
+ # COPY --from=build /temp/prod/node_modules node_modules
796
+ COPY --from=prerelease /{{NAME}}/dist .
797
+ # COPY --from=prerelease /{{NAME}}/package.json .
798
798
 
799
799
  # run the app
800
800
  USER bun
801
801
  EXPOSE 3000/tcp
802
802
  ENTRYPOINT [ "bun", "run", "index.js" ]
803
- `;var io=`services:
803
+ `;var nr=`services:
804
804
  # PostgreSQL - Primary relational database
805
805
  # Docs: https://www.postgresql.org/docs/
806
806
  # Connection: postgresql://ooneex:ooneex@localhost:5432/ooneex
@@ -834,7 +834,7 @@ ENTRYPOINT [ "bun", "run", "index.js" ]
834
834
  volumes:
835
835
  {{NAME}}_db_data:
836
836
  {{NAME}}_redis_data:
837
- `;var St=`# =============================================================================
837
+ `;var Mt=`# =============================================================================
838
838
  # App
839
839
  # =============================================================================
840
840
 
@@ -1026,7 +1026,7 @@ SYSTEM_USERS=
1026
1026
  SUPER_ADMIN_USERS=
1027
1027
  # Comma-separated admin user emails
1028
1028
  ADMIN_USERS=
1029
- `;var no=`import { PostHogAnalytics } from "@ooneex/analytics";
1029
+ `;var lr=`import { PostHogAnalytics } from "@ooneex/analytics";
1030
1030
  import { App } from "@ooneex/app";
1031
1031
  import { RedisCache } from "@ooneex/cache";
1032
1032
  import { LogtailLogger, ExceptionLogger, TerminalLogger } from "@ooneex/logger";
@@ -1056,7 +1056,7 @@ const app = new App({
1056
1056
  });
1057
1057
 
1058
1058
  await app.run();
1059
- `;var lo=`{
1059
+ `;var dr=`{
1060
1060
  "$schema": "./node_modules/nx/schemas/nx-schema.json",
1061
1061
  "targetDefaults": {
1062
1062
  "build": {
@@ -1086,7 +1086,7 @@ await app.run();
1086
1086
  ],
1087
1087
  "packageManager": "bun"
1088
1088
  }
1089
- `;var mo=`{
1089
+ `;var mr=`{
1090
1090
  "name": "{{NAME}}",
1091
1091
  "module": "index.ts",
1092
1092
  "private": true,
@@ -1108,25 +1108,25 @@ await app.run();
1108
1108
  "modules/*"
1109
1109
  ],
1110
1110
  "dependencies": {
1111
- "@ooneex/analytics": "^1.0.2",
1112
- "@ooneex/app": "^1.1.1",
1113
- "@ooneex/app-env": "^1.0.2",
1114
- "@ooneex/auth": "^1.1.1",
1115
- "@ooneex/cache": "^1.0.2",
1116
- "@ooneex/container": "^1.0.1",
1117
- "@ooneex/database": "^1.0.2",
1118
- "@ooneex/logger": "^1.1.1",
1119
- "@ooneex/mailer": "^1.0.2",
1120
- "@ooneex/middleware": "^1.1.1",
1121
- "@ooneex/module": "^1.1.1",
1122
- "@ooneex/rate-limit": "^1.0.2",
1123
- "@ooneex/role": "^1.0.1",
1124
- "@ooneex/routing": "^1.1.1",
1125
- "@ooneex/storage": "^1.0.2",
1126
- "@ooneex/translation": "^1.0.1",
1127
- "@ooneex/types": "^1.0.1",
1128
- "@ooneex/utils": "^0.1.0",
1129
- "@ooneex/validation": "^1.0.2",
1111
+ "@ooneex/analytics": "^1.1.0",
1112
+ "@ooneex/app": "^1.2.0",
1113
+ "@ooneex/app-env": "^1.1.0",
1114
+ "@ooneex/auth": "^1.2.0",
1115
+ "@ooneex/cache": "^1.1.0",
1116
+ "@ooneex/container": "^1.1.0",
1117
+ "@ooneex/database": "^1.1.0",
1118
+ "@ooneex/logger": "^1.2.0",
1119
+ "@ooneex/mailer": "^1.1.0",
1120
+ "@ooneex/middleware": "^1.2.0",
1121
+ "@ooneex/module": "^1.2.0",
1122
+ "@ooneex/rate-limit": "^1.1.0",
1123
+ "@ooneex/role": "^1.1.0",
1124
+ "@ooneex/routing": "^1.2.0",
1125
+ "@ooneex/storage": "^1.1.0",
1126
+ "@ooneex/translation": "^1.1.0",
1127
+ "@ooneex/types": "^1.1.0",
1128
+ "@ooneex/utils": "^0.2.1",
1129
+ "@ooneex/validation": "^1.1.0",
1130
1130
  "pg": "^8.16.3",
1131
1131
  "apache-arrow": "^21.1.0",
1132
1132
  "reflect-metadata": "^0.2.2",
@@ -1140,18 +1140,18 @@ await app.run();
1140
1140
  "@commitlint/types": "^20.3.1",
1141
1141
  "@nx/js": "^22.3.3",
1142
1142
  "@nx/workspace": "^22.3.3",
1143
- "@ooneex/migrations": "^1.1.1",
1144
- "@ooneex/seeds": "^1.1.1",
1143
+ "@ooneex/migrations": "^1.2.0",
1144
+ "@ooneex/seeds": "^1.2.0",
1145
1145
  "@swc-node/register": "^1.11.1",
1146
1146
  "@swc/core": "^1.15.8",
1147
1147
  "@swc/helpers": "~0.5.18",
1148
1148
  "@types/bun": "latest",
1149
- "@types/node": "^24.10.8",
1149
+ "@types/node": "^25.5.0",
1150
1150
  "@typescript/native-preview": "^7.0.0-dev.20260113.1",
1151
1151
  "husky": "^9.1.7",
1152
1152
  "lint-staged": "^16.2.7",
1153
1153
  "nx": "22.0.2",
1154
- "typescript": "^5.9.3",
1154
+ "typescript": "^6.0.2",
1155
1155
  "undici-types": "^7.18.2"
1156
1156
  },
1157
1157
  "lint-staged": {
@@ -1161,7 +1161,7 @@ await app.run();
1161
1161
  ]
1162
1162
  }
1163
1163
  }
1164
- `;var co=`{
1164
+ `;var cr=`{
1165
1165
  "compilerOptions": {
1166
1166
  "jsx": "react-jsx",
1167
1167
  "lib": ["ES2022", "DOM"],
@@ -1190,16 +1190,7 @@ await app.run();
1190
1190
  },
1191
1191
  "exclude": ["node_modules", ".github", ".husky", ".nx", ".zed", ".vscode"]
1192
1192
  }
1193
- `;import{join as P}from"path";import{TerminalLogger as Yl}from"@ooneex/logger";import{toKebabCase as Fl,toPascalCase as jl}from"@ooneex/utils";var po=`#!/usr/bin/env bun
1194
-
1195
- import { migrationUp } from "@ooneex/migrations";
1196
- import "@/migrations/migrations";
1197
-
1198
- await migrationUp({
1199
- databaseUrl: Bun.env.DATABASE_URL || ":memory:",
1200
- tableName: "migrations",
1201
- });
1202
- `;var uo=`import type { ModuleType } from "@ooneex/module";
1193
+ `;import{join as L}from"path";import{TerminalLogger as Hl}from"@ooneex/logger";import{toKebabCase as Fl,toPascalCase as Vl}from"@ooneex/utils";var pr=`import type { ModuleType } from "@ooneex/module";
1203
1194
 
1204
1195
  export const {{NAME}}Module: ModuleType = {
1205
1196
  controllers: [],
@@ -1209,24 +1200,16 @@ export const {{NAME}}Module: ModuleType = {
1209
1200
  cronJobs: [],
1210
1201
  events: [],
1211
1202
  };
1212
- `;var ho=`{
1203
+ `;var ur=`{
1213
1204
  "name": "@module/{{NAME}}",
1214
1205
  "description": "",
1215
1206
  "version": "0.0.1",
1216
1207
  "scripts": {
1217
1208
  "test": "bun test tests",
1218
- "lint": "tsgo --noEmit && bunx biome lint",
1219
- "migration:up": "bun run ./bin/migration/up.ts",
1220
- "seed:run": "bun run ./bin/bin/run.ts"
1209
+ "lint": "tsgo --noEmit && bunx biome lint"
1221
1210
  }
1222
1211
  }
1223
- `;var fo=`#!/usr/bin/env bun
1224
-
1225
- import { seedRun } from "@ooneex/seeds";
1226
- import "@/seeds/seeds";
1227
-
1228
- await seedRun();
1229
- `;var go=`import { describe, expect, test } from "bun:test";
1212
+ `;var hr=`import { describe, expect, test } from "bun:test";
1230
1213
  import { {{NAME}}Module } from "@/{{NAME}}Module";
1231
1214
 
1232
1215
  describe("{{NAME}}Module", () => {
@@ -1250,7 +1233,7 @@ describe("{{NAME}}Module", () => {
1250
1233
  expect(Array.isArray({{NAME}}Module.events)).toBe(true);
1251
1234
  });
1252
1235
  });
1253
- `;var yo=`{
1236
+ `;var fr=`{
1254
1237
  "extends": "../../tsconfig.json",
1255
1238
  "compilerOptions": {
1256
1239
  "types": ["@types/bun"],
@@ -1261,10 +1244,10 @@ describe("{{NAME}}Module", () => {
1261
1244
  "include": ["src/**/*.ts", "src/**/*.tsx", "tests/**/*.ts", "tests/**/*.tsx"],
1262
1245
  "exclude": ["node_modules", "dist"]
1263
1246
  }
1264
- `;class ue{getName(){return"make:module"}getDescription(){return"Generate a new module"}async addToAppModule(e,t,s){let r=await Bun.file(e).text(),o=`${t}Module`,a=`@${s}/${o}`,i=`import { ${o} } from "${a}";
1265
- `,n=r.lastIndexOf("import "),l=r.indexOf(`
1266
- `,n);r=`${r.slice(0,l+1)}${i}${r.slice(l+1)}`;let d=["controllers","entities","permissions","middlewares","cronJobs","events"];for(let u of d){let c=new RegExp(`(${u}:\\s*\\[)([^\\]]*)`,"s"),p=r.match(c);if(p){let m=p[2]?.trim(),h=`...${o}.${u}`,f=m?`${m}, ${h}`:h;r=r.replace(c,`$1${f}`)}}await Bun.write(e,r)}async addPathAlias(e,t){let s=await Bun.file(e).text(),r=JSON.parse(s);r.compilerOptions??={},r.compilerOptions.paths??={},r.compilerOptions.paths[`@${t}/*`]=[`../${t}/src/*`],await Bun.write(e,`${JSON.stringify(r,null,2)}
1267
- `)}async run(e){let{cwd:t=process.cwd(),silent:s=!1,skipBin:r=!1,skipMigrations:o=!1,skipSeeds:a=!1}=e,{name:i}=e;if(!i)i=await N({message:"Enter module name"});let n=jl(i).replace(/Module$/,""),l=Fl(n),d=P(t,"modules",l),u=P(d,"bin"),c=P(d,"src"),p=P(d,"tests"),m=uo.replace(/{{NAME}}/g,n),h=ho.replace(/{{NAME}}/g,l),f=go.replace(/{{NAME}}/g,n);if(!r)await Bun.write(P(u,"migration","up.ts"),po),await Bun.write(P(u,"seed","run.ts"),fo);if(await Bun.write(P(c,`${n}Module.ts`),m),!o)await Bun.write(P(c,"migrations","migrations.ts"),"");if(!a)await Bun.write(P(c,"seeds","seeds.ts"),"");if(await Bun.write(P(d,"package.json"),h),await Bun.write(P(d,"tsconfig.json"),yo),await Bun.write(P(p,`${n}Module.spec.ts`),f),l!=="app"){let w=P(t,"modules","app","src","AppModule.ts");if(await Bun.file(w).exists())await this.addToAppModule(w,n,l);let g=P(t,"modules","app","tsconfig.json");if(await Bun.file(g).exists())await this.addPathAlias(g,l)}if(!s)new Yl().success(`modules/${l} created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}ue=y([b.command()],ue);class Be{getName(){return"make:app"}getDescription(){return"Generate a new application"}async run(e){let{name:t,destination:s}=e;if(!t)t=await N({message:"Enter application name"});let r=Zl(t);if(!s)s=await Jr({message:"Enter destination path",initial:r});let o=mo.replace(/{{NAME}}/g,r);await Bun.write(R(s,".commitlintrc.ts"),eo),await Bun.write(R(s,".gitignore"),to),await Bun.write(R(s,"biome.jsonc"),ro),await Bun.write(R(s,"bunfig.toml"),oo),await Bun.write(R(s,"nx.json"),lo),await Bun.write(R(s,"package.json"),o),await Bun.write(R(s,"tsconfig.json"),co),await Bun.write(R(s,".husky","commit-msg"),'bunx commitlint --edit "$1"'),await Bun.write(R(s,".husky","pre-commit"),"lint-staged"),await new ue().run({name:"app",cwd:s,silent:!0,skipBin:!0,skipMigrations:!0,skipSeeds:!0});let i=R(s,"modules","app","package.json"),n=await Bun.file(i).json();n.scripts.dev="docker compose up -d && bun --hot run ./src/index.ts",n.scripts.build="bun build ./src/index.ts --outdir ./dist --target bun",await Bun.write(i,JSON.stringify(n,null,2));let l=St.replace("DATABASE_URL=",'DATABASE_URL="postgresql://ooneex:ooneex@localhost:5432/ooneex"').replace("CACHE_REDIS_URL=",'CACHE_REDIS_URL="redis://localhost:6379"').replace("PUBSUB_REDIS_URL=",'PUBSUB_REDIS_URL="redis://localhost:6379"').replace("RATE_LIMIT_REDIS_URL=",'RATE_LIMIT_REDIS_URL="redis://localhost:6379"').replace("DATABASE_REDIS_URL=",'DATABASE_REDIS_URL="redis://localhost:6379"');await Bun.write(R(s,"modules","app",".env"),l),await Bun.write(R(s,"modules","app",".env.example"),St),await Bun.write(R(s,"modules","app","src","databases","AppDatabase.ts"),so),await Bun.write(R(s,"modules","app","src","index.ts"),no);let d=Ql(t),u=io.replace(/{{NAME}}/g,d);await Bun.write(R(s,"modules","app","docker-compose.yml"),u);let c=ao.replace(/{{NAME}}/g,d);await Bun.write(R(s,"modules","app","Dockerfile"),c),await Bun.write(R(s,"modules","app","var",".gitkeep"),""),new zl().success(`${r} created successfully at ${s}`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}Be=y([b.command()],Be);import{join as F}from"path";import{TerminalLogger as ed}from"@ooneex/logger";import{toPascalCase as td}from"@ooneex/utils";var bo=`import { describe, expect, test } from "bun:test";
1247
+ `;class ue{getName(){return"make:module"}getDescription(){return"Generate a new module"}async addToAppModule(e,t,s){let o=await Bun.file(e).text(),r=`${t}Module`,a=`@${s}/${r}`,i=`import { ${r} } from "${a}";
1248
+ `,n=o.lastIndexOf("import "),l=o.indexOf(`
1249
+ `,n);o=`${o.slice(0,l+1)}${i}${o.slice(l+1)}`;let d=["controllers","entities","permissions","middlewares","cronJobs","events"];for(let m of d){let u=new RegExp(`(${m}:\\s*\\[)([^\\]]*)`,"s"),p=o.match(u);if(p){let c=p[2]?.trim(),h=`...${r}.${m}`,f=c?`${c}, ${h}`:h;o=o.replace(u,`$1${f}`)}}await Bun.write(e,o)}async addPathAlias(e,t){let s=await Bun.file(e).text(),o=JSON.parse(s);o.compilerOptions??={},o.compilerOptions.paths??={},o.compilerOptions.paths[`@${t}/*`]=[`../${t}/src/*`],await Bun.write(e,`${JSON.stringify(o,null,2)}
1250
+ `)}async run(e){let{cwd:t=process.cwd(),silent:s=!1,skipMigrations:o=!1,skipSeeds:r=!1}=e,{name:a}=e;if(!a)a=await v({message:"Enter module name"});let i=Vl(a).replace(/Module$/,""),n=Fl(i),l=L(t,"modules",n),d=L(l,"src"),m=L(l,"tests"),u=pr.replace(/{{NAME}}/g,i),p=ur.replace(/{{NAME}}/g,n),c=hr.replace(/{{NAME}}/g,i);if(await Bun.write(L(d,`${i}Module.ts`),u),!o)await Bun.write(L(d,"migrations","migrations.ts"),"");if(!r)await Bun.write(L(d,"seeds","seeds.ts"),"");if(await Bun.write(L(l,"package.json"),p),await Bun.write(L(l,"tsconfig.json"),fr),await Bun.write(L(m,`${i}Module.spec.ts`),c),n!=="app"){let h=L(t,"modules","app","src","AppModule.ts");if(await Bun.file(h).exists())await this.addToAppModule(h,i,n);let f=L(t,"modules","app","tsconfig.json");if(await Bun.file(f).exists())await this.addPathAlias(f,n)}if(!s)new Hl().success(`modules/${n} created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}ue=g([b.command()],ue);class Oe{getName(){return"make:app"}getDescription(){return"Generate a new application"}async run(e){let{name:t,destination:s}=e;if(!t)t=await v({message:"Enter application name"});let o=jl(t);if(!s)s=await er({message:"Enter destination path",initial:o});let r=mr.replace(/{{NAME}}/g,o);await Bun.write(M(s,".commitlintrc.ts"),tr),await Bun.write(M(s,".gitignore"),sr),await Bun.write(M(s,"biome.jsonc"),rr),await Bun.write(M(s,"bunfig.toml"),ar),await Bun.write(M(s,"nx.json"),dr),await Bun.write(M(s,"package.json"),r),await Bun.write(M(s,"tsconfig.json"),cr),await Bun.write(M(s,".husky","commit-msg"),'bunx commitlint --edit "$1"'),await Bun.write(M(s,".husky","pre-commit"),"lint-staged"),await new ue().run({name:"app",cwd:s,silent:!0,skipMigrations:!0,skipSeeds:!0});let i=M(s,"modules","app","package.json"),n=await Bun.file(i).json();n.scripts.dev="docker compose up -d && bun --hot run ./src/index.ts",n.scripts.build="bun build ./src/index.ts --outdir ./dist --target bun",await Bun.write(i,JSON.stringify(n,null,2));let l=Mt.replace(/^DATABASE_URL=/m,'DATABASE_URL="postgresql://ooneex:ooneex@localhost:5432/ooneex"').replace(/^CACHE_REDIS_URL=/m,'CACHE_REDIS_URL="redis://localhost:6379"').replace(/^PUBSUB_REDIS_URL=/m,'PUBSUB_REDIS_URL="redis://localhost:6379"').replace(/^RATE_LIMIT_REDIS_URL=/m,'RATE_LIMIT_REDIS_URL="redis://localhost:6379"').replace(/^DATABASE_REDIS_URL=/m,'DATABASE_REDIS_URL="redis://localhost:6379"');await Bun.write(M(s,"modules","app",".env"),l),await Bun.write(M(s,"modules","app",".env.example"),Mt),await Bun.write(M(s,"modules","app","src","databases","AppDatabase.ts"),or),await Bun.write(M(s,"modules","app","src","index.ts"),lr);let d=zl(t),m=nr.replace(/{{NAME}}/g,d);await Bun.write(M(s,"modules","app","docker-compose.yml"),m);let u=ir.replace(/{{NAME}}/g,d);await Bun.write(M(s,"modules","app","Dockerfile"),u),await Bun.write(M(s,"modules","app","var",".gitkeep"),""),new Yl().success(`${o} created successfully at ${s}`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}Oe=g([b.command()],Oe);import{join as Y}from"path";import{TerminalLogger as Xl}from"@ooneex/logger";import{toPascalCase as Jl}from"@ooneex/utils";var yr=`import { describe, expect, test } from "bun:test";
1268
1251
  import { {{NAME}}Cache } from "@/cache/{{NAME}}Cache";
1269
1252
 
1270
1253
  describe("{{NAME}}Cache", () => {
@@ -1292,7 +1275,7 @@ describe("{{NAME}}Cache", () => {
1292
1275
  expect(typeof {{NAME}}Cache.prototype.has).toBe("function");
1293
1276
  });
1294
1277
  });
1295
- `;var xo=`import { CacheException, decorator } from "@ooneex/cache";
1278
+ `;var gr=`import { CacheException, decorator } from "@ooneex/cache";
1296
1279
  import type { ICache } from "@ooneex/cache";
1297
1280
 
1298
1281
  @decorator.cache()
@@ -1313,357 +1296,7 @@ export class {{NAME}}Cache implements ICache {
1313
1296
  throw new CacheException(\`Failed to check if key "\${key}" exists: Not implemented\`);
1314
1297
  }
1315
1298
  }
1316
- `;class Ie{getName(){return"make:cache"}getDescription(){return"Generate a new cache class"}async run(e){let{name:t,module:s}=e;if(!t)t=await N({message:"Enter cache name"});t=td(t).replace(/Cache$/,"");let r=xo.replace(/{{NAME}}/g,t),o=s?F("modules",s):".",a=F(o,"src","cache"),i=F(process.cwd(),a),n=F(i,`${t}Cache.ts`);await Bun.write(n,r);let l=bo.replace(/{{NAME}}/g,t),d=F(o,"tests","cache"),u=F(process.cwd(),d),c=F(u,`${t}Cache.spec.ts`);await Bun.write(c,l);let p=new ed;p.success(`${F(a,t)}Cache.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),p.success(`${F(d,t)}Cache.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}Ie=y([b.command()],Ie);import{join as Le}from"path";import{TerminalLogger as wd}from"@ooneex/logger";var wo="---\nname: make:ai\ndescription: Generate a new AI class with its test file, then complete the generated code. Use when creating a new AI chat class that uses OpenAI via the @ooneex/ai package.\n---\n\n# Make AI Class\n\nGenerate a new AI class and its test file using the `make:ai` CLI command, then complete the generated code with proper implementation.\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the AI class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:ai --name <name> --module <module>\n```\n\nWhere `<name>` is the name provided by the user. The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The command will generate:\n- `src/ai/<Name>Ai.ts` - The AI class file (or `modules/<module>/src/ai/<Name>Ai.ts` with `--module`)\n- `tests/ai/<Name>Ai.spec.ts` - The test file (or `modules/<module>/tests/ai/<Name>Ai.spec.ts` with `--module`)\n\n### 2. Read the generated files\n\nRead both generated files to understand the scaffolded code.\n\n### 3. Complete the AI class\n\nEdit `src/ai/<Name>Ai.ts` to complete the implementation:\n\n- Update the prompt in the `run` method from `\"My prompt\"` to a meaningful prompt based on the class purpose\n- Update the prompt in the `runStream` method from `\"My prompt\"` to a meaningful prompt based on the class purpose\n- Add any additional configuration or methods relevant to the AI class purpose\n- Ensure proper typing for the `run<T>()` generic return type\n\nThe generated class structure follows this pattern:\n\n```typescript\nimport { decorator, type IAiChat, OpenAi, type OpenAiConfigType } from \"@ooneex/ai\";\nimport { inject } from \"@ooneex/container\";\n\n@decorator.ai()\nexport class <Name>Ai implements IAiChat<OpenAiConfigType> {\n constructor(@inject(OpenAi) private readonly ai: OpenAi) {}\n\n public async run<T>(prompt?: string, config?: Omit<OpenAiConfigType, \"prompt\">): Promise<T> {\n return this.ai.run<T>(prompt || \"My prompt\", config);\n }\n\n public async *runStream(\n prompt?: string,\n config?: Omit<OpenAiConfigType, \"prompt\" | \"output\">,\n ): AsyncGenerator<string, void, unknown> {\n yield* this.ai.runStream(prompt || \"My prompt\", config);\n }\n}\n```\n\n### 4. Complete the test file\n\nEdit `tests/ai/<Name>Ai.spec.ts` to add meaningful tests beyond the scaffolded ones:\n\n- Keep the existing scaffolded tests (class name, run method, runStream method)\n- Add tests relevant to the specific AI class behavior\n\nThe generated test structure follows this pattern:\n\n```typescript\nimport { describe, expect, test } from \"bun:test\";\nimport { <Name>Ai } from \"@/ai/<Name>Ai\";\n\ndescribe(\"<Name>Ai\", () => {\n test(\"should have class name ending with 'Ai'\", () => {\n expect(<Name>Ai.name.endsWith(\"Ai\")).toBe(true);\n });\n\n test(\"should have 'run' method\", () => {\n expect(<Name>Ai.prototype.run).toBeDefined();\n expect(typeof <Name>Ai.prototype.run).toBe(\"function\");\n });\n\n test(\"should have 'runStream' method\", () => {\n expect(<Name>Ai.prototype.runStream).toBeDefined();\n expect(typeof <Name>Ai.prototype.runStream).toBe(\"function\");\n });\n});\n```\n\n### 5. Lint and format\n\nRun linting and formatting on the generated files:\n\n```bash\nbunx biome check --fix src/ai/<Name>Ai.ts tests/ai/<Name>Ai.spec.ts\n```\n";var Eo="---\nname: make:analytics\ndescription: Generate a new analytics class with its test file, then complete the generated code. Use when creating a new analytics tracking class that uses the @ooneex/analytics package.\n---\n\n# Make Analytics Class\n\nGenerate a new analytics class and its test file using the `make:analytics` CLI command, then complete the generated code with proper implementation.\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the analytics class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:analytics --name <name> --module <module>\n```\n\nWhere `<name>` is the name provided by the user. The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The command will generate:\n- `src/analytics/<Name>Analytics.ts` - The analytics class file (or `modules/<module>/src/analytics/<Name>Analytics.ts` with `--module`)\n- `tests/analytics/<Name>Analytics.spec.ts` - The test file (or `modules/<module>/tests/analytics/<Name>Analytics.spec.ts` with `--module`)\n\n### 2. Read the generated files\n\nRead both generated files to understand the scaffolded code.\n\n### 3. Complete the analytics class\n\nEdit `src/analytics/<Name>Analytics.ts` to complete the implementation:\n\n- Implement the `capture` method with actual analytics tracking logic\n- Define a proper type for `CaptureOptionsType` instead of `Record<string, unknown>` based on the analytics purpose\n- Add any additional methods or properties relevant to the analytics class purpose\n\nThe generated class structure follows this pattern:\n\n```typescript\nimport { decorator } from \"@ooneex/analytics\";\nimport type { IAnalytics } from \"@ooneex/analytics\";\n\ntype CaptureOptionsType = Record<string, unknown>;\n\n@decorator.analytics()\nexport class <Name>Analytics<T extends CaptureOptionsType = CaptureOptionsType> implements IAnalytics<T> {\n public capture(options: T): void {\n // console.log(\"Analytics captured:\", options);\n }\n}\n```\n\n### 4. Complete the test file\n\nEdit `tests/analytics/<Name>Analytics.spec.ts` to add meaningful tests beyond the scaffolded ones:\n\n- Keep the existing scaffolded tests (class name, capture method)\n- Add tests relevant to the specific analytics class behavior\n\nThe generated test structure follows this pattern:\n\n```typescript\nimport { describe, expect, test } from \"bun:test\";\nimport { <Name>Analytics } from \"@/analytics/<Name>Analytics\";\n\ndescribe(\"<Name>Analytics\", () => {\n test(\"should have class name ending with 'Analytics'\", () => {\n expect(<Name>Analytics.name.endsWith(\"Analytics\")).toBe(true);\n });\n\n test(\"should have 'capture' method\", () => {\n expect(<Name>Analytics.prototype.capture).toBeDefined();\n expect(typeof <Name>Analytics.prototype.capture).toBe(\"function\");\n });\n});\n```\n\n### 5. Lint and format\n\nRun linting and formatting on the generated files:\n\n```bash\nbunx biome check --fix src/analytics/<Name>Analytics.ts tests/analytics/<Name>Analytics.spec.ts\n```\n";var Ao="---\nname: make:cache\ndescription: Generate a new cache adapter class with its test file, then complete the generated code. Use when creating a new cache adapter that implements the ICache interface from @ooneex/cache.\n---\n\n# Make Cache Class\n\nGenerate a new cache class and its test file using the `make:cache` CLI command, then complete the generated code with proper implementation.\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the cache class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:cache --name <name> --module <module>\n```\n\nWhere `<name>` is the name provided by the user. The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The command will generate:\n- `src/cache/<Name>Cache.ts` - The cache class file (or `modules/<module>/src/cache/<Name>Cache.ts` with `--module`)\n- `tests/cache/<Name>Cache.spec.ts` - The test file (or `modules/<module>/tests/cache/<Name>Cache.spec.ts` with `--module`)\n\n### 2. Read the generated files\n\nRead both generated files to understand the scaffolded code.\n\n### 3. Complete the cache class\n\nEdit `src/cache/<Name>Cache.ts` to complete the implementation:\n\n- Implement the `get` method to retrieve cached values by key\n- Implement the `set` method to store values with optional TTL\n- Implement the `delete` method to remove cached entries\n- Implement the `has` method to check key existence\n- Replace the `CacheException` throws with actual cache logic\n- Inject any required dependencies (e.g., Redis client) via the constructor\n\nThe generated class structure follows this pattern:\n\n```typescript\nimport { CacheException, decorator } from \"@ooneex/cache\";\nimport type { ICache } from \"@ooneex/cache\";\n\n@decorator.cache()\nexport class <Name>Cache implements ICache {\n public async get<T = unknown>(key: string): Promise<T | undefined> {\n throw new CacheException(`Failed to get key \"${key}\": Not implemented`);\n }\n\n public async set<T = unknown>(key: string, value: T, ttl?: number): Promise<void> {\n throw new CacheException(`Failed to set key \"${key}\": Not implemented`);\n }\n\n public async delete(key: string): Promise<boolean> {\n throw new CacheException(`Failed to delete key \"${key}\": Not implemented`);\n }\n\n public async has(key: string): Promise<boolean> {\n throw new CacheException(`Failed to check if key \"${key}\" exists: Not implemented`);\n }\n}\n```\n\n### 4. Complete the test file\n\nEdit `tests/cache/<Name>Cache.spec.ts` to add meaningful tests beyond the scaffolded ones:\n\n- Keep the existing scaffolded tests (class name, get, set, delete, has methods)\n- Add tests relevant to the specific cache class behavior\n\nThe generated test structure follows this pattern:\n\n```typescript\nimport { describe, expect, test } from \"bun:test\";\nimport { <Name>Cache } from \"@/cache/<Name>Cache\";\n\ndescribe(\"<Name>Cache\", () => {\n test(\"should have class name ending with 'Cache'\", () => {\n expect(<Name>Cache.name.endsWith(\"Cache\")).toBe(true);\n });\n\n test(\"should have 'get' method\", () => {\n expect(<Name>Cache.prototype.get).toBeDefined();\n expect(typeof <Name>Cache.prototype.get).toBe(\"function\");\n });\n\n test(\"should have 'set' method\", () => {\n expect(<Name>Cache.prototype.set).toBeDefined();\n expect(typeof <Name>Cache.prototype.set).toBe(\"function\");\n });\n\n test(\"should have 'delete' method\", () => {\n expect(<Name>Cache.prototype.delete).toBeDefined();\n expect(typeof <Name>Cache.prototype.delete).toBe(\"function\");\n });\n\n test(\"should have 'has' method\", () => {\n expect(<Name>Cache.prototype.has).toBeDefined();\n expect(typeof <Name>Cache.prototype.has).toBe(\"function\");\n });\n});\n```\n\n### 5. Lint and format\n\nRun linting and formatting on the generated files:\n\n```bash\nbunx biome check --fix src/cache/<Name>Cache.ts tests/cache/<Name>Cache.spec.ts\n```\n";var No=`---
1317
- name: make:controller
1318
- description: Generate a new controller class with route type and test file, then complete the generated code. Use when creating a new HTTP or WebSocket controller with routing, validation, and role-based access.
1319
- ---
1320
-
1321
- # Make Controller Class
1322
-
1323
- Generate a new controller class, its route type, and test file using the \`make:controller\` CLI command, then complete the generated code with proper implementation.
1324
-
1325
- ## Steps
1326
-
1327
- ### 1. Run the generator
1328
-
1329
- Run the following command to scaffold the controller class and related files:
1330
-
1331
- \`\`\`bash
1332
- bunx @ooneex/cli@latest make:controller --name <name> --module <module> --is-socket <true|false> --route.name <route.name> --route.path <route.path> --route.method <route.method>
1333
- \`\`\`
1334
-
1335
- Where:
1336
- - \`<name>\` is the controller name provided by the user
1337
- - \`--module\` is optional \u2014 if provided, files are generated under \`modules/<module>/\` instead of the project root
1338
- - \`--is-socket\` determines HTTP vs WebSocket controller (defaults to \`false\`)
1339
- - \`--route.name\` is the route name using dot notation: \`<resource>.<action>\` (e.g., \`user.create\`, \`book.list\`, \`flashcard.delete\`)
1340
- - \`--route.path\` is the route path (e.g., \`/api/users\`)
1341
- - \`--route.method\` is the HTTP method (e.g., \`get\`, \`post\`, \`put\`, \`patch\`, \`delete\`) \u2014 only for HTTP controllers
1342
-
1343
- The command will generate (paths prefixed with \`modules/<module>/\` when \`--module\` is provided):
1344
- - \`src/controllers/<Name>Controller.ts\` - The controller class file
1345
- - \`src/types/routes/<route.name>.ts\` - The route type file
1346
- - \`tests/controllers/<Name>Controller.spec.ts\` - The test file
1347
-
1348
- ### 2. Read the generated files
1349
-
1350
- Read all three generated files to understand the scaffolded code.
1351
-
1352
- ### 3. Complete the route type
1353
-
1354
- Edit \`src/types/routes/<route.name>.ts\` to define the route's type contract.
1355
-
1356
- **Add or remove \`params\`, \`payload\`, and \`queries\` based on context:**
1357
-
1358
- - **\`params\`** \u2014 Include only when the route path contains dynamic segments (e.g., \`/api/users/:id\`). Remove entirely for routes with no URL parameters (e.g., \`/api/users\`).
1359
- - **\`payload\`** \u2014 Include only for methods that accept a request body (\`post\`, \`put\`, \`patch\`). Remove entirely for \`get\` and \`delete\` routes.
1360
- - **\`queries\`** \u2014 Include only when the route supports query string filtering, pagination, or sorting (e.g., list/search endpoints). Remove entirely when not needed.
1361
- - **\`response\`** \u2014 Always include.
1362
-
1363
- The generated route type structure follows this pattern (remove unused sections):
1364
-
1365
- \`\`\`typescript
1366
- // Example: GET /api/users (list) \u2014 no params, no payload, has queries
1367
- export type <TypeName>RouteType = {
1368
- queries: {
1369
-
1370
- },
1371
- response: {
1372
-
1373
- },
1374
- };
1375
-
1376
- // Example: POST /api/users (create) \u2014 no params, has payload, no queries
1377
- export type <TypeName>RouteType = {
1378
- payload: {
1379
-
1380
- },
1381
- response: {
1382
-
1383
- },
1384
- };
1385
-
1386
- // Example: GET /api/users/:id (detail) \u2014 has params, no payload, no queries
1387
- export type <TypeName>RouteType = {
1388
- params: {
1389
-
1390
- },
1391
- response: {
1392
-
1393
- },
1394
- };
1395
-
1396
- // Example: PUT /api/users/:id (update) \u2014 has params, has payload, no queries
1397
- export type <TypeName>RouteType = {
1398
- params: {
1399
-
1400
- },
1401
- payload: {
1402
-
1403
- },
1404
- response: {
1405
-
1406
- },
1407
- };
1408
- \`\`\`
1409
-
1410
- ### 4. Complete the controller class
1411
-
1412
- Edit \`src/controllers/<Name>Controller.ts\` to complete the implementation:
1413
-
1414
- - Set appropriate \`roles\` for access control
1415
- - Add a meaningful \`description\` for the route that explains what the endpoint does (e.g., \`"Create a new user account"\`, \`"List all books with pagination"\`)
1416
- - Implement the \`index\` method with actual controller logic
1417
- - Inject any required dependencies (repositories, services) via the constructor
1418
-
1419
- **Add or remove \`params\`, \`payload\`, and \`queries\` in the \`@Route\` decorator to match the route type (step 3):**
1420
-
1421
- - **\`params\`** \u2014 Include with \`Assert()\` validators only when the route has URL parameters. Remove the \`params\` key entirely otherwise.
1422
- - **\`payload\`** \u2014 Include with \`Assert({...})\` only for \`post\`, \`put\`, \`patch\` methods. Remove the \`payload\` key entirely for \`get\` and \`delete\`.
1423
- - **\`queries\`** \u2014 Include with \`Assert({...})\` only when query parameters are expected. Remove the \`queries\` key entirely otherwise.
1424
- - **\`response\`** \u2014 Always include with \`Assert({...})\`.
1425
-
1426
- **HTTP controller** generated structure (remove \`params\`, \`payload\`, \`queries\` as needed \u2014 see rules above):
1427
-
1428
- \`\`\`typescript
1429
- import type { ContextType } from "@ooneex/controller";
1430
- import { ERole } from "@ooneex/role";
1431
- import { Route } from "@ooneex/routing";
1432
- import { Assert } from "@ooneex/validation";
1433
- import type { <TypeName>RouteType } from "../types/routes/<route.name>";
1434
-
1435
- @Route.<method>("<route.path>", {
1436
- name: "<route.name>",
1437
- version: 1,
1438
- description: "",
1439
- params: {
1440
- // id: Assert("string"),
1441
- },
1442
- payload: Assert({
1443
-
1444
- }),
1445
- queries: Assert({
1446
-
1447
- }),
1448
- response: Assert({
1449
-
1450
- }),
1451
- roles: [ERole.USER],
1452
- })
1453
- export class <Name>Controller {
1454
- public async index(context: ContextType<<TypeName>RouteType>) {
1455
- // const { id } = context.params;
1456
-
1457
- return context.response.json({
1458
-
1459
- });
1460
- }
1461
- }
1462
- \`\`\`
1463
-
1464
- **Socket controller** generated structure (remove \`params\`, \`payload\`, \`queries\` as needed \u2014 see rules above):
1465
-
1466
- \`\`\`typescript
1467
- import type { ContextType } from "@ooneex/socket";
1468
- import { ERole } from "@ooneex/role";
1469
- import { Route } from "@ooneex/routing";
1470
- import { Assert } from "@ooneex/validation";
1471
- import type { <TypeName>RouteType } from "../types/routes/<route.name>";
1472
-
1473
- @Route.socket("<route.path>", {
1474
- name: "<route.name>",
1475
- version: 1,
1476
- description: "",
1477
- params: {
1478
- // id: Assert("string"),
1479
- },
1480
- payload: Assert({
1481
-
1482
- }),
1483
- queries: Assert({
1484
-
1485
- }),
1486
- response: Assert({
1487
-
1488
- }),
1489
- roles: [ERole.USER],
1490
- })
1491
- export class <Name>Controller {
1492
- public async index(context: ContextType<<TypeName>RouteType>) {
1493
- // const { id } = context.params;
1494
-
1495
- return context.response.json({
1496
-
1497
- });
1498
- }
1499
- }
1500
- \`\`\`
1501
-
1502
- ### 5. Complete the test file
1503
-
1504
- Edit \`tests/controllers/<Name>Controller.spec.ts\` to add meaningful tests beyond the scaffolded ones:
1505
-
1506
- - Keep the existing scaffolded tests (class name, index method)
1507
- - Add tests relevant to the specific controller behavior
1508
-
1509
- The generated test structure follows this pattern:
1510
-
1511
- \`\`\`typescript
1512
- import { describe, expect, test } from "bun:test";
1513
- import { <Name>Controller } from "@/controllers/<Name>Controller";
1514
-
1515
- describe("<Name>Controller", () => {
1516
- test("should have class name ending with 'Controller'", () => {
1517
- expect(<Name>Controller.name.endsWith("Controller")).toBe(true);
1518
- });
1519
-
1520
- test("should have 'index' method", () => {
1521
- expect(<Name>Controller.prototype.index).toBeDefined();
1522
- expect(typeof <Name>Controller.prototype.index).toBe("function");
1523
- });
1524
- });
1525
- \`\`\`
1526
-
1527
- ### 6. Register the controller in the module
1528
-
1529
- Add the new controller to the module's \`controllers\` array in \`src/<PascalModuleName>Module.ts\` (e.g., \`src/BookModule.ts\` for the \`book\` module):
1530
-
1531
- \`\`\`typescript
1532
- import type { ModuleType } from "@ooneex/module";
1533
- import { <Name>Controller } from "./controllers/<Name>Controller";
1534
-
1535
- export const <PascalModuleName>Module: ModuleType = {
1536
- controllers: [<Name>Controller],
1537
- entities: [],
1538
- permissions: [],
1539
- middlewares: [],
1540
- cronJobs: [],
1541
- events: [],
1542
- };
1543
- \`\`\`
1544
-
1545
- The module file uses PascalCase naming: \`<PascalModuleName>Module.ts\` with export \`<PascalModuleName>Module\`.
1546
-
1547
- If the module already has other controllers registered, append the new controller to the existing \`controllers\` array and add the import alongside existing imports.
1548
-
1549
- ### 7. Lint and format
1550
-
1551
- Run linting and formatting on the generated files:
1552
-
1553
- \`\`\`bash
1554
- bunx biome check --fix src/controllers/<Name>Controller.ts src/types/routes/<route.name>.ts tests/controllers/<Name>Controller.spec.ts
1555
- \`\`\`
1556
-
1557
- ### 8. Create the service
1558
-
1559
- After the controller is created, generate a service class for the controller's business logic using the \`make:service\` skill:
1560
-
1561
- \`\`\`
1562
- /make:service --name <Name>
1563
- \`\`\`
1564
-
1565
- Where \`<Name>\` matches the controller name (e.g., if the controller is \`CreateUserController\`, the service is \`CreateUserService\`).
1566
-
1567
- ### 9. Create the pubsub event
1568
-
1569
- After the service is created, generate a pubsub event class for the controller's domain events using the \`make:pubsub\` skill:
1570
-
1571
- \`\`\`
1572
- /make:pubsub --name <Name> --channel <resource>.<action>
1573
- \`\`\`
1574
-
1575
- Where:
1576
- - \`<Name>\` matches the controller name (e.g., if the controller is \`CreateUserController\`, the event is \`CreateUserEvent\`)
1577
- - \`<resource>.<action>\` follows the same dot notation as the route name (e.g., \`user.create\`, \`book.delete\`)
1578
-
1579
- Once the event is created:
1580
- - Inject the **service** into the **event** via the constructor, and call the service's \`execute\` method from the event's \`handler\` method.
1581
- - Inject the **event** into the **controller** via the constructor, and publish the event from the controller's \`index\` method.
1582
- `;var vo="---\nname: make:cron\ndescription: Generate a new cron job class with its test file, then complete the generated code. Use when creating a new scheduled task that extends the Cron base class from @ooneex/cron.\n---\n\n# Make Cron Class\n\nGenerate a new cron class and its test file using the `make:cron` CLI command, then complete the generated code with proper implementation.\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the cron class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:cron --name <name> --module <module>\n```\n\nWhere `<name>` is the name provided by the user. The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The command will generate:\n- `src/cron/<Name>Cron.ts` - The cron class file (or `modules/<module>/src/cron/<Name>Cron.ts` with `--module`)\n- `tests/cron/<Name>Cron.spec.ts` - The test file (or `modules/<module>/tests/cron/<Name>Cron.spec.ts` with `--module`)\n\n### 2. Read the generated files\n\nRead both generated files to understand the scaffolded code.\n\n### 3. Complete the cron class\n\nEdit `src/cron/<Name>Cron.ts` to complete the implementation:\n\n- Set the appropriate cron schedule in `getTime()` (e.g., `\"every 5 minutes\"`, `\"every 1 hours\"`, `\"every 30 seconds\"`)\n- Set the timezone in `getTimeZone()` if needed, or keep `null` for server timezone\n- Implement the `handler()` method with the actual cron job logic\n- Inject any required dependencies via the constructor\n\nThe generated class structure follows this pattern:\n\n```typescript\nimport type { TimeZoneType } from \"@ooneex/country\";\nimport type { CronTimeType } from \"@ooneex/cron\";\nimport { Cron, decorator } from \"@ooneex/cron\";\n\n@decorator.cron()\nexport class <Name>Cron extends Cron {\n public getTime(): CronTimeType {\n // Examples: \"every 5 minutes\", \"every 1 hours\", \"every 30 seconds\"\n return \"every 1 hours\";\n }\n\n public getTimeZone(): TimeZoneType | null {\n // Return null to use server timezone, or specify a timezone like \"Europe/Paris\"\n return null;\n }\n\n public async handler(): Promise<void> {\n // Implement your cron handler logic here\n // console.log(\"<Name>Cron handler executed\");\n }\n}\n```\n\n### 4. Complete the test file\n\nEdit `tests/cron/<Name>Cron.spec.ts` to add meaningful tests beyond the scaffolded ones:\n\n- Keep the existing scaffolded tests (class name, getTime, getTimeZone, handler methods)\n- Add tests relevant to the specific cron class behavior\n\nThe generated test structure follows this pattern:\n\n```typescript\nimport { describe, expect, test } from \"bun:test\";\nimport { <Name>Cron } from \"@/cron/<Name>Cron\";\n\ndescribe(\"<Name>Cron\", () => {\n test(\"should have class name ending with 'Cron'\", () => {\n expect(<Name>Cron.name.endsWith(\"Cron\")).toBe(true);\n });\n\n test(\"should have 'getTime' method\", () => {\n expect(<Name>Cron.prototype.getTime).toBeDefined();\n expect(typeof <Name>Cron.prototype.getTime).toBe(\"function\");\n });\n\n test(\"should have 'getTimeZone' method\", () => {\n expect(<Name>Cron.prototype.getTimeZone).toBeDefined();\n expect(typeof <Name>Cron.prototype.getTimeZone).toBe(\"function\");\n });\n\n test(\"should have 'handler' method\", () => {\n expect(<Name>Cron.prototype.handler).toBeDefined();\n expect(typeof <Name>Cron.prototype.handler).toBe(\"function\");\n });\n});\n```\n\n### 5. Register the cron job in the module\n\nAdd the new cron job to the module's `cronJobs` array in `src/<PascalModuleName>Module.ts` (e.g., `src/BookModule.ts` for the `book` module):\n\n```typescript\nimport type { ModuleType } from \"@ooneex/module\";\nimport { <Name>Cron } from \"./cron/<Name>Cron\";\n\nexport const <PascalModuleName>Module: ModuleType = {\n controllers: [],\n entities: [],\n permissions: [],\n middlewares: [],\n cronJobs: [<Name>Cron],\n events: [],\n};\n```\n\nThe module file uses PascalCase naming: `<PascalModuleName>Module.ts` with export `<PascalModuleName>Module`.\n\nIf the module already has other cron jobs registered, append the new cron job to the existing `cronJobs` array and add the import alongside existing imports.\n\n### 6. Lint and format\n\nRun linting and formatting on the generated files:\n\n```bash\nbunx biome check --fix src/cron/<Name>Cron.ts tests/cron/<Name>Cron.spec.ts\n```\n";var To="---\nname: make:database\ndescription: Generate a new database class with its test file, then complete the generated code. Use when creating a new database adapter that extends TypeormDatabase from @ooneex/database.\n---\n\n# Make Database Class\n\nGenerate a new database class and its test file using the `make:database` CLI command, then complete the generated code with proper implementation.\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the database class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:database --name <name> --module <module>\n```\n\nWhere `<name>` is the name provided by the user. The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The command will generate:\n- `src/databases/<Name>Database.ts` - The database class file (or `modules/<module>/src/databases/<Name>Database.ts` with `--module`)\n- `tests/databases/<Name>Database.spec.ts` - The test file (or `modules/<module>/tests/databases/<Name>Database.spec.ts` with `--module`)\n\n### 2. Read the generated files\n\nRead both generated files to understand the scaffolded code.\n\n### 3. Complete the database class\n\nEdit `src/databases/<Name>Database.ts` to complete the implementation:\n\n- Add entity imports and register them in the `entities` array\n- Adjust the database path if needed (default is `\"var/db\"`)\n- Configure DataSource options as appropriate (type, synchronize, etc.)\n- Inject any required dependencies via the constructor\n\nThe generated class structure follows this pattern:\n\n```typescript\nimport { DataSource } from \"typeorm\";\nimport { TypeormDatabase, DatabaseException, decorator } from \"@ooneex/database\";\n\n@decorator.database()\nexport class <Name>Database extends TypeormDatabase {\n public getSource(database?: string): DataSource {\n database = database || \"var/db\";\n\n this.source = new DataSource({\n synchronize: false,\n entities: [\n // TODO: Load your entities here\n ],\n enableWAL: true,\n busyErrorRetry: 2000,\n busyTimeout: 30_000,\n database,\n type: \"sqlite\",\n });\n\n return this.source;\n }\n}\n```\n\n### 4. Complete the test file\n\nEdit `tests/databases/<Name>Database.spec.ts` to add meaningful tests beyond the scaffolded ones:\n\n- Keep the existing scaffolded tests (class name, getSource method)\n- Add tests relevant to the specific database class behavior\n\nThe generated test structure follows this pattern:\n\n```typescript\nimport { describe, expect, test } from \"bun:test\";\nimport { <Name>Database } from \"@/databases/<Name>Database\";\n\ndescribe(\"<Name>Database\", () => {\n test(\"should have class name ending with 'Database'\", () => {\n expect(<Name>Database.name.endsWith(\"Database\")).toBe(true);\n });\n\n test(\"should have 'getSource' method\", () => {\n expect(<Name>Database.prototype.getSource).toBeDefined();\n expect(typeof <Name>Database.prototype.getSource).toBe(\"function\");\n });\n});\n```\n\n### 5. Lint and format\n\nRun linting and formatting on the generated files:\n\n```bash\nbunx biome check --fix src/databases/<Name>Database.ts tests/databases/<Name>Database.spec.ts\n```\n";var So="---\nname: make:entity\ndescription: Generate a new TypeORM entity class with its test file, then complete the generated code. Use when creating a new database entity with columns, relations, and table mapping.\n---\n\n# Make Entity Class\n\nGenerate a new entity class and its test file using the `make:entity` CLI command, then complete the generated code with proper implementation.\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the entity class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:entity --name <name> --module <module> --table-name <table_name>\n```\n\nWhere `<name>` is the name provided by the user. The `--table-name` option is optional \u2014 if omitted, it defaults to the snake_case pluralized form of the name (e.g., `UserProfile` becomes `user_profiles`). The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The command will generate:\n- `src/entities/<Name>Entity.ts` - The entity class file (or `modules/<module>/src/entities/<Name>Entity.ts` with `--module`)\n- `tests/entities/<Name>Entity.spec.ts` - The test file (or `modules/<module>/tests/entities/<Name>Entity.spec.ts` with `--module`)\n\n### 2. Read the generated files\n\nRead both generated files to understand the scaffolded code.\n\n### 3. Complete the entity class\n\nEdit `src/entities/<Name>Entity.ts` to complete the implementation:\n\n- Add entity-specific columns with appropriate TypeORM decorators (`@Column`)\n- Add relations if needed (`@ManyToOne`, `@OneToMany`, `@ManyToMany`, etc.)\n- Remove any scaffolded columns that are not relevant to the entity\n- Adjust column types, lengths, and constraints as needed\n\nThe generated class structure follows this pattern:\n\n```typescript\nimport type { LocaleType } from \"@ooneex/translation\";\nimport { random } from \"@ooneex/utils\";\nimport { Column, CreateDateColumn, DeleteDateColumn, PrimaryColumn, UpdateDateColumn } from \"typeorm\";\n\n@Entity({\n name: \"<table_name>\",\n})\nexport class <Name>Entity extends BaseEntity {\n @PrimaryColumn({ name: \"id\", type: \"varchar\", length: 25 })\n id: string = random.nanoid(25);\n\n @Column({\n name: \"is_locked\",\n type: \"boolean\",\n default: false,\n nullable: true,\n })\n isLocked?: boolean;\n\n @Column({ name: \"locked_at\", type: \"timestamptz\", nullable: true })\n lockedAt?: Date;\n\n @Column({\n name: \"is_blocked\",\n type: \"boolean\",\n default: false,\n nullable: true,\n })\n isBlocked?: boolean;\n\n @Column({ name: \"blocked_at\", type: \"timestamptz\", nullable: true })\n blockedAt?: Date;\n\n @Column({ name: \"block_reason\", type: \"text\", nullable: true })\n blockReason?: string;\n\n @Column({ name: \"is_public\", type: \"boolean\", default: true, nullable: true })\n isPublic?: boolean;\n\n @Column({ name: \"lang\", type: \"varchar\", length: 10, nullable: true })\n lang?: LocaleType;\n\n @CreateDateColumn({ name: \"created_at\" })\n createdAt?: Date;\n\n @UpdateDateColumn({ name: \"updated_at\" })\n updatedAt?: Date;\n\n @DeleteDateColumn({ name: \"deleted_at\" })\n deletedAt?: Date;\n}\n```\n\n### 4. Complete the test file\n\nEdit `tests/entities/<Name>Entity.spec.ts` to add meaningful tests beyond the scaffolded ones:\n\n- Keep the existing scaffolded tests (class name, id, default columns)\n- Add tests for any new entity-specific columns and relations\n- Update tests if scaffolded columns were removed\n\nThe generated test structure follows this pattern:\n\n```typescript\nimport { describe, expect, test } from \"bun:test\";\nimport { <Name>Entity } from \"@/entities/<Name>Entity\";\n\ndescribe(\"<Name>Entity\", () => {\n test(\"should have class name ending with 'Entity'\", () => {\n expect(<Name>Entity.name.endsWith(\"Entity\")).toBe(true);\n });\n\n test(\"should have 'id' property with default nanoid\", () => {\n const entity = new <Name>Entity();\n expect(entity.id).toBeDefined();\n expect(typeof entity.id).toBe(\"string\");\n expect(entity.id.length).toBe(25);\n });\n\n test(\"should have 'isLocked' property\", () => {\n const entity = new <Name>Entity();\n expect(\"isLocked\" in entity).toBe(true);\n });\n\n // ... additional property tests\n});\n```\n\n### 5. Register the entity in the module\n\nAdd the new entity to the module's `entities` array in `src/<PascalModuleName>Module.ts` (e.g., `src/BookModule.ts` for the `book` module):\n\n```typescript\nimport type { ModuleType } from \"@ooneex/module\";\nimport { <Name>Entity } from \"./entities/<Name>Entity\";\n\nexport const <PascalModuleName>Module: ModuleType = {\n controllers: [],\n entities: [<Name>Entity],\n permissions: [],\n middlewares: [],\n cronJobs: [],\n events: [],\n};\n```\n\nThe module file uses PascalCase naming: `<PascalModuleName>Module.ts` with export `<PascalModuleName>Module`.\n\nIf the module already has other entities registered, append the new entity to the existing `entities` array and add the import alongside existing imports.\n\n### 6. Create a migration for the entity\n\nAfter creating or updating an entity, generate a migration to apply the corresponding schema changes to the database.\n\nRun the generator:\n\n```bash\nbunx @ooneex/cli@latest make:migration\n```\n\nThen read the generated migration file in `src/migrations/` and complete it:\n\n- In the `up` method, write the SQL to create the table (or alter it if updating an existing entity). Include all columns, types, constraints, defaults, and indexes matching the entity definition.\n- In the `down` method, write the reverse SQL to undo the changes (e.g., `DROP TABLE` or `ALTER TABLE DROP COLUMN`).\n- If the migration depends on another migration (e.g., a foreign key referencing another table), add that migration class to the `getDependencies()` return array.\n\nExample `up` method for a new entity:\n\n```typescript\npublic async up(tx: TransactionSQL): Promise<void> {\n await tx`\n CREATE TABLE IF NOT EXISTS <table_name> (\n id VARCHAR(25) PRIMARY KEY,\n is_locked BOOLEAN DEFAULT false,\n locked_at TIMESTAMPTZ,\n is_blocked BOOLEAN DEFAULT false,\n blocked_at TIMESTAMPTZ,\n block_reason TEXT,\n is_public BOOLEAN DEFAULT true,\n lang VARCHAR(10),\n created_at TIMESTAMPTZ DEFAULT NOW(),\n updated_at TIMESTAMPTZ DEFAULT NOW(),\n deleted_at TIMESTAMPTZ\n )\n `;\n}\n```\n\n### 7. Create a repository for the entity\n\nAfter creating the entity, generate a repository to handle database operations for it.\n\nRun the generator:\n\n```bash\nbunx @ooneex/cli@latest make:repository --name <name>\n```\n\nWhere `<name>` is the same name used for the entity. The command will generate:\n- `src/repositories/<Name>Repository.ts` - The repository class\n- `tests/repositories/<Name>Repository.spec.ts` - The test file\n\nThen read the generated files and complete the repository implementation:\n\n- Adjust search fields in the `find()` method to match the entity's searchable columns\n- Customize relations loading in `findOne`/`findOneBy` if the entity has relations\n- Add any domain-specific methods relevant to the entity\n- Remove methods that don't apply to the entity\n- Update tests to match the final repository methods\n\n### 8. Lint and format\n\nRun linting and formatting on all generated files:\n\n```bash\nbunx biome check --fix src/entities/<Name>Entity.ts tests/entities/<Name>Entity.spec.ts src/repositories/<Name>Repository.ts tests/repositories/<Name>Repository.spec.ts src/migrations/\n```\n";var Mo="---\nname: make:logger\ndescription: Generate a new logger class with its test file, then complete the generated code. Use when creating a new logger that implements the ILogger interface from @ooneex/logger.\n---\n\n# Make Logger Class\n\nGenerate a new logger class and its test file using the `make:logger` CLI command, then complete the generated code with proper implementation.\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the logger class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:logger --name <name> --module <module>\n```\n\nWhere `<name>` is the name provided by the user. The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The command will generate:\n- `src/loggers/<Name>Logger.ts` - The logger class file (or `modules/<module>/src/loggers/<Name>Logger.ts` with `--module`)\n- `tests/loggers/<Name>Logger.spec.ts` - The test file (or `modules/<module>/tests/loggers/<Name>Logger.spec.ts` with `--module`)\n\n### 2. Read the generated files\n\nRead both generated files to understand the scaffolded code.\n\n### 3. Complete the logger class\n\nEdit `src/loggers/<Name>Logger.ts` to complete the implementation:\n\n- Implement the `init()` method to set up the logger (e.g., open file handles, configure transports)\n- Implement `log`, `debug`, `info`, `success`, `warn`, and `error` methods with actual logging logic\n- Inject any required dependencies via the constructor\n\nThe generated class structure follows this pattern:\n\n```typescript\nimport type { IException } from \"@ooneex/exception\";\nimport type { ILogger } from \"@ooneex/logger\";\nimport type { ScalarType } from \"@ooneex/types\";\nimport { decorator } from \"@ooneex/logger\";\n\n@decorator.logger()\nexport class <Name>Logger implements ILogger {\n public async init(): Promise<void> {\n // Initialize your logger here\n }\n\n public log(message: string, data?: Record<string, ScalarType>): void {\n // Handle general logging\n }\n\n public debug(message: string, data?: Record<string, ScalarType>): void {\n // Handle debug logging\n }\n\n public info(message: string, data?: Record<string, ScalarType>): void {\n // Handle info logging\n }\n\n public success(message: string, data?: Record<string, ScalarType>): void {\n // Handle success logging\n }\n\n public warn(message: string, data?: Record<string, ScalarType>): void {\n // Handle warning logging\n }\n\n public error(message: string | IException, data?: Record<string, ScalarType>): void {\n // Handle error logging\n }\n}\n```\n\n### 4. Complete the test file\n\nEdit `tests/loggers/<Name>Logger.spec.ts` to add meaningful tests beyond the scaffolded ones:\n\n- Keep the existing scaffolded tests (class name, init, log, debug, info, success, warn, error methods)\n- Add tests relevant to the specific logger class behavior\n\nThe generated test structure follows this pattern:\n\n```typescript\nimport { describe, expect, test } from \"bun:test\";\nimport { <Name>Logger } from \"@/loggers/<Name>Logger\";\n\ndescribe(\"<Name>Logger\", () => {\n test(\"should have class name ending with 'Logger'\", () => {\n expect(<Name>Logger.name.endsWith(\"Logger\")).toBe(true);\n });\n\n test(\"should have 'init' method\", () => {\n expect(<Name>Logger.prototype.init).toBeDefined();\n expect(typeof <Name>Logger.prototype.init).toBe(\"function\");\n });\n\n test(\"should have 'log' method\", () => {\n expect(<Name>Logger.prototype.log).toBeDefined();\n expect(typeof <Name>Logger.prototype.log).toBe(\"function\");\n });\n\n test(\"should have 'debug' method\", () => {\n expect(<Name>Logger.prototype.debug).toBeDefined();\n expect(typeof <Name>Logger.prototype.debug).toBe(\"function\");\n });\n\n test(\"should have 'info' method\", () => {\n expect(<Name>Logger.prototype.info).toBeDefined();\n expect(typeof <Name>Logger.prototype.info).toBe(\"function\");\n });\n\n test(\"should have 'success' method\", () => {\n expect(<Name>Logger.prototype.success).toBeDefined();\n expect(typeof <Name>Logger.prototype.success).toBe(\"function\");\n });\n\n test(\"should have 'warn' method\", () => {\n expect(<Name>Logger.prototype.warn).toBeDefined();\n expect(typeof <Name>Logger.prototype.warn).toBe(\"function\");\n });\n\n test(\"should have 'error' method\", () => {\n expect(<Name>Logger.prototype.error).toBeDefined();\n expect(typeof <Name>Logger.prototype.error).toBe(\"function\");\n });\n});\n```\n\n### 5. Lint and format\n\nRun linting and formatting on the generated files:\n\n```bash\nbunx biome check --fix src/loggers/<Name>Logger.ts tests/loggers/<Name>Logger.spec.ts\n```\n";var Ro="---\nname: make:mailer\ndescription: Generate a new mailer class with its template and test files, then complete the generated code. Use when creating a new email sender with JSX template using @ooneex/mailer.\n---\n\n# Make Mailer Class\n\nGenerate a new mailer class, its JSX template, and test files using the `make:mailer` CLI command, then complete the generated code with proper implementation.\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the mailer class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:mailer --name <name> --module <module>\n```\n\nWhere `<name>` is the name provided by the user. The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The command will generate (paths prefixed with `modules/<module>/` when `--module` is provided):\n- `src/mailers/<Name>Mailer.ts` - The mailer class file\n- `src/mailers/<Name>MailerTemplate.tsx` - The JSX email template\n- `tests/mailers/<Name>Mailer.spec.ts` - The mailer test file\n- `tests/mailers/<Name>MailerTemplate.spec.ts` - The template test file\n\n### 2. Read the generated files\n\nRead all four generated files to understand the scaffolded code.\n\n### 3. Complete the mailer class\n\nEdit `src/mailers/<Name>Mailer.ts` to complete the implementation:\n\n- Adjust the `send` method config type if additional parameters are needed\n- Add any pre-send logic (validation, data transformation, etc.)\n\nThe generated class structure follows this pattern:\n\n```typescript\nimport { inject } from \"@ooneex/container\";\nimport type { IMailer } from \"@ooneex/mailer\";\nimport { type <Name>MailerPropsType, <Name>MailerTemplate } from \"./<Name>MailerTemplate\";\n\nexport class <Name>Mailer implements IMailer {\n constructor(\n @inject(\"mailer\")\n private readonly mailer: IMailer,\n ) {}\n\n public async send(config: {\n to: string[];\n subject: string;\n from?: { name: string; address: string };\n data?: <Name>MailerPropsType;\n }): Promise<void> {\n const { data, ...rest } = config;\n\n await this.mailer.send({\n ...rest,\n content: <Name>MailerTemplate(data),\n });\n }\n}\n```\n\n### 4. Complete the mailer template\n\nEdit `src/mailers/<Name>MailerTemplate.tsx` to complete the implementation:\n\n- Update `<Name>MailerPropsType` with the actual props needed for the email\n- Build the email body using `MailerLayout` components (Header, Body, Footer)\n- Add email content, styling, and dynamic data rendering\n\nThe generated template structure follows this pattern:\n\n```tsx\nimport { MailerLayout } from \"@ooneex/mailer\";\n\nexport type <Name>MailerPropsType = {\n link: string;\n};\n\nexport const <Name>MailerTemplate = (props?: <Name>MailerPropsType) => (\n <MailerLayout>\n <MailerLayout.Header />\n <MailerLayout.Body>\n <a href={props?.link}>Login</a>\n </MailerLayout.Body>\n <MailerLayout.Footer />\n </MailerLayout>\n);\n```\n\n### 5. Complete the test files\n\nEdit `tests/mailers/<Name>Mailer.spec.ts` and `tests/mailers/<Name>MailerTemplate.spec.ts` to add meaningful tests beyond the scaffolded ones.\n\n### 6. Lint and format\n\nRun linting and formatting on the generated files:\n\n```bash\nbunx biome check --fix src/mailers/<Name>Mailer.ts src/mailers/<Name>MailerTemplate.tsx tests/mailers/<Name>Mailer.spec.ts tests/mailers/<Name>MailerTemplate.spec.ts\n```\n";var Co="---\nname: make:middleware\ndescription: Generate a new middleware class with its test file, then complete the generated code. Use when creating a new HTTP or WebSocket middleware that implements IMiddleware from @ooneex/middleware.\n---\n\n# Make Middleware Class\n\nGenerate a new middleware class and its test file using the `make:middleware` CLI command, then complete the generated code with proper implementation.\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the middleware class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:middleware --name <name> --module <module> --is-socket <true|false>\n```\n\nWhere `<name>` is the name provided by the user. The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The `--is-socket` option determines whether to generate an HTTP middleware or a WebSocket middleware (defaults to `false` if omitted). The command will generate:\n- `src/middlewares/<Name>Middleware.ts` - The middleware class file (or `modules/<module>/src/middlewares/<Name>Middleware.ts` with `--module`)\n- `tests/middlewares/<Name>Middleware.spec.ts` - The test file (or `modules/<module>/tests/middlewares/<Name>Middleware.spec.ts` with `--module`)\n\n### 2. Read the generated files\n\nRead both generated files to understand the scaffolded code.\n\n### 3. Complete the middleware class\n\nEdit `src/middlewares/<Name>Middleware.ts` to complete the implementation:\n\n- Implement the `handler` method with actual middleware logic\n- Add request/response transformations, authentication checks, logging, etc.\n- Inject any required dependencies via the constructor\n\n**HTTP middleware** generated structure:\n\n```typescript\nimport type { ContextType } from \"@ooneex/controller\";\nimport { decorator, type IMiddleware } from \"@ooneex/middleware\";\n\n@decorator.middleware()\nexport class <Name>Middleware implements IMiddleware {\n public async handler(context: ContextType): Promise<ContextType> {\n // Example: Add custom header\n // context.response.header(\"X-Custom-Header\", \"value\");\n\n return context\n }\n}\n```\n\n**Socket middleware** generated structure:\n\n```typescript\nimport type { ContextType } from \"@ooneex/socket\";\nimport { decorator, type IMiddleware } from \"@ooneex/middleware\";\n\n@decorator.middleware()\nexport class <Name>Middleware implements IMiddleware {\n public async handler(context: ContextType): Promise<ContextType> {\n // Example: Add custom header\n // context.response.header(\"X-Custom-Header\", \"value\");\n\n return context\n }\n}\n```\n\n### 4. Complete the test file\n\nEdit `tests/middlewares/<Name>Middleware.spec.ts` to add meaningful tests beyond the scaffolded ones:\n\n- Keep the existing scaffolded tests (class name, handler method)\n- Add tests relevant to the specific middleware behavior\n\nThe generated test structure follows this pattern:\n\n```typescript\nimport { describe, expect, test } from \"bun:test\";\nimport { <Name>Middleware } from \"@/middlewares/<Name>Middleware\";\n\ndescribe(\"<Name>Middleware\", () => {\n test(\"should have class name ending with 'Middleware'\", () => {\n expect(<Name>Middleware.name.endsWith(\"Middleware\")).toBe(true);\n });\n\n test(\"should have 'handler' method\", () => {\n expect(<Name>Middleware.prototype.handler).toBeDefined();\n expect(typeof <Name>Middleware.prototype.handler).toBe(\"function\");\n });\n});\n```\n\n### 5. Register the middleware in the module\n\nAdd the new middleware to the module's `middlewares` array in `src/<PascalModuleName>Module.ts` (e.g., `src/BookModule.ts` for the `book` module):\n\n```typescript\nimport type { ModuleType } from \"@ooneex/module\";\nimport { <Name>Middleware } from \"./middlewares/<Name>Middleware\";\n\nexport const <PascalModuleName>Module: ModuleType = {\n controllers: [],\n entities: [],\n permissions: [],\n middlewares: [<Name>Middleware],\n cronJobs: [],\n events: [],\n};\n```\n\nThe module file uses PascalCase naming: `<PascalModuleName>Module.ts` with export `<PascalModuleName>Module`.\n\nIf the module already has other middlewares registered, append the new middleware to the existing `middlewares` array and add the import alongside existing imports.\n\n### 6. Lint and format\n\nRun linting and formatting on the generated files:\n\n```bash\nbunx biome check --fix src/middlewares/<Name>Middleware.ts tests/middlewares/<Name>Middleware.spec.ts\n```\n";var _o=`---
1583
- name: make:migration
1584
- description: Generate a new database migration file, then complete the generated code. Use when creating a new database migration for schema changes using @ooneex/migrations.
1585
- ---
1586
-
1587
- # Make Migration
1588
-
1589
- Generate a new migration file using the \`make:migration\` CLI command, then complete the generated code with proper implementation.
1590
-
1591
- ## Steps
1592
-
1593
- ### 1. Run the generator
1594
-
1595
- Run the following command to scaffold the migration file:
1596
-
1597
- \`\`\`bash
1598
- bunx @ooneex/cli@latest make:migration --module <module>
1599
- \`\`\`
1600
-
1601
- The \`--module\` option is optional \u2014 if provided, the migration file is generated under \`modules/<module>/src/migrations/\` instead of \`src/migrations/\`. The command will:
1602
- - Generate a timestamped migration file in \`src/migrations/\` (or \`modules/<module>/src/migrations/\` with \`--module\`)
1603
- - Add a \`migration:up\` script to \`package.json\` if not already present
1604
-
1605
- ### 2. Read the generated file
1606
-
1607
- Read the generated migration file in \`src/migrations/\` to understand the scaffolded code.
1608
-
1609
- ### 3. Complete the migration
1610
-
1611
- Edit the generated migration file to implement:
1612
-
1613
- - The \`up\` method with the schema changes (create tables, add columns, create indexes, etc.)
1614
- - The \`down\` method with the reverse operations to undo the migration
1615
-
1616
- ### 4. Lint and format
1617
-
1618
- Run linting and formatting on the generated file:
1619
-
1620
- \`\`\`bash
1621
- bunx biome check --fix src/migrations/
1622
- \`\`\`
1623
- `;var Do="---\nname: make:permission\ndescription: Generate a new permission class with its test file, then complete the generated code. Use when creating a new permission that extends Permission from @ooneex/permission.\n---\n\n# Make Permission Class\n\nGenerate a new permission class and its test file using the `make:permission` CLI command, then complete the generated code with proper implementation.\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the permission class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:permission --name <name> --module <module>\n```\n\nWhere `<name>` is the name provided by the user. The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The command will generate:\n- `src/permissions/<Name>Permission.ts` - The permission class file (or `modules/<module>/src/permissions/<Name>Permission.ts` with `--module`)\n- `tests/permissions/<Name>Permission.spec.ts` - The test file (or `modules/<module>/tests/permissions/<Name>Permission.spec.ts` with `--module`)\n\n### 2. Read the generated files\n\nRead both generated files to understand the scaffolded code.\n\n### 3. Complete the permission class\n\nEdit `src/permissions/<Name>Permission.ts` to complete the implementation:\n\n- Implement the `allow()` method with permission rules using `this.ability.can()`\n- Implement the `setUserPermissions()` method with role-based permission logic\n- Define which actions (read, create, update, delete, manage) are allowed on which entities\n\nThe generated class structure follows this pattern:\n\n```typescript\nimport { decorator, Permission } from \"@ooneex/permission\";\nimport type { IUser } from \"@ooneex/user\";\n\n@decorator.permission()\nexport class <Name>Permission extends Permission {\n public allow(): this {\n // Example: Add permissions using this.ability.can()\n // this.ability.can(\"read\", \"YourEntity\");\n // this.ability.can([\"read\", \"update\"], \"YourEntity\", { userId: user.id });\n\n return this;\n }\n\n public setUserPermissions(user: IUser | null): this {\n if (!user) {\n return this;\n }\n\n // Example: Grant full access to admins\n // const { roles } = user;\n // if (roles.includes(ERole.ADMIN)) {\n // this.ability.can(\"manage\", \"all\");\n // return this;\n // }\n\n // Example: Grant specific permissions based on roles\n // for (const role of roles) {\n // if (role === ERole.USER) {\n // this.ability.can([\"read\", \"update\"], \"YourEntity\", { userId: user.id });\n // }\n //\n // if (role === ERole.GUEST) {\n // this.ability.can(\"read\", \"YourEntity\", { public: true });\n // }\n // }\n\n return this;\n }\n}\n```\n\n### 4. Complete the test file\n\nEdit `tests/permissions/<Name>Permission.spec.ts` to add meaningful tests beyond the scaffolded ones:\n\n- Keep the existing scaffolded tests (class name, extends Permission, allow, setUserPermissions methods)\n- Add tests relevant to the specific permission rules\n\nThe generated test structure follows this pattern:\n\n```typescript\nimport { describe, expect, test } from \"bun:test\";\nimport { Permission } from \"@ooneex/permission\";\nimport { <Name>Permission } from \"@/permissions/<Name>Permission\";\n\ndescribe(\"<Name>Permission\", () => {\n test(\"should have class name ending with 'Permission'\", () => {\n expect(<Name>Permission.name.endsWith(\"Permission\")).toBe(true);\n });\n\n test(\"should extend Permission\", () => {\n const permission = new <Name>Permission();\n expect(permission).toBeInstanceOf(Permission);\n });\n\n test(\"should have 'allow' method\", () => {\n expect(<Name>Permission.prototype.allow).toBeDefined();\n expect(typeof <Name>Permission.prototype.allow).toBe(\"function\");\n });\n\n test(\"should have 'setUserPermissions' method\", () => {\n expect(<Name>Permission.prototype.setUserPermissions).toBeDefined();\n expect(typeof <Name>Permission.prototype.setUserPermissions).toBe(\"function\");\n });\n});\n```\n\n### 5. Register the permission in the module\n\nAdd the new permission to the module's `permissions` array in `src/<PascalModuleName>Module.ts` (e.g., `src/BookModule.ts` for the `book` module):\n\n```typescript\nimport type { ModuleType } from \"@ooneex/module\";\nimport { <Name>Permission } from \"./permissions/<Name>Permission\";\n\nexport const <PascalModuleName>Module: ModuleType = {\n controllers: [],\n entities: [],\n permissions: [<Name>Permission],\n middlewares: [],\n cronJobs: [],\n events: [],\n};\n```\n\nThe module file uses PascalCase naming: `<PascalModuleName>Module.ts` with export `<PascalModuleName>Module`.\n\nIf the module already has other permissions registered, append the new permission to the existing `permissions` array and add the import alongside existing imports.\n\n### 6. Lint and format\n\nRun linting and formatting on the generated files:\n\n```bash\nbunx biome check --fix src/permissions/<Name>Permission.ts tests/permissions/<Name>Permission.spec.ts\n```\n";var Po="---\nname: make:pubsub\ndescription: Generate a new PubSub event class with its test file, then complete the generated code. Use when creating a new publish/subscribe event that extends PubSub from @ooneex/pub-sub.\n---\n\n# Make PubSub Event Class\n\nGenerate a new PubSub event class and its test file using the `make:pubsub` CLI command, then complete the generated code with proper implementation.\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the PubSub event class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:pubsub --name <name> --module <module> --channel <channel>\n```\n\nWhere `<name>` is the name provided by the user. The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The `--channel` option is optional \u2014 if omitted, it defaults to the kebab-case form of the name (e.g., `UserCreated` becomes `user-created`). The command will generate:\n- `src/events/<Name>Event.ts` - The event class file (or `modules/<module>/src/events/<Name>Event.ts` with `--module`)\n- `tests/events/<Name>Event.spec.ts` - The test file (or `modules/<module>/tests/events/<Name>Event.spec.ts` with `--module`)\n\n### 2. Read the generated files\n\nRead both generated files to understand the scaffolded code.\n\n### 3. Complete the PubSub event class\n\nEdit `src/events/<Name>Event.ts` to complete the implementation:\n\n- Define a proper data type instead of `Record<string, ScalarType>` for the event payload\n- Implement the `handler()` method with actual event handling logic\n- Set the appropriate channel name in `getChannel()`\n\nThe generated class structure follows this pattern:\n\n```typescript\nimport { inject } from \"@ooneex/container\";\nimport type { ScalarType } from \"@ooneex/types\";\nimport { decorator, PubSub, RedisPubSub } from \"@ooneex/pub-sub\";\n\n@decorator.pubSub()\nexport class <Name>Event<Data extends Record<string, ScalarType> = Record<string, ScalarType>> extends PubSub<Data> {\n constructor(\n @inject(RedisPubSub)\n client: RedisPubSub<Data>,\n ) {\n super(client);\n }\n\n public getChannel(): string {\n return \"<channel>\";\n }\n\n public async handler(context: { data: Data; channel: string }): Promise<void> {\n console.log(context);\n // TODO: Implement handler logic here\n }\n}\n```\n\n### 4. Complete the test file\n\nEdit `tests/events/<Name>Event.spec.ts` to add meaningful tests beyond the scaffolded ones:\n\n- Keep the existing scaffolded tests (class name, getChannel, handler, publish, subscribe, unsubscribe, unsubscribeAll methods)\n- Add tests relevant to the specific event behavior\n\nThe generated test structure follows this pattern:\n\n```typescript\nimport { describe, expect, test } from \"bun:test\";\nimport { <Name>PubSub } from \"@/pubsub/<Name>PubSub\";\n\ndescribe(\"<Name>PubSub\", () => {\n test(\"should have class name ending with 'PubSub'\", () => {\n expect(<Name>PubSub.name.endsWith(\"PubSub\")).toBe(true);\n });\n\n test(\"should have 'getChannel' method\", () => {\n expect(<Name>PubSub.prototype.getChannel).toBeDefined();\n expect(typeof <Name>PubSub.prototype.getChannel).toBe(\"function\");\n });\n\n test(\"should have 'handler' method\", () => {\n expect(<Name>PubSub.prototype.handler).toBeDefined();\n expect(typeof <Name>PubSub.prototype.handler).toBe(\"function\");\n });\n\n test(\"should have 'publish' method\", () => {\n expect(<Name>PubSub.prototype.publish).toBeDefined();\n expect(typeof <Name>PubSub.prototype.publish).toBe(\"function\");\n });\n\n test(\"should have 'subscribe' method\", () => {\n expect(<Name>PubSub.prototype.subscribe).toBeDefined();\n expect(typeof <Name>PubSub.prototype.subscribe).toBe(\"function\");\n });\n\n test(\"should have 'unsubscribe' method\", () => {\n expect(<Name>PubSub.prototype.unsubscribe).toBeDefined();\n expect(typeof <Name>PubSub.prototype.unsubscribe).toBe(\"function\");\n });\n\n test(\"should have 'unsubscribeAll' method\", () => {\n expect(<Name>PubSub.prototype.unsubscribeAll).toBeDefined();\n expect(typeof <Name>PubSub.prototype.unsubscribeAll).toBe(\"function\");\n });\n});\n```\n\n### 5. Register the event in the module\n\nAdd the new event to the module's `events` array in `src/<PascalModuleName>Module.ts` (e.g., `src/BookModule.ts` for the `book` module):\n\n```typescript\nimport type { ModuleType } from \"@ooneex/module\";\nimport { <Name>Event } from \"./events/<Name>Event\";\n\nexport const <PascalModuleName>Module: ModuleType = {\n controllers: [],\n entities: [],\n permissions: [],\n middlewares: [],\n cronJobs: [],\n events: [<Name>Event],\n};\n```\n\nThe module file uses PascalCase naming: `<PascalModuleName>Module.ts` with export `<PascalModuleName>Module`.\n\nIf the module already has other events registered, append the new event to the existing `events` array and add the import alongside existing imports.\n\n### 6. Lint and format\n\nRun linting and formatting on the generated files:\n\n```bash\nbunx biome check --fix src/events/<Name>Event.ts tests/events/<Name>Event.spec.ts\n```\n";var Oo="---\nname: make:repository\ndescription: Generate a new repository class with its test file, then complete the generated code. Use when creating a new TypeORM repository for database operations on an entity.\n---\n\n# Make Repository Class\n\nGenerate a new repository class and its test file using the `make:repository` CLI command, then complete the generated code with proper implementation.\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the repository class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:repository --name <name> --module <module>\n```\n\nWhere `<name>` is the name provided by the user. The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The command will generate:\n- `src/repositories/<Name>Repository.ts` - The repository class file (or `modules/<module>/src/repositories/<Name>Repository.ts` with `--module`)\n- `tests/repositories/<Name>Repository.spec.ts` - The test file (or `modules/<module>/tests/repositories/<Name>Repository.spec.ts` with `--module`)\n\n### 2. Read the generated files\n\nRead both generated files to understand the scaffolded code.\n\n### 3. Complete the repository class\n\nEdit `src/repositories/<Name>Repository.ts` to complete the implementation:\n\n- Verify the entity import path matches the actual entity location\n- Adjust the `find` method's search fields (default searches `name` with `ILike`)\n- Customize relations loading in `findOne`/`findOneBy` if needed\n\n#### Adding methods\n\nLook at the entity's fields, relations, and business context to determine if custom domain-specific methods are needed. For example:\n- A `SessionRepository` might need `revokeSession(sessionId: string)` and `revokeAllUserSessions(userId: string)`\n- A `NotificationRepository` might need `markAsRead(id: string)` and `markAllAsRead(userId: string)`\n- Entities with status fields may need methods like `archive(id: string)` or `activate(id: string)`\n\nRead related entities, services, or actions in the module to understand what operations the repository should support, then add the appropriate methods.\n\n#### Removing methods\n\nRemove scaffolded methods that don't make sense for the entity's context:\n- Remove `createMany`/`updateMany` if the entity is always managed individually (e.g., user profiles, settings)\n- Remove `delete` if the entity uses soft deletes only (use a custom `softDelete` or `archive` method instead)\n- Remove `find` if the entity is only ever accessed by ID or specific criteria (e.g., singleton config entities)\n- Remove `count` if there's no use case for counting records of this entity\n\nThe generated class structure follows this pattern:\n\n```typescript\nimport { inject } from \"@ooneex/container\";\nimport type { ITypeormDatabase } from \"@ooneex/database\";\nimport { decorator } from \"@ooneex/repository\";\nimport type { FilterResultType } from \"@ooneex/types\";\nimport type { FindManyOptions, FindOptionsWhere, Repository, SaveOptions, UpdateResult } from \"typeorm\";\nimport { ILike } from \"typeorm\";\nimport { <Name>Entity } from \"../entities/<Name>Entity\";\n\n@decorator.repository()\nexport class <Name>Repository {\n constructor(\n @inject(\"database\")\n private readonly database: ITypeormDatabase,\n ) {}\n\n public async open(): Promise<Repository<<Name>Entity>> {\n return await this.database.open(<Name>Entity);\n }\n\n public async close(): Promise<void> {\n await this.database.close();\n }\n\n public async find(\n criteria: FindManyOptions<<Name>Entity> & { page?: number; limit?: number; q?: string },\n ): Promise<FilterResultType<<Name>Entity>> {\n // ... pagination and search logic\n }\n\n public async findOne(id: string): Promise<<Name>Entity | null> { ... }\n public async findOneBy(criteria: FindOptionsWhere<<Name>Entity>): Promise<<Name>Entity | null> { ... }\n public async create(entity: <Name>Entity, options?: SaveOptions): Promise<<Name>Entity> { ... }\n public async createMany(entities: <Name>Entity[], options?: SaveOptions): Promise<<Name>Entity[]> { ... }\n public async update(entity: <Name>Entity, options?: SaveOptions): Promise<<Name>Entity> { ... }\n public async updateMany(entities: <Name>Entity[], options?: SaveOptions): Promise<<Name>Entity[]> { ... }\n public async delete(criteria: FindOptionsWhere<<Name>Entity> | FindOptionsWhere<<Name>Entity>[]): Promise<UpdateResult> { ... }\n public async count(criteria?: FindOptionsWhere<<Name>Entity> | FindOptionsWhere<<Name>Entity>[]): Promise<number> { ... }\n}\n```\n\n### 4. Complete the test file\n\nEdit `tests/repositories/<Name>Repository.spec.ts` to add meaningful tests beyond the scaffolded ones:\n\n- Keep scaffolded tests for methods that remain in the repository (remove tests for methods that were removed)\n- Add tests for any custom domain-specific methods added to the repository\n- Add tests relevant to the specific repository behavior\n\n### 5. Lint and format\n\nRun linting and formatting on the generated files:\n\n```bash\nbunx biome check --fix src/repositories/<Name>Repository.ts tests/repositories/<Name>Repository.spec.ts\n```\n";var Bo=`---
1624
- name: make:seed
1625
- description: Generate a new database seed file, then complete the generated code. Use when creating seed data for populating the database using @ooneex/seeds.
1626
- ---
1627
-
1628
- # Make Seed
1629
-
1630
- Generate a new seed file using the \`make:seed\` CLI command, then complete the generated code with proper implementation.
1631
-
1632
- ## Steps
1633
-
1634
- ### 1. Run the generator
1635
-
1636
- Run the following command to scaffold the seed file:
1637
-
1638
- \`\`\`bash
1639
- bunx @ooneex/cli@latest make:seed --name <name> --module <module>
1640
- \`\`\`
1641
-
1642
- Where \`<name>\` is the name provided by the user. The \`--module\` option is optional \u2014 if provided, the seed file is generated under \`modules/<module>/src/seeds/\` instead of \`src/seeds/\`. The command will:
1643
- - Generate a seed file in \`src/seeds/\` (or \`modules/<module>/src/seeds/\` with \`--module\`)
1644
- - Add a \`seed:run\` script to \`package.json\` if not already present
1645
-
1646
- ### 2. Read the generated file
1647
-
1648
- Read the generated seed file in \`src/seeds/\` to understand the scaffolded code.
1649
-
1650
- ### 3. Complete the seed
1651
-
1652
- Edit the generated seed file to implement:
1653
-
1654
- - Import the relevant entity classes
1655
- - Create seed data with hardcoded nanoid values for \`id\` fields (generate via \`bun -e "import { random } from '@ooneex/utils'; console.log(random.nanoid())"\`)
1656
- - Do NOT use sequential IDs like \`"item-1"\`, \`"item-2"\`
1657
- - Ensure the same entity uses the same ID everywhere it appears
1658
-
1659
- ### 4. Lint and format
1660
-
1661
- Run linting and formatting on the generated file:
1662
-
1663
- \`\`\`bash
1664
- bunx biome check --fix src/seeds/
1665
- \`\`\`
1666
- `;var Io="---\nname: make:service\ndescription: Generate a new service class with its test file, then complete the generated code. Use when creating a new business logic service that implements IService from @ooneex/service.\n---\n\n# Make Service Class\n\nGenerate a new service class and its test file using the `make:service` CLI command, then complete the generated code with proper implementation.\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the service class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:service --name <name> --module <module>\n```\n\nWhere `<name>` is the name provided by the user. The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The command will generate:\n- `src/services/<Name>Service.ts` - The service class file (or `modules/<module>/src/services/<Name>Service.ts` with `--module`)\n- `tests/services/<Name>Service.spec.ts` - The test file (or `modules/<module>/tests/services/<Name>Service.spec.ts` with `--module`)\n\n### 2. Read the generated files\n\nRead both generated files to understand the scaffolded code.\n\n### 3. Complete the service class\n\nEdit `src/services/<Name>Service.ts` to complete the implementation:\n\n- Define a proper type for `ServiceDataType` instead of `Record<string, unknown>`\n- Implement the `execute()` method with actual business logic\n- Inject any required dependencies (repositories, other services, etc.) via the constructor\n\nThe generated class structure follows this pattern:\n\n```typescript\nimport { decorator } from \"@ooneex/service\";\nimport type { IService } from \"@ooneex/service\";\n\ntype ServiceDataType = Record<string, unknown>;\n\n@decorator.service()\nexport class <Name>Service<T extends ServiceDataType = ServiceDataType> implements IService<T> {\n public async execute(data?: T): Promise<void> {\n // TODO: Implement service logic\n }\n}\n```\n\n### 4. Complete the test file\n\nEdit `tests/services/<Name>Service.spec.ts` to add meaningful tests beyond the scaffolded ones:\n\n- Keep the existing scaffolded tests (class name, execute method)\n- Add tests relevant to the specific service behavior\n\nThe generated test structure follows this pattern:\n\n```typescript\nimport { describe, expect, test } from \"bun:test\";\nimport { <Name>Service } from \"@/services/<Name>Service\";\n\ndescribe(\"<Name>Service\", () => {\n test(\"should have class name ending with 'Service'\", () => {\n expect(<Name>Service.name.endsWith(\"Service\")).toBe(true);\n });\n\n test(\"should have 'execute' method\", () => {\n expect(<Name>Service.prototype.execute).toBeDefined();\n expect(typeof <Name>Service.prototype.execute).toBe(\"function\");\n });\n});\n```\n\n### 5. Lint and format\n\nRun linting and formatting on the generated files:\n\n```bash\nbunx biome check --fix src/services/<Name>Service.ts tests/services/<Name>Service.spec.ts\n```\n";var Lo="---\nname: make:storage\ndescription: Generate a new storage class with its test file, then complete the generated code. Use when creating a new S3-compatible storage adapter that extends Storage from @ooneex/storage.\n---\n\n# Make Storage Class\n\nGenerate a new storage class and its test file using the `make:storage` CLI command, then complete the generated code with proper implementation.\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the storage class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:storage --name <name> --module <module>\n```\n\nWhere `<name>` is the name provided by the user. The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The command will generate:\n- `src/storage/<Name>Storage.ts` - The storage class file (or `modules/<module>/src/storage/<Name>Storage.ts` with `--module`)\n- `tests/storage/<Name>Storage.spec.ts` - The test file (or `modules/<module>/tests/storage/<Name>Storage.spec.ts` with `--module`)\n\n### 2. Read the generated files\n\nRead both generated files to understand the scaffolded code.\n\n### 3. Complete the storage class\n\nEdit `src/storage/<Name>Storage.ts` to complete the implementation:\n\n- Set the `bucket` property to the appropriate bucket name\n- Verify the environment variable names match the project configuration (`STORAGE_<NAME_UPPER>_ACCESS_KEY`, `STORAGE_<NAME_UPPER>_SECRET_KEY`, `STORAGE_<NAME_UPPER>_ENDPOINT`, `STORAGE_<NAME_UPPER>_REGION`)\n- Add any additional storage-specific methods if needed\n\nThe generated class structure follows this pattern:\n\n```typescript\nimport { Storage, decorator, StorageException } from \"@ooneex/storage\";\nimport type { S3Options } from \"bun\";\n\n@decorator.storage()\nexport class <Name>Storage extends Storage {\n protected bucket: string;\n private readonly accessKey: string;\n private readonly secretKey: string;\n private readonly endpoint: string;\n private readonly region: string;\n\n constructor(options?: {\n accessKey?: string;\n secretKey?: string;\n endpoint?: string;\n region?: string;\n }) {\n super();\n\n const accessKey = options?.accessKey || Bun.env.STORAGE_<NAME_UPPER>_ACCESS_KEY;\n const secretKey = options?.secretKey || Bun.env.STORAGE_<NAME_UPPER>_SECRET_KEY;\n const endpoint = options?.endpoint || Bun.env.STORAGE_<NAME_UPPER>_ENDPOINT;\n\n // ... validation throws StorageException if missing ...\n\n this.accessKey = accessKey;\n this.secretKey = secretKey;\n this.endpoint = endpoint;\n this.region = options?.region || Bun.env.STORAGE_<NAME_UPPER>_REGION || \"auto\";\n }\n\n public getOptions(): S3Options {\n return {\n accessKeyId: this.accessKey,\n secretAccessKey: this.secretKey,\n endpoint: this.endpoint,\n bucket: this.bucket,\n region: this.region,\n };\n }\n}\n```\n\n### 4. Complete the test file\n\nEdit `tests/storage/<Name>Storage.spec.ts` to add meaningful tests beyond the scaffolded ones:\n\n- Keep the existing scaffolded tests (class name, bucket field, getOptions method)\n- Add tests relevant to the specific storage class behavior\n\nThe generated test structure follows this pattern:\n\n```typescript\nimport { describe, expect, test } from \"bun:test\";\nimport { <Name>StorageAdapter } from \"@/storage/<Name>StorageAdapter\";\n\ndescribe(\"<Name>StorageAdapter\", () => {\n test(\"should have class name ending with 'StorageAdapter'\", () => {\n expect(<Name>StorageAdapter.name.endsWith(\"StorageAdapter\")).toBe(true);\n });\n\n test(\"should have 'bucket' field\", () => {\n expect(\"bucket\" in <Name>StorageAdapter.prototype || \"bucket\" in Object.getOwnPropertyNames(<Name>StorageAdapter.prototype)).toBe(true);\n });\n\n test(\"should have 'getOptions' method\", () => {\n expect(<Name>StorageAdapter.prototype.getOptions).toBeDefined();\n expect(typeof <Name>StorageAdapter.prototype.getOptions).toBe(\"function\");\n });\n});\n```\n\n### 5. Lint and format\n\nRun linting and formatting on the generated files:\n\n```bash\nbunx biome check --fix src/storage/<Name>Storage.ts tests/storage/<Name>Storage.spec.ts\n```\n";var Uo="---\nname: make:vector-database\ndescription: Generate a new vector database class with its test file, then complete the generated code. Use when creating a new vector database that extends VectorDatabase from @ooneex/rag.\n---\n\n# Make Vector Database Class\n\nGenerate a new vector database class and its test file using the `make:vector-database` CLI command, then complete the generated code with proper implementation.\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the vector database class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:vector-database --name <name> --module <module>\n```\n\nWhere `<name>` is the name provided by the user. The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The command will generate:\n- `src/databases/<Name>VectorDatabase.ts` - The vector database class file (or `modules/<module>/src/databases/<Name>VectorDatabase.ts` with `--module`)\n- `tests/databases/<Name>VectorDatabase.spec.ts` - The test file (or `modules/<module>/tests/databases/<Name>VectorDatabase.spec.ts` with `--module`)\n\n### 2. Read the generated files\n\nRead both generated files to understand the scaffolded code.\n\n### 3. Complete the vector database class\n\nEdit `src/databases/<Name>VectorDatabase.ts` to complete the implementation:\n\n- Set the `getDatabaseUri()` return value to the actual LanceDB database path\n- Configure the embedding provider and model in `getEmbeddingModel()`\n- Define the custom data fields in `DataType` and map them in `getSchema()`\n- Import the appropriate Apache Arrow types for your schema fields\n\nThe generated class structure follows this pattern:\n\n```typescript\nimport { VectorDatabase, decorator } from \"@ooneex/rag\";\nimport type { EmbeddingModelType, EmbeddingProviderType, FieldValueType } from \"@ooneex/rag\";\nimport { Utf8 } from \"apache-arrow\";\n\ntype DataType = {\n name: string;\n};\n\n@decorator.vectorDatabase()\nexport class <Name>VectorDatabase extends VectorDatabase<DataType> {\n public getDatabaseUri(): string {\n return \"\";\n }\n\n public getEmbeddingModel(): { provider: EmbeddingProviderType; model: EmbeddingModelType[\"model\"] } {\n return { provider: \"openai\", model: \"text-embedding-ada-002\" };\n }\n\n public getSchema(): { [K in keyof DataType]: FieldValueType } {\n return {\n name: new Utf8(),\n };\n }\n}\n```\n\n### 4. Complete the test file\n\nEdit `tests/databases/<Name>VectorDatabase.spec.ts` to add meaningful tests beyond the scaffolded ones:\n\n- Keep the existing scaffolded tests (class name, getDatabaseUri, getEmbeddingModel, getSchema methods)\n- Add tests relevant to the specific vector database class behavior\n\nThe generated test structure follows this pattern:\n\n```typescript\nimport { describe, expect, test } from \"bun:test\";\nimport { <Name>VectorDatabase } from \"@/databases/<Name>VectorDatabase\";\n\ndescribe(\"<Name>VectorDatabase\", () => {\n test(\"should have class name ending with 'VectorDatabase'\", () => {\n expect(<Name>VectorDatabase.name.endsWith(\"VectorDatabase\")).toBe(true);\n });\n\n test(\"should have 'getDatabaseUri' method\", () => {\n expect(<Name>VectorDatabase.prototype.getDatabaseUri).toBeDefined();\n expect(typeof <Name>VectorDatabase.prototype.getDatabaseUri).toBe(\"function\");\n });\n\n test(\"should have 'getEmbeddingModel' method\", () => {\n expect(<Name>VectorDatabase.prototype.getEmbeddingModel).toBeDefined();\n expect(typeof <Name>VectorDatabase.prototype.getEmbeddingModel).toBe(\"function\");\n });\n\n test(\"should have 'getSchema' method\", () => {\n expect(<Name>VectorDatabase.prototype.getSchema).toBeDefined();\n expect(typeof <Name>VectorDatabase.prototype.getSchema).toBe(\"function\");\n });\n});\n```\n\n### 5. Lint and format\n\nRun linting and formatting on the generated files:\n\n```bash\nbunx biome check --fix src/databases/<Name>VectorDatabase.ts tests/databases/<Name>VectorDatabase.spec.ts\n```\n";var Ed={"make.ai":wo,"make.analytics":Eo,"make.cache":Ao,"make.controller":No,"make.cron":vo,"make.database":To,"make.entity":So,"make.logger":Mo,"make.mailer":Ro,"make.middleware":Co,"make.migration":_o,"make.permission":Do,"make.pubsub":Po,"make.repository":Oo,"make.seed":Bo,"make.service":Io,"make.storage":Lo,"make.vector-database":Uo};class Ue{getName(){return"make:claude:skill"}getDescription(){return"Generate Claude skills from templates"}async run(){let e=Le(".claude","skills"),t=Le(process.cwd(),e),s=new wd;for(let[r,o]of Object.entries(Ed)){let a=r.replace(/\./g,"-"),i=Le(t,a,"SKILL.md");await Bun.write(i,o),s.success(`${Le(e,a,"SKILL.md")} created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}}Ue=y([b.command()],Ue);import{basename as Ud,join as O}from"path";import{TerminalLogger as Gd}from"@ooneex/logger";import{toKebabCase as $d,toPascalCase as _t,trim as Wd}from"@ooneex/utils";var Go=te(ie(),1),Ge=async(e)=>{return(await Go.prompt({type:"confirm",name:"confirm",message:e.message})).confirm};var we=["GET","POST","PUT","DELETE","PATCH","OPTIONS","HEAD"];var $o=te(ie(),1);import{Assert as Ad,Validation as Nd}from"@ooneex/validation";class Mt extends Nd{getConstraint(){return Ad("string >= 3")}getErrorMessage(){return`Route method must be one of: ${we.join(", ")}`}validate(e,t){let s=super.validate(e,t);if(!s.isValid)return s;let r=e;if(r.trim()!==r)return{isValid:!1,message:this.getErrorMessage()||"Invalid route method format"};let o=r.toUpperCase();if(!we.includes(o))return{isValid:!1,message:this.getErrorMessage()||"Invalid route method"};return{isValid:!0}}}var Wo=async(e)=>{return(await $o.prompt({type:"select",name:"method",message:e.message,initial:e.initial??0,choices:we.map((s)=>s),validate:(s)=>{let o=new Mt().validate(s);if(!o.isValid)return o.message||"Route method is invalid";return!0}})).method};var qo=te(ie(),1);import{Assert as vd,Validation as Td}from"@ooneex/validation";var Sd=/^[a-zA-Z0-9]+\.[a-zA-Z0-9]+\.[a-zA-Z0-9]+$/;class Rt extends Td{getConstraint(){return vd("string >= 7")}getErrorMessage(){return"Route name must follow format: namespace.resource.action (e.g., 'api.users.list')"}validate(e,t){let s=super.validate(e,t);if(!s.isValid)return s;let r=e;if(r.trim()!==r)return{isValid:!1,message:this.getErrorMessage()||"Invalid route name format"};if(!Sd.test(r))return{isValid:!1,message:this.getErrorMessage()||"Invalid route name format"};let o=r.split(".");if(o.length!==3)return{isValid:!1,message:this.getErrorMessage()||"Invalid route name format"};let[a,i,n]=o;if(!a||!i||!n)return{isValid:!1,message:this.getErrorMessage()||"Invalid route name format"};return{isValid:!0}}}var ko=async(e)=>{return(await qo.prompt({type:"input",name:"routeName",message:e.message,validate:(s)=>{let o=new Rt().validate(s);if(!o.isValid)return o.message||"Route name is invalid";return!0}})).routeName};var Ko=te(ie(),1);import{Assert as Md,Validation as Rd}from"@ooneex/validation";var Cd=1,_d=/^\/[\w\-/:]*$/,Dd=/^[a-zA-Z0-9\-_]+$/,Pd=/^:[a-zA-Z][a-zA-Z0-9]*$/;class Ct extends Rd{getConstraint(){return Md(`string >= ${Cd}`)}getErrorMessage(){return"Route path must start with '/' and contain only valid segments (e.g., '/users', '/api/users/:id')"}validate(e,t){let s=super.validate(e,t);if(!s.isValid)return s;let r=e;if(r.trim()!==r)return{isValid:!1,message:this.getErrorMessage()||"Invalid route path format"};if(!r.startsWith("/"))return{isValid:!1,message:"Route path must start with '/'"};if(r.length>1&&r.endsWith("/"))return{isValid:!1,message:"Route path cannot end with '/' (except for root path)"};if(!_d.test(r))return{isValid:!1,message:this.getErrorMessage()||"Invalid route path format"};if(r==="/")return{isValid:!0};let o=r.slice(1).split("/");for(let a of o){if(!a)return{isValid:!1,message:"Route path cannot contain empty segments (double slashes)"};if(a.startsWith(":")){if(!Pd.test(a))return{isValid:!1,message:`Invalid parameter segment '${a}'. Parameters must follow format ':paramName' with alphanumeric characters only`}}else if(!Dd.test(a))return{isValid:!1,message:`Invalid path segment '${a}'. Segments must contain only letters, numbers, hyphens, and underscores`}}return{isValid:!0}}}var Ho=async(e)=>{return(await Ko.prompt({type:"input",name:"path",message:e.message,initial:e.initial??"/",validate:(s)=>{let o=new Ct().validate(s);if(!o.isValid)return o.message||"Route path is invalid";return!0}})).path};var Vo=`import type { ContextType } from "@ooneex/socket";
1299
+ `;class Be{getName(){return"make:cache"}getDescription(){return"Generate a new cache class"}async run(e){let{name:t,module:s}=e;if(!t)t=await v({message:"Enter cache name"});t=Jl(t).replace(/Cache$/,"");let o=gr.replace(/{{NAME}}/g,t),r=s?Y("modules",s):".",a=Y(r,"src","cache"),i=Y(process.cwd(),a),n=Y(i,`${t}Cache.ts`);await Bun.write(n,o);let l=yr.replace(/{{NAME}}/g,t),d=Y(r,"tests","cache"),m=Y(process.cwd(),d),u=Y(m,`${t}Cache.spec.ts`);await Bun.write(u,l);let p=new Xl;p.success(`${Y(a,t)}Cache.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),p.success(`${Y(d,t)}Cache.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}Be=g([b.command()],Be);import{join as Le}from"path";import{TerminalLogger as bd}from"@ooneex/logger";var br="---\nname: make:ai\ndescription: Generate a new AI class with its test file, then complete the generated code. Use when creating a new AI chat class that uses OpenAI via the @ooneex/ai package.\n---\n\n# Make AI Class\n\nGenerate a new AI class and its test file using the `make:ai` CLI command, then complete the generated code with proper implementation.\n\n## Coding Conventions\n\n- Always explicitly show visibility on class methods and properties (`private`, `public`, `protected`)\n- Always use arrow functions when possible, but NOT for class methods (class methods use regular method syntax)\n- End type names with the `Type` suffix (e.g., `ExceptionStackFrameType`, `ServiceDataType`)\n- Start interface names with the `I` prefix (e.g., `IException`, `IService`, `IAiChat`)\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the AI class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:ai --name <name> --module <module>\n```\n\nWhere `<name>` is the name provided by the user. The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The command will generate:\n- `src/ai/<Name>Ai.ts` - The AI class file (or `modules/<module>/src/ai/<Name>Ai.ts` with `--module`)\n- `tests/ai/<Name>Ai.spec.ts` - The test file (or `modules/<module>/tests/ai/<Name>Ai.spec.ts` with `--module`)\n\n### 2. Read the generated files\n\nRead both generated files to understand the scaffolded code.\n\n### 3. Complete the AI class\n\nEdit `src/ai/<Name>Ai.ts` to complete the implementation:\n\n- Update the prompt in the `run` method from `\"My prompt\"` to a meaningful prompt based on the class purpose\n- Update the prompt in the `runStream` method from `\"My prompt\"` to a meaningful prompt based on the class purpose\n- Add any additional configuration or methods relevant to the AI class purpose\n- Ensure proper typing for the `run<T>()` generic return type\n\nThe generated class structure follows this pattern:\n\n```typescript\nimport { decorator, type IAiChat, OpenAi, type OpenAiConfigType } from \"@ooneex/ai\";\nimport { inject } from \"@ooneex/container\";\n\n@decorator.ai()\nexport class <Name>Ai implements IAiChat<OpenAiConfigType> {\n constructor(@inject(OpenAi) private readonly ai: OpenAi) {}\n\n public async run<T>(prompt?: string, config?: Omit<OpenAiConfigType, \"prompt\">): Promise<T> {\n return this.ai.run<T>(prompt || \"My prompt\", config);\n }\n\n public async *runStream(\n prompt?: string,\n config?: Omit<OpenAiConfigType, \"prompt\" | \"output\">,\n ): AsyncGenerator<string, void, unknown> {\n yield* this.ai.runStream(prompt || \"My prompt\", config);\n }\n}\n```\n\n### 4. Complete the test file\n\nEdit `tests/ai/<Name>Ai.spec.ts` to add meaningful tests beyond the scaffolded ones:\n\n- Keep the existing scaffolded tests (class name, run method, runStream method)\n- Add tests relevant to the specific AI class behavior\n\nThe generated test structure follows this pattern:\n\n```typescript\nimport { describe, expect, test } from \"bun:test\";\nimport { <Name>Ai } from \"@/ai/<Name>Ai\";\n\ndescribe(\"<Name>Ai\", () => {\n test(\"should have class name ending with 'Ai'\", () => {\n expect(<Name>Ai.name.endsWith(\"Ai\")).toBe(true);\n });\n\n test(\"should have 'run' method\", () => {\n expect(<Name>Ai.prototype.run).toBeDefined();\n expect(typeof <Name>Ai.prototype.run).toBe(\"function\");\n });\n\n test(\"should have 'runStream' method\", () => {\n expect(<Name>Ai.prototype.runStream).toBeDefined();\n expect(typeof <Name>Ai.prototype.runStream).toBe(\"function\");\n });\n});\n```\n\n### 5. Lint and format\n\nRun linting and formatting on the generated files:\n\n```bash\nbunx biome check --fix src/ai/<Name>Ai.ts tests/ai/<Name>Ai.spec.ts\n```\n";var wr="---\nname: make:analytics\ndescription: Generate a new analytics class with its test file, then complete the generated code. Use when creating a new analytics tracking class that uses the @ooneex/analytics package.\n---\n\n# Make Analytics Class\n\nGenerate a new analytics class and its test file using the `make:analytics` CLI command, then complete the generated code with proper implementation.\n\n## Coding Conventions\n\n- Always explicitly show visibility on class methods and properties (`private`, `public`, `protected`)\n- Always use arrow functions when possible, but NOT for class methods (class methods use regular method syntax)\n- End type names with the `Type` suffix (e.g., `ExceptionStackFrameType`, `ServiceDataType`)\n- Start interface names with the `I` prefix (e.g., `IException`, `IService`, `IAiChat`)\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the analytics class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:analytics --name <name> --module <module>\n```\n\nWhere `<name>` is the name provided by the user. The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The command will generate:\n- `src/analytics/<Name>Analytics.ts` - The analytics class file (or `modules/<module>/src/analytics/<Name>Analytics.ts` with `--module`)\n- `tests/analytics/<Name>Analytics.spec.ts` - The test file (or `modules/<module>/tests/analytics/<Name>Analytics.spec.ts` with `--module`)\n\n### 2. Read the generated files\n\nRead both generated files to understand the scaffolded code.\n\n### 3. Complete the analytics class\n\nEdit `src/analytics/<Name>Analytics.ts` to complete the implementation:\n\n- Implement the `capture` method with actual analytics tracking logic\n- Define a proper type for `CaptureOptionsType` instead of `Record<string, unknown>` based on the analytics purpose\n- Add any additional methods or properties relevant to the analytics class purpose\n\nThe generated class structure follows this pattern:\n\n```typescript\nimport { decorator } from \"@ooneex/analytics\";\nimport type { IAnalytics } from \"@ooneex/analytics\";\n\ntype CaptureOptionsType = Record<string, unknown>;\n\n@decorator.analytics()\nexport class <Name>Analytics<T extends CaptureOptionsType = CaptureOptionsType> implements IAnalytics<T> {\n public capture(options: T): void {\n // console.log(\"Analytics captured:\", options);\n }\n}\n```\n\n### 4. Complete the test file\n\nEdit `tests/analytics/<Name>Analytics.spec.ts` to add meaningful tests beyond the scaffolded ones:\n\n- Keep the existing scaffolded tests (class name, capture method)\n- Add tests relevant to the specific analytics class behavior\n\nThe generated test structure follows this pattern:\n\n```typescript\nimport { describe, expect, test } from \"bun:test\";\nimport { <Name>Analytics } from \"@/analytics/<Name>Analytics\";\n\ndescribe(\"<Name>Analytics\", () => {\n test(\"should have class name ending with 'Analytics'\", () => {\n expect(<Name>Analytics.name.endsWith(\"Analytics\")).toBe(true);\n });\n\n test(\"should have 'capture' method\", () => {\n expect(<Name>Analytics.prototype.capture).toBeDefined();\n expect(typeof <Name>Analytics.prototype.capture).toBe(\"function\");\n });\n});\n```\n\n### 5. Lint and format\n\nRun linting and formatting on the generated files:\n\n```bash\nbunx biome check --fix src/analytics/<Name>Analytics.ts tests/analytics/<Name>Analytics.spec.ts\n```\n";var xr="---\nname: make:cache\ndescription: Generate a new cache adapter class with its test file, then complete the generated code. Use when creating a new cache adapter that implements the ICache interface from @ooneex/cache.\n---\n\n# Make Cache Class\n\nGenerate a new cache class and its test file using the `make:cache` CLI command, then complete the generated code with proper implementation.\n\n## Coding Conventions\n\n- Always explicitly show visibility on class methods and properties (`private`, `public`, `protected`)\n- Always use arrow functions when possible, but NOT for class methods (class methods use regular method syntax)\n- End type names with the `Type` suffix (e.g., `ExceptionStackFrameType`, `ServiceDataType`)\n- Start interface names with the `I` prefix (e.g., `IException`, `IService`, `IAiChat`)\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the cache class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:cache --name <name> --module <module>\n```\n\nWhere `<name>` is the name provided by the user. The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The command will generate:\n- `src/cache/<Name>Cache.ts` - The cache class file (or `modules/<module>/src/cache/<Name>Cache.ts` with `--module`)\n- `tests/cache/<Name>Cache.spec.ts` - The test file (or `modules/<module>/tests/cache/<Name>Cache.spec.ts` with `--module`)\n\n### 2. Read the generated files\n\nRead both generated files to understand the scaffolded code.\n\n### 3. Complete the cache class\n\nEdit `src/cache/<Name>Cache.ts` to complete the implementation:\n\n- Implement the `get` method to retrieve cached values by key\n- Implement the `set` method to store values with optional TTL\n- Implement the `delete` method to remove cached entries\n- Implement the `has` method to check key existence\n- Replace the `CacheException` throws with actual cache logic\n- Inject any required dependencies (e.g., Redis client) via the constructor\n\nThe generated class structure follows this pattern:\n\n```typescript\nimport { CacheException, decorator } from \"@ooneex/cache\";\nimport type { ICache } from \"@ooneex/cache\";\n\n@decorator.cache()\nexport class <Name>Cache implements ICache {\n public async get<T = unknown>(key: string): Promise<T | undefined> {\n throw new CacheException(`Failed to get key \"${key}\": Not implemented`);\n }\n\n public async set<T = unknown>(key: string, value: T, ttl?: number): Promise<void> {\n throw new CacheException(`Failed to set key \"${key}\": Not implemented`);\n }\n\n public async delete(key: string): Promise<boolean> {\n throw new CacheException(`Failed to delete key \"${key}\": Not implemented`);\n }\n\n public async has(key: string): Promise<boolean> {\n throw new CacheException(`Failed to check if key \"${key}\" exists: Not implemented`);\n }\n}\n```\n\n### 4. Complete the test file\n\nEdit `tests/cache/<Name>Cache.spec.ts` to add meaningful tests beyond the scaffolded ones:\n\n- Keep the existing scaffolded tests (class name, get, set, delete, has methods)\n- Add tests relevant to the specific cache class behavior\n\nThe generated test structure follows this pattern:\n\n```typescript\nimport { describe, expect, test } from \"bun:test\";\nimport { <Name>Cache } from \"@/cache/<Name>Cache\";\n\ndescribe(\"<Name>Cache\", () => {\n test(\"should have class name ending with 'Cache'\", () => {\n expect(<Name>Cache.name.endsWith(\"Cache\")).toBe(true);\n });\n\n test(\"should have 'get' method\", () => {\n expect(<Name>Cache.prototype.get).toBeDefined();\n expect(typeof <Name>Cache.prototype.get).toBe(\"function\");\n });\n\n test(\"should have 'set' method\", () => {\n expect(<Name>Cache.prototype.set).toBeDefined();\n expect(typeof <Name>Cache.prototype.set).toBe(\"function\");\n });\n\n test(\"should have 'delete' method\", () => {\n expect(<Name>Cache.prototype.delete).toBeDefined();\n expect(typeof <Name>Cache.prototype.delete).toBe(\"function\");\n });\n\n test(\"should have 'has' method\", () => {\n expect(<Name>Cache.prototype.has).toBeDefined();\n expect(typeof <Name>Cache.prototype.has).toBe(\"function\");\n });\n});\n```\n\n### 5. Lint and format\n\nRun linting and formatting on the generated files:\n\n```bash\nbunx biome check --fix src/cache/<Name>Cache.ts tests/cache/<Name>Cache.spec.ts\n```\n";var Er="---\nname: make:controller\ndescription: Generate a new controller class with route type and test file, then complete the generated code. Use when creating a new HTTP or WebSocket controller with routing, validation, and role-based access.\n---\n\n# Make Controller Class\n\nGenerate a new controller class, its route type, and test file using the `make:controller` CLI command, then complete the generated code with proper implementation.\n\n## Coding Conventions\n\n- Always explicitly show visibility on class methods and properties (`private`, `public`, `protected`)\n- Always use arrow functions when possible, but NOT for class methods (class methods use regular method syntax)\n- End type names with the `Type` suffix (e.g., `ExceptionStackFrameType`, `ServiceDataType`)\n- Start interface names with the `I` prefix (e.g., `IException`, `IService`, `IAiChat`)\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the controller class and related files:\n\n```bash\nbunx @ooneex/cli@latest make:controller --name <name> --module <module> --is-socket <true|false> --route.name <route.name> --route.path <route.path> --route.method <route.method>\n```\n\nWhere:\n- `<name>` is the controller name provided by the user\n- `--module` is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root\n- `--is-socket` determines HTTP vs WebSocket controller (defaults to `false`)\n- `--route.name` is the route name using dot notation: `<resource>.<action>` (e.g., `user.create`, `book.list`, `flashcard.delete`)\n- `--route.path` is the route path (e.g., `/api/users`)\n- `--route.method` is the HTTP method (e.g., `get`, `post`, `put`, `patch`, `delete`) \u2014 only for HTTP controllers\n\nThe command will generate (paths prefixed with `modules/<module>/` when `--module` is provided):\n- `src/controllers/<Name>Controller.ts` - The controller class file\n- `src/types/routes/<route.name>.ts` - The route type file\n- `tests/controllers/<Name>Controller.spec.ts` - The test file\n\n### 2. Read the generated files\n\nRead all three generated files to understand the scaffolded code.\n\n### 3. Complete the route type\n\nEdit `src/types/routes/<route.name>.ts` to define the route's type contract.\n\n**Add or remove `params`, `payload`, and `queries` based on context:**\n\n- **`params`** \u2014 Include only when the route path contains dynamic segments (e.g., `/api/users/:id`). Remove entirely for routes with no URL parameters (e.g., `/api/users`).\n- **`payload`** \u2014 Include only for methods that accept a request body (`post`, `put`, `patch`). Remove entirely for `get` and `delete` routes.\n- **`queries`** \u2014 Include only when the route supports query string filtering, pagination, or sorting (e.g., list/search endpoints). Remove entirely when not needed.\n- **`response`** \u2014 Always include.\n\nThe generated route type structure follows this pattern (remove unused sections):\n\n```typescript\n// Example: GET /api/users (list) \u2014 no params, no payload, has queries\nexport type <TypeName>RouteType = {\n queries: {\n\n },\n response: {\n\n },\n};\n\n// Example: POST /api/users (create) \u2014 no params, has payload, no queries\nexport type <TypeName>RouteType = {\n payload: {\n\n },\n response: {\n\n },\n};\n\n// Example: GET /api/users/:id (detail) \u2014 has params, no payload, no queries\nexport type <TypeName>RouteType = {\n params: {\n\n },\n response: {\n\n },\n};\n\n// Example: PUT /api/users/:id (update) \u2014 has params, has payload, no queries\nexport type <TypeName>RouteType = {\n params: {\n\n },\n payload: {\n\n },\n response: {\n\n },\n};\n```\n\n### 4. Complete the controller class\n\nEdit `src/controllers/<Name>Controller.ts` to complete the implementation:\n\n- Set appropriate `roles` for access control\n- Add a meaningful `description` for the route that explains what the endpoint does (e.g., `\"Create a new user account\"`, `\"List all books with pagination\"`)\n- Implement the `index` method with actual controller logic\n- Inject any required dependencies (repositories, services) via the constructor\n\n**Add or remove `params`, `payload`, and `queries` in the `@Route` decorator to match the route type (step 3):**\n\n- **`params`** \u2014 Include with `Assert()` validators only when the route has URL parameters. Remove the `params` key entirely otherwise.\n- **`payload`** \u2014 Include with `Assert({...})` only for `post`, `put`, `patch` methods. Remove the `payload` key entirely for `get` and `delete`.\n- **`queries`** \u2014 Include with `Assert({...})` only when query parameters are expected. Remove the `queries` key entirely otherwise.\n- **`response`** \u2014 Always include with `Assert({...})`.\n\n**HTTP controller** generated structure (remove `params`, `payload`, `queries` as needed \u2014 see rules above):\n\n```typescript\nimport type { ContextType } from \"@ooneex/controller\";\nimport { ERole } from \"@ooneex/role\";\nimport { Route } from \"@ooneex/routing\";\nimport { Assert } from \"@ooneex/validation\";\nimport type { <TypeName>RouteType } from \"../types/routes/<route.name>\";\n\n@Route.<method>(\"<route.path>\", {\n name: \"<route.name>\",\n version: 1,\n description: \"\",\n params: {\n // id: Assert(\"string\"),\n },\n payload: Assert({\n\n }),\n queries: Assert({\n\n }),\n response: Assert({\n\n }),\n roles: [ERole.USER],\n})\nexport class <Name>Controller {\n public async index(context: ContextType<<TypeName>RouteType>) {\n // const { id } = context.params;\n\n return context.response.json({\n\n });\n }\n}\n```\n\n**Socket controller** generated structure (remove `params`, `payload`, `queries` as needed \u2014 see rules above):\n\n```typescript\nimport type { ContextType } from \"@ooneex/socket\";\nimport { ERole } from \"@ooneex/role\";\nimport { Route } from \"@ooneex/routing\";\nimport { Assert } from \"@ooneex/validation\";\nimport type { <TypeName>RouteType } from \"../types/routes/<route.name>\";\n\n@Route.socket(\"<route.path>\", {\n name: \"<route.name>\",\n version: 1,\n description: \"\",\n params: {\n // id: Assert(\"string\"),\n },\n payload: Assert({\n\n }),\n queries: Assert({\n\n }),\n response: Assert({\n\n }),\n roles: [ERole.USER],\n})\nexport class <Name>Controller {\n public async index(context: ContextType<<TypeName>RouteType>) {\n // const { id } = context.params;\n\n return context.response.json({\n\n });\n }\n}\n```\n\n### 5. Complete the test file\n\nEdit `tests/controllers/<Name>Controller.spec.ts` to add meaningful tests beyond the scaffolded ones:\n\n- Keep the existing scaffolded tests (class name, index method)\n- Add tests relevant to the specific controller behavior\n\nThe generated test structure follows this pattern:\n\n```typescript\nimport { describe, expect, test } from \"bun:test\";\nimport { <Name>Controller } from \"@/controllers/<Name>Controller\";\n\ndescribe(\"<Name>Controller\", () => {\n test(\"should have class name ending with 'Controller'\", () => {\n expect(<Name>Controller.name.endsWith(\"Controller\")).toBe(true);\n });\n\n test(\"should have 'index' method\", () => {\n expect(<Name>Controller.prototype.index).toBeDefined();\n expect(typeof <Name>Controller.prototype.index).toBe(\"function\");\n });\n});\n```\n\n### 6. Register the controller in the module\n\nAdd the new controller to the module's `controllers` array in `src/<PascalModuleName>Module.ts` (e.g., `src/BookModule.ts` for the `book` module):\n\n```typescript\nimport type { ModuleType } from \"@ooneex/module\";\nimport { <Name>Controller } from \"./controllers/<Name>Controller\";\n\nexport const <PascalModuleName>Module: ModuleType = {\n controllers: [<Name>Controller],\n entities: [],\n permissions: [],\n middlewares: [],\n cronJobs: [],\n events: [],\n};\n```\n\nThe module file uses PascalCase naming: `<PascalModuleName>Module.ts` with export `<PascalModuleName>Module`.\n\nIf the module already has other controllers registered, append the new controller to the existing `controllers` array and add the import alongside existing imports.\n\n### 7. Lint and format\n\nRun linting and formatting on the generated files:\n\n```bash\nbunx biome check --fix src/controllers/<Name>Controller.ts src/types/routes/<route.name>.ts tests/controllers/<Name>Controller.spec.ts\n```\n\n### 8. Create the service\n\nAfter the controller is created, generate a service class for the controller's business logic using the `make:service` skill:\n\n```\n/make:service --name <Name>\n```\n\nWhere `<Name>` matches the controller name (e.g., if the controller is `CreateUserController`, the service is `CreateUserService`).\n\n### 9. Create the pubsub event\n\nAfter the service is created, generate a pubsub event class for the controller's domain events using the `make:pubsub` skill:\n\n```\n/make:pubsub --name <Name> --channel <resource>.<action>\n```\n\nWhere:\n- `<Name>` matches the controller name (e.g., if the controller is `CreateUserController`, the event is `CreateUserEvent`)\n- `<resource>.<action>` follows the same dot notation as the route name (e.g., `user.create`, `book.delete`)\n\nOnce the event is created:\n- Inject the **service** into the **event** via the constructor, and call the service's `execute` method from the event's `handler` method.\n- Inject the **event** into the **controller** via the constructor, and publish the event from the controller's `index` method.\n";var Ar="---\nname: make:cron\ndescription: Generate a new cron job class with its test file, then complete the generated code. Use when creating a new scheduled task that extends the Cron base class from @ooneex/cron.\n---\n\n# Make Cron Class\n\nGenerate a new cron class and its test file using the `make:cron` CLI command, then complete the generated code with proper implementation.\n\n## Coding Conventions\n\n- Always explicitly show visibility on class methods and properties (`private`, `public`, `protected`)\n- Always use arrow functions when possible, but NOT for class methods (class methods use regular method syntax)\n- End type names with the `Type` suffix (e.g., `ExceptionStackFrameType`, `ServiceDataType`)\n- Start interface names with the `I` prefix (e.g., `IException`, `IService`, `IAiChat`)\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the cron class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:cron --name <name> --module <module>\n```\n\nWhere `<name>` is the name provided by the user. The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The command will generate:\n- `src/cron/<Name>Cron.ts` - The cron class file (or `modules/<module>/src/cron/<Name>Cron.ts` with `--module`)\n- `tests/cron/<Name>Cron.spec.ts` - The test file (or `modules/<module>/tests/cron/<Name>Cron.spec.ts` with `--module`)\n\n### 2. Read the generated files\n\nRead both generated files to understand the scaffolded code.\n\n### 3. Complete the cron class\n\nEdit `src/cron/<Name>Cron.ts` to complete the implementation:\n\n- Set the appropriate cron schedule in `getTime()` (e.g., `\"every 5 minutes\"`, `\"every 1 hours\"`, `\"every 30 seconds\"`)\n- Set the timezone in `getTimeZone()` if needed, or keep `null` for server timezone\n- Implement the `handler()` method with the actual cron job logic\n- Inject any required dependencies via the constructor\n\nThe generated class structure follows this pattern:\n\n```typescript\nimport type { TimeZoneType } from \"@ooneex/country\";\nimport type { CronTimeType } from \"@ooneex/cron\";\nimport { Cron, decorator } from \"@ooneex/cron\";\n\n@decorator.cron()\nexport class <Name>Cron extends Cron {\n public getTime(): CronTimeType {\n // Examples: \"every 5 minutes\", \"every 1 hours\", \"every 30 seconds\"\n return \"every 1 hours\";\n }\n\n public getTimeZone(): TimeZoneType | null {\n // Return null to use server timezone, or specify a timezone like \"Europe/Paris\"\n return null;\n }\n\n public async handler(): Promise<void> {\n // Implement your cron handler logic here\n // console.log(\"<Name>Cron handler executed\");\n }\n}\n```\n\n### 4. Complete the test file\n\nEdit `tests/cron/<Name>Cron.spec.ts` to add meaningful tests beyond the scaffolded ones:\n\n- Keep the existing scaffolded tests (class name, getTime, getTimeZone, handler methods)\n- Add tests relevant to the specific cron class behavior\n\nThe generated test structure follows this pattern:\n\n```typescript\nimport { describe, expect, test } from \"bun:test\";\nimport { <Name>Cron } from \"@/cron/<Name>Cron\";\n\ndescribe(\"<Name>Cron\", () => {\n test(\"should have class name ending with 'Cron'\", () => {\n expect(<Name>Cron.name.endsWith(\"Cron\")).toBe(true);\n });\n\n test(\"should have 'getTime' method\", () => {\n expect(<Name>Cron.prototype.getTime).toBeDefined();\n expect(typeof <Name>Cron.prototype.getTime).toBe(\"function\");\n });\n\n test(\"should have 'getTimeZone' method\", () => {\n expect(<Name>Cron.prototype.getTimeZone).toBeDefined();\n expect(typeof <Name>Cron.prototype.getTimeZone).toBe(\"function\");\n });\n\n test(\"should have 'handler' method\", () => {\n expect(<Name>Cron.prototype.handler).toBeDefined();\n expect(typeof <Name>Cron.prototype.handler).toBe(\"function\");\n });\n});\n```\n\n### 5. Register the cron job in the module\n\nAdd the new cron job to the module's `cronJobs` array in `src/<PascalModuleName>Module.ts` (e.g., `src/BookModule.ts` for the `book` module):\n\n```typescript\nimport type { ModuleType } from \"@ooneex/module\";\nimport { <Name>Cron } from \"./cron/<Name>Cron\";\n\nexport const <PascalModuleName>Module: ModuleType = {\n controllers: [],\n entities: [],\n permissions: [],\n middlewares: [],\n cronJobs: [<Name>Cron],\n events: [],\n};\n```\n\nThe module file uses PascalCase naming: `<PascalModuleName>Module.ts` with export `<PascalModuleName>Module`.\n\nIf the module already has other cron jobs registered, append the new cron job to the existing `cronJobs` array and add the import alongside existing imports.\n\n### 6. Lint and format\n\nRun linting and formatting on the generated files:\n\n```bash\nbunx biome check --fix src/cron/<Name>Cron.ts tests/cron/<Name>Cron.spec.ts\n```\n";var vr="---\nname: make:database\ndescription: Generate a new database class with its test file, then complete the generated code. Use when creating a new database adapter that extends TypeormDatabase from @ooneex/database.\n---\n\n# Make Database Class\n\nGenerate a new database class and its test file using the `make:database` CLI command, then complete the generated code with proper implementation.\n\n## Coding Conventions\n\n- Always explicitly show visibility on class methods and properties (`private`, `public`, `protected`)\n- Always use arrow functions when possible, but NOT for class methods (class methods use regular method syntax)\n- End type names with the `Type` suffix (e.g., `ExceptionStackFrameType`, `ServiceDataType`)\n- Start interface names with the `I` prefix (e.g., `IException`, `IService`, `IAiChat`)\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the database class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:database --name <name> --module <module>\n```\n\nWhere `<name>` is the name provided by the user. The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The command will generate:\n- `src/databases/<Name>Database.ts` - The database class file (or `modules/<module>/src/databases/<Name>Database.ts` with `--module`)\n- `tests/databases/<Name>Database.spec.ts` - The test file (or `modules/<module>/tests/databases/<Name>Database.spec.ts` with `--module`)\n\n### 2. Read the generated files\n\nRead both generated files to understand the scaffolded code.\n\n### 3. Complete the database class\n\nEdit `src/databases/<Name>Database.ts` to complete the implementation:\n\n- Add entity imports and register them in the `entities` array\n- Adjust the database path if needed (default is `\"var/db\"`)\n- Configure DataSource options as appropriate (type, synchronize, etc.)\n- Inject any required dependencies via the constructor\n\nThe generated class structure follows this pattern:\n\n```typescript\nimport { DataSource } from \"typeorm\";\nimport { TypeormDatabase, DatabaseException, decorator } from \"@ooneex/database\";\n\n@decorator.database()\nexport class <Name>Database extends TypeormDatabase {\n public getSource(database?: string): DataSource {\n database = database || \"var/db\";\n\n this.source = new DataSource({\n synchronize: false,\n entities: [\n // TODO: Load your entities here\n ],\n enableWAL: true,\n busyErrorRetry: 2000,\n busyTimeout: 30_000,\n database,\n type: \"sqlite\",\n });\n\n return this.source;\n }\n}\n```\n\n### 4. Complete the test file\n\nEdit `tests/databases/<Name>Database.spec.ts` to add meaningful tests beyond the scaffolded ones:\n\n- Keep the existing scaffolded tests (class name, getSource method)\n- Add tests relevant to the specific database class behavior\n\nThe generated test structure follows this pattern:\n\n```typescript\nimport { describe, expect, test } from \"bun:test\";\nimport { <Name>Database } from \"@/databases/<Name>Database\";\n\ndescribe(\"<Name>Database\", () => {\n test(\"should have class name ending with 'Database'\", () => {\n expect(<Name>Database.name.endsWith(\"Database\")).toBe(true);\n });\n\n test(\"should have 'getSource' method\", () => {\n expect(<Name>Database.prototype.getSource).toBeDefined();\n expect(typeof <Name>Database.prototype.getSource).toBe(\"function\");\n });\n});\n```\n\n### 5. Lint and format\n\nRun linting and formatting on the generated files:\n\n```bash\nbunx biome check --fix src/databases/<Name>Database.ts tests/databases/<Name>Database.spec.ts\n```\n";var Nr="---\nname: make:entity\ndescription: Generate a new TypeORM entity class with its test file, then complete the generated code. Use when creating a new database entity with columns, relations, and table mapping.\n---\n\n# Make Entity Class\n\nGenerate a new entity class and its test file using the `make:entity` CLI command, then complete the generated code with proper implementation.\n\n## Coding Conventions\n\n- Always explicitly show visibility on class methods and properties (`private`, `public`, `protected`)\n- Always use arrow functions when possible, but NOT for class methods (class methods use regular method syntax)\n- End type names with the `Type` suffix (e.g., `ExceptionStackFrameType`, `ServiceDataType`)\n- Start interface names with the `I` prefix (e.g., `IException`, `IService`, `IAiChat`)\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the entity class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:entity --name <name> --module <module> --table-name <table_name>\n```\n\nWhere `<name>` is the name provided by the user. The `--table-name` option is optional \u2014 if omitted, it defaults to the snake_case pluralized form of the name (e.g., `UserProfile` becomes `user_profiles`). The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The command will generate:\n- `src/entities/<Name>Entity.ts` - The entity class file (or `modules/<module>/src/entities/<Name>Entity.ts` with `--module`)\n- `tests/entities/<Name>Entity.spec.ts` - The test file (or `modules/<module>/tests/entities/<Name>Entity.spec.ts` with `--module`)\n\n### 2. Read the generated files\n\nRead both generated files to understand the scaffolded code.\n\n### 3. Complete the entity class\n\nEdit `src/entities/<Name>Entity.ts` to complete the implementation:\n\n- Add entity-specific columns with appropriate TypeORM decorators (`@Column`)\n- Add relations if needed (`@ManyToOne`, `@OneToMany`, `@ManyToMany`, etc.)\n- Remove any scaffolded columns that are not relevant to the entity\n- Adjust column types, lengths, and constraints as needed\n\nThe generated class structure follows this pattern:\n\n```typescript\nimport type { LocaleType } from \"@ooneex/translation\";\nimport { random } from \"@ooneex/utils\";\nimport { Column, CreateDateColumn, DeleteDateColumn, PrimaryColumn, UpdateDateColumn } from \"typeorm\";\n\n@Entity({\n name: \"<table_name>\",\n})\nexport class <Name>Entity extends BaseEntity {\n @PrimaryColumn({ name: \"id\", type: \"varchar\", length: 25 })\n id: string = random.nanoid(25);\n\n @Column({\n name: \"is_locked\",\n type: \"boolean\",\n default: false,\n nullable: true,\n })\n isLocked?: boolean;\n\n @Column({ name: \"locked_at\", type: \"timestamptz\", nullable: true })\n lockedAt?: Date;\n\n @Column({\n name: \"is_blocked\",\n type: \"boolean\",\n default: false,\n nullable: true,\n })\n isBlocked?: boolean;\n\n @Column({ name: \"blocked_at\", type: \"timestamptz\", nullable: true })\n blockedAt?: Date;\n\n @Column({ name: \"block_reason\", type: \"text\", nullable: true })\n blockReason?: string;\n\n @Column({ name: \"is_public\", type: \"boolean\", default: true, nullable: true })\n isPublic?: boolean;\n\n @Column({ name: \"lang\", type: \"varchar\", length: 10, nullable: true })\n lang?: LocaleType;\n\n @CreateDateColumn({ name: \"created_at\" })\n createdAt?: Date;\n\n @UpdateDateColumn({ name: \"updated_at\" })\n updatedAt?: Date;\n\n @DeleteDateColumn({ name: \"deleted_at\" })\n deletedAt?: Date;\n}\n```\n\n### 4. Complete the test file\n\nEdit `tests/entities/<Name>Entity.spec.ts` to add meaningful tests beyond the scaffolded ones:\n\n- Keep the existing scaffolded tests (class name, id, default columns)\n- Add tests for any new entity-specific columns and relations\n- Update tests if scaffolded columns were removed\n\nThe generated test structure follows this pattern:\n\n```typescript\nimport { describe, expect, test } from \"bun:test\";\nimport { <Name>Entity } from \"@/entities/<Name>Entity\";\n\ndescribe(\"<Name>Entity\", () => {\n test(\"should have class name ending with 'Entity'\", () => {\n expect(<Name>Entity.name.endsWith(\"Entity\")).toBe(true);\n });\n\n test(\"should have 'id' property with default nanoid\", () => {\n const entity = new <Name>Entity();\n expect(entity.id).toBeDefined();\n expect(typeof entity.id).toBe(\"string\");\n expect(entity.id.length).toBe(25);\n });\n\n test(\"should have 'isLocked' property\", () => {\n const entity = new <Name>Entity();\n expect(\"isLocked\" in entity).toBe(true);\n });\n\n // ... additional property tests\n});\n```\n\n### 5. Register the entity in the module\n\nAdd the new entity to the module's `entities` array in `src/<PascalModuleName>Module.ts` (e.g., `src/BookModule.ts` for the `book` module):\n\n```typescript\nimport type { ModuleType } from \"@ooneex/module\";\nimport { <Name>Entity } from \"./entities/<Name>Entity\";\n\nexport const <PascalModuleName>Module: ModuleType = {\n controllers: [],\n entities: [<Name>Entity],\n permissions: [],\n middlewares: [],\n cronJobs: [],\n events: [],\n};\n```\n\nThe module file uses PascalCase naming: `<PascalModuleName>Module.ts` with export `<PascalModuleName>Module`.\n\nIf the module already has other entities registered, append the new entity to the existing `entities` array and add the import alongside existing imports.\n\n### 6. Create a migration for the entity\n\nAfter creating or updating an entity, generate a migration to apply the corresponding schema changes to the database.\n\nRun the generator:\n\n```bash\nbunx @ooneex/cli@latest make:migration\n```\n\nThen read the generated migration file in `src/migrations/` and complete it:\n\n- In the `up` method, write the SQL to create the table (or alter it if updating an existing entity). Include all columns, types, constraints, defaults, and indexes matching the entity definition.\n- In the `down` method, write the reverse SQL to undo the changes (e.g., `DROP TABLE` or `ALTER TABLE DROP COLUMN`).\n- If the migration depends on another migration (e.g., a foreign key referencing another table), add that migration class to the `getDependencies()` return array.\n\nExample `up` method for a new entity:\n\n```typescript\npublic async up(tx: TransactionSQL): Promise<void> {\n await tx`\n CREATE TABLE IF NOT EXISTS <table_name> (\n id VARCHAR(25) PRIMARY KEY,\n is_locked BOOLEAN DEFAULT false,\n locked_at TIMESTAMPTZ,\n is_blocked BOOLEAN DEFAULT false,\n blocked_at TIMESTAMPTZ,\n block_reason TEXT,\n is_public BOOLEAN DEFAULT true,\n lang VARCHAR(10),\n created_at TIMESTAMPTZ DEFAULT NOW(),\n updated_at TIMESTAMPTZ DEFAULT NOW(),\n deleted_at TIMESTAMPTZ\n )\n `;\n}\n```\n\n### 7. Create a repository for the entity\n\nAfter creating the entity, generate a repository to handle database operations for it.\n\nRun the generator:\n\n```bash\nbunx @ooneex/cli@latest make:repository --name <name>\n```\n\nWhere `<name>` is the same name used for the entity. The command will generate:\n- `src/repositories/<Name>Repository.ts` - The repository class\n- `tests/repositories/<Name>Repository.spec.ts` - The test file\n\nThen read the generated files and complete the repository implementation:\n\n- Adjust search fields in the `find()` method to match the entity's searchable columns\n- Customize relations loading in `findOne`/`findOneBy` if the entity has relations\n- Add any domain-specific methods relevant to the entity\n- Remove methods that don't apply to the entity\n- Update tests to match the final repository methods\n\n### 8. Lint and format\n\nRun linting and formatting on all generated files:\n\n```bash\nbunx biome check --fix src/entities/<Name>Entity.ts tests/entities/<Name>Entity.spec.ts src/repositories/<Name>Repository.ts tests/repositories/<Name>Repository.spec.ts src/migrations/\n```\n";var Tr="---\nname: make:logger\ndescription: Generate a new logger class with its test file, then complete the generated code. Use when creating a new logger that implements the ILogger interface from @ooneex/logger.\n---\n\n# Make Logger Class\n\nGenerate a new logger class and its test file using the `make:logger` CLI command, then complete the generated code with proper implementation.\n\n## Coding Conventions\n\n- Always explicitly show visibility on class methods and properties (`private`, `public`, `protected`)\n- Always use arrow functions when possible, but NOT for class methods (class methods use regular method syntax)\n- End type names with the `Type` suffix (e.g., `ExceptionStackFrameType`, `ServiceDataType`)\n- Start interface names with the `I` prefix (e.g., `IException`, `IService`, `IAiChat`)\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the logger class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:logger --name <name> --module <module>\n```\n\nWhere `<name>` is the name provided by the user. The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The command will generate:\n- `src/loggers/<Name>Logger.ts` - The logger class file (or `modules/<module>/src/loggers/<Name>Logger.ts` with `--module`)\n- `tests/loggers/<Name>Logger.spec.ts` - The test file (or `modules/<module>/tests/loggers/<Name>Logger.spec.ts` with `--module`)\n\n### 2. Read the generated files\n\nRead both generated files to understand the scaffolded code.\n\n### 3. Complete the logger class\n\nEdit `src/loggers/<Name>Logger.ts` to complete the implementation:\n\n- Implement the `init()` method to set up the logger (e.g., open file handles, configure transports)\n- Implement `log`, `debug`, `info`, `success`, `warn`, and `error` methods with actual logging logic\n- Inject any required dependencies via the constructor\n\nThe generated class structure follows this pattern:\n\n```typescript\nimport type { IException } from \"@ooneex/exception\";\nimport type { ILogger } from \"@ooneex/logger\";\nimport type { ScalarType } from \"@ooneex/types\";\nimport { decorator } from \"@ooneex/logger\";\n\n@decorator.logger()\nexport class <Name>Logger implements ILogger {\n public async init(): Promise<void> {\n // Initialize your logger here\n }\n\n public log(message: string, data?: Record<string, ScalarType>): void {\n // Handle general logging\n }\n\n public debug(message: string, data?: Record<string, ScalarType>): void {\n // Handle debug logging\n }\n\n public info(message: string, data?: Record<string, ScalarType>): void {\n // Handle info logging\n }\n\n public success(message: string, data?: Record<string, ScalarType>): void {\n // Handle success logging\n }\n\n public warn(message: string, data?: Record<string, ScalarType>): void {\n // Handle warning logging\n }\n\n public error(message: string | IException, data?: Record<string, ScalarType>): void {\n // Handle error logging\n }\n}\n```\n\n### 4. Complete the test file\n\nEdit `tests/loggers/<Name>Logger.spec.ts` to add meaningful tests beyond the scaffolded ones:\n\n- Keep the existing scaffolded tests (class name, init, log, debug, info, success, warn, error methods)\n- Add tests relevant to the specific logger class behavior\n\nThe generated test structure follows this pattern:\n\n```typescript\nimport { describe, expect, test } from \"bun:test\";\nimport { <Name>Logger } from \"@/loggers/<Name>Logger\";\n\ndescribe(\"<Name>Logger\", () => {\n test(\"should have class name ending with 'Logger'\", () => {\n expect(<Name>Logger.name.endsWith(\"Logger\")).toBe(true);\n });\n\n test(\"should have 'init' method\", () => {\n expect(<Name>Logger.prototype.init).toBeDefined();\n expect(typeof <Name>Logger.prototype.init).toBe(\"function\");\n });\n\n test(\"should have 'log' method\", () => {\n expect(<Name>Logger.prototype.log).toBeDefined();\n expect(typeof <Name>Logger.prototype.log).toBe(\"function\");\n });\n\n test(\"should have 'debug' method\", () => {\n expect(<Name>Logger.prototype.debug).toBeDefined();\n expect(typeof <Name>Logger.prototype.debug).toBe(\"function\");\n });\n\n test(\"should have 'info' method\", () => {\n expect(<Name>Logger.prototype.info).toBeDefined();\n expect(typeof <Name>Logger.prototype.info).toBe(\"function\");\n });\n\n test(\"should have 'success' method\", () => {\n expect(<Name>Logger.prototype.success).toBeDefined();\n expect(typeof <Name>Logger.prototype.success).toBe(\"function\");\n });\n\n test(\"should have 'warn' method\", () => {\n expect(<Name>Logger.prototype.warn).toBeDefined();\n expect(typeof <Name>Logger.prototype.warn).toBe(\"function\");\n });\n\n test(\"should have 'error' method\", () => {\n expect(<Name>Logger.prototype.error).toBeDefined();\n expect(typeof <Name>Logger.prototype.error).toBe(\"function\");\n });\n});\n```\n\n### 5. Lint and format\n\nRun linting and formatting on the generated files:\n\n```bash\nbunx biome check --fix src/loggers/<Name>Logger.ts tests/loggers/<Name>Logger.spec.ts\n```\n";var Sr="---\nname: make:mailer\ndescription: Generate a new mailer class with its template and test files, then complete the generated code. Use when creating a new email sender with JSX template using @ooneex/mailer.\n---\n\n# Make Mailer Class\n\nGenerate a new mailer class, its JSX template, and test files using the `make:mailer` CLI command, then complete the generated code with proper implementation.\n\n## Coding Conventions\n\n- Always explicitly show visibility on class methods and properties (`private`, `public`, `protected`)\n- Always use arrow functions when possible, but NOT for class methods (class methods use regular method syntax)\n- End type names with the `Type` suffix (e.g., `ExceptionStackFrameType`, `ServiceDataType`)\n- Start interface names with the `I` prefix (e.g., `IException`, `IService`, `IAiChat`)\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the mailer class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:mailer --name <name> --module <module>\n```\n\nWhere `<name>` is the name provided by the user. The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The command will generate (paths prefixed with `modules/<module>/` when `--module` is provided):\n- `src/mailers/<Name>Mailer.ts` - The mailer class file\n- `src/mailers/<Name>MailerTemplate.tsx` - The JSX email template\n- `tests/mailers/<Name>Mailer.spec.ts` - The mailer test file\n- `tests/mailers/<Name>MailerTemplate.spec.ts` - The template test file\n\n### 2. Read the generated files\n\nRead all four generated files to understand the scaffolded code.\n\n### 3. Complete the mailer class\n\nEdit `src/mailers/<Name>Mailer.ts` to complete the implementation:\n\n- Adjust the `send` method config type if additional parameters are needed\n- Add any pre-send logic (validation, data transformation, etc.)\n\nThe generated class structure follows this pattern:\n\n```typescript\nimport { inject } from \"@ooneex/container\";\nimport type { IMailer } from \"@ooneex/mailer\";\nimport { type <Name>MailerPropsType, <Name>MailerTemplate } from \"./<Name>MailerTemplate\";\n\nexport class <Name>Mailer implements IMailer {\n constructor(\n @inject(\"mailer\")\n private readonly mailer: IMailer,\n ) {}\n\n public send = async (config: {\n to: string[];\n subject: string;\n from?: { name: string; address: string };\n data?: <Name>MailerPropsType;\n }): Promise<void> => {\n const { data, ...rest } = config;\n\n await this.mailer.send({\n ...rest,\n content: <Name>MailerTemplate(data),\n });\n };\n}\n```\n\n### 4. Complete the mailer template\n\nEdit `src/mailers/<Name>MailerTemplate.tsx` to complete the implementation:\n\n- Update `<Name>MailerPropsType` with the actual props needed for the email\n- Build the email body using `MailerLayout` components (Header, Body, Footer)\n- Add email content, styling, and dynamic data rendering\n\nThe generated template structure follows this pattern:\n\n```tsx\nimport { MailerLayout } from \"@ooneex/mailer\";\n\nexport type <Name>MailerPropsType = {\n link: string;\n};\n\nexport const <Name>MailerTemplate = (props?: <Name>MailerPropsType) => (\n <MailerLayout>\n <MailerLayout.Header />\n <MailerLayout.Body>\n <a href={props?.link}>Login</a>\n </MailerLayout.Body>\n <MailerLayout.Footer />\n </MailerLayout>\n);\n```\n\n### 5. Complete the test files\n\nEdit `tests/mailers/<Name>Mailer.spec.ts` and `tests/mailers/<Name>MailerTemplate.spec.ts` to add meaningful tests beyond the scaffolded ones.\n\n### 6. Lint and format\n\nRun linting and formatting on the generated files:\n\n```bash\nbunx biome check --fix src/mailers/<Name>Mailer.ts src/mailers/<Name>MailerTemplate.tsx tests/mailers/<Name>Mailer.spec.ts tests/mailers/<Name>MailerTemplate.spec.ts\n```\n";var Cr="---\nname: make:middleware\ndescription: Generate a new middleware class with its test file, then complete the generated code. Use when creating a new HTTP or WebSocket middleware that implements IMiddleware from @ooneex/middleware.\n---\n\n# Make Middleware Class\n\nGenerate a new middleware class and its test file using the `make:middleware` CLI command, then complete the generated code with proper implementation.\n\n## Coding Conventions\n\n- Always explicitly show visibility on class methods and properties (`private`, `public`, `protected`)\n- Always use arrow functions when possible, but NOT for class methods (class methods use regular method syntax)\n- End type names with the `Type` suffix (e.g., `ExceptionStackFrameType`, `ServiceDataType`)\n- Start interface names with the `I` prefix (e.g., `IException`, `IService`, `IAiChat`)\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the middleware class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:middleware --name <name> --module <module> --is-socket <true|false>\n```\n\nWhere `<name>` is the name provided by the user. The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The `--is-socket` option determines whether to generate an HTTP middleware or a WebSocket middleware (defaults to `false` if omitted). The command will generate:\n- `src/middlewares/<Name>Middleware.ts` - The middleware class file (or `modules/<module>/src/middlewares/<Name>Middleware.ts` with `--module`)\n- `tests/middlewares/<Name>Middleware.spec.ts` - The test file (or `modules/<module>/tests/middlewares/<Name>Middleware.spec.ts` with `--module`)\n\n### 2. Read the generated files\n\nRead both generated files to understand the scaffolded code.\n\n### 3. Complete the middleware class\n\nEdit `src/middlewares/<Name>Middleware.ts` to complete the implementation:\n\n- Implement the `handler` method with actual middleware logic\n- Add request/response transformations, authentication checks, logging, etc.\n- Inject any required dependencies via the constructor\n\n**HTTP middleware** generated structure:\n\n```typescript\nimport type { ContextType } from \"@ooneex/controller\";\nimport { decorator, type IMiddleware } from \"@ooneex/middleware\";\n\n@decorator.middleware()\nexport class <Name>Middleware implements IMiddleware {\n public async handler(context: ContextType): Promise<ContextType> {\n // Example: Add custom header\n // context.response.header(\"X-Custom-Header\", \"value\");\n\n return context\n }\n}\n```\n\n**Socket middleware** generated structure:\n\n```typescript\nimport type { ContextType } from \"@ooneex/socket\";\nimport { decorator, type IMiddleware } from \"@ooneex/middleware\";\n\n@decorator.middleware()\nexport class <Name>Middleware implements IMiddleware {\n public async handler(context: ContextType): Promise<ContextType> {\n // Example: Add custom header\n // context.response.header(\"X-Custom-Header\", \"value\");\n\n return context\n }\n}\n```\n\n### 4. Complete the test file\n\nEdit `tests/middlewares/<Name>Middleware.spec.ts` to add meaningful tests beyond the scaffolded ones:\n\n- Keep the existing scaffolded tests (class name, handler method)\n- Add tests relevant to the specific middleware behavior\n\nThe generated test structure follows this pattern:\n\n```typescript\nimport { describe, expect, test } from \"bun:test\";\nimport { <Name>Middleware } from \"@/middlewares/<Name>Middleware\";\n\ndescribe(\"<Name>Middleware\", () => {\n test(\"should have class name ending with 'Middleware'\", () => {\n expect(<Name>Middleware.name.endsWith(\"Middleware\")).toBe(true);\n });\n\n test(\"should have 'handler' method\", () => {\n expect(<Name>Middleware.prototype.handler).toBeDefined();\n expect(typeof <Name>Middleware.prototype.handler).toBe(\"function\");\n });\n});\n```\n\n### 5. Register the middleware in the module\n\nAdd the new middleware to the module's `middlewares` array in `src/<PascalModuleName>Module.ts` (e.g., `src/BookModule.ts` for the `book` module):\n\n```typescript\nimport type { ModuleType } from \"@ooneex/module\";\nimport { <Name>Middleware } from \"./middlewares/<Name>Middleware\";\n\nexport const <PascalModuleName>Module: ModuleType = {\n controllers: [],\n entities: [],\n permissions: [],\n middlewares: [<Name>Middleware],\n cronJobs: [],\n events: [],\n};\n```\n\nThe module file uses PascalCase naming: `<PascalModuleName>Module.ts` with export `<PascalModuleName>Module`.\n\nIf the module already has other middlewares registered, append the new middleware to the existing `middlewares` array and add the import alongside existing imports.\n\n### 6. Lint and format\n\nRun linting and formatting on the generated files:\n\n```bash\nbunx biome check --fix src/middlewares/<Name>Middleware.ts tests/middlewares/<Name>Middleware.spec.ts\n```\n";var Mr="---\nname: make:migration\ndescription: Generate a new database migration file, then complete the generated code. Use when creating a new database migration for schema changes using @ooneex/migrations.\n---\n\n# Make Migration\n\nGenerate a new migration file using the `make:migration` CLI command, then complete the generated code with proper implementation.\n\n## Coding Conventions\n\n- Always explicitly show visibility on class methods and properties (`private`, `public`, `protected`)\n- Always use arrow functions when possible, but NOT for class methods (class methods use regular method syntax)\n- End type names with the `Type` suffix (e.g., `ExceptionStackFrameType`, `ServiceDataType`)\n- Start interface names with the `I` prefix (e.g., `IException`, `IService`, `IAiChat`)\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the migration file:\n\n```bash\nbunx @ooneex/cli@latest make:migration --module <module>\n```\n\nThe `--module` option is optional \u2014 if provided, the migration file is generated under `modules/<module>/src/migrations/` instead of `src/migrations/`. The command will:\n- Generate a timestamped migration file in `src/migrations/` (or `modules/<module>/src/migrations/` with `--module`)\n- Add a `migration:up` script to `package.json` if not already present\n\n### 2. Read the generated file\n\nRead the generated migration file in `src/migrations/` to understand the scaffolded code.\n\n### 3. Complete the migration\n\nEdit the generated migration file to implement:\n\n- The `up` method with the schema changes (create tables, add columns, create indexes, etc.)\n- The `down` method with the reverse operations to undo the migration\n\n### 4. Lint and format\n\nRun linting and formatting on the generated file:\n\n```bash\nbunx biome check --fix src/migrations/\n```\n";var Rr="---\nname: make:permission\ndescription: Generate a new permission class with its test file, then complete the generated code. Use when creating a new permission that extends Permission from @ooneex/permission.\n---\n\n# Make Permission Class\n\nGenerate a new permission class and its test file using the `make:permission` CLI command, then complete the generated code with proper implementation.\n\n## Coding Conventions\n\n- Always explicitly show visibility on class methods and properties (`private`, `public`, `protected`)\n- Always use arrow functions when possible, but NOT for class methods (class methods use regular method syntax)\n- End type names with the `Type` suffix (e.g., `ExceptionStackFrameType`, `ServiceDataType`)\n- Start interface names with the `I` prefix (e.g., `IException`, `IService`, `IAiChat`)\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the permission class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:permission --name <name> --module <module>\n```\n\nWhere `<name>` is the name provided by the user. The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The command will generate:\n- `src/permissions/<Name>Permission.ts` - The permission class file (or `modules/<module>/src/permissions/<Name>Permission.ts` with `--module`)\n- `tests/permissions/<Name>Permission.spec.ts` - The test file (or `modules/<module>/tests/permissions/<Name>Permission.spec.ts` with `--module`)\n\n### 2. Read the generated files\n\nRead both generated files to understand the scaffolded code.\n\n### 3. Complete the permission class\n\nEdit `src/permissions/<Name>Permission.ts` to complete the implementation:\n\n- Implement the `allow()` method with permission rules using `this.ability.can()`\n- Implement the `setUserPermissions()` method with role-based permission logic\n- Define which actions (read, create, update, delete, manage) are allowed on which entities\n\nThe generated class structure follows this pattern:\n\n```typescript\nimport { decorator, Permission } from \"@ooneex/permission\";\nimport type { IUser } from \"@ooneex/user\";\n\n@decorator.permission()\nexport class <Name>Permission extends Permission {\n public allow(): this {\n // Example: Add permissions using this.ability.can()\n // this.ability.can(\"read\", \"YourEntity\");\n // this.ability.can([\"read\", \"update\"], \"YourEntity\", { userId: user.id });\n\n return this;\n }\n\n public setUserPermissions(user: IUser | null): this {\n if (!user) {\n return this;\n }\n\n // Example: Grant full access to admins\n // const { roles } = user;\n // if (roles.includes(ERole.ADMIN)) {\n // this.ability.can(\"manage\", \"all\");\n // return this;\n // }\n\n // Example: Grant specific permissions based on roles\n // for (const role of roles) {\n // if (role === ERole.USER) {\n // this.ability.can([\"read\", \"update\"], \"YourEntity\", { userId: user.id });\n // }\n //\n // if (role === ERole.GUEST) {\n // this.ability.can(\"read\", \"YourEntity\", { public: true });\n // }\n // }\n\n return this;\n }\n}\n```\n\n### 4. Complete the test file\n\nEdit `tests/permissions/<Name>Permission.spec.ts` to add meaningful tests beyond the scaffolded ones:\n\n- Keep the existing scaffolded tests (class name, extends Permission, allow, setUserPermissions methods)\n- Add tests relevant to the specific permission rules\n\nThe generated test structure follows this pattern:\n\n```typescript\nimport { describe, expect, test } from \"bun:test\";\nimport { Permission } from \"@ooneex/permission\";\nimport { <Name>Permission } from \"@/permissions/<Name>Permission\";\n\ndescribe(\"<Name>Permission\", () => {\n test(\"should have class name ending with 'Permission'\", () => {\n expect(<Name>Permission.name.endsWith(\"Permission\")).toBe(true);\n });\n\n test(\"should extend Permission\", () => {\n const permission = new <Name>Permission();\n expect(permission).toBeInstanceOf(Permission);\n });\n\n test(\"should have 'allow' method\", () => {\n expect(<Name>Permission.prototype.allow).toBeDefined();\n expect(typeof <Name>Permission.prototype.allow).toBe(\"function\");\n });\n\n test(\"should have 'setUserPermissions' method\", () => {\n expect(<Name>Permission.prototype.setUserPermissions).toBeDefined();\n expect(typeof <Name>Permission.prototype.setUserPermissions).toBe(\"function\");\n });\n});\n```\n\n### 5. Register the permission in the module\n\nAdd the new permission to the module's `permissions` array in `src/<PascalModuleName>Module.ts` (e.g., `src/BookModule.ts` for the `book` module):\n\n```typescript\nimport type { ModuleType } from \"@ooneex/module\";\nimport { <Name>Permission } from \"./permissions/<Name>Permission\";\n\nexport const <PascalModuleName>Module: ModuleType = {\n controllers: [],\n entities: [],\n permissions: [<Name>Permission],\n middlewares: [],\n cronJobs: [],\n events: [],\n};\n```\n\nThe module file uses PascalCase naming: `<PascalModuleName>Module.ts` with export `<PascalModuleName>Module`.\n\nIf the module already has other permissions registered, append the new permission to the existing `permissions` array and add the import alongside existing imports.\n\n### 6. Lint and format\n\nRun linting and formatting on the generated files:\n\n```bash\nbunx biome check --fix src/permissions/<Name>Permission.ts tests/permissions/<Name>Permission.spec.ts\n```\n";var _r="---\nname: make:pubsub\ndescription: Generate a new PubSub event class with its test file, then complete the generated code. Use when creating a new publish/subscribe event that extends PubSub from @ooneex/pub-sub.\n---\n\n# Make PubSub Event Class\n\nGenerate a new PubSub event class and its test file using the `make:pubsub` CLI command, then complete the generated code with proper implementation.\n\n## Coding Conventions\n\n- Always explicitly show visibility on class methods and properties (`private`, `public`, `protected`)\n- Always use arrow functions when possible, but NOT for class methods (class methods use regular method syntax)\n- End type names with the `Type` suffix (e.g., `ExceptionStackFrameType`, `ServiceDataType`)\n- Start interface names with the `I` prefix (e.g., `IException`, `IService`, `IAiChat`)\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the PubSub event class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:pubsub --name <name> --module <module> --channel <channel>\n```\n\nWhere `<name>` is the name provided by the user. The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The `--channel` option is optional \u2014 if omitted, it defaults to the kebab-case form of the name (e.g., `UserCreated` becomes `user-created`). The command will generate:\n- `src/events/<Name>Event.ts` - The event class file (or `modules/<module>/src/events/<Name>Event.ts` with `--module`)\n- `tests/events/<Name>Event.spec.ts` - The test file (or `modules/<module>/tests/events/<Name>Event.spec.ts` with `--module`)\n\n### 2. Read the generated files\n\nRead both generated files to understand the scaffolded code.\n\n### 3. Complete the PubSub event class\n\nEdit `src/events/<Name>Event.ts` to complete the implementation:\n\n- Define a proper data type instead of `Record<string, ScalarType>` for the event payload\n- Implement the `handler()` method with actual event handling logic\n- Set the appropriate channel name in `getChannel()`\n\nThe generated class structure follows this pattern:\n\n```typescript\nimport { inject } from \"@ooneex/container\";\nimport type { ScalarType } from \"@ooneex/types\";\nimport { decorator, PubSub, RedisPubSub } from \"@ooneex/pub-sub\";\n\n@decorator.pubSub()\nexport class <Name>Event<Data extends Record<string, ScalarType> = Record<string, ScalarType>> extends PubSub<Data> {\n constructor(\n @inject(RedisPubSub)\n client: RedisPubSub<Data>,\n ) {\n super(client);\n }\n\n public getChannel(): string {\n return \"<channel>\";\n }\n\n public async handler(context: { data: Data; channel: string }): Promise<void> {\n console.log(context);\n // TODO: Implement handler logic here\n }\n}\n```\n\n### 4. Complete the test file\n\nEdit `tests/events/<Name>Event.spec.ts` to add meaningful tests beyond the scaffolded ones:\n\n- Keep the existing scaffolded tests (class name, getChannel, handler, publish, subscribe, unsubscribe, unsubscribeAll methods)\n- Add tests relevant to the specific event behavior\n\nThe generated test structure follows this pattern:\n\n```typescript\nimport { describe, expect, test } from \"bun:test\";\nimport { <Name>PubSub } from \"@/pubsub/<Name>PubSub\";\n\ndescribe(\"<Name>PubSub\", () => {\n test(\"should have class name ending with 'PubSub'\", () => {\n expect(<Name>PubSub.name.endsWith(\"PubSub\")).toBe(true);\n });\n\n test(\"should have 'getChannel' method\", () => {\n expect(<Name>PubSub.prototype.getChannel).toBeDefined();\n expect(typeof <Name>PubSub.prototype.getChannel).toBe(\"function\");\n });\n\n test(\"should have 'handler' method\", () => {\n expect(<Name>PubSub.prototype.handler).toBeDefined();\n expect(typeof <Name>PubSub.prototype.handler).toBe(\"function\");\n });\n\n test(\"should have 'publish' method\", () => {\n expect(<Name>PubSub.prototype.publish).toBeDefined();\n expect(typeof <Name>PubSub.prototype.publish).toBe(\"function\");\n });\n\n test(\"should have 'subscribe' method\", () => {\n expect(<Name>PubSub.prototype.subscribe).toBeDefined();\n expect(typeof <Name>PubSub.prototype.subscribe).toBe(\"function\");\n });\n\n test(\"should have 'unsubscribe' method\", () => {\n expect(<Name>PubSub.prototype.unsubscribe).toBeDefined();\n expect(typeof <Name>PubSub.prototype.unsubscribe).toBe(\"function\");\n });\n\n test(\"should have 'unsubscribeAll' method\", () => {\n expect(<Name>PubSub.prototype.unsubscribeAll).toBeDefined();\n expect(typeof <Name>PubSub.prototype.unsubscribeAll).toBe(\"function\");\n });\n});\n```\n\n### 5. Register the event in the module\n\nAdd the new event to the module's `events` array in `src/<PascalModuleName>Module.ts` (e.g., `src/BookModule.ts` for the `book` module):\n\n```typescript\nimport type { ModuleType } from \"@ooneex/module\";\nimport { <Name>Event } from \"./events/<Name>Event\";\n\nexport const <PascalModuleName>Module: ModuleType = {\n controllers: [],\n entities: [],\n permissions: [],\n middlewares: [],\n cronJobs: [],\n events: [<Name>Event],\n};\n```\n\nThe module file uses PascalCase naming: `<PascalModuleName>Module.ts` with export `<PascalModuleName>Module`.\n\nIf the module already has other events registered, append the new event to the existing `events` array and add the import alongside existing imports.\n\n### 6. Lint and format\n\nRun linting and formatting on the generated files:\n\n```bash\nbunx biome check --fix src/events/<Name>Event.ts tests/events/<Name>Event.spec.ts\n```\n";var Dr="---\nname: make:repository\ndescription: Generate a new repository class with its test file, then complete the generated code. Use when creating a new TypeORM repository for database operations on an entity.\n---\n\n# Make Repository Class\n\nGenerate a new repository class and its test file using the `make:repository` CLI command, then complete the generated code with proper implementation.\n\n## Coding Conventions\n\n- Always explicitly show visibility on class methods and properties (`private`, `public`, `protected`)\n- Always use arrow functions when possible, but NOT for class methods (class methods use regular method syntax)\n- End type names with the `Type` suffix (e.g., `ExceptionStackFrameType`, `ServiceDataType`)\n- Start interface names with the `I` prefix (e.g., `IException`, `IService`, `IAiChat`)\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the repository class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:repository --name <name> --module <module>\n```\n\nWhere `<name>` is the name provided by the user. The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The command will generate:\n- `src/repositories/<Name>Repository.ts` - The repository class file (or `modules/<module>/src/repositories/<Name>Repository.ts` with `--module`)\n- `tests/repositories/<Name>Repository.spec.ts` - The test file (or `modules/<module>/tests/repositories/<Name>Repository.spec.ts` with `--module`)\n\n### 2. Read the generated files\n\nRead both generated files to understand the scaffolded code.\n\n### 3. Complete the repository class\n\nEdit `src/repositories/<Name>Repository.ts` to complete the implementation:\n\n- Verify the entity import path matches the actual entity location\n- Adjust the `find` method's search fields (default searches `name` with `ILike`)\n- Customize relations loading in `findOne`/`findOneBy` if needed\n\n#### Adding methods\n\nLook at the entity's fields, relations, and business context to determine if custom domain-specific methods are needed. For example:\n- A `SessionRepository` might need `revokeSession(sessionId: string)` and `revokeAllUserSessions(userId: string)`\n- A `NotificationRepository` might need `markAsRead(id: string)` and `markAllAsRead(userId: string)`\n- Entities with status fields may need methods like `archive(id: string)` or `activate(id: string)`\n\nRead related entities, services, or actions in the module to understand what operations the repository should support, then add the appropriate methods.\n\n#### Removing methods\n\nRemove scaffolded methods that don't make sense for the entity's context:\n- Remove `createMany`/`updateMany` if the entity is always managed individually (e.g., user profiles, settings)\n- Remove `delete` if the entity uses soft deletes only (use a custom `softDelete` or `archive` method instead)\n- Remove `find` if the entity is only ever accessed by ID or specific criteria (e.g., singleton config entities)\n- Remove `count` if there's no use case for counting records of this entity\n\nThe generated class structure follows this pattern:\n\n```typescript\nimport { inject } from \"@ooneex/container\";\nimport type { ITypeormDatabase } from \"@ooneex/database\";\nimport { decorator } from \"@ooneex/repository\";\nimport type { FilterResultType } from \"@ooneex/types\";\nimport type { FindManyOptions, FindOptionsWhere, Repository, SaveOptions, UpdateResult } from \"typeorm\";\nimport { ILike } from \"typeorm\";\nimport { <Name>Entity } from \"../entities/<Name>Entity\";\n\n@decorator.repository()\nexport class <Name>Repository {\n constructor(\n @inject(\"database\")\n private readonly database: ITypeormDatabase,\n ) {}\n\n public async open(): Promise<Repository<<Name>Entity>> {\n return await this.database.open(<Name>Entity);\n }\n\n public async close(): Promise<void> {\n await this.database.close();\n }\n\n public async find(\n criteria: FindManyOptions<<Name>Entity> & { page?: number; limit?: number; q?: string },\n ): Promise<FilterResultType<<Name>Entity>> {\n // ... pagination and search logic\n }\n\n public async findOne(id: string): Promise<<Name>Entity | null> { ... }\n public async findOneBy(criteria: FindOptionsWhere<<Name>Entity>): Promise<<Name>Entity | null> { ... }\n public async create(entity: <Name>Entity, options?: SaveOptions): Promise<<Name>Entity> { ... }\n public async createMany(entities: <Name>Entity[], options?: SaveOptions): Promise<<Name>Entity[]> { ... }\n public async update(entity: <Name>Entity, options?: SaveOptions): Promise<<Name>Entity> { ... }\n public async updateMany(entities: <Name>Entity[], options?: SaveOptions): Promise<<Name>Entity[]> { ... }\n public async delete(criteria: FindOptionsWhere<<Name>Entity> | FindOptionsWhere<<Name>Entity>[]): Promise<UpdateResult> { ... }\n public async count(criteria?: FindOptionsWhere<<Name>Entity> | FindOptionsWhere<<Name>Entity>[]): Promise<number> { ... }\n}\n```\n\n### 4. Complete the test file\n\nEdit `tests/repositories/<Name>Repository.spec.ts` to add meaningful tests beyond the scaffolded ones:\n\n- Keep scaffolded tests for methods that remain in the repository (remove tests for methods that were removed)\n- Add tests for any custom domain-specific methods added to the repository\n- Add tests relevant to the specific repository behavior\n\n### 5. Lint and format\n\nRun linting and formatting on the generated files:\n\n```bash\nbunx biome check --fix src/repositories/<Name>Repository.ts tests/repositories/<Name>Repository.spec.ts\n```\n";var Ir="---\nname: make:seed\ndescription: Generate a new database seed file, then complete the generated code. Use when creating seed data for populating the database using @ooneex/seeds.\n---\n\n# Make Seed\n\nGenerate a new seed file using the `make:seed` CLI command, then complete the generated code with proper implementation.\n\n## Coding Conventions\n\n- Always explicitly show visibility on class methods and properties (`private`, `public`, `protected`)\n- Always use arrow functions when possible, but NOT for class methods (class methods use regular method syntax)\n- End type names with the `Type` suffix (e.g., `ExceptionStackFrameType`, `ServiceDataType`)\n- Start interface names with the `I` prefix (e.g., `IException`, `IService`, `IAiChat`)\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the seed file:\n\n```bash\nbunx @ooneex/cli@latest make:seed --name <name> --module <module>\n```\n\nWhere `<name>` is the name provided by the user. The `--module` option is optional \u2014 if provided, the seed file is generated under `modules/<module>/src/seeds/` instead of `src/seeds/`. The command will:\n- Generate a seed file in `src/seeds/` (or `modules/<module>/src/seeds/` with `--module`)\n- Add a `seed:run` script to `package.json` if not already present\n\n### 2. Read the generated file\n\nRead the generated seed file in `src/seeds/` to understand the scaffolded code.\n\n### 3. Complete the seed\n\nEdit the generated seed file to implement:\n\n- Import the relevant entity classes\n- Create seed data with hardcoded nanoid values for `id` fields (generate via `bun -e \"import { random } from '@ooneex/utils'; console.log(random.nanoid())\"`)\n- Do NOT use sequential IDs like `\"item-1\"`, `\"item-2\"`\n- Ensure the same entity uses the same ID everywhere it appears\n\n### 4. Lint and format\n\nRun linting and formatting on the generated file:\n\n```bash\nbunx biome check --fix src/seeds/\n```\n";var Pr="---\nname: make:service\ndescription: Generate a new service class with its test file, then complete the generated code. Use when creating a new business logic service that implements IService from @ooneex/service.\n---\n\n# Make Service Class\n\nGenerate a new service class and its test file using the `make:service` CLI command, then complete the generated code with proper implementation.\n\n## Coding Conventions\n\n- Always explicitly show visibility on class methods and properties (`private`, `public`, `protected`)\n- Always use arrow functions when possible, but NOT for class methods (class methods use regular method syntax)\n- End type names with the `Type` suffix (e.g., `ExceptionStackFrameType`, `ServiceDataType`)\n- Start interface names with the `I` prefix (e.g., `IException`, `IService`, `IAiChat`)\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the service class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:service --name <name> --module <module>\n```\n\nWhere `<name>` is the name provided by the user. The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The command will generate:\n- `src/services/<Name>Service.ts` - The service class file (or `modules/<module>/src/services/<Name>Service.ts` with `--module`)\n- `tests/services/<Name>Service.spec.ts` - The test file (or `modules/<module>/tests/services/<Name>Service.spec.ts` with `--module`)\n\n### 2. Read the generated files\n\nRead both generated files to understand the scaffolded code.\n\n### 3. Complete the service class\n\nEdit `src/services/<Name>Service.ts` to complete the implementation:\n\n- Define a proper type for `ServiceDataType` instead of `Record<string, unknown>`\n- Implement the `execute()` method with actual business logic\n- Inject any required dependencies (repositories, other services, etc.) via the constructor\n\nThe generated class structure follows this pattern:\n\n```typescript\nimport { decorator } from \"@ooneex/service\";\nimport type { IService } from \"@ooneex/service\";\n\ntype ServiceDataType = Record<string, unknown>;\n\n@decorator.service()\nexport class <Name>Service<T extends ServiceDataType = ServiceDataType> implements IService<T> {\n public async execute(data?: T): Promise<void> {\n // TODO: Implement service logic\n }\n}\n```\n\n### 4. Complete the test file\n\nEdit `tests/services/<Name>Service.spec.ts` to add meaningful tests beyond the scaffolded ones:\n\n- Keep the existing scaffolded tests (class name, execute method)\n- Add tests relevant to the specific service behavior\n\nThe generated test structure follows this pattern:\n\n```typescript\nimport { describe, expect, test } from \"bun:test\";\nimport { <Name>Service } from \"@/services/<Name>Service\";\n\ndescribe(\"<Name>Service\", () => {\n test(\"should have class name ending with 'Service'\", () => {\n expect(<Name>Service.name.endsWith(\"Service\")).toBe(true);\n });\n\n test(\"should have 'execute' method\", () => {\n expect(<Name>Service.prototype.execute).toBeDefined();\n expect(typeof <Name>Service.prototype.execute).toBe(\"function\");\n });\n});\n```\n\n### 5. Lint and format\n\nRun linting and formatting on the generated files:\n\n```bash\nbunx biome check --fix src/services/<Name>Service.ts tests/services/<Name>Service.spec.ts\n```\n";var Or="---\nname: make:storage\ndescription: Generate a new storage class with its test file, then complete the generated code. Use when creating a new S3-compatible storage adapter that extends Storage from @ooneex/storage.\n---\n\n# Make Storage Class\n\nGenerate a new storage class and its test file using the `make:storage` CLI command, then complete the generated code with proper implementation.\n\n## Coding Conventions\n\n- Always explicitly show visibility on class methods and properties (`private`, `public`, `protected`)\n- Always use arrow functions when possible, but NOT for class methods (class methods use regular method syntax)\n- End type names with the `Type` suffix (e.g., `ExceptionStackFrameType`, `ServiceDataType`)\n- Start interface names with the `I` prefix (e.g., `IException`, `IService`, `IAiChat`)\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the storage class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:storage --name <name> --module <module>\n```\n\nWhere `<name>` is the name provided by the user. The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The command will generate:\n- `src/storage/<Name>Storage.ts` - The storage class file (or `modules/<module>/src/storage/<Name>Storage.ts` with `--module`)\n- `tests/storage/<Name>Storage.spec.ts` - The test file (or `modules/<module>/tests/storage/<Name>Storage.spec.ts` with `--module`)\n\n### 2. Read the generated files\n\nRead both generated files to understand the scaffolded code.\n\n### 3. Complete the storage class\n\nEdit `src/storage/<Name>Storage.ts` to complete the implementation:\n\n- Set the `bucket` property to the appropriate bucket name\n- Verify the environment variable names match the project configuration (`STORAGE_<NAME_UPPER>_ACCESS_KEY`, `STORAGE_<NAME_UPPER>_SECRET_KEY`, `STORAGE_<NAME_UPPER>_ENDPOINT`, `STORAGE_<NAME_UPPER>_REGION`)\n- Add any additional storage-specific methods if needed\n\nThe generated class structure follows this pattern:\n\n```typescript\nimport { Storage, decorator, StorageException } from \"@ooneex/storage\";\nimport type { S3Options } from \"bun\";\n\n@decorator.storage()\nexport class <Name>Storage extends Storage {\n protected bucket: string;\n private readonly accessKey: string;\n private readonly secretKey: string;\n private readonly endpoint: string;\n private readonly region: string;\n\n constructor(options?: {\n accessKey?: string;\n secretKey?: string;\n endpoint?: string;\n region?: string;\n }) {\n super();\n\n const accessKey = options?.accessKey || Bun.env.STORAGE_<NAME_UPPER>_ACCESS_KEY;\n const secretKey = options?.secretKey || Bun.env.STORAGE_<NAME_UPPER>_SECRET_KEY;\n const endpoint = options?.endpoint || Bun.env.STORAGE_<NAME_UPPER>_ENDPOINT;\n\n // ... validation throws StorageException if missing ...\n\n this.accessKey = accessKey;\n this.secretKey = secretKey;\n this.endpoint = endpoint;\n this.region = options?.region || Bun.env.STORAGE_<NAME_UPPER>_REGION || \"auto\";\n }\n\n public getOptions(): S3Options {\n return {\n accessKeyId: this.accessKey,\n secretAccessKey: this.secretKey,\n endpoint: this.endpoint,\n bucket: this.bucket,\n region: this.region,\n };\n }\n}\n```\n\n### 4. Complete the test file\n\nEdit `tests/storage/<Name>Storage.spec.ts` to add meaningful tests beyond the scaffolded ones:\n\n- Keep the existing scaffolded tests (class name, bucket field, getOptions method)\n- Add tests relevant to the specific storage class behavior\n\nThe generated test structure follows this pattern:\n\n```typescript\nimport { describe, expect, test } from \"bun:test\";\nimport { <Name>StorageAdapter } from \"@/storage/<Name>StorageAdapter\";\n\ndescribe(\"<Name>StorageAdapter\", () => {\n test(\"should have class name ending with 'StorageAdapter'\", () => {\n expect(<Name>StorageAdapter.name.endsWith(\"StorageAdapter\")).toBe(true);\n });\n\n test(\"should have 'bucket' field\", () => {\n expect(\"bucket\" in <Name>StorageAdapter.prototype || \"bucket\" in Object.getOwnPropertyNames(<Name>StorageAdapter.prototype)).toBe(true);\n });\n\n test(\"should have 'getOptions' method\", () => {\n expect(<Name>StorageAdapter.prototype.getOptions).toBeDefined();\n expect(typeof <Name>StorageAdapter.prototype.getOptions).toBe(\"function\");\n });\n});\n```\n\n### 5. Lint and format\n\nRun linting and formatting on the generated files:\n\n```bash\nbunx biome check --fix src/storage/<Name>Storage.ts tests/storage/<Name>Storage.spec.ts\n```\n";var Br="---\nname: make:vector-database\ndescription: Generate a new vector database class with its test file, then complete the generated code. Use when creating a new vector database that extends VectorDatabase from @ooneex/rag.\n---\n\n# Make Vector Database Class\n\nGenerate a new vector database class and its test file using the `make:vector-database` CLI command, then complete the generated code with proper implementation.\n\n## Coding Conventions\n\n- Always explicitly show visibility on class methods and properties (`private`, `public`, `protected`)\n- Always use arrow functions when possible, but NOT for class methods (class methods use regular method syntax)\n- End type names with the `Type` suffix (e.g., `ExceptionStackFrameType`, `ServiceDataType`)\n- Start interface names with the `I` prefix (e.g., `IException`, `IService`, `IAiChat`)\n\n## Steps\n\n### 1. Run the generator\n\nRun the following command to scaffold the vector database class and test files:\n\n```bash\nbunx @ooneex/cli@latest make:vector-database --name <name> --module <module>\n```\n\nWhere `<name>` is the name provided by the user. The `--module` option is optional \u2014 if provided, files are generated under `modules/<module>/` instead of the project root. The command will generate:\n- `src/databases/<Name>VectorDatabase.ts` - The vector database class file (or `modules/<module>/src/databases/<Name>VectorDatabase.ts` with `--module`)\n- `tests/databases/<Name>VectorDatabase.spec.ts` - The test file (or `modules/<module>/tests/databases/<Name>VectorDatabase.spec.ts` with `--module`)\n\n### 2. Read the generated files\n\nRead both generated files to understand the scaffolded code.\n\n### 3. Complete the vector database class\n\nEdit `src/databases/<Name>VectorDatabase.ts` to complete the implementation:\n\n- Set the `getDatabaseUri()` return value to the actual LanceDB database path\n- Configure the embedding provider and model in `getEmbeddingModel()`\n- Define the custom data fields in `DataType` and map them in `getSchema()`\n- Import the appropriate Apache Arrow types for your schema fields\n\nThe generated class structure follows this pattern:\n\n```typescript\nimport { VectorDatabase, decorator } from \"@ooneex/rag\";\nimport type { EmbeddingModelType, EmbeddingProviderType, FieldValueType } from \"@ooneex/rag\";\nimport { Utf8 } from \"apache-arrow\";\n\ntype DataType = {\n name: string;\n};\n\n@decorator.vectorDatabase()\nexport class <Name>VectorDatabase extends VectorDatabase<DataType> {\n public getDatabaseUri(): string {\n return \"\";\n }\n\n public getEmbeddingModel(): { provider: EmbeddingProviderType; model: EmbeddingModelType[\"model\"] } {\n return { provider: \"openai\", model: \"text-embedding-ada-002\" };\n }\n\n public getSchema(): { [K in keyof DataType]: FieldValueType } {\n return {\n name: new Utf8(),\n };\n }\n}\n```\n\n### 4. Complete the test file\n\nEdit `tests/databases/<Name>VectorDatabase.spec.ts` to add meaningful tests beyond the scaffolded ones:\n\n- Keep the existing scaffolded tests (class name, getDatabaseUri, getEmbeddingModel, getSchema methods)\n- Add tests relevant to the specific vector database class behavior\n\nThe generated test structure follows this pattern:\n\n```typescript\nimport { describe, expect, test } from \"bun:test\";\nimport { <Name>VectorDatabase } from \"@/databases/<Name>VectorDatabase\";\n\ndescribe(\"<Name>VectorDatabase\", () => {\n test(\"should have class name ending with 'VectorDatabase'\", () => {\n expect(<Name>VectorDatabase.name.endsWith(\"VectorDatabase\")).toBe(true);\n });\n\n test(\"should have 'getDatabaseUri' method\", () => {\n expect(<Name>VectorDatabase.prototype.getDatabaseUri).toBeDefined();\n expect(typeof <Name>VectorDatabase.prototype.getDatabaseUri).toBe(\"function\");\n });\n\n test(\"should have 'getEmbeddingModel' method\", () => {\n expect(<Name>VectorDatabase.prototype.getEmbeddingModel).toBeDefined();\n expect(typeof <Name>VectorDatabase.prototype.getEmbeddingModel).toBe(\"function\");\n });\n\n test(\"should have 'getSchema' method\", () => {\n expect(<Name>VectorDatabase.prototype.getSchema).toBeDefined();\n expect(typeof <Name>VectorDatabase.prototype.getSchema).toBe(\"function\");\n });\n});\n```\n\n### 5. Lint and format\n\nRun linting and formatting on the generated files:\n\n```bash\nbunx biome check --fix src/databases/<Name>VectorDatabase.ts tests/databases/<Name>VectorDatabase.spec.ts\n```\n";var wd={"make.ai":br,"make.analytics":wr,"make.cache":xr,"make.controller":Er,"make.cron":Ar,"make.database":vr,"make.entity":Nr,"make.logger":Tr,"make.mailer":Sr,"make.middleware":Cr,"make.migration":Mr,"make.permission":Rr,"make.pubsub":_r,"make.repository":Dr,"make.seed":Ir,"make.service":Pr,"make.storage":Or,"make.vector-database":Br};class Ue{getName(){return"make:claude:skill"}getDescription(){return"Generate Claude skills from templates"}async run(){let e=Le(".claude","skills"),t=Le(process.cwd(),e),s=new bd;for(let[o,r]of Object.entries(wd)){let a=o.replace(/\./g,"-"),i=Le(t,a,"SKILL.md");await Bun.write(i,r),s.success(`${Le(e,a,"SKILL.md")} created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}}Ue=g([b.command()],Ue);import{basename as Bd,join as I}from"path";import{TerminalLogger as Ld}from"@ooneex/logger";import{toKebabCase as Ud,toPascalCase as It,trim as Gd}from"@ooneex/utils";var Lr=te(ie(),1),Ge=async(e)=>{return(await Lr.prompt({type:"confirm",name:"confirm",message:e.message})).confirm};var xe=["GET","POST","PUT","DELETE","PATCH","OPTIONS","HEAD"];var Ur=te(ie(),1);import{Assert as xd,Validation as Ed}from"@ooneex/validation";class Rt extends Ed{getConstraint(){return xd("string >= 3")}getErrorMessage(){return`Route method must be one of: ${xe.join(", ")}`}validate(e,t){let s=super.validate(e,t);if(!s.isValid)return s;let o=e;if(o.trim()!==o)return{isValid:!1,message:this.getErrorMessage()||"Invalid route method format"};let r=o.toUpperCase();if(!xe.includes(r))return{isValid:!1,message:this.getErrorMessage()||"Invalid route method"};return{isValid:!0}}}var Gr=async(e)=>{return(await Ur.prompt({type:"select",name:"method",message:e.message,initial:e.initial??0,choices:xe.map((s)=>s),validate:(s)=>{let r=new Rt().validate(s);if(!r.isValid)return r.message||"Route method is invalid";return!0}})).method};var $r=te(ie(),1);import{Assert as Ad,Validation as vd}from"@ooneex/validation";var Nd=/^[a-zA-Z0-9]+\.[a-zA-Z0-9]+\.[a-zA-Z0-9]+$/;class _t extends vd{getConstraint(){return Ad("string >= 7")}getErrorMessage(){return"Route name must follow format: namespace.resource.action (e.g., 'api.users.list')"}validate(e,t){let s=super.validate(e,t);if(!s.isValid)return s;let o=e;if(o.trim()!==o)return{isValid:!1,message:this.getErrorMessage()||"Invalid route name format"};if(!Nd.test(o))return{isValid:!1,message:this.getErrorMessage()||"Invalid route name format"};let r=o.split(".");if(r.length!==3)return{isValid:!1,message:this.getErrorMessage()||"Invalid route name format"};let[a,i,n]=r;if(!a||!i||!n)return{isValid:!1,message:this.getErrorMessage()||"Invalid route name format"};return{isValid:!0}}}var kr=async(e)=>{return(await $r.prompt({type:"input",name:"routeName",message:e.message,validate:(s)=>{let r=new _t().validate(s);if(!r.isValid)return r.message||"Route name is invalid";return!0}})).routeName};var Wr=te(ie(),1);import{Assert as Td,Validation as Sd}from"@ooneex/validation";var Cd=1,Md=/^\/[\w\-/:]*$/,Rd=/^[a-zA-Z0-9\-_]+$/,_d=/^:[a-zA-Z][a-zA-Z0-9]*$/;class Dt extends Sd{getConstraint(){return Td(`string >= ${Cd}`)}getErrorMessage(){return"Route path must start with '/' and contain only valid segments (e.g., '/users', '/api/users/:id')"}validate(e,t){let s=super.validate(e,t);if(!s.isValid)return s;let o=e;if(o.trim()!==o)return{isValid:!1,message:this.getErrorMessage()||"Invalid route path format"};if(!o.startsWith("/"))return{isValid:!1,message:"Route path must start with '/'"};if(o.length>1&&o.endsWith("/"))return{isValid:!1,message:"Route path cannot end with '/' (except for root path)"};if(!Md.test(o))return{isValid:!1,message:this.getErrorMessage()||"Invalid route path format"};if(o==="/")return{isValid:!0};let r=o.slice(1).split("/");for(let a of r){if(!a)return{isValid:!1,message:"Route path cannot contain empty segments (double slashes)"};if(a.startsWith(":")){if(!_d.test(a))return{isValid:!1,message:`Invalid parameter segment '${a}'. Parameters must follow format ':paramName' with alphanumeric characters only`}}else if(!Rd.test(a))return{isValid:!1,message:`Invalid path segment '${a}'. Segments must contain only letters, numbers, hyphens, and underscores`}}return{isValid:!0}}}var qr=async(e)=>{return(await Wr.prompt({type:"input",name:"path",message:e.message,initial:e.initial??"/",validate:(s)=>{let r=new Dt().validate(s);if(!r.isValid)return r.message||"Route path is invalid";return!0}})).path};var Kr=`import type { ContextType } from "@ooneex/socket";
1667
1300
  import { ERole } from "@ooneex/role";
1668
1301
  import { Route } from "@ooneex/routing";
1669
1302
  import { Assert } from "@ooneex/validation";
@@ -1696,7 +1329,7 @@ export class {{NAME}}Controller {
1696
1329
  });
1697
1330
  }
1698
1331
  }
1699
- `;var Yo=`import { describe, expect, test } from "bun:test";
1332
+ `;var Hr=`import { describe, expect, test } from "bun:test";
1700
1333
  import { {{NAME}}Controller } from "@/controllers/{{NAME}}Controller";
1701
1334
 
1702
1335
  describe("{{NAME}}Controller", () => {
@@ -1709,7 +1342,7 @@ describe("{{NAME}}Controller", () => {
1709
1342
  expect(typeof {{NAME}}Controller.prototype.index).toBe("function");
1710
1343
  });
1711
1344
  });
1712
- `;var Fo=`import type { ContextType } from "@ooneex/controller";
1345
+ `;var Fr=`import type { ContextType } from "@ooneex/controller";
1713
1346
  import { ERole } from "@ooneex/role";
1714
1347
  import { Route } from "@ooneex/routing";
1715
1348
  import { Assert } from "@ooneex/validation";
@@ -1742,7 +1375,7 @@ export class {{NAME}}Controller {
1742
1375
  });
1743
1376
  }
1744
1377
  }
1745
- `;var jo=`export type {{TYPE_NAME}}RouteType = {
1378
+ `;var Vr=`export type {{TYPE_NAME}}RouteType = {
1746
1379
  params: {
1747
1380
 
1748
1381
  },
@@ -1756,9 +1389,9 @@ export class {{NAME}}Controller {
1756
1389
 
1757
1390
  },
1758
1391
  };
1759
- `;class $e{getName(){return"make:controller"}getDescription(){return"Generate a new controller class"}async addToModule(e,t){let s=await Bun.file(e).text(),r=`${t}Controller`,o=`import { ${r} } from "./controllers/${r}";
1392
+ `;class $e{getName(){return"make:controller"}getDescription(){return"Generate a new controller class"}async addToModule(e,t){let s=await Bun.file(e).text(),o=`${t}Controller`,r=`import { ${o} } from "./controllers/${o}";
1760
1393
  `,a=s.lastIndexOf("import "),i=s.indexOf(`
1761
- `,a);s=`${s.slice(0,i+1)}${o}${s.slice(i+1)}`;let n=/(controllers:\s*\[)([^\]]*)/s,l=s.match(n);if(l){let d=l[2]?.trim(),u=d?`${d}, ${r}`:r;s=s.replace(n,`$1${u}`)}await Bun.write(e,s)}async run(e){let{name:t,module:s,isSocket:r}=e;if(!t)t=await N({message:"Enter controller name"});if(r===void 0)r=await Ge({message:"Is this a socket controller?"});t=_t(t).replace(/Controller$/,"");let{route:o={}}=e,i=(r?Vo:Fo).replaceAll("{{NAME}}",t),n="",l="";if(!o.name)o.name=await ko({message:"Enter route name (e.g., api.user.create)"});if(n=_t(o.name),l=o.name,i=i.replaceAll("{{ROUTE_NAME}}",o.name).replaceAll("{{TYPE_NAME}}",n).replaceAll("{{TYPE_NAME_FILE}}",l),!o.path)o.path=await Ho({message:"Enter route path",initial:"/"});let d=`/${$d(Wd(o.path,"/"))}`;if(i=i.replaceAll("{{ROUTE_PATH}}",d),!r&&!o.method)o.method=await Wo({message:"Enter route method"});if(!r&&o.method)i=i.replaceAll("{{ROUTE_METHOD}}",o.method.toLowerCase());let u=s?O("modules",s):".",c=O(u,"src","controllers"),p=O(process.cwd(),c),m=O(p,`${t}Controller.ts`);await Bun.write(m,i);let h=O(u,"src","types","routes"),f=O(process.cwd(),h),w=O(f,`${l}.ts`),g=jo.replaceAll("{{TYPE_NAME}}",n);await Bun.write(w,g);let E=Yo.replace(/{{NAME}}/g,t),A=O(u,"tests","controllers"),v=O(process.cwd(),A),S=O(v,`${t}Controller.spec.ts`);await Bun.write(S,E);let _=_t(Ud(process.cwd())),Ee=O(process.cwd(),"src",`${_}Module.ts`);if(await Bun.file(Ee).exists())await this.addToModule(Ee,t);let ee=new Gd;ee.success(`${O(c,t)}Controller.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),ee.success(`${O(h,l)}.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),ee.success(`${O(A,t)}Controller.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}$e=y([b.command()],$e);import{basename as Kd,join as G}from"path";import{TerminalLogger as Hd}from"@ooneex/logger";import{toPascalCase as Qo}from"@ooneex/utils";var zo=`import { describe, expect, test } from "bun:test";
1394
+ `,a);s=`${s.slice(0,i+1)}${r}${s.slice(i+1)}`;let n=/(controllers:\s*\[)([^\]]*)/s,l=s.match(n);if(l){let d=l[2]?.trim(),m=d?`${d}, ${o}`:o;s=s.replace(n,`$1${m}`)}await Bun.write(e,s)}async run(e){let{name:t,module:s,isSocket:o}=e;if(!t)t=await v({message:"Enter controller name"});if(o===void 0)o=await Ge({message:"Is this a socket controller?"});t=It(t).replace(/Controller$/,"");let{route:r={}}=e,i=(o?Kr:Fr).replaceAll("{{NAME}}",t),n="",l="";if(!r.name)r.name=await kr({message:"Enter route name (e.g., api.user.create)"});if(n=It(r.name),l=r.name,i=i.replaceAll("{{ROUTE_NAME}}",r.name).replaceAll("{{TYPE_NAME}}",n).replaceAll("{{TYPE_NAME_FILE}}",l),!r.path)r.path=await qr({message:"Enter route path",initial:"/"});let d=`/${Ud(Gd(r.path,"/"))}`;if(i=i.replaceAll("{{ROUTE_PATH}}",d),!o&&!r.method)r.method=await Gr({message:"Enter route method"});if(!o&&r.method)i=i.replaceAll("{{ROUTE_METHOD}}",r.method.toLowerCase());let m=s?I("modules",s):".",u=I(m,"src","controllers"),p=I(process.cwd(),u),c=I(p,`${t}Controller.ts`);await Bun.write(c,i);let h=I(m,"src","types","routes"),f=I(process.cwd(),h),E=I(f,`${l}.ts`),y=Vr.replaceAll("{{TYPE_NAME}}",n);await Bun.write(E,y);let x=Hr.replace(/{{NAME}}/g,t),A=I(m,"tests","controllers"),N=I(process.cwd(),A),S=I(N,`${t}Controller.spec.ts`);await Bun.write(S,x);let _=It(Bd(process.cwd())),Ee=I(process.cwd(),"src",`${_}Module.ts`);if(await Bun.file(Ee).exists())await this.addToModule(Ee,t);let ee=new Ld;ee.success(`${I(u,t)}Controller.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),ee.success(`${I(h,l)}.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),ee.success(`${I(A,t)}Controller.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}$e=g([b.command()],$e);import{basename as Wd,join as G}from"path";import{TerminalLogger as qd}from"@ooneex/logger";import{toPascalCase as zr}from"@ooneex/utils";var Yr=`import { describe, expect, test } from "bun:test";
1762
1395
  import { {{NAME}}Cron } from "@/cron/{{NAME}}Cron";
1763
1396
 
1764
1397
  describe("{{NAME}}Cron", () => {
@@ -1781,7 +1414,7 @@ describe("{{NAME}}Cron", () => {
1781
1414
  expect(typeof {{NAME}}Cron.prototype.handler).toBe("function");
1782
1415
  });
1783
1416
  });
1784
- `;var Zo=`import type { TimeZoneType } from "@ooneex/country";
1417
+ `;var jr=`import type { TimeZoneType } from "@ooneex/country";
1785
1418
  import type { CronTimeType } from "@ooneex/cron";
1786
1419
  import { Cron, decorator } from "@ooneex/cron";
1787
1420
 
@@ -1802,9 +1435,9 @@ export class {{NAME}}Cron extends Cron {
1802
1435
  // console.log("{{NAME}}Cron handler executed");
1803
1436
  }
1804
1437
  }
1805
- `;class We{getName(){return"make:cron"}getDescription(){return"Generate a new cron class"}async addToModule(e,t){let s=await Bun.file(e).text(),r=`${t}Cron`,o=`import { ${r} } from "./cron/${r}";
1438
+ `;class ke{getName(){return"make:cron"}getDescription(){return"Generate a new cron class"}async addToModule(e,t){let s=await Bun.file(e).text(),o=`${t}Cron`,r=`import { ${o} } from "./cron/${o}";
1806
1439
  `,a=s.lastIndexOf("import "),i=s.indexOf(`
1807
- `,a);s=`${s.slice(0,i+1)}${o}${s.slice(i+1)}`;let n=/(cronJobs:\s*\[)([^\]]*)/s,l=s.match(n);if(l){let d=l[2]?.trim(),u=d?`${d}, ${r}`:r;s=s.replace(n,`$1${u}`)}await Bun.write(e,s)}async run(e){let{name:t,module:s}=e;if(!t)t=await N({message:"Enter cron name"});t=Qo(t).replace(/Cron$/,"");let r=Zo.replace(/{{NAME}}/g,t),o=s?G("modules",s):".",a=G(o,"src","cron"),i=G(process.cwd(),a),n=G(i,`${t}Cron.ts`);await Bun.write(n,r);let l=zo.replace(/{{NAME}}/g,t),d=G(o,"tests","cron"),u=G(process.cwd(),d),c=G(u,`${t}Cron.spec.ts`);await Bun.write(c,l);let p=Qo(Kd(process.cwd())),m=G(process.cwd(),"src",`${p}Module.ts`);if(await Bun.file(m).exists())await this.addToModule(m,t);let h=new Hd;h.success(`${G(a,t)}Cron.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),h.success(`${G(d,t)}Cron.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}We=y([b.command()],We);import{join as j}from"path";import{TerminalLogger as Fd}from"@ooneex/logger";import{toPascalCase as jd}from"@ooneex/utils";var Xo=`import { describe, expect, test } from "bun:test";
1440
+ `,a);s=`${s.slice(0,i+1)}${r}${s.slice(i+1)}`;let n=/(cronJobs:\s*\[)([^\]]*)/s,l=s.match(n);if(l){let d=l[2]?.trim(),m=d?`${d}, ${o}`:o;s=s.replace(n,`$1${m}`)}await Bun.write(e,s)}async run(e){let{name:t,module:s}=e;if(!t)t=await v({message:"Enter cron name"});t=zr(t).replace(/Cron$/,"");let o=jr.replace(/{{NAME}}/g,t),r=s?G("modules",s):".",a=G(r,"src","cron"),i=G(process.cwd(),a),n=G(i,`${t}Cron.ts`);await Bun.write(n,o);let l=Yr.replace(/{{NAME}}/g,t),d=G(r,"tests","cron"),m=G(process.cwd(),d),u=G(m,`${t}Cron.spec.ts`);await Bun.write(u,l);let p=zr(Wd(process.cwd())),c=G(process.cwd(),"src",`${p}Module.ts`);if(await Bun.file(c).exists())await this.addToModule(c,t);let h=new qd;h.success(`${G(a,t)}Cron.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),h.success(`${G(d,t)}Cron.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}ke=g([b.command()],ke);import{join as j}from"path";import{TerminalLogger as Fd}from"@ooneex/logger";import{toPascalCase as Vd}from"@ooneex/utils";var Zr=`import { describe, expect, test } from "bun:test";
1808
1441
  import { {{NAME}}Database } from "@/databases/{{NAME}}Database";
1809
1442
 
1810
1443
  describe("{{NAME}}Database", () => {
@@ -1817,7 +1450,7 @@ describe("{{NAME}}Database", () => {
1817
1450
  expect(typeof {{NAME}}Database.prototype.getSource).toBe("function");
1818
1451
  });
1819
1452
  });
1820
- `;var Jo=`import { DataSource } from "typeorm";
1453
+ `;var Qr=`import { DataSource } from "typeorm";
1821
1454
  import { TypeormDatabase, DatabaseException, decorator } from "@ooneex/database";
1822
1455
 
1823
1456
  @decorator.database()
@@ -1840,7 +1473,7 @@ export class {{NAME}}Database extends TypeormDatabase {
1840
1473
  return this.source;
1841
1474
  }
1842
1475
  }
1843
- `;class qe{getName(){return"make:database"}getDescription(){return"Generate a new database class"}async run(e){let{name:t,module:s}=e;if(!t)t=await N({message:"Enter database name"});t=jd(t).replace(/DatabaseAdapter$/,"").replace(/Database$/,"");let r=Jo.replace(/{{NAME}}/g,t),o=s?j("modules",s):".",a=j(o,"src","databases"),i=j(process.cwd(),a),n=j(i,`${t}Database.ts`);await Bun.write(n,r);let l=Xo.replace(/{{NAME}}/g,t),d=j(o,"tests","databases"),u=j(process.cwd(),d),c=j(u,`${t}Database.spec.ts`);await Bun.write(c,l);let p=new Fd;p.success(`${j(a,t)}Database.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),p.success(`${j(d,t)}Database.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}qe=y([b.command()],qe);import{join as Na}from"path";import{TerminalLogger as hm}from"@ooneex/logger";var{YAML:va}=globalThis.Bun;var ta=te(ie(),1),ea=["clickhouse","elasticsearch","grafana","jaeger","keycloak","libretranslate","maildev","memcached","minio","mongodb","mysql","nats","postgres","prometheus","rabbitmq","redis","temporal","vault"],sa=async(e)=>{return(await ta.prompt({type:"autocomplete",name:"service",message:e.message,initial:e.initial,choices:ea.map((s)=>s),validate:(s)=>{if(!ea.includes(s))return"Docker service is invalid";return!0}})).service};var ra=`services:
1476
+ `;class We{getName(){return"make:database"}getDescription(){return"Generate a new database class"}async run(e){let{name:t,module:s}=e;if(!t)t=await v({message:"Enter database name"});t=Vd(t).replace(/DatabaseAdapter$/,"").replace(/Database$/,"");let o=Qr.replace(/{{NAME}}/g,t),r=s?j("modules",s):".",a=j(r,"src","databases"),i=j(process.cwd(),a),n=j(i,`${t}Database.ts`);await Bun.write(n,o);let l=Zr.replace(/{{NAME}}/g,t),d=j(r,"tests","databases"),m=j(process.cwd(),d),u=j(m,`${t}Database.spec.ts`);await Bun.write(u,l);let p=new Fd;p.success(`${j(a,t)}Database.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),p.success(`${j(d,t)}Database.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}We=g([b.command()],We);import{join as Ea}from"path";import{TerminalLogger as pm}from"@ooneex/logger";var{YAML:Aa}=globalThis.Bun;var Jr=te(ie(),1),Xr=["clickhouse","elasticsearch","grafana","jaeger","keycloak","libretranslate","maildev","memcached","minio","mongodb","mysql","nats","postgres","prometheus","rabbitmq","redis","temporal","vault"],ea=async(e)=>{return(await Jr.prompt({type:"autocomplete",name:"service",message:e.message,initial:e.initial,choices:Xr.map((s)=>s),validate:(s)=>{if(!Xr.includes(s))return"Docker service is invalid";return!0}})).service};var ta=`services:
1844
1477
  # ClickHouse - Column-oriented OLAP database for analytics
1845
1478
  # Docs: https://clickhouse.com/docs
1846
1479
  # HTTP API: http://localhost:8123
@@ -1861,7 +1494,7 @@ export class {{NAME}}Database extends TypeormDatabase {
1861
1494
 
1862
1495
  volumes:
1863
1496
  clickhouse_data:
1864
- `;var oa=`services:
1497
+ `;var sa=`services:
1865
1498
  # Elasticsearch - Full-text search and analytics engine
1866
1499
  # Docs: https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
1867
1500
  # HTTP API: http://localhost:9200
@@ -1882,7 +1515,7 @@ volumes:
1882
1515
 
1883
1516
  volumes:
1884
1517
  elasticsearch_data:
1885
- `;var aa=`services:
1518
+ `;var oa=`services:
1886
1519
  # Grafana - Metrics visualization and dashboards
1887
1520
  # Docs: https://grafana.com/docs/grafana/latest/
1888
1521
  # Web UI: http://localhost:3000 (ooneex/ooneex)
@@ -1900,7 +1533,7 @@ volumes:
1900
1533
 
1901
1534
  volumes:
1902
1535
  grafana_data:
1903
- `;var ia=`services:
1536
+ `;var ra=`services:
1904
1537
  # Jaeger - Distributed tracing system
1905
1538
  # Docs: https://www.jaegertracing.io/docs/
1906
1539
  # Web UI: http://localhost:16686
@@ -1914,7 +1547,7 @@ volumes:
1914
1547
  - "16686:16686"
1915
1548
  - "6831:6831/udp"
1916
1549
  - "14268:14268"
1917
- `;var na=`services:
1550
+ `;var aa=`services:
1918
1551
  # Keycloak - Identity and access management
1919
1552
  # Docs: https://www.keycloak.org/documentation
1920
1553
  # Admin Console: http://localhost:8080 (ooneex/ooneex)
@@ -1928,7 +1561,7 @@ volumes:
1928
1561
  - KEYCLOAK_ADMIN=ooneex
1929
1562
  - KEYCLOAK_ADMIN_PASSWORD=ooneex
1930
1563
  command: start-dev
1931
- `;var la=`services:
1564
+ `;var ia=`services:
1932
1565
  # LibreTranslate - Self-hosted machine translation API
1933
1566
  # Docs: https://libretranslate.com/docs/
1934
1567
  # API: http://localhost:4000
@@ -1955,7 +1588,7 @@ volumes:
1955
1588
 
1956
1589
  volumes:
1957
1590
  libretranslate_models:
1958
- `;var da=`services:
1591
+ `;var na=`services:
1959
1592
  # MailDev - Email testing tool with web UI
1960
1593
  # Docs: https://github.com/maildev/maildev
1961
1594
  # Web UI: http://localhost:1080
@@ -1966,7 +1599,7 @@ volumes:
1966
1599
  ports:
1967
1600
  - "1080:1080"
1968
1601
  - "1025:1025"
1969
- `;var ma=`services:
1602
+ `;var la=`services:
1970
1603
  # Memcached - Distributed memory caching system
1971
1604
  # Docs: https://memcached.org/
1972
1605
  # Connection: localhost:11211
@@ -1976,7 +1609,7 @@ volumes:
1976
1609
  restart: "on-failure"
1977
1610
  ports:
1978
1611
  - "11211:11211"
1979
- `;var ca=`services:
1612
+ `;var da=`services:
1980
1613
  # MinIO - S3-compatible object storage
1981
1614
  # Docs: https://min.io/docs/minio/container/index.html
1982
1615
  # API: http://localhost:9000
@@ -1997,7 +1630,7 @@ volumes:
1997
1630
 
1998
1631
  volumes:
1999
1632
  minio_data:
2000
- `;var pa=`services:
1633
+ `;var ma=`services:
2001
1634
  # MongoDB - NoSQL document database
2002
1635
  # Docs: https://www.mongodb.com/docs/
2003
1636
  # Connection: mongodb://ooneex:ooneex@localhost:27017/ooneex
@@ -2016,7 +1649,7 @@ volumes:
2016
1649
 
2017
1650
  volumes:
2018
1651
  mongodb_data:
2019
- `;var ua=`services:
1652
+ `;var ca=`services:
2020
1653
  # MySQL - Alternative relational database
2021
1654
  # Docs: https://dev.mysql.com/doc/
2022
1655
  # Connection: mysql://ooneex:ooneex@localhost:3306/ooneex
@@ -2036,7 +1669,7 @@ volumes:
2036
1669
 
2037
1670
  volumes:
2038
1671
  mysql_db:
2039
- `;var ha=`services:
1672
+ `;var pa=`services:
2040
1673
  # NATS - High-performance messaging system with JetStream
2041
1674
  # Docs: https://docs.nats.io/
2042
1675
  # Client: localhost:4222
@@ -2049,7 +1682,7 @@ volumes:
2049
1682
  - "4222:4222"
2050
1683
  - "8222:8222"
2051
1684
  command: "--jetstream --http_port 8222"
2052
- `;var fa=`services:
1685
+ `;var ua=`services:
2053
1686
  # Jade - FastAPI REST API to fetch YouTube metadata and download videos or audio via Dockerized microservice.
2054
1687
  # API: http://localhost:8000
2055
1688
  # Docs: http://localhost:8000/docs
@@ -2067,7 +1700,7 @@ volumes:
2067
1700
 
2068
1701
  volumes:
2069
1702
  jade_data:
2070
- `;var ga=`services:
1703
+ `;var ha=`services:
2071
1704
  # PostgreSQL - Primary relational database
2072
1705
  # Docs: https://www.postgresql.org/docs/
2073
1706
  # Connection: postgresql://ooneex:ooneex@localhost:5432/ooneex
@@ -2088,7 +1721,7 @@ volumes:
2088
1721
 
2089
1722
  volumes:
2090
1723
  postgres_db:
2091
- `;var ya=`services:
1724
+ `;var fa=`services:
2092
1725
  # Prometheus - Metrics collection and monitoring
2093
1726
  # Docs: https://prometheus.io/docs/
2094
1727
  # Web UI: http://localhost:9090
@@ -2103,7 +1736,7 @@ volumes:
2103
1736
 
2104
1737
  volumes:
2105
1738
  prometheus_data:
2106
- `;var ba=`services:
1739
+ `;var ya=`services:
2107
1740
  # RabbitMQ - Message broker for async processing
2108
1741
  # Docs: https://www.rabbitmq.com/docs
2109
1742
  # AMQP: amqp://ooneex:ooneex@localhost:5672/ooneex
@@ -2125,7 +1758,7 @@ volumes:
2125
1758
 
2126
1759
  volumes:
2127
1760
  rabbitmq_data:
2128
- `;var xa=`services:
1761
+ `;var ga=`services:
2129
1762
  # Redis - In-memory data store for caching and sessions
2130
1763
  # Docs: https://redis.io/docs/
2131
1764
  # Connection: redis://localhost:6379
@@ -2140,7 +1773,7 @@ volumes:
2140
1773
 
2141
1774
  volumes:
2142
1775
  redis_data:
2143
- `;var wa=`services:
1776
+ `;var ba=`services:
2144
1777
  # Temporal - Workflow orchestration engine
2145
1778
  # Docs: https://docs.temporal.io/
2146
1779
  # gRPC: localhost:7233
@@ -2157,7 +1790,7 @@ volumes:
2157
1790
  - POSTGRES_USER=ooneex
2158
1791
  - POSTGRES_PWD=ooneex
2159
1792
  - POSTGRES_SEEDS=postgres
2160
- `;var Ea=`services:
1793
+ `;var wa=`services:
2161
1794
  # Vault - Secrets management and encryption
2162
1795
  # Docs: https://developer.hashicorp.com/vault/docs
2163
1796
  # Web UI: http://localhost:8200 (token: ooneex)
@@ -2172,20 +1805,20 @@ volumes:
2172
1805
  - VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:8200
2173
1806
  cap_add:
2174
1807
  - IPC_LOCK
2175
- `;var Aa={clickhouse:ra,elasticsearch:oa,grafana:aa,"ooneex-jade":fa,jaeger:ia,keycloak:na,libretranslate:la,maildev:da,memcached:ma,minio:ca,mongodb:pa,mysql:ua,nats:ha,postgres:ga,prometheus:ya,rabbitmq:ba,redis:xa,temporal:wa,vault:Ea};function fm(e){let t=e.split(`
2176
- `),s=[],r=!1;for(let o of t){if(o.startsWith("services:")){r=!0;continue}if(r){if(o.startsWith("volumes:")||o.startsWith("networks:"))break;s.push(o)}}return s.join(`
2177
- `)}function gm(e){let t=va.parse(e);return t.volumes?Object.keys(t.volumes):[]}class ke{getName(){return"make:docker"}getDescription(){return"Add a docker service to docker-compose.yml"}async run(e){let{name:t}=e;if(!t)t=await sa({message:"Select docker service"});let s=Aa[t],r=Na(process.cwd(),"docker-compose.yml"),o=new hm,a=Bun.file(r);if(await a.exists()){let l=await a.text(),d=va.parse(l);if(d.services&&t in d.services){o.warn(`Service "${t}" already exists in docker-compose.yml`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0});return}let u=fm(s),c=gm(s),p=l,m=p.indexOf(`
1808
+ `;var xa={clickhouse:ta,elasticsearch:sa,grafana:oa,"ooneex-jade":ua,jaeger:ra,keycloak:aa,libretranslate:ia,maildev:na,memcached:la,minio:da,mongodb:ma,mysql:ca,nats:pa,postgres:ha,prometheus:fa,rabbitmq:ya,redis:ga,temporal:ba,vault:wa};function um(e){let t=e.split(`
1809
+ `),s=[],o=!1;for(let r of t){if(r.startsWith("services:")){o=!0;continue}if(o){if(r.startsWith("volumes:")||r.startsWith("networks:"))break;s.push(r)}}return s.join(`
1810
+ `)}function hm(e){let t=Aa.parse(e);return t.volumes?Object.keys(t.volumes):[]}class qe{getName(){return"make:docker"}getDescription(){return"Add a docker service to docker-compose.yml"}async run(e){let{name:t}=e;if(!t)t=await ea({message:"Select docker service"});let s=xa[t],o=Ea(process.cwd(),"docker-compose.yml"),r=new pm,a=Bun.file(o);if(await a.exists()){let l=await a.text(),d=Aa.parse(l);if(d.services&&t in d.services){r.warn(`Service "${t}" already exists in docker-compose.yml`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0});return}let m=um(s),u=hm(s),p=l,c=p.indexOf(`
2178
1811
  volumes:`),h=p.indexOf(`
2179
- networks:`),f=-1;if(m!==-1&&h!==-1)f=Math.min(m,h);else if(m!==-1)f=m;else if(h!==-1)f=h;if(f!==-1)p=`${p.slice(0,f)}
2180
- ${u}${p.slice(f)}`;else p=`${p.trimEnd()}
2181
- ${u}`;for(let w of c)if(!p.includes(` ${w}:`))if(p.includes(`
2182
- volumes:`)){let g=p.indexOf(`
2183
- volumes:`),E=p.slice(g+9);p=`${p.slice(0,g+9)}
2184
- ${w}:${E}`}else p=`${p.trimEnd()}
1812
+ networks:`),f=-1;if(c!==-1&&h!==-1)f=Math.min(c,h);else if(c!==-1)f=c;else if(h!==-1)f=h;if(f!==-1)p=`${p.slice(0,f)}
1813
+ ${m}${p.slice(f)}`;else p=`${p.trimEnd()}
1814
+ ${m}`;for(let E of u)if(!p.includes(` ${E}:`))if(p.includes(`
1815
+ volumes:`)){let y=p.indexOf(`
1816
+ volumes:`),x=p.slice(y+9);p=`${p.slice(0,y+9)}
1817
+ ${E}:${x}`}else p=`${p.trimEnd()}
2185
1818
 
2186
1819
  volumes:
2187
- ${w}:
2188
- `;await Bun.write(r,p)}else await Bun.write(r,s);let i=Na(process.cwd(),"package.json"),n=Bun.file(i);if(await n.exists()){let l=await n.json();l.scripts=l.scripts||{},l.scripts.docker="docker compose up -d",await Bun.write(i,JSON.stringify(l,null,2))}o.success(`Service "${t}" added to docker-compose.yml`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),o.info("Run 'bun run docker' to start docker containers",void 0,{showTimestamp:!1,showArrow:!0,showLevel:!1})}}ke=y([b.command()],ke);var Ca=te(Ta(),1);import{basename as xm,join as $}from"path";import{TerminalLogger as wm}from"@ooneex/logger";import{toPascalCase as Ra,toSnakeCase as Em}from"@ooneex/utils";var Sa=`import { describe, expect, test } from "bun:test";
1820
+ ${E}:
1821
+ `;await Bun.write(o,p)}else await Bun.write(o,s);let i=Ea(process.cwd(),"package.json"),n=Bun.file(i);if(await n.exists()){let l=await n.json();l.scripts=l.scripts||{},l.scripts.docker="docker compose up -d",await Bun.write(i,JSON.stringify(l,null,2))}r.success(`Service "${t}" added to docker-compose.yml`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),r.info("Run 'bun run docker' to start docker containers",void 0,{showTimestamp:!1,showArrow:!0,showLevel:!1})}}qe=g([b.command()],qe);var Ca=te(va(),1);import{basename as gm,join as $}from"path";import{TerminalLogger as bm}from"@ooneex/logger";import{toPascalCase as Sa,toSnakeCase as wm}from"@ooneex/utils";var Na=`import { describe, expect, test } from "bun:test";
2189
1822
  import { {{NAME}}Entity } from "@/entities/{{NAME}}Entity";
2190
1823
 
2191
1824
  describe("{{NAME}}Entity", () => {
@@ -2250,7 +1883,7 @@ describe("{{NAME}}Entity", () => {
2250
1883
  expect("deletedAt" in entity).toBe(true);
2251
1884
  });
2252
1885
  });
2253
- `;var Ma=`import type { LocaleType } from "@ooneex/translation";
1886
+ `;var Ta=`import type { LocaleType } from "@ooneex/translation";
2254
1887
  import { random } from "@ooneex/utils";
2255
1888
  import { Column, CreateDateColumn, DeleteDateColumn, PrimaryColumn, UpdateDateColumn } from "typeorm";
2256
1889
 
@@ -2301,9 +1934,9 @@ export class {{NAME}}Entity extends BaseEntity {
2301
1934
  @DeleteDateColumn({ name: "deleted_at" })
2302
1935
  deletedAt?: Date;
2303
1936
  }
2304
- `;class Ke{getName(){return"make:entity"}getDescription(){return"Generate a new entity class"}async addToModule(e,t){let s=await Bun.file(e).text(),r=`${t}Entity`,o=`import { ${r} } from "./entities/${r}";
1937
+ `;class Ke{getName(){return"make:entity"}getDescription(){return"Generate a new entity class"}async addToModule(e,t){let s=await Bun.file(e).text(),o=`${t}Entity`,r=`import { ${o} } from "./entities/${o}";
2305
1938
  `,a=s.lastIndexOf("import "),i=s.indexOf(`
2306
- `,a);s=`${s.slice(0,i+1)}${o}${s.slice(i+1)}`;let n=/(entities:\s*\[)([^\]]*)/s,l=s.match(n);if(l){let d=l[2]?.trim(),u=d?`${d}, ${r}`:r;s=s.replace(n,`$1${u}`)}await Bun.write(e,s)}async run(e){let{name:t,module:s,tableName:r}=e;if(!t)t=await N({message:"Enter entity name"});if(t=Ra(t).replace(/Entity$/,""),!r)r=Em(Ca.default(t));let o=Ma.replace(/{{NAME}}/g,t).replace(/{{TABLE_NAME}}/g,r),a=s?$("modules",s):".",i=$(a,"src","entities"),n=$(process.cwd(),i),l=$(n,`${t}Entity.ts`);await Bun.write(l,o);let d=Sa.replace(/{{NAME}}/g,t),u=$(a,"tests","entities"),c=$(process.cwd(),u),p=$(c,`${t}Entity.spec.ts`);await Bun.write(p,d);let m=Ra(xm(process.cwd())),h=$(process.cwd(),"src",`${m}Module.ts`);if(await Bun.file(h).exists())await this.addToModule(h,t);let f=new wm;f.success(`${$(i,t)}Entity.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),f.success(`${$(u,t)}Entity.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}Ke=y([b.command()],Ke);import{join as z}from"path";import{TerminalLogger as vm}from"@ooneex/logger";import{toPascalCase as Tm}from"@ooneex/utils";var _a=`import { describe, expect, test } from "bun:test";
1939
+ `,a);s=`${s.slice(0,i+1)}${r}${s.slice(i+1)}`;let n=/(entities:\s*\[)([^\]]*)/s,l=s.match(n);if(l){let d=l[2]?.trim(),m=d?`${d}, ${o}`:o;s=s.replace(n,`$1${m}`)}await Bun.write(e,s)}async run(e){let{name:t,module:s,tableName:o}=e;if(!t)t=await v({message:"Enter entity name"});if(t=Sa(t).replace(/Entity$/,""),!o)o=wm(Ca.default(t));let r=Ta.replace(/{{NAME}}/g,t).replace(/{{TABLE_NAME}}/g,o),a=s?$("modules",s):".",i=$(a,"src","entities"),n=$(process.cwd(),i),l=$(n,`${t}Entity.ts`);await Bun.write(l,r);let d=Na.replace(/{{NAME}}/g,t),m=$(a,"tests","entities"),u=$(process.cwd(),m),p=$(u,`${t}Entity.spec.ts`);await Bun.write(p,d);let c=Sa(gm(process.cwd())),h=$(process.cwd(),"src",`${c}Module.ts`);if(await Bun.file(h).exists())await this.addToModule(h,t);let f=new bm;f.success(`${$(i,t)}Entity.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),f.success(`${$(m,t)}Entity.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}Ke=g([b.command()],Ke);import{join as z}from"path";import{TerminalLogger as Am}from"@ooneex/logger";import{toPascalCase as vm}from"@ooneex/utils";var Ma=`import { describe, expect, test } from "bun:test";
2307
1940
  import { {{NAME}}Logger } from "@/loggers/{{NAME}}Logger";
2308
1941
 
2309
1942
  describe("{{NAME}}Logger", () => {
@@ -2346,7 +1979,7 @@ describe("{{NAME}}Logger", () => {
2346
1979
  expect(typeof {{NAME}}Logger.prototype.error).toBe("function");
2347
1980
  });
2348
1981
  });
2349
- `;var Da=`import type { IException } from "@ooneex/exception";
1982
+ `;var Ra=`import type { IException } from "@ooneex/exception";
2350
1983
  import type { ILogger } from "@ooneex/logger";
2351
1984
  import type { ScalarType } from "@ooneex/types";
2352
1985
  import { decorator } from "@ooneex/logger";
@@ -2381,7 +2014,7 @@ export class {{NAME}}Logger implements ILogger {
2381
2014
  // Handle error logging
2382
2015
  }
2383
2016
  }
2384
- `;class He{getName(){return"make:logger"}getDescription(){return"Generate a new logger class"}async run(e){let{name:t,module:s}=e;if(!t)t=await N({message:"Enter logger name"});t=Tm(t).replace(/Logger$/,"");let r=Da.replace(/{{NAME}}/g,t),o=s?z("modules",s):".",a=z(o,"src","loggers"),i=z(process.cwd(),a),n=z(i,`${t}Logger.ts`);await Bun.write(n,r);let l=_a.replace(/{{NAME}}/g,t),d=z(o,"tests","loggers"),u=z(process.cwd(),d),c=z(u,`${t}Logger.spec.ts`);await Bun.write(c,l);let p=new vm;p.success(`${z(a,t)}Logger.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),p.success(`${z(d,t)}Logger.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}He=y([b.command()],He);import{join as B}from"path";import{TerminalLogger as _m}from"@ooneex/logger";import{toPascalCase as Dm}from"@ooneex/utils";var Pa=`import { describe, expect, test } from "bun:test";
2017
+ `;class He{getName(){return"make:logger"}getDescription(){return"Generate a new logger class"}async run(e){let{name:t,module:s}=e;if(!t)t=await v({message:"Enter logger name"});t=vm(t).replace(/Logger$/,"");let o=Ra.replace(/{{NAME}}/g,t),r=s?z("modules",s):".",a=z(r,"src","loggers"),i=z(process.cwd(),a),n=z(i,`${t}Logger.ts`);await Bun.write(n,o);let l=Ma.replace(/{{NAME}}/g,t),d=z(r,"tests","loggers"),m=z(process.cwd(),d),u=z(m,`${t}Logger.spec.ts`);await Bun.write(u,l);let p=new Am;p.success(`${z(a,t)}Logger.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),p.success(`${z(d,t)}Logger.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}He=g([b.command()],He);import{join as P}from"path";import{TerminalLogger as Mm}from"@ooneex/logger";import{toPascalCase as Rm}from"@ooneex/utils";var _a=`import { describe, expect, test } from "bun:test";
2385
2018
  import { {{NAME}}Mailer } from "@/mailers/{{NAME}}Mailer";
2386
2019
 
2387
2020
  describe("{{NAME}}Mailer", () => {
@@ -2394,7 +2027,7 @@ describe("{{NAME}}Mailer", () => {
2394
2027
  expect(typeof {{NAME}}Mailer.prototype.send).toBe("function");
2395
2028
  });
2396
2029
  });
2397
- `;var Oa=`import { inject } from "@ooneex/container";
2030
+ `;var Da=`import { inject } from "@ooneex/container";
2398
2031
  import type { IMailer } from "@ooneex/mailer";
2399
2032
  import { type {{NAME}}MailerPropsType, {{NAME}}MailerTemplate } from "./{{NAME}}MailerTemplate";
2400
2033
 
@@ -2418,7 +2051,7 @@ export class {{NAME}}Mailer implements IMailer {
2418
2051
  });
2419
2052
  }
2420
2053
  }
2421
- `;var Ba=`import { describe, expect, test } from "bun:test";
2054
+ `;var Ia=`import { describe, expect, test } from "bun:test";
2422
2055
  import { {{NAME}}MailerTemplate } from "@/mailers/{{NAME}}MailerTemplate";
2423
2056
 
2424
2057
  describe("{{NAME}}MailerTemplate", () => {
@@ -2430,7 +2063,7 @@ describe("{{NAME}}MailerTemplate", () => {
2430
2063
  expect(typeof {{NAME}}MailerTemplate).toBe("function");
2431
2064
  });
2432
2065
  });
2433
- `;var Ia=`import { MailerLayout } from "@ooneex/mailer";
2066
+ `;var Pa=`import { MailerLayout } from "@ooneex/mailer";
2434
2067
 
2435
2068
  export type {{NAME}}MailerPropsType = {
2436
2069
  link: string;
@@ -2445,7 +2078,7 @@ export const {{NAME}}MailerTemplate = (props?: {{NAME}}MailerPropsType) => (
2445
2078
  <MailerLayout.Footer />
2446
2079
  </MailerLayout>
2447
2080
  );
2448
- `;class Ve{getName(){return"make:mailer"}getDescription(){return"Generate a new mailer class"}async run(e){let{name:t,module:s}=e;if(!t)t=await N({message:"Enter mailer name"});t=Dm(t).replace(/Mailer$/,"");let r=Oa.replace(/{{NAME}}/g,t),o=Ia.replace(/{{NAME}}/g,t),a=s?B("modules",s):".",i=B(a,"src","mailers"),n=B(process.cwd(),i),l=B(n,`${t}Mailer.ts`),d=B(n,`${t}MailerTemplate.tsx`);await Bun.write(l,r),await Bun.write(d,o);let u=Pa.replace(/{{NAME}}/g,t),c=Ba.replace(/{{NAME}}/g,t),p=B(a,"tests","mailers"),m=B(process.cwd(),p),h=B(m,`${t}Mailer.spec.ts`),f=B(m,`${t}MailerTemplate.spec.ts`);await Bun.write(h,u),await Bun.write(f,c);let w=new _m;w.success(`${B(i,t)}Mailer.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),w.success(`${B(i,t)}MailerTemplate.tsx created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),w.success(`${B(p,t)}Mailer.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),w.success(`${B(p,t)}MailerTemplate.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}Ve=y([b.command()],Ve);import{basename as Im,join as W}from"path";import{TerminalLogger as Lm}from"@ooneex/logger";import{toPascalCase as $a}from"@ooneex/utils";var La=`import type { ContextType } from "@ooneex/socket";
2081
+ `;class Fe{getName(){return"make:mailer"}getDescription(){return"Generate a new mailer class"}async run(e){let{name:t,module:s}=e;if(!t)t=await v({message:"Enter mailer name"});t=Rm(t).replace(/Mailer$/,"");let o=Da.replace(/{{NAME}}/g,t),r=Pa.replace(/{{NAME}}/g,t),a=s?P("modules",s):".",i=P(a,"src","mailers"),n=P(process.cwd(),i),l=P(n,`${t}Mailer.ts`),d=P(n,`${t}MailerTemplate.tsx`);await Bun.write(l,o),await Bun.write(d,r);let m=_a.replace(/{{NAME}}/g,t),u=Ia.replace(/{{NAME}}/g,t),p=P(a,"tests","mailers"),c=P(process.cwd(),p),h=P(c,`${t}Mailer.spec.ts`),f=P(c,`${t}MailerTemplate.spec.ts`);await Bun.write(h,m),await Bun.write(f,u);let E=new Mm;E.success(`${P(i,t)}Mailer.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),E.success(`${P(i,t)}MailerTemplate.tsx created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),E.success(`${P(p,t)}Mailer.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),E.success(`${P(p,t)}MailerTemplate.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}Fe=g([b.command()],Fe);import{basename as Pm,join as k}from"path";import{TerminalLogger as Om}from"@ooneex/logger";import{toPascalCase as Ua}from"@ooneex/utils";var Oa=`import type { ContextType } from "@ooneex/socket";
2449
2082
  import { decorator, type IMiddleware } from "@ooneex/middleware";
2450
2083
 
2451
2084
  @decorator.middleware()
@@ -2457,7 +2090,7 @@ export class {{NAME}}Middleware implements IMiddleware {
2457
2090
  return context
2458
2091
  }
2459
2092
  }
2460
- `;var Ua=`import { describe, expect, test } from "bun:test";
2093
+ `;var Ba=`import { describe, expect, test } from "bun:test";
2461
2094
  import { {{NAME}}Middleware } from "@/middlewares/{{NAME}}Middleware";
2462
2095
 
2463
2096
  describe("{{NAME}}Middleware", () => {
@@ -2470,7 +2103,7 @@ describe("{{NAME}}Middleware", () => {
2470
2103
  expect(typeof {{NAME}}Middleware.prototype.handler).toBe("function");
2471
2104
  });
2472
2105
  });
2473
- `;var Ga=`import type { ContextType } from "@ooneex/controller";
2106
+ `;var La=`import type { ContextType } from "@ooneex/controller";
2474
2107
  import { decorator, type IMiddleware } from "@ooneex/middleware";
2475
2108
 
2476
2109
  @decorator.middleware()
@@ -2482,9 +2115,18 @@ export class {{NAME}}Middleware implements IMiddleware {
2482
2115
  return context
2483
2116
  }
2484
2117
  }
2485
- `;class Ye{getName(){return"make:middleware"}getDescription(){return"Generate a new middleware class"}async addToModule(e,t){let s=await Bun.file(e).text(),r=`${t}Middleware`,o=`import { ${r} } from "./middlewares/${r}";
2118
+ `;class Ve{getName(){return"make:middleware"}getDescription(){return"Generate a new middleware class"}async addToModule(e,t){let s=await Bun.file(e).text(),o=`${t}Middleware`,r=`import { ${o} } from "./middlewares/${o}";
2486
2119
  `,a=s.lastIndexOf("import "),i=s.indexOf(`
2487
- `,a);s=`${s.slice(0,i+1)}${o}${s.slice(i+1)}`;let n=/(middlewares:\s*\[)([^\]]*)/s,l=s.match(n);if(l){let d=l[2]?.trim(),u=d?`${d}, ${r}`:r;s=s.replace(n,`$1${u}`)}await Bun.write(e,s)}async run(e){let{name:t,module:s,isSocket:r}=e;if(!t)t=await N({message:"Enter middleware name"});if(r===void 0)r=await Ge({message:"Is this a socket middleware?"});t=$a(t).replace(/Middleware$/,"");let a=(r?La:Ga).replace(/{{NAME}}/g,t),i=s?W("modules",s):".",n=W(i,"src","middlewares"),l=W(process.cwd(),n),d=W(l,`${t}Middleware.ts`);await Bun.write(d,a);let u=Ua.replace(/{{NAME}}/g,t),c=W(i,"tests","middlewares"),p=W(process.cwd(),c),m=W(p,`${t}Middleware.spec.ts`);await Bun.write(m,u);let h=$a(Im(process.cwd())),f=W(process.cwd(),"src",`${h}Module.ts`);if(await Bun.file(f).exists())await this.addToModule(f,t);let w=new Lm;w.success(`${W(n,t)}Middleware.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),w.success(`${W(c,t)}Middleware.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}Ye=y([b.command()],Ye);import{join as Ot}from"path";import{TerminalLogger as Um}from"@ooneex/logger";import{migrationCreate as Gm}from"@ooneex/migrations";class Fe{getName(){return"make:migration"}getDescription(){return"Generate a new migration file"}async run(e){let{module:t}=e,s=t?Ot("modules",t):".";await Gm({dir:Ot(s,"src/migrations")});let r=Ot(process.cwd(),"package.json"),o=Bun.file(r);if(await o.exists()){let i=await o.json();i.scripts=i.scripts||{},i.scripts["migration:up"]="bun ./bin/migration/up.ts",await Bun.write(r,JSON.stringify(i,null,2))}let a=new Um;a.success("Migration file created successfully",void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),a.info("Run 'bun run migration:up' to execute migrations",void 0,{showTimestamp:!1,showArrow:!0,showLevel:!1})}}Fe=y([b.command()],Fe);import{basename as qm,join as q}from"path";import{TerminalLogger as km}from"@ooneex/logger";import{toPascalCase as ka}from"@ooneex/utils";var Wa=`import { describe, expect, test } from "bun:test";
2120
+ `,a);s=`${s.slice(0,i+1)}${r}${s.slice(i+1)}`;let n=/(middlewares:\s*\[)([^\]]*)/s,l=s.match(n);if(l){let d=l[2]?.trim(),m=d?`${d}, ${o}`:o;s=s.replace(n,`$1${m}`)}await Bun.write(e,s)}async run(e){let{name:t,module:s,isSocket:o}=e;if(!t)t=await v({message:"Enter middleware name"});if(o===void 0)o=await Ge({message:"Is this a socket middleware?"});t=Ua(t).replace(/Middleware$/,"");let a=(o?Oa:La).replace(/{{NAME}}/g,t),i=s?k("modules",s):".",n=k(i,"src","middlewares"),l=k(process.cwd(),n),d=k(l,`${t}Middleware.ts`);await Bun.write(d,a);let m=Ba.replace(/{{NAME}}/g,t),u=k(i,"tests","middlewares"),p=k(process.cwd(),u),c=k(p,`${t}Middleware.spec.ts`);await Bun.write(c,m);let h=Ua(Pm(process.cwd())),f=k(process.cwd(),"src",`${h}Module.ts`);if(await Bun.file(f).exists())await this.addToModule(f,t);let E=new Om;E.success(`${k(n,t)}Middleware.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),E.success(`${k(u,t)}Middleware.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}Ve=g([b.command()],Ve);import{join as Ye}from"path";import{TerminalLogger as Lm}from"@ooneex/logger";import{migrationCreate as Um}from"@ooneex/migrations";var Ga=`#!/usr/bin/env bun
2121
+
2122
+ import { migrationUp } from "@ooneex/migrations";
2123
+ import "@/migrations/migrations";
2124
+
2125
+ await migrationUp({
2126
+ databaseUrl: Bun.env.DATABASE_URL || ":memory:",
2127
+ tableName: "migrations",
2128
+ });
2129
+ `;class je{getName(){return"make:migration"}getDescription(){return"Generate a new migration file"}async run(e){let{module:t}=e,s=t?Ye("modules",t):".",o=await Um({dir:Ye(s,"src/migrations")}),r=Ye(process.cwd(),s,"bin","migration","up.ts");if(!await Bun.file(r).exists())await Bun.write(r,Ga);let i=Ye(process.cwd(),"package.json"),n=Bun.file(i);if(await n.exists()){let d=await n.json();d.scripts=d.scripts||{},d.scripts["migration:up"]="bun ./bin/migration/up.ts",await Bun.write(i,JSON.stringify(d,null,2))}let l=new Lm;l.success(`${o} created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),l.info("Run 'bun run migration:up' to execute migrations",void 0,{showTimestamp:!1,showArrow:!0,showLevel:!1})}}je=g([b.command()],je);import{basename as km,join as W}from"path";import{TerminalLogger as Wm}from"@ooneex/logger";import{toPascalCase as Wa}from"@ooneex/utils";var $a=`import { describe, expect, test } from "bun:test";
2488
2130
  import { Permission } from "@ooneex/permission";
2489
2131
  import { {{NAME}}Permission } from "@/permissions/{{NAME}}Permission";
2490
2132
 
@@ -2509,7 +2151,7 @@ describe("{{NAME}}Permission", () => {
2509
2151
  });
2510
2152
 
2511
2153
  });
2512
- `;var qa=`import { decorator, Permission } from "@ooneex/permission";
2154
+ `;var ka=`import { decorator, Permission } from "@ooneex/permission";
2513
2155
  import type { IUser } from "@ooneex/user";
2514
2156
 
2515
2157
  @decorator.permission()
@@ -2548,9 +2190,9 @@ export class {{NAME}}Permission extends Permission {
2548
2190
  return this;
2549
2191
  }
2550
2192
  }
2551
- `;class je{getName(){return"make:permission"}getDescription(){return"Generate a new permission class"}async addToModule(e,t){let s=await Bun.file(e).text(),r=`${t}Permission`,o=`import { ${r} } from "./permissions/${r}";
2193
+ `;class ze{getName(){return"make:permission"}getDescription(){return"Generate a new permission class"}async addToModule(e,t){let s=await Bun.file(e).text(),o=`${t}Permission`,r=`import { ${o} } from "./permissions/${o}";
2552
2194
  `,a=s.lastIndexOf("import "),i=s.indexOf(`
2553
- `,a);s=`${s.slice(0,i+1)}${o}${s.slice(i+1)}`;let n=/(permissions:\s*\[)([^\]]*)/s,l=s.match(n);if(l){let d=l[2]?.trim(),u=d?`${d}, ${r}`:r;s=s.replace(n,`$1${u}`)}await Bun.write(e,s)}async run(e){let{name:t,module:s}=e;if(!t)t=await N({message:"Enter permission name"});t=ka(t).replace(/Permission$/,"");let r=qa.replace(/{{NAME}}/g,t),o=s?q("modules",s):".",a=q(o,"src","permissions"),i=q(process.cwd(),a),n=q(i,`${t}Permission.ts`);await Bun.write(n,r);let l=Wa.replace(/{{NAME}}/g,t),d=q(o,"tests","permissions"),u=q(process.cwd(),d),c=q(u,`${t}Permission.spec.ts`);await Bun.write(c,l);let p=ka(qm(process.cwd())),m=q(process.cwd(),"src",`${p}Module.ts`);if(await Bun.file(m).exists())await this.addToModule(m,t);let h=new km;h.success(`${q(a,t)}Permission.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),h.success(`${q(d,t)}Permission.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}je=y([b.command()],je);import{basename as Vm,join as k}from"path";import{TerminalLogger as Ym}from"@ooneex/logger";import{toKebabCase as Fm,toPascalCase as Va}from"@ooneex/utils";var Ka=`import { describe, expect, test } from "bun:test";
2195
+ `,a);s=`${s.slice(0,i+1)}${r}${s.slice(i+1)}`;let n=/(permissions:\s*\[)([^\]]*)/s,l=s.match(n);if(l){let d=l[2]?.trim(),m=d?`${d}, ${o}`:o;s=s.replace(n,`$1${m}`)}await Bun.write(e,s)}async run(e){let{name:t,module:s}=e;if(!t)t=await v({message:"Enter permission name"});t=Wa(t).replace(/Permission$/,"");let o=ka.replace(/{{NAME}}/g,t),r=s?W("modules",s):".",a=W(r,"src","permissions"),i=W(process.cwd(),a),n=W(i,`${t}Permission.ts`);await Bun.write(n,o);let l=$a.replace(/{{NAME}}/g,t),d=W(r,"tests","permissions"),m=W(process.cwd(),d),u=W(m,`${t}Permission.spec.ts`);await Bun.write(u,l);let p=Wa(km(process.cwd())),c=W(process.cwd(),"src",`${p}Module.ts`);if(await Bun.file(c).exists())await this.addToModule(c,t);let h=new Wm;h.success(`${W(a,t)}Permission.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),h.success(`${W(d,t)}Permission.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}ze=g([b.command()],ze);import{basename as Hm,join as q}from"path";import{TerminalLogger as Fm}from"@ooneex/logger";import{toKebabCase as Vm,toPascalCase as Ha}from"@ooneex/utils";var qa=`import { describe, expect, test } from "bun:test";
2554
2196
  import { {{NAME}}PubSub } from "@/pubsub/{{NAME}}PubSub";
2555
2197
 
2556
2198
  describe("{{NAME}}PubSub", () => {
@@ -2588,7 +2230,7 @@ describe("{{NAME}}PubSub", () => {
2588
2230
  expect(typeof {{NAME}}PubSub.prototype.unsubscribeAll).toBe("function");
2589
2231
  });
2590
2232
  });
2591
- `;var Ha=`import { inject } from "@ooneex/container";
2233
+ `;var Ka=`import { inject } from "@ooneex/container";
2592
2234
  import type { ScalarType } from "@ooneex/types";
2593
2235
  import { decorator, PubSub, RedisPubSub } from "@ooneex/pub-sub";
2594
2236
 
@@ -2610,9 +2252,9 @@ export class {{NAME}}Event<Data extends Record<string, ScalarType> = Record<stri
2610
2252
  // TODO: Implement handler logic here
2611
2253
  }
2612
2254
  }
2613
- `;class ze{getName(){return"make:pubsub"}getDescription(){return"Generate a new PubSub event class"}async addToModule(e,t){let s=await Bun.file(e).text(),r=`${t}Event`,o=`import { ${r} } from "./events/${r}";
2255
+ `;class Ze{getName(){return"make:pubsub"}getDescription(){return"Generate a new PubSub event class"}async addToModule(e,t){let s=await Bun.file(e).text(),o=`${t}Event`,r=`import { ${o} } from "./events/${o}";
2614
2256
  `,a=s.lastIndexOf("import "),i=s.indexOf(`
2615
- `,a);s=`${s.slice(0,i+1)}${o}${s.slice(i+1)}`;let n=/(events:\s*\[)([^\]]*)/s,l=s.match(n);if(l){let d=l[2]?.trim(),u=d?`${d}, ${r}`:r;s=s.replace(n,`$1${u}`)}await Bun.write(e,s)}async run(e){let{name:t,module:s,channel:r}=e;if(!t)t=await N({message:"Enter name"});if(t=Va(t).replace(/PubSub$/,""),!r)r=Fm(t);let o=Ha.replace(/{{NAME}}/g,t).replace(/{{CHANNEL}}/g,r),a=s?k("modules",s):".",i=k(a,"src","events"),n=k(process.cwd(),i),l=k(n,`${t}Event.ts`);await Bun.write(l,o);let d=Ka.replace(/{{NAME}}/g,t),u=k(a,"tests","events"),c=k(process.cwd(),u),p=k(c,`${t}Event.spec.ts`);await Bun.write(p,d);let m=Va(Vm(process.cwd())),h=k(process.cwd(),"src",`${m}Module.ts`);if(await Bun.file(h).exists())await this.addToModule(h,t);let f=new Ym;f.success(`${k(i,t)}Event.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),f.success(`${k(u,t)}Event.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}ze=y([b.command()],ze);import{join as Z}from"path";import{TerminalLogger as Zm}from"@ooneex/logger";import{toPascalCase as Qm}from"@ooneex/utils";var Ya=`import { describe, expect, test } from "bun:test";
2257
+ `,a);s=`${s.slice(0,i+1)}${r}${s.slice(i+1)}`;let n=/(events:\s*\[)([^\]]*)/s,l=s.match(n);if(l){let d=l[2]?.trim(),m=d?`${d}, ${o}`:o;s=s.replace(n,`$1${m}`)}await Bun.write(e,s)}async run(e){let{name:t,module:s,channel:o}=e;if(!t)t=await v({message:"Enter name"});if(t=Ha(t).replace(/PubSub$/,""),!o)o=Vm(t);let r=Ka.replace(/{{NAME}}/g,t).replace(/{{CHANNEL}}/g,o),a=s?q("modules",s):".",i=q(a,"src","events"),n=q(process.cwd(),i),l=q(n,`${t}Event.ts`);await Bun.write(l,r);let d=qa.replace(/{{NAME}}/g,t),m=q(a,"tests","events"),u=q(process.cwd(),m),p=q(u,`${t}Event.spec.ts`);await Bun.write(p,d);let c=Ha(Hm(process.cwd())),h=q(process.cwd(),"src",`${c}Module.ts`);if(await Bun.file(h).exists())await this.addToModule(h,t);let f=new Fm;f.success(`${q(i,t)}Event.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),f.success(`${q(m,t)}Event.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}Ze=g([b.command()],Ze);import{join as Z}from"path";import{TerminalLogger as zm}from"@ooneex/logger";import{toPascalCase as Zm}from"@ooneex/utils";var Fa=`import { describe, expect, test } from "bun:test";
2616
2258
  import { {{NAME}}Repository } from "@/repositories/{{NAME}}Repository";
2617
2259
 
2618
2260
  describe("{{NAME}}Repository", () => {
@@ -2675,7 +2317,7 @@ describe("{{NAME}}Repository", () => {
2675
2317
  expect(typeof {{NAME}}Repository.prototype.count).toBe("function");
2676
2318
  });
2677
2319
  });
2678
- `;var Fa=`import { inject } from "@ooneex/container";
2320
+ `;var Va=`import { inject } from "@ooneex/container";
2679
2321
  import type { ITypeormDatabase } from "@ooneex/database";
2680
2322
  import { decorator } from "@ooneex/repository";
2681
2323
  import type { FilterResultType } from "@ooneex/types";
@@ -2797,7 +2439,13 @@ export class {{NAME}}Repository {
2797
2439
  return await repository.count(criteria ? { where: criteria } : {});
2798
2440
  }
2799
2441
  }
2800
- `;class Ze{getName(){return"make:repository"}getDescription(){return"Generate a new repository class"}async run(e){let{name:t,module:s}=e;if(!t)t=await N({message:"Enter repository name"});t=Qm(t).replace(/Repository$/,"");let r=Fa.replace(/{{NAME}}/g,t),o=s?Z("modules",s):".",a=Z(o,"src","repositories"),i=Z(process.cwd(),a),n=Z(i,`${t}Repository.ts`);await Bun.write(n,r);let l=Ya.replace(/{{NAME}}/g,t),d=Z(o,"tests","repositories"),u=Z(process.cwd(),d),c=Z(u,`${t}Repository.spec.ts`);await Bun.write(c,l);let p=new Zm;p.success(`${Z(a,t)}Repository.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),p.success(`${Z(d,t)}Repository.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}Ze=y([b.command()],Ze);import{join as Bt}from"path";import{TerminalLogger as Xm}from"@ooneex/logger";import{seedCreate as Jm}from"@ooneex/seeds";class Qe{getName(){return"make:seed"}getDescription(){return"Generate a new seed file"}async run(e){let{name:t,module:s}=e;if(!t)t=await N({message:"Enter seed name"});let r=s?Bt("modules",s):".",o=await Jm({name:t,dir:Bt(r,"src/seeds")}),a=Bt(process.cwd(),"package.json"),i=Bun.file(a);if(await i.exists()){let l=await i.json();l.scripts=l.scripts||{},l.scripts["seed:run"]="bun ./bin/seed/run.ts",await Bun.write(a,JSON.stringify(l,null,2))}let n=new Xm;n.success(`${o} created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),n.info("Run 'bun run seed:run' to execute seeds",void 0,{showTimestamp:!1,showArrow:!0,showLevel:!1})}}Qe=y([b.command()],Qe);import{join as Q}from"path";import{TerminalLogger as sc}from"@ooneex/logger";import{toPascalCase as rc}from"@ooneex/utils";var ja=`import { describe, expect, test } from "bun:test";
2442
+ `;class Qe{getName(){return"make:repository"}getDescription(){return"Generate a new repository class"}async run(e){let{name:t,module:s}=e;if(!t)t=await v({message:"Enter repository name"});t=Zm(t).replace(/Repository$/,"");let o=Va.replace(/{{NAME}}/g,t),r=s?Z("modules",s):".",a=Z(r,"src","repositories"),i=Z(process.cwd(),a),n=Z(i,`${t}Repository.ts`);await Bun.write(n,o);let l=Fa.replace(/{{NAME}}/g,t),d=Z(r,"tests","repositories"),m=Z(process.cwd(),d),u=Z(m,`${t}Repository.spec.ts`);await Bun.write(u,l);let p=new zm;p.success(`${Z(a,t)}Repository.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),p.success(`${Z(d,t)}Repository.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}Qe=g([b.command()],Qe);import{join as Xe}from"path";import{TerminalLogger as Xm}from"@ooneex/logger";import{seedCreate as Jm}from"@ooneex/seeds";var Ya=`#!/usr/bin/env bun
2443
+
2444
+ import { seedRun } from "@ooneex/seeds";
2445
+ import "@/seeds/seeds";
2446
+
2447
+ await seedRun();
2448
+ `;class Je{getName(){return"make:seed"}getDescription(){return"Generate a new seed file"}async run(e){let{name:t,module:s}=e;if(!t)t=await v({message:"Enter seed name"});let o=s?Xe("modules",s):".",r=await Jm({name:t,dir:Xe(o,"src/seeds")}),a=Xe(process.cwd(),o,"bin","seed","run.ts");if(!await Bun.file(a).exists())await Bun.write(a,Ya);let n=Xe(process.cwd(),"package.json"),l=Bun.file(n);if(await l.exists()){let m=await l.json();m.scripts=m.scripts||{},m.scripts["seed:run"]="bun ./bin/seed/run.ts",await Bun.write(n,JSON.stringify(m,null,2))}let d=new Xm;d.success(`${r} created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),d.info("Run 'bun run seed:run' to execute seeds",void 0,{showTimestamp:!1,showArrow:!0,showLevel:!1})}}Je=g([b.command()],Je);import{join as Q}from"path";import{TerminalLogger as sc}from"@ooneex/logger";import{toPascalCase as oc}from"@ooneex/utils";var ja=`import { describe, expect, test } from "bun:test";
2801
2449
  import { {{NAME}}Service } from "@/services/{{NAME}}Service";
2802
2450
 
2803
2451
  describe("{{NAME}}Service", () => {
@@ -2821,7 +2469,7 @@ export class {{NAME}}Service<T extends ServiceDataType = ServiceDataType> implem
2821
2469
  // TODO: Implement service logic
2822
2470
  }
2823
2471
  }
2824
- `;class Xe{getName(){return"make:service"}getDescription(){return"Generate a new service class"}async run(e){let{name:t,module:s}=e;if(!t)t=await N({message:"Enter service name"});t=rc(t).replace(/Service$/,"");let r=za.replace(/{{NAME}}/g,t),o=s?Q("modules",s):".",a=Q(o,"src","services"),i=Q(process.cwd(),a),n=Q(i,`${t}Service.ts`);await Bun.write(n,r);let l=ja.replace(/{{NAME}}/g,t),d=Q(o,"tests","services"),u=Q(process.cwd(),d),c=Q(u,`${t}Service.spec.ts`);await Bun.write(c,l);let p=new sc;p.success(`${Q(a,t)}Service.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),p.success(`${Q(d,t)}Service.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}Xe=y([b.command()],Xe);import{join as X}from"path";import{TerminalLogger as ic}from"@ooneex/logger";import{toPascalCase as nc,toSnakeCase as lc}from"@ooneex/utils";var Za=`import { describe, expect, test } from "bun:test";
2472
+ `;class et{getName(){return"make:service"}getDescription(){return"Generate a new service class"}async run(e){let{name:t,module:s}=e;if(!t)t=await v({message:"Enter service name"});t=oc(t).replace(/Service$/,"");let o=za.replace(/{{NAME}}/g,t),r=s?Q("modules",s):".",a=Q(r,"src","services"),i=Q(process.cwd(),a),n=Q(i,`${t}Service.ts`);await Bun.write(n,o);let l=ja.replace(/{{NAME}}/g,t),d=Q(r,"tests","services"),m=Q(process.cwd(),d),u=Q(m,`${t}Service.spec.ts`);await Bun.write(u,l);let p=new sc;p.success(`${Q(a,t)}Service.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),p.success(`${Q(d,t)}Service.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}et=g([b.command()],et);import{join as X}from"path";import{TerminalLogger as ic}from"@ooneex/logger";import{toPascalCase as nc,toSnakeCase as lc}from"@ooneex/utils";var Za=`import { describe, expect, test } from "bun:test";
2825
2473
  import { {{NAME}}StorageAdapter } from "@/storage/{{NAME}}StorageAdapter";
2826
2474
 
2827
2475
  describe("{{NAME}}StorageAdapter", () => {
@@ -2893,7 +2541,7 @@ export class {{NAME}}Storage extends Storage {
2893
2541
  };
2894
2542
  }
2895
2543
  }
2896
- `;class Je{getName(){return"make:storage"}getDescription(){return"Generate a new storage class"}async run(e){let{name:t,module:s}=e;if(!t)t=await N({message:"Enter storage name"});t=nc(t).replace(/Storage$/,"");let r=lc(t).toUpperCase(),o=Qa.replace(/{{NAME}}/g,t).replace(/{{NAME_UPPER}}/g,r),a=s?X("modules",s):".",i=X(a,"src","storage"),n=X(process.cwd(),i),l=X(n,`${t}Storage.ts`);await Bun.write(l,o);let d=Za.replace(/{{NAME}}/g,t),u=X(a,"tests","storage"),c=X(process.cwd(),u),p=X(c,`${t}Storage.spec.ts`);await Bun.write(p,d);let m=new ic;m.success(`${X(i,t)}Storage.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),m.success(`${X(u,t)}Storage.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}Je=y([b.command()],Je);import{join as J}from"path";import{TerminalLogger as cc}from"@ooneex/logger";import{toPascalCase as pc}from"@ooneex/utils";var Xa=`import { describe, expect, test } from "bun:test";
2544
+ `;class tt{getName(){return"make:storage"}getDescription(){return"Generate a new storage class"}async run(e){let{name:t,module:s}=e;if(!t)t=await v({message:"Enter storage name"});t=nc(t).replace(/Storage$/,"");let o=lc(t).toUpperCase(),r=Qa.replace(/{{NAME}}/g,t).replace(/{{NAME_UPPER}}/g,o),a=s?X("modules",s):".",i=X(a,"src","storage"),n=X(process.cwd(),i),l=X(n,`${t}Storage.ts`);await Bun.write(l,r);let d=Za.replace(/{{NAME}}/g,t),m=X(a,"tests","storage"),u=X(process.cwd(),m),p=X(u,`${t}Storage.spec.ts`);await Bun.write(p,d);let c=new ic;c.success(`${X(i,t)}Storage.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),c.success(`${X(m,t)}Storage.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}tt=g([b.command()],tt);import{join as J}from"path";import{TerminalLogger as cc}from"@ooneex/logger";import{toPascalCase as pc}from"@ooneex/utils";var Xa=`import { describe, expect, test } from "bun:test";
2897
2545
  import { {{NAME}}VectorDatabase } from "@/databases/{{NAME}}VectorDatabase";
2898
2546
 
2899
2547
  describe("{{NAME}}VectorDatabase", () => {
@@ -2940,8 +2588,8 @@ export class {{NAME}}VectorDatabase extends VectorDatabase<DataType> {
2940
2588
  };
2941
2589
  }
2942
2590
  }
2943
- `;class et{getName(){return"make:vector-database"}getDescription(){return"Generate a new vector database class"}async run(e){let{name:t,module:s}=e;if(!t)t=await N({message:"Enter vector database name"});t=pc(t).replace(/VectorDatabase$/,"").replace(/Database$/,"");let r=Ja.replace(/{{NAME}}/g,t),o=s?J("modules",s):".",a=J(o,"src","databases"),i=J(process.cwd(),a),n=J(i,`${t}VectorDatabase.ts`);await Bun.write(n,r);let l=Xa.replace(/{{NAME}}/g,t),d=J(o,"tests","databases"),u=J(process.cwd(),d),c=J(u,`${t}VectorDatabase.spec.ts`);await Bun.write(c,l);let p=new cc;p.success(`${J(a,t)}VectorDatabase.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),p.success(`${J(d,t)}VectorDatabase.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}et=y([b.command()],et);var{values:K,positionals:fc}=uc({args:Bun.argv,options:{name:{type:"string"},"route-name":{type:"string"},"route-path":{type:"string"},"route-method":{type:"string"},"is-socket":{type:"boolean"},dir:{type:"string"},channel:{type:"string"},"table-name":{type:"string"},module:{type:"string"},destination:{type:"string"}},strict:!1,allowPositionals:!0}),It=new hc,ti=fc[2];if(!ti)It.error(`Command name is required
2944
- `),process.exit(1);var si=Ut(ti);if(!si)It.info(`No commands found
2945
- `),process.exit(1);var gc={name:K.name,dir:K.dir,channel:K.channel,isSocket:K["is-socket"],tableName:K["table-name"],module:K.module,destination:K.destination,route:{name:K["route-name"],path:K["route-path"],method:K["route-method"]}};try{await si.run(gc)}catch(e){let t=e instanceof ei?e:new ei(e instanceof Error?e:String(e));It.error(t,void 0,{showArrow:!1,showTimestamp:!1,showLevel:!1}),process.exit(1)}
2591
+ `;class st{getName(){return"make:vector-database"}getDescription(){return"Generate a new vector database class"}async run(e){let{name:t,module:s}=e;if(!t)t=await v({message:"Enter vector database name"});t=pc(t).replace(/VectorDatabase$/,"").replace(/Database$/,"");let o=Ja.replace(/{{NAME}}/g,t),r=s?J("modules",s):".",a=J(r,"src","databases"),i=J(process.cwd(),a),n=J(i,`${t}VectorDatabase.ts`);await Bun.write(n,o);let l=Xa.replace(/{{NAME}}/g,t),d=J(r,"tests","databases"),m=J(process.cwd(),d),u=J(m,`${t}VectorDatabase.spec.ts`);await Bun.write(u,l);let p=new cc;p.success(`${J(a,t)}VectorDatabase.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),p.success(`${J(d,t)}VectorDatabase.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}st=g([b.command()],st);var{values:K,positionals:fc}=uc({args:Bun.argv,options:{name:{type:"string"},"route-name":{type:"string"},"route-path":{type:"string"},"route-method":{type:"string"},"is-socket":{type:"boolean"},dir:{type:"string"},channel:{type:"string"},"table-name":{type:"string"},module:{type:"string"},destination:{type:"string"}},strict:!1,allowPositionals:!0}),Bt=new hc,ti=fc[2];if(!ti)Bt.error(`Command name is required
2592
+ `),process.exit(1);var si=Ut(ti);if(!si)Bt.info(`No commands found
2593
+ `),process.exit(1);var yc={name:K.name,dir:K.dir,channel:K.channel,isSocket:K["is-socket"],tableName:K["table-name"],module:K.module,destination:K.destination,route:{name:K["route-name"],path:K["route-path"],method:K["route-method"]}};try{await si.run(yc)}catch(e){let t=e instanceof ei?e:new ei(e instanceof Error?e:String(e));Bt.error(t,void 0,{showArrow:!1,showTimestamp:!1,showLevel:!1}),process.exit(1)}
2946
2594
 
2947
- //# debugId=DEC65B735000101664756E2164756E21
2595
+ //# debugId=5D3FAE0F9529AE0964756E2164756E21