@minejs/cli 0.0.1 → 0.0.3

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/README.md CHANGED
@@ -8,13 +8,13 @@
8
8
  </div>
9
9
 
10
10
  <div align="center">
11
- <img src="https://img.shields.io/badge/v-0.0.1-black"/>
11
+ <img src="https://img.shields.io/badge/v-0.0.3-black"/>
12
12
  <a href="https://github.com/minejs-org"> <img src="https://img.shields.io/badge/🔥-@minejs-black"/> </a>
13
13
  <img src="https://img.shields.io/badge/zero-dependencies-black" alt="zero-dependencies" />
14
14
  <br>
15
15
  <img src="https://img.shields.io/badge/coverage-100%25-brightgreen" alt="Test Coverage" />
16
- <img src="https://img.shields.io/github/issues/minejs/cli?style=flat" alt="Github Repo Issues" />
17
- <img src="https://img.shields.io/github/stars/minejs/cli?style=social" alt="GitHub Repo stars" />
16
+ <img src="https://img.shields.io/github/issues/minejs-org/cli?style=flat" alt="Github Repo Issues" />
17
+ <img src="https://img.shields.io/github/stars/minejs-org/cli?style=social" alt="GitHub Repo stars" />
18
18
  </div>
19
19
  <br>
20
20
 
package/dist/main.cjs CHANGED
@@ -1,2 +1,15 @@
1
- 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var u=class{constructor(){this.tokens=[];this.position=0;}parse(s){this.tokens=s,this.position=0;let e={options:{},positional:[]};for(this.hasNext()&&!this.peek().startsWith("-")&&(e.command=this.consume());this.hasNext();){let o=this.consume();if(o.startsWith("--")){let[i,r]=o.slice(2).split("=");r!==void 0?e.options[i]=r:this.hasNext()&&!this.peek().startsWith("-")?e.options[i]=this.consume():e.options[i]=true;}else if(o.startsWith("-")&&o.length>1){let i=o.slice(1).split("");for(let r=0;r<i.length;r++){let c=i[r];r===i.length-1&&this.hasNext()&&!this.peek().startsWith("-")?e.options[c]=this.consume():e.options[c]=true;}}else e.positional.push(o);}return e}hasNext(){return this.position<this.tokens.length}peek(){return this.tokens[this.position]}consume(){return this.tokens[this.position++]}};var m=class d extends Error{constructor(e,o="CLI_ERROR"){super(e);this.code=o;this.name="CLIError",Error.captureStackTrace?.(this,d);}},f=class extends m{constructor(s){super(s,"VALIDATION_ERROR"),this.name="ValidationError";}},y=class extends m{constructor(s){super(`Command '${s}' not found`,"COMMAND_NOT_FOUND"),this.name="CommandNotFoundError";}};var b=class{constructor(s){this.config=s;this.commands=new Map;this.globalOptions=new Map;this.parser=new u;this.initializeCommands(),this.initializeGlobalOptions();}async run(s=process.argv.slice(2)){try{let e=this.parser.parse(s);if(e.options.help||e.options.h){this.showHelp(e.command);return}if(!e.command){if(e.options.version||e.options.v){console.log(`${this.config.name} v${this.config.version}`);return}if(this.commands.size===0)throw new m("No command specified");this.showHelp();return}let o=this.commands.get(e.command);if(!o)throw new y(e.command);if(!o.options?.some(r=>r.flag==="-v"||r.aliases?.includes("-v"))&&(e.options.version||e.options.v)){console.log(`${this.config.name} v${this.config.version}`);return}if(o.allowDynamicArgs){let r=this.reparseForDynamicArgs(s,e.command),c=this.parseCommand(o,r.positional,r.options);o.action&&await o.action(c);}else {let r=this.parseCommand(o,e.positional,e.options);o.action&&await o.action(r);}}catch(e){this.handleError(e);}}initializeCommands(){if(this.config.commands){for(let s of this.config.commands)if(this.commands.set(s.name,s),s.aliases)for(let e of s.aliases)this.commands.set(e,s);}}initializeGlobalOptions(){if(this.config.globalOptions){for(let s of this.config.globalOptions)if(this.globalOptions.set(s.name,s),this.globalOptions.set(s.flag,s),s.aliases)for(let e of s.aliases)this.globalOptions.set(e,s);}}reparseForDynamicArgs(s,e){let o=0;for(;o<s.length&&s[o]!==e;)o++;o++;let i=[],r={},c=this.commands.get(e),g=c?.args?.filter(n=>n.required!==false).length||0,h=0;for(;o<s.length;){let n=s[o];if(h<g&&!n.startsWith("-")){i.push(n),h++,o++;continue}if(n.startsWith("--")){let[t,l]=n.slice(2).split("=");c?.options?.some(p=>p.flag===`--${t}`||p.name===t||p.aliases?.includes(`--${t}`))?l!==void 0?r[t]=l:o+1<s.length&&!s[o+1].startsWith("-")?(r[t]=s[o+1],o++):r[t]=true:(i.push(n),l===void 0&&o+1<s.length&&!s[o+1].startsWith("-")&&(i.push(s[o+1]),o++));}else if(n.startsWith("-")&&n.length>1&&isNaN(Number(n))){let t=n.slice(1).split(""),l=true;for(let a of t)if(!c?.options?.some(C=>C.flag===`-${a}`||C.aliases?.includes(`-${a}`))){l=false;break}if(l)for(let a=0;a<t.length;a++){let p=t[a];a===t.length-1&&o+1<s.length&&!s[o+1].startsWith("-")?(r[p]=s[o+1],o++):r[p]=true;}else i.push(n),o+1<s.length&&!s[o+1].startsWith("-")&&(i.push(s[o+1]),o++);}else i.push(n);o++;}return {positional:i,options:r}}parseCommand(s,e,o){let i={args:{},options:{}},r=new Set;if(s.options)for(let n of s.options)r.add(n.name),r.add(n.flag.replace(/^-+/,"")),n.aliases&&n.aliases.forEach(t=>r.add(t.replace(/^-+/,"")));let c=0;if(s.args)for(let n=0;n<s.args.length;n++){let t=s.args[n],l=e[n];if(!l){if(t.required!==false)throw new f(`Missing required argument: ${t.name}`);i.args[t.name]=t.default??"";continue}if(t.validate){let a=t.validate(l);if(a!==true)throw new f(typeof a=="string"?a:`Invalid value for argument '${t.name}': ${l}`)}i.args[t.name]=l,c=n+1;}let g={},h=new Set;if(s.options)for(let n of s.options){let t=this.getOptionValue(n,o);if(t===void 0){if(n.required)throw new f(`Missing required option: --${n.name}`);i.options[n.name]=n.default??(n.type==="boolean"?false:"");continue}let l=this.convertOptionType(t,n.type);if(n.validate){let a=n.validate(l);if(a!==true)throw new f(typeof a=="string"?a:`Invalid value for option '${n.name}': ${l}`)}i.options[n.name]=l;}for(let[n,t]of Object.entries(o))r.has(n)||(g[n]=t);if(s.allowDynamicOptions){let n=c;for(;n<e.length;){let t=e[n];if(t.startsWith("--")){let[l,a]=t.slice(2).split("=");h.add(n),a!==void 0?(g[l]=a,n++):n+1<e.length&&!e[n+1].startsWith("-")?(g[l]=e[n+1],h.add(n+1),n+=2):(g[l]=true,n++);}else if(t.startsWith("-")&&t.length>1&&isNaN(Number(t))){h.add(n);let l=t.slice(1).split("");for(let a=0;a<l.length;a++){let p=l[a];a===l.length-1&&n+1<e.length&&!e[n+1].startsWith("-")?(g[p]=e[n+1],h.add(n+1),n++):g[p]=true;}n++;}else n++;}}if(s.allowDynamicArgs){let n=[];for(let t=c;t<e.length;t++)h.has(t)||n.push(e[t]);i.dynamicArgs=n;}else if(e.length>c)throw new f(`Unexpected argument: ${e[c]}`);if(s.allowDynamicOptions)i.dynamicOptions=g;else if(Object.keys(g).length>0){let n=Object.keys(g)[0];throw new f(`Unknown option: ${n.length===1?"-":"--"}${n}`)}return i}getOptionValue(s,e){if(e[s.name]!==void 0)return e[s.name];let o=s.flag.replace(/^-+/,"");if(e[o]!==void 0)return e[o];if(s.aliases)for(let i of s.aliases){let r=i.replace(/^-+/,"");if(e[r]!==void 0)return e[r]}}convertOptionType(s,e){if(e==="number"){let o=Number(s);if(isNaN(o))throw new f(`Expected number, got: ${s}`);return o}return e==="boolean"?s===true||s==="true"?true:s===false||s==="false"?false:!!s:String(s)}showHelp(s){if(s){let o=this.commands.get(s);if(o){this.showCommandHelp(o);return}}console.log(`${this.config.name} v${this.config.version}`),this.config.description&&console.log(this.config.description),console.log(),console.log("USAGE:"),console.log(` ${this.config.name} <command> [options]`),console.log(),console.log("COMMANDS:");let e=new Map;for(let[o,i]of this.commands)o===i.name&&e.set(o,i);for(let[o,i]of e){let r=i.aliases?` (${i.aliases.join(", ")})`:"";console.log(` ${o}${r}`),i.description&&console.log(` ${i.description}`);}console.log(),console.log("OPTIONS:"),console.log(" -h, --help Show help"),console.log(" -v, --version Show version");}showCommandHelp(s){console.log(`${s.name}`),s.description&&console.log(s.description),console.log();let e=`${this.config.name} ${s.name}`;if(s.args&&(e+=" "+s.args.map(o=>o.required!==false?`<${o.name}>`:`[${o.name}]`).join(" ")),s.allowDynamicArgs&&(e+=" [...]"),console.log("USAGE:"),console.log(` ${e}`),console.log(),s.args&&s.args.length>0){console.log("ARGUMENTS:");for(let o of s.args){let i=o.required!==false?"required":"optional";console.log(` ${o.name} (${i})`),o.description&&console.log(` ${o.description}`);}s.allowDynamicArgs&&console.log(" ... (additional arguments allowed)"),console.log();}if(s.options&&s.options.length>0){console.log("OPTIONS:");for(let o of s.options){let i=o.aliases?`, ${o.aliases.join(", ")}`:"",r=o.required?" (required)":"";console.log(` ${o.flag}${i}${r}`),o.description&&console.log(` ${o.description}`);}}if(s.allowDynamicOptions&&console.log(" ... (additional options allowed)"),(s.options&&s.options.length>0||s.allowDynamicOptions)&&console.log(),s.examples&&s.examples.length>0){console.log("EXAMPLES:");for(let o of s.examples)console.log(` ${o}`);console.log();}}handleError(s){s instanceof m?(console.error(`Error: ${s.message}`),process.exit(1)):s instanceof Error?(console.error(`Unexpected error: ${s.message}`),process.env.DEBUG&&console.error(s.stack),process.exit(1)):(console.error("An unknown error occurred"),process.exit(1));}};var w=class{constructor(s,e){this.config={name:s,version:e,commands:[],globalOptions:[]};}description(s){return this.config.description=s,this}command(s){return this.config.commands||(this.config.commands=[]),this.config.commands.push(s),this}globalOption(s){return this.config.globalOptions||(this.config.globalOptions=[]),this.config.globalOptions.push(s),this}build(){return new b(this.config)}};function O(d,s){return new w(d,s)}var R=O;exports.Builder=w;exports.CLI=b;exports.CLIError=m;exports.CommandNotFoundError=y;exports.ValidationError=f;exports.cli=O;exports.default=R;//# sourceMappingURL=main.cjs.map
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var u=class{constructor(){this.tokens=[];this.position=0;}parse(s){this.tokens=s,this.position=0;let e={options:{},positional:[]};for(this.hasNext()&&!this.peek().startsWith("-")&&(e.command=this.consume());this.hasNext();){let o=this.consume();if(o.startsWith("--")){let[i,r]=o.slice(2).split("=");r!==void 0?e.options[i]=r:this.hasNext()&&!this.peek().startsWith("-")?e.options[i]=this.consume():e.options[i]=!0;}else if(o.startsWith("-")&&o.length>1){let i=o.slice(1).split("");for(let r=0;r<i.length;r++){let c=i[r];r===i.length-1&&this.hasNext()&&!this.peek().startsWith("-")?e.options[c]=this.consume():e.options[c]=!0;}}else e.positional.push(o);}return e}hasNext(){return this.position<this.tokens.length}peek(){return this.tokens[this.position]}consume(){return this.tokens[this.position++]}};var m=class d extends Error{constructor(e,o="CLI_ERROR"){super(e);this.code=o;this.name="CLIError",Error.captureStackTrace?.(this,d);}},f=class extends m{constructor(s){super(s,"VALIDATION_ERROR"),this.name="ValidationError";}},y=class extends m{constructor(s){super(`Command '${s}' not found`,"COMMAND_NOT_FOUND"),this.name="CommandNotFoundError";}};var b=class{constructor(s){this.config=s;this.commands=new Map;this.globalOptions=new Map;this.parser=new u;this.initializeCommands(),this.initializeGlobalOptions();}async run(s=process.argv.slice(2)){try{let e=this.parser.parse(s);if(e.options.help||e.options.h){this.showHelp(e.command);return}if(!e.command){if(e.options.version||e.options.v){console.log(`${this.config.name} v${this.config.version}`);return}if(this.commands.size===0)throw new m("No command specified");this.showHelp();return}let o=this.commands.get(e.command);if(!o)throw new y(e.command);if(!o.options?.some(r=>r.flag==="-v"||r.aliases?.includes("-v"))&&(e.options.version||e.options.v)){console.log(`${this.config.name} v${this.config.version}`);return}if(o.allowDynamicArgs){let r=this.reparseForDynamicArgs(s,e.command),c=this.parseCommand(o,r.positional,r.options);o.action&&await o.action(c);}else {let r=this.parseCommand(o,e.positional,e.options);o.action&&await o.action(r);}}catch(e){this.handleError(e);}}initializeCommands(){if(this.config.commands){for(let s of this.config.commands)if(this.commands.set(s.name,s),s.aliases)for(let e of s.aliases)this.commands.set(e,s);}}initializeGlobalOptions(){if(this.config.globalOptions){for(let s of this.config.globalOptions)if(this.globalOptions.set(s.name,s),this.globalOptions.set(s.flag,s),s.aliases)for(let e of s.aliases)this.globalOptions.set(e,s);}}reparseForDynamicArgs(s,e){let o=0;for(;o<s.length&&s[o]!==e;)o++;o++;let i=[],r={},c=this.commands.get(e),g=c?.args?.filter(n=>n.required!==!1).length||0,h=0;for(;o<s.length;){let n=s[o];if(h<g&&!n.startsWith("-")){i.push(n),h++,o++;continue}if(n.startsWith("--")){let[t,l]=n.slice(2).split("=");c?.options?.some(p=>p.flag===`--${t}`||p.name===t||p.aliases?.includes(`--${t}`))?l!==void 0?r[t]=l:o+1<s.length&&!s[o+1].startsWith("-")?(r[t]=s[o+1],o++):r[t]=!0:(i.push(n),l===void 0&&o+1<s.length&&!s[o+1].startsWith("-")&&(i.push(s[o+1]),o++));}else if(n.startsWith("-")&&n.length>1&&isNaN(Number(n))){let t=n.slice(1).split(""),l=!0;for(let a of t)if(!c?.options?.some(C=>C.flag===`-${a}`||C.aliases?.includes(`-${a}`))){l=!1;break}if(l)for(let a=0;a<t.length;a++){let p=t[a];a===t.length-1&&o+1<s.length&&!s[o+1].startsWith("-")?(r[p]=s[o+1],o++):r[p]=!0;}else i.push(n),o+1<s.length&&!s[o+1].startsWith("-")&&(i.push(s[o+1]),o++);}else i.push(n);o++;}return {positional:i,options:r}}parseCommand(s,e,o){let i={args:{},options:{}},r=new Set;if(s.options)for(let n of s.options)r.add(n.name),r.add(n.flag.replace(/^-+/,"")),n.aliases&&n.aliases.forEach(t=>r.add(t.replace(/^-+/,"")));let c=0;if(s.args)for(let n=0;n<s.args.length;n++){let t=s.args[n],l=e[n];if(!l){if(t.required!==!1)throw new f(`Missing required argument: ${t.name}`);i.args[t.name]=t.default??"";continue}if(t.validate){let a=t.validate(l);if(a!==!0)throw new f(typeof a=="string"?a:`Invalid value for argument '${t.name}': ${l}`)}i.args[t.name]=l,c=n+1;}let g={},h=new Set;if(s.options)for(let n of s.options){let t=this.getOptionValue(n,o);if(t===void 0){if(n.required)throw new f(`Missing required option: --${n.name}`);i.options[n.name]=n.default??(n.type==="boolean"?!1:"");continue}let l=this.convertOptionType(t,n.type);if(n.validate){let a=n.validate(l);if(a!==!0)throw new f(typeof a=="string"?a:`Invalid value for option '${n.name}': ${l}`)}i.options[n.name]=l;}for(let[n,t]of Object.entries(o))r.has(n)||(g[n]=t);if(s.allowDynamicOptions){let n=c;for(;n<e.length;){let t=e[n];if(t.startsWith("--")){let[l,a]=t.slice(2).split("=");h.add(n),a!==void 0?(g[l]=a,n++):n+1<e.length&&!e[n+1].startsWith("-")?(g[l]=e[n+1],h.add(n+1),n+=2):(g[l]=!0,n++);}else if(t.startsWith("-")&&t.length>1&&isNaN(Number(t))){h.add(n);let l=t.slice(1).split("");for(let a=0;a<l.length;a++){let p=l[a];a===l.length-1&&n+1<e.length&&!e[n+1].startsWith("-")?(g[p]=e[n+1],h.add(n+1),n++):g[p]=!0;}n++;}else n++;}}if(s.allowDynamicArgs){let n=[];for(let t=c;t<e.length;t++)h.has(t)||n.push(e[t]);i.dynamicArgs=n;}else if(e.length>c)throw new f(`Unexpected argument: ${e[c]}`);if(s.allowDynamicOptions)i.dynamicOptions=g;else if(Object.keys(g).length>0){let n=Object.keys(g)[0];throw new f(`Unknown option: ${n.length===1?"-":"--"}${n}`)}return i}getOptionValue(s,e){if(e[s.name]!==void 0)return e[s.name];let o=s.flag.replace(/^-+/,"");if(e[o]!==void 0)return e[o];if(s.aliases)for(let i of s.aliases){let r=i.replace(/^-+/,"");if(e[r]!==void 0)return e[r]}}convertOptionType(s,e){if(e==="number"){let o=Number(s);if(isNaN(o))throw new f(`Expected number, got: ${s}`);return o}return e==="boolean"?s===!0||s==="true"?!0:s===!1||s==="false"?!1:!!s:String(s)}showHelp(s){if(s){let o=this.commands.get(s);if(o){this.showCommandHelp(o);return}}console.log(`${this.config.name} v${this.config.version}`),this.config.description&&console.log(this.config.description),console.log(),console.log("USAGE:"),console.log(` ${this.config.name} <command> [options]`),console.log(),console.log("COMMANDS:");let e=new Map;for(let[o,i]of this.commands)o===i.name&&e.set(o,i);for(let[o,i]of e){let r=i.aliases?` (${i.aliases.join(", ")})`:"";console.log(` ${o}${r}`),i.description&&console.log(` ${i.description}`);}console.log(),console.log("OPTIONS:"),console.log(" -h, --help Show help"),console.log(" -v, --version Show version");}showCommandHelp(s){console.log(`${s.name}`),s.description&&console.log(s.description),console.log();let e=`${this.config.name} ${s.name}`;if(s.args&&(e+=" "+s.args.map(o=>o.required!==!1?`<${o.name}>`:`[${o.name}]`).join(" ")),s.allowDynamicArgs&&(e+=" [...]"),console.log("USAGE:"),console.log(` ${e}`),console.log(),s.args&&s.args.length>0){console.log("ARGUMENTS:");for(let o of s.args){let i=o.required!==!1?"required":"optional";console.log(` ${o.name} (${i})`),o.description&&console.log(` ${o.description}`);}s.allowDynamicArgs&&console.log(" ... (additional arguments allowed)"),console.log();}if(s.options&&s.options.length>0){console.log("OPTIONS:");for(let o of s.options){let i=o.aliases?`, ${o.aliases.join(", ")}`:"",r=o.required?" (required)":"";console.log(` ${o.flag}${i}${r}`),o.description&&console.log(` ${o.description}`);}}if(s.allowDynamicOptions&&console.log(" ... (additional options allowed)"),(s.options&&s.options.length>0||s.allowDynamicOptions)&&console.log(),s.examples&&s.examples.length>0){console.log("EXAMPLES:");for(let o of s.examples)console.log(` ${o}`);console.log();}}handleError(s){s instanceof m?(console.error(`Error: ${s.message}`),process.exit(1)):s instanceof Error?(console.error(`Unexpected error: ${s.message}`),process.env.DEBUG&&console.error(s.stack),process.exit(1)):(console.error("An unknown error occurred"),process.exit(1));}};var w=class{constructor(s,e){this.config={name:s,version:e,commands:[],globalOptions:[]};}description(s){return this.config.description=s,this}command(s){return this.config.commands||(this.config.commands=[]),this.config.commands.push(s),this}globalOption(s){return this.config.globalOptions||(this.config.globalOptions=[]),this.config.globalOptions.push(s),this}build(){return new b(this.config)}};function O(d,s){return new w(d,s)}var R=O;
6
+
7
+ exports.Builder = w;
8
+ exports.CLI = b;
9
+ exports.CLIError = m;
10
+ exports.CommandNotFoundError = y;
11
+ exports.ValidationError = f;
12
+ exports.cli = O;
13
+ exports.default = R;
14
+ //# sourceMappingURL=out.js.map
2
15
  //# sourceMappingURL=main.cjs.map
