cli-kiss 0.0.11 → 0.0.12
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 +5 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/lib/Command.ts +2 -2
- package/src/lib/Option.ts +7 -9
- package/src/lib/Run.ts +26 -29
- package/src/lib/Typo.ts +55 -15
- package/src/lib/Usage.ts +52 -35
- package/tests/unit.command.usage.ts +37 -36
package/dist/index.d.ts
CHANGED
|
@@ -172,8 +172,12 @@ type TypoSupport = "none" | "tty" | "mock";
|
|
|
172
172
|
type TypoColor = "darkBlack" | "darkRed" | "darkGreen" | "darkYellow" | "darkBlue" | "darkMagenta" | "darkCyan" | "darkWhite" | "brightBlack" | "brightRed" | "brightGreen" | "brightYellow" | "brightBlue" | "brightMagenta" | "brightCyan" | "brightWhite";
|
|
173
173
|
type TypoText = {
|
|
174
174
|
value: string;
|
|
175
|
-
|
|
175
|
+
foregroundColor?: TypoColor;
|
|
176
|
+
backgroundColor?: TypoColor;
|
|
176
177
|
bold?: boolean;
|
|
178
|
+
italic?: boolean;
|
|
179
|
+
underline?: boolean;
|
|
180
|
+
strikethrough?: boolean;
|
|
177
181
|
};
|
|
178
182
|
declare function typoPrintableString(typoSupport: TypoSupport, typoText: TypoText): string;
|
|
179
183
|
declare function typoInferProcessSupport(): TypoSupport;
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
"use strict";var L=Object.defineProperty;var se=Object.getOwnPropertyDescriptor;var ae=Object.getOwnPropertyNames;var ue=Object.prototype.hasOwnProperty;var J=r=>{throw TypeError(r)};var ie=(r,e)=>{for(var t in e)L(r,t,{get:e[t],enumerable:!0})},le=(r,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of ae(e))!ue.call(r,n)&&n!==t&&L(r,n,{get:()=>e[n],enumerable:!(o=se(e,n))||o.enumerable});return r};var pe=r=>le(L({},"__esModule",{value:!0}),r);var D=(r,e,t)=>e.has(r)||J("Cannot "+t);var l=(r,e,t)=>(D(r,e,"read from private field"),t?t.call(r):e.get(r)),m=(r,e,t)=>e.has(r)?J("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 z=(r,e,t,o)=>({set _(n){d(r,e,n,t)},get _(){return l(r,e,o)}});var Fe={};ie(Fe,{ReaderArgs:()=>S,argumentOptional:()=>xe,argumentRequired:()=>be,argumentVariadics:()=>we,command:()=>Ce,commandWithSubcommands:()=>Ie,execution:()=>Ue,gridToPrintableLines:()=>F,optionFlag:()=>Re,optionRepeatable:()=>Oe,optionSingleValue:()=>ve,runAndExit:()=>Ve,typeBigInt:()=>he,typeBoolean:()=>ge,typeCommaList:()=>fe,typeCommaTuple:()=>ye,typeDate:()=>ce,typeDecode:()=>y,typeNumber:()=>me,typeString:()=>de,typoInferProcessSupport:()=>K,typoPrintableString:()=>c,usageToPrintableLines:()=>H});module.exports=pe(Fe);var ge={label:"BOOLEAN",decoder(r){if(r==="true")return!0;if(r==="false")return!1;throw new Error(`Invalid boolean: ${r} (expected: "true"|"false")`)}},ce={label:"DATE",decoder(r){let e=Date.parse(r);if(isNaN(e))throw new Error(`Invalid date: ${r} (expected: ISO_8601 format)`);return new Date(e)}},de={label:"STRING",decoder(r){return r}},me={label:"NUMBER",decoder(r){return Number(r)}},he={label:"BIGINT",decoder(r){return BigInt(r)}};function ye(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} comma-separated parts`);return t.map((o,n)=>y(r[n],o,`[${n}].${r[n].label}`))}}}function fe(r){return{label:`${r.label}[,${r.label}...]`,decoder(e){return e.split(",").map((t,o)=>y(r,t,`[${o}].${r.label}`))}}}function y(r,e,t){try{return r.decoder(e)}catch(o){throw new Error(`Failed to decode value "${e}" for ${t}: ${o instanceof Error?o.message:String(o)}`)}}function be(r){let e=r.label??r.type.label;return{generateUsage(){return{description:r.description,label:`<${e}>`}},consumeValue(t){let o=t.consumePositional();if(o===void 0)throw new Error(`Missing required argument: ${e}`);return y(r.type,o,e)}}}function xe(r){let e=r.label??r.type.label;return{generateUsage(){return{description:r.description,label:`[${e}]`}},consumeValue(t){let o=t.consumePositional();return o===void 0?r.default():y(r.type,o,e)}}}function we(r){let e=r.label??r.type.label;return{generateUsage(){return{description:r.description,label:`[${e}]...`+(r.endDelimiter?`["${r.endDelimiter}"]`:"")}},consumeValue(t){let o=[];for(;;){let n=t.consumePositional();if(n===void 0||n===r.endDelimiter)break;o.push(y(r.type,n,e))}return o}}}function Ce(r,e){return{getDescription(){return r.description},createInterpreterFactory(t){function o(){let n=e.generateUsage();return{metadata:r,breadcrumbs:n.arguments.map(s=>G(s.label)),options:n.options,arguments:n.arguments,subcommands:[]}}try{let n=e.createInterpreterFactory(t);return{generateUsage:o,createInterpreterInstance(){let s=t.consumePositional();if(s!==void 0)throw Error(`Unexpected argument: "${s}"`);let a=n.createInterpreterInstance();return{async executeWithContext(u){return a.executeWithContext(u)}}}}}catch(n){return{generateUsage:o,createInterpreterInstance(){throw n}}}}}}function Ie(r,e,t){return{getDescription(){return r.description},createInterpreterFactory(o){try{let n=e.createInterpreterFactory(o),s=o.consumePositional();if(s===void 0)throw new Error("Missing required argument: SUBCOMMAND");let a=t[s];if(a===void 0)throw new Error(`Invalid SUBCOMMAND: "${s}"`);let u=a.createInterpreterFactory(o);return{generateUsage(){let i=e.generateUsage(),h=u.generateUsage();return{metadata:h.metadata,breadcrumbs:i.arguments.map(w=>G(w.label)).concat([Q(s)]).concat(h.breadcrumbs),options:i.options.concat(h.options),arguments:i.arguments.concat(h.arguments),subcommands:h.subcommands}},createInterpreterInstance(){let i=n.createInterpreterInstance(),h=u.createInterpreterInstance();return{async executeWithContext(w){let k=await i.executeWithContext(w);return await h.executeWithContext(k)}}}}}catch(n){return{generateUsage(){let s=e.generateUsage();return{metadata:r,breadcrumbs:s.arguments.map(a=>G(a.label)).concat([Q("<SUBCOMMAND>")]),options:s.options,arguments:s.arguments,subcommands:Object.entries(t).map(([a,u])=>({name:a,description:u.getDescription()}))}},createInterpreterInstance(){throw n}}}}}}function G(r){return{argument:r}}function Q(r){return{command:r}}function Ue(r,e){return{generateUsage(){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}},createInterpreterFactory(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{createInterpreterInstance(){let s={};for(let a in o)s[a]=o[a]();return{executeWithContext(a){return e(a,{options:s,arguments:n})}}}}}}}function c(r,e){if(r==="none")return e.value;if(r==="tty"){let t=e.color?Ee[e.color]:"",o=e.bold?$e:"";return`${t}${o}${e.value}${Ae}`}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 K(){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 Ae="\x1B[0m",$e="\x1B[1m",Ee={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 F(r,e,t=""){let o=new Array,n=new Array;for(let s of r)for(let a=0;a<s.length;a++){let u=s[a],i=X(u);(n[a]===void 0||i>n[a])&&(n[a]=i)}for(let s of r){let a=new Array;for(let u=0;u<s.length;u++){let i=s[u],h=i.map(w=>c(e,w));if(u<s.length-1){let w=X(i),k=" ".repeat(n[u]-w);a.push(h.join("")+k)}else a.push(h.join(""))}o.push(a.join(t))}return o}function X(r){let e=0;for(let t of r)e+=t.value.length;return e}function Re(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}`,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 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 o=r.short?`-${r.short}, --${r.long}`:`--${r.long}`,n=r.long?[r.long]:[];r.aliases?.longs&&n.push(...r.aliases?.longs);let s=r.short?[r.short]:[];return r.aliases?.shorts&&s.push(...r.aliases?.shorts),t.registerOption({key:o,longs:n,shorts:s}),()=>t.consumeOption(o).map(a=>y(r.type,a,`${o}: ${e}`))}}}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 o=r.short?`-${r.short}, --${r.long}`:`--${r.long}`,n=[r.long];r.aliases?.longs&&n.push(...r.aliases?.longs);let s=r.short?[r.short]:[];return r.aliases?.shorts&&s.push(...r.aliases?.shorts),t.registerOption({key:o,longs:n,shorts:s}),()=>{let a=t.consumeOption(o);if(a.length>1)throw new Error(`Multiple values provided for option: ${o}, expected only one. Found: ${a.map(i=>`"${i}"`).join(", ")}`);let u=a[0];return u===void 0?r.default():y(r.type,u,`${o}: ${e}`)}}}}var B,O,x,C,I,U,f,A,$,E,b,p,P,W,re,N,te,T,R,j,M,S=class{constructor(e){m(this,p);m(this,B);m(this,O);m(this,x);m(this,C);m(this,I);m(this,U);m(this,f);m(this,A);m(this,$);m(this,E);m(this,b);d(this,B,e),d(this,O,0),d(this,x,!1),d(this,C,new Map),d(this,I,new Map),d(this,U,new Map),d(this,f,new Map),d(this,A,new Map),d(this,$,new Map),d(this,E,new Map),d(this,b,new Map)}registerFlag(e){g(this,p,j).call(this,e.key),l(this,U).set(e.key,{});for(let t of e.shorts)g(this,p,M).call(this,t),l(this,C).set(t,e.key);for(let t of e.longs)g(this,p,M).call(this,t),l(this,I).set(t,e.key)}registerOption(e){g(this,p,j).call(this,e.key),l(this,E).set(e.key,{});for(let t of e.shorts)g(this,p,M).call(this,t),l(this,A).set(t,e.key);for(let t of e.longs)g(this,p,M).call(this,t),l(this,$).set(t,e.key)}consumeFlag(e){if(l(this,U).get(e)===void 0)throw new Error(`Flag not registered: ${e}`);let o=l(this,f).get(e);if(o===void 0){l(this,f).set(e,null);return}if(o===null)throw new Error(`Flag already consumed: ${e}`);return l(this,f).set(e,null),o}consumeOption(e){if(l(this,E).get(e)===void 0)throw new Error(`Option not registered: ${e}`);let o=l(this,b).get(e);if(o===void 0)return l(this,b).set(e,null),new Array;if(o===null)throw new Error(`Option already consumed: ${e}`);return l(this,b).set(e,null),o}consumePositional(){for(;;){let e=g(this,p,P).call(this);if(e===null)return;let t=g(this,p,re).call(this,e);if(t!==null)return t}}};B=new WeakMap,O=new WeakMap,x=new WeakMap,C=new WeakMap,I=new WeakMap,U=new WeakMap,f=new WeakMap,A=new WeakMap,$=new WeakMap,E=new WeakMap,b=new WeakMap,p=new WeakSet,P=function(){let e=l(this,B)[l(this,O)];return e===void 0?null:(z(this,O)._++,!l(this,x)&&e==="--"?(d(this,x,!0),g(this,p,P).call(this)):e)},W=function(e){let t=g(this,p,P).call(this);if(t===null)throw new Error(`Option ${e} requires a value but none was provided`);if(l(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},re=function(e){if(l(this,x))return e;if(e.startsWith("--")){let t=e.indexOf("=");return t===-1?g(this,p,N).call(this,e.slice(2),null):g(this,p,N).call(this,e.slice(2,t),e.slice(t+1)),null}if(e.startsWith("-")){let t=1,o=2;for(;o<=e.length;){let s=e.slice(t,o),a=e.slice(o),u=g(this,p,te).call(this,s,a);if(u===!0)return null;u===!1&&(t=o),o++}let n=e.slice(t);throw new Error(`Unknown flag or option: -${n}`)}return e},N=function(e,t){let o=l(this,I).get(e);if(o!==void 0){if(t!==null){let s=ee.get(t.toLowerCase());if(s!==void 0)return g(this,p,T).call(this,o,s);throw new Error(`Invalid value for flag: --${e}: "${t}" (expected: ${Z})`)}return g(this,p,T).call(this,o,!0)}let n=l(this,$).get(e);if(n!==void 0)return t!==null?g(this,p,R).call(this,n,t):g(this,p,R).call(this,n,g(this,p,W).call(this,`--${e}`));throw new Error(`Unknown flag or option: --${e}`)},te=function(e,t){let o=l(this,C).get(e);if(o!==void 0){if(t.startsWith("=")){let s=ee.get(t.slice(1).toLowerCase());if(s!==void 0)return g(this,p,T).call(this,o,s),!0;throw new Error(`Invalid value for flag: -${e}: "${t}" (expected: ${Z})`)}return g(this,p,T).call(this,o,!0),t===""}let n=l(this,A).get(e);return n!==void 0?t===""?(g(this,p,R).call(this,n,g(this,p,W).call(this,`-${e}`)),!0):(t.startsWith("=")?g(this,p,R).call(this,n,t.slice(1)):g(this,p,R).call(this,n,t),!0):null},T=function(e,t){if(l(this,f).has(e))throw new Error(`Flag already set: ${e}`);l(this,f).set(e,t)},R=function(e,t){let o=l(this,b).get(e)??new Array;o.push(t),l(this,b).set(e,o)},j=function(e){if(l(this,U).has(e))throw new Error(`Flag already registered: ${e}`);if(l(this,E).has(e))throw new Error(`Option already registered: ${e}`)},M=function(e){if(l(this,C).has(e))throw new Error(`Flag already registered: -${e}`);if(l(this,I).has(e))throw new Error(`Flag already registered: --${e}`);if(l(this,A).has(e))throw new Error(`Option already registered: -${e}`);if(l(this,$).has(e))throw new Error(`Option already registered: --${e}`)};var Z='"yes"|"no"',ee=new Map([["true",!0],["false",!1],["yes",!0],["no",!1],["t",!0],["f",!1],["y",!0],["n",!1]]);function H(r){let{cliName:e,commandUsage:t,typoSupport:o}=r,n=new Array;n.push(c(o,{value:t.metadata.description,bold:!0})),t.metadata.details&&n.push(c(o,{value:t.metadata.details,color:"brightBlack"})),n.push("");let s=[c(o,{value:"Usage:",color:"brightMagenta",bold:!0}),c(o,v(e))].concat(t.breadcrumbs.map(a=>{if("argument"in a)return c(o,_(a.argument));if("command"in a)return c(o,v(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,q("Arguments:")));let a=new Array;for(let u of t.arguments){let i=new Array;i.push([V()]),i.push([_(u.label)]),u.description&&(i.push([V()]),i.push([Y(u.description)])),a.push(i)}n.push(...F(a,o))}if(t.subcommands.length>0){n.push(""),n.push(c(o,q("Subcommands:")));let a=new Array;for(let u of t.subcommands){let i=new Array;i.push([V()]),i.push([v(u.name)]),u.description&&(i.push([V()]),i.push([Y(u.description)])),a.push(i)}n.push(...F(a,o))}if(t.options.length>0){n.push(""),n.push(c(o,q("Options:")));let a=new Array;for(let u of t.options){let i=new Array;i.push([V()]),u.short?i.push([v(`-${u.short}`),{value:", "}]):i.push([]),u.label?i.push([v(`--${u.long} `),_(u.label)]):i.push([v(`--${u.long}`)]),u.description&&(i.push([V()]),i.push([Y(u.description)])),a.push(i)}n.push(...F(a,o))}return n.push(""),n}function q(r){return{value:r,color:"brightGreen",bold:!0}}function Y(r){return{value:r}}function v(r){return{value:r,color:"brightCyan",bold:!0}}function _(r){return{value:r,color:"brightBlue"}}function V(){return{value:" "}}async function Ve(r,e,t,o,n){let s=new S(e);n?.buildVersion&&s.registerFlag({key:"version",shorts:[],longs:["version"]}),(n?.usageOnHelp??!0)&&s.registerFlag({key:"help",shorts:[],longs:["help"]});let a=o.createInterpreterFactory(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)(ne(r,a,n?.useColors)),(n?.onExit??process.exit)(0);try{let u=a.createInterpreterInstance();try{return await u.executeWithContext(t),(n?.onExit??process.exit)(0)}catch(i){return n?.onError&&n.onError(i),(n?.onExit??process.exit)(1)}}catch(u){if((n?.usageOnError??!0)&&(n?.onLogStdErr??console.error)(ne(r,a,n?.useColors)),n?.onError)n.onError(u);else{let i=oe(n?.useColors);(n?.onLogStdErr??console.error)([c(i,{value:"Error:",color:"brightRed",bold:!0}),c(i,{value:u instanceof Error?u.message:String(u),bold:!0})].join(" "))}return(n?.onExit??process.exit)(1)}}function ne(r,e,t){return H({cliName:r,commandUsage:e.generateUsage(),typoSupport:oe(t)}).join(`
|
|
2
|
-
`)}function
|
|
1
|
+
"use strict";var L=Object.defineProperty;var ae=Object.getOwnPropertyDescriptor;var ie=Object.getOwnPropertyNames;var ue=Object.prototype.hasOwnProperty;var z=r=>{throw TypeError(r)};var le=(r,e)=>{for(var t in e)L(r,t,{get:e[t],enumerable:!0})},ge=(r,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of ie(e))!ue.call(r,n)&&n!==t&&L(r,n,{get:()=>e[n],enumerable:!(o=ae(e,n))||o.enumerable});return r};var pe=r=>ge(L({},"__esModule",{value:!0}),r);var G=(r,e,t)=>e.has(r)||z("Cannot "+t);var l=(r,e,t)=>(G(r,e,"read from private field"),t?t.call(r):e.get(r)),m=(r,e,t)=>e.has(r)?z("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(r):e.set(r,t),d=(r,e,t,o)=>(G(r,e,"write to private field"),o?o.call(r,t):e.set(r,t),t),p=(r,e,t)=>(G(r,e,"access private method"),t);var Q=(r,e,t,o)=>({set _(n){d(r,e,n,t)},get _(){return l(r,e,o)}});var Ke={};le(Ke,{ReaderArgs:()=>P,argumentOptional:()=>Ce,argumentRequired:()=>xe,argumentVariadics:()=>we,command:()=>Ie,commandWithSubcommands:()=>Ue,execution:()=>Ae,gridToPrintableLines:()=>v,optionFlag:()=>Te,optionRepeatable:()=>Fe,optionSingleValue:()=>Pe,runAndExit:()=>Le,typeBigInt:()=>fe,typeBoolean:()=>ce,typeCommaList:()=>be,typeCommaTuple:()=>ye,typeDate:()=>de,typeDecode:()=>f,typeNumber:()=>he,typeString:()=>me,typoInferProcessSupport:()=>W,typoPrintableString:()=>c,usageToPrintableLines:()=>J});module.exports=pe(Ke);var ce={label:"BOOLEAN",decoder(r){if(r==="true")return!0;if(r==="false")return!1;throw new Error(`Invalid boolean: ${r} (expected: "true"|"false")`)}},de={label:"DATE",decoder(r){let e=Date.parse(r);if(isNaN(e))throw new Error(`Invalid date: ${r} (expected: ISO_8601 format)`);return new Date(e)}},me={label:"STRING",decoder(r){return r}},he={label:"NUMBER",decoder(r){return Number(r)}},fe={label:"BIGINT",decoder(r){return BigInt(r)}};function ye(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} comma-separated parts`);return t.map((o,n)=>f(r[n],o,`[${n}].${r[n].label}`))}}}function be(r){return{label:`${r.label}[,${r.label}...]`,decoder(e){return e.split(",").map((t,o)=>f(r,t,`[${o}].${r.label}`))}}}function f(r,e,t){try{return r.decoder(e)}catch(o){throw new Error(`Failed to decode value "${e}" for ${t}: ${o instanceof Error?o.message:String(o)}`)}}function xe(r){let e=r.label??r.type.label;return{generateUsage(){return{description:r.description,label:`<${e}>`}},consumeValue(t){let o=t.consumePositional();if(o===void 0)throw new Error(`Missing required argument: ${e}`);return f(r.type,o,e)}}}function Ce(r){let e=r.label??r.type.label;return{generateUsage(){return{description:r.description,label:`[${e}]`}},consumeValue(t){let o=t.consumePositional();return o===void 0?r.default():f(r.type,o,e)}}}function we(r){let e=r.label??r.type.label;return{generateUsage(){return{description:r.description,label:`[${e}]...`+(r.endDelimiter?`["${r.endDelimiter}"]`:"")}},consumeValue(t){let o=[];for(;;){let n=t.consumePositional();if(n===void 0||n===r.endDelimiter)break;o.push(f(r.type,n,e))}return o}}}function Ie(r,e){return{getDescription(){return r.description},createInterpreterFactory(t){function o(){let n=e.generateUsage();return{metadata:r,breadcrumbs:n.arguments.map(s=>K(s.label)),options:n.options,arguments:n.arguments,subcommands:[]}}try{let n=e.createInterpreterFactory(t);return{generateUsage:o,createInterpreterInstance(){let s=t.consumePositional();if(s!==void 0)throw Error(`Unexpected argument: "${s}"`);let a=n.createInterpreterInstance();return{async executeWithContext(i){return a.executeWithContext(i)}}}}}catch(n){return{generateUsage:o,createInterpreterInstance(){throw n}}}}}}function Ue(r,e,t){return{getDescription(){return r.description},createInterpreterFactory(o){try{let n=e.createInterpreterFactory(o),s=o.consumePositional();if(s===void 0)throw new Error("Missing required argument: SUBCOMMAND");let a=t[s];if(a===void 0)throw new Error(`Invalid SUBCOMMAND: "${s}"`);let i=a.createInterpreterFactory(o);return{generateUsage(){let u=e.generateUsage(),h=i.generateUsage();return{metadata:h.metadata,breadcrumbs:u.arguments.map(C=>K(C.label)).concat([X(s)]).concat(h.breadcrumbs),options:u.options.concat(h.options),arguments:u.arguments.concat(h.arguments),subcommands:h.subcommands}},createInterpreterInstance(){let u=i.createInterpreterInstance(),h=n.createInterpreterInstance();return{async executeWithContext(C){let S=await h.executeWithContext(C);return await u.executeWithContext(S)}}}}}catch(n){return{generateUsage(){let s=e.generateUsage();return{metadata:r,breadcrumbs:s.arguments.map(a=>K(a.label)).concat([X("<SUBCOMMAND>")]),options:s.options,arguments:s.arguments,subcommands:Object.entries(t).map(([a,i])=>({name:a,description:i.getDescription()}))}},createInterpreterInstance(){throw n}}}}}}function K(r){return{argument:r}}function X(r){return{command:r}}function Ae(r,e){return{generateUsage(){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}},createInterpreterFactory(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{createInterpreterInstance(){let s={};for(let a in o)s[a]=o[a]();return{executeWithContext(a){return e(a,{options:s,arguments:n})}}}}}}}function c(r,e){if(r==="none")return e.value;if(r==="tty"){let t=e.foregroundColor?Ve[e.foregroundColor]:"",o=e.backgroundColor?ve[e.backgroundColor]:"",n=e.bold?Re:"",s=e.italic?Ee:"",a=e.underline?Oe:"",i=e.strikethrough?ke:"";return`${t}${o}${n}${s}${a}${i}${e.value}${$e}`}if(r==="mock"){let t=e.foregroundColor?`{${e.value}}@${e.foregroundColor}`:e.value,o=e.backgroundColor?`{${t}}#${e.backgroundColor}`:t,n=e.bold?`{${o}}+`:o,s=e.italic?`{${n}}*`:n,a=e.underline?`{${s}}_`:s;return e.strikethrough?`{${a}}~`:a}throw new Error(`Unknown typo support: ${r}`)}function W(){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",Re="\x1B[1m",Ee="\x1B[3m",Oe="\x1B[4m",ke="\x1B[9m",Ve={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"},ve={darkBlack:"\x1B[40m",darkRed:"\x1B[41m",darkGreen:"\x1B[42m",darkYellow:"\x1B[43m",darkBlue:"\x1B[44m",darkMagenta:"\x1B[45m",darkCyan:"\x1B[46m",darkWhite:"\x1B[47m",brightBlack:"\x1B[100m",brightRed:"\x1B[101m",brightGreen:"\x1B[102m",brightYellow:"\x1B[103m",brightBlue:"\x1B[104m",brightMagenta:"\x1B[105m",brightCyan:"\x1B[106m",brightWhite:"\x1B[107m"};function 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],u=Z(i);(n[a]===void 0||u>n[a])&&(n[a]=u)}for(let s of r){let a=new Array;for(let i=0;i<s.length;i++){let u=s[i],h=u.map(C=>c(e,C));if(i<s.length-1){let C=Z(u),S=" ".repeat(n[i]-C);a.push(h.join("")+S)}else a.push(h.join(""))}o.push(a.join(t))}return o}function Z(r){let e=0;for(let t of r)e+=t.value.length;return e}function Te(r){return{generateUsage(){return{description:r.description,long:r.long,short:r.short,label:void 0}},prepareConsumer(e){let t=D(r.long,r.short),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 Fe(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 o=D(r.long,r.short),n=r.long?[r.long]:[];r.aliases?.longs&&n.push(...r.aliases?.longs);let s=r.short?[r.short]:[];return r.aliases?.shorts&&s.push(...r.aliases?.shorts),t.registerOption({key:o,longs:n,shorts:s}),()=>t.consumeOption(o).map(a=>f(r.type,a,`${o}: ${e}`))}}}function Pe(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 o=D(r.long,r.short),n=[r.long];r.aliases?.longs&&n.push(...r.aliases?.longs);let s=r.short?[r.short]:[];return r.aliases?.shorts&&s.push(...r.aliases?.shorts),t.registerOption({key:o,longs:n,shorts:s}),()=>{let a=t.consumeOption(o);if(a.length>1)throw new Error(`Multiple values provided for option: ${o}, expected only one. Found: ${a.map(u=>`"${u}"`).join(", ")}`);let i=a[0];return i===void 0?r.default():f(r.type,i,`${o}: ${e}`)}}}}function D(r,e){return e?`-${e}, --${r}`:`--${r}`}var B,k,x,w,I,U,y,A,$,R,b,g,M,N,te,j,ne,T,O,q,F,P=class{constructor(e){m(this,g);m(this,B);m(this,k);m(this,x);m(this,w);m(this,I);m(this,U);m(this,y);m(this,A);m(this,$);m(this,R);m(this,b);d(this,B,e),d(this,k,0),d(this,x,!1),d(this,w,new Map),d(this,I,new Map),d(this,U,new Map),d(this,y,new Map),d(this,A,new Map),d(this,$,new Map),d(this,R,new Map),d(this,b,new Map)}registerFlag(e){p(this,g,q).call(this,e.key),l(this,U).set(e.key,{});for(let t of e.shorts)p(this,g,F).call(this,t),l(this,w).set(t,e.key);for(let t of e.longs)p(this,g,F).call(this,t),l(this,I).set(t,e.key)}registerOption(e){p(this,g,q).call(this,e.key),l(this,R).set(e.key,{});for(let t of e.shorts)p(this,g,F).call(this,t),l(this,A).set(t,e.key);for(let t of e.longs)p(this,g,F).call(this,t),l(this,$).set(t,e.key)}consumeFlag(e){if(l(this,U).get(e)===void 0)throw new Error(`Flag not registered: ${e}`);let o=l(this,y).get(e);if(o===void 0){l(this,y).set(e,null);return}if(o===null)throw new Error(`Flag already consumed: ${e}`);return l(this,y).set(e,null),o}consumeOption(e){if(l(this,R).get(e)===void 0)throw new Error(`Option not registered: ${e}`);let o=l(this,b).get(e);if(o===void 0)return l(this,b).set(e,null),new Array;if(o===null)throw new Error(`Option already consumed: ${e}`);return l(this,b).set(e,null),o}consumePositional(){for(;;){let e=p(this,g,M).call(this);if(e===null)return;let t=p(this,g,te).call(this,e);if(t!==null)return t}}};B=new WeakMap,k=new WeakMap,x=new WeakMap,w=new WeakMap,I=new WeakMap,U=new WeakMap,y=new WeakMap,A=new WeakMap,$=new WeakMap,R=new WeakMap,b=new WeakMap,g=new WeakSet,M=function(){let e=l(this,B)[l(this,k)];return e===void 0?null:(Q(this,k)._++,!l(this,x)&&e==="--"?(d(this,x,!0),p(this,g,M).call(this)):e)},N=function(e){let t=p(this,g,M).call(this);if(t===null)throw new Error(`Option ${e} requires a value but none was provided`);if(l(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},te=function(e){if(l(this,x))return e;if(e.startsWith("--")){let t=e.indexOf("=");return t===-1?p(this,g,j).call(this,e.slice(2),null):p(this,g,j).call(this,e.slice(2,t),e.slice(t+1)),null}if(e.startsWith("-")){let t=1,o=2;for(;o<=e.length;){let s=e.slice(t,o),a=e.slice(o),i=p(this,g,ne).call(this,s,a);if(i===!0)return null;i===!1&&(t=o),o++}let n=e.slice(t);throw new Error(`Unknown flag or option: -${n}`)}return e},j=function(e,t){let o=l(this,I).get(e);if(o!==void 0){if(t!==null){let s=re.get(t.toLowerCase());if(s!==void 0)return p(this,g,T).call(this,o,s);throw new Error(`Invalid value for flag: --${e}: "${t}" (expected: ${ee})`)}return p(this,g,T).call(this,o,!0)}let n=l(this,$).get(e);if(n!==void 0)return t!==null?p(this,g,O).call(this,n,t):p(this,g,O).call(this,n,p(this,g,N).call(this,`--${e}`));throw new Error(`Unknown flag or option: --${e}`)},ne=function(e,t){let o=l(this,w).get(e);if(o!==void 0){if(t.startsWith("=")){let s=re.get(t.slice(1).toLowerCase());if(s!==void 0)return p(this,g,T).call(this,o,s),!0;throw new Error(`Invalid value for flag: -${e}: "${t}" (expected: ${ee})`)}return p(this,g,T).call(this,o,!0),t===""}let n=l(this,A).get(e);return n!==void 0?t===""?(p(this,g,O).call(this,n,p(this,g,N).call(this,`-${e}`)),!0):(t.startsWith("=")?p(this,g,O).call(this,n,t.slice(1)):p(this,g,O).call(this,n,t),!0):null},T=function(e,t){if(l(this,y).has(e))throw new Error(`Flag already set: ${e}`);l(this,y).set(e,t)},O=function(e,t){let o=l(this,b).get(e)??new Array;o.push(t),l(this,b).set(e,o)},q=function(e){if(l(this,U).has(e))throw new Error(`Flag already registered: ${e}`);if(l(this,R).has(e))throw new Error(`Option already registered: ${e}`)},F=function(e){if(l(this,w).has(e))throw new Error(`Flag already registered: -${e}`);if(l(this,I).has(e))throw new Error(`Flag already registered: --${e}`);if(l(this,A).has(e))throw new Error(`Option already registered: -${e}`);if(l(this,$).has(e))throw new Error(`Option already registered: --${e}`)};var ee='"yes"|"no"',re=new Map([["true",!0],["false",!1],["yes",!0],["no",!1],["t",!0],["f",!1],["y",!0],["n",!1]]);function J(r){let{cliName:e,commandUsage:t,typoSupport:o}=r,n=new Array;n.push(c(o,Be(t.metadata.description))),t.metadata.details&&n.push(c(o,Me(t.metadata.details))),n.push("");let s=[c(o,Se("Usage:")),c(o,V(e))].concat(t.breadcrumbs.map(a=>{if("argument"in a)return c(o,H(a.argument));if("command"in a)return c(o,V(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,_("Arguments:")));let a=new Array;for(let i of t.arguments){let u=new Array;u.push([E()]),u.push([H(i.label)]),i.description&&(u.push([E()]),u.push([Y(i.description)])),a.push(u)}n.push(...v(a,o))}if(t.subcommands.length>0){n.push(""),n.push(c(o,_("Subcommands:")));let a=new Array;for(let i of t.subcommands){let u=new Array;u.push([E()]),u.push([V(i.name)]),i.description&&(u.push([E()]),u.push([Y(i.description)])),a.push(u)}n.push(...v(a,o))}if(t.options.length>0){n.push(""),n.push(c(o,_("Options:")));let a=new Array;for(let i of t.options){let u=new Array;u.push([E()]),i.short?u.push([V(`-${i.short}`),E(", ")]):u.push([]),i.label?u.push([V(`--${i.long} `),H(i.label)]):u.push([V(`--${i.long}`)]),i.description&&(u.push([E()]),u.push([Y(i.description)])),a.push(u)}n.push(...v(a,o))}return n.push(""),n}function Be(r){return{value:r,bold:!0}}function Me(r){return{value:r,foregroundColor:"brightBlack",italic:!0}}function Y(r){return{value:r}}function Se(r){return{value:r,foregroundColor:"brightMagenta",bold:!0}}function _(r){return{value:r,foregroundColor:"brightGreen",bold:!0}}function V(r){return{value:r,foregroundColor:"brightCyan",bold:!0}}function H(r){return{value:r,foregroundColor:"brightBlue",italic:!0}}function E(r){return{value:r??" "}}async function Le(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.createInterpreterFactory(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")){let i=se(n?.useColors);return(n?.onLogStdOut??console.log)(oe(r,a,i)),(n?.onExit??process.exit)(0)}try{return await a.createInterpreterInstance().executeWithContext(t),(n?.onExit??process.exit)(0)}catch(i){if(n?.onError)n.onError(i);else{let u=se(n?.useColors);(n?.usageOnError??!0)&&(n?.onLogStdErr??console.error)(oe(r,a,u)),(n?.onLogStdErr??console.error)(Ge(i,u))}return(n?.onExit??process.exit)(1)}}function Ge(r,e){return[c(e,{value:"Error:",foregroundColor:"brightRed",bold:!0}),c(e,{value:r instanceof Error?r.message:String(r),bold:!0})].join(" ")}function oe(r,e,t){return J({cliName:r,commandUsage:e.generateUsage(),typoSupport:t}).join(`
|
|
2
|
+
`)}function se(r){return r===void 0?W():r?"tty":"none"}0&&(module.exports={ReaderArgs,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/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} (expected: \"true\"|\"false\")`);\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} (expected: ISO_8601 format)`);\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} comma-separated parts`,\n );\n }\n return parts.map((part, index) =>\n typeDecode(\n elementTypes[index]!,\n part,\n `[${index}].${elementTypes[index]!.label}`,\n ),\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) =>\n typeDecode(elementType, part, `[${index}].${elementType.label}`),\n );\n },\n };\n}\n\nexport function typeDecode<Value>(\n type: Type<Value>,\n value: string,\n context: string,\n): Value {\n try {\n return type.decoder(value);\n } catch (error) {\n throw new Error(\n `Failed to decode value \"${value}\" for ${context}: ${\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: Uppercase<string>;\n};\n\nexport function argumentRequired<Value>(definition: {\n description?: string;\n label?: Uppercase<string>;\n type: Type<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}>` as Uppercase<string>,\n };\n },\n consumeValue(readerPositionals: ReaderPositionals) {\n const positional = readerPositionals.consumePositional();\n if (positional === undefined) {\n throw new Error(`Missing required argument: ${label}`);\n }\n return typeDecode(definition.type, positional, label);\n },\n };\n}\n\nexport function argumentOptional<Value>(definition: {\n description?: string;\n label?: Uppercase<string>;\n type: Type<Value>;\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}]` as Uppercase<string>,\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, positional, label);\n },\n };\n}\n\nexport function argumentVariadics<Value>(definition: {\n endDelimiter?: string;\n description?: string;\n label?: Uppercase<string>;\n type: Type<Value>;\n}): Argument<Array<Value>> {\n const label = definition.label ?? definition.type.label;\n return {\n generateUsage() {\n return {\n description: definition.description,\n label: (`[${label}]...` +\n (definition.endDelimiter\n ? `[\"${definition.endDelimiter}\"]`\n : \"\")) as Uppercase<string>,\n };\n },\n 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, positional, label));\n }\n return values;\n },\n };\n}\n","import { ArgumentUsage } from \"./Argument\";\nimport { Execution } from \"./Execution\";\nimport { OptionUsage } from \"./Option\";\nimport { ReaderArgs } from \"./Reader\";\n\nexport type Command<Context, Result> = {\n getDescription(): string | undefined;\n createInterpreterFactory(\n readerArgs: ReaderArgs,\n ): CommandInterpreterFactory<Context, Result>;\n};\n\nexport type CommandInterpreterFactory<Context, Result> = {\n generateUsage(): CommandUsage;\n createInterpreterInstance(): CommandInterpreterInstance<Context, Result>;\n};\n\nexport type CommandInterpreterInstance<Context, Result> = {\n executeWithContext(context: Context): Promise<Result>;\n};\n\nexport type CommandMetadata = {\n description: string;\n details?: string;\n // TODO - printable examples ?\n};\n\nexport type CommandUsage = {\n metadata: CommandMetadata;\n breadcrumbs: Array<CommandUsageBreadcrumb>;\n 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 createInterpreterFactory(readerArgs: ReaderArgs) {\n function generateUsage(): CommandUsage {\n const executionUsage = execution.generateUsage();\n return {\n metadata,\n breadcrumbs: executionUsage.arguments.map((argument) =>\n breadcrumbArgument(argument.label),\n ),\n options: executionUsage.options,\n arguments: executionUsage.arguments,\n subcommands: [],\n };\n }\n try {\n const executionInterpreterFactory =\n execution.createInterpreterFactory(readerArgs);\n return {\n generateUsage,\n createInterpreterInstance() {\n const lastPositional = readerArgs.consumePositional();\n if (lastPositional !== undefined) {\n throw Error(`Unexpected argument: \"${lastPositional}\"`);\n }\n const executionInterpreterInstance =\n executionInterpreterFactory.createInterpreterInstance();\n return {\n async executeWithContext(context: Context) {\n return executionInterpreterInstance.executeWithContext(context);\n },\n };\n },\n };\n } catch (error) {\n return {\n generateUsage,\n createInterpreterInstance() {\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 createInterpreterFactory(readerArgs: ReaderArgs) {\n try {\n const executionInterpreterFactory =\n execution.createInterpreterFactory(readerArgs);\n const subcommandName = readerArgs.consumePositional();\n if (subcommandName === undefined) {\n throw new Error(\"Missing required argument: SUBCOMMAND\");\n }\n const subcommandInput =\n subcommands[subcommandName as Lowercase<string>];\n if (subcommandInput === undefined) {\n throw new Error(`Invalid SUBCOMMAND: \"${subcommandName}\"`);\n }\n const subcommandInterpreterFactory =\n subcommandInput.createInterpreterFactory(readerArgs);\n return {\n generateUsage() {\n const executionUsage = execution.generateUsage();\n const subcommandUsage =\n subcommandInterpreterFactory.generateUsage();\n return {\n metadata: subcommandUsage.metadata,\n breadcrumbs: executionUsage.arguments\n .map((argument) => breadcrumbArgument(argument.label))\n .concat([breadcrumbCommand(subcommandName)])\n .concat(subcommandUsage.breadcrumbs),\n options: executionUsage.options.concat(subcommandUsage.options),\n arguments: executionUsage.arguments.concat(\n subcommandUsage.arguments,\n ),\n subcommands: subcommandUsage.subcommands,\n };\n },\n createInterpreterInstance() {\n // TODO - unit tests to enforce ordering here\n const executionInterpreterInstance =\n executionInterpreterFactory.createInterpreterInstance();\n const subcommandInterpreterInstance =\n subcommandInterpreterFactory.createInterpreterInstance();\n return {\n async executeWithContext(context: Context) {\n const payload =\n await executionInterpreterInstance.executeWithContext(\n context,\n );\n return await subcommandInterpreterInstance.executeWithContext(\n payload,\n );\n },\n };\n },\n };\n } catch (error) {\n return {\n generateUsage() {\n const executionUsage = execution.generateUsage();\n return {\n metadata,\n breadcrumbs: executionUsage.arguments\n .map((argument) => breadcrumbArgument(argument.label))\n .concat([breadcrumbCommand(\"<SUBCOMMAND>\")]),\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 createInterpreterInstance() {\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 { ReaderArgs } from \"./Reader\";\n\nexport type Execution<Context, Result> = {\n generateUsage(): ExecutionUsage;\n createInterpreterFactory(\n readerArgs: ReaderArgs,\n ): ExecutionInterpreterFactory<Context, Result>;\n};\n\nexport type ExecutionInterpreterFactory<Context, Result> = {\n createInterpreterInstance(): ExecutionInterpreterInstance<Context, Result>;\n};\n\nexport type ExecutionInterpreterInstance<Context, Result> = {\n executeWithContext(context: Context): Promise<Result>;\n};\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 generateUsage() {\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 createInterpreterFactory(readerArgs: ReaderArgs) {\n const optionsConsumers: any = {};\n for (const optionKey in inputs.options) {\n const optionInput = inputs.options[optionKey]!;\n optionsConsumers[optionKey] = optionInput.prepareConsumer(readerArgs);\n }\n const argumentsValues: any = [];\n for (const argumentInput of inputs.arguments) {\n argumentsValues.push(argumentInput.consumeValue(readerArgs));\n }\n return {\n createInterpreterInstance() {\n const optionsValues: any = {};\n for (const optionKey in optionsConsumers) {\n optionsValues[optionKey] = optionsConsumers[optionKey]!();\n }\n return {\n executeWithContext(context: Context) {\n return handler(context, {\n options: optionsValues,\n arguments: argumentsValues,\n });\n },\n };\n },\n };\n },\n };\n}\n","export type TypoSupport = \"none\" | \"tty\" | \"mock\";\nexport type TypoColor =\n | \"darkBlack\"\n | \"darkRed\"\n | \"darkGreen\"\n | \"darkYellow\"\n | \"darkBlue\"\n | \"darkMagenta\"\n | \"darkCyan\"\n | \"darkWhite\"\n | \"brightBlack\"\n | \"brightRed\"\n | \"brightGreen\"\n | \"brightYellow\"\n | \"brightBlue\"\n | \"brightMagenta\"\n | \"brightCyan\"\n | \"brightWhite\";\n\nexport type TypoText = {\n value: string;\n color?: TypoColor;\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 ? ttyCodeColors[typoText.color] : \"\";\n const colorBoldCode = typoText.bold ? ttyCodeBold : \"\";\n return `${colorStartCode}${colorBoldCode}${typoText.value}${ttyCodeReset}`;\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 ttyCodeReset = \"\\x1b[0m\";\nconst ttyCodeBold = \"\\x1b[1m\";\nconst ttyCodeColors: Record<TypoColor, string> = {\n darkBlack: \"\\x1b[30m\",\n darkRed: \"\\x1b[31m\",\n darkGreen: \"\\x1b[32m\",\n darkYellow: \"\\x1b[33m\",\n darkBlue: \"\\x1b[34m\",\n darkMagenta: \"\\x1b[35m\",\n darkCyan: \"\\x1b[36m\",\n darkWhite: \"\\x1b[37m\",\n brightBlack: \"\\x1b[90m\",\n brightRed: \"\\x1b[91m\",\n brightGreen: \"\\x1b[92m\",\n brightYellow: \"\\x1b[93m\",\n brightBlue: \"\\x1b[94m\",\n brightMagenta: \"\\x1b[95m\",\n brightCyan: \"\\x1b[96m\",\n brightWhite: \"\\x1b[97m\",\n};\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 { ReaderArgs } from \"./Reader\";\nimport { Type, typeDecode } from \"./Type\";\n\nexport type Option<Value> = {\n generateUsage(): OptionUsage;\n prepareConsumer(readerArgs: ReaderArgs): 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 long: Lowercase<string>;\n short?: string;\n description?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n default?: () => boolean;\n}): Option<boolean> {\n return {\n generateUsage() {\n return {\n description: definition.description,\n long: definition.long,\n short: definition.short,\n label: undefined,\n };\n },\n prepareConsumer(readerArgs: ReaderArgs) {\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 readerArgs.registerFlag({ key, longs, shorts });\n return () => {\n const value = readerArgs.consumeFlag(key);\n if (value === undefined) {\n return definition.default ? definition.default() : false;\n }\n return value;\n };\n },\n };\n}\n\nexport function optionRepeatable<Value>(definition: {\n long: Lowercase<string>;\n short?: string;\n description?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n label?: Uppercase<string>;\n type: Type<Value>;\n}): Option<Array<Value>> {\n const label = definition.label ?? definition.type.label;\n return {\n generateUsage() {\n // TODO - showcase that it can be repeated ?\n return {\n description: definition.description,\n long: definition.long,\n short: definition.short,\n label: `<${label}>` as Uppercase<string>,\n };\n },\n prepareConsumer(readerArgs: ReaderArgs) {\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 readerArgs.registerOption({ key, longs, shorts });\n return () => {\n return readerArgs\n .consumeOption(key)\n .map((value) =>\n typeDecode(definition.type, value, `${key}: ${label}`),\n );\n };\n },\n };\n}\n\nexport function optionSingleValue<Value>(definition: {\n long: Lowercase<string>;\n short?: string;\n description?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n label?: Uppercase<string>;\n type: Type<Value>;\n default: () => Value;\n}): Option<Value> {\n const label = definition.label ?? definition.type.label;\n return {\n generateUsage() {\n return {\n description: definition.description,\n long: definition.long,\n short: definition.short,\n label: `<${label}>` as Uppercase<string>,\n };\n },\n prepareConsumer(readerArgs: ReaderArgs) {\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 readerArgs.registerOption({ key, longs, shorts });\n return () => {\n const values = readerArgs.consumeOption(key);\n if (values.length > 1) {\n throw new Error(\n `Multiple values provided for option: ${key}, expected only one. Found: ${values.map((v) => `\"${v}\"`).join(\", \")}`,\n );\n }\n const firstValue = values[0];\n if (firstValue === undefined) {\n return definition.default();\n }\n return typeDecode(definition.type, firstValue, `${key}: ${label}`);\n };\n },\n };\n}\n","export type ReaderPositionals = {\n consumePositional(): string | undefined;\n};\n\nexport class ReaderArgs {\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(key: string) {\n const arg = this.#consumeArg();\n if (arg === null) {\n throw new Error(`Option ${key} requires a value but none was provided`);\n }\n if (this.#parsedDouble) {\n throw new Error(`Option ${key} 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 ${key} 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 const leftover = arg.slice(shortIndexStart);\n throw new Error(`Unknown flag or option: -${leftover}`);\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 = booleanValues.get(direct.toLowerCase());\n if (value !== undefined) {\n return this.#acknowledgeFlag(flagKey, value);\n }\n throw new Error(\n `Invalid value for flag: --${long}: \"${direct}\" (expected: ${booleanExpected})`,\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(\n optionKey,\n this.#consumeOptionValue(`--${long}`),\n );\n }\n throw new Error(`Unknown 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 = booleanValues.get(rest.slice(1).toLowerCase());\n if (value !== undefined) {\n this.#acknowledgeFlag(flagKey, value);\n return true;\n }\n throw new Error(\n `Invalid value for flag: -${short}: \"${rest}\" (expected: ${booleanExpected})`,\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(\n optionKey,\n this.#consumeOptionValue(`-${short}`),\n );\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\nconst booleanExpected = `\"yes\"|\"no\"`;\nconst booleanValues = new Map<string, boolean>([\n [\"true\", true],\n [\"false\", false],\n [\"yes\", true],\n [\"no\", false],\n [\"t\", true],\n [\"f\", false],\n [\"y\", true],\n [\"n\", false],\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.metadata.description,\n bold: true,\n }),\n );\n if (commandUsage.metadata.details) {\n lines.push(\n typoPrintableString(typoSupport, {\n value: commandUsage.metadata.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, CommandInterpreterFactory } from \"./Command\";\nimport { ReaderArgs } 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 readerArgs = new ReaderArgs(cliArgs);\n if (application?.buildVersion) {\n readerArgs.registerFlag({\n key: \"version\",\n shorts: [],\n longs: [\"version\"],\n });\n }\n if (application?.usageOnHelp ?? true) {\n readerArgs.registerFlag({\n key: \"help\",\n shorts: [],\n longs: [\"help\"],\n });\n }\n /*\n // TODO - handle completions ?\n readerArgs.registerFlag({\n key: \"completion\",\n shorts: [],\n longs: [\"completion\"],\n });\n */\n const interpreterFactory = command.createInterpreterFactory(readerArgs);\n if (application?.buildVersion) {\n if (readerArgs.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 (readerArgs.consumeFlag(\"help\")) {\n (application?.onLogStdOut ?? console.log)(\n computeUsageString(cliName, interpreterFactory, application?.useColors),\n );\n return (application?.onExit ?? process.exit)(0);\n }\n }\n try {\n const interpreterInstance = interpreterFactory.createInterpreterInstance();\n try {\n // TODO - special errors ???\n await interpreterInstance.executeWithContext(context);\n return (application?.onExit ?? process.exit)(0);\n } catch (error) {\n if (application?.onError) {\n application.onError(error);\n }\n return (application?.onExit ?? process.exit)(1);\n }\n } catch (error) {\n if (application?.usageOnError ?? true) {\n (application?.onLogStdErr ?? console.error)(\n computeUsageString(cliName, interpreterFactory, 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: CommandInterpreterFactory<Context, Result>,\n useColors: boolean | undefined,\n) {\n return usageToPrintableLines({\n cliName,\n commandUsage: commandInterpreter.generateUsage(),\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":"+2BAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,gBAAAE,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,EAAA,eAAAC,GAAA,eAAAC,GAAA,4BAAAC,EAAA,wBAAAC,EAAA,0BAAAC,IAAA,eAAAC,GAAAzB,ICKO,IAAM0B,GAA6B,CACxC,MAAO,UACP,QAAQC,EAAe,CACrB,GAAIA,IAAU,OACZ,MAAO,GAET,GAAIA,IAAU,QACZ,MAAO,GAET,MAAM,IAAI,MAAM,oBAAoBA,CAAK,6BAA6B,CACxE,CACF,EAEaC,GAAuB,CAClC,MAAO,OACP,QAAQD,EAAe,CACrB,IAAME,EAAY,KAAK,MAAMF,CAAK,EAClC,GAAI,MAAME,CAAS,EACjB,MAAM,IAAI,MAAM,iBAAiBF,CAAK,8BAA8B,EAEtE,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,yBAAyBP,CAAK,eAAeO,EAAa,MAAM,wBAClE,EAEF,OAAOE,EAAM,IAAI,CAACC,EAAMC,IACtBC,EACEL,EAAaI,CAAK,EAClBD,EACA,IAAIC,CAAK,KAAKJ,EAAaI,CAAK,EAAG,KAAK,EAC1C,CACF,CACF,CACF,CACF,CAEO,SAASE,GACdL,EACoB,CACpB,MAAO,CACL,MACE,GAAGA,EAAY,KAAK,KAAKA,EAAY,KAAK,OAC5C,QAAQR,EAAe,CACrB,OAAOA,EACJ,MAAM,GAAG,EACT,IAAI,CAACU,EAAMC,IACVC,EAAWJ,EAAaE,EAAM,IAAIC,CAAK,KAAKH,EAAY,KAAK,EAAE,CACjE,CACJ,CACF,CACF,CAEO,SAASI,EACdE,EACAd,EACAe,EACO,CACP,GAAI,CACF,OAAOD,EAAK,QAAQd,CAAK,CAC3B,OAASgB,EAAO,CACd,MAAM,IAAI,MACR,2BAA2BhB,CAAK,SAASe,CAAO,KAC9CC,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,CACvD,EACF,CACF,CACF,CC9FO,SAASC,GAAwBC,EAIpB,CAClB,IAAMC,EAAQD,EAAW,OAASA,EAAW,KAAK,MAClD,MAAO,CACL,eAAgB,CACd,MAAO,CACL,YAAaA,EAAW,YACxB,MAAO,IAAIC,CAAK,GAClB,CACF,EACA,aAAaC,EAAsC,CACjD,IAAMC,EAAaD,EAAkB,kBAAkB,EACvD,GAAIC,IAAe,OACjB,MAAM,IAAI,MAAM,8BAA8BF,CAAK,EAAE,EAEvD,OAAOG,EAAWJ,EAAW,KAAMG,EAAYF,CAAK,CACtD,CACF,CACF,CAEO,SAASI,GAAwBL,EAKpB,CAClB,IAAMC,EAAQD,EAAW,OAASA,EAAW,KAAK,MAClD,MAAO,CACL,eAAgB,CACd,MAAO,CACL,YAAaA,EAAW,YACxB,MAAO,IAAIC,CAAK,GAClB,CACF,EACA,aAAaC,EAAsC,CACjD,IAAMC,EAAaD,EAAkB,kBAAkB,EACvD,OAAIC,IAAe,OACVH,EAAW,QAAQ,EAErBI,EAAWJ,EAAW,KAAMG,EAAYF,CAAK,CACtD,CACF,CACF,CAEO,SAASK,GAAyBN,EAKd,CACzB,IAAMC,EAAQD,EAAW,OAASA,EAAW,KAAK,MAClD,MAAO,CACL,eAAgB,CACd,MAAO,CACL,YAAaA,EAAW,YACxB,MAAQ,IAAIC,CAAK,QACdD,EAAW,aACR,KAAKA,EAAW,YAAY,KAC5B,GACR,CACF,EACA,aAAaE,EAAsC,CACjD,IAAMK,EAAuB,CAAC,EAC9B,OAAa,CACX,IAAMJ,EAAaD,EAAkB,kBAAkB,EACvD,GACEC,IAAe,QACfA,IAAeH,EAAW,aAE1B,MAEFO,EAAO,KAAKH,EAAWJ,EAAW,KAAMG,EAAYF,CAAK,CAAC,CAC5D,CACA,OAAOM,CACT,CACF,CACF,CCvDO,SAASC,GACdC,EACAC,EAC0B,CAC1B,MAAO,CACL,gBAAiB,CACf,OAAOD,EAAS,WAClB,EACA,yBAAyBE,EAAwB,CAC/C,SAASC,GAA8B,CACrC,IAAMC,EAAiBH,EAAU,cAAc,EAC/C,MAAO,CACL,SAAAD,EACA,YAAaI,EAAe,UAAU,IAAKC,GACzCC,EAAmBD,EAAS,KAAK,CACnC,EACA,QAASD,EAAe,QACxB,UAAWA,EAAe,UAC1B,YAAa,CAAC,CAChB,CACF,CACA,GAAI,CACF,IAAMG,EACJN,EAAU,yBAAyBC,CAAU,EAC/C,MAAO,CACL,cAAAC,EACA,2BAA4B,CAC1B,IAAMK,EAAiBN,EAAW,kBAAkB,EACpD,GAAIM,IAAmB,OACrB,MAAM,MAAM,yBAAyBA,CAAc,GAAG,EAExD,IAAMC,EACJF,EAA4B,0BAA0B,EACxD,MAAO,CACL,MAAM,mBAAmBG,EAAkB,CACzC,OAAOD,EAA6B,mBAAmBC,CAAO,CAChE,CACF,CACF,CACF,CACF,OAASC,EAAO,CACd,MAAO,CACL,cAAAR,EACA,2BAA4B,CAC1B,MAAMQ,CACR,CACF,CACF,CACF,CACF,CACF,CAEO,SAASC,GACdZ,EACAC,EACAY,EAC0B,CAC1B,MAAO,CACL,gBAAiB,CACf,OAAOb,EAAS,WAClB,EACA,yBAAyBE,EAAwB,CAC/C,GAAI,CACF,IAAMK,EACJN,EAAU,yBAAyBC,CAAU,EACzCY,EAAiBZ,EAAW,kBAAkB,EACpD,GAAIY,IAAmB,OACrB,MAAM,IAAI,MAAM,uCAAuC,EAEzD,IAAMC,EACJF,EAAYC,CAAmC,EACjD,GAAIC,IAAoB,OACtB,MAAM,IAAI,MAAM,wBAAwBD,CAAc,GAAG,EAE3D,IAAME,EACJD,EAAgB,yBAAyBb,CAAU,EACrD,MAAO,CACL,eAAgB,CACd,IAAME,EAAiBH,EAAU,cAAc,EACzCgB,EACJD,EAA6B,cAAc,EAC7C,MAAO,CACL,SAAUC,EAAgB,SAC1B,YAAab,EAAe,UACzB,IAAKC,GAAaC,EAAmBD,EAAS,KAAK,CAAC,EACpD,OAAO,CAACa,EAAkBJ,CAAc,CAAC,CAAC,EAC1C,OAAOG,EAAgB,WAAW,EACrC,QAASb,EAAe,QAAQ,OAAOa,EAAgB,OAAO,EAC9D,UAAWb,EAAe,UAAU,OAClCa,EAAgB,SAClB,EACA,YAAaA,EAAgB,WAC/B,CACF,EACA,2BAA4B,CAE1B,IAAMR,EACJF,EAA4B,0BAA0B,EAClDY,EACJH,EAA6B,0BAA0B,EACzD,MAAO,CACL,MAAM,mBAAmBN,EAAkB,CACzC,IAAMU,EACJ,MAAMX,EAA6B,mBACjCC,CACF,EACF,OAAO,MAAMS,EAA8B,mBACzCC,CACF,CACF,CACF,CACF,CACF,CACF,OAAST,EAAO,CACd,MAAO,CACL,eAAgB,CACd,IAAMP,EAAiBH,EAAU,cAAc,EAC/C,MAAO,CACL,SAAAD,EACA,YAAaI,EAAe,UACzB,IAAKC,GAAaC,EAAmBD,EAAS,KAAK,CAAC,EACpD,OAAO,CAACa,EAAkB,cAAc,CAAC,CAAC,EAC7C,QAASd,EAAe,QACxB,UAAWA,EAAe,UAC1B,YAAa,OAAO,QAAQS,CAAW,EAAE,IACvC,CAAC,CAACQ,EAAMC,CAAU,KAAO,CACvB,KAAAD,EACA,YAAaC,EAAW,eAAe,CACzC,EACF,CACF,CACF,EACA,2BAA4B,CAC1B,MAAMX,CACR,CACF,CACF,CACF,CACF,CACF,CAEA,SAASL,EAAmBiB,EAAuC,CACjE,MAAO,CAAE,SAAUA,CAAM,CAC3B,CAEA,SAASL,EAAkBK,EAAuC,CAChE,MAAO,CAAE,QAASA,CAAM,CAC1B,CChKO,SAASC,GAMdC,EAIAC,EAO4B,CAC5B,MAAO,CACL,eAAgB,CACd,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,yBAAyBE,EAAwB,CAC/C,IAAMC,EAAwB,CAAC,EAC/B,QAAWL,KAAaH,EAAO,QAAS,CACtC,IAAMI,EAAcJ,EAAO,QAAQG,CAAS,EAC5CK,EAAiBL,CAAS,EAAIC,EAAY,gBAAgBG,CAAU,CACtE,CACA,IAAME,EAAuB,CAAC,EAC9B,QAAWH,KAAiBN,EAAO,UACjCS,EAAgB,KAAKH,EAAc,aAAaC,CAAU,CAAC,EAE7D,MAAO,CACL,2BAA4B,CAC1B,IAAMG,EAAqB,CAAC,EAC5B,QAAWP,KAAaK,EACtBE,EAAcP,CAAS,EAAIK,EAAiBL,CAAS,EAAG,EAE1D,MAAO,CACL,mBAAmBQ,EAAkB,CACnC,OAAOV,EAAQU,EAAS,CACtB,QAASD,EACT,UAAWD,CACb,CAAC,CACH,CACF,CACF,CACF,CACF,CACF,CACF,CC1DO,SAASG,EACdC,EACAC,EACQ,CACR,GAAID,IAAgB,OAClB,OAAOC,EAAS,MAElB,GAAID,IAAgB,MAAO,CACzB,IAAME,EAAiBD,EAAS,MAAQE,GAAcF,EAAS,KAAK,EAAI,GAClEG,EAAgBH,EAAS,KAAOI,GAAc,GACpD,MAAO,GAAGH,CAAc,GAAGE,CAAa,GAAGH,EAAS,KAAK,GAAGK,EAAY,EAC1E,CACA,GAAIN,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,SAASO,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,IAAMD,GAAe,UACfD,GAAc,UACdF,GAA2C,CAC/C,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,ECtFO,SAASK,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,EAAwB,CACtC,IAAMC,EAAMF,EAAW,MACnB,IAAIA,EAAW,KAAK,OAAOA,EAAW,IAAI,GAC1C,KAAKA,EAAW,IAAI,GAClBG,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,EAAW,aAAa,CAAE,IAAAC,EAAK,MAAAC,EAAO,OAAAC,CAAO,CAAC,EACvC,IAAM,CACX,IAAMC,EAAQJ,EAAW,YAAYC,CAAG,EACxC,OAAIG,IAAU,OACLL,EAAW,QAAUA,EAAW,QAAQ,EAAI,GAE9CK,CACT,CACF,CACF,CACF,CAEO,SAASC,GAAwBN,EAOf,CACvB,IAAMO,EAAQP,EAAW,OAASA,EAAW,KAAK,MAClD,MAAO,CACL,eAAgB,CAEd,MAAO,CACL,YAAaA,EAAW,YACxB,KAAMA,EAAW,KACjB,MAAOA,EAAW,MAClB,MAAO,IAAIO,CAAK,GAClB,CACF,EACA,gBAAgBN,EAAwB,CACtC,IAAMC,EAAMF,EAAW,MACnB,IAAIA,EAAW,KAAK,OAAOA,EAAW,IAAI,GAC1C,KAAKA,EAAW,IAAI,GAClBG,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,EAAW,eAAe,CAAE,IAAAC,EAAK,MAAAC,EAAO,OAAAC,CAAO,CAAC,EACzC,IACEH,EACJ,cAAcC,CAAG,EACjB,IAAKG,GACJG,EAAWR,EAAW,KAAMK,EAAO,GAAGH,CAAG,KAAKK,CAAK,EAAE,CACvD,CAEN,CACF,CACF,CAEO,SAASE,GAAyBT,EAQvB,CAChB,IAAMO,EAAQP,EAAW,OAASA,EAAW,KAAK,MAClD,MAAO,CACL,eAAgB,CACd,MAAO,CACL,YAAaA,EAAW,YACxB,KAAMA,EAAW,KACjB,MAAOA,EAAW,MAClB,MAAO,IAAIO,CAAK,GAClB,CACF,EACA,gBAAgBN,EAAwB,CACtC,IAAMC,EAAMF,EAAW,MACnB,IAAIA,EAAW,KAAK,OAAOA,EAAW,IAAI,GAC1C,KAAKA,EAAW,IAAI,GAClBG,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,EAAW,eAAe,CAAE,IAAAC,EAAK,MAAAC,EAAO,OAAAC,CAAO,CAAC,EACzC,IAAM,CACX,IAAMM,EAAST,EAAW,cAAcC,CAAG,EAC3C,GAAIQ,EAAO,OAAS,EAClB,MAAM,IAAI,MACR,wCAAwCR,CAAG,+BAA+BQ,EAAO,IAAKC,GAAM,IAAIA,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,EAClH,EAEF,IAAMC,EAAaF,EAAO,CAAC,EAC3B,OAAIE,IAAe,OACVZ,EAAW,QAAQ,EAErBQ,EAAWR,EAAW,KAAMY,EAAY,GAAGV,CAAG,KAAKK,CAAK,EAAE,CACnE,CACF,CACF,CACF,CCpJA,IAAAM,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,GAAAC,EAAAC,GAAAC,EAAAC,EAAAC,EAAAC,EAIaC,EAAN,KAAiB,CAetB,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,wBAAwBA,CAAG,EAAE,EAE/C,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,0BAA0BD,CAAG,EAAE,EAEjD,OAAAH,EAAA,KAAKrB,GAAiB,IAAIwB,EAAK,IAAI,EAC5BC,CACT,CAEA,cAAcD,EAA4B,CAExC,GADmBH,EAAA,KAAKlB,GAAiB,IAAIqB,CAAG,IAC7B,OACjB,MAAM,IAAI,MAAM,0BAA0BA,CAAG,EAAE,EAEjD,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,4BAA4BD,CAAG,EAAE,EAEnD,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,IAAL,UAAwBkB,GAC3C,GAAIC,IAAe,KACjB,OAAOA,CAEX,CACF,CAyKF,EAvREjC,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,SAACiB,EAAa,CAC/B,IAAME,EAAMN,EAAA,KAAKf,EAAAC,GAAL,WACZ,GAAIoB,IAAQ,KACV,MAAM,IAAI,MAAM,UAAUF,CAAG,yCAAyC,EAExE,GAAIH,EAAA,KAAKzB,GACP,MAAM,IAAI,MAAM,UAAU4B,CAAG,+BAA+B,EAG9D,GAAIE,EAAI,WAAW,GAAG,EACpB,MAAM,IAAI,MAAM,UAAUF,CAAG,4BAA4BE,CAAG,GAAG,EAEjE,OAAOA,CACT,EAEAlB,GAAkB,SAACkB,EAA4B,CAC7C,GAAIL,EAAA,KAAKzB,GACP,OAAO8B,EAET,GAAIA,EAAI,WAAW,IAAI,EAAG,CACxB,IAAMG,EAAkBH,EAAI,QAAQ,GAAG,EACvC,OAAIG,IAAoB,GACtBT,EAAA,KAAKf,EAAAI,GAAL,UAAwBiB,EAAI,MAAM,CAAC,EAAG,MAEtCN,EAAA,KAAKf,EAAAI,GAAL,UACEiB,EAAI,MAAM,EAAGG,CAAe,EAC5BH,EAAI,MAAMG,EAAkB,CAAC,GAG1B,IACT,CACA,GAAIH,EAAI,WAAW,GAAG,EAAG,CACvB,IAAII,EAAkB,EAClBC,EAAgB,EACpB,KAAOA,GAAiBL,EAAI,QAAQ,CAClC,IAAMJ,EAAQI,EAAI,MAAMI,EAAiBC,CAAa,EAChDC,EAAON,EAAI,MAAMK,CAAa,EAC9BN,EAASL,EAAA,KAAKf,EAAAK,IAAL,UAA4BY,EAAOU,GAClD,GAAIP,IAAW,GACb,OAAO,KAELA,IAAW,KACbK,EAAkBC,GAEpBA,GACF,CACA,IAAME,EAAWP,EAAI,MAAMI,CAAe,EAC1C,MAAM,IAAI,MAAM,4BAA4BG,CAAQ,EAAE,CACxD,CACA,OAAOP,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,GAAc,IAAIH,EAAO,YAAY,CAAC,EACpD,GAAIE,IAAU,OACZ,OAAOhB,EAAA,KAAKf,EAAAM,GAAL,UAAsBwB,EAASC,GAExC,MAAM,IAAI,MACR,6BAA6Bb,CAAI,MAAMW,CAAM,gBAAgBI,CAAe,GAC9E,CACF,CACA,OAAOlB,EAAA,KAAKf,EAAAM,GAAL,UAAsBwB,EAAS,GACxC,CACA,IAAMI,EAAYlB,EAAA,KAAKnB,GAAiB,IAAIqB,CAAI,EAChD,GAAIgB,IAAc,OAChB,OAAIL,IAAW,KACNd,EAAA,KAAKf,EAAAO,GAAL,UAAwB2B,EAAWL,GAErCd,EAAA,KAAKf,EAAAO,GAAL,UACL2B,EACAnB,EAAA,KAAKf,EAAAE,GAAL,UAAyB,KAAKgB,CAAI,KAGtC,MAAM,IAAI,MAAM,6BAA6BA,CAAI,EAAE,CACrD,EAEAb,GAAsB,SAACY,EAAeU,EAA8B,CAClE,IAAMG,EAAUd,EAAA,KAAKxB,GAAgB,IAAIyB,CAAK,EAC9C,GAAIa,IAAY,OAAW,CACzB,GAAIH,EAAK,WAAW,GAAG,EAAG,CACxB,IAAMI,EAAQC,GAAc,IAAIL,EAAK,MAAM,CAAC,EAAE,YAAY,CAAC,EAC3D,GAAII,IAAU,OACZ,OAAAhB,EAAA,KAAKf,EAAAM,GAAL,UAAsBwB,EAASC,GACxB,GAET,MAAM,IAAI,MACR,4BAA4Bd,CAAK,MAAMU,CAAI,gBAAgBM,CAAe,GAC5E,CACF,CACA,OAAAlB,EAAA,KAAKf,EAAAM,GAAL,UAAsBwB,EAAS,IACxBH,IAAS,EAClB,CACA,IAAMO,EAAYlB,EAAA,KAAKpB,GAAkB,IAAIqB,CAAK,EAClD,OAAIiB,IAAc,OACZP,IAAS,IACXZ,EAAA,KAAKf,EAAAO,GAAL,UACE2B,EACAnB,EAAA,KAAKf,EAAAE,GAAL,UAAyB,IAAIe,CAAK,KAE7B,KAELU,EAAK,WAAW,GAAG,EACrBZ,EAAA,KAAKf,EAAAO,GAAL,UAAwB2B,EAAWP,EAAK,MAAM,CAAC,GAE/CZ,EAAA,KAAKf,EAAAO,GAAL,UAAwB2B,EAAWP,GAE9B,IAEF,IACT,EAEArB,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,IAAMI,EAASnB,EAAA,KAAKjB,GAAmB,IAAIoB,CAAG,GAAK,IAAI,MACvDgB,EAAO,KAAKJ,CAAK,EACjBf,EAAA,KAAKjB,GAAmB,IAAIoB,EAAKgB,CAAM,CACzC,EAEA3B,EAAgB,SAACW,EAAa,CAC5B,GAAIH,EAAA,KAAKtB,GAAe,IAAIyB,CAAG,EAC7B,MAAM,IAAI,MAAM,4BAA4BA,CAAG,EAAE,EAEnD,GAAIH,EAAA,KAAKlB,GAAiB,IAAIqB,CAAG,EAC/B,MAAM,IAAI,MAAM,8BAA8BA,CAAG,EAAE,CAEvD,EAEAV,EAAiB,SAAC2B,EAAyB,CAGzC,GAAIpB,EAAA,KAAKxB,GAAgB,IAAI4C,CAAe,EAC1C,MAAM,IAAI,MAAM,6BAA6BA,CAAe,EAAE,EAEhE,GAAIpB,EAAA,KAAKvB,GAAe,IAAI2C,CAAe,EACzC,MAAM,IAAI,MAAM,8BAA8BA,CAAe,EAAE,EAEjE,GAAIpB,EAAA,KAAKpB,GAAkB,IAAIwC,CAAe,EAC5C,MAAM,IAAI,MAAM,+BAA+BA,CAAe,EAAE,EAElE,GAAIpB,EAAA,KAAKnB,GAAiB,IAAIuC,CAAe,EAC3C,MAAM,IAAI,MAAM,gCAAgCA,CAAe,EAAE,CAErE,EAGF,IAAMH,EAAkB,aAClBD,GAAgB,IAAI,IAAqB,CAC7C,CAAC,OAAQ,EAAI,EACb,CAAC,QAAS,EAAK,EACf,CAAC,MAAO,EAAI,EACZ,CAAC,KAAM,EAAK,EACZ,CAAC,IAAK,EAAI,EACV,CAAC,IAAK,EAAK,EACX,CAAC,IAAK,EAAI,EACV,CAAC,IAAK,EAAK,CACb,CAAC,ECpSM,SAASK,EAAsBC,EAInC,CACD,GAAM,CAAE,QAAAC,EAAS,aAAAC,EAAc,YAAAC,CAAY,EAAIH,EAEzCI,EAAQ,IAAI,MAElBA,EAAM,KACJC,EAAoBF,EAAa,CAC/B,MAAOD,EAAa,SAAS,YAC7B,KAAM,EACR,CAAC,CACH,EACIA,EAAa,SAAS,SACxBE,EAAM,KACJC,EAAoBF,EAAa,CAC/B,MAAOD,EAAa,SAAS,QAC7B,MAAO,aACT,CAAC,CACH,EAGFE,EAAM,KAAK,EAAE,EACb,IAAME,EAAc,CAClBD,EAAoBF,EAAa,CAC/B,MAAO,SACP,MAAO,gBACP,KAAM,EACR,CAAC,EACDE,EAAoBF,EAAaI,EAAUN,CAAO,CAAC,CACrD,EAAE,OACAC,EAAa,YAAY,IAAKM,GAAe,CAC3C,GAAI,aAAcA,EAChB,OAAOH,EAAoBF,EAAaM,EAAUD,EAAW,QAAQ,CAAC,EAExE,GAAI,YAAaA,EACf,OAAOH,EAAoBF,EAAaI,EAAUC,EAAW,OAAO,CAAC,EAEvE,MAAM,IAAI,MAAM,uBAAuB,KAAK,UAAUA,CAAU,CAAC,EAAE,CACrE,CAAC,CACH,EAGA,GAFAJ,EAAM,KAAKE,EAAY,KAAK,GAAG,CAAC,EAE5BJ,EAAa,UAAU,OAAS,EAAG,CACrCE,EAAM,KAAK,EAAE,EACbA,EAAM,KAAKC,EAAoBF,EAAaO,EAAe,YAAY,CAAC,CAAC,EACzE,IAAMC,EAAO,IAAI,MACjB,QAAWC,KAAiBV,EAAa,UAAW,CAClD,IAAMW,EAAU,IAAI,MACpBA,EAAQ,KAAK,CAACC,EAAc,CAAC,CAAC,EAC9BD,EAAQ,KAAK,CAACJ,EAAUG,EAAc,KAAK,CAAC,CAAC,EACzCA,EAAc,cAChBC,EAAQ,KAAK,CAACC,EAAc,CAAC,CAAC,EAC9BD,EAAQ,KAAK,CAACE,EAAgBH,EAAc,WAAW,CAAC,CAAC,GAE3DD,EAAK,KAAKE,CAAO,CACnB,CACAT,EAAM,KAAK,GAAGY,EAAqBL,EAAMR,CAAW,CAAC,CACvD,CAEA,GAAID,EAAa,YAAY,OAAS,EAAG,CACvCE,EAAM,KAAK,EAAE,EACbA,EAAM,KACJC,EAAoBF,EAAaO,EAAe,cAAc,CAAC,CACjE,EACA,IAAMC,EAAO,IAAI,MACjB,QAAWM,KAAcf,EAAa,YAAa,CACjD,IAAMW,EAAU,IAAI,MACpBA,EAAQ,KAAK,CAACC,EAAc,CAAC,CAAC,EAC9BD,EAAQ,KAAK,CAACN,EAAUU,EAAW,IAAI,CAAC,CAAC,EACrCA,EAAW,cACbJ,EAAQ,KAAK,CAACC,EAAc,CAAC,CAAC,EAC9BD,EAAQ,KAAK,CAACE,EAAgBE,EAAW,WAAW,CAAC,CAAC,GAExDN,EAAK,KAAKE,CAAO,CACnB,CACAT,EAAM,KAAK,GAAGY,EAAqBL,EAAMR,CAAW,CAAC,CACvD,CAEA,GAAID,EAAa,QAAQ,OAAS,EAAG,CACnCE,EAAM,KAAK,EAAE,EACbA,EAAM,KAAKC,EAAoBF,EAAaO,EAAe,UAAU,CAAC,CAAC,EACvE,IAAMC,EAAO,IAAI,MACjB,QAAWO,KAAehB,EAAa,QAAS,CAC9C,IAAMW,EAAU,IAAI,MACpBA,EAAQ,KAAK,CAACC,EAAc,CAAC,CAAC,EAC1BI,EAAY,MACdL,EAAQ,KAAK,CAACN,EAAU,IAAIW,EAAY,KAAK,EAAE,EAAG,CAAE,MAAO,IAAK,CAAC,CAAC,EAElEL,EAAQ,KAAK,CAAC,CAAC,EAEbK,EAAY,MACdL,EAAQ,KAAK,CACXN,EAAU,KAAKW,EAAY,IAAI,GAAG,EAClCT,EAAUS,EAAY,KAAK,CAC7B,CAAC,EAEDL,EAAQ,KAAK,CAACN,EAAU,KAAKW,EAAY,IAAI,EAAE,CAAC,CAAC,EAE/CA,EAAY,cACdL,EAAQ,KAAK,CAACC,EAAc,CAAC,CAAC,EAC9BD,EAAQ,KAAK,CAACE,EAAgBG,EAAY,WAAW,CAAC,CAAC,GAEzDP,EAAK,KAAKE,CAAO,CACnB,CACAT,EAAM,KAAK,GAAGY,EAAqBL,EAAMR,CAAW,CAAC,CACvD,CAEA,OAAAC,EAAM,KAAK,EAAE,EACNA,CACT,CAEA,SAASM,EAAeS,EAAwB,CAC9C,MAAO,CAAE,MAAOA,EAAM,MAAO,cAAe,KAAM,EAAK,CACzD,CAEA,SAASJ,EAAgBI,EAAwB,CAC/C,MAAO,CAAE,MAAOA,CAAK,CACvB,CAEA,SAASZ,EAAUY,EAAwB,CACzC,MAAO,CAAE,MAAOA,EAAM,MAAO,aAAc,KAAM,EAAK,CACxD,CAEA,SAASV,EAAUU,EAAwB,CACzC,MAAO,CAAE,MAAOA,EAAM,MAAO,YAAa,CAC5C,CAEA,SAASL,GAA0B,CACjC,MAAO,CAAE,MAAO,IAAK,CACvB,CC7HA,eAAsBM,GACpBC,EACAC,EACAC,EACAC,EACAC,EAUgB,CAChB,IAAMC,EAAa,IAAIC,EAAWL,CAAO,EACrCG,GAAa,cACfC,EAAW,aAAa,CACtB,IAAK,UACL,OAAQ,CAAC,EACT,MAAO,CAAC,SAAS,CACnB,CAAC,GAECD,GAAa,aAAe,KAC9BC,EAAW,aAAa,CACtB,IAAK,OACL,OAAQ,CAAC,EACT,MAAO,CAAC,MAAM,CAChB,CAAC,EAUH,IAAME,EAAqBJ,EAAQ,yBAAyBE,CAAU,EACtE,GAAID,GAAa,cACXC,EAAW,YAAY,SAAS,EAClC,OAACD,GAAa,aAAe,QAAQ,KACnC,CAACJ,EAASI,EAAY,YAAY,EAAE,KAAK,GAAG,CAC9C,GACQA,GAAa,QAAU,QAAQ,MAAM,CAAC,EAGlD,IAAIA,GAAa,aAAe,KAC1BC,EAAW,YAAY,MAAM,EAC/B,OAACD,GAAa,aAAe,QAAQ,KACnCI,GAAmBR,EAASO,EAAoBH,GAAa,SAAS,CACxE,GACQA,GAAa,QAAU,QAAQ,MAAM,CAAC,EAGlD,GAAI,CACF,IAAMK,EAAsBF,EAAmB,0BAA0B,EACzE,GAAI,CAEF,aAAME,EAAoB,mBAAmBP,CAAO,GAC5CE,GAAa,QAAU,QAAQ,MAAM,CAAC,CAChD,OAASM,EAAO,CACd,OAAIN,GAAa,SACfA,EAAY,QAAQM,CAAK,GAEnBN,GAAa,QAAU,QAAQ,MAAM,CAAC,CAChD,CACF,OAASM,EAAO,CAMd,IALIN,GAAa,cAAgB,MAC9BA,GAAa,aAAe,QAAQ,OACnCI,GAAmBR,EAASO,EAAoBH,GAAa,SAAS,CACxE,EAEEA,GAAa,QACfA,EAAY,QAAQM,CAAK,MACpB,CACL,IAAMC,EAAcC,GAAkBR,GAAa,SAAS,GAC3DA,GAAa,aAAe,QAAQ,OACnC,CACES,EAAoBF,EAAa,CAC/B,MAAO,SACP,MAAO,YACP,KAAM,EACR,CAAC,EACDE,EAAoBF,EAAa,CAC/B,MAAOD,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EAC5D,KAAM,EACR,CAAC,CACH,EAAE,KAAK,GAAG,CACZ,CACF,CACA,OAAQN,GAAa,QAAU,QAAQ,MAAM,CAAC,CAChD,CACF,CAEA,SAASI,GACPR,EACAc,EACAC,EACA,CACA,OAAOC,EAAsB,CAC3B,QAAAhB,EACA,aAAcc,EAAmB,cAAc,EAC/C,YAAaF,GAAkBG,CAAS,CAC1C,CAAC,EAAE,KAAK;AAAA,CAAI,CACd,CAEA,SAASH,GAAkBG,EAAkC,CAC3D,OAAIA,IAAc,OACTE,EAAwB,EAE1BF,EAAY,MAAQ,MAC7B","names":["index_exports","__export","ReaderArgs","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","readerArgs","generateUsage","executionUsage","argument","breadcrumbArgument","executionInterpreterFactory","lastPositional","executionInterpreterInstance","context","error","commandWithSubcommands","subcommands","subcommandName","subcommandInput","subcommandInterpreterFactory","subcommandUsage","breadcrumbCommand","subcommandInterpreterInstance","payload","name","subcommand","value","execution","inputs","handler","optionsUsage","optionKey","optionInput","argumentsUsage","argumentInput","readerArgs","optionsConsumers","argumentsValues","optionsValues","context","typoPrintableString","typoSupport","typoText","colorStartCode","ttyCodeColors","colorBoldCode","ttyCodeBold","ttyCodeReset","typoInferProcessSupport","gridToPrintableLines","grid","typoSupport","delimiter","lines","gridWidths","gridRow","gridColumnIndex","gridCell","length","gridCellLength","lineColumns","parts","text","typoPrintableString","padding","cell","optionFlag","definition","readerArgs","key","longs","shorts","value","optionRepeatable","label","typeDecode","optionSingleValue","values","v","firstValue","_parsedArgs","_parsedIndex","_parsedDouble","_flagKeyByShort","_flagKeyByLong","_flagInfoByKey","_flagResultByKey","_optionKeyByShort","_optionKeyByLong","_optionInfoByKey","_optionResultByKey","_ReaderArgs_instances","consumeArg_fn","consumeOptionValue_fn","parseAsPositional_fn","consumeOptionLong_fn","tryConsumeOptionShort_fn","acknowledgeFlag_fn","acknowledgeOption_fn","ensureUniqueKey_fn","ensureUniqueName_fn","ReaderArgs","args","__privateAdd","__privateSet","definition","__privateMethod","__privateGet","short","long","key","result","arg","positional","__privateWrapper","valueIndexStart","shortIndexStart","shortIndexEnd","rest","leftover","direct","flagKey","value","booleanValues","booleanExpected","optionKey","values","nameShortOrLong","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","readerArgs","ReaderArgs","interpreterFactory","computeUsageString","interpreterInstance","error","typoSupport","chooseTypoSupport","typoPrintableString","commandInterpreter","useColors","usageToPrintableLines","typoInferProcessSupport"]}
|
|
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} (expected: \"true\"|\"false\")`);\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} (expected: ISO_8601 format)`);\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} comma-separated parts`,\n );\n }\n return parts.map((part, index) =>\n typeDecode(\n elementTypes[index]!,\n part,\n `[${index}].${elementTypes[index]!.label}`,\n ),\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) =>\n typeDecode(elementType, part, `[${index}].${elementType.label}`),\n );\n },\n };\n}\n\nexport function typeDecode<Value>(\n type: Type<Value>,\n value: string,\n context: string,\n): Value {\n try {\n return type.decoder(value);\n } catch (error) {\n throw new Error(\n `Failed to decode value \"${value}\" for ${context}: ${\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: Uppercase<string>;\n};\n\nexport function argumentRequired<Value>(definition: {\n description?: string;\n label?: Uppercase<string>;\n type: Type<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}>` as Uppercase<string>,\n };\n },\n consumeValue(readerPositionals: ReaderPositionals) {\n const positional = readerPositionals.consumePositional();\n if (positional === undefined) {\n throw new Error(`Missing required argument: ${label}`);\n }\n return typeDecode(definition.type, positional, label);\n },\n };\n}\n\nexport function argumentOptional<Value>(definition: {\n description?: string;\n label?: Uppercase<string>;\n type: Type<Value>;\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}]` as Uppercase<string>,\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, positional, label);\n },\n };\n}\n\nexport function argumentVariadics<Value>(definition: {\n endDelimiter?: string;\n description?: string;\n label?: Uppercase<string>;\n type: Type<Value>;\n}): Argument<Array<Value>> {\n const label = definition.label ?? definition.type.label;\n return {\n generateUsage() {\n return {\n description: definition.description,\n label: (`[${label}]...` +\n (definition.endDelimiter\n ? `[\"${definition.endDelimiter}\"]`\n : \"\")) as Uppercase<string>,\n };\n },\n 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, positional, label));\n }\n return values;\n },\n };\n}\n","import { ArgumentUsage } from \"./Argument\";\nimport { Execution } from \"./Execution\";\nimport { OptionUsage } from \"./Option\";\nimport { ReaderArgs } from \"./Reader\";\n\nexport type Command<Context, Result> = {\n getDescription(): string | undefined;\n createInterpreterFactory(\n readerArgs: ReaderArgs,\n ): CommandInterpreterFactory<Context, Result>;\n};\n\nexport type CommandInterpreterFactory<Context, Result> = {\n generateUsage(): CommandUsage;\n createInterpreterInstance(): CommandInterpreterInstance<Context, Result>;\n};\n\nexport type CommandInterpreterInstance<Context, Result> = {\n executeWithContext(context: Context): Promise<Result>;\n};\n\nexport type CommandMetadata = {\n description: string;\n details?: string;\n // TODO - printable examples ?\n};\n\nexport type CommandUsage = {\n metadata: CommandMetadata;\n breadcrumbs: Array<CommandUsageBreadcrumb>;\n 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 createInterpreterFactory(readerArgs: ReaderArgs) {\n function generateUsage(): CommandUsage {\n const executionUsage = execution.generateUsage();\n return {\n metadata,\n breadcrumbs: executionUsage.arguments.map((argument) =>\n breadcrumbArgument(argument.label),\n ),\n options: executionUsage.options,\n arguments: executionUsage.arguments,\n subcommands: [],\n };\n }\n try {\n const executionInterpreterFactory =\n execution.createInterpreterFactory(readerArgs);\n return {\n generateUsage,\n createInterpreterInstance() {\n const lastPositional = readerArgs.consumePositional();\n if (lastPositional !== undefined) {\n throw Error(`Unexpected argument: \"${lastPositional}\"`);\n }\n const executionInterpreterInstance =\n executionInterpreterFactory.createInterpreterInstance();\n return {\n async executeWithContext(context: Context) {\n return executionInterpreterInstance.executeWithContext(context);\n },\n };\n },\n };\n } catch (error) {\n return {\n generateUsage,\n createInterpreterInstance() {\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 createInterpreterFactory(readerArgs: ReaderArgs) {\n try {\n const executionInterpreterFactory =\n execution.createInterpreterFactory(readerArgs);\n const subcommandName = readerArgs.consumePositional();\n if (subcommandName === undefined) {\n throw new Error(\"Missing required argument: SUBCOMMAND\");\n }\n const subcommandInput =\n subcommands[subcommandName as Lowercase<string>];\n if (subcommandInput === undefined) {\n throw new Error(`Invalid SUBCOMMAND: \"${subcommandName}\"`);\n }\n const subcommandInterpreterFactory =\n subcommandInput.createInterpreterFactory(readerArgs);\n return {\n generateUsage() {\n const executionUsage = execution.generateUsage();\n const subcommandUsage =\n subcommandInterpreterFactory.generateUsage();\n return {\n metadata: subcommandUsage.metadata,\n breadcrumbs: executionUsage.arguments\n .map((argument) => breadcrumbArgument(argument.label))\n .concat([breadcrumbCommand(subcommandName)])\n .concat(subcommandUsage.breadcrumbs),\n options: executionUsage.options.concat(subcommandUsage.options),\n arguments: executionUsage.arguments.concat(\n subcommandUsage.arguments,\n ),\n subcommands: subcommandUsage.subcommands,\n };\n },\n createInterpreterInstance() {\n // TODO - unit tests to enforce ordering here\n const subcommandInterpreterInstance =\n subcommandInterpreterFactory.createInterpreterInstance();\n const executionInterpreterInstance =\n executionInterpreterFactory.createInterpreterInstance();\n return {\n async executeWithContext(context: Context) {\n const payload =\n await executionInterpreterInstance.executeWithContext(\n context,\n );\n return await subcommandInterpreterInstance.executeWithContext(\n payload,\n );\n },\n };\n },\n };\n } catch (error) {\n return {\n generateUsage() {\n const executionUsage = execution.generateUsage();\n return {\n metadata,\n breadcrumbs: executionUsage.arguments\n .map((argument) => breadcrumbArgument(argument.label))\n .concat([breadcrumbCommand(\"<SUBCOMMAND>\")]),\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 createInterpreterInstance() {\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 { ReaderArgs } from \"./Reader\";\n\nexport type Execution<Context, Result> = {\n generateUsage(): ExecutionUsage;\n createInterpreterFactory(\n readerArgs: ReaderArgs,\n ): ExecutionInterpreterFactory<Context, Result>;\n};\n\nexport type ExecutionInterpreterFactory<Context, Result> = {\n createInterpreterInstance(): ExecutionInterpreterInstance<Context, Result>;\n};\n\nexport type ExecutionInterpreterInstance<Context, Result> = {\n executeWithContext(context: Context): Promise<Result>;\n};\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 generateUsage() {\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 createInterpreterFactory(readerArgs: ReaderArgs) {\n const optionsConsumers: any = {};\n for (const optionKey in inputs.options) {\n const optionInput = inputs.options[optionKey]!;\n optionsConsumers[optionKey] = optionInput.prepareConsumer(readerArgs);\n }\n const argumentsValues: any = [];\n for (const argumentInput of inputs.arguments) {\n argumentsValues.push(argumentInput.consumeValue(readerArgs));\n }\n return {\n createInterpreterInstance() {\n const optionsValues: any = {};\n for (const optionKey in optionsConsumers) {\n optionsValues[optionKey] = optionsConsumers[optionKey]!();\n }\n return {\n executeWithContext(context: Context) {\n return handler(context, {\n options: optionsValues,\n arguments: argumentsValues,\n });\n },\n };\n },\n };\n },\n };\n}\n","export type TypoSupport = \"none\" | \"tty\" | \"mock\";\nexport type TypoColor =\n | \"darkBlack\"\n | \"darkRed\"\n | \"darkGreen\"\n | \"darkYellow\"\n | \"darkBlue\"\n | \"darkMagenta\"\n | \"darkCyan\"\n | \"darkWhite\"\n | \"brightBlack\"\n | \"brightRed\"\n | \"brightGreen\"\n | \"brightYellow\"\n | \"brightBlue\"\n | \"brightMagenta\"\n | \"brightCyan\"\n | \"brightWhite\";\n\nexport type TypoText = {\n value: string;\n foregroundColor?: TypoColor;\n backgroundColor?: TypoColor;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: 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 foregroundColorCode = typoText.foregroundColor\n ? ttyCodeForegroundColors[typoText.foregroundColor]\n : \"\";\n const backgroundColorCode = typoText.backgroundColor\n ? ttyCodeBackgroundColors[typoText.backgroundColor]\n : \"\";\n const boldCode = typoText.bold ? ttyCodeBold : \"\";\n const italicCode = typoText.italic ? ttyCodeItalic : \"\";\n const underlineCode = typoText.underline ? ttyCodeUnderline : \"\";\n const strikethroughCode = typoText.strikethrough\n ? ttyCodeStrikethrough\n : \"\";\n return `${foregroundColorCode}${backgroundColorCode}${boldCode}${italicCode}${underlineCode}${strikethroughCode}${typoText.value}${ttyCodeReset}`;\n }\n if (typoSupport === \"mock\") {\n const foregroundColorPart = typoText.foregroundColor\n ? `{${typoText.value}}@${typoText.foregroundColor}`\n : typoText.value;\n const backgroundColorPart = typoText.backgroundColor\n ? `{${foregroundColorPart}}#${typoText.backgroundColor}`\n : foregroundColorPart;\n const boldPart = typoText.bold\n ? `{${backgroundColorPart}}+`\n : backgroundColorPart;\n const italicPart = typoText.italic ? `{${boldPart}}*` : boldPart;\n const underlinePart = typoText.underline ? `{${italicPart}}_` : italicPart;\n const strikethroughPart = typoText.strikethrough\n ? `{${underlinePart}}~`\n : underlinePart;\n return strikethroughPart;\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 ttyCodeReset = \"\\x1b[0m\";\nconst ttyCodeBold = \"\\x1b[1m\";\nconst ttyCodeItalic = \"\\x1b[3m\";\nconst ttyCodeUnderline = \"\\x1b[4m\";\nconst ttyCodeStrikethrough = \"\\x1b[9m\";\nconst ttyCodeForegroundColors: Record<TypoColor, string> = {\n darkBlack: \"\\x1b[30m\",\n darkRed: \"\\x1b[31m\",\n darkGreen: \"\\x1b[32m\",\n darkYellow: \"\\x1b[33m\",\n darkBlue: \"\\x1b[34m\",\n darkMagenta: \"\\x1b[35m\",\n darkCyan: \"\\x1b[36m\",\n darkWhite: \"\\x1b[37m\",\n brightBlack: \"\\x1b[90m\",\n brightRed: \"\\x1b[91m\",\n brightGreen: \"\\x1b[92m\",\n brightYellow: \"\\x1b[93m\",\n brightBlue: \"\\x1b[94m\",\n brightMagenta: \"\\x1b[95m\",\n brightCyan: \"\\x1b[96m\",\n brightWhite: \"\\x1b[97m\",\n};\nconst ttyCodeBackgroundColors: Record<TypoColor, string> = {\n darkBlack: \"\\x1b[40m\",\n darkRed: \"\\x1b[41m\",\n darkGreen: \"\\x1b[42m\",\n darkYellow: \"\\x1b[43m\",\n darkBlue: \"\\x1b[44m\",\n darkMagenta: \"\\x1b[45m\",\n darkCyan: \"\\x1b[46m\",\n darkWhite: \"\\x1b[47m\",\n brightBlack: \"\\x1b[100m\",\n brightRed: \"\\x1b[101m\",\n brightGreen: \"\\x1b[102m\",\n brightYellow: \"\\x1b[103m\",\n brightBlue: \"\\x1b[104m\",\n brightMagenta: \"\\x1b[105m\",\n brightCyan: \"\\x1b[106m\",\n brightWhite: \"\\x1b[107m\",\n};\n","import { 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 { ReaderArgs } from \"./Reader\";\nimport { Type, typeDecode } from \"./Type\";\n\nexport type Option<Value> = {\n generateUsage(): OptionUsage;\n prepareConsumer(readerArgs: ReaderArgs): 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 long: Lowercase<string>;\n short?: string;\n description?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n default?: () => boolean;\n}): Option<boolean> {\n return {\n generateUsage() {\n return {\n description: definition.description,\n long: definition.long,\n short: definition.short,\n label: undefined,\n };\n },\n prepareConsumer(readerArgs: ReaderArgs) {\n const key = computeKey(definition.long, definition.short);\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 readerArgs.registerFlag({ key, longs, shorts });\n return () => {\n const value = readerArgs.consumeFlag(key);\n if (value === undefined) {\n return definition.default ? definition.default() : false;\n }\n return value;\n };\n },\n };\n}\n\nexport function optionRepeatable<Value>(definition: {\n long: Lowercase<string>;\n short?: string;\n description?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n label?: Uppercase<string>;\n type: Type<Value>;\n}): Option<Array<Value>> {\n const label = definition.label ?? definition.type.label;\n return {\n generateUsage() {\n // TODO - showcase that it can be repeated ?\n return {\n description: definition.description,\n long: definition.long,\n short: definition.short,\n label: `<${label}>` as Uppercase<string>,\n };\n },\n prepareConsumer(readerArgs: ReaderArgs) {\n const key = computeKey(definition.long, definition.short);\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 readerArgs.registerOption({ key, longs, shorts });\n return () => {\n return readerArgs\n .consumeOption(key)\n .map((value) =>\n typeDecode(definition.type, value, `${key}: ${label}`),\n );\n };\n },\n };\n}\n\nexport function optionSingleValue<Value>(definition: {\n long: Lowercase<string>;\n short?: string;\n description?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n label?: Uppercase<string>;\n type: Type<Value>;\n default: () => Value;\n}): Option<Value> {\n const label = definition.label ?? definition.type.label;\n return {\n generateUsage() {\n return {\n description: definition.description,\n long: definition.long,\n short: definition.short,\n label: `<${label}>` as Uppercase<string>,\n };\n },\n prepareConsumer(readerArgs: ReaderArgs) {\n const key = computeKey(definition.long, definition.short);\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 readerArgs.registerOption({ key, longs, shorts });\n return () => {\n const values = readerArgs.consumeOption(key);\n if (values.length > 1) {\n throw new Error(\n `Multiple values provided for option: ${key}, expected only one. Found: ${values.map((v) => `\"${v}\"`).join(\", \")}`,\n );\n }\n const firstValue = values[0];\n if (firstValue === undefined) {\n return definition.default();\n }\n return typeDecode(definition.type, firstValue, `${key}: ${label}`);\n };\n },\n };\n}\n\nfunction computeKey(long: Lowercase<string>, short?: string): string {\n return short ? `-${short}, --${long}` : `--${long}`;\n}\n","export type ReaderPositionals = {\n consumePositional(): string | undefined;\n};\n\nexport class ReaderArgs {\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(key: string) {\n const arg = this.#consumeArg();\n if (arg === null) {\n throw new Error(`Option ${key} requires a value but none was provided`);\n }\n if (this.#parsedDouble) {\n throw new Error(`Option ${key} 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 ${key} 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 const leftover = arg.slice(shortIndexStart);\n throw new Error(`Unknown flag or option: -${leftover}`);\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 = booleanValues.get(direct.toLowerCase());\n if (value !== undefined) {\n return this.#acknowledgeFlag(flagKey, value);\n }\n throw new Error(\n `Invalid value for flag: --${long}: \"${direct}\" (expected: ${booleanExpected})`,\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(\n optionKey,\n this.#consumeOptionValue(`--${long}`),\n );\n }\n throw new Error(`Unknown 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 = booleanValues.get(rest.slice(1).toLowerCase());\n if (value !== undefined) {\n this.#acknowledgeFlag(flagKey, value);\n return true;\n }\n throw new Error(\n `Invalid value for flag: -${short}: \"${rest}\" (expected: ${booleanExpected})`,\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(\n optionKey,\n this.#consumeOptionValue(`-${short}`),\n );\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\nconst booleanExpected = `\"yes\"|\"no\"`;\nconst booleanValues = new Map<string, boolean>([\n [\"true\", true],\n [\"false\", false],\n [\"yes\", true],\n [\"no\", false],\n [\"t\", true],\n [\"f\", false],\n [\"y\", true],\n [\"n\", false],\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(\n typoSupport,\n textOverview(commandUsage.metadata.description),\n ),\n );\n if (commandUsage.metadata.details) {\n lines.push(\n typoPrintableString(\n typoSupport,\n textSubtitle(commandUsage.metadata.details),\n ),\n );\n }\n\n lines.push(\"\");\n const breadcrumbs = [\n typoPrintableString(typoSupport, textUsageTitle(\"Usage:\")),\n typoPrintableString(typoSupport, textConstants(cliName)),\n ].concat(\n commandUsage.breadcrumbs.map((breadcrumb) => {\n if (\"argument\" in breadcrumb) {\n return typoPrintableString(\n typoSupport,\n textUserInput(breadcrumb.argument),\n );\n }\n if (\"command\" in breadcrumb) {\n return typoPrintableString(\n typoSupport,\n textConstants(breadcrumb.command),\n );\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([textUserInput(argumentUsage.label)]);\n if (argumentUsage.description) {\n gridRow.push([textDelimiter()]);\n gridRow.push([textInformative(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([textConstants(subcommand.name)]);\n if (subcommand.description) {\n gridRow.push([textDelimiter()]);\n gridRow.push([textInformative(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([\n textConstants(`-${optionUsage.short}`),\n textDelimiter(\", \"),\n ]);\n } else {\n gridRow.push([]);\n }\n if (optionUsage.label) {\n gridRow.push([\n textConstants(`--${optionUsage.long} `),\n textUserInput(optionUsage.label),\n ]);\n } else {\n gridRow.push([textConstants(`--${optionUsage.long}`)]);\n }\n if (optionUsage.description) {\n gridRow.push([textDelimiter()]);\n gridRow.push([textInformative(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 textOverview(value: string): TypoText {\n return { value, bold: true };\n}\n\nfunction textSubtitle(value: string): TypoText {\n return { value, foregroundColor: \"brightBlack\", italic: true };\n}\n\nfunction textInformative(value: string): TypoText {\n return { value };\n}\n\nfunction textUsageTitle(value: string): TypoText {\n return { value, foregroundColor: \"brightMagenta\", bold: true };\n}\n\nfunction textBlockTitle(value: string): TypoText {\n return { value, foregroundColor: \"brightGreen\", bold: true };\n}\n\nfunction textConstants(value: string): TypoText {\n return { value, foregroundColor: \"brightCyan\", bold: true };\n}\n\nfunction textUserInput(value: string): TypoText {\n return { value, foregroundColor: \"brightBlue\", italic: true };\n}\n\nfunction textDelimiter(value?: string): TypoText {\n return { value: value ?? \" \" };\n}\n","import { Command, CommandInterpreterFactory } from \"./Command\";\nimport { ReaderArgs } 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 readerArgs = new ReaderArgs(cliArgs);\n if (application?.buildVersion) {\n readerArgs.registerFlag({\n key: \"version\",\n shorts: [],\n longs: [\"version\"],\n });\n }\n if (application?.usageOnHelp ?? true) {\n readerArgs.registerFlag({\n key: \"help\",\n shorts: [],\n longs: [\"help\"],\n });\n }\n /*\n // TODO - handle completions ?\n readerArgs.registerFlag({\n key: \"completion\",\n shorts: [],\n longs: [\"completion\"],\n });\n */\n const interpreterFactory = command.createInterpreterFactory(readerArgs);\n if (application?.buildVersion) {\n if (readerArgs.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 (readerArgs.consumeFlag(\"help\")) {\n const typoSupport = chooseTypoSupport(application?.useColors);\n (application?.onLogStdOut ?? console.log)(\n computeUsageString(cliName, interpreterFactory, typoSupport),\n );\n return (application?.onExit ?? process.exit)(0);\n }\n }\n try {\n const interpreterInstance = interpreterFactory.createInterpreterInstance();\n await interpreterInstance.executeWithContext(context);\n return (application?.onExit ?? process.exit)(0);\n } catch (error) {\n if (application?.onError) {\n application.onError(error);\n } else {\n const typoSupport = chooseTypoSupport(application?.useColors);\n if (application?.usageOnError ?? true) {\n (application?.onLogStdErr ?? console.error)(\n computeUsageString(cliName, interpreterFactory, typoSupport),\n );\n }\n (application?.onLogStdErr ?? console.error)(\n computeErrorString(error, typoSupport),\n );\n }\n return (application?.onExit ?? process.exit)(1);\n }\n}\n\nfunction computeErrorString(error: unknown, typoSupport: TypoSupport) {\n return [\n typoPrintableString(typoSupport, {\n value: \"Error:\",\n foregroundColor: \"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\nfunction computeUsageString<Context, Result>(\n cliName: Lowercase<string>,\n commandInterpreter: CommandInterpreterFactory<Context, Result>,\n typoSupport: TypoSupport,\n) {\n return usageToPrintableLines({\n cliName,\n commandUsage: commandInterpreter.generateUsage(),\n typoSupport,\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","ReaderArgs","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","readerArgs","generateUsage","executionUsage","argument","breadcrumbArgument","executionInterpreterFactory","lastPositional","executionInterpreterInstance","context","error","commandWithSubcommands","subcommands","subcommandName","subcommandInput","subcommandInterpreterFactory","subcommandUsage","breadcrumbCommand","subcommandInterpreterInstance","payload","name","subcommand","value","execution","inputs","handler","optionsUsage","optionKey","optionInput","argumentsUsage","argumentInput","readerArgs","optionsConsumers","argumentsValues","optionsValues","context","typoPrintableString","typoSupport","typoText","foregroundColorCode","ttyCodeForegroundColors","backgroundColorCode","ttyCodeBackgroundColors","boldCode","ttyCodeBold","italicCode","ttyCodeItalic","underlineCode","ttyCodeUnderline","strikethroughCode","ttyCodeStrikethrough","ttyCodeReset","foregroundColorPart","backgroundColorPart","boldPart","italicPart","underlinePart","typoInferProcessSupport","gridToPrintableLines","grid","typoSupport","delimiter","lines","gridWidths","gridRow","gridColumnIndex","gridCell","length","gridCellLength","lineColumns","parts","text","typoPrintableString","padding","cell","optionFlag","definition","readerArgs","key","computeKey","longs","shorts","value","optionRepeatable","label","typeDecode","optionSingleValue","values","v","firstValue","long","short","_parsedArgs","_parsedIndex","_parsedDouble","_flagKeyByShort","_flagKeyByLong","_flagInfoByKey","_flagResultByKey","_optionKeyByShort","_optionKeyByLong","_optionInfoByKey","_optionResultByKey","_ReaderArgs_instances","consumeArg_fn","consumeOptionValue_fn","parseAsPositional_fn","consumeOptionLong_fn","tryConsumeOptionShort_fn","acknowledgeFlag_fn","acknowledgeOption_fn","ensureUniqueKey_fn","ensureUniqueName_fn","ReaderArgs","args","__privateAdd","__privateSet","definition","__privateMethod","__privateGet","short","long","key","result","arg","positional","__privateWrapper","valueIndexStart","shortIndexStart","shortIndexEnd","rest","leftover","direct","flagKey","value","booleanValues","booleanExpected","optionKey","values","nameShortOrLong","usageToPrintableLines","params","cliName","commandUsage","typoSupport","lines","typoPrintableString","textOverview","textSubtitle","breadcrumbs","textUsageTitle","textConstants","breadcrumb","textUserInput","textBlockTitle","grid","argumentUsage","gridRow","textDelimiter","textInformative","gridToPrintableLines","subcommand","optionUsage","value","runAndExit","cliName","cliArgs","context","command","application","readerArgs","ReaderArgs","interpreterFactory","typoSupport","chooseTypoSupport","computeUsageString","error","computeErrorString","typoPrintableString","commandInterpreter","usageToPrintableLines","useColors","typoInferProcessSupport"]}
|
package/package.json
CHANGED
package/src/lib/Command.ts
CHANGED
|
@@ -131,10 +131,10 @@ export function commandWithSubcommands<Context, Payload, Result>(
|
|
|
131
131
|
},
|
|
132
132
|
createInterpreterInstance() {
|
|
133
133
|
// TODO - unit tests to enforce ordering here
|
|
134
|
-
const executionInterpreterInstance =
|
|
135
|
-
executionInterpreterFactory.createInterpreterInstance();
|
|
136
134
|
const subcommandInterpreterInstance =
|
|
137
135
|
subcommandInterpreterFactory.createInterpreterInstance();
|
|
136
|
+
const executionInterpreterInstance =
|
|
137
|
+
executionInterpreterFactory.createInterpreterInstance();
|
|
138
138
|
return {
|
|
139
139
|
async executeWithContext(context: Context) {
|
|
140
140
|
const payload =
|
package/src/lib/Option.ts
CHANGED
|
@@ -33,9 +33,7 @@ export function optionFlag(definition: {
|
|
|
33
33
|
};
|
|
34
34
|
},
|
|
35
35
|
prepareConsumer(readerArgs: ReaderArgs) {
|
|
36
|
-
const key = definition.short
|
|
37
|
-
? `-${definition.short}, --${definition.long}`
|
|
38
|
-
: `--${definition.long}`;
|
|
36
|
+
const key = computeKey(definition.long, definition.short);
|
|
39
37
|
const longs = [definition.long];
|
|
40
38
|
if (definition.aliases?.longs) {
|
|
41
39
|
longs.push(...definition.aliases?.longs);
|
|
@@ -76,9 +74,7 @@ export function optionRepeatable<Value>(definition: {
|
|
|
76
74
|
};
|
|
77
75
|
},
|
|
78
76
|
prepareConsumer(readerArgs: ReaderArgs) {
|
|
79
|
-
const key = definition.short
|
|
80
|
-
? `-${definition.short}, --${definition.long}`
|
|
81
|
-
: `--${definition.long}`;
|
|
77
|
+
const key = computeKey(definition.long, definition.short);
|
|
82
78
|
const longs = definition.long ? [definition.long] : [];
|
|
83
79
|
if (definition.aliases?.longs) {
|
|
84
80
|
longs.push(...definition.aliases?.longs);
|
|
@@ -119,9 +115,7 @@ export function optionSingleValue<Value>(definition: {
|
|
|
119
115
|
};
|
|
120
116
|
},
|
|
121
117
|
prepareConsumer(readerArgs: ReaderArgs) {
|
|
122
|
-
const key = definition.short
|
|
123
|
-
? `-${definition.short}, --${definition.long}`
|
|
124
|
-
: `--${definition.long}`;
|
|
118
|
+
const key = computeKey(definition.long, definition.short);
|
|
125
119
|
const longs = [definition.long];
|
|
126
120
|
if (definition.aliases?.longs) {
|
|
127
121
|
longs.push(...definition.aliases?.longs);
|
|
@@ -147,3 +141,7 @@ export function optionSingleValue<Value>(definition: {
|
|
|
147
141
|
},
|
|
148
142
|
};
|
|
149
143
|
}
|
|
144
|
+
|
|
145
|
+
function computeKey(long: Lowercase<string>, short?: string): string {
|
|
146
|
+
return short ? `-${short}, --${long}` : `--${long}`;
|
|
147
|
+
}
|
package/src/lib/Run.ts
CHANGED
|
@@ -59,61 +59,58 @@ export async function runAndExit<Context>(
|
|
|
59
59
|
}
|
|
60
60
|
if (application?.usageOnHelp ?? true) {
|
|
61
61
|
if (readerArgs.consumeFlag("help")) {
|
|
62
|
+
const typoSupport = chooseTypoSupport(application?.useColors);
|
|
62
63
|
(application?.onLogStdOut ?? console.log)(
|
|
63
|
-
computeUsageString(cliName, interpreterFactory,
|
|
64
|
+
computeUsageString(cliName, interpreterFactory, typoSupport),
|
|
64
65
|
);
|
|
65
66
|
return (application?.onExit ?? process.exit)(0);
|
|
66
67
|
}
|
|
67
68
|
}
|
|
68
69
|
try {
|
|
69
70
|
const interpreterInstance = interpreterFactory.createInterpreterInstance();
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
await interpreterInstance.executeWithContext(context);
|
|
73
|
-
return (application?.onExit ?? process.exit)(0);
|
|
74
|
-
} catch (error) {
|
|
75
|
-
if (application?.onError) {
|
|
76
|
-
application.onError(error);
|
|
77
|
-
}
|
|
78
|
-
return (application?.onExit ?? process.exit)(1);
|
|
79
|
-
}
|
|
71
|
+
await interpreterInstance.executeWithContext(context);
|
|
72
|
+
return (application?.onExit ?? process.exit)(0);
|
|
80
73
|
} catch (error) {
|
|
81
|
-
if (application?.usageOnError ?? true) {
|
|
82
|
-
(application?.onLogStdErr ?? console.error)(
|
|
83
|
-
computeUsageString(cliName, interpreterFactory, application?.useColors),
|
|
84
|
-
);
|
|
85
|
-
}
|
|
86
74
|
if (application?.onError) {
|
|
87
75
|
application.onError(error);
|
|
88
76
|
} else {
|
|
89
77
|
const typoSupport = chooseTypoSupport(application?.useColors);
|
|
78
|
+
if (application?.usageOnError ?? true) {
|
|
79
|
+
(application?.onLogStdErr ?? console.error)(
|
|
80
|
+
computeUsageString(cliName, interpreterFactory, typoSupport),
|
|
81
|
+
);
|
|
82
|
+
}
|
|
90
83
|
(application?.onLogStdErr ?? console.error)(
|
|
91
|
-
|
|
92
|
-
typoPrintableString(typoSupport, {
|
|
93
|
-
value: "Error:",
|
|
94
|
-
color: "brightRed",
|
|
95
|
-
bold: true,
|
|
96
|
-
}),
|
|
97
|
-
typoPrintableString(typoSupport, {
|
|
98
|
-
value: error instanceof Error ? error.message : String(error),
|
|
99
|
-
bold: true,
|
|
100
|
-
}),
|
|
101
|
-
].join(" "),
|
|
84
|
+
computeErrorString(error, typoSupport),
|
|
102
85
|
);
|
|
103
86
|
}
|
|
104
87
|
return (application?.onExit ?? process.exit)(1);
|
|
105
88
|
}
|
|
106
89
|
}
|
|
107
90
|
|
|
91
|
+
function computeErrorString(error: unknown, typoSupport: TypoSupport) {
|
|
92
|
+
return [
|
|
93
|
+
typoPrintableString(typoSupport, {
|
|
94
|
+
value: "Error:",
|
|
95
|
+
foregroundColor: "brightRed",
|
|
96
|
+
bold: true,
|
|
97
|
+
}),
|
|
98
|
+
typoPrintableString(typoSupport, {
|
|
99
|
+
value: error instanceof Error ? error.message : String(error),
|
|
100
|
+
bold: true,
|
|
101
|
+
}),
|
|
102
|
+
].join(" ");
|
|
103
|
+
}
|
|
104
|
+
|
|
108
105
|
function computeUsageString<Context, Result>(
|
|
109
106
|
cliName: Lowercase<string>,
|
|
110
107
|
commandInterpreter: CommandInterpreterFactory<Context, Result>,
|
|
111
|
-
|
|
108
|
+
typoSupport: TypoSupport,
|
|
112
109
|
) {
|
|
113
110
|
return usageToPrintableLines({
|
|
114
111
|
cliName,
|
|
115
112
|
commandUsage: commandInterpreter.generateUsage(),
|
|
116
|
-
typoSupport
|
|
113
|
+
typoSupport,
|
|
117
114
|
}).join("\n");
|
|
118
115
|
}
|
|
119
116
|
|
package/src/lib/Typo.ts
CHANGED
|
@@ -19,8 +19,12 @@ export type TypoColor =
|
|
|
19
19
|
|
|
20
20
|
export type TypoText = {
|
|
21
21
|
value: string;
|
|
22
|
-
|
|
22
|
+
foregroundColor?: TypoColor;
|
|
23
|
+
backgroundColor?: TypoColor;
|
|
23
24
|
bold?: boolean;
|
|
25
|
+
italic?: boolean;
|
|
26
|
+
underline?: boolean;
|
|
27
|
+
strikethrough?: boolean;
|
|
24
28
|
};
|
|
25
29
|
|
|
26
30
|
export function typoPrintableString(
|
|
@@ -31,21 +35,36 @@ export function typoPrintableString(
|
|
|
31
35
|
return typoText.value;
|
|
32
36
|
}
|
|
33
37
|
if (typoSupport === "tty") {
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
38
|
+
const foregroundColorCode = typoText.foregroundColor
|
|
39
|
+
? ttyCodeForegroundColors[typoText.foregroundColor]
|
|
40
|
+
: "";
|
|
41
|
+
const backgroundColorCode = typoText.backgroundColor
|
|
42
|
+
? ttyCodeBackgroundColors[typoText.backgroundColor]
|
|
43
|
+
: "";
|
|
44
|
+
const boldCode = typoText.bold ? ttyCodeBold : "";
|
|
45
|
+
const italicCode = typoText.italic ? ttyCodeItalic : "";
|
|
46
|
+
const underlineCode = typoText.underline ? ttyCodeUnderline : "";
|
|
47
|
+
const strikethroughCode = typoText.strikethrough
|
|
48
|
+
? ttyCodeStrikethrough
|
|
49
|
+
: "";
|
|
50
|
+
return `${foregroundColorCode}${backgroundColorCode}${boldCode}${italicCode}${underlineCode}${strikethroughCode}${typoText.value}${ttyCodeReset}`;
|
|
37
51
|
}
|
|
38
52
|
if (typoSupport === "mock") {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
53
|
+
const foregroundColorPart = typoText.foregroundColor
|
|
54
|
+
? `{${typoText.value}}@${typoText.foregroundColor}`
|
|
55
|
+
: typoText.value;
|
|
56
|
+
const backgroundColorPart = typoText.backgroundColor
|
|
57
|
+
? `{${foregroundColorPart}}#${typoText.backgroundColor}`
|
|
58
|
+
: foregroundColorPart;
|
|
59
|
+
const boldPart = typoText.bold
|
|
60
|
+
? `{${backgroundColorPart}}+`
|
|
61
|
+
: backgroundColorPart;
|
|
62
|
+
const italicPart = typoText.italic ? `{${boldPart}}*` : boldPart;
|
|
63
|
+
const underlinePart = typoText.underline ? `{${italicPart}}_` : italicPart;
|
|
64
|
+
const strikethroughPart = typoText.strikethrough
|
|
65
|
+
? `{${underlinePart}}~`
|
|
66
|
+
: underlinePart;
|
|
67
|
+
return strikethroughPart;
|
|
49
68
|
}
|
|
50
69
|
throw new Error(`Unknown typo support: ${typoSupport}`);
|
|
51
70
|
}
|
|
@@ -73,7 +92,10 @@ export function typoInferProcessSupport(): TypoSupport {
|
|
|
73
92
|
|
|
74
93
|
const ttyCodeReset = "\x1b[0m";
|
|
75
94
|
const ttyCodeBold = "\x1b[1m";
|
|
76
|
-
const
|
|
95
|
+
const ttyCodeItalic = "\x1b[3m";
|
|
96
|
+
const ttyCodeUnderline = "\x1b[4m";
|
|
97
|
+
const ttyCodeStrikethrough = "\x1b[9m";
|
|
98
|
+
const ttyCodeForegroundColors: Record<TypoColor, string> = {
|
|
77
99
|
darkBlack: "\x1b[30m",
|
|
78
100
|
darkRed: "\x1b[31m",
|
|
79
101
|
darkGreen: "\x1b[32m",
|
|
@@ -91,3 +113,21 @@ const ttyCodeColors: Record<TypoColor, string> = {
|
|
|
91
113
|
brightCyan: "\x1b[96m",
|
|
92
114
|
brightWhite: "\x1b[97m",
|
|
93
115
|
};
|
|
116
|
+
const ttyCodeBackgroundColors: Record<TypoColor, string> = {
|
|
117
|
+
darkBlack: "\x1b[40m",
|
|
118
|
+
darkRed: "\x1b[41m",
|
|
119
|
+
darkGreen: "\x1b[42m",
|
|
120
|
+
darkYellow: "\x1b[43m",
|
|
121
|
+
darkBlue: "\x1b[44m",
|
|
122
|
+
darkMagenta: "\x1b[45m",
|
|
123
|
+
darkCyan: "\x1b[46m",
|
|
124
|
+
darkWhite: "\x1b[47m",
|
|
125
|
+
brightBlack: "\x1b[100m",
|
|
126
|
+
brightRed: "\x1b[101m",
|
|
127
|
+
brightGreen: "\x1b[102m",
|
|
128
|
+
brightYellow: "\x1b[103m",
|
|
129
|
+
brightBlue: "\x1b[104m",
|
|
130
|
+
brightMagenta: "\x1b[105m",
|
|
131
|
+
brightCyan: "\x1b[106m",
|
|
132
|
+
brightWhite: "\x1b[107m",
|
|
133
|
+
};
|
package/src/lib/Usage.ts
CHANGED
|
@@ -12,35 +12,37 @@ export function usageToPrintableLines(params: {
|
|
|
12
12
|
const lines = new Array<string>();
|
|
13
13
|
|
|
14
14
|
lines.push(
|
|
15
|
-
typoPrintableString(
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
typoPrintableString(
|
|
16
|
+
typoSupport,
|
|
17
|
+
textOverview(commandUsage.metadata.description),
|
|
18
|
+
),
|
|
19
19
|
);
|
|
20
20
|
if (commandUsage.metadata.details) {
|
|
21
21
|
lines.push(
|
|
22
|
-
typoPrintableString(
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
typoPrintableString(
|
|
23
|
+
typoSupport,
|
|
24
|
+
textSubtitle(commandUsage.metadata.details),
|
|
25
|
+
),
|
|
26
26
|
);
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
lines.push("");
|
|
30
30
|
const breadcrumbs = [
|
|
31
|
-
typoPrintableString(typoSupport,
|
|
32
|
-
|
|
33
|
-
color: "brightMagenta",
|
|
34
|
-
bold: true,
|
|
35
|
-
}),
|
|
36
|
-
typoPrintableString(typoSupport, textFixed(cliName)),
|
|
31
|
+
typoPrintableString(typoSupport, textUsageTitle("Usage:")),
|
|
32
|
+
typoPrintableString(typoSupport, textConstants(cliName)),
|
|
37
33
|
].concat(
|
|
38
34
|
commandUsage.breadcrumbs.map((breadcrumb) => {
|
|
39
35
|
if ("argument" in breadcrumb) {
|
|
40
|
-
return typoPrintableString(
|
|
36
|
+
return typoPrintableString(
|
|
37
|
+
typoSupport,
|
|
38
|
+
textUserInput(breadcrumb.argument),
|
|
39
|
+
);
|
|
41
40
|
}
|
|
42
41
|
if ("command" in breadcrumb) {
|
|
43
|
-
return typoPrintableString(
|
|
42
|
+
return typoPrintableString(
|
|
43
|
+
typoSupport,
|
|
44
|
+
textConstants(breadcrumb.command),
|
|
45
|
+
);
|
|
44
46
|
}
|
|
45
47
|
throw new Error(`Unknown breadcrumb: ${JSON.stringify(breadcrumb)}`);
|
|
46
48
|
}),
|
|
@@ -54,10 +56,10 @@ export function usageToPrintableLines(params: {
|
|
|
54
56
|
for (const argumentUsage of commandUsage.arguments) {
|
|
55
57
|
const gridRow = new Array<GridCell>();
|
|
56
58
|
gridRow.push([textDelimiter()]);
|
|
57
|
-
gridRow.push([
|
|
59
|
+
gridRow.push([textUserInput(argumentUsage.label)]);
|
|
58
60
|
if (argumentUsage.description) {
|
|
59
61
|
gridRow.push([textDelimiter()]);
|
|
60
|
-
gridRow.push([
|
|
62
|
+
gridRow.push([textInformative(argumentUsage.description)]);
|
|
61
63
|
}
|
|
62
64
|
grid.push(gridRow);
|
|
63
65
|
}
|
|
@@ -73,10 +75,10 @@ export function usageToPrintableLines(params: {
|
|
|
73
75
|
for (const subcommand of commandUsage.subcommands) {
|
|
74
76
|
const gridRow = new Array<GridCell>();
|
|
75
77
|
gridRow.push([textDelimiter()]);
|
|
76
|
-
gridRow.push([
|
|
78
|
+
gridRow.push([textConstants(subcommand.name)]);
|
|
77
79
|
if (subcommand.description) {
|
|
78
80
|
gridRow.push([textDelimiter()]);
|
|
79
|
-
gridRow.push([
|
|
81
|
+
gridRow.push([textInformative(subcommand.description)]);
|
|
80
82
|
}
|
|
81
83
|
grid.push(gridRow);
|
|
82
84
|
}
|
|
@@ -91,21 +93,24 @@ export function usageToPrintableLines(params: {
|
|
|
91
93
|
const gridRow = new Array<GridCell>();
|
|
92
94
|
gridRow.push([textDelimiter()]);
|
|
93
95
|
if (optionUsage.short) {
|
|
94
|
-
gridRow.push([
|
|
96
|
+
gridRow.push([
|
|
97
|
+
textConstants(`-${optionUsage.short}`),
|
|
98
|
+
textDelimiter(", "),
|
|
99
|
+
]);
|
|
95
100
|
} else {
|
|
96
101
|
gridRow.push([]);
|
|
97
102
|
}
|
|
98
103
|
if (optionUsage.label) {
|
|
99
104
|
gridRow.push([
|
|
100
|
-
|
|
101
|
-
|
|
105
|
+
textConstants(`--${optionUsage.long} `),
|
|
106
|
+
textUserInput(optionUsage.label),
|
|
102
107
|
]);
|
|
103
108
|
} else {
|
|
104
|
-
gridRow.push([
|
|
109
|
+
gridRow.push([textConstants(`--${optionUsage.long}`)]);
|
|
105
110
|
}
|
|
106
111
|
if (optionUsage.description) {
|
|
107
112
|
gridRow.push([textDelimiter()]);
|
|
108
|
-
gridRow.push([
|
|
113
|
+
gridRow.push([textInformative(optionUsage.description)]);
|
|
109
114
|
}
|
|
110
115
|
grid.push(gridRow);
|
|
111
116
|
}
|
|
@@ -116,22 +121,34 @@ export function usageToPrintableLines(params: {
|
|
|
116
121
|
return lines;
|
|
117
122
|
}
|
|
118
123
|
|
|
119
|
-
function
|
|
120
|
-
return { value
|
|
124
|
+
function textOverview(value: string): TypoText {
|
|
125
|
+
return { value, bold: true };
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function textSubtitle(value: string): TypoText {
|
|
129
|
+
return { value, foregroundColor: "brightBlack", italic: true };
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function textInformative(value: string): TypoText {
|
|
133
|
+
return { value };
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function textUsageTitle(value: string): TypoText {
|
|
137
|
+
return { value, foregroundColor: "brightMagenta", bold: true };
|
|
121
138
|
}
|
|
122
139
|
|
|
123
|
-
function
|
|
124
|
-
return { value:
|
|
140
|
+
function textBlockTitle(value: string): TypoText {
|
|
141
|
+
return { value, foregroundColor: "brightGreen", bold: true };
|
|
125
142
|
}
|
|
126
143
|
|
|
127
|
-
function
|
|
128
|
-
return { value
|
|
144
|
+
function textConstants(value: string): TypoText {
|
|
145
|
+
return { value, foregroundColor: "brightCyan", bold: true };
|
|
129
146
|
}
|
|
130
147
|
|
|
131
|
-
function
|
|
132
|
-
return { value
|
|
148
|
+
function textUserInput(value: string): TypoText {
|
|
149
|
+
return { value, foregroundColor: "brightBlue", italic: true };
|
|
133
150
|
}
|
|
134
151
|
|
|
135
|
-
function textDelimiter(): TypoText {
|
|
136
|
-
return { value: " " };
|
|
152
|
+
function textDelimiter(value?: string): TypoText {
|
|
153
|
+
return { value: value ?? " " };
|
|
137
154
|
}
|
|
@@ -140,42 +140,42 @@ it("run", async () => {
|
|
|
140
140
|
// console.log(usage1.join("\n"));
|
|
141
141
|
expect(usage1).toStrictEqual([
|
|
142
142
|
"{Root command description}+",
|
|
143
|
-
"{Root command details. Second line of root command details.}@brightBlack",
|
|
143
|
+
"{{Root command details. Second line of root command details.}@brightBlack}*",
|
|
144
144
|
"",
|
|
145
|
-
"{Usage:}@brightMagenta+ {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}+",
|
|
146
146
|
"",
|
|
147
|
-
"{Arguments:}@brightGreen+",
|
|
148
|
-
"
|
|
149
|
-
"
|
|
147
|
+
"{{Arguments:}@brightGreen}+",
|
|
148
|
+
" {{<POS-1>}@brightBlue}* First positional argument",
|
|
149
|
+
" {{<POS-2>}@brightBlue}* Second positional argument",
|
|
150
150
|
"",
|
|
151
|
-
"{Subcommands:}@brightGreen+",
|
|
152
|
-
"
|
|
153
|
-
"
|
|
151
|
+
"{{Subcommands:}@brightGreen}+",
|
|
152
|
+
" {{sub1}@brightCyan}+ Subcommand 1 description",
|
|
153
|
+
" {{sub2}@brightCyan}+ Subcommand 2 description",
|
|
154
154
|
"",
|
|
155
|
-
"{Options:}@brightGreen+",
|
|
156
|
-
"
|
|
157
|
-
"
|
|
158
|
-
"{
|
|
155
|
+
"{{Options:}@brightGreen}+",
|
|
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",
|
|
159
159
|
"",
|
|
160
160
|
]);
|
|
161
161
|
|
|
162
162
|
const usage2 = await getUsage(["50", "51", "sub1", "final"], cmd);
|
|
163
|
-
// console.log(usage2
|
|
163
|
+
// console.log(usage2);
|
|
164
164
|
expect(usage2).toStrictEqual([
|
|
165
165
|
"{Subcommand 1 description}+",
|
|
166
|
-
"{Subcommand 1 details. Second line of subcommand 1 details.}@brightBlack",
|
|
166
|
+
"{{Subcommand 1 details. Second line of subcommand 1 details.}@brightBlack}*",
|
|
167
167
|
"",
|
|
168
|
-
"{Usage:}@brightMagenta+ {my-cli}@brightCyan+ {<POS-1>}@brightBlue {<POS-2>}@brightBlue {sub1}@brightCyan+ {<POS-STRING>}@brightBlue",
|
|
168
|
+
"{{Usage:}@brightMagenta}+ {{my-cli}@brightCyan}+ {{<POS-1>}@brightBlue}* {{<POS-2>}@brightBlue}* {{sub1}@brightCyan}+ {{<POS-STRING>}@brightBlue}*",
|
|
169
169
|
"",
|
|
170
|
-
"{Arguments:}@brightGreen+",
|
|
171
|
-
"
|
|
172
|
-
"
|
|
173
|
-
"
|
|
170
|
+
"{{Arguments:}@brightGreen}+",
|
|
171
|
+
" {{<POS-1>}@brightBlue}* First positional argument",
|
|
172
|
+
" {{<POS-2>}@brightBlue}* Second positional argument",
|
|
173
|
+
" {{<POS-STRING>}@brightBlue}* Positional string argument",
|
|
174
174
|
"",
|
|
175
|
-
"{Options:}@brightGreen+",
|
|
176
|
-
"
|
|
177
|
-
"
|
|
178
|
-
"{
|
|
175
|
+
"{{Options:}@brightGreen}+",
|
|
176
|
+
" {{-b}@brightCyan}+, {{--boolean-flag}@brightCyan}+ Root boolean-flag description",
|
|
177
|
+
" {{-s}@brightCyan}+, {{--string-option }@brightCyan}+{{<COOL-STUFF>}@brightBlue}* Root string-option description",
|
|
178
|
+
" {{--complex-option }@brightCyan}+{{<NUMBER,STRING[,STRING...]>}@brightBlue}* Root complex-option description",
|
|
179
179
|
"",
|
|
180
180
|
]);
|
|
181
181
|
|
|
@@ -196,24 +196,25 @@ it("run", async () => {
|
|
|
196
196
|
],
|
|
197
197
|
cmd,
|
|
198
198
|
);
|
|
199
|
+
// console.log(usage3);
|
|
199
200
|
expect(usage3).toStrictEqual([
|
|
200
201
|
"{Subcommand 2 description}+",
|
|
201
|
-
"{Subcommand 2 details. Second line of subcommand 2 details.}@brightBlack",
|
|
202
|
+
"{{Subcommand 2 details. Second line of subcommand 2 details.}@brightBlack}*",
|
|
202
203
|
"",
|
|
203
|
-
"{Usage:}@brightMagenta+ {my-cli}@brightCyan+ {<POS-1>}@brightBlue {<POS-2>}@brightBlue {sub2}@brightCyan+ {<POS-NUMBER>}@brightBlue {[OPT-POS]}@brightBlue {[VARIADIC]...}@brightBlue",
|
|
204
|
+
"{{Usage:}@brightMagenta}+ {{my-cli}@brightCyan}+ {{<POS-1>}@brightBlue}* {{<POS-2>}@brightBlue}* {{sub2}@brightCyan}+ {{<POS-NUMBER>}@brightBlue}* {{[OPT-POS]}@brightBlue}* {{[VARIADIC]...}@brightBlue}*",
|
|
204
205
|
"",
|
|
205
|
-
"{Arguments:}@brightGreen+",
|
|
206
|
-
"
|
|
207
|
-
"
|
|
208
|
-
"
|
|
209
|
-
"
|
|
210
|
-
"
|
|
206
|
+
"{{Arguments:}@brightGreen}+",
|
|
207
|
+
" {{<POS-1>}@brightBlue}* First positional argument",
|
|
208
|
+
" {{<POS-2>}@brightBlue}* Second positional argument",
|
|
209
|
+
" {{<POS-NUMBER>}@brightBlue}* Positional number argument",
|
|
210
|
+
" {{[OPT-POS]}@brightBlue}* Optional positional argument",
|
|
211
|
+
" {{[VARIADIC]...}@brightBlue}* Variadic positional arguments",
|
|
211
212
|
"",
|
|
212
|
-
"{Options:}@brightGreen+",
|
|
213
|
-
"
|
|
214
|
-
"
|
|
215
|
-
"{
|
|
216
|
-
"{
|
|
213
|
+
"{{Options:}@brightGreen}+",
|
|
214
|
+
" {{-b}@brightCyan}+, {{--boolean-flag}@brightCyan}+ Root boolean-flag description",
|
|
215
|
+
" {{-s}@brightCyan}+, {{--string-option }@brightCyan}+{{<COOL-STUFF>}@brightBlue}* Root string-option description",
|
|
216
|
+
" {{--complex-option }@brightCyan}+{{<NUMBER,STRING[,STRING...]>}@brightBlue}* Root complex-option description",
|
|
217
|
+
" {{--dudu }@brightCyan}+{{<STRING>}@brightBlue}* Dudu option description",
|
|
217
218
|
"",
|
|
218
219
|
]);
|
|
219
220
|
});
|