cli-kiss 0.0.6 → 0.0.8
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 +3 -2
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/lib/Argument.ts +11 -10
- package/src/lib/Command.ts +3 -3
- package/src/lib/Option.ts +22 -13
- package/src/lib/Reader.ts +14 -18
- package/src/lib/Run.ts +13 -9
- package/src/lib/Type.ts +20 -2
- package/src/lib/Usage.ts +20 -13
- package/tests/unit.command.usage.ts +26 -29
package/dist/index.d.ts
CHANGED
|
@@ -32,6 +32,7 @@ declare function typeCommaTuple<const Elements extends Array<any>>(elementTypes:
|
|
|
32
32
|
[K in keyof Elements]: Type<Elements[K]>;
|
|
33
33
|
}): Type<Elements>;
|
|
34
34
|
declare function typeCommaList<Value>(elementType: Type<Value>): Type<Array<Value>>;
|
|
35
|
+
declare function typeDecode<Value>(type: Type<Value>, context: string, value: string): Value;
|
|
35
36
|
|
|
36
37
|
type Argument<Value> = {
|
|
37
38
|
generateUsage(): ArgumentUsage;
|
|
@@ -200,8 +201,8 @@ declare function runAndExit<Context>(cliName: Lowercase<string>, cliArgs: Array<
|
|
|
200
201
|
useColors?: boolean | undefined;
|
|
201
202
|
onLogStdOut?: ((message: string) => void) | undefined;
|
|
202
203
|
onLogStdErr?: ((message: string) => void) | undefined;
|
|
203
|
-
onError?: ((error: unknown) => void) | undefined;
|
|
204
204
|
onExit?: ((code: number) => never) | undefined;
|
|
205
|
+
onError?: ((error: unknown) => void) | undefined;
|
|
205
206
|
}): Promise<never>;
|
|
206
207
|
|
|
207
208
|
declare function usageToPrintableLines(params: {
|
|
@@ -210,4 +211,4 @@ declare function usageToPrintableLines(params: {
|
|
|
210
211
|
typoSupport: TypoSupport;
|
|
211
212
|
}): string[];
|
|
212
213
|
|
|
213
|
-
export { type Argument, type ArgumentUsage, type Command, type CommandInterpreter, type CommandMetadata, type CommandUsage, type CommandUsageBreadcrumb, type Execution, type ExecutionCallback, type ExecutionResolver, type ExecutionUsage, type Grid, type GridCell, type GridRow, type Option, type OptionConsumer, type OptionUsage, type ReaderPositionals, ReaderTokenizer, type Type, type TypoSupport, type TypoText, argumentOptional, argumentRequired, argumentVariadics, command, commandWithSubcommands, execution, gridToPrintableLines, optionFlag, optionRepeatable, optionSingleValue, runAndExit, typeBigInt, typeBoolean, typeCommaList, typeCommaTuple, typeDate, typeNumber, typeString, typoInferProcessSupport, typoPrintableString, usageToPrintableLines };
|
|
214
|
+
export { type Argument, type ArgumentUsage, type Command, type CommandInterpreter, type CommandMetadata, type CommandUsage, type CommandUsageBreadcrumb, type Execution, type ExecutionCallback, type ExecutionResolver, type ExecutionUsage, type Grid, type GridCell, type GridRow, type Option, type OptionConsumer, type OptionUsage, type ReaderPositionals, ReaderTokenizer, type Type, type TypoSupport, type TypoText, argumentOptional, argumentRequired, argumentVariadics, command, commandWithSubcommands, execution, gridToPrintableLines, optionFlag, optionRepeatable, optionSingleValue, runAndExit, typeBigInt, typeBoolean, typeCommaList, typeCommaTuple, typeDate, typeDecode, typeNumber, typeString, typoInferProcessSupport, typoPrintableString, usageToPrintableLines };
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
"use strict";var G=Object.defineProperty;var ne=Object.getOwnPropertyDescriptor;var oe=Object.getOwnPropertyNames;var se=Object.prototype.hasOwnProperty;var H=r=>{throw TypeError(r)};var ae=(r,e)=>{for(var t in e)G(r,t,{get:e[t],enumerable:!0})},ie=(r,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of oe(e))!se.call(r,n)&&n!==t&&G(r,n,{get:()=>e[n],enumerable:!(o=ne(e,n))||o.enumerable});return r};var ue=r=>ie(G({},"__esModule",{value:!0}),r);var D=(r,e,t)=>e.has(r)||H("Cannot "+t);var u=(r,e,t)=>(D(r,e,"read from private field"),t?t.call(r):e.get(r)),m=(r,e,t)=>e.has(r)?H("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(r):e.set(r,t),d=(r,e,t,o)=>(D(r,e,"write to private field"),o?o.call(r,t):e.set(r,t),t),g=(r,e,t)=>(D(r,e,"access private method"),t);var Y=(r,e,t,o)=>({set _(n){d(r,e,n,t)},get _(){return u(r,e,o)}});var Ve={};ae(Ve,{ReaderTokenizer:()=>P,argumentOptional:()=>pe,argumentRequired:()=>le,argumentVariadics:()=>ge,command:()=>ce,commandWithSubcommands:()=>de,execution:()=>me,gridToPrintableLines:()=>V,optionFlag:()=>be,optionRepeatable:()=>xe,optionSingleValue:()=>we,runAndExit:()=>Ue,typeBigInt:()=>Oe,typeBoolean:()=>Re,typeCommaList:()=>Te,typeCommaTuple:()=>$e,typeDate:()=>Ae,typeNumber:()=>ve,typeString:()=>Ee,typoInferProcessSupport:()=>N,typoPrintableString:()=>c,usageToPrintableLines:()=>_});module.exports=ue(Ve);function le(r){return{generateUsage(){return{description:r.description,label:`<${r.label??r.type.label}>`}},consumeValue(e){let t=e.consumePositional();if(t===void 0)throw new Error(`Missing required arg: <${r.label??r.type.label}>`);return r.type.decoder(t)}}}function pe(r){return{generateUsage(){return{description:r.description,label:`[${r.label??r.type.label}]`}},consumeValue(e){let t=e.consumePositional();return t===void 0?r.default():r.type.decoder(t)}}}function ge(r){return{generateUsage(){return{description:r.description,label:`[${r.label??r.type.label}...]`+(r.endDelimiter?` (end with ${r.endDelimiter})`:"")}},consumeValue(e){let t=[];for(;;){let o=e.consumePositional();if(o===void 0||o===r.endDelimiter)break;t.push(r.type.decoder(o))}return t}}}function ce(r,e){return{getDescription(){return r.description},buildInterpreter(t){function o(){let n=e.computeUsage();return{breadcrumbs:n.arguments.map(s=>F(s.label)),description:r.description,details:r.details,options:n.options,arguments:n.arguments,subcommands:[]}}try{let n=e.createResolver(t),s=t.consumePositional();if(s!==void 0)throw Error(`Unprocessed positional: ${s}`);let a=n();return{computeUsage:o,async execute(i){return await a(i)}}}catch(n){return{computeUsage:o,async execute(s){throw n}}}}}}function de(r,e,t){return{getDescription(){return r.description},buildInterpreter(o){try{let n=e.createResolver(o),s=o.consumePositional();if(s===void 0)throw new Error("Expected a subcommand");let a=t[s];if(a===void 0)throw new Error(`Unknown subcommand: ${s}`);let i=a.buildInterpreter(o),p=n();return{computeUsage(){let b=e.computeUsage(),h=i.computeUsage();return{breadcrumbs:b.arguments.map(K=>F(K.label)).concat([J(s)]).concat(h.breadcrumbs),description:h.description,details:h.details,options:b.options.concat(h.options),arguments:b.arguments.concat(h.arguments),subcommands:h.subcommands}},async execute(b){let h=await p(b);return await i.execute(h)}}}catch(n){return{computeUsage(){let s=e.computeUsage();return{breadcrumbs:s.arguments.map(a=>F(a.label)).concat([J("<SUBCOMMAND>")]),description:r.description,details:r.details,options:s.options,arguments:s.arguments,subcommands:Object.entries(t).map(([a,i])=>({name:a,description:i.getDescription()}))}},async execute(s){throw n}}}}}}function F(r){return{argument:r}}function J(r){return{command:r}}function me(r,e){return{computeUsage(){let t=new Array;for(let n in r.options){let s=r.options[n];t.push(s.generateUsage())}let o=new Array;for(let n of r.arguments)o.push(n.generateUsage());return{options:t,arguments:o}},createResolver(t){let o={};for(let s in r.options){let a=r.options[s];o[s]=a.prepareConsumer(t)}let n=[];for(let s of r.arguments)n.push(s.consumeValue(t));return()=>{let s={};for(let a in o)s[a]=o[a]();return async a=>await e(a,{options:s,arguments:n})}}}}function c(r,e){if(r==="none")return e.value;if(r==="tty"){let t=e.color?ye[e.color]:"",o=e.bold?fe:"";return`${t}${o}${e.value}${he}`}if(r==="html"){let t=e.color?`<span style="color: ${e.color}">`:"",o=e.color?"</span>":"",n=e.bold?"<b>":"",s=e.bold?"</b>":"";return`${t}${n}${e.value}${s}${o}`}if(r==="mock")return e.color&&e.bold?`{${e.value}}@${e.color}+`:e.color?`{${e.value}}@${e.color}`:e.bold?`{${e.value}}+`:`{${e.value}}`;throw new Error(`Unknown typo support: ${r}`)}function N(){if(!process)return"none";if(process.env){if(process.env.FORCE_COLOR==="0")return"none";if(process.env.FORCE_COLOR)return"tty";if("NO_COLOR"in process.env)return"none"}return!process.stdout||!process.stdout.isTTY?"none":"tty"}var he="\x1B[0m",fe="\x1B[1m",ye={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"};function V(r,e,t=""){let o=new Array,n=new Array;for(let s of r)for(let a=0;a<s.length;a++){let i=s[a],p=Q(i);(n[a]===void 0||p>n[a])&&(n[a]=p)}for(let s of r){let a=new Array;for(let i=0;i<s.length;i++){let p=s[i],b=p.map(h=>c(e,h));if(i<s.length-1){let h=Q(p),K=" ".repeat(n[i]-h);a.push(b.join("")+K)}else a.push(b.join(""))}o.push(a.join(t))}return o}function Q(r){let e=0;for(let t of r)e+=t.value.length;return e}function be(r){return{generateUsage(){return{description:r.description,long:r.long,short:r.short,label:void 0}},prepareConsumer(e){let t=r.long,o=[r.long];r.aliases?.longs&&o.push(...r.aliases?.longs);let n=r.short?[r.short]:[];return r.aliases?.shorts&&n.push(...r.aliases?.shorts),e.registerFlag({key:t,longs:o,shorts:n}),()=>{let s=e.consumeFlag(t);return s===void 0?r.default?r.default():!1:s}}}}function xe(r){return{generateUsage(){return{description:r.description,long:r.long,short:r.short,label:`<${r.label??r.type.label}>`}},prepareConsumer(e){let t=r.long,o=r.long?[r.long]:[];r.aliases?.longs&&o.push(...r.aliases?.longs);let n=r.short?[r.short]:[];return r.aliases?.shorts&&n.push(...r.aliases?.shorts),e.registerOption({key:t,longs:o,shorts:n}),()=>e.consumeOption(t).map(r.type.decoder)}}}function we(r){return{generateUsage(){return{description:r.description,long:r.long,short:r.short,label:`<${r.label??r.type.label}>`}},prepareConsumer(e){let t=r.long,o=[r.long];r.aliases?.longs&&o.push(...r.aliases?.longs);let n=r.short?[r.short]:[];return r.aliases?.shorts&&n.push(...r.aliases?.shorts),e.registerOption({key:t,longs:o,shorts:n}),()=>{let s=e.consumeOption(r.long);if(s.length>1)throw new Error(`Multiple values provided for option: ${r.long}`);let a=s[0];return a===void 0?r.default():r.type.decoder(a)}}}}var S,O,x,w,C,U,f,R,A,E,y,l,B,z,Z,W,ee,I,v,j,k,P=class{constructor(e){m(this,l);m(this,S);m(this,O);m(this,x);m(this,w);m(this,C);m(this,U);m(this,f);m(this,R);m(this,A);m(this,E);m(this,y);d(this,S,e),d(this,O,0),d(this,x,!1),d(this,w,new Map),d(this,C,new Map),d(this,U,new Map),d(this,f,new Map),d(this,R,new Map),d(this,A,new Map),d(this,E,new Map),d(this,y,new Map)}registerFlag(e){g(this,l,j).call(this,e.key),u(this,U).set(e.key,{});for(let t of e.shorts)g(this,l,k).call(this,t),u(this,w).set(t,e.key);for(let t of e.longs)g(this,l,k).call(this,t),u(this,C).set(t,e.key)}registerOption(e){g(this,l,j).call(this,e.key),u(this,E).set(e.key,{});for(let t of e.shorts)g(this,l,k).call(this,t),u(this,R).set(t,e.key);for(let t of e.longs)g(this,l,k).call(this,t),u(this,A).set(t,e.key)}consumeFlag(e){if(u(this,U).get(e)===void 0)throw new Error(`Option flag not registered: ${e}`);let o=u(this,f).get(e);if(o===void 0){u(this,f).set(e,null);return}if(o===null)throw new Error(`Option flag already consumed: ${e}`);return u(this,f).set(e,null),o}consumeOption(e){if(u(this,E).get(e)===void 0)throw new Error(`Option values not registered: ${e}`);let o=u(this,y).get(e);if(o===void 0)return u(this,y).set(e,null),new Array;if(o===null)throw new Error(`Option values already consumed: ${e}`);return u(this,y).set(e,null),o}consumePositional(){for(;;){let e=g(this,l,B).call(this);if(e===null)return;let t=g(this,l,Z).call(this,e);if(t!==null)return t}}};S=new WeakMap,O=new WeakMap,x=new WeakMap,w=new WeakMap,C=new WeakMap,U=new WeakMap,f=new WeakMap,R=new WeakMap,A=new WeakMap,E=new WeakMap,y=new WeakMap,l=new WeakSet,B=function(){let e=u(this,S)[u(this,O)];return e===void 0?null:(Y(this,O)._++,!u(this,x)&&e==="--"?(d(this,x,!0),g(this,l,B).call(this)):e)},z=function(e){let t=g(this,l,B).call(this);if(t===null)throw new Error(`Option ${e} requires a value`);if(u(this,x))throw new Error(`Option ${e} requires a value before --`);if(t.startsWith("-"))throw new Error(`Option ${e} requires a value, got: ${t}`);return t},Z=function(e){if(u(this,x))return e;if(e.startsWith("--")){let t=e.indexOf("=");return t===-1?g(this,l,W).call(this,e.slice(2),null):g(this,l,W).call(this,e.slice(2,t),e.slice(t+1)),null}if(e.startsWith("-")){let t=1,o=2;for(;o<=e.length;){let n=e.slice(t,o),s=e.slice(o),a=g(this,l,ee).call(this,n,s);if(a===!0)return null;a===!1&&(t=o),o++}throw new Error(`Unknown short flags or options: ${e.slice(t)}`)}return e},W=function(e,t){let o=u(this,C).get(e);if(o!==void 0){if(t!==null){let s=X(t);if(s!==void 0)return g(this,l,I).call(this,o,s);throw new Error(`Invalid parameter for long flag: ${o}, value: ${t}`)}return g(this,l,I).call(this,o,!0)}let n=u(this,A).get(e);if(n!==void 0)return t!==null?g(this,l,v).call(this,n,t):g(this,l,v).call(this,n,g(this,l,z).call(this,e));throw new Error(`Unknown long flag or option: ${e}`)},ee=function(e,t){let o=u(this,w).get(e);if(o!==void 0){if(t.startsWith("=")){let s=X(t.slice(1));if(s!==void 0)return g(this,l,I).call(this,o,s),!0;throw new Error(`Invalid parameter for short flag: ${e}, value: ${t}`)}return g(this,l,I).call(this,o,!0),t===""}let n=u(this,R).get(e);return n!==void 0?t===""?(g(this,l,v).call(this,n,g(this,l,z).call(this,e)),!0):(t.startsWith("=")?g(this,l,v).call(this,n,t.slice(1)):g(this,l,v).call(this,n,t),!0):null},I=function(e,t){if(u(this,f).has(e))throw new Error(`Flag already set: ${e}`);u(this,f).set(e,t)},v=function(e,t){let o=u(this,y).get(e)??new Array;o.push(t),u(this,y).set(e,o)},j=function(e){if(u(this,U).has(e))throw new Error(`Option already registered: ${e}`);if(u(this,E).has(e))throw new Error(`Option already registered: ${e}`)},k=function(e){if(u(this,w).has(e))throw new Error(`Option already registered: ${e}`);if(u(this,C).has(e))throw new Error(`Option already registered: ${e}`);if(u(this,R).has(e))throw new Error(`Option already registered: ${e}`);if(u(this,A).has(e))throw new Error(`Option already registered: ${e}`)};function X(r){let e=r.toLowerCase();if(e==="true"||e==="t"||e==="y"||e==="yes")return!0;if(e==="false"||e==="f"||e==="n"||e==="no")return!1}function _(r){let{cliName:e,commandUsage:t,typoSupport:o}=r,n=new Array;n.push(c(o,M(t.description))),t.details&&n.push(c(o,Ce(t.details))),n.push(""),n.push(c(o,L("Usage:")));let s=[" ",c(o,$(e))].concat(t.breadcrumbs.map(a=>{if("argument"in a)return c(o,q(a.argument));if("command"in a)return c(o,$(a.command));throw new Error(`Unknown breadcrumb: ${JSON.stringify(a)}`)}));if(n.push(s.join(" ")),t.arguments.length>0){n.push(""),n.push(c(o,L("Arguments:")));let a=new Array;for(let i of t.arguments){let p=new Array;p.push([T()]),p.push([q(i.label)]),i.description&&(p.push([T()]),p.push([M(i.description)])),a.push(p)}n.push(...V(a,o))}if(t.subcommands.length>0){n.push(""),n.push(c(o,L("Subcommands:")));let a=new Array;for(let i of t.subcommands){let p=new Array;p.push([T()]),p.push([$(i.name)]),i.description&&(p.push([T()]),p.push([M(i.description)])),a.push(p)}n.push(...V(a,o))}if(t.options.length>0){n.push(""),n.push(c(o,L("Options:")));let a=new Array;for(let i of t.options){let p=new Array;p.push([T()]),i.short?p.push([$(`-${i.short}`),{value:", "}]):p.push([]),i.label?p.push([$(`--${i.long} `),q(i.label)]):p.push([$(`--${i.long}`)]),i.description&&(p.push([T()]),p.push([M(i.description)])),a.push(p)}n.push(...V(a,o))}return n.push(""),n}function L(r){return{value:r,color:"brightGreen",bold:!0}}function M(r){return{value:r,bold:!0}}function Ce(r){return{value:r,color:"brightBlack"}}function $(r){return{value:r,color:"brightCyan",bold:!0}}function q(r){return{value:r,color:"brightBlue"}}function T(){return{value:" "}}async function Ue(r,e,t,o,n){let s=new P(e);n?.buildVersion&&s.registerFlag({key:"version",shorts:[],longs:["version"]}),(n?.usageOnHelp??!0)&&s.registerFlag({key:"help",shorts:[],longs:["help"]});let a=o.buildInterpreter(s);if(n?.buildVersion&&s.consumeFlag("version"))return(n?.onLogStdOut??console.log)([r,n.buildVersion].join(" ")),(n?.onExit??process.exit)(0);if((n?.usageOnHelp??!0)&&s.consumeFlag("help"))return(n?.onLogStdOut??console.log)(re(r,a,n?.useColors)),(n?.onExit??process.exit)(0);try{return await a.execute(t),(n?.onExit??process.exit)(0)}catch(i){return(n?.usageOnError??!0)&&(n?.onLogStdErr??console.error)(re(r,a,n?.useColors)),n?.onError?n.onError(i):((n?.onLogStdErr??console.error)(c(te(n?.useColors),{value:"Error:",color:"brightRed",bold:!0})),(n?.onLogStdErr??console.error)(i instanceof Error?i.message:i)),(n?.onExit??process.exit)(1)}}function re(r,e,t){return _({cliName:r,commandUsage:e.computeUsage(),typoSupport:te(t)}).join(`
|
|
2
|
-
`)}function
|
|
1
|
+
"use strict";var K=Object.defineProperty;var oe=Object.getOwnPropertyDescriptor;var se=Object.getOwnPropertyNames;var ae=Object.prototype.hasOwnProperty;var Y=r=>{throw TypeError(r)};var ue=(r,e)=>{for(var t in e)K(r,t,{get:e[t],enumerable:!0})},ie=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of se(e))!ae.call(r,o)&&o!==t&&K(r,o,{get:()=>e[o],enumerable:!(n=oe(e,o))||n.enumerable});return r};var le=r=>ie(K({},"__esModule",{value:!0}),r);var D=(r,e,t)=>e.has(r)||Y("Cannot "+t);var i=(r,e,t)=>(D(r,e,"read from private field"),t?t.call(r):e.get(r)),m=(r,e,t)=>e.has(r)?Y("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(r):e.set(r,t),d=(r,e,t,n)=>(D(r,e,"write to private field"),n?n.call(r,t):e.set(r,t),t),g=(r,e,t)=>(D(r,e,"access private method"),t);var J=(r,e,t,n)=>({set _(o){d(r,e,o,t)},get _(){return i(r,e,n)}});var Te={};ue(Te,{ReaderTokenizer:()=>P,argumentOptional:()=>be,argumentRequired:()=>ye,argumentVariadics:()=>xe,command:()=>we,commandWithSubcommands:()=>Ce,execution:()=>Ue,gridToPrintableLines:()=>I,optionFlag:()=>Ee,optionRepeatable:()=>ve,optionSingleValue:()=>Oe,runAndExit:()=>Ve,typeBigInt:()=>me,typeBoolean:()=>pe,typeCommaList:()=>fe,typeCommaTuple:()=>he,typeDate:()=>ge,typeDecode:()=>f,typeNumber:()=>de,typeString:()=>ce,typoInferProcessSupport:()=>F,typoPrintableString:()=>c,usageToPrintableLines:()=>H});module.exports=le(Te);var pe={label:"BOOLEAN",decoder(r){if(r==="true")return!0;if(r==="false")return!1;throw new Error(`Invalid boolean value: ${r}`)}},ge={label:"DATE",decoder(r){let e=Date.parse(r);if(isNaN(e))throw new Error(`Invalid date value: ${r}`);return new Date(e)}},ce={label:"STRING",decoder(r){return r}},de={label:"NUMBER",decoder(r){return Number(r)}},me={label:"BIGINT",decoder(r){return BigInt(r)}};function he(r){return{label:r.map(e=>e.label).join(","),decoder(e){let t=e.split(",",r.length);if(t.length!==r.length)throw new Error(`Invalid tuple value: ${e}, expected ${r.length} parts`);return t.map((n,o)=>f(r[o],`[${o}]`,n))}}}function fe(r){return{label:`${r.label}[,${r.label}...]`,decoder(e){return e.split(",").map((t,n)=>f(r,`[${n}]`,t))}}}function f(r,e,t){try{return r.decoder(t)}catch(n){throw new Error(`Invalid value for ${e}: ${r.label}: ${t}, error: ${n instanceof Error?n.message:String(n)}`)}}function ye(r){let e=r.label??r.type.label;return{generateUsage(){return{description:r.description,label:`<${e}>`}},consumeValue(t){let n=t.consumePositional();if(n===void 0)throw new Error(`Missing required arg: ${e}`);return f(r.type,e,n)}}}function be(r){let e=r.label??r.type.label;return{generateUsage(){return{description:r.description,label:`[${e}]`}},consumeValue(t){let n=t.consumePositional();return n===void 0?r.default():f(r.type,e,n)}}}function xe(r){let e=r.label??r.type.label;return{generateUsage(){return{description:r.description,label:`[${e}...]`+(r.endDelimiter?` (end with ${r.endDelimiter})`:"")}},consumeValue(t){let n=[];for(;;){let o=t.consumePositional();if(o===void 0||o===r.endDelimiter)break;n.push(f(r.type,e,o))}return n}}}function we(r,e){return{getDescription(){return r.description},buildInterpreter(t){function n(){let o=e.computeUsage();return{breadcrumbs:o.arguments.map(s=>G(s.label)),description:r.description,details:r.details,options:o.options,arguments:o.arguments,subcommands:[]}}try{let o=e.createResolver(t),s=t.consumePositional();if(s!==void 0)throw Error(`Unexpected argument: ${s}`);let a=o();return{computeUsage:n,async execute(u){return await a(u)}}}catch(o){return{computeUsage:n,async execute(s){throw o}}}}}}function Ce(r,e,t){return{getDescription(){return r.description},buildInterpreter(n){try{let o=e.createResolver(n),s=n.consumePositional();if(s===void 0)throw new Error("Missing required SUBCOMMAND argument");let a=t[s];if(a===void 0)throw new Error(`Unknown subcommand name: ${s}`);let u=a.buildInterpreter(n),p=o();return{computeUsage(){let x=e.computeUsage(),h=u.computeUsage();return{breadcrumbs:x.arguments.map(L=>G(L.label)).concat([Q(s)]).concat(h.breadcrumbs),description:h.description,details:h.details,options:x.options.concat(h.options),arguments:x.arguments.concat(h.arguments),subcommands:h.subcommands}},async execute(x){let h=await p(x);return await u.execute(h)}}}catch(o){return{computeUsage(){let s=e.computeUsage();return{breadcrumbs:s.arguments.map(a=>G(a.label)).concat([Q("<SUBCOMMAND>")]),description:r.description,details:r.details,options:s.options,arguments:s.arguments,subcommands:Object.entries(t).map(([a,u])=>({name:a,description:u.getDescription()}))}},async execute(s){throw o}}}}}}function G(r){return{argument:r}}function Q(r){return{command:r}}function Ue(r,e){return{computeUsage(){let t=new Array;for(let o in r.options){let s=r.options[o];t.push(s.generateUsage())}let n=new Array;for(let o of r.arguments)n.push(o.generateUsage());return{options:t,arguments:n}},createResolver(t){let n={};for(let s in r.options){let a=r.options[s];n[s]=a.prepareConsumer(t)}let o=[];for(let s of r.arguments)o.push(s.consumeValue(t));return()=>{let s={};for(let a in n)s[a]=n[a]();return async a=>await e(a,{options:s,arguments:o})}}}}function c(r,e){if(r==="none")return e.value;if(r==="tty"){let t=e.color?Re[e.color]:"",n=e.bold?Ae:"";return`${t}${n}${e.value}${$e}`}if(r==="html"){let t=e.color?`<span style="color: ${e.color}">`:"",n=e.color?"</span>":"",o=e.bold?"<b>":"",s=e.bold?"</b>":"";return`${t}${o}${e.value}${s}${n}`}if(r==="mock")return e.color&&e.bold?`{${e.value}}@${e.color}+`:e.color?`{${e.value}}@${e.color}`:e.bold?`{${e.value}}+`:`{${e.value}}`;throw new Error(`Unknown typo support: ${r}`)}function F(){if(!process)return"none";if(process.env){if(process.env.FORCE_COLOR==="0")return"none";if(process.env.FORCE_COLOR)return"tty";if("NO_COLOR"in process.env)return"none"}return!process.stdout||!process.stdout.isTTY?"none":"tty"}var $e="\x1B[0m",Ae="\x1B[1m",Re={darkBlack:"\x1B[30m",darkRed:"\x1B[31m",darkGreen:"\x1B[32m",darkYellow:"\x1B[33m",darkBlue:"\x1B[34m",darkMagenta:"\x1B[35m",darkCyan:"\x1B[36m",darkWhite:"\x1B[37m",brightBlack:"\x1B[90m",brightRed:"\x1B[91m",brightGreen:"\x1B[92m",brightYellow:"\x1B[93m",brightBlue:"\x1B[94m",brightMagenta:"\x1B[95m",brightCyan:"\x1B[96m",brightWhite:"\x1B[97m"};function I(r,e,t=""){let n=new Array,o=new Array;for(let s of r)for(let a=0;a<s.length;a++){let u=s[a],p=X(u);(o[a]===void 0||p>o[a])&&(o[a]=p)}for(let s of r){let a=new Array;for(let u=0;u<s.length;u++){let p=s[u],x=p.map(h=>c(e,h));if(u<s.length-1){let h=X(p),L=" ".repeat(o[u]-h);a.push(x.join("")+L)}else a.push(x.join(""))}n.push(a.join(t))}return n}function X(r){let e=0;for(let t of r)e+=t.value.length;return e}function Ee(r){return{generateUsage(){return{description:r.description,long:r.long,short:r.short,label:void 0}},prepareConsumer(e){let t=r.short?`-${r.short}, --${r.long}`:`--${r.long}`,n=[r.long];r.aliases?.longs&&n.push(...r.aliases?.longs);let o=r.short?[r.short]:[];return r.aliases?.shorts&&o.push(...r.aliases?.shorts),e.registerFlag({key:t,longs:n,shorts:o}),()=>{let s=e.consumeFlag(t);return s===void 0?r.default?r.default():!1:s}}}}function ve(r){let e=r.label??r.type.label;return{generateUsage(){return{description:r.description,long:r.long,short:r.short,label:`<${e}>`}},prepareConsumer(t){let n=r.short?`-${r.short}, --${r.long}`:`--${r.long}`,o=r.long?[r.long]:[];r.aliases?.longs&&o.push(...r.aliases?.longs);let s=r.short?[r.short]:[];return r.aliases?.shorts&&s.push(...r.aliases?.shorts),t.registerOption({key:n,longs:o,shorts:s}),()=>t.consumeOption(n).map(a=>f(r.type,`${n}: ${e}`,a))}}}function Oe(r){let e=r.label??r.type.label;return{generateUsage(){return{description:r.description,long:r.long,short:r.short,label:`<${e}>`}},prepareConsumer(t){let n=r.short?`-${r.short}, --${r.long}`:`--${r.long}`,o=[r.long];r.aliases?.longs&&o.push(...r.aliases?.longs);let s=r.short?[r.short]:[];return r.aliases?.shorts&&s.push(...r.aliases?.shorts),t.registerOption({key:n,longs:o,shorts:s}),()=>{let a=t.consumeOption(n);if(a.length>1)throw new Error(`Multiple values provided for option: ${n}, expected only one`);let u=a[0];return u===void 0?r.default():f(r.type,`${n}: ${e}`,u)}}}}var M,O,w,C,U,$,y,A,R,E,b,l,B,N,ee,j,re,k,v,z,S,P=class{constructor(e){m(this,l);m(this,M);m(this,O);m(this,w);m(this,C);m(this,U);m(this,$);m(this,y);m(this,A);m(this,R);m(this,E);m(this,b);d(this,M,e),d(this,O,0),d(this,w,!1),d(this,C,new Map),d(this,U,new Map),d(this,$,new Map),d(this,y,new Map),d(this,A,new Map),d(this,R,new Map),d(this,E,new Map),d(this,b,new Map)}registerFlag(e){g(this,l,z).call(this,e.key),i(this,$).set(e.key,{});for(let t of e.shorts)g(this,l,S).call(this,t),i(this,C).set(t,e.key);for(let t of e.longs)g(this,l,S).call(this,t),i(this,U).set(t,e.key)}registerOption(e){g(this,l,z).call(this,e.key),i(this,E).set(e.key,{});for(let t of e.shorts)g(this,l,S).call(this,t),i(this,A).set(t,e.key);for(let t of e.longs)g(this,l,S).call(this,t),i(this,R).set(t,e.key)}consumeFlag(e){if(i(this,$).get(e)===void 0)throw new Error(`Flag not registered: ${e}`);let n=i(this,y).get(e);if(n===void 0){i(this,y).set(e,null);return}if(n===null)throw new Error(`Flag already consumed: ${e}`);return i(this,y).set(e,null),n}consumeOption(e){if(i(this,E).get(e)===void 0)throw new Error(`Option not registered: ${e}`);let n=i(this,b).get(e);if(n===void 0)return i(this,b).set(e,null),new Array;if(n===null)throw new Error(`Option already consumed: ${e}`);return i(this,b).set(e,null),n}consumePositional(){for(;;){let e=g(this,l,B).call(this);if(e===null)return;let t=g(this,l,ee).call(this,e);if(t!==null)return t}}};M=new WeakMap,O=new WeakMap,w=new WeakMap,C=new WeakMap,U=new WeakMap,$=new WeakMap,y=new WeakMap,A=new WeakMap,R=new WeakMap,E=new WeakMap,b=new WeakMap,l=new WeakSet,B=function(){let e=i(this,M)[i(this,O)];return e===void 0?null:(J(this,O)._++,!i(this,w)&&e==="--"?(d(this,w,!0),g(this,l,B).call(this)):e)},N=function(e){let t=g(this,l,B).call(this);if(t===null)throw new Error(`Option ${e} requires a value but none was provided`);if(i(this,w))throw new Error(`Option ${e} requires a value before --`);if(t.startsWith("-"))throw new Error(`Option ${e} requires a value, got: ${t}`);return t},ee=function(e){if(i(this,w))return e;if(e.startsWith("--")){let t=e.indexOf("=");return t===-1?g(this,l,j).call(this,e.slice(2),null):g(this,l,j).call(this,e.slice(2,t),e.slice(t+1)),null}if(e.startsWith("-")){let t=1,n=2;for(;n<=e.length;){let o=e.slice(t,n),s=e.slice(n),a=g(this,l,re).call(this,o,s);if(a===!0)return null;a===!1&&(t=n),n++}throw new Error(`Unknown flags or option: -${e.slice(t)}`)}return e},j=function(e,t){let n=i(this,U).get(e);if(n!==void 0){if(t!==null){let s=Z(t);if(s!==void 0)return g(this,l,k).call(this,n,s);throw new Error(`Invalid value for flag: --${e}: ${t}`)}return g(this,l,k).call(this,n,!0)}let o=i(this,R).get(e);if(o!==void 0)return t!==null?g(this,l,v).call(this,o,t):g(this,l,v).call(this,o,g(this,l,N).call(this,e));throw new Error(`Unknown long flag or option: --${e}`)},re=function(e,t){let n=i(this,C).get(e);if(n!==void 0){if(t.startsWith("=")){let s=Z(t.slice(1));if(s!==void 0)return g(this,l,k).call(this,n,s),!0;throw new Error(`Invalid value for flag: -${e}: ${t}`)}return g(this,l,k).call(this,n,!0),t===""}let o=i(this,A).get(e);return o!==void 0?t===""?(g(this,l,v).call(this,o,g(this,l,N).call(this,e)),!0):(t.startsWith("=")?g(this,l,v).call(this,o,t.slice(1)):g(this,l,v).call(this,o,t),!0):null},k=function(e,t){if(i(this,y).has(e))throw new Error(`Flag already set: ${e}`);i(this,y).set(e,t)},v=function(e,t){let n=i(this,b).get(e)??new Array;n.push(t),i(this,b).set(e,n)},z=function(e){if(i(this,$).has(e))throw new Error(`Flag already registered: ${e}`);if(i(this,E).has(e))throw new Error(`Option already registered: ${e}`)},S=function(e){if(i(this,C).has(e))throw new Error(`Flag already registered: -${e}`);if(i(this,U).has(e))throw new Error(`Flag already registered: --${e}`);if(i(this,A).has(e))throw new Error(`Option already registered: -${e}`);if(i(this,R).has(e))throw new Error(`Option already registered: --${e}`)};function Z(r){let e=r.toLowerCase();if(e==="true"||e==="t"||e==="y"||e==="yes")return!0;if(e==="false"||e==="f"||e==="n"||e==="no")return!1}function H(r){let{cliName:e,commandUsage:t,typoSupport:n}=r,o=new Array;o.push(c(n,{value:t.description,bold:!0})),t.details&&o.push(c(n,{value:t.details,color:"brightBlack"})),o.push("");let s=[c(n,{value:"Usage:",color:"brightMagenta",bold:!0}),c(n,V(e))].concat(t.breadcrumbs.map(a=>{if("argument"in a)return c(n,_(a.argument));if("command"in a)return c(n,V(a.command));throw new Error(`Unknown breadcrumb: ${JSON.stringify(a)}`)}));if(o.push(s.join(" ")),t.arguments.length>0){o.push(""),o.push(c(n,W("Arguments:")));let a=new Array;for(let u of t.arguments){let p=new Array;p.push([T()]),p.push([_(u.label)]),u.description&&(p.push([T()]),p.push([q(u.description)])),a.push(p)}o.push(...I(a,n))}if(t.subcommands.length>0){o.push(""),o.push(c(n,W("Subcommands:")));let a=new Array;for(let u of t.subcommands){let p=new Array;p.push([T()]),p.push([V(u.name)]),u.description&&(p.push([T()]),p.push([q(u.description)])),a.push(p)}o.push(...I(a,n))}if(t.options.length>0){o.push(""),o.push(c(n,W("Options:")));let a=new Array;for(let u of t.options){let p=new Array;p.push([T()]),u.short?p.push([V(`-${u.short}`),{value:", "}]):p.push([]),u.label?p.push([V(`--${u.long} `),_(u.label)]):p.push([V(`--${u.long}`)]),u.description&&(p.push([T()]),p.push([q(u.description)])),a.push(p)}o.push(...I(a,n))}return o.push(""),o}function W(r){return{value:r,color:"brightGreen",bold:!0}}function q(r){return{value:r}}function V(r){return{value:r,color:"brightCyan",bold:!0}}function _(r){return{value:r,color:"brightBlue"}}function T(){return{value:" "}}async function Ve(r,e,t,n,o){let s=new P(e);o?.buildVersion&&s.registerFlag({key:"version",shorts:[],longs:["version"]}),(o?.usageOnHelp??!0)&&s.registerFlag({key:"help",shorts:[],longs:["help"]});let a=n.buildInterpreter(s);if(o?.buildVersion&&s.consumeFlag("version"))return(o?.onLogStdOut??console.log)([r,o.buildVersion].join(" ")),(o?.onExit??process.exit)(0);if((o?.usageOnHelp??!0)&&s.consumeFlag("help"))return(o?.onLogStdOut??console.log)(te(r,a,o?.useColors)),(o?.onExit??process.exit)(0);try{return await a.execute(t),(o?.onExit??process.exit)(0)}catch(u){if((o?.usageOnError??!0)&&(o?.onLogStdErr??console.error)(te(r,a,o?.useColors)),o?.onError)o.onError(u);else{let p=ne(o?.useColors);(o?.onLogStdErr??console.error)([c(p,{value:"Error:",color:"brightRed",bold:!0}),c(p,{value:u instanceof Error?u.message:String(u),bold:!0})].join(" "))}return(o?.onExit??process.exit)(1)}}function te(r,e,t){return H({cliName:r,commandUsage:e.computeUsage(),typoSupport:ne(t)}).join(`
|
|
2
|
+
`)}function ne(r){return r===void 0?F():r?"tty":"none"}0&&(module.exports={ReaderTokenizer,argumentOptional,argumentRequired,argumentVariadics,command,commandWithSubcommands,execution,gridToPrintableLines,optionFlag,optionRepeatable,optionSingleValue,runAndExit,typeBigInt,typeBoolean,typeCommaList,typeCommaTuple,typeDate,typeDecode,typeNumber,typeString,typoInferProcessSupport,typoPrintableString,usageToPrintableLines});
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/lib/Argument.ts","../src/lib/Command.ts","../src/lib/Execution.ts","../src/lib/Typo.ts","../src/lib/Grid.ts","../src/lib/Option.ts","../src/lib/Reader.ts","../src/lib/Usage.ts","../src/lib/Run.ts","../src/lib/Type.ts"],"sourcesContent":["export * from \"./lib/Argument\";\nexport * from \"./lib/Command\";\nexport * from \"./lib/Execution\";\nexport * from \"./lib/Grid\";\nexport * from \"./lib/Option\";\nexport * from \"./lib/Reader\";\nexport * from \"./lib/Run\";\nexport * from \"./lib/Type\";\nexport * from \"./lib/Typo\";\nexport * from \"./lib/Usage\";\n","import { ReaderPositionals } from \"./Reader\";\nimport { Type } from \"./Type\";\n\nexport type Argument<Value> = {\n generateUsage(): ArgumentUsage;\n consumeValue(readerPositionals: ReaderPositionals): Value;\n};\n\nexport type ArgumentUsage = {\n description: string | undefined;\n label: string;\n};\n\nexport function argumentRequired<Value>(definition: {\n description?: string;\n type: Type<Value>;\n label?: Uppercase<string>;\n}): Argument<Value> {\n return {\n generateUsage() {\n return {\n description: definition.description,\n label: `<${definition.label ?? definition.type.label}>`,\n };\n },\n consumeValue(readerPositionals: ReaderPositionals) {\n const positional = readerPositionals.consumePositional();\n if (positional === undefined) {\n throw new Error(\n `Missing required arg: <${definition.label ?? definition.type.label}>`,\n );\n }\n return definition.type.decoder(positional);\n },\n };\n}\n\nexport function argumentOptional<Value>(definition: {\n description?: string;\n type: Type<Value>;\n label?: Uppercase<string>;\n default: () => Value;\n}): Argument<Value> {\n return {\n generateUsage() {\n return {\n description: definition.description,\n label: `[${definition.label ?? definition.type.label}]`,\n };\n },\n consumeValue(readerPositionals: ReaderPositionals) {\n const positional = readerPositionals.consumePositional();\n if (positional === undefined) {\n return definition.default();\n }\n return definition.type.decoder(positional);\n },\n };\n}\n\nexport function argumentVariadics<Value>(definition: {\n description?: string;\n type: Type<Value>;\n label?: Uppercase<string>;\n endDelimiter?: string;\n}): Argument<Array<Value>> {\n return {\n generateUsage() {\n return {\n description: definition.description,\n label:\n `[${definition.label ?? definition.type.label}...]` +\n (definition.endDelimiter\n ? ` (end with ${definition.endDelimiter})`\n : \"\"),\n };\n },\n consumeValue(readerPositionals: ReaderPositionals) {\n const values: Array<Value> = [];\n while (true) {\n const positional = readerPositionals.consumePositional();\n if (\n positional === undefined ||\n positional === definition.endDelimiter\n ) {\n break;\n }\n values.push(definition.type.decoder(positional));\n }\n return values;\n },\n };\n}\n","import { ArgumentUsage } from \"./Argument\";\nimport { Execution } from \"./Execution\";\nimport { OptionUsage } from \"./Option\";\nimport { ReaderTokenizer } from \"./Reader\";\n\nexport type Command<Context, Result> = {\n getDescription(): string | undefined;\n buildInterpreter(\n readerTokenizer: ReaderTokenizer,\n ): CommandInterpreter<Context, Result>;\n};\n\nexport type CommandMetadata = {\n description: string;\n details?: string;\n // TODO - printable examples ?\n};\n\nexport type CommandInterpreter<Context, Result> = {\n computeUsage(): CommandUsage;\n execute(context: Context): Promise<Result>;\n};\n\nexport type CommandUsage = {\n breadcrumbs: Array<CommandUsageBreadcrumb>;\n description: string;\n details: string | undefined;\n options: Array<OptionUsage>;\n arguments: Array<ArgumentUsage>;\n subcommands: Array<{ name: string; description: string | undefined }>;\n};\n\nexport type CommandUsageBreadcrumb = { argument: string } | { command: string };\n\nexport function command<Context, Result>(\n metadata: CommandMetadata,\n execution: Execution<Context, Result>,\n): Command<Context, Result> {\n return {\n getDescription() {\n return metadata.description;\n },\n buildInterpreter(readerTokenizer: ReaderTokenizer) {\n function computeUsage(): CommandUsage {\n const executionUsage = execution.computeUsage();\n return {\n breadcrumbs: executionUsage.arguments.map((argument) =>\n breadcrumbArgument(argument.label),\n ),\n description: metadata.description,\n details: metadata.details,\n options: executionUsage.options,\n arguments: executionUsage.arguments,\n subcommands: [],\n };\n }\n try {\n const executionResolver = execution.createResolver(readerTokenizer);\n const lastPositional = readerTokenizer.consumePositional();\n if (lastPositional !== undefined) {\n throw Error(`Unprocessed positional: ${lastPositional}`);\n }\n const executionCallback = executionResolver();\n return {\n computeUsage,\n async execute(context: Context) {\n return await executionCallback(context);\n },\n };\n } catch (error) {\n return {\n computeUsage,\n async execute(_context: Context) {\n throw error;\n },\n };\n }\n },\n };\n}\n\nexport function commandWithSubcommands<Context, Payload, Result>(\n metadata: CommandMetadata,\n execution: Execution<Context, Payload>,\n subcommands: { [subcommand: Lowercase<string>]: Command<Payload, Result> },\n): Command<Context, Result> {\n return {\n getDescription() {\n return metadata.description;\n },\n buildInterpreter(readerTokenizer: ReaderTokenizer) {\n try {\n const executionResolver = execution.createResolver(readerTokenizer);\n const subcommandName = readerTokenizer.consumePositional();\n if (subcommandName === undefined) {\n throw new Error(\"Expected a subcommand\");\n }\n const subcommandInput =\n subcommands[subcommandName as Lowercase<string>];\n if (subcommandInput === undefined) {\n throw new Error(`Unknown subcommand: ${subcommandName}`);\n }\n const subcommandInterpreter =\n subcommandInput.buildInterpreter(readerTokenizer);\n const executionCallback = executionResolver();\n return {\n computeUsage() {\n const executionUsage = execution.computeUsage();\n const subcommandUsage = subcommandInterpreter.computeUsage();\n return {\n breadcrumbs: executionUsage.arguments\n .map((argument) => breadcrumbArgument(argument.label))\n .concat([breadcrumbCommand(subcommandName)])\n .concat(subcommandUsage.breadcrumbs),\n description: subcommandUsage.description,\n details: subcommandUsage.details,\n options: executionUsage.options.concat(subcommandUsage.options),\n arguments: executionUsage.arguments.concat(\n subcommandUsage.arguments,\n ),\n subcommands: subcommandUsage.subcommands,\n };\n },\n async execute(context: Context) {\n const payload = await executionCallback(context);\n return await subcommandInterpreter.execute(payload);\n },\n };\n } catch (error) {\n return {\n computeUsage() {\n const executionUsage = execution.computeUsage();\n return {\n breadcrumbs: executionUsage.arguments\n .map((argument) => breadcrumbArgument(argument.label))\n .concat([breadcrumbCommand(\"<SUBCOMMAND>\")]),\n description: metadata.description,\n details: metadata.details,\n options: executionUsage.options,\n arguments: executionUsage.arguments,\n subcommands: Object.entries(subcommands).map(\n ([name, subcommand]) => ({\n name,\n description: subcommand.getDescription(),\n }),\n ),\n };\n },\n async execute(_context: Context) {\n throw error;\n },\n };\n }\n },\n };\n}\n\nfunction breadcrumbArgument(value: string): CommandUsageBreadcrumb {\n return { argument: value };\n}\n\nfunction breadcrumbCommand(value: string): CommandUsageBreadcrumb {\n return { command: value };\n}\n","import { Argument, ArgumentUsage } from \"./Argument\";\nimport { Option, OptionUsage } from \"./Option\";\nimport { ReaderTokenizer } from \"./Reader\";\n\nexport type Execution<Context, Result> = {\n computeUsage(): ExecutionUsage;\n createResolver(\n readerTokenizer: ReaderTokenizer,\n ): ExecutionResolver<Context, Result>;\n};\n\nexport type ExecutionResolver<Context, Result> = () => ExecutionCallback<\n Context,\n Result\n>;\n\nexport type ExecutionCallback<Context, Result> = (\n context: Context,\n) => Promise<Result>;\n\nexport type ExecutionUsage = {\n options: Array<OptionUsage>;\n arguments: Array<ArgumentUsage>;\n};\n\nexport function execution<\n Context,\n Result,\n Options extends { [option: string]: any },\n const Arguments extends Array<any>,\n>(\n inputs: {\n options: { [K in keyof Options]: Option<Options[K]> };\n arguments: { [K in keyof Arguments]: Argument<Arguments[K]> };\n },\n handler: (\n context: Context,\n inputs: {\n options: Options;\n arguments: Arguments;\n },\n ) => Promise<Result>,\n): Execution<Context, Result> {\n return {\n computeUsage() {\n const optionsUsage = new Array<OptionUsage>();\n for (const optionKey in inputs.options) {\n const optionInput = inputs.options[optionKey]!;\n optionsUsage.push(optionInput.generateUsage());\n }\n const argumentsUsage = new Array<ArgumentUsage>();\n for (const argumentInput of inputs.arguments) {\n argumentsUsage.push(argumentInput.generateUsage());\n }\n return { options: optionsUsage, arguments: argumentsUsage };\n },\n createResolver(readerTokenizer: ReaderTokenizer) {\n const optionsConsumers: any = {};\n for (const optionKey in inputs.options) {\n const optionInput = inputs.options[optionKey]!;\n optionsConsumers[optionKey] =\n optionInput.prepareConsumer(readerTokenizer);\n }\n const argumentsValues: any = [];\n for (const argumentInput of inputs.arguments) {\n argumentsValues.push(argumentInput.consumeValue(readerTokenizer));\n }\n return () => {\n const optionsValues: any = {};\n for (const optionKey in optionsConsumers) {\n optionsValues[optionKey] = optionsConsumers[optionKey]!();\n }\n return async (context: Context) => {\n return await handler(context, {\n options: optionsValues,\n arguments: argumentsValues,\n });\n };\n };\n },\n };\n}\n","export type TypoSupport = \"none\" | \"tty\" | \"html\" | \"mock\";\n\nexport type TypoText = {\n value: string;\n color?: keyof typeof colorCodes;\n bold?: boolean;\n};\n\nexport function typoPrintableString(\n typoSupport: TypoSupport,\n typoText: TypoText,\n): string {\n if (typoSupport === \"none\") {\n return typoText.value;\n }\n if (typoSupport === \"tty\") {\n const colorStartCode = typoText.color ? colorCodes[typoText.color] : \"\";\n const colorBoldCode = typoText.bold ? boldCode : \"\";\n return `${colorStartCode}${colorBoldCode}${typoText.value}${resetCode}`;\n }\n if (typoSupport === \"html\") {\n const colorStartTag = typoText.color\n ? `<span style=\"color: ${typoText.color}\">`\n : \"\";\n const colorEndTag = typoText.color ? \"</span>\" : \"\";\n const boldStartTag = typoText.bold ? \"<b>\" : \"\";\n const boldEndTag = typoText.bold ? \"</b>\" : \"\";\n return `${colorStartTag}${boldStartTag}${typoText.value}${boldEndTag}${colorEndTag}`;\n }\n if (typoSupport === \"mock\") {\n if (typoText.color && typoText.bold) {\n return `{${typoText.value}}@${typoText.color}+`;\n }\n if (typoText.color) {\n return `{${typoText.value}}@${typoText.color}`;\n }\n if (typoText.bold) {\n return `{${typoText.value}}+`;\n }\n return `{${typoText.value}}`;\n }\n throw new Error(`Unknown typo support: ${typoSupport}`);\n}\n\nexport function typoInferProcessSupport(): TypoSupport {\n if (!process) {\n return \"none\";\n }\n if (process.env) {\n if (process.env[\"FORCE_COLOR\"] === \"0\") {\n return \"none\";\n }\n if (process.env[\"FORCE_COLOR\"]) {\n return \"tty\";\n }\n if (\"NO_COLOR\" in process.env) {\n return \"none\";\n }\n }\n if (!process.stdout || !process.stdout.isTTY) {\n return \"none\";\n }\n return \"tty\";\n}\n\nconst resetCode = \"\\x1b[0m\";\nconst boldCode = \"\\x1b[1m\";\nconst colorCodes = {\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};\n","import { TypoSupport, TypoText, typoPrintableString } from \"./Typo\";\n\nexport type Grid = Array<GridRow>;\nexport type GridRow = Array<GridCell>;\nexport type GridCell = Array<TypoText>;\n\nexport function gridToPrintableLines(\n grid: Grid,\n typoSupport: TypoSupport,\n delimiter: string = \"\",\n): Array<string> {\n const lines = new Array<string>();\n const gridWidths = new Array<number>();\n for (const gridRow of grid) {\n for (\n let gridColumnIndex = 0;\n gridColumnIndex < gridRow.length;\n gridColumnIndex++\n ) {\n const gridCell = gridRow[gridColumnIndex]!;\n const length = gridCellLength(gridCell);\n if (\n gridWidths[gridColumnIndex] === undefined ||\n length > gridWidths[gridColumnIndex]!\n ) {\n gridWidths[gridColumnIndex] = length;\n }\n }\n }\n for (const gridRow of grid) {\n const lineColumns = new Array<string>();\n for (\n let gridColumnIndex = 0;\n gridColumnIndex < gridRow.length;\n gridColumnIndex++\n ) {\n const gridCell = gridRow[gridColumnIndex]!;\n const parts = gridCell.map((text) =>\n typoPrintableString(typoSupport, text),\n );\n if (gridColumnIndex < gridRow.length - 1) {\n const length = gridCellLength(gridCell);\n const padding = \" \".repeat(gridWidths[gridColumnIndex]! - length);\n lineColumns.push(parts.join(\"\") + padding);\n } else {\n lineColumns.push(parts.join(\"\"));\n }\n }\n lines.push(lineColumns.join(delimiter));\n }\n return lines;\n}\n\nfunction gridCellLength(cell: GridCell): number {\n let length = 0;\n for (const text of cell) {\n length += text.value.length;\n }\n return length;\n}\n","import { ReaderTokenizer } from \"./Reader\";\nimport { Type } from \"./Type\";\n\nexport type Option<Value> = {\n generateUsage(): OptionUsage;\n prepareConsumer(readerTokenizer: ReaderTokenizer): OptionConsumer<Value>;\n};\n\nexport type OptionUsage = {\n description: string | undefined;\n long: Lowercase<string>; // TODO - better type for long option names ?\n short: string | undefined;\n label: Uppercase<string> | undefined;\n // TODO - default value for usage ? but it can be dynamic, so maybe not\n};\n\nexport type OptionConsumer<Value> = () => Value;\n\nexport function optionFlag(definition: {\n description?: string;\n long: Lowercase<string>;\n short?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n default?: () => boolean;\n}): Option<boolean> {\n return {\n generateUsage() {\n return {\n description: definition.description,\n long: definition.long,\n short: definition.short,\n label: undefined,\n };\n },\n prepareConsumer(readerTokenizer: ReaderTokenizer) {\n const key = definition.long;\n const longs = [definition.long];\n if (definition.aliases?.longs) {\n longs.push(...definition.aliases?.longs);\n }\n const shorts = definition.short ? [definition.short] : [];\n if (definition.aliases?.shorts) {\n shorts.push(...definition.aliases?.shorts);\n }\n readerTokenizer.registerFlag({ key, longs, shorts });\n return () => {\n const value = readerTokenizer.consumeFlag(key);\n if (value === undefined) {\n return definition.default ? definition.default() : false;\n }\n return value;\n };\n },\n };\n}\n\n// TODO - option with comma-separated values, e.g. --names=alice,bob,charlie\n\nexport function optionRepeatable<Value>(definition: {\n description?: string;\n type: Type<Value>;\n long: Lowercase<string>;\n short?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n label?: Uppercase<string>;\n}): Option<Array<Value>> {\n return {\n generateUsage() {\n // TODO - showcase that it can be repeated ?\n return {\n description: definition.description,\n long: definition.long,\n short: definition.short,\n label:\n `<${definition.label ?? definition.type.label}>` as Uppercase<string>,\n };\n },\n prepareConsumer(readerTokenizer: ReaderTokenizer) {\n const key = definition.long;\n const longs = definition.long ? [definition.long] : [];\n if (definition.aliases?.longs) {\n longs.push(...definition.aliases?.longs);\n }\n const shorts = definition.short ? [definition.short] : [];\n if (definition.aliases?.shorts) {\n shorts.push(...definition.aliases?.shorts);\n }\n readerTokenizer.registerOption({ key, longs, shorts });\n return () => {\n return readerTokenizer.consumeOption(key).map(definition.type.decoder);\n };\n },\n };\n}\n\nexport function optionSingleValue<Value>(definition: {\n description?: string;\n type: Type<Value>;\n long: Lowercase<string>;\n short?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n label?: Uppercase<string>;\n default: () => Value;\n}): Option<Value> {\n return {\n generateUsage() {\n return {\n description: definition.description,\n long: definition.long,\n short: definition.short,\n label:\n `<${definition.label ?? definition.type.label}>` as Uppercase<string>,\n };\n },\n prepareConsumer(readerTokenizer: ReaderTokenizer) {\n const key = definition.long;\n const longs = [definition.long];\n if (definition.aliases?.longs) {\n longs.push(...definition.aliases?.longs);\n }\n const shorts = definition.short ? [definition.short] : [];\n if (definition.aliases?.shorts) {\n shorts.push(...definition.aliases?.shorts);\n }\n readerTokenizer.registerOption({ key, longs, shorts });\n return () => {\n // TODO - smooth and beautiful error handling\n const values = readerTokenizer.consumeOption(definition.long);\n if (values.length > 1) {\n throw new Error(\n `Multiple values provided for option: ${definition.long}`,\n );\n }\n const firstValue = values[0];\n if (firstValue === undefined) {\n return definition.default();\n }\n return definition.type.decoder(firstValue);\n };\n },\n };\n}\n","export type ReaderPositionals = {\n consumePositional(): string | undefined;\n};\n\nexport class ReaderTokenizer {\n #parsedArgs: Array<string>;\n #parsedIndex: number;\n #parsedDouble: boolean;\n\n #flagKeyByShort: Map<string, string>;\n #flagKeyByLong: Map<string, string>;\n #flagInfoByKey: Map<string, {}>;\n #flagResultByKey: Map<string, boolean | null>;\n\n #optionKeyByShort: Map<string, string>;\n #optionKeyByLong: Map<string, string>;\n #optionInfoByKey: Map<string, {}>; // TODO - what dis for\n #optionResultByKey: Map<string, Array<string> | null>;\n\n constructor(args: Array<string>) {\n this.#parsedArgs = args;\n this.#parsedIndex = 0;\n this.#parsedDouble = false;\n\n // TODO - this seems like a good candidate for abstraction\n this.#flagKeyByShort = new Map();\n this.#flagKeyByLong = new Map();\n this.#flagInfoByKey = new Map();\n this.#flagResultByKey = new Map();\n\n this.#optionKeyByShort = new Map();\n this.#optionKeyByLong = new Map();\n this.#optionInfoByKey = new Map();\n this.#optionResultByKey = new Map();\n }\n\n registerFlag(definition: {\n key: string;\n shorts: Array<string>;\n longs: Array<string>;\n }) {\n this.#ensureUniqueKey(definition.key);\n this.#flagInfoByKey.set(definition.key, {});\n for (const short of definition.shorts) {\n this.#ensureUniqueName(short);\n this.#flagKeyByShort.set(short, definition.key);\n }\n for (const long of definition.longs) {\n this.#ensureUniqueName(long);\n this.#flagKeyByLong.set(long, definition.key);\n }\n }\n\n registerOption(definition: {\n key: string;\n shorts: Array<string>;\n longs: Array<string>;\n }) {\n this.#ensureUniqueKey(definition.key);\n this.#optionInfoByKey.set(definition.key, {});\n for (const short of definition.shorts) {\n this.#ensureUniqueName(short);\n this.#optionKeyByShort.set(short, definition.key);\n }\n for (const long of definition.longs) {\n this.#ensureUniqueName(long);\n this.#optionKeyByLong.set(long, definition.key);\n }\n }\n\n consumeFlag(key: string): boolean | undefined {\n const flagInfo = this.#flagInfoByKey.get(key);\n if (flagInfo === undefined) {\n throw new Error(`Option flag not registered: ${key}`);\n }\n const result = this.#flagResultByKey.get(key);\n if (result === undefined) {\n this.#flagResultByKey.set(key, null);\n return undefined;\n }\n if (result === null) {\n throw new Error(`Option flag already consumed: ${key}`);\n }\n this.#flagResultByKey.set(key, null);\n return result;\n }\n\n consumeOption(key: string): Array<string> {\n const optionInfo = this.#optionInfoByKey.get(key);\n if (optionInfo === undefined) {\n throw new Error(`Option values not registered: ${key}`);\n }\n const result = this.#optionResultByKey.get(key);\n if (result === undefined) {\n this.#optionResultByKey.set(key, null);\n return new Array<string>();\n }\n if (result === null) {\n throw new Error(`Option values already consumed: ${key}`);\n }\n this.#optionResultByKey.set(key, null);\n return result;\n }\n\n consumePositional(): string | undefined {\n while (true) {\n const arg = this.#consumeArg();\n if (arg === null) {\n return undefined;\n }\n const positional = this.#parseAsPositional(arg);\n if (positional !== null) {\n return positional;\n }\n }\n }\n\n #consumeArg(): string | null {\n const arg = this.#parsedArgs[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 #consumeOptionValue(name: string) {\n const arg = this.#consumeArg();\n if (arg === null) {\n throw new Error(`Option ${name} requires a value`);\n }\n if (this.#parsedDouble) {\n throw new Error(`Option ${name} requires a value before --`);\n }\n // TODO - is that weird, could a valid value start with dash ?\n if (arg.startsWith(\"-\")) {\n throw new Error(`Option ${name} requires a value, got: ${arg}`);\n }\n return arg;\n }\n\n #parseAsPositional(arg: string): string | null {\n if (this.#parsedDouble) {\n return arg;\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 null;\n }\n if (arg.startsWith(\"-\")) {\n let shortIndexStart = 1;\n let shortIndexEnd = 2;\n while (shortIndexEnd <= arg.length) {\n const short = arg.slice(shortIndexStart, shortIndexEnd);\n const rest = arg.slice(shortIndexEnd);\n const result = this.#tryConsumeOptionShort(short, rest);\n if (result === true) {\n return null;\n }\n if (result === false) {\n shortIndexStart = shortIndexEnd;\n }\n shortIndexEnd++;\n }\n throw new Error(\n `Unknown short flags or options: ${arg.slice(shortIndexStart)}`,\n );\n }\n return arg;\n }\n\n #consumeOptionLong(long: string, direct: string | null): void {\n const flagKey = this.#flagKeyByLong.get(long);\n if (flagKey !== undefined) {\n if (direct !== null) {\n const value = asBoolean(direct);\n if (value !== undefined) {\n return this.#acknowledgeFlag(flagKey, value);\n }\n throw new Error(\n `Invalid parameter for long flag: ${flagKey}, value: ${direct}`,\n );\n }\n return this.#acknowledgeFlag(flagKey, true);\n }\n const optionKey = this.#optionKeyByLong.get(long);\n if (optionKey !== undefined) {\n if (direct !== null) {\n return this.#acknowledgeOption(optionKey, direct);\n }\n return this.#acknowledgeOption(optionKey, this.#consumeOptionValue(long));\n }\n throw new Error(`Unknown long flag or option: ${long}`);\n }\n\n #tryConsumeOptionShort(short: string, rest: string): boolean | null {\n const flagKey = this.#flagKeyByShort.get(short);\n if (flagKey !== undefined) {\n if (rest.startsWith(\"=\")) {\n const value = asBoolean(rest.slice(1));\n if (value !== undefined) {\n this.#acknowledgeFlag(flagKey, value);\n return true;\n }\n throw new Error(\n `Invalid parameter for short flag: ${short}, value: ${rest}`,\n );\n }\n this.#acknowledgeFlag(flagKey, true);\n return rest === \"\";\n }\n const optionKey = this.#optionKeyByShort.get(short);\n if (optionKey !== undefined) {\n if (rest === \"\") {\n this.#acknowledgeOption(optionKey, this.#consumeOptionValue(short));\n return true;\n }\n if (rest.startsWith(\"=\")) {\n this.#acknowledgeOption(optionKey, rest.slice(1));\n } else {\n this.#acknowledgeOption(optionKey, rest);\n }\n return true;\n }\n return null;\n }\n\n #acknowledgeFlag(key: string, value: boolean) {\n if (this.#flagResultByKey.has(key)) {\n throw new Error(`Flag already set: ${key}`);\n }\n this.#flagResultByKey.set(key, value);\n }\n\n #acknowledgeOption(key: string, value: string) {\n const values = this.#optionResultByKey.get(key) ?? new Array<string>();\n values.push(value);\n this.#optionResultByKey.set(key, values);\n }\n\n #ensureUniqueKey(key: string) {\n if (this.#flagInfoByKey.has(key)) {\n throw new Error(`Option already registered: ${key}`);\n }\n if (this.#optionInfoByKey.has(key)) {\n throw new Error(`Option already registered: ${key}`);\n }\n }\n\n #ensureUniqueName(nameShortOrLong: string) {\n // TODO - overall better error handling\n // TODO - short flag overlap might be annoying here\n if (this.#flagKeyByShort.has(nameShortOrLong)) {\n throw new Error(`Option already registered: ${nameShortOrLong}`);\n }\n if (this.#flagKeyByLong.has(nameShortOrLong)) {\n throw new Error(`Option already registered: ${nameShortOrLong}`);\n }\n if (this.#optionKeyByShort.has(nameShortOrLong)) {\n throw new Error(`Option already registered: ${nameShortOrLong}`);\n }\n if (this.#optionKeyByLong.has(nameShortOrLong)) {\n throw new Error(`Option already registered: ${nameShortOrLong}`);\n }\n }\n}\n\nfunction asBoolean(value: string): boolean | undefined {\n const lower = value.toLowerCase();\n if (lower === \"true\" || lower === \"t\" || lower === \"y\" || lower === \"yes\") {\n return true;\n }\n if (lower === \"false\" || lower === \"f\" || lower === \"n\" || lower === \"no\") {\n return false;\n }\n return undefined;\n}\n","import { CommandUsage } from \"./Command\";\nimport { GridCell, GridRow, gridToPrintableLines } from \"./Grid\";\nimport { TypoSupport, TypoText, typoPrintableString } from \"./Typo\";\n\nexport function usageToPrintableLines(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 lines.push(\n typoPrintableString(typoSupport, textDescription(commandUsage.description)),\n );\n if (commandUsage.details) {\n lines.push(\n typoPrintableString(typoSupport, textDetails(commandUsage.details)),\n );\n }\n\n lines.push(\"\");\n lines.push(typoPrintableString(typoSupport, textCategory(\"Usage:\")));\n const breadcrumbs = [\n \" \",\n typoPrintableString(typoSupport, textFixed(cliName)),\n ].concat(\n commandUsage.breadcrumbs.map((breadcrumb) => {\n if (\"argument\" in breadcrumb) {\n return typoPrintableString(typoSupport, textInput(breadcrumb.argument));\n }\n if (\"command\" in breadcrumb) {\n return typoPrintableString(typoSupport, textFixed(breadcrumb.command));\n }\n throw new Error(`Unknown breadcrumb: ${JSON.stringify(breadcrumb)}`);\n }),\n );\n lines.push(breadcrumbs.join(\" \"));\n\n if (commandUsage.arguments.length > 0) {\n lines.push(\"\");\n lines.push(typoPrintableString(typoSupport, textCategory(\"Arguments:\")));\n const grid = new Array<GridRow>();\n for (const argumentUsage of commandUsage.arguments) {\n const gridRow = new Array<GridCell>();\n gridRow.push([textDelimiter()]);\n gridRow.push([textInput(argumentUsage.label)]);\n if (argumentUsage.description) {\n gridRow.push([textDelimiter()]);\n gridRow.push([textDescription(argumentUsage.description)]);\n }\n grid.push(gridRow);\n }\n lines.push(...gridToPrintableLines(grid, typoSupport));\n }\n\n if (commandUsage.subcommands.length > 0) {\n lines.push(\"\");\n lines.push(typoPrintableString(typoSupport, textCategory(\"Subcommands:\")));\n const grid = new Array<GridRow>();\n for (const subcommand of commandUsage.subcommands) {\n const gridRow = new Array<GridCell>();\n gridRow.push([textDelimiter()]);\n gridRow.push([textFixed(subcommand.name)]);\n if (subcommand.description) {\n gridRow.push([textDelimiter()]);\n gridRow.push([textDescription(subcommand.description)]);\n }\n grid.push(gridRow);\n }\n lines.push(...gridToPrintableLines(grid, typoSupport));\n }\n\n if (commandUsage.options.length > 0) {\n lines.push(\"\");\n lines.push(typoPrintableString(typoSupport, textCategory(\"Options:\")));\n const grid = new Array<GridRow>();\n for (const optionUsage of commandUsage.options) {\n const gridRow = new Array<GridCell>();\n gridRow.push([textDelimiter()]);\n if (optionUsage.short) {\n gridRow.push([textFixed(`-${optionUsage.short}`), { value: \", \" }]);\n } else {\n gridRow.push([]);\n }\n if (optionUsage.label) {\n gridRow.push([\n textFixed(`--${optionUsage.long} `),\n textInput(optionUsage.label),\n ]);\n } else {\n gridRow.push([textFixed(`--${optionUsage.long}`)]);\n }\n if (optionUsage.description) {\n gridRow.push([textDelimiter()]);\n gridRow.push([textDescription(optionUsage.description)]);\n }\n grid.push(gridRow);\n }\n lines.push(...gridToPrintableLines(grid, typoSupport));\n }\n\n lines.push(\"\");\n return lines;\n}\n\nfunction textCategory(text: string): TypoText {\n return { value: text, color: \"brightGreen\", bold: true };\n}\n\nfunction textDescription(text: string): TypoText {\n return { value: text, bold: true };\n}\n\nfunction textDetails(text: string): TypoText {\n return { value: text, color: \"brightBlack\" };\n}\n\nfunction textFixed(text: string): TypoText {\n return { value: text, color: \"brightCyan\", bold: true };\n}\n\nfunction textInput(text: string): TypoText {\n return { value: text, color: \"brightBlue\" };\n}\n\nfunction textDelimiter(): TypoText {\n return { value: \" \" };\n}\n","import { Command, CommandInterpreter } from \"./Command\";\nimport { ReaderTokenizer } from \"./Reader\";\nimport {\n typoInferProcessSupport,\n typoPrintableString,\n TypoSupport,\n} from \"./Typo\";\nimport { usageToPrintableLines } from \"./Usage\";\n\n// TODO - add unit tests for this\n\nexport async function runAndExit<Context>(\n cliName: Lowercase<string>,\n cliArgs: Array<string>,\n context: Context,\n command: Command<Context, void>,\n application?: {\n usageOnError?: boolean | undefined;\n usageOnHelp?: boolean | undefined;\n buildVersion?: string | undefined;\n useColors?: boolean | undefined;\n onLogStdOut?: ((message: string) => void) | undefined;\n onLogStdErr?: ((message: string) => void) | undefined;\n onError?: ((error: unknown) => void) | undefined;\n onExit?: ((code: number) => never) | undefined;\n },\n): Promise<never> {\n const readerTokenizer = new ReaderTokenizer(cliArgs);\n if (application?.buildVersion) {\n readerTokenizer.registerFlag({\n key: \"version\",\n shorts: [],\n longs: [\"version\"],\n });\n }\n if (application?.usageOnHelp ?? true) {\n readerTokenizer.registerFlag({\n key: \"help\",\n shorts: [],\n longs: [\"help\"],\n });\n }\n /*\n // TODO - handle completions ?\n readerTokenizer.registerFlag({\n key: \"completion\",\n shorts: [],\n longs: [\"completion\"],\n });\n */\n const commandInterpreter = command.buildInterpreter(readerTokenizer);\n if (application?.buildVersion) {\n if (readerTokenizer.consumeFlag(\"version\")) {\n (application?.onLogStdOut ?? console.log)(\n [cliName, application.buildVersion].join(\" \"),\n );\n return (application?.onExit ?? process.exit)(0);\n }\n }\n if (application?.usageOnHelp ?? true) {\n if (readerTokenizer.consumeFlag(\"help\")) {\n (application?.onLogStdOut ?? console.log)(\n computeUsageString(cliName, commandInterpreter, application?.useColors),\n );\n return (application?.onExit ?? process.exit)(0);\n }\n }\n try {\n await commandInterpreter.execute(context);\n return (application?.onExit ?? process.exit)(0);\n } catch (error) {\n if (application?.usageOnError ?? true) {\n (application?.onLogStdErr ?? console.error)(\n computeUsageString(cliName, commandInterpreter, application?.useColors),\n );\n }\n if (application?.onError) {\n application.onError(error);\n } else {\n (application?.onLogStdErr ?? console.error)(\n typoPrintableString(chooseTypoSupport(application?.useColors), {\n value: \"Error:\",\n color: \"brightRed\",\n bold: true,\n }),\n );\n (application?.onLogStdErr ?? console.error)(\n error instanceof Error ? error.message : error,\n );\n }\n return (application?.onExit ?? process.exit)(1);\n }\n}\n\nfunction computeUsageString<Context, Result>(\n cliName: Lowercase<string>,\n commandInterpreter: CommandInterpreter<Context, Result>,\n useColors: boolean | undefined,\n) {\n return usageToPrintableLines({\n cliName,\n commandUsage: commandInterpreter.computeUsage(),\n typoSupport: chooseTypoSupport(useColors),\n }).join(\"\\n\");\n}\n\nfunction chooseTypoSupport(useColors?: boolean): TypoSupport {\n if (useColors === undefined) {\n return typoInferProcessSupport();\n }\n return useColors ? \"tty\" : \"none\";\n}\n","export type Type<Value> = {\n label: Uppercase<string>; // TODO - is there a better way to enforce uppercase labels?\n decoder(value: string): Value;\n};\n\nexport const typeBoolean: Type<boolean> = {\n label: \"BOOLEAN\",\n decoder(value: string) {\n if (value === \"true\") {\n return true;\n }\n if (value === \"false\") {\n return false;\n }\n throw new Error(`Invalid boolean 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 date value: ${value}`);\n }\n return new Date(timestamp);\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 typeCommaTuple<\n const Elements extends Array<any>,\n>(elementTypes: {\n [K in keyof Elements]: Type<Elements[K]>;\n}): Type<Elements> {\n return {\n label: elementTypes\n .map((elementType) => elementType.label)\n .join(\",\") as Uppercase<string>,\n decoder(value: string) {\n const parts = value.split(\",\", elementTypes.length);\n if (parts.length !== elementTypes.length) {\n throw new Error(\n `Invalid tuple value: ${value}, expected ${elementTypes.length} parts`,\n );\n }\n return parts.map((part, index) =>\n elementTypes[index]!.decoder(part),\n ) as Elements;\n },\n };\n}\n\nexport function typeCommaList<Value>(\n elementType: Type<Value>,\n): Type<Array<Value>> {\n return {\n label:\n `${elementType.label}[,${elementType.label}...]` as Uppercase<string>,\n decoder(value: string) {\n return value.split(\",\").map(elementType.decoder);\n },\n };\n}\n"],"mappings":"+2BAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,qBAAAE,EAAA,qBAAAC,GAAA,qBAAAC,GAAA,sBAAAC,GAAA,YAAAC,GAAA,2BAAAC,GAAA,cAAAC,GAAA,yBAAAC,EAAA,eAAAC,GAAA,qBAAAC,GAAA,sBAAAC,GAAA,eAAAC,GAAA,eAAAC,GAAA,gBAAAC,GAAA,kBAAAC,GAAA,mBAAAC,GAAA,aAAAC,GAAA,eAAAC,GAAA,eAAAC,GAAA,4BAAAC,EAAA,wBAAAC,EAAA,0BAAAC,IAAA,eAAAC,GAAAxB,ICaO,SAASyB,GAAwBC,EAIpB,CAClB,MAAO,CACL,eAAgB,CACd,MAAO,CACL,YAAaA,EAAW,YACxB,MAAO,IAAIA,EAAW,OAASA,EAAW,KAAK,KAAK,GACtD,CACF,EACA,aAAaC,EAAsC,CACjD,IAAMC,EAAaD,EAAkB,kBAAkB,EACvD,GAAIC,IAAe,OACjB,MAAM,IAAI,MACR,0BAA0BF,EAAW,OAASA,EAAW,KAAK,KAAK,GACrE,EAEF,OAAOA,EAAW,KAAK,QAAQE,CAAU,CAC3C,CACF,CACF,CAEO,SAASC,GAAwBH,EAKpB,CAClB,MAAO,CACL,eAAgB,CACd,MAAO,CACL,YAAaA,EAAW,YACxB,MAAO,IAAIA,EAAW,OAASA,EAAW,KAAK,KAAK,GACtD,CACF,EACA,aAAaC,EAAsC,CACjD,IAAMC,EAAaD,EAAkB,kBAAkB,EACvD,OAAIC,IAAe,OACVF,EAAW,QAAQ,EAErBA,EAAW,KAAK,QAAQE,CAAU,CAC3C,CACF,CACF,CAEO,SAASE,GAAyBJ,EAKd,CACzB,MAAO,CACL,eAAgB,CACd,MAAO,CACL,YAAaA,EAAW,YACxB,MACE,IAAIA,EAAW,OAASA,EAAW,KAAK,KAAK,QAC5CA,EAAW,aACR,cAAcA,EAAW,YAAY,IACrC,GACR,CACF,EACA,aAAaC,EAAsC,CACjD,IAAMI,EAAuB,CAAC,EAC9B,OAAa,CACX,IAAMH,EAAaD,EAAkB,kBAAkB,EACvD,GACEC,IAAe,QACfA,IAAeF,EAAW,aAE1B,MAEFK,EAAO,KAAKL,EAAW,KAAK,QAAQE,CAAU,CAAC,CACjD,CACA,OAAOG,CACT,CACF,CACF,CC1DO,SAASC,GACdC,EACAC,EAC0B,CAC1B,MAAO,CACL,gBAAiB,CACf,OAAOD,EAAS,WAClB,EACA,iBAAiBE,EAAkC,CACjD,SAASC,GAA6B,CACpC,IAAMC,EAAiBH,EAAU,aAAa,EAC9C,MAAO,CACL,YAAaG,EAAe,UAAU,IAAKC,GACzCC,EAAmBD,EAAS,KAAK,CACnC,EACA,YAAaL,EAAS,YACtB,QAASA,EAAS,QAClB,QAASI,EAAe,QACxB,UAAWA,EAAe,UAC1B,YAAa,CAAC,CAChB,CACF,CACA,GAAI,CACF,IAAMG,EAAoBN,EAAU,eAAeC,CAAe,EAC5DM,EAAiBN,EAAgB,kBAAkB,EACzD,GAAIM,IAAmB,OACrB,MAAM,MAAM,2BAA2BA,CAAc,EAAE,EAEzD,IAAMC,EAAoBF,EAAkB,EAC5C,MAAO,CACL,aAAAJ,EACA,MAAM,QAAQO,EAAkB,CAC9B,OAAO,MAAMD,EAAkBC,CAAO,CACxC,CACF,CACF,OAASC,EAAO,CACd,MAAO,CACL,aAAAR,EACA,MAAM,QAAQS,EAAmB,CAC/B,MAAMD,CACR,CACF,CACF,CACF,CACF,CACF,CAEO,SAASE,GACdb,EACAC,EACAa,EAC0B,CAC1B,MAAO,CACL,gBAAiB,CACf,OAAOd,EAAS,WAClB,EACA,iBAAiBE,EAAkC,CACjD,GAAI,CACF,IAAMK,EAAoBN,EAAU,eAAeC,CAAe,EAC5Da,EAAiBb,EAAgB,kBAAkB,EACzD,GAAIa,IAAmB,OACrB,MAAM,IAAI,MAAM,uBAAuB,EAEzC,IAAMC,EACJF,EAAYC,CAAmC,EACjD,GAAIC,IAAoB,OACtB,MAAM,IAAI,MAAM,uBAAuBD,CAAc,EAAE,EAEzD,IAAME,EACJD,EAAgB,iBAAiBd,CAAe,EAC5CO,EAAoBF,EAAkB,EAC5C,MAAO,CACL,cAAe,CACb,IAAMH,EAAiBH,EAAU,aAAa,EACxCiB,EAAkBD,EAAsB,aAAa,EAC3D,MAAO,CACL,YAAab,EAAe,UACzB,IAAKC,GAAaC,EAAmBD,EAAS,KAAK,CAAC,EACpD,OAAO,CAACc,EAAkBJ,CAAc,CAAC,CAAC,EAC1C,OAAOG,EAAgB,WAAW,EACrC,YAAaA,EAAgB,YAC7B,QAASA,EAAgB,QACzB,QAASd,EAAe,QAAQ,OAAOc,EAAgB,OAAO,EAC9D,UAAWd,EAAe,UAAU,OAClCc,EAAgB,SAClB,EACA,YAAaA,EAAgB,WAC/B,CACF,EACA,MAAM,QAAQR,EAAkB,CAC9B,IAAMU,EAAU,MAAMX,EAAkBC,CAAO,EAC/C,OAAO,MAAMO,EAAsB,QAAQG,CAAO,CACpD,CACF,CACF,OAAST,EAAO,CACd,MAAO,CACL,cAAe,CACb,IAAMP,EAAiBH,EAAU,aAAa,EAC9C,MAAO,CACL,YAAaG,EAAe,UACzB,IAAKC,GAAaC,EAAmBD,EAAS,KAAK,CAAC,EACpD,OAAO,CAACc,EAAkB,cAAc,CAAC,CAAC,EAC7C,YAAanB,EAAS,YACtB,QAASA,EAAS,QAClB,QAASI,EAAe,QACxB,UAAWA,EAAe,UAC1B,YAAa,OAAO,QAAQU,CAAW,EAAE,IACvC,CAAC,CAACO,EAAMC,CAAU,KAAO,CACvB,KAAAD,EACA,YAAaC,EAAW,eAAe,CACzC,EACF,CACF,CACF,EACA,MAAM,QAAQV,EAAmB,CAC/B,MAAMD,CACR,CACF,CACF,CACF,CACF,CACF,CAEA,SAASL,EAAmBiB,EAAuC,CACjE,MAAO,CAAE,SAAUA,CAAM,CAC3B,CAEA,SAASJ,EAAkBI,EAAuC,CAChE,MAAO,CAAE,QAASA,CAAM,CAC1B,CC1IO,SAASC,GAMdC,EAIAC,EAO4B,CAC5B,MAAO,CACL,cAAe,CACb,IAAMC,EAAe,IAAI,MACzB,QAAWC,KAAaH,EAAO,QAAS,CACtC,IAAMI,EAAcJ,EAAO,QAAQG,CAAS,EAC5CD,EAAa,KAAKE,EAAY,cAAc,CAAC,CAC/C,CACA,IAAMC,EAAiB,IAAI,MAC3B,QAAWC,KAAiBN,EAAO,UACjCK,EAAe,KAAKC,EAAc,cAAc,CAAC,EAEnD,MAAO,CAAE,QAASJ,EAAc,UAAWG,CAAe,CAC5D,EACA,eAAeE,EAAkC,CAC/C,IAAMC,EAAwB,CAAC,EAC/B,QAAWL,KAAaH,EAAO,QAAS,CACtC,IAAMI,EAAcJ,EAAO,QAAQG,CAAS,EAC5CK,EAAiBL,CAAS,EACxBC,EAAY,gBAAgBG,CAAe,CAC/C,CACA,IAAME,EAAuB,CAAC,EAC9B,QAAWH,KAAiBN,EAAO,UACjCS,EAAgB,KAAKH,EAAc,aAAaC,CAAe,CAAC,EAElE,MAAO,IAAM,CACX,IAAMG,EAAqB,CAAC,EAC5B,QAAWP,KAAaK,EACtBE,EAAcP,CAAS,EAAIK,EAAiBL,CAAS,EAAG,EAE1D,MAAO,OAAOQ,GACL,MAAMV,EAAQU,EAAS,CAC5B,QAASD,EACT,UAAWD,CACb,CAAC,CAEL,CACF,CACF,CACF,CCzEO,SAASG,EACdC,EACAC,EACQ,CACR,GAAID,IAAgB,OAClB,OAAOC,EAAS,MAElB,GAAID,IAAgB,MAAO,CACzB,IAAME,EAAiBD,EAAS,MAAQE,GAAWF,EAAS,KAAK,EAAI,GAC/DG,EAAgBH,EAAS,KAAOI,GAAW,GACjD,MAAO,GAAGH,CAAc,GAAGE,CAAa,GAAGH,EAAS,KAAK,GAAGK,EAAS,EACvE,CACA,GAAIN,IAAgB,OAAQ,CAC1B,IAAMO,EAAgBN,EAAS,MAC3B,uBAAuBA,EAAS,KAAK,KACrC,GACEO,EAAcP,EAAS,MAAQ,UAAY,GAC3CQ,EAAeR,EAAS,KAAO,MAAQ,GACvCS,EAAaT,EAAS,KAAO,OAAS,GAC5C,MAAO,GAAGM,CAAa,GAAGE,CAAY,GAAGR,EAAS,KAAK,GAAGS,CAAU,GAAGF,CAAW,EACpF,CACA,GAAIR,IAAgB,OAClB,OAAIC,EAAS,OAASA,EAAS,KACtB,IAAIA,EAAS,KAAK,KAAKA,EAAS,KAAK,IAE1CA,EAAS,MACJ,IAAIA,EAAS,KAAK,KAAKA,EAAS,KAAK,GAE1CA,EAAS,KACJ,IAAIA,EAAS,KAAK,KAEpB,IAAIA,EAAS,KAAK,IAE3B,MAAM,IAAI,MAAM,yBAAyBD,CAAW,EAAE,CACxD,CAEO,SAASW,GAAuC,CACrD,GAAI,CAAC,QACH,MAAO,OAET,GAAI,QAAQ,IAAK,CACf,GAAI,QAAQ,IAAI,cAAmB,IACjC,MAAO,OAET,GAAI,QAAQ,IAAI,YACd,MAAO,MAET,GAAI,aAAc,QAAQ,IACxB,MAAO,MAEX,CACA,MAAI,CAAC,QAAQ,QAAU,CAAC,QAAQ,OAAO,MAC9B,OAEF,KACT,CAEA,IAAML,GAAY,UACZD,GAAW,UACXF,GAAa,CACjB,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,EC9EO,SAASS,EACdC,EACAC,EACAC,EAAoB,GACL,CACf,IAAMC,EAAQ,IAAI,MACZC,EAAa,IAAI,MACvB,QAAWC,KAAWL,EACpB,QACMM,EAAkB,EACtBA,EAAkBD,EAAQ,OAC1BC,IACA,CACA,IAAMC,EAAWF,EAAQC,CAAe,EAClCE,EAASC,EAAeF,CAAQ,GAEpCH,EAAWE,CAAe,IAAM,QAChCE,EAASJ,EAAWE,CAAe,KAEnCF,EAAWE,CAAe,EAAIE,EAElC,CAEF,QAAWH,KAAWL,EAAM,CAC1B,IAAMU,EAAc,IAAI,MACxB,QACMJ,EAAkB,EACtBA,EAAkBD,EAAQ,OAC1BC,IACA,CACA,IAAMC,EAAWF,EAAQC,CAAe,EAClCK,EAAQJ,EAAS,IAAKK,GAC1BC,EAAoBZ,EAAaW,CAAI,CACvC,EACA,GAAIN,EAAkBD,EAAQ,OAAS,EAAG,CACxC,IAAMG,EAASC,EAAeF,CAAQ,EAChCO,EAAU,IAAI,OAAOV,EAAWE,CAAe,EAAKE,CAAM,EAChEE,EAAY,KAAKC,EAAM,KAAK,EAAE,EAAIG,CAAO,CAC3C,MACEJ,EAAY,KAAKC,EAAM,KAAK,EAAE,CAAC,CAEnC,CACAR,EAAM,KAAKO,EAAY,KAAKR,CAAS,CAAC,CACxC,CACA,OAAOC,CACT,CAEA,SAASM,EAAeM,EAAwB,CAC9C,IAAIP,EAAS,EACb,QAAWI,KAAQG,EACjBP,GAAUI,EAAK,MAAM,OAEvB,OAAOJ,CACT,CCzCO,SAASQ,GAAWC,EAMP,CAClB,MAAO,CACL,eAAgB,CACd,MAAO,CACL,YAAaA,EAAW,YACxB,KAAMA,EAAW,KACjB,MAAOA,EAAW,MAClB,MAAO,MACT,CACF,EACA,gBAAgBC,EAAkC,CAChD,IAAMC,EAAMF,EAAW,KACjBG,EAAQ,CAACH,EAAW,IAAI,EAC1BA,EAAW,SAAS,OACtBG,EAAM,KAAK,GAAGH,EAAW,SAAS,KAAK,EAEzC,IAAMI,EAASJ,EAAW,MAAQ,CAACA,EAAW,KAAK,EAAI,CAAC,EACxD,OAAIA,EAAW,SAAS,QACtBI,EAAO,KAAK,GAAGJ,EAAW,SAAS,MAAM,EAE3CC,EAAgB,aAAa,CAAE,IAAAC,EAAK,MAAAC,EAAO,OAAAC,CAAO,CAAC,EAC5C,IAAM,CACX,IAAMC,EAAQJ,EAAgB,YAAYC,CAAG,EAC7C,OAAIG,IAAU,OACLL,EAAW,QAAUA,EAAW,QAAQ,EAAI,GAE9CK,CACT,CACF,CACF,CACF,CAIO,SAASC,GAAwBN,EAOf,CACvB,MAAO,CACL,eAAgB,CAEd,MAAO,CACL,YAAaA,EAAW,YACxB,KAAMA,EAAW,KACjB,MAAOA,EAAW,MAClB,MACE,IAAIA,EAAW,OAASA,EAAW,KAAK,KAAK,GACjD,CACF,EACA,gBAAgBC,EAAkC,CAChD,IAAMC,EAAMF,EAAW,KACjBG,EAAQH,EAAW,KAAO,CAACA,EAAW,IAAI,EAAI,CAAC,EACjDA,EAAW,SAAS,OACtBG,EAAM,KAAK,GAAGH,EAAW,SAAS,KAAK,EAEzC,IAAMI,EAASJ,EAAW,MAAQ,CAACA,EAAW,KAAK,EAAI,CAAC,EACxD,OAAIA,EAAW,SAAS,QACtBI,EAAO,KAAK,GAAGJ,EAAW,SAAS,MAAM,EAE3CC,EAAgB,eAAe,CAAE,IAAAC,EAAK,MAAAC,EAAO,OAAAC,CAAO,CAAC,EAC9C,IACEH,EAAgB,cAAcC,CAAG,EAAE,IAAIF,EAAW,KAAK,OAAO,CAEzE,CACF,CACF,CAEO,SAASO,GAAyBP,EAQvB,CAChB,MAAO,CACL,eAAgB,CACd,MAAO,CACL,YAAaA,EAAW,YACxB,KAAMA,EAAW,KACjB,MAAOA,EAAW,MAClB,MACE,IAAIA,EAAW,OAASA,EAAW,KAAK,KAAK,GACjD,CACF,EACA,gBAAgBC,EAAkC,CAChD,IAAMC,EAAMF,EAAW,KACjBG,EAAQ,CAACH,EAAW,IAAI,EAC1BA,EAAW,SAAS,OACtBG,EAAM,KAAK,GAAGH,EAAW,SAAS,KAAK,EAEzC,IAAMI,EAASJ,EAAW,MAAQ,CAACA,EAAW,KAAK,EAAI,CAAC,EACxD,OAAIA,EAAW,SAAS,QACtBI,EAAO,KAAK,GAAGJ,EAAW,SAAS,MAAM,EAE3CC,EAAgB,eAAe,CAAE,IAAAC,EAAK,MAAAC,EAAO,OAAAC,CAAO,CAAC,EAC9C,IAAM,CAEX,IAAMI,EAASP,EAAgB,cAAcD,EAAW,IAAI,EAC5D,GAAIQ,EAAO,OAAS,EAClB,MAAM,IAAI,MACR,wCAAwCR,EAAW,IAAI,EACzD,EAEF,IAAMS,EAAaD,EAAO,CAAC,EAC3B,OAAIC,IAAe,OACVT,EAAW,QAAQ,EAErBA,EAAW,KAAK,QAAQS,CAAU,CAC3C,CACF,CACF,CACF,CC7IA,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,GAAAC,EAAAC,EAAAC,EAAAC,EAIaC,EAAN,KAAsB,CAe3B,YAAYC,EAAqB,CAf5BC,EAAA,KAAAZ,GACLY,EAAA,KAAAvB,GACAuB,EAAA,KAAAtB,GACAsB,EAAA,KAAArB,GAEAqB,EAAA,KAAApB,GACAoB,EAAA,KAAAnB,GACAmB,EAAA,KAAAlB,GACAkB,EAAA,KAAAjB,GAEAiB,EAAA,KAAAhB,GACAgB,EAAA,KAAAf,GACAe,EAAA,KAAAd,GACAc,EAAA,KAAAb,GAGEc,EAAA,KAAKxB,EAAcsB,GACnBE,EAAA,KAAKvB,EAAe,GACpBuB,EAAA,KAAKtB,EAAgB,IAGrBsB,EAAA,KAAKrB,EAAkB,IAAI,KAC3BqB,EAAA,KAAKpB,EAAiB,IAAI,KAC1BoB,EAAA,KAAKnB,EAAiB,IAAI,KAC1BmB,EAAA,KAAKlB,EAAmB,IAAI,KAE5BkB,EAAA,KAAKjB,EAAoB,IAAI,KAC7BiB,EAAA,KAAKhB,EAAmB,IAAI,KAC5BgB,EAAA,KAAKf,EAAmB,IAAI,KAC5Be,EAAA,KAAKd,EAAqB,IAAI,IAChC,CAEA,aAAae,EAIV,CACDC,EAAA,KAAKf,EAAAQ,GAAL,UAAsBM,EAAW,KACjCE,EAAA,KAAKtB,GAAe,IAAIoB,EAAW,IAAK,CAAC,CAAC,EAC1C,QAAWG,KAASH,EAAW,OAC7BC,EAAA,KAAKf,EAAAS,GAAL,UAAuBQ,GACvBD,EAAA,KAAKxB,GAAgB,IAAIyB,EAAOH,EAAW,GAAG,EAEhD,QAAWI,KAAQJ,EAAW,MAC5BC,EAAA,KAAKf,EAAAS,GAAL,UAAuBS,GACvBF,EAAA,KAAKvB,GAAe,IAAIyB,EAAMJ,EAAW,GAAG,CAEhD,CAEA,eAAeA,EAIZ,CACDC,EAAA,KAAKf,EAAAQ,GAAL,UAAsBM,EAAW,KACjCE,EAAA,KAAKlB,GAAiB,IAAIgB,EAAW,IAAK,CAAC,CAAC,EAC5C,QAAWG,KAASH,EAAW,OAC7BC,EAAA,KAAKf,EAAAS,GAAL,UAAuBQ,GACvBD,EAAA,KAAKpB,GAAkB,IAAIqB,EAAOH,EAAW,GAAG,EAElD,QAAWI,KAAQJ,EAAW,MAC5BC,EAAA,KAAKf,EAAAS,GAAL,UAAuBS,GACvBF,EAAA,KAAKnB,GAAiB,IAAIqB,EAAMJ,EAAW,GAAG,CAElD,CAEA,YAAYK,EAAkC,CAE5C,GADiBH,EAAA,KAAKtB,GAAe,IAAIyB,CAAG,IAC3B,OACf,MAAM,IAAI,MAAM,+BAA+BA,CAAG,EAAE,EAEtD,IAAMC,EAASJ,EAAA,KAAKrB,GAAiB,IAAIwB,CAAG,EAC5C,GAAIC,IAAW,OAAW,CACxBJ,EAAA,KAAKrB,GAAiB,IAAIwB,EAAK,IAAI,EACnC,MACF,CACA,GAAIC,IAAW,KACb,MAAM,IAAI,MAAM,iCAAiCD,CAAG,EAAE,EAExD,OAAAH,EAAA,KAAKrB,GAAiB,IAAIwB,EAAK,IAAI,EAC5BC,CACT,CAEA,cAAcD,EAA4B,CAExC,GADmBH,EAAA,KAAKlB,GAAiB,IAAIqB,CAAG,IAC7B,OACjB,MAAM,IAAI,MAAM,iCAAiCA,CAAG,EAAE,EAExD,IAAMC,EAASJ,EAAA,KAAKjB,GAAmB,IAAIoB,CAAG,EAC9C,GAAIC,IAAW,OACb,OAAAJ,EAAA,KAAKjB,GAAmB,IAAIoB,EAAK,IAAI,EAC9B,IAAI,MAEb,GAAIC,IAAW,KACb,MAAM,IAAI,MAAM,mCAAmCD,CAAG,EAAE,EAE1D,OAAAH,EAAA,KAAKjB,GAAmB,IAAIoB,EAAK,IAAI,EAC9BC,CACT,CAEA,mBAAwC,CACtC,OAAa,CACX,IAAMC,EAAMN,EAAA,KAAKf,EAAAC,GAAL,WACZ,GAAIoB,IAAQ,KACV,OAEF,IAAMC,EAAaP,EAAA,KAAKf,EAAAG,GAAL,UAAwBkB,GAC3C,GAAIC,IAAe,KACjB,OAAOA,CAEX,CACF,CAoKF,EAlREjC,EAAA,YACAC,EAAA,YACAC,EAAA,YAEAC,EAAA,YACAC,EAAA,YACAC,EAAA,YACAC,EAAA,YAEAC,EAAA,YACAC,EAAA,YACAC,EAAA,YACAC,EAAA,YAbKC,EAAA,YAiHLC,EAAW,UAAkB,CAC3B,IAAMoB,EAAML,EAAA,KAAK3B,GAAY2B,EAAA,KAAK1B,EAAY,EAC9C,OAAI+B,IAAQ,OACH,MAETE,EAAA,KAAKjC,GAAL,IACI,CAAC0B,EAAA,KAAKzB,IACJ8B,IAAQ,MACVR,EAAA,KAAKtB,EAAgB,IACdwB,EAAA,KAAKf,EAAAC,GAAL,YAGJoB,EACT,EAEAnB,EAAmB,SAACsB,EAAc,CAChC,IAAMH,EAAMN,EAAA,KAAKf,EAAAC,GAAL,WACZ,GAAIoB,IAAQ,KACV,MAAM,IAAI,MAAM,UAAUG,CAAI,mBAAmB,EAEnD,GAAIR,EAAA,KAAKzB,GACP,MAAM,IAAI,MAAM,UAAUiC,CAAI,6BAA6B,EAG7D,GAAIH,EAAI,WAAW,GAAG,EACpB,MAAM,IAAI,MAAM,UAAUG,CAAI,2BAA2BH,CAAG,EAAE,EAEhE,OAAOA,CACT,EAEAlB,EAAkB,SAACkB,EAA4B,CAC7C,GAAIL,EAAA,KAAKzB,GACP,OAAO8B,EAET,GAAIA,EAAI,WAAW,IAAI,EAAG,CACxB,IAAMI,EAAkBJ,EAAI,QAAQ,GAAG,EACvC,OAAII,IAAoB,GACtBV,EAAA,KAAKf,EAAAI,GAAL,UAAwBiB,EAAI,MAAM,CAAC,EAAG,MAEtCN,EAAA,KAAKf,EAAAI,GAAL,UACEiB,EAAI,MAAM,EAAGI,CAAe,EAC5BJ,EAAI,MAAMI,EAAkB,CAAC,GAG1B,IACT,CACA,GAAIJ,EAAI,WAAW,GAAG,EAAG,CACvB,IAAIK,EAAkB,EAClBC,EAAgB,EACpB,KAAOA,GAAiBN,EAAI,QAAQ,CAClC,IAAMJ,EAAQI,EAAI,MAAMK,EAAiBC,CAAa,EAChDC,EAAOP,EAAI,MAAMM,CAAa,EAC9BP,EAASL,EAAA,KAAKf,EAAAK,IAAL,UAA4BY,EAAOW,GAClD,GAAIR,IAAW,GACb,OAAO,KAELA,IAAW,KACbM,EAAkBC,GAEpBA,GACF,CACA,MAAM,IAAI,MACR,mCAAmCN,EAAI,MAAMK,CAAe,CAAC,EAC/D,CACF,CACA,OAAOL,CACT,EAEAjB,EAAkB,SAACc,EAAcW,EAA6B,CAC5D,IAAMC,EAAUd,EAAA,KAAKvB,GAAe,IAAIyB,CAAI,EAC5C,GAAIY,IAAY,OAAW,CACzB,GAAID,IAAW,KAAM,CACnB,IAAME,EAAQC,EAAUH,CAAM,EAC9B,GAAIE,IAAU,OACZ,OAAOhB,EAAA,KAAKf,EAAAM,GAAL,UAAsBwB,EAASC,GAExC,MAAM,IAAI,MACR,oCAAoCD,CAAO,YAAYD,CAAM,EAC/D,CACF,CACA,OAAOd,EAAA,KAAKf,EAAAM,GAAL,UAAsBwB,EAAS,GACxC,CACA,IAAMG,EAAYjB,EAAA,KAAKnB,GAAiB,IAAIqB,CAAI,EAChD,GAAIe,IAAc,OAChB,OAAIJ,IAAW,KACNd,EAAA,KAAKf,EAAAO,GAAL,UAAwB0B,EAAWJ,GAErCd,EAAA,KAAKf,EAAAO,GAAL,UAAwB0B,EAAWlB,EAAA,KAAKf,EAAAE,GAAL,UAAyBgB,IAErE,MAAM,IAAI,MAAM,gCAAgCA,CAAI,EAAE,CACxD,EAEAb,GAAsB,SAACY,EAAeW,EAA8B,CAClE,IAAME,EAAUd,EAAA,KAAKxB,GAAgB,IAAIyB,CAAK,EAC9C,GAAIa,IAAY,OAAW,CACzB,GAAIF,EAAK,WAAW,GAAG,EAAG,CACxB,IAAMG,EAAQC,EAAUJ,EAAK,MAAM,CAAC,CAAC,EACrC,GAAIG,IAAU,OACZ,OAAAhB,EAAA,KAAKf,EAAAM,GAAL,UAAsBwB,EAASC,GACxB,GAET,MAAM,IAAI,MACR,qCAAqCd,CAAK,YAAYW,CAAI,EAC5D,CACF,CACA,OAAAb,EAAA,KAAKf,EAAAM,GAAL,UAAsBwB,EAAS,IACxBF,IAAS,EAClB,CACA,IAAMK,EAAYjB,EAAA,KAAKpB,GAAkB,IAAIqB,CAAK,EAClD,OAAIgB,IAAc,OACZL,IAAS,IACXb,EAAA,KAAKf,EAAAO,GAAL,UAAwB0B,EAAWlB,EAAA,KAAKf,EAAAE,GAAL,UAAyBe,IACrD,KAELW,EAAK,WAAW,GAAG,EACrBb,EAAA,KAAKf,EAAAO,GAAL,UAAwB0B,EAAWL,EAAK,MAAM,CAAC,GAE/Cb,EAAA,KAAKf,EAAAO,GAAL,UAAwB0B,EAAWL,GAE9B,IAEF,IACT,EAEAtB,EAAgB,SAACa,EAAaY,EAAgB,CAC5C,GAAIf,EAAA,KAAKrB,GAAiB,IAAIwB,CAAG,EAC/B,MAAM,IAAI,MAAM,qBAAqBA,CAAG,EAAE,EAE5CH,EAAA,KAAKrB,GAAiB,IAAIwB,EAAKY,CAAK,CACtC,EAEAxB,EAAkB,SAACY,EAAaY,EAAe,CAC7C,IAAMG,EAASlB,EAAA,KAAKjB,GAAmB,IAAIoB,CAAG,GAAK,IAAI,MACvDe,EAAO,KAAKH,CAAK,EACjBf,EAAA,KAAKjB,GAAmB,IAAIoB,EAAKe,CAAM,CACzC,EAEA1B,EAAgB,SAACW,EAAa,CAC5B,GAAIH,EAAA,KAAKtB,GAAe,IAAIyB,CAAG,EAC7B,MAAM,IAAI,MAAM,8BAA8BA,CAAG,EAAE,EAErD,GAAIH,EAAA,KAAKlB,GAAiB,IAAIqB,CAAG,EAC/B,MAAM,IAAI,MAAM,8BAA8BA,CAAG,EAAE,CAEvD,EAEAV,EAAiB,SAAC0B,EAAyB,CAGzC,GAAInB,EAAA,KAAKxB,GAAgB,IAAI2C,CAAe,EAC1C,MAAM,IAAI,MAAM,8BAA8BA,CAAe,EAAE,EAEjE,GAAInB,EAAA,KAAKvB,GAAe,IAAI0C,CAAe,EACzC,MAAM,IAAI,MAAM,8BAA8BA,CAAe,EAAE,EAEjE,GAAInB,EAAA,KAAKpB,GAAkB,IAAIuC,CAAe,EAC5C,MAAM,IAAI,MAAM,8BAA8BA,CAAe,EAAE,EAEjE,GAAInB,EAAA,KAAKnB,GAAiB,IAAIsC,CAAe,EAC3C,MAAM,IAAI,MAAM,8BAA8BA,CAAe,EAAE,CAEnE,EAGF,SAASH,EAAUD,EAAoC,CACrD,IAAMK,EAAQL,EAAM,YAAY,EAChC,GAAIK,IAAU,QAAUA,IAAU,KAAOA,IAAU,KAAOA,IAAU,MAClE,MAAO,GAET,GAAIA,IAAU,SAAWA,IAAU,KAAOA,IAAU,KAAOA,IAAU,KACnE,MAAO,EAGX,CC9RO,SAASC,EAAsBC,EAInC,CACD,GAAM,CAAE,QAAAC,EAAS,aAAAC,EAAc,YAAAC,CAAY,EAAIH,EAEzCI,EAAQ,IAAI,MAElBA,EAAM,KACJC,EAAoBF,EAAaG,EAAgBJ,EAAa,WAAW,CAAC,CAC5E,EACIA,EAAa,SACfE,EAAM,KACJC,EAAoBF,EAAaI,GAAYL,EAAa,OAAO,CAAC,CACpE,EAGFE,EAAM,KAAK,EAAE,EACbA,EAAM,KAAKC,EAAoBF,EAAaK,EAAa,QAAQ,CAAC,CAAC,EACnE,IAAMC,EAAc,CAClB,IACAJ,EAAoBF,EAAaO,EAAUT,CAAO,CAAC,CACrD,EAAE,OACAC,EAAa,YAAY,IAAKS,GAAe,CAC3C,GAAI,aAAcA,EAChB,OAAON,EAAoBF,EAAaS,EAAUD,EAAW,QAAQ,CAAC,EAExE,GAAI,YAAaA,EACf,OAAON,EAAoBF,EAAaO,EAAUC,EAAW,OAAO,CAAC,EAEvE,MAAM,IAAI,MAAM,uBAAuB,KAAK,UAAUA,CAAU,CAAC,EAAE,CACrE,CAAC,CACH,EAGA,GAFAP,EAAM,KAAKK,EAAY,KAAK,GAAG,CAAC,EAE5BP,EAAa,UAAU,OAAS,EAAG,CACrCE,EAAM,KAAK,EAAE,EACbA,EAAM,KAAKC,EAAoBF,EAAaK,EAAa,YAAY,CAAC,CAAC,EACvE,IAAMK,EAAO,IAAI,MACjB,QAAWC,KAAiBZ,EAAa,UAAW,CAClD,IAAMa,EAAU,IAAI,MACpBA,EAAQ,KAAK,CAACC,EAAc,CAAC,CAAC,EAC9BD,EAAQ,KAAK,CAACH,EAAUE,EAAc,KAAK,CAAC,CAAC,EACzCA,EAAc,cAChBC,EAAQ,KAAK,CAACC,EAAc,CAAC,CAAC,EAC9BD,EAAQ,KAAK,CAACT,EAAgBQ,EAAc,WAAW,CAAC,CAAC,GAE3DD,EAAK,KAAKE,CAAO,CACnB,CACAX,EAAM,KAAK,GAAGa,EAAqBJ,EAAMV,CAAW,CAAC,CACvD,CAEA,GAAID,EAAa,YAAY,OAAS,EAAG,CACvCE,EAAM,KAAK,EAAE,EACbA,EAAM,KAAKC,EAAoBF,EAAaK,EAAa,cAAc,CAAC,CAAC,EACzE,IAAMK,EAAO,IAAI,MACjB,QAAWK,KAAchB,EAAa,YAAa,CACjD,IAAMa,EAAU,IAAI,MACpBA,EAAQ,KAAK,CAACC,EAAc,CAAC,CAAC,EAC9BD,EAAQ,KAAK,CAACL,EAAUQ,EAAW,IAAI,CAAC,CAAC,EACrCA,EAAW,cACbH,EAAQ,KAAK,CAACC,EAAc,CAAC,CAAC,EAC9BD,EAAQ,KAAK,CAACT,EAAgBY,EAAW,WAAW,CAAC,CAAC,GAExDL,EAAK,KAAKE,CAAO,CACnB,CACAX,EAAM,KAAK,GAAGa,EAAqBJ,EAAMV,CAAW,CAAC,CACvD,CAEA,GAAID,EAAa,QAAQ,OAAS,EAAG,CACnCE,EAAM,KAAK,EAAE,EACbA,EAAM,KAAKC,EAAoBF,EAAaK,EAAa,UAAU,CAAC,CAAC,EACrE,IAAMK,EAAO,IAAI,MACjB,QAAWM,KAAejB,EAAa,QAAS,CAC9C,IAAMa,EAAU,IAAI,MACpBA,EAAQ,KAAK,CAACC,EAAc,CAAC,CAAC,EAC1BG,EAAY,MACdJ,EAAQ,KAAK,CAACL,EAAU,IAAIS,EAAY,KAAK,EAAE,EAAG,CAAE,MAAO,IAAK,CAAC,CAAC,EAElEJ,EAAQ,KAAK,CAAC,CAAC,EAEbI,EAAY,MACdJ,EAAQ,KAAK,CACXL,EAAU,KAAKS,EAAY,IAAI,GAAG,EAClCP,EAAUO,EAAY,KAAK,CAC7B,CAAC,EAEDJ,EAAQ,KAAK,CAACL,EAAU,KAAKS,EAAY,IAAI,EAAE,CAAC,CAAC,EAE/CA,EAAY,cACdJ,EAAQ,KAAK,CAACC,EAAc,CAAC,CAAC,EAC9BD,EAAQ,KAAK,CAACT,EAAgBa,EAAY,WAAW,CAAC,CAAC,GAEzDN,EAAK,KAAKE,CAAO,CACnB,CACAX,EAAM,KAAK,GAAGa,EAAqBJ,EAAMV,CAAW,CAAC,CACvD,CAEA,OAAAC,EAAM,KAAK,EAAE,EACNA,CACT,CAEA,SAASI,EAAaY,EAAwB,CAC5C,MAAO,CAAE,MAAOA,EAAM,MAAO,cAAe,KAAM,EAAK,CACzD,CAEA,SAASd,EAAgBc,EAAwB,CAC/C,MAAO,CAAE,MAAOA,EAAM,KAAM,EAAK,CACnC,CAEA,SAASb,GAAYa,EAAwB,CAC3C,MAAO,CAAE,MAAOA,EAAM,MAAO,aAAc,CAC7C,CAEA,SAASV,EAAUU,EAAwB,CACzC,MAAO,CAAE,MAAOA,EAAM,MAAO,aAAc,KAAM,EAAK,CACxD,CAEA,SAASR,EAAUQ,EAAwB,CACzC,MAAO,CAAE,MAAOA,EAAM,MAAO,YAAa,CAC5C,CAEA,SAASJ,GAA0B,CACjC,MAAO,CAAE,MAAO,IAAK,CACvB,CCtHA,eAAsBK,GACpBC,EACAC,EACAC,EACAC,EACAC,EAUgB,CAChB,IAAMC,EAAkB,IAAIC,EAAgBL,CAAO,EAC/CG,GAAa,cACfC,EAAgB,aAAa,CAC3B,IAAK,UACL,OAAQ,CAAC,EACT,MAAO,CAAC,SAAS,CACnB,CAAC,GAECD,GAAa,aAAe,KAC9BC,EAAgB,aAAa,CAC3B,IAAK,OACL,OAAQ,CAAC,EACT,MAAO,CAAC,MAAM,CAChB,CAAC,EAUH,IAAME,EAAqBJ,EAAQ,iBAAiBE,CAAe,EACnE,GAAID,GAAa,cACXC,EAAgB,YAAY,SAAS,EACvC,OAACD,GAAa,aAAe,QAAQ,KACnC,CAACJ,EAASI,EAAY,YAAY,EAAE,KAAK,GAAG,CAC9C,GACQA,GAAa,QAAU,QAAQ,MAAM,CAAC,EAGlD,IAAIA,GAAa,aAAe,KAC1BC,EAAgB,YAAY,MAAM,EACpC,OAACD,GAAa,aAAe,QAAQ,KACnCI,GAAmBR,EAASO,EAAoBH,GAAa,SAAS,CACxE,GACQA,GAAa,QAAU,QAAQ,MAAM,CAAC,EAGlD,GAAI,CACF,aAAMG,EAAmB,QAAQL,CAAO,GAChCE,GAAa,QAAU,QAAQ,MAAM,CAAC,CAChD,OAASK,EAAO,CACd,OAAIL,GAAa,cAAgB,MAC9BA,GAAa,aAAe,QAAQ,OACnCI,GAAmBR,EAASO,EAAoBH,GAAa,SAAS,CACxE,EAEEA,GAAa,QACfA,EAAY,QAAQK,CAAK,IAExBL,GAAa,aAAe,QAAQ,OACnCM,EAAoBC,GAAkBP,GAAa,SAAS,EAAG,CAC7D,MAAO,SACP,MAAO,YACP,KAAM,EACR,CAAC,CACH,GACCA,GAAa,aAAe,QAAQ,OACnCK,aAAiB,MAAQA,EAAM,QAAUA,CAC3C,IAEML,GAAa,QAAU,QAAQ,MAAM,CAAC,CAChD,CACF,CAEA,SAASI,GACPR,EACAO,EACAK,EACA,CACA,OAAOC,EAAsB,CAC3B,QAAAb,EACA,aAAcO,EAAmB,aAAa,EAC9C,YAAaI,GAAkBC,CAAS,CAC1C,CAAC,EAAE,KAAK;AAAA,CAAI,CACd,CAEA,SAASD,GAAkBC,EAAkC,CAC3D,OAAIA,IAAc,OACTE,EAAwB,EAE1BF,EAAY,MAAQ,MAC7B,CC1GO,IAAMG,GAA6B,CACxC,MAAO,UACP,QAAQC,EAAe,CACrB,GAAIA,IAAU,OACZ,MAAO,GAET,GAAIA,IAAU,QACZ,MAAO,GAET,MAAM,IAAI,MAAM,0BAA0BA,CAAK,EAAE,CACnD,CACF,EAEaC,GAAuB,CAClC,MAAO,OACP,QAAQD,EAAe,CACrB,IAAME,EAAY,KAAK,MAAMF,CAAK,EAClC,GAAI,MAAME,CAAS,EACjB,MAAM,IAAI,MAAM,uBAAuBF,CAAK,EAAE,EAEhD,OAAO,IAAI,KAAKE,CAAS,CAC3B,CACF,EAEaC,GAA2B,CACtC,MAAO,SACP,QAAQH,EAAe,CACrB,OAAOA,CACT,CACF,EAEaI,GAA2B,CACtC,MAAO,SACP,QAAQJ,EAAe,CACrB,OAAO,OAAOA,CAAK,CACrB,CACF,EAEaK,GAA2B,CACtC,MAAO,SACP,QAAQL,EAAe,CACrB,OAAO,OAAOA,CAAK,CACrB,CACF,EAEO,SAASM,GAEdC,EAEiB,CACjB,MAAO,CACL,MAAOA,EACJ,IAAKC,GAAgBA,EAAY,KAAK,EACtC,KAAK,GAAG,EACX,QAAQR,EAAe,CACrB,IAAMS,EAAQT,EAAM,MAAM,IAAKO,EAAa,MAAM,EAClD,GAAIE,EAAM,SAAWF,EAAa,OAChC,MAAM,IAAI,MACR,wBAAwBP,CAAK,cAAcO,EAAa,MAAM,QAChE,EAEF,OAAOE,EAAM,IAAI,CAACC,EAAMC,IACtBJ,EAAaI,CAAK,EAAG,QAAQD,CAAI,CACnC,CACF,CACF,CACF,CAEO,SAASE,GACdJ,EACoB,CACpB,MAAO,CACL,MACE,GAAGA,EAAY,KAAK,KAAKA,EAAY,KAAK,OAC5C,QAAQR,EAAe,CACrB,OAAOA,EAAM,MAAM,GAAG,EAAE,IAAIQ,EAAY,OAAO,CACjD,CACF,CACF","names":["index_exports","__export","ReaderTokenizer","argumentOptional","argumentRequired","argumentVariadics","command","commandWithSubcommands","execution","gridToPrintableLines","optionFlag","optionRepeatable","optionSingleValue","runAndExit","typeBigInt","typeBoolean","typeCommaList","typeCommaTuple","typeDate","typeNumber","typeString","typoInferProcessSupport","typoPrintableString","usageToPrintableLines","__toCommonJS","argumentRequired","definition","readerPositionals","positional","argumentOptional","argumentVariadics","values","command","metadata","execution","readerTokenizer","computeUsage","executionUsage","argument","breadcrumbArgument","executionResolver","lastPositional","executionCallback","context","error","_context","commandWithSubcommands","subcommands","subcommandName","subcommandInput","subcommandInterpreter","subcommandUsage","breadcrumbCommand","payload","name","subcommand","value","execution","inputs","handler","optionsUsage","optionKey","optionInput","argumentsUsage","argumentInput","readerTokenizer","optionsConsumers","argumentsValues","optionsValues","context","typoPrintableString","typoSupport","typoText","colorStartCode","colorCodes","colorBoldCode","boldCode","resetCode","colorStartTag","colorEndTag","boldStartTag","boldEndTag","typoInferProcessSupport","gridToPrintableLines","grid","typoSupport","delimiter","lines","gridWidths","gridRow","gridColumnIndex","gridCell","length","gridCellLength","lineColumns","parts","text","typoPrintableString","padding","cell","optionFlag","definition","readerTokenizer","key","longs","shorts","value","optionRepeatable","optionSingleValue","values","firstValue","_parsedArgs","_parsedIndex","_parsedDouble","_flagKeyByShort","_flagKeyByLong","_flagInfoByKey","_flagResultByKey","_optionKeyByShort","_optionKeyByLong","_optionInfoByKey","_optionResultByKey","_ReaderTokenizer_instances","consumeArg_fn","consumeOptionValue_fn","parseAsPositional_fn","consumeOptionLong_fn","tryConsumeOptionShort_fn","acknowledgeFlag_fn","acknowledgeOption_fn","ensureUniqueKey_fn","ensureUniqueName_fn","ReaderTokenizer","args","__privateAdd","__privateSet","definition","__privateMethod","__privateGet","short","long","key","result","arg","positional","__privateWrapper","name","valueIndexStart","shortIndexStart","shortIndexEnd","rest","direct","flagKey","value","asBoolean","optionKey","values","nameShortOrLong","lower","usageToPrintableLines","params","cliName","commandUsage","typoSupport","lines","typoPrintableString","textDescription","textDetails","textCategory","breadcrumbs","textFixed","breadcrumb","textInput","grid","argumentUsage","gridRow","textDelimiter","gridToPrintableLines","subcommand","optionUsage","text","runAndExit","cliName","cliArgs","context","command","application","readerTokenizer","ReaderTokenizer","commandInterpreter","computeUsageString","error","typoPrintableString","chooseTypoSupport","useColors","usageToPrintableLines","typoInferProcessSupport","typeBoolean","value","typeDate","timestamp","typeString","typeNumber","typeBigInt","typeCommaTuple","elementTypes","elementType","parts","part","index","typeCommaList"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/lib/Type.ts","../src/lib/Argument.ts","../src/lib/Command.ts","../src/lib/Execution.ts","../src/lib/Typo.ts","../src/lib/Grid.ts","../src/lib/Option.ts","../src/lib/Reader.ts","../src/lib/Usage.ts","../src/lib/Run.ts"],"sourcesContent":["export * from \"./lib/Argument\";\nexport * from \"./lib/Command\";\nexport * from \"./lib/Execution\";\nexport * from \"./lib/Grid\";\nexport * from \"./lib/Option\";\nexport * from \"./lib/Reader\";\nexport * from \"./lib/Run\";\nexport * from \"./lib/Type\";\nexport * from \"./lib/Typo\";\nexport * from \"./lib/Usage\";\n","export type Type<Value> = {\n label: Uppercase<string>; // TODO - is there a better way to enforce uppercase labels?\n decoder(value: string): Value;\n};\n\nexport const typeBoolean: Type<boolean> = {\n label: \"BOOLEAN\",\n decoder(value: string) {\n if (value === \"true\") {\n return true;\n }\n if (value === \"false\") {\n return false;\n }\n throw new Error(`Invalid boolean 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 date value: ${value}`);\n }\n return new Date(timestamp);\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 typeCommaTuple<\n const Elements extends Array<any>,\n>(elementTypes: {\n [K in keyof Elements]: Type<Elements[K]>;\n}): Type<Elements> {\n return {\n label: elementTypes\n .map((elementType) => elementType.label)\n .join(\",\") as Uppercase<string>,\n decoder(value: string) {\n const parts = value.split(\",\", elementTypes.length);\n if (parts.length !== elementTypes.length) {\n throw new Error(\n `Invalid tuple value: ${value}, expected ${elementTypes.length} parts`,\n );\n }\n return parts.map((part, index) =>\n typeDecode(elementTypes[index]!, `[${index}]`, part),\n ) as Elements;\n },\n };\n}\n\nexport function typeCommaList<Value>(\n elementType: Type<Value>,\n): Type<Array<Value>> {\n return {\n label:\n `${elementType.label}[,${elementType.label}...]` as Uppercase<string>,\n decoder(value: string) {\n return value\n .split(\",\")\n .map((part, index) => typeDecode(elementType, `[${index}]`, part));\n },\n };\n}\n\nexport function typeDecode<Value>(\n type: Type<Value>,\n context: string,\n value: string,\n): Value {\n try {\n return type.decoder(value);\n } catch (error) {\n throw new Error(\n `Invalid value for ${context}: ${type.label}: ${value}, error: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n}\n","import { ReaderPositionals } from \"./Reader\";\nimport { Type, typeDecode } from \"./Type\";\n\nexport type Argument<Value> = {\n generateUsage(): ArgumentUsage;\n consumeValue(readerPositionals: ReaderPositionals): Value;\n};\n\nexport type ArgumentUsage = {\n description: string | undefined;\n label: string;\n};\n\nexport function argumentRequired<Value>(definition: {\n description?: string;\n type: Type<Value>;\n label?: Uppercase<string>;\n}): Argument<Value> {\n const label = definition.label ?? definition.type.label;\n return {\n generateUsage() {\n return {\n description: definition.description,\n label: `<${label}>`,\n };\n },\n consumeValue(readerPositionals: ReaderPositionals) {\n const positional = readerPositionals.consumePositional();\n if (positional === undefined) {\n throw new Error(`Missing required arg: ${label}`);\n }\n return typeDecode(definition.type, label, positional);\n },\n };\n}\n\nexport function argumentOptional<Value>(definition: {\n description?: string;\n type: Type<Value>;\n label?: Uppercase<string>;\n default: () => Value;\n}): Argument<Value> {\n const label = definition.label ?? definition.type.label;\n return {\n generateUsage() {\n return {\n description: definition.description,\n label: `[${label}]`,\n };\n },\n consumeValue(readerPositionals: ReaderPositionals) {\n const positional = readerPositionals.consumePositional();\n if (positional === undefined) {\n return definition.default();\n }\n return typeDecode(definition.type, label, positional);\n },\n };\n}\n\nexport function argumentVariadics<Value>(definition: {\n description?: string;\n type: Type<Value>;\n label?: Uppercase<string>;\n endDelimiter?: string;\n}): Argument<Array<Value>> {\n const label = definition.label ?? definition.type.label;\n return {\n generateUsage() {\n return {\n description: definition.description,\n label:\n `[${label}...]` +\n (definition.endDelimiter\n ? ` (end with ${definition.endDelimiter})`\n : \"\"),\n };\n },\n consumeValue(readerPositionals: ReaderPositionals) {\n const values: Array<Value> = [];\n while (true) {\n const positional = readerPositionals.consumePositional();\n if (\n positional === undefined ||\n positional === definition.endDelimiter\n ) {\n break;\n }\n values.push(typeDecode(definition.type, label, positional));\n }\n return values;\n },\n };\n}\n","import { ArgumentUsage } from \"./Argument\";\nimport { Execution } from \"./Execution\";\nimport { OptionUsage } from \"./Option\";\nimport { ReaderTokenizer } from \"./Reader\";\n\nexport type Command<Context, Result> = {\n getDescription(): string | undefined;\n buildInterpreter(\n readerTokenizer: ReaderTokenizer,\n ): CommandInterpreter<Context, Result>;\n};\n\nexport type CommandMetadata = {\n description: string;\n details?: string;\n // TODO - printable examples ?\n};\n\nexport type CommandInterpreter<Context, Result> = {\n computeUsage(): CommandUsage;\n execute(context: Context): Promise<Result>;\n};\n\nexport type CommandUsage = {\n breadcrumbs: Array<CommandUsageBreadcrumb>;\n description: string;\n details: string | undefined;\n options: Array<OptionUsage>;\n arguments: Array<ArgumentUsage>;\n subcommands: Array<{ name: string; description: string | undefined }>;\n};\n\nexport type CommandUsageBreadcrumb = { argument: string } | { command: string };\n\nexport function command<Context, Result>(\n metadata: CommandMetadata,\n execution: Execution<Context, Result>,\n): Command<Context, Result> {\n return {\n getDescription() {\n return metadata.description;\n },\n buildInterpreter(readerTokenizer: ReaderTokenizer) {\n function computeUsage(): CommandUsage {\n const executionUsage = execution.computeUsage();\n return {\n breadcrumbs: executionUsage.arguments.map((argument) =>\n breadcrumbArgument(argument.label),\n ),\n description: metadata.description,\n details: metadata.details,\n options: executionUsage.options,\n arguments: executionUsage.arguments,\n subcommands: [],\n };\n }\n try {\n const executionResolver = execution.createResolver(readerTokenizer);\n const lastPositional = readerTokenizer.consumePositional();\n if (lastPositional !== undefined) {\n throw Error(`Unexpected argument: ${lastPositional}`);\n }\n const executionCallback = executionResolver();\n return {\n computeUsage,\n async execute(context: Context) {\n return await executionCallback(context);\n },\n };\n } catch (error) {\n return {\n computeUsage,\n async execute(_context: Context) {\n throw error;\n },\n };\n }\n },\n };\n}\n\nexport function commandWithSubcommands<Context, Payload, Result>(\n metadata: CommandMetadata,\n execution: Execution<Context, Payload>,\n subcommands: { [subcommand: Lowercase<string>]: Command<Payload, Result> },\n): Command<Context, Result> {\n return {\n getDescription() {\n return metadata.description;\n },\n buildInterpreter(readerTokenizer: ReaderTokenizer) {\n try {\n const executionResolver = execution.createResolver(readerTokenizer);\n const subcommandName = readerTokenizer.consumePositional();\n if (subcommandName === undefined) {\n throw new Error(\"Missing required SUBCOMMAND argument\");\n }\n const subcommandInput =\n subcommands[subcommandName as Lowercase<string>];\n if (subcommandInput === undefined) {\n throw new Error(`Unknown subcommand name: ${subcommandName}`);\n }\n const subcommandInterpreter =\n subcommandInput.buildInterpreter(readerTokenizer);\n const executionCallback = executionResolver();\n return {\n computeUsage() {\n const executionUsage = execution.computeUsage();\n const subcommandUsage = subcommandInterpreter.computeUsage();\n return {\n breadcrumbs: executionUsage.arguments\n .map((argument) => breadcrumbArgument(argument.label))\n .concat([breadcrumbCommand(subcommandName)])\n .concat(subcommandUsage.breadcrumbs),\n description: subcommandUsage.description,\n details: subcommandUsage.details,\n options: executionUsage.options.concat(subcommandUsage.options),\n arguments: executionUsage.arguments.concat(\n subcommandUsage.arguments,\n ),\n subcommands: subcommandUsage.subcommands,\n };\n },\n async execute(context: Context) {\n const payload = await executionCallback(context);\n return await subcommandInterpreter.execute(payload);\n },\n };\n } catch (error) {\n return {\n computeUsage() {\n const executionUsage = execution.computeUsage();\n return {\n breadcrumbs: executionUsage.arguments\n .map((argument) => breadcrumbArgument(argument.label))\n .concat([breadcrumbCommand(\"<SUBCOMMAND>\")]),\n description: metadata.description,\n details: metadata.details,\n options: executionUsage.options,\n arguments: executionUsage.arguments,\n subcommands: Object.entries(subcommands).map(\n ([name, subcommand]) => ({\n name,\n description: subcommand.getDescription(),\n }),\n ),\n };\n },\n async execute(_context: Context) {\n throw error;\n },\n };\n }\n },\n };\n}\n\nfunction breadcrumbArgument(value: string): CommandUsageBreadcrumb {\n return { argument: value };\n}\n\nfunction breadcrumbCommand(value: string): CommandUsageBreadcrumb {\n return { command: value };\n}\n","import { Argument, ArgumentUsage } from \"./Argument\";\nimport { Option, OptionUsage } from \"./Option\";\nimport { ReaderTokenizer } from \"./Reader\";\n\nexport type Execution<Context, Result> = {\n computeUsage(): ExecutionUsage;\n createResolver(\n readerTokenizer: ReaderTokenizer,\n ): ExecutionResolver<Context, Result>;\n};\n\nexport type ExecutionResolver<Context, Result> = () => ExecutionCallback<\n Context,\n Result\n>;\n\nexport type ExecutionCallback<Context, Result> = (\n context: Context,\n) => Promise<Result>;\n\nexport type ExecutionUsage = {\n options: Array<OptionUsage>;\n arguments: Array<ArgumentUsage>;\n};\n\nexport function execution<\n Context,\n Result,\n Options extends { [option: string]: any },\n const Arguments extends Array<any>,\n>(\n inputs: {\n options: { [K in keyof Options]: Option<Options[K]> };\n arguments: { [K in keyof Arguments]: Argument<Arguments[K]> };\n },\n handler: (\n context: Context,\n inputs: {\n options: Options;\n arguments: Arguments;\n },\n ) => Promise<Result>,\n): Execution<Context, Result> {\n return {\n computeUsage() {\n const optionsUsage = new Array<OptionUsage>();\n for (const optionKey in inputs.options) {\n const optionInput = inputs.options[optionKey]!;\n optionsUsage.push(optionInput.generateUsage());\n }\n const argumentsUsage = new Array<ArgumentUsage>();\n for (const argumentInput of inputs.arguments) {\n argumentsUsage.push(argumentInput.generateUsage());\n }\n return { options: optionsUsage, arguments: argumentsUsage };\n },\n createResolver(readerTokenizer: ReaderTokenizer) {\n const optionsConsumers: any = {};\n for (const optionKey in inputs.options) {\n const optionInput = inputs.options[optionKey]!;\n optionsConsumers[optionKey] =\n optionInput.prepareConsumer(readerTokenizer);\n }\n const argumentsValues: any = [];\n for (const argumentInput of inputs.arguments) {\n argumentsValues.push(argumentInput.consumeValue(readerTokenizer));\n }\n return () => {\n const optionsValues: any = {};\n for (const optionKey in optionsConsumers) {\n optionsValues[optionKey] = optionsConsumers[optionKey]!();\n }\n return async (context: Context) => {\n return await handler(context, {\n options: optionsValues,\n arguments: argumentsValues,\n });\n };\n };\n },\n };\n}\n","export type TypoSupport = \"none\" | \"tty\" | \"html\" | \"mock\";\n\nexport type TypoText = {\n value: string;\n color?: keyof typeof colorCodes;\n bold?: boolean;\n};\n\nexport function typoPrintableString(\n typoSupport: TypoSupport,\n typoText: TypoText,\n): string {\n if (typoSupport === \"none\") {\n return typoText.value;\n }\n if (typoSupport === \"tty\") {\n const colorStartCode = typoText.color ? colorCodes[typoText.color] : \"\";\n const colorBoldCode = typoText.bold ? boldCode : \"\";\n return `${colorStartCode}${colorBoldCode}${typoText.value}${resetCode}`;\n }\n if (typoSupport === \"html\") {\n const colorStartTag = typoText.color\n ? `<span style=\"color: ${typoText.color}\">`\n : \"\";\n const colorEndTag = typoText.color ? \"</span>\" : \"\";\n const boldStartTag = typoText.bold ? \"<b>\" : \"\";\n const boldEndTag = typoText.bold ? \"</b>\" : \"\";\n return `${colorStartTag}${boldStartTag}${typoText.value}${boldEndTag}${colorEndTag}`;\n }\n if (typoSupport === \"mock\") {\n if (typoText.color && typoText.bold) {\n return `{${typoText.value}}@${typoText.color}+`;\n }\n if (typoText.color) {\n return `{${typoText.value}}@${typoText.color}`;\n }\n if (typoText.bold) {\n return `{${typoText.value}}+`;\n }\n return `{${typoText.value}}`;\n }\n throw new Error(`Unknown typo support: ${typoSupport}`);\n}\n\nexport function typoInferProcessSupport(): TypoSupport {\n if (!process) {\n return \"none\";\n }\n if (process.env) {\n if (process.env[\"FORCE_COLOR\"] === \"0\") {\n return \"none\";\n }\n if (process.env[\"FORCE_COLOR\"]) {\n return \"tty\";\n }\n if (\"NO_COLOR\" in process.env) {\n return \"none\";\n }\n }\n if (!process.stdout || !process.stdout.isTTY) {\n return \"none\";\n }\n return \"tty\";\n}\n\nconst resetCode = \"\\x1b[0m\";\nconst boldCode = \"\\x1b[1m\";\nconst colorCodes = {\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};\n","import { TypoSupport, TypoText, typoPrintableString } from \"./Typo\";\n\nexport type Grid = Array<GridRow>;\nexport type GridRow = Array<GridCell>;\nexport type GridCell = Array<TypoText>;\n\nexport function gridToPrintableLines(\n grid: Grid,\n typoSupport: TypoSupport,\n delimiter: string = \"\",\n): Array<string> {\n const lines = new Array<string>();\n const gridWidths = new Array<number>();\n for (const gridRow of grid) {\n for (\n let gridColumnIndex = 0;\n gridColumnIndex < gridRow.length;\n gridColumnIndex++\n ) {\n const gridCell = gridRow[gridColumnIndex]!;\n const length = gridCellLength(gridCell);\n if (\n gridWidths[gridColumnIndex] === undefined ||\n length > gridWidths[gridColumnIndex]!\n ) {\n gridWidths[gridColumnIndex] = length;\n }\n }\n }\n for (const gridRow of grid) {\n const lineColumns = new Array<string>();\n for (\n let gridColumnIndex = 0;\n gridColumnIndex < gridRow.length;\n gridColumnIndex++\n ) {\n const gridCell = gridRow[gridColumnIndex]!;\n const parts = gridCell.map((text) =>\n typoPrintableString(typoSupport, text),\n );\n if (gridColumnIndex < gridRow.length - 1) {\n const length = gridCellLength(gridCell);\n const padding = \" \".repeat(gridWidths[gridColumnIndex]! - length);\n lineColumns.push(parts.join(\"\") + padding);\n } else {\n lineColumns.push(parts.join(\"\"));\n }\n }\n lines.push(lineColumns.join(delimiter));\n }\n return lines;\n}\n\nfunction gridCellLength(cell: GridCell): number {\n let length = 0;\n for (const text of cell) {\n length += text.value.length;\n }\n return length;\n}\n","import { ReaderTokenizer } from \"./Reader\";\nimport { Type, typeDecode } from \"./Type\";\n\nexport type Option<Value> = {\n generateUsage(): OptionUsage;\n prepareConsumer(readerTokenizer: ReaderTokenizer): OptionConsumer<Value>;\n};\n\nexport type OptionUsage = {\n description: string | undefined;\n long: Lowercase<string>; // TODO - better type for long option names ?\n short: string | undefined;\n label: Uppercase<string> | undefined;\n // TODO - default value for usage ? but it can be dynamic, so maybe not\n};\n\nexport type OptionConsumer<Value> = () => Value;\n\nexport function optionFlag(definition: {\n description?: string;\n long: Lowercase<string>;\n short?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n default?: () => boolean;\n}): Option<boolean> {\n return {\n generateUsage() {\n return {\n description: definition.description,\n long: definition.long,\n short: definition.short,\n label: undefined,\n };\n },\n prepareConsumer(readerTokenizer: ReaderTokenizer) {\n const key = definition.short\n ? `-${definition.short}, --${definition.long}`\n : `--${definition.long}`;\n const longs = [definition.long];\n if (definition.aliases?.longs) {\n longs.push(...definition.aliases?.longs);\n }\n const shorts = definition.short ? [definition.short] : [];\n if (definition.aliases?.shorts) {\n shorts.push(...definition.aliases?.shorts);\n }\n readerTokenizer.registerFlag({ key, longs, shorts });\n return () => {\n const value = readerTokenizer.consumeFlag(key);\n if (value === undefined) {\n return definition.default ? definition.default() : false;\n }\n return value;\n };\n },\n };\n}\n\n// TODO - option with comma-separated values, e.g. --names=alice,bob,charlie\n\nexport function optionRepeatable<Value>(definition: {\n description?: string;\n type: Type<Value>;\n long: Lowercase<string>;\n short?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n label?: Uppercase<string>;\n}): Option<Array<Value>> {\n const label = definition.label ?? definition.type.label;\n return {\n generateUsage() {\n // TODO - showcase that it can be repeated ?\n return {\n description: definition.description,\n long: definition.long,\n short: definition.short,\n label: `<${label}>` as Uppercase<string>,\n };\n },\n prepareConsumer(readerTokenizer: ReaderTokenizer) {\n const key = definition.short\n ? `-${definition.short}, --${definition.long}`\n : `--${definition.long}`;\n const longs = definition.long ? [definition.long] : [];\n if (definition.aliases?.longs) {\n longs.push(...definition.aliases?.longs);\n }\n const shorts = definition.short ? [definition.short] : [];\n if (definition.aliases?.shorts) {\n shorts.push(...definition.aliases?.shorts);\n }\n readerTokenizer.registerOption({ key, longs, shorts });\n return () => {\n return readerTokenizer\n .consumeOption(key)\n .map((value) =>\n typeDecode(definition.type, `${key}: ${label}`, value),\n );\n };\n },\n };\n}\n\nexport function optionSingleValue<Value>(definition: {\n description?: string;\n type: Type<Value>;\n long: Lowercase<string>;\n short?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n label?: Uppercase<string>;\n default: () => Value;\n}): Option<Value> {\n const label = definition.label ?? definition.type.label;\n return {\n generateUsage() {\n return {\n description: definition.description,\n long: definition.long,\n short: definition.short,\n label: `<${label}>` as Uppercase<string>,\n };\n },\n prepareConsumer(readerTokenizer: ReaderTokenizer) {\n const key = definition.short\n ? `-${definition.short}, --${definition.long}`\n : `--${definition.long}`;\n const longs = [definition.long];\n if (definition.aliases?.longs) {\n longs.push(...definition.aliases?.longs);\n }\n const shorts = definition.short ? [definition.short] : [];\n if (definition.aliases?.shorts) {\n shorts.push(...definition.aliases?.shorts);\n }\n readerTokenizer.registerOption({ key, longs, shorts });\n return () => {\n const values = readerTokenizer.consumeOption(key);\n if (values.length > 1) {\n throw new Error(\n `Multiple values provided for option: ${key}, expected only one`,\n );\n }\n const firstValue = values[0];\n if (firstValue === undefined) {\n return definition.default();\n }\n return typeDecode(definition.type, `${key}: ${label}`, firstValue);\n };\n },\n };\n}\n","export type ReaderPositionals = {\n consumePositional(): string | undefined;\n};\n\nexport class ReaderTokenizer {\n #parsedArgs: Array<string>;\n #parsedIndex: number;\n #parsedDouble: boolean;\n\n #flagKeyByShort: Map<string, string>;\n #flagKeyByLong: Map<string, string>;\n #flagInfoByKey: Map<string, {}>;\n #flagResultByKey: Map<string, boolean | null>;\n\n #optionKeyByShort: Map<string, string>;\n #optionKeyByLong: Map<string, string>;\n #optionInfoByKey: Map<string, {}>; // TODO - what dis for\n #optionResultByKey: Map<string, Array<string> | null>;\n\n constructor(args: Array<string>) {\n this.#parsedArgs = args;\n this.#parsedIndex = 0;\n this.#parsedDouble = false;\n\n // TODO - this seems like a good candidate for abstraction\n this.#flagKeyByShort = new Map();\n this.#flagKeyByLong = new Map();\n this.#flagInfoByKey = new Map();\n this.#flagResultByKey = new Map();\n\n this.#optionKeyByShort = new Map();\n this.#optionKeyByLong = new Map();\n this.#optionInfoByKey = new Map();\n this.#optionResultByKey = new Map();\n }\n\n registerFlag(definition: {\n key: string;\n shorts: Array<string>;\n longs: Array<string>;\n }) {\n this.#ensureUniqueKey(definition.key);\n this.#flagInfoByKey.set(definition.key, {});\n for (const short of definition.shorts) {\n this.#ensureUniqueName(short);\n this.#flagKeyByShort.set(short, definition.key);\n }\n for (const long of definition.longs) {\n this.#ensureUniqueName(long);\n this.#flagKeyByLong.set(long, definition.key);\n }\n }\n\n registerOption(definition: {\n key: string;\n shorts: Array<string>;\n longs: Array<string>;\n }) {\n this.#ensureUniqueKey(definition.key);\n this.#optionInfoByKey.set(definition.key, {});\n for (const short of definition.shorts) {\n this.#ensureUniqueName(short);\n this.#optionKeyByShort.set(short, definition.key);\n }\n for (const long of definition.longs) {\n this.#ensureUniqueName(long);\n this.#optionKeyByLong.set(long, definition.key);\n }\n }\n\n consumeFlag(key: string): boolean | undefined {\n const flagInfo = this.#flagInfoByKey.get(key);\n if (flagInfo === undefined) {\n throw new Error(`Flag not registered: ${key}`);\n }\n const result = this.#flagResultByKey.get(key);\n if (result === undefined) {\n this.#flagResultByKey.set(key, null);\n return undefined;\n }\n if (result === null) {\n throw new Error(`Flag already consumed: ${key}`);\n }\n this.#flagResultByKey.set(key, null);\n return result;\n }\n\n consumeOption(key: string): Array<string> {\n const optionInfo = this.#optionInfoByKey.get(key);\n if (optionInfo === undefined) {\n throw new Error(`Option not registered: ${key}`);\n }\n const result = this.#optionResultByKey.get(key);\n if (result === undefined) {\n this.#optionResultByKey.set(key, null);\n return new Array<string>();\n }\n if (result === null) {\n throw new Error(`Option already consumed: ${key}`);\n }\n this.#optionResultByKey.set(key, null);\n return result;\n }\n\n consumePositional(): string | undefined {\n while (true) {\n const arg = this.#consumeArg();\n if (arg === null) {\n return undefined;\n }\n const positional = this.#parseAsPositional(arg);\n if (positional !== null) {\n return positional;\n }\n }\n }\n\n #consumeArg(): string | null {\n const arg = this.#parsedArgs[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 #consumeOptionValue(name: string) {\n const arg = this.#consumeArg();\n if (arg === null) {\n throw new Error(`Option ${name} requires a value but none was provided`);\n }\n if (this.#parsedDouble) {\n throw new Error(`Option ${name} requires a value before --`);\n }\n // TODO - is that weird, could a valid value start with dash ?\n if (arg.startsWith(\"-\")) {\n throw new Error(`Option ${name} requires a value, got: ${arg}`);\n }\n return arg;\n }\n\n #parseAsPositional(arg: string): string | null {\n if (this.#parsedDouble) {\n return arg;\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 null;\n }\n if (arg.startsWith(\"-\")) {\n let shortIndexStart = 1;\n let shortIndexEnd = 2;\n while (shortIndexEnd <= arg.length) {\n const short = arg.slice(shortIndexStart, shortIndexEnd);\n const rest = arg.slice(shortIndexEnd);\n const result = this.#tryConsumeOptionShort(short, rest);\n if (result === true) {\n return null;\n }\n if (result === false) {\n shortIndexStart = shortIndexEnd;\n }\n shortIndexEnd++;\n }\n throw new Error(\n `Unknown flags or option: -${arg.slice(shortIndexStart)}`,\n );\n }\n return arg;\n }\n\n #consumeOptionLong(long: string, direct: string | null): void {\n const flagKey = this.#flagKeyByLong.get(long);\n if (flagKey !== undefined) {\n if (direct !== null) {\n const value = asBoolean(direct);\n if (value !== undefined) {\n return this.#acknowledgeFlag(flagKey, value);\n }\n throw new Error(`Invalid value for flag: --${long}: ${direct}`);\n }\n return this.#acknowledgeFlag(flagKey, true);\n }\n const optionKey = this.#optionKeyByLong.get(long);\n if (optionKey !== undefined) {\n if (direct !== null) {\n return this.#acknowledgeOption(optionKey, direct);\n }\n return this.#acknowledgeOption(optionKey, this.#consumeOptionValue(long));\n }\n throw new Error(`Unknown long flag or option: --${long}`);\n }\n\n #tryConsumeOptionShort(short: string, rest: string): boolean | null {\n const flagKey = this.#flagKeyByShort.get(short);\n if (flagKey !== undefined) {\n if (rest.startsWith(\"=\")) {\n const value = asBoolean(rest.slice(1));\n if (value !== undefined) {\n this.#acknowledgeFlag(flagKey, value);\n return true;\n }\n throw new Error(`Invalid value for flag: -${short}: ${rest}`);\n }\n this.#acknowledgeFlag(flagKey, true);\n return rest === \"\";\n }\n const optionKey = this.#optionKeyByShort.get(short);\n if (optionKey !== undefined) {\n if (rest === \"\") {\n this.#acknowledgeOption(optionKey, this.#consumeOptionValue(short));\n return true;\n }\n if (rest.startsWith(\"=\")) {\n this.#acknowledgeOption(optionKey, rest.slice(1));\n } else {\n this.#acknowledgeOption(optionKey, rest);\n }\n return true;\n }\n return null;\n }\n\n #acknowledgeFlag(key: string, value: boolean) {\n if (this.#flagResultByKey.has(key)) {\n throw new Error(`Flag already set: ${key}`);\n }\n this.#flagResultByKey.set(key, value);\n }\n\n #acknowledgeOption(key: string, value: string) {\n const values = this.#optionResultByKey.get(key) ?? new Array<string>();\n values.push(value);\n this.#optionResultByKey.set(key, values);\n }\n\n #ensureUniqueKey(key: string) {\n if (this.#flagInfoByKey.has(key)) {\n throw new Error(`Flag already registered: ${key}`);\n }\n if (this.#optionInfoByKey.has(key)) {\n throw new Error(`Option already registered: ${key}`);\n }\n }\n\n #ensureUniqueName(nameShortOrLong: string) {\n // TODO - overall better error handling\n // TODO - short flag overlap might be annoying here\n if (this.#flagKeyByShort.has(nameShortOrLong)) {\n throw new Error(`Flag already registered: -${nameShortOrLong}`);\n }\n if (this.#flagKeyByLong.has(nameShortOrLong)) {\n throw new Error(`Flag already registered: --${nameShortOrLong}`);\n }\n if (this.#optionKeyByShort.has(nameShortOrLong)) {\n throw new Error(`Option already registered: -${nameShortOrLong}`);\n }\n if (this.#optionKeyByLong.has(nameShortOrLong)) {\n throw new Error(`Option already registered: --${nameShortOrLong}`);\n }\n }\n}\n\nfunction asBoolean(value: string): boolean | undefined {\n const lower = value.toLowerCase();\n if (lower === \"true\" || lower === \"t\" || lower === \"y\" || lower === \"yes\") {\n return true;\n }\n if (lower === \"false\" || lower === \"f\" || lower === \"n\" || lower === \"no\") {\n return false;\n }\n return undefined;\n}\n","import { CommandUsage } from \"./Command\";\nimport { GridCell, GridRow, gridToPrintableLines } from \"./Grid\";\nimport { TypoSupport, TypoText, typoPrintableString } from \"./Typo\";\n\nexport function usageToPrintableLines(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 lines.push(\n typoPrintableString(typoSupport, {\n value: commandUsage.description,\n bold: true,\n }),\n );\n if (commandUsage.details) {\n lines.push(\n typoPrintableString(typoSupport, {\n value: commandUsage.details,\n color: \"brightBlack\",\n }),\n );\n }\n\n lines.push(\"\");\n const breadcrumbs = [\n typoPrintableString(typoSupport, {\n value: \"Usage:\",\n color: \"brightMagenta\",\n bold: true,\n }),\n typoPrintableString(typoSupport, textFixed(cliName)),\n ].concat(\n commandUsage.breadcrumbs.map((breadcrumb) => {\n if (\"argument\" in breadcrumb) {\n return typoPrintableString(typoSupport, textInput(breadcrumb.argument));\n }\n if (\"command\" in breadcrumb) {\n return typoPrintableString(typoSupport, textFixed(breadcrumb.command));\n }\n throw new Error(`Unknown breadcrumb: ${JSON.stringify(breadcrumb)}`);\n }),\n );\n lines.push(breadcrumbs.join(\" \"));\n\n if (commandUsage.arguments.length > 0) {\n lines.push(\"\");\n lines.push(typoPrintableString(typoSupport, textBlockTitle(\"Arguments:\")));\n const grid = new Array<GridRow>();\n for (const argumentUsage of commandUsage.arguments) {\n const gridRow = new Array<GridCell>();\n gridRow.push([textDelimiter()]);\n gridRow.push([textInput(argumentUsage.label)]);\n if (argumentUsage.description) {\n gridRow.push([textDelimiter()]);\n gridRow.push([textDescription(argumentUsage.description)]);\n }\n grid.push(gridRow);\n }\n lines.push(...gridToPrintableLines(grid, typoSupport));\n }\n\n if (commandUsage.subcommands.length > 0) {\n lines.push(\"\");\n lines.push(\n typoPrintableString(typoSupport, textBlockTitle(\"Subcommands:\")),\n );\n const grid = new Array<GridRow>();\n for (const subcommand of commandUsage.subcommands) {\n const gridRow = new Array<GridCell>();\n gridRow.push([textDelimiter()]);\n gridRow.push([textFixed(subcommand.name)]);\n if (subcommand.description) {\n gridRow.push([textDelimiter()]);\n gridRow.push([textDescription(subcommand.description)]);\n }\n grid.push(gridRow);\n }\n lines.push(...gridToPrintableLines(grid, typoSupport));\n }\n\n if (commandUsage.options.length > 0) {\n lines.push(\"\");\n lines.push(typoPrintableString(typoSupport, textBlockTitle(\"Options:\")));\n const grid = new Array<GridRow>();\n for (const optionUsage of commandUsage.options) {\n const gridRow = new Array<GridCell>();\n gridRow.push([textDelimiter()]);\n if (optionUsage.short) {\n gridRow.push([textFixed(`-${optionUsage.short}`), { value: \", \" }]);\n } else {\n gridRow.push([]);\n }\n if (optionUsage.label) {\n gridRow.push([\n textFixed(`--${optionUsage.long} `),\n textInput(optionUsage.label),\n ]);\n } else {\n gridRow.push([textFixed(`--${optionUsage.long}`)]);\n }\n if (optionUsage.description) {\n gridRow.push([textDelimiter()]);\n gridRow.push([textDescription(optionUsage.description)]);\n }\n grid.push(gridRow);\n }\n lines.push(...gridToPrintableLines(grid, typoSupport));\n }\n\n lines.push(\"\");\n return lines;\n}\n\nfunction textBlockTitle(text: string): TypoText {\n return { value: text, color: \"brightGreen\", bold: true };\n}\n\nfunction textDescription(text: string): TypoText {\n return { value: text };\n}\n\nfunction textFixed(text: string): TypoText {\n return { value: text, color: \"brightCyan\", bold: true };\n}\n\nfunction textInput(text: string): TypoText {\n return { value: text, color: \"brightBlue\" };\n}\n\nfunction textDelimiter(): TypoText {\n return { value: \" \" };\n}\n","import { Command, CommandInterpreter } from \"./Command\";\nimport { ReaderTokenizer } from \"./Reader\";\nimport {\n typoInferProcessSupport,\n typoPrintableString,\n TypoSupport,\n} from \"./Typo\";\nimport { usageToPrintableLines } from \"./Usage\";\n\n// TODO - add unit tests for this\n\nexport async function runAndExit<Context>(\n cliName: Lowercase<string>,\n cliArgs: Array<string>,\n context: Context,\n command: Command<Context, void>,\n application?: {\n usageOnError?: boolean | undefined;\n usageOnHelp?: boolean | undefined;\n buildVersion?: string | undefined;\n useColors?: boolean | undefined;\n onLogStdOut?: ((message: string) => void) | undefined;\n onLogStdErr?: ((message: string) => void) | undefined;\n onExit?: ((code: number) => never) | undefined;\n onError?: ((error: unknown) => void) | undefined;\n },\n): Promise<never> {\n const readerTokenizer = new ReaderTokenizer(cliArgs);\n if (application?.buildVersion) {\n readerTokenizer.registerFlag({\n key: \"version\",\n shorts: [],\n longs: [\"version\"],\n });\n }\n if (application?.usageOnHelp ?? true) {\n readerTokenizer.registerFlag({\n key: \"help\",\n shorts: [],\n longs: [\"help\"],\n });\n }\n /*\n // TODO - handle completions ?\n readerTokenizer.registerFlag({\n key: \"completion\",\n shorts: [],\n longs: [\"completion\"],\n });\n */\n const commandInterpreter = command.buildInterpreter(readerTokenizer);\n if (application?.buildVersion) {\n if (readerTokenizer.consumeFlag(\"version\")) {\n (application?.onLogStdOut ?? console.log)(\n [cliName, application.buildVersion].join(\" \"),\n );\n return (application?.onExit ?? process.exit)(0);\n }\n }\n if (application?.usageOnHelp ?? true) {\n if (readerTokenizer.consumeFlag(\"help\")) {\n (application?.onLogStdOut ?? console.log)(\n computeUsageString(cliName, commandInterpreter, application?.useColors),\n );\n return (application?.onExit ?? process.exit)(0);\n }\n }\n try {\n await commandInterpreter.execute(context);\n return (application?.onExit ?? process.exit)(0);\n } catch (error) {\n if (application?.usageOnError ?? true) {\n (application?.onLogStdErr ?? console.error)(\n computeUsageString(cliName, commandInterpreter, application?.useColors),\n );\n }\n if (application?.onError) {\n application.onError(error);\n } else {\n const typoSupport = chooseTypoSupport(application?.useColors);\n (application?.onLogStdErr ?? console.error)(\n [\n typoPrintableString(typoSupport, {\n value: \"Error:\",\n color: \"brightRed\",\n bold: true,\n }),\n typoPrintableString(typoSupport, {\n value: error instanceof Error ? error.message : String(error),\n bold: true,\n }),\n ].join(\" \"),\n );\n }\n return (application?.onExit ?? process.exit)(1);\n }\n}\n\nfunction computeUsageString<Context, Result>(\n cliName: Lowercase<string>,\n commandInterpreter: CommandInterpreter<Context, Result>,\n useColors: boolean | undefined,\n) {\n return usageToPrintableLines({\n cliName,\n commandUsage: commandInterpreter.computeUsage(),\n typoSupport: chooseTypoSupport(useColors),\n }).join(\"\\n\");\n}\n\nfunction chooseTypoSupport(useColors?: boolean): TypoSupport {\n if (useColors === undefined) {\n return typoInferProcessSupport();\n }\n return useColors ? \"tty\" : \"none\";\n}\n"],"mappings":"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","names":["index_exports","__export","ReaderTokenizer","argumentOptional","argumentRequired","argumentVariadics","command","commandWithSubcommands","execution","gridToPrintableLines","optionFlag","optionRepeatable","optionSingleValue","runAndExit","typeBigInt","typeBoolean","typeCommaList","typeCommaTuple","typeDate","typeDecode","typeNumber","typeString","typoInferProcessSupport","typoPrintableString","usageToPrintableLines","__toCommonJS","typeBoolean","value","typeDate","timestamp","typeString","typeNumber","typeBigInt","typeCommaTuple","elementTypes","elementType","parts","part","index","typeDecode","typeCommaList","type","context","error","argumentRequired","definition","label","readerPositionals","positional","typeDecode","argumentOptional","argumentVariadics","values","command","metadata","execution","readerTokenizer","computeUsage","executionUsage","argument","breadcrumbArgument","executionResolver","lastPositional","executionCallback","context","error","_context","commandWithSubcommands","subcommands","subcommandName","subcommandInput","subcommandInterpreter","subcommandUsage","breadcrumbCommand","payload","name","subcommand","value","execution","inputs","handler","optionsUsage","optionKey","optionInput","argumentsUsage","argumentInput","readerTokenizer","optionsConsumers","argumentsValues","optionsValues","context","typoPrintableString","typoSupport","typoText","colorStartCode","colorCodes","colorBoldCode","boldCode","resetCode","colorStartTag","colorEndTag","boldStartTag","boldEndTag","typoInferProcessSupport","gridToPrintableLines","grid","typoSupport","delimiter","lines","gridWidths","gridRow","gridColumnIndex","gridCell","length","gridCellLength","lineColumns","parts","text","typoPrintableString","padding","cell","optionFlag","definition","readerTokenizer","key","longs","shorts","value","optionRepeatable","label","typeDecode","optionSingleValue","values","firstValue","_parsedArgs","_parsedIndex","_parsedDouble","_flagKeyByShort","_flagKeyByLong","_flagInfoByKey","_flagResultByKey","_optionKeyByShort","_optionKeyByLong","_optionInfoByKey","_optionResultByKey","_ReaderTokenizer_instances","consumeArg_fn","consumeOptionValue_fn","parseAsPositional_fn","consumeOptionLong_fn","tryConsumeOptionShort_fn","acknowledgeFlag_fn","acknowledgeOption_fn","ensureUniqueKey_fn","ensureUniqueName_fn","ReaderTokenizer","args","__privateAdd","__privateSet","definition","__privateMethod","__privateGet","short","long","key","result","arg","positional","__privateWrapper","name","valueIndexStart","shortIndexStart","shortIndexEnd","rest","direct","flagKey","value","asBoolean","optionKey","values","nameShortOrLong","lower","usageToPrintableLines","params","cliName","commandUsage","typoSupport","lines","typoPrintableString","breadcrumbs","textFixed","breadcrumb","textInput","textBlockTitle","grid","argumentUsage","gridRow","textDelimiter","textDescription","gridToPrintableLines","subcommand","optionUsage","text","runAndExit","cliName","cliArgs","context","command","application","readerTokenizer","ReaderTokenizer","commandInterpreter","computeUsageString","error","typoSupport","chooseTypoSupport","typoPrintableString","useColors","usageToPrintableLines","typoInferProcessSupport"]}
|
package/package.json
CHANGED
package/src/lib/Argument.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ReaderPositionals } from "./Reader";
|
|
2
|
-
import { Type } from "./Type";
|
|
2
|
+
import { Type, typeDecode } from "./Type";
|
|
3
3
|
|
|
4
4
|
export type Argument<Value> = {
|
|
5
5
|
generateUsage(): ArgumentUsage;
|
|
@@ -16,21 +16,20 @@ export function argumentRequired<Value>(definition: {
|
|
|
16
16
|
type: Type<Value>;
|
|
17
17
|
label?: Uppercase<string>;
|
|
18
18
|
}): Argument<Value> {
|
|
19
|
+
const label = definition.label ?? definition.type.label;
|
|
19
20
|
return {
|
|
20
21
|
generateUsage() {
|
|
21
22
|
return {
|
|
22
23
|
description: definition.description,
|
|
23
|
-
label: `<${
|
|
24
|
+
label: `<${label}>`,
|
|
24
25
|
};
|
|
25
26
|
},
|
|
26
27
|
consumeValue(readerPositionals: ReaderPositionals) {
|
|
27
28
|
const positional = readerPositionals.consumePositional();
|
|
28
29
|
if (positional === undefined) {
|
|
29
|
-
throw new Error(
|
|
30
|
-
`Missing required arg: <${definition.label ?? definition.type.label}>`,
|
|
31
|
-
);
|
|
30
|
+
throw new Error(`Missing required arg: ${label}`);
|
|
32
31
|
}
|
|
33
|
-
return definition.type
|
|
32
|
+
return typeDecode(definition.type, label, positional);
|
|
34
33
|
},
|
|
35
34
|
};
|
|
36
35
|
}
|
|
@@ -41,11 +40,12 @@ export function argumentOptional<Value>(definition: {
|
|
|
41
40
|
label?: Uppercase<string>;
|
|
42
41
|
default: () => Value;
|
|
43
42
|
}): Argument<Value> {
|
|
43
|
+
const label = definition.label ?? definition.type.label;
|
|
44
44
|
return {
|
|
45
45
|
generateUsage() {
|
|
46
46
|
return {
|
|
47
47
|
description: definition.description,
|
|
48
|
-
label: `[${
|
|
48
|
+
label: `[${label}]`,
|
|
49
49
|
};
|
|
50
50
|
},
|
|
51
51
|
consumeValue(readerPositionals: ReaderPositionals) {
|
|
@@ -53,7 +53,7 @@ export function argumentOptional<Value>(definition: {
|
|
|
53
53
|
if (positional === undefined) {
|
|
54
54
|
return definition.default();
|
|
55
55
|
}
|
|
56
|
-
return definition.type
|
|
56
|
+
return typeDecode(definition.type, label, positional);
|
|
57
57
|
},
|
|
58
58
|
};
|
|
59
59
|
}
|
|
@@ -64,12 +64,13 @@ export function argumentVariadics<Value>(definition: {
|
|
|
64
64
|
label?: Uppercase<string>;
|
|
65
65
|
endDelimiter?: string;
|
|
66
66
|
}): Argument<Array<Value>> {
|
|
67
|
+
const label = definition.label ?? definition.type.label;
|
|
67
68
|
return {
|
|
68
69
|
generateUsage() {
|
|
69
70
|
return {
|
|
70
71
|
description: definition.description,
|
|
71
72
|
label:
|
|
72
|
-
`[${
|
|
73
|
+
`[${label}...]` +
|
|
73
74
|
(definition.endDelimiter
|
|
74
75
|
? ` (end with ${definition.endDelimiter})`
|
|
75
76
|
: ""),
|
|
@@ -85,7 +86,7 @@ export function argumentVariadics<Value>(definition: {
|
|
|
85
86
|
) {
|
|
86
87
|
break;
|
|
87
88
|
}
|
|
88
|
-
values.push(definition.type
|
|
89
|
+
values.push(typeDecode(definition.type, label, positional));
|
|
89
90
|
}
|
|
90
91
|
return values;
|
|
91
92
|
},
|
package/src/lib/Command.ts
CHANGED
|
@@ -58,7 +58,7 @@ export function command<Context, Result>(
|
|
|
58
58
|
const executionResolver = execution.createResolver(readerTokenizer);
|
|
59
59
|
const lastPositional = readerTokenizer.consumePositional();
|
|
60
60
|
if (lastPositional !== undefined) {
|
|
61
|
-
throw Error(`
|
|
61
|
+
throw Error(`Unexpected argument: ${lastPositional}`);
|
|
62
62
|
}
|
|
63
63
|
const executionCallback = executionResolver();
|
|
64
64
|
return {
|
|
@@ -93,12 +93,12 @@ export function commandWithSubcommands<Context, Payload, Result>(
|
|
|
93
93
|
const executionResolver = execution.createResolver(readerTokenizer);
|
|
94
94
|
const subcommandName = readerTokenizer.consumePositional();
|
|
95
95
|
if (subcommandName === undefined) {
|
|
96
|
-
throw new Error("
|
|
96
|
+
throw new Error("Missing required SUBCOMMAND argument");
|
|
97
97
|
}
|
|
98
98
|
const subcommandInput =
|
|
99
99
|
subcommands[subcommandName as Lowercase<string>];
|
|
100
100
|
if (subcommandInput === undefined) {
|
|
101
|
-
throw new Error(`Unknown subcommand: ${subcommandName}`);
|
|
101
|
+
throw new Error(`Unknown subcommand name: ${subcommandName}`);
|
|
102
102
|
}
|
|
103
103
|
const subcommandInterpreter =
|
|
104
104
|
subcommandInput.buildInterpreter(readerTokenizer);
|
package/src/lib/Option.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ReaderTokenizer } from "./Reader";
|
|
2
|
-
import { Type } from "./Type";
|
|
2
|
+
import { Type, typeDecode } from "./Type";
|
|
3
3
|
|
|
4
4
|
export type Option<Value> = {
|
|
5
5
|
generateUsage(): OptionUsage;
|
|
@@ -33,7 +33,9 @@ export function optionFlag(definition: {
|
|
|
33
33
|
};
|
|
34
34
|
},
|
|
35
35
|
prepareConsumer(readerTokenizer: ReaderTokenizer) {
|
|
36
|
-
const key = definition.
|
|
36
|
+
const key = definition.short
|
|
37
|
+
? `-${definition.short}, --${definition.long}`
|
|
38
|
+
: `--${definition.long}`;
|
|
37
39
|
const longs = [definition.long];
|
|
38
40
|
if (definition.aliases?.longs) {
|
|
39
41
|
longs.push(...definition.aliases?.longs);
|
|
@@ -64,6 +66,7 @@ export function optionRepeatable<Value>(definition: {
|
|
|
64
66
|
aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };
|
|
65
67
|
label?: Uppercase<string>;
|
|
66
68
|
}): Option<Array<Value>> {
|
|
69
|
+
const label = definition.label ?? definition.type.label;
|
|
67
70
|
return {
|
|
68
71
|
generateUsage() {
|
|
69
72
|
// TODO - showcase that it can be repeated ?
|
|
@@ -71,12 +74,13 @@ export function optionRepeatable<Value>(definition: {
|
|
|
71
74
|
description: definition.description,
|
|
72
75
|
long: definition.long,
|
|
73
76
|
short: definition.short,
|
|
74
|
-
label:
|
|
75
|
-
`<${definition.label ?? definition.type.label}>` as Uppercase<string>,
|
|
77
|
+
label: `<${label}>` as Uppercase<string>,
|
|
76
78
|
};
|
|
77
79
|
},
|
|
78
80
|
prepareConsumer(readerTokenizer: ReaderTokenizer) {
|
|
79
|
-
const key = definition.
|
|
81
|
+
const key = definition.short
|
|
82
|
+
? `-${definition.short}, --${definition.long}`
|
|
83
|
+
: `--${definition.long}`;
|
|
80
84
|
const longs = definition.long ? [definition.long] : [];
|
|
81
85
|
if (definition.aliases?.longs) {
|
|
82
86
|
longs.push(...definition.aliases?.longs);
|
|
@@ -87,7 +91,11 @@ export function optionRepeatable<Value>(definition: {
|
|
|
87
91
|
}
|
|
88
92
|
readerTokenizer.registerOption({ key, longs, shorts });
|
|
89
93
|
return () => {
|
|
90
|
-
return readerTokenizer
|
|
94
|
+
return readerTokenizer
|
|
95
|
+
.consumeOption(key)
|
|
96
|
+
.map((value) =>
|
|
97
|
+
typeDecode(definition.type, `${key}: ${label}`, value),
|
|
98
|
+
);
|
|
91
99
|
};
|
|
92
100
|
},
|
|
93
101
|
};
|
|
@@ -102,18 +110,20 @@ export function optionSingleValue<Value>(definition: {
|
|
|
102
110
|
label?: Uppercase<string>;
|
|
103
111
|
default: () => Value;
|
|
104
112
|
}): Option<Value> {
|
|
113
|
+
const label = definition.label ?? definition.type.label;
|
|
105
114
|
return {
|
|
106
115
|
generateUsage() {
|
|
107
116
|
return {
|
|
108
117
|
description: definition.description,
|
|
109
118
|
long: definition.long,
|
|
110
119
|
short: definition.short,
|
|
111
|
-
label:
|
|
112
|
-
`<${definition.label ?? definition.type.label}>` as Uppercase<string>,
|
|
120
|
+
label: `<${label}>` as Uppercase<string>,
|
|
113
121
|
};
|
|
114
122
|
},
|
|
115
123
|
prepareConsumer(readerTokenizer: ReaderTokenizer) {
|
|
116
|
-
const key = definition.
|
|
124
|
+
const key = definition.short
|
|
125
|
+
? `-${definition.short}, --${definition.long}`
|
|
126
|
+
: `--${definition.long}`;
|
|
117
127
|
const longs = [definition.long];
|
|
118
128
|
if (definition.aliases?.longs) {
|
|
119
129
|
longs.push(...definition.aliases?.longs);
|
|
@@ -124,18 +134,17 @@ export function optionSingleValue<Value>(definition: {
|
|
|
124
134
|
}
|
|
125
135
|
readerTokenizer.registerOption({ key, longs, shorts });
|
|
126
136
|
return () => {
|
|
127
|
-
|
|
128
|
-
const values = readerTokenizer.consumeOption(definition.long);
|
|
137
|
+
const values = readerTokenizer.consumeOption(key);
|
|
129
138
|
if (values.length > 1) {
|
|
130
139
|
throw new Error(
|
|
131
|
-
`Multiple values provided for option: ${
|
|
140
|
+
`Multiple values provided for option: ${key}, expected only one`,
|
|
132
141
|
);
|
|
133
142
|
}
|
|
134
143
|
const firstValue = values[0];
|
|
135
144
|
if (firstValue === undefined) {
|
|
136
145
|
return definition.default();
|
|
137
146
|
}
|
|
138
|
-
return definition.type
|
|
147
|
+
return typeDecode(definition.type, `${key}: ${label}`, firstValue);
|
|
139
148
|
};
|
|
140
149
|
},
|
|
141
150
|
};
|
package/src/lib/Reader.ts
CHANGED
|
@@ -71,7 +71,7 @@ export class ReaderTokenizer {
|
|
|
71
71
|
consumeFlag(key: string): boolean | undefined {
|
|
72
72
|
const flagInfo = this.#flagInfoByKey.get(key);
|
|
73
73
|
if (flagInfo === undefined) {
|
|
74
|
-
throw new Error(`
|
|
74
|
+
throw new Error(`Flag not registered: ${key}`);
|
|
75
75
|
}
|
|
76
76
|
const result = this.#flagResultByKey.get(key);
|
|
77
77
|
if (result === undefined) {
|
|
@@ -79,7 +79,7 @@ export class ReaderTokenizer {
|
|
|
79
79
|
return undefined;
|
|
80
80
|
}
|
|
81
81
|
if (result === null) {
|
|
82
|
-
throw new Error(`
|
|
82
|
+
throw new Error(`Flag already consumed: ${key}`);
|
|
83
83
|
}
|
|
84
84
|
this.#flagResultByKey.set(key, null);
|
|
85
85
|
return result;
|
|
@@ -88,7 +88,7 @@ export class ReaderTokenizer {
|
|
|
88
88
|
consumeOption(key: string): Array<string> {
|
|
89
89
|
const optionInfo = this.#optionInfoByKey.get(key);
|
|
90
90
|
if (optionInfo === undefined) {
|
|
91
|
-
throw new Error(`Option
|
|
91
|
+
throw new Error(`Option not registered: ${key}`);
|
|
92
92
|
}
|
|
93
93
|
const result = this.#optionResultByKey.get(key);
|
|
94
94
|
if (result === undefined) {
|
|
@@ -96,7 +96,7 @@ export class ReaderTokenizer {
|
|
|
96
96
|
return new Array<string>();
|
|
97
97
|
}
|
|
98
98
|
if (result === null) {
|
|
99
|
-
throw new Error(`Option
|
|
99
|
+
throw new Error(`Option already consumed: ${key}`);
|
|
100
100
|
}
|
|
101
101
|
this.#optionResultByKey.set(key, null);
|
|
102
102
|
return result;
|
|
@@ -133,7 +133,7 @@ export class ReaderTokenizer {
|
|
|
133
133
|
#consumeOptionValue(name: string) {
|
|
134
134
|
const arg = this.#consumeArg();
|
|
135
135
|
if (arg === null) {
|
|
136
|
-
throw new Error(`Option ${name} requires a value`);
|
|
136
|
+
throw new Error(`Option ${name} requires a value but none was provided`);
|
|
137
137
|
}
|
|
138
138
|
if (this.#parsedDouble) {
|
|
139
139
|
throw new Error(`Option ${name} requires a value before --`);
|
|
@@ -177,7 +177,7 @@ export class ReaderTokenizer {
|
|
|
177
177
|
shortIndexEnd++;
|
|
178
178
|
}
|
|
179
179
|
throw new Error(
|
|
180
|
-
`Unknown
|
|
180
|
+
`Unknown flags or option: -${arg.slice(shortIndexStart)}`,
|
|
181
181
|
);
|
|
182
182
|
}
|
|
183
183
|
return arg;
|
|
@@ -191,9 +191,7 @@ export class ReaderTokenizer {
|
|
|
191
191
|
if (value !== undefined) {
|
|
192
192
|
return this.#acknowledgeFlag(flagKey, value);
|
|
193
193
|
}
|
|
194
|
-
throw new Error(
|
|
195
|
-
`Invalid parameter for long flag: ${flagKey}, value: ${direct}`,
|
|
196
|
-
);
|
|
194
|
+
throw new Error(`Invalid value for flag: --${long}: ${direct}`);
|
|
197
195
|
}
|
|
198
196
|
return this.#acknowledgeFlag(flagKey, true);
|
|
199
197
|
}
|
|
@@ -204,7 +202,7 @@ export class ReaderTokenizer {
|
|
|
204
202
|
}
|
|
205
203
|
return this.#acknowledgeOption(optionKey, this.#consumeOptionValue(long));
|
|
206
204
|
}
|
|
207
|
-
throw new Error(`Unknown long flag or option:
|
|
205
|
+
throw new Error(`Unknown long flag or option: --${long}`);
|
|
208
206
|
}
|
|
209
207
|
|
|
210
208
|
#tryConsumeOptionShort(short: string, rest: string): boolean | null {
|
|
@@ -216,9 +214,7 @@ export class ReaderTokenizer {
|
|
|
216
214
|
this.#acknowledgeFlag(flagKey, value);
|
|
217
215
|
return true;
|
|
218
216
|
}
|
|
219
|
-
throw new Error(
|
|
220
|
-
`Invalid parameter for short flag: ${short}, value: ${rest}`,
|
|
221
|
-
);
|
|
217
|
+
throw new Error(`Invalid value for flag: -${short}: ${rest}`);
|
|
222
218
|
}
|
|
223
219
|
this.#acknowledgeFlag(flagKey, true);
|
|
224
220
|
return rest === "";
|
|
@@ -254,7 +250,7 @@ export class ReaderTokenizer {
|
|
|
254
250
|
|
|
255
251
|
#ensureUniqueKey(key: string) {
|
|
256
252
|
if (this.#flagInfoByKey.has(key)) {
|
|
257
|
-
throw new Error(`
|
|
253
|
+
throw new Error(`Flag already registered: ${key}`);
|
|
258
254
|
}
|
|
259
255
|
if (this.#optionInfoByKey.has(key)) {
|
|
260
256
|
throw new Error(`Option already registered: ${key}`);
|
|
@@ -265,16 +261,16 @@ export class ReaderTokenizer {
|
|
|
265
261
|
// TODO - overall better error handling
|
|
266
262
|
// TODO - short flag overlap might be annoying here
|
|
267
263
|
if (this.#flagKeyByShort.has(nameShortOrLong)) {
|
|
268
|
-
throw new Error(`
|
|
264
|
+
throw new Error(`Flag already registered: -${nameShortOrLong}`);
|
|
269
265
|
}
|
|
270
266
|
if (this.#flagKeyByLong.has(nameShortOrLong)) {
|
|
271
|
-
throw new Error(`
|
|
267
|
+
throw new Error(`Flag already registered: --${nameShortOrLong}`);
|
|
272
268
|
}
|
|
273
269
|
if (this.#optionKeyByShort.has(nameShortOrLong)) {
|
|
274
|
-
throw new Error(`Option already registered:
|
|
270
|
+
throw new Error(`Option already registered: -${nameShortOrLong}`);
|
|
275
271
|
}
|
|
276
272
|
if (this.#optionKeyByLong.has(nameShortOrLong)) {
|
|
277
|
-
throw new Error(`Option already registered:
|
|
273
|
+
throw new Error(`Option already registered: --${nameShortOrLong}`);
|
|
278
274
|
}
|
|
279
275
|
}
|
|
280
276
|
}
|
package/src/lib/Run.ts
CHANGED
|
@@ -21,8 +21,8 @@ export async function runAndExit<Context>(
|
|
|
21
21
|
useColors?: boolean | undefined;
|
|
22
22
|
onLogStdOut?: ((message: string) => void) | undefined;
|
|
23
23
|
onLogStdErr?: ((message: string) => void) | undefined;
|
|
24
|
-
onError?: ((error: unknown) => void) | undefined;
|
|
25
24
|
onExit?: ((code: number) => never) | undefined;
|
|
25
|
+
onError?: ((error: unknown) => void) | undefined;
|
|
26
26
|
},
|
|
27
27
|
): Promise<never> {
|
|
28
28
|
const readerTokenizer = new ReaderTokenizer(cliArgs);
|
|
@@ -77,15 +77,19 @@ export async function runAndExit<Context>(
|
|
|
77
77
|
if (application?.onError) {
|
|
78
78
|
application.onError(error);
|
|
79
79
|
} else {
|
|
80
|
+
const typoSupport = chooseTypoSupport(application?.useColors);
|
|
80
81
|
(application?.onLogStdErr ?? console.error)(
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
82
|
+
[
|
|
83
|
+
typoPrintableString(typoSupport, {
|
|
84
|
+
value: "Error:",
|
|
85
|
+
color: "brightRed",
|
|
86
|
+
bold: true,
|
|
87
|
+
}),
|
|
88
|
+
typoPrintableString(typoSupport, {
|
|
89
|
+
value: error instanceof Error ? error.message : String(error),
|
|
90
|
+
bold: true,
|
|
91
|
+
}),
|
|
92
|
+
].join(" "),
|
|
89
93
|
);
|
|
90
94
|
}
|
|
91
95
|
return (application?.onExit ?? process.exit)(1);
|
package/src/lib/Type.ts
CHANGED
|
@@ -65,7 +65,7 @@ export function typeCommaTuple<
|
|
|
65
65
|
);
|
|
66
66
|
}
|
|
67
67
|
return parts.map((part, index) =>
|
|
68
|
-
elementTypes[index]
|
|
68
|
+
typeDecode(elementTypes[index]!, `[${index}]`, part),
|
|
69
69
|
) as Elements;
|
|
70
70
|
},
|
|
71
71
|
};
|
|
@@ -78,7 +78,25 @@ export function typeCommaList<Value>(
|
|
|
78
78
|
label:
|
|
79
79
|
`${elementType.label}[,${elementType.label}...]` as Uppercase<string>,
|
|
80
80
|
decoder(value: string) {
|
|
81
|
-
return value
|
|
81
|
+
return value
|
|
82
|
+
.split(",")
|
|
83
|
+
.map((part, index) => typeDecode(elementType, `[${index}]`, part));
|
|
82
84
|
},
|
|
83
85
|
};
|
|
84
86
|
}
|
|
87
|
+
|
|
88
|
+
export function typeDecode<Value>(
|
|
89
|
+
type: Type<Value>,
|
|
90
|
+
context: string,
|
|
91
|
+
value: string,
|
|
92
|
+
): Value {
|
|
93
|
+
try {
|
|
94
|
+
return type.decoder(value);
|
|
95
|
+
} catch (error) {
|
|
96
|
+
throw new Error(
|
|
97
|
+
`Invalid value for ${context}: ${type.label}: ${value}, error: ${
|
|
98
|
+
error instanceof Error ? error.message : String(error)
|
|
99
|
+
}`,
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
}
|
package/src/lib/Usage.ts
CHANGED
|
@@ -12,18 +12,27 @@ export function usageToPrintableLines(params: {
|
|
|
12
12
|
const lines = new Array<string>();
|
|
13
13
|
|
|
14
14
|
lines.push(
|
|
15
|
-
typoPrintableString(typoSupport,
|
|
15
|
+
typoPrintableString(typoSupport, {
|
|
16
|
+
value: commandUsage.description,
|
|
17
|
+
bold: true,
|
|
18
|
+
}),
|
|
16
19
|
);
|
|
17
20
|
if (commandUsage.details) {
|
|
18
21
|
lines.push(
|
|
19
|
-
typoPrintableString(typoSupport,
|
|
22
|
+
typoPrintableString(typoSupport, {
|
|
23
|
+
value: commandUsage.details,
|
|
24
|
+
color: "brightBlack",
|
|
25
|
+
}),
|
|
20
26
|
);
|
|
21
27
|
}
|
|
22
28
|
|
|
23
29
|
lines.push("");
|
|
24
|
-
lines.push(typoPrintableString(typoSupport, textCategory("Usage:")));
|
|
25
30
|
const breadcrumbs = [
|
|
26
|
-
|
|
31
|
+
typoPrintableString(typoSupport, {
|
|
32
|
+
value: "Usage:",
|
|
33
|
+
color: "brightMagenta",
|
|
34
|
+
bold: true,
|
|
35
|
+
}),
|
|
27
36
|
typoPrintableString(typoSupport, textFixed(cliName)),
|
|
28
37
|
].concat(
|
|
29
38
|
commandUsage.breadcrumbs.map((breadcrumb) => {
|
|
@@ -40,7 +49,7 @@ export function usageToPrintableLines(params: {
|
|
|
40
49
|
|
|
41
50
|
if (commandUsage.arguments.length > 0) {
|
|
42
51
|
lines.push("");
|
|
43
|
-
lines.push(typoPrintableString(typoSupport,
|
|
52
|
+
lines.push(typoPrintableString(typoSupport, textBlockTitle("Arguments:")));
|
|
44
53
|
const grid = new Array<GridRow>();
|
|
45
54
|
for (const argumentUsage of commandUsage.arguments) {
|
|
46
55
|
const gridRow = new Array<GridCell>();
|
|
@@ -57,7 +66,9 @@ export function usageToPrintableLines(params: {
|
|
|
57
66
|
|
|
58
67
|
if (commandUsage.subcommands.length > 0) {
|
|
59
68
|
lines.push("");
|
|
60
|
-
lines.push(
|
|
69
|
+
lines.push(
|
|
70
|
+
typoPrintableString(typoSupport, textBlockTitle("Subcommands:")),
|
|
71
|
+
);
|
|
61
72
|
const grid = new Array<GridRow>();
|
|
62
73
|
for (const subcommand of commandUsage.subcommands) {
|
|
63
74
|
const gridRow = new Array<GridCell>();
|
|
@@ -74,7 +85,7 @@ export function usageToPrintableLines(params: {
|
|
|
74
85
|
|
|
75
86
|
if (commandUsage.options.length > 0) {
|
|
76
87
|
lines.push("");
|
|
77
|
-
lines.push(typoPrintableString(typoSupport,
|
|
88
|
+
lines.push(typoPrintableString(typoSupport, textBlockTitle("Options:")));
|
|
78
89
|
const grid = new Array<GridRow>();
|
|
79
90
|
for (const optionUsage of commandUsage.options) {
|
|
80
91
|
const gridRow = new Array<GridCell>();
|
|
@@ -105,16 +116,12 @@ export function usageToPrintableLines(params: {
|
|
|
105
116
|
return lines;
|
|
106
117
|
}
|
|
107
118
|
|
|
108
|
-
function
|
|
119
|
+
function textBlockTitle(text: string): TypoText {
|
|
109
120
|
return { value: text, color: "brightGreen", bold: true };
|
|
110
121
|
}
|
|
111
122
|
|
|
112
123
|
function textDescription(text: string): TypoText {
|
|
113
|
-
return { value: text
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
function textDetails(text: string): TypoText {
|
|
117
|
-
return { value: text, color: "brightBlack" };
|
|
124
|
+
return { value: text };
|
|
118
125
|
}
|
|
119
126
|
|
|
120
127
|
function textFixed(text: string): TypoText {
|
|
@@ -137,26 +137,25 @@ const cmd = commandWithSubcommands<string, any, any>(
|
|
|
137
137
|
|
|
138
138
|
it("run", async () => {
|
|
139
139
|
const usage1 = await getUsage([], cmd);
|
|
140
|
-
// console.log(usage1.join("
|
|
140
|
+
// console.log(usage1.join("\n"));
|
|
141
141
|
expect(usage1).toStrictEqual([
|
|
142
142
|
"{Root command description}+",
|
|
143
143
|
"{Root command details. Second line of root command details.}@brightBlack",
|
|
144
144
|
"",
|
|
145
|
-
"{Usage:}@
|
|
146
|
-
" {my-cli}@brightCyan+ {<POS-1>}@brightBlue {<POS-2>}@brightBlue {<SUBCOMMAND>}@brightCyan+",
|
|
145
|
+
"{Usage:}@brightMagenta+ {my-cli}@brightCyan+ {<POS-1>}@brightBlue {<POS-2>}@brightBlue {<SUBCOMMAND>}@brightCyan+",
|
|
147
146
|
"",
|
|
148
147
|
"{Arguments:}@brightGreen+",
|
|
149
|
-
"{ }{<POS-1>}@brightBlue{ }{First positional argument}
|
|
150
|
-
"{ }{<POS-2>}@brightBlue{ }{Second positional argument}
|
|
148
|
+
"{ }{<POS-1>}@brightBlue{ }{First positional argument}",
|
|
149
|
+
"{ }{<POS-2>}@brightBlue{ }{Second positional argument}",
|
|
151
150
|
"",
|
|
152
151
|
"{Subcommands:}@brightGreen+",
|
|
153
|
-
"{ }{sub1}@brightCyan+{ }{Subcommand 1 description}
|
|
154
|
-
"{ }{sub2}@brightCyan+{ }{Subcommand 2 description}
|
|
152
|
+
"{ }{sub1}@brightCyan+{ }{Subcommand 1 description}",
|
|
153
|
+
"{ }{sub2}@brightCyan+{ }{Subcommand 2 description}",
|
|
155
154
|
"",
|
|
156
155
|
"{Options:}@brightGreen+",
|
|
157
|
-
"{ }{-b}@brightCyan+{, }{--boolean-flag}@brightCyan+ { }{Root boolean-flag description}
|
|
158
|
-
"{ }{-s}@brightCyan+{, }{--string-option }@brightCyan+{<COOL-STUFF>}@brightBlue { }{Root string-option description}
|
|
159
|
-
"{ } {--complex-option }@brightCyan+{<NUMBER,STRING[,STRING...]>}@brightBlue{ }{Root complex-option description}
|
|
156
|
+
"{ }{-b}@brightCyan+{, }{--boolean-flag}@brightCyan+ { }{Root boolean-flag description}",
|
|
157
|
+
"{ }{-s}@brightCyan+{, }{--string-option }@brightCyan+{<COOL-STUFF>}@brightBlue { }{Root string-option description}",
|
|
158
|
+
"{ } {--complex-option }@brightCyan+{<NUMBER,STRING[,STRING...]>}@brightBlue{ }{Root complex-option description}",
|
|
160
159
|
"",
|
|
161
160
|
]);
|
|
162
161
|
|
|
@@ -165,18 +164,17 @@ it("run", async () => {
|
|
|
165
164
|
"{Subcommand 1 description}+",
|
|
166
165
|
"{Subcommand 1 details. Second line of subcommand 1 details.}@brightBlack",
|
|
167
166
|
"",
|
|
168
|
-
"{Usage:}@
|
|
169
|
-
" {my-cli}@brightCyan+ {<POS-1>}@brightBlue {<POS-2>}@brightBlue {sub1}@brightCyan+ {<POS-STRING>}@brightBlue",
|
|
167
|
+
"{Usage:}@brightMagenta+ {my-cli}@brightCyan+ {<POS-1>}@brightBlue {<POS-2>}@brightBlue {sub1}@brightCyan+ {<POS-STRING>}@brightBlue",
|
|
170
168
|
"",
|
|
171
169
|
"{Arguments:}@brightGreen+",
|
|
172
|
-
"{ }{<POS-1>}@brightBlue { }{First positional argument}
|
|
173
|
-
"{ }{<POS-2>}@brightBlue { }{Second positional argument}
|
|
174
|
-
"{ }{<POS-STRING>}@brightBlue{ }{Positional string argument}
|
|
170
|
+
"{ }{<POS-1>}@brightBlue { }{First positional argument}",
|
|
171
|
+
"{ }{<POS-2>}@brightBlue { }{Second positional argument}",
|
|
172
|
+
"{ }{<POS-STRING>}@brightBlue{ }{Positional string argument}",
|
|
175
173
|
"",
|
|
176
174
|
"{Options:}@brightGreen+",
|
|
177
|
-
"{ }{-b}@brightCyan+{, }{--boolean-flag}@brightCyan+ { }{Root boolean-flag description}
|
|
178
|
-
"{ }{-s}@brightCyan+{, }{--string-option }@brightCyan+{<COOL-STUFF>}@brightBlue { }{Root string-option description}
|
|
179
|
-
"{ } {--complex-option }@brightCyan+{<NUMBER,STRING[,STRING...]>}@brightBlue{ }{Root complex-option description}
|
|
175
|
+
"{ }{-b}@brightCyan+{, }{--boolean-flag}@brightCyan+ { }{Root boolean-flag description}",
|
|
176
|
+
"{ }{-s}@brightCyan+{, }{--string-option }@brightCyan+{<COOL-STUFF>}@brightBlue { }{Root string-option description}",
|
|
177
|
+
"{ } {--complex-option }@brightCyan+{<NUMBER,STRING[,STRING...]>}@brightBlue{ }{Root complex-option description}",
|
|
180
178
|
"",
|
|
181
179
|
]);
|
|
182
180
|
|
|
@@ -201,21 +199,20 @@ it("run", async () => {
|
|
|
201
199
|
"{Subcommand 2 description}+",
|
|
202
200
|
"{Subcommand 2 details. Second line of subcommand 2 details.}@brightBlack",
|
|
203
201
|
"",
|
|
204
|
-
"{Usage:}@
|
|
205
|
-
" {my-cli}@brightCyan+ {<POS-1>}@brightBlue {<POS-2>}@brightBlue {sub2}@brightCyan+ {<POS-NUMBER>}@brightBlue {[OPT-POS]}@brightBlue {[VARIADIC...]}@brightBlue",
|
|
202
|
+
"{Usage:}@brightMagenta+ {my-cli}@brightCyan+ {<POS-1>}@brightBlue {<POS-2>}@brightBlue {sub2}@brightCyan+ {<POS-NUMBER>}@brightBlue {[OPT-POS]}@brightBlue {[VARIADIC...]}@brightBlue",
|
|
206
203
|
"",
|
|
207
204
|
"{Arguments:}@brightGreen+",
|
|
208
|
-
"{ }{<POS-1>}@brightBlue { }{First positional argument}
|
|
209
|
-
"{ }{<POS-2>}@brightBlue { }{Second positional argument}
|
|
210
|
-
"{ }{<POS-NUMBER>}@brightBlue { }{Positional number argument}
|
|
211
|
-
"{ }{[OPT-POS]}@brightBlue { }{Optional positional argument}
|
|
212
|
-
"{ }{[VARIADIC...]}@brightBlue{ }{Variadic positional arguments}
|
|
205
|
+
"{ }{<POS-1>}@brightBlue { }{First positional argument}",
|
|
206
|
+
"{ }{<POS-2>}@brightBlue { }{Second positional argument}",
|
|
207
|
+
"{ }{<POS-NUMBER>}@brightBlue { }{Positional number argument}",
|
|
208
|
+
"{ }{[OPT-POS]}@brightBlue { }{Optional positional argument}",
|
|
209
|
+
"{ }{[VARIADIC...]}@brightBlue{ }{Variadic positional arguments}",
|
|
213
210
|
"",
|
|
214
211
|
"{Options:}@brightGreen+",
|
|
215
|
-
"{ }{-b}@brightCyan+{, }{--boolean-flag}@brightCyan+ { }{Root boolean-flag description}
|
|
216
|
-
"{ }{-s}@brightCyan+{, }{--string-option }@brightCyan+{<COOL-STUFF>}@brightBlue { }{Root string-option description}
|
|
217
|
-
"{ } {--complex-option }@brightCyan+{<NUMBER,STRING[,STRING...]>}@brightBlue{ }{Root complex-option description}
|
|
218
|
-
"{ } {--dudu }@brightCyan+{<STRING>}@brightBlue { }{Dudu option description}
|
|
212
|
+
"{ }{-b}@brightCyan+{, }{--boolean-flag}@brightCyan+ { }{Root boolean-flag description}",
|
|
213
|
+
"{ }{-s}@brightCyan+{, }{--string-option }@brightCyan+{<COOL-STUFF>}@brightBlue { }{Root string-option description}",
|
|
214
|
+
"{ } {--complex-option }@brightCyan+{<NUMBER,STRING[,STRING...]>}@brightBlue{ }{Root complex-option description}",
|
|
215
|
+
"{ } {--dudu }@brightCyan+{<STRING>}@brightBlue { }{Dudu option description}",
|
|
219
216
|
"",
|
|
220
217
|
]);
|
|
221
218
|
});
|