cli-kiss 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +11 -13
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +1 -1
- package/src/lib/Command.ts +21 -21
- package/src/lib/{Process.ts → Execution.ts} +15 -17
- package/tests/unit.command.run.ts +4 -4
- package/tests/unit.command.usage.ts +4 -4
package/dist/index.d.ts
CHANGED
|
@@ -101,19 +101,17 @@ declare function optionSingleValue<Value>(definition: {
|
|
|
101
101
|
default: () => Value;
|
|
102
102
|
}): Option<Value>;
|
|
103
103
|
|
|
104
|
-
type
|
|
105
|
-
computeUsage():
|
|
106
|
-
prepareResolver(readerTokenizer: ReaderTokenizer):
|
|
104
|
+
type Execution<Context, Result> = {
|
|
105
|
+
computeUsage(): ExecutionUsage;
|
|
106
|
+
prepareResolver(readerTokenizer: ReaderTokenizer): ExecutionResolver<Context, Result>;
|
|
107
107
|
};
|
|
108
|
-
type
|
|
109
|
-
type
|
|
110
|
-
|
|
111
|
-
};
|
|
112
|
-
type ProcessUsage = {
|
|
108
|
+
type ExecutionResolver<Context, Result> = () => ExecutionCallback<Context, Result>;
|
|
109
|
+
type ExecutionCallback<Context, Result> = (context: Context) => Promise<Result>;
|
|
110
|
+
type ExecutionUsage = {
|
|
113
111
|
options: Array<OptionUsage>;
|
|
114
112
|
arguments: Array<ArgumentUsage>;
|
|
115
113
|
};
|
|
116
|
-
declare function
|
|
114
|
+
declare function execution<Context, Result, Options extends {
|
|
117
115
|
[option: string]: Option<any>;
|
|
118
116
|
}, const Arguments extends Array<Argument<any>>>(inputs: {
|
|
119
117
|
options: Options;
|
|
@@ -125,7 +123,7 @@ declare function process<Context, Result, Options extends {
|
|
|
125
123
|
arguments: {
|
|
126
124
|
[K in keyof Arguments]: ReturnType<Arguments[K]["consumeValue"]>;
|
|
127
125
|
};
|
|
128
|
-
}) => Promise<Result>):
|
|
126
|
+
}) => Promise<Result>): Execution<Context, Result>;
|
|
129
127
|
|
|
130
128
|
type Command<Context, Result> = {
|
|
131
129
|
getTitle(): string | undefined;
|
|
@@ -153,11 +151,11 @@ type CommandUsageBreadcrumb = {
|
|
|
153
151
|
declare function command<Context, Result>(metadata: {
|
|
154
152
|
title: string;
|
|
155
153
|
description?: Array<string>;
|
|
156
|
-
},
|
|
154
|
+
}, execution: Execution<Context, Result>): Command<Context, Result>;
|
|
157
155
|
declare function commandWithSubcommands<Context, Payload, Result>(metadata: {
|
|
158
156
|
title: string;
|
|
159
157
|
description?: Array<string>;
|
|
160
|
-
},
|
|
158
|
+
}, execution: Execution<Context, Payload>, subcommands: {
|
|
161
159
|
[subcommand: Lowercase<string>]: Command<Payload, Result>;
|
|
162
160
|
}): Command<Context, Result>;
|
|
163
161
|
|
|
@@ -196,4 +194,4 @@ declare function usageToPrintableLines(params: {
|
|
|
196
194
|
typoSupport: TypoSupport;
|
|
197
195
|
}): string[];
|
|
198
196
|
|
|
199
|
-
export { type Argument, type ArgumentUsage, type Command, type CommandRunner, type CommandUsage, type CommandUsageBreadcrumb, type
|
|
197
|
+
export { type Argument, type ArgumentUsage, type Command, type CommandRunner, type CommandUsage, type CommandUsageBreadcrumb, type Execution, type ExecutionCallback, type ExecutionResolver, type ExecutionUsage, type Grid, type GridCell, type GridRow, type Option, type OptionConsumer, type OptionUsage, type ReaderPositionals, ReaderTokenizer, type Type, type TypoSupport, type TypoText, argumentOptional, argumentRequired, argumentVariadics, command, commandWithSubcommands, execution, gridToPrintableLines, optionFlag, optionRepeatable, optionSingleValue, runWithArgv, typeBigInt, typeBoolean, typeCommaArray, typeDate, typeNumber, typeString, typoInferSupport, typoPrintableString, usageToPrintableLines };
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var L=Object.defineProperty;var ee=Object.getOwnPropertyDescriptor;var re=Object.getOwnPropertyNames;var te=Object.prototype.hasOwnProperty;var q=r=>{throw TypeError(r)};var ne=(r,e)=>{for(var t in e)L(r,t,{get:e[t],enumerable:!0})},se=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of re(e))!te.call(r,s)&&s!==t&&L(r,s,{get:()=>e[s],enumerable:!(n=ee(e,s))||n.enumerable});return r};var oe=r=>se(L({},"__esModule",{value:!0}),r);var N=(r,e,t)=>e.has(r)||q("Cannot "+t);var i=(r,e,t)=>(N(r,e,"read from private field"),t?t.call(r):e.get(r)),d=(r,e,t)=>e.has(r)?q("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(r):e.set(r,t),m=(r,e,t,n)=>(N(r,e,"write to private field"),n?n.call(r,t):e.set(r,t),t),c=(r,e,t)=>(N(r,e,"access private method"),t);var _=(r,e,t,n)=>({set _(s){m(r,e,s,t)},get _(){return i(r,e,n)}});var $e={};ne($e,{ReaderTokenizer:()=>I,argumentOptional:()=>ie,argumentRequired:()=>ae,argumentVariadics:()=>ue,command:()=>le,commandWithSubcommands:()=>pe,gridToPrintableLines:()=>P,optionFlag:()=>de,optionRepeatable:()=>he,optionSingleValue:()=>fe,process:()=>ye,runWithArgv:()=>we,typeBigInt:()=>Ae,typeBoolean:()=>xe,typeCommaArray:()=>ve,typeDate:()=>Re,typeNumber:()=>Ue,typeString:()=>Ce,typoInferSupport:()=>B,typoPrintableString:()=>h,usageToPrintableLines:()=>G});module.exports=oe($e);function ae(r){return{generateUsage(){return{description:r.description,label:`<${r.label??r.type.label}>`}},consumeValue(e){let t=e.consumePositional();if(t===void 0)throw new Error(`Missing required arg: <${r.label??r.type.label}>`);return r.type.decoder(t)}}}function ie(r){return{generateUsage(){return{description:r.description,label:`[${r.label??r.type.label}]`}},consumeValue(e){let t=e.consumePositional();return t===void 0?r.default():r.type.decoder(t)}}}function ue(r){return{generateUsage(){return{description:r.description,label:`[${r.label??r.type.label}...]`+(r.endDelimiter?` (end with ${r.endDelimiter})`:"")}},consumeValue(e){let t=[];for(;;){let n=e.consumePositional();if(n===void 0||n===r.endDelimiter)break;t.push(r.type.decoder(n))}return t}}}function le(r,e){return{getTitle(){return r.title},prepareRunner(t){function n(){let s=e.computeUsage();return{breadcrumbs:s.arguments.map(o=>F(o.label)),title:r.title,description:r.description,options:s.options,arguments:s.arguments,subcommands:[]}}try{let s=e.prepareResolver(t),o=t.consumePositional();if(o!==void 0)throw Error(`Unprocessed positional: ${o}`);let a=s();return{computeUsage:n,async execute(p){return await a.execute(p)}}}catch(s){return{computeUsage:n,async execute(o){throw s}}}}}}function pe(r,e,t){return{getTitle(){return r.title},prepareRunner(n){try{let s=e.prepareResolver(n),o=n.consumePositional();if(o===void 0)throw new Error("Expected a subcommand");let a=t[o];if(a===void 0)throw new Error(`Unknown subcommand: ${o}`);let p=a.prepareRunner(n),g=s();return{computeUsage(){let l=e.computeUsage(),f=p.computeUsage();return{breadcrumbs:l.arguments.map(Z=>F(Z.label)).concat([Y(o)]).concat(f.breadcrumbs),title:f.title,description:f.description,options:l.options.concat(f.options),arguments:l.arguments.concat(f.arguments),subcommands:f.subcommands}},async execute(l){let f=await g.execute(l);return await p.execute(f)}}}catch(s){return{computeUsage(){let o=e.computeUsage();return{breadcrumbs:o.arguments.map(a=>F(a.label)).concat([Y("<SUBCOMMAND>")]),title:r.title,description:r.description,options:o.options,arguments:o.arguments,subcommands:Object.entries(t).map(([a,p])=>({name:a,title:p.getTitle()}))}},async execute(o){throw s}}}}}}function F(r){return{kind:"argument",value:r}}function Y(r){return{kind:"command",value:r}}function h(r,e){if(r==="none")return e.value;if(r==="tty"){let t=e.color?me[e.color]:"",n=e.bold?ge:"";return`${t}${n}${e.value}${ce}`}if(r==="html"){let t=e.color?`<span style="color: ${e.color}">`:"",n=e.color?"</span>":"",s=e.bold?"<b>":"",o=e.bold?"</b>":"";return`${t}${s}${e.value}${o}${n}`}if(r==="mock")return e.color&&e.bold?`{${e.value}}@${e.color}+`:e.color?`{${e.value}}@${e.color}`:e.bold?`{${e.value}}+`:`{${e.value}}`;throw new Error(`Unknown typo support: ${r}`)}function B(){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||!process.stdout||!process.stdout.isTTY?"none":"tty"}var ce="\x1B[0m",ge="\x1B[1m",me={red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",grey:"\x1B[90m"};function P(r,e){let t=new Array,n=new Array;for(let s of r)for(let o=0;o<s.length;o++){let a=s[o],p=H(a);(n[o]===void 0||p>n[o])&&(n[o]=p)}for(let s of r){let o=new Array;for(let a=0;a<s.length;a++){let p=s[a],g=p.map(l=>h(e,l));if(a<s.length-1){let l=H(p),f=" ".repeat(n[a]-l);o.push(g.join("")+f)}else o.push(g.join(""))}t.push(o.join(" "))}return t}function H(r){let e=0;for(let t of r)e+=t.value.length;return e}function de(r){return{generateUsage(){return{description:r.description,long:r.long,short:r.short,label:void 0}},prepareConsumer(e){let t=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),e.registerFlag({key:t,longs:n,shorts:s}),()=>{let o=e.consumeFlag(t);return o===void 0?r.default?r.default():!1:o}}}}function he(r){return{generateUsage(){return{description:r.description,long:r.long,short:r.short,label:`<${r.label??r.type.label}>`}},prepareConsumer(e){let t=r.long,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),e.registerOption({key:t,longs:n,shorts:s}),()=>e.consumeOption(t).map(r.type.decoder)}}}function fe(r){return{generateUsage(){return{description:r.description,long:r.long,short:r.short,label:`<${r.label??r.type.label}>`}},prepareConsumer(e){let t=r.long,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),e.registerOption({key:t,longs:n,shorts:s}),()=>{let o=e.consumeOption(r.long);if(o.length>1)throw new Error(`Multiple values provided for option: ${r.long}`);let a=o[0];return a===void 0?r.default():r.type.decoder(a)}}}}function ye(r,e){return{computeUsage(){let t=new Array;for(let s in r.options){let o=r.options[s];t.push(o.generateUsage())}let n=new Array;for(let s of r.arguments)n.push(s.generateUsage());return{options:t,arguments:n}},prepareResolver(t){let n={};for(let o in r.options){let a=r.options[o];n[o]=a.prepareConsumer(t)}let s=[];for(let o of r.arguments)s.push(o.consumeValue(t));return()=>{let o={};for(let a in n)o[a]=n[a]();return{async execute(a){return await e(a,{options:o,arguments:s})}}}}}}var k,O,w,x,R,C,y,U,A,v,b,u,M,D,Q,z,X,V,$,W,E,I=class{constructor(e){d(this,u);d(this,k);d(this,O);d(this,w);d(this,x);d(this,R);d(this,C);d(this,y);d(this,U);d(this,A);d(this,v);d(this,b);m(this,k,e),m(this,O,0),m(this,w,!1),m(this,x,new Map),m(this,R,new Map),m(this,C,new Map),m(this,y,new Map),m(this,U,new Map),m(this,A,new Map),m(this,v,new Map),m(this,b,new Map)}registerFlag(e){c(this,u,W).call(this,e.key),i(this,C).set(e.key,{});for(let t of e.shorts)c(this,u,E).call(this,t),i(this,x).set(t,e.key);for(let t of e.longs)c(this,u,E).call(this,t),i(this,R).set(t,e.key)}registerOption(e){c(this,u,W).call(this,e.key),i(this,v).set(e.key,{});for(let t of e.shorts)c(this,u,E).call(this,t),i(this,U).set(t,e.key);for(let t of e.longs)c(this,u,E).call(this,t),i(this,A).set(t,e.key)}consumeFlag(e){if(i(this,C).get(e)===void 0)throw new Error(`Option flag not registered: ${e}`);let n=i(this,y).get(e);if(n===void 0){i(this,y).set(e,null);return}if(n===null)throw new Error(`Option flag already consumed: ${e}`);return i(this,y).set(e,null),n}consumeOption(e){if(i(this,v).get(e)===void 0)throw new Error(`Option values not registered: ${e}`);let n=i(this,b).get(e);if(n===void 0)return i(this,b).set(e,null),new Array;if(n===null)throw new Error(`Option values already consumed: ${e}`);return i(this,b).set(e,null),n}consumePositional(){for(;;){let e=c(this,u,M).call(this);if(e===null)return;let t=c(this,u,Q).call(this,e);if(t!==null)return t}}};k=new WeakMap,O=new WeakMap,w=new WeakMap,x=new WeakMap,R=new WeakMap,C=new WeakMap,y=new WeakMap,U=new WeakMap,A=new WeakMap,v=new WeakMap,b=new WeakMap,u=new WeakSet,M=function(){let e=i(this,k)[i(this,O)];return e===void 0?null:(_(this,O)._++,!i(this,w)&&e==="--"?(m(this,w,!0),c(this,u,M).call(this)):e)},D=function(e){let t=c(this,u,M).call(this);if(t===null)throw new Error(`Option ${e} requires a value`);if(i(this,w))throw new Error(`Option ${e} requires a value before --`);if(t.startsWith("-"))throw new Error(`Option ${e} requires a value, got: ${t}`);return t},Q=function(e){if(i(this,w))return e;if(e.startsWith("--")){let t=e.indexOf("=");return t===-1?c(this,u,z).call(this,e.slice(2),null):c(this,u,z).call(this,e.slice(2,t),e.slice(t+1)),null}if(e.startsWith("-")){let t=1,n=2;for(;n<=e.length;){let s=e.slice(t,n),o=e.slice(n),a=c(this,u,X).call(this,s,o);if(a===!0)return null;a===!1&&(t=n),n++}throw new Error(`Unknown short flags or options: ${e.slice(t)}`)}return e},z=function(e,t){let n=i(this,R).get(e);if(n!==void 0){if(t!==null){let o=J(t);if(o!==void 0)return c(this,u,V).call(this,n,o);throw new Error(`Invalid parameter for long flag: ${n}, value: ${t}`)}return c(this,u,V).call(this,n,!0)}let s=i(this,A).get(e);if(s!==void 0)return t!==null?c(this,u,$).call(this,s,t):c(this,u,$).call(this,s,c(this,u,D).call(this,e));throw new Error(`Unknown long flag or option: ${e}`)},X=function(e,t){let n=i(this,x).get(e);if(n!==void 0){if(t.startsWith("=")){let o=J(t.slice(1));if(o!==void 0)return c(this,u,V).call(this,n,o),!0;throw new Error(`Invalid parameter for short flag: ${e}, value: ${t}`)}return c(this,u,V).call(this,n,!0),t===""}let s=i(this,U).get(e);return s!==void 0?t===""?(c(this,u,$).call(this,s,c(this,u,D).call(this,e)),!0):(t.startsWith("=")?c(this,u,$).call(this,s,t.slice(1)):c(this,u,$).call(this,s,t),!0):null},V=function(e,t){if(i(this,y).has(e))throw new Error(`Flag already set: ${e}`);i(this,y).set(e,t)},$=function(e,t){let n=i(this,b).get(e)??new Array;n.push(t),i(this,b).set(e,n)},W=function(e){if(i(this,C).has(e))throw new Error(`Option already registered: ${e}`);if(i(this,v).has(e))throw new Error(`Option already registered: ${e}`)},E=function(e){if(i(this,x).has(e))throw new Error(`Option already registered: ${e}`);if(i(this,R).has(e))throw new Error(`Option already registered: ${e}`);if(i(this,U).has(e))throw new Error(`Option already registered: ${e}`);if(i(this,A).has(e))throw new Error(`Option already registered: ${e}`)};function J(r){let e=r.toLowerCase();if(e==="true"||e==="t"||e==="y"||e==="yes")return!0;if(e==="false"||e==="f"||e==="n"||e==="no")return!1}function G(r){let{cliName:e,commandUsage:t,typoSupport:n}=r,s=new Array;if(s.push(""),s.push(h(n,S(t.title))),t.description)for(let p of t.description)s.push(h(n,be(p)));let o=h(n,K("Usage:")),a=[h(n,T(e))].concat(t.breadcrumbs.map(p=>p.kind==="argument"?h(n,j(p.value)):h(n,T(p.value))));if(s.push(""),s.push(`${o} ${a.join(" ")}`),t.arguments.length>0){s.push(""),s.push(h(n,K("Arguments:")));let p=new Array;for(let g of t.arguments){let l=new Array;l.push([]),l.push([j(g.label)]),l.push([]),g.description&&l.push([S(g.description)]),p.push(l)}s.push(...P(p,n))}if(t.options.length>0){s.push(""),s.push(h(n,K("Options:")));let p=new Array;for(let g of t.options){let l=new Array;l.push([]),g.short?l.push([T(`-${g.short}`),{value:","}]):l.push([]),g.label?l.push([T(`--${g.long} `),j(g.label)]):l.push([T(`--${g.long}`),{value:"[=yes|no]",color:"grey"}]),l.push([]),g.description&&l.push([S(g.description)]),p.push(l)}s.push(...P(p,n))}if(t.subcommands.length>0){s.push(""),s.push(h(n,K("Subcommands:")));let p=new Array;for(let g of t.subcommands){let l=new Array;l.push([]),l.push([T(g.name)]),l.push([]),g.title&&l.push([S(g.title)]),p.push(l)}s.push(...P(p,n))}return s.push(""),s}function K(r){return{value:r,color:"green",bold:!0}}function be(r){return{value:r,color:"grey"}}function S(r){return{value:r,bold:!0}}function T(r){return{value:r,color:"cyan",bold:!0}}function j(r){return{value:r,color:"cyan"}}async function we(r,e,t,n){let s=n?.name??r[1],o=new I(r.slice(2));n?.version&&o.registerFlag({key:"version",shorts:[],longs:["version"]}),o.registerFlag({key:"help",shorts:[],longs:["help"]});try{let a=t.prepareRunner(o);n?.version&&o.consumeFlag("version")&&(console.log(s,n.version),process.exit(0)),o.consumeFlag("help")&&(console.log(G({cliName:s,commandUsage:a.computeUsage(),typoSupport:B()}).join(`
|
|
2
|
-
`)),process.exit(0));try{return await a.execute(e)}catch(p){(n?.helpOnError??!0)&&console.log(G({cliName:
|
|
3
|
-
`)),console.error(p),process.exit(1)}}catch(a){console.error(a),process.exit(1)}}var
|
|
1
|
+
"use strict";var L=Object.defineProperty;var ee=Object.getOwnPropertyDescriptor;var re=Object.getOwnPropertyNames;var te=Object.prototype.hasOwnProperty;var q=r=>{throw TypeError(r)};var ne=(r,e)=>{for(var t in e)L(r,t,{get:e[t],enumerable:!0})},oe=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of re(e))!te.call(r,o)&&o!==t&&L(r,o,{get:()=>e[o],enumerable:!(n=ee(e,o))||n.enumerable});return r};var se=r=>oe(L({},"__esModule",{value:!0}),r);var N=(r,e,t)=>e.has(r)||q("Cannot "+t);var i=(r,e,t)=>(N(r,e,"read from private field"),t?t.call(r):e.get(r)),d=(r,e,t)=>e.has(r)?q("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(r):e.set(r,t),m=(r,e,t,n)=>(N(r,e,"write to private field"),n?n.call(r,t):e.set(r,t),t),c=(r,e,t)=>(N(r,e,"access private method"),t);var _=(r,e,t,n)=>({set _(o){m(r,e,o,t)},get _(){return i(r,e,n)}});var $e={};ne($e,{ReaderTokenizer:()=>k,argumentOptional:()=>ie,argumentRequired:()=>ae,argumentVariadics:()=>ue,command:()=>le,commandWithSubcommands:()=>pe,execution:()=>ce,gridToPrintableLines:()=>E,optionFlag:()=>he,optionRepeatable:()=>fe,optionSingleValue:()=>ye,runWithArgv:()=>xe,typeBigInt:()=>Ae,typeBoolean:()=>we,typeCommaArray:()=>ve,typeDate:()=>Ce,typeNumber:()=>Ue,typeString:()=>Re,typoInferSupport:()=>B,typoPrintableString:()=>h,usageToPrintableLines:()=>G});module.exports=se($e);function ae(r){return{generateUsage(){return{description:r.description,label:`<${r.label??r.type.label}>`}},consumeValue(e){let t=e.consumePositional();if(t===void 0)throw new Error(`Missing required arg: <${r.label??r.type.label}>`);return r.type.decoder(t)}}}function ie(r){return{generateUsage(){return{description:r.description,label:`[${r.label??r.type.label}]`}},consumeValue(e){let t=e.consumePositional();return t===void 0?r.default():r.type.decoder(t)}}}function ue(r){return{generateUsage(){return{description:r.description,label:`[${r.label??r.type.label}...]`+(r.endDelimiter?` (end with ${r.endDelimiter})`:"")}},consumeValue(e){let t=[];for(;;){let n=e.consumePositional();if(n===void 0||n===r.endDelimiter)break;t.push(r.type.decoder(n))}return t}}}function le(r,e){return{getTitle(){return r.title},prepareRunner(t){function n(){let o=e.computeUsage();return{breadcrumbs:o.arguments.map(s=>F(s.label)),title:r.title,description:r.description,options:o.options,arguments:o.arguments,subcommands:[]}}try{let o=e.prepareResolver(t),s=t.consumePositional();if(s!==void 0)throw Error(`Unprocessed positional: ${s}`);let a=o();return{computeUsage:n,async execute(p){return await a(p)}}}catch(o){return{computeUsage:n,async execute(s){throw o}}}}}}function pe(r,e,t){return{getTitle(){return r.title},prepareRunner(n){try{let o=e.prepareResolver(n),s=n.consumePositional();if(s===void 0)throw new Error("Expected a subcommand");let a=t[s];if(a===void 0)throw new Error(`Unknown subcommand: ${s}`);let p=a.prepareRunner(n),g=o();return{computeUsage(){let l=e.computeUsage(),f=p.computeUsage();return{breadcrumbs:l.arguments.map(Z=>F(Z.label)).concat([Y(s)]).concat(f.breadcrumbs),title:f.title,description:f.description,options:l.options.concat(f.options),arguments:l.arguments.concat(f.arguments),subcommands:f.subcommands}},async execute(l){let f=await g(l);return await p.execute(f)}}}catch(o){return{computeUsage(){let s=e.computeUsage();return{breadcrumbs:s.arguments.map(a=>F(a.label)).concat([Y("<SUBCOMMAND>")]),title:r.title,description:r.description,options:s.options,arguments:s.arguments,subcommands:Object.entries(t).map(([a,p])=>({name:a,title:p.getTitle()}))}},async execute(s){throw o}}}}}}function F(r){return{kind:"argument",value:r}}function Y(r){return{kind:"command",value:r}}function ce(r,e){return{computeUsage(){let t=new Array;for(let o in r.options){let s=r.options[o];t.push(s.generateUsage())}let n=new Array;for(let o of r.arguments)n.push(o.generateUsage());return{options:t,arguments:n}},prepareResolver(t){let n={};for(let s in r.options){let a=r.options[s];n[s]=a.prepareConsumer(t)}let o=[];for(let s of r.arguments)o.push(s.consumeValue(t));return()=>{let s={};for(let a in n)s[a]=n[a]();return async a=>await e(a,{options:s,arguments:o})}}}}function h(r,e){if(r==="none")return e.value;if(r==="tty"){let t=e.color?de[e.color]:"",n=e.bold?me:"";return`${t}${n}${e.value}${ge}`}if(r==="html"){let t=e.color?`<span style="color: ${e.color}">`:"",n=e.color?"</span>":"",o=e.bold?"<b>":"",s=e.bold?"</b>":"";return`${t}${o}${e.value}${s}${n}`}if(r==="mock")return e.color&&e.bold?`{${e.value}}@${e.color}+`:e.color?`{${e.value}}@${e.color}`:e.bold?`{${e.value}}+`:`{${e.value}}`;throw new Error(`Unknown typo support: ${r}`)}function B(){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||!process.stdout||!process.stdout.isTTY?"none":"tty"}var ge="\x1B[0m",me="\x1B[1m",de={red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",grey:"\x1B[90m"};function E(r,e){let t=new Array,n=new Array;for(let o of r)for(let s=0;s<o.length;s++){let a=o[s],p=H(a);(n[s]===void 0||p>n[s])&&(n[s]=p)}for(let o of r){let s=new Array;for(let a=0;a<o.length;a++){let p=o[a],g=p.map(l=>h(e,l));if(a<o.length-1){let l=H(p),f=" ".repeat(n[a]-l);s.push(g.join("")+f)}else s.push(g.join(""))}t.push(s.join(" "))}return t}function H(r){let e=0;for(let t of r)e+=t.value.length;return e}function he(r){return{generateUsage(){return{description:r.description,long:r.long,short:r.short,label:void 0}},prepareConsumer(e){let t=r.long,n=[r.long];r.aliases?.longs&&n.push(...r.aliases?.longs);let o=r.short?[r.short]:[];return r.aliases?.shorts&&o.push(...r.aliases?.shorts),e.registerFlag({key:t,longs:n,shorts:o}),()=>{let s=e.consumeFlag(t);return s===void 0?r.default?r.default():!1:s}}}}function fe(r){return{generateUsage(){return{description:r.description,long:r.long,short:r.short,label:`<${r.label??r.type.label}>`}},prepareConsumer(e){let t=r.long,n=r.long?[r.long]:[];r.aliases?.longs&&n.push(...r.aliases?.longs);let o=r.short?[r.short]:[];return r.aliases?.shorts&&o.push(...r.aliases?.shorts),e.registerOption({key:t,longs:n,shorts:o}),()=>e.consumeOption(t).map(r.type.decoder)}}}function ye(r){return{generateUsage(){return{description:r.description,long:r.long,short:r.short,label:`<${r.label??r.type.label}>`}},prepareConsumer(e){let t=r.long,n=[r.long];r.aliases?.longs&&n.push(...r.aliases?.longs);let o=r.short?[r.short]:[];return r.aliases?.shorts&&o.push(...r.aliases?.shorts),e.registerOption({key:t,longs:n,shorts:o}),()=>{let s=e.consumeOption(r.long);if(s.length>1)throw new Error(`Multiple values provided for option: ${r.long}`);let a=s[0];return a===void 0?r.default():r.type.decoder(a)}}}}var I,O,x,w,C,R,y,U,A,v,b,u,M,D,Q,z,X,V,$,W,P,k=class{constructor(e){d(this,u);d(this,I);d(this,O);d(this,x);d(this,w);d(this,C);d(this,R);d(this,y);d(this,U);d(this,A);d(this,v);d(this,b);m(this,I,e),m(this,O,0),m(this,x,!1),m(this,w,new Map),m(this,C,new Map),m(this,R,new Map),m(this,y,new Map),m(this,U,new Map),m(this,A,new Map),m(this,v,new Map),m(this,b,new Map)}registerFlag(e){c(this,u,W).call(this,e.key),i(this,R).set(e.key,{});for(let t of e.shorts)c(this,u,P).call(this,t),i(this,w).set(t,e.key);for(let t of e.longs)c(this,u,P).call(this,t),i(this,C).set(t,e.key)}registerOption(e){c(this,u,W).call(this,e.key),i(this,v).set(e.key,{});for(let t of e.shorts)c(this,u,P).call(this,t),i(this,U).set(t,e.key);for(let t of e.longs)c(this,u,P).call(this,t),i(this,A).set(t,e.key)}consumeFlag(e){if(i(this,R).get(e)===void 0)throw new Error(`Option flag not registered: ${e}`);let n=i(this,y).get(e);if(n===void 0){i(this,y).set(e,null);return}if(n===null)throw new Error(`Option flag already consumed: ${e}`);return i(this,y).set(e,null),n}consumeOption(e){if(i(this,v).get(e)===void 0)throw new Error(`Option values not registered: ${e}`);let n=i(this,b).get(e);if(n===void 0)return i(this,b).set(e,null),new Array;if(n===null)throw new Error(`Option values already consumed: ${e}`);return i(this,b).set(e,null),n}consumePositional(){for(;;){let e=c(this,u,M).call(this);if(e===null)return;let t=c(this,u,Q).call(this,e);if(t!==null)return t}}};I=new WeakMap,O=new WeakMap,x=new WeakMap,w=new WeakMap,C=new WeakMap,R=new WeakMap,y=new WeakMap,U=new WeakMap,A=new WeakMap,v=new WeakMap,b=new WeakMap,u=new WeakSet,M=function(){let e=i(this,I)[i(this,O)];return e===void 0?null:(_(this,O)._++,!i(this,x)&&e==="--"?(m(this,x,!0),c(this,u,M).call(this)):e)},D=function(e){let t=c(this,u,M).call(this);if(t===null)throw new Error(`Option ${e} requires a value`);if(i(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},Q=function(e){if(i(this,x))return e;if(e.startsWith("--")){let t=e.indexOf("=");return t===-1?c(this,u,z).call(this,e.slice(2),null):c(this,u,z).call(this,e.slice(2,t),e.slice(t+1)),null}if(e.startsWith("-")){let t=1,n=2;for(;n<=e.length;){let o=e.slice(t,n),s=e.slice(n),a=c(this,u,X).call(this,o,s);if(a===!0)return null;a===!1&&(t=n),n++}throw new Error(`Unknown short flags or options: ${e.slice(t)}`)}return e},z=function(e,t){let n=i(this,C).get(e);if(n!==void 0){if(t!==null){let s=J(t);if(s!==void 0)return c(this,u,V).call(this,n,s);throw new Error(`Invalid parameter for long flag: ${n}, value: ${t}`)}return c(this,u,V).call(this,n,!0)}let o=i(this,A).get(e);if(o!==void 0)return t!==null?c(this,u,$).call(this,o,t):c(this,u,$).call(this,o,c(this,u,D).call(this,e));throw new Error(`Unknown long flag or option: ${e}`)},X=function(e,t){let n=i(this,w).get(e);if(n!==void 0){if(t.startsWith("=")){let s=J(t.slice(1));if(s!==void 0)return c(this,u,V).call(this,n,s),!0;throw new Error(`Invalid parameter for short flag: ${e}, value: ${t}`)}return c(this,u,V).call(this,n,!0),t===""}let o=i(this,U).get(e);return o!==void 0?t===""?(c(this,u,$).call(this,o,c(this,u,D).call(this,e)),!0):(t.startsWith("=")?c(this,u,$).call(this,o,t.slice(1)):c(this,u,$).call(this,o,t),!0):null},V=function(e,t){if(i(this,y).has(e))throw new Error(`Flag already set: ${e}`);i(this,y).set(e,t)},$=function(e,t){let n=i(this,b).get(e)??new Array;n.push(t),i(this,b).set(e,n)},W=function(e){if(i(this,R).has(e))throw new Error(`Option already registered: ${e}`);if(i(this,v).has(e))throw new Error(`Option already registered: ${e}`)},P=function(e){if(i(this,w).has(e))throw new Error(`Option already registered: ${e}`);if(i(this,C).has(e))throw new Error(`Option already registered: ${e}`);if(i(this,U).has(e))throw new Error(`Option already registered: ${e}`);if(i(this,A).has(e))throw new Error(`Option already registered: ${e}`)};function J(r){let e=r.toLowerCase();if(e==="true"||e==="t"||e==="y"||e==="yes")return!0;if(e==="false"||e==="f"||e==="n"||e==="no")return!1}function G(r){let{cliName:e,commandUsage:t,typoSupport:n}=r,o=new Array;if(o.push(""),o.push(h(n,S(t.title))),t.description)for(let p of t.description)o.push(h(n,be(p)));let s=h(n,K("Usage:")),a=[h(n,T(e))].concat(t.breadcrumbs.map(p=>p.kind==="argument"?h(n,j(p.value)):h(n,T(p.value))));if(o.push(""),o.push(`${s} ${a.join(" ")}`),t.arguments.length>0){o.push(""),o.push(h(n,K("Arguments:")));let p=new Array;for(let g of t.arguments){let l=new Array;l.push([]),l.push([j(g.label)]),l.push([]),g.description&&l.push([S(g.description)]),p.push(l)}o.push(...E(p,n))}if(t.options.length>0){o.push(""),o.push(h(n,K("Options:")));let p=new Array;for(let g of t.options){let l=new Array;l.push([]),g.short?l.push([T(`-${g.short}`),{value:","}]):l.push([]),g.label?l.push([T(`--${g.long} `),j(g.label)]):l.push([T(`--${g.long}`),{value:"[=yes|no]",color:"grey"}]),l.push([]),g.description&&l.push([S(g.description)]),p.push(l)}o.push(...E(p,n))}if(t.subcommands.length>0){o.push(""),o.push(h(n,K("Subcommands:")));let p=new Array;for(let g of t.subcommands){let l=new Array;l.push([]),l.push([T(g.name)]),l.push([]),g.title&&l.push([S(g.title)]),p.push(l)}o.push(...E(p,n))}return o.push(""),o}function K(r){return{value:r,color:"green",bold:!0}}function be(r){return{value:r,color:"grey"}}function S(r){return{value:r,bold:!0}}function T(r){return{value:r,color:"cyan",bold:!0}}function j(r){return{value:r,color:"cyan"}}async function xe(r,e,t,n){let o=n?.name??r[1],s=new k(r.slice(2));n?.version&&s.registerFlag({key:"version",shorts:[],longs:["version"]}),s.registerFlag({key:"help",shorts:[],longs:["help"]});try{let a=t.prepareRunner(s);n?.version&&s.consumeFlag("version")&&(console.log(o,n.version),process.exit(0)),s.consumeFlag("help")&&(console.log(G({cliName:o,commandUsage:a.computeUsage(),typoSupport:B()}).join(`
|
|
2
|
+
`)),process.exit(0));try{return await a.execute(e)}catch(p){(n?.helpOnError??!0)&&console.log(G({cliName:o,commandUsage:a.computeUsage(),typoSupport:B()}).join(`
|
|
3
|
+
`)),console.error(p),process.exit(1)}}catch(a){console.error(a),process.exit(1)}}var we={label:"BOOLEAN",decoder(r){if(r==="true")return!0;if(r==="false")return!1;throw new Error(`Invalid boolean value: ${r}`)}},Ce={label:"DATE",decoder(r){let e=Date.parse(r);if(isNaN(e))throw new Error(`Invalid date value: ${r}`);return new Date(e)}},Re={label:"STRING",decoder(r){return r}},Ue={label:"NUMBER",decoder(r){return Number(r)}},Ae={label:"BIGINT",decoder(r){return BigInt(r)}};function ve(r){return{label:`${r.label}[${r.label},...]`,decoder(e){return e.split(",").map(r.decoder)}}}0&&(module.exports={ReaderTokenizer,argumentOptional,argumentRequired,argumentVariadics,command,commandWithSubcommands,execution,gridToPrintableLines,optionFlag,optionRepeatable,optionSingleValue,runWithArgv,typeBigInt,typeBoolean,typeCommaArray,typeDate,typeNumber,typeString,typoInferSupport,typoPrintableString,usageToPrintableLines});
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/lib/Argument.ts","../src/lib/Command.ts","../src/lib/Typo.ts","../src/lib/Grid.ts","../src/lib/Option.ts","../src/lib/Process.ts","../src/lib/Reader.ts","../src/lib/Usage.ts","../src/lib/Run.ts","../src/lib/Type.ts"],"sourcesContent":["export * from \"./lib/Argument\";\nexport * from \"./lib/Command\";\nexport * from \"./lib/Grid\";\nexport * from \"./lib/Option\";\nexport * from \"./lib/Process\";\nexport * from \"./lib/Reader\";\nexport * from \"./lib/Run\";\nexport * from \"./lib/Type\";\nexport * from \"./lib/Typo\";\nexport * from \"./lib/Usage\";\n","import { ReaderPositionals } from \"./Reader\";\nimport { Type } from \"./Type\";\n\nexport type Argument<Value> = {\n generateUsage(): ArgumentUsage;\n consumeValue(readerPositionals: ReaderPositionals): Value;\n};\n\nexport type ArgumentUsage = {\n description: string | undefined;\n label: string;\n};\n\nexport function argumentRequired<Value>(definition: {\n description?: string;\n type: Type<Value>;\n label?: Uppercase<string>;\n}): Argument<Value> {\n return {\n generateUsage() {\n return {\n description: definition.description,\n label: `<${definition.label ?? definition.type.label}>`,\n };\n },\n consumeValue(readerPositionals: ReaderPositionals) {\n const positional = readerPositionals.consumePositional();\n if (positional === undefined) {\n throw new Error(\n `Missing required arg: <${definition.label ?? definition.type.label}>`,\n );\n }\n return definition.type.decoder(positional);\n },\n };\n}\n\nexport function argumentOptional<Value>(definition: {\n description?: string;\n type: Type<Value>;\n label?: Uppercase<string>;\n default: () => Value;\n}): Argument<Value> {\n return {\n generateUsage() {\n return {\n description: definition.description,\n label: `[${definition.label ?? definition.type.label}]`,\n };\n },\n consumeValue(readerPositionals: ReaderPositionals) {\n const positional = readerPositionals.consumePositional();\n if (positional === undefined) {\n return definition.default();\n }\n return definition.type.decoder(positional);\n },\n };\n}\n\nexport function argumentVariadics<Value>(definition: {\n description?: string;\n type: Type<Value>;\n label?: Uppercase<string>;\n endDelimiter?: string;\n}): Argument<Array<Value>> {\n return {\n generateUsage() {\n return {\n description: definition.description,\n label:\n `[${definition.label ?? definition.type.label}...]` +\n (definition.endDelimiter\n ? ` (end with ${definition.endDelimiter})`\n : \"\"),\n };\n },\n consumeValue(readerPositionals: ReaderPositionals) {\n const values: Array<Value> = [];\n while (true) {\n const positional = readerPositionals.consumePositional();\n if (\n positional === undefined ||\n positional === definition.endDelimiter\n ) {\n break;\n }\n values.push(definition.type.decoder(positional));\n }\n return values;\n },\n };\n}\n","import { ArgumentUsage } from \"./Argument\";\nimport { OptionUsage } from \"./Option\";\nimport { Process } from \"./Process\";\nimport { ReaderTokenizer } from \"./Reader\";\n\nexport type Command<Context, Result> = {\n getTitle(): string | undefined;\n prepareRunner(\n readerTokenizer: ReaderTokenizer,\n ): CommandRunner<Context, Result>;\n};\n\nexport type CommandRunner<Context, Result> = {\n computeUsage(): CommandUsage;\n execute(context: Context): Promise<Result>;\n};\n\nexport type CommandUsage = {\n breadcrumbs: Array<CommandUsageBreadcrumb>;\n title: string;\n description: Array<string> | undefined;\n options: Array<OptionUsage>;\n arguments: Array<ArgumentUsage>;\n subcommands: Array<{ name: string; title: string | undefined }>;\n};\n\nexport type CommandUsageBreadcrumb = {\n kind: \"command\" | \"argument\";\n value: string;\n};\n\nexport function command<Context, Result>(\n metadata: {\n title: string;\n description?: Array<string>;\n },\n process: Process<Context, Result>,\n): Command<Context, Result> {\n return {\n getTitle() {\n return metadata.title;\n },\n prepareRunner(readerTokenizer: ReaderTokenizer) {\n function computeUsage(): CommandUsage {\n const processUsage = process.computeUsage();\n return {\n breadcrumbs: processUsage.arguments.map((argument) =>\n breadcrumbArgument(argument.label),\n ),\n title: metadata.title,\n description: metadata.description,\n options: processUsage.options,\n arguments: processUsage.arguments,\n subcommands: [],\n };\n }\n try {\n const processResolver = process.prepareResolver(readerTokenizer);\n const lastPositional = readerTokenizer.consumePositional();\n if (lastPositional !== undefined) {\n throw Error(`Unprocessed positional: ${lastPositional}`);\n }\n const processRunner = processResolver();\n return {\n computeUsage,\n async execute(context: Context) {\n return await processRunner.execute(context);\n },\n };\n } catch (error) {\n return {\n computeUsage,\n async execute(_context: Context) {\n throw error;\n },\n };\n }\n },\n };\n}\n\nexport function commandWithSubcommands<Context, Payload, Result>(\n metadata: {\n title: string;\n description?: Array<string>;\n },\n process: Process<Context, Payload>,\n subcommands: { [subcommand: Lowercase<string>]: Command<Payload, Result> },\n): Command<Context, Result> {\n return {\n getTitle() {\n return metadata.title;\n },\n prepareRunner(readerTokenizer: ReaderTokenizer) {\n try {\n const processResolver = process.prepareResolver(readerTokenizer);\n const subcommandName = readerTokenizer.consumePositional();\n if (subcommandName === undefined) {\n throw new Error(\"Expected a subcommand\");\n }\n const subcommandInput =\n subcommands[subcommandName as Lowercase<string>];\n if (subcommandInput === undefined) {\n throw new Error(`Unknown subcommand: ${subcommandName}`);\n }\n const subcommandRunner = subcommandInput.prepareRunner(readerTokenizer);\n const processRunner = processResolver();\n return {\n computeUsage() {\n const processUsage = process.computeUsage();\n const subcommandUsage = subcommandRunner.computeUsage();\n return {\n breadcrumbs: processUsage.arguments\n .map((argument) => breadcrumbArgument(argument.label))\n .concat([breadcrumbCommand(subcommandName)])\n .concat(subcommandUsage.breadcrumbs),\n title: subcommandUsage.title,\n description: subcommandUsage.description,\n options: processUsage.options.concat(subcommandUsage.options),\n arguments: processUsage.arguments.concat(\n subcommandUsage.arguments,\n ),\n subcommands: subcommandUsage.subcommands,\n };\n },\n async execute(context: Context) {\n const payload = await processRunner.execute(context);\n return await subcommandRunner.execute(payload);\n },\n };\n } catch (error) {\n return {\n computeUsage() {\n const processUsage = process.computeUsage();\n return {\n breadcrumbs: processUsage.arguments\n .map((argument) => breadcrumbArgument(argument.label))\n .concat([breadcrumbCommand(\"<SUBCOMMAND>\")]),\n title: metadata.title,\n description: metadata.description,\n options: processUsage.options,\n arguments: processUsage.arguments,\n subcommands: Object.entries(subcommands).map(\n ([name, subcommand]) => ({\n name,\n title: subcommand.getTitle(),\n }),\n ),\n };\n },\n async execute(_context: Context) {\n throw error;\n },\n };\n }\n },\n };\n}\n\nfunction breadcrumbArgument(label: string): CommandUsageBreadcrumb {\n return { kind: \"argument\", value: label };\n}\n\nfunction breadcrumbCommand(name: string): CommandUsageBreadcrumb {\n return { kind: \"command\", value: name };\n}\n","export type TypoSupport = \"none\" | \"tty\" | \"html\" | \"mock\";\n\nexport type TypoText = {\n value: string;\n color?: keyof typeof colorCodes;\n bold?: boolean;\n};\n\nexport function typoPrintableString(\n typoSupport: TypoSupport,\n typoText: TypoText,\n): string {\n if (typoSupport === \"none\") {\n return typoText.value;\n }\n if (typoSupport === \"tty\") {\n const colorStartCode = typoText.color ? colorCodes[typoText.color] : \"\";\n const colorBoldCode = typoText.bold ? boldCode : \"\";\n return `${colorStartCode}${colorBoldCode}${typoText.value}${resetCode}`;\n }\n if (typoSupport === \"html\") {\n const colorStartTag = typoText.color\n ? `<span style=\"color: ${typoText.color}\">`\n : \"\";\n const colorEndTag = typoText.color ? \"</span>\" : \"\";\n const boldStartTag = typoText.bold ? \"<b>\" : \"\";\n const boldEndTag = typoText.bold ? \"</b>\" : \"\";\n return `${colorStartTag}${boldStartTag}${typoText.value}${boldEndTag}${colorEndTag}`;\n }\n if (typoSupport === \"mock\") {\n if (typoText.color && typoText.bold) {\n return `{${typoText.value}}@${typoText.color}+`;\n }\n if (typoText.color) {\n return `{${typoText.value}}@${typoText.color}`;\n }\n if (typoText.bold) {\n return `{${typoText.value}}+`;\n }\n return `{${typoText.value}}`;\n }\n throw new Error(`Unknown typo support: ${typoSupport}`);\n}\n\nexport function typoInferSupport(): TypoSupport {\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 || !process.stdout || !process.stdout.isTTY) {\n return \"none\";\n }\n return \"tty\";\n}\n\nconst resetCode = \"\\x1b[0m\";\nconst boldCode = \"\\x1b[1m\";\nconst colorCodes = {\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n grey: \"\\x1b[90m\",\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(grid: Grid, typoSupport: TypoSupport) {\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(\" \"));\n }\n return lines;\n}\n\nfunction gridCellLength(cell: GridCell): number {\n let length = 0;\n for (const text of cell) {\n length += text.value.length;\n }\n return length;\n}\n","import { ReaderTokenizer } from \"./Reader\";\nimport { Type } from \"./Type\";\n\nexport type Option<Value> = {\n generateUsage(): OptionUsage;\n prepareConsumer(readerTokenizer: ReaderTokenizer): OptionConsumer<Value>;\n};\n\nexport type OptionUsage = {\n description: string | undefined;\n long: Lowercase<string>; // TODO - better type for long option names ?\n short: string | undefined;\n label: Uppercase<string> | undefined;\n};\n\nexport type OptionConsumer<Value> = () => Value;\n\nexport function optionFlag(definition: {\n description?: string;\n long: Lowercase<string>;\n short?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n default?: () => boolean;\n}): Option<boolean> {\n return {\n generateUsage() {\n return {\n description: definition.description,\n long: definition.long,\n short: definition.short,\n label: undefined,\n };\n },\n prepareConsumer(readerTokenizer: ReaderTokenizer) {\n const key = definition.long;\n const longs = [definition.long];\n if (definition.aliases?.longs) {\n longs.push(...definition.aliases?.longs);\n }\n const shorts = definition.short ? [definition.short] : [];\n if (definition.aliases?.shorts) {\n shorts.push(...definition.aliases?.shorts);\n }\n readerTokenizer.registerFlag({ key, longs, shorts });\n return () => {\n const value = readerTokenizer.consumeFlag(key);\n if (value === undefined) {\n return definition.default ? definition.default() : false;\n }\n return value;\n };\n },\n };\n}\n\n// TODO - option with comma-separated values, e.g. --names=alice,bob,charlie\n\nexport function optionRepeatable<Value>(definition: {\n description?: string;\n type: Type<Value>;\n long: Lowercase<string>;\n short?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n label?: Uppercase<string>;\n}): Option<Array<Value>> {\n return {\n generateUsage() {\n return {\n description: definition.description,\n long: definition.long,\n short: definition.short,\n label:\n `<${definition.label ?? definition.type.label}>` as Uppercase<string>,\n };\n },\n prepareConsumer(readerTokenizer: ReaderTokenizer) {\n const key = definition.long;\n const longs = definition.long ? [definition.long] : [];\n if (definition.aliases?.longs) {\n longs.push(...definition.aliases?.longs);\n }\n const shorts = definition.short ? [definition.short] : [];\n if (definition.aliases?.shorts) {\n shorts.push(...definition.aliases?.shorts);\n }\n readerTokenizer.registerOption({ key, longs, shorts });\n return () => {\n return readerTokenizer.consumeOption(key).map(definition.type.decoder);\n };\n },\n };\n}\n\nexport function optionSingleValue<Value>(definition: {\n description?: string;\n type: Type<Value>;\n long: Lowercase<string>;\n short?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n label?: Uppercase<string>;\n default: () => Value;\n}): Option<Value> {\n return {\n generateUsage() {\n return {\n description: definition.description,\n long: definition.long,\n short: definition.short,\n label:\n `<${definition.label ?? definition.type.label}>` as Uppercase<string>,\n };\n },\n prepareConsumer(readerTokenizer: ReaderTokenizer) {\n const key = definition.long;\n const longs = [definition.long];\n if (definition.aliases?.longs) {\n longs.push(...definition.aliases?.longs);\n }\n const shorts = definition.short ? [definition.short] : [];\n if (definition.aliases?.shorts) {\n shorts.push(...definition.aliases?.shorts);\n }\n readerTokenizer.registerOption({ key, longs, shorts });\n return () => {\n // TODO - smooth and beautiful error handling\n const values = readerTokenizer.consumeOption(definition.long);\n if (values.length > 1) {\n throw new Error(\n `Multiple values provided for option: ${definition.long}`,\n );\n }\n const firstValue = values[0];\n if (firstValue === undefined) {\n return definition.default();\n }\n return definition.type.decoder(firstValue);\n };\n },\n };\n}\n","import { Argument, ArgumentUsage } from \"./Argument\";\nimport { Option, OptionUsage } from \"./Option\";\nimport { ReaderTokenizer } from \"./Reader\";\n\nexport type Process<Context, Result> = {\n computeUsage(): ProcessUsage;\n prepareResolver(\n readerTokenizer: ReaderTokenizer,\n ): ProcessResolver<Context, Result>;\n};\n\nexport type ProcessResolver<Context, Result> = () => ProcessRunner<\n Context,\n Result\n>;\n\nexport type ProcessRunner<Context, Result> = {\n execute(context: Context): Promise<Result>;\n};\n\nexport type ProcessUsage = {\n options: Array<OptionUsage>;\n arguments: Array<ArgumentUsage>;\n};\n\nexport function process<\n Context,\n Result,\n Options extends { [option: string]: Option<any> },\n const Arguments extends Array<Argument<any>>,\n>(\n inputs: { options: Options; arguments: Arguments },\n handler: (\n context: Context,\n inputs: {\n options: {\n [K in keyof Options]: ReturnType<\n ReturnType<Options[K][\"prepareConsumer\"]>\n >;\n };\n arguments: {\n [K in keyof Arguments]: ReturnType<Arguments[K][\"consumeValue\"]>;\n };\n },\n ) => Promise<Result>,\n): Process<Context, Result> {\n return {\n computeUsage() {\n const optionsUsage = new Array<OptionUsage>();\n for (const optionKey in inputs.options) {\n const optionInput = inputs.options[optionKey]!;\n optionsUsage.push(optionInput.generateUsage());\n }\n const argumentsUsage = new Array<ArgumentUsage>();\n for (const argumentInput of inputs.arguments) {\n argumentsUsage.push(argumentInput.generateUsage());\n }\n return { options: optionsUsage, arguments: argumentsUsage };\n },\n prepareResolver(readerTokenizer: ReaderTokenizer) {\n const optionsConsumers: any = {};\n for (const optionKey in inputs.options) {\n const optionInput = inputs.options[optionKey]!;\n optionsConsumers[optionKey] =\n optionInput.prepareConsumer(readerTokenizer);\n }\n const argumentsValues: any = [];\n for (const argumentInput of inputs.arguments) {\n argumentsValues.push(argumentInput.consumeValue(readerTokenizer));\n }\n return () => {\n const optionsValues: any = {};\n for (const optionKey in optionsConsumers) {\n optionsValues[optionKey] = optionsConsumers[optionKey]!();\n }\n return {\n async execute(context: Context) {\n return await handler(context, {\n options: optionsValues,\n arguments: argumentsValues,\n });\n },\n };\n };\n },\n };\n}\n","export type ReaderPositionals = {\n consumePositional(): string | undefined;\n};\n\nexport class ReaderTokenizer {\n #parsedArgv: 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(argv: Array<string>) {\n this.#parsedArgv = argv;\n this.#parsedIndex = 0;\n this.#parsedDouble = false;\n\n // TODO - this seems like a good candidate for abstraction\n this.#flagKeyByShort = new Map();\n this.#flagKeyByLong = new Map();\n this.#flagInfoByKey = new Map();\n this.#flagResultByKey = new Map();\n\n this.#optionKeyByShort = new Map();\n this.#optionKeyByLong = new Map();\n this.#optionInfoByKey = new Map();\n this.#optionResultByKey = new Map();\n }\n\n registerFlag(definition: {\n key: string;\n shorts: Array<string>;\n longs: Array<string>;\n }) {\n this.#ensureUniqueKey(definition.key);\n this.#flagInfoByKey.set(definition.key, {});\n for (const short of definition.shorts) {\n this.#ensureUniqueName(short);\n this.#flagKeyByShort.set(short, definition.key);\n }\n for (const long of definition.longs) {\n this.#ensureUniqueName(long);\n this.#flagKeyByLong.set(long, definition.key);\n }\n }\n\n registerOption(definition: {\n key: string;\n shorts: Array<string>;\n longs: Array<string>;\n }) {\n this.#ensureUniqueKey(definition.key);\n this.#optionInfoByKey.set(definition.key, {});\n for (const short of definition.shorts) {\n this.#ensureUniqueName(short);\n this.#optionKeyByShort.set(short, definition.key);\n }\n for (const long of definition.longs) {\n this.#ensureUniqueName(long);\n this.#optionKeyByLong.set(long, definition.key);\n }\n }\n\n consumeFlag(key: string): boolean | undefined {\n const flagInfo = this.#flagInfoByKey.get(key);\n if (flagInfo === undefined) {\n throw new Error(`Option flag not registered: ${key}`);\n }\n const result = this.#flagResultByKey.get(key);\n if (result === undefined) {\n this.#flagResultByKey.set(key, null);\n return undefined;\n }\n if (result === null) {\n throw new Error(`Option flag already consumed: ${key}`);\n }\n this.#flagResultByKey.set(key, null);\n return result;\n }\n\n consumeOption(key: string): Array<string> {\n const optionInfo = this.#optionInfoByKey.get(key);\n if (optionInfo === undefined) {\n throw new Error(`Option values not registered: ${key}`);\n }\n const result = this.#optionResultByKey.get(key);\n if (result === undefined) {\n this.#optionResultByKey.set(key, null);\n return new Array<string>();\n }\n if (result === null) {\n throw new Error(`Option values already consumed: ${key}`);\n }\n this.#optionResultByKey.set(key, null);\n return result;\n }\n\n consumePositional(): string | undefined {\n while (true) {\n const arg = this.#consumeArg();\n if (arg === null) {\n return undefined;\n }\n const positional = this.#parseAsPositional(arg);\n if (positional !== null) {\n return positional;\n }\n }\n }\n\n #consumeArg(): string | null {\n const arg = this.#parsedArgv[this.#parsedIndex];\n if (arg === undefined) {\n return null;\n }\n this.#parsedIndex++;\n if (!this.#parsedDouble) {\n if (arg === \"--\") {\n this.#parsedDouble = true;\n return this.#consumeArg();\n }\n }\n return arg;\n }\n\n #consumeOptionValue(name: string) {\n const arg = this.#consumeArg();\n if (arg === null) {\n throw new Error(`Option ${name} requires a value`);\n }\n if (this.#parsedDouble) {\n throw new Error(`Option ${name} requires a value before --`);\n }\n // TODO - is that weird, could a valid value start with dash ?\n if (arg.startsWith(\"-\")) {\n throw new Error(`Option ${name} requires a value, got: ${arg}`);\n }\n return arg;\n }\n\n #parseAsPositional(arg: string): string | null {\n if (this.#parsedDouble) {\n return arg;\n }\n if (arg.startsWith(\"--\")) {\n const valueIndexStart = arg.indexOf(\"=\");\n if (valueIndexStart === -1) {\n this.#consumeOptionLong(arg.slice(2), null);\n } else {\n this.#consumeOptionLong(\n arg.slice(2, valueIndexStart),\n arg.slice(valueIndexStart + 1),\n );\n }\n return null;\n }\n if (arg.startsWith(\"-\")) {\n let shortIndexStart = 1;\n let shortIndexEnd = 2;\n while (shortIndexEnd <= arg.length) {\n const short = arg.slice(shortIndexStart, shortIndexEnd);\n const rest = arg.slice(shortIndexEnd);\n const result = this.#tryConsumeOptionShort(short, rest);\n if (result === true) {\n return null;\n }\n if (result === false) {\n shortIndexStart = shortIndexEnd;\n }\n shortIndexEnd++;\n }\n throw new Error(\n `Unknown short flags or options: ${arg.slice(shortIndexStart)}`,\n );\n }\n return arg;\n }\n\n #consumeOptionLong(long: string, direct: string | null): void {\n const flagKey = this.#flagKeyByLong.get(long);\n if (flagKey !== undefined) {\n if (direct !== null) {\n const value = asBoolean(direct);\n if (value !== undefined) {\n return this.#acknowledgeFlag(flagKey, value);\n }\n throw new Error(\n `Invalid parameter for long flag: ${flagKey}, value: ${direct}`,\n );\n }\n return this.#acknowledgeFlag(flagKey, true);\n }\n const optionKey = this.#optionKeyByLong.get(long);\n if (optionKey !== undefined) {\n if (direct !== null) {\n return this.#acknowledgeOption(optionKey, direct);\n }\n return this.#acknowledgeOption(optionKey, this.#consumeOptionValue(long));\n }\n throw new Error(`Unknown long flag or option: ${long}`);\n }\n\n #tryConsumeOptionShort(short: string, rest: string): boolean | null {\n const flagKey = this.#flagKeyByShort.get(short);\n if (flagKey !== undefined) {\n if (rest.startsWith(\"=\")) {\n const value = asBoolean(rest.slice(1));\n if (value !== undefined) {\n this.#acknowledgeFlag(flagKey, value);\n return true;\n }\n throw new Error(\n `Invalid parameter for short flag: ${short}, value: ${rest}`,\n );\n }\n this.#acknowledgeFlag(flagKey, true);\n return rest === \"\";\n }\n const optionKey = this.#optionKeyByShort.get(short);\n if (optionKey !== undefined) {\n if (rest === \"\") {\n this.#acknowledgeOption(optionKey, this.#consumeOptionValue(short));\n return true;\n }\n if (rest.startsWith(\"=\")) {\n this.#acknowledgeOption(optionKey, rest.slice(1));\n } else {\n this.#acknowledgeOption(optionKey, rest);\n }\n return true;\n }\n return null;\n }\n\n #acknowledgeFlag(key: string, value: boolean) {\n if (this.#flagResultByKey.has(key)) {\n throw new Error(`Flag already set: ${key}`);\n }\n this.#flagResultByKey.set(key, value);\n }\n\n #acknowledgeOption(key: string, value: string) {\n const values = this.#optionResultByKey.get(key) ?? new Array<string>();\n values.push(value);\n this.#optionResultByKey.set(key, values);\n }\n\n #ensureUniqueKey(key: string) {\n if (this.#flagInfoByKey.has(key)) {\n throw new Error(`Option already registered: ${key}`);\n }\n if (this.#optionInfoByKey.has(key)) {\n throw new Error(`Option already registered: ${key}`);\n }\n }\n\n #ensureUniqueName(nameShortOrLong: string) {\n // TODO - overall better error handling\n // TODO - short flag overlap might be annoying here\n if (this.#flagKeyByShort.has(nameShortOrLong)) {\n throw new Error(`Option already registered: ${nameShortOrLong}`);\n }\n if (this.#flagKeyByLong.has(nameShortOrLong)) {\n throw new Error(`Option already registered: ${nameShortOrLong}`);\n }\n if (this.#optionKeyByShort.has(nameShortOrLong)) {\n throw new Error(`Option already registered: ${nameShortOrLong}`);\n }\n if (this.#optionKeyByLong.has(nameShortOrLong)) {\n throw new Error(`Option already registered: ${nameShortOrLong}`);\n }\n }\n}\n\nfunction asBoolean(value: string): boolean | undefined {\n const lower = value.toLowerCase();\n if (lower === \"true\" || lower === \"t\" || lower === \"y\" || lower === \"yes\") {\n return true;\n }\n if (lower === \"false\" || lower === \"f\" || lower === \"n\" || lower === \"no\") {\n return false;\n }\n return undefined;\n}\n","import { CommandUsage } from \"./Command\";\nimport { GridCell, GridRow, gridToPrintableLines } from \"./Grid\";\nimport { TypoSupport, TypoText, typoPrintableString } from \"./Typo\";\n\nexport function usageToPrintableLines(params: {\n cliName: 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 lines.push(typoPrintableString(typoSupport, textDesc(commandUsage.title)));\n if (commandUsage.description) {\n for (const descriptionLine of commandUsage.description) {\n lines.push(typoPrintableString(typoSupport, textSubs(descriptionLine)));\n }\n }\n\n const breadcrumbPrefix = typoPrintableString(\n typoSupport,\n textTitle(\"Usage:\"),\n );\n const breadcrumbsItems = [\n typoPrintableString(typoSupport, textName(cliName)),\n ].concat(\n commandUsage.breadcrumbs.map((breadcrumb) => {\n if (breadcrumb.kind === \"argument\") {\n return typoPrintableString(typoSupport, textValue(breadcrumb.value));\n }\n return typoPrintableString(typoSupport, textName(breadcrumb.value));\n }),\n );\n lines.push(\"\");\n lines.push(`${breadcrumbPrefix} ${breadcrumbsItems.join(\" \")}`);\n\n if (commandUsage.arguments.length > 0) {\n lines.push(\"\");\n lines.push(typoPrintableString(typoSupport, textTitle(\"Arguments:\")));\n const grid = new Array<GridRow>();\n for (const argumentUsage of commandUsage.arguments) {\n const gridRow = new Array<GridCell>();\n gridRow.push([]);\n gridRow.push([textValue(argumentUsage.label)]);\n gridRow.push([]);\n if (argumentUsage.description) {\n gridRow.push([textDesc(argumentUsage.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, textTitle(\"Options:\")));\n const grid = new Array<GridRow>();\n for (const optionUsage of commandUsage.options) {\n const gridRow = new Array<GridCell>();\n gridRow.push([]);\n if (optionUsage.short) {\n gridRow.push([textName(`-${optionUsage.short}`), { value: \",\" }]);\n } else {\n gridRow.push([]);\n }\n if (optionUsage.label) {\n gridRow.push([\n textName(`--${optionUsage.long} `),\n textValue(optionUsage.label),\n ]);\n } else {\n gridRow.push([\n textName(`--${optionUsage.long}`),\n { value: \"[=yes|no]\", color: \"grey\" },\n ]);\n }\n gridRow.push([]);\n if (optionUsage.description) {\n gridRow.push([textDesc(optionUsage.description)]);\n }\n grid.push(gridRow);\n }\n lines.push(...gridToPrintableLines(grid, typoSupport));\n }\n\n if (commandUsage.subcommands.length > 0) {\n lines.push(\"\");\n lines.push(typoPrintableString(typoSupport, textTitle(\"Subcommands:\")));\n const grid = new Array<GridRow>();\n for (const subcommand of commandUsage.subcommands) {\n const gridRow = new Array<GridCell>();\n gridRow.push([]);\n gridRow.push([textName(subcommand.name)]);\n gridRow.push([]);\n if (subcommand.title) {\n gridRow.push([textDesc(subcommand.title)]);\n }\n grid.push(gridRow);\n }\n lines.push(...gridToPrintableLines(grid, typoSupport));\n }\n lines.push(\"\");\n return lines;\n}\n\nfunction textTitle(text: string): TypoText {\n return { value: text, color: \"green\", bold: true };\n}\n\nfunction textSubs(text: string): TypoText {\n return { value: text, color: \"grey\" };\n}\n\nfunction textDesc(text: string): TypoText {\n return { value: text, bold: true };\n}\n\nfunction textName(text: string): TypoText {\n return { value: text, color: \"cyan\", bold: true };\n}\n\nfunction textValue(text: string): TypoText {\n return { value: text, color: \"cyan\" };\n}\n","import { Command } from \"./Command\";\nimport { ReaderTokenizer } from \"./Reader\";\nimport { typoInferSupport } from \"./Typo\";\nimport { usageToPrintableLines } from \"./Usage\";\n\nexport async function runWithArgv<Context, Result>(\n argv: string[],\n context: Context,\n command: Command<Context, Result>,\n cliInfo?: {\n name?: Lowercase<string>;\n version?: string;\n helpOnError?: boolean;\n },\n): Promise<Result> {\n const cliName = cliInfo?.name ?? argv[1]!;\n const readerTokenizer = new ReaderTokenizer(argv.slice(2));\n if (cliInfo?.version) {\n readerTokenizer.registerFlag({\n key: \"version\",\n shorts: [],\n longs: [\"version\"],\n });\n }\n readerTokenizer.registerFlag({\n key: \"help\",\n shorts: [],\n longs: [\"help\"],\n });\n /*\n // TODO - handle completions ?\n readerTokenizer.registerFlag({\n key: \"completion\",\n shorts: [],\n longs: [\"completion\"],\n });\n */\n try {\n const commandRunner = command.prepareRunner(readerTokenizer);\n if (cliInfo?.version) {\n if (readerTokenizer.consumeFlag(\"version\")) {\n console.log(cliName, cliInfo.version);\n process.exit(0);\n }\n }\n if (readerTokenizer.consumeFlag(\"help\")) {\n console.log(\n usageToPrintableLines({\n cliName,\n commandUsage: commandRunner.computeUsage(),\n typoSupport: typoInferSupport(),\n }).join(\"\\n\"),\n );\n process.exit(0);\n }\n try {\n return await commandRunner.execute(context);\n } catch (error) {\n if (cliInfo?.helpOnError ?? true) {\n console.log(\n usageToPrintableLines({\n cliName,\n commandUsage: commandRunner.computeUsage(),\n typoSupport: typoInferSupport(),\n }).join(\"\\n\"),\n );\n }\n console.error(error);\n process.exit(1);\n }\n } catch (error) {\n console.error(error);\n process.exit(1);\n }\n}\n","export type Type<Value> = {\n label: Uppercase<string>; // TODO - is there a better way to enforce uppercase labels?\n decoder(value: string): Value;\n};\n\nexport const typeBoolean: Type<boolean> = {\n label: \"BOOLEAN\",\n decoder(value: string) {\n if (value === \"true\") {\n return true;\n }\n if (value === \"false\") {\n return false;\n }\n throw new Error(`Invalid boolean value: ${value}`);\n },\n};\n\nexport const typeDate: Type<Date> = {\n label: \"DATE\",\n decoder(value: string) {\n const timestamp = Date.parse(value);\n if (isNaN(timestamp)) {\n throw new Error(`Invalid date value: ${value}`);\n }\n return new Date(timestamp);\n },\n};\n\nexport const typeString: Type<string> = {\n label: \"STRING\",\n decoder(value: string) {\n return value;\n },\n};\n\nexport const typeNumber: Type<number> = {\n label: \"NUMBER\",\n decoder(value: string) {\n return Number(value);\n },\n};\n\nexport const typeBigInt: Type<bigint> = {\n label: \"BIGINT\",\n decoder(value: string) {\n return BigInt(value);\n },\n};\n\nexport function typeCommaArray(elementType: Type<any>): Type<Array<any>> {\n return {\n label:\n `${elementType.label}[${elementType.label},...]` as Uppercase<string>,\n decoder(value: string) {\n return value.split(\",\").map(elementType.decoder);\n },\n };\n}\n"],"mappings":"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","names":["index_exports","__export","ReaderTokenizer","argumentOptional","argumentRequired","argumentVariadics","command","commandWithSubcommands","gridToPrintableLines","optionFlag","optionRepeatable","optionSingleValue","process","runWithArgv","typeBigInt","typeBoolean","typeCommaArray","typeDate","typeNumber","typeString","typoInferSupport","typoPrintableString","usageToPrintableLines","__toCommonJS","argumentRequired","definition","readerPositionals","positional","argumentOptional","argumentVariadics","values","command","metadata","process","readerTokenizer","computeUsage","processUsage","argument","breadcrumbArgument","processResolver","lastPositional","processRunner","context","error","_context","commandWithSubcommands","subcommands","subcommandName","subcommandInput","subcommandRunner","subcommandUsage","breadcrumbCommand","payload","name","subcommand","label","typoPrintableString","typoSupport","typoText","colorStartCode","colorCodes","colorBoldCode","boldCode","resetCode","colorStartTag","colorEndTag","boldStartTag","boldEndTag","typoInferSupport","gridToPrintableLines","grid","typoSupport","lines","gridWidths","gridRow","gridColumnIndex","gridCell","length","gridCellLength","lineColumns","parts","text","typoPrintableString","padding","cell","optionFlag","definition","readerTokenizer","key","longs","shorts","value","optionRepeatable","optionSingleValue","values","firstValue","process","inputs","handler","optionsUsage","optionKey","optionInput","argumentsUsage","argumentInput","readerTokenizer","optionsConsumers","argumentsValues","optionsValues","context","_parsedArgv","_parsedIndex","_parsedDouble","_flagKeyByShort","_flagKeyByLong","_flagInfoByKey","_flagResultByKey","_optionKeyByShort","_optionKeyByLong","_optionInfoByKey","_optionResultByKey","_ReaderTokenizer_instances","consumeArg_fn","consumeOptionValue_fn","parseAsPositional_fn","consumeOptionLong_fn","tryConsumeOptionShort_fn","acknowledgeFlag_fn","acknowledgeOption_fn","ensureUniqueKey_fn","ensureUniqueName_fn","ReaderTokenizer","argv","__privateAdd","__privateSet","definition","__privateMethod","__privateGet","short","long","key","result","arg","positional","__privateWrapper","name","valueIndexStart","shortIndexStart","shortIndexEnd","rest","direct","flagKey","value","asBoolean","optionKey","values","nameShortOrLong","lower","usageToPrintableLines","params","cliName","commandUsage","typoSupport","lines","typoPrintableString","textDesc","descriptionLine","textSubs","breadcrumbPrefix","textTitle","breadcrumbsItems","textName","breadcrumb","textValue","grid","argumentUsage","gridRow","gridToPrintableLines","optionUsage","subcommand","text","runWithArgv","argv","context","command","cliInfo","cliName","readerTokenizer","ReaderTokenizer","commandRunner","usageToPrintableLines","typoInferSupport","error","typeBoolean","value","typeDate","timestamp","typeString","typeNumber","typeBigInt","typeCommaArray","elementType"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/lib/Argument.ts","../src/lib/Command.ts","../src/lib/Execution.ts","../src/lib/Typo.ts","../src/lib/Grid.ts","../src/lib/Option.ts","../src/lib/Reader.ts","../src/lib/Usage.ts","../src/lib/Run.ts","../src/lib/Type.ts"],"sourcesContent":["export * from \"./lib/Argument\";\nexport * from \"./lib/Command\";\nexport * from \"./lib/Execution\";\nexport * from \"./lib/Grid\";\nexport * from \"./lib/Option\";\nexport * from \"./lib/Reader\";\nexport * from \"./lib/Run\";\nexport * from \"./lib/Type\";\nexport * from \"./lib/Typo\";\nexport * from \"./lib/Usage\";\n","import { ReaderPositionals } from \"./Reader\";\nimport { Type } from \"./Type\";\n\nexport type Argument<Value> = {\n generateUsage(): ArgumentUsage;\n consumeValue(readerPositionals: ReaderPositionals): Value;\n};\n\nexport type ArgumentUsage = {\n description: string | undefined;\n label: string;\n};\n\nexport function argumentRequired<Value>(definition: {\n description?: string;\n type: Type<Value>;\n label?: Uppercase<string>;\n}): Argument<Value> {\n return {\n generateUsage() {\n return {\n description: definition.description,\n label: `<${definition.label ?? definition.type.label}>`,\n };\n },\n consumeValue(readerPositionals: ReaderPositionals) {\n const positional = readerPositionals.consumePositional();\n if (positional === undefined) {\n throw new Error(\n `Missing required arg: <${definition.label ?? definition.type.label}>`,\n );\n }\n return definition.type.decoder(positional);\n },\n };\n}\n\nexport function argumentOptional<Value>(definition: {\n description?: string;\n type: Type<Value>;\n label?: Uppercase<string>;\n default: () => Value;\n}): Argument<Value> {\n return {\n generateUsage() {\n return {\n description: definition.description,\n label: `[${definition.label ?? definition.type.label}]`,\n };\n },\n consumeValue(readerPositionals: ReaderPositionals) {\n const positional = readerPositionals.consumePositional();\n if (positional === undefined) {\n return definition.default();\n }\n return definition.type.decoder(positional);\n },\n };\n}\n\nexport function argumentVariadics<Value>(definition: {\n description?: string;\n type: Type<Value>;\n label?: Uppercase<string>;\n endDelimiter?: string;\n}): Argument<Array<Value>> {\n return {\n generateUsage() {\n return {\n description: definition.description,\n label:\n `[${definition.label ?? definition.type.label}...]` +\n (definition.endDelimiter\n ? ` (end with ${definition.endDelimiter})`\n : \"\"),\n };\n },\n consumeValue(readerPositionals: ReaderPositionals) {\n const values: Array<Value> = [];\n while (true) {\n const positional = readerPositionals.consumePositional();\n if (\n positional === undefined ||\n positional === definition.endDelimiter\n ) {\n break;\n }\n values.push(definition.type.decoder(positional));\n }\n return values;\n },\n };\n}\n","import { ArgumentUsage } from \"./Argument\";\nimport { Execution } from \"./Execution\";\nimport { OptionUsage } from \"./Option\";\nimport { ReaderTokenizer } from \"./Reader\";\n\nexport type Command<Context, Result> = {\n getTitle(): string | undefined;\n prepareRunner(\n readerTokenizer: ReaderTokenizer,\n ): CommandRunner<Context, Result>;\n};\n\nexport type CommandRunner<Context, Result> = {\n computeUsage(): CommandUsage;\n execute(context: Context): Promise<Result>;\n};\n\nexport type CommandUsage = {\n breadcrumbs: Array<CommandUsageBreadcrumb>;\n title: string;\n description: Array<string> | undefined;\n options: Array<OptionUsage>;\n arguments: Array<ArgumentUsage>;\n subcommands: Array<{ name: string; title: string | undefined }>;\n};\n\nexport type CommandUsageBreadcrumb = {\n kind: \"command\" | \"argument\";\n value: string;\n};\n\nexport function command<Context, Result>(\n metadata: {\n title: string;\n description?: Array<string>;\n },\n execution: Execution<Context, Result>,\n): Command<Context, Result> {\n return {\n getTitle() {\n return metadata.title;\n },\n prepareRunner(readerTokenizer: ReaderTokenizer) {\n function computeUsage(): CommandUsage {\n const executionUsage = execution.computeUsage();\n return {\n breadcrumbs: executionUsage.arguments.map((argument) =>\n breadcrumbArgument(argument.label),\n ),\n title: metadata.title,\n description: metadata.description,\n options: executionUsage.options,\n arguments: executionUsage.arguments,\n subcommands: [],\n };\n }\n try {\n const executionResolver = execution.prepareResolver(readerTokenizer);\n const lastPositional = readerTokenizer.consumePositional();\n if (lastPositional !== undefined) {\n throw Error(`Unprocessed positional: ${lastPositional}`);\n }\n const executionCallback = executionResolver();\n return {\n computeUsage,\n async execute(context: Context) {\n return await executionCallback(context);\n },\n };\n } catch (error) {\n return {\n computeUsage,\n async execute(_context: Context) {\n throw error;\n },\n };\n }\n },\n };\n}\n\nexport function commandWithSubcommands<Context, Payload, Result>(\n metadata: {\n title: string;\n description?: Array<string>;\n },\n execution: Execution<Context, Payload>,\n subcommands: { [subcommand: Lowercase<string>]: Command<Payload, Result> },\n): Command<Context, Result> {\n return {\n getTitle() {\n return metadata.title;\n },\n prepareRunner(readerTokenizer: ReaderTokenizer) {\n try {\n const executionResolver = execution.prepareResolver(readerTokenizer);\n const subcommandName = readerTokenizer.consumePositional();\n if (subcommandName === undefined) {\n throw new Error(\"Expected a subcommand\");\n }\n const subcommandInput =\n subcommands[subcommandName as Lowercase<string>];\n if (subcommandInput === undefined) {\n throw new Error(`Unknown subcommand: ${subcommandName}`);\n }\n const subcommandRunner = subcommandInput.prepareRunner(readerTokenizer);\n const executionCallback = executionResolver();\n return {\n computeUsage() {\n const executionUsage = execution.computeUsage();\n const subcommandUsage = subcommandRunner.computeUsage();\n return {\n breadcrumbs: executionUsage.arguments\n .map((argument) => breadcrumbArgument(argument.label))\n .concat([breadcrumbCommand(subcommandName)])\n .concat(subcommandUsage.breadcrumbs),\n title: subcommandUsage.title,\n description: subcommandUsage.description,\n options: executionUsage.options.concat(subcommandUsage.options),\n arguments: executionUsage.arguments.concat(\n subcommandUsage.arguments,\n ),\n subcommands: subcommandUsage.subcommands,\n };\n },\n async execute(context: Context) {\n const payload = await executionCallback(context);\n return await subcommandRunner.execute(payload);\n },\n };\n } catch (error) {\n return {\n computeUsage() {\n const executionUsage = execution.computeUsage();\n return {\n breadcrumbs: executionUsage.arguments\n .map((argument) => breadcrumbArgument(argument.label))\n .concat([breadcrumbCommand(\"<SUBCOMMAND>\")]),\n title: metadata.title,\n description: metadata.description,\n options: executionUsage.options,\n arguments: executionUsage.arguments,\n subcommands: Object.entries(subcommands).map(\n ([name, subcommand]) => ({\n name,\n title: subcommand.getTitle(),\n }),\n ),\n };\n },\n async execute(_context: Context) {\n throw error;\n },\n };\n }\n },\n };\n}\n\nfunction breadcrumbArgument(label: string): CommandUsageBreadcrumb {\n return { kind: \"argument\", value: label };\n}\n\nfunction breadcrumbCommand(name: string): CommandUsageBreadcrumb {\n return { kind: \"command\", value: name };\n}\n","import { Argument, ArgumentUsage } from \"./Argument\";\nimport { Option, OptionUsage } from \"./Option\";\nimport { ReaderTokenizer } from \"./Reader\";\n\nexport type Execution<Context, Result> = {\n computeUsage(): ExecutionUsage;\n prepareResolver(\n readerTokenizer: ReaderTokenizer,\n ): ExecutionResolver<Context, Result>;\n};\n\nexport type ExecutionResolver<Context, Result> = () => ExecutionCallback<\n Context,\n Result\n>;\n\nexport type ExecutionCallback<Context, Result> = (\n context: Context,\n) => Promise<Result>;\n\nexport type ExecutionUsage = {\n options: Array<OptionUsage>;\n arguments: Array<ArgumentUsage>;\n};\n\nexport function execution<\n Context,\n Result,\n Options extends { [option: string]: Option<any> },\n const Arguments extends Array<Argument<any>>,\n>(\n inputs: { options: Options; arguments: Arguments },\n handler: (\n context: Context,\n inputs: {\n options: {\n [K in keyof Options]: ReturnType<\n ReturnType<Options[K][\"prepareConsumer\"]>\n >;\n };\n arguments: {\n [K in keyof Arguments]: ReturnType<Arguments[K][\"consumeValue\"]>;\n };\n },\n ) => Promise<Result>,\n): Execution<Context, Result> {\n return {\n computeUsage() {\n const optionsUsage = new Array<OptionUsage>();\n for (const optionKey in inputs.options) {\n const optionInput = inputs.options[optionKey]!;\n optionsUsage.push(optionInput.generateUsage());\n }\n const argumentsUsage = new Array<ArgumentUsage>();\n for (const argumentInput of inputs.arguments) {\n argumentsUsage.push(argumentInput.generateUsage());\n }\n return { options: optionsUsage, arguments: argumentsUsage };\n },\n prepareResolver(readerTokenizer: ReaderTokenizer) {\n const optionsConsumers: any = {};\n for (const optionKey in inputs.options) {\n const optionInput = inputs.options[optionKey]!;\n optionsConsumers[optionKey] =\n optionInput.prepareConsumer(readerTokenizer);\n }\n const argumentsValues: any = [];\n for (const argumentInput of inputs.arguments) {\n argumentsValues.push(argumentInput.consumeValue(readerTokenizer));\n }\n return () => {\n const optionsValues: any = {};\n for (const optionKey in optionsConsumers) {\n optionsValues[optionKey] = optionsConsumers[optionKey]!();\n }\n return async (context: Context) => {\n return await handler(context, {\n options: optionsValues,\n arguments: argumentsValues,\n });\n };\n };\n },\n };\n}\n","export type TypoSupport = \"none\" | \"tty\" | \"html\" | \"mock\";\n\nexport type TypoText = {\n value: string;\n color?: keyof typeof colorCodes;\n bold?: boolean;\n};\n\nexport function typoPrintableString(\n typoSupport: TypoSupport,\n typoText: TypoText,\n): string {\n if (typoSupport === \"none\") {\n return typoText.value;\n }\n if (typoSupport === \"tty\") {\n const colorStartCode = typoText.color ? colorCodes[typoText.color] : \"\";\n const colorBoldCode = typoText.bold ? boldCode : \"\";\n return `${colorStartCode}${colorBoldCode}${typoText.value}${resetCode}`;\n }\n if (typoSupport === \"html\") {\n const colorStartTag = typoText.color\n ? `<span style=\"color: ${typoText.color}\">`\n : \"\";\n const colorEndTag = typoText.color ? \"</span>\" : \"\";\n const boldStartTag = typoText.bold ? \"<b>\" : \"\";\n const boldEndTag = typoText.bold ? \"</b>\" : \"\";\n return `${colorStartTag}${boldStartTag}${typoText.value}${boldEndTag}${colorEndTag}`;\n }\n if (typoSupport === \"mock\") {\n if (typoText.color && typoText.bold) {\n return `{${typoText.value}}@${typoText.color}+`;\n }\n if (typoText.color) {\n return `{${typoText.value}}@${typoText.color}`;\n }\n if (typoText.bold) {\n return `{${typoText.value}}+`;\n }\n return `{${typoText.value}}`;\n }\n throw new Error(`Unknown typo support: ${typoSupport}`);\n}\n\nexport function typoInferSupport(): TypoSupport {\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 || !process.stdout || !process.stdout.isTTY) {\n return \"none\";\n }\n return \"tty\";\n}\n\nconst resetCode = \"\\x1b[0m\";\nconst boldCode = \"\\x1b[1m\";\nconst colorCodes = {\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n grey: \"\\x1b[90m\",\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(grid: Grid, typoSupport: TypoSupport) {\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(\" \"));\n }\n return lines;\n}\n\nfunction gridCellLength(cell: GridCell): number {\n let length = 0;\n for (const text of cell) {\n length += text.value.length;\n }\n return length;\n}\n","import { ReaderTokenizer } from \"./Reader\";\nimport { Type } from \"./Type\";\n\nexport type Option<Value> = {\n generateUsage(): OptionUsage;\n prepareConsumer(readerTokenizer: ReaderTokenizer): OptionConsumer<Value>;\n};\n\nexport type OptionUsage = {\n description: string | undefined;\n long: Lowercase<string>; // TODO - better type for long option names ?\n short: string | undefined;\n label: Uppercase<string> | undefined;\n};\n\nexport type OptionConsumer<Value> = () => Value;\n\nexport function optionFlag(definition: {\n description?: string;\n long: Lowercase<string>;\n short?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n default?: () => boolean;\n}): Option<boolean> {\n return {\n generateUsage() {\n return {\n description: definition.description,\n long: definition.long,\n short: definition.short,\n label: undefined,\n };\n },\n prepareConsumer(readerTokenizer: ReaderTokenizer) {\n const key = definition.long;\n const longs = [definition.long];\n if (definition.aliases?.longs) {\n longs.push(...definition.aliases?.longs);\n }\n const shorts = definition.short ? [definition.short] : [];\n if (definition.aliases?.shorts) {\n shorts.push(...definition.aliases?.shorts);\n }\n readerTokenizer.registerFlag({ key, longs, shorts });\n return () => {\n const value = readerTokenizer.consumeFlag(key);\n if (value === undefined) {\n return definition.default ? definition.default() : false;\n }\n return value;\n };\n },\n };\n}\n\n// TODO - option with comma-separated values, e.g. --names=alice,bob,charlie\n\nexport function optionRepeatable<Value>(definition: {\n description?: string;\n type: Type<Value>;\n long: Lowercase<string>;\n short?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n label?: Uppercase<string>;\n}): Option<Array<Value>> {\n return {\n generateUsage() {\n return {\n description: definition.description,\n long: definition.long,\n short: definition.short,\n label:\n `<${definition.label ?? definition.type.label}>` as Uppercase<string>,\n };\n },\n prepareConsumer(readerTokenizer: ReaderTokenizer) {\n const key = definition.long;\n const longs = definition.long ? [definition.long] : [];\n if (definition.aliases?.longs) {\n longs.push(...definition.aliases?.longs);\n }\n const shorts = definition.short ? [definition.short] : [];\n if (definition.aliases?.shorts) {\n shorts.push(...definition.aliases?.shorts);\n }\n readerTokenizer.registerOption({ key, longs, shorts });\n return () => {\n return readerTokenizer.consumeOption(key).map(definition.type.decoder);\n };\n },\n };\n}\n\nexport function optionSingleValue<Value>(definition: {\n description?: string;\n type: Type<Value>;\n long: Lowercase<string>;\n short?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n label?: Uppercase<string>;\n default: () => Value;\n}): Option<Value> {\n return {\n generateUsage() {\n return {\n description: definition.description,\n long: definition.long,\n short: definition.short,\n label:\n `<${definition.label ?? definition.type.label}>` as Uppercase<string>,\n };\n },\n prepareConsumer(readerTokenizer: ReaderTokenizer) {\n const key = definition.long;\n const longs = [definition.long];\n if (definition.aliases?.longs) {\n longs.push(...definition.aliases?.longs);\n }\n const shorts = definition.short ? [definition.short] : [];\n if (definition.aliases?.shorts) {\n shorts.push(...definition.aliases?.shorts);\n }\n readerTokenizer.registerOption({ key, longs, shorts });\n return () => {\n // TODO - smooth and beautiful error handling\n const values = readerTokenizer.consumeOption(definition.long);\n if (values.length > 1) {\n throw new Error(\n `Multiple values provided for option: ${definition.long}`,\n );\n }\n const firstValue = values[0];\n if (firstValue === undefined) {\n return definition.default();\n }\n return definition.type.decoder(firstValue);\n };\n },\n };\n}\n","export type ReaderPositionals = {\n consumePositional(): string | undefined;\n};\n\nexport class ReaderTokenizer {\n #parsedArgv: 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(argv: Array<string>) {\n this.#parsedArgv = argv;\n this.#parsedIndex = 0;\n this.#parsedDouble = false;\n\n // TODO - this seems like a good candidate for abstraction\n this.#flagKeyByShort = new Map();\n this.#flagKeyByLong = new Map();\n this.#flagInfoByKey = new Map();\n this.#flagResultByKey = new Map();\n\n this.#optionKeyByShort = new Map();\n this.#optionKeyByLong = new Map();\n this.#optionInfoByKey = new Map();\n this.#optionResultByKey = new Map();\n }\n\n registerFlag(definition: {\n key: string;\n shorts: Array<string>;\n longs: Array<string>;\n }) {\n this.#ensureUniqueKey(definition.key);\n this.#flagInfoByKey.set(definition.key, {});\n for (const short of definition.shorts) {\n this.#ensureUniqueName(short);\n this.#flagKeyByShort.set(short, definition.key);\n }\n for (const long of definition.longs) {\n this.#ensureUniqueName(long);\n this.#flagKeyByLong.set(long, definition.key);\n }\n }\n\n registerOption(definition: {\n key: string;\n shorts: Array<string>;\n longs: Array<string>;\n }) {\n this.#ensureUniqueKey(definition.key);\n this.#optionInfoByKey.set(definition.key, {});\n for (const short of definition.shorts) {\n this.#ensureUniqueName(short);\n this.#optionKeyByShort.set(short, definition.key);\n }\n for (const long of definition.longs) {\n this.#ensureUniqueName(long);\n this.#optionKeyByLong.set(long, definition.key);\n }\n }\n\n consumeFlag(key: string): boolean | undefined {\n const flagInfo = this.#flagInfoByKey.get(key);\n if (flagInfo === undefined) {\n throw new Error(`Option flag not registered: ${key}`);\n }\n const result = this.#flagResultByKey.get(key);\n if (result === undefined) {\n this.#flagResultByKey.set(key, null);\n return undefined;\n }\n if (result === null) {\n throw new Error(`Option flag already consumed: ${key}`);\n }\n this.#flagResultByKey.set(key, null);\n return result;\n }\n\n consumeOption(key: string): Array<string> {\n const optionInfo = this.#optionInfoByKey.get(key);\n if (optionInfo === undefined) {\n throw new Error(`Option values not registered: ${key}`);\n }\n const result = this.#optionResultByKey.get(key);\n if (result === undefined) {\n this.#optionResultByKey.set(key, null);\n return new Array<string>();\n }\n if (result === null) {\n throw new Error(`Option values already consumed: ${key}`);\n }\n this.#optionResultByKey.set(key, null);\n return result;\n }\n\n consumePositional(): string | undefined {\n while (true) {\n const arg = this.#consumeArg();\n if (arg === null) {\n return undefined;\n }\n const positional = this.#parseAsPositional(arg);\n if (positional !== null) {\n return positional;\n }\n }\n }\n\n #consumeArg(): string | null {\n const arg = this.#parsedArgv[this.#parsedIndex];\n if (arg === undefined) {\n return null;\n }\n this.#parsedIndex++;\n if (!this.#parsedDouble) {\n if (arg === \"--\") {\n this.#parsedDouble = true;\n return this.#consumeArg();\n }\n }\n return arg;\n }\n\n #consumeOptionValue(name: string) {\n const arg = this.#consumeArg();\n if (arg === null) {\n throw new Error(`Option ${name} requires a value`);\n }\n if (this.#parsedDouble) {\n throw new Error(`Option ${name} requires a value before --`);\n }\n // TODO - is that weird, could a valid value start with dash ?\n if (arg.startsWith(\"-\")) {\n throw new Error(`Option ${name} requires a value, got: ${arg}`);\n }\n return arg;\n }\n\n #parseAsPositional(arg: string): string | null {\n if (this.#parsedDouble) {\n return arg;\n }\n if (arg.startsWith(\"--\")) {\n const valueIndexStart = arg.indexOf(\"=\");\n if (valueIndexStart === -1) {\n this.#consumeOptionLong(arg.slice(2), null);\n } else {\n this.#consumeOptionLong(\n arg.slice(2, valueIndexStart),\n arg.slice(valueIndexStart + 1),\n );\n }\n return null;\n }\n if (arg.startsWith(\"-\")) {\n let shortIndexStart = 1;\n let shortIndexEnd = 2;\n while (shortIndexEnd <= arg.length) {\n const short = arg.slice(shortIndexStart, shortIndexEnd);\n const rest = arg.slice(shortIndexEnd);\n const result = this.#tryConsumeOptionShort(short, rest);\n if (result === true) {\n return null;\n }\n if (result === false) {\n shortIndexStart = shortIndexEnd;\n }\n shortIndexEnd++;\n }\n throw new Error(\n `Unknown short flags or options: ${arg.slice(shortIndexStart)}`,\n );\n }\n return arg;\n }\n\n #consumeOptionLong(long: string, direct: string | null): void {\n const flagKey = this.#flagKeyByLong.get(long);\n if (flagKey !== undefined) {\n if (direct !== null) {\n const value = asBoolean(direct);\n if (value !== undefined) {\n return this.#acknowledgeFlag(flagKey, value);\n }\n throw new Error(\n `Invalid parameter for long flag: ${flagKey}, value: ${direct}`,\n );\n }\n return this.#acknowledgeFlag(flagKey, true);\n }\n const optionKey = this.#optionKeyByLong.get(long);\n if (optionKey !== undefined) {\n if (direct !== null) {\n return this.#acknowledgeOption(optionKey, direct);\n }\n return this.#acknowledgeOption(optionKey, this.#consumeOptionValue(long));\n }\n throw new Error(`Unknown long flag or option: ${long}`);\n }\n\n #tryConsumeOptionShort(short: string, rest: string): boolean | null {\n const flagKey = this.#flagKeyByShort.get(short);\n if (flagKey !== undefined) {\n if (rest.startsWith(\"=\")) {\n const value = asBoolean(rest.slice(1));\n if (value !== undefined) {\n this.#acknowledgeFlag(flagKey, value);\n return true;\n }\n throw new Error(\n `Invalid parameter for short flag: ${short}, value: ${rest}`,\n );\n }\n this.#acknowledgeFlag(flagKey, true);\n return rest === \"\";\n }\n const optionKey = this.#optionKeyByShort.get(short);\n if (optionKey !== undefined) {\n if (rest === \"\") {\n this.#acknowledgeOption(optionKey, this.#consumeOptionValue(short));\n return true;\n }\n if (rest.startsWith(\"=\")) {\n this.#acknowledgeOption(optionKey, rest.slice(1));\n } else {\n this.#acknowledgeOption(optionKey, rest);\n }\n return true;\n }\n return null;\n }\n\n #acknowledgeFlag(key: string, value: boolean) {\n if (this.#flagResultByKey.has(key)) {\n throw new Error(`Flag already set: ${key}`);\n }\n this.#flagResultByKey.set(key, value);\n }\n\n #acknowledgeOption(key: string, value: string) {\n const values = this.#optionResultByKey.get(key) ?? new Array<string>();\n values.push(value);\n this.#optionResultByKey.set(key, values);\n }\n\n #ensureUniqueKey(key: string) {\n if (this.#flagInfoByKey.has(key)) {\n throw new Error(`Option already registered: ${key}`);\n }\n if (this.#optionInfoByKey.has(key)) {\n throw new Error(`Option already registered: ${key}`);\n }\n }\n\n #ensureUniqueName(nameShortOrLong: string) {\n // TODO - overall better error handling\n // TODO - short flag overlap might be annoying here\n if (this.#flagKeyByShort.has(nameShortOrLong)) {\n throw new Error(`Option already registered: ${nameShortOrLong}`);\n }\n if (this.#flagKeyByLong.has(nameShortOrLong)) {\n throw new Error(`Option already registered: ${nameShortOrLong}`);\n }\n if (this.#optionKeyByShort.has(nameShortOrLong)) {\n throw new Error(`Option already registered: ${nameShortOrLong}`);\n }\n if (this.#optionKeyByLong.has(nameShortOrLong)) {\n throw new Error(`Option already registered: ${nameShortOrLong}`);\n }\n }\n}\n\nfunction asBoolean(value: string): boolean | undefined {\n const lower = value.toLowerCase();\n if (lower === \"true\" || lower === \"t\" || lower === \"y\" || lower === \"yes\") {\n return true;\n }\n if (lower === \"false\" || lower === \"f\" || lower === \"n\" || lower === \"no\") {\n return false;\n }\n return undefined;\n}\n","import { CommandUsage } from \"./Command\";\nimport { GridCell, GridRow, gridToPrintableLines } from \"./Grid\";\nimport { TypoSupport, TypoText, typoPrintableString } from \"./Typo\";\n\nexport function usageToPrintableLines(params: {\n cliName: 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 lines.push(typoPrintableString(typoSupport, textDesc(commandUsage.title)));\n if (commandUsage.description) {\n for (const descriptionLine of commandUsage.description) {\n lines.push(typoPrintableString(typoSupport, textSubs(descriptionLine)));\n }\n }\n\n const breadcrumbPrefix = typoPrintableString(\n typoSupport,\n textTitle(\"Usage:\"),\n );\n const breadcrumbsItems = [\n typoPrintableString(typoSupport, textName(cliName)),\n ].concat(\n commandUsage.breadcrumbs.map((breadcrumb) => {\n if (breadcrumb.kind === \"argument\") {\n return typoPrintableString(typoSupport, textValue(breadcrumb.value));\n }\n return typoPrintableString(typoSupport, textName(breadcrumb.value));\n }),\n );\n lines.push(\"\");\n lines.push(`${breadcrumbPrefix} ${breadcrumbsItems.join(\" \")}`);\n\n if (commandUsage.arguments.length > 0) {\n lines.push(\"\");\n lines.push(typoPrintableString(typoSupport, textTitle(\"Arguments:\")));\n const grid = new Array<GridRow>();\n for (const argumentUsage of commandUsage.arguments) {\n const gridRow = new Array<GridCell>();\n gridRow.push([]);\n gridRow.push([textValue(argumentUsage.label)]);\n gridRow.push([]);\n if (argumentUsage.description) {\n gridRow.push([textDesc(argumentUsage.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, textTitle(\"Options:\")));\n const grid = new Array<GridRow>();\n for (const optionUsage of commandUsage.options) {\n const gridRow = new Array<GridCell>();\n gridRow.push([]);\n if (optionUsage.short) {\n gridRow.push([textName(`-${optionUsage.short}`), { value: \",\" }]);\n } else {\n gridRow.push([]);\n }\n if (optionUsage.label) {\n gridRow.push([\n textName(`--${optionUsage.long} `),\n textValue(optionUsage.label),\n ]);\n } else {\n gridRow.push([\n textName(`--${optionUsage.long}`),\n { value: \"[=yes|no]\", color: \"grey\" },\n ]);\n }\n gridRow.push([]);\n if (optionUsage.description) {\n gridRow.push([textDesc(optionUsage.description)]);\n }\n grid.push(gridRow);\n }\n lines.push(...gridToPrintableLines(grid, typoSupport));\n }\n\n if (commandUsage.subcommands.length > 0) {\n lines.push(\"\");\n lines.push(typoPrintableString(typoSupport, textTitle(\"Subcommands:\")));\n const grid = new Array<GridRow>();\n for (const subcommand of commandUsage.subcommands) {\n const gridRow = new Array<GridCell>();\n gridRow.push([]);\n gridRow.push([textName(subcommand.name)]);\n gridRow.push([]);\n if (subcommand.title) {\n gridRow.push([textDesc(subcommand.title)]);\n }\n grid.push(gridRow);\n }\n lines.push(...gridToPrintableLines(grid, typoSupport));\n }\n lines.push(\"\");\n return lines;\n}\n\nfunction textTitle(text: string): TypoText {\n return { value: text, color: \"green\", bold: true };\n}\n\nfunction textSubs(text: string): TypoText {\n return { value: text, color: \"grey\" };\n}\n\nfunction textDesc(text: string): TypoText {\n return { value: text, bold: true };\n}\n\nfunction textName(text: string): TypoText {\n return { value: text, color: \"cyan\", bold: true };\n}\n\nfunction textValue(text: string): TypoText {\n return { value: text, color: \"cyan\" };\n}\n","import { Command } from \"./Command\";\nimport { ReaderTokenizer } from \"./Reader\";\nimport { typoInferSupport } from \"./Typo\";\nimport { usageToPrintableLines } from \"./Usage\";\n\nexport async function runWithArgv<Context, Result>(\n argv: string[],\n context: Context,\n command: Command<Context, Result>,\n cliInfo?: {\n name?: Lowercase<string>;\n version?: string;\n helpOnError?: boolean;\n },\n): Promise<Result> {\n const cliName = cliInfo?.name ?? argv[1]!;\n const readerTokenizer = new ReaderTokenizer(argv.slice(2));\n if (cliInfo?.version) {\n readerTokenizer.registerFlag({\n key: \"version\",\n shorts: [],\n longs: [\"version\"],\n });\n }\n readerTokenizer.registerFlag({\n key: \"help\",\n shorts: [],\n longs: [\"help\"],\n });\n /*\n // TODO - handle completions ?\n readerTokenizer.registerFlag({\n key: \"completion\",\n shorts: [],\n longs: [\"completion\"],\n });\n */\n try {\n const commandRunner = command.prepareRunner(readerTokenizer);\n if (cliInfo?.version) {\n if (readerTokenizer.consumeFlag(\"version\")) {\n console.log(cliName, cliInfo.version);\n process.exit(0);\n }\n }\n if (readerTokenizer.consumeFlag(\"help\")) {\n console.log(\n usageToPrintableLines({\n cliName,\n commandUsage: commandRunner.computeUsage(),\n typoSupport: typoInferSupport(),\n }).join(\"\\n\"),\n );\n process.exit(0);\n }\n try {\n return await commandRunner.execute(context);\n } catch (error) {\n if (cliInfo?.helpOnError ?? true) {\n console.log(\n usageToPrintableLines({\n cliName,\n commandUsage: commandRunner.computeUsage(),\n typoSupport: typoInferSupport(),\n }).join(\"\\n\"),\n );\n }\n console.error(error);\n process.exit(1);\n }\n } catch (error) {\n console.error(error);\n process.exit(1);\n }\n}\n","export type Type<Value> = {\n label: Uppercase<string>; // TODO - is there a better way to enforce uppercase labels?\n decoder(value: string): Value;\n};\n\nexport const typeBoolean: Type<boolean> = {\n label: \"BOOLEAN\",\n decoder(value: string) {\n if (value === \"true\") {\n return true;\n }\n if (value === \"false\") {\n return false;\n }\n throw new Error(`Invalid boolean value: ${value}`);\n },\n};\n\nexport const typeDate: Type<Date> = {\n label: \"DATE\",\n decoder(value: string) {\n const timestamp = Date.parse(value);\n if (isNaN(timestamp)) {\n throw new Error(`Invalid date value: ${value}`);\n }\n return new Date(timestamp);\n },\n};\n\nexport const typeString: Type<string> = {\n label: \"STRING\",\n decoder(value: string) {\n return value;\n },\n};\n\nexport const typeNumber: Type<number> = {\n label: \"NUMBER\",\n decoder(value: string) {\n return Number(value);\n },\n};\n\nexport const typeBigInt: Type<bigint> = {\n label: \"BIGINT\",\n decoder(value: string) {\n return BigInt(value);\n },\n};\n\nexport function typeCommaArray(elementType: Type<any>): Type<Array<any>> {\n return {\n label:\n `${elementType.label}[${elementType.label},...]` as Uppercase<string>,\n decoder(value: string) {\n return value.split(\",\").map(elementType.decoder);\n },\n };\n}\n"],"mappings":"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","names":["index_exports","__export","ReaderTokenizer","argumentOptional","argumentRequired","argumentVariadics","command","commandWithSubcommands","execution","gridToPrintableLines","optionFlag","optionRepeatable","optionSingleValue","runWithArgv","typeBigInt","typeBoolean","typeCommaArray","typeDate","typeNumber","typeString","typoInferSupport","typoPrintableString","usageToPrintableLines","__toCommonJS","argumentRequired","definition","readerPositionals","positional","argumentOptional","argumentVariadics","values","command","metadata","execution","readerTokenizer","computeUsage","executionUsage","argument","breadcrumbArgument","executionResolver","lastPositional","executionCallback","context","error","_context","commandWithSubcommands","subcommands","subcommandName","subcommandInput","subcommandRunner","subcommandUsage","breadcrumbCommand","payload","name","subcommand","label","execution","inputs","handler","optionsUsage","optionKey","optionInput","argumentsUsage","argumentInput","readerTokenizer","optionsConsumers","argumentsValues","optionsValues","context","typoPrintableString","typoSupport","typoText","colorStartCode","colorCodes","colorBoldCode","boldCode","resetCode","colorStartTag","colorEndTag","boldStartTag","boldEndTag","typoInferSupport","gridToPrintableLines","grid","typoSupport","lines","gridWidths","gridRow","gridColumnIndex","gridCell","length","gridCellLength","lineColumns","parts","text","typoPrintableString","padding","cell","optionFlag","definition","readerTokenizer","key","longs","shorts","value","optionRepeatable","optionSingleValue","values","firstValue","_parsedArgv","_parsedIndex","_parsedDouble","_flagKeyByShort","_flagKeyByLong","_flagInfoByKey","_flagResultByKey","_optionKeyByShort","_optionKeyByLong","_optionInfoByKey","_optionResultByKey","_ReaderTokenizer_instances","consumeArg_fn","consumeOptionValue_fn","parseAsPositional_fn","consumeOptionLong_fn","tryConsumeOptionShort_fn","acknowledgeFlag_fn","acknowledgeOption_fn","ensureUniqueKey_fn","ensureUniqueName_fn","ReaderTokenizer","argv","__privateAdd","__privateSet","definition","__privateMethod","__privateGet","short","long","key","result","arg","positional","__privateWrapper","name","valueIndexStart","shortIndexStart","shortIndexEnd","rest","direct","flagKey","value","asBoolean","optionKey","values","nameShortOrLong","lower","usageToPrintableLines","params","cliName","commandUsage","typoSupport","lines","typoPrintableString","textDesc","descriptionLine","textSubs","breadcrumbPrefix","textTitle","breadcrumbsItems","textName","breadcrumb","textValue","grid","argumentUsage","gridRow","gridToPrintableLines","optionUsage","subcommand","text","runWithArgv","argv","context","command","cliInfo","cliName","readerTokenizer","ReaderTokenizer","commandRunner","usageToPrintableLines","typoInferSupport","error","typeBoolean","value","typeDate","timestamp","typeString","typeNumber","typeBigInt","typeCommaArray","elementType"]}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export * from "./lib/Argument";
|
|
2
2
|
export * from "./lib/Command";
|
|
3
|
+
export * from "./lib/Execution";
|
|
3
4
|
export * from "./lib/Grid";
|
|
4
5
|
export * from "./lib/Option";
|
|
5
|
-
export * from "./lib/Process";
|
|
6
6
|
export * from "./lib/Reader";
|
|
7
7
|
export * from "./lib/Run";
|
|
8
8
|
export * from "./lib/Type";
|
package/src/lib/Command.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ArgumentUsage } from "./Argument";
|
|
2
|
+
import { Execution } from "./Execution";
|
|
2
3
|
import { OptionUsage } from "./Option";
|
|
3
|
-
import { Process } from "./Process";
|
|
4
4
|
import { ReaderTokenizer } from "./Reader";
|
|
5
5
|
|
|
6
6
|
export type Command<Context, Result> = {
|
|
@@ -34,7 +34,7 @@ export function command<Context, Result>(
|
|
|
34
34
|
title: string;
|
|
35
35
|
description?: Array<string>;
|
|
36
36
|
},
|
|
37
|
-
|
|
37
|
+
execution: Execution<Context, Result>,
|
|
38
38
|
): Command<Context, Result> {
|
|
39
39
|
return {
|
|
40
40
|
getTitle() {
|
|
@@ -42,29 +42,29 @@ export function command<Context, Result>(
|
|
|
42
42
|
},
|
|
43
43
|
prepareRunner(readerTokenizer: ReaderTokenizer) {
|
|
44
44
|
function computeUsage(): CommandUsage {
|
|
45
|
-
const
|
|
45
|
+
const executionUsage = execution.computeUsage();
|
|
46
46
|
return {
|
|
47
|
-
breadcrumbs:
|
|
47
|
+
breadcrumbs: executionUsage.arguments.map((argument) =>
|
|
48
48
|
breadcrumbArgument(argument.label),
|
|
49
49
|
),
|
|
50
50
|
title: metadata.title,
|
|
51
51
|
description: metadata.description,
|
|
52
|
-
options:
|
|
53
|
-
arguments:
|
|
52
|
+
options: executionUsage.options,
|
|
53
|
+
arguments: executionUsage.arguments,
|
|
54
54
|
subcommands: [],
|
|
55
55
|
};
|
|
56
56
|
}
|
|
57
57
|
try {
|
|
58
|
-
const
|
|
58
|
+
const executionResolver = execution.prepareResolver(readerTokenizer);
|
|
59
59
|
const lastPositional = readerTokenizer.consumePositional();
|
|
60
60
|
if (lastPositional !== undefined) {
|
|
61
61
|
throw Error(`Unprocessed positional: ${lastPositional}`);
|
|
62
62
|
}
|
|
63
|
-
const
|
|
63
|
+
const executionCallback = executionResolver();
|
|
64
64
|
return {
|
|
65
65
|
computeUsage,
|
|
66
66
|
async execute(context: Context) {
|
|
67
|
-
return await
|
|
67
|
+
return await executionCallback(context);
|
|
68
68
|
},
|
|
69
69
|
};
|
|
70
70
|
} catch (error) {
|
|
@@ -84,7 +84,7 @@ export function commandWithSubcommands<Context, Payload, Result>(
|
|
|
84
84
|
title: string;
|
|
85
85
|
description?: Array<string>;
|
|
86
86
|
},
|
|
87
|
-
|
|
87
|
+
execution: Execution<Context, Payload>,
|
|
88
88
|
subcommands: { [subcommand: Lowercase<string>]: Command<Payload, Result> },
|
|
89
89
|
): Command<Context, Result> {
|
|
90
90
|
return {
|
|
@@ -93,7 +93,7 @@ export function commandWithSubcommands<Context, Payload, Result>(
|
|
|
93
93
|
},
|
|
94
94
|
prepareRunner(readerTokenizer: ReaderTokenizer) {
|
|
95
95
|
try {
|
|
96
|
-
const
|
|
96
|
+
const executionResolver = execution.prepareResolver(readerTokenizer);
|
|
97
97
|
const subcommandName = readerTokenizer.consumePositional();
|
|
98
98
|
if (subcommandName === undefined) {
|
|
99
99
|
throw new Error("Expected a subcommand");
|
|
@@ -104,42 +104,42 @@ export function commandWithSubcommands<Context, Payload, Result>(
|
|
|
104
104
|
throw new Error(`Unknown subcommand: ${subcommandName}`);
|
|
105
105
|
}
|
|
106
106
|
const subcommandRunner = subcommandInput.prepareRunner(readerTokenizer);
|
|
107
|
-
const
|
|
107
|
+
const executionCallback = executionResolver();
|
|
108
108
|
return {
|
|
109
109
|
computeUsage() {
|
|
110
|
-
const
|
|
110
|
+
const executionUsage = execution.computeUsage();
|
|
111
111
|
const subcommandUsage = subcommandRunner.computeUsage();
|
|
112
112
|
return {
|
|
113
|
-
breadcrumbs:
|
|
113
|
+
breadcrumbs: executionUsage.arguments
|
|
114
114
|
.map((argument) => breadcrumbArgument(argument.label))
|
|
115
115
|
.concat([breadcrumbCommand(subcommandName)])
|
|
116
116
|
.concat(subcommandUsage.breadcrumbs),
|
|
117
117
|
title: subcommandUsage.title,
|
|
118
118
|
description: subcommandUsage.description,
|
|
119
|
-
options:
|
|
120
|
-
arguments:
|
|
119
|
+
options: executionUsage.options.concat(subcommandUsage.options),
|
|
120
|
+
arguments: executionUsage.arguments.concat(
|
|
121
121
|
subcommandUsage.arguments,
|
|
122
122
|
),
|
|
123
123
|
subcommands: subcommandUsage.subcommands,
|
|
124
124
|
};
|
|
125
125
|
},
|
|
126
126
|
async execute(context: Context) {
|
|
127
|
-
const payload = await
|
|
127
|
+
const payload = await executionCallback(context);
|
|
128
128
|
return await subcommandRunner.execute(payload);
|
|
129
129
|
},
|
|
130
130
|
};
|
|
131
131
|
} catch (error) {
|
|
132
132
|
return {
|
|
133
133
|
computeUsage() {
|
|
134
|
-
const
|
|
134
|
+
const executionUsage = execution.computeUsage();
|
|
135
135
|
return {
|
|
136
|
-
breadcrumbs:
|
|
136
|
+
breadcrumbs: executionUsage.arguments
|
|
137
137
|
.map((argument) => breadcrumbArgument(argument.label))
|
|
138
138
|
.concat([breadcrumbCommand("<SUBCOMMAND>")]),
|
|
139
139
|
title: metadata.title,
|
|
140
140
|
description: metadata.description,
|
|
141
|
-
options:
|
|
142
|
-
arguments:
|
|
141
|
+
options: executionUsage.options,
|
|
142
|
+
arguments: executionUsage.arguments,
|
|
143
143
|
subcommands: Object.entries(subcommands).map(
|
|
144
144
|
([name, subcommand]) => ({
|
|
145
145
|
name,
|
|
@@ -2,28 +2,28 @@ import { Argument, ArgumentUsage } from "./Argument";
|
|
|
2
2
|
import { Option, OptionUsage } from "./Option";
|
|
3
3
|
import { ReaderTokenizer } from "./Reader";
|
|
4
4
|
|
|
5
|
-
export type
|
|
6
|
-
computeUsage():
|
|
5
|
+
export type Execution<Context, Result> = {
|
|
6
|
+
computeUsage(): ExecutionUsage;
|
|
7
7
|
prepareResolver(
|
|
8
8
|
readerTokenizer: ReaderTokenizer,
|
|
9
|
-
):
|
|
9
|
+
): ExecutionResolver<Context, Result>;
|
|
10
10
|
};
|
|
11
11
|
|
|
12
|
-
export type
|
|
12
|
+
export type ExecutionResolver<Context, Result> = () => ExecutionCallback<
|
|
13
13
|
Context,
|
|
14
14
|
Result
|
|
15
15
|
>;
|
|
16
16
|
|
|
17
|
-
export type
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
export type ExecutionCallback<Context, Result> = (
|
|
18
|
+
context: Context,
|
|
19
|
+
) => Promise<Result>;
|
|
20
20
|
|
|
21
|
-
export type
|
|
21
|
+
export type ExecutionUsage = {
|
|
22
22
|
options: Array<OptionUsage>;
|
|
23
23
|
arguments: Array<ArgumentUsage>;
|
|
24
24
|
};
|
|
25
25
|
|
|
26
|
-
export function
|
|
26
|
+
export function execution<
|
|
27
27
|
Context,
|
|
28
28
|
Result,
|
|
29
29
|
Options extends { [option: string]: Option<any> },
|
|
@@ -43,7 +43,7 @@ export function process<
|
|
|
43
43
|
};
|
|
44
44
|
},
|
|
45
45
|
) => Promise<Result>,
|
|
46
|
-
):
|
|
46
|
+
): Execution<Context, Result> {
|
|
47
47
|
return {
|
|
48
48
|
computeUsage() {
|
|
49
49
|
const optionsUsage = new Array<OptionUsage>();
|
|
@@ -73,13 +73,11 @@ export function process<
|
|
|
73
73
|
for (const optionKey in optionsConsumers) {
|
|
74
74
|
optionsValues[optionKey] = optionsConsumers[optionKey]!();
|
|
75
75
|
}
|
|
76
|
-
return {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
});
|
|
82
|
-
},
|
|
76
|
+
return async (context: Context) => {
|
|
77
|
+
return await handler(context, {
|
|
78
|
+
options: optionsValues,
|
|
79
|
+
arguments: argumentsValues,
|
|
80
|
+
});
|
|
83
81
|
};
|
|
84
82
|
};
|
|
85
83
|
},
|
|
@@ -5,10 +5,10 @@ import {
|
|
|
5
5
|
argumentVariadics,
|
|
6
6
|
command,
|
|
7
7
|
commandWithSubcommands,
|
|
8
|
+
execution,
|
|
8
9
|
optionFlag,
|
|
9
10
|
optionRepeatable,
|
|
10
11
|
optionSingleValue,
|
|
11
|
-
process,
|
|
12
12
|
runWithArgv,
|
|
13
13
|
typeNumber,
|
|
14
14
|
typeString,
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
|
|
17
17
|
const cmd = commandWithSubcommands<string, any, any>(
|
|
18
18
|
{ title: "Root command title" },
|
|
19
|
-
|
|
19
|
+
execution(
|
|
20
20
|
{
|
|
21
21
|
options: {
|
|
22
22
|
booleanFlag: optionFlag({ long: "boolean-flag", default: () => false }),
|
|
@@ -42,7 +42,7 @@ const cmd = commandWithSubcommands<string, any, any>(
|
|
|
42
42
|
{
|
|
43
43
|
sub1: command(
|
|
44
44
|
{ title: "Subcommand 1 title" },
|
|
45
|
-
|
|
45
|
+
execution(
|
|
46
46
|
{
|
|
47
47
|
options: {},
|
|
48
48
|
arguments: [argumentRequired({ type: typeString })],
|
|
@@ -54,7 +54,7 @@ const cmd = commandWithSubcommands<string, any, any>(
|
|
|
54
54
|
),
|
|
55
55
|
sub2: command(
|
|
56
56
|
{ title: "Subcommand 2 title" },
|
|
57
|
-
|
|
57
|
+
execution(
|
|
58
58
|
{
|
|
59
59
|
options: {},
|
|
60
60
|
arguments: [
|
|
@@ -6,10 +6,10 @@ import {
|
|
|
6
6
|
Command,
|
|
7
7
|
command,
|
|
8
8
|
commandWithSubcommands,
|
|
9
|
+
execution,
|
|
9
10
|
optionFlag,
|
|
10
11
|
optionRepeatable,
|
|
11
12
|
optionSingleValue,
|
|
12
|
-
process,
|
|
13
13
|
ReaderTokenizer,
|
|
14
14
|
typeNumber,
|
|
15
15
|
typeString,
|
|
@@ -24,7 +24,7 @@ const cmd = commandWithSubcommands<string, any, any>(
|
|
|
24
24
|
"Second line of root command description",
|
|
25
25
|
],
|
|
26
26
|
},
|
|
27
|
-
|
|
27
|
+
execution(
|
|
28
28
|
{
|
|
29
29
|
options: {
|
|
30
30
|
booleanFlag: optionFlag({
|
|
@@ -73,7 +73,7 @@ const cmd = commandWithSubcommands<string, any, any>(
|
|
|
73
73
|
"Second line of subcommand 1 description",
|
|
74
74
|
],
|
|
75
75
|
},
|
|
76
|
-
|
|
76
|
+
execution(
|
|
77
77
|
{
|
|
78
78
|
options: {},
|
|
79
79
|
arguments: [
|
|
@@ -97,7 +97,7 @@ const cmd = commandWithSubcommands<string, any, any>(
|
|
|
97
97
|
"Second line of subcommand 2 description",
|
|
98
98
|
],
|
|
99
99
|
},
|
|
100
|
-
|
|
100
|
+
execution(
|
|
101
101
|
{
|
|
102
102
|
options: {
|
|
103
103
|
duduValue: optionSingleValue({
|