cli-kiss 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -243,7 +243,7 @@ declare function command<Context, Result>(information: CommandInformation, opera
243
243
  declare function commandWithSubcommands<Context, Payload, Result>(information: CommandInformation, operation: Operation<Context, Payload>, subcommands: {
244
244
  [subcommand: Lowercase<string>]: Command<Payload, Result>;
245
245
  }): Command<Context, Result>;
246
- declare function commandChained<Context, Payload, Result>(metadata: CommandInformation, operation: Operation<Context, Payload>, nextCommand: Command<Payload, Result>): Command<Context, Result>;
246
+ declare function commandChained<Context, Payload, Result>(information: CommandInformation, operation: Operation<Context, Payload>, nextCommand: Command<Payload, Result>): Command<Context, Result>;
247
247
 
248
248
  declare function runAsCliAndExit<Context>(cliName: Lowercase<string>, cliArgs: ReadonlyArray<string>, context: Context, command: Command<Context, void>, application?: {
249
249
  usageOnHelp?: boolean | undefined;
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- "use strict";var z=Object.defineProperty;var mt=Object.getOwnPropertyDescriptor;var yt=Object.getOwnPropertyNames;var ht=Object.prototype.hasOwnProperty;var at=t=>{throw TypeError(t)};var ft=(t,e)=>{for(var n in e)z(t,n,{get:e[n],enumerable:!0})},wt=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of yt(e))!ht.call(t,r)&&r!==n&&z(t,r,{get:()=>e[r],enumerable:!(o=mt(e,r))||o.enumerable});return t};var bt=t=>wt(z({},"__esModule",{value:!0}),t);var Q=(t,e,n)=>e.has(t)||at("Cannot "+n);var c=(t,e,n)=>(Q(t,e,"read from private field"),n?n.call(t):e.get(t)),b=(t,e,n)=>e.has(t)?at("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,n),f=(t,e,n,o)=>(Q(t,e,"write to private field"),o?o.call(t,n):e.set(t,n),n),w=(t,e,n)=>(Q(t,e,"access private method"),n);var pt=(t,e,n,o)=>({set _(r){f(t,e,r,n)},get _(){return c(t,e,o)}});var Zt={};ft(Zt,{ReaderArgs:()=>K,TypoError:()=>m,TypoGrid:()=>$,TypoString:()=>i,TypoSupport:()=>P,TypoText:()=>l,command:()=>kt,commandChained:()=>$t,commandWithSubcommands:()=>At,operation:()=>Pt,optionFlag:()=>Kt,optionRepeatable:()=>Nt,optionSingleValue:()=>Dt,positionalOptional:()=>Yt,positionalRequired:()=>jt,positionalVariadics:()=>qt,runAsCliAndExit:()=>Qt,typeBigInt:()=>Gt,typeBoolean:()=>Y,typeDate:()=>Vt,typeDecode:()=>x,typeList:()=>Wt,typeMapped:()=>Lt,typeNumber:()=>Bt,typeOneOf:()=>Ft,typeString:()=>vt,typeTuple:()=>Mt,typeUrl:()=>Et,typoStyleConstants:()=>y,typoStyleFailure:()=>lt,typoStyleUserInput:()=>h,usageToStyledLines:()=>st});module.exports=bt(Zt);var y={fgColor:"darkCyan",bold:!0},h={fgColor:"darkBlue",bold:!0},lt={fgColor:"darkRed",bold:!0},v,W,i=class{constructor(e,n={}){b(this,v);b(this,W);f(this,v,e),f(this,W,n)}getRawString(){return c(this,v)}computeStyledString(e){return e.computeStyledString(c(this,v),c(this,W))}};v=new WeakMap,W=new WeakMap;var S,X=class X{constructor(...e){b(this,S);f(this,S,[]);for(let n of e)n instanceof X?this.pushText(n):n instanceof i?this.pushString(n):typeof n=="string"&&this.pushString(new i(n))}pushString(e){c(this,S).push(e)}pushText(e){for(let n of c(e,S))c(this,S).push(n)}computeStyledString(e){return c(this,S).map(n=>n.computeStyledString(e)).join("")}computeRawString(){return c(this,S).map(e=>e.getRawString()).join("")}computeRawLength(){let e=0;for(let n of c(this,S))e+=n.getRawString().length;return e}};S=new WeakMap;var l=X,A,$=class{constructor(){b(this,A);f(this,A,[])}pushRow(e){c(this,A).push(e)}computeStyledGrid(e){let n=new Array,o=new Array;for(let r of c(this,A))for(let s=0;s<r.length;s++){let p=r[s].computeRawLength();(n[s]===void 0||p>n[s])&&(n[s]=p)}for(let r of c(this,A)){let s=new Array;for(let a=0;a<r.length;a++){let p=r[a],u=p.computeStyledString(e);if(s.push(u),a<r.length-1){let g=p.computeRawLength(),O=" ".repeat(n[a]-g);s.push(O)}}o.push(s)}return o}};A=new WeakMap;var B,Z=class Z extends Error{constructor(n,o){let r=new l;r.pushText(n),o instanceof Error?r.pushString(new i(`: ${o.message}`)):o instanceof Z?(r.pushString(new i(": ")),r.pushText(c(o,B))):o!==void 0&&r.pushString(new i(`: ${String(o)}`));super(r.computeRawString());b(this,B);f(this,B,r)}computeStyledString(n){return c(this,B).computeStyledString(n)}};B=new WeakMap;var m=Z,R,C=class C{constructor(e){b(this,R);f(this,R,e)}static none(){return new C("none")}static tty(){return new C("tty")}static mock(){return new C("mock")}static inferFromProcess(){if(!process)return C.none();if(process.env){if(process.env.FORCE_COLOR==="0")return C.none();if(process.env.FORCE_COLOR)return C.tty();if("NO_COLOR"in process.env)return C.none()}return!process.stdout||!process.stdout.isTTY?C.none():C.tty()}computeStyledString(e,n){if(c(this,R)==="none")return e;if(c(this,R)==="tty"){let o=n.fgColor?Rt[n.fgColor]:"",r=n.bgColor?It[n.bgColor]:"",s=n.bold?Ct:"",a=n.dim?St:"",p=n.italic?Tt:"",u=n.underline?Ut:"",g=n.strikethrough?Ot:"";return`${o}${r}${s}${a}${p}${u}${g}${e}${xt}`}if(c(this,R)==="mock"){let o=n.fgColor?`{${e}}@${n.fgColor}`:e,r=n.bgColor?`{${o}}#${n.bgColor}`:o,s=n.bold?`{${r}}+`:r,a=n.dim?`{${s}}-`:s,p=n.italic?`{${a}}*`:a,u=n.underline?`{${p}}_`:p;return n.strikethrough?`{${u}}~`:u}throw new Error(`Unknown TypoSupport kind: ${c(this,R)}`)}computeStyledErrorMessage(e){return[this.computeStyledString("Error:",lt),e instanceof m?e.computeStyledString(this):e instanceof Error?e.message:String(e)].join(" ")}};R=new WeakMap;var P=C,xt="\x1B[0m",Ct="\x1B[1m",St="\x1B[2m",Tt="\x1B[3m",Ut="\x1B[4m",Ot="\x1B[9m",Rt={darkBlack:"\x1B[30m",darkRed:"\x1B[31m",darkGreen:"\x1B[32m",darkYellow:"\x1B[33m",darkBlue:"\x1B[34m",darkMagenta:"\x1B[35m",darkCyan:"\x1B[36m",darkWhite:"\x1B[37m",brightBlack:"\x1B[90m",brightRed:"\x1B[91m",brightGreen:"\x1B[92m",brightYellow:"\x1B[93m",brightBlue:"\x1B[94m",brightMagenta:"\x1B[95m",brightCyan:"\x1B[96m",brightWhite:"\x1B[97m"},It={darkBlack:"\x1B[40m",darkRed:"\x1B[41m",darkGreen:"\x1B[42m",darkYellow:"\x1B[43m",darkBlue:"\x1B[44m",darkMagenta:"\x1B[45m",darkCyan:"\x1B[46m",darkWhite:"\x1B[47m",brightBlack:"\x1B[100m",brightRed:"\x1B[101m",brightGreen:"\x1B[102m",brightYellow:"\x1B[103m",brightBlue:"\x1B[104m",brightMagenta:"\x1B[105m",brightCyan:"\x1B[106m",brightWhite:"\x1B[107m"};function kt(t,e){return{getInformation(){return t},createFactory(n){function o(){let r=e.generateUsage();return{breadcrumbs:r.positionals.map(s=>j(s.label)),information:t,positionals:r.positionals,subcommands:[],options:r.options}}try{let r=e.createFactory(n),s=n.consumePositional();if(s!==void 0)throw Error(`Unexpected argument: "${s}"`);return{generateUsage:o,createInstance(){let a=r.createInstance();return{async executeWithContext(p){return await a.executeWithContext(p)}}}}}catch(r){return{generateUsage:o,createInstance(){throw r}}}}}}function At(t,e,n){return{getInformation(){return t},createFactory(o){try{let r=e.createFactory(o),s=o.consumePositional();if(s===void 0)throw new m(new l(new i("<SUBCOMMAND>",y),new i(": Is required, but was not provided")));let a=n[s];if(a===void 0)throw new m(new l(new i("<SUBCOMMAND>",y),new i(`: Invalid value: "${s}"`)));let p=a.createFactory(o);return{generateUsage(){let u=e.generateUsage(),g=p.generateUsage();return{breadcrumbs:u.positionals.map(O=>j(O.label)).concat([ut(s)]).concat(g.breadcrumbs),information:g.information,positionals:u.positionals.concat(g.positionals),subcommands:g.subcommands,options:u.options.concat(g.options)}},createInstance(){let u=r.createInstance(),g=p.createInstance();return{async executeWithContext(O){return await g.executeWithContext(await u.executeWithContext(O))}}}}}catch(r){return{generateUsage(){let s=e.generateUsage();return{breadcrumbs:s.positionals.map(a=>j(a.label)).concat([ut("<SUBCOMMAND>")]),information:t,positionals:s.positionals,subcommands:Object.entries(n).map(a=>{let p=a[1].getInformation();return{name:a[0],description:p.description,hint:p.hint}}),options:s.options}},createInstance(){throw r}}}}}}function $t(t,e,n){return{getInformation(){return t},createFactory(o){let r=e.createFactory(o),s=n.createFactory(o);return{generateUsage(){let a=e.generateUsage(),p=s.generateUsage();return{information:p.information,breadcrumbs:a.positionals.map(u=>j(u.label)).concat(p.breadcrumbs),positionals:a.positionals.concat(p.positionals),subcommands:p.subcommands,options:a.options.concat(p.options)}},createInstance(){let a=r.createInstance(),p=s.createInstance();return{async executeWithContext(u){return await p.executeWithContext(await a.executeWithContext(u))}}}}}}}function j(t){return{positional:t}}function ut(t){return{command:t}}function Pt(t,e){return{generateUsage(){let n=new Array;for(let r in t.options){let s=t.options[r];s&&n.push(s.generateUsage())}let o=new Array;for(let r of t.positionals)o.push(r.generateUsage());return{options:n,positionals:o}},createFactory(n){let o={};for(let s in t.options){let a=t.options[s];o[s]=a.createGetter(n)}let r=[];for(let s of t.positionals)r.push(s.consumePositionals(n));return{createInstance(){let s={};for(let a in o)s[a]=o[a].getValue();return{executeWithContext(a){return e(a,{options:s,positionals:r})}}}}}}}var Y={label:"BOOLEAN",decoder(t){let e=t.toLowerCase();if(e==="true"||e==="yes")return!0;if(e==="false"||e==="no")return!1;throw new Error(`Invalid value: "${t}"`)}},Vt={label:"DATE",decoder(t){let e=Date.parse(t);if(isNaN(e))throw new Error(`Invalid ISO_8601 value: "${t}"`);return new Date(e)}},Et={label:"URL",decoder(t){return new URL(t)}},vt={label:"STRING",decoder(t){return t}},Bt={label:"NUMBER",decoder(t){return Number(t)}},Gt={label:"BIGINT",decoder(t){return BigInt(t)}};function Lt(t,e){return{label:e.label,decoder:n=>e.decoder(x(t,n,()=>new l(new i(t.label,h))))}}function Ft(t,e){let n=new Set(e);return{label:t.label,decoder(o){let r=x(t,o,()=>new l(new i(t.label,h)));if(n.has(r))return r;let s=e.map(a=>`"${a}"`).join("|");throw new Error(`Unexpected value: "${o}" (expected: ${s})`)}}}function Mt(t,e=","){return{label:t.map(n=>n.label).join(e),decoder(n){let o=n.split(e,t.length);if(o.length!==t.length)throw new Error(`Invalid tuple parts: ${JSON.stringify(o)}`);return o.map((r,s)=>x(t[s],r,()=>new l(new i(t[s].label,h),new i(`@${s}`))))}}}function Wt(t,e=","){return{label:`${t.label}[${e}${t.label}]...`,decoder(n){return n.split(e).map((o,r)=>x(t,o,()=>new l(new i(t.label,h),new i(`@${r}`))))}}}function x(t,e,n){try{return t.decoder(e)}catch(o){throw new m(n(),o)}}function Kt(t){let e=`<${Y.label}>`;return{generateUsage(){return{description:t.description,hint:t.hint,long:t.long,short:t.short,label:void 0}},createGetter(n){let o=_(n,{...t,valued:!1});return{getValue(){let r=n.getOptionValues(o);if(r.length>1)throw new m(new l(new i(`--${t.long}`,y),new i(": Must not be set multiple times")));let s=r[0];if(s===void 0)try{return t.default?t.default():!1}catch(a){throw new m(new l(new i(`--${t.long}`,y),new i(": Failed to compute default value")),a)}return x(Y,s,()=>new l(new i(`--${t.long}`,y),new i(": "),new i(e,h)))}}}}}function Dt(t){let e=`<${t.label??t.type.label}>`;return{generateUsage(){return{description:t.description,hint:t.hint,long:t.long,short:t.short,label:e}},createGetter(n){let o=_(n,{...t,valued:!0});return{getValue(){let r=n.getOptionValues(o);if(r.length>1)throw new m(new l(new i(`--${t.long}`,y),new i(": Must not be set multiple times")));let s=r[0];if(s===void 0)try{return t.default()}catch(a){throw new m(new l(new i(`--${t.long}`,y),new i(": Failed to compute default value")),a)}return x(t.type,s,()=>new l(new i(`--${t.long}`,y),new i(": "),new i(e,h)))}}}}}function Nt(t){let e=`<${t.label??t.type.label}>`;return{generateUsage(){return{description:t.description,hint:t.hint,long:t.long,short:t.short,label:e}},createGetter(n){let o=_(n,{...t,valued:!0});return{getValue(){return n.getOptionValues(o).map(r=>x(t.type,r,()=>new l(new i(`--${t.long}`,y),new i(": "),new i(e,h))))}}}}}function _(t,e){let{long:n,short:o,aliases:r,valued:s}=e,a=n?[n]:[];r?.longs&&a.push(...r?.longs);let p=o?[o]:[];return r?.shorts&&p.push(...r?.shorts),t.registerOption({longs:a,shorts:p,valued:s})}function jt(t){let e=`<${t.label??t.type.label}>`;return{generateUsage(){return{description:t.description,hint:t.hint,label:e}},consumePositionals(n){let o=n.consumePositional();if(o===void 0)throw new m(new l(new i(e,h),new i(": Is required, but was not provided")));return x(t.type,o,()=>new l(new i(e,h)))}}}function Yt(t){let e=`[${t.label??t.type.label}]`;return{generateUsage(){return{description:t.description,hint:t.hint,label:e}},consumePositionals(n){let o=n.consumePositional();if(o===void 0)try{return t.default()}catch(r){throw new m(new l(new i(e,h),new i(": Failed to compute default value")),r)}return x(t.type,o,()=>new l(new i(e,h)))}}}function qt(t){let e=`[${t.label??t.type.label}]`;return{generateUsage(){return{description:t.description,hint:t.hint,label:`${e}...`+(t.endDelimiter?`["${t.endDelimiter}"]`:"")}},consumePositionals(n){let o=[];for(;;){let r=n.consumePositional();if(r===void 0||r===t.endDelimiter)break;o.push(x(t.type,r,()=>new l(new i(e,h))))}return o}}}var D,G,k,V,T,E,L,d,q,ct,tt,gt,et,I,K=class{constructor(e){b(this,d);b(this,D);b(this,G);b(this,k);b(this,V);b(this,T);b(this,E);b(this,L);f(this,D,e),f(this,G,0),f(this,k,!1),f(this,V,new Map),f(this,T,new Map),f(this,E,new Map),f(this,L,new Map)}registerOption(e){let n=[...e.longs.map(o=>`--${o}`),...e.shorts.map(o=>`-${o}`)].join(", ");for(let o of e.longs){if(c(this,V).has(o))throw new Error(`Option already registered: --${o}`);c(this,V).set(o,n)}for(let o of e.shorts){if(c(this,T).has(o))throw new Error(`Option already registered: -${o}`);for(let r=0;r<o.length;r++){let s=o.slice(0,r);if(c(this,T).has(s))throw new Error(`Option -${o} overlap with shorter option: -${s}`)}for(let r of c(this,T).keys())if(r.startsWith(o))throw new Error(`Option -${o} overlap with longer option: -${r}`);c(this,T).set(o,n)}return c(this,E).set(n,e.valued),c(this,L).set(n,new Array),n}getOptionValues(e){let n=c(this,L).get(e);if(n===void 0)throw new Error(`Unregistered option: ${e}`);return n}consumePositional(){for(;;){let e=w(this,d,q).call(this);if(e===null)return;if(w(this,d,ct).call(this,e))return e}}};D=new WeakMap,G=new WeakMap,k=new WeakMap,V=new WeakMap,T=new WeakMap,E=new WeakMap,L=new WeakMap,d=new WeakSet,q=function(){let e=c(this,D)[c(this,G)];return e===void 0?null:(pt(this,G)._++,!c(this,k)&&e==="--"?(f(this,k,!0),w(this,d,q).call(this)):e)},ct=function(e){if(c(this,k))return!0;if(e.startsWith("--")){let n=e.indexOf("=");return n===-1?w(this,d,tt).call(this,e.slice(2),null):w(this,d,tt).call(this,e.slice(2,n),e.slice(n+1)),!1}if(e.startsWith("-")){let n=1,o=2;for(;o<=e.length;){let r=w(this,d,gt).call(this,e.slice(n,o),e.slice(o));if(r===!0)return!1;r===!1&&(n=o),o++}throw new m(new l(new i(`-${e.slice(n)}`,y),new i(": Unexpected unknown option")))}return!0},tt=function(e,n){let o=`--${e}`,r=c(this,V).get(e);if(r!==void 0)return n!==null?w(this,d,I).call(this,r,n):c(this,E).get(r)?w(this,d,I).call(this,r,w(this,d,et).call(this,o)):w(this,d,I).call(this,r,"true");throw new m(new l(new i(o,y),new i(": Unexpected unknown option")))},gt=function(e,n){let o=c(this,T).get(e);return o!==void 0?n.startsWith("=")?(w(this,d,I).call(this,o,n.slice(1)),!0):c(this,E).get(o)?(n===""?w(this,d,I).call(this,o,w(this,d,et).call(this,`-${e}`)):w(this,d,I).call(this,o,n),!0):(w(this,d,I).call(this,o,"true"),n===""):null},et=function(e){let n=w(this,d,q).call(this);if(n===null)throw new m(new l(new i(e,y),new i(": requires a value, but got end of input")));if(c(this,k))throw new m(new l(new i(e,y),new i(': requires a value before "--"')));if(n.startsWith("-"))throw new m(new l(new i(e,y),new i(`: requires a value, but got: "${n}"`)));return n},I=function(e,n){this.getOptionValues(e).push(n)};function st(t){let{cliName:e,commandUsage:n,typoSupport:o}=t,r=new Array,s=[Jt("Usage:").computeStyledString(o),F(e).computeStyledString(o)].concat(n.breadcrumbs.map(p=>{if("positional"in p)return rt(p.positional).computeStyledString(o);if("command"in p)return F(p.command).computeStyledString(o);throw new Error(`Unknown breadcrumb: ${JSON.stringify(p)}`)}));r.push(s.join(" ")),r.push("");let a=new l;if(a.pushString(Ht(n.information.description)),n.information.hint&&(a.pushString(U(" ")),a.pushString(H(`(${n.information.hint})`))),r.push(a.computeStyledString(o)),n.information.details){let p=H(n.information.details);r.push(p.computeStyledString(o))}if(n.positionals.length>0){r.push(""),r.push(ot("Positionals:").computeStyledString(o));let p=new $;for(let u of n.positionals){let g=new Array;g.push(new l(U(" "))),g.push(new l(rt(u.label))),g.push(...nt(u)),p.pushRow(g)}r.push(...p.computeStyledGrid(o).map(u=>u.join("")))}if(n.subcommands.length>0){r.push(""),r.push(ot("Subcommands:").computeStyledString(o));let p=new $;for(let u of n.subcommands){let g=new Array;g.push(new l(U(" "))),g.push(new l(F(u.name))),g.push(...nt(u)),p.pushRow(g)}r.push(...p.computeStyledGrid(o).map(u=>u.join("")))}if(n.options.length>0){r.push(""),r.push(ot("Options:").computeStyledString(o));let p=new $;for(let u of n.options){let g=new Array;g.push(new l(U(" "))),u.short?g.push(new l(F(`-${u.short}`),U(", "))):g.push(new l),u.label?g.push(new l(F(`--${u.long}`),U(" "),rt(u.label))):g.push(new l(F(`--${u.long}`),H("[=no]"))),g.push(...nt(u)),p.pushRow(g)}r.push(...p.computeStyledGrid(o).map(u=>u.join("")))}return r.push(""),r}function nt(t){let e=[];return t.description&&(e.push(U(" ")),e.push(zt(t.description))),t.hint&&(e.push(U(" ")),e.push(H(`(${t.hint})`))),e.length>0?[new l(U(" "),...e)]:[]}function Ht(t){return new i(t,{bold:!0})}function Jt(t){return new i(t,{fgColor:"darkMagenta",bold:!0})}function zt(t){return new i(t)}function H(t){return new i(t,{italic:!0,dim:!0})}function ot(t){return new i(t,{fgColor:"darkGreen",bold:!0})}function F(t){return new i(t,y)}function rt(t){return new i(t,h)}function U(t){return new i(t)}async function Qt(t,e,n,o,r){let s=new K(e),a=r?.usageOnHelp??!0;a&&s.registerOption({shorts:[],longs:["help"],valued:!1});let p=r?.buildVersion;p&&s.registerOption({shorts:[],longs:["version"],valued:!1});let u=o.createFactory(s);for(;s.consumePositional()!==void 0;);let g=Xt(r?.useColors),O=r?.onLogStdOut??console.log,J=r?.onLogStdErr??console.error,M=r?.onExit??process.exit;if(a&&s.getOptionValues("--help").length>0)return O(dt(t,u,g)),M(0);if(p&&s.getOptionValues("--version").length>0)return O([t,p].join(" ")),M(0);try{let N=u.createInstance();try{return await N.executeWithContext(n),M(0)}catch(it){return r?.onExecutionError?r.onExecutionError(it):J(g.computeStyledErrorMessage(it)),M(1)}}catch(N){return J(dt(t,u,g)),J(g.computeStyledErrorMessage(N)),M(1)}}function dt(t,e,n){return st({cliName:t,commandUsage:e.generateUsage(),typoSupport:n}).join(`
2
- `)}function Xt(t){return t===void 0?P.inferFromProcess():t?P.tty():P.none()}0&&(module.exports={ReaderArgs,TypoError,TypoGrid,TypoString,TypoSupport,TypoText,command,commandChained,commandWithSubcommands,operation,optionFlag,optionRepeatable,optionSingleValue,positionalOptional,positionalRequired,positionalVariadics,runAsCliAndExit,typeBigInt,typeBoolean,typeDate,typeDecode,typeList,typeMapped,typeNumber,typeOneOf,typeString,typeTuple,typeUrl,typoStyleConstants,typoStyleFailure,typoStyleUserInput,usageToStyledLines});
1
+ "use strict";var X=Object.defineProperty;var yt=Object.getOwnPropertyDescriptor;var ht=Object.getOwnPropertyNames;var ft=Object.prototype.hasOwnProperty;var pt=t=>{throw TypeError(t)};var wt=(t,e)=>{for(var n in e)X(t,n,{get:e[n],enumerable:!0})},bt=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of ht(e))!ft.call(t,o)&&o!==n&&X(t,o,{get:()=>e[o],enumerable:!(r=yt(e,o))||r.enumerable});return t};var xt=t=>bt(X({},"__esModule",{value:!0}),t);var Z=(t,e,n)=>e.has(t)||pt("Cannot "+n);var c=(t,e,n)=>(Z(t,e,"read from private field"),n?n.call(t):e.get(t)),b=(t,e,n)=>e.has(t)?pt("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,n),f=(t,e,n,r)=>(Z(t,e,"write to private field"),r?r.call(t,n):e.set(t,n),n),w=(t,e,n)=>(Z(t,e,"access private method"),n);var lt=(t,e,n,r)=>({set _(o){f(t,e,o,n)},get _(){return c(t,e,r)}});var _t={};wt(_t,{ReaderArgs:()=>N,TypoError:()=>m,TypoGrid:()=>$,TypoString:()=>i,TypoSupport:()=>P,TypoText:()=>l,command:()=>At,commandChained:()=>Pt,commandWithSubcommands:()=>$t,operation:()=>Vt,optionFlag:()=>Dt,optionRepeatable:()=>jt,optionSingleValue:()=>Nt,positionalOptional:()=>qt,positionalRequired:()=>Yt,positionalVariadics:()=>Ht,runAsCliAndExit:()=>Xt,typeBigInt:()=>Lt,typeBoolean:()=>q,typeDate:()=>Et,typeDecode:()=>x,typeList:()=>Kt,typeMapped:()=>Ft,typeNumber:()=>Gt,typeOneOf:()=>Mt,typeString:()=>Bt,typeTuple:()=>Wt,typeUrl:()=>vt,typoStyleConstants:()=>y,typoStyleFailure:()=>ut,typoStyleUserInput:()=>h,usageToStyledLines:()=>at});module.exports=xt(_t);var y={fgColor:"darkCyan",bold:!0},h={fgColor:"darkBlue",bold:!0},ut={fgColor:"darkRed",bold:!0},B,D,i=class{constructor(e,n={}){b(this,B);b(this,D);f(this,B,e),f(this,D,n)}getRawString(){return c(this,B)}computeStyledString(e){return e.computeStyledString(c(this,B),c(this,D))}};B=new WeakMap,D=new WeakMap;var S,_=class _{constructor(...e){b(this,S);f(this,S,[]);for(let n of e)n instanceof _?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=_,A,$=class{constructor(){b(this,A);f(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(),T=" ".repeat(n[a]-g);s.push(T)}}r.push(s)}return r}};A=new WeakMap;var G,tt=class tt extends Error{constructor(n,r){let o=new l;o.pushText(n),r instanceof Error?o.pushString(new i(`: ${r.message}`)):r instanceof tt?(o.pushString(new i(": ")),o.pushText(c(r,G))):r!==void 0&&o.pushString(new i(`: ${String(r)}`));super(o.computeRawString());b(this,G);f(this,G,o)}computeStyledString(n){return c(this,G).computeStyledString(n)}};G=new WeakMap;var m=tt,R,C=class C{constructor(e){b(this,R);f(this,R,e)}static none(){return new C("none")}static tty(){return new C("tty")}static mock(){return new C("mock")}static inferFromProcess(){if(!process)return C.none();if(process.env){if(process.env.FORCE_COLOR==="0")return C.none();if(process.env.FORCE_COLOR)return C.tty();if("NO_COLOR"in process.env)return C.none()}return!process.stdout||!process.stdout.isTTY?C.none():C.tty()}computeStyledString(e,n){if(c(this,R)==="none")return e;if(c(this,R)==="tty"){let r=n.fgColor?It[n.fgColor]:"",o=n.bgColor?kt[n.bgColor]:"",s=n.bold?St:"",a=n.dim?Tt:"",p=n.italic?Ut:"",u=n.underline?Ot:"",g=n.strikethrough?Rt:"";return`${r}${o}${s}${a}${p}${u}${g}${e}${Ct}`}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:",ut),e instanceof m?e.computeStyledString(this):e instanceof Error?e.message:String(e)].join(" ")}};R=new WeakMap;var P=C,Ct="\x1B[0m",St="\x1B[1m",Tt="\x1B[2m",Ut="\x1B[3m",Ot="\x1B[4m",Rt="\x1B[9m",It={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"},kt={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 At(t,e){return{getInformation(){return t},createFactory(n){function r(){let o=e.generateUsage();return{breadcrumbs:o.positionals.map(s=>L(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 $t(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(T=>L(T.label)).concat([ct(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(T){return await g.executeWithContext(await u.executeWithContext(T))}}}}}catch(o){return{generateUsage(){let s=e.generateUsage();return{breadcrumbs:s.positionals.map(a=>L(a.label)).concat([ct("<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 Pt(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=>L(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=>L(a.label)).concat([L("[REST]...")]),information:t,positionals:s.positionals,subcommands:[],options:s.options}},createInstance(){throw o}}}}}}function L(t){return{positional:t}}function ct(t){return{command:t}}function Vt(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 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 Error(`Invalid value: "${t}"`)}},Et={label:"DATE",decoder(t){let e=Date.parse(t);if(isNaN(e))throw new Error(`Invalid ISO_8601 value: "${t}"`);return new Date(e)}},vt={label:"URL",decoder(t){return new URL(t)}},Bt={label:"STRING",decoder(t){return t}},Gt={label:"NUMBER",decoder(t){return Number(t)}},Lt={label:"BIGINT",decoder(t){return BigInt(t)}};function Ft(t,e){return{label:e.label,decoder:n=>e.decoder(x(t,n,()=>new l(new i(t.label,h))))}}function Mt(t,e){let n=new Set(e);return{label:t.label,decoder(r){let o=x(t,r,()=>new l(new i(t.label,h)));if(n.has(o))return o;let s=e.map(a=>`"${a}"`).join("|");throw new Error(`Unexpected value: "${r}" (expected: ${s})`)}}}function Wt(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,h),new i(`@${s}`))))}}}function Kt(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,h),new i(`@${o}`))))}}}function x(t,e,n){try{return t.decoder(e)}catch(r){throw new m(n(),r)}}function Dt(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=et(n,{...t,valued:!1});return{getValue(){let o=n.getOptionValues(r);if(o.length>1)throw new m(new l(new i(`--${t.long}`,y),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}`,y),new i(": Failed to compute default value")),a)}return x(q,s,()=>new l(new i(`--${t.long}`,y),new i(": "),new i(e,h)))}}}}}function Nt(t){let e=`<${t.label??t.type.label}>`;return{generateUsage(){return{description:t.description,hint:t.hint,long:t.long,short:t.short,label:e}},createGetter(n){let r=et(n,{...t,valued:!0});return{getValue(){let o=n.getOptionValues(r);if(o.length>1)throw new m(new l(new i(`--${t.long}`,y),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}`,y),new i(": Failed to compute default value")),a)}return x(t.type,s,()=>new l(new i(`--${t.long}`,y),new i(": "),new i(e,h)))}}}}}function 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=et(n,{...t,valued:!0});return{getValue(){return n.getOptionValues(r).map(o=>x(t.type,o,()=>new l(new i(`--${t.long}`,y),new i(": "),new i(e,h))))}}}}}function et(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 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 m(new l(new i(e,h),new i(": Is required, but was not provided")));return x(t.type,r,()=>new l(new i(e,h)))}}}function qt(t){let e=`[${t.label??t.type.label}]`;return{generateUsage(){return{description:t.description,hint:t.hint,label:e}},consumePositionals(n){let r=n.consumePositional();if(r===void 0)try{return t.default()}catch(o){throw new m(new l(new i(e,h),new i(": Failed to compute default value")),o)}return x(t.type,r,()=>new l(new i(e,h)))}}}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(x(t.type,o,()=>new l(new i(e,h))))}return r}}}var j,F,k,V,U,E,M,d,H,gt,nt,dt,ot,I,N=class{constructor(e){b(this,d);b(this,j);b(this,F);b(this,k);b(this,V);b(this,U);b(this,E);b(this,M);f(this,j,e),f(this,F,0),f(this,k,!1),f(this,V,new Map),f(this,U,new Map),f(this,E,new Map),f(this,M,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,V).has(r))throw new Error(`Option already registered: --${r}`);c(this,V).set(r,n)}for(let r of e.shorts){if(c(this,U).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,U).has(s))throw new Error(`Option -${r} overlap with shorter option: -${s}`)}for(let o of c(this,U).keys())if(o.startsWith(r))throw new Error(`Option -${r} overlap with longer option: -${o}`);c(this,U).set(r,n)}return c(this,E).set(n,e.valued),c(this,M).set(n,new Array),n}getOptionValues(e){let n=c(this,M).get(e);if(n===void 0)throw new Error(`Unregistered option: ${e}`);return n}consumePositional(){for(;;){let e=w(this,d,H).call(this);if(e===null)return;if(w(this,d,gt).call(this,e))return e}}};j=new WeakMap,F=new WeakMap,k=new WeakMap,V=new WeakMap,U=new WeakMap,E=new WeakMap,M=new WeakMap,d=new WeakSet,H=function(){let e=c(this,j)[c(this,F)];return e===void 0?null:(lt(this,F)._++,!c(this,k)&&e==="--"?(f(this,k,!0),w(this,d,H).call(this)):e)},gt=function(e){if(c(this,k))return!0;if(e.startsWith("--")){let n=e.indexOf("=");return n===-1?w(this,d,nt).call(this,e.slice(2),null):w(this,d,nt).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,d,dt).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)}`,y),new i(": Unexpected unknown option")))}return!0},nt=function(e,n){let r=`--${e}`,o=c(this,V).get(e);if(o!==void 0)return n!==null?w(this,d,I).call(this,o,n):c(this,E).get(o)?w(this,d,I).call(this,o,w(this,d,ot).call(this,r)):w(this,d,I).call(this,o,"true");throw new m(new l(new i(r,y),new i(": Unexpected unknown option")))},dt=function(e,n){let r=c(this,U).get(e);return r!==void 0?n.startsWith("=")?(w(this,d,I).call(this,r,n.slice(1)),!0):c(this,E).get(r)?(n===""?w(this,d,I).call(this,r,w(this,d,ot).call(this,`-${e}`)):w(this,d,I).call(this,r,n),!0):(w(this,d,I).call(this,r,"true"),n===""):null},ot=function(e){let n=w(this,d,H).call(this);if(n===null)throw new m(new l(new i(e,y),new i(": Requires a value, but got end of input")));if(c(this,k))throw new m(new l(new i(e,y),new i(': Requires a value before "--"')));if(n.startsWith("-"))throw new m(new l(new i(e,y),new i(`: Requires a value, but got: "${n}"`)));return n},I=function(e,n){this.getOptionValues(e).push(n)};function at(t){let{cliName:e,commandUsage:n,typoSupport:r}=t,o=new Array,s=[zt("Usage:").computeStyledString(r),W(e).computeStyledString(r)].concat(n.breadcrumbs.map(p=>{if("positional"in p)return it(p.positional).computeStyledString(r);if("command"in p)return W(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(Jt(n.information.description)),n.information.hint&&(a.pushString(O(" ")),a.pushString(J(`(${n.information.hint})`))),o.push(a.computeStyledString(r)),n.information.details){let p=J(n.information.details);o.push(p.computeStyledString(r))}if(n.positionals.length>0){o.push(""),o.push(st("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(it(u.label))),g.push(...rt(u)),p.pushRow(g)}o.push(...p.computeStyledGrid(r).map(u=>u.join("")))}if(n.subcommands.length>0){o.push(""),o.push(st("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(W(u.name))),g.push(...rt(u)),p.pushRow(g)}o.push(...p.computeStyledGrid(r).map(u=>u.join("")))}if(n.options.length>0){o.push(""),o.push(st("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(W(`-${u.short}`),O(", "))):g.push(new l),u.label?g.push(new l(W(`--${u.long}`),O(" "),it(u.label))):g.push(new l(W(`--${u.long}`),J("[=no]"))),g.push(...rt(u)),p.pushRow(g)}o.push(...p.computeStyledGrid(r).map(u=>u.join("")))}return o.push(""),o}function rt(t){let e=[];return t.description&&(e.push(O(" ")),e.push(Qt(t.description))),t.hint&&(e.push(O(" ")),e.push(J(`(${t.hint})`))),e.length>0?[new l(O(" "),...e)]:[]}function Jt(t){return new i(t,{bold:!0})}function zt(t){return new i(t,{fgColor:"darkMagenta",bold:!0})}function Qt(t){return new i(t)}function J(t){return new i(t,{italic:!0,dim:!0})}function st(t){return new i(t,{fgColor:"darkGreen",bold:!0})}function W(t){return new i(t,y)}function it(t){return new i(t,h)}function O(t){return new i(t)}async function Xt(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=Zt(o?.useColors),g=o?.onLogStdOut??console.log,T=o?.onLogStdErr??console.error,K=o?.onExit??process.exit,z=r.createFactory(s),Q=[];for(;;)try{if(s.consumePositional()===void 0)break}catch(v){Q.push(v)}if(a&&s.getOptionValues("--help").length>0)return g(mt(t,z,u)),K(0);if(p&&s.getOptionValues("--version").length>0)return g([t,p].join(" ")),K(0);try{let v=z.createInstance();try{return await v.executeWithContext(n),K(0)}catch(Y){return o?.onExecutionError?o.onExecutionError(Y):T(u.computeStyledErrorMessage(Y)),K(1)}}catch(v){Q.unshift(v),T(mt(t,z,u));for(let Y of Q)T(u.computeStyledErrorMessage(Y));return K(1)}}function mt(t,e,n){return at({cliName:t,commandUsage:e.generateUsage(),typoSupport:n}).join(`
2
+ `)}function Zt(t){return t===void 0?P.inferFromProcess():t?P.tty():P.none()}0&&(module.exports={ReaderArgs,TypoError,TypoGrid,TypoString,TypoSupport,TypoText,command,commandChained,commandWithSubcommands,operation,optionFlag,optionRepeatable,optionSingleValue,positionalOptional,positionalRequired,positionalVariadics,runAsCliAndExit,typeBigInt,typeBoolean,typeDate,typeDecode,typeList,typeMapped,typeNumber,typeOneOf,typeString,typeTuple,typeUrl,typoStyleConstants,typoStyleFailure,typoStyleUserInput,usageToStyledLines});
3
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/Typo.ts","../src/lib/Command.ts","../src/lib/Operation.ts","../src/lib/Type.ts","../src/lib/Option.ts","../src/lib/Positional.ts","../src/lib/Reader.ts","../src/lib/Usage.ts","../src/lib/Run.ts"],"sourcesContent":["export * from \"./lib/Command\";\nexport * from \"./lib/Operation\";\nexport * from \"./lib/Option\";\nexport * from \"./lib/Positional\";\nexport * from \"./lib/Reader\";\nexport * from \"./lib/Run\";\nexport * from \"./lib/Type\";\nexport * from \"./lib/Typo\";\nexport * from \"./lib/Usage\";\n","export type TypoColor =\n | \"darkBlack\"\n | \"darkRed\"\n | \"darkGreen\"\n | \"darkYellow\"\n | \"darkBlue\"\n | \"darkMagenta\"\n | \"darkCyan\"\n | \"darkWhite\"\n | \"brightBlack\"\n | \"brightRed\"\n | \"brightGreen\"\n | \"brightYellow\"\n | \"brightBlue\"\n | \"brightMagenta\"\n | \"brightCyan\"\n | \"brightWhite\";\n\nexport type TypoStyle = {\n fgColor?: TypoColor;\n bgColor?: TypoColor;\n dim?: boolean;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n};\n\nexport const typoStyleConstants: TypoStyle = {\n fgColor: \"darkCyan\",\n bold: true,\n};\nexport const typoStyleUserInput: TypoStyle = {\n fgColor: \"darkBlue\",\n bold: true,\n};\nexport const typoStyleFailure: TypoStyle = {\n fgColor: \"darkRed\",\n bold: true,\n};\n\nexport class TypoString {\n #value: string;\n #typoStyle: TypoStyle;\n constructor(value: string, typoStyle: TypoStyle = {}) {\n this.#value = value;\n this.#typoStyle = typoStyle;\n }\n getRawString(): string {\n return this.#value;\n }\n computeStyledString(typoSupport: TypoSupport): string {\n return typoSupport.computeStyledString(this.#value, this.#typoStyle);\n }\n}\n\nexport class TypoText {\n #typoStrings: Array<TypoString>;\n constructor(...typoParts: Array<TypoText | TypoString | string>) {\n this.#typoStrings = [];\n for (const typoPart of typoParts) {\n if (typoPart instanceof TypoText) {\n this.pushText(typoPart);\n } else if (typoPart instanceof TypoString) {\n this.pushString(typoPart);\n } else if (typeof typoPart === \"string\") {\n this.pushString(new TypoString(typoPart));\n }\n }\n }\n pushString(typoString: TypoString) {\n this.#typoStrings.push(typoString);\n }\n pushText(typoText: TypoText) {\n for (const typoString of typoText.#typoStrings) {\n this.#typoStrings.push(typoString);\n }\n }\n computeStyledString(typoSupport: TypoSupport): string {\n return this.#typoStrings\n .map((t) => t.computeStyledString(typoSupport))\n .join(\"\");\n }\n computeRawString(): string {\n return this.#typoStrings.map((t) => t.getRawString()).join(\"\");\n }\n computeRawLength(): number {\n let length = 0;\n for (const typoString of this.#typoStrings) {\n length += typoString.getRawString().length;\n }\n return length;\n }\n}\n\nexport class TypoGrid {\n #typoRows: Array<Array<TypoText>>;\n constructor() {\n this.#typoRows = [];\n }\n pushRow(cells: Array<TypoText>) {\n this.#typoRows.push(cells);\n }\n computeStyledGrid(typoSupport: TypoSupport): Array<Array<string>> {\n const widths = new Array<number>();\n const printableGrid = new Array<Array<string>>();\n for (const typoGridRow of this.#typoRows) {\n for (\n let typoGridColumnIndex = 0;\n typoGridColumnIndex < typoGridRow.length;\n typoGridColumnIndex++\n ) {\n const typoGridCell = typoGridRow[typoGridColumnIndex]!;\n const width = typoGridCell.computeRawLength();\n if (\n widths[typoGridColumnIndex] === undefined ||\n width > widths[typoGridColumnIndex]!\n ) {\n widths[typoGridColumnIndex] = width;\n }\n }\n }\n for (const typoGridRow of this.#typoRows) {\n const printableGridRow = new Array<string>();\n for (\n let typoGridColumnIndex = 0;\n typoGridColumnIndex < typoGridRow.length;\n typoGridColumnIndex++\n ) {\n const typoGridCell = typoGridRow[typoGridColumnIndex]!;\n const printableGridCell = typoGridCell.computeStyledString(typoSupport);\n printableGridRow.push(printableGridCell);\n if (typoGridColumnIndex < typoGridRow.length - 1) {\n const width = typoGridCell.computeRawLength();\n const padding = \" \".repeat(widths[typoGridColumnIndex]! - width);\n printableGridRow.push(padding);\n }\n }\n printableGrid.push(printableGridRow);\n }\n return printableGrid;\n }\n}\n\nexport class TypoError extends Error {\n #typoText: TypoText;\n constructor(currentTypoText: TypoText, source?: unknown) {\n const typoText = new TypoText();\n typoText.pushText(currentTypoText);\n if (source instanceof Error) {\n typoText.pushString(new TypoString(`: ${source.message}`));\n } else if (source instanceof TypoError) {\n typoText.pushString(new TypoString(\": \"));\n typoText.pushText(source.#typoText);\n } else if (source !== undefined) {\n typoText.pushString(new TypoString(`: ${String(source)}`));\n }\n super(typoText.computeRawString());\n this.#typoText = typoText;\n }\n computeStyledString(typoSupport: TypoSupport): string {\n return this.#typoText.computeStyledString(typoSupport);\n }\n}\n\nexport class TypoSupport {\n #kind: \"none\" | \"tty\" | \"mock\";\n private constructor(kind: \"none\" | \"tty\" | \"mock\") {\n this.#kind = kind;\n }\n static none(): TypoSupport {\n return new TypoSupport(\"none\");\n }\n static tty(): TypoSupport {\n return new TypoSupport(\"tty\");\n }\n static mock(): TypoSupport {\n return new TypoSupport(\"mock\");\n }\n static inferFromProcess(): TypoSupport {\n if (!process) {\n return TypoSupport.none();\n }\n if (process.env) {\n if (process.env[\"FORCE_COLOR\"] === \"0\") {\n return TypoSupport.none();\n }\n if (process.env[\"FORCE_COLOR\"]) {\n return TypoSupport.tty();\n }\n if (\"NO_COLOR\" in process.env) {\n return TypoSupport.none();\n }\n }\n if (!process.stdout || !process.stdout.isTTY) {\n return TypoSupport.none();\n }\n return TypoSupport.tty();\n }\n computeStyledString(value: string, typoStyle: TypoStyle): string {\n if (this.#kind === \"none\") {\n return value;\n }\n if (this.#kind === \"tty\") {\n const fgColorCode = typoStyle.fgColor\n ? ttyCodeFgColors[typoStyle.fgColor]\n : \"\";\n const bgColorCode = typoStyle.bgColor\n ? ttyCodeBgColors[typoStyle.bgColor]\n : \"\";\n const boldCode = typoStyle.bold ? ttyCodeBold : \"\";\n const dimCode = typoStyle.dim ? ttyCodeDim : \"\";\n const italicCode = typoStyle.italic ? ttyCodeItalic : \"\";\n const underlineCode = typoStyle.underline ? ttyCodeUnderline : \"\";\n const strikethroughCode = typoStyle.strikethrough\n ? ttyCodeStrikethrough\n : \"\";\n return `${fgColorCode}${bgColorCode}${boldCode}${dimCode}${italicCode}${underlineCode}${strikethroughCode}${value}${ttyCodeReset}`;\n }\n if (this.#kind === \"mock\") {\n const fgColorPart = typoStyle.fgColor\n ? `{${value}}@${typoStyle.fgColor}`\n : value;\n const bgColorPart = typoStyle.bgColor\n ? `{${fgColorPart}}#${typoStyle.bgColor}`\n : fgColorPart;\n const boldPart = typoStyle.bold ? `{${bgColorPart}}+` : bgColorPart;\n const dimPart = typoStyle.dim ? `{${boldPart}}-` : boldPart;\n const italicPart = typoStyle.italic ? `{${dimPart}}*` : dimPart;\n const underlinePart = typoStyle.underline\n ? `{${italicPart}}_`\n : italicPart;\n const strikethroughPart = typoStyle.strikethrough\n ? `{${underlinePart}}~`\n : underlinePart;\n return strikethroughPart;\n }\n throw new Error(`Unknown TypoSupport kind: ${this.#kind}`);\n }\n computeStyledErrorMessage(error: unknown): string {\n return [\n this.computeStyledString(\"Error:\", typoStyleFailure),\n error instanceof TypoError\n ? error.computeStyledString(this)\n : error instanceof Error\n ? error.message\n : String(error),\n ].join(\" \");\n }\n}\n\nconst ttyCodeReset = \"\\x1b[0m\";\nconst ttyCodeBold = \"\\x1b[1m\";\nconst ttyCodeDim = \"\\x1b[2m\";\nconst ttyCodeItalic = \"\\x1b[3m\";\nconst ttyCodeUnderline = \"\\x1b[4m\";\nconst ttyCodeStrikethrough = \"\\x1b[9m\";\nconst ttyCodeFgColors: Record<TypoColor, string> = {\n darkBlack: \"\\x1b[30m\",\n darkRed: \"\\x1b[31m\",\n darkGreen: \"\\x1b[32m\",\n darkYellow: \"\\x1b[33m\",\n darkBlue: \"\\x1b[34m\",\n darkMagenta: \"\\x1b[35m\",\n darkCyan: \"\\x1b[36m\",\n darkWhite: \"\\x1b[37m\",\n brightBlack: \"\\x1b[90m\",\n brightRed: \"\\x1b[91m\",\n brightGreen: \"\\x1b[92m\",\n brightYellow: \"\\x1b[93m\",\n brightBlue: \"\\x1b[94m\",\n brightMagenta: \"\\x1b[95m\",\n brightCyan: \"\\x1b[96m\",\n brightWhite: \"\\x1b[97m\",\n};\nconst ttyCodeBgColors: Record<TypoColor, string> = {\n darkBlack: \"\\x1b[40m\",\n darkRed: \"\\x1b[41m\",\n darkGreen: \"\\x1b[42m\",\n darkYellow: \"\\x1b[43m\",\n darkBlue: \"\\x1b[44m\",\n darkMagenta: \"\\x1b[45m\",\n darkCyan: \"\\x1b[46m\",\n darkWhite: \"\\x1b[47m\",\n brightBlack: \"\\x1b[100m\",\n brightRed: \"\\x1b[101m\",\n brightGreen: \"\\x1b[102m\",\n brightYellow: \"\\x1b[103m\",\n brightBlue: \"\\x1b[104m\",\n brightMagenta: \"\\x1b[105m\",\n brightCyan: \"\\x1b[106m\",\n brightWhite: \"\\x1b[107m\",\n};\n","import { Operation } from \"./Operation\";\nimport { OptionUsage } from \"./Option\";\nimport { PositionalUsage } from \"./Positional\";\nimport { ReaderArgs } from \"./Reader\";\nimport { TypoError, TypoString, typoStyleConstants, TypoText } from \"./Typo\";\n\nexport type Command<Context, Result> = {\n getInformation(): CommandInformation;\n createFactory(readerArgs: ReaderArgs): CommandFactory<Context, Result>;\n};\n\nexport type CommandFactory<Context, Result> = {\n generateUsage(): CommandUsage;\n createInstance(): CommandInstance<Context, Result>;\n};\n\nexport type CommandInstance<Context, Result> = {\n executeWithContext(context: Context): Promise<Result>;\n};\n\nexport type CommandInformation = {\n description: string;\n hint?: string;\n details?: string;\n // TODO - printable examples ?\n};\n\nexport type CommandUsage = {\n breadcrumbs: Array<CommandUsageBreadcrumb>;\n information: CommandInformation;\n positionals: Array<PositionalUsage>;\n subcommands: Array<CommandUsageSubcommand>;\n options: Array<OptionUsage>;\n};\n\nexport type CommandUsageBreadcrumb =\n | { positional: string }\n | { command: string };\n\nexport type CommandUsageSubcommand = {\n name: string;\n description: string | undefined;\n hint: string | undefined;\n};\n\nexport function command<Context, Result>(\n information: CommandInformation,\n operation: Operation<Context, Result>,\n): Command<Context, Result> {\n return {\n getInformation() {\n return information;\n },\n createFactory(readerArgs: ReaderArgs) {\n function generateUsage(): CommandUsage {\n const operationUsage = operation.generateUsage();\n return {\n breadcrumbs: operationUsage.positionals.map((positional) =>\n breadcrumbPositional(positional.label),\n ),\n information: information,\n positionals: operationUsage.positionals,\n subcommands: [],\n options: operationUsage.options,\n };\n }\n try {\n const operationFactory = operation.createFactory(readerArgs);\n const endPositional = readerArgs.consumePositional();\n if (endPositional !== undefined) {\n throw Error(`Unexpected argument: \"${endPositional}\"`);\n }\n return {\n generateUsage,\n createInstance() {\n const operationInstance = operationFactory.createInstance();\n return {\n async executeWithContext(context: Context) {\n return await operationInstance.executeWithContext(context);\n },\n };\n },\n };\n } catch (error) {\n return {\n generateUsage,\n createInstance() {\n throw error;\n },\n };\n }\n },\n };\n}\n\nexport function commandWithSubcommands<Context, Payload, Result>(\n information: CommandInformation,\n operation: Operation<Context, Payload>,\n subcommands: { [subcommand: Lowercase<string>]: Command<Payload, Result> },\n): Command<Context, Result> {\n return {\n getInformation() {\n return information;\n },\n createFactory(readerArgs: ReaderArgs) {\n try {\n const operationFactory = operation.createFactory(readerArgs);\n const subcommandName = readerArgs.consumePositional();\n if (subcommandName === undefined) {\n throw new TypoError(\n new TypoText(\n new TypoString(`<SUBCOMMAND>`, typoStyleConstants),\n new TypoString(`: Is required, but was not provided`),\n ),\n );\n }\n const subcommandInput =\n subcommands[subcommandName as Lowercase<string>];\n if (subcommandInput === undefined) {\n throw new TypoError(\n new TypoText(\n new TypoString(`<SUBCOMMAND>`, typoStyleConstants),\n new TypoString(`: Invalid value: \"${subcommandName}\"`),\n ),\n );\n }\n const subcommandFactory = subcommandInput.createFactory(readerArgs);\n return {\n generateUsage() {\n const operationUsage = operation.generateUsage();\n const subcommandUsage = subcommandFactory.generateUsage();\n return {\n breadcrumbs: operationUsage.positionals\n .map((positional) => breadcrumbPositional(positional.label))\n .concat([breadcrumbCommand(subcommandName)])\n .concat(subcommandUsage.breadcrumbs),\n information: subcommandUsage.information,\n positionals: operationUsage.positionals.concat(\n subcommandUsage.positionals,\n ),\n subcommands: subcommandUsage.subcommands,\n options: operationUsage.options.concat(subcommandUsage.options),\n };\n },\n createInstance() {\n const operationInstance = operationFactory.createInstance();\n const subcommandInstance = subcommandFactory.createInstance();\n return {\n async executeWithContext(context: Context) {\n return await subcommandInstance.executeWithContext(\n await operationInstance.executeWithContext(context),\n );\n },\n };\n },\n };\n } catch (error) {\n return {\n generateUsage() {\n const operationUsage = operation.generateUsage();\n return {\n breadcrumbs: operationUsage.positionals\n .map((positional) => breadcrumbPositional(positional.label))\n .concat([breadcrumbCommand(\"<SUBCOMMAND>\")]),\n information: information,\n positionals: operationUsage.positionals,\n subcommands: Object.entries(subcommands).map((subcommand) => {\n const metadata = subcommand[1].getInformation();\n return {\n name: subcommand[0],\n description: metadata.description,\n hint: metadata.hint,\n };\n }),\n options: operationUsage.options,\n };\n },\n createInstance() {\n throw error;\n },\n };\n }\n },\n };\n}\n\nexport function commandChained<Context, Payload, Result>(\n metadata: CommandInformation,\n operation: Operation<Context, Payload>,\n nextCommand: Command<Payload, Result>,\n): Command<Context, Result> {\n return {\n getInformation() {\n return metadata;\n },\n createFactory(readerArgs: ReaderArgs) {\n const operationFactory = operation.createFactory(readerArgs);\n const nextCommandFactory = nextCommand.createFactory(readerArgs);\n return {\n generateUsage() {\n const operationUsage = operation.generateUsage();\n const nextCommandUsage = nextCommandFactory.generateUsage();\n return {\n information: nextCommandUsage.information,\n breadcrumbs: operationUsage.positionals\n .map((positional) => breadcrumbPositional(positional.label))\n .concat(nextCommandUsage.breadcrumbs),\n positionals: operationUsage.positionals.concat(\n nextCommandUsage.positionals,\n ),\n subcommands: nextCommandUsage.subcommands,\n options: operationUsage.options.concat(nextCommandUsage.options),\n };\n },\n createInstance() {\n const operationInstance = operationFactory.createInstance();\n const nextCommandInstance = nextCommandFactory.createInstance();\n return {\n async executeWithContext(context: Context) {\n return await nextCommandInstance.executeWithContext(\n await operationInstance.executeWithContext(context),\n );\n },\n };\n },\n };\n },\n };\n}\n\nfunction breadcrumbPositional(value: string): CommandUsageBreadcrumb {\n return { positional: value };\n}\n\nfunction breadcrumbCommand(value: string): CommandUsageBreadcrumb {\n return { command: value };\n}\n","import { Option, OptionUsage } from \"./Option\";\nimport { Positional, PositionalUsage } from \"./Positional\";\nimport { ReaderArgs } from \"./Reader\";\n\nexport type Operation<Input, Output> = {\n generateUsage(): OperationUsage;\n createFactory(readerArgs: ReaderArgs): OperationFactory<Input, Output>;\n};\n\nexport type OperationFactory<Input, Output> = {\n createInstance(): OperationInstance<Input, Output>;\n};\n\nexport type OperationInstance<Input, Output> = {\n executeWithContext(input: Input): Promise<Output>;\n};\n\nexport type OperationUsage = {\n options: Array<OptionUsage>;\n positionals: Array<PositionalUsage>;\n};\n\nexport function operation<\n Context,\n Result,\n Options extends { [option: string]: any },\n const Positionals extends Array<any>,\n>(\n inputs: {\n options: { [K in keyof Options]: Option<Options[K]> };\n positionals: { [K in keyof Positionals]: Positional<Positionals[K]> };\n },\n handler: (\n context: Context,\n inputs: { options: Options; positionals: Positionals },\n ) => Promise<Result>,\n): Operation<Context, Result> {\n return {\n generateUsage() {\n const optionsUsage = new Array<OptionUsage>();\n for (const optionKey in inputs.options) {\n const optionInput = inputs.options[optionKey]!;\n if (optionInput) {\n optionsUsage.push(optionInput.generateUsage());\n }\n }\n const positionalsUsage = new Array<PositionalUsage>();\n for (const positionalInput of inputs.positionals) {\n positionalsUsage.push(positionalInput.generateUsage());\n }\n return { options: optionsUsage, positionals: positionalsUsage };\n },\n createFactory(readerArgs: ReaderArgs) {\n const optionsGetters: any = {};\n for (const optionKey in inputs.options) {\n const optionInput = inputs.options[optionKey]!;\n optionsGetters[optionKey] = optionInput.createGetter(readerArgs);\n }\n const positionalsValues: any = [];\n for (const positionalInput of inputs.positionals) {\n positionalsValues.push(positionalInput.consumePositionals(readerArgs));\n }\n return {\n createInstance() {\n const optionsValues: any = {};\n for (const optionKey in optionsGetters) {\n optionsValues[optionKey] = optionsGetters[optionKey]!.getValue();\n }\n return {\n executeWithContext(context: Context) {\n return handler(context, {\n options: optionsValues,\n positionals: positionalsValues,\n });\n },\n };\n },\n };\n },\n };\n}\n","import { TypoError, TypoString, typoStyleUserInput, TypoText } from \"./Typo\";\n\nexport type Type<Value> = {\n // TODO - maybe include an optional hint ??\n label: Uppercase<string>; // TODO - is there a better way to enforce uppercase labels?\n decoder(value: string): Value;\n};\n\nexport const typeBoolean: Type<boolean> = {\n label: \"BOOLEAN\",\n decoder(value: string) {\n const lowerValue = value.toLowerCase();\n if (lowerValue === \"true\" || lowerValue === \"yes\") {\n return true;\n }\n if (lowerValue === \"false\" || lowerValue === \"no\") {\n return false;\n }\n throw new Error(`Invalid value: \"${value}\"`);\n },\n};\n\nexport const typeDate: Type<Date> = {\n label: \"DATE\",\n decoder(value: string) {\n const timestamp = Date.parse(value);\n if (isNaN(timestamp)) {\n throw new Error(`Invalid ISO_8601 value: \"${value}\"`);\n }\n return new Date(timestamp);\n },\n};\n\nexport const typeUrl: Type<URL> = {\n label: \"URL\",\n decoder(value: string) {\n return new URL(value);\n },\n};\n\nexport const typeString: Type<string> = {\n label: \"STRING\",\n decoder(value: string) {\n return value;\n },\n};\n\nexport const typeNumber: Type<number> = {\n label: \"NUMBER\",\n decoder(value: string) {\n return Number(value);\n },\n};\n\nexport const typeBigInt: Type<bigint> = {\n label: \"BIGINT\",\n decoder(value: string) {\n return BigInt(value);\n },\n};\n\nexport function typeMapped<Before, After>(\n before: Type<Before>,\n after: {\n label: Uppercase<string>;\n decoder: (value: Before) => After;\n },\n): Type<After> {\n return {\n label: after.label,\n decoder: (value: string) => {\n return after.decoder(\n typeDecode(\n before,\n value,\n () => new TypoText(new TypoString(before.label, typoStyleUserInput)),\n ),\n );\n },\n };\n}\n\nexport function typeOneOf<Value>(\n type: Type<Value>,\n values: Array<Value>,\n): Type<Value> {\n const valuesSet = new Set(values);\n return {\n label: type.label,\n decoder(value: string) {\n const decoded = typeDecode(\n type,\n value,\n () => new TypoText(new TypoString(type.label, typoStyleUserInput)),\n );\n if (valuesSet.has(decoded)) {\n return decoded;\n }\n const valuesDesc = values.map((v) => `\"${v}\"`).join(\"|\");\n throw new Error(`Unexpected value: \"${value}\" (expected: ${valuesDesc})`);\n },\n };\n}\n\nexport function typeTuple<const Elements extends Array<any>>(\n elementTypes: { [K in keyof Elements]: Type<Elements[K]> },\n separator: string = \",\",\n): Type<Elements> {\n return {\n label: elementTypes\n .map((elementType) => elementType.label)\n .join(separator) as Uppercase<string>,\n decoder(value: string) {\n const parts = value.split(separator, elementTypes.length);\n if (parts.length !== elementTypes.length) {\n throw new Error(`Invalid tuple parts: ${JSON.stringify(parts)}`);\n }\n return parts.map((part, index) =>\n typeDecode(\n elementTypes[index]!,\n part,\n () =>\n new TypoText(\n new TypoString(elementTypes[index]!.label, typoStyleUserInput),\n new TypoString(`@${index}`),\n ),\n ),\n ) as Elements;\n },\n };\n}\n\nexport function typeList<Value>(\n elementType: Type<Value>,\n separator: string = \",\",\n): Type<Array<Value>> {\n return {\n label:\n `${elementType.label}[${separator}${elementType.label}]...` as Uppercase<string>,\n decoder(value: string) {\n return value\n .split(separator)\n .map((part, index) =>\n typeDecode(\n elementType,\n part,\n () =>\n new TypoText(\n new TypoString(elementType.label, typoStyleUserInput),\n new TypoString(`@${index}`),\n ),\n ),\n );\n },\n };\n}\n\nexport function typeDecode<Value>(\n type: Type<Value>,\n value: string,\n context: () => TypoText,\n): Value {\n try {\n return type.decoder(value);\n } catch (error) {\n throw new TypoError(context(), error);\n }\n}\n","import { ReaderArgs as ReaderOptions } from \"./Reader\";\nimport { Type, typeBoolean, typeDecode } from \"./Type\";\nimport {\n TypoError,\n TypoString,\n typoStyleConstants,\n typoStyleUserInput,\n TypoText,\n} from \"./Typo\";\n\nexport type Option<Value> = {\n generateUsage(): OptionUsage;\n createGetter(readerOptions: ReaderOptions): OptionGetter<Value>;\n};\n\nexport type OptionUsage = {\n description: string | undefined;\n hint: string | undefined;\n long: Lowercase<string>; // TODO - better type for long option names ?\n short: string | undefined;\n label: Uppercase<string> | undefined;\n};\n\nexport type OptionGetter<Value> = {\n getValue(): Value;\n};\n\nexport function optionFlag(definition: {\n long: Lowercase<string>;\n short?: string;\n description?: string;\n hint?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n default?: () => boolean;\n}): Option<boolean> {\n const label = `<${typeBoolean.label}>` as Uppercase<string>;\n return {\n generateUsage() {\n return {\n description: definition.description,\n hint: definition.hint,\n long: definition.long,\n short: definition.short,\n label: undefined,\n };\n },\n createGetter(readerOptions: ReaderOptions) {\n const key = registerOption(readerOptions, {\n ...definition,\n valued: false,\n });\n return {\n getValue() {\n const optionValues = readerOptions.getOptionValues(key);\n if (optionValues.length > 1) {\n throw new TypoError(\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: Must not be set multiple times`),\n ),\n );\n }\n const optionValue = optionValues[0];\n if (optionValue === undefined) {\n // TODO - scoped error util\n try {\n return definition.default ? definition.default() : false;\n } catch (error) {\n throw new TypoError(\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: Failed to compute default value`),\n ),\n error,\n );\n }\n }\n return typeDecode(\n typeBoolean,\n optionValue,\n () =>\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: `),\n new TypoString(label, typoStyleUserInput),\n ),\n );\n },\n };\n },\n };\n}\n\nexport function optionSingleValue<Value>(definition: {\n long: Lowercase<string>;\n short?: string;\n description?: string;\n hint?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n label?: Uppercase<string>;\n type: Type<Value>;\n default: () => Value;\n}): Option<Value> {\n const label = `<${definition.label ?? definition.type.label}>`;\n return {\n generateUsage() {\n return {\n description: definition.description,\n hint: definition.hint,\n long: definition.long,\n short: definition.short,\n label: label as Uppercase<string>,\n };\n },\n createGetter(readerOptions: ReaderOptions) {\n const key = registerOption(readerOptions, {\n ...definition,\n valued: true,\n });\n return {\n getValue() {\n const optionValues = readerOptions.getOptionValues(key);\n if (optionValues.length > 1) {\n throw new TypoError(\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: Must not be set multiple times`),\n ),\n );\n }\n const optionValue = optionValues[0];\n if (optionValue === undefined) {\n try {\n return definition.default();\n } catch (error) {\n throw new TypoError(\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: Failed to compute default value`),\n ),\n error,\n );\n }\n }\n return typeDecode(\n definition.type,\n optionValue,\n () =>\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: `),\n new TypoString(label, typoStyleUserInput),\n ),\n );\n },\n };\n },\n };\n}\n\nexport function optionRepeatable<Value>(definition: {\n long: Lowercase<string>;\n short?: string;\n description?: string;\n hint?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n label?: Uppercase<string>;\n type: Type<Value>;\n}): Option<Array<Value>> {\n const label = `<${definition.label ?? definition.type.label}>`;\n return {\n generateUsage() {\n // TODO - showcase that it can be repeated ?\n return {\n description: definition.description,\n hint: definition.hint,\n long: definition.long,\n short: definition.short,\n label: label as Uppercase<string>,\n };\n },\n createGetter(readerOptions: ReaderOptions) {\n const key = registerOption(readerOptions, {\n ...definition,\n valued: true,\n });\n return {\n getValue() {\n return readerOptions\n .getOptionValues(key)\n .map((value) =>\n typeDecode(\n definition.type,\n value,\n () =>\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: `),\n new TypoString(label, typoStyleUserInput),\n ),\n ),\n );\n },\n };\n },\n };\n}\n\nfunction registerOption(\n readerOptions: ReaderOptions,\n definition: {\n long: Lowercase<string>;\n short?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n valued: boolean;\n },\n) {\n const { long, short, aliases, valued } = definition;\n const longs = long ? [long] : [];\n if (aliases?.longs) {\n longs.push(...aliases?.longs);\n }\n const shorts = short ? [short] : [];\n if (aliases?.shorts) {\n shorts.push(...aliases?.shorts);\n }\n return readerOptions.registerOption({ longs, shorts, valued });\n}\n","import { ReaderPositionals } from \"./Reader\";\nimport { Type, typeDecode } from \"./Type\";\nimport { TypoError, TypoString, typoStyleUserInput, TypoText } from \"./Typo\";\n\nexport type Positional<Value> = {\n generateUsage(): PositionalUsage;\n consumePositionals(readerPositionals: ReaderPositionals): Value;\n};\n\nexport type PositionalUsage = {\n description: string | undefined;\n hint: string | undefined;\n label: Uppercase<string>;\n};\n\nexport function positionalRequired<Value>(definition: {\n description?: string;\n hint?: string;\n label?: Uppercase<string>;\n type: Type<Value>;\n}): Positional<Value> {\n const label = `<${definition.label ?? definition.type.label}>`;\n return {\n generateUsage() {\n return {\n description: definition.description,\n hint: definition.hint,\n label: label as Uppercase<string>,\n };\n },\n consumePositionals(readerPositionals: ReaderPositionals) {\n const positional = readerPositionals.consumePositional();\n if (positional === undefined) {\n throw new TypoError(\n new TypoText(\n new TypoString(label, typoStyleUserInput),\n new TypoString(`: Is required, but was not provided`),\n ),\n );\n }\n return typeDecode(\n definition.type,\n positional,\n () => new TypoText(new TypoString(label, typoStyleUserInput)),\n );\n },\n };\n}\n\nexport function positionalOptional<Value>(definition: {\n description?: string;\n hint?: string;\n label?: Uppercase<string>;\n type: Type<Value>;\n default: () => Value;\n}): Positional<Value> {\n const label = `[${definition.label ?? definition.type.label}]`;\n return {\n generateUsage() {\n return {\n description: definition.description,\n hint: definition.hint,\n label: label as Uppercase<string>,\n };\n },\n consumePositionals(readerPositionals: ReaderPositionals) {\n const positional = readerPositionals.consumePositional();\n if (positional === undefined) {\n try {\n return definition.default();\n } catch (error) {\n throw new TypoError(\n new TypoText(\n new TypoString(label, typoStyleUserInput),\n new TypoString(`: Failed to compute default value`),\n ),\n error,\n );\n }\n }\n return typeDecode(\n definition.type,\n positional,\n () => new TypoText(new TypoString(label, typoStyleUserInput)),\n );\n },\n };\n}\n\nexport function positionalVariadics<Value>(definition: {\n endDelimiter?: string;\n description?: string;\n hint?: string;\n label?: Uppercase<string>;\n type: Type<Value>;\n}): Positional<Array<Value>> {\n const label = `[${definition.label ?? definition.type.label}]`;\n return {\n generateUsage() {\n return {\n description: definition.description,\n hint: definition.hint,\n label: (`${label}...` +\n (definition.endDelimiter\n ? `[\"${definition.endDelimiter}\"]`\n : \"\")) as Uppercase<string>,\n };\n },\n consumePositionals(readerPositionals: ReaderPositionals) {\n const positionals: Array<Value> = [];\n while (true) {\n const positional = readerPositionals.consumePositional();\n if (\n positional === undefined ||\n positional === definition.endDelimiter\n ) {\n break;\n }\n positionals.push(\n typeDecode(\n definition.type,\n positional,\n () => new TypoText(new TypoString(label, typoStyleUserInput)),\n ),\n );\n }\n return positionals;\n },\n };\n}\n","import { TypoError, TypoString, typoStyleConstants, TypoText } from \"./Typo\";\n\nexport type ReaderOptionKey = (string | { __brand: \"ReaderOptionKey\" }) & {\n __brand: \"ReaderOptionKey\";\n};\n\nexport type ReaderOptions = {\n registerOption(definition: {\n longs: Array<string>;\n shorts: Array<string>;\n valued: boolean;\n }): ReaderOptionKey;\n getOptionValues(key: ReaderOptionKey): Array<string>;\n};\n\nexport type ReaderPositionals = {\n consumePositional(): string | undefined;\n};\n\nexport class ReaderArgs {\n #args: ReadonlyArray<string>;\n #parsedIndex: number;\n #parsedDouble: boolean;\n #keyByLong: Map<string, ReaderOptionKey>;\n #keyByShort: Map<string, ReaderOptionKey>;\n #valuedByKey: Map<ReaderOptionKey, boolean>;\n #resultByKey: Map<ReaderOptionKey, Array<string>>;\n\n constructor(args: ReadonlyArray<string>) {\n this.#args = args;\n this.#parsedIndex = 0;\n this.#parsedDouble = false;\n this.#keyByLong = new Map();\n this.#keyByShort = new Map();\n this.#valuedByKey = new Map();\n this.#resultByKey = new Map();\n }\n\n registerOption(definition: {\n longs: Array<string>;\n shorts: Array<string>;\n valued: boolean;\n }) {\n const key = [\n ...definition.longs.map((long) => `--${long}`),\n ...definition.shorts.map((short) => `-${short}`),\n ].join(\", \") as ReaderOptionKey;\n for (const long of definition.longs) {\n if (this.#keyByLong.has(long)) {\n throw new Error(`Option already registered: --${long}`);\n }\n this.#keyByLong.set(long, key);\n }\n for (const short of definition.shorts) {\n if (this.#keyByShort.has(short)) {\n throw new Error(`Option already registered: -${short}`);\n }\n for (let i = 0; i < short.length; i++) {\n const shortSlice = short.slice(0, i);\n if (this.#keyByShort.has(shortSlice)) {\n throw new Error(\n `Option -${short} overlap with shorter option: -${shortSlice}`,\n );\n }\n }\n for (const shortOther of this.#keyByShort.keys()) {\n if (shortOther.startsWith(short)) {\n throw new Error(\n `Option -${short} overlap with longer option: -${shortOther}`,\n );\n }\n }\n this.#keyByShort.set(short, key);\n }\n this.#valuedByKey.set(key, definition.valued);\n this.#resultByKey.set(key, new Array<string>());\n return key;\n }\n\n getOptionValues(key: ReaderOptionKey): Array<string> {\n const optionResult = this.#resultByKey.get(key);\n if (optionResult === undefined) {\n throw new Error(`Unregistered option: ${key}`);\n }\n return optionResult;\n }\n\n consumePositional(): string | undefined {\n while (true) {\n const arg = this.#consumeArg();\n if (arg === null) {\n return undefined;\n }\n if (this.#processedAsPositional(arg)) {\n return arg;\n }\n }\n }\n\n #consumeArg(): string | null {\n const arg = this.#args[this.#parsedIndex];\n if (arg === undefined) {\n return null;\n }\n this.#parsedIndex++;\n if (!this.#parsedDouble) {\n if (arg === \"--\") {\n this.#parsedDouble = true;\n return this.#consumeArg();\n }\n }\n return arg;\n }\n\n #processedAsPositional(arg: string): boolean {\n if (this.#parsedDouble) {\n return true;\n }\n if (arg.startsWith(\"--\")) {\n const valueIndexStart = arg.indexOf(\"=\");\n if (valueIndexStart === -1) {\n this.#consumeOptionLong(arg.slice(2), null);\n } else {\n this.#consumeOptionLong(\n arg.slice(2, valueIndexStart),\n arg.slice(valueIndexStart + 1),\n );\n }\n return false;\n }\n if (arg.startsWith(\"-\")) {\n let shortIndexStart = 1;\n let shortIndexEnd = 2;\n while (shortIndexEnd <= arg.length) {\n const result = this.#tryConsumeOptionShort(\n arg.slice(shortIndexStart, shortIndexEnd),\n arg.slice(shortIndexEnd),\n );\n if (result === true) {\n return false;\n }\n if (result === false) {\n shortIndexStart = shortIndexEnd;\n }\n shortIndexEnd++;\n }\n throw new TypoError(\n new TypoText(\n new TypoString(`-${arg.slice(shortIndexStart)}`, typoStyleConstants),\n new TypoString(`: Unexpected unknown option`),\n ),\n );\n }\n return true;\n }\n\n #consumeOptionLong(long: string, direct: string | null): void {\n const constant = `--${long}`;\n const key = this.#keyByLong.get(long);\n if (key !== undefined) {\n if (direct !== null) {\n return this.#acknowledgeOption(key, direct);\n }\n const valued = this.#valuedByKey.get(key);\n if (valued) {\n return this.#acknowledgeOption(key, this.#consumeOptionValue(constant));\n }\n return this.#acknowledgeOption(key, \"true\");\n }\n throw new TypoError(\n new TypoText(\n new TypoString(constant, typoStyleConstants),\n new TypoString(`: Unexpected unknown option`),\n ),\n );\n }\n\n #tryConsumeOptionShort(short: string, rest: string): boolean | null {\n const key = this.#keyByShort.get(short);\n if (key !== undefined) {\n if (rest.startsWith(\"=\")) {\n this.#acknowledgeOption(key, rest.slice(1));\n return true;\n }\n const valued = this.#valuedByKey.get(key);\n if (valued) {\n if (rest === \"\") {\n this.#acknowledgeOption(key, this.#consumeOptionValue(`-${short}`));\n } else {\n this.#acknowledgeOption(key, rest);\n }\n return true;\n }\n this.#acknowledgeOption(key, \"true\");\n return rest === \"\";\n }\n return null;\n }\n\n #consumeOptionValue(constant: string) {\n const arg = this.#consumeArg();\n if (arg === null) {\n throw new TypoError(\n new TypoText(\n new TypoString(constant, typoStyleConstants),\n new TypoString(`: requires a value, but got end of input`),\n ),\n );\n }\n if (this.#parsedDouble) {\n throw new TypoError(\n new TypoText(\n new TypoString(constant, typoStyleConstants),\n new TypoString(`: requires a value before \"--\"`),\n ),\n );\n }\n // TODO - is that weird, could a valid value start with dash ?\n if (arg.startsWith(\"-\")) {\n throw new TypoError(\n new TypoText(\n new TypoString(constant, typoStyleConstants),\n new TypoString(`: requires a value, but got: \"${arg}\"`),\n ),\n );\n }\n return arg;\n }\n\n #acknowledgeOption(key: ReaderOptionKey, value: string) {\n this.getOptionValues(key).push(value);\n }\n}\n","import { CommandUsage } from \"./Command\";\nimport {\n TypoGrid,\n TypoString,\n typoStyleConstants,\n typoStyleUserInput,\n TypoSupport,\n TypoText,\n} from \"./Typo\";\n\nexport function usageToStyledLines(params: {\n cliName: Lowercase<string>;\n commandUsage: CommandUsage;\n typoSupport: TypoSupport;\n}) {\n const { cliName, commandUsage, typoSupport } = params;\n\n const lines = new Array<string>();\n\n const breadcrumbs = [\n textUsageTitle(\"Usage:\").computeStyledString(typoSupport),\n textConstants(cliName).computeStyledString(typoSupport),\n ].concat(\n commandUsage.breadcrumbs.map((breadcrumb) => {\n if (\"positional\" in breadcrumb) {\n return textUserInput(breadcrumb.positional).computeStyledString(\n typoSupport,\n );\n }\n if (\"command\" in breadcrumb) {\n return textConstants(breadcrumb.command).computeStyledString(\n typoSupport,\n );\n }\n throw new Error(`Unknown breadcrumb: ${JSON.stringify(breadcrumb)}`);\n }),\n );\n lines.push(breadcrumbs.join(\" \"));\n\n lines.push(\"\");\n const infoText = new TypoText();\n infoText.pushString(textUsageIntro(commandUsage.information.description));\n if (commandUsage.information.hint) {\n infoText.pushString(textDelimiter(\" \"));\n infoText.pushString(textSubtleInfo(`(${commandUsage.information.hint})`));\n }\n lines.push(infoText.computeStyledString(typoSupport));\n if (commandUsage.information.details) {\n const detailsString = textSubtleInfo(commandUsage.information.details);\n lines.push(detailsString.computeStyledString(typoSupport));\n }\n\n if (commandUsage.positionals.length > 0) {\n lines.push(\"\");\n lines.push(textBlockTitle(\"Positionals:\").computeStyledString(typoSupport));\n const typoGrid = new TypoGrid();\n for (const positionalUsage of commandUsage.positionals) {\n const typoGridRow = new Array<TypoText>();\n typoGridRow.push(new TypoText(textDelimiter(\" \")));\n typoGridRow.push(new TypoText(textUserInput(positionalUsage.label)));\n typoGridRow.push(...createInformationals(positionalUsage));\n typoGrid.pushRow(typoGridRow);\n }\n lines.push(\n ...typoGrid.computeStyledGrid(typoSupport).map((row) => row.join(\"\")),\n );\n }\n\n if (commandUsage.subcommands.length > 0) {\n lines.push(\"\");\n lines.push(textBlockTitle(\"Subcommands:\").computeStyledString(typoSupport));\n const typoGrid = new TypoGrid();\n for (const subcommandUsage of commandUsage.subcommands) {\n const typoGridRow = new Array<TypoText>();\n typoGridRow.push(new TypoText(textDelimiter(\" \")));\n typoGridRow.push(new TypoText(textConstants(subcommandUsage.name)));\n typoGridRow.push(...createInformationals(subcommandUsage));\n typoGrid.pushRow(typoGridRow);\n }\n lines.push(\n ...typoGrid.computeStyledGrid(typoSupport).map((row) => row.join(\"\")),\n );\n }\n\n if (commandUsage.options.length > 0) {\n lines.push(\"\");\n lines.push(textBlockTitle(\"Options:\").computeStyledString(typoSupport));\n const typoGrid = new TypoGrid();\n for (const optionUsage of commandUsage.options) {\n const typoGridRow = new Array<TypoText>();\n typoGridRow.push(new TypoText(textDelimiter(\" \")));\n if (optionUsage.short) {\n typoGridRow.push(\n new TypoText(\n textConstants(`-${optionUsage.short}`),\n textDelimiter(\", \"),\n ),\n );\n } else {\n typoGridRow.push(new TypoText());\n }\n if (optionUsage.label) {\n typoGridRow.push(\n new TypoText(\n textConstants(`--${optionUsage.long}`),\n textDelimiter(\" \"),\n textUserInput(optionUsage.label),\n ),\n );\n } else {\n typoGridRow.push(\n new TypoText(\n textConstants(`--${optionUsage.long}`),\n textSubtleInfo(\"[=no]\"),\n ),\n );\n }\n typoGridRow.push(...createInformationals(optionUsage));\n typoGrid.pushRow(typoGridRow);\n }\n lines.push(\n ...typoGrid.computeStyledGrid(typoSupport).map((row) => row.join(\"\")),\n );\n }\n\n lines.push(\"\");\n return lines;\n}\n\nfunction createInformationals(usage: {\n description: string | undefined;\n hint: string | undefined;\n}): Array<TypoText> {\n const informationals = [];\n if (usage.description) {\n informationals.push(textDelimiter(\" \"));\n informationals.push(textUsefulInfo(usage.description));\n }\n if (usage.hint) {\n informationals.push(textDelimiter(\" \"));\n informationals.push(textSubtleInfo(`(${usage.hint})`));\n }\n if (informationals.length > 0) {\n return [new TypoText(textDelimiter(\" \"), ...informationals)];\n }\n return [];\n}\n\nfunction textUsageIntro(value: string): TypoString {\n return new TypoString(value, { bold: true });\n}\n\nfunction textUsageTitle(value: string): TypoString {\n return new TypoString(value, { fgColor: \"darkMagenta\", bold: true });\n}\n\nfunction textUsefulInfo(value: string): TypoString {\n return new TypoString(value);\n}\n\nfunction textSubtleInfo(value: string): TypoString {\n return new TypoString(value, { italic: true, dim: true });\n}\n\nfunction textBlockTitle(value: string): TypoString {\n return new TypoString(value, { fgColor: \"darkGreen\", bold: true });\n}\n\nfunction textConstants(value: string): TypoString {\n return new TypoString(value, typoStyleConstants);\n}\n\nfunction textUserInput(value: string): TypoString {\n return new TypoString(value, typoStyleUserInput);\n}\n\nfunction textDelimiter(value: string): TypoString {\n return new TypoString(value);\n}\n","import { Command, CommandFactory } from \"./Command\";\nimport { ReaderArgs } from \"./Reader\";\nimport { TypoSupport } from \"./Typo\";\nimport { usageToStyledLines } from \"./Usage\";\n\nexport async function runAsCliAndExit<Context>(\n cliName: Lowercase<string>,\n cliArgs: ReadonlyArray<string>,\n context: Context,\n command: Command<Context, void>,\n application?: {\n usageOnHelp?: boolean | undefined;\n buildVersion?: string | undefined;\n useColors?: boolean | undefined;\n onExecutionError?: ((error: unknown) => void) | undefined;\n onLogStdOut?: ((message: string) => void) | undefined; // TODO - this is a problem, deep commands use console\n onLogStdErr?: ((message: string) => void) | undefined;\n onExit?: ((code: number) => never) | undefined;\n },\n): Promise<never> {\n const readerArgs = new ReaderArgs(cliArgs);\n const usageOnHelp = application?.usageOnHelp ?? true;\n if (usageOnHelp) {\n readerArgs.registerOption({\n shorts: [],\n longs: [\"help\"],\n valued: false,\n });\n }\n const buildVersion = application?.buildVersion;\n if (buildVersion) {\n readerArgs.registerOption({\n shorts: [],\n longs: [\"version\"],\n valued: false,\n });\n }\n /*\n // TODO - handle completions ?\n readerArgs.registerFlag({\n key: \"completion\",\n shorts: [],\n longs: [\"completion\"],\n });\n */\n const commandFactory = command.createFactory(readerArgs);\n while (true) {\n const positional = readerArgs.consumePositional();\n if (positional === undefined) {\n break;\n }\n }\n const typoSupport = chooseTypoSupport(application?.useColors);\n const onLogStdOut = application?.onLogStdOut ?? console.log;\n const onLogStdErr = application?.onLogStdErr ?? console.error;\n const onExit = application?.onExit ?? process.exit;\n if (usageOnHelp) {\n if (readerArgs.getOptionValues(\"--help\" as any).length > 0) {\n onLogStdOut(computeUsageString(cliName, commandFactory, typoSupport));\n return onExit(0);\n }\n }\n if (buildVersion) {\n if (readerArgs.getOptionValues(\"--version\" as any).length > 0) {\n onLogStdOut([cliName, buildVersion].join(\" \"));\n return onExit(0);\n }\n }\n try {\n const commandInstance = commandFactory.createInstance();\n try {\n await commandInstance.executeWithContext(context);\n return onExit(0);\n } catch (error) {\n if (application?.onExecutionError) {\n application.onExecutionError(error);\n } else {\n onLogStdErr(typoSupport.computeStyledErrorMessage(error));\n }\n return onExit(1);\n }\n } catch (error) {\n onLogStdErr(computeUsageString(cliName, commandFactory, typoSupport));\n onLogStdErr(typoSupport.computeStyledErrorMessage(error));\n return onExit(1);\n }\n}\n\nfunction computeUsageString<Context, Result>(\n cliName: Lowercase<string>,\n commandFactory: CommandFactory<Context, Result>,\n typoSupport: TypoSupport,\n) {\n return usageToStyledLines({\n cliName,\n commandUsage: commandFactory.generateUsage(),\n typoSupport,\n }).join(\"\\n\");\n}\n\nfunction chooseTypoSupport(useColors?: boolean): TypoSupport {\n if (useColors === undefined) {\n return TypoSupport.inferFromProcess();\n }\n return useColors ? TypoSupport.tty() : TypoSupport.none();\n}\n"],"mappings":"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","names":["index_exports","__export","ReaderArgs","TypoError","TypoGrid","TypoString","TypoSupport","TypoText","command","commandChained","commandWithSubcommands","operation","optionFlag","optionRepeatable","optionSingleValue","positionalOptional","positionalRequired","positionalVariadics","runAsCliAndExit","typeBigInt","typeBoolean","typeDate","typeDecode","typeList","typeMapped","typeNumber","typeOneOf","typeString","typeTuple","typeUrl","typoStyleConstants","typoStyleFailure","typoStyleUserInput","usageToStyledLines","__toCommonJS","typoStyleConstants","typoStyleUserInput","typoStyleFailure","_value","_typoStyle","TypoString","value","typoStyle","__privateAdd","__privateSet","__privateGet","typoSupport","_typoStrings","_TypoText","typoParts","typoPart","typoString","typoText","t","length","TypoText","_typoRows","TypoGrid","cells","widths","printableGrid","typoGridRow","typoGridColumnIndex","width","printableGridRow","typoGridCell","printableGridCell","padding","_typoText","_TypoError","currentTypoText","source","TypoError","_kind","_TypoSupport","kind","fgColorCode","ttyCodeFgColors","bgColorCode","ttyCodeBgColors","boldCode","ttyCodeBold","dimCode","ttyCodeDim","italicCode","ttyCodeItalic","underlineCode","ttyCodeUnderline","strikethroughCode","ttyCodeStrikethrough","ttyCodeReset","fgColorPart","bgColorPart","boldPart","dimPart","italicPart","underlinePart","error","TypoSupport","command","information","operation","readerArgs","generateUsage","operationUsage","positional","breadcrumbPositional","operationFactory","endPositional","operationInstance","context","error","commandWithSubcommands","subcommands","subcommandName","TypoError","TypoText","TypoString","typoStyleConstants","subcommandInput","subcommandFactory","subcommandUsage","breadcrumbCommand","subcommandInstance","subcommand","metadata","commandChained","nextCommand","nextCommandFactory","nextCommandUsage","nextCommandInstance","value","operation","inputs","handler","optionsUsage","optionKey","optionInput","positionalsUsage","positionalInput","readerArgs","optionsGetters","positionalsValues","optionsValues","context","typeBoolean","value","lowerValue","typeDate","timestamp","typeUrl","typeString","typeNumber","typeBigInt","typeMapped","before","after","typeDecode","TypoText","TypoString","typoStyleUserInput","typeOneOf","type","values","valuesSet","decoded","valuesDesc","v","typeTuple","elementTypes","separator","elementType","parts","part","index","typeList","context","error","TypoError","optionFlag","definition","label","typeBoolean","readerOptions","key","registerOption","optionValues","TypoError","TypoText","TypoString","typoStyleConstants","optionValue","error","typeDecode","typoStyleUserInput","optionSingleValue","optionRepeatable","value","long","short","aliases","valued","longs","shorts","positionalRequired","definition","label","readerPositionals","positional","TypoError","TypoText","TypoString","typoStyleUserInput","typeDecode","positionalOptional","error","positionalVariadics","positionals","_args","_parsedIndex","_parsedDouble","_keyByLong","_keyByShort","_valuedByKey","_resultByKey","_ReaderArgs_instances","consumeArg_fn","processedAsPositional_fn","consumeOptionLong_fn","tryConsumeOptionShort_fn","consumeOptionValue_fn","acknowledgeOption_fn","ReaderArgs","args","__privateAdd","__privateSet","definition","key","long","short","__privateGet","i","shortSlice","shortOther","optionResult","arg","__privateMethod","__privateWrapper","valueIndexStart","shortIndexStart","shortIndexEnd","result","TypoError","TypoText","TypoString","typoStyleConstants","direct","constant","rest","value","usageToStyledLines","params","cliName","commandUsage","typoSupport","lines","breadcrumbs","textUsageTitle","textConstants","breadcrumb","textUserInput","infoText","TypoText","textUsageIntro","textDelimiter","textSubtleInfo","detailsString","textBlockTitle","typoGrid","TypoGrid","positionalUsage","typoGridRow","createInformationals","row","subcommandUsage","optionUsage","usage","informationals","textUsefulInfo","value","TypoString","typoStyleConstants","typoStyleUserInput","runAsCliAndExit","cliName","cliArgs","context","command","application","readerArgs","ReaderArgs","usageOnHelp","buildVersion","commandFactory","typoSupport","chooseTypoSupport","onLogStdOut","onLogStdErr","onExit","computeUsageString","commandInstance","error","usageToStyledLines","useColors","TypoSupport"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/lib/Typo.ts","../src/lib/Command.ts","../src/lib/Operation.ts","../src/lib/Type.ts","../src/lib/Option.ts","../src/lib/Positional.ts","../src/lib/Reader.ts","../src/lib/Usage.ts","../src/lib/Run.ts"],"sourcesContent":["export * from \"./lib/Command\";\nexport * from \"./lib/Operation\";\nexport * from \"./lib/Option\";\nexport * from \"./lib/Positional\";\nexport * from \"./lib/Reader\";\nexport * from \"./lib/Run\";\nexport * from \"./lib/Type\";\nexport * from \"./lib/Typo\";\nexport * from \"./lib/Usage\";\n","export type TypoColor =\n | \"darkBlack\"\n | \"darkRed\"\n | \"darkGreen\"\n | \"darkYellow\"\n | \"darkBlue\"\n | \"darkMagenta\"\n | \"darkCyan\"\n | \"darkWhite\"\n | \"brightBlack\"\n | \"brightRed\"\n | \"brightGreen\"\n | \"brightYellow\"\n | \"brightBlue\"\n | \"brightMagenta\"\n | \"brightCyan\"\n | \"brightWhite\";\n\nexport type TypoStyle = {\n fgColor?: TypoColor;\n bgColor?: TypoColor;\n dim?: boolean;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n};\n\nexport const typoStyleConstants: TypoStyle = {\n fgColor: \"darkCyan\",\n bold: true,\n};\nexport const typoStyleUserInput: TypoStyle = {\n fgColor: \"darkBlue\",\n bold: true,\n};\nexport const typoStyleFailure: TypoStyle = {\n fgColor: \"darkRed\",\n bold: true,\n};\n\nexport class TypoString {\n #value: string;\n #typoStyle: TypoStyle;\n constructor(value: string, typoStyle: TypoStyle = {}) {\n this.#value = value;\n this.#typoStyle = typoStyle;\n }\n getRawString(): string {\n return this.#value;\n }\n computeStyledString(typoSupport: TypoSupport): string {\n return typoSupport.computeStyledString(this.#value, this.#typoStyle);\n }\n}\n\nexport class TypoText {\n #typoStrings: Array<TypoString>;\n constructor(...typoParts: Array<TypoText | TypoString | string>) {\n this.#typoStrings = [];\n for (const typoPart of typoParts) {\n if (typoPart instanceof TypoText) {\n this.pushText(typoPart);\n } else if (typoPart instanceof TypoString) {\n this.pushString(typoPart);\n } else if (typeof typoPart === \"string\") {\n this.pushString(new TypoString(typoPart));\n }\n }\n }\n pushString(typoString: TypoString) {\n this.#typoStrings.push(typoString);\n }\n pushText(typoText: TypoText) {\n for (const typoString of typoText.#typoStrings) {\n this.#typoStrings.push(typoString);\n }\n }\n computeStyledString(typoSupport: TypoSupport): string {\n return this.#typoStrings\n .map((t) => t.computeStyledString(typoSupport))\n .join(\"\");\n }\n computeRawString(): string {\n return this.#typoStrings.map((t) => t.getRawString()).join(\"\");\n }\n computeRawLength(): number {\n let length = 0;\n for (const typoString of this.#typoStrings) {\n length += typoString.getRawString().length;\n }\n return length;\n }\n}\n\nexport class TypoGrid {\n #typoRows: Array<Array<TypoText>>;\n constructor() {\n this.#typoRows = [];\n }\n pushRow(cells: Array<TypoText>) {\n this.#typoRows.push(cells);\n }\n computeStyledGrid(typoSupport: TypoSupport): Array<Array<string>> {\n const widths = new Array<number>();\n const printableGrid = new Array<Array<string>>();\n for (const typoGridRow of this.#typoRows) {\n for (\n let typoGridColumnIndex = 0;\n typoGridColumnIndex < typoGridRow.length;\n typoGridColumnIndex++\n ) {\n const typoGridCell = typoGridRow[typoGridColumnIndex]!;\n const width = typoGridCell.computeRawLength();\n if (\n widths[typoGridColumnIndex] === undefined ||\n width > widths[typoGridColumnIndex]!\n ) {\n widths[typoGridColumnIndex] = width;\n }\n }\n }\n for (const typoGridRow of this.#typoRows) {\n const printableGridRow = new Array<string>();\n for (\n let typoGridColumnIndex = 0;\n typoGridColumnIndex < typoGridRow.length;\n typoGridColumnIndex++\n ) {\n const typoGridCell = typoGridRow[typoGridColumnIndex]!;\n const printableGridCell = typoGridCell.computeStyledString(typoSupport);\n printableGridRow.push(printableGridCell);\n if (typoGridColumnIndex < typoGridRow.length - 1) {\n const width = typoGridCell.computeRawLength();\n const padding = \" \".repeat(widths[typoGridColumnIndex]! - width);\n printableGridRow.push(padding);\n }\n }\n printableGrid.push(printableGridRow);\n }\n return printableGrid;\n }\n}\n\nexport class TypoError extends Error {\n #typoText: TypoText;\n constructor(currentTypoText: TypoText, source?: unknown) {\n const typoText = new TypoText();\n typoText.pushText(currentTypoText);\n if (source instanceof Error) {\n typoText.pushString(new TypoString(`: ${source.message}`));\n } else if (source instanceof TypoError) {\n typoText.pushString(new TypoString(\": \"));\n typoText.pushText(source.#typoText);\n } else if (source !== undefined) {\n typoText.pushString(new TypoString(`: ${String(source)}`));\n }\n super(typoText.computeRawString());\n this.#typoText = typoText;\n }\n computeStyledString(typoSupport: TypoSupport): string {\n return this.#typoText.computeStyledString(typoSupport);\n }\n}\n\nexport class TypoSupport {\n #kind: \"none\" | \"tty\" | \"mock\";\n private constructor(kind: \"none\" | \"tty\" | \"mock\") {\n this.#kind = kind;\n }\n static none(): TypoSupport {\n return new TypoSupport(\"none\");\n }\n static tty(): TypoSupport {\n return new TypoSupport(\"tty\");\n }\n static mock(): TypoSupport {\n return new TypoSupport(\"mock\");\n }\n static inferFromProcess(): TypoSupport {\n if (!process) {\n return TypoSupport.none();\n }\n if (process.env) {\n if (process.env[\"FORCE_COLOR\"] === \"0\") {\n return TypoSupport.none();\n }\n if (process.env[\"FORCE_COLOR\"]) {\n return TypoSupport.tty();\n }\n if (\"NO_COLOR\" in process.env) {\n return TypoSupport.none();\n }\n }\n if (!process.stdout || !process.stdout.isTTY) {\n return TypoSupport.none();\n }\n return TypoSupport.tty();\n }\n computeStyledString(value: string, typoStyle: TypoStyle): string {\n if (this.#kind === \"none\") {\n return value;\n }\n if (this.#kind === \"tty\") {\n const fgColorCode = typoStyle.fgColor\n ? ttyCodeFgColors[typoStyle.fgColor]\n : \"\";\n const bgColorCode = typoStyle.bgColor\n ? ttyCodeBgColors[typoStyle.bgColor]\n : \"\";\n const boldCode = typoStyle.bold ? ttyCodeBold : \"\";\n const dimCode = typoStyle.dim ? ttyCodeDim : \"\";\n const italicCode = typoStyle.italic ? ttyCodeItalic : \"\";\n const underlineCode = typoStyle.underline ? ttyCodeUnderline : \"\";\n const strikethroughCode = typoStyle.strikethrough\n ? ttyCodeStrikethrough\n : \"\";\n return `${fgColorCode}${bgColorCode}${boldCode}${dimCode}${italicCode}${underlineCode}${strikethroughCode}${value}${ttyCodeReset}`;\n }\n if (this.#kind === \"mock\") {\n const fgColorPart = typoStyle.fgColor\n ? `{${value}}@${typoStyle.fgColor}`\n : value;\n const bgColorPart = typoStyle.bgColor\n ? `{${fgColorPart}}#${typoStyle.bgColor}`\n : fgColorPart;\n const boldPart = typoStyle.bold ? `{${bgColorPart}}+` : bgColorPart;\n const dimPart = typoStyle.dim ? `{${boldPart}}-` : boldPart;\n const italicPart = typoStyle.italic ? `{${dimPart}}*` : dimPart;\n const underlinePart = typoStyle.underline\n ? `{${italicPart}}_`\n : italicPart;\n const strikethroughPart = typoStyle.strikethrough\n ? `{${underlinePart}}~`\n : underlinePart;\n return strikethroughPart;\n }\n throw new Error(`Unknown TypoSupport kind: ${this.#kind}`);\n }\n computeStyledErrorMessage(error: unknown): string {\n return [\n this.computeStyledString(\"Error:\", typoStyleFailure),\n error instanceof TypoError\n ? error.computeStyledString(this)\n : error instanceof Error\n ? error.message\n : String(error),\n ].join(\" \");\n }\n}\n\nconst ttyCodeReset = \"\\x1b[0m\";\nconst ttyCodeBold = \"\\x1b[1m\";\nconst ttyCodeDim = \"\\x1b[2m\";\nconst ttyCodeItalic = \"\\x1b[3m\";\nconst ttyCodeUnderline = \"\\x1b[4m\";\nconst ttyCodeStrikethrough = \"\\x1b[9m\";\nconst ttyCodeFgColors: Record<TypoColor, string> = {\n darkBlack: \"\\x1b[30m\",\n darkRed: \"\\x1b[31m\",\n darkGreen: \"\\x1b[32m\",\n darkYellow: \"\\x1b[33m\",\n darkBlue: \"\\x1b[34m\",\n darkMagenta: \"\\x1b[35m\",\n darkCyan: \"\\x1b[36m\",\n darkWhite: \"\\x1b[37m\",\n brightBlack: \"\\x1b[90m\",\n brightRed: \"\\x1b[91m\",\n brightGreen: \"\\x1b[92m\",\n brightYellow: \"\\x1b[93m\",\n brightBlue: \"\\x1b[94m\",\n brightMagenta: \"\\x1b[95m\",\n brightCyan: \"\\x1b[96m\",\n brightWhite: \"\\x1b[97m\",\n};\nconst ttyCodeBgColors: Record<TypoColor, string> = {\n darkBlack: \"\\x1b[40m\",\n darkRed: \"\\x1b[41m\",\n darkGreen: \"\\x1b[42m\",\n darkYellow: \"\\x1b[43m\",\n darkBlue: \"\\x1b[44m\",\n darkMagenta: \"\\x1b[45m\",\n darkCyan: \"\\x1b[46m\",\n darkWhite: \"\\x1b[47m\",\n brightBlack: \"\\x1b[100m\",\n brightRed: \"\\x1b[101m\",\n brightGreen: \"\\x1b[102m\",\n brightYellow: \"\\x1b[103m\",\n brightBlue: \"\\x1b[104m\",\n brightMagenta: \"\\x1b[105m\",\n brightCyan: \"\\x1b[106m\",\n brightWhite: \"\\x1b[107m\",\n};\n","import { Operation } from \"./Operation\";\nimport { OptionUsage } from \"./Option\";\nimport { PositionalUsage } from \"./Positional\";\nimport { ReaderArgs } from \"./Reader\";\nimport { TypoError, TypoString, typoStyleConstants, TypoText } from \"./Typo\";\n\nexport type Command<Context, Result> = {\n getInformation(): CommandInformation;\n createFactory(readerArgs: ReaderArgs): CommandFactory<Context, Result>;\n};\n\nexport type CommandFactory<Context, Result> = {\n generateUsage(): CommandUsage;\n createInstance(): CommandInstance<Context, Result>;\n};\n\nexport type CommandInstance<Context, Result> = {\n executeWithContext(context: Context): Promise<Result>;\n};\n\nexport type CommandInformation = {\n description: string;\n hint?: string;\n details?: string;\n // TODO - printable examples ?\n};\n\nexport type CommandUsage = {\n breadcrumbs: Array<CommandUsageBreadcrumb>;\n information: CommandInformation;\n positionals: Array<PositionalUsage>;\n subcommands: Array<CommandUsageSubcommand>;\n options: Array<OptionUsage>;\n};\n\nexport type CommandUsageBreadcrumb =\n | { positional: string }\n | { command: string };\n\nexport type CommandUsageSubcommand = {\n name: string;\n description: string | undefined;\n hint: string | undefined;\n};\n\nexport function command<Context, Result>(\n information: CommandInformation,\n operation: Operation<Context, Result>,\n): Command<Context, Result> {\n return {\n getInformation() {\n return information;\n },\n createFactory(readerArgs: ReaderArgs) {\n function generateUsage(): CommandUsage {\n const operationUsage = operation.generateUsage();\n return {\n breadcrumbs: operationUsage.positionals.map((positional) =>\n breadcrumbPositional(positional.label),\n ),\n information: information,\n positionals: operationUsage.positionals,\n subcommands: [],\n options: operationUsage.options,\n };\n }\n try {\n const operationFactory = operation.createFactory(readerArgs);\n const endPositional = readerArgs.consumePositional();\n if (endPositional !== undefined) {\n throw Error(`Unexpected argument: \"${endPositional}\"`);\n }\n return {\n generateUsage,\n createInstance() {\n const operationInstance = operationFactory.createInstance();\n return {\n async executeWithContext(context: Context) {\n return await operationInstance.executeWithContext(context);\n },\n };\n },\n };\n } catch (error) {\n return {\n generateUsage,\n createInstance() {\n throw error;\n },\n };\n }\n },\n };\n}\n\nexport function commandWithSubcommands<Context, Payload, Result>(\n information: CommandInformation,\n operation: Operation<Context, Payload>,\n subcommands: { [subcommand: Lowercase<string>]: Command<Payload, Result> },\n): Command<Context, Result> {\n return {\n getInformation() {\n return information;\n },\n createFactory(readerArgs: ReaderArgs) {\n try {\n const operationFactory = operation.createFactory(readerArgs);\n const subcommandName = readerArgs.consumePositional();\n if (subcommandName === undefined) {\n throw new TypoError(\n new TypoText(\n new TypoString(`<SUBCOMMAND>`, typoStyleConstants),\n new TypoString(`: Is required, but was not provided`),\n ),\n );\n }\n const subcommandInput =\n subcommands[subcommandName as Lowercase<string>];\n if (subcommandInput === undefined) {\n throw new TypoError(\n new TypoText(\n new TypoString(`<SUBCOMMAND>`, typoStyleConstants),\n new TypoString(`: Invalid value: \"${subcommandName}\"`),\n ),\n );\n }\n const subcommandFactory = subcommandInput.createFactory(readerArgs);\n return {\n generateUsage() {\n const operationUsage = operation.generateUsage();\n const subcommandUsage = subcommandFactory.generateUsage();\n return {\n breadcrumbs: operationUsage.positionals\n .map((positional) => breadcrumbPositional(positional.label))\n .concat([breadcrumbCommand(subcommandName)])\n .concat(subcommandUsage.breadcrumbs),\n information: subcommandUsage.information,\n positionals: operationUsage.positionals.concat(\n subcommandUsage.positionals,\n ),\n subcommands: subcommandUsage.subcommands,\n options: operationUsage.options.concat(subcommandUsage.options),\n };\n },\n createInstance() {\n const operationInstance = operationFactory.createInstance();\n const subcommandInstance = subcommandFactory.createInstance();\n return {\n async executeWithContext(context: Context) {\n return await subcommandInstance.executeWithContext(\n await operationInstance.executeWithContext(context),\n );\n },\n };\n },\n };\n } catch (error) {\n return {\n generateUsage() {\n const operationUsage = operation.generateUsage();\n return {\n breadcrumbs: operationUsage.positionals\n .map((positional) => breadcrumbPositional(positional.label))\n .concat([breadcrumbCommand(\"<SUBCOMMAND>\")]),\n information: information,\n positionals: operationUsage.positionals,\n subcommands: Object.entries(subcommands).map((subcommand) => {\n const metadata = subcommand[1].getInformation();\n return {\n name: subcommand[0],\n description: metadata.description,\n hint: metadata.hint,\n };\n }),\n options: operationUsage.options,\n };\n },\n createInstance() {\n throw error;\n },\n };\n }\n },\n };\n}\n\nexport function commandChained<Context, Payload, Result>(\n information: CommandInformation,\n operation: Operation<Context, Payload>,\n nextCommand: Command<Payload, Result>,\n): Command<Context, Result> {\n return {\n getInformation() {\n return information;\n },\n createFactory(readerArgs: ReaderArgs) {\n try {\n const operationFactory = operation.createFactory(readerArgs);\n const 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 Operation<Input, Output> = {\n generateUsage(): OperationUsage;\n createFactory(readerArgs: ReaderArgs): OperationFactory<Input, Output>;\n};\n\nexport type OperationFactory<Input, Output> = {\n createInstance(): OperationInstance<Input, Output>;\n};\n\nexport type OperationInstance<Input, Output> = {\n executeWithContext(input: Input): Promise<Output>;\n};\n\nexport type OperationUsage = {\n options: Array<OptionUsage>;\n positionals: Array<PositionalUsage>;\n};\n\nexport function operation<\n Context,\n Result,\n Options extends { [option: string]: any },\n const Positionals extends Array<any>,\n>(\n inputs: {\n options: { [K in keyof Options]: Option<Options[K]> };\n positionals: { [K in keyof Positionals]: Positional<Positionals[K]> };\n },\n handler: (\n context: Context,\n inputs: { options: Options; positionals: Positionals },\n ) => Promise<Result>,\n): Operation<Context, Result> {\n return {\n generateUsage() {\n const optionsUsage = new Array<OptionUsage>();\n for (const optionKey in inputs.options) {\n const optionInput = inputs.options[optionKey]!;\n if (optionInput) {\n optionsUsage.push(optionInput.generateUsage());\n }\n }\n const positionalsUsage = new Array<PositionalUsage>();\n for (const positionalInput of inputs.positionals) {\n positionalsUsage.push(positionalInput.generateUsage());\n }\n return { options: optionsUsage, positionals: positionalsUsage };\n },\n createFactory(readerArgs: ReaderArgs) {\n const optionsGetters: any = {};\n for (const optionKey in inputs.options) {\n const optionInput = inputs.options[optionKey]!;\n optionsGetters[optionKey] = optionInput.createGetter(readerArgs);\n }\n const positionalsValues: any = [];\n for (const positionalInput of inputs.positionals) {\n positionalsValues.push(positionalInput.consumePositionals(readerArgs));\n }\n return {\n createInstance() {\n const optionsValues: any = {};\n for (const optionKey in optionsGetters) {\n optionsValues[optionKey] = optionsGetters[optionKey]!.getValue();\n }\n return {\n executeWithContext(context: Context) {\n return handler(context, {\n options: optionsValues,\n positionals: positionalsValues,\n });\n },\n };\n },\n };\n },\n };\n}\n","import { TypoError, TypoString, typoStyleUserInput, TypoText } from \"./Typo\";\n\nexport type Type<Value> = {\n // TODO - maybe include an optional hint ??\n label: Uppercase<string>; // TODO - is there a better way to enforce uppercase labels?\n decoder(value: string): Value;\n};\n\nexport const typeBoolean: Type<boolean> = {\n label: \"BOOLEAN\",\n decoder(value: string) {\n const lowerValue = value.toLowerCase();\n if (lowerValue === \"true\" || lowerValue === \"yes\") {\n return true;\n }\n if (lowerValue === \"false\" || lowerValue === \"no\") {\n return false;\n }\n throw new Error(`Invalid value: \"${value}\"`);\n },\n};\n\nexport const typeDate: Type<Date> = {\n label: \"DATE\",\n decoder(value: string) {\n const timestamp = Date.parse(value);\n if (isNaN(timestamp)) {\n throw new Error(`Invalid ISO_8601 value: \"${value}\"`);\n }\n return new Date(timestamp);\n },\n};\n\nexport const typeUrl: Type<URL> = {\n label: \"URL\",\n decoder(value: string) {\n return new URL(value);\n },\n};\n\nexport const typeString: Type<string> = {\n label: \"STRING\",\n decoder(value: string) {\n return value;\n },\n};\n\nexport const typeNumber: Type<number> = {\n label: \"NUMBER\",\n decoder(value: string) {\n return Number(value);\n },\n};\n\nexport const typeBigInt: Type<bigint> = {\n label: \"BIGINT\",\n decoder(value: string) {\n return BigInt(value);\n },\n};\n\nexport function typeMapped<Before, After>(\n before: Type<Before>,\n after: {\n label: Uppercase<string>;\n decoder: (value: Before) => After;\n },\n): Type<After> {\n return {\n label: after.label,\n decoder: (value: string) => {\n return after.decoder(\n typeDecode(\n before,\n value,\n () => new TypoText(new TypoString(before.label, typoStyleUserInput)),\n ),\n );\n },\n };\n}\n\nexport function typeOneOf<Value>(\n type: Type<Value>,\n values: Array<Value>,\n): Type<Value> {\n const valuesSet = new Set(values);\n return {\n label: type.label,\n decoder(value: string) {\n const decoded = typeDecode(\n type,\n value,\n () => new TypoText(new TypoString(type.label, typoStyleUserInput)),\n );\n if (valuesSet.has(decoded)) {\n return decoded;\n }\n const valuesDesc = values.map((v) => `\"${v}\"`).join(\"|\");\n throw new Error(`Unexpected value: \"${value}\" (expected: ${valuesDesc})`);\n },\n };\n}\n\nexport function typeTuple<const Elements extends Array<any>>(\n elementTypes: { [K in keyof Elements]: Type<Elements[K]> },\n separator: string = \",\",\n): Type<Elements> {\n return {\n label: elementTypes\n .map((elementType) => elementType.label)\n .join(separator) as Uppercase<string>,\n decoder(value: string) {\n const parts = value.split(separator, elementTypes.length);\n if (parts.length !== elementTypes.length) {\n throw new Error(`Invalid tuple parts: ${JSON.stringify(parts)}`);\n }\n return parts.map((part, index) =>\n typeDecode(\n elementTypes[index]!,\n part,\n () =>\n new TypoText(\n new TypoString(elementTypes[index]!.label, typoStyleUserInput),\n new TypoString(`@${index}`),\n ),\n ),\n ) as Elements;\n },\n };\n}\n\nexport function typeList<Value>(\n elementType: Type<Value>,\n separator: string = \",\",\n): Type<Array<Value>> {\n return {\n label:\n `${elementType.label}[${separator}${elementType.label}]...` as Uppercase<string>,\n decoder(value: string) {\n return value\n .split(separator)\n .map((part, index) =>\n typeDecode(\n elementType,\n part,\n () =>\n new TypoText(\n new TypoString(elementType.label, typoStyleUserInput),\n new TypoString(`@${index}`),\n ),\n ),\n );\n },\n };\n}\n\nexport function typeDecode<Value>(\n type: Type<Value>,\n value: string,\n context: () => TypoText,\n): Value {\n try {\n return type.decoder(value);\n } catch (error) {\n throw new TypoError(context(), error);\n }\n}\n","import { ReaderArgs as ReaderOptions } from \"./Reader\";\nimport { Type, typeBoolean, typeDecode } from \"./Type\";\nimport {\n TypoError,\n TypoString,\n typoStyleConstants,\n typoStyleUserInput,\n TypoText,\n} from \"./Typo\";\n\nexport type Option<Value> = {\n generateUsage(): OptionUsage;\n createGetter(readerOptions: ReaderOptions): OptionGetter<Value>;\n};\n\nexport type OptionUsage = {\n description: string | undefined;\n hint: string | undefined;\n long: Lowercase<string>; // TODO - better type for long option names ?\n short: string | undefined;\n label: Uppercase<string> | undefined;\n};\n\nexport type OptionGetter<Value> = {\n getValue(): Value;\n};\n\nexport function optionFlag(definition: {\n long: Lowercase<string>;\n short?: string;\n description?: string;\n hint?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n default?: () => boolean;\n}): Option<boolean> {\n const label = `<${typeBoolean.label}>` as Uppercase<string>;\n return {\n generateUsage() {\n return {\n description: definition.description,\n hint: definition.hint,\n long: definition.long,\n short: definition.short,\n label: undefined,\n };\n },\n createGetter(readerOptions: ReaderOptions) {\n const key = registerOption(readerOptions, {\n ...definition,\n valued: false,\n });\n return {\n getValue() {\n const optionValues = readerOptions.getOptionValues(key);\n if (optionValues.length > 1) {\n throw new TypoError(\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: Must not be set multiple times`),\n ),\n );\n }\n const optionValue = optionValues[0];\n if (optionValue === undefined) {\n // TODO - scoped error util\n try {\n return definition.default ? definition.default() : false;\n } catch (error) {\n throw new TypoError(\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: Failed to compute default value`),\n ),\n error,\n );\n }\n }\n return typeDecode(\n typeBoolean,\n optionValue,\n () =>\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: `),\n new TypoString(label, typoStyleUserInput),\n ),\n );\n },\n };\n },\n };\n}\n\nexport function optionSingleValue<Value>(definition: {\n long: Lowercase<string>;\n short?: string;\n description?: string;\n hint?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n label?: Uppercase<string>;\n type: Type<Value>;\n default: () => Value;\n}): Option<Value> {\n const label = `<${definition.label ?? definition.type.label}>`;\n return {\n generateUsage() {\n return {\n description: definition.description,\n hint: definition.hint,\n long: definition.long,\n short: definition.short,\n label: label as Uppercase<string>,\n };\n },\n createGetter(readerOptions: ReaderOptions) {\n const key = registerOption(readerOptions, {\n ...definition,\n valued: true,\n });\n return {\n getValue() {\n const optionValues = readerOptions.getOptionValues(key);\n if (optionValues.length > 1) {\n throw new TypoError(\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: Must not be set multiple times`),\n ),\n );\n }\n const optionValue = optionValues[0];\n if (optionValue === undefined) {\n try {\n return definition.default();\n } catch (error) {\n throw new TypoError(\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: Failed to compute default value`),\n ),\n error,\n );\n }\n }\n return typeDecode(\n definition.type,\n optionValue,\n () =>\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: `),\n new TypoString(label, typoStyleUserInput),\n ),\n );\n },\n };\n },\n };\n}\n\nexport function optionRepeatable<Value>(definition: {\n long: Lowercase<string>;\n short?: string;\n description?: string;\n hint?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n label?: Uppercase<string>;\n type: Type<Value>;\n}): Option<Array<Value>> {\n const label = `<${definition.label ?? definition.type.label}>`;\n return {\n generateUsage() {\n // TODO - showcase that it can be repeated ?\n return {\n description: definition.description,\n hint: definition.hint,\n long: definition.long,\n short: definition.short,\n label: label as Uppercase<string>,\n };\n },\n createGetter(readerOptions: ReaderOptions) {\n const key = registerOption(readerOptions, {\n ...definition,\n valued: true,\n });\n return {\n getValue() {\n return readerOptions\n .getOptionValues(key)\n .map((value) =>\n typeDecode(\n definition.type,\n value,\n () =>\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: `),\n new TypoString(label, typoStyleUserInput),\n ),\n ),\n );\n },\n };\n },\n };\n}\n\nfunction registerOption(\n readerOptions: ReaderOptions,\n definition: {\n long: Lowercase<string>;\n short?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n valued: boolean;\n },\n) {\n const { long, short, aliases, valued } = definition;\n const longs = long ? [long] : [];\n if (aliases?.longs) {\n longs.push(...aliases?.longs);\n }\n const shorts = short ? [short] : [];\n if (aliases?.shorts) {\n shorts.push(...aliases?.shorts);\n }\n return readerOptions.registerOption({ longs, shorts, valued });\n}\n","import { ReaderPositionals } from \"./Reader\";\nimport { Type, typeDecode } from \"./Type\";\nimport { TypoError, TypoString, typoStyleUserInput, TypoText } from \"./Typo\";\n\nexport type Positional<Value> = {\n generateUsage(): PositionalUsage;\n consumePositionals(readerPositionals: ReaderPositionals): Value;\n};\n\nexport type PositionalUsage = {\n description: string | undefined;\n hint: string | undefined;\n label: Uppercase<string>;\n};\n\nexport function positionalRequired<Value>(definition: {\n description?: string;\n hint?: string;\n label?: Uppercase<string>;\n type: Type<Value>;\n}): Positional<Value> {\n const label = `<${definition.label ?? definition.type.label}>`;\n return {\n generateUsage() {\n return {\n description: definition.description,\n hint: definition.hint,\n label: label as Uppercase<string>,\n };\n },\n consumePositionals(readerPositionals: ReaderPositionals) {\n const positional = readerPositionals.consumePositional();\n if (positional === undefined) {\n throw new TypoError(\n new TypoText(\n new TypoString(label, typoStyleUserInput),\n new TypoString(`: Is required, but was not provided`),\n ),\n );\n }\n return typeDecode(\n definition.type,\n positional,\n () => new TypoText(new TypoString(label, typoStyleUserInput)),\n );\n },\n };\n}\n\nexport function positionalOptional<Value>(definition: {\n description?: string;\n hint?: string;\n label?: Uppercase<string>;\n type: Type<Value>;\n default: () => Value;\n}): Positional<Value> {\n const label = `[${definition.label ?? definition.type.label}]`;\n return {\n generateUsage() {\n return {\n description: definition.description,\n hint: definition.hint,\n label: label as Uppercase<string>,\n };\n },\n consumePositionals(readerPositionals: ReaderPositionals) {\n const positional = readerPositionals.consumePositional();\n if (positional === undefined) {\n try {\n return definition.default();\n } catch (error) {\n throw new TypoError(\n new TypoText(\n new TypoString(label, typoStyleUserInput),\n new TypoString(`: Failed to compute default value`),\n ),\n error,\n );\n }\n }\n return typeDecode(\n definition.type,\n positional,\n () => new TypoText(new TypoString(label, typoStyleUserInput)),\n );\n },\n };\n}\n\nexport function positionalVariadics<Value>(definition: {\n endDelimiter?: string;\n description?: string;\n hint?: string;\n label?: Uppercase<string>;\n type: Type<Value>;\n}): Positional<Array<Value>> {\n const label = `[${definition.label ?? definition.type.label}]`;\n return {\n generateUsage() {\n return {\n description: definition.description,\n hint: definition.hint,\n label: (`${label}...` +\n (definition.endDelimiter\n ? `[\"${definition.endDelimiter}\"]`\n : \"\")) as Uppercase<string>,\n };\n },\n consumePositionals(readerPositionals: ReaderPositionals) {\n const positionals: Array<Value> = [];\n while (true) {\n const positional = readerPositionals.consumePositional();\n if (\n positional === undefined ||\n positional === definition.endDelimiter\n ) {\n break;\n }\n positionals.push(\n typeDecode(\n definition.type,\n positional,\n () => new TypoText(new TypoString(label, typoStyleUserInput)),\n ),\n );\n }\n return positionals;\n },\n };\n}\n","import { TypoError, TypoString, typoStyleConstants, TypoText } from \"./Typo\";\n\nexport type ReaderOptionKey = (string | { __brand: \"ReaderOptionKey\" }) & {\n __brand: \"ReaderOptionKey\";\n};\n\nexport type ReaderOptions = {\n registerOption(definition: {\n longs: Array<string>;\n shorts: Array<string>;\n valued: boolean;\n }): ReaderOptionKey;\n getOptionValues(key: ReaderOptionKey): Array<string>;\n};\n\nexport type ReaderPositionals = {\n consumePositional(): string | undefined;\n};\n\nexport class ReaderArgs {\n #args: ReadonlyArray<string>;\n #parsedIndex: number;\n #parsedDouble: boolean;\n #keyByLong: Map<string, ReaderOptionKey>;\n #keyByShort: Map<string, ReaderOptionKey>;\n #valuedByKey: Map<ReaderOptionKey, boolean>;\n #resultByKey: Map<ReaderOptionKey, Array<string>>;\n\n constructor(args: ReadonlyArray<string>) {\n this.#args = args;\n this.#parsedIndex = 0;\n this.#parsedDouble = false;\n this.#keyByLong = new Map();\n this.#keyByShort = new Map();\n this.#valuedByKey = new Map();\n this.#resultByKey = new Map();\n }\n\n registerOption(definition: {\n longs: Array<string>;\n shorts: Array<string>;\n valued: boolean;\n }) {\n const key = [\n ...definition.longs.map((long) => `--${long}`),\n ...definition.shorts.map((short) => `-${short}`),\n ].join(\", \") as ReaderOptionKey;\n for (const long of definition.longs) {\n if (this.#keyByLong.has(long)) {\n throw new Error(`Option already registered: --${long}`);\n }\n this.#keyByLong.set(long, key);\n }\n for (const short of definition.shorts) {\n if (this.#keyByShort.has(short)) {\n throw new Error(`Option already registered: -${short}`);\n }\n for (let i = 0; i < short.length; i++) {\n const shortSlice = short.slice(0, i);\n if (this.#keyByShort.has(shortSlice)) {\n throw new Error(\n `Option -${short} overlap with shorter option: -${shortSlice}`,\n );\n }\n }\n for (const shortOther of this.#keyByShort.keys()) {\n if (shortOther.startsWith(short)) {\n throw new Error(\n `Option -${short} overlap with longer option: -${shortOther}`,\n );\n }\n }\n this.#keyByShort.set(short, key);\n }\n this.#valuedByKey.set(key, definition.valued);\n this.#resultByKey.set(key, new Array<string>());\n return key;\n }\n\n getOptionValues(key: ReaderOptionKey): Array<string> {\n const optionResult = this.#resultByKey.get(key);\n if (optionResult === undefined) {\n throw new Error(`Unregistered option: ${key}`);\n }\n return optionResult;\n }\n\n consumePositional(): string | undefined {\n while (true) {\n const arg = this.#consumeArg();\n if (arg === null) {\n return undefined;\n }\n if (this.#processedAsPositional(arg)) {\n return arg;\n }\n }\n }\n\n #consumeArg(): string | null {\n const arg = this.#args[this.#parsedIndex];\n if (arg === undefined) {\n return null;\n }\n this.#parsedIndex++;\n if (!this.#parsedDouble) {\n if (arg === \"--\") {\n this.#parsedDouble = true;\n return this.#consumeArg();\n }\n }\n return arg;\n }\n\n #processedAsPositional(arg: string): boolean {\n if (this.#parsedDouble) {\n return true;\n }\n if (arg.startsWith(\"--\")) {\n const valueIndexStart = arg.indexOf(\"=\");\n if (valueIndexStart === -1) {\n this.#consumeOptionLong(arg.slice(2), null);\n } else {\n this.#consumeOptionLong(\n arg.slice(2, valueIndexStart),\n arg.slice(valueIndexStart + 1),\n );\n }\n return false;\n }\n if (arg.startsWith(\"-\")) {\n let shortIndexStart = 1;\n let shortIndexEnd = 2;\n while (shortIndexEnd <= arg.length) {\n const result = this.#tryConsumeOptionShort(\n arg.slice(shortIndexStart, shortIndexEnd),\n arg.slice(shortIndexEnd),\n );\n if (result === true) {\n return false;\n }\n if (result === false) {\n shortIndexStart = shortIndexEnd;\n }\n shortIndexEnd++;\n }\n throw new TypoError(\n new TypoText(\n new TypoString(`-${arg.slice(shortIndexStart)}`, typoStyleConstants),\n new TypoString(`: Unexpected unknown option`),\n ),\n );\n }\n return true;\n }\n\n #consumeOptionLong(long: string, direct: string | null): void {\n const constant = `--${long}`;\n const key = this.#keyByLong.get(long);\n if (key !== undefined) {\n if (direct !== null) {\n return this.#acknowledgeOption(key, direct);\n }\n const valued = this.#valuedByKey.get(key);\n if (valued) {\n return this.#acknowledgeOption(key, this.#consumeOptionValue(constant));\n }\n return this.#acknowledgeOption(key, \"true\");\n }\n throw new TypoError(\n new TypoText(\n new TypoString(constant, typoStyleConstants),\n new TypoString(`: Unexpected unknown option`),\n ),\n );\n }\n\n #tryConsumeOptionShort(short: string, rest: string): boolean | null {\n const key = this.#keyByShort.get(short);\n if (key !== undefined) {\n if (rest.startsWith(\"=\")) {\n this.#acknowledgeOption(key, rest.slice(1));\n return true;\n }\n const valued = this.#valuedByKey.get(key);\n if (valued) {\n if (rest === \"\") {\n this.#acknowledgeOption(key, this.#consumeOptionValue(`-${short}`));\n } else {\n this.#acknowledgeOption(key, rest);\n }\n return true;\n }\n this.#acknowledgeOption(key, \"true\");\n return rest === \"\";\n }\n return null;\n }\n\n #consumeOptionValue(constant: string) {\n const arg = this.#consumeArg();\n if (arg === null) {\n throw new TypoError(\n new TypoText(\n new TypoString(constant, typoStyleConstants),\n new TypoString(`: Requires a value, but got end of input`),\n ),\n );\n }\n if (this.#parsedDouble) {\n throw new TypoError(\n new TypoText(\n new TypoString(constant, typoStyleConstants),\n new TypoString(`: Requires a value before \"--\"`),\n ),\n );\n }\n // TODO - is that weird, could a valid value start with dash ?\n if (arg.startsWith(\"-\")) {\n throw new TypoError(\n new TypoText(\n new TypoString(constant, typoStyleConstants),\n new TypoString(`: Requires a value, but got: \"${arg}\"`),\n ),\n );\n }\n return arg;\n }\n\n #acknowledgeOption(key: ReaderOptionKey, value: string) {\n this.getOptionValues(key).push(value);\n }\n}\n","import { CommandUsage } from \"./Command\";\nimport {\n TypoGrid,\n TypoString,\n typoStyleConstants,\n typoStyleUserInput,\n TypoSupport,\n TypoText,\n} from \"./Typo\";\n\nexport function usageToStyledLines(params: {\n cliName: Lowercase<string>;\n commandUsage: CommandUsage;\n typoSupport: TypoSupport;\n}) {\n const { cliName, commandUsage, typoSupport } = params;\n\n const lines = new Array<string>();\n\n const breadcrumbs = [\n textUsageTitle(\"Usage:\").computeStyledString(typoSupport),\n textConstants(cliName).computeStyledString(typoSupport),\n ].concat(\n commandUsage.breadcrumbs.map((breadcrumb) => {\n if (\"positional\" in breadcrumb) {\n return textUserInput(breadcrumb.positional).computeStyledString(\n typoSupport,\n );\n }\n if (\"command\" in breadcrumb) {\n return textConstants(breadcrumb.command).computeStyledString(\n typoSupport,\n );\n }\n throw new Error(`Unknown breadcrumb: ${JSON.stringify(breadcrumb)}`);\n }),\n );\n lines.push(breadcrumbs.join(\" \"));\n\n lines.push(\"\");\n const infoText = new TypoText();\n infoText.pushString(textUsageIntro(commandUsage.information.description));\n if (commandUsage.information.hint) {\n infoText.pushString(textDelimiter(\" \"));\n infoText.pushString(textSubtleInfo(`(${commandUsage.information.hint})`));\n }\n lines.push(infoText.computeStyledString(typoSupport));\n if (commandUsage.information.details) {\n const detailsString = textSubtleInfo(commandUsage.information.details);\n lines.push(detailsString.computeStyledString(typoSupport));\n }\n\n if (commandUsage.positionals.length > 0) {\n lines.push(\"\");\n lines.push(textBlockTitle(\"Positionals:\").computeStyledString(typoSupport));\n const typoGrid = new TypoGrid();\n for (const positionalUsage of commandUsage.positionals) {\n const typoGridRow = new Array<TypoText>();\n typoGridRow.push(new TypoText(textDelimiter(\" \")));\n typoGridRow.push(new TypoText(textUserInput(positionalUsage.label)));\n typoGridRow.push(...createInformationals(positionalUsage));\n typoGrid.pushRow(typoGridRow);\n }\n lines.push(\n ...typoGrid.computeStyledGrid(typoSupport).map((row) => row.join(\"\")),\n );\n }\n\n if (commandUsage.subcommands.length > 0) {\n lines.push(\"\");\n lines.push(textBlockTitle(\"Subcommands:\").computeStyledString(typoSupport));\n const typoGrid = new TypoGrid();\n for (const subcommandUsage of commandUsage.subcommands) {\n const typoGridRow = new Array<TypoText>();\n typoGridRow.push(new TypoText(textDelimiter(\" \")));\n typoGridRow.push(new TypoText(textConstants(subcommandUsage.name)));\n typoGridRow.push(...createInformationals(subcommandUsage));\n typoGrid.pushRow(typoGridRow);\n }\n lines.push(\n ...typoGrid.computeStyledGrid(typoSupport).map((row) => row.join(\"\")),\n );\n }\n\n if (commandUsage.options.length > 0) {\n lines.push(\"\");\n lines.push(textBlockTitle(\"Options:\").computeStyledString(typoSupport));\n const typoGrid = new TypoGrid();\n for (const optionUsage of commandUsage.options) {\n const typoGridRow = new Array<TypoText>();\n typoGridRow.push(new TypoText(textDelimiter(\" \")));\n if (optionUsage.short) {\n typoGridRow.push(\n new TypoText(\n textConstants(`-${optionUsage.short}`),\n textDelimiter(\", \"),\n ),\n );\n } else {\n typoGridRow.push(new TypoText());\n }\n if (optionUsage.label) {\n typoGridRow.push(\n new TypoText(\n textConstants(`--${optionUsage.long}`),\n textDelimiter(\" \"),\n textUserInput(optionUsage.label),\n ),\n );\n } else {\n typoGridRow.push(\n new TypoText(\n textConstants(`--${optionUsage.long}`),\n textSubtleInfo(\"[=no]\"),\n ),\n );\n }\n typoGridRow.push(...createInformationals(optionUsage));\n typoGrid.pushRow(typoGridRow);\n }\n lines.push(\n ...typoGrid.computeStyledGrid(typoSupport).map((row) => row.join(\"\")),\n );\n }\n\n lines.push(\"\");\n return lines;\n}\n\nfunction createInformationals(usage: {\n description: string | undefined;\n hint: string | undefined;\n}): Array<TypoText> {\n const informationals = [];\n if (usage.description) {\n informationals.push(textDelimiter(\" \"));\n informationals.push(textUsefulInfo(usage.description));\n }\n if (usage.hint) {\n informationals.push(textDelimiter(\" \"));\n informationals.push(textSubtleInfo(`(${usage.hint})`));\n }\n if (informationals.length > 0) {\n return [new TypoText(textDelimiter(\" \"), ...informationals)];\n }\n return [];\n}\n\nfunction textUsageIntro(value: string): TypoString {\n return new TypoString(value, { bold: true });\n}\n\nfunction textUsageTitle(value: string): TypoString {\n return new TypoString(value, { fgColor: \"darkMagenta\", bold: true });\n}\n\nfunction textUsefulInfo(value: string): TypoString {\n return new TypoString(value);\n}\n\nfunction textSubtleInfo(value: string): TypoString {\n return new TypoString(value, { italic: true, dim: true });\n}\n\nfunction textBlockTitle(value: string): TypoString {\n return new TypoString(value, { fgColor: \"darkGreen\", bold: true });\n}\n\nfunction textConstants(value: string): TypoString {\n return new TypoString(value, typoStyleConstants);\n}\n\nfunction textUserInput(value: string): TypoString {\n return new TypoString(value, typoStyleUserInput);\n}\n\nfunction textDelimiter(value: string): TypoString {\n return new TypoString(value);\n}\n","import { Command, CommandFactory } from \"./Command\";\nimport { ReaderArgs } from \"./Reader\";\nimport { TypoSupport } from \"./Typo\";\nimport { usageToStyledLines } from \"./Usage\";\n\nexport async function runAsCliAndExit<Context>(\n cliName: Lowercase<string>,\n cliArgs: ReadonlyArray<string>,\n context: Context,\n command: Command<Context, void>,\n application?: {\n usageOnHelp?: boolean | undefined;\n buildVersion?: string | undefined;\n useColors?: boolean | undefined;\n onExecutionError?: ((error: unknown) => void) | undefined;\n onLogStdOut?: ((message: string) => void) | undefined; // TODO - this is a problem, deep commands use console\n onLogStdErr?: ((message: string) => void) | undefined;\n onExit?: ((code: number) => never) | undefined;\n },\n): Promise<never> {\n const readerArgs = new ReaderArgs(cliArgs);\n const usageOnHelp = application?.usageOnHelp ?? true;\n if (usageOnHelp) {\n readerArgs.registerOption({\n shorts: [],\n longs: [\"help\"],\n valued: false,\n });\n }\n const buildVersion = application?.buildVersion;\n if (buildVersion) {\n readerArgs.registerOption({\n shorts: [],\n longs: [\"version\"],\n valued: false,\n });\n }\n /*\n // TODO - handle completions ?\n readerArgs.registerFlag({\n key: \"completion\",\n shorts: [],\n longs: [\"completion\"],\n });\n */\n const 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 const errors = [];\n while (true) {\n try {\n const positional = readerArgs.consumePositional();\n if (positional === undefined) {\n break;\n }\n } catch (error) {\n errors.push(error);\n }\n }\n if (usageOnHelp) {\n if (readerArgs.getOptionValues(\"--help\" as any).length > 0) {\n onLogStdOut(computeUsageString(cliName, commandFactory, typoSupport));\n return onExit(0);\n }\n }\n if (buildVersion) {\n if (readerArgs.getOptionValues(\"--version\" as any).length > 0) {\n onLogStdOut([cliName, buildVersion].join(\" \"));\n return onExit(0);\n }\n }\n try {\n const commandInstance = commandFactory.createInstance();\n try {\n await commandInstance.executeWithContext(context);\n return onExit(0);\n } catch (error) {\n if (application?.onExecutionError) {\n application.onExecutionError(error);\n } else {\n onLogStdErr(typoSupport.computeStyledErrorMessage(error));\n }\n return onExit(1);\n }\n } catch (error) {\n errors.unshift(error);\n onLogStdErr(computeUsageString(cliName, commandFactory, typoSupport));\n for (const error of errors) {\n onLogStdErr(typoSupport.computeStyledErrorMessage(error));\n }\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":"m3BAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,gBAAAE,EAAA,cAAAC,EAAA,aAAAC,EAAA,eAAAC,EAAA,gBAAAC,EAAA,aAAAC,EAAA,YAAAC,GAAA,mBAAAC,GAAA,2BAAAC,GAAA,cAAAC,GAAA,eAAAC,GAAA,qBAAAC,GAAA,sBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,wBAAAC,GAAA,oBAAAC,GAAA,eAAAC,GAAA,gBAAAC,EAAA,aAAAC,GAAA,eAAAC,EAAA,aAAAC,GAAA,eAAAC,GAAA,eAAAC,GAAA,cAAAC,GAAA,eAAAC,GAAA,cAAAC,GAAA,YAAAC,GAAA,uBAAAC,EAAA,qBAAAC,GAAA,uBAAAC,EAAA,uBAAAC,KAAA,eAAAC,GAAAlC,IC4BO,IAAMmC,EAAgC,CAC3C,QAAS,WACT,KAAM,EACR,EACaC,EAAgC,CAC3C,QAAS,WACT,KAAM,EACR,EACaC,GAA8B,CACzC,QAAS,UACT,KAAM,EACR,EAvCAC,EAAAC,EAyCaC,EAAN,KAAiB,CAGtB,YAAYC,EAAeC,EAAuB,CAAC,EAAG,CAFtDC,EAAA,KAAAL,GACAK,EAAA,KAAAJ,GAEEK,EAAA,KAAKN,EAASG,GACdG,EAAA,KAAKL,EAAaG,EACpB,CACA,cAAuB,CACrB,OAAOG,EAAA,KAAKP,EACd,CACA,oBAAoBQ,EAAkC,CACpD,OAAOA,EAAY,oBAAoBD,EAAA,KAAKP,GAAQO,EAAA,KAAKN,EAAU,CACrE,CACF,EAZED,EAAA,YACAC,EAAA,YA3CF,IAAAQ,EAwDaC,EAAN,MAAMA,CAAS,CAEpB,eAAeC,EAAkD,CADjEN,EAAA,KAAAI,GAEEH,EAAA,KAAKG,EAAe,CAAC,GACrB,QAAWG,KAAYD,EACjBC,aAAoBF,EACtB,KAAK,SAASE,CAAQ,EACbA,aAAoBV,EAC7B,KAAK,WAAWU,CAAQ,EACf,OAAOA,GAAa,UAC7B,KAAK,WAAW,IAAIV,EAAWU,CAAQ,CAAC,CAG9C,CACA,WAAWC,EAAwB,CACjCN,EAAA,KAAKE,GAAa,KAAKI,CAAU,CACnC,CACA,SAASC,EAAoB,CAC3B,QAAWD,KAAcN,EAAAO,EAASL,GAChCF,EAAA,KAAKE,GAAa,KAAKI,CAAU,CAErC,CACA,oBAAoBL,EAAkC,CACpD,OAAOD,EAAA,KAAKE,GACT,IAAKM,GAAMA,EAAE,oBAAoBP,CAAW,CAAC,EAC7C,KAAK,EAAE,CACZ,CACA,kBAA2B,CACzB,OAAOD,EAAA,KAAKE,GAAa,IAAKM,GAAMA,EAAE,aAAa,CAAC,EAAE,KAAK,EAAE,CAC/D,CACA,kBAA2B,CACzB,IAAIC,EAAS,EACb,QAAWH,KAAcN,EAAA,KAAKE,GAC5BO,GAAUH,EAAW,aAAa,EAAE,OAEtC,OAAOG,CACT,CACF,EApCEP,EAAA,YADK,IAAMQ,EAANP,EAxDPQ,EA+FaC,EAAN,KAAe,CAEpB,aAAc,CADdd,EAAA,KAAAa,GAEEZ,EAAA,KAAKY,EAAY,CAAC,EACpB,CACA,QAAQE,EAAwB,CAC9Bb,EAAA,KAAKW,GAAU,KAAKE,CAAK,CAC3B,CACA,kBAAkBZ,EAAgD,CAChE,IAAMa,EAAS,IAAI,MACbC,EAAgB,IAAI,MAC1B,QAAWC,KAAehB,EAAA,KAAKW,GAC7B,QACMM,EAAsB,EAC1BA,EAAsBD,EAAY,OAClCC,IACA,CAEA,IAAMC,EADeF,EAAYC,CAAmB,EACzB,iBAAiB,GAE1CH,EAAOG,CAAmB,IAAM,QAChCC,EAAQJ,EAAOG,CAAmB,KAElCH,EAAOG,CAAmB,EAAIC,EAElC,CAEF,QAAWF,KAAehB,EAAA,KAAKW,GAAW,CACxC,IAAMQ,EAAmB,IAAI,MAC7B,QACMF,EAAsB,EAC1BA,EAAsBD,EAAY,OAClCC,IACA,CACA,IAAMG,EAAeJ,EAAYC,CAAmB,EAC9CI,EAAoBD,EAAa,oBAAoBnB,CAAW,EAEtE,GADAkB,EAAiB,KAAKE,CAAiB,EACnCJ,EAAsBD,EAAY,OAAS,EAAG,CAChD,IAAME,EAAQE,EAAa,iBAAiB,EACtCE,EAAU,IAAI,OAAOR,EAAOG,CAAmB,EAAKC,CAAK,EAC/DC,EAAiB,KAAKG,CAAO,CAC/B,CACF,CACAP,EAAc,KAAKI,CAAgB,CACrC,CACA,OAAOJ,CACT,CACF,EA9CEJ,EAAA,YAhGF,IAAAY,EAgJaC,GAAN,MAAMA,WAAkB,KAAM,CAEnC,YAAYC,EAA2BC,EAAkB,CACvD,IAAMnB,EAAW,IAAIG,EACrBH,EAAS,SAASkB,CAAe,EAC7BC,aAAkB,MACpBnB,EAAS,WAAW,IAAIZ,EAAW,KAAK+B,EAAO,OAAO,EAAE,CAAC,EAChDA,aAAkBF,IAC3BjB,EAAS,WAAW,IAAIZ,EAAW,IAAI,CAAC,EACxCY,EAAS,SAASP,EAAA0B,EAAOH,EAAS,GACzBG,IAAW,QACpBnB,EAAS,WAAW,IAAIZ,EAAW,KAAK,OAAO+B,CAAM,CAAC,EAAE,CAAC,EAE3D,MAAMnB,EAAS,iBAAiB,CAAC,EAZnCT,EAAA,KAAAyB,GAaExB,EAAA,KAAKwB,EAAYhB,EACnB,CACA,oBAAoBN,EAAkC,CACpD,OAAOD,EAAA,KAAKuB,GAAU,oBAAoBtB,CAAW,CACvD,CACF,EAlBEsB,EAAA,YADK,IAAMI,EAANH,GAhJPI,EAqKaC,EAAN,MAAMA,CAAY,CAEf,YAAYC,EAA+B,CADnDhC,EAAA,KAAA8B,GAEE7B,EAAA,KAAK6B,EAAQE,EACf,CACA,OAAO,MAAoB,CACzB,OAAO,IAAID,EAAY,MAAM,CAC/B,CACA,OAAO,KAAmB,CACxB,OAAO,IAAIA,EAAY,KAAK,CAC9B,CACA,OAAO,MAAoB,CACzB,OAAO,IAAIA,EAAY,MAAM,CAC/B,CACA,OAAO,kBAAgC,CACrC,GAAI,CAAC,QACH,OAAOA,EAAY,KAAK,EAE1B,GAAI,QAAQ,IAAK,CACf,GAAI,QAAQ,IAAI,cAAmB,IACjC,OAAOA,EAAY,KAAK,EAE1B,GAAI,QAAQ,IAAI,YACd,OAAOA,EAAY,IAAI,EAEzB,GAAI,aAAc,QAAQ,IACxB,OAAOA,EAAY,KAAK,CAE5B,CACA,MAAI,CAAC,QAAQ,QAAU,CAAC,QAAQ,OAAO,MAC9BA,EAAY,KAAK,EAEnBA,EAAY,IAAI,CACzB,CACA,oBAAoBjC,EAAeC,EAA8B,CAC/D,GAAIG,EAAA,KAAK4B,KAAU,OACjB,OAAOhC,EAET,GAAII,EAAA,KAAK4B,KAAU,MAAO,CACxB,IAAMG,EAAclC,EAAU,QAC1BmC,GAAgBnC,EAAU,OAAO,EACjC,GACEoC,EAAcpC,EAAU,QAC1BqC,GAAgBrC,EAAU,OAAO,EACjC,GACEsC,EAAWtC,EAAU,KAAOuC,GAAc,GAC1CC,EAAUxC,EAAU,IAAMyC,GAAa,GACvCC,EAAa1C,EAAU,OAAS2C,GAAgB,GAChDC,EAAgB5C,EAAU,UAAY6C,GAAmB,GACzDC,EAAoB9C,EAAU,cAChC+C,GACA,GACJ,MAAO,GAAGb,CAAW,GAAGE,CAAW,GAAGE,CAAQ,GAAGE,CAAO,GAAGE,CAAU,GAAGE,CAAa,GAAGE,CAAiB,GAAG/C,CAAK,GAAGiD,EAAY,EAClI,CACA,GAAI7C,EAAA,KAAK4B,KAAU,OAAQ,CACzB,IAAMkB,EAAcjD,EAAU,QAC1B,IAAID,CAAK,KAAKC,EAAU,OAAO,GAC/BD,EACEmD,EAAclD,EAAU,QAC1B,IAAIiD,CAAW,KAAKjD,EAAU,OAAO,GACrCiD,EACEE,EAAWnD,EAAU,KAAO,IAAIkD,CAAW,KAAOA,EAClDE,EAAUpD,EAAU,IAAM,IAAImD,CAAQ,KAAOA,EAC7CE,EAAarD,EAAU,OAAS,IAAIoD,CAAO,KAAOA,EAClDE,EAAgBtD,EAAU,UAC5B,IAAIqD,CAAU,KACdA,EAIJ,OAH0BrD,EAAU,cAChC,IAAIsD,CAAa,KACjBA,CAEN,CACA,MAAM,IAAI,MAAM,6BAA6BnD,EAAA,KAAK4B,EAAK,EAAE,CAC3D,CACA,0BAA0BwB,EAAwB,CAChD,MAAO,CACL,KAAK,oBAAoB,SAAU5D,EAAgB,EACnD4D,aAAiBzB,EACbyB,EAAM,oBAAoB,IAAI,EAC9BA,aAAiB,MACfA,EAAM,QACN,OAAOA,CAAK,CACpB,EAAE,KAAK,GAAG,CACZ,CACF,EAnFExB,EAAA,YADK,IAAMyB,EAANxB,EAsFDgB,GAAe,UACfT,GAAc,UACdE,GAAa,UACbE,GAAgB,UAChBE,GAAmB,UACnBE,GAAuB,UACvBZ,GAA6C,CACjD,UAAW,WACX,QAAS,WACT,UAAW,WACX,WAAY,WACZ,SAAU,WACV,YAAa,WACb,SAAU,WACV,UAAW,WACX,YAAa,WACb,UAAW,WACX,YAAa,WACb,aAAc,WACd,WAAY,WACZ,cAAe,WACf,WAAY,WACZ,YAAa,UACf,EACME,GAA6C,CACjD,UAAW,WACX,QAAS,WACT,UAAW,WACX,WAAY,WACZ,SAAU,WACV,YAAa,WACb,SAAU,WACV,UAAW,WACX,YAAa,YACb,UAAW,YACX,YAAa,YACb,aAAc,YACd,WAAY,YACZ,cAAe,YACf,WAAY,YACZ,YAAa,WACf,ECvPO,SAASoB,GACdC,EACAC,EAC0B,CAC1B,MAAO,CACL,gBAAiB,CACf,OAAOD,CACT,EACA,cAAcE,EAAwB,CACpC,SAASC,GAA8B,CACrC,IAAMC,EAAiBH,EAAU,cAAc,EAC/C,MAAO,CACL,YAAaG,EAAe,YAAY,IAAKC,GAC3CC,EAAqBD,EAAW,KAAK,CACvC,EACA,YAAaL,EACb,YAAaI,EAAe,YAC5B,YAAa,CAAC,EACd,QAASA,EAAe,OAC1B,CACF,CACA,GAAI,CACF,IAAMG,EAAmBN,EAAU,cAAcC,CAAU,EACrDM,EAAgBN,EAAW,kBAAkB,EACnD,GAAIM,IAAkB,OACpB,MAAM,MAAM,yBAAyBA,CAAa,GAAG,EAEvD,MAAO,CACL,cAAAL,EACA,gBAAiB,CACf,IAAMM,EAAoBF,EAAiB,eAAe,EAC1D,MAAO,CACL,MAAM,mBAAmBG,EAAkB,CACzC,OAAO,MAAMD,EAAkB,mBAAmBC,CAAO,CAC3D,CACF,CACF,CACF,CACF,OAASC,EAAO,CACd,MAAO,CACL,cAAAR,EACA,gBAAiB,CACf,MAAMQ,CACR,CACF,CACF,CACF,CACF,CACF,CAEO,SAASC,GACdZ,EACAC,EACAY,EAC0B,CAC1B,MAAO,CACL,gBAAiB,CACf,OAAOb,CACT,EACA,cAAcE,EAAwB,CACpC,GAAI,CACF,IAAMK,EAAmBN,EAAU,cAAcC,CAAU,EACrDY,EAAiBZ,EAAW,kBAAkB,EACpD,GAAIY,IAAmB,OACrB,MAAM,IAAIC,EACR,IAAIC,EACF,IAAIC,EAAW,eAAgBC,CAAkB,EACjD,IAAID,EAAW,qCAAqC,CACtD,CACF,EAEF,IAAME,EACJN,EAAYC,CAAmC,EACjD,GAAIK,IAAoB,OACtB,MAAM,IAAIJ,EACR,IAAIC,EACF,IAAIC,EAAW,eAAgBC,CAAkB,EACjD,IAAID,EAAW,qBAAqBH,CAAc,GAAG,CACvD,CACF,EAEF,IAAMM,EAAoBD,EAAgB,cAAcjB,CAAU,EAClE,MAAO,CACL,eAAgB,CACd,IAAME,EAAiBH,EAAU,cAAc,EACzCoB,EAAkBD,EAAkB,cAAc,EACxD,MAAO,CACL,YAAahB,EAAe,YACzB,IAAKC,GAAeC,EAAqBD,EAAW,KAAK,CAAC,EAC1D,OAAO,CAACiB,GAAkBR,CAAc,CAAC,CAAC,EAC1C,OAAOO,EAAgB,WAAW,EACrC,YAAaA,EAAgB,YAC7B,YAAajB,EAAe,YAAY,OACtCiB,EAAgB,WAClB,EACA,YAAaA,EAAgB,YAC7B,QAASjB,EAAe,QAAQ,OAAOiB,EAAgB,OAAO,CAChE,CACF,EACA,gBAAiB,CACf,IAAMZ,EAAoBF,EAAiB,eAAe,EACpDgB,EAAqBH,EAAkB,eAAe,EAC5D,MAAO,CACL,MAAM,mBAAmBV,EAAkB,CACzC,OAAO,MAAMa,EAAmB,mBAC9B,MAAMd,EAAkB,mBAAmBC,CAAO,CACpD,CACF,CACF,CACF,CACF,CACF,OAASC,EAAO,CACd,MAAO,CACL,eAAgB,CACd,IAAMP,EAAiBH,EAAU,cAAc,EAC/C,MAAO,CACL,YAAaG,EAAe,YACzB,IAAKC,GAAeC,EAAqBD,EAAW,KAAK,CAAC,EAC1D,OAAO,CAACiB,GAAkB,cAAc,CAAC,CAAC,EAC7C,YAAatB,EACb,YAAaI,EAAe,YAC5B,YAAa,OAAO,QAAQS,CAAW,EAAE,IAAKW,GAAe,CAC3D,IAAMC,EAAWD,EAAW,CAAC,EAAE,eAAe,EAC9C,MAAO,CACL,KAAMA,EAAW,CAAC,EAClB,YAAaC,EAAS,YACtB,KAAMA,EAAS,IACjB,CACF,CAAC,EACD,QAASrB,EAAe,OAC1B,CACF,EACA,gBAAiB,CACf,MAAMO,CACR,CACF,CACF,CACF,CACF,CACF,CAEO,SAASe,GACd1B,EACAC,EACA0B,EAC0B,CAC1B,MAAO,CACL,gBAAiB,CACf,OAAO3B,CACT,EACA,cAAcE,EAAwB,CACpC,GAAI,CACF,IAAMK,EAAmBN,EAAU,cAAcC,CAAU,EACrD0B,EAAqBD,EAAY,cAAczB,CAAU,EAC/D,MAAO,CACL,eAAgB,CACd,IAAME,EAAiBH,EAAU,cAAc,EACzC4B,EAAmBD,EAAmB,cAAc,EAC1D,MAAO,CACL,YAAaxB,EAAe,YACzB,IAAKC,GAAeC,EAAqBD,EAAW,KAAK,CAAC,EAC1D,OAAOwB,EAAiB,WAAW,EACtC,YAAaA,EAAiB,YAC9B,YAAazB,EAAe,YAAY,OACtCyB,EAAiB,WACnB,EACA,YAAaA,EAAiB,YAC9B,QAASzB,EAAe,QAAQ,OAAOyB,EAAiB,OAAO,CACjE,CACF,EACA,gBAAiB,CACf,IAAMpB,EAAoBF,EAAiB,eAAe,EACpDuB,EAAsBF,EAAmB,eAAe,EAC9D,MAAO,CACL,MAAM,mBAAmBlB,EAAkB,CACzC,OAAO,MAAMoB,EAAoB,mBAC/B,MAAMrB,EAAkB,mBAAmBC,CAAO,CACpD,CACF,CACF,CACF,CACF,CACF,OAASC,EAAO,CACd,MAAO,CACL,eAAgB,CACd,IAAMP,EAAiBH,EAAU,cAAc,EAC/C,MAAO,CACL,YAAaG,EAAe,YACzB,IAAKC,GAAeC,EAAqBD,EAAW,KAAK,CAAC,EAC1D,OAAO,CAACC,EAAqB,WAAW,CAAC,CAAC,EAC7C,YAAaN,EACb,YAAaI,EAAe,YAC5B,YAAa,CAAC,EACd,QAASA,EAAe,OAC1B,CACF,EACA,gBAAiB,CACf,MAAMO,CACR,CACF,CACF,CACF,CACF,CACF,CAEA,SAASL,EAAqByB,EAAuC,CACnE,MAAO,CAAE,WAAYA,CAAM,CAC7B,CAEA,SAAST,GAAkBS,EAAuC,CAChE,MAAO,CAAE,QAASA,CAAM,CAC1B,CC1OO,SAASC,GAMdC,EAIAC,EAI4B,CAC5B,MAAO,CACL,eAAgB,CACd,IAAMC,EAAe,IAAI,MACzB,QAAWC,KAAaH,EAAO,QAAS,CACtC,IAAMI,EAAcJ,EAAO,QAAQG,CAAS,EACxCC,GACFF,EAAa,KAAKE,EAAY,cAAc,CAAC,CAEjD,CACA,IAAMC,EAAmB,IAAI,MAC7B,QAAWC,KAAmBN,EAAO,YACnCK,EAAiB,KAAKC,EAAgB,cAAc,CAAC,EAEvD,MAAO,CAAE,QAASJ,EAAc,YAAaG,CAAiB,CAChE,EACA,cAAcE,EAAwB,CACpC,IAAMC,EAAsB,CAAC,EAC7B,QAAWL,KAAaH,EAAO,QAAS,CACtC,IAAMI,EAAcJ,EAAO,QAAQG,CAAS,EAC5CK,EAAeL,CAAS,EAAIC,EAAY,aAAaG,CAAU,CACjE,CACA,IAAME,EAAyB,CAAC,EAChC,QAAWH,KAAmBN,EAAO,YACnCS,EAAkB,KAAKH,EAAgB,mBAAmBC,CAAU,CAAC,EAEvE,MAAO,CACL,gBAAiB,CACf,IAAMG,EAAqB,CAAC,EAC5B,QAAWP,KAAaK,EACtBE,EAAcP,CAAS,EAAIK,EAAeL,CAAS,EAAG,SAAS,EAEjE,MAAO,CACL,mBAAmBQ,EAAkB,CACnC,OAAOV,EAAQU,EAAS,CACtB,QAASD,EACT,YAAaD,CACf,CAAC,CACH,CACF,CACF,CACF,CACF,CACF,CACF,CCxEO,IAAMG,EAA6B,CACxC,MAAO,UACP,QAAQC,EAAe,CACrB,IAAMC,EAAaD,EAAM,YAAY,EACrC,GAAIC,IAAe,QAAUA,IAAe,MAC1C,MAAO,GAET,GAAIA,IAAe,SAAWA,IAAe,KAC3C,MAAO,GAET,MAAM,IAAI,MAAM,mBAAmBD,CAAK,GAAG,CAC7C,CACF,EAEaE,GAAuB,CAClC,MAAO,OACP,QAAQF,EAAe,CACrB,IAAMG,EAAY,KAAK,MAAMH,CAAK,EAClC,GAAI,MAAMG,CAAS,EACjB,MAAM,IAAI,MAAM,4BAA4BH,CAAK,GAAG,EAEtD,OAAO,IAAI,KAAKG,CAAS,CAC3B,CACF,EAEaC,GAAqB,CAChC,MAAO,MACP,QAAQJ,EAAe,CACrB,OAAO,IAAI,IAAIA,CAAK,CACtB,CACF,EAEaK,GAA2B,CACtC,MAAO,SACP,QAAQL,EAAe,CACrB,OAAOA,CACT,CACF,EAEaM,GAA2B,CACtC,MAAO,SACP,QAAQN,EAAe,CACrB,OAAO,OAAOA,CAAK,CACrB,CACF,EAEaO,GAA2B,CACtC,MAAO,SACP,QAAQP,EAAe,CACrB,OAAO,OAAOA,CAAK,CACrB,CACF,EAEO,SAASQ,GACdC,EACAC,EAIa,CACb,MAAO,CACL,MAAOA,EAAM,MACb,QAAUV,GACDU,EAAM,QACXC,EACEF,EACAT,EACA,IAAM,IAAIY,EAAS,IAAIC,EAAWJ,EAAO,MAAOK,CAAkB,CAAC,CACrE,CACF,CAEJ,CACF,CAEO,SAASC,GACdC,EACAC,EACa,CACb,IAAMC,EAAY,IAAI,IAAID,CAAM,EAChC,MAAO,CACL,MAAOD,EAAK,MACZ,QAAQhB,EAAe,CACrB,IAAMmB,EAAUR,EACdK,EACAhB,EACA,IAAM,IAAIY,EAAS,IAAIC,EAAWG,EAAK,MAAOF,CAAkB,CAAC,CACnE,EACA,GAAII,EAAU,IAAIC,CAAO,EACvB,OAAOA,EAET,IAAMC,EAAaH,EAAO,IAAKI,GAAM,IAAIA,CAAC,GAAG,EAAE,KAAK,GAAG,EACvD,MAAM,IAAI,MAAM,sBAAsBrB,CAAK,gBAAgBoB,CAAU,GAAG,CAC1E,CACF,CACF,CAEO,SAASE,GACdC,EACAC,EAAoB,IACJ,CAChB,MAAO,CACL,MAAOD,EACJ,IAAKE,GAAgBA,EAAY,KAAK,EACtC,KAAKD,CAAS,EACjB,QAAQxB,EAAe,CACrB,IAAM0B,EAAQ1B,EAAM,MAAMwB,EAAWD,EAAa,MAAM,EACxD,GAAIG,EAAM,SAAWH,EAAa,OAChC,MAAM,IAAI,MAAM,wBAAwB,KAAK,UAAUG,CAAK,CAAC,EAAE,EAEjE,OAAOA,EAAM,IAAI,CAACC,EAAMC,IACtBjB,EACEY,EAAaK,CAAK,EAClBD,EACA,IACE,IAAIf,EACF,IAAIC,EAAWU,EAAaK,CAAK,EAAG,MAAOd,CAAkB,EAC7D,IAAID,EAAW,IAAIe,CAAK,EAAE,CAC5B,CACJ,CACF,CACF,CACF,CACF,CAEO,SAASC,GACdJ,EACAD,EAAoB,IACA,CACpB,MAAO,CACL,MACE,GAAGC,EAAY,KAAK,IAAID,CAAS,GAAGC,EAAY,KAAK,OACvD,QAAQzB,EAAe,CACrB,OAAOA,EACJ,MAAMwB,CAAS,EACf,IAAI,CAACG,EAAMC,IACVjB,EACEc,EACAE,EACA,IACE,IAAIf,EACF,IAAIC,EAAWY,EAAY,MAAOX,CAAkB,EACpD,IAAID,EAAW,IAAIe,CAAK,EAAE,CAC5B,CACJ,CACF,CACJ,CACF,CACF,CAEO,SAASjB,EACdK,EACAhB,EACA8B,EACO,CACP,GAAI,CACF,OAAOd,EAAK,QAAQhB,CAAK,CAC3B,OAAS+B,EAAO,CACd,MAAM,IAAIC,EAAUF,EAAQ,EAAGC,CAAK,CACtC,CACF,CC5IO,SAASE,GAAWC,EAOP,CAClB,IAAMC,EAAQ,IAAIC,EAAY,KAAK,IACnC,MAAO,CACL,eAAgB,CACd,MAAO,CACL,YAAaF,EAAW,YACxB,KAAMA,EAAW,KACjB,KAAMA,EAAW,KACjB,MAAOA,EAAW,MAClB,MAAO,MACT,CACF,EACA,aAAaG,EAA8B,CACzC,IAAMC,EAAMC,GAAeF,EAAe,CACxC,GAAGH,EACH,OAAQ,EACV,CAAC,EACD,MAAO,CACL,UAAW,CACT,IAAMM,EAAeH,EAAc,gBAAgBC,CAAG,EACtD,GAAIE,EAAa,OAAS,EACxB,MAAM,IAAIC,EACR,IAAIC,EACF,IAAIC,EAAW,KAAKT,EAAW,IAAI,GAAIU,CAAkB,EACzD,IAAID,EAAW,kCAAkC,CACnD,CACF,EAEF,IAAME,EAAcL,EAAa,CAAC,EAClC,GAAIK,IAAgB,OAElB,GAAI,CACF,OAAOX,EAAW,QAAUA,EAAW,QAAQ,EAAI,EACrD,OAASY,EAAO,CACd,MAAM,IAAIL,EACR,IAAIC,EACF,IAAIC,EAAW,KAAKT,EAAW,IAAI,GAAIU,CAAkB,EACzD,IAAID,EAAW,mCAAmC,CACpD,EACAG,CACF,CACF,CAEF,OAAOC,EACLX,EACAS,EACA,IACE,IAAIH,EACF,IAAIC,EAAW,KAAKT,EAAW,IAAI,GAAIU,CAAkB,EACzD,IAAID,EAAW,IAAI,EACnB,IAAIA,EAAWR,EAAOa,CAAkB,CAC1C,CACJ,CACF,CACF,CACF,CACF,CACF,CAEO,SAASC,GAAyBf,EASvB,CAChB,IAAMC,EAAQ,IAAID,EAAW,OAASA,EAAW,KAAK,KAAK,IAC3D,MAAO,CACL,eAAgB,CACd,MAAO,CACL,YAAaA,EAAW,YACxB,KAAMA,EAAW,KACjB,KAAMA,EAAW,KACjB,MAAOA,EAAW,MAClB,MAAOC,CACT,CACF,EACA,aAAaE,EAA8B,CACzC,IAAMC,EAAMC,GAAeF,EAAe,CACxC,GAAGH,EACH,OAAQ,EACV,CAAC,EACD,MAAO,CACL,UAAW,CACT,IAAMM,EAAeH,EAAc,gBAAgBC,CAAG,EACtD,GAAIE,EAAa,OAAS,EACxB,MAAM,IAAIC,EACR,IAAIC,EACF,IAAIC,EAAW,KAAKT,EAAW,IAAI,GAAIU,CAAkB,EACzD,IAAID,EAAW,kCAAkC,CACnD,CACF,EAEF,IAAME,EAAcL,EAAa,CAAC,EAClC,GAAIK,IAAgB,OAClB,GAAI,CACF,OAAOX,EAAW,QAAQ,CAC5B,OAASY,EAAO,CACd,MAAM,IAAIL,EACR,IAAIC,EACF,IAAIC,EAAW,KAAKT,EAAW,IAAI,GAAIU,CAAkB,EACzD,IAAID,EAAW,mCAAmC,CACpD,EACAG,CACF,CACF,CAEF,OAAOC,EACLb,EAAW,KACXW,EACA,IACE,IAAIH,EACF,IAAIC,EAAW,KAAKT,EAAW,IAAI,GAAIU,CAAkB,EACzD,IAAID,EAAW,IAAI,EACnB,IAAIA,EAAWR,EAAOa,CAAkB,CAC1C,CACJ,CACF,CACF,CACF,CACF,CACF,CAEO,SAASE,GAAwBhB,EAQf,CACvB,IAAMC,EAAQ,IAAID,EAAW,OAASA,EAAW,KAAK,KAAK,IAC3D,MAAO,CACL,eAAgB,CAEd,MAAO,CACL,YAAaA,EAAW,YACxB,KAAMA,EAAW,KACjB,KAAMA,EAAW,KACjB,MAAOA,EAAW,MAClB,MAAOC,CACT,CACF,EACA,aAAaE,EAA8B,CACzC,IAAMC,EAAMC,GAAeF,EAAe,CACxC,GAAGH,EACH,OAAQ,EACV,CAAC,EACD,MAAO,CACL,UAAW,CACT,OAAOG,EACJ,gBAAgBC,CAAG,EACnB,IAAKa,GACJJ,EACEb,EAAW,KACXiB,EACA,IACE,IAAIT,EACF,IAAIC,EAAW,KAAKT,EAAW,IAAI,GAAIU,CAAkB,EACzD,IAAID,EAAW,IAAI,EACnB,IAAIA,EAAWR,EAAOa,CAAkB,CAC1C,CACJ,CACF,CACJ,CACF,CACF,CACF,CACF,CAEA,SAAST,GACPF,EACAH,EAMA,CACA,GAAM,CAAE,KAAAkB,EAAM,MAAAC,EAAO,QAAAC,EAAS,OAAAC,CAAO,EAAIrB,EACnCsB,EAAQJ,EAAO,CAACA,CAAI,EAAI,CAAC,EAC3BE,GAAS,OACXE,EAAM,KAAK,GAAGF,GAAS,KAAK,EAE9B,IAAMG,EAASJ,EAAQ,CAACA,CAAK,EAAI,CAAC,EAClC,OAAIC,GAAS,QACXG,EAAO,KAAK,GAAGH,GAAS,MAAM,EAEzBjB,EAAc,eAAe,CAAE,MAAAmB,EAAO,OAAAC,EAAQ,OAAAF,CAAO,CAAC,CAC/D,CCpNO,SAASG,GAA0BC,EAKpB,CACpB,IAAMC,EAAQ,IAAID,EAAW,OAASA,EAAW,KAAK,KAAK,IAC3D,MAAO,CACL,eAAgB,CACd,MAAO,CACL,YAAaA,EAAW,YACxB,KAAMA,EAAW,KACjB,MAAOC,CACT,CACF,EACA,mBAAmBC,EAAsC,CACvD,IAAMC,EAAaD,EAAkB,kBAAkB,EACvD,GAAIC,IAAe,OACjB,MAAM,IAAIC,EACR,IAAIC,EACF,IAAIC,EAAWL,EAAOM,CAAkB,EACxC,IAAID,EAAW,qCAAqC,CACtD,CACF,EAEF,OAAOE,EACLR,EAAW,KACXG,EACA,IAAM,IAAIE,EAAS,IAAIC,EAAWL,EAAOM,CAAkB,CAAC,CAC9D,CACF,CACF,CACF,CAEO,SAASE,GAA0BT,EAMpB,CACpB,IAAMC,EAAQ,IAAID,EAAW,OAASA,EAAW,KAAK,KAAK,IAC3D,MAAO,CACL,eAAgB,CACd,MAAO,CACL,YAAaA,EAAW,YACxB,KAAMA,EAAW,KACjB,MAAOC,CACT,CACF,EACA,mBAAmBC,EAAsC,CACvD,IAAMC,EAAaD,EAAkB,kBAAkB,EACvD,GAAIC,IAAe,OACjB,GAAI,CACF,OAAOH,EAAW,QAAQ,CAC5B,OAASU,EAAO,CACd,MAAM,IAAIN,EACR,IAAIC,EACF,IAAIC,EAAWL,EAAOM,CAAkB,EACxC,IAAID,EAAW,mCAAmC,CACpD,EACAI,CACF,CACF,CAEF,OAAOF,EACLR,EAAW,KACXG,EACA,IAAM,IAAIE,EAAS,IAAIC,EAAWL,EAAOM,CAAkB,CAAC,CAC9D,CACF,CACF,CACF,CAEO,SAASI,GAA2BX,EAMd,CAC3B,IAAMC,EAAQ,IAAID,EAAW,OAASA,EAAW,KAAK,KAAK,IAC3D,MAAO,CACL,eAAgB,CACd,MAAO,CACL,YAAaA,EAAW,YACxB,KAAMA,EAAW,KACjB,MAAQ,GAAGC,CAAK,OACbD,EAAW,aACR,KAAKA,EAAW,YAAY,KAC5B,GACR,CACF,EACA,mBAAmBE,EAAsC,CACvD,IAAMU,EAA4B,CAAC,EACnC,OAAa,CACX,IAAMT,EAAaD,EAAkB,kBAAkB,EACvD,GACEC,IAAe,QACfA,IAAeH,EAAW,aAE1B,MAEFY,EAAY,KACVJ,EACER,EAAW,KACXG,EACA,IAAM,IAAIE,EAAS,IAAIC,EAAWL,EAAOM,CAAkB,CAAC,CAC9D,CACF,CACF,CACA,OAAOK,CACT,CACF,CACF,CCjIA,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,GAAAC,GAAAC,GAAAC,GAAAC,EAmBaC,EAAN,KAAiB,CAStB,YAAYC,EAA6B,CATpCC,EAAA,KAAAT,GACLS,EAAA,KAAAhB,GACAgB,EAAA,KAAAf,GACAe,EAAA,KAAAd,GACAc,EAAA,KAAAb,GACAa,EAAA,KAAAZ,GACAY,EAAA,KAAAX,GACAW,EAAA,KAAAV,GAGEW,EAAA,KAAKjB,EAAQe,GACbE,EAAA,KAAKhB,EAAe,GACpBgB,EAAA,KAAKf,EAAgB,IACrBe,EAAA,KAAKd,EAAa,IAAI,KACtBc,EAAA,KAAKb,EAAc,IAAI,KACvBa,EAAA,KAAKZ,EAAe,IAAI,KACxBY,EAAA,KAAKX,EAAe,IAAI,IAC1B,CAEA,eAAeY,EAIZ,CACD,IAAMC,EAAM,CACV,GAAGD,EAAW,MAAM,IAAKE,GAAS,KAAKA,CAAI,EAAE,EAC7C,GAAGF,EAAW,OAAO,IAAKG,GAAU,IAAIA,CAAK,EAAE,CACjD,EAAE,KAAK,IAAI,EACX,QAAWD,KAAQF,EAAW,MAAO,CACnC,GAAII,EAAA,KAAKnB,GAAW,IAAIiB,CAAI,EAC1B,MAAM,IAAI,MAAM,gCAAgCA,CAAI,EAAE,EAExDE,EAAA,KAAKnB,GAAW,IAAIiB,EAAMD,CAAG,CAC/B,CACA,QAAWE,KAASH,EAAW,OAAQ,CACrC,GAAII,EAAA,KAAKlB,GAAY,IAAIiB,CAAK,EAC5B,MAAM,IAAI,MAAM,+BAA+BA,CAAK,EAAE,EAExD,QAASE,EAAI,EAAGA,EAAIF,EAAM,OAAQE,IAAK,CACrC,IAAMC,EAAaH,EAAM,MAAM,EAAGE,CAAC,EACnC,GAAID,EAAA,KAAKlB,GAAY,IAAIoB,CAAU,EACjC,MAAM,IAAI,MACR,WAAWH,CAAK,kCAAkCG,CAAU,EAC9D,CAEJ,CACA,QAAWC,KAAcH,EAAA,KAAKlB,GAAY,KAAK,EAC7C,GAAIqB,EAAW,WAAWJ,CAAK,EAC7B,MAAM,IAAI,MACR,WAAWA,CAAK,iCAAiCI,CAAU,EAC7D,EAGJH,EAAA,KAAKlB,GAAY,IAAIiB,EAAOF,CAAG,CACjC,CACA,OAAAG,EAAA,KAAKjB,GAAa,IAAIc,EAAKD,EAAW,MAAM,EAC5CI,EAAA,KAAKhB,GAAa,IAAIa,EAAK,IAAI,KAAe,EACvCA,CACT,CAEA,gBAAgBA,EAAqC,CACnD,IAAMO,EAAeJ,EAAA,KAAKhB,GAAa,IAAIa,CAAG,EAC9C,GAAIO,IAAiB,OACnB,MAAM,IAAI,MAAM,wBAAwBP,CAAG,EAAE,EAE/C,OAAOO,CACT,CAEA,mBAAwC,CACtC,OAAa,CACX,IAAMC,EAAMC,EAAA,KAAKrB,EAAAC,GAAL,WACZ,GAAImB,IAAQ,KACV,OAEF,GAAIC,EAAA,KAAKrB,EAAAE,IAAL,UAA4BkB,GAC9B,OAAOA,CAEX,CACF,CAuIF,EApNE3B,EAAA,YACAC,EAAA,YACAC,EAAA,YACAC,EAAA,YACAC,EAAA,YACAC,EAAA,YACAC,EAAA,YAPKC,EAAA,YAgFLC,EAAW,UAAkB,CAC3B,IAAMmB,EAAML,EAAA,KAAKtB,GAAMsB,EAAA,KAAKrB,EAAY,EACxC,OAAI0B,IAAQ,OACH,MAETE,GAAA,KAAK5B,GAAL,IACI,CAACqB,EAAA,KAAKpB,IACJyB,IAAQ,MACVV,EAAA,KAAKf,EAAgB,IACd0B,EAAA,KAAKrB,EAAAC,GAAL,YAGJmB,EACT,EAEAlB,GAAsB,SAACkB,EAAsB,CAC3C,GAAIL,EAAA,KAAKpB,GACP,MAAO,GAET,GAAIyB,EAAI,WAAW,IAAI,EAAG,CACxB,IAAMG,EAAkBH,EAAI,QAAQ,GAAG,EACvC,OAAIG,IAAoB,GACtBF,EAAA,KAAKrB,EAAAG,IAAL,UAAwBiB,EAAI,MAAM,CAAC,EAAG,MAEtCC,EAAA,KAAKrB,EAAAG,IAAL,UACEiB,EAAI,MAAM,EAAGG,CAAe,EAC5BH,EAAI,MAAMG,EAAkB,CAAC,GAG1B,EACT,CACA,GAAIH,EAAI,WAAW,GAAG,EAAG,CACvB,IAAII,EAAkB,EAClBC,EAAgB,EACpB,KAAOA,GAAiBL,EAAI,QAAQ,CAClC,IAAMM,EAASL,EAAA,KAAKrB,EAAAI,IAAL,UACbgB,EAAI,MAAMI,EAAiBC,CAAa,EACxCL,EAAI,MAAMK,CAAa,GAEzB,GAAIC,IAAW,GACb,MAAO,GAELA,IAAW,KACbF,EAAkBC,GAEpBA,GACF,CACA,MAAM,IAAIE,EACR,IAAIC,EACF,IAAIC,EAAW,IAAIT,EAAI,MAAMI,CAAe,CAAC,GAAIM,CAAkB,EACnE,IAAID,EAAW,6BAA6B,CAC9C,CACF,CACF,CACA,MAAO,EACT,EAEA1B,GAAkB,SAACU,EAAckB,EAA6B,CAC5D,IAAMC,EAAW,KAAKnB,CAAI,GACpBD,EAAMG,EAAA,KAAKnB,GAAW,IAAIiB,CAAI,EACpC,GAAID,IAAQ,OACV,OAAImB,IAAW,KACNV,EAAA,KAAKrB,EAAAM,GAAL,UAAwBM,EAAKmB,GAEvBhB,EAAA,KAAKjB,GAAa,IAAIc,CAAG,EAE/BS,EAAA,KAAKrB,EAAAM,GAAL,UAAwBM,EAAKS,EAAA,KAAKrB,EAAAK,IAAL,UAAyB2B,IAExDX,EAAA,KAAKrB,EAAAM,GAAL,UAAwBM,EAAK,QAEtC,MAAM,IAAIe,EACR,IAAIC,EACF,IAAIC,EAAWG,EAAUF,CAAkB,EAC3C,IAAID,EAAW,6BAA6B,CAC9C,CACF,CACF,EAEAzB,GAAsB,SAACU,EAAemB,EAA8B,CAClE,IAAMrB,EAAMG,EAAA,KAAKlB,GAAY,IAAIiB,CAAK,EACtC,OAAIF,IAAQ,OACNqB,EAAK,WAAW,GAAG,GACrBZ,EAAA,KAAKrB,EAAAM,GAAL,UAAwBM,EAAKqB,EAAK,MAAM,CAAC,GAClC,IAEMlB,EAAA,KAAKjB,GAAa,IAAIc,CAAG,GAElCqB,IAAS,GACXZ,EAAA,KAAKrB,EAAAM,GAAL,UAAwBM,EAAKS,EAAA,KAAKrB,EAAAK,IAAL,UAAyB,IAAIS,CAAK,KAE/DO,EAAA,KAAKrB,EAAAM,GAAL,UAAwBM,EAAKqB,GAExB,KAETZ,EAAA,KAAKrB,EAAAM,GAAL,UAAwBM,EAAK,QACtBqB,IAAS,IAEX,IACT,EAEA5B,GAAmB,SAAC2B,EAAkB,CACpC,IAAMZ,EAAMC,EAAA,KAAKrB,EAAAC,GAAL,WACZ,GAAImB,IAAQ,KACV,MAAM,IAAIO,EACR,IAAIC,EACF,IAAIC,EAAWG,EAAUF,CAAkB,EAC3C,IAAID,EAAW,0CAA0C,CAC3D,CACF,EAEF,GAAId,EAAA,KAAKpB,GACP,MAAM,IAAIgC,EACR,IAAIC,EACF,IAAIC,EAAWG,EAAUF,CAAkB,EAC3C,IAAID,EAAW,gCAAgC,CACjD,CACF,EAGF,GAAIT,EAAI,WAAW,GAAG,EACpB,MAAM,IAAIO,EACR,IAAIC,EACF,IAAIC,EAAWG,EAAUF,CAAkB,EAC3C,IAAID,EAAW,iCAAiCT,CAAG,GAAG,CACxD,CACF,EAEF,OAAOA,CACT,EAEAd,EAAkB,SAACM,EAAsBsB,EAAe,CACtD,KAAK,gBAAgBtB,CAAG,EAAE,KAAKsB,CAAK,CACtC,EC7NK,SAASC,GAAmBC,EAIhC,CACD,GAAM,CAAE,QAAAC,EAAS,aAAAC,EAAc,YAAAC,CAAY,EAAIH,EAEzCI,EAAQ,IAAI,MAEZC,EAAc,CAClBC,GAAe,QAAQ,EAAE,oBAAoBH,CAAW,EACxDI,EAAcN,CAAO,EAAE,oBAAoBE,CAAW,CACxD,EAAE,OACAD,EAAa,YAAY,IAAKM,GAAe,CAC3C,GAAI,eAAgBA,EAClB,OAAOC,GAAcD,EAAW,UAAU,EAAE,oBAC1CL,CACF,EAEF,GAAI,YAAaK,EACf,OAAOD,EAAcC,EAAW,OAAO,EAAE,oBACvCL,CACF,EAEF,MAAM,IAAI,MAAM,uBAAuB,KAAK,UAAUK,CAAU,CAAC,EAAE,CACrE,CAAC,CACH,EACAJ,EAAM,KAAKC,EAAY,KAAK,GAAG,CAAC,EAEhCD,EAAM,KAAK,EAAE,EACb,IAAMM,EAAW,IAAIC,EAOrB,GANAD,EAAS,WAAWE,GAAeV,EAAa,YAAY,WAAW,CAAC,EACpEA,EAAa,YAAY,OAC3BQ,EAAS,WAAWG,EAAc,GAAG,CAAC,EACtCH,EAAS,WAAWI,EAAe,IAAIZ,EAAa,YAAY,IAAI,GAAG,CAAC,GAE1EE,EAAM,KAAKM,EAAS,oBAAoBP,CAAW,CAAC,EAChDD,EAAa,YAAY,QAAS,CACpC,IAAMa,EAAgBD,EAAeZ,EAAa,YAAY,OAAO,EACrEE,EAAM,KAAKW,EAAc,oBAAoBZ,CAAW,CAAC,CAC3D,CAEA,GAAID,EAAa,YAAY,OAAS,EAAG,CACvCE,EAAM,KAAK,EAAE,EACbA,EAAM,KAAKY,GAAe,cAAc,EAAE,oBAAoBb,CAAW,CAAC,EAC1E,IAAMc,EAAW,IAAIC,EACrB,QAAWC,KAAmBjB,EAAa,YAAa,CACtD,IAAMkB,EAAc,IAAI,MACxBA,EAAY,KAAK,IAAIT,EAASE,EAAc,IAAI,CAAC,CAAC,EAClDO,EAAY,KAAK,IAAIT,EAASF,GAAcU,EAAgB,KAAK,CAAC,CAAC,EACnEC,EAAY,KAAK,GAAGC,GAAqBF,CAAe,CAAC,EACzDF,EAAS,QAAQG,CAAW,CAC9B,CACAhB,EAAM,KACJ,GAAGa,EAAS,kBAAkBd,CAAW,EAAE,IAAKmB,GAAQA,EAAI,KAAK,EAAE,CAAC,CACtE,CACF,CAEA,GAAIpB,EAAa,YAAY,OAAS,EAAG,CACvCE,EAAM,KAAK,EAAE,EACbA,EAAM,KAAKY,GAAe,cAAc,EAAE,oBAAoBb,CAAW,CAAC,EAC1E,IAAMc,EAAW,IAAIC,EACrB,QAAWK,KAAmBrB,EAAa,YAAa,CACtD,IAAMkB,EAAc,IAAI,MACxBA,EAAY,KAAK,IAAIT,EAASE,EAAc,IAAI,CAAC,CAAC,EAClDO,EAAY,KAAK,IAAIT,EAASJ,EAAcgB,EAAgB,IAAI,CAAC,CAAC,EAClEH,EAAY,KAAK,GAAGC,GAAqBE,CAAe,CAAC,EACzDN,EAAS,QAAQG,CAAW,CAC9B,CACAhB,EAAM,KACJ,GAAGa,EAAS,kBAAkBd,CAAW,EAAE,IAAKmB,GAAQA,EAAI,KAAK,EAAE,CAAC,CACtE,CACF,CAEA,GAAIpB,EAAa,QAAQ,OAAS,EAAG,CACnCE,EAAM,KAAK,EAAE,EACbA,EAAM,KAAKY,GAAe,UAAU,EAAE,oBAAoBb,CAAW,CAAC,EACtE,IAAMc,EAAW,IAAIC,EACrB,QAAWM,KAAetB,EAAa,QAAS,CAC9C,IAAMkB,EAAc,IAAI,MACxBA,EAAY,KAAK,IAAIT,EAASE,EAAc,IAAI,CAAC,CAAC,EAC9CW,EAAY,MACdJ,EAAY,KACV,IAAIT,EACFJ,EAAc,IAAIiB,EAAY,KAAK,EAAE,EACrCX,EAAc,IAAI,CACpB,CACF,EAEAO,EAAY,KAAK,IAAIT,CAAU,EAE7Ba,EAAY,MACdJ,EAAY,KACV,IAAIT,EACFJ,EAAc,KAAKiB,EAAY,IAAI,EAAE,EACrCX,EAAc,GAAG,EACjBJ,GAAce,EAAY,KAAK,CACjC,CACF,EAEAJ,EAAY,KACV,IAAIT,EACFJ,EAAc,KAAKiB,EAAY,IAAI,EAAE,EACrCV,EAAe,OAAO,CACxB,CACF,EAEFM,EAAY,KAAK,GAAGC,GAAqBG,CAAW,CAAC,EACrDP,EAAS,QAAQG,CAAW,CAC9B,CACAhB,EAAM,KACJ,GAAGa,EAAS,kBAAkBd,CAAW,EAAE,IAAKmB,GAAQA,EAAI,KAAK,EAAE,CAAC,CACtE,CACF,CAEA,OAAAlB,EAAM,KAAK,EAAE,EACNA,CACT,CAEA,SAASiB,GAAqBI,EAGV,CAClB,IAAMC,EAAiB,CAAC,EASxB,OARID,EAAM,cACRC,EAAe,KAAKb,EAAc,GAAG,CAAC,EACtCa,EAAe,KAAKC,GAAeF,EAAM,WAAW,CAAC,GAEnDA,EAAM,OACRC,EAAe,KAAKb,EAAc,GAAG,CAAC,EACtCa,EAAe,KAAKZ,EAAe,IAAIW,EAAM,IAAI,GAAG,CAAC,GAEnDC,EAAe,OAAS,EACnB,CAAC,IAAIf,EAASE,EAAc,GAAG,EAAG,GAAGa,CAAc,CAAC,EAEtD,CAAC,CACV,CAEA,SAASd,GAAegB,EAA2B,CACjD,OAAO,IAAIC,EAAWD,EAAO,CAAE,KAAM,EAAK,CAAC,CAC7C,CAEA,SAAStB,GAAesB,EAA2B,CACjD,OAAO,IAAIC,EAAWD,EAAO,CAAE,QAAS,cAAe,KAAM,EAAK,CAAC,CACrE,CAEA,SAASD,GAAeC,EAA2B,CACjD,OAAO,IAAIC,EAAWD,CAAK,CAC7B,CAEA,SAASd,EAAec,EAA2B,CACjD,OAAO,IAAIC,EAAWD,EAAO,CAAE,OAAQ,GAAM,IAAK,EAAK,CAAC,CAC1D,CAEA,SAASZ,GAAeY,EAA2B,CACjD,OAAO,IAAIC,EAAWD,EAAO,CAAE,QAAS,YAAa,KAAM,EAAK,CAAC,CACnE,CAEA,SAASrB,EAAcqB,EAA2B,CAChD,OAAO,IAAIC,EAAWD,EAAOE,CAAkB,CACjD,CAEA,SAASrB,GAAcmB,EAA2B,CAChD,OAAO,IAAIC,EAAWD,EAAOG,CAAkB,CACjD,CAEA,SAASlB,EAAce,EAA2B,CAChD,OAAO,IAAIC,EAAWD,CAAK,CAC7B,CC7KA,eAAsBI,GACpBC,EACAC,EACAC,EACAC,EACAC,EASgB,CAChB,IAAMC,EAAa,IAAIC,EAAWL,CAAO,EACnCM,EAAcH,GAAa,aAAe,GAC5CG,GACFF,EAAW,eAAe,CACxB,OAAQ,CAAC,EACT,MAAO,CAAC,MAAM,EACd,OAAQ,EACV,CAAC,EAEH,IAAMG,EAAeJ,GAAa,aAC9BI,GACFH,EAAW,eAAe,CACxB,OAAQ,CAAC,EACT,MAAO,CAAC,SAAS,EACjB,OAAQ,EACV,CAAC,EAUH,IAAMI,EAAcC,GAAkBN,GAAa,SAAS,EACtDO,EAAcP,GAAa,aAAe,QAAQ,IAClDQ,EAAcR,GAAa,aAAe,QAAQ,MAClDS,EAAST,GAAa,QAAU,QAAQ,KACxCU,EAAiBX,EAAQ,cAAcE,CAAU,EACjDU,EAAS,CAAC,EAChB,OACE,GAAI,CAEF,GADmBV,EAAW,kBAAkB,IAC7B,OACjB,KAEJ,OAASW,EAAO,CACdD,EAAO,KAAKC,CAAK,CACnB,CAEF,GAAIT,GACEF,EAAW,gBAAgB,QAAe,EAAE,OAAS,EACvD,OAAAM,EAAYM,GAAmBjB,EAASc,EAAgBL,CAAW,CAAC,EAC7DI,EAAO,CAAC,EAGnB,GAAIL,GACEH,EAAW,gBAAgB,WAAkB,EAAE,OAAS,EAC1D,OAAAM,EAAY,CAACX,EAASQ,CAAY,EAAE,KAAK,GAAG,CAAC,EACtCK,EAAO,CAAC,EAGnB,GAAI,CACF,IAAMK,EAAkBJ,EAAe,eAAe,EACtD,GAAI,CACF,aAAMI,EAAgB,mBAAmBhB,CAAO,EACzCW,EAAO,CAAC,CACjB,OAASG,EAAO,CACd,OAAIZ,GAAa,iBACfA,EAAY,iBAAiBY,CAAK,EAElCJ,EAAYH,EAAY,0BAA0BO,CAAK,CAAC,EAEnDH,EAAO,CAAC,CACjB,CACF,OAASG,EAAO,CACdD,EAAO,QAAQC,CAAK,EACpBJ,EAAYK,GAAmBjB,EAASc,EAAgBL,CAAW,CAAC,EACpE,QAAWO,KAASD,EAClBH,EAAYH,EAAY,0BAA0BO,CAAK,CAAC,EAE1D,OAAOH,EAAO,CAAC,CACjB,CACF,CAEA,SAASI,GACPjB,EACAc,EACAL,EACA,CACA,OAAOU,GAAmB,CACxB,QAAAnB,EACA,aAAcc,EAAe,cAAc,EAC3C,YAAAL,CACF,CAAC,EAAE,KAAK;AAAA,CAAI,CACd,CAEA,SAASC,GAAkBU,EAAkC,CAC3D,OAAIA,IAAc,OACTC,EAAY,iBAAiB,EAE/BD,EAAYC,EAAY,IAAI,EAAIA,EAAY,KAAK,CAC1D","names":["index_exports","__export","ReaderArgs","TypoError","TypoGrid","TypoString","TypoSupport","TypoText","command","commandChained","commandWithSubcommands","operation","optionFlag","optionRepeatable","optionSingleValue","positionalOptional","positionalRequired","positionalVariadics","runAsCliAndExit","typeBigInt","typeBoolean","typeDate","typeDecode","typeList","typeMapped","typeNumber","typeOneOf","typeString","typeTuple","typeUrl","typoStyleConstants","typoStyleFailure","typoStyleUserInput","usageToStyledLines","__toCommonJS","typoStyleConstants","typoStyleUserInput","typoStyleFailure","_value","_typoStyle","TypoString","value","typoStyle","__privateAdd","__privateSet","__privateGet","typoSupport","_typoStrings","_TypoText","typoParts","typoPart","typoString","typoText","t","length","TypoText","_typoRows","TypoGrid","cells","widths","printableGrid","typoGridRow","typoGridColumnIndex","width","printableGridRow","typoGridCell","printableGridCell","padding","_typoText","_TypoError","currentTypoText","source","TypoError","_kind","_TypoSupport","kind","fgColorCode","ttyCodeFgColors","bgColorCode","ttyCodeBgColors","boldCode","ttyCodeBold","dimCode","ttyCodeDim","italicCode","ttyCodeItalic","underlineCode","ttyCodeUnderline","strikethroughCode","ttyCodeStrikethrough","ttyCodeReset","fgColorPart","bgColorPart","boldPart","dimPart","italicPart","underlinePart","error","TypoSupport","command","information","operation","readerArgs","generateUsage","operationUsage","positional","breadcrumbPositional","operationFactory","endPositional","operationInstance","context","error","commandWithSubcommands","subcommands","subcommandName","TypoError","TypoText","TypoString","typoStyleConstants","subcommandInput","subcommandFactory","subcommandUsage","breadcrumbCommand","subcommandInstance","subcommand","metadata","commandChained","nextCommand","nextCommandFactory","nextCommandUsage","nextCommandInstance","value","operation","inputs","handler","optionsUsage","optionKey","optionInput","positionalsUsage","positionalInput","readerArgs","optionsGetters","positionalsValues","optionsValues","context","typeBoolean","value","lowerValue","typeDate","timestamp","typeUrl","typeString","typeNumber","typeBigInt","typeMapped","before","after","typeDecode","TypoText","TypoString","typoStyleUserInput","typeOneOf","type","values","valuesSet","decoded","valuesDesc","v","typeTuple","elementTypes","separator","elementType","parts","part","index","typeList","context","error","TypoError","optionFlag","definition","label","typeBoolean","readerOptions","key","registerOption","optionValues","TypoError","TypoText","TypoString","typoStyleConstants","optionValue","error","typeDecode","typoStyleUserInput","optionSingleValue","optionRepeatable","value","long","short","aliases","valued","longs","shorts","positionalRequired","definition","label","readerPositionals","positional","TypoError","TypoText","TypoString","typoStyleUserInput","typeDecode","positionalOptional","error","positionalVariadics","positionals","_args","_parsedIndex","_parsedDouble","_keyByLong","_keyByShort","_valuedByKey","_resultByKey","_ReaderArgs_instances","consumeArg_fn","processedAsPositional_fn","consumeOptionLong_fn","tryConsumeOptionShort_fn","consumeOptionValue_fn","acknowledgeOption_fn","ReaderArgs","args","__privateAdd","__privateSet","definition","key","long","short","__privateGet","i","shortSlice","shortOther","optionResult","arg","__privateMethod","__privateWrapper","valueIndexStart","shortIndexStart","shortIndexEnd","result","TypoError","TypoText","TypoString","typoStyleConstants","direct","constant","rest","value","usageToStyledLines","params","cliName","commandUsage","typoSupport","lines","breadcrumbs","textUsageTitle","textConstants","breadcrumb","textUserInput","infoText","TypoText","textUsageIntro","textDelimiter","textSubtleInfo","detailsString","textBlockTitle","typoGrid","TypoGrid","positionalUsage","typoGridRow","createInformationals","row","subcommandUsage","optionUsage","usage","informationals","textUsefulInfo","value","TypoString","typoStyleConstants","typoStyleUserInput","runAsCliAndExit","cliName","cliArgs","context","command","application","readerArgs","ReaderArgs","usageOnHelp","buildVersion","typoSupport","chooseTypoSupport","onLogStdOut","onLogStdErr","onExit","commandFactory","errors","error","computeUsageString","commandInstance","usageToStyledLines","useColors","TypoSupport"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cli-kiss",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "devDependencies": {
@@ -185,45 +185,65 @@ export function commandWithSubcommands<Context, Payload, Result>(
185
185
  }
186
186
 
187
187
  export function commandChained<Context, Payload, Result>(
188
- metadata: CommandInformation,
188
+ information: CommandInformation,
189
189
  operation: Operation<Context, Payload>,
190
190
  nextCommand: Command<Payload, Result>,
191
191
  ): Command<Context, Result> {
192
192
  return {
193
193
  getInformation() {
194
- return metadata;
194
+ return information;
195
195
  },
196
196
  createFactory(readerArgs: ReaderArgs) {
197
- const operationFactory = operation.createFactory(readerArgs);
198
- const nextCommandFactory = nextCommand.createFactory(readerArgs);
199
- return {
200
- generateUsage() {
201
- const operationUsage = operation.generateUsage();
202
- const nextCommandUsage = nextCommandFactory.generateUsage();
203
- return {
204
- information: nextCommandUsage.information,
205
- breadcrumbs: operationUsage.positionals
206
- .map((positional) => breadcrumbPositional(positional.label))
207
- .concat(nextCommandUsage.breadcrumbs),
208
- positionals: operationUsage.positionals.concat(
209
- nextCommandUsage.positionals,
210
- ),
211
- subcommands: nextCommandUsage.subcommands,
212
- options: operationUsage.options.concat(nextCommandUsage.options),
213
- };
214
- },
215
- createInstance() {
216
- const operationInstance = operationFactory.createInstance();
217
- const nextCommandInstance = nextCommandFactory.createInstance();
218
- return {
219
- async executeWithContext(context: Context) {
220
- return await nextCommandInstance.executeWithContext(
221
- await operationInstance.executeWithContext(context),
222
- );
223
- },
224
- };
225
- },
226
- };
197
+ try {
198
+ const operationFactory = operation.createFactory(readerArgs);
199
+ const nextCommandFactory = nextCommand.createFactory(readerArgs);
200
+ return {
201
+ generateUsage() {
202
+ const operationUsage = operation.generateUsage();
203
+ const nextCommandUsage = nextCommandFactory.generateUsage();
204
+ return {
205
+ breadcrumbs: operationUsage.positionals
206
+ .map((positional) => breadcrumbPositional(positional.label))
207
+ .concat(nextCommandUsage.breadcrumbs),
208
+ information: nextCommandUsage.information,
209
+ positionals: operationUsage.positionals.concat(
210
+ nextCommandUsage.positionals,
211
+ ),
212
+ subcommands: nextCommandUsage.subcommands,
213
+ options: operationUsage.options.concat(nextCommandUsage.options),
214
+ };
215
+ },
216
+ createInstance() {
217
+ const operationInstance = operationFactory.createInstance();
218
+ const nextCommandInstance = nextCommandFactory.createInstance();
219
+ return {
220
+ async executeWithContext(context: Context) {
221
+ return await nextCommandInstance.executeWithContext(
222
+ await operationInstance.executeWithContext(context),
223
+ );
224
+ },
225
+ };
226
+ },
227
+ };
228
+ } catch (error) {
229
+ return {
230
+ generateUsage() {
231
+ const operationUsage = operation.generateUsage();
232
+ return {
233
+ breadcrumbs: operationUsage.positionals
234
+ .map((positional) => breadcrumbPositional(positional.label))
235
+ .concat([breadcrumbPositional("[REST]...")]),
236
+ information: information,
237
+ positionals: operationUsage.positionals,
238
+ subcommands: [],
239
+ options: operationUsage.options,
240
+ };
241
+ },
242
+ createInstance() {
243
+ throw error;
244
+ },
245
+ };
246
+ }
227
247
  },
228
248
  };
229
249
  }
package/src/lib/Reader.ts CHANGED
@@ -203,7 +203,7 @@ export class ReaderArgs {
203
203
  throw new TypoError(
204
204
  new TypoText(
205
205
  new TypoString(constant, typoStyleConstants),
206
- new TypoString(`: requires a value, but got end of input`),
206
+ new TypoString(`: Requires a value, but got end of input`),
207
207
  ),
208
208
  );
209
209
  }
@@ -211,7 +211,7 @@ export class ReaderArgs {
211
211
  throw new TypoError(
212
212
  new TypoText(
213
213
  new TypoString(constant, typoStyleConstants),
214
- new TypoString(`: requires a value before "--"`),
214
+ new TypoString(`: Requires a value before "--"`),
215
215
  ),
216
216
  );
217
217
  }
@@ -220,7 +220,7 @@ export class ReaderArgs {
220
220
  throw new TypoError(
221
221
  new TypoText(
222
222
  new TypoString(constant, typoStyleConstants),
223
- new TypoString(`: requires a value, but got: "${arg}"`),
223
+ new TypoString(`: Requires a value, but got: "${arg}"`),
224
224
  ),
225
225
  );
226
226
  }
package/src/lib/Run.ts CHANGED
@@ -43,17 +43,22 @@ export async function runAsCliAndExit<Context>(
43
43
  longs: ["completion"],
44
44
  });
45
45
  */
46
- const commandFactory = command.createFactory(readerArgs);
47
- while (true) {
48
- const positional = readerArgs.consumePositional();
49
- if (positional === undefined) {
50
- break;
51
- }
52
- }
53
46
  const typoSupport = chooseTypoSupport(application?.useColors);
54
47
  const onLogStdOut = application?.onLogStdOut ?? console.log;
55
48
  const onLogStdErr = application?.onLogStdErr ?? console.error;
56
49
  const onExit = application?.onExit ?? process.exit;
50
+ const commandFactory = command.createFactory(readerArgs);
51
+ const errors = [];
52
+ while (true) {
53
+ try {
54
+ const positional = readerArgs.consumePositional();
55
+ if (positional === undefined) {
56
+ break;
57
+ }
58
+ } catch (error) {
59
+ errors.push(error);
60
+ }
61
+ }
57
62
  if (usageOnHelp) {
58
63
  if (readerArgs.getOptionValues("--help" as any).length > 0) {
59
64
  onLogStdOut(computeUsageString(cliName, commandFactory, typoSupport));
@@ -80,8 +85,11 @@ export async function runAsCliAndExit<Context>(
80
85
  return onExit(1);
81
86
  }
82
87
  } catch (error) {
88
+ errors.unshift(error);
83
89
  onLogStdErr(computeUsageString(cliName, commandFactory, typoSupport));
84
- onLogStdErr(typoSupport.computeStyledErrorMessage(error));
90
+ for (const error of errors) {
91
+ onLogStdErr(typoSupport.computeStyledErrorMessage(error));
92
+ }
85
93
  return onExit(1);
86
94
  }
87
95
  }
@@ -16,6 +16,7 @@ import {
16
16
  typeUrl,
17
17
  } from "../src";
18
18
 
19
+ // TODO - unit test for chained commands
19
20
  // TODO - unit test for color styling
20
21
 
21
22
  it("run", async () => {
@@ -99,6 +100,19 @@ it("run", async () => {
99
100
  await testCase(["--version", "--help"], [rootUsage], [], 0);
100
101
  await testCase(["--help", "--version"], [rootUsage], [], 0);
101
102
 
103
+ // Test multiple errors at once
104
+ await testCase(
105
+ ["--invalid1", "--invalid2", "--invalid3"],
106
+ [],
107
+ [
108
+ rootUsage,
109
+ "Error: --invalid1: Unexpected unknown option",
110
+ "Error: --invalid2: Unexpected unknown option",
111
+ "Error: --invalid3: Unexpected unknown option",
112
+ ],
113
+ 1,
114
+ );
115
+
102
116
  // Test missing required inputs
103
117
  await testCase(
104
118
  [],
@@ -187,7 +201,19 @@ it("run", async () => {
187
201
  await testCase(
188
202
  ["required1", "subcommand", "required2", "--url"],
189
203
  [],
190
- [subcommandUsage, "Error: --url: requires a value, but got end of input"],
204
+ [subcommandUsage, "Error: --url: Requires a value, but got end of input"],
205
+ 1,
206
+ );
207
+ await testCase(
208
+ ["required1", "subcommand", "required2", "--url", "--", "url"],
209
+ [],
210
+ [subcommandUsage, 'Error: --url: Requires a value before "--"'],
211
+ 1,
212
+ );
213
+ await testCase(
214
+ ["required1", "subcommand", "required2", "--url", "--url"],
215
+ [],
216
+ [subcommandUsage, 'Error: --url: Requires a value, but got: "--url"'],
191
217
  1,
192
218
  );
193
219
 
@@ -259,6 +285,8 @@ async function testCase(
259
285
  const onLogStdErr = makeMocked<string, void>([
260
286
  null as unknown as void,
261
287
  null as unknown as void,
288
+ null as unknown as void,
289
+ null as unknown as void,
262
290
  ]);
263
291
  const onExit = makeMocked<number, never>([null as never]);
264
292
  const cmd = commandWithSubcommands<null, void, void>(