package/dist/main.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/parser.ts","../src/core/types.d.ts","../src/core/index.ts","../src/core/builder.ts","../src/main.ts"],"names":["ArgumentParser","args","result","token","key","value","flags","i","flag","CLIError","_CLIError","message","code","ValidationError","CommandNotFoundError","command","CLI","config","argv","parsed","opt","reparsed","error","cmd","alias","commandName","idx","positional","options","numRequiredArgs","a","argsConsumed","o","allKnown","rawOptions","knownOptionKeys","dynamicArgsStart","argConfig","validation","dynamicOptions","optionIndices","optConfig","converted","j","dynamicArgs","unknownKey","cleanAlias","type","num","uniqueCommands","name","aliases","usage","arg","req","example","Builder","version","desc","option","cli","main_default"],"mappings":"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","file":"main.cjs","sourcesContent":["// src/core/parser.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class ArgumentParser {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n private tokens : string[] = [];\r\n private position = 0;\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n parse(args: string[]): { command?: string; options: Record<string, string | boolean>; positional: string[] } {\r\n this.tokens = args;\r\n this.position = 0;\r\n\r\n const result: { command?: string; options: Record<string, string | boolean>; positional: string[] } = {\r\n options: {},\r\n positional: []\r\n };\r\n\r\n // First token might be a command\r\n if (this.hasNext() && !this.peek().startsWith('-')) {\r\n result.command = this.consume();\r\n }\r\n\r\n while (this.hasNext()) {\r\n const token = this.consume();\r\n\r\n if (token.startsWith('--')) {\r\n // Long option\r\n const [key, value] = token.slice(2).split('=');\r\n if (value !== undefined) {\r\n result.options[key] = value;\r\n } else if (this.hasNext() && !this.peek().startsWith('-')) {\r\n result.options[key] = this.consume();\r\n } else {\r\n result.options[key] = true;\r\n }\r\n } else if (token.startsWith('-') && token.length > 1) {\r\n // Short option(s)\r\n const flags = token.slice(1).split('');\r\n for (let i = 0; i < flags.length; i++) {\r\n const flag = flags[i];\r\n if (i === flags.length - 1 && this.hasNext() && !this.peek().startsWith('-')) {\r\n result.options[flag] = this.consume();\r\n } else {\r\n result.options[flag] = true;\r\n }\r\n }\r\n } else {\r\n // Positional argument\r\n result.positional.push(token);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n private hasNext(): boolean {\r\n return this.position < this.tokens.length;\r\n }\r\n\r\n private peek(): string {\r\n return this.tokens[this.position];\r\n }\r\n\r\n private consume(): string {\r\n return this.tokens[this.position++];\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/core/types.d.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n export interface CommandConfig<T = ParsedCommand> {\r\n name : string;\r\n aliases? : string[];\r\n description? : string;\r\n args? : ArgumentConfig[];\r\n options? : OptionConfig[];\r\n action? : (parsed: T) => void | Promise<void>;\r\n examples? : string[];\r\n\r\n allowDynamicArgs? : boolean;\r\n allowDynamicOptions? : boolean;\r\n }\r\n\r\n export interface ArgumentConfig {\r\n name : string;\r\n description? : string;\r\n required? : boolean;\r\n validate? : (value: string) => boolean | string;\r\n default? : string;\r\n }\r\n\r\n export interface OptionConfig {\r\n name : string;\r\n flag : string;\r\n aliases? : string[];\r\n description? : string;\r\n type? : 'boolean' | 'string' | 'number';\r\n default? : string | boolean | number;\r\n required? : boolean;\r\n validate? : (value: string | boolean | number) => boolean | string;\r\n }\r\n\r\n export interface CLIConfig {\r\n name : string;\r\n version : string;\r\n description? : string;\r\n commands? : CommandConfig[];\r\n globalOptions? : OptionConfig[];\r\n }\r\n\r\n export interface ParsedCommand {\r\n args : Record<string, string>;\r\n options : Record<string, string | boolean | number>;\r\n\r\n dynamicArgs? : string[];\r\n dynamicOptions? : Record<string, string | boolean>;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔═══════════════════════════════════════ ERRORS ═══════════════════════════════════════╗\r\n\r\n export class CLIError extends Error {\r\n constructor(message: string, public code: string = 'CLI_ERROR') {\r\n super(message);\r\n this.name = 'CLIError';\r\n Error.captureStackTrace?.(this, CLIError);\r\n }\r\n }\r\n\r\n export class ValidationError extends CLIError {\r\n constructor(message: string) {\r\n super(message, 'VALIDATION_ERROR');\r\n this.name = 'ValidationError';\r\n }\r\n }\r\n\r\n export class CommandNotFoundError extends CLIError {\r\n constructor(command: string) {\r\n super(`Command '${command}' not found`, 'COMMAND_NOT_FOUND');\r\n this.name = 'CommandNotFoundError';\r\n }\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/core/index.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { ArgumentParser } from './parser';\r\n import * as types from './types.d';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class CLI {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n private commands = new Map<string, types.CommandConfig>();\r\n private globalOptions = new Map<string, types.OptionConfig>();\r\n private parser = new ArgumentParser();\r\n\r\n constructor(public config : types.CLIConfig) {\r\n this.initializeCommands();\r\n this.initializeGlobalOptions();\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n async run(argv: string[] = process.argv.slice(2)): Promise<void> {\r\n try {\r\n const parsed = this.parser.parse(argv);\r\n\r\n // Handle help (always check this first)\r\n if (parsed.options.help || parsed.options.h) {\r\n this.showHelp(parsed.command);\r\n return;\r\n }\r\n\r\n // No command provided - check for version or show help\r\n if (!parsed.command) {\r\n // Handle version only when no command\r\n if (parsed.options.version || parsed.options.v) {\r\n console.log(`${this.config.name} v${this.config.version}`);\r\n return;\r\n }\r\n\r\n if (this.commands.size === 0) {\r\n throw new types.CLIError('No command specified');\r\n }\r\n\r\n this.showHelp();\r\n return;\r\n }\r\n\r\n // Find command\r\n const command = this.commands.get(parsed.command);\r\n if (!command) {\r\n throw new types.CommandNotFoundError(parsed.command);\r\n }\r\n\r\n // Check if -v/--version should be handled as version (only if command doesn't use -v)\r\n const commandUsesV = command.options?.some(opt =>\r\n opt.flag === '-v' || opt.aliases?.includes('-v')\r\n );\r\n\r\n if (!commandUsesV && (parsed.options.version || parsed.options.v)) {\r\n console.log(`${this.config.name} v${this.config.version}`);\r\n return;\r\n }\r\n\r\n // If command allows dynamic args, re-parse to preserve option-like arguments\r\n if (command.allowDynamicArgs) {\r\n const reparsed = this.reparseForDynamicArgs(argv, parsed.command);\r\n const result = this.parseCommand(command, reparsed.positional, reparsed.options);\r\n if (command.action) {\r\n await command.action(result);\r\n }\r\n } else {\r\n // Parse and validate normally\r\n const result = this.parseCommand(command, parsed.positional, parsed.options);\r\n\r\n // Execute command\r\n if (command.action) {\r\n await command.action(result);\r\n }\r\n }\r\n } catch (error) {\r\n this.handleError(error);\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n private initializeCommands(): void {\r\n if (!this.config.commands) return;\r\n\r\n for (const cmd of this.config.commands) {\r\n this.commands.set(cmd.name, cmd);\r\n if (cmd.aliases) {\r\n for (const alias of cmd.aliases) {\r\n this.commands.set(alias, cmd);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private initializeGlobalOptions(): void {\r\n if (!this.config.globalOptions) return;\r\n\r\n for (const opt of this.config.globalOptions) {\r\n this.globalOptions.set(opt.name, opt);\r\n this.globalOptions.set(opt.flag, opt);\r\n if (opt.aliases) {\r\n for (const alias of opt.aliases) {\r\n this.globalOptions.set(alias, opt);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private reparseForDynamicArgs(argv: string[], commandName: string): { positional: string[]; options: Record<string, string | boolean> } {\r\n let idx = 0;\r\n\r\n // Find command in argv\r\n while (idx < argv.length && argv[idx] !== commandName) {\r\n idx++;\r\n }\r\n idx++; // Skip command name\r\n\r\n const positional: string[] = [];\r\n const options: Record<string, string | boolean> = {};\r\n const command = this.commands.get(commandName);\r\n const numRequiredArgs = command?.args?.filter(a => a.required !== false).length || 0;\r\n let argsConsumed = 0;\r\n\r\n while (idx < argv.length) {\r\n const token = argv[idx];\r\n\r\n // Consume required positional arguments first\r\n if (argsConsumed < numRequiredArgs && !token.startsWith('-')) {\r\n positional.push(token);\r\n argsConsumed++;\r\n idx++;\r\n continue;\r\n }\r\n\r\n // After required args are consumed, handle options vs args\r\n if (token.startsWith('--')) {\r\n const [key, value] = token.slice(2).split('=');\r\n const isKnownOption = command?.options?.some(o =>\r\n o.flag === `--${key}` || o.name === key || o.aliases?.includes(`--${key}`)\r\n );\r\n\r\n if (isKnownOption) {\r\n // Known option - parse normally\r\n if (value !== undefined) {\r\n options[key] = value;\r\n } else if (idx + 1 < argv.length && !argv[idx + 1].startsWith('-')) {\r\n options[key] = argv[idx + 1];\r\n idx++;\r\n } else {\r\n options[key] = true;\r\n }\r\n } else {\r\n // Unknown option - add to positional for later processing as dynamic option\r\n positional.push(token);\r\n // Check if next token is a value for this option\r\n if (value === undefined && idx + 1 < argv.length && !argv[idx + 1].startsWith('-')) {\r\n positional.push(argv[idx + 1]);\r\n idx++;\r\n }\r\n }\r\n } else if (token.startsWith('-') && token.length > 1 && isNaN(Number(token))) {\r\n // Short option(s) - check if all are known\r\n const flags = token.slice(1).split('');\r\n let allKnown = true;\r\n\r\n // Check if all flags are known\r\n for (const flag of flags) {\r\n const isKnownOption = command?.options?.some(o =>\r\n o.flag === `-${flag}` || o.aliases?.includes(`-${flag}`)\r\n );\r\n if (!isKnownOption) {\r\n allKnown = false;\r\n break;\r\n }\r\n }\r\n\r\n if (allKnown) {\r\n // All flags are known - parse them\r\n for (let i = 0; i < flags.length; i++) {\r\n const flag = flags[i];\r\n if (i === flags.length - 1 && idx + 1 < argv.length && !argv[idx + 1].startsWith('-')) {\r\n options[flag] = argv[idx + 1];\r\n idx++;\r\n } else {\r\n options[flag] = true;\r\n }\r\n }\r\n } else {\r\n // Some flags are unknown - add entire token to positional\r\n positional.push(token);\r\n // Check if next token is a value\r\n if (idx + 1 < argv.length && !argv[idx + 1].startsWith('-')) {\r\n positional.push(argv[idx + 1]);\r\n idx++;\r\n }\r\n }\r\n } else {\r\n // Regular positional argument\r\n positional.push(token);\r\n }\r\n\r\n idx++;\r\n }\r\n\r\n return { positional, options };\r\n }\r\n\r\n private parseCommand(\r\n command: types.CommandConfig,\r\n positional: string[],\r\n rawOptions: Record<string, string | boolean>\r\n ): types.ParsedCommand {\r\n const result: types.ParsedCommand = {\r\n args: {},\r\n options: {}\r\n };\r\n\r\n // Track which options are known\r\n const knownOptionKeys = new Set<string>();\r\n if (command.options) {\r\n for (const opt of command.options) {\r\n knownOptionKeys.add(opt.name);\r\n knownOptionKeys.add(opt.flag.replace(/^-+/, ''));\r\n if (opt.aliases) {\r\n opt.aliases.forEach(a => knownOptionKeys.add(a.replace(/^-+/, '')));\r\n }\r\n }\r\n }\r\n\r\n // Parse arguments\r\n let dynamicArgsStart = 0;\r\n if (command.args) {\r\n for (let i = 0; i < command.args.length; i++) {\r\n const argConfig = command.args[i];\r\n const value = positional[i];\r\n\r\n if (!value) {\r\n if (argConfig.required !== false) {\r\n throw new types.ValidationError(`Missing required argument: ${argConfig.name}`);\r\n }\r\n\r\n result.args[argConfig.name] = argConfig.default ?? '';\r\n continue;\r\n }\r\n\r\n // Validate\r\n if (argConfig.validate) {\r\n const validation = argConfig.validate(value);\r\n if (validation !== true) {\r\n throw new types.ValidationError(\r\n typeof validation === 'string'\r\n ? validation\r\n : `Invalid value for argument '${argConfig.name}': ${value}`\r\n );\r\n }\r\n }\r\n\r\n result.args[argConfig.name] = value;\r\n dynamicArgsStart = i + 1;\r\n }\r\n }\r\n\r\n // Parse options\r\n const dynamicOptions: Record<string, string | boolean> = {};\r\n const optionIndices = new Set<number>();\r\n\r\n if (command.options) {\r\n for (const optConfig of command.options) {\r\n const value = this.getOptionValue(optConfig, rawOptions);\r\n\r\n if (value === undefined) {\r\n if (optConfig.required) {\r\n throw new types.ValidationError(`Missing required option: --${optConfig.name}`);\r\n }\r\n\r\n result.options[optConfig.name] = optConfig.default ?? (optConfig.type === 'boolean' ? false : '');\r\n continue;\r\n }\r\n\r\n // Type conversion\r\n const converted = this.convertOptionType(value, optConfig.type);\r\n\r\n // Validate\r\n if (optConfig.validate) {\r\n const validation = optConfig.validate(converted);\r\n if (validation !== true) {\r\n throw new types.ValidationError(\r\n typeof validation === 'string'\r\n ? validation\r\n : `Invalid value for option '${optConfig.name}': ${converted}`\r\n );\r\n }\r\n }\r\n\r\n result.options[optConfig.name] = converted;\r\n }\r\n }\r\n\r\n // Handle dynamic options from rawOptions\r\n for (const [key, value] of Object.entries(rawOptions)) {\r\n if (!knownOptionKeys.has(key)) {\r\n dynamicOptions[key] = value;\r\n }\r\n }\r\n\r\n // Parse dynamic options from positional args and track their indices (only if allowDynamicOptions)\r\n if (command.allowDynamicOptions) {\r\n let i = dynamicArgsStart;\r\n while (i < positional.length) {\r\n const token = positional[i];\r\n\r\n if (token.startsWith('--')) {\r\n const [key, value] = token.slice(2).split('=');\r\n optionIndices.add(i);\r\n if (value !== undefined) {\r\n dynamicOptions[key] = value;\r\n i++;\r\n } else if (i + 1 < positional.length && !positional[i + 1].startsWith('-')) {\r\n dynamicOptions[key] = positional[i + 1];\r\n optionIndices.add(i + 1);\r\n i += 2;\r\n } else {\r\n dynamicOptions[key] = true;\r\n i++;\r\n }\r\n } else if (token.startsWith('-') && token.length > 1 && isNaN(Number(token))) {\r\n optionIndices.add(i);\r\n const flags = token.slice(1).split('');\r\n for (let j = 0; j < flags.length; j++) {\r\n const flag = flags[j];\r\n if (j === flags.length - 1 && i + 1 < positional.length && !positional[i + 1].startsWith('-')) {\r\n dynamicOptions[flag] = positional[i + 1];\r\n optionIndices.add(i + 1);\r\n i++;\r\n } else {\r\n dynamicOptions[flag] = true;\r\n }\r\n }\r\n i++;\r\n } else {\r\n i++;\r\n }\r\n }\r\n }\r\n\r\n // Handle dynamic arguments - filter out options using tracked indices\r\n if (command.allowDynamicArgs) {\r\n const dynamicArgs: string[] = [];\r\n for (let i = dynamicArgsStart; i < positional.length; i++) {\r\n if (!optionIndices.has(i)) {\r\n dynamicArgs.push(positional[i]);\r\n }\r\n }\r\n result.dynamicArgs = dynamicArgs;\r\n } else if (positional.length > dynamicArgsStart) {\r\n // Throw error if there are extra positional args but dynamic args not allowed\r\n throw new types.ValidationError(`Unexpected argument: ${positional[dynamicArgsStart]}`);\r\n }\r\n\r\n if (command.allowDynamicOptions) {\r\n result.dynamicOptions = dynamicOptions;\r\n } else if (Object.keys(dynamicOptions).length > 0) {\r\n // Throw error if there are unknown options but dynamic options not allowed\r\n const unknownKey = Object.keys(dynamicOptions)[0];\r\n throw new types.ValidationError(`Unknown option: ${unknownKey.length === 1 ? '-' : '--'}${unknownKey}`);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private getOptionValue(config: types.OptionConfig, rawOptions: Record<string, string | boolean>): string | boolean | undefined {\r\n // Check by name first\r\n if (rawOptions[config.name] !== undefined) {\r\n return rawOptions[config.name];\r\n }\r\n\r\n // Check by flag (remove ALL leading dashes)\r\n const flag = config.flag.replace(/^-+/, '');\r\n if (rawOptions[flag] !== undefined) {\r\n return rawOptions[flag];\r\n }\r\n\r\n // Check aliases\r\n if (config.aliases) {\r\n for (const alias of config.aliases) {\r\n const cleanAlias = alias.replace(/^-+/, '');\r\n if (rawOptions[cleanAlias] !== undefined) {\r\n return rawOptions[cleanAlias];\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private convertOptionType(value: string | boolean, type?: 'boolean' | 'string' | 'number'): string | boolean | number {\r\n if (type === 'number') {\r\n const num = Number(value);\r\n if (isNaN(num)) {\r\n throw new types.ValidationError(`Expected number, got: ${value}`);\r\n }\r\n\r\n return num;\r\n }\r\n\r\n if (type === 'boolean') {\r\n if (value === true || value === 'true') return true;\r\n if (value === false || value === 'false') return false;\r\n return !!value;\r\n }\r\n\r\n return String(value);\r\n }\r\n\r\n private showHelp(commandName?: string): void {\r\n if (commandName) {\r\n const command = this.commands.get(commandName);\r\n if (command) {\r\n this.showCommandHelp(command);\r\n return;\r\n }\r\n }\r\n\r\n console.log(`${this.config.name} v${this.config.version}`);\r\n if (this.config.description) {\r\n console.log(this.config.description);\r\n }\r\n console.log();\r\n console.log('USAGE:');\r\n console.log(` ${this.config.name} <command> [options]`);\r\n console.log();\r\n console.log('COMMANDS:');\r\n\r\n const uniqueCommands = new Map<string, types.CommandConfig>();\r\n for (const [name, cmd] of this.commands) {\r\n if (name === cmd.name) {\r\n uniqueCommands.set(name, cmd);\r\n }\r\n }\r\n\r\n for (const [name, cmd] of uniqueCommands) {\r\n const aliases = cmd.aliases ? ` (${cmd.aliases.join(', ')})` : '';\r\n console.log(` ${name}${aliases}`);\r\n if (cmd.description) {\r\n console.log(` ${cmd.description}`);\r\n }\r\n }\r\n\r\n console.log();\r\n console.log('OPTIONS:');\r\n console.log(' -h, --help Show help');\r\n console.log(' -v, --version Show version');\r\n }\r\n\r\n private showCommandHelp(command: types.CommandConfig): void {\r\n console.log(`${command.name}`);\r\n if (command.description) {\r\n console.log(command.description);\r\n }\r\n console.log();\r\n\r\n // Usage\r\n let usage = `${this.config.name} ${command.name}`;\r\n if (command.args) {\r\n usage += ' ' + command.args.map(a =>\r\n a.required !== false ? `<${a.name}>` : `[${a.name}]`\r\n ).join(' ');\r\n }\r\n\r\n if (command.allowDynamicArgs) {\r\n usage += ' [...]';\r\n }\r\n\r\n console.log('USAGE:');\r\n console.log(` ${usage}`);\r\n console.log();\r\n\r\n // Arguments\r\n if (command.args && command.args.length > 0) {\r\n console.log('ARGUMENTS:');\r\n for (const arg of command.args) {\r\n const req = arg.required !== false ? 'required' : 'optional';\r\n console.log(` ${arg.name} (${req})`);\r\n if (arg.description) {\r\n console.log(` ${arg.description}`);\r\n }\r\n }\r\n\r\n if (command.allowDynamicArgs) {\r\n console.log(` ... (additional arguments allowed)`);\r\n }\r\n\r\n console.log();\r\n }\r\n\r\n // Options\r\n if (command.options && command.options.length > 0) {\r\n console.log('OPTIONS:');\r\n for (const opt of command.options) {\r\n const aliases = opt.aliases ? `, ${opt.aliases.join(', ')}` : '';\r\n const req = opt.required ? ' (required)' : '';\r\n console.log(` ${opt.flag}${aliases}${req}`);\r\n if (opt.description) {\r\n console.log(` ${opt.description}`);\r\n }\r\n }\r\n }\r\n\r\n if (command.allowDynamicOptions) {\r\n console.log(` ... (additional options allowed)`);\r\n }\r\n\r\n if ((command.options && command.options.length > 0) || command.allowDynamicOptions) {\r\n console.log();\r\n }\r\n\r\n // Examples\r\n if (command.examples && command.examples.length > 0) {\r\n console.log('EXAMPLES:');\r\n for (const example of command.examples) {\r\n console.log(` ${example}`);\r\n }\r\n console.log();\r\n }\r\n }\r\n\r\n private handleError(error: unknown): void {\r\n if (error instanceof types.CLIError) {\r\n console.error(`Error: ${error.message}`);\r\n process.exit(1);\r\n } else if (error instanceof Error) {\r\n console.error(`Unexpected error: ${error.message}`);\r\n if (process.env.DEBUG) {\r\n console.error(error.stack);\r\n }\r\n process.exit(1);\r\n } else {\r\n console.error('An unknown error occurred');\r\n process.exit(1);\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/core/builder.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import * as types from './types.d';\r\n import { CLI } from '../core';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class Builder {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n private config: types.CLIConfig;\r\n\r\n constructor(name: string, version: string) {\r\n this.config = { name, version, commands: [], globalOptions: [] };\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n description(desc: string): this {\r\n this.config.description = desc;\r\n return this;\r\n }\r\n\r\n command(config: types.CommandConfig): this {\r\n if (!this.config.commands) this.config.commands = [];\r\n this.config.commands.push(config);\r\n return this;\r\n }\r\n\r\n globalOption(option: types.OptionConfig): this {\r\n if (!this.config.globalOptions) this.config.globalOptions = [];\r\n this.config.globalOptions.push(option);\r\n return this;\r\n }\r\n\r\n build(): CLI {\r\n return new CLI(this.config);\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n export function cli(name: string, version: string): Builder {\r\n return new Builder(name, version);\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/main.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { cli } from './core/builder';\r\n\r\n export * from './core';\r\n export * from './core/builder';\r\n export * from './core/types.d';\r\n\r\n export default cli;\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝"]}
1
+ {"version":3,"sources":["../src/core/parser.ts","../src/core/types.d.ts","../src/core/index.ts","../src/core/builder.ts","../src/main.ts"],"names":["ArgumentParser","args","result","token","key","value","flags","i","flag","CLIError","_CLIError","message","code","ValidationError","CommandNotFoundError","command","CLI","config","argv","parsed","opt","reparsed","error","cmd","alias","commandName","idx","positional","options","numRequiredArgs","a","argsConsumed","o","allKnown","rawOptions","knownOptionKeys","dynamicArgsStart","argConfig","validation","dynamicOptions","optionIndices","optConfig","converted","j","dynamicArgs","unknownKey","cleanAlias","type","num","uniqueCommands","name","aliases","usage","arg","req","example","Builder","version","desc","option","cli","main_default"],"mappings":"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","sourcesContent":["// src/core/parser.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class ArgumentParser {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n private tokens : string[] = [];\r\n private position = 0;\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n parse(args: string[]): { command?: string; options: Record<string, string | boolean>; positional: string[] } {\r\n this.tokens = args;\r\n this.position = 0;\r\n\r\n const result: { command?: string; options: Record<string, string | boolean>; positional: string[] } = {\r\n options: {},\r\n positional: []\r\n };\r\n\r\n // First token might be a command\r\n if (this.hasNext() && !this.peek().startsWith('-')) {\r\n result.command = this.consume();\r\n }\r\n\r\n while (this.hasNext()) {\r\n const token = this.consume();\r\n\r\n if (token.startsWith('--')) {\r\n // Long option\r\n const [key, value] = token.slice(2).split('=');\r\n if (value !== undefined) {\r\n result.options[key] = value;\r\n } else if (this.hasNext() && !this.peek().startsWith('-')) {\r\n result.options[key] = this.consume();\r\n } else {\r\n result.options[key] = true;\r\n }\r\n } else if (token.startsWith('-') && token.length > 1) {\r\n // Short option(s)\r\n const flags = token.slice(1).split('');\r\n for (let i = 0; i < flags.length; i++) {\r\n const flag = flags[i];\r\n if (i === flags.length - 1 && this.hasNext() && !this.peek().startsWith('-')) {\r\n result.options[flag] = this.consume();\r\n } else {\r\n result.options[flag] = true;\r\n }\r\n }\r\n } else {\r\n // Positional argument\r\n result.positional.push(token);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n private hasNext(): boolean {\r\n return this.position < this.tokens.length;\r\n }\r\n\r\n private peek(): string {\r\n return this.tokens[this.position];\r\n }\r\n\r\n private consume(): string {\r\n return this.tokens[this.position++];\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/core/types.d.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n export interface CommandConfig<T = ParsedCommand> {\r\n name : string;\r\n aliases? : string[];\r\n description? : string;\r\n args? : ArgumentConfig[];\r\n options? : OptionConfig[];\r\n action? : (parsed: T) => void | Promise<void>;\r\n examples? : string[];\r\n\r\n allowDynamicArgs? : boolean;\r\n allowDynamicOptions? : boolean;\r\n }\r\n\r\n export interface ArgumentConfig {\r\n name : string;\r\n description? : string;\r\n required? : boolean;\r\n validate? : (value: string) => boolean | string;\r\n default? : string;\r\n }\r\n\r\n export interface OptionConfig {\r\n name : string;\r\n flag : string;\r\n aliases? : string[];\r\n description? : string;\r\n type? : 'boolean' | 'string' | 'number';\r\n default? : string | boolean | number;\r\n required? : boolean;\r\n validate? : (value: string | boolean | number) => boolean | string;\r\n }\r\n\r\n export interface CLIConfig {\r\n name : string;\r\n version : string;\r\n description? : string;\r\n commands? : CommandConfig[];\r\n globalOptions? : OptionConfig[];\r\n }\r\n\r\n export interface ParsedCommand {\r\n args : Record<string, string>;\r\n options : Record<string, string | boolean | number>;\r\n\r\n dynamicArgs? : string[];\r\n dynamicOptions? : Record<string, string | boolean>;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔═══════════════════════════════════════ ERRORS ═══════════════════════════════════════╗\r\n\r\n export class CLIError extends Error {\r\n constructor(message: string, public code: string = 'CLI_ERROR') {\r\n super(message);\r\n this.name = 'CLIError';\r\n Error.captureStackTrace?.(this, CLIError);\r\n }\r\n }\r\n\r\n export class ValidationError extends CLIError {\r\n constructor(message: string) {\r\n super(message, 'VALIDATION_ERROR');\r\n this.name = 'ValidationError';\r\n }\r\n }\r\n\r\n export class CommandNotFoundError extends CLIError {\r\n constructor(command: string) {\r\n super(`Command '${command}' not found`, 'COMMAND_NOT_FOUND');\r\n this.name = 'CommandNotFoundError';\r\n }\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/core/index.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { ArgumentParser } from './parser';\r\n import * as types from './types.d';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class CLI {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n private commands = new Map<string, types.CommandConfig>();\r\n private globalOptions = new Map<string, types.OptionConfig>();\r\n private parser = new ArgumentParser();\r\n\r\n constructor(public config : types.CLIConfig) {\r\n this.initializeCommands();\r\n this.initializeGlobalOptions();\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n async run(argv: string[] = process.argv.slice(2)): Promise<void> {\r\n try {\r\n const parsed = this.parser.parse(argv);\r\n\r\n // Handle help (always check this first)\r\n if (parsed.options.help || parsed.options.h) {\r\n this.showHelp(parsed.command);\r\n return;\r\n }\r\n\r\n // No command provided - check for version or show help\r\n if (!parsed.command) {\r\n // Handle version only when no command\r\n if (parsed.options.version || parsed.options.v) {\r\n console.log(`${this.config.name} v${this.config.version}`);\r\n return;\r\n }\r\n\r\n if (this.commands.size === 0) {\r\n throw new types.CLIError('No command specified');\r\n }\r\n\r\n this.showHelp();\r\n return;\r\n }\r\n\r\n // Find command\r\n const command = this.commands.get(parsed.command);\r\n if (!command) {\r\n throw new types.CommandNotFoundError(parsed.command);\r\n }\r\n\r\n // Check if -v/--version should be handled as version (only if command doesn't use -v)\r\n const commandUsesV = command.options?.some(opt =>\r\n opt.flag === '-v' || opt.aliases?.includes('-v')\r\n );\r\n\r\n if (!commandUsesV && (parsed.options.version || parsed.options.v)) {\r\n console.log(`${this.config.name} v${this.config.version}`);\r\n return;\r\n }\r\n\r\n // If command allows dynamic args, re-parse to preserve option-like arguments\r\n if (command.allowDynamicArgs) {\r\n const reparsed = this.reparseForDynamicArgs(argv, parsed.command);\r\n const result = this.parseCommand(command, reparsed.positional, reparsed.options);\r\n if (command.action) {\r\n await command.action(result);\r\n }\r\n } else {\r\n // Parse and validate normally\r\n const result = this.parseCommand(command, parsed.positional, parsed.options);\r\n\r\n // Execute command\r\n if (command.action) {\r\n await command.action(result);\r\n }\r\n }\r\n } catch (error) {\r\n this.handleError(error);\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n private initializeCommands(): void {\r\n if (!this.config.commands) return;\r\n\r\n for (const cmd of this.config.commands) {\r\n this.commands.set(cmd.name, cmd);\r\n if (cmd.aliases) {\r\n for (const alias of cmd.aliases) {\r\n this.commands.set(alias, cmd);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private initializeGlobalOptions(): void {\r\n if (!this.config.globalOptions) return;\r\n\r\n for (const opt of this.config.globalOptions) {\r\n this.globalOptions.set(opt.name, opt);\r\n this.globalOptions.set(opt.flag, opt);\r\n if (opt.aliases) {\r\n for (const alias of opt.aliases) {\r\n this.globalOptions.set(alias, opt);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private reparseForDynamicArgs(argv: string[], commandName: string): { positional: string[]; options: Record<string, string | boolean> } {\r\n let idx = 0;\r\n\r\n // Find command in argv\r\n while (idx < argv.length && argv[idx] !== commandName) {\r\n idx++;\r\n }\r\n idx++; // Skip command name\r\n\r\n const positional: string[] = [];\r\n const options: Record<string, string | boolean> = {};\r\n const command = this.commands.get(commandName);\r\n const numRequiredArgs = command?.args?.filter(a => a.required !== false).length || 0;\r\n let argsConsumed = 0;\r\n\r\n while (idx < argv.length) {\r\n const token = argv[idx];\r\n\r\n // Consume required positional arguments first\r\n if (argsConsumed < numRequiredArgs && !token.startsWith('-')) {\r\n positional.push(token);\r\n argsConsumed++;\r\n idx++;\r\n continue;\r\n }\r\n\r\n // After required args are consumed, handle options vs args\r\n if (token.startsWith('--')) {\r\n const [key, value] = token.slice(2).split('=');\r\n const isKnownOption = command?.options?.some(o =>\r\n o.flag === `--${key}` || o.name === key || o.aliases?.includes(`--${key}`)\r\n );\r\n\r\n if (isKnownOption) {\r\n // Known option - parse normally\r\n if (value !== undefined) {\r\n options[key] = value;\r\n } else if (idx + 1 < argv.length && !argv[idx + 1].startsWith('-')) {\r\n options[key] = argv[idx + 1];\r\n idx++;\r\n } else {\r\n options[key] = true;\r\n }\r\n } else {\r\n // Unknown option - add to positional for later processing as dynamic option\r\n positional.push(token);\r\n // Check if next token is a value for this option\r\n if (value === undefined && idx + 1 < argv.length && !argv[idx + 1].startsWith('-')) {\r\n positional.push(argv[idx + 1]);\r\n idx++;\r\n }\r\n }\r\n } else if (token.startsWith('-') && token.length > 1 && isNaN(Number(token))) {\r\n // Short option(s) - check if all are known\r\n const flags = token.slice(1).split('');\r\n let allKnown = true;\r\n\r\n // Check if all flags are known\r\n for (const flag of flags) {\r\n const isKnownOption = command?.options?.some(o =>\r\n o.flag === `-${flag}` || o.aliases?.includes(`-${flag}`)\r\n );\r\n if (!isKnownOption) {\r\n allKnown = false;\r\n break;\r\n }\r\n }\r\n\r\n if (allKnown) {\r\n // All flags are known - parse them\r\n for (let i = 0; i < flags.length; i++) {\r\n const flag = flags[i];\r\n if (i === flags.length - 1 && idx + 1 < argv.length && !argv[idx + 1].startsWith('-')) {\r\n options[flag] = argv[idx + 1];\r\n idx++;\r\n } else {\r\n options[flag] = true;\r\n }\r\n }\r\n } else {\r\n // Some flags are unknown - add entire token to positional\r\n positional.push(token);\r\n // Check if next token is a value\r\n if (idx + 1 < argv.length && !argv[idx + 1].startsWith('-')) {\r\n positional.push(argv[idx + 1]);\r\n idx++;\r\n }\r\n }\r\n } else {\r\n // Regular positional argument\r\n positional.push(token);\r\n }\r\n\r\n idx++;\r\n }\r\n\r\n return { positional, options };\r\n }\r\n\r\n private parseCommand(\r\n command: types.CommandConfig,\r\n positional: string[],\r\n rawOptions: Record<string, string | boolean>\r\n ): types.ParsedCommand {\r\n const result: types.ParsedCommand = {\r\n args: {},\r\n options: {}\r\n };\r\n\r\n // Track which options are known\r\n const knownOptionKeys = new Set<string>();\r\n if (command.options) {\r\n for (const opt of command.options) {\r\n knownOptionKeys.add(opt.name);\r\n knownOptionKeys.add(opt.flag.replace(/^-+/, ''));\r\n if (opt.aliases) {\r\n opt.aliases.forEach(a => knownOptionKeys.add(a.replace(/^-+/, '')));\r\n }\r\n }\r\n }\r\n\r\n // Parse arguments\r\n let dynamicArgsStart = 0;\r\n if (command.args) {\r\n for (let i = 0; i < command.args.length; i++) {\r\n const argConfig = command.args[i];\r\n const value = positional[i];\r\n\r\n if (!value) {\r\n if (argConfig.required !== false) {\r\n throw new types.ValidationError(`Missing required argument: ${argConfig.name}`);\r\n }\r\n\r\n result.args[argConfig.name] = argConfig.default ?? '';\r\n continue;\r\n }\r\n\r\n // Validate\r\n if (argConfig.validate) {\r\n const validation = argConfig.validate(value);\r\n if (validation !== true) {\r\n throw new types.ValidationError(\r\n typeof validation === 'string'\r\n ? validation\r\n : `Invalid value for argument '${argConfig.name}': ${value}`\r\n );\r\n }\r\n }\r\n\r\n result.args[argConfig.name] = value;\r\n dynamicArgsStart = i + 1;\r\n }\r\n }\r\n\r\n // Parse options\r\n const dynamicOptions: Record<string, string | boolean> = {};\r\n const optionIndices = new Set<number>();\r\n\r\n if (command.options) {\r\n for (const optConfig of command.options) {\r\n const value = this.getOptionValue(optConfig, rawOptions);\r\n\r\n if (value === undefined) {\r\n if (optConfig.required) {\r\n throw new types.ValidationError(`Missing required option: --${optConfig.name}`);\r\n }\r\n\r\n result.options[optConfig.name] = optConfig.default ?? (optConfig.type === 'boolean' ? false : '');\r\n continue;\r\n }\r\n\r\n // Type conversion\r\n const converted = this.convertOptionType(value, optConfig.type);\r\n\r\n // Validate\r\n if (optConfig.validate) {\r\n const validation = optConfig.validate(converted);\r\n if (validation !== true) {\r\n throw new types.ValidationError(\r\n typeof validation === 'string'\r\n ? validation\r\n : `Invalid value for option '${optConfig.name}': ${converted}`\r\n );\r\n }\r\n }\r\n\r\n result.options[optConfig.name] = converted;\r\n }\r\n }\r\n\r\n // Handle dynamic options from rawOptions\r\n for (const [key, value] of Object.entries(rawOptions)) {\r\n if (!knownOptionKeys.has(key)) {\r\n dynamicOptions[key] = value;\r\n }\r\n }\r\n\r\n // Parse dynamic options from positional args and track their indices (only if allowDynamicOptions)\r\n if (command.allowDynamicOptions) {\r\n let i = dynamicArgsStart;\r\n while (i < positional.length) {\r\n const token = positional[i];\r\n\r\n if (token.startsWith('--')) {\r\n const [key, value] = token.slice(2).split('=');\r\n optionIndices.add(i);\r\n if (value !== undefined) {\r\n dynamicOptions[key] = value;\r\n i++;\r\n } else if (i + 1 < positional.length && !positional[i + 1].startsWith('-')) {\r\n dynamicOptions[key] = positional[i + 1];\r\n optionIndices.add(i + 1);\r\n i += 2;\r\n } else {\r\n dynamicOptions[key] = true;\r\n i++;\r\n }\r\n } else if (token.startsWith('-') && token.length > 1 && isNaN(Number(token))) {\r\n optionIndices.add(i);\r\n const flags = token.slice(1).split('');\r\n for (let j = 0; j < flags.length; j++) {\r\n const flag = flags[j];\r\n if (j === flags.length - 1 && i + 1 < positional.length && !positional[i + 1].startsWith('-')) {\r\n dynamicOptions[flag] = positional[i + 1];\r\n optionIndices.add(i + 1);\r\n i++;\r\n } else {\r\n dynamicOptions[flag] = true;\r\n }\r\n }\r\n i++;\r\n } else {\r\n i++;\r\n }\r\n }\r\n }\r\n\r\n // Handle dynamic arguments - filter out options using tracked indices\r\n if (command.allowDynamicArgs) {\r\n const dynamicArgs: string[] = [];\r\n for (let i = dynamicArgsStart; i < positional.length; i++) {\r\n if (!optionIndices.has(i)) {\r\n dynamicArgs.push(positional[i]);\r\n }\r\n }\r\n result.dynamicArgs = dynamicArgs;\r\n } else if (positional.length > dynamicArgsStart) {\r\n // Throw error if there are extra positional args but dynamic args not allowed\r\n throw new types.ValidationError(`Unexpected argument: ${positional[dynamicArgsStart]}`);\r\n }\r\n\r\n if (command.allowDynamicOptions) {\r\n result.dynamicOptions = dynamicOptions;\r\n } else if (Object.keys(dynamicOptions).length > 0) {\r\n // Throw error if there are unknown options but dynamic options not allowed\r\n const unknownKey = Object.keys(dynamicOptions)[0];\r\n throw new types.ValidationError(`Unknown option: ${unknownKey.length === 1 ? '-' : '--'}${unknownKey}`);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private getOptionValue(config: types.OptionConfig, rawOptions: Record<string, string | boolean>): string | boolean | undefined {\r\n // Check by name first\r\n if (rawOptions[config.name] !== undefined) {\r\n return rawOptions[config.name];\r\n }\r\n\r\n // Check by flag (remove ALL leading dashes)\r\n const flag = config.flag.replace(/^-+/, '');\r\n if (rawOptions[flag] !== undefined) {\r\n return rawOptions[flag];\r\n }\r\n\r\n // Check aliases\r\n if (config.aliases) {\r\n for (const alias of config.aliases) {\r\n const cleanAlias = alias.replace(/^-+/, '');\r\n if (rawOptions[cleanAlias] !== undefined) {\r\n return rawOptions[cleanAlias];\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private convertOptionType(value: string | boolean, type?: 'boolean' | 'string' | 'number'): string | boolean | number {\r\n if (type === 'number') {\r\n const num = Number(value);\r\n if (isNaN(num)) {\r\n throw new types.ValidationError(`Expected number, got: ${value}`);\r\n }\r\n\r\n return num;\r\n }\r\n\r\n if (type === 'boolean') {\r\n if (value === true || value === 'true') return true;\r\n if (value === false || value === 'false') return false;\r\n return !!value;\r\n }\r\n\r\n return String(value);\r\n }\r\n\r\n private showHelp(commandName?: string): void {\r\n if (commandName) {\r\n const command = this.commands.get(commandName);\r\n if (command) {\r\n this.showCommandHelp(command);\r\n return;\r\n }\r\n }\r\n\r\n console.log(`${this.config.name} v${this.config.version}`);\r\n if (this.config.description) {\r\n console.log(this.config.description);\r\n }\r\n console.log();\r\n console.log('USAGE:');\r\n console.log(` ${this.config.name} <command> [options]`);\r\n console.log();\r\n console.log('COMMANDS:');\r\n\r\n const uniqueCommands = new Map<string, types.CommandConfig>();\r\n for (const [name, cmd] of this.commands) {\r\n if (name === cmd.name) {\r\n uniqueCommands.set(name, cmd);\r\n }\r\n }\r\n\r\n for (const [name, cmd] of uniqueCommands) {\r\n const aliases = cmd.aliases ? ` (${cmd.aliases.join(', ')})` : '';\r\n console.log(` ${name}${aliases}`);\r\n if (cmd.description) {\r\n console.log(` ${cmd.description}`);\r\n }\r\n }\r\n\r\n console.log();\r\n console.log('OPTIONS:');\r\n console.log(' -h, --help Show help');\r\n console.log(' -v, --version Show version');\r\n }\r\n\r\n private showCommandHelp(command: types.CommandConfig): void {\r\n console.log(`${command.name}`);\r\n if (command.description) {\r\n console.log(command.description);\r\n }\r\n console.log();\r\n\r\n // Usage\r\n let usage = `${this.config.name} ${command.name}`;\r\n if (command.args) {\r\n usage += ' ' + command.args.map(a =>\r\n a.required !== false ? `<${a.name}>` : `[${a.name}]`\r\n ).join(' ');\r\n }\r\n\r\n if (command.allowDynamicArgs) {\r\n usage += ' [...]';\r\n }\r\n\r\n console.log('USAGE:');\r\n console.log(` ${usage}`);\r\n console.log();\r\n\r\n // Arguments\r\n if (command.args && command.args.length > 0) {\r\n console.log('ARGUMENTS:');\r\n for (const arg of command.args) {\r\n const req = arg.required !== false ? 'required' : 'optional';\r\n console.log(` ${arg.name} (${req})`);\r\n if (arg.description) {\r\n console.log(` ${arg.description}`);\r\n }\r\n }\r\n\r\n if (command.allowDynamicArgs) {\r\n console.log(` ... (additional arguments allowed)`);\r\n }\r\n\r\n console.log();\r\n }\r\n\r\n // Options\r\n if (command.options && command.options.length > 0) {\r\n console.log('OPTIONS:');\r\n for (const opt of command.options) {\r\n const aliases = opt.aliases ? `, ${opt.aliases.join(', ')}` : '';\r\n const req = opt.required ? ' (required)' : '';\r\n console.log(` ${opt.flag}${aliases}${req}`);\r\n if (opt.description) {\r\n console.log(` ${opt.description}`);\r\n }\r\n }\r\n }\r\n\r\n if (command.allowDynamicOptions) {\r\n console.log(` ... (additional options allowed)`);\r\n }\r\n\r\n if ((command.options && command.options.length > 0) || command.allowDynamicOptions) {\r\n console.log();\r\n }\r\n\r\n // Examples\r\n if (command.examples && command.examples.length > 0) {\r\n console.log('EXAMPLES:');\r\n for (const example of command.examples) {\r\n console.log(` ${example}`);\r\n }\r\n console.log();\r\n }\r\n }\r\n\r\n private handleError(error: unknown): void {\r\n if (error instanceof types.CLIError) {\r\n console.error(`Error: ${error.message}`);\r\n process.exit(1);\r\n } else if (error instanceof Error) {\r\n console.error(`Unexpected error: ${error.message}`);\r\n if (process.env.DEBUG) {\r\n console.error(error.stack);\r\n }\r\n process.exit(1);\r\n } else {\r\n console.error('An unknown error occurred');\r\n process.exit(1);\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/core/builder.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import * as types from './types.d';\r\n import { CLI } from '../core';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class Builder {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n private config: types.CLIConfig;\r\n\r\n constructor(name: string, version: string) {\r\n this.config = { name, version, commands: [], globalOptions: [] };\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n description(desc: string): this {\r\n this.config.description = desc;\r\n return this;\r\n }\r\n\r\n command(config: types.CommandConfig): this {\r\n if (!this.config.commands) this.config.commands = [];\r\n this.config.commands.push(config);\r\n return this;\r\n }\r\n\r\n globalOption(option: types.OptionConfig): this {\r\n if (!this.config.globalOptions) this.config.globalOptions = [];\r\n this.config.globalOptions.push(option);\r\n return this;\r\n }\r\n\r\n build(): CLI {\r\n return new CLI(this.config);\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n export function cli(name: string, version: string): Builder {\r\n return new Builder(name, version);\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/main.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { cli } from './core/builder';\r\n\r\n export * from './core';\r\n export * from './core/builder';\r\n export * from './core/types.d';\r\n\r\n export default cli;\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝"]}
package/dist/main.js CHANGED
@@ -1,2 +1,5 @@
1
- var u=class{constructor(){this.tokens=[];this.position=0;}parse(s){this.tokens=s,this.position=0;let e={options:{},positional:[]};for(this.hasNext()&&!this.peek().startsWith("-")&&(e.command=this.consume());this.hasNext();){let o=this.consume();if(o.startsWith("--")){let[i,r]=o.slice(2).split("=");r!==void 0?e.options[i]=r:this.hasNext()&&!this.peek().startsWith("-")?e.options[i]=this.consume():e.options[i]=true;}else if(o.startsWith("-")&&o.length>1){let i=o.slice(1).split("");for(let r=0;r<i.length;r++){let c=i[r];r===i.length-1&&this.hasNext()&&!this.peek().startsWith("-")?e.options[c]=this.consume():e.options[c]=true;}}else e.positional.push(o);}return e}hasNext(){return this.position<this.tokens.length}peek(){return this.tokens[this.position]}consume(){return this.tokens[this.position++]}};var m=class d extends Error{constructor(e,o="CLI_ERROR"){super(e);this.code=o;this.name="CLIError",Error.captureStackTrace?.(this,d);}},f=class extends m{constructor(s){super(s,"VALIDATION_ERROR"),this.name="ValidationError";}},y=class extends m{constructor(s){super(`Command '${s}' not found`,"COMMAND_NOT_FOUND"),this.name="CommandNotFoundError";}};var b=class{constructor(s){this.config=s;this.commands=new Map;this.globalOptions=new Map;this.parser=new u;this.initializeCommands(),this.initializeGlobalOptions();}async run(s=process.argv.slice(2)){try{let e=this.parser.parse(s);if(e.options.help||e.options.h){this.showHelp(e.command);return}if(!e.command){if(e.options.version||e.options.v){console.log(`${this.config.name} v${this.config.version}`);return}if(this.commands.size===0)throw new m("No command specified");this.showHelp();return}let o=this.commands.get(e.command);if(!o)throw new y(e.command);if(!o.options?.some(r=>r.flag==="-v"||r.aliases?.includes("-v"))&&(e.options.version||e.options.v)){console.log(`${this.config.name} v${this.config.version}`);return}if(o.allowDynamicArgs){let r=this.reparseForDynamicArgs(s,e.command),c=this.parseCommand(o,r.positional,r.options);o.action&&await o.action(c);}else {let r=this.parseCommand(o,e.positional,e.options);o.action&&await o.action(r);}}catch(e){this.handleError(e);}}initializeCommands(){if(this.config.commands){for(let s of this.config.commands)if(this.commands.set(s.name,s),s.aliases)for(let e of s.aliases)this.commands.set(e,s);}}initializeGlobalOptions(){if(this.config.globalOptions){for(let s of this.config.globalOptions)if(this.globalOptions.set(s.name,s),this.globalOptions.set(s.flag,s),s.aliases)for(let e of s.aliases)this.globalOptions.set(e,s);}}reparseForDynamicArgs(s,e){let o=0;for(;o<s.length&&s[o]!==e;)o++;o++;let i=[],r={},c=this.commands.get(e),g=c?.args?.filter(n=>n.required!==false).length||0,h=0;for(;o<s.length;){let n=s[o];if(h<g&&!n.startsWith("-")){i.push(n),h++,o++;continue}if(n.startsWith("--")){let[t,l]=n.slice(2).split("=");c?.options?.some(p=>p.flag===`--${t}`||p.name===t||p.aliases?.includes(`--${t}`))?l!==void 0?r[t]=l:o+1<s.length&&!s[o+1].startsWith("-")?(r[t]=s[o+1],o++):r[t]=true:(i.push(n),l===void 0&&o+1<s.length&&!s[o+1].startsWith("-")&&(i.push(s[o+1]),o++));}else if(n.startsWith("-")&&n.length>1&&isNaN(Number(n))){let t=n.slice(1).split(""),l=true;for(let a of t)if(!c?.options?.some(C=>C.flag===`-${a}`||C.aliases?.includes(`-${a}`))){l=false;break}if(l)for(let a=0;a<t.length;a++){let p=t[a];a===t.length-1&&o+1<s.length&&!s[o+1].startsWith("-")?(r[p]=s[o+1],o++):r[p]=true;}else i.push(n),o+1<s.length&&!s[o+1].startsWith("-")&&(i.push(s[o+1]),o++);}else i.push(n);o++;}return {positional:i,options:r}}parseCommand(s,e,o){let i={args:{},options:{}},r=new Set;if(s.options)for(let n of s.options)r.add(n.name),r.add(n.flag.replace(/^-+/,"")),n.aliases&&n.aliases.forEach(t=>r.add(t.replace(/^-+/,"")));let c=0;if(s.args)for(let n=0;n<s.args.length;n++){let t=s.args[n],l=e[n];if(!l){if(t.required!==false)throw new f(`Missing required argument: ${t.name}`);i.args[t.name]=t.default??"";continue}if(t.validate){let a=t.validate(l);if(a!==true)throw new f(typeof a=="string"?a:`Invalid value for argument '${t.name}': ${l}`)}i.args[t.name]=l,c=n+1;}let g={},h=new Set;if(s.options)for(let n of s.options){let t=this.getOptionValue(n,o);if(t===void 0){if(n.required)throw new f(`Missing required option: --${n.name}`);i.options[n.name]=n.default??(n.type==="boolean"?false:"");continue}let l=this.convertOptionType(t,n.type);if(n.validate){let a=n.validate(l);if(a!==true)throw new f(typeof a=="string"?a:`Invalid value for option '${n.name}': ${l}`)}i.options[n.name]=l;}for(let[n,t]of Object.entries(o))r.has(n)||(g[n]=t);if(s.allowDynamicOptions){let n=c;for(;n<e.length;){let t=e[n];if(t.startsWith("--")){let[l,a]=t.slice(2).split("=");h.add(n),a!==void 0?(g[l]=a,n++):n+1<e.length&&!e[n+1].startsWith("-")?(g[l]=e[n+1],h.add(n+1),n+=2):(g[l]=true,n++);}else if(t.startsWith("-")&&t.length>1&&isNaN(Number(t))){h.add(n);let l=t.slice(1).split("");for(let a=0;a<l.length;a++){let p=l[a];a===l.length-1&&n+1<e.length&&!e[n+1].startsWith("-")?(g[p]=e[n+1],h.add(n+1),n++):g[p]=true;}n++;}else n++;}}if(s.allowDynamicArgs){let n=[];for(let t=c;t<e.length;t++)h.has(t)||n.push(e[t]);i.dynamicArgs=n;}else if(e.length>c)throw new f(`Unexpected argument: ${e[c]}`);if(s.allowDynamicOptions)i.dynamicOptions=g;else if(Object.keys(g).length>0){let n=Object.keys(g)[0];throw new f(`Unknown option: ${n.length===1?"-":"--"}${n}`)}return i}getOptionValue(s,e){if(e[s.name]!==void 0)return e[s.name];let o=s.flag.replace(/^-+/,"");if(e[o]!==void 0)return e[o];if(s.aliases)for(let i of s.aliases){let r=i.replace(/^-+/,"");if(e[r]!==void 0)return e[r]}}convertOptionType(s,e){if(e==="number"){let o=Number(s);if(isNaN(o))throw new f(`Expected number, got: ${s}`);return o}return e==="boolean"?s===true||s==="true"?true:s===false||s==="false"?false:!!s:String(s)}showHelp(s){if(s){let o=this.commands.get(s);if(o){this.showCommandHelp(o);return}}console.log(`${this.config.name} v${this.config.version}`),this.config.description&&console.log(this.config.description),console.log(),console.log("USAGE:"),console.log(` ${this.config.name} <command> [options]`),console.log(),console.log("COMMANDS:");let e=new Map;for(let[o,i]of this.commands)o===i.name&&e.set(o,i);for(let[o,i]of e){let r=i.aliases?` (${i.aliases.join(", ")})`:"";console.log(` ${o}${r}`),i.description&&console.log(` ${i.description}`);}console.log(),console.log("OPTIONS:"),console.log(" -h, --help Show help"),console.log(" -v, --version Show version");}showCommandHelp(s){console.log(`${s.name}`),s.description&&console.log(s.description),console.log();let e=`${this.config.name} ${s.name}`;if(s.args&&(e+=" "+s.args.map(o=>o.required!==false?`<${o.name}>`:`[${o.name}]`).join(" ")),s.allowDynamicArgs&&(e+=" [...]"),console.log("USAGE:"),console.log(` ${e}`),console.log(),s.args&&s.args.length>0){console.log("ARGUMENTS:");for(let o of s.args){let i=o.required!==false?"required":"optional";console.log(` ${o.name} (${i})`),o.description&&console.log(` ${o.description}`);}s.allowDynamicArgs&&console.log(" ... (additional arguments allowed)"),console.log();}if(s.options&&s.options.length>0){console.log("OPTIONS:");for(let o of s.options){let i=o.aliases?`, ${o.aliases.join(", ")}`:"",r=o.required?" (required)":"";console.log(` ${o.flag}${i}${r}`),o.description&&console.log(` ${o.description}`);}}if(s.allowDynamicOptions&&console.log(" ... (additional options allowed)"),(s.options&&s.options.length>0||s.allowDynamicOptions)&&console.log(),s.examples&&s.examples.length>0){console.log("EXAMPLES:");for(let o of s.examples)console.log(` ${o}`);console.log();}}handleError(s){s instanceof m?(console.error(`Error: ${s.message}`),process.exit(1)):s instanceof Error?(console.error(`Unexpected error: ${s.message}`),process.env.DEBUG&&console.error(s.stack),process.exit(1)):(console.error("An unknown error occurred"),process.exit(1));}};var w=class{constructor(s,e){this.config={name:s,version:e,commands:[],globalOptions:[]};}description(s){return this.config.description=s,this}command(s){return this.config.commands||(this.config.commands=[]),this.config.commands.push(s),this}globalOption(s){return this.config.globalOptions||(this.config.globalOptions=[]),this.config.globalOptions.push(s),this}build(){return new b(this.config)}};function O(d,s){return new w(d,s)}var R=O;export{w as Builder,b as CLI,m as CLIError,y as CommandNotFoundError,f as ValidationError,O as cli,R as default};//# sourceMappingURL=main.js.map
1
+ var u=class{constructor(){this.tokens=[];this.position=0;}parse(s){this.tokens=s,this.position=0;let e={options:{},positional:[]};for(this.hasNext()&&!this.peek().startsWith("-")&&(e.command=this.consume());this.hasNext();){let o=this.consume();if(o.startsWith("--")){let[i,r]=o.slice(2).split("=");r!==void 0?e.options[i]=r:this.hasNext()&&!this.peek().startsWith("-")?e.options[i]=this.consume():e.options[i]=!0;}else if(o.startsWith("-")&&o.length>1){let i=o.slice(1).split("");for(let r=0;r<i.length;r++){let c=i[r];r===i.length-1&&this.hasNext()&&!this.peek().startsWith("-")?e.options[c]=this.consume():e.options[c]=!0;}}else e.positional.push(o);}return e}hasNext(){return this.position<this.tokens.length}peek(){return this.tokens[this.position]}consume(){return this.tokens[this.position++]}};var m=class d extends Error{constructor(e,o="CLI_ERROR"){super(e);this.code=o;this.name="CLIError",Error.captureStackTrace?.(this,d);}},f=class extends m{constructor(s){super(s,"VALIDATION_ERROR"),this.name="ValidationError";}},y=class extends m{constructor(s){super(`Command '${s}' not found`,"COMMAND_NOT_FOUND"),this.name="CommandNotFoundError";}};var b=class{constructor(s){this.config=s;this.commands=new Map;this.globalOptions=new Map;this.parser=new u;this.initializeCommands(),this.initializeGlobalOptions();}async run(s=process.argv.slice(2)){try{let e=this.parser.parse(s);if(e.options.help||e.options.h){this.showHelp(e.command);return}if(!e.command){if(e.options.version||e.options.v){console.log(`${this.config.name} v${this.config.version}`);return}if(this.commands.size===0)throw new m("No command specified");this.showHelp();return}let o=this.commands.get(e.command);if(!o)throw new y(e.command);if(!o.options?.some(r=>r.flag==="-v"||r.aliases?.includes("-v"))&&(e.options.version||e.options.v)){console.log(`${this.config.name} v${this.config.version}`);return}if(o.allowDynamicArgs){let r=this.reparseForDynamicArgs(s,e.command),c=this.parseCommand(o,r.positional,r.options);o.action&&await o.action(c);}else {let r=this.parseCommand(o,e.positional,e.options);o.action&&await o.action(r);}}catch(e){this.handleError(e);}}initializeCommands(){if(this.config.commands){for(let s of this.config.commands)if(this.commands.set(s.name,s),s.aliases)for(let e of s.aliases)this.commands.set(e,s);}}initializeGlobalOptions(){if(this.config.globalOptions){for(let s of this.config.globalOptions)if(this.globalOptions.set(s.name,s),this.globalOptions.set(s.flag,s),s.aliases)for(let e of s.aliases)this.globalOptions.set(e,s);}}reparseForDynamicArgs(s,e){let o=0;for(;o<s.length&&s[o]!==e;)o++;o++;let i=[],r={},c=this.commands.get(e),g=c?.args?.filter(n=>n.required!==!1).length||0,h=0;for(;o<s.length;){let n=s[o];if(h<g&&!n.startsWith("-")){i.push(n),h++,o++;continue}if(n.startsWith("--")){let[t,l]=n.slice(2).split("=");c?.options?.some(p=>p.flag===`--${t}`||p.name===t||p.aliases?.includes(`--${t}`))?l!==void 0?r[t]=l:o+1<s.length&&!s[o+1].startsWith("-")?(r[t]=s[o+1],o++):r[t]=!0:(i.push(n),l===void 0&&o+1<s.length&&!s[o+1].startsWith("-")&&(i.push(s[o+1]),o++));}else if(n.startsWith("-")&&n.length>1&&isNaN(Number(n))){let t=n.slice(1).split(""),l=!0;for(let a of t)if(!c?.options?.some(C=>C.flag===`-${a}`||C.aliases?.includes(`-${a}`))){l=!1;break}if(l)for(let a=0;a<t.length;a++){let p=t[a];a===t.length-1&&o+1<s.length&&!s[o+1].startsWith("-")?(r[p]=s[o+1],o++):r[p]=!0;}else i.push(n),o+1<s.length&&!s[o+1].startsWith("-")&&(i.push(s[o+1]),o++);}else i.push(n);o++;}return {positional:i,options:r}}parseCommand(s,e,o){let i={args:{},options:{}},r=new Set;if(s.options)for(let n of s.options)r.add(n.name),r.add(n.flag.replace(/^-+/,"")),n.aliases&&n.aliases.forEach(t=>r.add(t.replace(/^-+/,"")));let c=0;if(s.args)for(let n=0;n<s.args.length;n++){let t=s.args[n],l=e[n];if(!l){if(t.required!==!1)throw new f(`Missing required argument: ${t.name}`);i.args[t.name]=t.default??"";continue}if(t.validate){let a=t.validate(l);if(a!==!0)throw new f(typeof a=="string"?a:`Invalid value for argument '${t.name}': ${l}`)}i.args[t.name]=l,c=n+1;}let g={},h=new Set;if(s.options)for(let n of s.options){let t=this.getOptionValue(n,o);if(t===void 0){if(n.required)throw new f(`Missing required option: --${n.name}`);i.options[n.name]=n.default??(n.type==="boolean"?!1:"");continue}let l=this.convertOptionType(t,n.type);if(n.validate){let a=n.validate(l);if(a!==!0)throw new f(typeof a=="string"?a:`Invalid value for option '${n.name}': ${l}`)}i.options[n.name]=l;}for(let[n,t]of Object.entries(o))r.has(n)||(g[n]=t);if(s.allowDynamicOptions){let n=c;for(;n<e.length;){let t=e[n];if(t.startsWith("--")){let[l,a]=t.slice(2).split("=");h.add(n),a!==void 0?(g[l]=a,n++):n+1<e.length&&!e[n+1].startsWith("-")?(g[l]=e[n+1],h.add(n+1),n+=2):(g[l]=!0,n++);}else if(t.startsWith("-")&&t.length>1&&isNaN(Number(t))){h.add(n);let l=t.slice(1).split("");for(let a=0;a<l.length;a++){let p=l[a];a===l.length-1&&n+1<e.length&&!e[n+1].startsWith("-")?(g[p]=e[n+1],h.add(n+1),n++):g[p]=!0;}n++;}else n++;}}if(s.allowDynamicArgs){let n=[];for(let t=c;t<e.length;t++)h.has(t)||n.push(e[t]);i.dynamicArgs=n;}else if(e.length>c)throw new f(`Unexpected argument: ${e[c]}`);if(s.allowDynamicOptions)i.dynamicOptions=g;else if(Object.keys(g).length>0){let n=Object.keys(g)[0];throw new f(`Unknown option: ${n.length===1?"-":"--"}${n}`)}return i}getOptionValue(s,e){if(e[s.name]!==void 0)return e[s.name];let o=s.flag.replace(/^-+/,"");if(e[o]!==void 0)return e[o];if(s.aliases)for(let i of s.aliases){let r=i.replace(/^-+/,"");if(e[r]!==void 0)return e[r]}}convertOptionType(s,e){if(e==="number"){let o=Number(s);if(isNaN(o))throw new f(`Expected number, got: ${s}`);return o}return e==="boolean"?s===!0||s==="true"?!0:s===!1||s==="false"?!1:!!s:String(s)}showHelp(s){if(s){let o=this.commands.get(s);if(o){this.showCommandHelp(o);return}}console.log(`${this.config.name} v${this.config.version}`),this.config.description&&console.log(this.config.description),console.log(),console.log("USAGE:"),console.log(` ${this.config.name} <command> [options]`),console.log(),console.log("COMMANDS:");let e=new Map;for(let[o,i]of this.commands)o===i.name&&e.set(o,i);for(let[o,i]of e){let r=i.aliases?` (${i.aliases.join(", ")})`:"";console.log(` ${o}${r}`),i.description&&console.log(` ${i.description}`);}console.log(),console.log("OPTIONS:"),console.log(" -h, --help Show help"),console.log(" -v, --version Show version");}showCommandHelp(s){console.log(`${s.name}`),s.description&&console.log(s.description),console.log();let e=`${this.config.name} ${s.name}`;if(s.args&&(e+=" "+s.args.map(o=>o.required!==!1?`<${o.name}>`:`[${o.name}]`).join(" ")),s.allowDynamicArgs&&(e+=" [...]"),console.log("USAGE:"),console.log(` ${e}`),console.log(),s.args&&s.args.length>0){console.log("ARGUMENTS:");for(let o of s.args){let i=o.required!==!1?"required":"optional";console.log(` ${o.name} (${i})`),o.description&&console.log(` ${o.description}`);}s.allowDynamicArgs&&console.log(" ... (additional arguments allowed)"),console.log();}if(s.options&&s.options.length>0){console.log("OPTIONS:");for(let o of s.options){let i=o.aliases?`, ${o.aliases.join(", ")}`:"",r=o.required?" (required)":"";console.log(` ${o.flag}${i}${r}`),o.description&&console.log(` ${o.description}`);}}if(s.allowDynamicOptions&&console.log(" ... (additional options allowed)"),(s.options&&s.options.length>0||s.allowDynamicOptions)&&console.log(),s.examples&&s.examples.length>0){console.log("EXAMPLES:");for(let o of s.examples)console.log(` ${o}`);console.log();}}handleError(s){s instanceof m?(console.error(`Error: ${s.message}`),process.exit(1)):s instanceof Error?(console.error(`Unexpected error: ${s.message}`),process.env.DEBUG&&console.error(s.stack),process.exit(1)):(console.error("An unknown error occurred"),process.exit(1));}};var w=class{constructor(s,e){this.config={name:s,version:e,commands:[],globalOptions:[]};}description(s){return this.config.description=s,this}command(s){return this.config.commands||(this.config.commands=[]),this.config.commands.push(s),this}globalOption(s){return this.config.globalOptions||(this.config.globalOptions=[]),this.config.globalOptions.push(s),this}build(){return new b(this.config)}};function O(d,s){return new w(d,s)}var R=O;
2
+
3
+ export { w as Builder, b as CLI, m as CLIError, y as CommandNotFoundError, f as ValidationError, O as cli, R as default };
4
+ //# sourceMappingURL=out.js.map
2
5
  //# sourceMappingURL=main.js.map
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/parser.ts","../src/core/types.d.ts","../src/core/index.ts","../src/core/builder.ts","../src/main.ts"],"names":["ArgumentParser","args","result","token","key","value","flags","i","flag","CLIError","_CLIError","message","code","ValidationError","CommandNotFoundError","command","CLI","config","argv","parsed","opt","reparsed","error","cmd","alias","commandName","idx","positional","options","numRequiredArgs","a","argsConsumed","o","allKnown","rawOptions","knownOptionKeys","dynamicArgsStart","argConfig","validation","dynamicOptions","optionIndices","optConfig","converted","j","dynamicArgs","unknownKey","cleanAlias","type","num","uniqueCommands","name","aliases","usage","arg","req","example","Builder","version","desc","option","cli","main_default"],"mappings":"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","file":"main.js","sourcesContent":["// src/core/parser.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class ArgumentParser {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n private tokens : string[] = [];\r\n private position = 0;\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n parse(args: string[]): { command?: string; options: Record<string, string | boolean>; positional: string[] } {\r\n this.tokens = args;\r\n this.position = 0;\r\n\r\n const result: { command?: string; options: Record<string, string | boolean>; positional: string[] } = {\r\n options: {},\r\n positional: []\r\n };\r\n\r\n // First token might be a command\r\n if (this.hasNext() && !this.peek().startsWith('-')) {\r\n result.command = this.consume();\r\n }\r\n\r\n while (this.hasNext()) {\r\n const token = this.consume();\r\n\r\n if (token.startsWith('--')) {\r\n // Long option\r\n const [key, value] = token.slice(2).split('=');\r\n if (value !== undefined) {\r\n result.options[key] = value;\r\n } else if (this.hasNext() && !this.peek().startsWith('-')) {\r\n result.options[key] = this.consume();\r\n } else {\r\n result.options[key] = true;\r\n }\r\n } else if (token.startsWith('-') && token.length > 1) {\r\n // Short option(s)\r\n const flags = token.slice(1).split('');\r\n for (let i = 0; i < flags.length; i++) {\r\n const flag = flags[i];\r\n if (i === flags.length - 1 && this.hasNext() && !this.peek().startsWith('-')) {\r\n result.options[flag] = this.consume();\r\n } else {\r\n result.options[flag] = true;\r\n }\r\n }\r\n } else {\r\n // Positional argument\r\n result.positional.push(token);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n private hasNext(): boolean {\r\n return this.position < this.tokens.length;\r\n }\r\n\r\n private peek(): string {\r\n return this.tokens[this.position];\r\n }\r\n\r\n private consume(): string {\r\n return this.tokens[this.position++];\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/core/types.d.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n export interface CommandConfig<T = ParsedCommand> {\r\n name : string;\r\n aliases? : string[];\r\n description? : string;\r\n args? : ArgumentConfig[];\r\n options? : OptionConfig[];\r\n action? : (parsed: T) => void | Promise<void>;\r\n examples? : string[];\r\n\r\n allowDynamicArgs? : boolean;\r\n allowDynamicOptions? : boolean;\r\n }\r\n\r\n export interface ArgumentConfig {\r\n name : string;\r\n description? : string;\r\n required? : boolean;\r\n validate? : (value: string) => boolean | string;\r\n default? : string;\r\n }\r\n\r\n export interface OptionConfig {\r\n name : string;\r\n flag : string;\r\n aliases? : string[];\r\n description? : string;\r\n type? : 'boolean' | 'string' | 'number';\r\n default? : string | boolean | number;\r\n required? : boolean;\r\n validate? : (value: string | boolean | number) => boolean | string;\r\n }\r\n\r\n export interface CLIConfig {\r\n name : string;\r\n version : string;\r\n description? : string;\r\n commands? : CommandConfig[];\r\n globalOptions? : OptionConfig[];\r\n }\r\n\r\n export interface ParsedCommand {\r\n args : Record<string, string>;\r\n options : Record<string, string | boolean | number>;\r\n\r\n dynamicArgs? : string[];\r\n dynamicOptions? : Record<string, string | boolean>;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔═══════════════════════════════════════ ERRORS ═══════════════════════════════════════╗\r\n\r\n export class CLIError extends Error {\r\n constructor(message: string, public code: string = 'CLI_ERROR') {\r\n super(message);\r\n this.name = 'CLIError';\r\n Error.captureStackTrace?.(this, CLIError);\r\n }\r\n }\r\n\r\n export class ValidationError extends CLIError {\r\n constructor(message: string) {\r\n super(message, 'VALIDATION_ERROR');\r\n this.name = 'ValidationError';\r\n }\r\n }\r\n\r\n export class CommandNotFoundError extends CLIError {\r\n constructor(command: string) {\r\n super(`Command '${command}' not found`, 'COMMAND_NOT_FOUND');\r\n this.name = 'CommandNotFoundError';\r\n }\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/core/index.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { ArgumentParser } from './parser';\r\n import * as types from './types.d';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class CLI {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n private commands = new Map<string, types.CommandConfig>();\r\n private globalOptions = new Map<string, types.OptionConfig>();\r\n private parser = new ArgumentParser();\r\n\r\n constructor(public config : types.CLIConfig) {\r\n this.initializeCommands();\r\n this.initializeGlobalOptions();\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n async run(argv: string[] = process.argv.slice(2)): Promise<void> {\r\n try {\r\n const parsed = this.parser.parse(argv);\r\n\r\n // Handle help (always check this first)\r\n if (parsed.options.help || parsed.options.h) {\r\n this.showHelp(parsed.command);\r\n return;\r\n }\r\n\r\n // No command provided - check for version or show help\r\n if (!parsed.command) {\r\n // Handle version only when no command\r\n if (parsed.options.version || parsed.options.v) {\r\n console.log(`${this.config.name} v${this.config.version}`);\r\n return;\r\n }\r\n\r\n if (this.commands.size === 0) {\r\n throw new types.CLIError('No command specified');\r\n }\r\n\r\n this.showHelp();\r\n return;\r\n }\r\n\r\n // Find command\r\n const command = this.commands.get(parsed.command);\r\n if (!command) {\r\n throw new types.CommandNotFoundError(parsed.command);\r\n }\r\n\r\n // Check if -v/--version should be handled as version (only if command doesn't use -v)\r\n const commandUsesV = command.options?.some(opt =>\r\n opt.flag === '-v' || opt.aliases?.includes('-v')\r\n );\r\n\r\n if (!commandUsesV && (parsed.options.version || parsed.options.v)) {\r\n console.log(`${this.config.name} v${this.config.version}`);\r\n return;\r\n }\r\n\r\n // If command allows dynamic args, re-parse to preserve option-like arguments\r\n if (command.allowDynamicArgs) {\r\n const reparsed = this.reparseForDynamicArgs(argv, parsed.command);\r\n const result = this.parseCommand(command, reparsed.positional, reparsed.options);\r\n if (command.action) {\r\n await command.action(result);\r\n }\r\n } else {\r\n // Parse and validate normally\r\n const result = this.parseCommand(command, parsed.positional, parsed.options);\r\n\r\n // Execute command\r\n if (command.action) {\r\n await command.action(result);\r\n }\r\n }\r\n } catch (error) {\r\n this.handleError(error);\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n private initializeCommands(): void {\r\n if (!this.config.commands) return;\r\n\r\n for (const cmd of this.config.commands) {\r\n this.commands.set(cmd.name, cmd);\r\n if (cmd.aliases) {\r\n for (const alias of cmd.aliases) {\r\n this.commands.set(alias, cmd);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private initializeGlobalOptions(): void {\r\n if (!this.config.globalOptions) return;\r\n\r\n for (const opt of this.config.globalOptions) {\r\n this.globalOptions.set(opt.name, opt);\r\n this.globalOptions.set(opt.flag, opt);\r\n if (opt.aliases) {\r\n for (const alias of opt.aliases) {\r\n this.globalOptions.set(alias, opt);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private reparseForDynamicArgs(argv: string[], commandName: string): { positional: string[]; options: Record<string, string | boolean> } {\r\n let idx = 0;\r\n\r\n // Find command in argv\r\n while (idx < argv.length && argv[idx] !== commandName) {\r\n idx++;\r\n }\r\n idx++; // Skip command name\r\n\r\n const positional: string[] = [];\r\n const options: Record<string, string | boolean> = {};\r\n const command = this.commands.get(commandName);\r\n const numRequiredArgs = command?.args?.filter(a => a.required !== false).length || 0;\r\n let argsConsumed = 0;\r\n\r\n while (idx < argv.length) {\r\n const token = argv[idx];\r\n\r\n // Consume required positional arguments first\r\n if (argsConsumed < numRequiredArgs && !token.startsWith('-')) {\r\n positional.push(token);\r\n argsConsumed++;\r\n idx++;\r\n continue;\r\n }\r\n\r\n // After required args are consumed, handle options vs args\r\n if (token.startsWith('--')) {\r\n const [key, value] = token.slice(2).split('=');\r\n const isKnownOption = command?.options?.some(o =>\r\n o.flag === `--${key}` || o.name === key || o.aliases?.includes(`--${key}`)\r\n );\r\n\r\n if (isKnownOption) {\r\n // Known option - parse normally\r\n if (value !== undefined) {\r\n options[key] = value;\r\n } else if (idx + 1 < argv.length && !argv[idx + 1].startsWith('-')) {\r\n options[key] = argv[idx + 1];\r\n idx++;\r\n } else {\r\n options[key] = true;\r\n }\r\n } else {\r\n // Unknown option - add to positional for later processing as dynamic option\r\n positional.push(token);\r\n // Check if next token is a value for this option\r\n if (value === undefined && idx + 1 < argv.length && !argv[idx + 1].startsWith('-')) {\r\n positional.push(argv[idx + 1]);\r\n idx++;\r\n }\r\n }\r\n } else if (token.startsWith('-') && token.length > 1 && isNaN(Number(token))) {\r\n // Short option(s) - check if all are known\r\n const flags = token.slice(1).split('');\r\n let allKnown = true;\r\n\r\n // Check if all flags are known\r\n for (const flag of flags) {\r\n const isKnownOption = command?.options?.some(o =>\r\n o.flag === `-${flag}` || o.aliases?.includes(`-${flag}`)\r\n );\r\n if (!isKnownOption) {\r\n allKnown = false;\r\n break;\r\n }\r\n }\r\n\r\n if (allKnown) {\r\n // All flags are known - parse them\r\n for (let i = 0; i < flags.length; i++) {\r\n const flag = flags[i];\r\n if (i === flags.length - 1 && idx + 1 < argv.length && !argv[idx + 1].startsWith('-')) {\r\n options[flag] = argv[idx + 1];\r\n idx++;\r\n } else {\r\n options[flag] = true;\r\n }\r\n }\r\n } else {\r\n // Some flags are unknown - add entire token to positional\r\n positional.push(token);\r\n // Check if next token is a value\r\n if (idx + 1 < argv.length && !argv[idx + 1].startsWith('-')) {\r\n positional.push(argv[idx + 1]);\r\n idx++;\r\n }\r\n }\r\n } else {\r\n // Regular positional argument\r\n positional.push(token);\r\n }\r\n\r\n idx++;\r\n }\r\n\r\n return { positional, options };\r\n }\r\n\r\n private parseCommand(\r\n command: types.CommandConfig,\r\n positional: string[],\r\n rawOptions: Record<string, string | boolean>\r\n ): types.ParsedCommand {\r\n const result: types.ParsedCommand = {\r\n args: {},\r\n options: {}\r\n };\r\n\r\n // Track which options are known\r\n const knownOptionKeys = new Set<string>();\r\n if (command.options) {\r\n for (const opt of command.options) {\r\n knownOptionKeys.add(opt.name);\r\n knownOptionKeys.add(opt.flag.replace(/^-+/, ''));\r\n if (opt.aliases) {\r\n opt.aliases.forEach(a => knownOptionKeys.add(a.replace(/^-+/, '')));\r\n }\r\n }\r\n }\r\n\r\n // Parse arguments\r\n let dynamicArgsStart = 0;\r\n if (command.args) {\r\n for (let i = 0; i < command.args.length; i++) {\r\n const argConfig = command.args[i];\r\n const value = positional[i];\r\n\r\n if (!value) {\r\n if (argConfig.required !== false) {\r\n throw new types.ValidationError(`Missing required argument: ${argConfig.name}`);\r\n }\r\n\r\n result.args[argConfig.name] = argConfig.default ?? '';\r\n continue;\r\n }\r\n\r\n // Validate\r\n if (argConfig.validate) {\r\n const validation = argConfig.validate(value);\r\n if (validation !== true) {\r\n throw new types.ValidationError(\r\n typeof validation === 'string'\r\n ? validation\r\n : `Invalid value for argument '${argConfig.name}': ${value}`\r\n );\r\n }\r\n }\r\n\r\n result.args[argConfig.name] = value;\r\n dynamicArgsStart = i + 1;\r\n }\r\n }\r\n\r\n // Parse options\r\n const dynamicOptions: Record<string, string | boolean> = {};\r\n const optionIndices = new Set<number>();\r\n\r\n if (command.options) {\r\n for (const optConfig of command.options) {\r\n const value = this.getOptionValue(optConfig, rawOptions);\r\n\r\n if (value === undefined) {\r\n if (optConfig.required) {\r\n throw new types.ValidationError(`Missing required option: --${optConfig.name}`);\r\n }\r\n\r\n result.options[optConfig.name] = optConfig.default ?? (optConfig.type === 'boolean' ? false : '');\r\n continue;\r\n }\r\n\r\n // Type conversion\r\n const converted = this.convertOptionType(value, optConfig.type);\r\n\r\n // Validate\r\n if (optConfig.validate) {\r\n const validation = optConfig.validate(converted);\r\n if (validation !== true) {\r\n throw new types.ValidationError(\r\n typeof validation === 'string'\r\n ? validation\r\n : `Invalid value for option '${optConfig.name}': ${converted}`\r\n );\r\n }\r\n }\r\n\r\n result.options[optConfig.name] = converted;\r\n }\r\n }\r\n\r\n // Handle dynamic options from rawOptions\r\n for (const [key, value] of Object.entries(rawOptions)) {\r\n if (!knownOptionKeys.has(key)) {\r\n dynamicOptions[key] = value;\r\n }\r\n }\r\n\r\n // Parse dynamic options from positional args and track their indices (only if allowDynamicOptions)\r\n if (command.allowDynamicOptions) {\r\n let i = dynamicArgsStart;\r\n while (i < positional.length) {\r\n const token = positional[i];\r\n\r\n if (token.startsWith('--')) {\r\n const [key, value] = token.slice(2).split('=');\r\n optionIndices.add(i);\r\n if (value !== undefined) {\r\n dynamicOptions[key] = value;\r\n i++;\r\n } else if (i + 1 < positional.length && !positional[i + 1].startsWith('-')) {\r\n dynamicOptions[key] = positional[i + 1];\r\n optionIndices.add(i + 1);\r\n i += 2;\r\n } else {\r\n dynamicOptions[key] = true;\r\n i++;\r\n }\r\n } else if (token.startsWith('-') && token.length > 1 && isNaN(Number(token))) {\r\n optionIndices.add(i);\r\n const flags = token.slice(1).split('');\r\n for (let j = 0; j < flags.length; j++) {\r\n const flag = flags[j];\r\n if (j === flags.length - 1 && i + 1 < positional.length && !positional[i + 1].startsWith('-')) {\r\n dynamicOptions[flag] = positional[i + 1];\r\n optionIndices.add(i + 1);\r\n i++;\r\n } else {\r\n dynamicOptions[flag] = true;\r\n }\r\n }\r\n i++;\r\n } else {\r\n i++;\r\n }\r\n }\r\n }\r\n\r\n // Handle dynamic arguments - filter out options using tracked indices\r\n if (command.allowDynamicArgs) {\r\n const dynamicArgs: string[] = [];\r\n for (let i = dynamicArgsStart; i < positional.length; i++) {\r\n if (!optionIndices.has(i)) {\r\n dynamicArgs.push(positional[i]);\r\n }\r\n }\r\n result.dynamicArgs = dynamicArgs;\r\n } else if (positional.length > dynamicArgsStart) {\r\n // Throw error if there are extra positional args but dynamic args not allowed\r\n throw new types.ValidationError(`Unexpected argument: ${positional[dynamicArgsStart]}`);\r\n }\r\n\r\n if (command.allowDynamicOptions) {\r\n result.dynamicOptions = dynamicOptions;\r\n } else if (Object.keys(dynamicOptions).length > 0) {\r\n // Throw error if there are unknown options but dynamic options not allowed\r\n const unknownKey = Object.keys(dynamicOptions)[0];\r\n throw new types.ValidationError(`Unknown option: ${unknownKey.length === 1 ? '-' : '--'}${unknownKey}`);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private getOptionValue(config: types.OptionConfig, rawOptions: Record<string, string | boolean>): string | boolean | undefined {\r\n // Check by name first\r\n if (rawOptions[config.name] !== undefined) {\r\n return rawOptions[config.name];\r\n }\r\n\r\n // Check by flag (remove ALL leading dashes)\r\n const flag = config.flag.replace(/^-+/, '');\r\n if (rawOptions[flag] !== undefined) {\r\n return rawOptions[flag];\r\n }\r\n\r\n // Check aliases\r\n if (config.aliases) {\r\n for (const alias of config.aliases) {\r\n const cleanAlias = alias.replace(/^-+/, '');\r\n if (rawOptions[cleanAlias] !== undefined) {\r\n return rawOptions[cleanAlias];\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private convertOptionType(value: string | boolean, type?: 'boolean' | 'string' | 'number'): string | boolean | number {\r\n if (type === 'number') {\r\n const num = Number(value);\r\n if (isNaN(num)) {\r\n throw new types.ValidationError(`Expected number, got: ${value}`);\r\n }\r\n\r\n return num;\r\n }\r\n\r\n if (type === 'boolean') {\r\n if (value === true || value === 'true') return true;\r\n if (value === false || value === 'false') return false;\r\n return !!value;\r\n }\r\n\r\n return String(value);\r\n }\r\n\r\n private showHelp(commandName?: string): void {\r\n if (commandName) {\r\n const command = this.commands.get(commandName);\r\n if (command) {\r\n this.showCommandHelp(command);\r\n return;\r\n }\r\n }\r\n\r\n console.log(`${this.config.name} v${this.config.version}`);\r\n if (this.config.description) {\r\n console.log(this.config.description);\r\n }\r\n console.log();\r\n console.log('USAGE:');\r\n console.log(` ${this.config.name} <command> [options]`);\r\n console.log();\r\n console.log('COMMANDS:');\r\n\r\n const uniqueCommands = new Map<string, types.CommandConfig>();\r\n for (const [name, cmd] of this.commands) {\r\n if (name === cmd.name) {\r\n uniqueCommands.set(name, cmd);\r\n }\r\n }\r\n\r\n for (const [name, cmd] of uniqueCommands) {\r\n const aliases = cmd.aliases ? ` (${cmd.aliases.join(', ')})` : '';\r\n console.log(` ${name}${aliases}`);\r\n if (cmd.description) {\r\n console.log(` ${cmd.description}`);\r\n }\r\n }\r\n\r\n console.log();\r\n console.log('OPTIONS:');\r\n console.log(' -h, --help Show help');\r\n console.log(' -v, --version Show version');\r\n }\r\n\r\n private showCommandHelp(command: types.CommandConfig): void {\r\n console.log(`${command.name}`);\r\n if (command.description) {\r\n console.log(command.description);\r\n }\r\n console.log();\r\n\r\n // Usage\r\n let usage = `${this.config.name} ${command.name}`;\r\n if (command.args) {\r\n usage += ' ' + command.args.map(a =>\r\n a.required !== false ? `<${a.name}>` : `[${a.name}]`\r\n ).join(' ');\r\n }\r\n\r\n if (command.allowDynamicArgs) {\r\n usage += ' [...]';\r\n }\r\n\r\n console.log('USAGE:');\r\n console.log(` ${usage}`);\r\n console.log();\r\n\r\n // Arguments\r\n if (command.args && command.args.length > 0) {\r\n console.log('ARGUMENTS:');\r\n for (const arg of command.args) {\r\n const req = arg.required !== false ? 'required' : 'optional';\r\n console.log(` ${arg.name} (${req})`);\r\n if (arg.description) {\r\n console.log(` ${arg.description}`);\r\n }\r\n }\r\n\r\n if (command.allowDynamicArgs) {\r\n console.log(` ... (additional arguments allowed)`);\r\n }\r\n\r\n console.log();\r\n }\r\n\r\n // Options\r\n if (command.options && command.options.length > 0) {\r\n console.log('OPTIONS:');\r\n for (const opt of command.options) {\r\n const aliases = opt.aliases ? `, ${opt.aliases.join(', ')}` : '';\r\n const req = opt.required ? ' (required)' : '';\r\n console.log(` ${opt.flag}${aliases}${req}`);\r\n if (opt.description) {\r\n console.log(` ${opt.description}`);\r\n }\r\n }\r\n }\r\n\r\n if (command.allowDynamicOptions) {\r\n console.log(` ... (additional options allowed)`);\r\n }\r\n\r\n if ((command.options && command.options.length > 0) || command.allowDynamicOptions) {\r\n console.log();\r\n }\r\n\r\n // Examples\r\n if (command.examples && command.examples.length > 0) {\r\n console.log('EXAMPLES:');\r\n for (const example of command.examples) {\r\n console.log(` ${example}`);\r\n }\r\n console.log();\r\n }\r\n }\r\n\r\n private handleError(error: unknown): void {\r\n if (error instanceof types.CLIError) {\r\n console.error(`Error: ${error.message}`);\r\n process.exit(1);\r\n } else if (error instanceof Error) {\r\n console.error(`Unexpected error: ${error.message}`);\r\n if (process.env.DEBUG) {\r\n console.error(error.stack);\r\n }\r\n process.exit(1);\r\n } else {\r\n console.error('An unknown error occurred');\r\n process.exit(1);\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/core/builder.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import * as types from './types.d';\r\n import { CLI } from '../core';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class Builder {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n private config: types.CLIConfig;\r\n\r\n constructor(name: string, version: string) {\r\n this.config = { name, version, commands: [], globalOptions: [] };\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n description(desc: string): this {\r\n this.config.description = desc;\r\n return this;\r\n }\r\n\r\n command(config: types.CommandConfig): this {\r\n if (!this.config.commands) this.config.commands = [];\r\n this.config.commands.push(config);\r\n return this;\r\n }\r\n\r\n globalOption(option: types.OptionConfig): this {\r\n if (!this.config.globalOptions) this.config.globalOptions = [];\r\n this.config.globalOptions.push(option);\r\n return this;\r\n }\r\n\r\n build(): CLI {\r\n return new CLI(this.config);\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n export function cli(name: string, version: string): Builder {\r\n return new Builder(name, version);\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/main.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { cli } from './core/builder';\r\n\r\n export * from './core';\r\n export * from './core/builder';\r\n export * from './core/types.d';\r\n\r\n export default cli;\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝"]}
1
+ {"version":3,"sources":["../src/core/parser.ts","../src/core/types.d.ts","../src/core/index.ts","../src/core/builder.ts","../src/main.ts"],"names":["ArgumentParser","args","result","token","key","value","flags","i","flag","CLIError","_CLIError","message","code","ValidationError","CommandNotFoundError","command","CLI","config","argv","parsed","opt","reparsed","error","cmd","alias","commandName","idx","positional","options","numRequiredArgs","a","argsConsumed","o","allKnown","rawOptions","knownOptionKeys","dynamicArgsStart","argConfig","validation","dynamicOptions","optionIndices","optConfig","converted","j","dynamicArgs","unknownKey","cleanAlias","type","num","uniqueCommands","name","aliases","usage","arg","req","example","Builder","version","desc","option","cli","main_default"],"mappings":"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","sourcesContent":["// src/core/parser.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class ArgumentParser {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n private tokens : string[] = [];\r\n private position = 0;\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n parse(args: string[]): { command?: string; options: Record<string, string | boolean>; positional: string[] } {\r\n this.tokens = args;\r\n this.position = 0;\r\n\r\n const result: { command?: string; options: Record<string, string | boolean>; positional: string[] } = {\r\n options: {},\r\n positional: []\r\n };\r\n\r\n // First token might be a command\r\n if (this.hasNext() && !this.peek().startsWith('-')) {\r\n result.command = this.consume();\r\n }\r\n\r\n while (this.hasNext()) {\r\n const token = this.consume();\r\n\r\n if (token.startsWith('--')) {\r\n // Long option\r\n const [key, value] = token.slice(2).split('=');\r\n if (value !== undefined) {\r\n result.options[key] = value;\r\n } else if (this.hasNext() && !this.peek().startsWith('-')) {\r\n result.options[key] = this.consume();\r\n } else {\r\n result.options[key] = true;\r\n }\r\n } else if (token.startsWith('-') && token.length > 1) {\r\n // Short option(s)\r\n const flags = token.slice(1).split('');\r\n for (let i = 0; i < flags.length; i++) {\r\n const flag = flags[i];\r\n if (i === flags.length - 1 && this.hasNext() && !this.peek().startsWith('-')) {\r\n result.options[flag] = this.consume();\r\n } else {\r\n result.options[flag] = true;\r\n }\r\n }\r\n } else {\r\n // Positional argument\r\n result.positional.push(token);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n private hasNext(): boolean {\r\n return this.position < this.tokens.length;\r\n }\r\n\r\n private peek(): string {\r\n return this.tokens[this.position];\r\n }\r\n\r\n private consume(): string {\r\n return this.tokens[this.position++];\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/core/types.d.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n export interface CommandConfig<T = ParsedCommand> {\r\n name : string;\r\n aliases? : string[];\r\n description? : string;\r\n args? : ArgumentConfig[];\r\n options? : OptionConfig[];\r\n action? : (parsed: T) => void | Promise<void>;\r\n examples? : string[];\r\n\r\n allowDynamicArgs? : boolean;\r\n allowDynamicOptions? : boolean;\r\n }\r\n\r\n export interface ArgumentConfig {\r\n name : string;\r\n description? : string;\r\n required? : boolean;\r\n validate? : (value: string) => boolean | string;\r\n default? : string;\r\n }\r\n\r\n export interface OptionConfig {\r\n name : string;\r\n flag : string;\r\n aliases? : string[];\r\n description? : string;\r\n type? : 'boolean' | 'string' | 'number';\r\n default? : string | boolean | number;\r\n required? : boolean;\r\n validate? : (value: string | boolean | number) => boolean | string;\r\n }\r\n\r\n export interface CLIConfig {\r\n name : string;\r\n version : string;\r\n description? : string;\r\n commands? : CommandConfig[];\r\n globalOptions? : OptionConfig[];\r\n }\r\n\r\n export interface ParsedCommand {\r\n args : Record<string, string>;\r\n options : Record<string, string | boolean | number>;\r\n\r\n dynamicArgs? : string[];\r\n dynamicOptions? : Record<string, string | boolean>;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔═══════════════════════════════════════ ERRORS ═══════════════════════════════════════╗\r\n\r\n export class CLIError extends Error {\r\n constructor(message: string, public code: string = 'CLI_ERROR') {\r\n super(message);\r\n this.name = 'CLIError';\r\n Error.captureStackTrace?.(this, CLIError);\r\n }\r\n }\r\n\r\n export class ValidationError extends CLIError {\r\n constructor(message: string) {\r\n super(message, 'VALIDATION_ERROR');\r\n this.name = 'ValidationError';\r\n }\r\n }\r\n\r\n export class CommandNotFoundError extends CLIError {\r\n constructor(command: string) {\r\n super(`Command '${command}' not found`, 'COMMAND_NOT_FOUND');\r\n this.name = 'CommandNotFoundError';\r\n }\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/core/index.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { ArgumentParser } from './parser';\r\n import * as types from './types.d';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class CLI {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n private commands = new Map<string, types.CommandConfig>();\r\n private globalOptions = new Map<string, types.OptionConfig>();\r\n private parser = new ArgumentParser();\r\n\r\n constructor(public config : types.CLIConfig) {\r\n this.initializeCommands();\r\n this.initializeGlobalOptions();\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n async run(argv: string[] = process.argv.slice(2)): Promise<void> {\r\n try {\r\n const parsed = this.parser.parse(argv);\r\n\r\n // Handle help (always check this first)\r\n if (parsed.options.help || parsed.options.h) {\r\n this.showHelp(parsed.command);\r\n return;\r\n }\r\n\r\n // No command provided - check for version or show help\r\n if (!parsed.command) {\r\n // Handle version only when no command\r\n if (parsed.options.version || parsed.options.v) {\r\n console.log(`${this.config.name} v${this.config.version}`);\r\n return;\r\n }\r\n\r\n if (this.commands.size === 0) {\r\n throw new types.CLIError('No command specified');\r\n }\r\n\r\n this.showHelp();\r\n return;\r\n }\r\n\r\n // Find command\r\n const command = this.commands.get(parsed.command);\r\n if (!command) {\r\n throw new types.CommandNotFoundError(parsed.command);\r\n }\r\n\r\n // Check if -v/--version should be handled as version (only if command doesn't use -v)\r\n const commandUsesV = command.options?.some(opt =>\r\n opt.flag === '-v' || opt.aliases?.includes('-v')\r\n );\r\n\r\n if (!commandUsesV && (parsed.options.version || parsed.options.v)) {\r\n console.log(`${this.config.name} v${this.config.version}`);\r\n return;\r\n }\r\n\r\n // If command allows dynamic args, re-parse to preserve option-like arguments\r\n if (command.allowDynamicArgs) {\r\n const reparsed = this.reparseForDynamicArgs(argv, parsed.command);\r\n const result = this.parseCommand(command, reparsed.positional, reparsed.options);\r\n if (command.action) {\r\n await command.action(result);\r\n }\r\n } else {\r\n // Parse and validate normally\r\n const result = this.parseCommand(command, parsed.positional, parsed.options);\r\n\r\n // Execute command\r\n if (command.action) {\r\n await command.action(result);\r\n }\r\n }\r\n } catch (error) {\r\n this.handleError(error);\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n private initializeCommands(): void {\r\n if (!this.config.commands) return;\r\n\r\n for (const cmd of this.config.commands) {\r\n this.commands.set(cmd.name, cmd);\r\n if (cmd.aliases) {\r\n for (const alias of cmd.aliases) {\r\n this.commands.set(alias, cmd);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private initializeGlobalOptions(): void {\r\n if (!this.config.globalOptions) return;\r\n\r\n for (const opt of this.config.globalOptions) {\r\n this.globalOptions.set(opt.name, opt);\r\n this.globalOptions.set(opt.flag, opt);\r\n if (opt.aliases) {\r\n for (const alias of opt.aliases) {\r\n this.globalOptions.set(alias, opt);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private reparseForDynamicArgs(argv: string[], commandName: string): { positional: string[]; options: Record<string, string | boolean> } {\r\n let idx = 0;\r\n\r\n // Find command in argv\r\n while (idx < argv.length && argv[idx] !== commandName) {\r\n idx++;\r\n }\r\n idx++; // Skip command name\r\n\r\n const positional: string[] = [];\r\n const options: Record<string, string | boolean> = {};\r\n const command = this.commands.get(commandName);\r\n const numRequiredArgs = command?.args?.filter(a => a.required !== false).length || 0;\r\n let argsConsumed = 0;\r\n\r\n while (idx < argv.length) {\r\n const token = argv[idx];\r\n\r\n // Consume required positional arguments first\r\n if (argsConsumed < numRequiredArgs && !token.startsWith('-')) {\r\n positional.push(token);\r\n argsConsumed++;\r\n idx++;\r\n continue;\r\n }\r\n\r\n // After required args are consumed, handle options vs args\r\n if (token.startsWith('--')) {\r\n const [key, value] = token.slice(2).split('=');\r\n const isKnownOption = command?.options?.some(o =>\r\n o.flag === `--${key}` || o.name === key || o.aliases?.includes(`--${key}`)\r\n );\r\n\r\n if (isKnownOption) {\r\n // Known option - parse normally\r\n if (value !== undefined) {\r\n options[key] = value;\r\n } else if (idx + 1 < argv.length && !argv[idx + 1].startsWith('-')) {\r\n options[key] = argv[idx + 1];\r\n idx++;\r\n } else {\r\n options[key] = true;\r\n }\r\n } else {\r\n // Unknown option - add to positional for later processing as dynamic option\r\n positional.push(token);\r\n // Check if next token is a value for this option\r\n if (value === undefined && idx + 1 < argv.length && !argv[idx + 1].startsWith('-')) {\r\n positional.push(argv[idx + 1]);\r\n idx++;\r\n }\r\n }\r\n } else if (token.startsWith('-') && token.length > 1 && isNaN(Number(token))) {\r\n // Short option(s) - check if all are known\r\n const flags = token.slice(1).split('');\r\n let allKnown = true;\r\n\r\n // Check if all flags are known\r\n for (const flag of flags) {\r\n const isKnownOption = command?.options?.some(o =>\r\n o.flag === `-${flag}` || o.aliases?.includes(`-${flag}`)\r\n );\r\n if (!isKnownOption) {\r\n allKnown = false;\r\n break;\r\n }\r\n }\r\n\r\n if (allKnown) {\r\n // All flags are known - parse them\r\n for (let i = 0; i < flags.length; i++) {\r\n const flag = flags[i];\r\n if (i === flags.length - 1 && idx + 1 < argv.length && !argv[idx + 1].startsWith('-')) {\r\n options[flag] = argv[idx + 1];\r\n idx++;\r\n } else {\r\n options[flag] = true;\r\n }\r\n }\r\n } else {\r\n // Some flags are unknown - add entire token to positional\r\n positional.push(token);\r\n // Check if next token is a value\r\n if (idx + 1 < argv.length && !argv[idx + 1].startsWith('-')) {\r\n positional.push(argv[idx + 1]);\r\n idx++;\r\n }\r\n }\r\n } else {\r\n // Regular positional argument\r\n positional.push(token);\r\n }\r\n\r\n idx++;\r\n }\r\n\r\n return { positional, options };\r\n }\r\n\r\n private parseCommand(\r\n command: types.CommandConfig,\r\n positional: string[],\r\n rawOptions: Record<string, string | boolean>\r\n ): types.ParsedCommand {\r\n const result: types.ParsedCommand = {\r\n args: {},\r\n options: {}\r\n };\r\n\r\n // Track which options are known\r\n const knownOptionKeys = new Set<string>();\r\n if (command.options) {\r\n for (const opt of command.options) {\r\n knownOptionKeys.add(opt.name);\r\n knownOptionKeys.add(opt.flag.replace(/^-+/, ''));\r\n if (opt.aliases) {\r\n opt.aliases.forEach(a => knownOptionKeys.add(a.replace(/^-+/, '')));\r\n }\r\n }\r\n }\r\n\r\n // Parse arguments\r\n let dynamicArgsStart = 0;\r\n if (command.args) {\r\n for (let i = 0; i < command.args.length; i++) {\r\n const argConfig = command.args[i];\r\n const value = positional[i];\r\n\r\n if (!value) {\r\n if (argConfig.required !== false) {\r\n throw new types.ValidationError(`Missing required argument: ${argConfig.name}`);\r\n }\r\n\r\n result.args[argConfig.name] = argConfig.default ?? '';\r\n continue;\r\n }\r\n\r\n // Validate\r\n if (argConfig.validate) {\r\n const validation = argConfig.validate(value);\r\n if (validation !== true) {\r\n throw new types.ValidationError(\r\n typeof validation === 'string'\r\n ? validation\r\n : `Invalid value for argument '${argConfig.name}': ${value}`\r\n );\r\n }\r\n }\r\n\r\n result.args[argConfig.name] = value;\r\n dynamicArgsStart = i + 1;\r\n }\r\n }\r\n\r\n // Parse options\r\n const dynamicOptions: Record<string, string | boolean> = {};\r\n const optionIndices = new Set<number>();\r\n\r\n if (command.options) {\r\n for (const optConfig of command.options) {\r\n const value = this.getOptionValue(optConfig, rawOptions);\r\n\r\n if (value === undefined) {\r\n if (optConfig.required) {\r\n throw new types.ValidationError(`Missing required option: --${optConfig.name}`);\r\n }\r\n\r\n result.options[optConfig.name] = optConfig.default ?? (optConfig.type === 'boolean' ? false : '');\r\n continue;\r\n }\r\n\r\n // Type conversion\r\n const converted = this.convertOptionType(value, optConfig.type);\r\n\r\n // Validate\r\n if (optConfig.validate) {\r\n const validation = optConfig.validate(converted);\r\n if (validation !== true) {\r\n throw new types.ValidationError(\r\n typeof validation === 'string'\r\n ? validation\r\n : `Invalid value for option '${optConfig.name}': ${converted}`\r\n );\r\n }\r\n }\r\n\r\n result.options[optConfig.name] = converted;\r\n }\r\n }\r\n\r\n // Handle dynamic options from rawOptions\r\n for (const [key, value] of Object.entries(rawOptions)) {\r\n if (!knownOptionKeys.has(key)) {\r\n dynamicOptions[key] = value;\r\n }\r\n }\r\n\r\n // Parse dynamic options from positional args and track their indices (only if allowDynamicOptions)\r\n if (command.allowDynamicOptions) {\r\n let i = dynamicArgsStart;\r\n while (i < positional.length) {\r\n const token = positional[i];\r\n\r\n if (token.startsWith('--')) {\r\n const [key, value] = token.slice(2).split('=');\r\n optionIndices.add(i);\r\n if (value !== undefined) {\r\n dynamicOptions[key] = value;\r\n i++;\r\n } else if (i + 1 < positional.length && !positional[i + 1].startsWith('-')) {\r\n dynamicOptions[key] = positional[i + 1];\r\n optionIndices.add(i + 1);\r\n i += 2;\r\n } else {\r\n dynamicOptions[key] = true;\r\n i++;\r\n }\r\n } else if (token.startsWith('-') && token.length > 1 && isNaN(Number(token))) {\r\n optionIndices.add(i);\r\n const flags = token.slice(1).split('');\r\n for (let j = 0; j < flags.length; j++) {\r\n const flag = flags[j];\r\n if (j === flags.length - 1 && i + 1 < positional.length && !positional[i + 1].startsWith('-')) {\r\n dynamicOptions[flag] = positional[i + 1];\r\n optionIndices.add(i + 1);\r\n i++;\r\n } else {\r\n dynamicOptions[flag] = true;\r\n }\r\n }\r\n i++;\r\n } else {\r\n i++;\r\n }\r\n }\r\n }\r\n\r\n // Handle dynamic arguments - filter out options using tracked indices\r\n if (command.allowDynamicArgs) {\r\n const dynamicArgs: string[] = [];\r\n for (let i = dynamicArgsStart; i < positional.length; i++) {\r\n if (!optionIndices.has(i)) {\r\n dynamicArgs.push(positional[i]);\r\n }\r\n }\r\n result.dynamicArgs = dynamicArgs;\r\n } else if (positional.length > dynamicArgsStart) {\r\n // Throw error if there are extra positional args but dynamic args not allowed\r\n throw new types.ValidationError(`Unexpected argument: ${positional[dynamicArgsStart]}`);\r\n }\r\n\r\n if (command.allowDynamicOptions) {\r\n result.dynamicOptions = dynamicOptions;\r\n } else if (Object.keys(dynamicOptions).length > 0) {\r\n // Throw error if there are unknown options but dynamic options not allowed\r\n const unknownKey = Object.keys(dynamicOptions)[0];\r\n throw new types.ValidationError(`Unknown option: ${unknownKey.length === 1 ? '-' : '--'}${unknownKey}`);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private getOptionValue(config: types.OptionConfig, rawOptions: Record<string, string | boolean>): string | boolean | undefined {\r\n // Check by name first\r\n if (rawOptions[config.name] !== undefined) {\r\n return rawOptions[config.name];\r\n }\r\n\r\n // Check by flag (remove ALL leading dashes)\r\n const flag = config.flag.replace(/^-+/, '');\r\n if (rawOptions[flag] !== undefined) {\r\n return rawOptions[flag];\r\n }\r\n\r\n // Check aliases\r\n if (config.aliases) {\r\n for (const alias of config.aliases) {\r\n const cleanAlias = alias.replace(/^-+/, '');\r\n if (rawOptions[cleanAlias] !== undefined) {\r\n return rawOptions[cleanAlias];\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private convertOptionType(value: string | boolean, type?: 'boolean' | 'string' | 'number'): string | boolean | number {\r\n if (type === 'number') {\r\n const num = Number(value);\r\n if (isNaN(num)) {\r\n throw new types.ValidationError(`Expected number, got: ${value}`);\r\n }\r\n\r\n return num;\r\n }\r\n\r\n if (type === 'boolean') {\r\n if (value === true || value === 'true') return true;\r\n if (value === false || value === 'false') return false;\r\n return !!value;\r\n }\r\n\r\n return String(value);\r\n }\r\n\r\n private showHelp(commandName?: string): void {\r\n if (commandName) {\r\n const command = this.commands.get(commandName);\r\n if (command) {\r\n this.showCommandHelp(command);\r\n return;\r\n }\r\n }\r\n\r\n console.log(`${this.config.name} v${this.config.version}`);\r\n if (this.config.description) {\r\n console.log(this.config.description);\r\n }\r\n console.log();\r\n console.log('USAGE:');\r\n console.log(` ${this.config.name} <command> [options]`);\r\n console.log();\r\n console.log('COMMANDS:');\r\n\r\n const uniqueCommands = new Map<string, types.CommandConfig>();\r\n for (const [name, cmd] of this.commands) {\r\n if (name === cmd.name) {\r\n uniqueCommands.set(name, cmd);\r\n }\r\n }\r\n\r\n for (const [name, cmd] of uniqueCommands) {\r\n const aliases = cmd.aliases ? ` (${cmd.aliases.join(', ')})` : '';\r\n console.log(` ${name}${aliases}`);\r\n if (cmd.description) {\r\n console.log(` ${cmd.description}`);\r\n }\r\n }\r\n\r\n console.log();\r\n console.log('OPTIONS:');\r\n console.log(' -h, --help Show help');\r\n console.log(' -v, --version Show version');\r\n }\r\n\r\n private showCommandHelp(command: types.CommandConfig): void {\r\n console.log(`${command.name}`);\r\n if (command.description) {\r\n console.log(command.description);\r\n }\r\n console.log();\r\n\r\n // Usage\r\n let usage = `${this.config.name} ${command.name}`;\r\n if (command.args) {\r\n usage += ' ' + command.args.map(a =>\r\n a.required !== false ? `<${a.name}>` : `[${a.name}]`\r\n ).join(' ');\r\n }\r\n\r\n if (command.allowDynamicArgs) {\r\n usage += ' [...]';\r\n }\r\n\r\n console.log('USAGE:');\r\n console.log(` ${usage}`);\r\n console.log();\r\n\r\n // Arguments\r\n if (command.args && command.args.length > 0) {\r\n console.log('ARGUMENTS:');\r\n for (const arg of command.args) {\r\n const req = arg.required !== false ? 'required' : 'optional';\r\n console.log(` ${arg.name} (${req})`);\r\n if (arg.description) {\r\n console.log(` ${arg.description}`);\r\n }\r\n }\r\n\r\n if (command.allowDynamicArgs) {\r\n console.log(` ... (additional arguments allowed)`);\r\n }\r\n\r\n console.log();\r\n }\r\n\r\n // Options\r\n if (command.options && command.options.length > 0) {\r\n console.log('OPTIONS:');\r\n for (const opt of command.options) {\r\n const aliases = opt.aliases ? `, ${opt.aliases.join(', ')}` : '';\r\n const req = opt.required ? ' (required)' : '';\r\n console.log(` ${opt.flag}${aliases}${req}`);\r\n if (opt.description) {\r\n console.log(` ${opt.description}`);\r\n }\r\n }\r\n }\r\n\r\n if (command.allowDynamicOptions) {\r\n console.log(` ... (additional options allowed)`);\r\n }\r\n\r\n if ((command.options && command.options.length > 0) || command.allowDynamicOptions) {\r\n console.log();\r\n }\r\n\r\n // Examples\r\n if (command.examples && command.examples.length > 0) {\r\n console.log('EXAMPLES:');\r\n for (const example of command.examples) {\r\n console.log(` ${example}`);\r\n }\r\n console.log();\r\n }\r\n }\r\n\r\n private handleError(error: unknown): void {\r\n if (error instanceof types.CLIError) {\r\n console.error(`Error: ${error.message}`);\r\n process.exit(1);\r\n } else if (error instanceof Error) {\r\n console.error(`Unexpected error: ${error.message}`);\r\n if (process.env.DEBUG) {\r\n console.error(error.stack);\r\n }\r\n process.exit(1);\r\n } else {\r\n console.error('An unknown error occurred');\r\n process.exit(1);\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/core/builder.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import * as types from './types.d';\r\n import { CLI } from '../core';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class Builder {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n private config: types.CLIConfig;\r\n\r\n constructor(name: string, version: string) {\r\n this.config = { name, version, commands: [], globalOptions: [] };\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n description(desc: string): this {\r\n this.config.description = desc;\r\n return this;\r\n }\r\n\r\n command(config: types.CommandConfig): this {\r\n if (!this.config.commands) this.config.commands = [];\r\n this.config.commands.push(config);\r\n return this;\r\n }\r\n\r\n globalOption(option: types.OptionConfig): this {\r\n if (!this.config.globalOptions) this.config.globalOptions = [];\r\n this.config.globalOptions.push(option);\r\n return this;\r\n }\r\n\r\n build(): CLI {\r\n return new CLI(this.config);\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n export function cli(name: string, version: string): Builder {\r\n return new Builder(name, version);\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/main.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { cli } from './core/builder';\r\n\r\n export * from './core';\r\n export * from './core/builder';\r\n export * from './core/types.d';\r\n\r\n export default cli;\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@minejs/cli",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
4
4
  "description": "Zero-dependency CLI framework for fast, organized, and validated command-line applications.",
5
5
  "keywords": ["minejs", "cli"],
6
6
  "license": "MIT",