cli-kiss 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +7 -6
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/lib/Command.ts +10 -3
- package/src/lib/Option.ts +3 -3
- package/src/lib/Positional.ts +1 -1
- package/src/lib/Reader.ts +11 -3
- package/src/lib/Run.ts +12 -12
- package/src/lib/Type.ts +76 -9
- package/src/lib/Typo.ts +6 -2
- package/src/lib/Usage.ts +19 -17
- package/tests/unit.Reader.aliases.ts +0 -1
- package/tests/unit.command.execute.ts +2 -2
- package/tests/unit.command.usage.ts +9 -9
- package/tests/unit.runner.cycle.ts +8 -5
package/dist/index.d.ts
CHANGED
|
@@ -36,9 +36,10 @@ type TypoStyle = {
|
|
|
36
36
|
underline?: boolean;
|
|
37
37
|
strikethrough?: boolean;
|
|
38
38
|
};
|
|
39
|
+
declare const typoStyleFailure: TypoStyle;
|
|
39
40
|
declare const typoStyleConstants: TypoStyle;
|
|
40
41
|
declare const typoStyleUserInput: TypoStyle;
|
|
41
|
-
declare const
|
|
42
|
+
declare const typoStyleQuote: TypoStyle;
|
|
42
43
|
declare class TypoString {
|
|
43
44
|
#private;
|
|
44
45
|
constructor(value: string, typoStyle?: TypoStyle);
|
|
@@ -220,7 +221,7 @@ type CommandInstance<Context, Result> = {
|
|
|
220
221
|
type CommandInformation = {
|
|
221
222
|
description: string;
|
|
222
223
|
hint?: string;
|
|
223
|
-
details?: string
|
|
224
|
+
details?: Array<string>;
|
|
224
225
|
};
|
|
225
226
|
type CommandUsage = {
|
|
226
227
|
breadcrumbs: Array<CommandUsageBreadcrumb>;
|
|
@@ -245,14 +246,14 @@ declare function commandWithSubcommands<Context, Payload, Result>(information: C
|
|
|
245
246
|
}): CommandDescriptor<Context, Result>;
|
|
246
247
|
declare function commandChained<Context, Payload, Result>(information: CommandInformation, operation: OperationDescriptor<Context, Payload>, nextCommand: CommandDescriptor<Payload, Result>): CommandDescriptor<Context, Result>;
|
|
247
248
|
|
|
248
|
-
declare function runAsCliAndExit<Context>(cliName: Lowercase<string>, cliArgs: ReadonlyArray<string>, context: Context, command: CommandDescriptor<Context, void>,
|
|
249
|
+
declare function runAsCliAndExit<Context>(cliName: Lowercase<string>, cliArgs: ReadonlyArray<string>, context: Context, command: CommandDescriptor<Context, void>, options?: {
|
|
250
|
+
useColors?: boolean | undefined;
|
|
249
251
|
usageOnHelp?: boolean | undefined;
|
|
250
252
|
buildVersion?: string | undefined;
|
|
251
|
-
|
|
253
|
+
onExecutionError?: ((error: unknown) => void) | undefined;
|
|
252
254
|
onLogStdOut?: ((message: string) => void) | undefined;
|
|
253
255
|
onLogStdErr?: ((message: string) => void) | undefined;
|
|
254
256
|
onExit?: ((code: number) => never) | undefined;
|
|
255
|
-
onExecutionError?: ((error: unknown) => void) | undefined;
|
|
256
257
|
}): Promise<never>;
|
|
257
258
|
|
|
258
259
|
declare function usageToStyledLines(params: {
|
|
@@ -261,4 +262,4 @@ declare function usageToStyledLines(params: {
|
|
|
261
262
|
typoSupport: TypoSupport;
|
|
262
263
|
}): string[];
|
|
263
264
|
|
|
264
|
-
export { type CommandDescriptor, type CommandFactory, type CommandInformation, type CommandInstance, type CommandUsage, type CommandUsageBreadcrumb, type CommandUsageSubcommand, type OperationDescriptor, 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 };
|
|
265
|
+
export { type CommandDescriptor, type CommandFactory, type CommandInformation, type CommandInstance, type CommandUsage, type CommandUsageBreadcrumb, type CommandUsageSubcommand, type OperationDescriptor, 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, typoStyleQuote, typoStyleUserInput, usageToStyledLines };
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
"use strict";var z=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var mt=Object.getOwnPropertyNames;var yt=Object.prototype.hasOwnProperty;var at=t=>{throw TypeError(t)};var ht=(t,e)=>{for(var n in e)z(t,n,{get:e[n],enumerable:!0})},ft=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of mt(e))!yt.call(t,o)&&o!==n&&z(t,o,{get:()=>e[o],enumerable:!(r=dt(e,o))||r.enumerable});return t};var wt=t=>ft(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),h=(t,e,n,r)=>(Q(t,e,"write to private field"),r?r.call(t,n):e.set(t,n),n),f=(t,e,n)=>(Q(t,e,"access private method"),n);var pt=(t,e,n,r)=>({set _(o){h(t,e,o,n)},get _(){return c(t,e,r)}});var Zt={};ht(Zt,{ReaderArgs:()=>N,TypoError:()=>m,TypoGrid:()=>$,TypoString:()=>i,TypoSupport:()=>P,TypoText:()=>l,command:()=>It,commandChained:()=>At,commandWithSubcommands:()=>kt,operation:()=>Pt,optionFlag:()=>Wt,optionRepeatable:()=>Nt,optionSingleValue:()=>Kt,positionalOptional:()=>Yt,positionalRequired:()=>jt,positionalVariadics:()=>qt,runAsCliAndExit:()=>Qt,typeBigInt:()=>Gt,typeBoolean:()=>Y,typeDate:()=>Vt,typeDecode:()=>x,typeList:()=>Mt,typeMapped:()=>Lt,typeNumber:()=>Bt,typeOneOf:()=>Ft,typeString:()=>vt,typeTuple:()=>Dt,typeUrl:()=>Et,typoStyleConstants:()=>w,typoStyleFailure:()=>lt,typoStyleUserInput:()=>y,usageToStyledLines:()=>st});module.exports=wt(Zt);var w={fgColor:"darkCyan",bold:!0},y={fgColor:"darkBlue",bold:!0},lt={fgColor:"darkRed",bold:!0},B,K,i=class{constructor(e,n={}){b(this,B);b(this,K);h(this,B,e),h(this,K,n)}getRawString(){return c(this,B)}computeStyledString(e){return e.computeStyledString(c(this,B),c(this,K))}};B=new WeakMap,K=new WeakMap;var S,X=class X{constructor(...e){b(this,S);h(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);h(this,A,[])}pushRow(e){c(this,A).push(e)}computeStyledGrid(e){let n=new Array,r=new Array;for(let o of c(this,A))for(let s=0;s<o.length;s++){let p=o[s].computeRawLength();(n[s]===void 0||p>n[s])&&(n[s]=p)}for(let o of c(this,A)){let s=new Array;for(let a=0;a<o.length;a++){let p=o[a],u=p.computeStyledString(e);if(s.push(u),a<o.length-1){let g=p.computeRawLength(),U=" ".repeat(n[a]-g);s.push(U)}}r.push(s)}return r}};A=new WeakMap;var G,Z=class Z extends Error{constructor(n,r){let o=new l;o.pushText(n),r instanceof Error?o.pushString(new i(`: ${r.message}`)):r instanceof Z?(o.pushString(new i(": ")),o.pushText(c(r,G))):r!==void 0&&o.pushString(new i(`: ${String(r)}`));super(o.computeRawString());b(this,G);h(this,G,o)}computeStyledString(n){return c(this,G).computeStyledString(n)}};G=new WeakMap;var m=Z,R,C=class C{constructor(e){b(this,R);h(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 r=n.fgColor?Ot[n.fgColor]:"",o=n.bgColor?Rt[n.bgColor]:"",s=n.bold?xt:"",a=n.dim?Ct:"",p=n.italic?St:"",u=n.underline?Ut:"",g=n.strikethrough?Tt:"";return`${r}${o}${s}${a}${p}${u}${g}${e}${bt}`}if(c(this,R)==="mock"){let r=n.fgColor?`{${e}}@${n.fgColor}`:e,o=n.bgColor?`{${r}}#${n.bgColor}`:r,s=n.bold?`{${o}}+`:o,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,bt="\x1B[0m",xt="\x1B[1m",Ct="\x1B[2m",St="\x1B[3m",Ut="\x1B[4m",Tt="\x1B[9m",Ot={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"},Rt={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 It(t,e){return{getInformation(){return t},createFactory(n){function r(){let o=e.generateUsage();return{breadcrumbs:o.positionals.map(s=>V(s.label)),information:t,positionals:o.positionals,subcommands:[],options:o.options}}try{let o=e.createFactory(n),s=n.consumePositional();if(s!==void 0)throw Error(`Unexpected argument: "${s}"`);return{generateUsage:r,createInstance(){let a=o.createInstance();return{async executeWithContext(p){return await a.executeWithContext(p)}}}}}catch(o){return{generateUsage:r,createInstance(){throw o}}}}}}function kt(t,e,n){return{getInformation(){return t},createFactory(r){try{let o=e.createFactory(r),s=r.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(r);return{generateUsage(){let u=e.generateUsage(),g=p.generateUsage();return{breadcrumbs:u.positionals.map(U=>V(U.label)).concat([$t(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=o.createInstance(),g=p.createInstance();return{async executeWithContext(U){return await g.executeWithContext(await u.executeWithContext(U))}}}}}catch(o){return{generateUsage(){let s=e.generateUsage();return{breadcrumbs:s.positionals.map(a=>V(a.label)).concat([V("<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 o}}}}}}function At(t,e,n){return{getInformation(){return t},createFactory(r){try{let o=e.createFactory(r),s=n.createFactory(r);return{generateUsage(){let a=e.generateUsage(),p=s.generateUsage();return{breadcrumbs:a.positionals.map(u=>V(u.label)).concat(p.breadcrumbs),information:p.information,positionals:a.positionals.concat(p.positionals),subcommands:p.subcommands,options:a.options.concat(p.options)}},createInstance(){let a=o.createInstance(),p=s.createInstance();return{async executeWithContext(u){return await p.executeWithContext(await a.executeWithContext(u))}}}}}catch(o){return{generateUsage(){let s=e.generateUsage();return{breadcrumbs:s.positionals.map(a=>V(a.label)).concat([V("[REST]...")]),information:t,positionals:s.positionals,subcommands:[],options:s.options}},createInstance(){throw o}}}}}}function V(t){return{positional:t}}function $t(t){return{command:t}}function Pt(t,e){return{generateUsage(){let n=new Array;for(let o in t.options){let s=t.options[o];s&&n.push(s.generateUsage())}let r=new Array;for(let o of t.positionals)r.push(o.generateUsage());return{options:n,positionals:r}},createFactory(n){let r={};for(let s in t.options){let a=t.options[s];r[s]=a.createGetter(n)}let o=[];for(let s of t.positionals)o.push(s.consumePositionals(n));return{createInstance(){let s={};for(let a in r)s[a]=r[a].getValue();return{executeWithContext(a){return e(a,{options:s,positionals:o})}}}}}}}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,y))))}}function Ft(t,e){let n=new Set(e);return{label:t.label,decoder(r){let o=x(t,r,()=>new l(new i(t.label,y)));if(n.has(o))return o;let s=e.map(a=>`"${a}"`).join("|");throw new Error(`Unexpected value: "${r}" (expected: ${s})`)}}}function Dt(t,e=","){return{label:t.map(n=>n.label).join(e),decoder(n){let r=n.split(e,t.length);if(r.length!==t.length)throw new Error(`Invalid tuple parts: ${JSON.stringify(r)}`);return r.map((o,s)=>x(t[s],o,()=>new l(new i(t[s].label,y),new i(`@${s}`))))}}}function Mt(t,e=","){return{label:`${t.label}[${e}${t.label}]...`,decoder(n){return n.split(e).map((r,o)=>x(t,r,()=>new l(new i(t.label,y),new i(`@${o}`))))}}}function x(t,e,n){try{return t.decoder(e)}catch(r){throw new m(n(),r)}}function Wt(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 r=_(n,{...t,valued:!1});return{getValue(){let o=n.getOptionValues(r);if(o.length>1)throw new m(new l(new i(`--${t.long}`,w),new i(": Must not be set multiple times")));let s=o[0];if(s===void 0)try{return t.default?t.default():!1}catch(a){throw new m(new l(new i(`--${t.long}`,w),new i(": Failed to compute default value")),a)}return x(Y,s,()=>new l(new i(`--${t.long}`,w),new i(": "),new i(e,y)))}}}}}function Kt(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 r=_(n,{...t,valued:!0});return{getValue(){let o=n.getOptionValues(r);if(o.length>1)throw new m(new l(new i(`--${t.long}`,w),new i(": Must not be set multiple times")));let s=o[0];if(s===void 0)try{return t.default()}catch(a){throw new m(new l(new i(`--${t.long}`,w),new i(": Failed to compute default value")),a)}return x(t.type,s,()=>new l(new i(`--${t.long}`,w),new i(": "),new i(e,y)))}}}}}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 r=_(n,{...t,valued:!0});return{getValue(){return n.getOptionValues(r).map(o=>x(t.type,o,()=>new l(new i(`--${t.long}`,w),new i(": "),new i(e,y))))}}}}}function _(t,e){let{long:n,short:r,aliases:o,valued:s}=e,a=n?[n]:[];o?.longs&&a.push(...o?.longs);let p=r?[r]:[];return o?.shorts&&p.push(...o?.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 r=n.consumePositional();if(r===void 0)throw new m(new l(new i(e,y),new i(": Is required, but was not provided")));return x(t.type,r,()=>new l(new i(e,y)))}}}function Yt(t){let e=`[${t.label??t.type.label}]`;return{generateUsage(){return{description:t.description,hint:t.hint,label:e}},consumePositionals(n){let r=n.consumePositional();if(r===void 0)try{return t.default()}catch(o){throw new m(new l(new i(e,y),new i(": Failed to compute default value")),o)}return x(t.type,r,()=>new l(new i(e,y)))}}}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 r=[];for(;;){let o=n.consumePositional();if(o===void 0||o===t.endDelimiter)break;r.push(x(t.type,o,()=>new l(new i(e,y))))}return r}}}var j,L,k,E,T,v,F,d,q,ut,tt,ct,et,I,N=class{constructor(e){b(this,d);b(this,j);b(this,L);b(this,k);b(this,E);b(this,T);b(this,v);b(this,F);h(this,j,e),h(this,L,0),h(this,k,!1),h(this,E,new Map),h(this,T,new Map),h(this,v,new Map),h(this,F,new Map)}registerOption(e){let n=[...e.longs.map(r=>`--${r}`),...e.shorts.map(r=>`-${r}`)].join(", ");for(let r of e.longs){if(c(this,E).has(r))throw new Error(`Option already registered: --${r}`);c(this,E).set(r,n)}for(let r of e.shorts){if(c(this,T).has(r))throw new Error(`Option already registered: -${r}`);for(let o=0;o<r.length;o++){let s=r.slice(0,o);if(c(this,T).has(s))throw new Error(`Option -${r} overlap with shorter option: -${s}`)}for(let o of c(this,T).keys())if(o.startsWith(r))throw new Error(`Option -${r} overlap with longer option: -${o}`);c(this,T).set(r,n)}return c(this,v).set(n,e.valued),c(this,F).set(n,new Array),n}getOptionValues(e){let n=c(this,F).get(e);if(n===void 0)throw new Error(`Unregistered option: ${e}`);return n}consumePositional(){for(;;){let e=f(this,d,q).call(this);if(e===null)return;if(f(this,d,ut).call(this,e))return e}}};j=new WeakMap,L=new WeakMap,k=new WeakMap,E=new WeakMap,T=new WeakMap,v=new WeakMap,F=new WeakMap,d=new WeakSet,q=function(){let e=c(this,j)[c(this,L)];return e===void 0?null:(pt(this,L)._++,!c(this,k)&&e==="--"?(h(this,k,!0),f(this,d,q).call(this)):e)},ut=function(e){if(c(this,k))return!0;if(e.startsWith("--")){let n=e.indexOf("=");return n===-1?f(this,d,tt).call(this,e.slice(2),null):f(this,d,tt).call(this,e.slice(2,n),e.slice(n+1)),!1}if(e.startsWith("-")){let n=1,r=2;for(;r<=e.length;){let o=f(this,d,ct).call(this,e.slice(n,r),e.slice(r));if(o===!0)return!1;o===!1&&(n=r),r++}throw new m(new l(new i(`-${e.slice(n)}`,w),new i(": Unexpected unknown option")))}return!0},tt=function(e,n){let r=`--${e}`,o=c(this,E).get(e);if(o!==void 0)return n!==null?f(this,d,I).call(this,o,n):c(this,v).get(o)?f(this,d,I).call(this,o,f(this,d,et).call(this,r)):f(this,d,I).call(this,o,"true");throw new m(new l(new i(r,w),new i(": Unexpected unknown option")))},ct=function(e,n){let r=c(this,T).get(e);return r!==void 0?n.startsWith("=")?(f(this,d,I).call(this,r,n.slice(1)),!0):c(this,v).get(r)?(n===""?f(this,d,I).call(this,r,f(this,d,et).call(this,`-${e}`)):f(this,d,I).call(this,r,n),!0):(f(this,d,I).call(this,r,"true"),n===""):null},et=function(e){let n=f(this,d,q).call(this);if(n===null)throw new m(new l(new i(e,w),new i(": Requires a value, but got end of input")));if(c(this,k))throw new m(new l(new i(e,w),new i(': Requires a value before "--"')));if(n.startsWith("-"))throw new m(new l(new i(e,w),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:r}=t,o=new Array,s=[Jt("Usage:").computeStyledString(r),D(e).computeStyledString(r)].concat(n.breadcrumbs.map(p=>{if("positional"in p)return rt(p.positional).computeStyledString(r);if("command"in p)return D(p.command).computeStyledString(r);throw new Error(`Unknown breadcrumb: ${JSON.stringify(p)}`)}));o.push(s.join(" ")),o.push("");let a=new l;if(a.pushString(Ht(n.information.description)),n.information.hint&&(a.pushString(O(" ")),a.pushString(H(`(${n.information.hint})`))),o.push(a.computeStyledString(r)),n.information.details){let p=H(n.information.details);o.push(p.computeStyledString(r))}if(n.positionals.length>0){o.push(""),o.push(ot("Positionals:").computeStyledString(r));let p=new $;for(let u of n.positionals){let g=new Array;g.push(new l(O(" "))),g.push(new l(rt(u.label))),g.push(...nt(u)),p.pushRow(g)}o.push(...p.computeStyledGrid(r).map(u=>u.join("")))}if(n.subcommands.length>0){o.push(""),o.push(ot("Subcommands:").computeStyledString(r));let p=new $;for(let u of n.subcommands){let g=new Array;g.push(new l(O(" "))),g.push(new l(D(u.name))),g.push(...nt(u)),p.pushRow(g)}o.push(...p.computeStyledGrid(r).map(u=>u.join("")))}if(n.options.length>0){o.push(""),o.push(ot("Options:").computeStyledString(r));let p=new $;for(let u of n.options){let g=new Array;g.push(new l(O(" "))),u.short?g.push(new l(D(`-${u.short}`),O(", "))):g.push(new l),u.label?g.push(new l(D(`--${u.long}`),O(" "),rt(u.label))):g.push(new l(D(`--${u.long}`),H("[=no]"))),g.push(...nt(u)),p.pushRow(g)}o.push(...p.computeStyledGrid(r).map(u=>u.join("")))}return o.push(""),o}function nt(t){let e=[];return t.description&&(e.push(O(" ")),e.push(zt(t.description))),t.hint&&(e.push(O(" ")),e.push(H(`(${t.hint})`))),e.length>0?[new l(O(" "),...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 D(t){return new i(t,w)}function rt(t){return new i(t,y)}function O(t){return new i(t)}async function Qt(t,e,n,r,o){let s=new N(e),a=o?.usageOnHelp??!0;a&&s.registerOption({shorts:[],longs:["help"],valued:!1});let p=o?.buildVersion;p&&s.registerOption({shorts:[],longs:["version"],valued:!1});let u=Xt(o?.useColors),g=o?.onLogStdOut??console.log,U=o?.onLogStdErr??console.error,M=o?.onExit??process.exit,J=r.createFactory(s);for(;;)try{if(s.consumePositional()===void 0)break}catch{}if(a&&s.getOptionValues("--help").length>0)return g(gt(t,J,u)),M(0);if(p&&s.getOptionValues("--version").length>0)return g([t,p].join(" ")),M(0);try{let W=J.createInstance();try{return await W.executeWithContext(n),M(0)}catch(it){return o?.onExecutionError?o.onExecutionError(it):U(u.computeStyledErrorMessage(it)),M(1)}}catch(W){return U(gt(t,J,u)),U(u.computeStyledErrorMessage(W)),M(1)}}function gt(t,e,n){return st({cliName:t,commandUsage:e.generateUsage(),typoSupport:n}).join(`
|
|
2
|
-
`)}function
|
|
1
|
+
"use strict";var z=Object.defineProperty;var mt=Object.getOwnPropertyDescriptor;var yt=Object.getOwnPropertyNames;var ht=Object.prototype.hasOwnProperty;var pt=t=>{throw TypeError(t)};var wt=(t,e)=>{for(var n in e)z(t,n,{get:e[n],enumerable:!0})},ft=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of yt(e))!ht.call(t,o)&&o!==n&&z(t,o,{get:()=>e[o],enumerable:!(r=mt(e,o))||r.enumerable});return t};var bt=t=>ft(z({},"__esModule",{value:!0}),t);var X=(t,e,n)=>e.has(t)||pt("Cannot "+n);var c=(t,e,n)=>(X(t,e,"read from private field"),n?n.call(t):e.get(t)),b=(t,e,n)=>e.has(t)?pt("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,n),h=(t,e,n,r)=>(X(t,e,"write to private field"),r?r.call(t,n):e.set(t,n),n),w=(t,e,n)=>(X(t,e,"access private method"),n);var lt=(t,e,n,r)=>({set _(o){h(t,e,o,n)},get _(){return c(t,e,r)}});var _t={};wt(_t,{ReaderArgs:()=>j,TypoError:()=>d,TypoGrid:()=>P,TypoString:()=>s,TypoSupport:()=>V,TypoText:()=>p,command:()=>kt,commandChained:()=>At,commandWithSubcommands:()=>$t,operation:()=>Vt,optionFlag:()=>Kt,optionRepeatable:()=>jt,optionSingleValue:()=>Nt,positionalOptional:()=>qt,positionalRequired:()=>Yt,positionalVariadics:()=>Ht,runAsCliAndExit:()=>Xt,typeBigInt:()=>Lt,typeBoolean:()=>q,typeDate:()=>vt,typeDecode:()=>C,typeList:()=>Wt,typeMapped:()=>Ft,typeNumber:()=>Gt,typeOneOf:()=>Dt,typeString:()=>Bt,typeTuple:()=>Mt,typeUrl:()=>Et,typoStyleConstants:()=>f,typoStyleFailure:()=>ut,typoStyleQuote:()=>x,typoStyleUserInput:()=>y,usageToStyledLines:()=>it});module.exports=bt(_t);var ut={fgColor:"darkRed",bold:!0},f={fgColor:"darkCyan",bold:!0},y={fgColor:"darkBlue",bold:!0},x={fgColor:"darkYellow",bold:!0},G,N,s=class{constructor(e,n={}){b(this,G);b(this,N);h(this,G,e),h(this,N,n)}getRawString(){return c(this,G)}computeStyledString(e){return e.computeStyledString(c(this,G),c(this,N))}};G=new WeakMap,N=new WeakMap;var T,Z=class Z{constructor(...e){b(this,T);h(this,T,[]);for(let n of e)n instanceof Z?this.pushText(n):n instanceof s?this.pushString(n):typeof n=="string"&&this.pushString(new s(n))}pushString(e){c(this,T).push(e)}pushText(e){for(let n of c(e,T))c(this,T).push(n)}computeStyledString(e){return c(this,T).map(n=>n.computeStyledString(e)).join("")}computeRawString(){return c(this,T).map(e=>e.getRawString()).join("")}computeRawLength(){let e=0;for(let n of c(this,T))e+=n.getRawString().length;return e}};T=new WeakMap;var p=Z,A,P=class{constructor(){b(this,A);h(this,A,[])}pushRow(e){c(this,A).push(e)}computeStyledGrid(e){let n=new Array,r=new Array;for(let o of c(this,A))for(let i=0;i<o.length;i++){let l=o[i].computeRawLength();(n[i]===void 0||l>n[i])&&(n[i]=l)}for(let o of c(this,A)){let i=new Array;for(let a=0;a<o.length;a++){let l=o[a],u=l.computeStyledString(e);if(i.push(u),a<o.length-1){let g=l.computeRawLength(),U=" ".repeat(n[a]-g);i.push(U)}}r.push(i)}return r}};A=new WeakMap;var L,_=class _ extends Error{constructor(n,r){let o=new p;o.pushText(n),r instanceof Error?o.pushString(new s(`: ${r.message}`)):r instanceof _?(o.pushString(new s(": ")),o.pushText(c(r,L))):r!==void 0&&o.pushString(new s(`: ${String(r)}`));super(o.computeRawString());b(this,L);h(this,L,o)}computeStyledString(n){return c(this,L).computeStyledString(n)}};L=new WeakMap;var d=_,I,S=class S{constructor(e){b(this,I);h(this,I,e)}static none(){return new S("none")}static tty(){return new S("tty")}static mock(){return new S("mock")}static inferFromProcess(){if(!process)return S.none();if(process.env){if(process.env.FORCE_COLOR==="0")return S.none();if(process.env.FORCE_COLOR)return S.tty();if("NO_COLOR"in process.env)return S.none()}return!process.stdout||!process.stdout.isTTY?S.none():S.tty()}computeStyledString(e,n){if(c(this,I)==="none")return e;if(c(this,I)==="tty"){let r=n.fgColor?Rt[n.fgColor]:"",o=n.bgColor?It[n.bgColor]:"",i=n.bold?Ct:"",a=n.dim?St:"",l=n.italic?Tt:"",u=n.underline?Ut:"",g=n.strikethrough?Ot:"";return`${r}${o}${i}${a}${l}${u}${g}${e}${xt}`}if(c(this,I)==="mock"){let r=n.fgColor?`{${e}}@${n.fgColor}`:e,o=n.bgColor?`{${r}}#${n.bgColor}`:r,i=n.bold?`{${o}}+`:o,a=n.dim?`{${i}}-`:i,l=n.italic?`{${a}}*`:a,u=n.underline?`{${l}}_`:l;return n.strikethrough?`{${u}}~`:u}throw new Error(`Unknown TypoSupport kind: ${c(this,I)}`)}computeStyledErrorMessage(e){return[this.computeStyledString("Error:",ut),e instanceof d?e.computeStyledString(this):e instanceof Error?e.message:String(e)].join(" ")}};I=new WeakMap;var V=S,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 r(){let o=e.generateUsage();return{breadcrumbs:o.positionals.map(i=>v(i.label)),information:t,positionals:o.positionals,subcommands:[],options:o.options}}try{let o=e.createFactory(n),i=n.consumePositional();if(i!==void 0)throw Error(`Unexpected argument: "${i}"`);return{generateUsage:r,createInstance(){let a=o.createInstance();return{async executeWithContext(l){return await a.executeWithContext(l)}}}}}catch(o){return{generateUsage:r,createInstance(){throw o}}}}}}function $t(t,e,n){return{getInformation(){return t},createFactory(r){try{let o=e.createFactory(r),i=r.consumePositional();if(i===void 0)throw new d(new p(new s("<SUBCOMMAND>",y),new s(": Is required, but was not provided")));let a=n[i];if(a===void 0)throw new d(new p(new s("<SUBCOMMAND>",y),new s(": Invalid value: "),new s(`"${i}"`,x)));let l=a.createFactory(r);return{generateUsage(){let u=e.generateUsage(),g=l.generateUsage();return{breadcrumbs:u.positionals.map(U=>v(U.label)).concat([Pt(i)]).concat(g.breadcrumbs),information:g.information,positionals:u.positionals.concat(g.positionals),subcommands:g.subcommands,options:u.options.concat(g.options)}},createInstance(){let u=o.createInstance(),g=l.createInstance();return{async executeWithContext(U){return await g.executeWithContext(await u.executeWithContext(U))}}}}}catch(o){return{generateUsage(){let i=e.generateUsage();return{breadcrumbs:i.positionals.map(a=>v(a.label)).concat([v("<SUBCOMMAND>")]),information:t,positionals:i.positionals,subcommands:Object.entries(n).map(a=>{let l=a[1].getInformation();return{name:a[0],description:l.description,hint:l.hint}}),options:i.options}},createInstance(){throw o}}}}}}function At(t,e,n){return{getInformation(){return t},createFactory(r){try{let o=e.createFactory(r),i=n.createFactory(r);return{generateUsage(){let a=e.generateUsage(),l=i.generateUsage();return{breadcrumbs:a.positionals.map(u=>v(u.label)).concat(l.breadcrumbs),information:l.information,positionals:a.positionals.concat(l.positionals),subcommands:l.subcommands,options:a.options.concat(l.options)}},createInstance(){let a=o.createInstance(),l=i.createInstance();return{async executeWithContext(u){return await l.executeWithContext(await a.executeWithContext(u))}}}}}catch(o){return{generateUsage(){let i=e.generateUsage();return{breadcrumbs:i.positionals.map(a=>v(a.label)).concat([v("[REST]...")]),information:t,positionals:i.positionals,subcommands:[],options:i.options}},createInstance(){throw o}}}}}}function v(t){return{positional:t}}function Pt(t){return{command:t}}function Vt(t,e){return{generateUsage(){let n=new Array;for(let o in t.options){let i=t.options[o];i&&n.push(i.generateUsage())}let r=new Array;for(let o of t.positionals)r.push(o.generateUsage());return{options:n,positionals:r}},createFactory(n){let r={};for(let i in t.options){let a=t.options[i];r[i]=a.createGetter(n)}let o=[];for(let i of t.positionals)o.push(i.consumePositionals(n));return{createInstance(){let i={};for(let a in r)i[a]=r[a].getValue();return{executeWithContext(a){return e(a,{options:i,positionals:o})}}}}}}}var q={label:"BOOLEAN",decoder(t){let e=t.toLowerCase();if(e==="true"||e==="yes")return!0;if(e==="false"||e==="no")return!1;throw new d(new p(new s("Invalid boolean: "),new s(`"${t}"`,x)))}},vt={label:"DATE",decoder(t){let e=Date.parse(t);if(isNaN(e))throw new d(new p(new s("Invalid date (ISO_8601): "),new s(`"${t}"`,x)));return new Date(e)}},Et={label:"URL",decoder(t){try{return new URL(t)}catch{throw new d(new p(new s("Invalid URL: "),new s(`"${t}"`,x)))}}},Bt={label:"STRING",decoder(t){return t}},Gt={label:"NUMBER",decoder(t){try{return Number(t)}catch{throw new d(new p(new s("Invalid number: "),new s(`"${t}"`,x)))}}},Lt={label:"BIGINT",decoder(t){try{return BigInt(t)}catch{throw new d(new p(new s("Invalid integer: "),new s(`"${t}"`,x)))}}};function Ft(t,e){return{label:e.label,decoder:n=>e.decoder(C(t,n,()=>new p(new s(t.label,y))))}}function Dt(t,e){let n=new Set(e);return{label:t.label,decoder(r){let o=C(t,r,()=>new p(new s(t.label,y)));if(n.has(o))return o;let i=[];for(let a of e){if(i.length>=5){i.push(new s("..."));break}i.length>0&&i.push(new s(" | ")),i.push(new s(`"${a}"`,x))}throw new d(new p(new s("Invalid value: "),new s(`"${r}"`,x),new s(" (expected one of: "),...i,new s(")")))}}}function Mt(t,e=","){return{label:t.map(n=>n.label).join(e),decoder(n){let r=n.split(e,t.length);if(r.length!==t.length)throw new d(new p(new s("Invalid tuple: "),new s(`"${n}"`,x),new s(` (expected ${t.length} parts)`)));return r.map((o,i)=>C(t[i],o,()=>new p(new s(t[i].label,y),new s(`@${i}`))))}}}function Wt(t,e=","){return{label:`${t.label}[${e}${t.label}]...`,decoder(n){return n.split(e).map((r,o)=>C(t,r,()=>new p(new s(t.label,y),new s(`@${o}`))))}}}function C(t,e,n){try{return t.decoder(e)}catch(r){throw new d(n(),r)}}function Kt(t){let e=`<${q.label}>`;return{generateUsage(){return{description:t.description,hint:t.hint,long:t.long,short:t.short,label:void 0}},createGetter(n){let r=tt(n,{...t,valued:!1});return{getValue(){let o=n.getOptionValues(r);if(o.length>1)throw new d(new p(new s(`--${t.long}`,f),new s(": Must not be set multiple times")));let i=o[0];if(i===void 0)try{return t.default?t.default():!1}catch(a){throw new d(new p(new s(`--${t.long}`,f),new s(": Failed to get default value")),a)}return C(q,i,()=>new p(new s(`--${t.long}`,f),new s(": "),new s(e,y)))}}}}}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 r=tt(n,{...t,valued:!0});return{getValue(){let o=n.getOptionValues(r);if(o.length>1)throw new d(new p(new s(`--${t.long}`,f),new s(": Requires a single value, but got multiple")));let i=o[0];if(i===void 0)try{return t.default()}catch(a){throw new d(new p(new s(`--${t.long}`,f),new s(": Failed to get default value")),a)}return C(t.type,i,()=>new p(new s(`--${t.long}`,f),new s(": "),new s(e,y)))}}}}}function jt(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 r=tt(n,{...t,valued:!0});return{getValue(){return n.getOptionValues(r).map(o=>C(t.type,o,()=>new p(new s(`--${t.long}`,f),new s(": "),new s(e,y))))}}}}}function tt(t,e){let{long:n,short:r,aliases:o,valued:i}=e,a=n?[n]:[];o?.longs&&a.push(...o?.longs);let l=r?[r]:[];return o?.shorts&&l.push(...o?.shorts),t.registerOption({longs:a,shorts:l,valued:i})}function Yt(t){let e=`<${t.label??t.type.label}>`;return{generateUsage(){return{description:t.description,hint:t.hint,label:e}},consumePositionals(n){let r=n.consumePositional();if(r===void 0)throw new d(new p(new s(e,y),new s(": Is required, but was not provided")));return C(t.type,r,()=>new p(new s(e,y)))}}}function qt(t){let e=`[${t.label??t.type.label}]`;return{generateUsage(){return{description:t.description,hint:t.hint,label:e}},consumePositionals(n){let r=n.consumePositional();if(r===void 0)try{return t.default()}catch(o){throw new d(new p(new s(e,y),new s(": Failed to get default value")),o)}return C(t.type,r,()=>new p(new s(e,y)))}}}function Ht(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 r=[];for(;;){let o=n.consumePositional();if(o===void 0||o===t.endDelimiter)break;r.push(C(t.type,o,()=>new p(new s(e,y))))}return r}}}var Y,F,$,E,O,B,D,m,H,ct,et,gt,nt,k,j=class{constructor(e){b(this,m);b(this,Y);b(this,F);b(this,$);b(this,E);b(this,O);b(this,B);b(this,D);h(this,Y,e),h(this,F,0),h(this,$,!1),h(this,E,new Map),h(this,O,new Map),h(this,B,new Map),h(this,D,new Map)}registerOption(e){let n=[...e.longs.map(r=>`--${r}`),...e.shorts.map(r=>`-${r}`)].join(", ");for(let r of e.longs){if(c(this,E).has(r))throw new Error(`Option already registered: --${r}`);c(this,E).set(r,n)}for(let r of e.shorts){if(c(this,O).has(r))throw new Error(`Option already registered: -${r}`);for(let o=0;o<r.length;o++){let i=r.slice(0,o);if(c(this,O).has(i))throw new Error(`Option -${r} overlap with shorter option: -${i}`)}for(let o of c(this,O).keys())if(o.startsWith(r))throw new Error(`Option -${r} overlap with longer option: -${o}`);c(this,O).set(r,n)}return c(this,B).set(n,e.valued),c(this,D).set(n,new Array),n}getOptionValues(e){let n=c(this,D).get(e);if(n===void 0)throw new Error(`Unregistered option: ${e}`);return n}consumePositional(){for(;;){let e=w(this,m,H).call(this);if(e===null)return;if(w(this,m,ct).call(this,e))return e}}};Y=new WeakMap,F=new WeakMap,$=new WeakMap,E=new WeakMap,O=new WeakMap,B=new WeakMap,D=new WeakMap,m=new WeakSet,H=function(){let e=c(this,Y)[c(this,F)];return e===void 0?null:(lt(this,F)._++,!c(this,$)&&e==="--"?(h(this,$,!0),w(this,m,H).call(this)):e)},ct=function(e){if(c(this,$))return!0;if(e.startsWith("--")){let n=e.indexOf("=");return n===-1?w(this,m,et).call(this,e.slice(2),null):w(this,m,et).call(this,e.slice(2,n),e.slice(n+1)),!1}if(e.startsWith("-")){let n=1,r=2;for(;r<=e.length;){let o=w(this,m,gt).call(this,e.slice(n,r),e.slice(r));if(o===!0)return!1;o===!1&&(n=r),r++}throw new d(new p(new s(`-${e.slice(n)}`,f),new s(": Unexpected unknown option")))}return!0},et=function(e,n){let r=`--${e}`,o=c(this,E).get(e);if(o!==void 0)return n!==null?w(this,m,k).call(this,o,n):c(this,B).get(o)?w(this,m,k).call(this,o,w(this,m,nt).call(this,r)):w(this,m,k).call(this,o,"true");throw new d(new p(new s(r,f),new s(": Unexpected unknown option")))},gt=function(e,n){let r=c(this,O).get(e);return r!==void 0?n.startsWith("=")?(w(this,m,k).call(this,r,n.slice(1)),!0):c(this,B).get(r)?(n===""?w(this,m,k).call(this,r,w(this,m,nt).call(this,`-${e}`)):w(this,m,k).call(this,r,n),!0):(w(this,m,k).call(this,r,"true"),n===""):null},nt=function(e){let n=w(this,m,H).call(this);if(n===null)throw new d(new p(new s(e,f),new s(": Requires a value, but got end of input")));if(c(this,$))throw new d(new p(new s(e,f),new s(": Requires a value before "),new s('"--"',x)));if(n.startsWith("-"))throw new d(new p(new s(e,f),new s(": Requires a value, but got: "),new s(`"${n}"`,x)));return n},k=function(e,n){this.getOptionValues(e).push(n)};function it(t){let{cliName:e,commandUsage:n,typoSupport:r}=t,o=new Array,i=[Qt("Usage:").computeStyledString(r),M(e).computeStyledString(r)].concat(n.breadcrumbs.map(l=>{if("positional"in l)return st(l.positional).computeStyledString(r);if("command"in l)return M(l.command).computeStyledString(r);throw new Error(`Unknown breadcrumb: ${JSON.stringify(l)}`)}));o.push(i.join(" ")),o.push("");let a=new p;a.pushString(Jt(n.information.description)),n.information.hint&&(a.pushString(R(" ")),a.pushString(Q(`(${n.information.hint})`))),o.push(a.computeStyledString(r));for(let l of n.information.details??[]){let u=new p;u.pushString(Q(l)),o.push(u.computeStyledString(r))}if(n.positionals.length>0){o.push(""),o.push(rt("Positionals:").computeStyledString(r));let l=new P;for(let u of n.positionals){let g=new Array;g.push(new p(R(" "))),g.push(new p(st(u.label))),g.push(...ot(u)),l.pushRow(g)}o.push(...l.computeStyledGrid(r).map(u=>u.join("")))}if(n.subcommands.length>0){o.push(""),o.push(rt("Subcommands:").computeStyledString(r));let l=new P;for(let u of n.subcommands){let g=new Array;g.push(new p(R(" "))),g.push(new p(M(u.name))),g.push(...ot(u)),l.pushRow(g)}o.push(...l.computeStyledGrid(r).map(u=>u.join("")))}if(n.options.length>0){o.push(""),o.push(rt("Options:").computeStyledString(r));let l=new P;for(let u of n.options){let g=new Array;g.push(new p(R(" "))),u.short?g.push(new p(M(`-${u.short}`),R(", "))):g.push(new p),u.label?g.push(new p(M(`--${u.long}`),R(" "),st(u.label))):g.push(new p(M(`--${u.long}`),Q("[=no]"))),g.push(...ot(u)),l.pushRow(g)}o.push(...l.computeStyledGrid(r).map(u=>u.join("")))}return o.push(""),o}function ot(t){let e=[];return t.description&&(e.push(R(" ")),e.push(zt(t.description))),t.hint&&(e.push(R(" ")),e.push(Q(`(${t.hint})`))),e.length>0?[new p(R(" "),...e)]:[]}function Qt(t){return new s(t,{fgColor:"darkMagenta",bold:!0})}function Jt(t){return new s(t,{bold:!0})}function zt(t){return new s(t)}function rt(t){return new s(t,{fgColor:"darkGreen",bold:!0})}function Q(t){return new s(t,{italic:!0,dim:!0})}function M(t){return new s(t,f)}function st(t){return new s(t,y)}function R(t){return new s(t)}async function Xt(t,e,n,r,o){let i=new j(e),a=o?.usageOnHelp??!0;a&&i.registerOption({shorts:[],longs:["help"],valued:!1});let l=o?.buildVersion;l&&i.registerOption({shorts:[],longs:["version"],valued:!1});let u=Zt(o?.useColors),g=o?.onLogStdOut??console.log,U=o?.onLogStdErr??console.error,W=o?.onExit??process.exit,J=r.createFactory(i);for(;;)try{if(i.consumePositional()===void 0)break}catch{}if(a&&i.getOptionValues("--help").length>0)return g(dt(t,J,u)),W(0);if(l&&i.getOptionValues("--version").length>0)return g([t,l].join(" ")),W(0);try{let K=J.createInstance();try{return await K.executeWithContext(n),W(0)}catch(at){return o?.onExecutionError?o.onExecutionError(at):U(u.computeStyledErrorMessage(at)),W(1)}}catch(K){return U(dt(t,J,u)),U(u.computeStyledErrorMessage(K)),W(1)}}function dt(t,e,n){return it({cliName:t,commandUsage:e.generateUsage(),typoSupport:n}).join(`
|
|
2
|
+
`)}function Zt(t){return t===void 0?V.inferFromProcess():t?V.tty():V.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,typoStyleQuote,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 { OperationDescriptor } from \"./Operation\";\nimport { OptionUsage } from \"./Option\";\nimport { PositionalUsage } from \"./Positional\";\nimport { ReaderArgs } from \"./Reader\";\nimport { TypoError, TypoString, typoStyleUserInput, TypoText } from \"./Typo\";\n\nexport type CommandDescriptor<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: OperationDescriptor<Context, Result>,\n): CommandDescriptor<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: OperationDescriptor<Context, Payload>,\n subcommands: {\n [subcommand: Lowercase<string>]: CommandDescriptor<Payload, Result>;\n },\n): CommandDescriptor<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>`, typoStyleUserInput),\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>`, typoStyleUserInput),\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([breadcrumbPositional(\"<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 information: CommandInformation,\n operation: OperationDescriptor<Context, Payload>,\n nextCommand: CommandDescriptor<Payload, Result>,\n): CommandDescriptor<Context, Result> {\n return {\n getInformation() {\n return information;\n },\n createFactory(readerArgs: ReaderArgs) {\n try {\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 breadcrumbs: operationUsage.positionals\n .map((positional) => breadcrumbPositional(positional.label))\n .concat(nextCommandUsage.breadcrumbs),\n information: nextCommandUsage.information,\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 } 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([breadcrumbPositional(\"[REST]...\")]),\n information: information,\n positionals: operationUsage.positionals,\n subcommands: [],\n options: operationUsage.options,\n };\n },\n createInstance() {\n throw error;\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 OperationDescriptor<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): OperationDescriptor<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 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 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 { CommandDescriptor, 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: CommandDescriptor<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 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 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 const commandFactory = command.createFactory(readerArgs);\n while (true) {\n try {\n const positional = readerArgs.consumePositional();\n if (positional === undefined) {\n break;\n }\n } catch (_) {}\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 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 (executionError) {\n if (application?.onExecutionError) {\n application.onExecutionError(executionError);\n } else {\n onLogStdErr(typoSupport.computeStyledErrorMessage(executionError));\n }\n return onExit(1);\n }\n } catch (parsingError) {\n onLogStdErr(computeUsageString(cliName, commandFactory, typoSupport));\n onLogStdErr(typoSupport.computeStyledErrorMessage(parsingError));\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","typoStyleUserInput","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","typoSupport","chooseTypoSupport","onLogStdOut","onLogStdErr","onExit","commandFactory","computeUsageString","commandInstance","executionError","parsingError","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 typoStyleFailure: TypoStyle = {\n fgColor: \"darkRed\",\n bold: true,\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 typoStyleQuote: TypoStyle = {\n fgColor: \"darkYellow\",\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 { OperationDescriptor } from \"./Operation\";\nimport { OptionUsage } from \"./Option\";\nimport { PositionalUsage } from \"./Positional\";\nimport { ReaderArgs } from \"./Reader\";\nimport {\n TypoError,\n TypoString,\n typoStyleQuote,\n typoStyleUserInput,\n TypoText,\n} from \"./Typo\";\n\nexport type CommandDescriptor<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?: Array<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: OperationDescriptor<Context, Result>,\n): CommandDescriptor<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: OperationDescriptor<Context, Payload>,\n subcommands: {\n [subcommand: Lowercase<string>]: CommandDescriptor<Payload, Result>;\n },\n): CommandDescriptor<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>`, typoStyleUserInput),\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>`, typoStyleUserInput),\n new TypoString(`: Invalid value: `),\n new TypoString(`\"${subcommandName}\"`, typoStyleQuote),\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([breadcrumbPositional(\"<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 information: CommandInformation,\n operation: OperationDescriptor<Context, Payload>,\n nextCommand: CommandDescriptor<Payload, Result>,\n): CommandDescriptor<Context, Result> {\n return {\n getInformation() {\n return information;\n },\n createFactory(readerArgs: ReaderArgs) {\n try {\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 breadcrumbs: operationUsage.positionals\n .map((positional) => breadcrumbPositional(positional.label))\n .concat(nextCommandUsage.breadcrumbs),\n information: nextCommandUsage.information,\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 } 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([breadcrumbPositional(\"[REST]...\")]),\n information: information,\n positionals: operationUsage.positionals,\n subcommands: [],\n options: operationUsage.options,\n };\n },\n createInstance() {\n throw error;\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 OperationDescriptor<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): OperationDescriptor<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 {\n TypoError,\n TypoString,\n typoStyleQuote,\n typoStyleUserInput,\n TypoText,\n} from \"./Typo\";\n\nexport type Type<Value> = {\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 TypoError(\n new TypoText(\n new TypoString(`Invalid boolean: `),\n new TypoString(`\"${value}\"`, typoStyleQuote),\n ),\n );\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 TypoError(\n new TypoText(\n new TypoString(`Invalid date (ISO_8601): `),\n new TypoString(`\"${value}\"`, typoStyleQuote),\n ),\n );\n }\n return new Date(timestamp);\n },\n};\n\nexport const typeUrl: Type<URL> = {\n label: \"URL\",\n decoder(value: string) {\n try {\n return new URL(value);\n } catch {\n throw new TypoError(\n new TypoText(\n new TypoString(`Invalid URL: `),\n new TypoString(`\"${value}\"`, typoStyleQuote),\n ),\n );\n }\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 try {\n return Number(value);\n } catch {\n throw new TypoError(\n new TypoText(\n new TypoString(`Invalid number: `),\n new TypoString(`\"${value}\"`, typoStyleQuote),\n ),\n );\n }\n },\n};\n\nexport const typeBigInt: Type<bigint> = {\n label: \"BIGINT\",\n decoder(value: string) {\n try {\n return BigInt(value);\n } catch {\n throw new TypoError(\n new TypoText(\n new TypoString(`Invalid integer: `),\n new TypoString(`\"${value}\"`, typoStyleQuote),\n ),\n );\n }\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 valuesPreview = [];\n for (const value of values) {\n if (valuesPreview.length >= 5) {\n valuesPreview.push(new TypoString(`...`));\n break;\n }\n if (valuesPreview.length > 0) {\n valuesPreview.push(new TypoString(` | `));\n }\n valuesPreview.push(new TypoString(`\"${value}\"`, typoStyleQuote));\n }\n throw new TypoError(\n new TypoText(\n new TypoString(`Invalid value: `),\n new TypoString(`\"${value}\"`, typoStyleQuote),\n new TypoString(` (expected one of: `),\n ...valuesPreview,\n new TypoString(`)`),\n ),\n );\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 TypoError(\n new TypoText(\n new TypoString(`Invalid tuple: `),\n new TypoString(`\"${value}\"`, typoStyleQuote),\n new TypoString(` (expected ${elementTypes.length} parts)`),\n ),\n );\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 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 get 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(`: Requires a single value, but got multiple`),\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 get 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 get 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 {\n TypoError,\n TypoString,\n typoStyleConstants,\n typoStyleQuote,\n TypoText,\n} 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 new TypoString(`\"--\"`, typoStyleQuote),\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: `),\n new TypoString(`\"${arg}\"`, typoStyleQuote),\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 textUsageHero(\"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 introText = new TypoText();\n introText.pushString(textUsageText(commandUsage.information.description));\n if (commandUsage.information.hint) {\n introText.pushString(textDelimiter(\" \"));\n introText.pushString(textSubtleInfo(`(${commandUsage.information.hint})`));\n }\n lines.push(introText.computeStyledString(typoSupport));\n\n for (const detail of commandUsage.information.details ?? []) {\n const detailText = new TypoText();\n detailText.pushString(textSubtleInfo(detail));\n lines.push(detailText.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 textUsageHero(value: string): TypoString {\n return new TypoString(value, { fgColor: \"darkMagenta\", bold: true });\n}\n\nfunction textUsageText(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 textBlockTitle(value: string): TypoString {\n return new TypoString(value, { fgColor: \"darkGreen\", bold: true });\n}\n\nfunction textSubtleInfo(value: string): TypoString {\n return new TypoString(value, { italic: true, dim: 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 { CommandDescriptor, 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: CommandDescriptor<Context, void>,\n options?: {\n useColors?: boolean | undefined;\n usageOnHelp?: boolean | undefined;\n buildVersion?: string | undefined;\n onExecutionError?: ((error: unknown) => void) | undefined;\n onLogStdOut?: ((message: string) => void) | undefined;\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 = options?.usageOnHelp ?? true;\n if (usageOnHelp) {\n readerArgs.registerOption({\n shorts: [],\n longs: [\"help\"],\n valued: false,\n });\n }\n const buildVersion = options?.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 typoSupport = chooseTypoSupport(options?.useColors);\n const onLogStdOut = options?.onLogStdOut ?? console.log;\n const onLogStdErr = options?.onLogStdErr ?? console.error;\n const onExit = options?.onExit ?? process.exit;\n const commandFactory = command.createFactory(readerArgs);\n while (true) {\n try {\n const positional = readerArgs.consumePositional();\n if (positional === undefined) {\n break;\n }\n } catch (_) {}\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 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 (executionError) {\n if (options?.onExecutionError) {\n options.onExecutionError(executionError);\n } else {\n onLogStdErr(typoSupport.computeStyledErrorMessage(executionError));\n }\n return onExit(1);\n }\n } catch (parsingError) {\n onLogStdErr(computeUsageString(cliName, commandFactory, typoSupport));\n onLogStdErr(typoSupport.computeStyledErrorMessage(parsingError));\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","typoStyleQuote","typoStyleUserInput","usageToStyledLines","__toCommonJS","typoStyleFailure","typoStyleConstants","typoStyleUserInput","typoStyleQuote","_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","typoStyleUserInput","subcommandInput","typoStyleQuote","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","TypoError","TypoText","TypoString","typoStyleQuote","typeDate","timestamp","typeUrl","typeString","typeNumber","typeBigInt","typeMapped","before","after","typeDecode","typoStyleUserInput","typeOneOf","type","values","valuesSet","decoded","valuesPreview","typeTuple","elementTypes","separator","elementType","parts","part","index","typeList","context","error","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","typoStyleQuote","value","usageToStyledLines","params","cliName","commandUsage","typoSupport","lines","breadcrumbs","textUsageHero","textConstants","breadcrumb","textUserInput","introText","TypoText","textUsageText","textDelimiter","textSubtleInfo","detail","detailText","textBlockTitle","typoGrid","TypoGrid","positionalUsage","typoGridRow","createInformationals","row","subcommandUsage","optionUsage","usage","informationals","textUsefulInfo","value","TypoString","typoStyleConstants","typoStyleUserInput","runAsCliAndExit","cliName","cliArgs","context","command","options","readerArgs","ReaderArgs","usageOnHelp","buildVersion","typoSupport","chooseTypoSupport","onLogStdOut","onLogStdErr","onExit","commandFactory","computeUsageString","commandInstance","executionError","parsingError","usageToStyledLines","useColors","TypoSupport"]}
|
package/package.json
CHANGED
package/src/lib/Command.ts
CHANGED
|
@@ -2,7 +2,13 @@ import { OperationDescriptor } from "./Operation";
|
|
|
2
2
|
import { OptionUsage } from "./Option";
|
|
3
3
|
import { PositionalUsage } from "./Positional";
|
|
4
4
|
import { ReaderArgs } from "./Reader";
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
TypoError,
|
|
7
|
+
TypoString,
|
|
8
|
+
typoStyleQuote,
|
|
9
|
+
typoStyleUserInput,
|
|
10
|
+
TypoText,
|
|
11
|
+
} from "./Typo";
|
|
6
12
|
|
|
7
13
|
export type CommandDescriptor<Context, Result> = {
|
|
8
14
|
getInformation(): CommandInformation;
|
|
@@ -21,7 +27,7 @@ export type CommandInstance<Context, Result> = {
|
|
|
21
27
|
export type CommandInformation = {
|
|
22
28
|
description: string;
|
|
23
29
|
hint?: string;
|
|
24
|
-
details?: string
|
|
30
|
+
details?: Array<string>;
|
|
25
31
|
// TODO - printable examples ?
|
|
26
32
|
};
|
|
27
33
|
|
|
@@ -122,7 +128,8 @@ export function commandWithSubcommands<Context, Payload, Result>(
|
|
|
122
128
|
throw new TypoError(
|
|
123
129
|
new TypoText(
|
|
124
130
|
new TypoString(`<SUBCOMMAND>`, typoStyleUserInput),
|
|
125
|
-
new TypoString(`: Invalid value:
|
|
131
|
+
new TypoString(`: Invalid value: `),
|
|
132
|
+
new TypoString(`"${subcommandName}"`, typoStyleQuote),
|
|
126
133
|
),
|
|
127
134
|
);
|
|
128
135
|
}
|
package/src/lib/Option.ts
CHANGED
|
@@ -68,7 +68,7 @@ export function optionFlag(definition: {
|
|
|
68
68
|
throw new TypoError(
|
|
69
69
|
new TypoText(
|
|
70
70
|
new TypoString(`--${definition.long}`, typoStyleConstants),
|
|
71
|
-
new TypoString(`: Failed to
|
|
71
|
+
new TypoString(`: Failed to get default value`),
|
|
72
72
|
),
|
|
73
73
|
error,
|
|
74
74
|
);
|
|
@@ -123,7 +123,7 @@ export function optionSingleValue<Value>(definition: {
|
|
|
123
123
|
throw new TypoError(
|
|
124
124
|
new TypoText(
|
|
125
125
|
new TypoString(`--${definition.long}`, typoStyleConstants),
|
|
126
|
-
new TypoString(`:
|
|
126
|
+
new TypoString(`: Requires a single value, but got multiple`),
|
|
127
127
|
),
|
|
128
128
|
);
|
|
129
129
|
}
|
|
@@ -135,7 +135,7 @@ export function optionSingleValue<Value>(definition: {
|
|
|
135
135
|
throw new TypoError(
|
|
136
136
|
new TypoText(
|
|
137
137
|
new TypoString(`--${definition.long}`, typoStyleConstants),
|
|
138
|
-
new TypoString(`: Failed to
|
|
138
|
+
new TypoString(`: Failed to get default value`),
|
|
139
139
|
),
|
|
140
140
|
error,
|
|
141
141
|
);
|
package/src/lib/Positional.ts
CHANGED
|
@@ -72,7 +72,7 @@ export function positionalOptional<Value>(definition: {
|
|
|
72
72
|
throw new TypoError(
|
|
73
73
|
new TypoText(
|
|
74
74
|
new TypoString(label, typoStyleUserInput),
|
|
75
|
-
new TypoString(`: Failed to
|
|
75
|
+
new TypoString(`: Failed to get default value`),
|
|
76
76
|
),
|
|
77
77
|
error,
|
|
78
78
|
);
|
package/src/lib/Reader.ts
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
TypoError,
|
|
3
|
+
TypoString,
|
|
4
|
+
typoStyleConstants,
|
|
5
|
+
typoStyleQuote,
|
|
6
|
+
TypoText,
|
|
7
|
+
} from "./Typo";
|
|
2
8
|
|
|
3
9
|
export type ReaderOptionKey = (string | { __brand: "ReaderOptionKey" }) & {
|
|
4
10
|
__brand: "ReaderOptionKey";
|
|
@@ -211,7 +217,8 @@ export class ReaderArgs {
|
|
|
211
217
|
throw new TypoError(
|
|
212
218
|
new TypoText(
|
|
213
219
|
new TypoString(constant, typoStyleConstants),
|
|
214
|
-
new TypoString(`: Requires a value before
|
|
220
|
+
new TypoString(`: Requires a value before `),
|
|
221
|
+
new TypoString(`"--"`, typoStyleQuote),
|
|
215
222
|
),
|
|
216
223
|
);
|
|
217
224
|
}
|
|
@@ -220,7 +227,8 @@ export class ReaderArgs {
|
|
|
220
227
|
throw new TypoError(
|
|
221
228
|
new TypoText(
|
|
222
229
|
new TypoString(constant, typoStyleConstants),
|
|
223
|
-
new TypoString(`: Requires a value, but got:
|
|
230
|
+
new TypoString(`: Requires a value, but got: `),
|
|
231
|
+
new TypoString(`"${arg}"`, typoStyleQuote),
|
|
224
232
|
),
|
|
225
233
|
);
|
|
226
234
|
}
|
package/src/lib/Run.ts
CHANGED
|
@@ -8,18 +8,18 @@ export async function runAsCliAndExit<Context>(
|
|
|
8
8
|
cliArgs: ReadonlyArray<string>,
|
|
9
9
|
context: Context,
|
|
10
10
|
command: CommandDescriptor<Context, void>,
|
|
11
|
-
|
|
11
|
+
options?: {
|
|
12
|
+
useColors?: boolean | undefined;
|
|
12
13
|
usageOnHelp?: boolean | undefined;
|
|
13
14
|
buildVersion?: string | undefined;
|
|
14
|
-
|
|
15
|
-
onLogStdOut?: ((message: string) => void) | undefined;
|
|
15
|
+
onExecutionError?: ((error: unknown) => void) | undefined;
|
|
16
|
+
onLogStdOut?: ((message: string) => void) | undefined;
|
|
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
21
|
const readerArgs = new ReaderArgs(cliArgs);
|
|
22
|
-
const usageOnHelp =
|
|
22
|
+
const usageOnHelp = options?.usageOnHelp ?? true;
|
|
23
23
|
if (usageOnHelp) {
|
|
24
24
|
readerArgs.registerOption({
|
|
25
25
|
shorts: [],
|
|
@@ -27,7 +27,7 @@ export async function runAsCliAndExit<Context>(
|
|
|
27
27
|
valued: false,
|
|
28
28
|
});
|
|
29
29
|
}
|
|
30
|
-
const buildVersion =
|
|
30
|
+
const buildVersion = options?.buildVersion;
|
|
31
31
|
if (buildVersion) {
|
|
32
32
|
readerArgs.registerOption({
|
|
33
33
|
shorts: [],
|
|
@@ -43,10 +43,10 @@ export async function runAsCliAndExit<Context>(
|
|
|
43
43
|
longs: ["completion"],
|
|
44
44
|
});
|
|
45
45
|
*/
|
|
46
|
-
const typoSupport = chooseTypoSupport(
|
|
47
|
-
const onLogStdOut =
|
|
48
|
-
const onLogStdErr =
|
|
49
|
-
const onExit =
|
|
46
|
+
const typoSupport = chooseTypoSupport(options?.useColors);
|
|
47
|
+
const onLogStdOut = options?.onLogStdOut ?? console.log;
|
|
48
|
+
const onLogStdErr = options?.onLogStdErr ?? console.error;
|
|
49
|
+
const onExit = options?.onExit ?? process.exit;
|
|
50
50
|
const commandFactory = command.createFactory(readerArgs);
|
|
51
51
|
while (true) {
|
|
52
52
|
try {
|
|
@@ -74,8 +74,8 @@ export async function runAsCliAndExit<Context>(
|
|
|
74
74
|
await commandInstance.executeWithContext(context);
|
|
75
75
|
return onExit(0);
|
|
76
76
|
} catch (executionError) {
|
|
77
|
-
if (
|
|
78
|
-
|
|
77
|
+
if (options?.onExecutionError) {
|
|
78
|
+
options.onExecutionError(executionError);
|
|
79
79
|
} else {
|
|
80
80
|
onLogStdErr(typoSupport.computeStyledErrorMessage(executionError));
|
|
81
81
|
}
|
package/src/lib/Type.ts
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
TypoError,
|
|
3
|
+
TypoString,
|
|
4
|
+
typoStyleQuote,
|
|
5
|
+
typoStyleUserInput,
|
|
6
|
+
TypoText,
|
|
7
|
+
} from "./Typo";
|
|
2
8
|
|
|
3
9
|
export type Type<Value> = {
|
|
4
10
|
label: Uppercase<string>; // TODO - is there a better way to enforce uppercase labels?
|
|
@@ -15,7 +21,12 @@ export const typeBoolean: Type<boolean> = {
|
|
|
15
21
|
if (lowerValue === "false" || lowerValue === "no") {
|
|
16
22
|
return false;
|
|
17
23
|
}
|
|
18
|
-
throw new
|
|
24
|
+
throw new TypoError(
|
|
25
|
+
new TypoText(
|
|
26
|
+
new TypoString(`Invalid boolean: `),
|
|
27
|
+
new TypoString(`"${value}"`, typoStyleQuote),
|
|
28
|
+
),
|
|
29
|
+
);
|
|
19
30
|
},
|
|
20
31
|
};
|
|
21
32
|
|
|
@@ -24,7 +35,12 @@ export const typeDate: Type<Date> = {
|
|
|
24
35
|
decoder(value: string) {
|
|
25
36
|
const timestamp = Date.parse(value);
|
|
26
37
|
if (isNaN(timestamp)) {
|
|
27
|
-
throw new
|
|
38
|
+
throw new TypoError(
|
|
39
|
+
new TypoText(
|
|
40
|
+
new TypoString(`Invalid date (ISO_8601): `),
|
|
41
|
+
new TypoString(`"${value}"`, typoStyleQuote),
|
|
42
|
+
),
|
|
43
|
+
);
|
|
28
44
|
}
|
|
29
45
|
return new Date(timestamp);
|
|
30
46
|
},
|
|
@@ -33,7 +49,16 @@ export const typeDate: Type<Date> = {
|
|
|
33
49
|
export const typeUrl: Type<URL> = {
|
|
34
50
|
label: "URL",
|
|
35
51
|
decoder(value: string) {
|
|
36
|
-
|
|
52
|
+
try {
|
|
53
|
+
return new URL(value);
|
|
54
|
+
} catch {
|
|
55
|
+
throw new TypoError(
|
|
56
|
+
new TypoText(
|
|
57
|
+
new TypoString(`Invalid URL: `),
|
|
58
|
+
new TypoString(`"${value}"`, typoStyleQuote),
|
|
59
|
+
),
|
|
60
|
+
);
|
|
61
|
+
}
|
|
37
62
|
},
|
|
38
63
|
};
|
|
39
64
|
|
|
@@ -47,14 +72,32 @@ export const typeString: Type<string> = {
|
|
|
47
72
|
export const typeNumber: Type<number> = {
|
|
48
73
|
label: "NUMBER",
|
|
49
74
|
decoder(value: string) {
|
|
50
|
-
|
|
75
|
+
try {
|
|
76
|
+
return Number(value);
|
|
77
|
+
} catch {
|
|
78
|
+
throw new TypoError(
|
|
79
|
+
new TypoText(
|
|
80
|
+
new TypoString(`Invalid number: `),
|
|
81
|
+
new TypoString(`"${value}"`, typoStyleQuote),
|
|
82
|
+
),
|
|
83
|
+
);
|
|
84
|
+
}
|
|
51
85
|
},
|
|
52
86
|
};
|
|
53
87
|
|
|
54
88
|
export const typeBigInt: Type<bigint> = {
|
|
55
89
|
label: "BIGINT",
|
|
56
90
|
decoder(value: string) {
|
|
57
|
-
|
|
91
|
+
try {
|
|
92
|
+
return BigInt(value);
|
|
93
|
+
} catch {
|
|
94
|
+
throw new TypoError(
|
|
95
|
+
new TypoText(
|
|
96
|
+
new TypoString(`Invalid integer: `),
|
|
97
|
+
new TypoString(`"${value}"`, typoStyleQuote),
|
|
98
|
+
),
|
|
99
|
+
);
|
|
100
|
+
}
|
|
58
101
|
},
|
|
59
102
|
};
|
|
60
103
|
|
|
@@ -95,8 +138,26 @@ export function typeOneOf<Value>(
|
|
|
95
138
|
if (valuesSet.has(decoded)) {
|
|
96
139
|
return decoded;
|
|
97
140
|
}
|
|
98
|
-
const
|
|
99
|
-
|
|
141
|
+
const valuesPreview = [];
|
|
142
|
+
for (const value of values) {
|
|
143
|
+
if (valuesPreview.length >= 5) {
|
|
144
|
+
valuesPreview.push(new TypoString(`...`));
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
if (valuesPreview.length > 0) {
|
|
148
|
+
valuesPreview.push(new TypoString(` | `));
|
|
149
|
+
}
|
|
150
|
+
valuesPreview.push(new TypoString(`"${value}"`, typoStyleQuote));
|
|
151
|
+
}
|
|
152
|
+
throw new TypoError(
|
|
153
|
+
new TypoText(
|
|
154
|
+
new TypoString(`Invalid value: `),
|
|
155
|
+
new TypoString(`"${value}"`, typoStyleQuote),
|
|
156
|
+
new TypoString(` (expected one of: `),
|
|
157
|
+
...valuesPreview,
|
|
158
|
+
new TypoString(`)`),
|
|
159
|
+
),
|
|
160
|
+
);
|
|
100
161
|
},
|
|
101
162
|
};
|
|
102
163
|
}
|
|
@@ -112,7 +173,13 @@ export function typeTuple<const Elements extends Array<any>>(
|
|
|
112
173
|
decoder(value: string) {
|
|
113
174
|
const parts = value.split(separator, elementTypes.length);
|
|
114
175
|
if (parts.length !== elementTypes.length) {
|
|
115
|
-
throw new
|
|
176
|
+
throw new TypoError(
|
|
177
|
+
new TypoText(
|
|
178
|
+
new TypoString(`Invalid tuple: `),
|
|
179
|
+
new TypoString(`"${value}"`, typoStyleQuote),
|
|
180
|
+
new TypoString(` (expected ${elementTypes.length} parts)`),
|
|
181
|
+
),
|
|
182
|
+
);
|
|
116
183
|
}
|
|
117
184
|
return parts.map((part, index) =>
|
|
118
185
|
typeDecode(
|
package/src/lib/Typo.ts
CHANGED
|
@@ -26,6 +26,10 @@ export type TypoStyle = {
|
|
|
26
26
|
strikethrough?: boolean;
|
|
27
27
|
};
|
|
28
28
|
|
|
29
|
+
export const typoStyleFailure: TypoStyle = {
|
|
30
|
+
fgColor: "darkRed",
|
|
31
|
+
bold: true,
|
|
32
|
+
};
|
|
29
33
|
export const typoStyleConstants: TypoStyle = {
|
|
30
34
|
fgColor: "darkCyan",
|
|
31
35
|
bold: true,
|
|
@@ -34,8 +38,8 @@ export const typoStyleUserInput: TypoStyle = {
|
|
|
34
38
|
fgColor: "darkBlue",
|
|
35
39
|
bold: true,
|
|
36
40
|
};
|
|
37
|
-
export const
|
|
38
|
-
fgColor: "
|
|
41
|
+
export const typoStyleQuote: TypoStyle = {
|
|
42
|
+
fgColor: "darkYellow",
|
|
39
43
|
bold: true,
|
|
40
44
|
};
|
|
41
45
|
|
package/src/lib/Usage.ts
CHANGED
|
@@ -18,7 +18,7 @@ export function usageToStyledLines(params: {
|
|
|
18
18
|
const lines = new Array<string>();
|
|
19
19
|
|
|
20
20
|
const breadcrumbs = [
|
|
21
|
-
|
|
21
|
+
textUsageHero("Usage:").computeStyledString(typoSupport),
|
|
22
22
|
textConstants(cliName).computeStyledString(typoSupport),
|
|
23
23
|
].concat(
|
|
24
24
|
commandUsage.breadcrumbs.map((breadcrumb) => {
|
|
@@ -38,16 +38,18 @@ export function usageToStyledLines(params: {
|
|
|
38
38
|
lines.push(breadcrumbs.join(" "));
|
|
39
39
|
|
|
40
40
|
lines.push("");
|
|
41
|
-
const
|
|
42
|
-
|
|
41
|
+
const introText = new TypoText();
|
|
42
|
+
introText.pushString(textUsageText(commandUsage.information.description));
|
|
43
43
|
if (commandUsage.information.hint) {
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
introText.pushString(textDelimiter(" "));
|
|
45
|
+
introText.pushString(textSubtleInfo(`(${commandUsage.information.hint})`));
|
|
46
46
|
}
|
|
47
|
-
lines.push(
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
47
|
+
lines.push(introText.computeStyledString(typoSupport));
|
|
48
|
+
|
|
49
|
+
for (const detail of commandUsage.information.details ?? []) {
|
|
50
|
+
const detailText = new TypoText();
|
|
51
|
+
detailText.pushString(textSubtleInfo(detail));
|
|
52
|
+
lines.push(detailText.computeStyledString(typoSupport));
|
|
51
53
|
}
|
|
52
54
|
|
|
53
55
|
if (commandUsage.positionals.length > 0) {
|
|
@@ -146,26 +148,26 @@ function createInformationals(usage: {
|
|
|
146
148
|
return [];
|
|
147
149
|
}
|
|
148
150
|
|
|
149
|
-
function
|
|
150
|
-
return new TypoString(value, { bold: true });
|
|
151
|
+
function textUsageHero(value: string): TypoString {
|
|
152
|
+
return new TypoString(value, { fgColor: "darkMagenta", bold: true });
|
|
151
153
|
}
|
|
152
154
|
|
|
153
|
-
function
|
|
154
|
-
return new TypoString(value, {
|
|
155
|
+
function textUsageText(value: string): TypoString {
|
|
156
|
+
return new TypoString(value, { bold: true });
|
|
155
157
|
}
|
|
156
158
|
|
|
157
159
|
function textUsefulInfo(value: string): TypoString {
|
|
158
160
|
return new TypoString(value);
|
|
159
161
|
}
|
|
160
162
|
|
|
161
|
-
function textSubtleInfo(value: string): TypoString {
|
|
162
|
-
return new TypoString(value, { italic: true, dim: true });
|
|
163
|
-
}
|
|
164
|
-
|
|
165
163
|
function textBlockTitle(value: string): TypoString {
|
|
166
164
|
return new TypoString(value, { fgColor: "darkGreen", bold: true });
|
|
167
165
|
}
|
|
168
166
|
|
|
167
|
+
function textSubtleInfo(value: string): TypoString {
|
|
168
|
+
return new TypoString(value, { italic: true, dim: true });
|
|
169
|
+
}
|
|
170
|
+
|
|
169
171
|
function textConstants(value: string): TypoString {
|
|
170
172
|
return new TypoString(value, typoStyleConstants);
|
|
171
173
|
}
|
|
@@ -142,11 +142,11 @@ it("run", async () => {
|
|
|
142
142
|
});
|
|
143
143
|
|
|
144
144
|
async function executeInterpreted<Context, Result>(
|
|
145
|
-
|
|
145
|
+
args: Array<string>,
|
|
146
146
|
context: Context,
|
|
147
147
|
command: CommandDescriptor<Context, Result>,
|
|
148
148
|
) {
|
|
149
|
-
const readerArgs = new ReaderArgs(
|
|
149
|
+
const readerArgs = new ReaderArgs(args);
|
|
150
150
|
const commandFactory = command.createFactory(readerArgs);
|
|
151
151
|
const commandInstance = commandFactory.createInstance();
|
|
152
152
|
return await commandInstance.executeWithContext(context);
|
|
@@ -22,10 +22,7 @@ import {
|
|
|
22
22
|
const cmd = commandWithSubcommands<string, any, any>(
|
|
23
23
|
{
|
|
24
24
|
description: "Root command description",
|
|
25
|
-
details: [
|
|
26
|
-
"Root command details.",
|
|
27
|
-
"Second line of root command details.",
|
|
28
|
-
].join(" "),
|
|
25
|
+
details: ["Root command details.", "Second line of root command details."],
|
|
29
26
|
},
|
|
30
27
|
operation(
|
|
31
28
|
{
|
|
@@ -73,7 +70,7 @@ const cmd = commandWithSubcommands<string, any, any>(
|
|
|
73
70
|
details: [
|
|
74
71
|
"Subcommand 1 details.",
|
|
75
72
|
"Second line of subcommand 1 details.",
|
|
76
|
-
]
|
|
73
|
+
],
|
|
77
74
|
},
|
|
78
75
|
operation(
|
|
79
76
|
{
|
|
@@ -98,7 +95,7 @@ const cmd = commandWithSubcommands<string, any, any>(
|
|
|
98
95
|
details: [
|
|
99
96
|
"Subcommand 2 details.",
|
|
100
97
|
"Second line of subcommand 2 details.",
|
|
101
|
-
]
|
|
98
|
+
],
|
|
102
99
|
},
|
|
103
100
|
operation(
|
|
104
101
|
{
|
|
@@ -154,7 +151,8 @@ it("run", async () => {
|
|
|
154
151
|
"{{Usage:}@darkMagenta}+ {{my-cli}@darkCyan}+ {{<POS-1>}@darkBlue}+ {{<POS-2>}@darkBlue}+ {{<SUBCOMMAND>}@darkBlue}+",
|
|
155
152
|
"",
|
|
156
153
|
"{Root command description}+",
|
|
157
|
-
"{{Root command details.
|
|
154
|
+
"{{Root command details.}-}*",
|
|
155
|
+
"{{Second line of root command details.}-}*",
|
|
158
156
|
"",
|
|
159
157
|
"{{Positionals:}@darkGreen}+",
|
|
160
158
|
" {{<POS-1>}@darkBlue}+ Required positional number 1",
|
|
@@ -174,7 +172,8 @@ it("run", async () => {
|
|
|
174
172
|
"{{Usage:}@darkMagenta}+ {{my-cli}@darkCyan}+ {{<POS-1>}@darkBlue}+ {{<POS-2>}@darkBlue}+ {{sub1}@darkCyan}+ {{<POS-STRING>}@darkBlue}+",
|
|
175
173
|
"",
|
|
176
174
|
"{Subcommand 1 description}+",
|
|
177
|
-
"{{Subcommand 1 details.
|
|
175
|
+
"{{Subcommand 1 details.}-}*",
|
|
176
|
+
"{{Second line of subcommand 1 details.}-}*",
|
|
178
177
|
"",
|
|
179
178
|
"{{Positionals:}@darkGreen}+",
|
|
180
179
|
" {{<POS-1>}@darkBlue}+ Required positional number 1",
|
|
@@ -191,7 +190,8 @@ it("run", async () => {
|
|
|
191
190
|
"{{Usage:}@darkMagenta}+ {{my-cli}@darkCyan}+ {{<POS-1>}@darkBlue}+ {{<POS-2>}@darkBlue}+ {{sub2}@darkCyan}+ {{<POS-NUMBER>}@darkBlue}+ {{[OPT-POS]}@darkBlue}+ {{[VARIADIC]...}@darkBlue}+",
|
|
192
191
|
"",
|
|
193
192
|
"{Subcommand 2 description}+ {{(Subcommand 2 hint)}-}*",
|
|
194
|
-
"{{Subcommand 2 details.
|
|
193
|
+
"{{Subcommand 2 details.}-}*",
|
|
194
|
+
"{{Second line of subcommand 2 details.}-}*",
|
|
195
195
|
"",
|
|
196
196
|
"{{Positionals:}@darkGreen}+",
|
|
197
197
|
" {{<POS-1>}@darkBlue}+ Required positional number 1",
|
|
@@ -170,7 +170,7 @@ it("run", async () => {
|
|
|
170
170
|
await testCase(
|
|
171
171
|
["--flag=42", "required1", "subcommand", "required2"],
|
|
172
172
|
[],
|
|
173
|
-
[subcommandUsage, 'Error: --flag: <BOOLEAN>: Invalid
|
|
173
|
+
[subcommandUsage, 'Error: --flag: <BOOLEAN>: Invalid boolean: "42"'],
|
|
174
174
|
1,
|
|
175
175
|
);
|
|
176
176
|
await testCase(
|
|
@@ -224,7 +224,7 @@ it("run", async () => {
|
|
|
224
224
|
[],
|
|
225
225
|
[
|
|
226
226
|
subcommandUsage,
|
|
227
|
-
'Error: <REQUIRED2>:
|
|
227
|
+
'Error: <REQUIRED2>: Invalid value: "invalid" (expected one of: "required2" | "required2-bis")',
|
|
228
228
|
],
|
|
229
229
|
1,
|
|
230
230
|
);
|
|
@@ -233,14 +233,14 @@ it("run", async () => {
|
|
|
233
233
|
[],
|
|
234
234
|
[
|
|
235
235
|
subcommandUsage,
|
|
236
|
-
'Error: --single-value: <NUMBER>:
|
|
236
|
+
'Error: --single-value: <NUMBER>: Invalid value: "44" (expected one of: "42" | "43")',
|
|
237
237
|
],
|
|
238
238
|
1,
|
|
239
239
|
);
|
|
240
240
|
await testCase(
|
|
241
241
|
["required1", "subcommand", "required2", "--url", "not-a-url"],
|
|
242
242
|
[],
|
|
243
|
-
[subcommandUsage,
|
|
243
|
+
[subcommandUsage, 'Error: --url: <URL>: Invalid URL: "not-a-url"'],
|
|
244
244
|
1,
|
|
245
245
|
);
|
|
246
246
|
|
|
@@ -268,7 +268,10 @@ it("run", async () => {
|
|
|
268
268
|
"43",
|
|
269
269
|
],
|
|
270
270
|
[],
|
|
271
|
-
[
|
|
271
|
+
[
|
|
272
|
+
subcommandUsage,
|
|
273
|
+
"Error: --single-value: Requires a single value, but got multiple",
|
|
274
|
+
],
|
|
272
275
|
1,
|
|
273
276
|
);
|
|
274
277
|
});
|