@ooneex/cli 1.2.5 → 1.2.6

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 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=`
3
+ var mi=Object.create;var{getPrototypeOf:ci,defineProperty:kt,getOwnPropertyNames:pi}=Object;var ui=Object.prototype.hasOwnProperty;function hi(e){return this[e]}var fi,gi,se=(e,t,s)=>{var o=e!=null&&typeof e==="object";if(o){var r=t?fi??=new WeakMap:gi??=new WeakMap,a=r.get(e);if(a)return a}s=e!=null?mi(ci(e)):{};let i=t||!e||!e.__esModule?kt(s,"default",{value:e,enumerable:!0}):s;for(let n of pi(e))if(!ui.call(i,n))kt(i,n,{get:hi.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 y=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 ye=import.meta.require;var Yt=w((qc,be)=>{var Ni=typeof process<"u"&&process.env.TERM_PROGRAM==="Hyper",Ti=typeof process<"u"&&process.platform==="win32",Ht=typeof process<"u"&&process.platform==="linux",lt={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"},Ft=Object.assign({},lt,{check:"\u221A",cross:"\xD7",ellipsisLarge:"...",ellipsis:"...",info:"i",questionSmall:"?",pointer:">",pointerSmall:"\xBB",radioOff:"( )",radioOn:"(*)",warning:"\u203C"}),Vt=Object.assign({},lt,{ballotCross:"\u2718",check:"\u2714",cross:"\u2716",ellipsisLarge:"\u22EF",ellipsis:"\u2026",info:"\u2139",questionFull:"\uFF1F",questionSmall:"\uFE56",pointer:Ht?"\u25B8":"\u276F",pointerSmall:Ht?"\u2023":"\u203A",radioOff:"\u25EF",radioOn:"\u25C9",warning:"\u26A0"});be.exports=Ti&&!Ni?Ft:Vt;Reflect.defineProperty(be.exports,"common",{enumerable:!1,value:lt});Reflect.defineProperty(be.exports,"windows",{enumerable:!1,value:Ft});Reflect.defineProperty(be.exports,"other",{enumerable:!1,value:Vt})});var Ce=w((Kc,dt)=>{var Si=(e)=>e!==null&&typeof e==="object"&&!Array.isArray(e),Ci=/[\u001b\u009b][[\]#;?()]*(?:(?:(?:[^\W_]*;?[^\W_]*)\u0007)|(?:(?:[0-9]{1,4}(;[0-9]{0,4})*)?[~0-9=<>cf-nqrtyA-PRZ]))/g,Mi=()=>{if(typeof process<"u")return process.env.FORCE_COLOR!=="0";return!1},jt=()=>{let e={enabled:Mi(),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 p=i+d+n;return m?p.replace(/\r*\n/g,`${n}$&${i}`):p},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=Ci,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(!Si(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=Yt(),e.define=r,e};dt.exports=jt();dt.exports.create=jt});var R=w((_i)=>{var Ri=Object.prototype.toString,O=Ce(),zt=!1,we=new Set,Zt={yellow:"blue",cyan:"red",green:"magenta",black:"white",blue:"yellow",red:"cyan",magenta:"green",white:"black"};_i.longest=(e,t)=>{return e.reduce((s,o)=>Math.max(s,t?o[t].length:o.length),0)};_i.hasColor=(e)=>!!e&&O.hasColor(e);var Me=_i.isObject=(e)=>{return e!==null&&typeof e==="object"&&!Array.isArray(e)};_i.nativeType=(e)=>{return Ri.call(e).slice(8,-1).toLowerCase().replace(/\s/g,"")};_i.isAsyncFn=(e)=>{return _i.nativeType(e)==="asyncfunction"};_i.isPrimitive=(e)=>{return e!=null&&typeof e!=="object"&&typeof e!=="function"};_i.resolve=(e,t,...s)=>{if(typeof t==="function")return t.call(e,...s);return t};_i.scrollDown=(e=[])=>[...e.slice(1),e[0]];_i.scrollUp=(e=[])=>[e.pop(),...e];_i.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};_i.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};_i.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};_i.height=(e,t=20)=>{let s=e&&e.rows?e.rows:t;if(e&&typeof e.getWindowSize==="function")s=e.getWindowSize()[1];return s};_i.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)};_i.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};_i.pascal=(e)=>e?e[0].toUpperCase()+e.slice(1):"";_i.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"+_i.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};_i.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[Zt[t]||t];if(s){let o=s.slice(2).toLowerCase(),r=Zt[o];if(!r)return e;return O["bg"+_i.pascal(r)]||e}return O.none};_i.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};_i.set=(e={},t="",s)=>{return t.split(".").reduce((o,r,a,i)=>{let n=i.length-1>a?o[r]||{}:s;if(!_i.isObject(n)&&a<i.length-1)n={};return o[r]=n},e)};_i.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};_i.mixin=(e,t)=>{if(!Me(e))return t;if(!Me(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)&&Me(o.value)){let r=Object.getOwnPropertyDescriptor(e,s);if(Me(r.value)&&r.value!==o.value)e[s]=_i.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};_i.merge=(...e)=>{let t={};for(let s of e)_i.mixin(t,s);return t};_i.mixinEmitter=(e,t)=>{let s=t.constructor.prototype;for(let o of Object.keys(s)){let r=s[o];if(typeof r==="function")_i.define(e,o,r.bind(t));else _i.define(e,o,r)}};var Re=(e,t)=>{if(zt)return;if(zt=!0,we.forEach((s)=>s()),e===!0)process.exit(128+t)},Qt=Re.bind(null,!0,15),Xt=Re.bind(null,!0,2);_i.onExit=(e)=>{if(we.size===0)process.once("SIGTERM",Qt),process.once("SIGINT",Xt),process.once("exit",Re);return we.add(e),()=>{if(we.delete(e),we.size===0)process.off("SIGTERM",Qt),process.off("SIGINT",Xt),process.off("exit",Re)}};_i.define=(e,t,s)=>{Reflect.defineProperty(e,t,{value:s})};_i.defineExport=(e,t,s)=>{let o;Reflect.defineProperty(e,t,{enumerable:!0,configurable:!0,set(r){o=r},get(){return o?o():s()}})}});var os=w((Fc,ss)=>{ss.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 oe=w((Vc,rs)=>{var en=os();rs.exports=(e)=>typeof e==="string"?e.replace(en(),""):e});var as=w((tn)=>{tn.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"};tn.shift={up:"shiftUp",down:"shiftDown",left:"shiftLeft",right:"shiftRight",tab:"prev"};tn.fn={up:"pageUp",down:"pageDown",left:"pageLeft",right:"pageRight",delete:"deleteForward"};tn.option={b:"backward",f:"forward",d:"cutRight",left:"cutLeft",up:"altUp",down:"altDown"};tn.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 ns=w((jc,is)=>{is.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 ct=w((zc,ds)=>{var ls=ye("readline"),ln=as(),dn=ns(),mn=/^(?:\x1b)([a-zA-Z0-9])$/,cn=/^(?:\x1b+)(O|N|\[|\[\[)(?:(\d+)(?:;(\d+))?([~^$])|(?:1;)?(\d+)?([a-zA-Z]))/,pn={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 un(e){return["[a","[b","[c","[d","[e","[2$","[3$","[5$","[6$","[7$","[8$","[Z"].includes(e)}function hn(e){return["Oa","Ob","Oc","Od","Oe","[2^","[3^","[5^","[6^","[7^","[8^"].includes(e)}var _e=(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=mn.exec(e))o.meta=!0,o.shift=/^[A-Z]$/.test(s[1]);else if(s=cn.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=pn[a],o.shift=un(a)||o.shift,o.ctrl=hn(a)||o.ctrl}return o};_e.listen=(e={},t)=>{let{stdin:s}=e;if(!s||s!==process.stdin&&!s.isTTY)throw Error("Invalid stream passed");let o=ls.createInterface({terminal:!0,input:s});ls.emitKeypressEvents(s,o);let r=new dn((n,l)=>t(n,_e(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()}};_e.action=(e,t,s)=>{let o={...ln,...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};ds.exports=_e});var cs=w((Zc,ms)=>{ms.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};fn(e,s,o)}};function fn(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 hs=w((Qc,us)=>{var{define:gn,width:yn}=R();class ps{constructor(e){let t=e.options;gn(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=yn(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"}}us.exports=ps});var gs=w((Xc,fs)=>{var pt=R(),C=Ce(),ut={default:C.noop,noop:C.noop,set inverse(e){this._inverse=e},get inverse(){return this._inverse||pt.inverse(this.primary)},set complement(e){this._complement=e},get complement(){return this._complement||pt.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}};ut.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=pt.merge({},ut,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};fs.exports=ut});var bs=w((Jc,ys)=>{var ht=process.platform==="win32",H=Ce(),bn=R(),ft={...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:ht?"( )":"\u25EF",on:ht?"(*)":"\u25C9",disabled:ht?"(|)":"\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"]};ft.merge=(e)=>{let t=bn.merge({},H.symbols,ft,e.symbols);return delete t.merge,t};ys.exports=ft});var xs=w((ep,ws)=>{var wn=gs(),xn=bs(),En=R();ws.exports=(e)=>{e.options=En.merge({},e.options.theme,e.options),e.symbols=xn.merge(e.options),e.styles=wn.merge(e.options)}});var Ns=w((As,vs)=>{var Es=process.env.TERM_PROGRAM==="Apple_Terminal",An=oe(),gt=R(),B=vs.exports=As,yt=!1,re=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["+(Es?"8":"u"),savePosition:"\x1B["+(Es?"7":"s"),screen:"\x1B[2J",show:"\x1B[?25h",up:"\x1B[1J"},le=B.cursor={get hidden(){return yt},hide(){return yt=!0,re.hide},show(){return yt=!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?le.left(-e):e>0?le.right(e):"",s+=t<0?le.up(-t):t>0?le.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=gt.isPrimitive(o)?String(o):"",r=gt.isPrimitive(r)?String(r):"",n=gt.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)}}},bt=B.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+=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 bt.line+le.to(0);let s=(a)=>[...An(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(bt.line+le.prevLine()).repeat(r-1)+bt.line+le.to(0)}});var pe=w((tp,Ss)=>{var vn=ye("events"),Ts=oe(),wt=ct(),Nn=cs(),Tn=hs(),Sn=xs(),D=R(),de=Ns();class xt extends vn{constructor(e={}){super();this.name=e.name,this.type=e.type,this.options=e,Sn(this),Nn(this),this.state=new Tn(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=Mn(this.options.margin),this.setMaxListeners(0),Cn(this)}async keypress(e,t={}){this.keypressed=!0;let s=wt.action(e,wt(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(de.code.beep)}cursorHide(){this.stdout.write(de.cursor.hide());let e=D.onExit(()=>this.cursorShow());this.on("close",()=>{this.cursorShow(),e()})}cursorShow(){this.stdout.write(de.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(de.cursor.down(e)+de.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=de.cursor.restore(l);if(d)this.stdout.write(d)}sections(){let{buffer:e,input:t,prompt:s}=this.state;s=Ts(s);let o=Ts(e),r=o.indexOf(s),a=o.slice(0,r),n=o.slice(r).split(`
7
+ `),l=n[0],d=n[n.length-1],p=(s+(t?" "+t:"")).length,c=p<l.length?l.slice(p+1):"";return{header:a,prompt:l,after:c,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
- `+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=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(`
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(de.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=wt.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 xt.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 Cn(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 Mn(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}Ss.exports=xt});var Rs=w((sp,Ms)=>{var Rn=R(),Cs={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 Cs.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}};Ms.exports=(e,t={})=>{let s=Rn.merge({},Cs,t.roles);return s[e]||s.default}});var xe=w((op,Ps)=>{var _n=oe(),Dn=pe(),In=Rs(),De=R(),{reorder:Et,scrollUp:Pn,scrollDown:On,isObject:_s,swap:Bn}=De;class Is extends Dn{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(_s(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=In(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,De.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,_n(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 Ds(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=Et(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=Et(this.choices),this.index=0,this.render()}end(){let e=this.choices.length-this.limit,t=Et(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=Pn(this.choices),this.index=e,this.isDisabled())return this.up();return this.render()}scrollDown(e=this.visible.length-1){if(this.choices=On(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){Bn(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(_s(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=De.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 Ds(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 Ds(e,t){if(t instanceof Promise)return t;if(typeof t==="function"){if(De.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}Ps.exports=Is});var ae=w((rp,Bs)=>{var Ln=xe(),At=R();class Os extends Ln{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"&&!At.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&&!At.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(!At.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
12
  `),o;if(this.options.choicesHeader)o=await this.resolve(this.options.choicesHeader,this.state);return[o,s].filter(Boolean).join(`
13
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||`
14
+ `)),this.write(this.margin[2]),this.restore()}}Bs.exports=Os});var $s=w((ap,Us)=>{var Un=ae(),$n=(e,t)=>{let s=e?new RegExp(e,"ig"):/$^/;return(o)=>{return e?o.replace(s,(r)=>t(r)):o}};class Ls extends Un{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=$n(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()}}Us.exports=Ls});var Nt=w((ip,Gs)=>{var vt=R();Gs.exports=(e,t={})=>{e.cursorHide();let{input:s="",initial:o="",pos:r,showCursor:a=!0,color:i}=t,n=i||e.styles.placeholder,l=vt.inverse(e.styles.primary),d=(f)=>l(e.styles.black(f)),m=s,p=" ",c=d(p);if(e.blink&&e.blink.off===!0)d=(f)=>f,c="";if(a&&r===0&&o===""&&s==="")return d(p);if(a&&r===0&&(s===o||s===""))return d(o[0])+n(o.slice(1));o=vt.isPrimitive(o)?`${o}`:"",s=vt.isPrimitive(s)?`${s}`:"";let u=o&&o.startsWith(s)&&o!==s,h=u?d(o[s.length]):c;if(r!==s.length&&a===!0)m=s.slice(0,r)+d(s[r])+s.slice(r+1),h="";if(a===!1)h="";if(u){let f=e.styles.unstyle(m+h);return m+h+n(o.slice(f.length))}return m+h}});var Ie=w((np,Ws)=>{var Gn=oe(),kn=ae(),Wn=Nt();class ks extends kn{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:p}=o,c=this.index===t,u=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,g=n?"success":"dark";if(await u.call(e,E,this.state)!==!0)g="danger";let x=o[g],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=Gn(f),n=d(n),S();if(e.format)n=await e.format.call(this,n,e,t);else{let _=this.styles.muted;n=Wn(this,{input:n,initial:a,pos:r,showCursor:c,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(c)f=m(f);if(e.error)n+=(n?" ":"")+p(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)}}Ws.exports=ks});var Tt=w((lp,Ks)=>{var qn=Ie(),Kn=()=>{throw Error("expected prompt to have a custom authenticate method")},qs=(e=Kn)=>{class t extends qn{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 qs(s)}}return t};Ks.exports=qs()});var Vs=w((dp,Fs)=>{var Hn=Tt();function Fn(e,t){if(e.username===this.options.username&&e.password===this.options.password)return!0;return!1}var Hs=(e=Fn)=>{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 Hn.create(e){constructor(o){super({...o,choices:t})}static create(o){return Hs(o)}}return s};Fs.exports=Hs()});var Pe=w((mp,js)=>{var Vn=pe(),{isPrimitive:Yn,hasColor:jn}=R();class Ys extends Vn{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 Yn(e)&&(this.isTrue(e)||this.isFalse(e))}async hint(){if(this.state.status==="pending"){let e=await this.element("hint");if(!jn(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(),p=await this.footer();if(m&&!i.includes(m))d+=" "+m;i+=" "+d,this.clear(t),this.write([n,i,p].filter(Boolean).join(`
15
+ `)),this.restore()}set value(e){super.value=e}get value(){return this.cast(super.value)}}js.exports=Ys});var Qs=w((cp,Zs)=>{var zn=Pe();class zs extends zn{constructor(e){super(e);this.default=this.options.default||(this.initial?"(Y/n)":"(y/N)")}}Zs.exports=zs});var eo=w((pp,Js)=>{var Zn=ae(),Qn=Ie(),ue=Qn.prototype;class Xs extends Zn{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 ue.dispatch.call(this,e,t)}append(e,t){return ue.append.call(this,e,t)}delete(e,t){return ue.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?ue.next.call(this):super.next()}prev(){return this.focused.editable?ue.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 ue.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)}}Js.exports=Xs});var me=w((up,so)=>{var Xn=pe(),Jn=ct(),el=Nt(),{isPrimitive:tl}=R();class to extends Xn{constructor(e){super(e);if(this.initial=tl(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 el(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()}}so.exports=to});var ro=w((hp,oo)=>{var sl=(e)=>e.filter((t,s)=>e.lastIndexOf(t)===s),Oe=(e)=>sl(e).filter(Boolean);oo.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:Oe([s,...a]),present:i};case"next":case"redo":return a=o.slice(1),i=o[0]||"",{past:Oe([...a,s]),present:i};case"save":return{past:Oe([...o,s]),present:""};case"remove":if(i=Oe(o.filter((n)=>n!==s)),r="",i.length)r=i.pop();return{past:i,present:r};default:throw Error(`Invalid action: "${e}"`)}}});var St=w((fp,no)=>{var ol=me(),ao=ro();class io extends ol{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=ao(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=ao("save",this.data,this.input),this.store.set("values",this.data)}submit(){if(this.store&&this.autosave===!0)this.save();return super.submit()}}no.exports=io});var co=w((gp,mo)=>{var rl=me();class lo extends rl{format(){return""}}mo.exports=lo});var ho=w((yp,uo)=>{var al=me();class po extends al{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()}}uo.exports=po});var yo=w((bp,go)=>{var il=ae();class fo extends il{constructor(e){super({...e,multiple:!0})}}go.exports=fo});var Ct=w((wp,wo)=>{var nl=me();class bo extends nl{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()}}wo.exports=bo});var Ao=w((xp,Eo)=>{var ll=me();class xo extends ll{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))}}Eo.exports=xo});var So=w((Ep,To)=>{var dl=oe(),ml=xe(),vo=R();class No extends ml{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
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(`
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&&!vo.hasColor(r))r=this.styles.muted(r);let a=(u)=>this.margin[3]+u.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=dl(d).length,this.widths[0]=Math.min(this.widths[0],this.width-this.scaleLength-m.length);let c=vo.wordWrap(l,{width:this.widths[0],newline:i}).split(`
20
+ `).map((u)=>a(u)+this.margin[1]);if(s)d=this.styles.info(d),c=c.map((u)=>this.styles.info(u));if(c[0]+=d,this.linebreak)c.push("");return[n+o,c.join(`
21
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
- `;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(`
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(),p=await this.footer(),c=this.emptyError;if(n)a+=n;if(d&&!a.includes(d))a+=" "+d;if(e&&!n&&!m.trim()&&this.multiple&&c!=null)a+=this.styles.danger(c);if(this.clear(t),this.write([i,a,l,m,p].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)}}To.exports=No});var _o=w((Ap,Ro)=>{var Co=oe(),cl=(e="")=>{return typeof e==="string"?e.replace(/^['"]|['"]$/g,""):""};class Mo{constructor(e){this.name=e.key,this.field=e.field||{},this.value=cl(e.initial||this.field.initial||""),this.message=e.message||this.name,this.cursor=0,this.input="",this.lines=[]}}var pl=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,p=()=>a[++m],c=()=>a[m+1],u=(h)=>{h.line=d,i.push(h)};u({type:"bos",value:""});while(m<a.length-1){let h=p();if(/^[^\S\n ]$/.test(h)){u({type:"text",value:h});continue}if(h===`
24
+ `){u({type:"newline",value:h}),d++;continue}if(h==="\\"){h+=p(),u({type:"text",value:h});continue}if((h==="$"||h==="#"||h==="{")&&c()==="{"){let E=p();h+=E;let g={type:"template",open:h,inner:"",close:"",value:h},x;while(x=p()){if(x==="}"){if(c()==="}")x+=p();g.value+=x,g.close=x;break}if(x===":")g.initial="",g.key=g.inner;else if(g.initial!==void 0)g.initial+=x;g.value+=x,g.inner+=x}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),u(g),l.push(g.key),o.add(g.key);let A=n.find((N)=>N.name===g.key);if(g.field=r.find((N)=>N.name===g.key),!A)A=new Mo(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 u({type:"text",value:h})}return u({type:"eos",value:""}),{input:a,tabstops:i,unique:o,keys:l,items:n}};Ro.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 pl(t,o),n=Mt("result",e,t),l=Mt("format",e,t),d=Mt("validate",e,t,!0),m=e.isValue.bind(e);return async(p={},c=!1)=>{let u=0;p.required=s,p.items=a,p.keys=i,p.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)p.output+=A;continue}if(x.type==="template"){let S=a.find((ce)=>ce.name===N);if(t.required===!0)p.required.add(S.name);let _=[S.input,p.values[S.value],S.value,A].find(m),te=(S.field||{}).message||x.inner;if(c){let ce=await h(p.values[N],p,S,u);if(ce&&typeof ce==="string"||ce===!1){p.invalid.set(N,ce);continue}p.invalid.delete(N);let di=await n(p.values[N],p,S,u);p.output+=Co(di);continue}S.placeholder=!1;let li=A;if(A=await l(A,p,S,u),_!==A)p.values[N]=_,A=e.styles.typing(_),p.missing.delete(te);else if(p.values[N]=void 0,_=`<${te}>`,A=e.styles.primary(_),S.placeholder=!0,p.required.has(N))p.missing.add(te);if(p.missing.has(te)&&p.validating)A=e.styles.warning(_);if(p.invalid.has(N)&&p.validating)A=e.styles.danger(_);if(u===p.index)if(li!==A)A=e.styles.underline(A);else A=e.styles.heading(Co(A));u++}if(A)p.output+=A}let f=p.output.split(`
25
+ `).map((x)=>" "+x),E=a.length,g=0;for(let x of a){if(p.invalid.has(x.name))x.lines.forEach((A)=>{if(f[A][0]!==" ")return;f[A]=p.styles.danger(p.symbols.bullet)+f[A].slice(1)});if(e.isValue(p.values[x.name]))g++}return p.completed=(g/E*100).toFixed(0),p.output=f.join(`
26
+ `),p.output}};function Mt(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 Po=w((vp,Io)=>{var ul=oe(),hl=_o(),fl=pe();class Do extends fl{constructor(e){super(e);this.cursorHide(),this.reset(!0)}async initialize(){this.interpolate=await hl(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((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(),m=await this.error()||"",p=await this.hint()||"",c=s?"":await this.interpolate(this.state),u=this.state.key=t[e]||"",h=await this.format(u),f=await this.footer();if(h)l+=" "+h;if(p&&!h&&this.state.completed===0)l+=" "+p;this.clear(o);let E=[d,l,c,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
+ `;return this.state.error=i,super.submit()}if(t.size)return this.state.error="Required: "+[...t.keys()].join(", "),super.submit();let a=ul(s).split(`
29
29
  `).map((i)=>i.slice(1)).join(`
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(`
30
+ `);return this.value={values:o,result:a},super.submit()}}Io.exports=Do});var Lo=w((Np,Bo)=>{var gl=ae();class Oo extends gl{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()}}Bo.exports=Oo});var Go=w((Tp,$o)=>{var yl=xe();class Uo extends yl{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=bl(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,p=await this.resolve(e.message,this.state,e,t),c=this.indent(e),u=c+e.scale.map((x,A)=>l(A===e.scaleIdx)).join(i),h=(x)=>x===e.scaleIdx?m(x):x,f=c+e.scale.map((x,A)=>h(A)).join(n),E=()=>[d,p].filter(Boolean).join(" "),g=()=>[E(),u,f," "].filter(Boolean).join(`
32
+ `);if(s)u=this.styles.cyan(u),f=this.styles.cyan(f);return g()}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
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
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 bl(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}$o.exports=Uo});var qo=w((Sp,Wo)=>{var wl=Pe();class ko extends wl{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()}}Wo.exports=ko});var Fo=w((Cp,Ho)=>{var xl=ae();class Ko extends xl{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)}}}Ho.exports=Ko});var Yo=w((Rt)=>{var Vo=R(),T=(e,t)=>{Vo.defineExport(Rt,e,t),Vo.defineExport(Rt,e.toLowerCase(),t)};T("AutoComplete",()=>$s());T("BasicAuth",()=>Vs());T("Confirm",()=>Qs());T("Editable",()=>eo());T("Form",()=>Ie());T("Input",()=>St());T("Invisible",()=>co());T("List",()=>ho());T("MultiSelect",()=>yo());T("Numeral",()=>Ct());T("Password",()=>Ao());T("Scale",()=>So());T("Select",()=>ae());T("Snippet",()=>Po());T("Sort",()=>Lo());T("Survey",()=>Go());T("Text",()=>St());T("Toggle",()=>qo());T("Quiz",()=>Fo())});var zo=w((Rp,jo)=>{jo.exports={ArrayPrompt:xe(),AuthPrompt:Tt(),BooleanPrompt:Pe(),NumberPrompt:Ct(),StringPrompt:me()}});var ne=w((_p,Qo)=>{var Zo=ye("assert"),Dt=ye("events"),ie=R();class U extends Dt{constructor(e,t){super();this.options=ie.merge({},e),this.answers={...t}}register(e,t){if(ie.isObject(e)){for(let o of Object.keys(e))this.register(o,e[o]);return this}Zo.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(ie.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=ie.merge({},this.options,e),{type:s,name:o}=e,{set:r,get:a}=ie;if(typeof s==="function")s=await s.call(this,e,this.answers);if(!s)return this.answers[o];if(s==="number")s="numeral";Zo(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||pe()}static get prompts(){return Yo()}static get types(){return zo()}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 ie.mixinEmitter(e,new Dt),e}}ie.mixinEmitter(U,new Dt);var _t=U.prompts;for(let e of Object.keys(_t)){let t=e.toLowerCase(),s=(o)=>new _t[e](o).run();if(U.prompt[t]=s,U[t]=s,!U[e])Reflect.defineProperty(U,e,{get:()=>_t[e]})}var Ee=(e)=>{ie.defineExport(U,e,()=>U.types[e])};Ee("ArrayPrompt");Ee("AuthPrompt");Ee("BooleanPrompt");Ee("NumberPrompt");Ee("StringPrompt");Qo.exports=U});var Ca=w((Ut,$t)=>{(function(e,t){if(typeof Ut==="object"&&typeof $t==="object")$t.exports=t();else if(typeof define==="function"&&define.amd)define(function(){return t()});else e.pluralize=t()})(Ut,function(){var e=[],t=[],s={},o={},r={};function a(u){if(typeof u==="string")return new RegExp("^"+u+"$","i");return u}function i(u,h){if(u===h)return h;if(u===u.toLowerCase())return h.toLowerCase();if(u===u.toUpperCase())return h.toUpperCase();if(u[0]===u[0].toUpperCase())return h.charAt(0).toUpperCase()+h.substr(1).toLowerCase();return h.toLowerCase()}function n(u,h){return u.replace(/\$(\d{1,2})/g,function(f,E){return h[E]||""})}function l(u,h){return u.replace(h[0],function(f,E){var g=n(h[1],arguments);if(f==="")return i(u[E-1],g);return i(f,g)})}function d(u,h,f){if(!u.length||s.hasOwnProperty(u))return h;var E=f.length;while(E--){var g=f[E];if(g[0].test(h))return l(h,g)}return h}function m(u,h,f){return function(E){var g=E.toLowerCase();if(h.hasOwnProperty(g))return i(E,g);if(u.hasOwnProperty(g))return i(E,u[g]);return d(g,E,f)}}function p(u,h,f,E){return function(g){var x=g.toLowerCase();if(h.hasOwnProperty(x))return!0;if(u.hasOwnProperty(x))return!1;return d(x,x,f)===x}}function c(u,h,f){var E=h===1?c.singular(u):c.plural(u);return(f?h+" ":"")+E}return c.plural=m(r,o,e),c.isPlural=p(r,o,e),c.singular=m(o,r,t),c.isSingular=p(o,r,t),c.addPluralRule=function(u,h){e.push([a(u),h])},c.addSingularRule=function(u,h){t.push([a(u),h])},c.addUncountableRule=function(u){if(typeof u==="string"){s[u.toLowerCase()]=!0;return}c.addPluralRule(u,"$0"),c.addSingularRule(u,"$0")},c.addIrregularRule=function(u,h){h=h.toLowerCase(),u=u.toLowerCase(),r[u]=h,o[h]=u},[["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(u){return c.addIrregularRule(u[0],u[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(u){return c.addPluralRule(u[0],u[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(u){return c.addSingularRule(u[0],u[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(c.addUncountableRule),c})});import{parseArgs as xc}from"util";import{Exception as ai}from"@ooneex/exception";import{TerminalLogger as Ec}from"@ooneex/logger";import{container as yi}from"@ooneex/container";var Te=[];var Wt=(e)=>{let t=null;return Te.find((s)=>{return t=yi.get(s),t.getName()===e}),t};import{homedir as Ai}from"os";import{join as nt}from"path";import{TerminalLogger as vi}from"@ooneex/logger";import{container as bi,EContainerScope as wi}from"@ooneex/container";var b={command:(e=wi.Singleton)=>{return(t)=>{bi.add(t,e),Te.push(t)}}};var qt=`#compdef oo ooneex
36
36
 
37
37
  _oo_modules() {
38
38
  local -a modules
@@ -63,6 +63,7 @@ _oo() {
63
63
  'make\\:module:Generate a new module'
64
64
  'make\\:permission:Generate a new permission class'
65
65
  'make\\:pubsub:Generate a new PubSub event class'
66
+ 'make\\:release:Release packages with version bump, changelog, and git tag'
66
67
  'make\\:repository:Generate a new repository class'
67
68
  'make\\:seed:Generate a new seed file'
68
69
  'make\\:service:Generate a new service class'
@@ -136,7 +137,7 @@ _oo() {
136
137
  '--name=[Name of the resource]:name' \\
137
138
  '--module=[Module name]:module:_oo_modules'
138
139
  ;;
139
- make:claude:skill|completion:zsh)
140
+ make:release|make:claude:skill|completion:zsh)
140
141
  ;;
141
142
  esac
142
143
  ;;
@@ -144,7 +145,7 @@ _oo() {
144
145
  }
145
146
 
146
147
  _oo "$@"
147
- `;var $t=`#compdef oo ooneex
148
+ `;var Kt=`#compdef oo ooneex
148
149
 
149
150
  _ooneex_modules() {
150
151
  local -a modules
@@ -175,6 +176,7 @@ _ooneex() {
175
176
  'make\\:module:Generate a new module'
176
177
  'make\\:permission:Generate a new permission class'
177
178
  'make\\:pubsub:Generate a new PubSub event class'
179
+ 'make\\:release:Release packages with version bump, changelog, and git tag'
178
180
  'make\\:repository:Generate a new repository class'
179
181
  'make\\:seed:Generate a new seed file'
180
182
  'make\\:service:Generate a new service class'
@@ -248,7 +250,7 @@ _ooneex() {
248
250
  '--name=[Name of the resource]:name' \\
249
251
  '--module=[Module name]:module:_ooneex_modules'
250
252
  ;;
251
- make:claude:skill|completion:zsh)
253
+ make:release|make:claude:skill|completion:zsh)
252
254
  ;;
253
255
  esac
254
256
  ;;
@@ -256,9 +258,9 @@ _ooneex() {
256
258
  }
257
259
 
258
260
  _ooneex "$@"
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:
261
+ `;class Se{getName(){return"completion:zsh"}getDescription(){return"Install Zsh completion for oo command"}async run(){let e=nt(Ai(),".zsh"),t=nt(e,"_oo");await Bun.write(t,qt);let s=nt(e,"_ooneex");await Bun.write(s,Kt);let o=new vi;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:
260
262
  fpath=(~/.zsh $fpath)
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";
263
+ autoload -Uz compinit && compinit`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}Se=y([b.command()],Se);import{join as F}from"path";import{TerminalLogger as Cl}from"@ooneex/logger";import{toPascalCase as Ml}from"@ooneex/utils";var Xo=se(ne(),1);import{Assert as El,Validation as Al}from"@ooneex/validation";var vl=1,Nl=/^[a-zA-Z][a-zA-Z0-9-]*$/;class Ae extends Al{getConstraint(){return El(`string >= ${vl}`)}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(!Nl.test(o))return{isValid:!1,message:this.getErrorMessage()||"Invalid name format"};return{isValid:!0}}}var v=async(e)=>{return(await Xo.prompt({type:"input",name:"name",message:e.message,validate:(s)=>{let r=new Ae().validate(s);if(!r.isValid)return r.message||"Controller name is invalid";return!0}})).name};var Jo=`import { describe, expect, test } from "bun:test";
262
264
  import { {{NAME}}Ai } from "@/ai/{{NAME}}Ai";
263
265
 
264
266
  describe("{{NAME}}Ai", () => {
@@ -276,7 +278,7 @@ describe("{{NAME}}Ai", () => {
276
278
  expect(typeof {{NAME}}Ai.prototype.runStream).toBe("function");
277
279
  });
278
280
  });
279
- `;var Zo=`import { decorator, type IAiChat, OpenAi, type OpenAiConfigType } from "@ooneex/ai";
281
+ `;var er=`import { decorator, type IAiChat, OpenAi, type OpenAiConfigType } from "@ooneex/ai";
280
282
  import { inject } from "@ooneex/container";
281
283
 
282
284
  @decorator.ai()
@@ -294,7 +296,7 @@ export class {{NAME}}Ai implements IAiChat<OpenAiConfigType> {
294
296
  yield* this.ai.runStream(prompt || "My prompt", config);
295
297
  }
296
298
  }
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";
299
+ `;class Be{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=Ml(t).replace(/Ai$/,"");let o=er.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=Jo.replace(/{{NAME}}/g,t),d=F(r,"tests","ai"),m=F(process.cwd(),d),p=F(m,`${t}Ai.spec.ts`);await Bun.write(p,l);let c=new Cl;c.success(`${F(a,t)}Ai.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),c.success(`${F(d,t)}Ai.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}Be=y([b.command()],Be);import{join as V}from"path";import{TerminalLogger as Dl}from"@ooneex/logger";import{toPascalCase as Il}from"@ooneex/utils";var tr=`import { describe, expect, test } from "bun:test";
298
300
  import { {{NAME}}Analytics } from "@/analytics/{{NAME}}Analytics";
299
301
 
300
302
  describe("{{NAME}}Analytics", () => {
@@ -307,7 +309,7 @@ describe("{{NAME}}Analytics", () => {
307
309
  expect(typeof {{NAME}}Analytics.prototype.capture).toBe("function");
308
310
  });
309
311
  });
310
- `;var Xo=`import { decorator } from "@ooneex/analytics";
312
+ `;var sr=`import { decorator } from "@ooneex/analytics";
311
313
  import type { IAnalytics } from "@ooneex/analytics";
312
314
 
313
315
  type CaptureOptionsType = Record<string, unknown>;
@@ -318,7 +320,7 @@ export class {{NAME}}Analytics<T extends CaptureOptionsType = CaptureOptionsType
318
320
  // console.log("Analytics captured:", options);
319
321
  }
320
322
  }
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";
323
+ `;class Le{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=Il(t).replace(/Analytics$/,"");let o=sr.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=tr.replace(/{{NAME}}/g,t),d=V(r,"tests","analytics"),m=V(process.cwd(),d),p=V(m,`${t}Analytics.spec.ts`);await Bun.write(p,l);let c=new Dl;c.success(`${V(a,t)}Analytics.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),c.success(`${V(d,t)}Analytics.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}Le=y([b.command()],Le);import{join as M}from"path";import{TerminalLogger as Xl}from"@ooneex/logger";import{toKebabCase as Jl,toSnakeCase as ed}from"@ooneex/utils";var or=se(ne(),1);var rr=async(e)=>{let t=new Ae;return(await or.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 ar=`import { RuleConfigSeverity, type UserConfig } from "@commitlint/types";
322
324
 
323
325
  const Configuration: UserConfig = {
324
326
  extends: ["@commitlint/config-conventional"],
@@ -459,7 +461,7 @@ const Configuration: UserConfig = {
459
461
  };
460
462
 
461
463
  export default Configuration;
462
- `;var sr=`# Logs
464
+ `;var ir=`# Logs
463
465
  logs
464
466
  *.log
465
467
  npm-debug.log*
@@ -609,7 +611,7 @@ vite.config.ts.timestamp-*
609
611
 
610
612
  # Application
611
613
  var/
612
- `;var or=`import { inject } from "@ooneex/container";
614
+ `;var nr=`import { inject } from "@ooneex/container";
613
615
  import { AppEnv } from "@ooneex/app-env";
614
616
  import { DataSource } from "typeorm";
615
617
  import { TypeormDatabase, DatabaseException, decorator } from "@ooneex/database";
@@ -643,7 +645,7 @@ export class AppDatabase extends TypeormDatabase {
643
645
  return this.source;
644
646
  }
645
647
  }
646
- `;var rr=`{
648
+ `;var lr=`{
647
649
  "$schema": "./node_modules/@biomejs/biome/configuration_schema.json",
648
650
  "vcs": {
649
651
  "enabled": true,
@@ -722,7 +724,7 @@ export class AppDatabase extends TypeormDatabase {
722
724
  }
723
725
  }
724
726
  }
725
- `;var ar=`[test]
727
+ `;var dr=`[test]
726
728
  coverage = true
727
729
 
728
730
  [workspace]
@@ -753,7 +755,7 @@ buildDependencies = [
753
755
  "@swc/core",
754
756
  "nx",
755
757
  ]
756
- `;var ir=`# use the official Bun image
758
+ `;var mr=`# use the official Bun image
757
759
  # see all versions at https://hub.docker.com/r/oven/bun/tags
758
760
  FROM oven/bun:1 AS base
759
761
  WORKDIR /{{NAME}}
@@ -800,7 +802,7 @@ COPY --from=prerelease /{{NAME}}/dist .
800
802
  USER bun
801
803
  EXPOSE 3000/tcp
802
804
  ENTRYPOINT [ "bun", "run", "index.js" ]
803
- `;var nr=`services:
805
+ `;var cr=`services:
804
806
  # PostgreSQL - Primary relational database
805
807
  # Docs: https://www.postgresql.org/docs/
806
808
  # Connection: postgresql://ooneex:ooneex@localhost:5432/ooneex
@@ -834,7 +836,7 @@ ENTRYPOINT [ "bun", "run", "index.js" ]
834
836
  volumes:
835
837
  {{NAME}}_db_data:
836
838
  {{NAME}}_redis_data:
837
- `;var Mt=`# =============================================================================
839
+ `;var It=`# =============================================================================
838
840
  # App
839
841
  # =============================================================================
840
842
 
@@ -1026,7 +1028,7 @@ SYSTEM_USERS=
1026
1028
  SUPER_ADMIN_USERS=
1027
1029
  # Comma-separated admin user emails
1028
1030
  ADMIN_USERS=
1029
- `;var lr=`import { PostHogAnalytics } from "@ooneex/analytics";
1031
+ `;var pr=`import { PostHogAnalytics } from "@ooneex/analytics";
1030
1032
  import { App } from "@ooneex/app";
1031
1033
  import { RedisCache } from "@ooneex/cache";
1032
1034
  import { LogtailLogger, ExceptionLogger, TerminalLogger } from "@ooneex/logger";
@@ -1056,7 +1058,7 @@ const app = new App({
1056
1058
  });
1057
1059
 
1058
1060
  await app.run();
1059
- `;var dr=`{
1061
+ `;var ur=`{
1060
1062
  "$schema": "./node_modules/nx/schemas/nx-schema.json",
1061
1063
  "targetDefaults": {
1062
1064
  "build": {
@@ -1086,10 +1088,8 @@ await app.run();
1086
1088
  ],
1087
1089
  "packageManager": "bun"
1088
1090
  }
1089
- `;var mr=`{
1091
+ `;var hr=`{
1090
1092
  "name": "{{NAME}}",
1091
- "module": "index.ts",
1092
- "private": true,
1093
1093
  "scripts": {
1094
1094
  "dev": "bun run --filter app dev",
1095
1095
  "build": "bun run --filter app build",
@@ -1103,7 +1103,6 @@ await app.run();
1103
1103
  "commit": "bunx commit",
1104
1104
  "prepare": "husky"
1105
1105
  },
1106
- "type": "module",
1107
1106
  "workspaces": [
1108
1107
  "modules/*"
1109
1108
  ],
@@ -1161,7 +1160,7 @@ await app.run();
1161
1160
  ]
1162
1161
  }
1163
1162
  }
1164
- `;var cr=`{
1163
+ `;var fr=`{
1165
1164
  "compilerOptions": {
1166
1165
  "jsx": "react-jsx",
1167
1166
  "lib": ["ES2022", "DOM"],
@@ -1190,7 +1189,7 @@ await app.run();
1190
1189
  },
1191
1190
  "exclude": ["node_modules", ".github", ".husky", ".nx", ".zed", ".vscode"]
1192
1191
  }
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";
1192
+ `;import{join as L}from"path";import{TerminalLogger as zl}from"@ooneex/logger";import{toKebabCase as Zl,toPascalCase as Ql}from"@ooneex/utils";var gr=`import type { ModuleType } from "@ooneex/module";
1194
1193
 
1195
1194
  export const {{NAME}}Module: ModuleType = {
1196
1195
  controllers: [],
@@ -1200,7 +1199,7 @@ export const {{NAME}}Module: ModuleType = {
1200
1199
  cronJobs: [],
1201
1200
  events: [],
1202
1201
  };
1203
- `;var ur=`{
1202
+ `;var yr=`{
1204
1203
  "name": "@module/{{NAME}}",
1205
1204
  "description": "",
1206
1205
  "version": "0.0.1",
@@ -1209,7 +1208,7 @@ export const {{NAME}}Module: ModuleType = {
1209
1208
  "lint": "tsgo --noEmit && bunx biome lint"
1210
1209
  }
1211
1210
  }
1212
- `;var hr=`import { describe, expect, test } from "bun:test";
1211
+ `;var br=`import { describe, expect, test } from "bun:test";
1213
1212
  import { {{NAME}}Module } from "@/{{NAME}}Module";
1214
1213
 
1215
1214
  describe("{{NAME}}Module", () => {
@@ -1233,7 +1232,7 @@ describe("{{NAME}}Module", () => {
1233
1232
  expect(Array.isArray({{NAME}}Module.events)).toBe(true);
1234
1233
  });
1235
1234
  });
1236
- `;var fr=`{
1235
+ `;var wr=`{
1237
1236
  "extends": "../../tsconfig.json",
1238
1237
  "compilerOptions": {
1239
1238
  "types": ["@types/bun"],
@@ -1244,10 +1243,10 @@ describe("{{NAME}}Module", () => {
1244
1243
  "include": ["src/**/*.ts", "src/**/*.tsx", "tests/**/*.ts", "tests/**/*.tsx"],
1245
1244
  "exclude": ["node_modules", "dist"]
1246
1245
  }
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}";
1246
+ `;class he{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
1247
  `,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";
1248
+ `,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 p=new RegExp(`(${m}:\\s*\\[)([^\\]]*)`,"s"),c=o.match(p);if(c){let u=c[2]?.trim(),h=`...${r}.${m}`,f=u?`${u}, ${h}`:h;o=o.replace(p,`$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)}
1249
+ `)}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=Ql(a).replace(/Module$/,""),n=Zl(i),l=L(t,"modules",n),d=L(l,"src"),m=L(l,"tests"),p=gr.replace(/{{NAME}}/g,i),c=yr.replace(/{{NAME}}/g,n),u=br.replace(/{{NAME}}/g,i);if(await Bun.write(L(d,`${i}Module.ts`),p),!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"),c),await Bun.write(L(l,"tsconfig.json"),wr),await Bun.write(L(m,`${i}Module.spec.ts`),u),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 zl().success(`modules/${n} created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}he=y([b.command()],he);class Ue{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 rr({message:"Enter destination path",initial:o});let r=hr.replace(/{{NAME}}/g,o);await Bun.write(M(s,".commitlintrc.ts"),ar),await Bun.write(M(s,".gitignore"),ir),await Bun.write(M(s,"biome.jsonc"),lr),await Bun.write(M(s,"bunfig.toml"),dr),await Bun.write(M(s,"nx.json"),ur),await Bun.write(M(s,"package.json"),r),await Bun.write(M(s,"tsconfig.json"),fr),await Bun.write(M(s,".husky","commit-msg"),'bunx commitlint --edit "$1"'),await Bun.write(M(s,".husky","pre-commit"),"lint-staged"),await new he().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=It.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"),It),await Bun.write(M(s,"modules","app","src","databases","AppDatabase.ts"),nr),await Bun.write(M(s,"modules","app","src","index.ts"),pr);let d=ed(t),m=cr.replace(/{{NAME}}/g,d);await Bun.write(M(s,"modules","app","docker-compose.yml"),m);let p=mr.replace(/{{NAME}}/g,d);await Bun.write(M(s,"modules","app","Dockerfile"),p),await Bun.write(M(s,"modules","app","var",".gitkeep"),""),new Xl().success(`${o} created successfully at ${s}`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}Ue=y([b.command()],Ue);import{join as Y}from"path";import{TerminalLogger as od}from"@ooneex/logger";import{toPascalCase as rd}from"@ooneex/utils";var xr=`import { describe, expect, test } from "bun:test";
1251
1250
  import { {{NAME}}Cache } from "@/cache/{{NAME}}Cache";
1252
1251
 
1253
1252
  describe("{{NAME}}Cache", () => {
@@ -1275,7 +1274,7 @@ describe("{{NAME}}Cache", () => {
1275
1274
  expect(typeof {{NAME}}Cache.prototype.has).toBe("function");
1276
1275
  });
1277
1276
  });
1278
- `;var gr=`import { CacheException, decorator } from "@ooneex/cache";
1277
+ `;var Er=`import { CacheException, decorator } from "@ooneex/cache";
1279
1278
  import type { ICache } from "@ooneex/cache";
1280
1279
 
1281
1280
  @decorator.cache()
@@ -1296,7 +1295,7 @@ export class {{NAME}}Cache implements ICache {
1296
1295
  throw new CacheException(\`Failed to check if key "\${key}" exists: Not implemented\`);
1297
1296
  }
1298
1297
  }
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";
1298
+ `;class $e{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=rd(t).replace(/Cache$/,"");let o=Er.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=xr.replace(/{{NAME}}/g,t),d=Y(r,"tests","cache"),m=Y(process.cwd(),d),p=Y(m,`${t}Cache.spec.ts`);await Bun.write(p,l);let c=new od;c.success(`${Y(a,t)}Cache.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),c.success(`${Y(d,t)}Cache.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}$e=y([b.command()],$e);import{join as Ge}from"path";import{TerminalLogger as vd}from"@ooneex/logger";var Ar="---\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 vr="---\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 Nr="---\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 Tr="---\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 Sr="---\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 Cr="---\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 Mr="---\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 Rr="---\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 _r="---\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 Dr="---\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 Ir="---\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 Pr="---\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 Or="---\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 Br="---\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 Lr="---\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 Ur="---\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 $r="---\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 Gr="---\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 Nd={"make.ai":Ar,"make.analytics":vr,"make.cache":Nr,"make.controller":Tr,"make.cron":Sr,"make.database":Cr,"make.entity":Mr,"make.logger":Rr,"make.mailer":_r,"make.middleware":Dr,"make.migration":Ir,"make.permission":Pr,"make.pubsub":Or,"make.repository":Br,"make.seed":Lr,"make.service":Ur,"make.storage":$r,"make.vector-database":Gr};class ke{getName(){return"make:claude:skill"}getDescription(){return"Generate Claude skills from templates"}async run(){let e=Ge(".claude","skills"),t=Ge(process.cwd(),e),s=new vd;for(let[o,r]of Object.entries(Nd)){let a=o.replace(/\./g,"-"),i=Ge(t,a,"SKILL.md");await Bun.write(i,r),s.success(`${Ge(e,a,"SKILL.md")} created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}}ke=y([b.command()],ke);import{basename as kd,join as I}from"path";import{TerminalLogger as Wd}from"@ooneex/logger";import{toKebabCase as qd,toPascalCase as Lt,trim as Kd}from"@ooneex/utils";var kr=se(ne(),1),fe=async(e)=>{return(await kr.prompt({type:"confirm",name:"confirm",message:e.message})).confirm};var ve=["GET","POST","PUT","DELETE","PATCH","OPTIONS","HEAD"];var Wr=se(ne(),1);import{Assert as Td,Validation as Sd}from"@ooneex/validation";class Pt extends Sd{getConstraint(){return Td("string >= 3")}getErrorMessage(){return`Route method must be one of: ${ve.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(!ve.includes(r))return{isValid:!1,message:this.getErrorMessage()||"Invalid route method"};return{isValid:!0}}}var qr=async(e)=>{return(await Wr.prompt({type:"select",name:"method",message:e.message,initial:e.initial??0,choices:ve.map((s)=>s),validate:(s)=>{let r=new Pt().validate(s);if(!r.isValid)return r.message||"Route method is invalid";return!0}})).method};var Kr=se(ne(),1);import{Assert as Cd,Validation as Md}from"@ooneex/validation";var Rd=/^[a-zA-Z0-9]+\.[a-zA-Z0-9]+\.[a-zA-Z0-9]+$/;class Ot extends Md{getConstraint(){return Cd("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(!Rd.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 Hr=async(e)=>{return(await Kr.prompt({type:"input",name:"routeName",message:e.message,validate:(s)=>{let r=new Ot().validate(s);if(!r.isValid)return r.message||"Route name is invalid";return!0}})).routeName};var Fr=se(ne(),1);import{Assert as _d,Validation as Dd}from"@ooneex/validation";var Id=1,Pd=/^\/[\w\-/:]*$/,Od=/^[a-zA-Z0-9\-_]+$/,Bd=/^:[a-zA-Z][a-zA-Z0-9]*$/;class Bt extends Dd{getConstraint(){return _d(`string >= ${Id}`)}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(!Pd.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(!Bd.test(a))return{isValid:!1,message:`Invalid parameter segment '${a}'. Parameters must follow format ':paramName' with alphanumeric characters only`}}else if(!Od.test(a))return{isValid:!1,message:`Invalid path segment '${a}'. Segments must contain only letters, numbers, hyphens, and underscores`}}return{isValid:!0}}}var Vr=async(e)=>{return(await Fr.prompt({type:"input",name:"path",message:e.message,initial:e.initial??"/",validate:(s)=>{let r=new Bt().validate(s);if(!r.isValid)return r.message||"Route path is invalid";return!0}})).path};var Yr=`import type { ContextType } from "@ooneex/socket";
1300
1299
  import { ERole } from "@ooneex/role";
1301
1300
  import { Route } from "@ooneex/routing";
1302
1301
  import { Assert } from "@ooneex/validation";
@@ -1329,7 +1328,7 @@ export class {{NAME}}Controller {
1329
1328
  });
1330
1329
  }
1331
1330
  }
1332
- `;var Hr=`import { describe, expect, test } from "bun:test";
1331
+ `;var jr=`import { describe, expect, test } from "bun:test";
1333
1332
  import { {{NAME}}Controller } from "@/controllers/{{NAME}}Controller";
1334
1333
 
1335
1334
  describe("{{NAME}}Controller", () => {
@@ -1342,7 +1341,7 @@ describe("{{NAME}}Controller", () => {
1342
1341
  expect(typeof {{NAME}}Controller.prototype.index).toBe("function");
1343
1342
  });
1344
1343
  });
1345
- `;var Fr=`import type { ContextType } from "@ooneex/controller";
1344
+ `;var zr=`import type { ContextType } from "@ooneex/controller";
1346
1345
  import { ERole } from "@ooneex/role";
1347
1346
  import { Route } from "@ooneex/routing";
1348
1347
  import { Assert } from "@ooneex/validation";
@@ -1375,7 +1374,7 @@ export class {{NAME}}Controller {
1375
1374
  });
1376
1375
  }
1377
1376
  }
1378
- `;var Vr=`export type {{TYPE_NAME}}RouteType = {
1377
+ `;var Zr=`export type {{TYPE_NAME}}RouteType = {
1379
1378
  params: {
1380
1379
 
1381
1380
  },
@@ -1389,9 +1388,9 @@ export class {{NAME}}Controller {
1389
1388
 
1390
1389
  },
1391
1390
  };
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}";
1391
+ `;class We{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}";
1393
1392
  `,a=s.lastIndexOf("import "),i=s.indexOf(`
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";
1393
+ `,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 fe({message:"Is this a socket controller?"});t=Lt(t).replace(/Controller$/,"");let{route:r={}}=e,i=(o?Yr:zr).replaceAll("{{NAME}}",t),n="",l="";if(!r.name)r.name=await Hr({message:"Enter route name (e.g., api.user.create)"});if(n=Lt(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 Vr({message:"Enter route path",initial:"/"});let d=`/${qd(Kd(r.path,"/"))}`;if(i=i.replaceAll("{{ROUTE_PATH}}",d),!o&&!r.method)r.method=await qr({message:"Enter route method"});if(!o&&r.method)i=i.replaceAll("{{ROUTE_METHOD}}",r.method.toLowerCase());let m=s?I("modules",s):".",p=I(m,"src","controllers"),c=I(process.cwd(),p),u=I(c,`${t}Controller.ts`);await Bun.write(u,i);let h=I(m,"src","types","routes"),f=I(process.cwd(),h),E=I(f,`${l}.ts`),g=Zr.replaceAll("{{TYPE_NAME}}",n);await Bun.write(E,g);let x=jr.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 _=Lt(kd(process.cwd())),Ne=I(process.cwd(),"src",`${_}Module.ts`);if(await Bun.file(Ne).exists())await this.addToModule(Ne,t);let te=new Wd;te.success(`${I(p,t)}Controller.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),te.success(`${I(h,l)}.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),te.success(`${I(A,t)}Controller.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}We=y([b.command()],We);import{basename as Vd,join as $}from"path";import{TerminalLogger as Yd}from"@ooneex/logger";import{toPascalCase as Jr}from"@ooneex/utils";var Qr=`import { describe, expect, test } from "bun:test";
1395
1394
  import { {{NAME}}Cron } from "@/cron/{{NAME}}Cron";
1396
1395
 
1397
1396
  describe("{{NAME}}Cron", () => {
@@ -1414,7 +1413,7 @@ describe("{{NAME}}Cron", () => {
1414
1413
  expect(typeof {{NAME}}Cron.prototype.handler).toBe("function");
1415
1414
  });
1416
1415
  });
1417
- `;var jr=`import type { TimeZoneType } from "@ooneex/country";
1416
+ `;var Xr=`import type { TimeZoneType } from "@ooneex/country";
1418
1417
  import type { CronTimeType } from "@ooneex/cron";
1419
1418
  import { Cron, decorator } from "@ooneex/cron";
1420
1419
 
@@ -1435,9 +1434,9 @@ export class {{NAME}}Cron extends Cron {
1435
1434
  // console.log("{{NAME}}Cron handler executed");
1436
1435
  }
1437
1436
  }
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}";
1437
+ `;class qe{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}";
1439
1438
  `,a=s.lastIndexOf("import "),i=s.indexOf(`
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";
1439
+ `,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=Jr(t).replace(/Cron$/,"");let o=Xr.replace(/{{NAME}}/g,t),r=s?$("modules",s):".",a=$(r,"src","cron"),i=$(process.cwd(),a),n=$(i,`${t}Cron.ts`);await Bun.write(n,o);let l=Qr.replace(/{{NAME}}/g,t),d=$(r,"tests","cron"),m=$(process.cwd(),d),p=$(m,`${t}Cron.spec.ts`);await Bun.write(p,l);let c=Jr(Vd(process.cwd())),u=$(process.cwd(),"src",`${c}Module.ts`);if(await Bun.file(u).exists())await this.addToModule(u,t);let h=new Yd;h.success(`${$(a,t)}Cron.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),h.success(`${$(d,t)}Cron.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}qe=y([b.command()],qe);import{join as j}from"path";import{TerminalLogger as Zd}from"@ooneex/logger";import{toPascalCase as Qd}from"@ooneex/utils";var ea=`import { describe, expect, test } from "bun:test";
1441
1440
  import { {{NAME}}Database } from "@/databases/{{NAME}}Database";
1442
1441
 
1443
1442
  describe("{{NAME}}Database", () => {
@@ -1450,7 +1449,7 @@ describe("{{NAME}}Database", () => {
1450
1449
  expect(typeof {{NAME}}Database.prototype.getSource).toBe("function");
1451
1450
  });
1452
1451
  });
1453
- `;var Qr=`import { DataSource } from "typeorm";
1452
+ `;var ta=`import { DataSource } from "typeorm";
1454
1453
  import { TypeormDatabase, DatabaseException, decorator } from "@ooneex/database";
1455
1454
 
1456
1455
  @decorator.database()
@@ -1473,7 +1472,7 @@ export class {{NAME}}Database extends TypeormDatabase {
1473
1472
  return this.source;
1474
1473
  }
1475
1474
  }
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:
1475
+ `;class Ke{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=Qd(t).replace(/DatabaseAdapter$/,"").replace(/Database$/,"");let o=ta.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=ea.replace(/{{NAME}}/g,t),d=j(r,"tests","databases"),m=j(process.cwd(),d),p=j(m,`${t}Database.spec.ts`);await Bun.write(p,l);let c=new Zd;c.success(`${j(a,t)}Database.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),c.success(`${j(d,t)}Database.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}Ke=y([b.command()],Ke);import{join as Ta}from"path";import{TerminalLogger as ym}from"@ooneex/logger";var{YAML:Sa}=globalThis.Bun;var oa=se(ne(),1),sa=["clickhouse","elasticsearch","grafana","jaeger","keycloak","libretranslate","maildev","memcached","minio","mongodb","mysql","nats","postgres","prometheus","rabbitmq","redis","temporal","vault"],ra=async(e)=>{return(await oa.prompt({type:"autocomplete",name:"service",message:e.message,initial:e.initial,choices:sa.map((s)=>s),validate:(s)=>{if(!sa.includes(s))return"Docker service is invalid";return!0}})).service};var aa=`services:
1477
1476
  # ClickHouse - Column-oriented OLAP database for analytics
1478
1477
  # Docs: https://clickhouse.com/docs
1479
1478
  # HTTP API: http://localhost:8123
@@ -1494,7 +1493,7 @@ export class {{NAME}}Database extends TypeormDatabase {
1494
1493
 
1495
1494
  volumes:
1496
1495
  clickhouse_data:
1497
- `;var sa=`services:
1496
+ `;var ia=`services:
1498
1497
  # Elasticsearch - Full-text search and analytics engine
1499
1498
  # Docs: https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
1500
1499
  # HTTP API: http://localhost:9200
@@ -1515,7 +1514,7 @@ volumes:
1515
1514
 
1516
1515
  volumes:
1517
1516
  elasticsearch_data:
1518
- `;var oa=`services:
1517
+ `;var na=`services:
1519
1518
  # Grafana - Metrics visualization and dashboards
1520
1519
  # Docs: https://grafana.com/docs/grafana/latest/
1521
1520
  # Web UI: http://localhost:3000 (ooneex/ooneex)
@@ -1533,7 +1532,7 @@ volumes:
1533
1532
 
1534
1533
  volumes:
1535
1534
  grafana_data:
1536
- `;var ra=`services:
1535
+ `;var la=`services:
1537
1536
  # Jaeger - Distributed tracing system
1538
1537
  # Docs: https://www.jaegertracing.io/docs/
1539
1538
  # Web UI: http://localhost:16686
@@ -1547,7 +1546,7 @@ volumes:
1547
1546
  - "16686:16686"
1548
1547
  - "6831:6831/udp"
1549
1548
  - "14268:14268"
1550
- `;var aa=`services:
1549
+ `;var da=`services:
1551
1550
  # Keycloak - Identity and access management
1552
1551
  # Docs: https://www.keycloak.org/documentation
1553
1552
  # Admin Console: http://localhost:8080 (ooneex/ooneex)
@@ -1561,7 +1560,7 @@ volumes:
1561
1560
  - KEYCLOAK_ADMIN=ooneex
1562
1561
  - KEYCLOAK_ADMIN_PASSWORD=ooneex
1563
1562
  command: start-dev
1564
- `;var ia=`services:
1563
+ `;var ma=`services:
1565
1564
  # LibreTranslate - Self-hosted machine translation API
1566
1565
  # Docs: https://libretranslate.com/docs/
1567
1566
  # API: http://localhost:4000
@@ -1588,7 +1587,7 @@ volumes:
1588
1587
 
1589
1588
  volumes:
1590
1589
  libretranslate_models:
1591
- `;var na=`services:
1590
+ `;var ca=`services:
1592
1591
  # MailDev - Email testing tool with web UI
1593
1592
  # Docs: https://github.com/maildev/maildev
1594
1593
  # Web UI: http://localhost:1080
@@ -1599,7 +1598,7 @@ volumes:
1599
1598
  ports:
1600
1599
  - "1080:1080"
1601
1600
  - "1025:1025"
1602
- `;var la=`services:
1601
+ `;var pa=`services:
1603
1602
  # Memcached - Distributed memory caching system
1604
1603
  # Docs: https://memcached.org/
1605
1604
  # Connection: localhost:11211
@@ -1609,7 +1608,7 @@ volumes:
1609
1608
  restart: "on-failure"
1610
1609
  ports:
1611
1610
  - "11211:11211"
1612
- `;var da=`services:
1611
+ `;var ua=`services:
1613
1612
  # MinIO - S3-compatible object storage
1614
1613
  # Docs: https://min.io/docs/minio/container/index.html
1615
1614
  # API: http://localhost:9000
@@ -1630,7 +1629,7 @@ volumes:
1630
1629
 
1631
1630
  volumes:
1632
1631
  minio_data:
1633
- `;var ma=`services:
1632
+ `;var ha=`services:
1634
1633
  # MongoDB - NoSQL document database
1635
1634
  # Docs: https://www.mongodb.com/docs/
1636
1635
  # Connection: mongodb://ooneex:ooneex@localhost:27017/ooneex
@@ -1649,7 +1648,7 @@ volumes:
1649
1648
 
1650
1649
  volumes:
1651
1650
  mongodb_data:
1652
- `;var ca=`services:
1651
+ `;var fa=`services:
1653
1652
  # MySQL - Alternative relational database
1654
1653
  # Docs: https://dev.mysql.com/doc/
1655
1654
  # Connection: mysql://ooneex:ooneex@localhost:3306/ooneex
@@ -1669,7 +1668,7 @@ volumes:
1669
1668
 
1670
1669
  volumes:
1671
1670
  mysql_db:
1672
- `;var pa=`services:
1671
+ `;var ga=`services:
1673
1672
  # NATS - High-performance messaging system with JetStream
1674
1673
  # Docs: https://docs.nats.io/
1675
1674
  # Client: localhost:4222
@@ -1682,7 +1681,7 @@ volumes:
1682
1681
  - "4222:4222"
1683
1682
  - "8222:8222"
1684
1683
  command: "--jetstream --http_port 8222"
1685
- `;var ua=`services:
1684
+ `;var ya=`services:
1686
1685
  # Jade - FastAPI REST API to fetch YouTube metadata and download videos or audio via Dockerized microservice.
1687
1686
  # API: http://localhost:8000
1688
1687
  # Docs: http://localhost:8000/docs
@@ -1700,7 +1699,7 @@ volumes:
1700
1699
 
1701
1700
  volumes:
1702
1701
  jade_data:
1703
- `;var ha=`services:
1702
+ `;var ba=`services:
1704
1703
  # PostgreSQL - Primary relational database
1705
1704
  # Docs: https://www.postgresql.org/docs/
1706
1705
  # Connection: postgresql://ooneex:ooneex@localhost:5432/ooneex
@@ -1721,7 +1720,7 @@ volumes:
1721
1720
 
1722
1721
  volumes:
1723
1722
  postgres_db:
1724
- `;var fa=`services:
1723
+ `;var wa=`services:
1725
1724
  # Prometheus - Metrics collection and monitoring
1726
1725
  # Docs: https://prometheus.io/docs/
1727
1726
  # Web UI: http://localhost:9090
@@ -1736,7 +1735,7 @@ volumes:
1736
1735
 
1737
1736
  volumes:
1738
1737
  prometheus_data:
1739
- `;var ya=`services:
1738
+ `;var xa=`services:
1740
1739
  # RabbitMQ - Message broker for async processing
1741
1740
  # Docs: https://www.rabbitmq.com/docs
1742
1741
  # AMQP: amqp://ooneex:ooneex@localhost:5672/ooneex
@@ -1758,7 +1757,7 @@ volumes:
1758
1757
 
1759
1758
  volumes:
1760
1759
  rabbitmq_data:
1761
- `;var ga=`services:
1760
+ `;var Ea=`services:
1762
1761
  # Redis - In-memory data store for caching and sessions
1763
1762
  # Docs: https://redis.io/docs/
1764
1763
  # Connection: redis://localhost:6379
@@ -1773,7 +1772,7 @@ volumes:
1773
1772
 
1774
1773
  volumes:
1775
1774
  redis_data:
1776
- `;var ba=`services:
1775
+ `;var Aa=`services:
1777
1776
  # Temporal - Workflow orchestration engine
1778
1777
  # Docs: https://docs.temporal.io/
1779
1778
  # gRPC: localhost:7233
@@ -1790,7 +1789,7 @@ volumes:
1790
1789
  - POSTGRES_USER=ooneex
1791
1790
  - POSTGRES_PWD=ooneex
1792
1791
  - POSTGRES_SEEDS=postgres
1793
- `;var wa=`services:
1792
+ `;var va=`services:
1794
1793
  # Vault - Secrets management and encryption
1795
1794
  # Docs: https://developer.hashicorp.com/vault/docs
1796
1795
  # Web UI: http://localhost:8200 (token: ooneex)
@@ -1805,20 +1804,20 @@ volumes:
1805
1804
  - VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:8200
1806
1805
  cap_add:
1807
1806
  - IPC_LOCK
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(`
1807
+ `;var Na={clickhouse:aa,elasticsearch:ia,grafana:na,"ooneex-jade":ya,jaeger:la,keycloak:da,libretranslate:ma,maildev:ca,memcached:pa,minio:ua,mongodb:ha,mysql:fa,nats:ga,postgres:ba,prometheus:wa,rabbitmq:xa,redis:Ea,temporal:Aa,vault:va};function bm(e){let t=e.split(`
1809
1808
  `),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(`
1811
- volumes:`),h=p.indexOf(`
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()}
1809
+ `)}function wm(e){let t=Sa.parse(e);return t.volumes?Object.keys(t.volumes):[]}class He{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 ra({message:"Select docker service"});let s=Na[t],o=Ta(process.cwd(),"docker-compose.yml"),r=new ym,a=Bun.file(o);if(await a.exists()){let l=await a.text(),d=Sa.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=bm(s),p=wm(s),c=l,u=c.indexOf(`
1810
+ volumes:`),h=c.indexOf(`
1811
+ networks:`),f=-1;if(u!==-1&&h!==-1)f=Math.min(u,h);else if(u!==-1)f=u;else if(h!==-1)f=h;if(f!==-1)c=`${c.slice(0,f)}
1812
+ ${m}${c.slice(f)}`;else c=`${c.trimEnd()}
1813
+ ${m}`;for(let E of p)if(!c.includes(` ${E}:`))if(c.includes(`
1814
+ volumes:`)){let g=c.indexOf(`
1815
+ volumes:`),x=c.slice(g+9);c=`${c.slice(0,g+9)}
1816
+ ${E}:${x}`}else c=`${c.trimEnd()}
1818
1817
 
1819
1818
  volumes:
1820
1819
  ${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";
1820
+ `;await Bun.write(o,c)}else await Bun.write(o,s);let i=Ta(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})}}He=y([b.command()],He);var Da=se(Ca(),1);import{basename as Am,join as G}from"path";import{TerminalLogger as vm}from"@ooneex/logger";import{toPascalCase as _a,toSnakeCase as Nm}from"@ooneex/utils";var Ma=`import { describe, expect, test } from "bun:test";
1822
1821
  import { {{NAME}}Entity } from "@/entities/{{NAME}}Entity";
1823
1822
 
1824
1823
  describe("{{NAME}}Entity", () => {
@@ -1883,7 +1882,7 @@ describe("{{NAME}}Entity", () => {
1883
1882
  expect("deletedAt" in entity).toBe(true);
1884
1883
  });
1885
1884
  });
1886
- `;var Ta=`import type { LocaleType } from "@ooneex/translation";
1885
+ `;var Ra=`import type { LocaleType } from "@ooneex/translation";
1887
1886
  import { random } from "@ooneex/utils";
1888
1887
  import { Column, CreateDateColumn, DeleteDateColumn, PrimaryColumn, UpdateDateColumn } from "typeorm";
1889
1888
 
@@ -1934,9 +1933,9 @@ export class {{NAME}}Entity extends BaseEntity {
1934
1933
  @DeleteDateColumn({ name: "deleted_at" })
1935
1934
  deletedAt?: Date;
1936
1935
  }
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}";
1936
+ `;class Fe{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}";
1938
1937
  `,a=s.lastIndexOf("import "),i=s.indexOf(`
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";
1938
+ `,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=_a(t).replace(/Entity$/,""),!o)o=Nm(Da.default(t));let r=Ra.replace(/{{NAME}}/g,t).replace(/{{TABLE_NAME}}/g,o),a=s?G("modules",s):".",i=G(a,"src","entities"),n=G(process.cwd(),i),l=G(n,`${t}Entity.ts`);await Bun.write(l,r);let d=Ma.replace(/{{NAME}}/g,t),m=G(a,"tests","entities"),p=G(process.cwd(),m),c=G(p,`${t}Entity.spec.ts`);await Bun.write(c,d);let u=_a(Am(process.cwd())),h=G(process.cwd(),"src",`${u}Module.ts`);if(await Bun.file(h).exists())await this.addToModule(h,t);let f=new vm;f.success(`${G(i,t)}Entity.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),f.success(`${G(m,t)}Entity.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}Fe=y([b.command()],Fe);import{join as z}from"path";import{TerminalLogger as Cm}from"@ooneex/logger";import{toPascalCase as Mm}from"@ooneex/utils";var Ia=`import { describe, expect, test } from "bun:test";
1940
1939
  import { {{NAME}}Logger } from "@/loggers/{{NAME}}Logger";
1941
1940
 
1942
1941
  describe("{{NAME}}Logger", () => {
@@ -1979,7 +1978,7 @@ describe("{{NAME}}Logger", () => {
1979
1978
  expect(typeof {{NAME}}Logger.prototype.error).toBe("function");
1980
1979
  });
1981
1980
  });
1982
- `;var Ra=`import type { IException } from "@ooneex/exception";
1981
+ `;var Pa=`import type { IException } from "@ooneex/exception";
1983
1982
  import type { ILogger } from "@ooneex/logger";
1984
1983
  import type { ScalarType } from "@ooneex/types";
1985
1984
  import { decorator } from "@ooneex/logger";
@@ -2014,7 +2013,7 @@ export class {{NAME}}Logger implements ILogger {
2014
2013
  // Handle error logging
2015
2014
  }
2016
2015
  }
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";
2016
+ `;class Ve{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=Mm(t).replace(/Logger$/,"");let o=Pa.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=Ia.replace(/{{NAME}}/g,t),d=z(r,"tests","loggers"),m=z(process.cwd(),d),p=z(m,`${t}Logger.spec.ts`);await Bun.write(p,l);let c=new Cm;c.success(`${z(a,t)}Logger.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),c.success(`${z(d,t)}Logger.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}Ve=y([b.command()],Ve);import{join as P}from"path";import{TerminalLogger as Pm}from"@ooneex/logger";import{toPascalCase as Om}from"@ooneex/utils";var Oa=`import { describe, expect, test } from "bun:test";
2018
2017
  import { {{NAME}}Mailer } from "@/mailers/{{NAME}}Mailer";
2019
2018
 
2020
2019
  describe("{{NAME}}Mailer", () => {
@@ -2027,7 +2026,7 @@ describe("{{NAME}}Mailer", () => {
2027
2026
  expect(typeof {{NAME}}Mailer.prototype.send).toBe("function");
2028
2027
  });
2029
2028
  });
2030
- `;var Da=`import { inject } from "@ooneex/container";
2029
+ `;var Ba=`import { inject } from "@ooneex/container";
2031
2030
  import type { IMailer } from "@ooneex/mailer";
2032
2031
  import { type {{NAME}}MailerPropsType, {{NAME}}MailerTemplate } from "./{{NAME}}MailerTemplate";
2033
2032
 
@@ -2051,7 +2050,7 @@ export class {{NAME}}Mailer implements IMailer {
2051
2050
  });
2052
2051
  }
2053
2052
  }
2054
- `;var Ia=`import { describe, expect, test } from "bun:test";
2053
+ `;var La=`import { describe, expect, test } from "bun:test";
2055
2054
  import { {{NAME}}MailerTemplate } from "@/mailers/{{NAME}}MailerTemplate";
2056
2055
 
2057
2056
  describe("{{NAME}}MailerTemplate", () => {
@@ -2063,7 +2062,7 @@ describe("{{NAME}}MailerTemplate", () => {
2063
2062
  expect(typeof {{NAME}}MailerTemplate).toBe("function");
2064
2063
  });
2065
2064
  });
2066
- `;var Pa=`import { MailerLayout } from "@ooneex/mailer";
2065
+ `;var Ua=`import { MailerLayout } from "@ooneex/mailer";
2067
2066
 
2068
2067
  export type {{NAME}}MailerPropsType = {
2069
2068
  link: string;
@@ -2078,7 +2077,7 @@ export const {{NAME}}MailerTemplate = (props?: {{NAME}}MailerPropsType) => (
2078
2077
  <MailerLayout.Footer />
2079
2078
  </MailerLayout>
2080
2079
  );
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";
2080
+ `;class Ye{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=Om(t).replace(/Mailer$/,"");let o=Ba.replace(/{{NAME}}/g,t),r=Ua.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=Oa.replace(/{{NAME}}/g,t),p=La.replace(/{{NAME}}/g,t),c=P(a,"tests","mailers"),u=P(process.cwd(),c),h=P(u,`${t}Mailer.spec.ts`),f=P(u,`${t}MailerTemplate.spec.ts`);await Bun.write(h,m),await Bun.write(f,p);let E=new Pm;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(c,t)}Mailer.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),E.success(`${P(c,t)}MailerTemplate.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}Ye=y([b.command()],Ye);import{basename as $m,join as k}from"path";import{TerminalLogger as Gm}from"@ooneex/logger";import{toPascalCase as Wa}from"@ooneex/utils";var $a=`import type { ContextType } from "@ooneex/socket";
2082
2081
  import { decorator, type IMiddleware } from "@ooneex/middleware";
2083
2082
 
2084
2083
  @decorator.middleware()
@@ -2090,7 +2089,7 @@ export class {{NAME}}Middleware implements IMiddleware {
2090
2089
  return context
2091
2090
  }
2092
2091
  }
2093
- `;var Ba=`import { describe, expect, test } from "bun:test";
2092
+ `;var Ga=`import { describe, expect, test } from "bun:test";
2094
2093
  import { {{NAME}}Middleware } from "@/middlewares/{{NAME}}Middleware";
2095
2094
 
2096
2095
  describe("{{NAME}}Middleware", () => {
@@ -2103,7 +2102,7 @@ describe("{{NAME}}Middleware", () => {
2103
2102
  expect(typeof {{NAME}}Middleware.prototype.handler).toBe("function");
2104
2103
  });
2105
2104
  });
2106
- `;var La=`import type { ContextType } from "@ooneex/controller";
2105
+ `;var ka=`import type { ContextType } from "@ooneex/controller";
2107
2106
  import { decorator, type IMiddleware } from "@ooneex/middleware";
2108
2107
 
2109
2108
  @decorator.middleware()
@@ -2115,9 +2114,9 @@ export class {{NAME}}Middleware implements IMiddleware {
2115
2114
  return context
2116
2115
  }
2117
2116
  }
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}";
2117
+ `;class je{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}";
2119
2118
  `,a=s.lastIndexOf("import "),i=s.indexOf(`
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
2119
+ `,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 fe({message:"Is this a socket middleware?"});t=Wa(t).replace(/Middleware$/,"");let a=(o?$a:ka).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=Ga.replace(/{{NAME}}/g,t),p=k(i,"tests","middlewares"),c=k(process.cwd(),p),u=k(c,`${t}Middleware.spec.ts`);await Bun.write(u,m);let h=Wa($m(process.cwd())),f=k(process.cwd(),"src",`${h}Module.ts`);if(await Bun.file(f).exists())await this.addToModule(f,t);let E=new Gm;E.success(`${k(n,t)}Middleware.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),E.success(`${k(p,t)}Middleware.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}je=y([b.command()],je);import{join as ze}from"path";import{TerminalLogger as Wm}from"@ooneex/logger";import{migrationCreate as qm}from"@ooneex/migrations";var qa=`#!/usr/bin/env bun
2121
2120
 
2122
2121
  import { migrationUp } from "@ooneex/migrations";
2123
2122
  import "@/migrations/migrations";
@@ -2126,7 +2125,7 @@ await migrationUp({
2126
2125
  databaseUrl: Bun.env.DATABASE_URL || ":memory:",
2127
2126
  tableName: "migrations",
2128
2127
  });
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";
2128
+ `;class Ze{getName(){return"make:migration"}getDescription(){return"Generate a new migration file"}async run(e){let{module:t}=e,s=t?ze("modules",t):".",o=await qm({dir:ze(s,"src/migrations")}),r=ze(process.cwd(),s,"bin","migration","up.ts");if(!await Bun.file(r).exists())await Bun.write(r,qa);let i=ze(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 Wm;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})}}Ze=y([b.command()],Ze);import{basename as Fm,join as W}from"path";import{TerminalLogger as Vm}from"@ooneex/logger";import{toPascalCase as Fa}from"@ooneex/utils";var Ka=`import { describe, expect, test } from "bun:test";
2130
2129
  import { Permission } from "@ooneex/permission";
2131
2130
  import { {{NAME}}Permission } from "@/permissions/{{NAME}}Permission";
2132
2131
 
@@ -2151,7 +2150,7 @@ describe("{{NAME}}Permission", () => {
2151
2150
  });
2152
2151
 
2153
2152
  });
2154
- `;var ka=`import { decorator, Permission } from "@ooneex/permission";
2153
+ `;var Ha=`import { decorator, Permission } from "@ooneex/permission";
2155
2154
  import type { IUser } from "@ooneex/user";
2156
2155
 
2157
2156
  @decorator.permission()
@@ -2190,9 +2189,9 @@ export class {{NAME}}Permission extends Permission {
2190
2189
  return this;
2191
2190
  }
2192
2191
  }
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}";
2192
+ `;class Qe{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}";
2194
2193
  `,a=s.lastIndexOf("import "),i=s.indexOf(`
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";
2194
+ `,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=Fa(t).replace(/Permission$/,"");let o=Ha.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=Ka.replace(/{{NAME}}/g,t),d=W(r,"tests","permissions"),m=W(process.cwd(),d),p=W(m,`${t}Permission.spec.ts`);await Bun.write(p,l);let c=Fa(Fm(process.cwd())),u=W(process.cwd(),"src",`${c}Module.ts`);if(await Bun.file(u).exists())await this.addToModule(u,t);let h=new Vm;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})}}Qe=y([b.command()],Qe);import{basename as zm,join as q}from"path";import{TerminalLogger as Zm}from"@ooneex/logger";import{toKebabCase as Qm,toPascalCase as ja}from"@ooneex/utils";var Va=`import { describe, expect, test } from "bun:test";
2196
2195
  import { {{NAME}}PubSub } from "@/pubsub/{{NAME}}PubSub";
2197
2196
 
2198
2197
  describe("{{NAME}}PubSub", () => {
@@ -2230,7 +2229,7 @@ describe("{{NAME}}PubSub", () => {
2230
2229
  expect(typeof {{NAME}}PubSub.prototype.unsubscribeAll).toBe("function");
2231
2230
  });
2232
2231
  });
2233
- `;var Ka=`import { inject } from "@ooneex/container";
2232
+ `;var Ya=`import { inject } from "@ooneex/container";
2234
2233
  import type { ScalarType } from "@ooneex/types";
2235
2234
  import { decorator, PubSub, RedisPubSub } from "@ooneex/pub-sub";
2236
2235
 
@@ -2252,9 +2251,35 @@ export class {{NAME}}Event<Data extends Record<string, ScalarType> = Record<stri
2252
2251
  // TODO: Implement handler logic here
2253
2252
  }
2254
2253
  }
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}";
2254
+ `;class Xe{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}";
2256
2255
  `,a=s.lastIndexOf("import "),i=s.indexOf(`
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";
2256
+ `,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=ja(t).replace(/PubSub$/,""),!o)o=Qm(t);let r=Ya.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=Va.replace(/{{NAME}}/g,t),m=q(a,"tests","events"),p=q(process.cwd(),m),c=q(p,`${t}Event.spec.ts`);await Bun.write(c,d);let u=ja(zm(process.cwd())),h=q(process.cwd(),"src",`${u}Module.ts`);if(await Bun.file(h).exists())await this.addToModule(h,t);let f=new Zm;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})}}Xe=y([b.command()],Xe);import{execSync as ge}from"child_process";import{existsSync as Je,readdirSync as za}from"fs";import{join as Z}from"path";import{TerminalLogger as Xm}from"@ooneex/logger";var Jm={feat:"Added",fix:"Fixed",refactor:"Changed",perf:"Changed",style:"Changed",docs:"Changed",build:"Changed",ci:"Changed",chore:"Changed",revert:"Removed"};class et{getName(){return"make:release"}getDescription(){return"Release packages with version bump, changelog, and git tag"}async run(){let e=new Xm,t=process.cwd(),s=[],o=Z(t,"packages");if(Je(o))s.push(...za(o,{withFileTypes:!0}).filter((n)=>n.isDirectory()).map((n)=>({base:Z("packages",n.name),type:"package"})));let r=Z(t,"modules");if(Je(r))s.push(...za(r,{withFileTypes:!0}).filter((n)=>n.isDirectory()).map((n)=>({base:Z("modules",n.name),type:"module"})));if(s.length===0){e.error("No packages or modules found",void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0});return}let a=0;for(let n of s){let l=Z(t,n.base),d=Z(l,"package.json");if(!Je(d))continue;let m=JSON.parse(await Bun.file(d).text()),p=this.getLastTag(m.name),c=this.getCommitsSinceTag(p,n.base);if(c.length===0)continue;let u=this.determineBumpType(c),h=this.bumpVersion(m.version,u);m.version=h,await Bun.write(d,`${JSON.stringify(m,null,2)}
2257
+ `),await this.updateChangelog(l,h,c);let f=`${m.name}@${h}`;this.gitAdd(Z(n.base,"package.json"),Z(n.base,"CHANGELOG.md")),this.gitCommit(`chore(release): ${m.name}@${h}`),this.gitTag(f),e.success(`${m.name}@${h} released (${u} bump, ${c.length} commit(s))`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),a++}if(a===0){e.info(`No packages have unreleased commits
2258
+ `);return}if(e.success(`
2259
+ ${a} package(s) released`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),await fe({message:"Push commits and tags to remote?"}))try{ge("git push && git push --tags",{encoding:"utf-8",stdio:"inherit"}),e.success("Pushed commits and tags to remote",void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}catch{e.error("Failed to push to remote",void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}getLastTag(e){try{let t=ge(`git tag --list "${e}@*" --sort=-v:refname`,{encoding:"utf-8"}).trim();if(!t)return null;return t.split(`
2260
+ `)[0]??null}catch{return null}}getCommitsSinceTag(e,t){let s=e?`${e}..HEAD`:"HEAD",o="%H|%s";try{let r=ge(`git log ${s} --format="%H|%s" -- "${t}"`,{encoding:"utf-8"}).trim();if(!r)return[];let a=[],i=/^([a-z]+)\(([^)]+)\):\s*(.+)$/;for(let n of r.split(`
2261
+ `)){let[l,...d]=n.split("|"),m=d.join("|");if(!l||!m)continue;let p=m.match(i);if(p){let[,c,u,h]=p;if(c&&u&&h)a.push({hash:l.substring(0,8),type:c,scope:u,subject:h})}}return a}catch{return[]}}determineBumpType(e){for(let t of e)if(t.type==="feat")return"minor";return"patch"}bumpVersion(e,t){let s=e.split(".").map(Number),[o=0,r=0,a=0]=s;if(t==="minor")return`${o}.${r+1}.0`;return`${o}.${r}.${a+1}`}async updateChangelog(e,t,s){let o=Z(e,"CHANGELOG.md"),r=new Date().toISOString().split("T")[0],a=new Map;for(let m of s){let p=Jm[m.type]??"Changed",c=a.get(p)??[];c.push(m),a.set(p,c)}let i=["Added","Changed","Deprecated","Removed","Fixed","Security"],n=`## [${t}] - ${r}
2262
+ `;for(let m of i){let p=a.get(m);if(!p||p.length===0)continue;n+=`
2263
+ ### ${m}
2264
+
2265
+ `;for(let c of p)n+=`- ${c.subject}
2266
+ `}let l="";if(Je(o))l=await Bun.file(o).text();let d;if(l){let m=l.match(/## \[Unreleased\][^\n]*\n/),p=l.match(/## \[\d+\.\d+\.\d+\]/);if(m){let c=(m.index??0)+m[0].length;d=`${l.slice(0,c)}
2267
+ ${n}
2268
+ ${l.slice(c)}`}else if(p&&p.index!==void 0)d=`${l.slice(0,p.index)}${n}
2269
+ ${l.slice(p.index)}`;else d=`${l.trimEnd()}
2270
+
2271
+ ${n}
2272
+ `}else d=`# Changelog
2273
+
2274
+ All notable changes to this project will be documented in this file.
2275
+
2276
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
2277
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
2278
+
2279
+ ## [Unreleased]
2280
+
2281
+ ${n}
2282
+ `;await Bun.write(o,d)}gitAdd(...e){ge(`git add ${e.map((t)=>`"${t}"`).join(" ")}`,{encoding:"utf-8"})}gitCommit(e){ge(`git commit -m "${e}"`,{encoding:"utf-8"})}gitTag(e){ge(`git tag "${e}"`,{encoding:"utf-8"})}}et=y([b.command()],et);import{join as Q}from"path";import{TerminalLogger as sc}from"@ooneex/logger";import{toPascalCase as oc}from"@ooneex/utils";var Za=`import { describe, expect, test } from "bun:test";
2258
2283
  import { {{NAME}}Repository } from "@/repositories/{{NAME}}Repository";
2259
2284
 
2260
2285
  describe("{{NAME}}Repository", () => {
@@ -2317,7 +2342,7 @@ describe("{{NAME}}Repository", () => {
2317
2342
  expect(typeof {{NAME}}Repository.prototype.count).toBe("function");
2318
2343
  });
2319
2344
  });
2320
- `;var Va=`import { inject } from "@ooneex/container";
2345
+ `;var Qa=`import { inject } from "@ooneex/container";
2321
2346
  import type { ITypeormDatabase } from "@ooneex/database";
2322
2347
  import { decorator } from "@ooneex/repository";
2323
2348
  import type { FilterResultType } from "@ooneex/types";
@@ -2439,13 +2464,13 @@ export class {{NAME}}Repository {
2439
2464
  return await repository.count(criteria ? { where: criteria } : {});
2440
2465
  }
2441
2466
  }
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
2467
+ `;class tt{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=oc(t).replace(/Repository$/,"");let o=Qa.replace(/{{NAME}}/g,t),r=s?Q("modules",s):".",a=Q(r,"src","repositories"),i=Q(process.cwd(),a),n=Q(i,`${t}Repository.ts`);await Bun.write(n,o);let l=Za.replace(/{{NAME}}/g,t),d=Q(r,"tests","repositories"),m=Q(process.cwd(),d),p=Q(m,`${t}Repository.spec.ts`);await Bun.write(p,l);let c=new sc;c.success(`${Q(a,t)}Repository.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),c.success(`${Q(d,t)}Repository.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}tt=y([b.command()],tt);import{join as st}from"path";import{TerminalLogger as ac}from"@ooneex/logger";import{seedCreate as ic}from"@ooneex/seeds";var Xa=`#!/usr/bin/env bun
2443
2468
 
2444
2469
  import { seedRun } from "@ooneex/seeds";
2445
2470
  import "@/seeds/seeds";
2446
2471
 
2447
2472
  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";
2473
+ `;class ot{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?st("modules",s):".",r=await ic({name:t,dir:st(o,"src/seeds")}),a=st(process.cwd(),o,"bin","seed","run.ts");if(!await Bun.file(a).exists())await Bun.write(a,Xa);let n=st(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 ac;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})}}ot=y([b.command()],ot);import{join as X}from"path";import{TerminalLogger as dc}from"@ooneex/logger";import{toPascalCase as mc}from"@ooneex/utils";var Ja=`import { describe, expect, test } from "bun:test";
2449
2474
  import { {{NAME}}Service } from "@/services/{{NAME}}Service";
2450
2475
 
2451
2476
  describe("{{NAME}}Service", () => {
@@ -2458,7 +2483,7 @@ describe("{{NAME}}Service", () => {
2458
2483
  expect(typeof {{NAME}}Service.prototype.execute).toBe("function");
2459
2484
  });
2460
2485
  });
2461
- `;var za=`import { decorator } from "@ooneex/service";
2486
+ `;var ei=`import { decorator } from "@ooneex/service";
2462
2487
  import type { IService } from "@ooneex/service";
2463
2488
 
2464
2489
  type ServiceDataType = Record<string, unknown>;
@@ -2469,7 +2494,7 @@ export class {{NAME}}Service<T extends ServiceDataType = ServiceDataType> implem
2469
2494
  // TODO: Implement service logic
2470
2495
  }
2471
2496
  }
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";
2497
+ `;class rt{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=mc(t).replace(/Service$/,"");let o=ei.replace(/{{NAME}}/g,t),r=s?X("modules",s):".",a=X(r,"src","services"),i=X(process.cwd(),a),n=X(i,`${t}Service.ts`);await Bun.write(n,o);let l=Ja.replace(/{{NAME}}/g,t),d=X(r,"tests","services"),m=X(process.cwd(),d),p=X(m,`${t}Service.spec.ts`);await Bun.write(p,l);let c=new dc;c.success(`${X(a,t)}Service.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),c.success(`${X(d,t)}Service.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}rt=y([b.command()],rt);import{join as J}from"path";import{TerminalLogger as uc}from"@ooneex/logger";import{toPascalCase as hc,toSnakeCase as fc}from"@ooneex/utils";var ti=`import { describe, expect, test } from "bun:test";
2473
2498
  import { {{NAME}}StorageAdapter } from "@/storage/{{NAME}}StorageAdapter";
2474
2499
 
2475
2500
  describe("{{NAME}}StorageAdapter", () => {
@@ -2486,7 +2511,7 @@ describe("{{NAME}}StorageAdapter", () => {
2486
2511
  expect(typeof {{NAME}}StorageAdapter.prototype.getOptions).toBe("function");
2487
2512
  });
2488
2513
  });
2489
- `;var Qa=`import { Storage, decorator, StorageException } from "@ooneex/storage";
2514
+ `;var si=`import { Storage, decorator, StorageException } from "@ooneex/storage";
2490
2515
  import type { S3Options } from "bun";
2491
2516
 
2492
2517
  @decorator.storage()
@@ -2541,7 +2566,7 @@ export class {{NAME}}Storage extends Storage {
2541
2566
  };
2542
2567
  }
2543
2568
  }
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";
2569
+ `;class at{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=hc(t).replace(/Storage$/,"");let o=fc(t).toUpperCase(),r=si.replace(/{{NAME}}/g,t).replace(/{{NAME_UPPER}}/g,o),a=s?J("modules",s):".",i=J(a,"src","storage"),n=J(process.cwd(),i),l=J(n,`${t}Storage.ts`);await Bun.write(l,r);let d=ti.replace(/{{NAME}}/g,t),m=J(a,"tests","storage"),p=J(process.cwd(),m),c=J(p,`${t}Storage.spec.ts`);await Bun.write(c,d);let u=new uc;u.success(`${J(i,t)}Storage.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),u.success(`${J(m,t)}Storage.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}at=y([b.command()],at);import{join as ee}from"path";import{TerminalLogger as bc}from"@ooneex/logger";import{toPascalCase as wc}from"@ooneex/utils";var oi=`import { describe, expect, test } from "bun:test";
2545
2570
  import { {{NAME}}VectorDatabase } from "@/databases/{{NAME}}VectorDatabase";
2546
2571
 
2547
2572
  describe("{{NAME}}VectorDatabase", () => {
@@ -2564,7 +2589,7 @@ describe("{{NAME}}VectorDatabase", () => {
2564
2589
  expect(typeof {{NAME}}VectorDatabase.prototype.getSchema).toBe("function");
2565
2590
  });
2566
2591
  });
2567
- `;var Ja=`import { VectorDatabase, decorator } from "@ooneex/rag";
2592
+ `;var ri=`import { VectorDatabase, decorator } from "@ooneex/rag";
2568
2593
  import type { EmbeddingModelType, EmbeddingProviderType, FieldValueType } from "@ooneex/rag";
2569
2594
  import { Utf8 } from "apache-arrow";
2570
2595
 
@@ -2588,8 +2613,8 @@ export class {{NAME}}VectorDatabase extends VectorDatabase<DataType> {
2588
2613
  };
2589
2614
  }
2590
2615
  }
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)}
2616
+ `;class it{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=wc(t).replace(/VectorDatabase$/,"").replace(/Database$/,"");let o=ri.replace(/{{NAME}}/g,t),r=s?ee("modules",s):".",a=ee(r,"src","databases"),i=ee(process.cwd(),a),n=ee(i,`${t}VectorDatabase.ts`);await Bun.write(n,o);let l=oi.replace(/{{NAME}}/g,t),d=ee(r,"tests","databases"),m=ee(process.cwd(),d),p=ee(m,`${t}VectorDatabase.spec.ts`);await Bun.write(p,l);let c=new bc;c.success(`${ee(a,t)}VectorDatabase.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0}),c.success(`${ee(d,t)}VectorDatabase.spec.ts created successfully`,void 0,{showTimestamp:!1,showArrow:!1,useSymbol:!0})}}it=y([b.command()],it);var{values:K,positionals:Ac}=xc({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}),Gt=new Ec,ii=Ac[2];if(!ii)Gt.error(`Command name is required
2617
+ `),process.exit(1);var ni=Wt(ii);if(!ni)Gt.info(`No commands found
2618
+ `),process.exit(1);var vc={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 ni.run(vc)}catch(e){let t=e instanceof ai?e:new ai(e instanceof Error?e:String(e));Gt.error(t,void 0,{showArrow:!1,showTimestamp:!1,showLevel:!1}),process.exit(1)}
2594
2619
 
2595
- //# debugId=5D3FAE0F9529AE0964756E2164756E21
2620
+ //# debugId=BFF1DC994E8D914464756E2164756E21