cli-kiss 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -101,19 +101,19 @@ declare function optionSingleValue<Value>(definition: {
101
101
  default: () => Value;
102
102
  }): Option<Value>;
103
103
 
104
- type Processor<Context, Result> = {
105
- computeUsage(): ProcessorUsage;
106
- prepareResolver(readerTokenizer: ReaderTokenizer): ProcessorResolver<Context, Result>;
104
+ type Process<Context, Result> = {
105
+ computeUsage(): ProcessUsage;
106
+ prepareResolver(readerTokenizer: ReaderTokenizer): ProcessResolver<Context, Result>;
107
107
  };
108
- type ProcessorResolver<Context, Result> = () => ProcessorRunner<Context, Result>;
109
- type ProcessorRunner<Context, Result> = {
108
+ type ProcessResolver<Context, Result> = () => ProcessRunner<Context, Result>;
109
+ type ProcessRunner<Context, Result> = {
110
110
  execute(context: Context): Promise<Result>;
111
111
  };
112
- type ProcessorUsage = {
112
+ type ProcessUsage = {
113
113
  options: Array<OptionUsage>;
114
114
  arguments: Array<ArgumentUsage>;
115
115
  };
116
- declare function processor<Context, Result, Options extends {
116
+ declare function process<Context, Result, Options extends {
117
117
  [option: string]: Option<any>;
118
118
  }, const Arguments extends Array<Argument<any>>>(inputs: {
119
119
  options: Options;
@@ -125,10 +125,10 @@ declare function processor<Context, Result, Options extends {
125
125
  arguments: {
126
126
  [K in keyof Arguments]: ReturnType<Arguments[K]["consumeValue"]>;
127
127
  };
128
- }) => Promise<Result>): Processor<Context, Result>;
128
+ }) => Promise<Result>): Process<Context, Result>;
129
129
 
130
130
  type Command<Context, Result> = {
131
- getDescription(): string | undefined;
131
+ getTitle(): string | undefined;
132
132
  prepareRunner(readerTokenizer: ReaderTokenizer): CommandRunner<Context, Result>;
133
133
  };
134
134
  type CommandRunner<Context, Result> = {
@@ -136,24 +136,64 @@ type CommandRunner<Context, Result> = {
136
136
  execute(context: Context): Promise<Result>;
137
137
  };
138
138
  type CommandUsage = {
139
- breadcrumbs: Array<string>;
140
- description: string | undefined;
139
+ breadcrumbs: Array<CommandUsageBreadcrumb>;
140
+ title: string;
141
+ description: Array<string> | undefined;
141
142
  options: Array<OptionUsage>;
142
143
  arguments: Array<ArgumentUsage>;
143
144
  subcommands: Array<{
144
145
  name: string;
145
- description: string | undefined;
146
+ title: string | undefined;
146
147
  }>;
147
148
  };
148
- declare function command<Context, Result>(description: string, processor: Processor<Context, Result>): Command<Context, Result>;
149
- declare function commandWithSubcommands<Context, Payload, Result>(description: string, processor: Processor<Context, Payload>, subcommands: {
149
+ type CommandUsageBreadcrumb = {
150
+ kind: "command" | "argument";
151
+ value: string;
152
+ };
153
+ declare function command<Context, Result>(metadata: {
154
+ title: string;
155
+ description?: Array<string>;
156
+ }, process: Process<Context, Result>): Command<Context, Result>;
157
+ declare function commandWithSubcommands<Context, Payload, Result>(metadata: {
158
+ title: string;
159
+ description?: Array<string>;
160
+ }, process: Process<Context, Payload>, subcommands: {
150
161
  [subcommand: Lowercase<string>]: Command<Payload, Result>;
151
162
  }): Command<Context, Result>;
152
163
 
164
+ type TypoSupport = "none" | "tty" | "html" | "mock";
165
+ type TypoText = {
166
+ value: string;
167
+ color?: keyof typeof colorCodes;
168
+ bold?: boolean;
169
+ };
170
+ declare function typoPrintableString(typoSupport: TypoSupport, typoText: TypoText): string;
171
+ declare function typoInferSupport(): TypoSupport;
172
+ declare const colorCodes: {
173
+ red: string;
174
+ green: string;
175
+ yellow: string;
176
+ blue: string;
177
+ magenta: string;
178
+ cyan: string;
179
+ grey: string;
180
+ };
181
+
182
+ type Grid = Array<GridRow>;
183
+ type GridRow = Array<GridCell>;
184
+ type GridCell = Array<TypoText>;
185
+ declare function gridToPrintableLines(grid: Grid, typoSupport: TypoSupport): string[];
186
+
153
187
  declare function runWithArgv<Context, Result>(argv: string[], context: Context, command: Command<Context, Result>, cliInfo?: {
154
- name?: string;
188
+ name?: Lowercase<string>;
155
189
  version?: string;
156
190
  helpOnError?: boolean;
157
191
  }): Promise<Result>;
158
192
 
159
- export { type Argument, type ArgumentUsage, type Command, type CommandRunner, type CommandUsage, type Option, type OptionConsumer, type OptionUsage, type Processor, type ProcessorResolver, type ProcessorRunner, type ProcessorUsage, type ReaderPositionals, ReaderTokenizer, type Type, argumentOptional, argumentRequired, argumentVariadics, command, commandWithSubcommands, optionFlag, optionRepeatable, optionSingleValue, processor, runWithArgv, typeBigInt, typeBoolean, typeCommaArray, typeDate, typeNumber, typeString };
193
+ declare function usageToPrintableLines(params: {
194
+ cliName: string;
195
+ commandUsage: CommandUsage;
196
+ typoSupport: TypoSupport;
197
+ }): string[];
198
+
199
+ export { type Argument, type ArgumentUsage, type Command, type CommandRunner, type CommandUsage, type CommandUsageBreadcrumb, type Grid, type GridCell, type GridRow, type Option, type OptionConsumer, type OptionUsage, type Process, type ProcessResolver, type ProcessRunner, type ProcessUsage, type ReaderPositionals, ReaderTokenizer, type Type, type TypoSupport, type TypoText, argumentOptional, argumentRequired, argumentVariadics, command, commandWithSubcommands, gridToPrintableLines, optionFlag, optionRepeatable, optionSingleValue, process, runWithArgv, typeBigInt, typeBoolean, typeCommaArray, typeDate, typeNumber, typeString, typoInferSupport, typoPrintableString, usageToPrintableLines };
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
- "use strict";var T=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var G=Object.prototype.hasOwnProperty;var F=r=>{throw TypeError(r)};var _=(r,e)=>{for(var t in e)T(r,t,{get:e[t],enumerable:!0})},H=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of S(e))!G.call(r,n)&&n!==t&&T(r,n,{get:()=>e[n],enumerable:!(s=j(e,n))||s.enumerable});return r};var J=r=>H(T({},"__esModule",{value:!0}),r);var I=(r,e,t)=>e.has(r)||F("Cannot "+t);var u=(r,e,t)=>(I(r,e,"read from private field"),t?t.call(r):e.get(r)),g=(r,e,t)=>e.has(r)?F("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(r):e.set(r,t),p=(r,e,t,s)=>(I(r,e,"write to private field"),s?s.call(r,t):e.set(r,t),t),l=(r,e,t)=>(I(r,e,"access private method"),t);var N=(r,e,t,s)=>({set _(n){p(r,e,n,t)},get _(){return u(r,e,s)}});var ce={};_(ce,{ReaderTokenizer:()=>v,argumentOptional:()=>X,argumentRequired:()=>Q,argumentVariadics:()=>Y,command:()=>Z,commandWithSubcommands:()=>ee,optionFlag:()=>re,optionRepeatable:()=>te,optionSingleValue:()=>se,processor:()=>ne,runWithArgv:()=>oe,typeBigInt:()=>pe,typeBoolean:()=>ae,typeCommaArray:()=>ge,typeDate:()=>ue,typeNumber:()=>le,typeString:()=>ie});module.exports=J(ce);function Q(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 X(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 Y(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 s=e.consumePositional();if(s===void 0||s===r.endDelimiter)break;t.push(r.type.decoder(s))}return t}}}function Z(r,e){return{getDescription(){return r},prepareRunner(t){function s(){let n=e.computeUsage();return{breadcrumbs:n.arguments.map(o=>o.label),description:r,options:n.options,arguments:n.arguments,subcommands:[]}}try{let n=e.prepareResolver(t),o=t.consumePositional();if(o!==void 0)throw Error(`Unprocessed positional: ${o}`);let i=n();return{computeUsage:s,async execute(c){return await i.execute(c)}}}catch(n){return{computeUsage:s,async execute(o){throw n}}}}}}function ee(r,e,t){return{getDescription(){return r},prepareRunner(s){try{let n=e.prepareResolver(s),o=s.consumePositional();if(o===void 0)throw new Error("Expected a subcommand");let i=t[o];if(i===void 0)throw new Error(`Unknown subcommand: ${o}`);let c=i.prepareRunner(s),W=n();return{computeUsage(){let $=e.computeUsage(),y=c.computeUsage();return{breadcrumbs:$.arguments.map(L=>L.label).concat([o]).concat(y.breadcrumbs),description:y.description,options:$.options.concat(y.options),arguments:$.arguments.concat(y.arguments),subcommands:y.subcommands}},async execute($){let y=await W.execute($);return await c.execute(y)}}}catch(n){return{computeUsage(){let o=e.computeUsage();return{breadcrumbs:o.arguments.map(i=>i.label).concat(["<SUBCOMMAND>"]),description:r,options:o.options,arguments:o.arguments,subcommands:Object.entries(t).map(([i,c])=>({name:i,description:c.getDescription()}))}},async execute(o){throw n}}}}}}function re(r){return{generateUsage(){return{description:r.description,long:r.long,short:r.short,label:void 0}},prepareConsumer(e){let t=r.long,s=[r.long];r.aliases?.longs&&s.push(...r.aliases?.longs);let n=r.short?[r.short]:[];return r.aliases?.shorts&&n.push(...r.aliases?.shorts),e.registerFlag({key:t,longs:s,shorts:n}),()=>{let o=e.consumeFlag(t);return o===void 0?r.default?r.default():!1:o}}}}function te(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,s=r.long?[r.long]:[];r.aliases?.longs&&s.push(...r.aliases?.longs);let n=r.short?[r.short]:[];return r.aliases?.shorts&&n.push(...r.aliases?.shorts),e.registerOption({key:t,longs:s,shorts:n}),()=>e.consumeOption(t).map(r.type.decoder)}}}function se(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,s=[r.long];r.aliases?.longs&&s.push(...r.aliases?.longs);let n=r.short?[r.short]:[];return r.aliases?.shorts&&n.push(...r.aliases?.shorts),e.registerOption({key:t,longs:s,shorts:n}),()=>{let o=e.consumeOption(r.long);if(o.length>1)throw new Error(`Multiple values provided for option: ${r.long}`);let i=o[0];return i===void 0?r.default():r.type.decoder(i)}}}}function ne(r,e){return{computeUsage(){let t=new Array;for(let n in r.options){let o=r.options[n];t.push(o.generateUsage())}let s=new Array;for(let n of r.arguments)s.push(n.generateUsage());return{options:t,arguments:s}},prepareResolver(t){let s={};for(let o in r.options){let i=r.options[o];s[o]=i.prepareConsumer(t)}let n=[];for(let o of r.arguments)n.push(o.consumeValue(t));return()=>{let o={};for(let i in s)o[i]=s[i]();return{async execute(i){return await e(i,{options:o,arguments:n})}}}}}}var P,O,d,w,x,b,h,A,R,U,m,a,E,M,z,K,q,f,C,k,V,v=class{constructor(e){g(this,a);g(this,P);g(this,O);g(this,d);g(this,w);g(this,x);g(this,b);g(this,h);g(this,A);g(this,R);g(this,U);g(this,m);p(this,P,e),p(this,O,0),p(this,d,!1),p(this,w,new Map),p(this,x,new Map),p(this,b,new Map),p(this,h,new Map),p(this,A,new Map),p(this,R,new Map),p(this,U,new Map),p(this,m,new Map)}registerFlag(e){l(this,a,k).call(this,e.key),u(this,b).set(e.key,{});for(let t of e.shorts)l(this,a,V).call(this,t),u(this,w).set(t,e.key);for(let t of e.longs)l(this,a,V).call(this,t),u(this,x).set(t,e.key)}registerOption(e){l(this,a,k).call(this,e.key),u(this,U).set(e.key,{});for(let t of e.shorts)l(this,a,V).call(this,t),u(this,A).set(t,e.key);for(let t of e.longs)l(this,a,V).call(this,t),u(this,R).set(t,e.key)}consumeFlag(e){if(u(this,b).get(e)===void 0)throw new Error(`Option flag not registered: ${e}`);let s=u(this,h).get(e);if(s===void 0){u(this,h).set(e,null);return}if(s===null)throw new Error(`Option flag already consumed: ${e}`);return u(this,h).set(e,null),s}consumeOption(e){if(u(this,U).get(e)===void 0)throw new Error(`Option values not registered: ${e}`);let s=u(this,m).get(e);if(s===void 0)return u(this,m).set(e,null),new Array;if(s===null)throw new Error(`Option values already consumed: ${e}`);return u(this,m).set(e,null),s}consumePositional(){for(;;){let e=l(this,a,E).call(this);if(e===null)return;let t=l(this,a,z).call(this,e);if(t!==null)return t}}};P=new WeakMap,O=new WeakMap,d=new WeakMap,w=new WeakMap,x=new WeakMap,b=new WeakMap,h=new WeakMap,A=new WeakMap,R=new WeakMap,U=new WeakMap,m=new WeakMap,a=new WeakSet,E=function(){let e=u(this,P)[u(this,O)];return e===void 0?null:(N(this,O)._++,!u(this,d)&&e==="--"?(p(this,d,!0),l(this,a,E).call(this)):e)},M=function(e){let t=l(this,a,E).call(this);if(t===null)throw new Error(`Option ${e} requires a value`);if(u(this,d))throw new Error(`Option ${e} requires a value before --`);if(t.startsWith("-"))throw new Error(`Option ${e} requires a value, got: ${t}`);return t},z=function(e){if(u(this,d))return e;if(e.startsWith("--")){let t=e.indexOf("=");return t===-1?l(this,a,K).call(this,e.slice(2),null):l(this,a,K).call(this,e.slice(2,t),e.slice(t+1)),null}if(e.startsWith("-")){let t=1,s=2;for(;s<=e.length;){let n=e.slice(t,s),o=e.slice(s),i=l(this,a,q).call(this,n,o);if(i===!0)return null;i===!1&&(t=s),s++}throw new Error(`Unknown short flags or options: ${e.slice(t)}`)}return e},K=function(e,t){let s=u(this,x).get(e);if(s!==void 0){if(t!==null){if(t==="true")return l(this,a,f).call(this,s,!0);if(t==="false")return l(this,a,f).call(this,s,!1);throw new Error(`Invalid parameter for long flag: ${s}, value: ${t}`)}return l(this,a,f).call(this,s,!0)}let n=u(this,R).get(e);if(n!==void 0)return t!==null?l(this,a,C).call(this,n,t):l(this,a,C).call(this,n,l(this,a,M).call(this,e));throw new Error(`Unknown long flag or option: ${e}`)},q=function(e,t){let s=u(this,w).get(e);if(s!==void 0){if(t.startsWith("=")){if(t==="=true")return l(this,a,f).call(this,s,!0),!0;if(t==="=false")return l(this,a,f).call(this,s,!1),!0;throw new Error(`Invalid parameter for short flag: ${e}, value: ${t}`)}return l(this,a,f).call(this,s,!0),t===""}let n=u(this,A).get(e);return n!==void 0?t===""?(l(this,a,C).call(this,n,l(this,a,M).call(this,e)),!0):(t.startsWith("=")?l(this,a,C).call(this,n,t.slice(1)):l(this,a,C).call(this,n,t),!0):null},f=function(e,t){if(u(this,h).has(e))throw new Error(`Flag already set: ${e}`);u(this,h).set(e,t)},C=function(e,t){let s=u(this,m).get(e)??new Array;s.push(t),u(this,m).set(e,s)},k=function(e){if(u(this,b).has(e))throw new Error(`Option already registered: ${e}`);if(u(this,U).has(e))throw new Error(`Option already registered: ${e}`)},V=function(e){if(u(this,w).has(e))throw new Error(`Option already registered: ${e}`);if(u(this,x).has(e))throw new Error(`Option already registered: ${e}`);if(u(this,A).has(e))throw new Error(`Option already registered: ${e}`);if(u(this,R).has(e))throw new Error(`Option already registered: ${e}`)};function D(r,e){let t=new Array;if(e.description&&(t.push(""),t.push(e.description)),t.push(""),t.push(`Usage: ${r} ${e.breadcrumbs.join(" ")}`),e.arguments.length>0){t.push(""),t.push("Arguments:"),t.push("");let s=new Array;for(let n of e.arguments){let o=new Array;o.push(""),o.push(n.label),o.push(""),n.description&&o.push(n.description),s.push(o)}B(t,s)}if(e.options.length>0){t.push(""),t.push("Options:"),t.push("");let s=new Array;for(let n of e.options){let o=new Array;o.push(""),n.short?o.push(`-${n.short},`):o.push(""),n.label?o.push(`--${n.long} ${n.label}`):o.push(`--${n.long}`),o.push(""),n.description&&o.push(n.description),s.push(o)}B(t,s)}if(e.subcommands.length>0){t.push(""),t.push("Subcommands:"),t.push("");let s=new Array;for(let n of e.subcommands){let o=new Array;o.push(""),o.push(n.name),o.push(""),n.description&&o.push(n.description),s.push(o)}B(t,s)}return t.push(""),t.join(`
2
- `)}function B(r,e){let t=new Array;for(let s of e)for(let n=0;n<s.length;n++){let o=s[n];(t[n]===void 0||o.length>t[n])&&(t[n]=o.length)}for(let s of e){let n=new Array;for(let o=0;o<s.length;o++){let i=s[o];if(o<s.length-1){let c=" ".repeat(t[o]-i.length);n.push(i+c)}else n.push(i)}r.push(n.join(" "))}}async function oe(r,e,t,s){let n=s?.name??r[1],o=new v(r.slice(2));o.registerFlag({key:"help",shorts:[],longs:["help"]}),s?.version&&o.registerFlag({key:"version",shorts:[],longs:["version"]});try{let i=t.prepareRunner(o);s?.version&&o.consumeFlag("version")&&(console.log(n,s.version),process.exit(0)),o.consumeFlag("help")&&(console.log(D(n,i.computeUsage())),process.exit(0));try{return await i.execute(e)}catch(c){(s?.helpOnError??!0)&&console.log(D(n,i.computeUsage())),console.error(c),process.exit(1)}}catch(i){console.error(i),process.exit(1)}}var ae={label:"BOOLEAN",decoder(r){if(r==="true")return!0;if(r==="false")return!1;throw new Error(`Invalid boolean value: ${r}`)}},ue={label:"DATE",decoder(r){let e=Date.parse(r);if(isNaN(e))throw new Error(`Invalid date value: ${r}`);return new Date(e)}},ie={label:"STRING",decoder(r){return r}},le={label:"NUMBER",decoder(r){return Number(r)}},pe={label:"BIGINT",decoder(r){return BigInt(r)}};function ge(r){return{label:`${r.label}[${r.label},...]`,decoder(e){return e.split(",").map(r.decoder)}}}0&&(module.exports={ReaderTokenizer,argumentOptional,argumentRequired,argumentVariadics,command,commandWithSubcommands,optionFlag,optionRepeatable,optionSingleValue,processor,runWithArgv,typeBigInt,typeBoolean,typeCommaArray,typeDate,typeNumber,typeString});
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:s,commandUsage:a.computeUsage(),typoSupport:B()}).join(`
3
+ `)),console.error(p),process.exit(1)}}catch(a){console.error(a),process.exit(1)}}var xe={label:"BOOLEAN",decoder(r){if(r==="true")return!0;if(r==="false")return!1;throw new Error(`Invalid boolean value: ${r}`)}},Re={label:"DATE",decoder(r){let e=Date.parse(r);if(isNaN(e))throw new Error(`Invalid date value: ${r}`);return new Date(e)}},Ce={label:"STRING",decoder(r){return r}},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,gridToPrintableLines,optionFlag,optionRepeatable,optionSingleValue,process,runWithArgv,typeBigInt,typeBoolean,typeCommaArray,typeDate,typeNumber,typeString,typoInferSupport,typoPrintableString,usageToPrintableLines});
3
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/Option.ts","../src/lib/Processor.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/Option\";\nexport * from \"./lib/Processor\";\nexport * from \"./lib/Reader\";\nexport * from \"./lib/Run\";\nexport * from \"./lib/Type\";\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 { Processor } from \"./Processor\";\nimport { ReaderTokenizer } from \"./Reader\";\n\nexport type Command<Context, Result> = {\n getDescription(): 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<string>;\n description: string | undefined;\n options: Array<OptionUsage>;\n arguments: Array<ArgumentUsage>;\n subcommands: Array<{\n name: string;\n description: string | undefined;\n }>;\n};\n\nexport function command<Context, Result>(\n description: string,\n processor: Processor<Context, Result>,\n): Command<Context, Result> {\n return {\n getDescription() {\n return description;\n },\n prepareRunner(readerTokenizer: ReaderTokenizer) {\n function computeUsage(): CommandUsage {\n const processorUsage = processor.computeUsage();\n return {\n breadcrumbs: processorUsage.arguments.map(\n (argument) => argument.label,\n ),\n description,\n options: processorUsage.options,\n arguments: processorUsage.arguments,\n subcommands: [],\n };\n }\n try {\n const processorResolver = processor.prepareResolver(readerTokenizer);\n const lastPositional = readerTokenizer.consumePositional();\n if (lastPositional !== undefined) {\n throw Error(`Unprocessed positional: ${lastPositional}`);\n }\n const processorRunner = processorResolver();\n return {\n computeUsage,\n async execute(context: Context) {\n return await processorRunner.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 description: string,\n processor: Processor<Context, Payload>,\n subcommands: { [subcommand: Lowercase<string>]: Command<Payload, Result> },\n): Command<Context, Result> {\n return {\n getDescription() {\n return description;\n },\n prepareRunner(readerTokenizer: ReaderTokenizer) {\n try {\n const processorResolver = processor.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 processorRunner = processorResolver();\n return {\n computeUsage() {\n const processorUsage = processor.computeUsage();\n const subcommandUsage = subcommandRunner.computeUsage();\n return {\n breadcrumbs: processorUsage.arguments\n .map((argument) => argument.label)\n .concat([subcommandName])\n .concat(subcommandUsage.breadcrumbs),\n description: subcommandUsage.description,\n options: processorUsage.options.concat(subcommandUsage.options),\n arguments: processorUsage.arguments.concat(\n subcommandUsage.arguments,\n ),\n subcommands: subcommandUsage.subcommands,\n };\n },\n async execute(context: Context) {\n const payload = await processorRunner.execute(context);\n return await subcommandRunner.execute(payload);\n },\n };\n } catch (error) {\n return {\n computeUsage() {\n const processorUsage = processor.computeUsage();\n return {\n breadcrumbs: processorUsage.arguments\n .map((argument) => argument.label)\n .concat([\"<SUBCOMMAND>\"]),\n description,\n options: processorUsage.options,\n arguments: processorUsage.arguments,\n subcommands: Object.entries(subcommands).map(\n ([name, subcommand]) => ({\n name,\n description: subcommand.getDescription(),\n }),\n ),\n };\n },\n async execute(_context: Context) {\n throw error;\n },\n };\n }\n },\n };\n}\n","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 - 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 Processor<Context, Result> = {\n computeUsage(): ProcessorUsage;\n prepareResolver(\n readerTokenizer: ReaderTokenizer,\n ): ProcessorResolver<Context, Result>;\n};\n\nexport type ProcessorResolver<Context, Result> = () => ProcessorRunner<\n Context,\n Result\n>;\n\nexport type ProcessorRunner<Context, Result> = {\n execute(context: Context): Promise<Result>;\n};\n\nexport type ProcessorUsage = {\n options: Array<OptionUsage>;\n arguments: Array<ArgumentUsage>;\n};\n\nexport function processor<\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): Processor<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 if (direct === \"true\") {\n return this.#acknowledgeFlag(flagKey, true);\n }\n if (direct === \"false\") {\n return this.#acknowledgeFlag(flagKey, false);\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 if (rest === \"=true\") {\n this.#acknowledgeFlag(flagKey, true);\n return true;\n }\n if (rest === \"=false\") {\n this.#acknowledgeFlag(flagKey, false);\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","import { CommandUsage } from \"./Command\";\n\nexport function usageFormatter(\n cliName: string,\n commandUsage: CommandUsage,\n): string {\n const lines = new Array<string>();\n if (commandUsage.description) {\n lines.push(\"\");\n lines.push(commandUsage.description);\n }\n lines.push(\"\");\n lines.push(`Usage: ${cliName} ${commandUsage.breadcrumbs.join(\" \")}`);\n if (commandUsage.arguments.length > 0) {\n lines.push(\"\");\n lines.push(\"Arguments:\");\n lines.push(\"\");\n const rows = new Array<Array<string>>();\n for (const argumentUsage of commandUsage.arguments) {\n const columns = new Array<string>();\n columns.push(\"\");\n columns.push(argumentUsage.label);\n columns.push(\"\");\n if (argumentUsage.description) {\n columns.push(argumentUsage.description);\n }\n rows.push(columns);\n }\n pushGrid(lines, rows);\n }\n if (commandUsage.options.length > 0) {\n lines.push(\"\");\n lines.push(\"Options:\");\n lines.push(\"\");\n const rows = new Array<Array<string>>();\n for (const optionUsage of commandUsage.options) {\n const columns = new Array<string>();\n columns.push(\"\");\n if (optionUsage.short) {\n columns.push(`-${optionUsage.short},`);\n } else {\n columns.push(\"\");\n }\n if (optionUsage.label) {\n columns.push(`--${optionUsage.long} ${optionUsage.label}`);\n } else {\n columns.push(`--${optionUsage.long}`);\n }\n columns.push(\"\");\n if (optionUsage.description) {\n columns.push(optionUsage.description);\n }\n rows.push(columns);\n }\n pushGrid(lines, rows);\n }\n if (commandUsage.subcommands.length > 0) {\n lines.push(\"\");\n lines.push(\"Subcommands:\");\n lines.push(\"\");\n const rows = new Array<Array<string>>();\n for (const subcommand of commandUsage.subcommands) {\n const columns = new Array<string>();\n columns.push(\"\");\n columns.push(subcommand.name);\n columns.push(\"\");\n if (subcommand.description) {\n columns.push(subcommand.description);\n }\n rows.push(columns);\n }\n pushGrid(lines, rows);\n }\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nfunction pushGrid(lines: Array<string>, rows: Array<Array<string>>) {\n const widths = new Array<number>();\n for (const row of rows) {\n for (let columnIndex = 0; columnIndex < row.length; columnIndex++) {\n const cell = row[columnIndex]!;\n if (\n widths[columnIndex] === undefined ||\n cell.length > widths[columnIndex]!\n ) {\n widths[columnIndex] = cell.length;\n }\n }\n }\n for (const row of rows) {\n const cells = new Array<string>();\n for (let columnIndex = 0; columnIndex < row.length; columnIndex++) {\n const cell = row[columnIndex]!;\n if (columnIndex < row.length - 1) {\n const padding = \" \".repeat(widths[columnIndex]! - cell.length);\n cells.push(cell + padding);\n } else {\n cells.push(cell);\n }\n }\n lines.push(cells.join(\" \"));\n }\n}\n","import { Command } from \"./Command\";\nimport { ReaderTokenizer } from \"./Reader\";\nimport { usageFormatter } from \"./Usage\";\n\nexport async function runWithArgv<Context, Result>(\n argv: string[],\n context: Context,\n command: Command<Context, Result>,\n cliInfo?: { name?: string; version?: string; helpOnError?: boolean },\n): Promise<Result> {\n const cliName = cliInfo?.name ?? argv[1]!;\n const readerTokenizer = new ReaderTokenizer(argv.slice(2));\n readerTokenizer.registerFlag({\n key: \"help\",\n shorts: [],\n longs: [\"help\"],\n });\n if (cliInfo?.version) {\n readerTokenizer.registerFlag({\n key: \"version\",\n shorts: [],\n longs: [\"version\"],\n });\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(usageFormatter(cliName, commandRunner.computeUsage()));\n process.exit(0);\n }\n try {\n return await commandRunner.execute(context);\n } catch (error) {\n if (cliInfo?.helpOnError ?? true) {\n console.log(usageFormatter(cliName, commandRunner.computeUsage()));\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","optionFlag","optionRepeatable","optionSingleValue","processor","runWithArgv","typeBigInt","typeBoolean","typeCommaArray","typeDate","typeNumber","typeString","__toCommonJS","argumentRequired","definition","readerPositionals","positional","argumentOptional","argumentVariadics","values","command","description","processor","readerTokenizer","computeUsage","processorUsage","argument","processorResolver","lastPositional","processorRunner","context","error","_context","commandWithSubcommands","subcommands","subcommandName","subcommandInput","subcommandRunner","subcommandUsage","payload","name","subcommand","optionFlag","definition","readerTokenizer","key","longs","shorts","value","optionRepeatable","optionSingleValue","values","firstValue","processor","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","optionKey","value","values","nameShortOrLong","usageFormatter","cliName","commandUsage","lines","rows","argumentUsage","columns","pushGrid","optionUsage","subcommand","widths","row","columnIndex","cell","cells","padding","runWithArgv","argv","context","command","cliInfo","cliName","readerTokenizer","ReaderTokenizer","commandRunner","usageFormatter","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/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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cli-kiss",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "devDependencies": {
package/src/index.ts CHANGED
@@ -1,7 +1,10 @@
1
1
  export * from "./lib/Argument";
2
2
  export * from "./lib/Command";
3
+ export * from "./lib/Grid";
3
4
  export * from "./lib/Option";
4
- export * from "./lib/Processor";
5
+ export * from "./lib/Process";
5
6
  export * from "./lib/Reader";
6
7
  export * from "./lib/Run";
7
8
  export * from "./lib/Type";
9
+ export * from "./lib/Typo";
10
+ export * from "./lib/Usage";