@minejs/cli 0.0.1

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Maysara Elshewehy (https://github.com/maysara-elshewehy)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,356 @@
1
+ <!-- ╔══════════════════════════════ BEG ══════════════════════════════╗ -->
2
+
3
+ <br>
4
+ <div align="center">
5
+ <p>
6
+ <img src="./assets/img/logo.png" alt="logo" style="" height="60" />
7
+ </p>
8
+ </div>
9
+
10
+ <div align="center">
11
+ <img src="https://img.shields.io/badge/v-0.0.1-black"/>
12
+ <a href="https://github.com/minejs-org"> <img src="https://img.shields.io/badge/🔥-@minejs-black"/> </a>
13
+ <img src="https://img.shields.io/badge/zero-dependencies-black" alt="zero-dependencies" />
14
+ <br>
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" />
18
+ </div>
19
+ <br>
20
+
21
+ <!-- ╚═════════════════════════════════════════════════════════════════╝ -->
22
+
23
+
24
+
25
+
26
+ <!-- ╔══════════════════════════════ DOC ══════════════════════════════╗ -->
27
+
28
+
29
+ - ## Quick Start 🔥
30
+
31
+ > _***Zero-dependency CLI framework for fast, organized, and validated command-line applications.***_
32
+
33
+ - ### Setup
34
+
35
+ > install [`hmm`](https://github.com/minejs/hmm) first.
36
+
37
+ ```bash
38
+ hmm i @minejs/cli
39
+ ```
40
+
41
+ <div align="center"> <img src="./assets/img/line.png" alt="line" style="display: block; margin-top:20px;margin-bottom:20px;width:500px;"/> <br> </div>
42
+
43
+ - ### Usage
44
+
45
+ ```ts
46
+ import { cli } from '@minejs/cli'
47
+ ```
48
+
49
+ - ### 1. Basic CLI
50
+
51
+ ```typescript
52
+ cli('git', '1.0.0')
53
+ .command({
54
+ name : 'commit',
55
+ args : [{ name: 'message', required: true }],
56
+ options : [{ name: 'amend', flag: '-a', type: 'boolean' }],
57
+ action : ({ args, options }) => {
58
+ console.log(`Committing: ${args.message}`);
59
+ }
60
+ })
61
+ .build()
62
+ .run();
63
+ ```
64
+
65
+ ```bash
66
+ git commit "fix bug" -a
67
+ ```
68
+
69
+ <div align="center"> <img src="./assets/img/line.png" alt="line" style="display: block; margin-top:20px;margin-bottom:20px;width:500px;"/> <br> </div>
70
+
71
+ - ### 2. Multiple Arguments
72
+
73
+ ```typescript
74
+ .command({
75
+ name : 'person',
76
+ args : [
77
+ { name: 'name', required: true },
78
+ { name: 'age', required: true, validate: (v) => !isNaN(Number(v)) }
79
+ ],
80
+ action : ({ args }) => { console.log(`${args.name}, ${args.age} years old`); }
81
+ })
82
+ ```
83
+
84
+ ```bash
85
+ myapp person "John Doe" 30
86
+ ```
87
+
88
+ <div align="center"> <img src="./assets/img/line.png" alt="line" style="display: block; margin-top:20px;margin-bottom:20px;width:500px;"/> <br> </div>
89
+
90
+ - ### 3. With Validation
91
+
92
+ ```typescript
93
+ .command({
94
+ name : 'start',
95
+ options : [{
96
+ name : 'port',
97
+ flag : '-p',
98
+ type : 'number',
99
+ validate : (v) => v >= 1000 && v <= 9999 || 'Port must be 1000-9999'
100
+ }],
101
+ action : ({ options }) => { console.log(`Starting on port ${options.port}`); }
102
+ })
103
+ ```
104
+
105
+ ```bash
106
+ myapp start -p 3000 # ✓
107
+ myapp start -p 999 # ✗ validation error
108
+ ```
109
+
110
+ <br>
111
+
112
+ - ## Docs
113
+
114
+ - ### Commands
115
+
116
+ ```typescript
117
+ .command({
118
+ name : 'create',
119
+ aliases : ['c', 'new'], // short names
120
+ description : 'Create project', // shown in help
121
+ args : [...], // positional arguments
122
+ options : [...], // flags and options
123
+ allowDynamicArgs : true, // allow unknown arguments
124
+ allowDynamicOptions : true, // allow unknown options
125
+ action : (parsed) => { ... }, // command handler
126
+ examples : ['myapp create foo'] // usage examples
127
+ })
128
+ ```
129
+
130
+ <div align="center"> <img src="./assets/img/line.png" alt="line" style="display: block; margin-top:20px;margin-bottom:20px;width:500px;"/> <br> </div>
131
+
132
+ - ### Arguments
133
+
134
+ ```typescript
135
+ args: [
136
+ {
137
+ name : 'project',
138
+ required : true, // mandatory argument
139
+ description : 'Project name',
140
+ default : 'myapp', // fallback value
141
+ validate : (v) => v.length > 0 || 'Name required'
142
+ }
143
+ ]
144
+ ```
145
+
146
+ <div align="center"> <img src="./assets/img/line.png" alt="line" style="display: block; margin-top:20px;margin-bottom:20px;width:500px;"/> <br> </div>
147
+
148
+ - ### Options
149
+
150
+ ```typescript
151
+ options: [
152
+ {
153
+ name : 'type',
154
+ flag : '-t', // short form
155
+ aliases : ['--type'], // long form
156
+ type : 'string', // string | number | boolean
157
+ required : true,
158
+ default : 'npm',
159
+ validate: (v) => ['npm','yarn'].includes(v) || 'Invalid type'
160
+ }
161
+ ]
162
+ ```
163
+
164
+ <div align="center"> <img src="./assets/img/line.png" alt="line" style="display: block; margin-top:20px;margin-bottom:20px;width:500px;"/> <br> </div>
165
+
166
+ - ### Dynamic Arguments & Options
167
+
168
+ > Enable `allowDynamicArgs` and `allowDynamicOptions` to handle unknown arguments and options.
169
+ >
170
+ > Perfect for commands like `exec` that need to pass through arbitrary arguments.
171
+
172
+ ```typescript
173
+ cli('docker', '1.0.0')
174
+ .command({
175
+ name : 'run',
176
+ args : [{ name: 'image', required: true }],
177
+ options : [
178
+ { name: 'detach', flag: '-d', type: 'boolean' },
179
+ { name: 'name', flag: '--name', type: 'string' }
180
+ ],
181
+ allowDynamicArgs : true, // capture unknown positional args
182
+ allowDynamicOptions : true, // capture unknown flags
183
+ action : ({ args, options, dynamicArgs, dynamicOptions }) => {
184
+ console.log('Image:', args.image);
185
+ console.log('Known options:', options);
186
+ console.log('Extra args:', dynamicArgs); // ['npm', 'start']
187
+ console.log('Extra options:', dynamicOptions); # { p: '3000:3000', e: 'NODE_ENV=prod' }
188
+ }
189
+ })
190
+ .build()
191
+ .run();
192
+ ```
193
+
194
+ ```bash
195
+ # All unknown args/options are captured
196
+ docker run -d --name myapp node:18 -p 3000:3000 -e NODE_ENV=prod npm start
197
+
198
+ # Result:
199
+ # args.image = 'node:18'
200
+ # options.detach = true
201
+ # options.name = 'myapp'
202
+ # dynamicArgs = ['npm', 'start']
203
+ # dynamicOptions = { p: '3000:3000', e: 'NODE_ENV=prod' }
204
+ ```
205
+
206
+ #### Use Cases
207
+
208
+ - **Command execution**: `npm exec`, `docker run`, `kubectl exec`
209
+
210
+ - **Proxy commands**: Pass arguments to underlying tools
211
+
212
+ - **Flexible APIs**: Accept user-defined flags without pre-definition
213
+
214
+ ```typescript
215
+ // Example: npm-like exec command
216
+ .command({
217
+ name : 'exec',
218
+ args : [{ name: 'package', required: true }],
219
+ allowDynamicArgs : true,
220
+ allowDynamicOptions : true,
221
+ action : ({ args, dynamicArgs, dynamicOptions }) => {
222
+ // Run package with all extra args/options
223
+ runPackage(args.package, dynamicArgs, dynamicOptions);
224
+ }
225
+ })
226
+ ```
227
+
228
+ ```bash
229
+ myapp exec vite --port 3000 --host build --minify
230
+ // args.package = 'vite'
231
+ // dynamicArgs = ['build', '--minify']
232
+ // dynamicOptions = { port: '3000', host: true }
233
+ ```
234
+
235
+ <div align="center"> <img src="./assets/img/line.png" alt="line" style="display: block; margin-top:20px;margin-bottom:20px;width:500px;"/> <br> </div>
236
+
237
+ - ### Built-in Flags
238
+
239
+ ```bash
240
+ myapp --help # show all commands
241
+ myapp create --help # show command help
242
+ myapp --version # show version
243
+ ```
244
+
245
+ - ### Validation
246
+
247
+ ```typescript
248
+ // Argument validation
249
+ args: [{
250
+ name : 'port',
251
+ validate : (v) => Number(v) > 0 || 'Port must be positive'
252
+ }]
253
+
254
+ // Option validation
255
+ options: [{
256
+ name : 'env',
257
+ flag : '--env',
258
+ validate : (v) => ['dev','prod'].includes(v) || 'Invalid env'
259
+ }]
260
+ ```
261
+
262
+ <div align="center"> <img src="./assets/img/line.png" alt="line" style="display: block; margin-top:20px;margin-bottom:20px;width:500px;"/> <br> </div>
263
+
264
+ - ### Type Conversion
265
+
266
+ ```typescript
267
+ options: [
268
+ { name: 'port', flag: '-p', type: 'number' }, // "3000" → 3000
269
+ { name: 'verbose', flag: '-v', type: 'boolean' }, # flag → true
270
+ { name: 'name', flag: '-n', type: 'string' } // default
271
+ ]
272
+ ```
273
+
274
+ <div align="center"> <img src="./assets/img/line.png" alt="line" style="display: block; margin-top:20px;margin-bottom:20px;width:500px;"/> <br> </div>
275
+
276
+ - ### Multiple Commands
277
+
278
+ ```typescript
279
+ cli('myapp', '1.0.0')
280
+ .command({
281
+ name : 'create',
282
+ action : () => { /* ... */ }
283
+ })
284
+ .command({
285
+ name : 'delete',
286
+ action : () => { /* ... */ }
287
+ })
288
+ .build()
289
+ .run();
290
+ ```
291
+
292
+ ```bash
293
+ myapp create
294
+ myapp delete
295
+ ```
296
+
297
+ <div align="center"> <img src="./assets/img/line.png" alt="line" style="display: block; margin-top:20px;margin-bottom:20px;width:500px;"/> <br> </div>
298
+
299
+ - ### Aliases
300
+
301
+ ```typescript
302
+ // Command aliases
303
+ .command({
304
+ name : 'create',
305
+ aliases : ['c', 'new', 'init']
306
+ })
307
+
308
+ // Option aliases
309
+ options: [{
310
+ name : 'force',
311
+ flag : '-f',
312
+ aliases : ['--force', '--overwrite']
313
+ }]
314
+ ```
315
+
316
+ ```bash
317
+ myapp create # full name
318
+ myapp c # alias
319
+ myapp new # alias
320
+
321
+ myapp create -f # short flag
322
+ myapp create --force # long flag
323
+ ```
324
+
325
+ <div align="center"> <img src="./assets/img/line.png" alt="line" style="display: block; margin-top:20px;margin-bottom:20px;width:500px;"/> <br> </div>
326
+
327
+ - ### Error Handling
328
+
329
+ ```typescript
330
+ import { CLIError, ValidationError, CommandNotFoundError } from '@minejs/cli';
331
+
332
+ .command({
333
+ name: 'deploy',
334
+ action: async () => {
335
+ throw new CLIError('Deployment failed', 'DEPLOY_ERROR');
336
+ }
337
+ })
338
+ ```
339
+
340
+ <br>
341
+
342
+ <!-- ╚═════════════════════════════════════════════════════════════════╝ -->
343
+
344
+
345
+
346
+ <!-- ╔══════════════════════════════ END ══════════════════════════════╗ -->
347
+
348
+ <br>
349
+
350
+ ---
351
+
352
+ <div align="center">
353
+ <a href="https://github.com/maysara-elshewehy"><img src="https://img.shields.io/badge/by-Maysara-black"/></a>
354
+ </div>
355
+
356
+ <!-- ╚═════════════════════════════════════════════════════════════════╝ -->
package/dist/main.cjs ADDED
@@ -0,0 +1,2 @@
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
2
+ //# sourceMappingURL=main.cjs.map
@@ -0,0 +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// ╚══════════════════════════════════════════════════════════════════════════════════════╝"]}
@@ -0,0 +1,113 @@
1
+ // src/core/types.d.ts
2
+ //
3
+ // Made with ❤️ by Maysara.
4
+
5
+
6
+
7
+ // ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗
8
+
9
+ interface CommandConfig<T = ParsedCommand> {
10
+ name : string;
11
+ aliases? : string[];
12
+ description? : string;
13
+ args? : ArgumentConfig[];
14
+ options? : OptionConfig[];
15
+ action? : (parsed: T) => void | Promise<void>;
16
+ examples? : string[];
17
+
18
+ allowDynamicArgs? : boolean;
19
+ allowDynamicOptions? : boolean;
20
+ }
21
+
22
+ interface ArgumentConfig {
23
+ name : string;
24
+ description? : string;
25
+ required? : boolean;
26
+ validate? : (value: string) => boolean | string;
27
+ default? : string;
28
+ }
29
+
30
+ interface OptionConfig {
31
+ name : string;
32
+ flag : string;
33
+ aliases? : string[];
34
+ description? : string;
35
+ type? : 'boolean' | 'string' | 'number';
36
+ default? : string | boolean | number;
37
+ required? : boolean;
38
+ validate? : (value: string | boolean | number) => boolean | string;
39
+ }
40
+
41
+ interface CLIConfig {
42
+ name : string;
43
+ version : string;
44
+ description? : string;
45
+ commands? : CommandConfig[];
46
+ globalOptions? : OptionConfig[];
47
+ }
48
+
49
+ interface ParsedCommand {
50
+ args : Record<string, string>;
51
+ options : Record<string, string | boolean | number>;
52
+
53
+ dynamicArgs? : string[];
54
+ dynamicOptions? : Record<string, string | boolean>;
55
+ }
56
+
57
+ // ╚══════════════════════════════════════════════════════════════════════════════════════╝
58
+
59
+
60
+
61
+ // ╔═══════════════════════════════════════ ERRORS ═══════════════════════════════════════╗
62
+
63
+ declare class CLIError extends Error {
64
+ constructor(message: string, public code: string = 'CLI_ERROR') {
65
+ super(message);
66
+ this.name = 'CLIError';
67
+ Error.captureStackTrace?.(this, CLIError);
68
+ }
69
+ }
70
+
71
+ declare class ValidationError extends CLIError {
72
+ constructor(message: string) {
73
+ super(message, 'VALIDATION_ERROR');
74
+ this.name = 'ValidationError';
75
+ }
76
+ }
77
+
78
+ declare class CommandNotFoundError extends CLIError {
79
+ constructor(command: string) {
80
+ super(`Command '${command}' not found`, 'COMMAND_NOT_FOUND');
81
+ this.name = 'CommandNotFoundError';
82
+ }
83
+ }
84
+
85
+ declare class CLI {
86
+ config: CLIConfig;
87
+ private commands;
88
+ private globalOptions;
89
+ private parser;
90
+ constructor(config: CLIConfig);
91
+ run(argv?: string[]): Promise<void>;
92
+ private initializeCommands;
93
+ private initializeGlobalOptions;
94
+ private reparseForDynamicArgs;
95
+ private parseCommand;
96
+ private getOptionValue;
97
+ private convertOptionType;
98
+ private showHelp;
99
+ private showCommandHelp;
100
+ private handleError;
101
+ }
102
+
103
+ declare class Builder {
104
+ private config;
105
+ constructor(name: string, version: string);
106
+ description(desc: string): this;
107
+ command(config: CommandConfig): this;
108
+ globalOption(option: OptionConfig): this;
109
+ build(): CLI;
110
+ }
111
+ declare function cli(name: string, version: string): Builder;
112
+
113
+ export { type ArgumentConfig, Builder, CLI, type CLIConfig, CLIError, type CommandConfig, CommandNotFoundError, type OptionConfig, type ParsedCommand, ValidationError, cli, cli as default };
package/dist/main.d.ts ADDED
@@ -0,0 +1,113 @@
1
+ // src/core/types.d.ts
2
+ //
3
+ // Made with ❤️ by Maysara.
4
+
5
+
6
+
7
+ // ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗
8
+
9
+ interface CommandConfig<T = ParsedCommand> {
10
+ name : string;
11
+ aliases? : string[];
12
+ description? : string;
13
+ args? : ArgumentConfig[];
14
+ options? : OptionConfig[];
15
+ action? : (parsed: T) => void | Promise<void>;
16
+ examples? : string[];
17
+
18
+ allowDynamicArgs? : boolean;
19
+ allowDynamicOptions? : boolean;
20
+ }
21
+
22
+ interface ArgumentConfig {
23
+ name : string;
24
+ description? : string;
25
+ required? : boolean;
26
+ validate? : (value: string) => boolean | string;
27
+ default? : string;
28
+ }
29
+
30
+ interface OptionConfig {
31
+ name : string;
32
+ flag : string;
33
+ aliases? : string[];
34
+ description? : string;
35
+ type? : 'boolean' | 'string' | 'number';
36
+ default? : string | boolean | number;
37
+ required? : boolean;
38
+ validate? : (value: string | boolean | number) => boolean | string;
39
+ }
40
+
41
+ interface CLIConfig {
42
+ name : string;
43
+ version : string;
44
+ description? : string;
45
+ commands? : CommandConfig[];
46
+ globalOptions? : OptionConfig[];
47
+ }
48
+
49
+ interface ParsedCommand {
50
+ args : Record<string, string>;
51
+ options : Record<string, string | boolean | number>;
52
+
53
+ dynamicArgs? : string[];
54
+ dynamicOptions? : Record<string, string | boolean>;
55
+ }
56
+
57
+ // ╚══════════════════════════════════════════════════════════════════════════════════════╝
58
+
59
+
60
+
61
+ // ╔═══════════════════════════════════════ ERRORS ═══════════════════════════════════════╗
62
+
63
+ declare class CLIError extends Error {
64
+ constructor(message: string, public code: string = 'CLI_ERROR') {
65
+ super(message);
66
+ this.name = 'CLIError';
67
+ Error.captureStackTrace?.(this, CLIError);
68
+ }
69
+ }
70
+
71
+ declare class ValidationError extends CLIError {
72
+ constructor(message: string) {
73
+ super(message, 'VALIDATION_ERROR');
74
+ this.name = 'ValidationError';
75
+ }
76
+ }
77
+
78
+ declare class CommandNotFoundError extends CLIError {
79
+ constructor(command: string) {
80
+ super(`Command '${command}' not found`, 'COMMAND_NOT_FOUND');
81
+ this.name = 'CommandNotFoundError';
82
+ }
83
+ }
84
+
85
+ declare class CLI {
86
+ config: CLIConfig;
87
+ private commands;
88
+ private globalOptions;
89
+ private parser;
90
+ constructor(config: CLIConfig);
91
+ run(argv?: string[]): Promise<void>;
92
+ private initializeCommands;
93
+ private initializeGlobalOptions;
94
+ private reparseForDynamicArgs;
95
+ private parseCommand;
96
+ private getOptionValue;
97
+ private convertOptionType;
98
+ private showHelp;
99
+ private showCommandHelp;
100
+ private handleError;
101
+ }
102
+
103
+ declare class Builder {
104
+ private config;
105
+ constructor(name: string, version: string);
106
+ description(desc: string): this;
107
+ command(config: CommandConfig): this;
108
+ globalOption(option: OptionConfig): this;
109
+ build(): CLI;
110
+ }
111
+ declare function cli(name: string, version: string): Builder;
112
+
113
+ export { type ArgumentConfig, Builder, CLI, type CLIConfig, CLIError, type CommandConfig, CommandNotFoundError, type OptionConfig, type ParsedCommand, ValidationError, cli, cli as default };
package/dist/main.js ADDED
@@ -0,0 +1,2 @@
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
2
+ //# sourceMappingURL=main.js.map
@@ -0,0 +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// ╚══════════════════════════════════════════════════════════════════════════════════════╝"]}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@minejs/cli",
3
+ "version": "0.0.1",
4
+ "description": "Zero-dependency CLI framework for fast, organized, and validated command-line applications.",
5
+ "keywords": ["minejs", "cli"],
6
+ "license": "MIT",
7
+ "homepage": "https://github.com/minejs-org/cli#readme",
8
+ "bugs": {
9
+ "url": "https://github.com/minejs-org/cli/issues"
10
+ },
11
+ "author": {
12
+ "name": "Maysara",
13
+ "email": "maysara.elshewehy@gmail.com",
14
+ "url": "https://github.com/maysara-elshewehy"
15
+ },
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/minejs-org/cli.git"
19
+ },
20
+ "type": "module",
21
+ "main": "./dist/main.js",
22
+ "types": "./dist/main.d.ts",
23
+ "files": ["dist"],
24
+ "exports": {
25
+ ".": {
26
+ "types": "./dist/main.d.ts",
27
+ "import": "./dist/main.js",
28
+ "require": "./dist/main.js"
29
+ }
30
+ },
31
+ "scripts": {
32
+ "build": "tsup",
33
+ "lint": "eslint src --ext .ts",
34
+ "test": "bun test"
35
+ },
36
+ "engines": {
37
+ "bun": ">=1.3.3"
38
+ },
39
+ "peerDependencies": {
40
+ "bun": "^1.3.3"
41
+ },
42
+ "devDependencies": {
43
+ "@eslint/js": "^9.39.2",
44
+ "@stylistic/eslint-plugin": "^5.6.1",
45
+ "@types/bun": "^1.3.5",
46
+ "@types/node": "^20.19.27",
47
+ "bun-plugin-dts": "^0.3.0",
48
+ "bun-types": "^1.3.5",
49
+ "ts-node": "^10.9.2",
50
+ "tsup": "^8.5.1",
51
+ "typescript": "^5.9.3",
52
+ "typescript-eslint": "^8.51.0"
53
+ }
54
+ }