cleye 1.3.4 → 2.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/README.md CHANGED
@@ -274,7 +274,7 @@ const possibleSizes = ['small', 'medium', 'large'] as const
274
274
  type Sizes = typeof possibleSizes[number] // => "small" | "medium" | "large"
275
275
 
276
276
  // Custom type function
277
- function Size(size: Sizes) {
277
+ const Size = (size: Sizes) => {
278
278
  if (!possibleSizes.includes(size)) {
279
279
  throw new Error(`Invalid size: "${size}"`)
280
280
  }
@@ -556,7 +556,7 @@ Type:
556
556
  type IgnoreArgvCallback = (
557
557
  type: 'known-flag' | 'unknown-flag' | 'argument',
558
558
  flagOrArgv: string,
559
- value: string | undefined,
559
+ value: string | undefined
560
560
  ) => boolean | void
561
561
  ```
562
562
 
package/dist/index.cjs ADDED
@@ -0,0 +1,10 @@
1
+ "use strict";var B=Object.defineProperty;var s=(t,e)=>B(t,"name",{value:e,configurable:!0});var P=require("type-flag"),S=require("tty"),x=require("terminal-columns");const I=s(t=>t.replaceAll(/[\W_]([a-z\d])?/gi,(e,r)=>r?r.toUpperCase():""),"camelCase"),R=s(t=>t.replaceAll(/\B([A-Z])/g,"-$1").toLowerCase(),"kebabCase"),D={"> 80":[{width:"content-width",paddingLeft:2,paddingRight:8},{width:"auto"}],"> 40":[{width:"auto",paddingLeft:2,paddingRight:8,preprocess:s(t=>t.trim(),"preprocess")},{width:"100%",paddingLeft:2,paddingBottom:1}],"> 0":{stdoutColumns:1e3,columns:[{width:"content-width",paddingLeft:2,paddingRight:8},{width:"content-width"}]}};function L(t){let e=!1;return{type:"table",data:{tableData:Object.keys(t).sort((a,i)=>a.localeCompare(i)).map(a=>{const i=t[a],l="alias"in i;return l&&(e=!0),{name:a,flag:i,flagFormatted:`--${R(a)}`,aliasesEnabled:e,aliasFormatted:l?`-${i.alias}`:void 0}}).map(a=>(a.aliasesEnabled=e,[{type:"flagName",data:a},{type:"flagDescription",data:a}])),tableBreakpoints:D}}}s(L,"renderFlags");const O=s(t=>!t||(t.version??(t.help?t.help.version:void 0)),"getVersion"),j=s(t=>{const e="parent"in t&&t.parent?.name;return(e?`${e} `:"")+t.name},"getName");function T(t){const e=[];t.name&&e.push(j(t));const r=O(t)??("parent"in t&&O(t.parent));if(r&&e.push(`v${r}`),e.length!==0)return{id:"name",type:"text",data:`${e.join(" ")}
2
+ `}}s(T,"getNameAndVersion");function k(t){const{help:e}=t;if(!(!e||!e.description))return{id:"description",type:"text",data:`${e.description}
3
+ `}}s(k,"getDescription");function F(t){const e=t.help||{};if("usage"in e)return e.usage?{id:"usage",type:"section",data:{title:"Usage:",body:Array.isArray(e.usage)?e.usage.join(`
4
+ `):e.usage}}:void 0;if(t.name){const r=[],n=[j(t)];if(t.flags&&Object.keys(t.flags).length>0&&n.push("[flags...]"),t.parameters&&t.parameters.length>0){const{parameters:a}=t,i=a.indexOf("--"),l=i!==-1&&a.slice(i+1).some(o=>o.startsWith("<"));n.push(a.map(o=>o!=="--"?o:l?"--":"[--]").join(" "))}if(n.length>1&&r.push(n.join(" ")),"commands"in t&&t.commands?.length&&r.push(`${t.name} <command>`),r.length>0)return{id:"usage",type:"section",data:{title:"Usage:",body:r.join(`
5
+ `)}}}}s(F,"getUsage");function _(t){return!("commands"in t)||!t.commands?.length?void 0:{id:"commands",type:"section",data:{title:"Commands:",body:{type:"table",data:{tableData:t.commands.map(n=>[n.options.name,n.options.help?n.options.help.description:""]),tableOptions:[{width:"content-width",paddingLeft:2,paddingRight:8}]}},indentBody:0}}}s(_,"getCommands");function H(t){if(!(!t.flags||Object.keys(t.flags).length===0))return{id:"flags",type:"section",data:{title:"Flags:",body:L(t.flags),indentBody:0}}}s(H,"getFlags");function U(t){const{help:e}=t;if(!e||!e.examples||e.examples.length===0)return;let{examples:r}=e;if(Array.isArray(r)&&(r=r.join(`
6
+ `)),r)return{id:"examples",type:"section",data:{title:"Examples:",body:r}}}s(U,"getExamples");function V(t){if(!("alias"in t)||!t.alias)return;const{alias:e}=t;return{id:"aliases",type:"section",data:{title:"Aliases:",body:Array.isArray(e)?e.join(", "):e}}}s(V,"getAliases");const J=s(t=>[T,k,F,_,H,U,V].map(e=>e(t)).filter(Boolean),"generateHelp"),M=S.WriteStream.prototype.hasColors();class W{static{s(this,"Renderers")}text(e){return e}bold(e){return M?`\x1B[1m${e}\x1B[22m`:e.toLocaleUpperCase()}indentText({text:e,spaces:r}){return e.replaceAll(/^/gm," ".repeat(r))}heading(e){return this.bold(e)}section({title:e,body:r,indentBody:n=2}){return`${(e?`${this.heading(e)}
7
+ `:"")+(r?this.indentText({text:this.render(r),spaces:n}):"")}
8
+ `}table({tableData:e,tableOptions:r,tableBreakpoints:n}){return x.terminalColumns(e.map(a=>a.map(i=>this.render(i))),n?x.breakpoints(n):r)}flagParameter(e){return e===Boolean?"":e===String?"<string>":e===Number?"<number>":Array.isArray(e)?this.flagParameter(e[0]):"<value>"}flagOperator(e){return" "}flagName(e){const{flag:r,flagFormatted:n,aliasesEnabled:a,aliasFormatted:i}=e;let l="";if(i?l+=`${i}, `:a&&(l+=" "),l+=n,"placeholder"in r&&typeof r.placeholder=="string")l+=`${this.flagOperator(e)}${r.placeholder}`;else{const o=this.flagParameter("type"in r?r.type:r);o&&(l+=`${this.flagOperator(e)}${o}`)}return l}flagDefault(e){return JSON.stringify(e)}flagDescription({flag:e}){let r="description"in e?e.description??"":"";if("default"in e){let{default:n}=e;typeof n=="function"&&(n=n()),n&&(r+=` (default: ${this.flagDefault(n)})`)}return r}render(e){if(typeof e=="string")return e;if(Array.isArray(e))return e.map(r=>this.render(r)).join(`
9
+ `);if("type"in e&&this[e.type]){const r=this[e.type];if(typeof r=="function")return r.call(this,e.data)}throw new Error(`Invalid node type: ${JSON.stringify(e)}`)}}const w=s(t=>t.length>0&&!t.includes(" "),"isValidScriptName"),{stringify:f}=JSON,z=/[|\\{}()[\]^$+*?.]/;function b(t){const e=[];let r,n;for(const a of t){if(n)throw new Error(`Invalid parameter: Spread parameter ${f(n)} must be last`);const i=a[0],l=a.at(-1);let o;if(i==="<"&&l===">"&&(o=!0,r))throw new Error(`Invalid parameter: Required parameter ${f(a)} cannot come after optional parameter ${f(r)}`);if(i==="["&&l==="]"&&(o=!1,r=a),o===void 0)throw new Error(`Invalid parameter: ${f(a)}. Must be wrapped in <> (required parameter) or [] (optional parameter)`);let c=a.slice(1,-1);const m=c.slice(-3)==="...";m&&(n=a,c=c.slice(0,-3));const p=c.match(z);if(p)throw new Error(`Invalid parameter: ${f(a)}. Invalid character found ${f(p[0])}`);e.push({name:c,required:o,spread:m})}return e}s(b,"parseParameters");function v(t,e,r,n){for(let a=0;a<e.length;a+=1){const{name:i,required:l,spread:o}=e[a],c=I(i);if(c in t)throw new Error(`Invalid parameter: ${f(i)} is used more than once.`);const m=o?r.slice(a):r[a];if(o&&(a=e.length),l&&(!m||o&&m.length===0))return console.error(`Error: Missing required parameter ${f(i)}
10
+ `),n(),process.exit(1);t[c]=m}}s(v,"mapParametersToArguments");function Z(t){return t===void 0||t!==!1}s(Z,"helpEnabled");function q(t,e,r,n){const a={...e.flags},i=e.version&&!("version"in a);i&&(a.version={type:Boolean,description:"Show version"});const{help:l}=e,o=Z(l);o&&!("help"in a)&&(a.help={type:Boolean,alias:"h",description:"Show help"});const c=P.typeFlag(a,n,{ignore:e.ignoreArgv}),m=s(()=>{console.log(e.version)},"showVersion");if(i&&c.flags.version===!0)return m(),process.exit(0);const p=new W,N=o&&l?.render?l.render:d=>p.render(d),h=s(d=>{const u=J({...e,...d?{help:d}:{},flags:a});console.log(N(u,p))},"showHelp");if(o&&c.flags.help===!0)return h(),process.exit(0);if(e.parameters){let{parameters:d}=e,u=c._;const y=d.indexOf("--"),E=d.slice(y+1),g=Object.create(null);if(y>-1&&E.length>0){d=d.slice(0,y);const C=c._["--"];u=u.slice(0,-C.length||void 0),v(g,b(d),u,h),v(g,b(E),C,h)}else v(g,b(d),u,h);Object.assign(c._,g)}const $={...c,showVersion:m,showHelp:h},A={command:t,...$};if(typeof r=="function"){const d=r($);if(d&&"then"in d)return Object.assign(Promise.resolve(d),A)}return A}s(q,"cliBase");function G(t,e){const r=new Map;for(const n of e){const a=[n.options.name],{alias:i}=n.options;i&&(Array.isArray(i)?a.push(...i):a.push(i));for(const l of a){if(r.has(l))throw new Error(`Duplicate command name found: ${f(l)}`);r.set(l,n)}}return r.get(t)}s(G,"getCommand");function K(t,e,r=process.argv.slice(2)){if(!t)throw new Error("Options is required");if("name"in t&&(!t.name||!w(t.name)))throw new Error(`Invalid script name: ${f(t.name)}`);const n=r[0];if(t.commands&&n&&w(n)){const a=G(n,t.commands);if(a)return q(a.options.name,{...a.options,parent:t},a.callback,r.slice(1))}return q(void 0,t,e,r)}s(K,"cli");function Q(t,e){if(!t)throw new Error("Command options are required");const{name:r}=t;if(r===void 0)throw new Error("Command name is required");if(!w(r))throw new Error(`Invalid command name ${JSON.stringify(r)}. Command names must be one word.`);return{options:t,callback:e}}s(Q,"command"),exports.cli=K,exports.command=Q;
@@ -98,7 +98,7 @@ type Flags = Flags$1<{
98
98
  }>;
99
99
  type CallbackFunction<Parsed> = (parsed: {
100
100
  [Key in keyof Parsed]: Parsed[Key];
101
- }) => void;
101
+ }) => void | Promise<void>;
102
102
  type HasVersion<Options extends {
103
103
  flags?: Flags;
104
104
  }> = (Options extends {
@@ -184,10 +184,8 @@ type AlphaNumeric = AlphabetLowercase | Uppercase<AlphabetLowercase> | Numeric;
184
184
  type CamelCase<Word extends string> = (Word extends `${infer FirstCharacter}${infer Rest}` ? (FirstCharacter extends AlphaNumeric ? `${FirstCharacter}${CamelCase<Rest>}` : Capitalize<CamelCase<Rest>>) : Word);
185
185
  type StripBrackets<Parameter extends string> = (Parameter extends `<${infer ParameterName}>` | `[${infer ParameterName}]` ? (ParameterName extends `${infer SpreadName}...` ? SpreadName : ParameterName) : never);
186
186
  type ParameterType<Parameter extends string> = (Parameter extends `<${infer _ParameterName}...>` | `[${infer _ParameterName}...]` ? string[] : Parameter extends `<${infer _ParameterName}>` ? string : Parameter extends `[${infer _ParameterName}]` ? string | undefined : never);
187
- type WithCommand<Options extends {
188
- flags?: Flags;
189
- }, Command extends string | undefined = undefined> = {
190
- command: Command;
187
+ type WithCommand<Options extends TypeFlag, CommandName extends string | undefined = undefined> = {
188
+ command: CommandName;
191
189
  } & Options;
192
190
  type TypeFlagWrapper<Options extends {
193
191
  flags?: Flags;
@@ -200,17 +198,18 @@ type TypeFlagWrapper<Options extends {
200
198
  };
201
199
  type ParseArgv<Options extends {
202
200
  flags?: Flags;
203
- }, Parameters extends string[], Command extends string | undefined = ''> = (Command extends '' ? TypeFlagWrapper<Options, Parameters> : WithCommand<TypeFlagWrapper<Options, Parameters>, Command>);
201
+ }, Parameters extends string[], CommandName extends string | undefined = ''> = (CommandName extends '' ? TypeFlagWrapper<Options, Parameters> : WithCommand<TypeFlagWrapper<Options, Parameters>, CommandName>);
204
202
 
205
- declare function cli<Options extends CliOptions<undefined, [...Parameters]>, Parameters extends string[]>(options: Options & CliOptions<undefined, [...Parameters]>, callback?: CallbackFunction<ParseArgv<Options, Parameters>>, argv?: string[]): {
203
+ declare function cli<Options extends CliOptions<undefined, [...Parameters]>, Parameters extends string[]>(options: Options & CliOptions<undefined, [...Parameters]>, callback?: CallbackFunction<ParseArgv<Options, Parameters>>, argv?: string[]): ({
206
204
  [Key in keyof ParseArgv<Options, Parameters, undefined>]: ParseArgv<Options, Parameters, undefined>[Key];
207
- };
208
- declare function cli<Options extends CliOptions<[...Commands], [...Parameters]>, Commands extends Command[], Parameters extends string[]>(options: Options & CliOptions<[...Commands], [...Parameters]>, callback?: CallbackFunction<ParseArgv<Options, Parameters>>, argv?: string[]): ({
205
+ } & Promise<void>);
206
+ declare function cli<Options extends CliOptions<[...Commands], [...Parameters]>, Commands extends Command[], Parameters extends string[]>(options: Options & CliOptions<[...Commands], [...Parameters]>, callback?: CallbackFunction<ParseArgv<Options, Parameters>>, argv?: string[]): (({
209
207
  [Key in keyof ParseArgv<Options, Parameters, undefined>]: ParseArgv<Options, Parameters, undefined>[Key];
210
208
  } | {
211
209
  [KeyA in keyof Commands]: (Commands[KeyA] extends Command ? ({
212
210
  [KeyB in keyof Commands[KeyA][typeof parsedType]]: Commands[KeyA][typeof parsedType][KeyB];
213
211
  }) : never);
214
- }[number]);
212
+ }[number]) & Promise<void>);
215
213
 
216
- export { Command, Renderers, cli, command };
214
+ export { Renderers, cli, command };
215
+ export type { Command };
@@ -0,0 +1,215 @@
1
+ import { TypeFlagOptions, Flags as Flags$1, TypeFlag } from 'type-flag';
2
+ import { Options } from 'terminal-columns';
3
+
4
+ type CommandOptions<Parameters = string[]> = {
5
+ /**
6
+ Name of the command used to invoke it. Also displayed in `--help` output.
7
+ */
8
+ name: string;
9
+ /**
10
+ Aliases for the command used to invoke it. Also displayed in `--help` output.
11
+ */
12
+ alias?: string | string[];
13
+ /**
14
+ Parameters accepted by the command. Parameters must be in the following formats:
15
+
16
+ - Required parameter: `<parameter name>`
17
+ - Optional parameter: `[parameter name]`
18
+ - Required spread parameter: `<parameter name...>`
19
+ - Optional spread parameter: `[parameter name...]`
20
+ */
21
+ parameters?: Parameters;
22
+ /**
23
+ Flags accepted by the command
24
+ */
25
+ flags?: Flags;
26
+ /**
27
+ Options to configure the help documentation. Pass in `false` to disable handling `--help, -h`.
28
+ */
29
+ help?: false | HelpOptions;
30
+ /**
31
+ * Which argv elements to ignore from parsing
32
+ */
33
+ ignoreArgv?: TypeFlagOptions['ignore'];
34
+ };
35
+ declare function command<Options extends CommandOptions<[...Parameters]>, Parameters extends string[]>(options: Readonly<Options> & CommandOptions<[...Parameters]>, callback?: CallbackFunction<ParseArgv<Options, Parameters>>): Command<Options, ParseArgv<Options, Parameters, Options['name']>>;
36
+ type Command<Options extends CommandOptions = CommandOptions, ParsedType = any> = {
37
+ readonly options: Options;
38
+ readonly callback?: CallbackFunction<any>;
39
+ [parsedType]: ParsedType;
40
+ };
41
+
42
+ type FlagData = {
43
+ name: string;
44
+ flag: Flags[string];
45
+ flagFormatted: string;
46
+ aliasesEnabled: boolean;
47
+ aliasFormatted: string | undefined;
48
+ };
49
+
50
+ type TypeFunction = (value: any) => any;
51
+ type HelpDocumentNodeOrString<Type extends PropertyKey> = string | HelpDocumentNode<Type>;
52
+ declare class Renderers {
53
+ text(text: string): string;
54
+ bold(text: string): string;
55
+ indentText({ text, spaces }: {
56
+ text: string;
57
+ spaces: number;
58
+ }): string;
59
+ heading(text: string): string;
60
+ section({ title, body, indentBody, }: {
61
+ title?: string;
62
+ body?: string;
63
+ indentBody?: number;
64
+ }): string;
65
+ table({ tableData, tableOptions, tableBreakpoints, }: {
66
+ tableData: string[][];
67
+ tableOptions?: Options;
68
+ tableBreakpoints?: Record<string, Options>;
69
+ }): string;
70
+ flagParameter(typeFunction: TypeFunction | readonly [TypeFunction]): string;
71
+ flagOperator(_: FlagData): string;
72
+ flagName(flagData: FlagData): string;
73
+ flagDefault(value: any): string;
74
+ flagDescription({ flag }: FlagData): string;
75
+ render(nodes: (HelpDocumentNodeOrString<keyof this> | HelpDocumentNodeOrString<keyof this>[])): string;
76
+ }
77
+
78
+ declare const parsedType: unique symbol;
79
+ type Flags = Flags$1<{
80
+ /**
81
+ Description to be used in help output
82
+
83
+ @example
84
+ ```
85
+ description: 'Unit of output (metric, imperial)',
86
+ ```
87
+ */
88
+ description?: string;
89
+ /**
90
+ Placeholder label to be used in help output
91
+
92
+ @example Required value
93
+ ```
94
+ placeholder: '<locale>'
95
+ ```
96
+ */
97
+ placeholder?: string;
98
+ }>;
99
+ type CallbackFunction<Parsed> = (parsed: {
100
+ [Key in keyof Parsed]: Parsed[Key];
101
+ }) => void | Promise<void>;
102
+ type HasVersion<Options extends {
103
+ flags?: Flags;
104
+ }> = (Options extends {
105
+ version: string;
106
+ } ? Options['flags'] & {
107
+ version: BooleanConstructor;
108
+ } : Options['flags']);
109
+ type HasHelp<Options extends {
110
+ flags?: Flags;
111
+ }> = (Options extends {
112
+ help: false;
113
+ } ? Options['flags'] : Options['flags'] & {
114
+ help: BooleanConstructor;
115
+ });
116
+ type HasHelpOrVersion<Options extends {
117
+ flags?: Flags;
118
+ }> = (HasVersion<Options> & HasHelp<Options>);
119
+ type HelpDocumentNode<Types extends PropertyKey = keyof Renderers> = {
120
+ id?: string;
121
+ type: Types;
122
+ data: any;
123
+ };
124
+ type HelpOptions = {
125
+ /**
126
+ Version of the script displayed in `--help` output. Use to avoid enabling `--version` flag.
127
+ */
128
+ version?: string;
129
+ /**
130
+ Description of the script or command to display in `--help` output.
131
+ */
132
+ description?: string;
133
+ /**
134
+ Usage code examples to display in `--help` output.
135
+ */
136
+ usage?: false | string | string[];
137
+ /**
138
+ Example code snippets to display in `--help` output.
139
+ */
140
+ examples?: string | string[];
141
+ /**
142
+ Function to customize the help document before it is logged.
143
+ */
144
+ render?: (nodes: HelpDocumentNode<keyof Renderers>[], renderers: Renderers) => string;
145
+ };
146
+ type CliOptions<Commands = Command[], Parameters extends string[] = string[]> = {
147
+ /**
148
+ Name of the script displayed in `--help` output.
149
+ */
150
+ name?: string;
151
+ /**
152
+ Version of the script displayed in `--version` and `--help` outputs.
153
+ */
154
+ version?: string;
155
+ /**
156
+ Parameters accepted by the script. Parameters must be in the following formats:
157
+
158
+ - Required parameter: `<parameter name>`
159
+ - Optional parameter: `[parameter name]`
160
+ - Required spread parameter: `<parameter name...>`
161
+ - Optional spread parameter: `[parameter name...]`
162
+ */
163
+ parameters?: Parameters;
164
+ /**
165
+ Commands to register to the script.
166
+ */
167
+ commands?: Commands;
168
+ /**
169
+ Flags accepted by the script
170
+ */
171
+ flags?: Flags;
172
+ /**
173
+ Options to configure the help documentation. Pass in `false` to disable handling `--help, -h`.
174
+ */
175
+ help?: false | HelpOptions;
176
+ /**
177
+ * Which argv elements to ignore from parsing
178
+ */
179
+ ignoreArgv?: TypeFlagOptions['ignore'];
180
+ };
181
+ type AlphabetLowercase = 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z';
182
+ type Numeric = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9';
183
+ type AlphaNumeric = AlphabetLowercase | Uppercase<AlphabetLowercase> | Numeric;
184
+ type CamelCase<Word extends string> = (Word extends `${infer FirstCharacter}${infer Rest}` ? (FirstCharacter extends AlphaNumeric ? `${FirstCharacter}${CamelCase<Rest>}` : Capitalize<CamelCase<Rest>>) : Word);
185
+ type StripBrackets<Parameter extends string> = (Parameter extends `<${infer ParameterName}>` | `[${infer ParameterName}]` ? (ParameterName extends `${infer SpreadName}...` ? SpreadName : ParameterName) : never);
186
+ type ParameterType<Parameter extends string> = (Parameter extends `<${infer _ParameterName}...>` | `[${infer _ParameterName}...]` ? string[] : Parameter extends `<${infer _ParameterName}>` ? string : Parameter extends `[${infer _ParameterName}]` ? string | undefined : never);
187
+ type WithCommand<Options extends TypeFlag, CommandName extends string | undefined = undefined> = {
188
+ command: CommandName;
189
+ } & Options;
190
+ type TypeFlagWrapper<Options extends {
191
+ flags?: Flags;
192
+ }, Parameters extends string[]> = TypeFlag<HasHelpOrVersion<Options>> & {
193
+ _: {
194
+ [Parameter in Parameters[number] as CamelCase<StripBrackets<Parameter>>]: ParameterType<Parameter>;
195
+ };
196
+ showHelp: (options?: HelpOptions) => void;
197
+ showVersion: () => void;
198
+ };
199
+ type ParseArgv<Options extends {
200
+ flags?: Flags;
201
+ }, Parameters extends string[], CommandName extends string | undefined = ''> = (CommandName extends '' ? TypeFlagWrapper<Options, Parameters> : WithCommand<TypeFlagWrapper<Options, Parameters>, CommandName>);
202
+
203
+ declare function cli<Options extends CliOptions<undefined, [...Parameters]>, Parameters extends string[]>(options: Options & CliOptions<undefined, [...Parameters]>, callback?: CallbackFunction<ParseArgv<Options, Parameters>>, argv?: string[]): ({
204
+ [Key in keyof ParseArgv<Options, Parameters, undefined>]: ParseArgv<Options, Parameters, undefined>[Key];
205
+ } & Promise<void>);
206
+ declare function cli<Options extends CliOptions<[...Commands], [...Parameters]>, Commands extends Command[], Parameters extends string[]>(options: Options & CliOptions<[...Commands], [...Parameters]>, callback?: CallbackFunction<ParseArgv<Options, Parameters>>, argv?: string[]): (({
207
+ [Key in keyof ParseArgv<Options, Parameters, undefined>]: ParseArgv<Options, Parameters, undefined>[Key];
208
+ } | {
209
+ [KeyA in keyof Commands]: (Commands[KeyA] extends Command ? ({
210
+ [KeyB in keyof Commands[KeyA][typeof parsedType]]: Commands[KeyA][typeof parsedType][KeyB];
211
+ }) : never);
212
+ }[number]) & Promise<void>);
213
+
214
+ export { Renderers, cli, command };
215
+ export type { Command };
package/dist/index.mjs CHANGED
@@ -1,10 +1,10 @@
1
- import{typeFlag as j}from"type-flag";import N from"tty";import B,{breakpoints as S}from"terminal-columns";const P=t=>t.replace(/[\W_]([a-z\d])?/gi,(e,r)=>r?r.toUpperCase():""),q=t=>t.replace(/\B([A-Z])/g,"-$1").toLowerCase(),I={"> 80":[{width:"content-width",paddingLeft:2,paddingRight:8},{width:"auto"}],"> 40":[{width:"auto",paddingLeft:2,paddingRight:8,preprocess:t=>t.trim()},{width:"100%",paddingLeft:2,paddingBottom:1}],"> 0":{stdoutColumns:1e3,columns:[{width:"content-width",paddingLeft:2,paddingRight:8},{width:"content-width"}]}};function D(t){let e=!1;return{type:"table",data:{tableData:Object.keys(t).sort((a,i)=>a.localeCompare(i)).map(a=>{const i=t[a],s="alias"in i;return s&&(e=!0),{name:a,flag:i,flagFormatted:`--${q(a)}`,aliasesEnabled:e,aliasFormatted:s?`-${i.alias}`:void 0}}).map(a=>(a.aliasesEnabled=e,[{type:"flagName",data:a},{type:"flagDescription",data:a}])),tableBreakpoints:I}}}const A=t=>!t||(t.version??(t.help?t.help.version:void 0)),C=t=>{const e="parent"in t&&t.parent?.name;return(e?`${e} `:"")+t.name};function R(t){const e=[];t.name&&e.push(C(t));const r=A(t)??("parent"in t&&A(t.parent));if(r&&e.push(`v${r}`),e.length!==0)return{id:"name",type:"text",data:`${e.join(" ")}
2
- `}}function L(t){const{help:e}=t;if(!(!e||!e.description))return{id:"description",type:"text",data:`${e.description}
3
- `}}function T(t){const e=t.help||{};if("usage"in e)return e.usage?{id:"usage",type:"section",data:{title:"Usage:",body:Array.isArray(e.usage)?e.usage.join(`
4
- `):e.usage}}:void 0;if(t.name){const r=[],n=[C(t)];if(t.flags&&Object.keys(t.flags).length>0&&n.push("[flags...]"),t.parameters&&t.parameters.length>0){const{parameters:a}=t,i=a.indexOf("--"),s=i>-1&&a.slice(i+1).some(o=>o.startsWith("<"));n.push(a.map(o=>o!=="--"?o:s?"--":"[--]").join(" "))}if(n.length>1&&r.push(n.join(" ")),"commands"in t&&t.commands?.length&&r.push(`${t.name} <command>`),r.length>0)return{id:"usage",type:"section",data:{title:"Usage:",body:r.join(`
5
- `)}}}}function _(t){return!("commands"in t)||!t.commands?.length?void 0:{id:"commands",type:"section",data:{title:"Commands:",body:{type:"table",data:{tableData:t.commands.map(n=>[n.options.name,n.options.help?n.options.help.description:""]),tableOptions:[{width:"content-width",paddingLeft:2,paddingRight:8}]}},indentBody:0}}}function k(t){if(!(!t.flags||Object.keys(t.flags).length===0))return{id:"flags",type:"section",data:{title:"Flags:",body:D(t.flags),indentBody:0}}}function F(t){const{help:e}=t;if(!e||!e.examples||e.examples.length===0)return;let{examples:r}=e;if(Array.isArray(r)&&(r=r.join(`
6
- `)),r)return{id:"examples",type:"section",data:{title:"Examples:",body:r}}}function H(t){if(!("alias"in t)||!t.alias)return;const{alias:e}=t;return{id:"aliases",type:"section",data:{title:"Aliases:",body:Array.isArray(e)?e.join(", "):e}}}const U=t=>[R,L,T,_,k,F,H].map(e=>e(t)).filter(Boolean),V=N.WriteStream.prototype.hasColors();class J{text(e){return e}bold(e){return V?`\x1B[1m${e}\x1B[22m`:e.toLocaleUpperCase()}indentText({text:e,spaces:r}){return e.replace(/^/gm," ".repeat(r))}heading(e){return this.bold(e)}section({title:e,body:r,indentBody:n=2}){return`${(e?`${this.heading(e)}
1
+ var B=Object.defineProperty;var s=(t,e)=>B(t,"name",{value:e,configurable:!0});import{typeFlag as P}from"type-flag";import S from"tty";import{terminalColumns as q,breakpoints as I}from"terminal-columns";const R=s(t=>t.replaceAll(/[\W_]([a-z\d])?/gi,(e,r)=>r?r.toUpperCase():""),"camelCase"),D=s(t=>t.replaceAll(/\B([A-Z])/g,"-$1").toLowerCase(),"kebabCase"),L={"> 80":[{width:"content-width",paddingLeft:2,paddingRight:8},{width:"auto"}],"> 40":[{width:"auto",paddingLeft:2,paddingRight:8,preprocess:s(t=>t.trim(),"preprocess")},{width:"100%",paddingLeft:2,paddingBottom:1}],"> 0":{stdoutColumns:1e3,columns:[{width:"content-width",paddingLeft:2,paddingRight:8},{width:"content-width"}]}};function T(t){let e=!1;return{type:"table",data:{tableData:Object.keys(t).sort((a,i)=>a.localeCompare(i)).map(a=>{const i=t[a],o="alias"in i;return o&&(e=!0),{name:a,flag:i,flagFormatted:`--${D(a)}`,aliasesEnabled:e,aliasFormatted:o?`-${i.alias}`:void 0}}).map(a=>(a.aliasesEnabled=e,[{type:"flagName",data:a},{type:"flagDescription",data:a}])),tableBreakpoints:L}}}s(T,"renderFlags");const x=s(t=>!t||(t.version??(t.help?t.help.version:void 0)),"getVersion"),O=s(t=>{const e="parent"in t&&t.parent?.name;return(e?`${e} `:"")+t.name},"getName");function k(t){const e=[];t.name&&e.push(O(t));const r=x(t)??("parent"in t&&x(t.parent));if(r&&e.push(`v${r}`),e.length!==0)return{id:"name",type:"text",data:`${e.join(" ")}
2
+ `}}s(k,"getNameAndVersion");function _(t){const{help:e}=t;if(!(!e||!e.description))return{id:"description",type:"text",data:`${e.description}
3
+ `}}s(_,"getDescription");function F(t){const e=t.help||{};if("usage"in e)return e.usage?{id:"usage",type:"section",data:{title:"Usage:",body:Array.isArray(e.usage)?e.usage.join(`
4
+ `):e.usage}}:void 0;if(t.name){const r=[],n=[O(t)];if(t.flags&&Object.keys(t.flags).length>0&&n.push("[flags...]"),t.parameters&&t.parameters.length>0){const{parameters:a}=t,i=a.indexOf("--"),o=i!==-1&&a.slice(i+1).some(l=>l.startsWith("<"));n.push(a.map(l=>l!=="--"?l:o?"--":"[--]").join(" "))}if(n.length>1&&r.push(n.join(" ")),"commands"in t&&t.commands?.length&&r.push(`${t.name} <command>`),r.length>0)return{id:"usage",type:"section",data:{title:"Usage:",body:r.join(`
5
+ `)}}}}s(F,"getUsage");function H(t){return!("commands"in t)||!t.commands?.length?void 0:{id:"commands",type:"section",data:{title:"Commands:",body:{type:"table",data:{tableData:t.commands.map(n=>[n.options.name,n.options.help?n.options.help.description:""]),tableOptions:[{width:"content-width",paddingLeft:2,paddingRight:8}]}},indentBody:0}}}s(H,"getCommands");function U(t){if(!(!t.flags||Object.keys(t.flags).length===0))return{id:"flags",type:"section",data:{title:"Flags:",body:T(t.flags),indentBody:0}}}s(U,"getFlags");function V(t){const{help:e}=t;if(!e||!e.examples||e.examples.length===0)return;let{examples:r}=e;if(Array.isArray(r)&&(r=r.join(`
6
+ `)),r)return{id:"examples",type:"section",data:{title:"Examples:",body:r}}}s(V,"getExamples");function J(t){if(!("alias"in t)||!t.alias)return;const{alias:e}=t;return{id:"aliases",type:"section",data:{title:"Aliases:",body:Array.isArray(e)?e.join(", "):e}}}s(J,"getAliases");const M=s(t=>[k,_,F,H,U,V,J].map(e=>e(t)).filter(Boolean),"generateHelp"),W=S.WriteStream.prototype.hasColors();class z{static{s(this,"Renderers")}text(e){return e}bold(e){return W?`\x1B[1m${e}\x1B[22m`:e.toLocaleUpperCase()}indentText({text:e,spaces:r}){return e.replaceAll(/^/gm," ".repeat(r))}heading(e){return this.bold(e)}section({title:e,body:r,indentBody:n=2}){return`${(e?`${this.heading(e)}
7
7
  `:"")+(r?this.indentText({text:this.render(r),spaces:n}):"")}
8
- `}table({tableData:e,tableOptions:r,tableBreakpoints:n}){return B(e.map(a=>a.map(i=>this.render(i))),n?S(n):r)}flagParameter(e){return e===Boolean?"":e===String?"<string>":e===Number?"<number>":Array.isArray(e)?this.flagParameter(e[0]):"<value>"}flagOperator(e){return" "}flagName(e){const{flag:r,flagFormatted:n,aliasesEnabled:a,aliasFormatted:i}=e;let s="";if(i?s+=`${i}, `:a&&(s+=" "),s+=n,"placeholder"in r&&typeof r.placeholder=="string")s+=`${this.flagOperator(e)}${r.placeholder}`;else{const o=this.flagParameter("type"in r?r.type:r);o&&(s+=`${this.flagOperator(e)}${o}`)}return s}flagDefault(e){return JSON.stringify(e)}flagDescription({flag:e}){let r="description"in e?e.description??"":"";if("default"in e){let{default:n}=e;typeof n=="function"&&(n=n()),n&&(r+=` (default: ${this.flagDefault(n)})`)}return r}render(e){if(typeof e=="string")return e;if(Array.isArray(e))return e.map(r=>this.render(r)).join(`
9
- `);if("type"in e&&this[e.type]){const r=this[e.type];if(typeof r=="function")return r.call(this,e.data)}throw new Error(`Invalid node type: ${JSON.stringify(e)}`)}}const y=t=>t.length>0&&!t.includes(" "),{stringify:d}=JSON,M=/[|\\{}()[\]^$+*?.]/;function w(t){const e=[];let r,n;for(const a of t){if(n)throw new Error(`Invalid parameter: Spread parameter ${d(n)} must be last`);const i=a[0],s=a[a.length-1];let o;if(i==="<"&&s===">"&&(o=!0,r))throw new Error(`Invalid parameter: Required parameter ${d(a)} cannot come after optional parameter ${d(r)}`);if(i==="["&&s==="]"&&(o=!1,r=a),o===void 0)throw new Error(`Invalid parameter: ${d(a)}. Must be wrapped in <> (required parameter) or [] (optional parameter)`);let l=a.slice(1,-1);const f=l.slice(-3)==="...";f&&(n=a,l=l.slice(0,-3));const p=l.match(M);if(p)throw new Error(`Invalid parameter: ${d(a)}. Invalid character found ${d(p[0])}`);e.push({name:l,required:o,spread:f})}return e}function b(t,e,r,n){for(let a=0;a<e.length;a+=1){const{name:i,required:s,spread:o}=e[a],l=P(i);if(l in t)throw new Error(`Invalid parameter: ${d(i)} is used more than once.`);const f=o?r.slice(a):r[a];if(o&&(a=e.length),s&&(!f||o&&f.length===0))return console.error(`Error: Missing required parameter ${d(i)}
10
- `),n(),process.exit(1);t[l]=f}}function W(t){return t===void 0||t!==!1}function x(t,e,r,n){const a={...e.flags},i=e.version;i&&(a.version={type:Boolean,description:"Show version"});const{help:s}=e,o=W(s);o&&!("help"in a)&&(a.help={type:Boolean,alias:"h",description:"Show help"});const l=j(a,n,{ignore:e.ignoreArgv}),f=()=>{console.log(e.version)};if(i&&l.flags.version===!0)return f(),process.exit(0);const p=new J,O=o&&s?.render?s.render:c=>p.render(c),u=c=>{const m=U({...e,...c?{help:c}:{},flags:a});console.log(O(m,p))};if(o&&l.flags.help===!0)return u(),process.exit(0);if(e.parameters){let{parameters:c}=e,m=l._;const g=c.indexOf("--"),v=c.slice(g+1),h=Object.create(null);if(g>-1&&v.length>0){c=c.slice(0,g);const E=l._["--"];m=m.slice(0,-E.length||void 0),b(h,w(c),m,u),b(h,w(v),E,u)}else b(h,w(c),m,u);Object.assign(l._,h)}const $={...l,showVersion:f,showHelp:u};return typeof r=="function"&&r($),{command:t,...$}}function z(t,e){const r=new Map;for(const n of e){const a=[n.options.name],{alias:i}=n.options;i&&(Array.isArray(i)?a.push(...i):a.push(i));for(const s of a){if(r.has(s))throw new Error(`Duplicate command name found: ${d(s)}`);r.set(s,n)}}return r.get(t)}function Z(t,e,r=process.argv.slice(2)){if(!t)throw new Error("Options is required");if("name"in t&&(!t.name||!y(t.name)))throw new Error(`Invalid script name: ${d(t.name)}`);const n=r[0];if(t.commands&&n&&y(n)){const a=z(n,t.commands);if(a)return x(a.options.name,{...a.options,parent:t},a.callback,r.slice(1))}return x(void 0,t,e,r)}function G(t,e){if(!t)throw new Error("Command options are required");const{name:r}=t;if(r===void 0)throw new Error("Command name is required");if(!y(r))throw new Error(`Invalid command name ${JSON.stringify(r)}. Command names must be one word.`);return{options:t,callback:e}}export{Z as cli,G as command};
8
+ `}table({tableData:e,tableOptions:r,tableBreakpoints:n}){return q(e.map(a=>a.map(i=>this.render(i))),n?I(n):r)}flagParameter(e){return e===Boolean?"":e===String?"<string>":e===Number?"<number>":Array.isArray(e)?this.flagParameter(e[0]):"<value>"}flagOperator(e){return" "}flagName(e){const{flag:r,flagFormatted:n,aliasesEnabled:a,aliasFormatted:i}=e;let o="";if(i?o+=`${i}, `:a&&(o+=" "),o+=n,"placeholder"in r&&typeof r.placeholder=="string")o+=`${this.flagOperator(e)}${r.placeholder}`;else{const l=this.flagParameter("type"in r?r.type:r);l&&(o+=`${this.flagOperator(e)}${l}`)}return o}flagDefault(e){return JSON.stringify(e)}flagDescription({flag:e}){let r="description"in e?e.description??"":"";if("default"in e){let{default:n}=e;typeof n=="function"&&(n=n()),n&&(r+=` (default: ${this.flagDefault(n)})`)}return r}render(e){if(typeof e=="string")return e;if(Array.isArray(e))return e.map(r=>this.render(r)).join(`
9
+ `);if("type"in e&&this[e.type]){const r=this[e.type];if(typeof r=="function")return r.call(this,e.data)}throw new Error(`Invalid node type: ${JSON.stringify(e)}`)}}const w=s(t=>t.length>0&&!t.includes(" "),"isValidScriptName"),{stringify:f}=JSON,Z=/[|\\{}()[\]^$+*?.]/;function b(t){const e=[];let r,n;for(const a of t){if(n)throw new Error(`Invalid parameter: Spread parameter ${f(n)} must be last`);const i=a[0],o=a.at(-1);let l;if(i==="<"&&o===">"&&(l=!0,r))throw new Error(`Invalid parameter: Required parameter ${f(a)} cannot come after optional parameter ${f(r)}`);if(i==="["&&o==="]"&&(l=!1,r=a),l===void 0)throw new Error(`Invalid parameter: ${f(a)}. Must be wrapped in <> (required parameter) or [] (optional parameter)`);let c=a.slice(1,-1);const m=c.slice(-3)==="...";m&&(n=a,c=c.slice(0,-3));const p=c.match(Z);if(p)throw new Error(`Invalid parameter: ${f(a)}. Invalid character found ${f(p[0])}`);e.push({name:c,required:l,spread:m})}return e}s(b,"parseParameters");function v(t,e,r,n){for(let a=0;a<e.length;a+=1){const{name:i,required:o,spread:l}=e[a],c=R(i);if(c in t)throw new Error(`Invalid parameter: ${f(i)} is used more than once.`);const m=l?r.slice(a):r[a];if(l&&(a=e.length),o&&(!m||l&&m.length===0))return console.error(`Error: Missing required parameter ${f(i)}
10
+ `),n(),process.exit(1);t[c]=m}}s(v,"mapParametersToArguments");function G(t){return t===void 0||t!==!1}s(G,"helpEnabled");function j(t,e,r,n){const a={...e.flags},i=e.version&&!("version"in a);i&&(a.version={type:Boolean,description:"Show version"});const{help:o}=e,l=G(o);l&&!("help"in a)&&(a.help={type:Boolean,alias:"h",description:"Show help"});const c=P(a,n,{ignore:e.ignoreArgv}),m=s(()=>{console.log(e.version)},"showVersion");if(i&&c.flags.version===!0)return m(),process.exit(0);const p=new z,N=l&&o?.render?o.render:d=>p.render(d),h=s(d=>{const u=M({...e,...d?{help:d}:{},flags:a});console.log(N(u,p))},"showHelp");if(l&&c.flags.help===!0)return h(),process.exit(0);if(e.parameters){let{parameters:d}=e,u=c._;const y=d.indexOf("--"),E=d.slice(y+1),g=Object.create(null);if(y>-1&&E.length>0){d=d.slice(0,y);const C=c._["--"];u=u.slice(0,-C.length||void 0),v(g,b(d),u,h),v(g,b(E),C,h)}else v(g,b(d),u,h);Object.assign(c._,g)}const $={...c,showVersion:m,showHelp:h},A={command:t,...$};if(typeof r=="function"){const d=r($);if(d&&"then"in d)return Object.assign(Promise.resolve(d),A)}return A}s(j,"cliBase");function K(t,e){const r=new Map;for(const n of e){const a=[n.options.name],{alias:i}=n.options;i&&(Array.isArray(i)?a.push(...i):a.push(i));for(const o of a){if(r.has(o))throw new Error(`Duplicate command name found: ${f(o)}`);r.set(o,n)}}return r.get(t)}s(K,"getCommand");function Q(t,e,r=process.argv.slice(2)){if(!t)throw new Error("Options is required");if("name"in t&&(!t.name||!w(t.name)))throw new Error(`Invalid script name: ${f(t.name)}`);const n=r[0];if(t.commands&&n&&w(n)){const a=K(n,t.commands);if(a)return j(a.options.name,{...a.options,parent:t},a.callback,r.slice(1))}return j(void 0,t,e,r)}s(Q,"cli");function X(t,e){if(!t)throw new Error("Command options are required");const{name:r}=t;if(r===void 0)throw new Error("Command name is required");if(!w(r))throw new Error(`Invalid command name ${JSON.stringify(r)}. Command names must be one word.`);return{options:t,callback:e}}s(X,"command");export{Q as cli,X as command};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cleye",
3
- "version": "1.3.4",
3
+ "version": "2.0.1",
4
4
  "description": "The intuitive CLI development tool",
5
5
  "keywords": [
6
6
  "cli",
@@ -21,23 +21,28 @@
21
21
  "files": [
22
22
  "dist"
23
23
  ],
24
- "main": "./dist/index.js",
24
+ "main": "./dist/index.cjs",
25
25
  "module": "./dist/index.mjs",
26
- "types": "./dist/index.d.ts",
26
+ "types": "./dist/index.d.cts",
27
27
  "exports": {
28
- "require": "./dist/index.js",
29
- "import": "./dist/index.mjs",
30
- "types": "./dist/index.d.ts"
28
+ "require": {
29
+ "types": "./dist/index.d.cts",
30
+ "default": "./dist/index.cjs"
31
+ },
32
+ "import": {
33
+ "types": "./dist/index.d.mts",
34
+ "default": "./dist/index.mjs"
35
+ }
31
36
  },
32
37
  "imports": {
33
38
  "#cleye": {
34
39
  "types": "./src/index.ts",
35
40
  "development": "./src/index.ts",
36
- "default": "./dist/index.js"
41
+ "default": "./dist/index.mjs"
37
42
  }
38
43
  },
39
44
  "dependencies": {
40
- "terminal-columns": "^1.4.1",
41
- "type-flag": "^3.0.0"
45
+ "terminal-columns": "^2.0.0",
46
+ "type-flag": "^4.0.1"
42
47
  }
43
48
  }
package/dist/index.js DELETED
@@ -1,10 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var q=require("type-flag"),N=require("tty"),C=require("terminal-columns");function A(t){return t&&typeof t=="object"&&"default"in t?t:{default:t}}var B=A(N),P=A(C);const S=t=>t.replace(/[\W_]([a-z\d])?/gi,(e,r)=>r?r.toUpperCase():""),D=t=>t.replace(/\B([A-Z])/g,"-$1").toLowerCase(),I={"> 80":[{width:"content-width",paddingLeft:2,paddingRight:8},{width:"auto"}],"> 40":[{width:"auto",paddingLeft:2,paddingRight:8,preprocess:t=>t.trim()},{width:"100%",paddingLeft:2,paddingBottom:1}],"> 0":{stdoutColumns:1e3,columns:[{width:"content-width",paddingLeft:2,paddingRight:8},{width:"content-width"}]}};function L(t){let e=!1;return{type:"table",data:{tableData:Object.keys(t).sort((a,i)=>a.localeCompare(i)).map(a=>{const i=t[a],s="alias"in i;return s&&(e=!0),{name:a,flag:i,flagFormatted:`--${D(a)}`,aliasesEnabled:e,aliasFormatted:s?`-${i.alias}`:void 0}}).map(a=>(a.aliasesEnabled=e,[{type:"flagName",data:a},{type:"flagDescription",data:a}])),tableBreakpoints:I}}}const x=t=>!t||(t.version??(t.help?t.help.version:void 0)),O=t=>{const e="parent"in t&&t.parent?.name;return(e?`${e} `:"")+t.name};function R(t){const e=[];t.name&&e.push(O(t));const r=x(t)??("parent"in t&&x(t.parent));if(r&&e.push(`v${r}`),e.length!==0)return{id:"name",type:"text",data:`${e.join(" ")}
2
- `}}function T(t){const{help:e}=t;if(!(!e||!e.description))return{id:"description",type:"text",data:`${e.description}
3
- `}}function F(t){const e=t.help||{};if("usage"in e)return e.usage?{id:"usage",type:"section",data:{title:"Usage:",body:Array.isArray(e.usage)?e.usage.join(`
4
- `):e.usage}}:void 0;if(t.name){const r=[],n=[O(t)];if(t.flags&&Object.keys(t.flags).length>0&&n.push("[flags...]"),t.parameters&&t.parameters.length>0){const{parameters:a}=t,i=a.indexOf("--"),s=i>-1&&a.slice(i+1).some(o=>o.startsWith("<"));n.push(a.map(o=>o!=="--"?o:s?"--":"[--]").join(" "))}if(n.length>1&&r.push(n.join(" ")),"commands"in t&&t.commands?.length&&r.push(`${t.name} <command>`),r.length>0)return{id:"usage",type:"section",data:{title:"Usage:",body:r.join(`
5
- `)}}}}function k(t){return!("commands"in t)||!t.commands?.length?void 0:{id:"commands",type:"section",data:{title:"Commands:",body:{type:"table",data:{tableData:t.commands.map(n=>[n.options.name,n.options.help?n.options.help.description:""]),tableOptions:[{width:"content-width",paddingLeft:2,paddingRight:8}]}},indentBody:0}}}function H(t){if(!(!t.flags||Object.keys(t.flags).length===0))return{id:"flags",type:"section",data:{title:"Flags:",body:L(t.flags),indentBody:0}}}function M(t){const{help:e}=t;if(!e||!e.examples||e.examples.length===0)return;let{examples:r}=e;if(Array.isArray(r)&&(r=r.join(`
6
- `)),r)return{id:"examples",type:"section",data:{title:"Examples:",body:r}}}function U(t){if(!("alias"in t)||!t.alias)return;const{alias:e}=t;return{id:"aliases",type:"section",data:{title:"Aliases:",body:Array.isArray(e)?e.join(", "):e}}}const V=t=>[R,T,F,k,H,M,U].map(e=>e(t)).filter(Boolean),J=B.default.WriteStream.prototype.hasColors();class W{text(e){return e}bold(e){return J?`\x1B[1m${e}\x1B[22m`:e.toLocaleUpperCase()}indentText({text:e,spaces:r}){return e.replace(/^/gm," ".repeat(r))}heading(e){return this.bold(e)}section({title:e,body:r,indentBody:n=2}){return`${(e?`${this.heading(e)}
7
- `:"")+(r?this.indentText({text:this.render(r),spaces:n}):"")}
8
- `}table({tableData:e,tableOptions:r,tableBreakpoints:n}){return P.default(e.map(a=>a.map(i=>this.render(i))),n?C.breakpoints(n):r)}flagParameter(e){return e===Boolean?"":e===String?"<string>":e===Number?"<number>":Array.isArray(e)?this.flagParameter(e[0]):"<value>"}flagOperator(e){return" "}flagName(e){const{flag:r,flagFormatted:n,aliasesEnabled:a,aliasFormatted:i}=e;let s="";if(i?s+=`${i}, `:a&&(s+=" "),s+=n,"placeholder"in r&&typeof r.placeholder=="string")s+=`${this.flagOperator(e)}${r.placeholder}`;else{const o=this.flagParameter("type"in r?r.type:r);o&&(s+=`${this.flagOperator(e)}${o}`)}return s}flagDefault(e){return JSON.stringify(e)}flagDescription({flag:e}){let r="description"in e?e.description??"":"";if("default"in e){let{default:n}=e;typeof n=="function"&&(n=n()),n&&(r+=` (default: ${this.flagDefault(n)})`)}return r}render(e){if(typeof e=="string")return e;if(Array.isArray(e))return e.map(r=>this.render(r)).join(`
9
- `);if("type"in e&&this[e.type]){const r=this[e.type];if(typeof r=="function")return r.call(this,e.data)}throw new Error(`Invalid node type: ${JSON.stringify(e)}`)}}const y=t=>t.length>0&&!t.includes(" "),{stringify:d}=JSON,z=/[|\\{}()[\]^$+*?.]/;function w(t){const e=[];let r,n;for(const a of t){if(n)throw new Error(`Invalid parameter: Spread parameter ${d(n)} must be last`);const i=a[0],s=a[a.length-1];let o;if(i==="<"&&s===">"&&(o=!0,r))throw new Error(`Invalid parameter: Required parameter ${d(a)} cannot come after optional parameter ${d(r)}`);if(i==="["&&s==="]"&&(o=!1,r=a),o===void 0)throw new Error(`Invalid parameter: ${d(a)}. Must be wrapped in <> (required parameter) or [] (optional parameter)`);let l=a.slice(1,-1);const f=l.slice(-3)==="...";f&&(n=a,l=l.slice(0,-3));const u=l.match(z);if(u)throw new Error(`Invalid parameter: ${d(a)}. Invalid character found ${d(u[0])}`);e.push({name:l,required:o,spread:f})}return e}function b(t,e,r,n){for(let a=0;a<e.length;a+=1){const{name:i,required:s,spread:o}=e[a],l=S(i);if(l in t)throw new Error(`Invalid parameter: ${d(i)} is used more than once.`);const f=o?r.slice(a):r[a];if(o&&(a=e.length),s&&(!f||o&&f.length===0))return console.error(`Error: Missing required parameter ${d(i)}
10
- `),n(),process.exit(1);t[l]=f}}function Z(t){return t===void 0||t!==!1}function j(t,e,r,n){const a={...e.flags},i=e.version;i&&(a.version={type:Boolean,description:"Show version"});const{help:s}=e,o=Z(s);o&&!("help"in a)&&(a.help={type:Boolean,alias:"h",description:"Show help"});const l=q.typeFlag(a,n,{ignore:e.ignoreArgv}),f=()=>{console.log(e.version)};if(i&&l.flags.version===!0)return f(),process.exit(0);const u=new W,_=o&&s?.render?s.render:c=>u.render(c),p=c=>{const m=V({...e,...c?{help:c}:{},flags:a});console.log(_(m,u))};if(o&&l.flags.help===!0)return p(),process.exit(0);if(e.parameters){let{parameters:c}=e,m=l._;const g=c.indexOf("--"),$=c.slice(g+1),h=Object.create(null);if(g>-1&&$.length>0){c=c.slice(0,g);const E=l._["--"];m=m.slice(0,-E.length||void 0),b(h,w(c),m,p),b(h,w($),E,p)}else b(h,w(c),m,p);Object.assign(l._,h)}const v={...l,showVersion:f,showHelp:p};return typeof r=="function"&&r(v),{command:t,...v}}function G(t,e){const r=new Map;for(const n of e){const a=[n.options.name],{alias:i}=n.options;i&&(Array.isArray(i)?a.push(...i):a.push(i));for(const s of a){if(r.has(s))throw new Error(`Duplicate command name found: ${d(s)}`);r.set(s,n)}}return r.get(t)}function K(t,e,r=process.argv.slice(2)){if(!t)throw new Error("Options is required");if("name"in t&&(!t.name||!y(t.name)))throw new Error(`Invalid script name: ${d(t.name)}`);const n=r[0];if(t.commands&&n&&y(n)){const a=G(n,t.commands);if(a)return j(a.options.name,{...a.options,parent:t},a.callback,r.slice(1))}return j(void 0,t,e,r)}function Q(t,e){if(!t)throw new Error("Command options are required");const{name:r}=t;if(r===void 0)throw new Error("Command name is required");if(!y(r))throw new Error(`Invalid command name ${JSON.stringify(r)}. Command names must be one word.`);return{options:t,callback:e}}exports.cli=K,exports.command=Q;