cli-kiss 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -103,6 +103,7 @@ type Option<Value> = {
103
103
  };
104
104
  type OptionUsage = {
105
105
  description: string | undefined;
106
+ hint: string | undefined;
106
107
  long: Lowercase<string>;
107
108
  short: string | undefined;
108
109
  label: Uppercase<string> | undefined;
@@ -114,6 +115,7 @@ declare function optionFlag(definition: {
114
115
  long: Lowercase<string>;
115
116
  short?: string;
116
117
  description?: string;
118
+ hint?: string;
117
119
  aliases?: {
118
120
  longs?: Array<Lowercase<string>>;
119
121
  shorts?: Array<string>;
@@ -124,6 +126,7 @@ declare function optionSingleValue<Value>(definition: {
124
126
  long: Lowercase<string>;
125
127
  short?: string;
126
128
  description?: string;
129
+ hint?: string;
127
130
  aliases?: {
128
131
  longs?: Array<Lowercase<string>>;
129
132
  shorts?: Array<string>;
@@ -136,6 +139,7 @@ declare function optionRepeatable<Value>(definition: {
136
139
  long: Lowercase<string>;
137
140
  short?: string;
138
141
  description?: string;
142
+ hint?: string;
139
143
  aliases?: {
140
144
  longs?: Array<Lowercase<string>>;
141
145
  shorts?: Array<string>;
@@ -150,15 +154,18 @@ type Positional<Value> = {
150
154
  };
151
155
  type PositionalUsage = {
152
156
  description: string | undefined;
157
+ hint: string | undefined;
153
158
  label: Uppercase<string>;
154
159
  };
155
160
  declare function positionalRequired<Value>(definition: {
156
161
  description?: string;
162
+ hint?: string;
157
163
  label?: Uppercase<string>;
158
164
  type: Type<Value>;
159
165
  }): Positional<Value>;
160
166
  declare function positionalOptional<Value>(definition: {
161
167
  description?: string;
168
+ hint?: string;
162
169
  label?: Uppercase<string>;
163
170
  type: Type<Value>;
164
171
  default: () => Value;
@@ -166,6 +173,7 @@ declare function positionalOptional<Value>(definition: {
166
173
  declare function positionalVariadics<Value>(definition: {
167
174
  endDelimiter?: string;
168
175
  description?: string;
176
+ hint?: string;
169
177
  label?: Uppercase<string>;
170
178
  type: Type<Value>;
171
179
  }): Positional<Array<Value>>;
@@ -199,7 +207,7 @@ declare function operation<Context, Result, Options extends {
199
207
  }) => Promise<Result>): Operation<Context, Result>;
200
208
 
201
209
  type Command<Context, Result> = {
202
- getDescription(): string | undefined;
210
+ getInformation(): CommandInformation;
203
211
  createFactory(readerArgs: ReaderArgs): CommandFactory<Context, Result>;
204
212
  };
205
213
  type CommandFactory<Context, Result> = {
@@ -209,13 +217,14 @@ type CommandFactory<Context, Result> = {
209
217
  type CommandInstance<Context, Result> = {
210
218
  executeWithContext(context: Context): Promise<Result>;
211
219
  };
212
- type CommandMetadata = {
220
+ type CommandInformation = {
213
221
  description: string;
222
+ hint?: string;
214
223
  details?: string;
215
224
  };
216
225
  type CommandUsage = {
217
- metadata: CommandMetadata;
218
226
  breadcrumbs: Array<CommandUsageBreadcrumb>;
227
+ information: CommandInformation;
219
228
  positionals: Array<PositionalUsage>;
220
229
  subcommands: Array<CommandUsageSubcommand>;
221
230
  options: Array<OptionUsage>;
@@ -228,21 +237,22 @@ type CommandUsageBreadcrumb = {
228
237
  type CommandUsageSubcommand = {
229
238
  name: string;
230
239
  description: string | undefined;
240
+ hint: string | undefined;
231
241
  };
232
- declare function command<Context, Result>(metadata: CommandMetadata, operation: Operation<Context, Result>): Command<Context, Result>;
233
- declare function commandWithSubcommands<Context, Payload, Result>(metadata: CommandMetadata, operation: Operation<Context, Payload>, subcommands: {
242
+ declare function command<Context, Result>(information: CommandInformation, operation: Operation<Context, Result>): Command<Context, Result>;
243
+ declare function commandWithSubcommands<Context, Payload, Result>(information: CommandInformation, operation: Operation<Context, Payload>, subcommands: {
234
244
  [subcommand: Lowercase<string>]: Command<Payload, Result>;
235
245
  }): Command<Context, Result>;
236
- declare function commandChained<Context, Payload, Result>(metadata: CommandMetadata, operation: Operation<Context, Payload>, nextCommand: Command<Payload, Result>): Command<Context, Result>;
246
+ declare function commandChained<Context, Payload, Result>(metadata: CommandInformation, operation: Operation<Context, Payload>, nextCommand: Command<Payload, Result>): Command<Context, Result>;
237
247
 
238
248
  declare function runAsCliAndExit<Context>(cliName: Lowercase<string>, cliArgs: ReadonlyArray<string>, context: Context, command: Command<Context, void>, application?: {
239
249
  usageOnHelp?: boolean | undefined;
240
250
  buildVersion?: string | undefined;
241
251
  useColors?: boolean | undefined;
252
+ onExecutionError?: ((error: unknown) => void) | undefined;
242
253
  onLogStdOut?: ((message: string) => void) | undefined;
243
254
  onLogStdErr?: ((message: string) => void) | undefined;
244
255
  onExit?: ((code: number) => never) | undefined;
245
- onExecutionError?: ((error: unknown) => void) | undefined;
246
256
  }): Promise<never>;
247
257
 
248
258
  declare function usageToStyledLines(params: {
@@ -251,4 +261,4 @@ declare function usageToStyledLines(params: {
251
261
  typoSupport: TypoSupport;
252
262
  }): string[];
253
263
 
254
- export { type Command, type CommandFactory, type CommandInstance, type CommandMetadata, type CommandUsage, type CommandUsageBreadcrumb, type CommandUsageSubcommand, type Operation, type OperationFactory, type OperationInstance, type OperationUsage, type Option, type OptionGetter, type OptionUsage, type Positional, type PositionalUsage, ReaderArgs, type ReaderOptionKey, type ReaderOptions, type ReaderPositionals, type Type, type TypoColor, TypoError, TypoGrid, TypoString, type TypoStyle, TypoSupport, TypoText, command, commandChained, commandWithSubcommands, operation, optionFlag, optionRepeatable, optionSingleValue, positionalOptional, positionalRequired, positionalVariadics, runAsCliAndExit, typeBigInt, typeBoolean, typeDate, typeDecode, typeList, typeMapped, typeNumber, typeOneOf, typeString, typeTuple, typeUrl, typoStyleConstants, typoStyleFailure, typoStyleUserInput, usageToStyledLines };
264
+ export { type Command, type CommandFactory, type CommandInformation, type CommandInstance, type CommandUsage, type CommandUsageBreadcrumb, type CommandUsageSubcommand, type Operation, type OperationFactory, type OperationInstance, type OperationUsage, type Option, type OptionGetter, type OptionUsage, type Positional, type PositionalUsage, ReaderArgs, type ReaderOptionKey, type ReaderOptions, type ReaderPositionals, type Type, type TypoColor, TypoError, TypoGrid, TypoString, type TypoStyle, TypoSupport, TypoText, command, commandChained, commandWithSubcommands, operation, optionFlag, optionRepeatable, optionSingleValue, positionalOptional, positionalRequired, positionalVariadics, runAsCliAndExit, typeBigInt, typeBoolean, typeDate, typeDecode, typeList, typeMapped, typeNumber, typeOneOf, typeString, typeTuple, typeUrl, typoStyleConstants, typoStyleFailure, typoStyleUserInput, usageToStyledLines };
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- "use strict";var J=Object.defineProperty;var me=Object.getOwnPropertyDescriptor;var ye=Object.getOwnPropertyNames;var he=Object.prototype.hasOwnProperty;var ae=t=>{throw TypeError(t)};var we=(t,e)=>{for(var n in e)J(t,n,{get:e[n],enumerable:!0})},fe=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of ye(e))!he.call(t,r)&&r!==n&&J(t,r,{get:()=>e[r],enumerable:!(o=me(e,r))||o.enumerable});return t};var be=t=>fe(J({},"__esModule",{value:!0}),t);var z=(t,e,n)=>e.has(t)||ae("Cannot "+n);var c=(t,e,n)=>(z(t,e,"read from private field"),n?n.call(t):e.get(t)),b=(t,e,n)=>e.has(t)?ae("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,n),w=(t,e,n,o)=>(z(t,e,"write to private field"),o?o.call(t,n):e.set(t,n),n),f=(t,e,n)=>(z(t,e,"access private method"),n);var ie=(t,e,n,o)=>({set _(r){w(t,e,r,n)},get _(){return c(t,e,o)}});var Xe={};we(Xe,{ReaderArgs:()=>W,TypoError:()=>d,TypoGrid:()=>I,TypoString:()=>a,TypoSupport:()=>P,TypoText:()=>l,command:()=>Ae,commandChained:()=>Ie,commandWithSubcommands:()=>$e,operation:()=>Pe,optionFlag:()=>We,optionRepeatable:()=>Ne,optionSingleValue:()=>Ke,positionalOptional:()=>Ye,positionalRequired:()=>je,positionalVariadics:()=>qe,runAsCliAndExit:()=>ze,typeBigInt:()=>Ge,typeBoolean:()=>Y,typeDate:()=>Ve,typeDecode:()=>x,typeList:()=>De,typeMapped:()=>Le,typeNumber:()=>Be,typeOneOf:()=>Fe,typeString:()=>Ee,typeTuple:()=>Me,typeUrl:()=>ve,typoStyleConstants:()=>m,typoStyleFailure:()=>pe,typoStyleUserInput:()=>y,usageToStyledLines:()=>re});module.exports=be(Xe);var m={fgColor:"darkCyan",bold:!0},y={fgColor:"darkBlue",bold:!0},pe={fgColor:"darkRed",bold:!0},E,D,a=class{constructor(e,n={}){b(this,E);b(this,D);w(this,E,e),w(this,D,n)}getRawString(){return c(this,E)}computeStyledString(e){return e.computeStyledString(c(this,E),c(this,D))}};E=new WeakMap,D=new WeakMap;var S,Q=class Q{constructor(...e){b(this,S);w(this,S,[]);for(let n of e)n instanceof Q?this.pushText(n):n instanceof a?this.pushString(n):typeof n=="string"&&this.pushString(new a(n))}pushString(e){c(this,S).push(e)}pushText(e){for(let n of c(e,S))c(this,S).push(n)}computeStyledString(e){return c(this,S).map(n=>n.computeStyledString(e)).join("")}computeRawString(){return c(this,S).map(e=>e.getRawString()).join("")}computeRawLength(){let e=0;for(let n of c(this,S))e+=n.getRawString().length;return e}};S=new WeakMap;var l=Q,$,I=class{constructor(){b(this,$);w(this,$,[])}pushRow(e){c(this,$).push(e)}computeStyledGrid(e){let n=new Array,o=new Array;for(let r of c(this,$))for(let s=0;s<r.length;s++){let p=r[s].computeRawLength();(n[s]===void 0||p>n[s])&&(n[s]=p)}for(let r of c(this,$)){let s=new Array;for(let i=0;i<r.length;i++){let p=r[i],u=p.computeStyledString(e);if(s.push(u),i<r.length-1){let h=p.computeRawLength(),O=" ".repeat(n[i]-h);s.push(O)}}o.push(s)}return o}};$=new WeakMap;var B,X=class X extends Error{constructor(n,o){let r=new l;r.pushText(n),o instanceof Error?r.pushString(new a(`: ${o.message}`)):o instanceof X?(r.pushString(new a(": ")),r.pushText(c(o,B))):o!==void 0&&r.pushString(new a(`: ${String(o)}`));super(r.computeRawString());b(this,B);w(this,B,r)}computeStyledString(n){return c(this,B).computeStyledString(n)}};B=new WeakMap;var d=X,U,C=class C{constructor(e){b(this,U);w(this,U,e)}static none(){return new C("none")}static tty(){return new C("tty")}static mock(){return new C("mock")}static inferFromProcess(){if(!process)return C.none();if(process.env){if(process.env.FORCE_COLOR==="0")return C.none();if(process.env.FORCE_COLOR)return C.tty();if("NO_COLOR"in process.env)return C.none()}return!process.stdout||!process.stdout.isTTY?C.none():C.tty()}computeStyledString(e,n){if(c(this,U)==="none")return e;if(c(this,U)==="tty"){let o=n.fgColor?Re[n.fgColor]:"",r=n.bgColor?ke[n.bgColor]:"",s=n.bold?Ce:"",i=n.dim?Se:"",p=n.italic?Te:"",u=n.underline?Oe:"",h=n.strikethrough?Ue:"";return`${o}${r}${s}${i}${p}${u}${h}${e}${xe}`}if(c(this,U)==="mock"){let o=n.fgColor?`{${e}}@${n.fgColor}`:e,r=n.bgColor?`{${o}}#${n.bgColor}`:o,s=n.bold?`{${r}}+`:r,i=n.dim?`{${s}}-`:s,p=n.italic?`{${i}}*`:i,u=n.underline?`{${p}}_`:p;return n.strikethrough?`{${u}}~`:u}throw new Error(`Unknown TypoSupport kind: ${c(this,U)}`)}computeStyledErrorMessage(e){return[this.computeStyledString("Error:",pe),e instanceof d?e.computeStyledString(this):e instanceof Error?e.message:String(e)].join(" ")}};U=new WeakMap;var P=C,xe="\x1B[0m",Ce="\x1B[1m",Se="\x1B[2m",Te="\x1B[3m",Oe="\x1B[4m",Ue="\x1B[9m",Re={darkBlack:"\x1B[30m",darkRed:"\x1B[31m",darkGreen:"\x1B[32m",darkYellow:"\x1B[33m",darkBlue:"\x1B[34m",darkMagenta:"\x1B[35m",darkCyan:"\x1B[36m",darkWhite:"\x1B[37m",brightBlack:"\x1B[90m",brightRed:"\x1B[91m",brightGreen:"\x1B[92m",brightYellow:"\x1B[93m",brightBlue:"\x1B[94m",brightMagenta:"\x1B[95m",brightCyan:"\x1B[96m",brightWhite:"\x1B[97m"},ke={darkBlack:"\x1B[40m",darkRed:"\x1B[41m",darkGreen:"\x1B[42m",darkYellow:"\x1B[43m",darkBlue:"\x1B[44m",darkMagenta:"\x1B[45m",darkCyan:"\x1B[46m",darkWhite:"\x1B[47m",brightBlack:"\x1B[100m",brightRed:"\x1B[101m",brightGreen:"\x1B[102m",brightYellow:"\x1B[103m",brightBlue:"\x1B[104m",brightMagenta:"\x1B[105m",brightCyan:"\x1B[106m",brightWhite:"\x1B[107m"};function Ae(t,e){return{getDescription(){return t.description},createFactory(n){function o(){let r=e.generateUsage();return{metadata:t,breadcrumbs:r.positionals.map(s=>j(s.label)),positionals:r.positionals,subcommands:[],options:r.options}}try{let r=e.createFactory(n),s=n.consumePositional();if(s!==void 0)throw Error(`Unexpected argument: "${s}"`);return{generateUsage:o,createInstance(){let i=r.createInstance();return{async executeWithContext(p){return await i.executeWithContext(p)}}}}}catch(r){return{generateUsage:o,createInstance(){throw r}}}}}}function $e(t,e,n){return{getDescription(){return t.description},createFactory(o){try{let r=e.createFactory(o),s=o.consumePositional();if(s===void 0)throw new d(new l(new a("<SUBCOMMAND>",m),new a(": Is required, but was not provided")));let i=n[s];if(i===void 0)throw new d(new l(new a("<SUBCOMMAND>",m),new a(`: Invalid value: "${s}"`)));let p=i.createFactory(o);return{generateUsage(){let u=e.generateUsage(),h=p.generateUsage();return{metadata:h.metadata,breadcrumbs:u.positionals.map(O=>j(O.label)).concat([le(s)]).concat(h.breadcrumbs),positionals:u.positionals.concat(h.positionals),subcommands:h.subcommands,options:u.options.concat(h.options)}},createInstance(){let u=r.createInstance(),h=p.createInstance();return{async executeWithContext(O){return await h.executeWithContext(await u.executeWithContext(O))}}}}}catch(r){return{generateUsage(){let s=e.generateUsage();return{metadata:t,breadcrumbs:s.positionals.map(i=>j(i.label)).concat([le("<SUBCOMMAND>")]),positionals:s.positionals,subcommands:Object.entries(n).map(([i,p])=>({name:i,description:p.getDescription()})),options:s.options}},createInstance(){throw r}}}}}}function Ie(t,e,n){return{getDescription(){return t.description},createFactory(o){let r=e.createFactory(o),s=n.createFactory(o);return{generateUsage(){let i=e.generateUsage(),p=s.generateUsage();return{metadata:p.metadata,breadcrumbs:i.positionals.map(u=>j(u.label)).concat(p.breadcrumbs),positionals:i.positionals.concat(p.positionals),subcommands:p.subcommands,options:i.options.concat(p.options)}},createInstance(){let i=r.createInstance(),p=s.createInstance();return{async executeWithContext(u){return await p.executeWithContext(await i.executeWithContext(u))}}}}}}}function j(t){return{positional:t}}function le(t){return{command:t}}function Pe(t,e){return{generateUsage(){let n=new Array;for(let r in t.options){let s=t.options[r];s&&n.push(s.generateUsage())}let o=new Array;for(let r of t.positionals)o.push(r.generateUsage());return{options:n,positionals:o}},createFactory(n){let o={};for(let s in t.options){let i=t.options[s];o[s]=i.createGetter(n)}let r=[];for(let s of t.positionals)r.push(s.consumePositionals(n));return{createInstance(){let s={};for(let i in o)s[i]=o[i].getValue();return{executeWithContext(i){return e(i,{options:s,positionals:r})}}}}}}}var Y={label:"BOOLEAN",decoder(t){let e=t.toLowerCase();if(e==="true"||e==="yes")return!0;if(e==="false"||e==="no")return!1;throw new Error(`Invalid value: "${t}"`)}},Ve={label:"DATE",decoder(t){let e=Date.parse(t);if(isNaN(e))throw new Error(`Invalid ISO_8601 value: "${t}"`);return new Date(e)}},ve={label:"URL",decoder(t){return new URL(t)}},Ee={label:"STRING",decoder(t){return t}},Be={label:"NUMBER",decoder(t){return Number(t)}},Ge={label:"BIGINT",decoder(t){return BigInt(t)}};function Le(t,e){return{label:e.label,decoder:n=>e.decoder(x(t,n,()=>new l(new a(t.label,y))))}}function Fe(t,e){let n=new Set(e);return{label:t.label,decoder(o){let r=x(t,o,()=>new l(new a(t.label,y)));if(n.has(r))return r;let s=e.map(i=>`"${i}"`).join("|");throw new Error(`Unexpected value: "${o}" (expected: ${s})`)}}}function Me(t,e=","){return{label:t.map(n=>n.label).join(e),decoder(n){let o=n.split(e,t.length);if(o.length!==t.length)throw new Error(`Invalid tuple parts: ${JSON.stringify(o)}`);return o.map((r,s)=>x(t[s],r,()=>new l(new a(t[s].label,y),new a(` at position ${s}`))))}}}function De(t,e=","){return{label:`${t.label}[${e}${t.label}]...`,decoder(n){return n.split(e).map((o,r)=>x(t,o,()=>new l(new a(t.label,y),new a(` at position ${r}`))))}}}function x(t,e,n){try{return t.decoder(e)}catch(o){throw new d(n(),o)}}function We(t){let e=`<${Y.label}>`;return{generateUsage(){return{description:t.description,long:t.long,short:t.short,label:void 0}},createGetter(n){let o=Z(n,{...t,valued:!1});return{getValue(){let r=n.getOptionValues(o);if(r.length>1)throw new d(new l(new a(`--${t.long}`,m),new a(": Must not be set multiple times")));let s=r[0];if(s===void 0)try{return t.default?t.default():!1}catch(i){throw new d(new l(new a(`--${t.long}`,m),new a(": Failed to compute default value")),i)}return x(Y,s,()=>new l(new a(`--${t.long}`,m),new a(": "),new a(e,y)))}}}}}function Ke(t){let e=`<${t.label??t.type.label}>`;return{generateUsage(){return{description:t.description,long:t.long,short:t.short,label:e}},createGetter(n){let o=Z(n,{...t,valued:!0});return{getValue(){let r=n.getOptionValues(o);if(r.length>1)throw new d(new l(new a(`--${t.long}`,m),new a(": Must not be set multiple times")));let s=r[0];if(s===void 0)try{return t.default()}catch(i){throw new d(new l(new a(`--${t.long}`,m),new a(": Failed to compute default value")),i)}return x(t.type,s,()=>new l(new a(`--${t.long}`,m),new a(": "),new a(e,y)))}}}}}function Ne(t){let e=`<${t.label??t.type.label}>`;return{generateUsage(){return{description:t.description,long:t.long,short:t.short,label:e}},createGetter(n){let o=Z(n,{...t,valued:!0});return{getValue(){return n.getOptionValues(o).map(r=>x(t.type,r,()=>new l(new a(`--${t.long}`,m),new a(": "),new a(e,y))))}}}}}function Z(t,e){let{long:n,short:o,aliases:r,valued:s}=e,i=n?[n]:[];r?.longs&&i.push(...r?.longs);let p=o?[o]:[];return r?.shorts&&p.push(...r?.shorts),t.registerOption({longs:i,shorts:p,valued:s})}function je(t){let e=`<${t.label??t.type.label}>`;return{generateUsage(){return{description:t.description,label:e}},consumePositionals(n){let o=n.consumePositional();if(o===void 0)throw new d(new l(new a(e,y),new a(": Is required, but was not provided")));return x(t.type,o,()=>new l(new a(e,y)))}}}function Ye(t){let e=`[${t.label??t.type.label}]`;return{generateUsage(){return{description:t.description,label:e}},consumePositionals(n){let o=n.consumePositional();if(o===void 0)try{return t.default()}catch(r){throw new d(new l(new a(e,y),new a(": Failed to compute default value")),r)}return x(t.type,o,()=>new l(new a(e,y)))}}}function qe(t){let e=t.label??t.type.label;return{generateUsage(){return{description:t.description,label:`[${e}]...`+(t.endDelimiter?`["${t.endDelimiter}"]`:"")}},consumePositionals(n){let o=[];for(;;){let r=n.consumePositional();if(r===void 0||r===t.endDelimiter)break;o.push(x(t.type,r,()=>new l(new a(e,y))))}return o}}}var K,G,k,V,T,v,L,g,q,ue,_,ce,ee,R,W=class{constructor(e){b(this,g);b(this,K);b(this,G);b(this,k);b(this,V);b(this,T);b(this,v);b(this,L);w(this,K,e),w(this,G,0),w(this,k,!1),w(this,V,new Map),w(this,T,new Map),w(this,v,new Map),w(this,L,new Map)}registerOption(e){let n=[...e.longs.map(o=>`--${o}`),...e.shorts.map(o=>`-${o}`)].join(", ");for(let o of e.longs){if(c(this,V).has(o))throw new Error(`Option already registered: --${o}`);c(this,V).set(o,n)}for(let o of e.shorts){if(c(this,T).has(o))throw new Error(`Option already registered: -${o}`);for(let r=0;r<o.length;r++){let s=o.slice(0,r);if(c(this,T).has(s))throw new Error(`Option -${o} overlap with shorter option: -${s}`)}for(let r of c(this,T).keys())if(r.startsWith(o))throw new Error(`Option -${o} overlap with longer option: -${r}`);c(this,T).set(o,n)}return c(this,v).set(n,e.valued),c(this,L).set(n,new Array),n}getOptionValues(e){let n=c(this,L).get(e);if(n===void 0)throw new Error(`Unregistered option: ${e}`);return n}consumePositional(){for(;;){let e=f(this,g,q).call(this);if(e===null)return;if(f(this,g,ue).call(this,e))return e}}};K=new WeakMap,G=new WeakMap,k=new WeakMap,V=new WeakMap,T=new WeakMap,v=new WeakMap,L=new WeakMap,g=new WeakSet,q=function(){let e=c(this,K)[c(this,G)];return e===void 0?null:(ie(this,G)._++,!c(this,k)&&e==="--"?(w(this,k,!0),f(this,g,q).call(this)):e)},ue=function(e){if(c(this,k))return!0;if(e.startsWith("--")){let n=e.indexOf("=");return n===-1?f(this,g,_).call(this,e.slice(2),null):f(this,g,_).call(this,e.slice(2,n),e.slice(n+1)),!1}if(e.startsWith("-")){let n=1,o=2;for(;o<=e.length;){let r=f(this,g,ce).call(this,e.slice(n,o),e.slice(o));if(r===!0)return!1;r===!1&&(n=o),o++}throw new d(new l(new a(`-${e.slice(n)}`,m),new a(": Unexpected unknown option")))}return!0},_=function(e,n){let o=`--${e}`,r=c(this,V).get(e);if(r!==void 0)return n!==null?f(this,g,R).call(this,r,n):c(this,v).get(r)?f(this,g,R).call(this,r,f(this,g,ee).call(this,o)):f(this,g,R).call(this,r,"true");throw new d(new l(new a(o,m),new a(": Unexpected unknown option")))},ce=function(e,n){let o=c(this,T).get(e);return o!==void 0?n.startsWith("=")?(f(this,g,R).call(this,o,n.slice(1)),!0):c(this,v).get(o)?(n===""?f(this,g,R).call(this,o,f(this,g,ee).call(this,`-${e}`)):f(this,g,R).call(this,o,n),!0):(f(this,g,R).call(this,o,"true"),n===""):null},ee=function(e){let n=f(this,g,q).call(this);if(n===null)throw new d(new l(new a(e,m),new a(": requires a value, but got end of input")));if(c(this,k))throw new d(new l(new a(e,m),new a(': requires a value before "--"')));if(n.startsWith("-"))throw new d(new l(new a(e,m),new a(`: requires a value, but got: "${n}"`)));return n},R=function(e,n){this.getOptionValues(e).push(n)};function re(t){let{cliName:e,commandUsage:n,typoSupport:o}=t,r=new Array;r.push(He(n.metadata.description).computeStyledString(o)),n.metadata.details&&r.push(ge(n.metadata.details).computeStyledString(o)),r.push("");let s=[Je("Usage:").computeStyledString(o),F(e).computeStyledString(o)].concat(n.breadcrumbs.map(i=>{if("positional"in i)return oe(i.positional).computeStyledString(o);if("command"in i)return F(i.command).computeStyledString(o);throw new Error(`Unknown breadcrumb: ${JSON.stringify(i)}`)}));if(r.push(s.join(" ")),n.positionals.length>0){r.push(""),r.push(ne("Positionals:").computeStyledString(o));let i=new I;for(let p of n.positionals){let u=new Array;u.push(new l(A())),u.push(new l(oe(p.label))),p.description&&(u.push(new l(A())),u.push(new l(te(p.description)))),i.pushRow(u)}r.push(...i.computeStyledGrid(o).map(p=>p.join("")))}if(n.subcommands.length>0){r.push(""),r.push(ne("Subcommands:").computeStyledString(o));let i=new I;for(let p of n.subcommands){let u=new Array;u.push(new l(A())),u.push(new l(F(p.name))),p.description&&(u.push(new l(A())),u.push(new l(te(p.description)))),i.pushRow(u)}r.push(...i.computeStyledGrid(o).map(p=>p.join("")))}if(n.options.length>0){r.push(""),r.push(ne("Options:").computeStyledString(o));let i=new I;for(let p of n.options){let u=new Array;u.push(new l(A())),p.short?u.push(new l(F(`-${p.short}`),A(", "))):u.push(new l),p.label?u.push(new l(F(`--${p.long}`),A(" "),oe(p.label))):u.push(new l(F(`--${p.long}`),ge("[=no]"))),p.description&&(u.push(new l(A())),u.push(new l(te(p.description)))),i.pushRow(u)}r.push(...i.computeStyledGrid(o).map(p=>p.join("")))}return r.push(""),r}function He(t){return new a(t,{bold:!0})}function te(t){return new a(t)}function ge(t){return new a(t,{italic:!0,dim:!0})}function Je(t){return new a(t,{fgColor:"darkMagenta",bold:!0})}function ne(t){return new a(t,{fgColor:"darkGreen",bold:!0})}function F(t){return new a(t,m)}function oe(t){return new a(t,y)}function A(t){return new a(t??" ")}async function ze(t,e,n,o,r){let s=new W(e),i=r?.buildVersion;i&&s.registerOption({shorts:[],longs:["version"],valued:!1});let p=r?.usageOnHelp??!0;p&&s.registerOption({shorts:[],longs:["help"],valued:!1});let u=o.createFactory(s);for(;s.consumePositional()!==void 0;);let h=Qe(r?.useColors),O=r?.onLogStdOut??console.log,H=r?.onLogStdErr??console.error,M=r?.onExit??process.exit;if(i&&s.getOptionValues("--version").length>0)return O([t,i].join(" ")),M(0);if(p&&s.getOptionValues("--help").length>0)return O(de(t,u,h)),M(0);try{let N=u.createInstance();try{return await N.executeWithContext(n),M(0)}catch(se){return r?.onExecutionError?r.onExecutionError(se):H(h.computeStyledErrorMessage(se)),M(1)}}catch(N){return H(de(t,u,h)),H(h.computeStyledErrorMessage(N)),M(1)}}function de(t,e,n){return re({cliName:t,commandUsage:e.generateUsage(),typoSupport:n}).join(`
2
- `)}function Qe(t){return t===void 0?P.inferFromProcess():t?P.tty():P.none()}0&&(module.exports={ReaderArgs,TypoError,TypoGrid,TypoString,TypoSupport,TypoText,command,commandChained,commandWithSubcommands,operation,optionFlag,optionRepeatable,optionSingleValue,positionalOptional,positionalRequired,positionalVariadics,runAsCliAndExit,typeBigInt,typeBoolean,typeDate,typeDecode,typeList,typeMapped,typeNumber,typeOneOf,typeString,typeTuple,typeUrl,typoStyleConstants,typoStyleFailure,typoStyleUserInput,usageToStyledLines});
1
+ "use strict";var z=Object.defineProperty;var mt=Object.getOwnPropertyDescriptor;var yt=Object.getOwnPropertyNames;var ht=Object.prototype.hasOwnProperty;var at=t=>{throw TypeError(t)};var ft=(t,e)=>{for(var n in e)z(t,n,{get:e[n],enumerable:!0})},wt=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of yt(e))!ht.call(t,r)&&r!==n&&z(t,r,{get:()=>e[r],enumerable:!(o=mt(e,r))||o.enumerable});return t};var bt=t=>wt(z({},"__esModule",{value:!0}),t);var Q=(t,e,n)=>e.has(t)||at("Cannot "+n);var c=(t,e,n)=>(Q(t,e,"read from private field"),n?n.call(t):e.get(t)),b=(t,e,n)=>e.has(t)?at("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,n),f=(t,e,n,o)=>(Q(t,e,"write to private field"),o?o.call(t,n):e.set(t,n),n),w=(t,e,n)=>(Q(t,e,"access private method"),n);var pt=(t,e,n,o)=>({set _(r){f(t,e,r,n)},get _(){return c(t,e,o)}});var Zt={};ft(Zt,{ReaderArgs:()=>K,TypoError:()=>m,TypoGrid:()=>$,TypoString:()=>i,TypoSupport:()=>P,TypoText:()=>l,command:()=>kt,commandChained:()=>$t,commandWithSubcommands:()=>At,operation:()=>Pt,optionFlag:()=>Kt,optionRepeatable:()=>Nt,optionSingleValue:()=>Dt,positionalOptional:()=>Yt,positionalRequired:()=>jt,positionalVariadics:()=>qt,runAsCliAndExit:()=>Qt,typeBigInt:()=>Gt,typeBoolean:()=>Y,typeDate:()=>Vt,typeDecode:()=>x,typeList:()=>Wt,typeMapped:()=>Lt,typeNumber:()=>Bt,typeOneOf:()=>Ft,typeString:()=>vt,typeTuple:()=>Mt,typeUrl:()=>Et,typoStyleConstants:()=>y,typoStyleFailure:()=>lt,typoStyleUserInput:()=>h,usageToStyledLines:()=>st});module.exports=bt(Zt);var y={fgColor:"darkCyan",bold:!0},h={fgColor:"darkBlue",bold:!0},lt={fgColor:"darkRed",bold:!0},v,W,i=class{constructor(e,n={}){b(this,v);b(this,W);f(this,v,e),f(this,W,n)}getRawString(){return c(this,v)}computeStyledString(e){return e.computeStyledString(c(this,v),c(this,W))}};v=new WeakMap,W=new WeakMap;var S,X=class X{constructor(...e){b(this,S);f(this,S,[]);for(let n of e)n instanceof X?this.pushText(n):n instanceof i?this.pushString(n):typeof n=="string"&&this.pushString(new i(n))}pushString(e){c(this,S).push(e)}pushText(e){for(let n of c(e,S))c(this,S).push(n)}computeStyledString(e){return c(this,S).map(n=>n.computeStyledString(e)).join("")}computeRawString(){return c(this,S).map(e=>e.getRawString()).join("")}computeRawLength(){let e=0;for(let n of c(this,S))e+=n.getRawString().length;return e}};S=new WeakMap;var l=X,A,$=class{constructor(){b(this,A);f(this,A,[])}pushRow(e){c(this,A).push(e)}computeStyledGrid(e){let n=new Array,o=new Array;for(let r of c(this,A))for(let s=0;s<r.length;s++){let p=r[s].computeRawLength();(n[s]===void 0||p>n[s])&&(n[s]=p)}for(let r of c(this,A)){let s=new Array;for(let a=0;a<r.length;a++){let p=r[a],u=p.computeStyledString(e);if(s.push(u),a<r.length-1){let g=p.computeRawLength(),O=" ".repeat(n[a]-g);s.push(O)}}o.push(s)}return o}};A=new WeakMap;var B,Z=class Z extends Error{constructor(n,o){let r=new l;r.pushText(n),o instanceof Error?r.pushString(new i(`: ${o.message}`)):o instanceof Z?(r.pushString(new i(": ")),r.pushText(c(o,B))):o!==void 0&&r.pushString(new i(`: ${String(o)}`));super(r.computeRawString());b(this,B);f(this,B,r)}computeStyledString(n){return c(this,B).computeStyledString(n)}};B=new WeakMap;var m=Z,R,C=class C{constructor(e){b(this,R);f(this,R,e)}static none(){return new C("none")}static tty(){return new C("tty")}static mock(){return new C("mock")}static inferFromProcess(){if(!process)return C.none();if(process.env){if(process.env.FORCE_COLOR==="0")return C.none();if(process.env.FORCE_COLOR)return C.tty();if("NO_COLOR"in process.env)return C.none()}return!process.stdout||!process.stdout.isTTY?C.none():C.tty()}computeStyledString(e,n){if(c(this,R)==="none")return e;if(c(this,R)==="tty"){let o=n.fgColor?Rt[n.fgColor]:"",r=n.bgColor?It[n.bgColor]:"",s=n.bold?Ct:"",a=n.dim?St:"",p=n.italic?Tt:"",u=n.underline?Ut:"",g=n.strikethrough?Ot:"";return`${o}${r}${s}${a}${p}${u}${g}${e}${xt}`}if(c(this,R)==="mock"){let o=n.fgColor?`{${e}}@${n.fgColor}`:e,r=n.bgColor?`{${o}}#${n.bgColor}`:o,s=n.bold?`{${r}}+`:r,a=n.dim?`{${s}}-`:s,p=n.italic?`{${a}}*`:a,u=n.underline?`{${p}}_`:p;return n.strikethrough?`{${u}}~`:u}throw new Error(`Unknown TypoSupport kind: ${c(this,R)}`)}computeStyledErrorMessage(e){return[this.computeStyledString("Error:",lt),e instanceof m?e.computeStyledString(this):e instanceof Error?e.message:String(e)].join(" ")}};R=new WeakMap;var P=C,xt="\x1B[0m",Ct="\x1B[1m",St="\x1B[2m",Tt="\x1B[3m",Ut="\x1B[4m",Ot="\x1B[9m",Rt={darkBlack:"\x1B[30m",darkRed:"\x1B[31m",darkGreen:"\x1B[32m",darkYellow:"\x1B[33m",darkBlue:"\x1B[34m",darkMagenta:"\x1B[35m",darkCyan:"\x1B[36m",darkWhite:"\x1B[37m",brightBlack:"\x1B[90m",brightRed:"\x1B[91m",brightGreen:"\x1B[92m",brightYellow:"\x1B[93m",brightBlue:"\x1B[94m",brightMagenta:"\x1B[95m",brightCyan:"\x1B[96m",brightWhite:"\x1B[97m"},It={darkBlack:"\x1B[40m",darkRed:"\x1B[41m",darkGreen:"\x1B[42m",darkYellow:"\x1B[43m",darkBlue:"\x1B[44m",darkMagenta:"\x1B[45m",darkCyan:"\x1B[46m",darkWhite:"\x1B[47m",brightBlack:"\x1B[100m",brightRed:"\x1B[101m",brightGreen:"\x1B[102m",brightYellow:"\x1B[103m",brightBlue:"\x1B[104m",brightMagenta:"\x1B[105m",brightCyan:"\x1B[106m",brightWhite:"\x1B[107m"};function kt(t,e){return{getInformation(){return t},createFactory(n){function o(){let r=e.generateUsage();return{breadcrumbs:r.positionals.map(s=>j(s.label)),information:t,positionals:r.positionals,subcommands:[],options:r.options}}try{let r=e.createFactory(n),s=n.consumePositional();if(s!==void 0)throw Error(`Unexpected argument: "${s}"`);return{generateUsage:o,createInstance(){let a=r.createInstance();return{async executeWithContext(p){return await a.executeWithContext(p)}}}}}catch(r){return{generateUsage:o,createInstance(){throw r}}}}}}function At(t,e,n){return{getInformation(){return t},createFactory(o){try{let r=e.createFactory(o),s=o.consumePositional();if(s===void 0)throw new m(new l(new i("<SUBCOMMAND>",y),new i(": Is required, but was not provided")));let a=n[s];if(a===void 0)throw new m(new l(new i("<SUBCOMMAND>",y),new i(`: Invalid value: "${s}"`)));let p=a.createFactory(o);return{generateUsage(){let u=e.generateUsage(),g=p.generateUsage();return{breadcrumbs:u.positionals.map(O=>j(O.label)).concat([ut(s)]).concat(g.breadcrumbs),information:g.information,positionals:u.positionals.concat(g.positionals),subcommands:g.subcommands,options:u.options.concat(g.options)}},createInstance(){let u=r.createInstance(),g=p.createInstance();return{async executeWithContext(O){return await g.executeWithContext(await u.executeWithContext(O))}}}}}catch(r){return{generateUsage(){let s=e.generateUsage();return{breadcrumbs:s.positionals.map(a=>j(a.label)).concat([ut("<SUBCOMMAND>")]),information:t,positionals:s.positionals,subcommands:Object.entries(n).map(a=>{let p=a[1].getInformation();return{name:a[0],description:p.description,hint:p.hint}}),options:s.options}},createInstance(){throw r}}}}}}function $t(t,e,n){return{getInformation(){return t},createFactory(o){let r=e.createFactory(o),s=n.createFactory(o);return{generateUsage(){let a=e.generateUsage(),p=s.generateUsage();return{information:p.information,breadcrumbs:a.positionals.map(u=>j(u.label)).concat(p.breadcrumbs),positionals:a.positionals.concat(p.positionals),subcommands:p.subcommands,options:a.options.concat(p.options)}},createInstance(){let a=r.createInstance(),p=s.createInstance();return{async executeWithContext(u){return await p.executeWithContext(await a.executeWithContext(u))}}}}}}}function j(t){return{positional:t}}function ut(t){return{command:t}}function Pt(t,e){return{generateUsage(){let n=new Array;for(let r in t.options){let s=t.options[r];s&&n.push(s.generateUsage())}let o=new Array;for(let r of t.positionals)o.push(r.generateUsage());return{options:n,positionals:o}},createFactory(n){let o={};for(let s in t.options){let a=t.options[s];o[s]=a.createGetter(n)}let r=[];for(let s of t.positionals)r.push(s.consumePositionals(n));return{createInstance(){let s={};for(let a in o)s[a]=o[a].getValue();return{executeWithContext(a){return e(a,{options:s,positionals:r})}}}}}}}var Y={label:"BOOLEAN",decoder(t){let e=t.toLowerCase();if(e==="true"||e==="yes")return!0;if(e==="false"||e==="no")return!1;throw new Error(`Invalid value: "${t}"`)}},Vt={label:"DATE",decoder(t){let e=Date.parse(t);if(isNaN(e))throw new Error(`Invalid ISO_8601 value: "${t}"`);return new Date(e)}},Et={label:"URL",decoder(t){return new URL(t)}},vt={label:"STRING",decoder(t){return t}},Bt={label:"NUMBER",decoder(t){return Number(t)}},Gt={label:"BIGINT",decoder(t){return BigInt(t)}};function Lt(t,e){return{label:e.label,decoder:n=>e.decoder(x(t,n,()=>new l(new i(t.label,h))))}}function Ft(t,e){let n=new Set(e);return{label:t.label,decoder(o){let r=x(t,o,()=>new l(new i(t.label,h)));if(n.has(r))return r;let s=e.map(a=>`"${a}"`).join("|");throw new Error(`Unexpected value: "${o}" (expected: ${s})`)}}}function Mt(t,e=","){return{label:t.map(n=>n.label).join(e),decoder(n){let o=n.split(e,t.length);if(o.length!==t.length)throw new Error(`Invalid tuple parts: ${JSON.stringify(o)}`);return o.map((r,s)=>x(t[s],r,()=>new l(new i(t[s].label,h),new i(`@${s}`))))}}}function Wt(t,e=","){return{label:`${t.label}[${e}${t.label}]...`,decoder(n){return n.split(e).map((o,r)=>x(t,o,()=>new l(new i(t.label,h),new i(`@${r}`))))}}}function x(t,e,n){try{return t.decoder(e)}catch(o){throw new m(n(),o)}}function Kt(t){let e=`<${Y.label}>`;return{generateUsage(){return{description:t.description,hint:t.hint,long:t.long,short:t.short,label:void 0}},createGetter(n){let o=_(n,{...t,valued:!1});return{getValue(){let r=n.getOptionValues(o);if(r.length>1)throw new m(new l(new i(`--${t.long}`,y),new i(": Must not be set multiple times")));let s=r[0];if(s===void 0)try{return t.default?t.default():!1}catch(a){throw new m(new l(new i(`--${t.long}`,y),new i(": Failed to compute default value")),a)}return x(Y,s,()=>new l(new i(`--${t.long}`,y),new i(": "),new i(e,h)))}}}}}function Dt(t){let e=`<${t.label??t.type.label}>`;return{generateUsage(){return{description:t.description,hint:t.hint,long:t.long,short:t.short,label:e}},createGetter(n){let o=_(n,{...t,valued:!0});return{getValue(){let r=n.getOptionValues(o);if(r.length>1)throw new m(new l(new i(`--${t.long}`,y),new i(": Must not be set multiple times")));let s=r[0];if(s===void 0)try{return t.default()}catch(a){throw new m(new l(new i(`--${t.long}`,y),new i(": Failed to compute default value")),a)}return x(t.type,s,()=>new l(new i(`--${t.long}`,y),new i(": "),new i(e,h)))}}}}}function Nt(t){let e=`<${t.label??t.type.label}>`;return{generateUsage(){return{description:t.description,hint:t.hint,long:t.long,short:t.short,label:e}},createGetter(n){let o=_(n,{...t,valued:!0});return{getValue(){return n.getOptionValues(o).map(r=>x(t.type,r,()=>new l(new i(`--${t.long}`,y),new i(": "),new i(e,h))))}}}}}function _(t,e){let{long:n,short:o,aliases:r,valued:s}=e,a=n?[n]:[];r?.longs&&a.push(...r?.longs);let p=o?[o]:[];return r?.shorts&&p.push(...r?.shorts),t.registerOption({longs:a,shorts:p,valued:s})}function jt(t){let e=`<${t.label??t.type.label}>`;return{generateUsage(){return{description:t.description,hint:t.hint,label:e}},consumePositionals(n){let o=n.consumePositional();if(o===void 0)throw new m(new l(new i(e,h),new i(": Is required, but was not provided")));return x(t.type,o,()=>new l(new i(e,h)))}}}function Yt(t){let e=`[${t.label??t.type.label}]`;return{generateUsage(){return{description:t.description,hint:t.hint,label:e}},consumePositionals(n){let o=n.consumePositional();if(o===void 0)try{return t.default()}catch(r){throw new m(new l(new i(e,h),new i(": Failed to compute default value")),r)}return x(t.type,o,()=>new l(new i(e,h)))}}}function qt(t){let e=`[${t.label??t.type.label}]`;return{generateUsage(){return{description:t.description,hint:t.hint,label:`${e}...`+(t.endDelimiter?`["${t.endDelimiter}"]`:"")}},consumePositionals(n){let o=[];for(;;){let r=n.consumePositional();if(r===void 0||r===t.endDelimiter)break;o.push(x(t.type,r,()=>new l(new i(e,h))))}return o}}}var D,G,k,V,T,E,L,d,q,ct,tt,gt,et,I,K=class{constructor(e){b(this,d);b(this,D);b(this,G);b(this,k);b(this,V);b(this,T);b(this,E);b(this,L);f(this,D,e),f(this,G,0),f(this,k,!1),f(this,V,new Map),f(this,T,new Map),f(this,E,new Map),f(this,L,new Map)}registerOption(e){let n=[...e.longs.map(o=>`--${o}`),...e.shorts.map(o=>`-${o}`)].join(", ");for(let o of e.longs){if(c(this,V).has(o))throw new Error(`Option already registered: --${o}`);c(this,V).set(o,n)}for(let o of e.shorts){if(c(this,T).has(o))throw new Error(`Option already registered: -${o}`);for(let r=0;r<o.length;r++){let s=o.slice(0,r);if(c(this,T).has(s))throw new Error(`Option -${o} overlap with shorter option: -${s}`)}for(let r of c(this,T).keys())if(r.startsWith(o))throw new Error(`Option -${o} overlap with longer option: -${r}`);c(this,T).set(o,n)}return c(this,E).set(n,e.valued),c(this,L).set(n,new Array),n}getOptionValues(e){let n=c(this,L).get(e);if(n===void 0)throw new Error(`Unregistered option: ${e}`);return n}consumePositional(){for(;;){let e=w(this,d,q).call(this);if(e===null)return;if(w(this,d,ct).call(this,e))return e}}};D=new WeakMap,G=new WeakMap,k=new WeakMap,V=new WeakMap,T=new WeakMap,E=new WeakMap,L=new WeakMap,d=new WeakSet,q=function(){let e=c(this,D)[c(this,G)];return e===void 0?null:(pt(this,G)._++,!c(this,k)&&e==="--"?(f(this,k,!0),w(this,d,q).call(this)):e)},ct=function(e){if(c(this,k))return!0;if(e.startsWith("--")){let n=e.indexOf("=");return n===-1?w(this,d,tt).call(this,e.slice(2),null):w(this,d,tt).call(this,e.slice(2,n),e.slice(n+1)),!1}if(e.startsWith("-")){let n=1,o=2;for(;o<=e.length;){let r=w(this,d,gt).call(this,e.slice(n,o),e.slice(o));if(r===!0)return!1;r===!1&&(n=o),o++}throw new m(new l(new i(`-${e.slice(n)}`,y),new i(": Unexpected unknown option")))}return!0},tt=function(e,n){let o=`--${e}`,r=c(this,V).get(e);if(r!==void 0)return n!==null?w(this,d,I).call(this,r,n):c(this,E).get(r)?w(this,d,I).call(this,r,w(this,d,et).call(this,o)):w(this,d,I).call(this,r,"true");throw new m(new l(new i(o,y),new i(": Unexpected unknown option")))},gt=function(e,n){let o=c(this,T).get(e);return o!==void 0?n.startsWith("=")?(w(this,d,I).call(this,o,n.slice(1)),!0):c(this,E).get(o)?(n===""?w(this,d,I).call(this,o,w(this,d,et).call(this,`-${e}`)):w(this,d,I).call(this,o,n),!0):(w(this,d,I).call(this,o,"true"),n===""):null},et=function(e){let n=w(this,d,q).call(this);if(n===null)throw new m(new l(new i(e,y),new i(": requires a value, but got end of input")));if(c(this,k))throw new m(new l(new i(e,y),new i(': requires a value before "--"')));if(n.startsWith("-"))throw new m(new l(new i(e,y),new i(`: requires a value, but got: "${n}"`)));return n},I=function(e,n){this.getOptionValues(e).push(n)};function st(t){let{cliName:e,commandUsage:n,typoSupport:o}=t,r=new Array,s=[Jt("Usage:").computeStyledString(o),F(e).computeStyledString(o)].concat(n.breadcrumbs.map(p=>{if("positional"in p)return rt(p.positional).computeStyledString(o);if("command"in p)return F(p.command).computeStyledString(o);throw new Error(`Unknown breadcrumb: ${JSON.stringify(p)}`)}));r.push(s.join(" ")),r.push("");let a=new l;if(a.pushString(Ht(n.information.description)),n.information.hint&&(a.pushString(U(" ")),a.pushString(H(`(${n.information.hint})`))),r.push(a.computeStyledString(o)),n.information.details){let p=H(n.information.details);r.push(p.computeStyledString(o))}if(n.positionals.length>0){r.push(""),r.push(ot("Positionals:").computeStyledString(o));let p=new $;for(let u of n.positionals){let g=new Array;g.push(new l(U(" "))),g.push(new l(rt(u.label))),g.push(...nt(u)),p.pushRow(g)}r.push(...p.computeStyledGrid(o).map(u=>u.join("")))}if(n.subcommands.length>0){r.push(""),r.push(ot("Subcommands:").computeStyledString(o));let p=new $;for(let u of n.subcommands){let g=new Array;g.push(new l(U(" "))),g.push(new l(F(u.name))),g.push(...nt(u)),p.pushRow(g)}r.push(...p.computeStyledGrid(o).map(u=>u.join("")))}if(n.options.length>0){r.push(""),r.push(ot("Options:").computeStyledString(o));let p=new $;for(let u of n.options){let g=new Array;g.push(new l(U(" "))),u.short?g.push(new l(F(`-${u.short}`),U(", "))):g.push(new l),u.label?g.push(new l(F(`--${u.long}`),U(" "),rt(u.label))):g.push(new l(F(`--${u.long}`),H("[=no]"))),g.push(...nt(u)),p.pushRow(g)}r.push(...p.computeStyledGrid(o).map(u=>u.join("")))}return r.push(""),r}function nt(t){let e=[];return t.description&&(e.push(U(" ")),e.push(zt(t.description))),t.hint&&(e.push(U(" ")),e.push(H(`(${t.hint})`))),e.length>0?[new l(U(" "),...e)]:[]}function Ht(t){return new i(t,{bold:!0})}function Jt(t){return new i(t,{fgColor:"darkMagenta",bold:!0})}function zt(t){return new i(t)}function H(t){return new i(t,{italic:!0,dim:!0})}function ot(t){return new i(t,{fgColor:"darkGreen",bold:!0})}function F(t){return new i(t,y)}function rt(t){return new i(t,h)}function U(t){return new i(t)}async function Qt(t,e,n,o,r){let s=new K(e),a=r?.usageOnHelp??!0;a&&s.registerOption({shorts:[],longs:["help"],valued:!1});let p=r?.buildVersion;p&&s.registerOption({shorts:[],longs:["version"],valued:!1});let u=o.createFactory(s);for(;s.consumePositional()!==void 0;);let g=Xt(r?.useColors),O=r?.onLogStdOut??console.log,J=r?.onLogStdErr??console.error,M=r?.onExit??process.exit;if(a&&s.getOptionValues("--help").length>0)return O(dt(t,u,g)),M(0);if(p&&s.getOptionValues("--version").length>0)return O([t,p].join(" ")),M(0);try{let N=u.createInstance();try{return await N.executeWithContext(n),M(0)}catch(it){return r?.onExecutionError?r.onExecutionError(it):J(g.computeStyledErrorMessage(it)),M(1)}}catch(N){return J(dt(t,u,g)),J(g.computeStyledErrorMessage(N)),M(1)}}function dt(t,e,n){return st({cliName:t,commandUsage:e.generateUsage(),typoSupport:n}).join(`
2
+ `)}function Xt(t){return t===void 0?P.inferFromProcess():t?P.tty():P.none()}0&&(module.exports={ReaderArgs,TypoError,TypoGrid,TypoString,TypoSupport,TypoText,command,commandChained,commandWithSubcommands,operation,optionFlag,optionRepeatable,optionSingleValue,positionalOptional,positionalRequired,positionalVariadics,runAsCliAndExit,typeBigInt,typeBoolean,typeDate,typeDecode,typeList,typeMapped,typeNumber,typeOneOf,typeString,typeTuple,typeUrl,typoStyleConstants,typoStyleFailure,typoStyleUserInput,usageToStyledLines});
3
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/Typo.ts","../src/lib/Command.ts","../src/lib/Operation.ts","../src/lib/Type.ts","../src/lib/Option.ts","../src/lib/Positional.ts","../src/lib/Reader.ts","../src/lib/Usage.ts","../src/lib/Run.ts"],"sourcesContent":["export * from \"./lib/Command\";\nexport * from \"./lib/Operation\";\nexport * from \"./lib/Option\";\nexport * from \"./lib/Positional\";\nexport * from \"./lib/Reader\";\nexport * from \"./lib/Run\";\nexport * from \"./lib/Type\";\nexport * from \"./lib/Typo\";\nexport * from \"./lib/Usage\";\n","export type TypoColor =\n | \"darkBlack\"\n | \"darkRed\"\n | \"darkGreen\"\n | \"darkYellow\"\n | \"darkBlue\"\n | \"darkMagenta\"\n | \"darkCyan\"\n | \"darkWhite\"\n | \"brightBlack\"\n | \"brightRed\"\n | \"brightGreen\"\n | \"brightYellow\"\n | \"brightBlue\"\n | \"brightMagenta\"\n | \"brightCyan\"\n | \"brightWhite\";\n\nexport type TypoStyle = {\n fgColor?: TypoColor;\n bgColor?: TypoColor;\n dim?: boolean;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n};\n\nexport const typoStyleConstants: TypoStyle = {\n fgColor: \"darkCyan\",\n bold: true,\n};\nexport const typoStyleUserInput: TypoStyle = {\n fgColor: \"darkBlue\",\n bold: true,\n};\nexport const typoStyleFailure: TypoStyle = {\n fgColor: \"darkRed\",\n bold: true,\n};\n\nexport class TypoString {\n #value: string;\n #typoStyle: TypoStyle;\n constructor(value: string, typoStyle: TypoStyle = {}) {\n this.#value = value;\n this.#typoStyle = typoStyle;\n }\n getRawString(): string {\n return this.#value;\n }\n computeStyledString(typoSupport: TypoSupport): string {\n return typoSupport.computeStyledString(this.#value, this.#typoStyle);\n }\n}\n\nexport class TypoText {\n #typoStrings: Array<TypoString>;\n constructor(...typoParts: Array<TypoText | TypoString | string>) {\n this.#typoStrings = [];\n for (const typoPart of typoParts) {\n if (typoPart instanceof TypoText) {\n this.pushText(typoPart);\n } else if (typoPart instanceof TypoString) {\n this.pushString(typoPart);\n } else if (typeof typoPart === \"string\") {\n this.pushString(new TypoString(typoPart));\n }\n }\n }\n pushString(typoString: TypoString) {\n this.#typoStrings.push(typoString);\n }\n pushText(typoText: TypoText) {\n for (const typoString of typoText.#typoStrings) {\n this.#typoStrings.push(typoString);\n }\n }\n computeStyledString(typoSupport: TypoSupport): string {\n return this.#typoStrings\n .map((t) => t.computeStyledString(typoSupport))\n .join(\"\");\n }\n computeRawString(): string {\n return this.#typoStrings.map((t) => t.getRawString()).join(\"\");\n }\n computeRawLength(): number {\n let length = 0;\n for (const typoString of this.#typoStrings) {\n length += typoString.getRawString().length;\n }\n return length;\n }\n}\n\nexport class TypoGrid {\n #typoRows: Array<Array<TypoText>>;\n constructor() {\n this.#typoRows = [];\n }\n pushRow(cells: Array<TypoText>) {\n this.#typoRows.push(cells);\n }\n computeStyledGrid(typoSupport: TypoSupport): Array<Array<string>> {\n const widths = new Array<number>();\n const printableGrid = new Array<Array<string>>();\n for (const typoGridRow of this.#typoRows) {\n for (\n let typoGridColumnIndex = 0;\n typoGridColumnIndex < typoGridRow.length;\n typoGridColumnIndex++\n ) {\n const typoGridCell = typoGridRow[typoGridColumnIndex]!;\n const width = typoGridCell.computeRawLength();\n if (\n widths[typoGridColumnIndex] === undefined ||\n width > widths[typoGridColumnIndex]!\n ) {\n widths[typoGridColumnIndex] = width;\n }\n }\n }\n for (const typoGridRow of this.#typoRows) {\n const printableGridRow = new Array<string>();\n for (\n let typoGridColumnIndex = 0;\n typoGridColumnIndex < typoGridRow.length;\n typoGridColumnIndex++\n ) {\n const typoGridCell = typoGridRow[typoGridColumnIndex]!;\n const printableGridCell = typoGridCell.computeStyledString(typoSupport);\n printableGridRow.push(printableGridCell);\n if (typoGridColumnIndex < typoGridRow.length - 1) {\n const width = typoGridCell.computeRawLength();\n const padding = \" \".repeat(widths[typoGridColumnIndex]! - width);\n printableGridRow.push(padding);\n }\n }\n printableGrid.push(printableGridRow);\n }\n return printableGrid;\n }\n}\n\nexport class TypoError extends Error {\n #typoText: TypoText;\n constructor(currentTypoText: TypoText, source?: unknown) {\n const typoText = new TypoText();\n typoText.pushText(currentTypoText);\n if (source instanceof Error) {\n typoText.pushString(new TypoString(`: ${source.message}`));\n } else if (source instanceof TypoError) {\n typoText.pushString(new TypoString(\": \"));\n typoText.pushText(source.#typoText);\n } else if (source !== undefined) {\n typoText.pushString(new TypoString(`: ${String(source)}`));\n }\n super(typoText.computeRawString());\n this.#typoText = typoText;\n }\n computeStyledString(typoSupport: TypoSupport): string {\n return this.#typoText.computeStyledString(typoSupport);\n }\n}\n\nexport class TypoSupport {\n #kind: \"none\" | \"tty\" | \"mock\";\n private constructor(kind: \"none\" | \"tty\" | \"mock\") {\n this.#kind = kind;\n }\n static none(): TypoSupport {\n return new TypoSupport(\"none\");\n }\n static tty(): TypoSupport {\n return new TypoSupport(\"tty\");\n }\n static mock(): TypoSupport {\n return new TypoSupport(\"mock\");\n }\n static inferFromProcess(): TypoSupport {\n if (!process) {\n return TypoSupport.none();\n }\n if (process.env) {\n if (process.env[\"FORCE_COLOR\"] === \"0\") {\n return TypoSupport.none();\n }\n if (process.env[\"FORCE_COLOR\"]) {\n return TypoSupport.tty();\n }\n if (\"NO_COLOR\" in process.env) {\n return TypoSupport.none();\n }\n }\n if (!process.stdout || !process.stdout.isTTY) {\n return TypoSupport.none();\n }\n return TypoSupport.tty();\n }\n computeStyledString(value: string, typoStyle: TypoStyle): string {\n if (this.#kind === \"none\") {\n return value;\n }\n if (this.#kind === \"tty\") {\n const fgColorCode = typoStyle.fgColor\n ? ttyCodeFgColors[typoStyle.fgColor]\n : \"\";\n const bgColorCode = typoStyle.bgColor\n ? ttyCodeBgColors[typoStyle.bgColor]\n : \"\";\n const boldCode = typoStyle.bold ? ttyCodeBold : \"\";\n const dimCode = typoStyle.dim ? ttyCodeDim : \"\";\n const italicCode = typoStyle.italic ? ttyCodeItalic : \"\";\n const underlineCode = typoStyle.underline ? ttyCodeUnderline : \"\";\n const strikethroughCode = typoStyle.strikethrough\n ? ttyCodeStrikethrough\n : \"\";\n return `${fgColorCode}${bgColorCode}${boldCode}${dimCode}${italicCode}${underlineCode}${strikethroughCode}${value}${ttyCodeReset}`;\n }\n if (this.#kind === \"mock\") {\n const fgColorPart = typoStyle.fgColor\n ? `{${value}}@${typoStyle.fgColor}`\n : value;\n const bgColorPart = typoStyle.bgColor\n ? `{${fgColorPart}}#${typoStyle.bgColor}`\n : fgColorPart;\n const boldPart = typoStyle.bold ? `{${bgColorPart}}+` : bgColorPart;\n const dimPart = typoStyle.dim ? `{${boldPart}}-` : boldPart;\n const italicPart = typoStyle.italic ? `{${dimPart}}*` : dimPart;\n const underlinePart = typoStyle.underline\n ? `{${italicPart}}_`\n : italicPart;\n const strikethroughPart = typoStyle.strikethrough\n ? `{${underlinePart}}~`\n : underlinePart;\n return strikethroughPart;\n }\n throw new Error(`Unknown TypoSupport kind: ${this.#kind}`);\n }\n computeStyledErrorMessage(error: unknown): string {\n return [\n this.computeStyledString(\"Error:\", typoStyleFailure),\n error instanceof TypoError\n ? error.computeStyledString(this)\n : error instanceof Error\n ? error.message\n : String(error),\n ].join(\" \");\n }\n}\n\nconst ttyCodeReset = \"\\x1b[0m\";\nconst ttyCodeBold = \"\\x1b[1m\";\nconst ttyCodeDim = \"\\x1b[2m\";\nconst ttyCodeItalic = \"\\x1b[3m\";\nconst ttyCodeUnderline = \"\\x1b[4m\";\nconst ttyCodeStrikethrough = \"\\x1b[9m\";\nconst ttyCodeFgColors: Record<TypoColor, string> = {\n darkBlack: \"\\x1b[30m\",\n darkRed: \"\\x1b[31m\",\n darkGreen: \"\\x1b[32m\",\n darkYellow: \"\\x1b[33m\",\n darkBlue: \"\\x1b[34m\",\n darkMagenta: \"\\x1b[35m\",\n darkCyan: \"\\x1b[36m\",\n darkWhite: \"\\x1b[37m\",\n brightBlack: \"\\x1b[90m\",\n brightRed: \"\\x1b[91m\",\n brightGreen: \"\\x1b[92m\",\n brightYellow: \"\\x1b[93m\",\n brightBlue: \"\\x1b[94m\",\n brightMagenta: \"\\x1b[95m\",\n brightCyan: \"\\x1b[96m\",\n brightWhite: \"\\x1b[97m\",\n};\nconst ttyCodeBgColors: Record<TypoColor, string> = {\n darkBlack: \"\\x1b[40m\",\n darkRed: \"\\x1b[41m\",\n darkGreen: \"\\x1b[42m\",\n darkYellow: \"\\x1b[43m\",\n darkBlue: \"\\x1b[44m\",\n darkMagenta: \"\\x1b[45m\",\n darkCyan: \"\\x1b[46m\",\n darkWhite: \"\\x1b[47m\",\n brightBlack: \"\\x1b[100m\",\n brightRed: \"\\x1b[101m\",\n brightGreen: \"\\x1b[102m\",\n brightYellow: \"\\x1b[103m\",\n brightBlue: \"\\x1b[104m\",\n brightMagenta: \"\\x1b[105m\",\n brightCyan: \"\\x1b[106m\",\n brightWhite: \"\\x1b[107m\",\n};\n","import { Operation } from \"./Operation\";\nimport { OptionUsage } from \"./Option\";\nimport { PositionalUsage } from \"./Positional\";\nimport { ReaderArgs } from \"./Reader\";\nimport { TypoError, TypoString, typoStyleConstants, TypoText } from \"./Typo\";\n\nexport type Command<Context, Result> = {\n getDescription(): string | undefined;\n createFactory(readerArgs: ReaderArgs): CommandFactory<Context, Result>;\n};\n\nexport type CommandFactory<Context, Result> = {\n generateUsage(): CommandUsage;\n createInstance(): CommandInstance<Context, Result>;\n};\n\nexport type CommandInstance<Context, Result> = {\n executeWithContext(context: Context): Promise<Result>;\n};\n\nexport type CommandMetadata = {\n description: string;\n details?: string;\n // TODO - printable examples ?\n};\n\nexport type CommandUsage = {\n metadata: CommandMetadata;\n breadcrumbs: Array<CommandUsageBreadcrumb>;\n positionals: Array<PositionalUsage>;\n subcommands: Array<CommandUsageSubcommand>;\n options: Array<OptionUsage>;\n};\n\nexport type CommandUsageBreadcrumb =\n | { positional: string }\n | { command: string };\n\nexport type CommandUsageSubcommand = {\n name: string;\n description: string | undefined;\n};\n\nexport function command<Context, Result>(\n metadata: CommandMetadata,\n operation: Operation<Context, Result>,\n): Command<Context, Result> {\n return {\n getDescription() {\n return metadata.description;\n },\n createFactory(readerArgs: ReaderArgs) {\n function generateUsage(): CommandUsage {\n const operationUsage = operation.generateUsage();\n return {\n metadata,\n breadcrumbs: operationUsage.positionals.map((positional) =>\n breadcrumbPositional(positional.label),\n ),\n positionals: operationUsage.positionals,\n subcommands: [],\n options: operationUsage.options,\n };\n }\n try {\n const operationFactory = operation.createFactory(readerArgs);\n const endPositional = readerArgs.consumePositional();\n if (endPositional !== undefined) {\n throw Error(`Unexpected argument: \"${endPositional}\"`);\n }\n return {\n generateUsage,\n createInstance() {\n const operationInstance = operationFactory.createInstance();\n return {\n async executeWithContext(context: Context) {\n return await operationInstance.executeWithContext(context);\n },\n };\n },\n };\n } catch (error) {\n return {\n generateUsage,\n createInstance() {\n throw error;\n },\n };\n }\n },\n };\n}\n\nexport function commandWithSubcommands<Context, Payload, Result>(\n metadata: CommandMetadata,\n operation: Operation<Context, Payload>,\n subcommands: { [subcommand: Lowercase<string>]: Command<Payload, Result> },\n): Command<Context, Result> {\n return {\n getDescription() {\n return metadata.description;\n },\n createFactory(readerArgs: ReaderArgs) {\n try {\n const operationFactory = operation.createFactory(readerArgs);\n const subcommandName = readerArgs.consumePositional();\n if (subcommandName === undefined) {\n throw new TypoError(\n new TypoText(\n new TypoString(`<SUBCOMMAND>`, typoStyleConstants),\n new TypoString(`: Is required, but was not provided`),\n ),\n );\n }\n const subcommandInput =\n subcommands[subcommandName as Lowercase<string>];\n if (subcommandInput === undefined) {\n throw new TypoError(\n new TypoText(\n new TypoString(`<SUBCOMMAND>`, typoStyleConstants),\n new TypoString(`: Invalid value: \"${subcommandName}\"`),\n ),\n );\n }\n const subcommandFactory = subcommandInput.createFactory(readerArgs);\n return {\n generateUsage() {\n const operationUsage = operation.generateUsage();\n const subcommandUsage = subcommandFactory.generateUsage();\n return {\n metadata: subcommandUsage.metadata,\n breadcrumbs: operationUsage.positionals\n .map((positional) => breadcrumbPositional(positional.label))\n .concat([breadcrumbCommand(subcommandName)])\n .concat(subcommandUsage.breadcrumbs),\n positionals: operationUsage.positionals.concat(\n subcommandUsage.positionals,\n ),\n subcommands: subcommandUsage.subcommands,\n options: operationUsage.options.concat(subcommandUsage.options),\n };\n },\n createInstance() {\n const operationInstance = operationFactory.createInstance();\n const subcommandInstance = subcommandFactory.createInstance();\n return {\n async executeWithContext(context: Context) {\n return await subcommandInstance.executeWithContext(\n await operationInstance.executeWithContext(context),\n );\n },\n };\n },\n };\n } catch (error) {\n return {\n generateUsage() {\n const operationUsage = operation.generateUsage();\n return {\n metadata,\n breadcrumbs: operationUsage.positionals\n .map((positional) => breadcrumbPositional(positional.label))\n .concat([breadcrumbCommand(\"<SUBCOMMAND>\")]),\n positionals: operationUsage.positionals,\n subcommands: Object.entries(subcommands).map(\n ([name, subcommand]) => ({\n name,\n description: subcommand.getDescription(),\n }),\n ),\n options: operationUsage.options,\n };\n },\n createInstance() {\n throw error;\n },\n };\n }\n },\n };\n}\n\nexport function commandChained<Context, Payload, Result>(\n metadata: CommandMetadata,\n operation: Operation<Context, Payload>,\n nextCommand: Command<Payload, Result>,\n): Command<Context, Result> {\n return {\n getDescription() {\n return metadata.description;\n },\n createFactory(readerArgs: ReaderArgs) {\n const operationFactory = operation.createFactory(readerArgs);\n const nextCommandFactory = nextCommand.createFactory(readerArgs);\n return {\n generateUsage() {\n const operationUsage = operation.generateUsage();\n const nextCommandUsage = nextCommandFactory.generateUsage();\n return {\n metadata: nextCommandUsage.metadata,\n breadcrumbs: operationUsage.positionals\n .map((positional) => breadcrumbPositional(positional.label))\n .concat(nextCommandUsage.breadcrumbs),\n positionals: operationUsage.positionals.concat(\n nextCommandUsage.positionals,\n ),\n subcommands: nextCommandUsage.subcommands,\n options: operationUsage.options.concat(nextCommandUsage.options),\n };\n },\n createInstance() {\n const operationInstance = operationFactory.createInstance();\n const nextCommandInstance = nextCommandFactory.createInstance();\n return {\n async executeWithContext(context: Context) {\n return await nextCommandInstance.executeWithContext(\n await operationInstance.executeWithContext(context),\n );\n },\n };\n },\n };\n },\n };\n}\n\nfunction breadcrumbPositional(value: string): CommandUsageBreadcrumb {\n return { positional: value };\n}\n\nfunction breadcrumbCommand(value: string): CommandUsageBreadcrumb {\n return { command: value };\n}\n","import { Option, OptionUsage } from \"./Option\";\nimport { Positional, PositionalUsage } from \"./Positional\";\nimport { ReaderArgs } from \"./Reader\";\n\nexport type Operation<Input, Output> = {\n generateUsage(): OperationUsage;\n createFactory(readerArgs: ReaderArgs): OperationFactory<Input, Output>;\n};\n\nexport type OperationFactory<Input, Output> = {\n createInstance(): OperationInstance<Input, Output>;\n};\n\nexport type OperationInstance<Input, Output> = {\n executeWithContext(input: Input): Promise<Output>;\n};\n\nexport type OperationUsage = {\n options: Array<OptionUsage>;\n positionals: Array<PositionalUsage>;\n};\n\nexport function operation<\n Context,\n Result,\n Options extends { [option: string]: any },\n const Positionals extends Array<any>,\n>(\n inputs: {\n options: { [K in keyof Options]: Option<Options[K]> };\n positionals: { [K in keyof Positionals]: Positional<Positionals[K]> };\n },\n handler: (\n context: Context,\n inputs: { options: Options; positionals: Positionals },\n ) => Promise<Result>,\n): Operation<Context, Result> {\n return {\n generateUsage() {\n const optionsUsage = new Array<OptionUsage>();\n for (const optionKey in inputs.options) {\n const optionInput = inputs.options[optionKey]!;\n if (optionInput) {\n optionsUsage.push(optionInput.generateUsage());\n }\n }\n const positionalsUsage = new Array<PositionalUsage>();\n for (const positionalInput of inputs.positionals) {\n positionalsUsage.push(positionalInput.generateUsage());\n }\n return { options: optionsUsage, positionals: positionalsUsage };\n },\n createFactory(readerArgs: ReaderArgs) {\n const optionsGetters: any = {};\n for (const optionKey in inputs.options) {\n const optionInput = inputs.options[optionKey]!;\n optionsGetters[optionKey] = optionInput.createGetter(readerArgs);\n }\n const positionalsValues: any = [];\n for (const positionalInput of inputs.positionals) {\n positionalsValues.push(positionalInput.consumePositionals(readerArgs));\n }\n return {\n createInstance() {\n const optionsValues: any = {};\n for (const optionKey in optionsGetters) {\n optionsValues[optionKey] = optionsGetters[optionKey]!.getValue();\n }\n return {\n executeWithContext(context: Context) {\n return handler(context, {\n options: optionsValues,\n positionals: positionalsValues,\n });\n },\n };\n },\n };\n },\n };\n}\n","import { TypoError, TypoString, typoStyleUserInput, TypoText } from \"./Typo\";\n\nexport type Type<Value> = {\n // TODO - maybe include an optional hint ??\n label: Uppercase<string>; // TODO - is there a better way to enforce uppercase labels?\n decoder(value: string): Value;\n};\n\nexport const typeBoolean: Type<boolean> = {\n label: \"BOOLEAN\",\n decoder(value: string) {\n const lowerValue = value.toLowerCase();\n if (lowerValue === \"true\" || lowerValue === \"yes\") {\n return true;\n }\n if (lowerValue === \"false\" || lowerValue === \"no\") {\n return false;\n }\n throw new Error(`Invalid value: \"${value}\"`);\n },\n};\n\nexport const typeDate: Type<Date> = {\n label: \"DATE\",\n decoder(value: string) {\n const timestamp = Date.parse(value);\n if (isNaN(timestamp)) {\n throw new Error(`Invalid ISO_8601 value: \"${value}\"`);\n }\n return new Date(timestamp);\n },\n};\n\nexport const typeUrl: Type<URL> = {\n label: \"URL\",\n decoder(value: string) {\n return new URL(value);\n },\n};\n\nexport const typeString: Type<string> = {\n label: \"STRING\",\n decoder(value: string) {\n return value;\n },\n};\n\nexport const typeNumber: Type<number> = {\n label: \"NUMBER\",\n decoder(value: string) {\n return Number(value);\n },\n};\n\nexport const typeBigInt: Type<bigint> = {\n label: \"BIGINT\",\n decoder(value: string) {\n return BigInt(value);\n },\n};\n\nexport function typeMapped<Before, After>(\n before: Type<Before>,\n after: {\n label: Uppercase<string>;\n decoder: (value: Before) => After;\n },\n): Type<After> {\n return {\n label: after.label,\n decoder: (value: string) => {\n return after.decoder(\n typeDecode(\n before,\n value,\n () => new TypoText(new TypoString(before.label, typoStyleUserInput)),\n ),\n );\n },\n };\n}\n\nexport function typeOneOf<Value>(\n type: Type<Value>,\n values: Array<Value>,\n): Type<Value> {\n const valuesSet = new Set(values);\n return {\n label: type.label,\n decoder(value: string) {\n const decoded = typeDecode(\n type,\n value,\n () => new TypoText(new TypoString(type.label, typoStyleUserInput)),\n );\n if (valuesSet.has(decoded)) {\n return decoded;\n }\n const valuesDesc = values.map((v) => `\"${v}\"`).join(\"|\");\n throw new Error(`Unexpected value: \"${value}\" (expected: ${valuesDesc})`);\n },\n };\n}\n\nexport function typeTuple<const Elements extends Array<any>>(\n elementTypes: { [K in keyof Elements]: Type<Elements[K]> },\n separator: string = \",\",\n): Type<Elements> {\n return {\n label: elementTypes\n .map((elementType) => elementType.label)\n .join(separator) as Uppercase<string>,\n decoder(value: string) {\n const parts = value.split(separator, elementTypes.length);\n if (parts.length !== elementTypes.length) {\n throw new Error(`Invalid tuple parts: ${JSON.stringify(parts)}`);\n }\n return parts.map((part, index) =>\n typeDecode(\n elementTypes[index]!,\n part,\n () =>\n new TypoText(\n new TypoString(elementTypes[index]!.label, typoStyleUserInput),\n new TypoString(` at position ${index}`),\n ),\n ),\n ) as Elements;\n },\n };\n}\n\nexport function typeList<Value>(\n elementType: Type<Value>,\n separator: string = \",\",\n): Type<Array<Value>> {\n return {\n label:\n `${elementType.label}[${separator}${elementType.label}]...` as Uppercase<string>,\n decoder(value: string) {\n return value\n .split(separator)\n .map((part, index) =>\n typeDecode(\n elementType,\n part,\n () =>\n new TypoText(\n new TypoString(elementType.label, typoStyleUserInput),\n new TypoString(` at position ${index}`),\n ),\n ),\n );\n },\n };\n}\n\nexport function typeDecode<Value>(\n type: Type<Value>,\n value: string,\n context: () => TypoText,\n): Value {\n try {\n return type.decoder(value);\n } catch (error) {\n throw new TypoError(context(), error);\n }\n}\n","import { ReaderArgs as ReaderOptions } from \"./Reader\";\nimport { Type, typeBoolean, typeDecode } from \"./Type\";\nimport {\n TypoError,\n TypoString,\n typoStyleConstants,\n typoStyleUserInput,\n TypoText,\n} from \"./Typo\";\n\nexport type Option<Value> = {\n generateUsage(): OptionUsage;\n createGetter(readerOptions: ReaderOptions): OptionGetter<Value>;\n};\n\nexport type OptionUsage = {\n description: string | undefined;\n long: Lowercase<string>; // TODO - better type for long option names ?\n short: string | undefined;\n label: Uppercase<string> | undefined;\n // TODO - default value for usage ? but it can be dynamic, so maybe not\n};\n\nexport type OptionGetter<Value> = {\n getValue(): Value;\n};\n\nexport function optionFlag(definition: {\n long: Lowercase<string>;\n short?: string;\n description?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n default?: () => boolean;\n}): Option<boolean> {\n const label = `<${typeBoolean.label}>` as Uppercase<string>;\n return {\n generateUsage() {\n return {\n description: definition.description,\n long: definition.long,\n short: definition.short,\n label: undefined,\n };\n },\n createGetter(readerOptions: ReaderOptions) {\n const key = registerOption(readerOptions, {\n ...definition,\n valued: false,\n });\n return {\n getValue() {\n const optionValues = readerOptions.getOptionValues(key);\n if (optionValues.length > 1) {\n throw new TypoError(\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: Must not be set multiple times`),\n ),\n );\n }\n const optionValue = optionValues[0];\n if (optionValue === undefined) {\n // TODO - scoped error util\n try {\n return definition.default ? definition.default() : false;\n } catch (error) {\n throw new TypoError(\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: Failed to compute default value`),\n ),\n error,\n );\n }\n }\n return typeDecode(\n typeBoolean,\n optionValue,\n () =>\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: `),\n new TypoString(label, typoStyleUserInput),\n ),\n );\n },\n };\n },\n };\n}\n\nexport function optionSingleValue<Value>(definition: {\n long: Lowercase<string>;\n short?: string;\n description?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n label?: Uppercase<string>;\n type: Type<Value>;\n default: () => Value;\n}): Option<Value> {\n const label = `<${definition.label ?? definition.type.label}>`;\n return {\n generateUsage() {\n return {\n description: definition.description,\n long: definition.long,\n short: definition.short,\n label: label as Uppercase<string>,\n };\n },\n createGetter(readerOptions: ReaderOptions) {\n const key = registerOption(readerOptions, {\n ...definition,\n valued: true,\n });\n return {\n getValue() {\n const optionValues = readerOptions.getOptionValues(key);\n if (optionValues.length > 1) {\n throw new TypoError(\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: Must not be set multiple times`),\n ),\n );\n }\n const optionValue = optionValues[0];\n if (optionValue === undefined) {\n try {\n return definition.default();\n } catch (error) {\n throw new TypoError(\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: Failed to compute default value`),\n ),\n error,\n );\n }\n }\n return typeDecode(\n definition.type,\n optionValue,\n () =>\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: `),\n new TypoString(label, typoStyleUserInput),\n ),\n );\n },\n };\n },\n };\n}\n\nexport function optionRepeatable<Value>(definition: {\n long: Lowercase<string>;\n short?: string;\n description?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n label?: Uppercase<string>;\n type: Type<Value>;\n}): Option<Array<Value>> {\n const label = `<${definition.label ?? definition.type.label}>`;\n return {\n generateUsage() {\n // TODO - showcase that it can be repeated ?\n return {\n description: definition.description,\n long: definition.long,\n short: definition.short,\n label: label as Uppercase<string>,\n };\n },\n createGetter(readerOptions: ReaderOptions) {\n const key = registerOption(readerOptions, {\n ...definition,\n valued: true,\n });\n return {\n getValue() {\n return readerOptions\n .getOptionValues(key)\n .map((value) =>\n typeDecode(\n definition.type,\n value,\n () =>\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: `),\n new TypoString(label, typoStyleUserInput),\n ),\n ),\n );\n },\n };\n },\n };\n}\n\nfunction registerOption(\n readerOptions: ReaderOptions,\n definition: {\n long: Lowercase<string>;\n short?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n valued: boolean;\n },\n) {\n const { long, short, aliases, valued } = definition;\n const longs = long ? [long] : [];\n if (aliases?.longs) {\n longs.push(...aliases?.longs);\n }\n const shorts = short ? [short] : [];\n if (aliases?.shorts) {\n shorts.push(...aliases?.shorts);\n }\n return readerOptions.registerOption({ longs, shorts, valued });\n}\n","import { ReaderPositionals } from \"./Reader\";\nimport { Type, typeDecode } from \"./Type\";\nimport { TypoError, TypoString, typoStyleUserInput, TypoText } from \"./Typo\";\n\nexport type Positional<Value> = {\n generateUsage(): PositionalUsage;\n consumePositionals(readerPositionals: ReaderPositionals): Value;\n};\n\nexport type PositionalUsage = {\n description: string | undefined;\n label: Uppercase<string>;\n};\n\nexport function positionalRequired<Value>(definition: {\n description?: string;\n label?: Uppercase<string>;\n type: Type<Value>;\n}): Positional<Value> {\n const label = `<${definition.label ?? definition.type.label}>`;\n return {\n generateUsage() {\n return {\n description: definition.description,\n label: label as Uppercase<string>,\n };\n },\n consumePositionals(readerPositionals: ReaderPositionals) {\n const positional = readerPositionals.consumePositional();\n if (positional === undefined) {\n throw new TypoError(\n new TypoText(\n new TypoString(label, typoStyleUserInput),\n new TypoString(`: Is required, but was not provided`),\n ),\n );\n }\n return typeDecode(\n definition.type,\n positional,\n () => new TypoText(new TypoString(label, typoStyleUserInput)),\n );\n },\n };\n}\n\nexport function positionalOptional<Value>(definition: {\n description?: string;\n label?: Uppercase<string>;\n type: Type<Value>;\n default: () => Value;\n}): Positional<Value> {\n const label = `[${definition.label ?? definition.type.label}]`;\n return {\n generateUsage() {\n return {\n description: definition.description,\n label: label as Uppercase<string>,\n };\n },\n consumePositionals(readerPositionals: ReaderPositionals) {\n const positional = readerPositionals.consumePositional();\n if (positional === undefined) {\n try {\n return definition.default();\n } catch (error) {\n throw new TypoError(\n new TypoText(\n new TypoString(label, typoStyleUserInput),\n new TypoString(`: Failed to compute default value`),\n ),\n error,\n );\n }\n }\n return typeDecode(\n definition.type,\n positional,\n () => new TypoText(new TypoString(label, typoStyleUserInput)),\n );\n },\n };\n}\n\nexport function positionalVariadics<Value>(definition: {\n endDelimiter?: string;\n description?: string;\n label?: Uppercase<string>;\n type: Type<Value>;\n}): Positional<Array<Value>> {\n const label = definition.label ?? definition.type.label;\n return {\n generateUsage() {\n return {\n description: definition.description,\n label: (`[${label}]...` +\n (definition.endDelimiter\n ? `[\"${definition.endDelimiter}\"]`\n : \"\")) as Uppercase<string>,\n };\n },\n consumePositionals(readerPositionals: ReaderPositionals) {\n const positionals: Array<Value> = [];\n while (true) {\n const positional = readerPositionals.consumePositional();\n if (\n positional === undefined ||\n positional === definition.endDelimiter\n ) {\n break;\n }\n positionals.push(\n typeDecode(\n definition.type,\n positional,\n () => new TypoText(new TypoString(label, typoStyleUserInput)),\n ),\n );\n }\n return positionals;\n },\n };\n}\n","import { TypoError, TypoString, typoStyleConstants, TypoText } from \"./Typo\";\n\nexport type ReaderOptionKey = (string | { __brand: \"ReaderOptionKey\" }) & {\n __brand: \"ReaderOptionKey\";\n};\n\nexport type ReaderOptions = {\n registerOption(definition: {\n longs: Array<string>;\n shorts: Array<string>;\n valued: boolean;\n }): ReaderOptionKey;\n getOptionValues(key: ReaderOptionKey): Array<string>;\n};\n\nexport type ReaderPositionals = {\n consumePositional(): string | undefined;\n};\n\nexport class ReaderArgs {\n #args: ReadonlyArray<string>;\n #parsedIndex: number;\n #parsedDouble: boolean;\n #keyByLong: Map<string, ReaderOptionKey>;\n #keyByShort: Map<string, ReaderOptionKey>;\n #valuedByKey: Map<ReaderOptionKey, boolean>;\n #resultByKey: Map<ReaderOptionKey, Array<string>>;\n\n constructor(args: ReadonlyArray<string>) {\n this.#args = args;\n this.#parsedIndex = 0;\n this.#parsedDouble = false;\n this.#keyByLong = new Map();\n this.#keyByShort = new Map();\n this.#valuedByKey = new Map();\n this.#resultByKey = new Map();\n }\n\n registerOption(definition: {\n longs: Array<string>;\n shorts: Array<string>;\n valued: boolean;\n }) {\n const key = [\n ...definition.longs.map((long) => `--${long}`),\n ...definition.shorts.map((short) => `-${short}`),\n ].join(\", \") as ReaderOptionKey;\n for (const long of definition.longs) {\n if (this.#keyByLong.has(long)) {\n throw new Error(`Option already registered: --${long}`);\n }\n this.#keyByLong.set(long, key);\n }\n for (const short of definition.shorts) {\n if (this.#keyByShort.has(short)) {\n throw new Error(`Option already registered: -${short}`);\n }\n for (let i = 0; i < short.length; i++) {\n const shortSlice = short.slice(0, i);\n if (this.#keyByShort.has(shortSlice)) {\n throw new Error(\n `Option -${short} overlap with shorter option: -${shortSlice}`,\n );\n }\n }\n for (const shortOther of this.#keyByShort.keys()) {\n if (shortOther.startsWith(short)) {\n throw new Error(\n `Option -${short} overlap with longer option: -${shortOther}`,\n );\n }\n }\n this.#keyByShort.set(short, key);\n }\n this.#valuedByKey.set(key, definition.valued);\n this.#resultByKey.set(key, new Array<string>());\n return key;\n }\n\n getOptionValues(key: ReaderOptionKey): Array<string> {\n const optionResult = this.#resultByKey.get(key);\n if (optionResult === undefined) {\n throw new Error(`Unregistered option: ${key}`);\n }\n return optionResult;\n }\n\n consumePositional(): string | undefined {\n while (true) {\n const arg = this.#consumeArg();\n if (arg === null) {\n return undefined;\n }\n if (this.#processedAsPositional(arg)) {\n return arg;\n }\n }\n }\n\n #consumeArg(): string | null {\n const arg = this.#args[this.#parsedIndex];\n if (arg === undefined) {\n return null;\n }\n this.#parsedIndex++;\n if (!this.#parsedDouble) {\n if (arg === \"--\") {\n this.#parsedDouble = true;\n return this.#consumeArg();\n }\n }\n return arg;\n }\n\n #processedAsPositional(arg: string): boolean {\n if (this.#parsedDouble) {\n return true;\n }\n if (arg.startsWith(\"--\")) {\n const valueIndexStart = arg.indexOf(\"=\");\n if (valueIndexStart === -1) {\n this.#consumeOptionLong(arg.slice(2), null);\n } else {\n this.#consumeOptionLong(\n arg.slice(2, valueIndexStart),\n arg.slice(valueIndexStart + 1),\n );\n }\n return false;\n }\n if (arg.startsWith(\"-\")) {\n let shortIndexStart = 1;\n let shortIndexEnd = 2;\n while (shortIndexEnd <= arg.length) {\n const result = this.#tryConsumeOptionShort(\n arg.slice(shortIndexStart, shortIndexEnd),\n arg.slice(shortIndexEnd),\n );\n if (result === true) {\n return false;\n }\n if (result === false) {\n shortIndexStart = shortIndexEnd;\n }\n shortIndexEnd++;\n }\n throw new TypoError(\n new TypoText(\n new TypoString(`-${arg.slice(shortIndexStart)}`, typoStyleConstants),\n new TypoString(`: Unexpected unknown option`),\n ),\n );\n }\n return true;\n }\n\n #consumeOptionLong(long: string, direct: string | null): void {\n const constant = `--${long}`;\n const key = this.#keyByLong.get(long);\n if (key !== undefined) {\n if (direct !== null) {\n return this.#acknowledgeOption(key, direct);\n }\n const valued = this.#valuedByKey.get(key);\n if (valued) {\n return this.#acknowledgeOption(key, this.#consumeOptionValue(constant));\n }\n return this.#acknowledgeOption(key, \"true\");\n }\n throw new TypoError(\n new TypoText(\n new TypoString(constant, typoStyleConstants),\n new TypoString(`: Unexpected unknown option`),\n ),\n );\n }\n\n #tryConsumeOptionShort(short: string, rest: string): boolean | null {\n const key = this.#keyByShort.get(short);\n if (key !== undefined) {\n if (rest.startsWith(\"=\")) {\n this.#acknowledgeOption(key, rest.slice(1));\n return true;\n }\n const valued = this.#valuedByKey.get(key);\n if (valued) {\n if (rest === \"\") {\n this.#acknowledgeOption(key, this.#consumeOptionValue(`-${short}`));\n } else {\n this.#acknowledgeOption(key, rest);\n }\n return true;\n }\n this.#acknowledgeOption(key, \"true\");\n return rest === \"\";\n }\n return null;\n }\n\n #consumeOptionValue(constant: string) {\n const arg = this.#consumeArg();\n if (arg === null) {\n throw new TypoError(\n new TypoText(\n new TypoString(constant, typoStyleConstants),\n new TypoString(`: requires a value, but got end of input`),\n ),\n );\n }\n if (this.#parsedDouble) {\n throw new TypoError(\n new TypoText(\n new TypoString(constant, typoStyleConstants),\n new TypoString(`: requires a value before \"--\"`),\n ),\n );\n }\n // TODO - is that weird, could a valid value start with dash ?\n if (arg.startsWith(\"-\")) {\n throw new TypoError(\n new TypoText(\n new TypoString(constant, typoStyleConstants),\n new TypoString(`: requires a value, but got: \"${arg}\"`),\n ),\n );\n }\n return arg;\n }\n\n #acknowledgeOption(key: ReaderOptionKey, value: string) {\n this.getOptionValues(key).push(value);\n }\n}\n","import { CommandUsage } from \"./Command\";\nimport {\n TypoGrid,\n TypoString,\n typoStyleConstants,\n typoStyleUserInput,\n TypoSupport,\n TypoText,\n} from \"./Typo\";\n\nexport function usageToStyledLines(params: {\n cliName: Lowercase<string>;\n commandUsage: CommandUsage;\n typoSupport: TypoSupport;\n}) {\n const { cliName, commandUsage, typoSupport } = params;\n\n const lines = new Array<string>();\n\n // TODO - description stacking for subcommands ?\n lines.push(\n textOverview(commandUsage.metadata.description).computeStyledString(\n typoSupport,\n ),\n );\n if (commandUsage.metadata.details) {\n lines.push(\n textSubtleInfo(commandUsage.metadata.details).computeStyledString(\n typoSupport,\n ),\n );\n }\n\n lines.push(\"\");\n const breadcrumbs = [\n textUsageTitle(\"Usage:\").computeStyledString(typoSupport),\n textConstants(cliName).computeStyledString(typoSupport),\n ].concat(\n commandUsage.breadcrumbs.map((breadcrumb) => {\n if (\"positional\" in breadcrumb) {\n return textUserInput(breadcrumb.positional).computeStyledString(\n typoSupport,\n );\n }\n if (\"command\" in breadcrumb) {\n return textConstants(breadcrumb.command).computeStyledString(\n typoSupport,\n );\n }\n throw new Error(`Unknown breadcrumb: ${JSON.stringify(breadcrumb)}`);\n }),\n );\n lines.push(breadcrumbs.join(\" \"));\n\n if (commandUsage.positionals.length > 0) {\n lines.push(\"\");\n lines.push(textBlockTitle(\"Positionals:\").computeStyledString(typoSupport));\n const typoGrid = new TypoGrid();\n for (const positionalUsage of commandUsage.positionals) {\n const typoGridRow = new Array<TypoText>();\n typoGridRow.push(new TypoText(textDelimiter()));\n typoGridRow.push(new TypoText(textUserInput(positionalUsage.label)));\n if (positionalUsage.description) {\n typoGridRow.push(new TypoText(textDelimiter()));\n typoGridRow.push(\n new TypoText(textUsefulInfo(positionalUsage.description)),\n );\n }\n typoGrid.pushRow(typoGridRow);\n }\n lines.push(\n ...typoGrid.computeStyledGrid(typoSupport).map((row) => row.join(\"\")),\n );\n }\n\n if (commandUsage.subcommands.length > 0) {\n lines.push(\"\");\n lines.push(textBlockTitle(\"Subcommands:\").computeStyledString(typoSupport));\n const typoGrid = new TypoGrid();\n for (const subcommand of commandUsage.subcommands) {\n const typoGridRow = new Array<TypoText>();\n typoGridRow.push(new TypoText(textDelimiter()));\n typoGridRow.push(new TypoText(textConstants(subcommand.name)));\n if (subcommand.description) {\n typoGridRow.push(new TypoText(textDelimiter()));\n typoGridRow.push(new TypoText(textUsefulInfo(subcommand.description)));\n }\n typoGrid.pushRow(typoGridRow);\n }\n lines.push(\n ...typoGrid.computeStyledGrid(typoSupport).map((row) => row.join(\"\")),\n );\n }\n\n if (commandUsage.options.length > 0) {\n lines.push(\"\");\n lines.push(textBlockTitle(\"Options:\").computeStyledString(typoSupport));\n const typoGrid = new TypoGrid();\n for (const optionUsage of commandUsage.options) {\n const typoGridRow = new Array<TypoText>();\n typoGridRow.push(new TypoText(textDelimiter()));\n if (optionUsage.short) {\n typoGridRow.push(\n new TypoText(\n textConstants(`-${optionUsage.short}`),\n textDelimiter(\", \"),\n ),\n );\n } else {\n typoGridRow.push(new TypoText());\n }\n if (optionUsage.label) {\n typoGridRow.push(\n new TypoText(\n textConstants(`--${optionUsage.long}`),\n textDelimiter(\" \"),\n textUserInput(optionUsage.label),\n ),\n );\n } else {\n typoGridRow.push(\n new TypoText(\n textConstants(`--${optionUsage.long}`),\n textSubtleInfo(\"[=no]\"),\n ),\n );\n }\n if (optionUsage.description) {\n typoGridRow.push(new TypoText(textDelimiter()));\n typoGridRow.push(new TypoText(textUsefulInfo(optionUsage.description)));\n }\n typoGrid.pushRow(typoGridRow);\n }\n lines.push(\n ...typoGrid.computeStyledGrid(typoSupport).map((row) => row.join(\"\")),\n );\n }\n\n lines.push(\"\");\n return lines;\n}\n\nfunction textOverview(value: string): TypoString {\n return new TypoString(value, { bold: true });\n}\n\nfunction textUsefulInfo(value: string): TypoString {\n return new TypoString(value);\n}\n\nfunction textSubtleInfo(value: string): TypoString {\n return new TypoString(value, { italic: true, dim: true });\n}\n\nfunction textUsageTitle(value: string): TypoString {\n return new TypoString(value, { fgColor: \"darkMagenta\", bold: true });\n}\n\nfunction textBlockTitle(value: string): TypoString {\n return new TypoString(value, { fgColor: \"darkGreen\", bold: true });\n}\n\nfunction textConstants(value: string): TypoString {\n return new TypoString(value, typoStyleConstants);\n}\n\nfunction textUserInput(value: string): TypoString {\n return new TypoString(value, typoStyleUserInput);\n}\n\nfunction textDelimiter(value?: string): TypoString {\n return new TypoString(value ?? \" \");\n}\n","import { Command, CommandFactory } from \"./Command\";\nimport { ReaderArgs } from \"./Reader\";\nimport { TypoSupport } from \"./Typo\";\nimport { usageToStyledLines } from \"./Usage\";\n\nexport async function runAsCliAndExit<Context>(\n cliName: Lowercase<string>,\n cliArgs: ReadonlyArray<string>,\n context: Context,\n command: Command<Context, void>,\n application?: {\n usageOnHelp?: boolean | undefined;\n buildVersion?: string | undefined;\n useColors?: boolean | undefined;\n onLogStdOut?: ((message: string) => void) | undefined; // TODO - this is a problem, deep commands use console\n onLogStdErr?: ((message: string) => void) | undefined;\n onExit?: ((code: number) => never) | undefined;\n onExecutionError?: ((error: unknown) => void) | undefined;\n },\n): Promise<never> {\n // TODO - can those flags could be implemented as a chained command ??\n const readerArgs = new ReaderArgs(cliArgs);\n const buildVersion = application?.buildVersion;\n if (buildVersion) {\n readerArgs.registerOption({\n shorts: [],\n longs: [\"version\"],\n valued: false,\n });\n }\n const usageOnHelp = application?.usageOnHelp ?? true;\n if (usageOnHelp) {\n readerArgs.registerOption({\n shorts: [],\n longs: [\"help\"],\n valued: false,\n });\n }\n /*\n // TODO - handle completions ?\n readerArgs.registerFlag({\n key: \"completion\",\n shorts: [],\n longs: [\"completion\"],\n });\n */\n const commandFactory = command.createFactory(readerArgs);\n while (true) {\n const positional = readerArgs.consumePositional();\n if (positional === undefined) {\n break;\n }\n }\n const typoSupport = chooseTypoSupport(application?.useColors);\n const onLogStdOut = application?.onLogStdOut ?? console.log;\n const onLogStdErr = application?.onLogStdErr ?? console.error;\n const onExit = application?.onExit ?? process.exit;\n if (buildVersion) {\n if (readerArgs.getOptionValues(\"--version\" as any).length > 0) {\n onLogStdOut([cliName, buildVersion].join(\" \"));\n return onExit(0);\n }\n }\n if (usageOnHelp) {\n if (readerArgs.getOptionValues(\"--help\" as any).length > 0) {\n onLogStdOut(computeUsageString(cliName, commandFactory, typoSupport));\n return onExit(0);\n }\n }\n try {\n const commandInstance = commandFactory.createInstance();\n try {\n await commandInstance.executeWithContext(context);\n return onExit(0);\n } catch (error) {\n if (application?.onExecutionError) {\n application.onExecutionError(error);\n } else {\n onLogStdErr(typoSupport.computeStyledErrorMessage(error));\n }\n return onExit(1);\n }\n } catch (error) {\n onLogStdErr(computeUsageString(cliName, commandFactory, typoSupport));\n onLogStdErr(typoSupport.computeStyledErrorMessage(error));\n return onExit(1);\n }\n}\n\nfunction computeUsageString<Context, Result>(\n cliName: Lowercase<string>,\n commandFactory: CommandFactory<Context, Result>,\n typoSupport: TypoSupport,\n) {\n return usageToStyledLines({\n cliName,\n commandUsage: commandFactory.generateUsage(),\n typoSupport,\n }).join(\"\\n\");\n}\n\nfunction chooseTypoSupport(useColors?: boolean): TypoSupport {\n if (useColors === undefined) {\n return TypoSupport.inferFromProcess();\n }\n return useColors ? TypoSupport.tty() : TypoSupport.none();\n}\n"],"mappings":"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","names":["index_exports","__export","ReaderArgs","TypoError","TypoGrid","TypoString","TypoSupport","TypoText","command","commandChained","commandWithSubcommands","operation","optionFlag","optionRepeatable","optionSingleValue","positionalOptional","positionalRequired","positionalVariadics","runAsCliAndExit","typeBigInt","typeBoolean","typeDate","typeDecode","typeList","typeMapped","typeNumber","typeOneOf","typeString","typeTuple","typeUrl","typoStyleConstants","typoStyleFailure","typoStyleUserInput","usageToStyledLines","__toCommonJS","typoStyleConstants","typoStyleUserInput","typoStyleFailure","_value","_typoStyle","TypoString","value","typoStyle","__privateAdd","__privateSet","__privateGet","typoSupport","_typoStrings","_TypoText","typoParts","typoPart","typoString","typoText","t","length","TypoText","_typoRows","TypoGrid","cells","widths","printableGrid","typoGridRow","typoGridColumnIndex","width","printableGridRow","typoGridCell","printableGridCell","padding","_typoText","_TypoError","currentTypoText","source","TypoError","_kind","_TypoSupport","kind","fgColorCode","ttyCodeFgColors","bgColorCode","ttyCodeBgColors","boldCode","ttyCodeBold","dimCode","ttyCodeDim","italicCode","ttyCodeItalic","underlineCode","ttyCodeUnderline","strikethroughCode","ttyCodeStrikethrough","ttyCodeReset","fgColorPart","bgColorPart","boldPart","dimPart","italicPart","underlinePart","error","TypoSupport","command","metadata","operation","readerArgs","generateUsage","operationUsage","positional","breadcrumbPositional","operationFactory","endPositional","operationInstance","context","error","commandWithSubcommands","subcommands","subcommandName","TypoError","TypoText","TypoString","typoStyleConstants","subcommandInput","subcommandFactory","subcommandUsage","breadcrumbCommand","subcommandInstance","name","subcommand","commandChained","nextCommand","nextCommandFactory","nextCommandUsage","nextCommandInstance","value","operation","inputs","handler","optionsUsage","optionKey","optionInput","positionalsUsage","positionalInput","readerArgs","optionsGetters","positionalsValues","optionsValues","context","typeBoolean","value","lowerValue","typeDate","timestamp","typeUrl","typeString","typeNumber","typeBigInt","typeMapped","before","after","typeDecode","TypoText","TypoString","typoStyleUserInput","typeOneOf","type","values","valuesSet","decoded","valuesDesc","v","typeTuple","elementTypes","separator","elementType","parts","part","index","typeList","context","error","TypoError","optionFlag","definition","label","typeBoolean","readerOptions","key","registerOption","optionValues","TypoError","TypoText","TypoString","typoStyleConstants","optionValue","error","typeDecode","typoStyleUserInput","optionSingleValue","optionRepeatable","value","long","short","aliases","valued","longs","shorts","positionalRequired","definition","label","readerPositionals","positional","TypoError","TypoText","TypoString","typoStyleUserInput","typeDecode","positionalOptional","error","positionalVariadics","positionals","_args","_parsedIndex","_parsedDouble","_keyByLong","_keyByShort","_valuedByKey","_resultByKey","_ReaderArgs_instances","consumeArg_fn","processedAsPositional_fn","consumeOptionLong_fn","tryConsumeOptionShort_fn","consumeOptionValue_fn","acknowledgeOption_fn","ReaderArgs","args","__privateAdd","__privateSet","definition","key","long","short","__privateGet","i","shortSlice","shortOther","optionResult","arg","__privateMethod","__privateWrapper","valueIndexStart","shortIndexStart","shortIndexEnd","result","TypoError","TypoText","TypoString","typoStyleConstants","direct","constant","rest","value","usageToStyledLines","params","cliName","commandUsage","typoSupport","lines","textOverview","textSubtleInfo","breadcrumbs","textUsageTitle","textConstants","breadcrumb","textUserInput","textBlockTitle","typoGrid","TypoGrid","positionalUsage","typoGridRow","TypoText","textDelimiter","textUsefulInfo","row","subcommand","optionUsage","value","TypoString","typoStyleConstants","typoStyleUserInput","runAsCliAndExit","cliName","cliArgs","context","command","application","readerArgs","ReaderArgs","buildVersion","usageOnHelp","commandFactory","typoSupport","chooseTypoSupport","onLogStdOut","onLogStdErr","onExit","computeUsageString","commandInstance","error","usageToStyledLines","useColors","TypoSupport"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/lib/Typo.ts","../src/lib/Command.ts","../src/lib/Operation.ts","../src/lib/Type.ts","../src/lib/Option.ts","../src/lib/Positional.ts","../src/lib/Reader.ts","../src/lib/Usage.ts","../src/lib/Run.ts"],"sourcesContent":["export * from \"./lib/Command\";\nexport * from \"./lib/Operation\";\nexport * from \"./lib/Option\";\nexport * from \"./lib/Positional\";\nexport * from \"./lib/Reader\";\nexport * from \"./lib/Run\";\nexport * from \"./lib/Type\";\nexport * from \"./lib/Typo\";\nexport * from \"./lib/Usage\";\n","export type TypoColor =\n | \"darkBlack\"\n | \"darkRed\"\n | \"darkGreen\"\n | \"darkYellow\"\n | \"darkBlue\"\n | \"darkMagenta\"\n | \"darkCyan\"\n | \"darkWhite\"\n | \"brightBlack\"\n | \"brightRed\"\n | \"brightGreen\"\n | \"brightYellow\"\n | \"brightBlue\"\n | \"brightMagenta\"\n | \"brightCyan\"\n | \"brightWhite\";\n\nexport type TypoStyle = {\n fgColor?: TypoColor;\n bgColor?: TypoColor;\n dim?: boolean;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n};\n\nexport const typoStyleConstants: TypoStyle = {\n fgColor: \"darkCyan\",\n bold: true,\n};\nexport const typoStyleUserInput: TypoStyle = {\n fgColor: \"darkBlue\",\n bold: true,\n};\nexport const typoStyleFailure: TypoStyle = {\n fgColor: \"darkRed\",\n bold: true,\n};\n\nexport class TypoString {\n #value: string;\n #typoStyle: TypoStyle;\n constructor(value: string, typoStyle: TypoStyle = {}) {\n this.#value = value;\n this.#typoStyle = typoStyle;\n }\n getRawString(): string {\n return this.#value;\n }\n computeStyledString(typoSupport: TypoSupport): string {\n return typoSupport.computeStyledString(this.#value, this.#typoStyle);\n }\n}\n\nexport class TypoText {\n #typoStrings: Array<TypoString>;\n constructor(...typoParts: Array<TypoText | TypoString | string>) {\n this.#typoStrings = [];\n for (const typoPart of typoParts) {\n if (typoPart instanceof TypoText) {\n this.pushText(typoPart);\n } else if (typoPart instanceof TypoString) {\n this.pushString(typoPart);\n } else if (typeof typoPart === \"string\") {\n this.pushString(new TypoString(typoPart));\n }\n }\n }\n pushString(typoString: TypoString) {\n this.#typoStrings.push(typoString);\n }\n pushText(typoText: TypoText) {\n for (const typoString of typoText.#typoStrings) {\n this.#typoStrings.push(typoString);\n }\n }\n computeStyledString(typoSupport: TypoSupport): string {\n return this.#typoStrings\n .map((t) => t.computeStyledString(typoSupport))\n .join(\"\");\n }\n computeRawString(): string {\n return this.#typoStrings.map((t) => t.getRawString()).join(\"\");\n }\n computeRawLength(): number {\n let length = 0;\n for (const typoString of this.#typoStrings) {\n length += typoString.getRawString().length;\n }\n return length;\n }\n}\n\nexport class TypoGrid {\n #typoRows: Array<Array<TypoText>>;\n constructor() {\n this.#typoRows = [];\n }\n pushRow(cells: Array<TypoText>) {\n this.#typoRows.push(cells);\n }\n computeStyledGrid(typoSupport: TypoSupport): Array<Array<string>> {\n const widths = new Array<number>();\n const printableGrid = new Array<Array<string>>();\n for (const typoGridRow of this.#typoRows) {\n for (\n let typoGridColumnIndex = 0;\n typoGridColumnIndex < typoGridRow.length;\n typoGridColumnIndex++\n ) {\n const typoGridCell = typoGridRow[typoGridColumnIndex]!;\n const width = typoGridCell.computeRawLength();\n if (\n widths[typoGridColumnIndex] === undefined ||\n width > widths[typoGridColumnIndex]!\n ) {\n widths[typoGridColumnIndex] = width;\n }\n }\n }\n for (const typoGridRow of this.#typoRows) {\n const printableGridRow = new Array<string>();\n for (\n let typoGridColumnIndex = 0;\n typoGridColumnIndex < typoGridRow.length;\n typoGridColumnIndex++\n ) {\n const typoGridCell = typoGridRow[typoGridColumnIndex]!;\n const printableGridCell = typoGridCell.computeStyledString(typoSupport);\n printableGridRow.push(printableGridCell);\n if (typoGridColumnIndex < typoGridRow.length - 1) {\n const width = typoGridCell.computeRawLength();\n const padding = \" \".repeat(widths[typoGridColumnIndex]! - width);\n printableGridRow.push(padding);\n }\n }\n printableGrid.push(printableGridRow);\n }\n return printableGrid;\n }\n}\n\nexport class TypoError extends Error {\n #typoText: TypoText;\n constructor(currentTypoText: TypoText, source?: unknown) {\n const typoText = new TypoText();\n typoText.pushText(currentTypoText);\n if (source instanceof Error) {\n typoText.pushString(new TypoString(`: ${source.message}`));\n } else if (source instanceof TypoError) {\n typoText.pushString(new TypoString(\": \"));\n typoText.pushText(source.#typoText);\n } else if (source !== undefined) {\n typoText.pushString(new TypoString(`: ${String(source)}`));\n }\n super(typoText.computeRawString());\n this.#typoText = typoText;\n }\n computeStyledString(typoSupport: TypoSupport): string {\n return this.#typoText.computeStyledString(typoSupport);\n }\n}\n\nexport class TypoSupport {\n #kind: \"none\" | \"tty\" | \"mock\";\n private constructor(kind: \"none\" | \"tty\" | \"mock\") {\n this.#kind = kind;\n }\n static none(): TypoSupport {\n return new TypoSupport(\"none\");\n }\n static tty(): TypoSupport {\n return new TypoSupport(\"tty\");\n }\n static mock(): TypoSupport {\n return new TypoSupport(\"mock\");\n }\n static inferFromProcess(): TypoSupport {\n if (!process) {\n return TypoSupport.none();\n }\n if (process.env) {\n if (process.env[\"FORCE_COLOR\"] === \"0\") {\n return TypoSupport.none();\n }\n if (process.env[\"FORCE_COLOR\"]) {\n return TypoSupport.tty();\n }\n if (\"NO_COLOR\" in process.env) {\n return TypoSupport.none();\n }\n }\n if (!process.stdout || !process.stdout.isTTY) {\n return TypoSupport.none();\n }\n return TypoSupport.tty();\n }\n computeStyledString(value: string, typoStyle: TypoStyle): string {\n if (this.#kind === \"none\") {\n return value;\n }\n if (this.#kind === \"tty\") {\n const fgColorCode = typoStyle.fgColor\n ? ttyCodeFgColors[typoStyle.fgColor]\n : \"\";\n const bgColorCode = typoStyle.bgColor\n ? ttyCodeBgColors[typoStyle.bgColor]\n : \"\";\n const boldCode = typoStyle.bold ? ttyCodeBold : \"\";\n const dimCode = typoStyle.dim ? ttyCodeDim : \"\";\n const italicCode = typoStyle.italic ? ttyCodeItalic : \"\";\n const underlineCode = typoStyle.underline ? ttyCodeUnderline : \"\";\n const strikethroughCode = typoStyle.strikethrough\n ? ttyCodeStrikethrough\n : \"\";\n return `${fgColorCode}${bgColorCode}${boldCode}${dimCode}${italicCode}${underlineCode}${strikethroughCode}${value}${ttyCodeReset}`;\n }\n if (this.#kind === \"mock\") {\n const fgColorPart = typoStyle.fgColor\n ? `{${value}}@${typoStyle.fgColor}`\n : value;\n const bgColorPart = typoStyle.bgColor\n ? `{${fgColorPart}}#${typoStyle.bgColor}`\n : fgColorPart;\n const boldPart = typoStyle.bold ? `{${bgColorPart}}+` : bgColorPart;\n const dimPart = typoStyle.dim ? `{${boldPart}}-` : boldPart;\n const italicPart = typoStyle.italic ? `{${dimPart}}*` : dimPart;\n const underlinePart = typoStyle.underline\n ? `{${italicPart}}_`\n : italicPart;\n const strikethroughPart = typoStyle.strikethrough\n ? `{${underlinePart}}~`\n : underlinePart;\n return strikethroughPart;\n }\n throw new Error(`Unknown TypoSupport kind: ${this.#kind}`);\n }\n computeStyledErrorMessage(error: unknown): string {\n return [\n this.computeStyledString(\"Error:\", typoStyleFailure),\n error instanceof TypoError\n ? error.computeStyledString(this)\n : error instanceof Error\n ? error.message\n : String(error),\n ].join(\" \");\n }\n}\n\nconst ttyCodeReset = \"\\x1b[0m\";\nconst ttyCodeBold = \"\\x1b[1m\";\nconst ttyCodeDim = \"\\x1b[2m\";\nconst ttyCodeItalic = \"\\x1b[3m\";\nconst ttyCodeUnderline = \"\\x1b[4m\";\nconst ttyCodeStrikethrough = \"\\x1b[9m\";\nconst ttyCodeFgColors: Record<TypoColor, string> = {\n darkBlack: \"\\x1b[30m\",\n darkRed: \"\\x1b[31m\",\n darkGreen: \"\\x1b[32m\",\n darkYellow: \"\\x1b[33m\",\n darkBlue: \"\\x1b[34m\",\n darkMagenta: \"\\x1b[35m\",\n darkCyan: \"\\x1b[36m\",\n darkWhite: \"\\x1b[37m\",\n brightBlack: \"\\x1b[90m\",\n brightRed: \"\\x1b[91m\",\n brightGreen: \"\\x1b[92m\",\n brightYellow: \"\\x1b[93m\",\n brightBlue: \"\\x1b[94m\",\n brightMagenta: \"\\x1b[95m\",\n brightCyan: \"\\x1b[96m\",\n brightWhite: \"\\x1b[97m\",\n};\nconst ttyCodeBgColors: Record<TypoColor, string> = {\n darkBlack: \"\\x1b[40m\",\n darkRed: \"\\x1b[41m\",\n darkGreen: \"\\x1b[42m\",\n darkYellow: \"\\x1b[43m\",\n darkBlue: \"\\x1b[44m\",\n darkMagenta: \"\\x1b[45m\",\n darkCyan: \"\\x1b[46m\",\n darkWhite: \"\\x1b[47m\",\n brightBlack: \"\\x1b[100m\",\n brightRed: \"\\x1b[101m\",\n brightGreen: \"\\x1b[102m\",\n brightYellow: \"\\x1b[103m\",\n brightBlue: \"\\x1b[104m\",\n brightMagenta: \"\\x1b[105m\",\n brightCyan: \"\\x1b[106m\",\n brightWhite: \"\\x1b[107m\",\n};\n","import { Operation } from \"./Operation\";\nimport { OptionUsage } from \"./Option\";\nimport { PositionalUsage } from \"./Positional\";\nimport { ReaderArgs } from \"./Reader\";\nimport { TypoError, TypoString, typoStyleConstants, TypoText } from \"./Typo\";\n\nexport type Command<Context, Result> = {\n getInformation(): CommandInformation;\n createFactory(readerArgs: ReaderArgs): CommandFactory<Context, Result>;\n};\n\nexport type CommandFactory<Context, Result> = {\n generateUsage(): CommandUsage;\n createInstance(): CommandInstance<Context, Result>;\n};\n\nexport type CommandInstance<Context, Result> = {\n executeWithContext(context: Context): Promise<Result>;\n};\n\nexport type CommandInformation = {\n description: string;\n hint?: string;\n details?: string;\n // TODO - printable examples ?\n};\n\nexport type CommandUsage = {\n breadcrumbs: Array<CommandUsageBreadcrumb>;\n information: CommandInformation;\n positionals: Array<PositionalUsage>;\n subcommands: Array<CommandUsageSubcommand>;\n options: Array<OptionUsage>;\n};\n\nexport type CommandUsageBreadcrumb =\n | { positional: string }\n | { command: string };\n\nexport type CommandUsageSubcommand = {\n name: string;\n description: string | undefined;\n hint: string | undefined;\n};\n\nexport function command<Context, Result>(\n information: CommandInformation,\n operation: Operation<Context, Result>,\n): Command<Context, Result> {\n return {\n getInformation() {\n return information;\n },\n createFactory(readerArgs: ReaderArgs) {\n function generateUsage(): CommandUsage {\n const operationUsage = operation.generateUsage();\n return {\n breadcrumbs: operationUsage.positionals.map((positional) =>\n breadcrumbPositional(positional.label),\n ),\n information: information,\n positionals: operationUsage.positionals,\n subcommands: [],\n options: operationUsage.options,\n };\n }\n try {\n const operationFactory = operation.createFactory(readerArgs);\n const endPositional = readerArgs.consumePositional();\n if (endPositional !== undefined) {\n throw Error(`Unexpected argument: \"${endPositional}\"`);\n }\n return {\n generateUsage,\n createInstance() {\n const operationInstance = operationFactory.createInstance();\n return {\n async executeWithContext(context: Context) {\n return await operationInstance.executeWithContext(context);\n },\n };\n },\n };\n } catch (error) {\n return {\n generateUsage,\n createInstance() {\n throw error;\n },\n };\n }\n },\n };\n}\n\nexport function commandWithSubcommands<Context, Payload, Result>(\n information: CommandInformation,\n operation: Operation<Context, Payload>,\n subcommands: { [subcommand: Lowercase<string>]: Command<Payload, Result> },\n): Command<Context, Result> {\n return {\n getInformation() {\n return information;\n },\n createFactory(readerArgs: ReaderArgs) {\n try {\n const operationFactory = operation.createFactory(readerArgs);\n const subcommandName = readerArgs.consumePositional();\n if (subcommandName === undefined) {\n throw new TypoError(\n new TypoText(\n new TypoString(`<SUBCOMMAND>`, typoStyleConstants),\n new TypoString(`: Is required, but was not provided`),\n ),\n );\n }\n const subcommandInput =\n subcommands[subcommandName as Lowercase<string>];\n if (subcommandInput === undefined) {\n throw new TypoError(\n new TypoText(\n new TypoString(`<SUBCOMMAND>`, typoStyleConstants),\n new TypoString(`: Invalid value: \"${subcommandName}\"`),\n ),\n );\n }\n const subcommandFactory = subcommandInput.createFactory(readerArgs);\n return {\n generateUsage() {\n const operationUsage = operation.generateUsage();\n const subcommandUsage = subcommandFactory.generateUsage();\n return {\n breadcrumbs: operationUsage.positionals\n .map((positional) => breadcrumbPositional(positional.label))\n .concat([breadcrumbCommand(subcommandName)])\n .concat(subcommandUsage.breadcrumbs),\n information: subcommandUsage.information,\n positionals: operationUsage.positionals.concat(\n subcommandUsage.positionals,\n ),\n subcommands: subcommandUsage.subcommands,\n options: operationUsage.options.concat(subcommandUsage.options),\n };\n },\n createInstance() {\n const operationInstance = operationFactory.createInstance();\n const subcommandInstance = subcommandFactory.createInstance();\n return {\n async executeWithContext(context: Context) {\n return await subcommandInstance.executeWithContext(\n await operationInstance.executeWithContext(context),\n );\n },\n };\n },\n };\n } catch (error) {\n return {\n generateUsage() {\n const operationUsage = operation.generateUsage();\n return {\n breadcrumbs: operationUsage.positionals\n .map((positional) => breadcrumbPositional(positional.label))\n .concat([breadcrumbCommand(\"<SUBCOMMAND>\")]),\n information: information,\n positionals: operationUsage.positionals,\n subcommands: Object.entries(subcommands).map((subcommand) => {\n const metadata = subcommand[1].getInformation();\n return {\n name: subcommand[0],\n description: metadata.description,\n hint: metadata.hint,\n };\n }),\n options: operationUsage.options,\n };\n },\n createInstance() {\n throw error;\n },\n };\n }\n },\n };\n}\n\nexport function commandChained<Context, Payload, Result>(\n metadata: CommandInformation,\n operation: Operation<Context, Payload>,\n nextCommand: Command<Payload, Result>,\n): Command<Context, Result> {\n return {\n getInformation() {\n return metadata;\n },\n createFactory(readerArgs: ReaderArgs) {\n const operationFactory = operation.createFactory(readerArgs);\n const nextCommandFactory = nextCommand.createFactory(readerArgs);\n return {\n generateUsage() {\n const operationUsage = operation.generateUsage();\n const nextCommandUsage = nextCommandFactory.generateUsage();\n return {\n information: nextCommandUsage.information,\n breadcrumbs: operationUsage.positionals\n .map((positional) => breadcrumbPositional(positional.label))\n .concat(nextCommandUsage.breadcrumbs),\n positionals: operationUsage.positionals.concat(\n nextCommandUsage.positionals,\n ),\n subcommands: nextCommandUsage.subcommands,\n options: operationUsage.options.concat(nextCommandUsage.options),\n };\n },\n createInstance() {\n const operationInstance = operationFactory.createInstance();\n const nextCommandInstance = nextCommandFactory.createInstance();\n return {\n async executeWithContext(context: Context) {\n return await nextCommandInstance.executeWithContext(\n await operationInstance.executeWithContext(context),\n );\n },\n };\n },\n };\n },\n };\n}\n\nfunction breadcrumbPositional(value: string): CommandUsageBreadcrumb {\n return { positional: value };\n}\n\nfunction breadcrumbCommand(value: string): CommandUsageBreadcrumb {\n return { command: value };\n}\n","import { Option, OptionUsage } from \"./Option\";\nimport { Positional, PositionalUsage } from \"./Positional\";\nimport { ReaderArgs } from \"./Reader\";\n\nexport type Operation<Input, Output> = {\n generateUsage(): OperationUsage;\n createFactory(readerArgs: ReaderArgs): OperationFactory<Input, Output>;\n};\n\nexport type OperationFactory<Input, Output> = {\n createInstance(): OperationInstance<Input, Output>;\n};\n\nexport type OperationInstance<Input, Output> = {\n executeWithContext(input: Input): Promise<Output>;\n};\n\nexport type OperationUsage = {\n options: Array<OptionUsage>;\n positionals: Array<PositionalUsage>;\n};\n\nexport function operation<\n Context,\n Result,\n Options extends { [option: string]: any },\n const Positionals extends Array<any>,\n>(\n inputs: {\n options: { [K in keyof Options]: Option<Options[K]> };\n positionals: { [K in keyof Positionals]: Positional<Positionals[K]> };\n },\n handler: (\n context: Context,\n inputs: { options: Options; positionals: Positionals },\n ) => Promise<Result>,\n): Operation<Context, Result> {\n return {\n generateUsage() {\n const optionsUsage = new Array<OptionUsage>();\n for (const optionKey in inputs.options) {\n const optionInput = inputs.options[optionKey]!;\n if (optionInput) {\n optionsUsage.push(optionInput.generateUsage());\n }\n }\n const positionalsUsage = new Array<PositionalUsage>();\n for (const positionalInput of inputs.positionals) {\n positionalsUsage.push(positionalInput.generateUsage());\n }\n return { options: optionsUsage, positionals: positionalsUsage };\n },\n createFactory(readerArgs: ReaderArgs) {\n const optionsGetters: any = {};\n for (const optionKey in inputs.options) {\n const optionInput = inputs.options[optionKey]!;\n optionsGetters[optionKey] = optionInput.createGetter(readerArgs);\n }\n const positionalsValues: any = [];\n for (const positionalInput of inputs.positionals) {\n positionalsValues.push(positionalInput.consumePositionals(readerArgs));\n }\n return {\n createInstance() {\n const optionsValues: any = {};\n for (const optionKey in optionsGetters) {\n optionsValues[optionKey] = optionsGetters[optionKey]!.getValue();\n }\n return {\n executeWithContext(context: Context) {\n return handler(context, {\n options: optionsValues,\n positionals: positionalsValues,\n });\n },\n };\n },\n };\n },\n };\n}\n","import { TypoError, TypoString, typoStyleUserInput, TypoText } from \"./Typo\";\n\nexport type Type<Value> = {\n // TODO - maybe include an optional hint ??\n label: Uppercase<string>; // TODO - is there a better way to enforce uppercase labels?\n decoder(value: string): Value;\n};\n\nexport const typeBoolean: Type<boolean> = {\n label: \"BOOLEAN\",\n decoder(value: string) {\n const lowerValue = value.toLowerCase();\n if (lowerValue === \"true\" || lowerValue === \"yes\") {\n return true;\n }\n if (lowerValue === \"false\" || lowerValue === \"no\") {\n return false;\n }\n throw new Error(`Invalid value: \"${value}\"`);\n },\n};\n\nexport const typeDate: Type<Date> = {\n label: \"DATE\",\n decoder(value: string) {\n const timestamp = Date.parse(value);\n if (isNaN(timestamp)) {\n throw new Error(`Invalid ISO_8601 value: \"${value}\"`);\n }\n return new Date(timestamp);\n },\n};\n\nexport const typeUrl: Type<URL> = {\n label: \"URL\",\n decoder(value: string) {\n return new URL(value);\n },\n};\n\nexport const typeString: Type<string> = {\n label: \"STRING\",\n decoder(value: string) {\n return value;\n },\n};\n\nexport const typeNumber: Type<number> = {\n label: \"NUMBER\",\n decoder(value: string) {\n return Number(value);\n },\n};\n\nexport const typeBigInt: Type<bigint> = {\n label: \"BIGINT\",\n decoder(value: string) {\n return BigInt(value);\n },\n};\n\nexport function typeMapped<Before, After>(\n before: Type<Before>,\n after: {\n label: Uppercase<string>;\n decoder: (value: Before) => After;\n },\n): Type<After> {\n return {\n label: after.label,\n decoder: (value: string) => {\n return after.decoder(\n typeDecode(\n before,\n value,\n () => new TypoText(new TypoString(before.label, typoStyleUserInput)),\n ),\n );\n },\n };\n}\n\nexport function typeOneOf<Value>(\n type: Type<Value>,\n values: Array<Value>,\n): Type<Value> {\n const valuesSet = new Set(values);\n return {\n label: type.label,\n decoder(value: string) {\n const decoded = typeDecode(\n type,\n value,\n () => new TypoText(new TypoString(type.label, typoStyleUserInput)),\n );\n if (valuesSet.has(decoded)) {\n return decoded;\n }\n const valuesDesc = values.map((v) => `\"${v}\"`).join(\"|\");\n throw new Error(`Unexpected value: \"${value}\" (expected: ${valuesDesc})`);\n },\n };\n}\n\nexport function typeTuple<const Elements extends Array<any>>(\n elementTypes: { [K in keyof Elements]: Type<Elements[K]> },\n separator: string = \",\",\n): Type<Elements> {\n return {\n label: elementTypes\n .map((elementType) => elementType.label)\n .join(separator) as Uppercase<string>,\n decoder(value: string) {\n const parts = value.split(separator, elementTypes.length);\n if (parts.length !== elementTypes.length) {\n throw new Error(`Invalid tuple parts: ${JSON.stringify(parts)}`);\n }\n return parts.map((part, index) =>\n typeDecode(\n elementTypes[index]!,\n part,\n () =>\n new TypoText(\n new TypoString(elementTypes[index]!.label, typoStyleUserInput),\n new TypoString(`@${index}`),\n ),\n ),\n ) as Elements;\n },\n };\n}\n\nexport function typeList<Value>(\n elementType: Type<Value>,\n separator: string = \",\",\n): Type<Array<Value>> {\n return {\n label:\n `${elementType.label}[${separator}${elementType.label}]...` as Uppercase<string>,\n decoder(value: string) {\n return value\n .split(separator)\n .map((part, index) =>\n typeDecode(\n elementType,\n part,\n () =>\n new TypoText(\n new TypoString(elementType.label, typoStyleUserInput),\n new TypoString(`@${index}`),\n ),\n ),\n );\n },\n };\n}\n\nexport function typeDecode<Value>(\n type: Type<Value>,\n value: string,\n context: () => TypoText,\n): Value {\n try {\n return type.decoder(value);\n } catch (error) {\n throw new TypoError(context(), error);\n }\n}\n","import { ReaderArgs as ReaderOptions } from \"./Reader\";\nimport { Type, typeBoolean, typeDecode } from \"./Type\";\nimport {\n TypoError,\n TypoString,\n typoStyleConstants,\n typoStyleUserInput,\n TypoText,\n} from \"./Typo\";\n\nexport type Option<Value> = {\n generateUsage(): OptionUsage;\n createGetter(readerOptions: ReaderOptions): OptionGetter<Value>;\n};\n\nexport type OptionUsage = {\n description: string | undefined;\n hint: string | undefined;\n long: Lowercase<string>; // TODO - better type for long option names ?\n short: string | undefined;\n label: Uppercase<string> | undefined;\n};\n\nexport type OptionGetter<Value> = {\n getValue(): Value;\n};\n\nexport function optionFlag(definition: {\n long: Lowercase<string>;\n short?: string;\n description?: string;\n hint?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n default?: () => boolean;\n}): Option<boolean> {\n const label = `<${typeBoolean.label}>` as Uppercase<string>;\n return {\n generateUsage() {\n return {\n description: definition.description,\n hint: definition.hint,\n long: definition.long,\n short: definition.short,\n label: undefined,\n };\n },\n createGetter(readerOptions: ReaderOptions) {\n const key = registerOption(readerOptions, {\n ...definition,\n valued: false,\n });\n return {\n getValue() {\n const optionValues = readerOptions.getOptionValues(key);\n if (optionValues.length > 1) {\n throw new TypoError(\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: Must not be set multiple times`),\n ),\n );\n }\n const optionValue = optionValues[0];\n if (optionValue === undefined) {\n // TODO - scoped error util\n try {\n return definition.default ? definition.default() : false;\n } catch (error) {\n throw new TypoError(\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: Failed to compute default value`),\n ),\n error,\n );\n }\n }\n return typeDecode(\n typeBoolean,\n optionValue,\n () =>\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: `),\n new TypoString(label, typoStyleUserInput),\n ),\n );\n },\n };\n },\n };\n}\n\nexport function optionSingleValue<Value>(definition: {\n long: Lowercase<string>;\n short?: string;\n description?: string;\n hint?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n label?: Uppercase<string>;\n type: Type<Value>;\n default: () => Value;\n}): Option<Value> {\n const label = `<${definition.label ?? definition.type.label}>`;\n return {\n generateUsage() {\n return {\n description: definition.description,\n hint: definition.hint,\n long: definition.long,\n short: definition.short,\n label: label as Uppercase<string>,\n };\n },\n createGetter(readerOptions: ReaderOptions) {\n const key = registerOption(readerOptions, {\n ...definition,\n valued: true,\n });\n return {\n getValue() {\n const optionValues = readerOptions.getOptionValues(key);\n if (optionValues.length > 1) {\n throw new TypoError(\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: Must not be set multiple times`),\n ),\n );\n }\n const optionValue = optionValues[0];\n if (optionValue === undefined) {\n try {\n return definition.default();\n } catch (error) {\n throw new TypoError(\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: Failed to compute default value`),\n ),\n error,\n );\n }\n }\n return typeDecode(\n definition.type,\n optionValue,\n () =>\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: `),\n new TypoString(label, typoStyleUserInput),\n ),\n );\n },\n };\n },\n };\n}\n\nexport function optionRepeatable<Value>(definition: {\n long: Lowercase<string>;\n short?: string;\n description?: string;\n hint?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n label?: Uppercase<string>;\n type: Type<Value>;\n}): Option<Array<Value>> {\n const label = `<${definition.label ?? definition.type.label}>`;\n return {\n generateUsage() {\n // TODO - showcase that it can be repeated ?\n return {\n description: definition.description,\n hint: definition.hint,\n long: definition.long,\n short: definition.short,\n label: label as Uppercase<string>,\n };\n },\n createGetter(readerOptions: ReaderOptions) {\n const key = registerOption(readerOptions, {\n ...definition,\n valued: true,\n });\n return {\n getValue() {\n return readerOptions\n .getOptionValues(key)\n .map((value) =>\n typeDecode(\n definition.type,\n value,\n () =>\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: `),\n new TypoString(label, typoStyleUserInput),\n ),\n ),\n );\n },\n };\n },\n };\n}\n\nfunction registerOption(\n readerOptions: ReaderOptions,\n definition: {\n long: Lowercase<string>;\n short?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n valued: boolean;\n },\n) {\n const { long, short, aliases, valued } = definition;\n const longs = long ? [long] : [];\n if (aliases?.longs) {\n longs.push(...aliases?.longs);\n }\n const shorts = short ? [short] : [];\n if (aliases?.shorts) {\n shorts.push(...aliases?.shorts);\n }\n return readerOptions.registerOption({ longs, shorts, valued });\n}\n","import { ReaderPositionals } from \"./Reader\";\nimport { Type, typeDecode } from \"./Type\";\nimport { TypoError, TypoString, typoStyleUserInput, TypoText } from \"./Typo\";\n\nexport type Positional<Value> = {\n generateUsage(): PositionalUsage;\n consumePositionals(readerPositionals: ReaderPositionals): Value;\n};\n\nexport type PositionalUsage = {\n description: string | undefined;\n hint: string | undefined;\n label: Uppercase<string>;\n};\n\nexport function positionalRequired<Value>(definition: {\n description?: string;\n hint?: string;\n label?: Uppercase<string>;\n type: Type<Value>;\n}): Positional<Value> {\n const label = `<${definition.label ?? definition.type.label}>`;\n return {\n generateUsage() {\n return {\n description: definition.description,\n hint: definition.hint,\n label: label as Uppercase<string>,\n };\n },\n consumePositionals(readerPositionals: ReaderPositionals) {\n const positional = readerPositionals.consumePositional();\n if (positional === undefined) {\n throw new TypoError(\n new TypoText(\n new TypoString(label, typoStyleUserInput),\n new TypoString(`: Is required, but was not provided`),\n ),\n );\n }\n return typeDecode(\n definition.type,\n positional,\n () => new TypoText(new TypoString(label, typoStyleUserInput)),\n );\n },\n };\n}\n\nexport function positionalOptional<Value>(definition: {\n description?: string;\n hint?: string;\n label?: Uppercase<string>;\n type: Type<Value>;\n default: () => Value;\n}): Positional<Value> {\n const label = `[${definition.label ?? definition.type.label}]`;\n return {\n generateUsage() {\n return {\n description: definition.description,\n hint: definition.hint,\n label: label as Uppercase<string>,\n };\n },\n consumePositionals(readerPositionals: ReaderPositionals) {\n const positional = readerPositionals.consumePositional();\n if (positional === undefined) {\n try {\n return definition.default();\n } catch (error) {\n throw new TypoError(\n new TypoText(\n new TypoString(label, typoStyleUserInput),\n new TypoString(`: Failed to compute default value`),\n ),\n error,\n );\n }\n }\n return typeDecode(\n definition.type,\n positional,\n () => new TypoText(new TypoString(label, typoStyleUserInput)),\n );\n },\n };\n}\n\nexport function positionalVariadics<Value>(definition: {\n endDelimiter?: string;\n description?: string;\n hint?: string;\n label?: Uppercase<string>;\n type: Type<Value>;\n}): Positional<Array<Value>> {\n const label = `[${definition.label ?? definition.type.label}]`;\n return {\n generateUsage() {\n return {\n description: definition.description,\n hint: definition.hint,\n label: (`${label}...` +\n (definition.endDelimiter\n ? `[\"${definition.endDelimiter}\"]`\n : \"\")) as Uppercase<string>,\n };\n },\n consumePositionals(readerPositionals: ReaderPositionals) {\n const positionals: Array<Value> = [];\n while (true) {\n const positional = readerPositionals.consumePositional();\n if (\n positional === undefined ||\n positional === definition.endDelimiter\n ) {\n break;\n }\n positionals.push(\n typeDecode(\n definition.type,\n positional,\n () => new TypoText(new TypoString(label, typoStyleUserInput)),\n ),\n );\n }\n return positionals;\n },\n };\n}\n","import { TypoError, TypoString, typoStyleConstants, TypoText } from \"./Typo\";\n\nexport type ReaderOptionKey = (string | { __brand: \"ReaderOptionKey\" }) & {\n __brand: \"ReaderOptionKey\";\n};\n\nexport type ReaderOptions = {\n registerOption(definition: {\n longs: Array<string>;\n shorts: Array<string>;\n valued: boolean;\n }): ReaderOptionKey;\n getOptionValues(key: ReaderOptionKey): Array<string>;\n};\n\nexport type ReaderPositionals = {\n consumePositional(): string | undefined;\n};\n\nexport class ReaderArgs {\n #args: ReadonlyArray<string>;\n #parsedIndex: number;\n #parsedDouble: boolean;\n #keyByLong: Map<string, ReaderOptionKey>;\n #keyByShort: Map<string, ReaderOptionKey>;\n #valuedByKey: Map<ReaderOptionKey, boolean>;\n #resultByKey: Map<ReaderOptionKey, Array<string>>;\n\n constructor(args: ReadonlyArray<string>) {\n this.#args = args;\n this.#parsedIndex = 0;\n this.#parsedDouble = false;\n this.#keyByLong = new Map();\n this.#keyByShort = new Map();\n this.#valuedByKey = new Map();\n this.#resultByKey = new Map();\n }\n\n registerOption(definition: {\n longs: Array<string>;\n shorts: Array<string>;\n valued: boolean;\n }) {\n const key = [\n ...definition.longs.map((long) => `--${long}`),\n ...definition.shorts.map((short) => `-${short}`),\n ].join(\", \") as ReaderOptionKey;\n for (const long of definition.longs) {\n if (this.#keyByLong.has(long)) {\n throw new Error(`Option already registered: --${long}`);\n }\n this.#keyByLong.set(long, key);\n }\n for (const short of definition.shorts) {\n if (this.#keyByShort.has(short)) {\n throw new Error(`Option already registered: -${short}`);\n }\n for (let i = 0; i < short.length; i++) {\n const shortSlice = short.slice(0, i);\n if (this.#keyByShort.has(shortSlice)) {\n throw new Error(\n `Option -${short} overlap with shorter option: -${shortSlice}`,\n );\n }\n }\n for (const shortOther of this.#keyByShort.keys()) {\n if (shortOther.startsWith(short)) {\n throw new Error(\n `Option -${short} overlap with longer option: -${shortOther}`,\n );\n }\n }\n this.#keyByShort.set(short, key);\n }\n this.#valuedByKey.set(key, definition.valued);\n this.#resultByKey.set(key, new Array<string>());\n return key;\n }\n\n getOptionValues(key: ReaderOptionKey): Array<string> {\n const optionResult = this.#resultByKey.get(key);\n if (optionResult === undefined) {\n throw new Error(`Unregistered option: ${key}`);\n }\n return optionResult;\n }\n\n consumePositional(): string | undefined {\n while (true) {\n const arg = this.#consumeArg();\n if (arg === null) {\n return undefined;\n }\n if (this.#processedAsPositional(arg)) {\n return arg;\n }\n }\n }\n\n #consumeArg(): string | null {\n const arg = this.#args[this.#parsedIndex];\n if (arg === undefined) {\n return null;\n }\n this.#parsedIndex++;\n if (!this.#parsedDouble) {\n if (arg === \"--\") {\n this.#parsedDouble = true;\n return this.#consumeArg();\n }\n }\n return arg;\n }\n\n #processedAsPositional(arg: string): boolean {\n if (this.#parsedDouble) {\n return true;\n }\n if (arg.startsWith(\"--\")) {\n const valueIndexStart = arg.indexOf(\"=\");\n if (valueIndexStart === -1) {\n this.#consumeOptionLong(arg.slice(2), null);\n } else {\n this.#consumeOptionLong(\n arg.slice(2, valueIndexStart),\n arg.slice(valueIndexStart + 1),\n );\n }\n return false;\n }\n if (arg.startsWith(\"-\")) {\n let shortIndexStart = 1;\n let shortIndexEnd = 2;\n while (shortIndexEnd <= arg.length) {\n const result = this.#tryConsumeOptionShort(\n arg.slice(shortIndexStart, shortIndexEnd),\n arg.slice(shortIndexEnd),\n );\n if (result === true) {\n return false;\n }\n if (result === false) {\n shortIndexStart = shortIndexEnd;\n }\n shortIndexEnd++;\n }\n throw new TypoError(\n new TypoText(\n new TypoString(`-${arg.slice(shortIndexStart)}`, typoStyleConstants),\n new TypoString(`: Unexpected unknown option`),\n ),\n );\n }\n return true;\n }\n\n #consumeOptionLong(long: string, direct: string | null): void {\n const constant = `--${long}`;\n const key = this.#keyByLong.get(long);\n if (key !== undefined) {\n if (direct !== null) {\n return this.#acknowledgeOption(key, direct);\n }\n const valued = this.#valuedByKey.get(key);\n if (valued) {\n return this.#acknowledgeOption(key, this.#consumeOptionValue(constant));\n }\n return this.#acknowledgeOption(key, \"true\");\n }\n throw new TypoError(\n new TypoText(\n new TypoString(constant, typoStyleConstants),\n new TypoString(`: Unexpected unknown option`),\n ),\n );\n }\n\n #tryConsumeOptionShort(short: string, rest: string): boolean | null {\n const key = this.#keyByShort.get(short);\n if (key !== undefined) {\n if (rest.startsWith(\"=\")) {\n this.#acknowledgeOption(key, rest.slice(1));\n return true;\n }\n const valued = this.#valuedByKey.get(key);\n if (valued) {\n if (rest === \"\") {\n this.#acknowledgeOption(key, this.#consumeOptionValue(`-${short}`));\n } else {\n this.#acknowledgeOption(key, rest);\n }\n return true;\n }\n this.#acknowledgeOption(key, \"true\");\n return rest === \"\";\n }\n return null;\n }\n\n #consumeOptionValue(constant: string) {\n const arg = this.#consumeArg();\n if (arg === null) {\n throw new TypoError(\n new TypoText(\n new TypoString(constant, typoStyleConstants),\n new TypoString(`: requires a value, but got end of input`),\n ),\n );\n }\n if (this.#parsedDouble) {\n throw new TypoError(\n new TypoText(\n new TypoString(constant, typoStyleConstants),\n new TypoString(`: requires a value before \"--\"`),\n ),\n );\n }\n // TODO - is that weird, could a valid value start with dash ?\n if (arg.startsWith(\"-\")) {\n throw new TypoError(\n new TypoText(\n new TypoString(constant, typoStyleConstants),\n new TypoString(`: requires a value, but got: \"${arg}\"`),\n ),\n );\n }\n return arg;\n }\n\n #acknowledgeOption(key: ReaderOptionKey, value: string) {\n this.getOptionValues(key).push(value);\n }\n}\n","import { CommandUsage } from \"./Command\";\nimport {\n TypoGrid,\n TypoString,\n typoStyleConstants,\n typoStyleUserInput,\n TypoSupport,\n TypoText,\n} from \"./Typo\";\n\nexport function usageToStyledLines(params: {\n cliName: Lowercase<string>;\n commandUsage: CommandUsage;\n typoSupport: TypoSupport;\n}) {\n const { cliName, commandUsage, typoSupport } = params;\n\n const lines = new Array<string>();\n\n const breadcrumbs = [\n textUsageTitle(\"Usage:\").computeStyledString(typoSupport),\n textConstants(cliName).computeStyledString(typoSupport),\n ].concat(\n commandUsage.breadcrumbs.map((breadcrumb) => {\n if (\"positional\" in breadcrumb) {\n return textUserInput(breadcrumb.positional).computeStyledString(\n typoSupport,\n );\n }\n if (\"command\" in breadcrumb) {\n return textConstants(breadcrumb.command).computeStyledString(\n typoSupport,\n );\n }\n throw new Error(`Unknown breadcrumb: ${JSON.stringify(breadcrumb)}`);\n }),\n );\n lines.push(breadcrumbs.join(\" \"));\n\n lines.push(\"\");\n const infoText = new TypoText();\n infoText.pushString(textUsageIntro(commandUsage.information.description));\n if (commandUsage.information.hint) {\n infoText.pushString(textDelimiter(\" \"));\n infoText.pushString(textSubtleInfo(`(${commandUsage.information.hint})`));\n }\n lines.push(infoText.computeStyledString(typoSupport));\n if (commandUsage.information.details) {\n const detailsString = textSubtleInfo(commandUsage.information.details);\n lines.push(detailsString.computeStyledString(typoSupport));\n }\n\n if (commandUsage.positionals.length > 0) {\n lines.push(\"\");\n lines.push(textBlockTitle(\"Positionals:\").computeStyledString(typoSupport));\n const typoGrid = new TypoGrid();\n for (const positionalUsage of commandUsage.positionals) {\n const typoGridRow = new Array<TypoText>();\n typoGridRow.push(new TypoText(textDelimiter(\" \")));\n typoGridRow.push(new TypoText(textUserInput(positionalUsage.label)));\n typoGridRow.push(...createInformationals(positionalUsage));\n typoGrid.pushRow(typoGridRow);\n }\n lines.push(\n ...typoGrid.computeStyledGrid(typoSupport).map((row) => row.join(\"\")),\n );\n }\n\n if (commandUsage.subcommands.length > 0) {\n lines.push(\"\");\n lines.push(textBlockTitle(\"Subcommands:\").computeStyledString(typoSupport));\n const typoGrid = new TypoGrid();\n for (const subcommandUsage of commandUsage.subcommands) {\n const typoGridRow = new Array<TypoText>();\n typoGridRow.push(new TypoText(textDelimiter(\" \")));\n typoGridRow.push(new TypoText(textConstants(subcommandUsage.name)));\n typoGridRow.push(...createInformationals(subcommandUsage));\n typoGrid.pushRow(typoGridRow);\n }\n lines.push(\n ...typoGrid.computeStyledGrid(typoSupport).map((row) => row.join(\"\")),\n );\n }\n\n if (commandUsage.options.length > 0) {\n lines.push(\"\");\n lines.push(textBlockTitle(\"Options:\").computeStyledString(typoSupport));\n const typoGrid = new TypoGrid();\n for (const optionUsage of commandUsage.options) {\n const typoGridRow = new Array<TypoText>();\n typoGridRow.push(new TypoText(textDelimiter(\" \")));\n if (optionUsage.short) {\n typoGridRow.push(\n new TypoText(\n textConstants(`-${optionUsage.short}`),\n textDelimiter(\", \"),\n ),\n );\n } else {\n typoGridRow.push(new TypoText());\n }\n if (optionUsage.label) {\n typoGridRow.push(\n new TypoText(\n textConstants(`--${optionUsage.long}`),\n textDelimiter(\" \"),\n textUserInput(optionUsage.label),\n ),\n );\n } else {\n typoGridRow.push(\n new TypoText(\n textConstants(`--${optionUsage.long}`),\n textSubtleInfo(\"[=no]\"),\n ),\n );\n }\n typoGridRow.push(...createInformationals(optionUsage));\n typoGrid.pushRow(typoGridRow);\n }\n lines.push(\n ...typoGrid.computeStyledGrid(typoSupport).map((row) => row.join(\"\")),\n );\n }\n\n lines.push(\"\");\n return lines;\n}\n\nfunction createInformationals(usage: {\n description: string | undefined;\n hint: string | undefined;\n}): Array<TypoText> {\n const informationals = [];\n if (usage.description) {\n informationals.push(textDelimiter(\" \"));\n informationals.push(textUsefulInfo(usage.description));\n }\n if (usage.hint) {\n informationals.push(textDelimiter(\" \"));\n informationals.push(textSubtleInfo(`(${usage.hint})`));\n }\n if (informationals.length > 0) {\n return [new TypoText(textDelimiter(\" \"), ...informationals)];\n }\n return [];\n}\n\nfunction textUsageIntro(value: string): TypoString {\n return new TypoString(value, { bold: true });\n}\n\nfunction textUsageTitle(value: string): TypoString {\n return new TypoString(value, { fgColor: \"darkMagenta\", bold: true });\n}\n\nfunction textUsefulInfo(value: string): TypoString {\n return new TypoString(value);\n}\n\nfunction textSubtleInfo(value: string): TypoString {\n return new TypoString(value, { italic: true, dim: true });\n}\n\nfunction textBlockTitle(value: string): TypoString {\n return new TypoString(value, { fgColor: \"darkGreen\", bold: true });\n}\n\nfunction textConstants(value: string): TypoString {\n return new TypoString(value, typoStyleConstants);\n}\n\nfunction textUserInput(value: string): TypoString {\n return new TypoString(value, typoStyleUserInput);\n}\n\nfunction textDelimiter(value: string): TypoString {\n return new TypoString(value);\n}\n","import { Command, CommandFactory } from \"./Command\";\nimport { ReaderArgs } from \"./Reader\";\nimport { TypoSupport } from \"./Typo\";\nimport { usageToStyledLines } from \"./Usage\";\n\nexport async function runAsCliAndExit<Context>(\n cliName: Lowercase<string>,\n cliArgs: ReadonlyArray<string>,\n context: Context,\n command: Command<Context, void>,\n application?: {\n usageOnHelp?: boolean | undefined;\n buildVersion?: string | undefined;\n useColors?: boolean | undefined;\n onExecutionError?: ((error: unknown) => void) | undefined;\n onLogStdOut?: ((message: string) => void) | undefined; // TODO - this is a problem, deep commands use console\n onLogStdErr?: ((message: string) => void) | undefined;\n onExit?: ((code: number) => never) | undefined;\n },\n): Promise<never> {\n const readerArgs = new ReaderArgs(cliArgs);\n const usageOnHelp = application?.usageOnHelp ?? true;\n if (usageOnHelp) {\n readerArgs.registerOption({\n shorts: [],\n longs: [\"help\"],\n valued: false,\n });\n }\n const buildVersion = application?.buildVersion;\n if (buildVersion) {\n readerArgs.registerOption({\n shorts: [],\n longs: [\"version\"],\n valued: false,\n });\n }\n /*\n // TODO - handle completions ?\n readerArgs.registerFlag({\n key: \"completion\",\n shorts: [],\n longs: [\"completion\"],\n });\n */\n const commandFactory = command.createFactory(readerArgs);\n while (true) {\n const positional = readerArgs.consumePositional();\n if (positional === undefined) {\n break;\n }\n }\n const typoSupport = chooseTypoSupport(application?.useColors);\n const onLogStdOut = application?.onLogStdOut ?? console.log;\n const onLogStdErr = application?.onLogStdErr ?? console.error;\n const onExit = application?.onExit ?? process.exit;\n if (usageOnHelp) {\n if (readerArgs.getOptionValues(\"--help\" as any).length > 0) {\n onLogStdOut(computeUsageString(cliName, commandFactory, typoSupport));\n return onExit(0);\n }\n }\n if (buildVersion) {\n if (readerArgs.getOptionValues(\"--version\" as any).length > 0) {\n onLogStdOut([cliName, buildVersion].join(\" \"));\n return onExit(0);\n }\n }\n try {\n const commandInstance = commandFactory.createInstance();\n try {\n await commandInstance.executeWithContext(context);\n return onExit(0);\n } catch (error) {\n if (application?.onExecutionError) {\n application.onExecutionError(error);\n } else {\n onLogStdErr(typoSupport.computeStyledErrorMessage(error));\n }\n return onExit(1);\n }\n } catch (error) {\n onLogStdErr(computeUsageString(cliName, commandFactory, typoSupport));\n onLogStdErr(typoSupport.computeStyledErrorMessage(error));\n return onExit(1);\n }\n}\n\nfunction computeUsageString<Context, Result>(\n cliName: Lowercase<string>,\n commandFactory: CommandFactory<Context, Result>,\n typoSupport: TypoSupport,\n) {\n return usageToStyledLines({\n cliName,\n commandUsage: commandFactory.generateUsage(),\n typoSupport,\n }).join(\"\\n\");\n}\n\nfunction chooseTypoSupport(useColors?: boolean): TypoSupport {\n if (useColors === undefined) {\n return TypoSupport.inferFromProcess();\n }\n return useColors ? TypoSupport.tty() : TypoSupport.none();\n}\n"],"mappings":"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","names":["index_exports","__export","ReaderArgs","TypoError","TypoGrid","TypoString","TypoSupport","TypoText","command","commandChained","commandWithSubcommands","operation","optionFlag","optionRepeatable","optionSingleValue","positionalOptional","positionalRequired","positionalVariadics","runAsCliAndExit","typeBigInt","typeBoolean","typeDate","typeDecode","typeList","typeMapped","typeNumber","typeOneOf","typeString","typeTuple","typeUrl","typoStyleConstants","typoStyleFailure","typoStyleUserInput","usageToStyledLines","__toCommonJS","typoStyleConstants","typoStyleUserInput","typoStyleFailure","_value","_typoStyle","TypoString","value","typoStyle","__privateAdd","__privateSet","__privateGet","typoSupport","_typoStrings","_TypoText","typoParts","typoPart","typoString","typoText","t","length","TypoText","_typoRows","TypoGrid","cells","widths","printableGrid","typoGridRow","typoGridColumnIndex","width","printableGridRow","typoGridCell","printableGridCell","padding","_typoText","_TypoError","currentTypoText","source","TypoError","_kind","_TypoSupport","kind","fgColorCode","ttyCodeFgColors","bgColorCode","ttyCodeBgColors","boldCode","ttyCodeBold","dimCode","ttyCodeDim","italicCode","ttyCodeItalic","underlineCode","ttyCodeUnderline","strikethroughCode","ttyCodeStrikethrough","ttyCodeReset","fgColorPart","bgColorPart","boldPart","dimPart","italicPart","underlinePart","error","TypoSupport","command","information","operation","readerArgs","generateUsage","operationUsage","positional","breadcrumbPositional","operationFactory","endPositional","operationInstance","context","error","commandWithSubcommands","subcommands","subcommandName","TypoError","TypoText","TypoString","typoStyleConstants","subcommandInput","subcommandFactory","subcommandUsage","breadcrumbCommand","subcommandInstance","subcommand","metadata","commandChained","nextCommand","nextCommandFactory","nextCommandUsage","nextCommandInstance","value","operation","inputs","handler","optionsUsage","optionKey","optionInput","positionalsUsage","positionalInput","readerArgs","optionsGetters","positionalsValues","optionsValues","context","typeBoolean","value","lowerValue","typeDate","timestamp","typeUrl","typeString","typeNumber","typeBigInt","typeMapped","before","after","typeDecode","TypoText","TypoString","typoStyleUserInput","typeOneOf","type","values","valuesSet","decoded","valuesDesc","v","typeTuple","elementTypes","separator","elementType","parts","part","index","typeList","context","error","TypoError","optionFlag","definition","label","typeBoolean","readerOptions","key","registerOption","optionValues","TypoError","TypoText","TypoString","typoStyleConstants","optionValue","error","typeDecode","typoStyleUserInput","optionSingleValue","optionRepeatable","value","long","short","aliases","valued","longs","shorts","positionalRequired","definition","label","readerPositionals","positional","TypoError","TypoText","TypoString","typoStyleUserInput","typeDecode","positionalOptional","error","positionalVariadics","positionals","_args","_parsedIndex","_parsedDouble","_keyByLong","_keyByShort","_valuedByKey","_resultByKey","_ReaderArgs_instances","consumeArg_fn","processedAsPositional_fn","consumeOptionLong_fn","tryConsumeOptionShort_fn","consumeOptionValue_fn","acknowledgeOption_fn","ReaderArgs","args","__privateAdd","__privateSet","definition","key","long","short","__privateGet","i","shortSlice","shortOther","optionResult","arg","__privateMethod","__privateWrapper","valueIndexStart","shortIndexStart","shortIndexEnd","result","TypoError","TypoText","TypoString","typoStyleConstants","direct","constant","rest","value","usageToStyledLines","params","cliName","commandUsage","typoSupport","lines","breadcrumbs","textUsageTitle","textConstants","breadcrumb","textUserInput","infoText","TypoText","textUsageIntro","textDelimiter","textSubtleInfo","detailsString","textBlockTitle","typoGrid","TypoGrid","positionalUsage","typoGridRow","createInformationals","row","subcommandUsage","optionUsage","usage","informationals","textUsefulInfo","value","TypoString","typoStyleConstants","typoStyleUserInput","runAsCliAndExit","cliName","cliArgs","context","command","application","readerArgs","ReaderArgs","usageOnHelp","buildVersion","commandFactory","typoSupport","chooseTypoSupport","onLogStdOut","onLogStdErr","onExit","computeUsageString","commandInstance","error","usageToStyledLines","useColors","TypoSupport"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cli-kiss",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "devDependencies": {
@@ -5,7 +5,7 @@ import { ReaderArgs } from "./Reader";
5
5
  import { TypoError, TypoString, typoStyleConstants, TypoText } from "./Typo";
6
6
 
7
7
  export type Command<Context, Result> = {
8
- getDescription(): string | undefined;
8
+ getInformation(): CommandInformation;
9
9
  createFactory(readerArgs: ReaderArgs): CommandFactory<Context, Result>;
10
10
  };
11
11
 
@@ -18,15 +18,16 @@ export type CommandInstance<Context, Result> = {
18
18
  executeWithContext(context: Context): Promise<Result>;
19
19
  };
20
20
 
21
- export type CommandMetadata = {
21
+ export type CommandInformation = {
22
22
  description: string;
23
+ hint?: string;
23
24
  details?: string;
24
25
  // TODO - printable examples ?
25
26
  };
26
27
 
27
28
  export type CommandUsage = {
28
- metadata: CommandMetadata;
29
29
  breadcrumbs: Array<CommandUsageBreadcrumb>;
30
+ information: CommandInformation;
30
31
  positionals: Array<PositionalUsage>;
31
32
  subcommands: Array<CommandUsageSubcommand>;
32
33
  options: Array<OptionUsage>;
@@ -39,24 +40,25 @@ export type CommandUsageBreadcrumb =
39
40
  export type CommandUsageSubcommand = {
40
41
  name: string;
41
42
  description: string | undefined;
43
+ hint: string | undefined;
42
44
  };
43
45
 
44
46
  export function command<Context, Result>(
45
- metadata: CommandMetadata,
47
+ information: CommandInformation,
46
48
  operation: Operation<Context, Result>,
47
49
  ): Command<Context, Result> {
48
50
  return {
49
- getDescription() {
50
- return metadata.description;
51
+ getInformation() {
52
+ return information;
51
53
  },
52
54
  createFactory(readerArgs: ReaderArgs) {
53
55
  function generateUsage(): CommandUsage {
54
56
  const operationUsage = operation.generateUsage();
55
57
  return {
56
- metadata,
57
58
  breadcrumbs: operationUsage.positionals.map((positional) =>
58
59
  breadcrumbPositional(positional.label),
59
60
  ),
61
+ information: information,
60
62
  positionals: operationUsage.positionals,
61
63
  subcommands: [],
62
64
  options: operationUsage.options,
@@ -92,13 +94,13 @@ export function command<Context, Result>(
92
94
  }
93
95
 
94
96
  export function commandWithSubcommands<Context, Payload, Result>(
95
- metadata: CommandMetadata,
97
+ information: CommandInformation,
96
98
  operation: Operation<Context, Payload>,
97
99
  subcommands: { [subcommand: Lowercase<string>]: Command<Payload, Result> },
98
100
  ): Command<Context, Result> {
99
101
  return {
100
- getDescription() {
101
- return metadata.description;
102
+ getInformation() {
103
+ return information;
102
104
  },
103
105
  createFactory(readerArgs: ReaderArgs) {
104
106
  try {
@@ -128,11 +130,11 @@ export function commandWithSubcommands<Context, Payload, Result>(
128
130
  const operationUsage = operation.generateUsage();
129
131
  const subcommandUsage = subcommandFactory.generateUsage();
130
132
  return {
131
- metadata: subcommandUsage.metadata,
132
133
  breadcrumbs: operationUsage.positionals
133
134
  .map((positional) => breadcrumbPositional(positional.label))
134
135
  .concat([breadcrumbCommand(subcommandName)])
135
136
  .concat(subcommandUsage.breadcrumbs),
137
+ information: subcommandUsage.information,
136
138
  positionals: operationUsage.positionals.concat(
137
139
  subcommandUsage.positionals,
138
140
  ),
@@ -157,17 +159,19 @@ export function commandWithSubcommands<Context, Payload, Result>(
157
159
  generateUsage() {
158
160
  const operationUsage = operation.generateUsage();
159
161
  return {
160
- metadata,
161
162
  breadcrumbs: operationUsage.positionals
162
163
  .map((positional) => breadcrumbPositional(positional.label))
163
164
  .concat([breadcrumbCommand("<SUBCOMMAND>")]),
165
+ information: information,
164
166
  positionals: operationUsage.positionals,
165
- subcommands: Object.entries(subcommands).map(
166
- ([name, subcommand]) => ({
167
- name,
168
- description: subcommand.getDescription(),
169
- }),
170
- ),
167
+ subcommands: Object.entries(subcommands).map((subcommand) => {
168
+ const metadata = subcommand[1].getInformation();
169
+ return {
170
+ name: subcommand[0],
171
+ description: metadata.description,
172
+ hint: metadata.hint,
173
+ };
174
+ }),
171
175
  options: operationUsage.options,
172
176
  };
173
177
  },
@@ -181,13 +185,13 @@ export function commandWithSubcommands<Context, Payload, Result>(
181
185
  }
182
186
 
183
187
  export function commandChained<Context, Payload, Result>(
184
- metadata: CommandMetadata,
188
+ metadata: CommandInformation,
185
189
  operation: Operation<Context, Payload>,
186
190
  nextCommand: Command<Payload, Result>,
187
191
  ): Command<Context, Result> {
188
192
  return {
189
- getDescription() {
190
- return metadata.description;
193
+ getInformation() {
194
+ return metadata;
191
195
  },
192
196
  createFactory(readerArgs: ReaderArgs) {
193
197
  const operationFactory = operation.createFactory(readerArgs);
@@ -197,7 +201,7 @@ export function commandChained<Context, Payload, Result>(
197
201
  const operationUsage = operation.generateUsage();
198
202
  const nextCommandUsage = nextCommandFactory.generateUsage();
199
203
  return {
200
- metadata: nextCommandUsage.metadata,
204
+ information: nextCommandUsage.information,
201
205
  breadcrumbs: operationUsage.positionals
202
206
  .map((positional) => breadcrumbPositional(positional.label))
203
207
  .concat(nextCommandUsage.breadcrumbs),
package/src/lib/Option.ts CHANGED
@@ -15,10 +15,10 @@ export type Option<Value> = {
15
15
 
16
16
  export type OptionUsage = {
17
17
  description: string | undefined;
18
+ hint: string | undefined;
18
19
  long: Lowercase<string>; // TODO - better type for long option names ?
19
20
  short: string | undefined;
20
21
  label: Uppercase<string> | undefined;
21
- // TODO - default value for usage ? but it can be dynamic, so maybe not
22
22
  };
23
23
 
24
24
  export type OptionGetter<Value> = {
@@ -29,6 +29,7 @@ export function optionFlag(definition: {
29
29
  long: Lowercase<string>;
30
30
  short?: string;
31
31
  description?: string;
32
+ hint?: string;
32
33
  aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };
33
34
  default?: () => boolean;
34
35
  }): Option<boolean> {
@@ -37,6 +38,7 @@ export function optionFlag(definition: {
37
38
  generateUsage() {
38
39
  return {
39
40
  description: definition.description,
41
+ hint: definition.hint,
40
42
  long: definition.long,
41
43
  short: definition.short,
42
44
  label: undefined,
@@ -93,6 +95,7 @@ export function optionSingleValue<Value>(definition: {
93
95
  long: Lowercase<string>;
94
96
  short?: string;
95
97
  description?: string;
98
+ hint?: string;
96
99
  aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };
97
100
  label?: Uppercase<string>;
98
101
  type: Type<Value>;
@@ -103,6 +106,7 @@ export function optionSingleValue<Value>(definition: {
103
106
  generateUsage() {
104
107
  return {
105
108
  description: definition.description,
109
+ hint: definition.hint,
106
110
  long: definition.long,
107
111
  short: definition.short,
108
112
  label: label as Uppercase<string>,
@@ -158,6 +162,7 @@ export function optionRepeatable<Value>(definition: {
158
162
  long: Lowercase<string>;
159
163
  short?: string;
160
164
  description?: string;
165
+ hint?: string;
161
166
  aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };
162
167
  label?: Uppercase<string>;
163
168
  type: Type<Value>;
@@ -168,6 +173,7 @@ export function optionRepeatable<Value>(definition: {
168
173
  // TODO - showcase that it can be repeated ?
169
174
  return {
170
175
  description: definition.description,
176
+ hint: definition.hint,
171
177
  long: definition.long,
172
178
  short: definition.short,
173
179
  label: label as Uppercase<string>,
@@ -9,11 +9,13 @@ export type Positional<Value> = {
9
9
 
10
10
  export type PositionalUsage = {
11
11
  description: string | undefined;
12
+ hint: string | undefined;
12
13
  label: Uppercase<string>;
13
14
  };
14
15
 
15
16
  export function positionalRequired<Value>(definition: {
16
17
  description?: string;
18
+ hint?: string;
17
19
  label?: Uppercase<string>;
18
20
  type: Type<Value>;
19
21
  }): Positional<Value> {
@@ -22,6 +24,7 @@ export function positionalRequired<Value>(definition: {
22
24
  generateUsage() {
23
25
  return {
24
26
  description: definition.description,
27
+ hint: definition.hint,
25
28
  label: label as Uppercase<string>,
26
29
  };
27
30
  },
@@ -46,6 +49,7 @@ export function positionalRequired<Value>(definition: {
46
49
 
47
50
  export function positionalOptional<Value>(definition: {
48
51
  description?: string;
52
+ hint?: string;
49
53
  label?: Uppercase<string>;
50
54
  type: Type<Value>;
51
55
  default: () => Value;
@@ -55,6 +59,7 @@ export function positionalOptional<Value>(definition: {
55
59
  generateUsage() {
56
60
  return {
57
61
  description: definition.description,
62
+ hint: definition.hint,
58
63
  label: label as Uppercase<string>,
59
64
  };
60
65
  },
@@ -85,15 +90,17 @@ export function positionalOptional<Value>(definition: {
85
90
  export function positionalVariadics<Value>(definition: {
86
91
  endDelimiter?: string;
87
92
  description?: string;
93
+ hint?: string;
88
94
  label?: Uppercase<string>;
89
95
  type: Type<Value>;
90
96
  }): Positional<Array<Value>> {
91
- const label = definition.label ?? definition.type.label;
97
+ const label = `[${definition.label ?? definition.type.label}]`;
92
98
  return {
93
99
  generateUsage() {
94
100
  return {
95
101
  description: definition.description,
96
- label: (`[${label}]...` +
102
+ hint: definition.hint,
103
+ label: (`${label}...` +
97
104
  (definition.endDelimiter
98
105
  ? `["${definition.endDelimiter}"]`
99
106
  : "")) as Uppercase<string>,
package/src/lib/Run.ts CHANGED
@@ -12,27 +12,26 @@ export async function runAsCliAndExit<Context>(
12
12
  usageOnHelp?: boolean | undefined;
13
13
  buildVersion?: string | undefined;
14
14
  useColors?: boolean | undefined;
15
+ onExecutionError?: ((error: unknown) => void) | undefined;
15
16
  onLogStdOut?: ((message: string) => void) | undefined; // TODO - this is a problem, deep commands use console
16
17
  onLogStdErr?: ((message: string) => void) | undefined;
17
18
  onExit?: ((code: number) => never) | undefined;
18
- onExecutionError?: ((error: unknown) => void) | undefined;
19
19
  },
20
20
  ): Promise<never> {
21
- // TODO - can those flags could be implemented as a chained command ??
22
21
  const readerArgs = new ReaderArgs(cliArgs);
23
- const buildVersion = application?.buildVersion;
24
- if (buildVersion) {
22
+ const usageOnHelp = application?.usageOnHelp ?? true;
23
+ if (usageOnHelp) {
25
24
  readerArgs.registerOption({
26
25
  shorts: [],
27
- longs: ["version"],
26
+ longs: ["help"],
28
27
  valued: false,
29
28
  });
30
29
  }
31
- const usageOnHelp = application?.usageOnHelp ?? true;
32
- if (usageOnHelp) {
30
+ const buildVersion = application?.buildVersion;
31
+ if (buildVersion) {
33
32
  readerArgs.registerOption({
34
33
  shorts: [],
35
- longs: ["help"],
34
+ longs: ["version"],
36
35
  valued: false,
37
36
  });
38
37
  }
@@ -55,18 +54,18 @@ export async function runAsCliAndExit<Context>(
55
54
  const onLogStdOut = application?.onLogStdOut ?? console.log;
56
55
  const onLogStdErr = application?.onLogStdErr ?? console.error;
57
56
  const onExit = application?.onExit ?? process.exit;
58
- if (buildVersion) {
59
- if (readerArgs.getOptionValues("--version" as any).length > 0) {
60
- onLogStdOut([cliName, buildVersion].join(" "));
61
- return onExit(0);
62
- }
63
- }
64
57
  if (usageOnHelp) {
65
58
  if (readerArgs.getOptionValues("--help" as any).length > 0) {
66
59
  onLogStdOut(computeUsageString(cliName, commandFactory, typoSupport));
67
60
  return onExit(0);
68
61
  }
69
62
  }
63
+ if (buildVersion) {
64
+ if (readerArgs.getOptionValues("--version" as any).length > 0) {
65
+ onLogStdOut([cliName, buildVersion].join(" "));
66
+ return onExit(0);
67
+ }
68
+ }
70
69
  try {
71
70
  const commandInstance = commandFactory.createInstance();
72
71
  try {
package/src/lib/Type.ts CHANGED
@@ -122,7 +122,7 @@ export function typeTuple<const Elements extends Array<any>>(
122
122
  () =>
123
123
  new TypoText(
124
124
  new TypoString(elementTypes[index]!.label, typoStyleUserInput),
125
- new TypoString(` at position ${index}`),
125
+ new TypoString(`@${index}`),
126
126
  ),
127
127
  ),
128
128
  ) as Elements;
@@ -147,7 +147,7 @@ export function typeList<Value>(
147
147
  () =>
148
148
  new TypoText(
149
149
  new TypoString(elementType.label, typoStyleUserInput),
150
- new TypoString(` at position ${index}`),
150
+ new TypoString(`@${index}`),
151
151
  ),
152
152
  ),
153
153
  );
package/src/lib/Usage.ts CHANGED
@@ -17,21 +17,6 @@ export function usageToStyledLines(params: {
17
17
 
18
18
  const lines = new Array<string>();
19
19
 
20
- // TODO - description stacking for subcommands ?
21
- lines.push(
22
- textOverview(commandUsage.metadata.description).computeStyledString(
23
- typoSupport,
24
- ),
25
- );
26
- if (commandUsage.metadata.details) {
27
- lines.push(
28
- textSubtleInfo(commandUsage.metadata.details).computeStyledString(
29
- typoSupport,
30
- ),
31
- );
32
- }
33
-
34
- lines.push("");
35
20
  const breadcrumbs = [
36
21
  textUsageTitle("Usage:").computeStyledString(typoSupport),
37
22
  textConstants(cliName).computeStyledString(typoSupport),
@@ -52,20 +37,28 @@ export function usageToStyledLines(params: {
52
37
  );
53
38
  lines.push(breadcrumbs.join(" "));
54
39
 
40
+ lines.push("");
41
+ const infoText = new TypoText();
42
+ infoText.pushString(textUsageIntro(commandUsage.information.description));
43
+ if (commandUsage.information.hint) {
44
+ infoText.pushString(textDelimiter(" "));
45
+ infoText.pushString(textSubtleInfo(`(${commandUsage.information.hint})`));
46
+ }
47
+ lines.push(infoText.computeStyledString(typoSupport));
48
+ if (commandUsage.information.details) {
49
+ const detailsString = textSubtleInfo(commandUsage.information.details);
50
+ lines.push(detailsString.computeStyledString(typoSupport));
51
+ }
52
+
55
53
  if (commandUsage.positionals.length > 0) {
56
54
  lines.push("");
57
55
  lines.push(textBlockTitle("Positionals:").computeStyledString(typoSupport));
58
56
  const typoGrid = new TypoGrid();
59
57
  for (const positionalUsage of commandUsage.positionals) {
60
58
  const typoGridRow = new Array<TypoText>();
61
- typoGridRow.push(new TypoText(textDelimiter()));
59
+ typoGridRow.push(new TypoText(textDelimiter(" ")));
62
60
  typoGridRow.push(new TypoText(textUserInput(positionalUsage.label)));
63
- if (positionalUsage.description) {
64
- typoGridRow.push(new TypoText(textDelimiter()));
65
- typoGridRow.push(
66
- new TypoText(textUsefulInfo(positionalUsage.description)),
67
- );
68
- }
61
+ typoGridRow.push(...createInformationals(positionalUsage));
69
62
  typoGrid.pushRow(typoGridRow);
70
63
  }
71
64
  lines.push(
@@ -77,14 +70,11 @@ export function usageToStyledLines(params: {
77
70
  lines.push("");
78
71
  lines.push(textBlockTitle("Subcommands:").computeStyledString(typoSupport));
79
72
  const typoGrid = new TypoGrid();
80
- for (const subcommand of commandUsage.subcommands) {
73
+ for (const subcommandUsage of commandUsage.subcommands) {
81
74
  const typoGridRow = new Array<TypoText>();
82
- typoGridRow.push(new TypoText(textDelimiter()));
83
- typoGridRow.push(new TypoText(textConstants(subcommand.name)));
84
- if (subcommand.description) {
85
- typoGridRow.push(new TypoText(textDelimiter()));
86
- typoGridRow.push(new TypoText(textUsefulInfo(subcommand.description)));
87
- }
75
+ typoGridRow.push(new TypoText(textDelimiter(" ")));
76
+ typoGridRow.push(new TypoText(textConstants(subcommandUsage.name)));
77
+ typoGridRow.push(...createInformationals(subcommandUsage));
88
78
  typoGrid.pushRow(typoGridRow);
89
79
  }
90
80
  lines.push(
@@ -98,7 +88,7 @@ export function usageToStyledLines(params: {
98
88
  const typoGrid = new TypoGrid();
99
89
  for (const optionUsage of commandUsage.options) {
100
90
  const typoGridRow = new Array<TypoText>();
101
- typoGridRow.push(new TypoText(textDelimiter()));
91
+ typoGridRow.push(new TypoText(textDelimiter(" ")));
102
92
  if (optionUsage.short) {
103
93
  typoGridRow.push(
104
94
  new TypoText(
@@ -125,10 +115,7 @@ export function usageToStyledLines(params: {
125
115
  ),
126
116
  );
127
117
  }
128
- if (optionUsage.description) {
129
- typoGridRow.push(new TypoText(textDelimiter()));
130
- typoGridRow.push(new TypoText(textUsefulInfo(optionUsage.description)));
131
- }
118
+ typoGridRow.push(...createInformationals(optionUsage));
132
119
  typoGrid.pushRow(typoGridRow);
133
120
  }
134
121
  lines.push(
@@ -140,10 +127,33 @@ export function usageToStyledLines(params: {
140
127
  return lines;
141
128
  }
142
129
 
143
- function textOverview(value: string): TypoString {
130
+ function createInformationals(usage: {
131
+ description: string | undefined;
132
+ hint: string | undefined;
133
+ }): Array<TypoText> {
134
+ const informationals = [];
135
+ if (usage.description) {
136
+ informationals.push(textDelimiter(" "));
137
+ informationals.push(textUsefulInfo(usage.description));
138
+ }
139
+ if (usage.hint) {
140
+ informationals.push(textDelimiter(" "));
141
+ informationals.push(textSubtleInfo(`(${usage.hint})`));
142
+ }
143
+ if (informationals.length > 0) {
144
+ return [new TypoText(textDelimiter(" "), ...informationals)];
145
+ }
146
+ return [];
147
+ }
148
+
149
+ function textUsageIntro(value: string): TypoString {
144
150
  return new TypoString(value, { bold: true });
145
151
  }
146
152
 
153
+ function textUsageTitle(value: string): TypoString {
154
+ return new TypoString(value, { fgColor: "darkMagenta", bold: true });
155
+ }
156
+
147
157
  function textUsefulInfo(value: string): TypoString {
148
158
  return new TypoString(value);
149
159
  }
@@ -152,10 +162,6 @@ function textSubtleInfo(value: string): TypoString {
152
162
  return new TypoString(value, { italic: true, dim: true });
153
163
  }
154
164
 
155
- function textUsageTitle(value: string): TypoString {
156
- return new TypoString(value, { fgColor: "darkMagenta", bold: true });
157
- }
158
-
159
165
  function textBlockTitle(value: string): TypoString {
160
166
  return new TypoString(value, { fgColor: "darkGreen", bold: true });
161
167
  }
@@ -168,6 +174,6 @@ function textUserInput(value: string): TypoString {
168
174
  return new TypoString(value, typoStyleUserInput);
169
175
  }
170
176
 
171
- function textDelimiter(value?: string): TypoString {
172
- return new TypoString(value ?? " ");
177
+ function textDelimiter(value: string): TypoString {
178
+ return new TypoString(value);
173
179
  }
@@ -94,6 +94,7 @@ const cmd = commandWithSubcommands<string, any, any>(
94
94
  sub2: command(
95
95
  {
96
96
  description: "Subcommand 2 description",
97
+ hint: "Subcommand 2 hint",
97
98
  details: [
98
99
  "Subcommand 2 details.",
99
100
  "Second line of subcommand 2 details.",
@@ -106,6 +107,7 @@ const cmd = commandWithSubcommands<string, any, any>(
106
107
  long: "dudu",
107
108
  type: typeString,
108
109
  default: () => "duduDefault",
110
+ hint: "Dudu option hint",
109
111
  description: "Dudu option description",
110
112
  }),
111
113
  },
@@ -118,6 +120,7 @@ const cmd = commandWithSubcommands<string, any, any>(
118
120
  positionalOptional({
119
121
  label: "OPT-POS",
120
122
  description: "Optional positional string",
123
+ hint: "Optional positional hint",
121
124
  type: typeString,
122
125
  default: () => "42",
123
126
  }),
@@ -148,18 +151,18 @@ it("run", async () => {
148
151
  */
149
152
 
150
153
  expect(usage1).toStrictEqual([
154
+ "{{Usage:}@darkMagenta}+ {{my-cli}@darkCyan}+ {{<POS-1>}@darkBlue}+ {{<POS-2>}@darkBlue}+ {{<SUBCOMMAND>}@darkCyan}+",
155
+ "",
151
156
  "{Root command description}+",
152
157
  "{{Root command details. Second line of root command details.}-}*",
153
158
  "",
154
- "{{Usage:}@darkMagenta}+ {{my-cli}@darkCyan}+ {{<POS-1>}@darkBlue}+ {{<POS-2>}@darkBlue}+ {{<SUBCOMMAND>}@darkCyan}+",
155
- "",
156
159
  "{{Positionals:}@darkGreen}+",
157
160
  " {{<POS-1>}@darkBlue}+ Required positional number 1",
158
161
  " {{<POS-2>}@darkBlue}+ Required positional number 2",
159
162
  "",
160
163
  "{{Subcommands:}@darkGreen}+",
161
164
  " {{sub1}@darkCyan}+ Subcommand 1 description",
162
- " {{sub2}@darkCyan}+ Subcommand 2 description",
165
+ " {{sub2}@darkCyan}+ Subcommand 2 description {{(Subcommand 2 hint)}-}*",
163
166
  "",
164
167
  "{{Options:}@darkGreen}+",
165
168
  " {{-b}@darkCyan}+, {{--boolean-flag}@darkCyan}+{{[=no]}-}* Root boolean-flag description",
@@ -168,11 +171,11 @@ it("run", async () => {
168
171
  "",
169
172
  ]);
170
173
  expect(usage2).toStrictEqual([
174
+ "{{Usage:}@darkMagenta}+ {{my-cli}@darkCyan}+ {{<POS-1>}@darkBlue}+ {{<POS-2>}@darkBlue}+ {{sub1}@darkCyan}+ {{<POS-STRING>}@darkBlue}+",
175
+ "",
171
176
  "{Subcommand 1 description}+",
172
177
  "{{Subcommand 1 details. Second line of subcommand 1 details.}-}*",
173
178
  "",
174
- "{{Usage:}@darkMagenta}+ {{my-cli}@darkCyan}+ {{<POS-1>}@darkBlue}+ {{<POS-2>}@darkBlue}+ {{sub1}@darkCyan}+ {{<POS-STRING>}@darkBlue}+",
175
- "",
176
179
  "{{Positionals:}@darkGreen}+",
177
180
  " {{<POS-1>}@darkBlue}+ Required positional number 1",
178
181
  " {{<POS-2>}@darkBlue}+ Required positional number 2",
@@ -185,23 +188,23 @@ it("run", async () => {
185
188
  "",
186
189
  ]);
187
190
  expect(usage3).toStrictEqual([
188
- "{Subcommand 2 description}+",
189
- "{{Subcommand 2 details. Second line of subcommand 2 details.}-}*",
190
- "",
191
191
  "{{Usage:}@darkMagenta}+ {{my-cli}@darkCyan}+ {{<POS-1>}@darkBlue}+ {{<POS-2>}@darkBlue}+ {{sub2}@darkCyan}+ {{<POS-NUMBER>}@darkBlue}+ {{[OPT-POS]}@darkBlue}+ {{[VARIADIC]...}@darkBlue}+",
192
192
  "",
193
+ "{Subcommand 2 description}+ {{(Subcommand 2 hint)}-}*",
194
+ "{{Subcommand 2 details. Second line of subcommand 2 details.}-}*",
195
+ "",
193
196
  "{{Positionals:}@darkGreen}+",
194
197
  " {{<POS-1>}@darkBlue}+ Required positional number 1",
195
198
  " {{<POS-2>}@darkBlue}+ Required positional number 2",
196
199
  " {{<POS-NUMBER>}@darkBlue}+ Required positional number",
197
- " {{[OPT-POS]}@darkBlue}+ Optional positional string",
200
+ " {{[OPT-POS]}@darkBlue}+ Optional positional string {{(Optional positional hint)}-}*",
198
201
  " {{[VARIADIC]...}@darkBlue}+ Variadic positionals strings",
199
202
  "",
200
203
  "{{Options:}@darkGreen}+",
201
204
  " {{-b}@darkCyan}+, {{--boolean-flag}@darkCyan}+{{[=no]}-}* Root boolean-flag description",
202
205
  " {{-s}@darkCyan}+, {{--string-option}@darkCyan}+ {{<COOL-STUFF>}@darkBlue}+ Root string-option description",
203
206
  " {{--complex-option}@darkCyan}+ {{<NUMBER,STRING[,STRING]...>}@darkBlue}+ Root complex-option description",
204
- " {{--dudu}@darkCyan}+ {{<STRING>}@darkBlue}+ Dudu option description",
207
+ " {{--dudu}@darkCyan}+ {{<STRING>}@darkBlue}+ Dudu option description {{(Dudu option hint)}-}*",
205
208
  "",
206
209
  ]);
207
210
  });
@@ -16,12 +16,14 @@ import {
16
16
  typeUrl,
17
17
  } from "../src";
18
18
 
19
+ // TODO - unit test for color styling
20
+
19
21
  it("run", async () => {
20
22
  const rootUsage = [
21
- "Root Description",
22
- "",
23
23
  "Usage: my-cli <REQUIRED1> <SUBCOMMAND>",
24
24
  "",
25
+ "Root Description",
26
+ "",
25
27
  "Positionals:",
26
28
  " <REQUIRED1> Required1 positional description",
27
29
  "",
@@ -35,10 +37,10 @@ it("run", async () => {
35
37
  "",
36
38
  ].join("\n");
37
39
  const subcommandUsage = [
38
- "Subcommand Description",
39
- "",
40
40
  "Usage: my-cli <REQUIRED1> subcommand <REQUIRED2> [OPTIONAL] [VARIADICS]...",
41
41
  "",
42
+ "Subcommand Description",
43
+ "",
42
44
  "Positionals:",
43
45
  " <REQUIRED1> Required1 positional description",
44
46
  " <REQUIRED2> Required2 positional description",
@@ -93,6 +95,10 @@ it("run", async () => {
93
95
  0,
94
96
  );
95
97
 
98
+ // Help takes precedence over version
99
+ await testCase(["--version", "--help"], [rootUsage], [], 0);
100
+ await testCase(["--help", "--version"], [rootUsage], [], 0);
101
+
96
102
  // Test missing required inputs
97
103
  await testCase(
98
104
  [],