cli-kiss 0.0.9 → 0.0.10

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.js CHANGED
@@ -1,3 +1,3 @@
1
- "use strict";var K=Object.defineProperty;var oe=Object.getOwnPropertyDescriptor;var se=Object.getOwnPropertyNames;var ae=Object.prototype.hasOwnProperty;var Y=r=>{throw TypeError(r)};var ue=(r,e)=>{for(var t in e)K(r,t,{get:e[t],enumerable:!0})},ie=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of se(e))!ae.call(r,o)&&o!==t&&K(r,o,{get:()=>e[o],enumerable:!(n=oe(e,o))||n.enumerable});return r};var le=r=>ie(K({},"__esModule",{value:!0}),r);var D=(r,e,t)=>e.has(r)||Y("Cannot "+t);var i=(r,e,t)=>(D(r,e,"read from private field"),t?t.call(r):e.get(r)),m=(r,e,t)=>e.has(r)?Y("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(r):e.set(r,t),d=(r,e,t,n)=>(D(r,e,"write to private field"),n?n.call(r,t):e.set(r,t),t),g=(r,e,t)=>(D(r,e,"access private method"),t);var J=(r,e,t,n)=>({set _(o){d(r,e,o,t)},get _(){return i(r,e,n)}});var Te={};ue(Te,{ReaderTokenizer:()=>P,argumentOptional:()=>be,argumentRequired:()=>ye,argumentVariadics:()=>xe,command:()=>we,commandWithSubcommands:()=>Ce,execution:()=>Ue,gridToPrintableLines:()=>I,optionFlag:()=>Ee,optionRepeatable:()=>ve,optionSingleValue:()=>Oe,runAndExit:()=>Ve,typeBigInt:()=>me,typeBoolean:()=>pe,typeCommaList:()=>fe,typeCommaTuple:()=>he,typeDate:()=>ge,typeDecode:()=>f,typeNumber:()=>de,typeString:()=>ce,typoInferProcessSupport:()=>F,typoPrintableString:()=>c,usageToPrintableLines:()=>H});module.exports=le(Te);var pe={label:"BOOLEAN",decoder(r){if(r==="true")return!0;if(r==="false")return!1;throw new Error(`Invalid boolean: ${r}`)}},ge={label:"DATE",decoder(r){let e=Date.parse(r);if(isNaN(e))throw new Error(`Invalid date: ${r}`);return new Date(e)}},ce={label:"STRING",decoder(r){return r}},de={label:"NUMBER",decoder(r){return Number(r)}},me={label:"BIGINT",decoder(r){return BigInt(r)}};function he(r){return{label:r.map(e=>e.label).join(","),decoder(e){let t=e.split(",",r.length);if(t.length!==r.length)throw new Error(`Invalid tuple value: ${e}, expected ${r.length} comma-separated parts`);return t.map((n,o)=>f(r[o],n,`[${o}].${r[o].label}`))}}}function fe(r){return{label:`${r.label}[,${r.label}...]`,decoder(e){return e.split(",").map((t,n)=>f(r,t,`[${n}].${r.label}`))}}}function f(r,e,t){try{return r.decoder(e)}catch(n){throw new Error(`Invalid value for ${t}: "${e}": ${n instanceof Error?n.message:String(n)}`)}}function ye(r){let e=r.label??r.type.label;return{generateUsage(){return{description:r.description,label:`<${e}>`}},consumeValue(t){let n=t.consumePositional();if(n===void 0)throw new Error(`Missing required argument: ${e}`);return f(r.type,n,e)}}}function be(r){let e=r.label??r.type.label;return{generateUsage(){return{description:r.description,label:`[${e}]`}},consumeValue(t){let n=t.consumePositional();return n===void 0?r.default():f(r.type,n,e)}}}function xe(r){let e=r.label??r.type.label;return{generateUsage(){return{description:r.description,label:`[${e}...]`+(r.endDelimiter?` (end with ${r.endDelimiter})`:"")}},consumeValue(t){let n=[];for(;;){let o=t.consumePositional();if(o===void 0||o===r.endDelimiter)break;n.push(f(r.type,o,e))}return n}}}function we(r,e){return{getDescription(){return r.description},buildInterpreter(t){function n(){let o=e.computeUsage();return{breadcrumbs:o.arguments.map(s=>G(s.label)),description:r.description,details:r.details,options:o.options,arguments:o.arguments,subcommands:[]}}try{let o=e.createResolver(t),s=t.consumePositional();if(s!==void 0)throw Error(`Unexpected argument: "${s}"`);let a=o();return{computeUsage:n,async execute(u){return await a(u)}}}catch(o){return{computeUsage:n,async execute(s){throw o}}}}}}function Ce(r,e,t){return{getDescription(){return r.description},buildInterpreter(n){try{let o=e.createResolver(n),s=n.consumePositional();if(s===void 0)throw new Error("Missing required SUBCOMMAND argument");let a=t[s];if(a===void 0)throw new Error(`Unknown subcommand name: "${s}"`);let u=a.buildInterpreter(n),p=o();return{computeUsage(){let x=e.computeUsage(),h=u.computeUsage();return{breadcrumbs:x.arguments.map(L=>G(L.label)).concat([Q(s)]).concat(h.breadcrumbs),description:h.description,details:h.details,options:x.options.concat(h.options),arguments:x.arguments.concat(h.arguments),subcommands:h.subcommands}},async execute(x){let h=await p(x);return await u.execute(h)}}}catch(o){return{computeUsage(){let s=e.computeUsage();return{breadcrumbs:s.arguments.map(a=>G(a.label)).concat([Q("<SUBCOMMAND>")]),description:r.description,details:r.details,options:s.options,arguments:s.arguments,subcommands:Object.entries(t).map(([a,u])=>({name:a,description:u.getDescription()}))}},async execute(s){throw o}}}}}}function G(r){return{argument:r}}function Q(r){return{command:r}}function Ue(r,e){return{computeUsage(){let t=new Array;for(let o in r.options){let s=r.options[o];t.push(s.generateUsage())}let n=new Array;for(let o of r.arguments)n.push(o.generateUsage());return{options:t,arguments:n}},createResolver(t){let n={};for(let s in r.options){let a=r.options[s];n[s]=a.prepareConsumer(t)}let o=[];for(let s of r.arguments)o.push(s.consumeValue(t));return()=>{let s={};for(let a in n)s[a]=n[a]();return async a=>await e(a,{options:s,arguments:o})}}}}function c(r,e){if(r==="none")return e.value;if(r==="tty"){let t=e.color?Re[e.color]:"",n=e.bold?Ae:"";return`${t}${n}${e.value}${$e}`}if(r==="html"){let t=e.color?`<span style="color: ${e.color}">`:"",n=e.color?"</span>":"",o=e.bold?"<b>":"",s=e.bold?"</b>":"";return`${t}${o}${e.value}${s}${n}`}if(r==="mock")return e.color&&e.bold?`{${e.value}}@${e.color}+`:e.color?`{${e.value}}@${e.color}`:e.bold?`{${e.value}}+`:`{${e.value}}`;throw new Error(`Unknown typo support: ${r}`)}function F(){if(!process)return"none";if(process.env){if(process.env.FORCE_COLOR==="0")return"none";if(process.env.FORCE_COLOR)return"tty";if("NO_COLOR"in process.env)return"none"}return!process.stdout||!process.stdout.isTTY?"none":"tty"}var $e="\x1B[0m",Ae="\x1B[1m",Re={darkBlack:"\x1B[30m",darkRed:"\x1B[31m",darkGreen:"\x1B[32m",darkYellow:"\x1B[33m",darkBlue:"\x1B[34m",darkMagenta:"\x1B[35m",darkCyan:"\x1B[36m",darkWhite:"\x1B[37m",brightBlack:"\x1B[90m",brightRed:"\x1B[91m",brightGreen:"\x1B[92m",brightYellow:"\x1B[93m",brightBlue:"\x1B[94m",brightMagenta:"\x1B[95m",brightCyan:"\x1B[96m",brightWhite:"\x1B[97m"};function I(r,e,t=""){let n=new Array,o=new Array;for(let s of r)for(let a=0;a<s.length;a++){let u=s[a],p=X(u);(o[a]===void 0||p>o[a])&&(o[a]=p)}for(let s of r){let a=new Array;for(let u=0;u<s.length;u++){let p=s[u],x=p.map(h=>c(e,h));if(u<s.length-1){let h=X(p),L=" ".repeat(o[u]-h);a.push(x.join("")+L)}else a.push(x.join(""))}n.push(a.join(t))}return n}function X(r){let e=0;for(let t of r)e+=t.value.length;return e}function Ee(r){return{generateUsage(){return{description:r.description,long:r.long,short:r.short,label:void 0}},prepareConsumer(e){let t=r.short?`-${r.short}, --${r.long}`:`--${r.long}`,n=[r.long];r.aliases?.longs&&n.push(...r.aliases?.longs);let o=r.short?[r.short]:[];return r.aliases?.shorts&&o.push(...r.aliases?.shorts),e.registerFlag({key:t,longs:n,shorts:o}),()=>{let s=e.consumeFlag(t);return s===void 0?r.default?r.default():!1:s}}}}function ve(r){let e=r.label??r.type.label;return{generateUsage(){return{description:r.description,long:r.long,short:r.short,label:`<${e}>`}},prepareConsumer(t){let n=r.short?`-${r.short}, --${r.long}`:`--${r.long}`,o=r.long?[r.long]:[];r.aliases?.longs&&o.push(...r.aliases?.longs);let s=r.short?[r.short]:[];return r.aliases?.shorts&&s.push(...r.aliases?.shorts),t.registerOption({key:n,longs:o,shorts:s}),()=>t.consumeOption(n).map(a=>f(r.type,a,`${n}: ${e}`))}}}function Oe(r){let e=r.label??r.type.label;return{generateUsage(){return{description:r.description,long:r.long,short:r.short,label:`<${e}>`}},prepareConsumer(t){let n=r.short?`-${r.short}, --${r.long}`:`--${r.long}`,o=[r.long];r.aliases?.longs&&o.push(...r.aliases?.longs);let s=r.short?[r.short]:[];return r.aliases?.shorts&&s.push(...r.aliases?.shorts),t.registerOption({key:n,longs:o,shorts:s}),()=>{let a=t.consumeOption(n);if(a.length>1)throw new Error(`Multiple values provided for option: ${n}, expected only one`);let u=a[0];return u===void 0?r.default():f(r.type,u,`${n}: ${e}`)}}}}var M,O,w,C,U,$,y,A,R,E,b,l,B,N,ee,j,re,k,v,z,S,P=class{constructor(e){m(this,l);m(this,M);m(this,O);m(this,w);m(this,C);m(this,U);m(this,$);m(this,y);m(this,A);m(this,R);m(this,E);m(this,b);d(this,M,e),d(this,O,0),d(this,w,!1),d(this,C,new Map),d(this,U,new Map),d(this,$,new Map),d(this,y,new Map),d(this,A,new Map),d(this,R,new Map),d(this,E,new Map),d(this,b,new Map)}registerFlag(e){g(this,l,z).call(this,e.key),i(this,$).set(e.key,{});for(let t of e.shorts)g(this,l,S).call(this,t),i(this,C).set(t,e.key);for(let t of e.longs)g(this,l,S).call(this,t),i(this,U).set(t,e.key)}registerOption(e){g(this,l,z).call(this,e.key),i(this,E).set(e.key,{});for(let t of e.shorts)g(this,l,S).call(this,t),i(this,A).set(t,e.key);for(let t of e.longs)g(this,l,S).call(this,t),i(this,R).set(t,e.key)}consumeFlag(e){if(i(this,$).get(e)===void 0)throw new Error(`Flag not registered: ${e}`);let n=i(this,y).get(e);if(n===void 0){i(this,y).set(e,null);return}if(n===null)throw new Error(`Flag already consumed: ${e}`);return i(this,y).set(e,null),n}consumeOption(e){if(i(this,E).get(e)===void 0)throw new Error(`Option not registered: ${e}`);let n=i(this,b).get(e);if(n===void 0)return i(this,b).set(e,null),new Array;if(n===null)throw new Error(`Option already consumed: ${e}`);return i(this,b).set(e,null),n}consumePositional(){for(;;){let e=g(this,l,B).call(this);if(e===null)return;let t=g(this,l,ee).call(this,e);if(t!==null)return t}}};M=new WeakMap,O=new WeakMap,w=new WeakMap,C=new WeakMap,U=new WeakMap,$=new WeakMap,y=new WeakMap,A=new WeakMap,R=new WeakMap,E=new WeakMap,b=new WeakMap,l=new WeakSet,B=function(){let e=i(this,M)[i(this,O)];return e===void 0?null:(J(this,O)._++,!i(this,w)&&e==="--"?(d(this,w,!0),g(this,l,B).call(this)):e)},N=function(e){let t=g(this,l,B).call(this);if(t===null)throw new Error(`Option ${e} requires a value but none was provided`);if(i(this,w))throw new Error(`Option ${e} requires a value before --`);if(t.startsWith("-"))throw new Error(`Option ${e} requires a value, got: ${t}`);return t},ee=function(e){if(i(this,w))return e;if(e.startsWith("--")){let t=e.indexOf("=");return t===-1?g(this,l,j).call(this,e.slice(2),null):g(this,l,j).call(this,e.slice(2,t),e.slice(t+1)),null}if(e.startsWith("-")){let t=1,n=2;for(;n<=e.length;){let o=e.slice(t,n),s=e.slice(n),a=g(this,l,re).call(this,o,s);if(a===!0)return null;a===!1&&(t=n),n++}throw new Error(`Unknown flags or option: -${e.slice(t)}`)}return e},j=function(e,t){let n=i(this,U).get(e);if(n!==void 0){if(t!==null){let s=Z(t);if(s!==void 0)return g(this,l,k).call(this,n,s);throw new Error(`Invalid value for flag: --${e}: ${t}`)}return g(this,l,k).call(this,n,!0)}let o=i(this,R).get(e);if(o!==void 0)return t!==null?g(this,l,v).call(this,o,t):g(this,l,v).call(this,o,g(this,l,N).call(this,e));throw new Error(`Unknown long flag or option: --${e}`)},re=function(e,t){let n=i(this,C).get(e);if(n!==void 0){if(t.startsWith("=")){let s=Z(t.slice(1));if(s!==void 0)return g(this,l,k).call(this,n,s),!0;throw new Error(`Invalid value for flag: -${e}: ${t}`)}return g(this,l,k).call(this,n,!0),t===""}let o=i(this,A).get(e);return o!==void 0?t===""?(g(this,l,v).call(this,o,g(this,l,N).call(this,e)),!0):(t.startsWith("=")?g(this,l,v).call(this,o,t.slice(1)):g(this,l,v).call(this,o,t),!0):null},k=function(e,t){if(i(this,y).has(e))throw new Error(`Flag already set: ${e}`);i(this,y).set(e,t)},v=function(e,t){let n=i(this,b).get(e)??new Array;n.push(t),i(this,b).set(e,n)},z=function(e){if(i(this,$).has(e))throw new Error(`Flag already registered: ${e}`);if(i(this,E).has(e))throw new Error(`Option already registered: ${e}`)},S=function(e){if(i(this,C).has(e))throw new Error(`Flag already registered: -${e}`);if(i(this,U).has(e))throw new Error(`Flag already registered: --${e}`);if(i(this,A).has(e))throw new Error(`Option already registered: -${e}`);if(i(this,R).has(e))throw new Error(`Option already registered: --${e}`)};function Z(r){let e=r.toLowerCase();if(e==="true"||e==="t"||e==="y"||e==="yes")return!0;if(e==="false"||e==="f"||e==="n"||e==="no")return!1}function H(r){let{cliName:e,commandUsage:t,typoSupport:n}=r,o=new Array;o.push(c(n,{value:t.description,bold:!0})),t.details&&o.push(c(n,{value:t.details,color:"brightBlack"})),o.push("");let s=[c(n,{value:"Usage:",color:"brightMagenta",bold:!0}),c(n,V(e))].concat(t.breadcrumbs.map(a=>{if("argument"in a)return c(n,_(a.argument));if("command"in a)return c(n,V(a.command));throw new Error(`Unknown breadcrumb: ${JSON.stringify(a)}`)}));if(o.push(s.join(" ")),t.arguments.length>0){o.push(""),o.push(c(n,W("Arguments:")));let a=new Array;for(let u of t.arguments){let p=new Array;p.push([T()]),p.push([_(u.label)]),u.description&&(p.push([T()]),p.push([q(u.description)])),a.push(p)}o.push(...I(a,n))}if(t.subcommands.length>0){o.push(""),o.push(c(n,W("Subcommands:")));let a=new Array;for(let u of t.subcommands){let p=new Array;p.push([T()]),p.push([V(u.name)]),u.description&&(p.push([T()]),p.push([q(u.description)])),a.push(p)}o.push(...I(a,n))}if(t.options.length>0){o.push(""),o.push(c(n,W("Options:")));let a=new Array;for(let u of t.options){let p=new Array;p.push([T()]),u.short?p.push([V(`-${u.short}`),{value:", "}]):p.push([]),u.label?p.push([V(`--${u.long} `),_(u.label)]):p.push([V(`--${u.long}`)]),u.description&&(p.push([T()]),p.push([q(u.description)])),a.push(p)}o.push(...I(a,n))}return o.push(""),o}function W(r){return{value:r,color:"brightGreen",bold:!0}}function q(r){return{value:r}}function V(r){return{value:r,color:"brightCyan",bold:!0}}function _(r){return{value:r,color:"brightBlue"}}function T(){return{value:" "}}async function Ve(r,e,t,n,o){let s=new P(e);o?.buildVersion&&s.registerFlag({key:"version",shorts:[],longs:["version"]}),(o?.usageOnHelp??!0)&&s.registerFlag({key:"help",shorts:[],longs:["help"]});let a=n.buildInterpreter(s);if(o?.buildVersion&&s.consumeFlag("version"))return(o?.onLogStdOut??console.log)([r,o.buildVersion].join(" ")),(o?.onExit??process.exit)(0);if((o?.usageOnHelp??!0)&&s.consumeFlag("help"))return(o?.onLogStdOut??console.log)(te(r,a,o?.useColors)),(o?.onExit??process.exit)(0);try{return await a.execute(t),(o?.onExit??process.exit)(0)}catch(u){if((o?.usageOnError??!0)&&(o?.onLogStdErr??console.error)(te(r,a,o?.useColors)),o?.onError)o.onError(u);else{let p=ne(o?.useColors);(o?.onLogStdErr??console.error)([c(p,{value:"Error:",color:"brightRed",bold:!0}),c(p,{value:u instanceof Error?u.message:String(u),bold:!0})].join(" "))}return(o?.onExit??process.exit)(1)}}function te(r,e,t){return H({cliName:r,commandUsage:e.computeUsage(),typoSupport:ne(t)}).join(`
2
- `)}function ne(r){return r===void 0?F():r?"tty":"none"}0&&(module.exports={ReaderTokenizer,argumentOptional,argumentRequired,argumentVariadics,command,commandWithSubcommands,execution,gridToPrintableLines,optionFlag,optionRepeatable,optionSingleValue,runAndExit,typeBigInt,typeBoolean,typeCommaList,typeCommaTuple,typeDate,typeDecode,typeNumber,typeString,typoInferProcessSupport,typoPrintableString,usageToPrintableLines});
1
+ "use strict";var K=Object.defineProperty;var oe=Object.getOwnPropertyDescriptor;var se=Object.getOwnPropertyNames;var ae=Object.prototype.hasOwnProperty;var Y=r=>{throw TypeError(r)};var ue=(r,e)=>{for(var t in e)K(r,t,{get:e[t],enumerable:!0})},ie=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of se(e))!ae.call(r,o)&&o!==t&&K(r,o,{get:()=>e[o],enumerable:!(n=oe(e,o))||n.enumerable});return r};var le=r=>ie(K({},"__esModule",{value:!0}),r);var D=(r,e,t)=>e.has(r)||Y("Cannot "+t);var i=(r,e,t)=>(D(r,e,"read from private field"),t?t.call(r):e.get(r)),m=(r,e,t)=>e.has(r)?Y("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(r):e.set(r,t),d=(r,e,t,n)=>(D(r,e,"write to private field"),n?n.call(r,t):e.set(r,t),t),g=(r,e,t)=>(D(r,e,"access private method"),t);var J=(r,e,t,n)=>({set _(o){d(r,e,o,t)},get _(){return i(r,e,n)}});var Te={};ue(Te,{ReaderTokenizer:()=>P,argumentOptional:()=>ye,argumentRequired:()=>be,argumentVariadics:()=>xe,command:()=>we,commandWithSubcommands:()=>Ce,execution:()=>Ue,gridToPrintableLines:()=>I,optionFlag:()=>Ee,optionRepeatable:()=>ve,optionSingleValue:()=>Oe,runAndExit:()=>Ve,typeBigInt:()=>me,typeBoolean:()=>pe,typeCommaList:()=>fe,typeCommaTuple:()=>he,typeDate:()=>ge,typeDecode:()=>f,typeNumber:()=>de,typeString:()=>ce,typoInferProcessSupport:()=>G,typoPrintableString:()=>c,usageToPrintableLines:()=>H});module.exports=le(Te);var pe={label:"BOOLEAN",decoder(r){if(r==="true")return!0;if(r==="false")return!1;throw new Error(`Invalid boolean: ${r}`)}},ge={label:"DATE",decoder(r){let e=Date.parse(r);if(isNaN(e))throw new Error(`Invalid date: ${r}`);return new Date(e)}},ce={label:"STRING",decoder(r){return r}},de={label:"NUMBER",decoder(r){return Number(r)}},me={label:"BIGINT",decoder(r){return BigInt(r)}};function he(r){return{label:r.map(e=>e.label).join(","),decoder(e){let t=e.split(",",r.length);if(t.length!==r.length)throw new Error(`Invalid tuple value: "${e}", expected ${r.length} comma-separated parts`);return t.map((n,o)=>f(r[o],n,`[${o}].${r[o].label}`))}}}function fe(r){return{label:`${r.label}[,${r.label}...]`,decoder(e){return e.split(",").map((t,n)=>f(r,t,`[${n}].${r.label}`))}}}function f(r,e,t){try{return r.decoder(e)}catch(n){throw new Error(`Failed to decode value "${e}" for ${t}: ${n instanceof Error?n.message:String(n)}`)}}function be(r){let e=r.label??r.type.label;return{generateUsage(){return{description:r.description,label:`<${e}>`}},consumeValue(t){let n=t.consumePositional();if(n===void 0)throw new Error(`Missing required argument: ${e}`);return f(r.type,n,e)}}}function ye(r){let e=r.label??r.type.label;return{generateUsage(){return{description:r.description,label:`[${e}]`}},consumeValue(t){let n=t.consumePositional();return n===void 0?r.default():f(r.type,n,e)}}}function xe(r){let e=r.label??r.type.label;return{generateUsage(){return{description:r.description,label:`[${e}...]`+(r.endDelimiter?` (end with ${r.endDelimiter})`:"")}},consumeValue(t){let n=[];for(;;){let o=t.consumePositional();if(o===void 0||o===r.endDelimiter)break;n.push(f(r.type,o,e))}return n}}}function we(r,e){return{getDescription(){return r.description},buildInterpreter(t){function n(){let o=e.computeUsage();return{breadcrumbs:o.arguments.map(s=>F(s.label)),description:r.description,details:r.details,options:o.options,arguments:o.arguments,subcommands:[]}}try{let o=e.createResolver(t),s=t.consumePositional();if(s!==void 0)throw Error(`Unexpected argument: "${s}"`);let a=o();return{computeUsage:n,async execute(u){return await a(u)}}}catch(o){return{computeUsage:n,async execute(s){throw o}}}}}}function Ce(r,e,t){return{getDescription(){return r.description},buildInterpreter(n){try{let o=e.createResolver(n),s=n.consumePositional();if(s===void 0)throw new Error("Missing required SUBCOMMAND argument");let a=t[s];if(a===void 0)throw new Error(`Unknown subcommand name: "${s}"`);let u=a.buildInterpreter(n),p=o();return{computeUsage(){let x=e.computeUsage(),h=u.computeUsage();return{breadcrumbs:x.arguments.map(L=>F(L.label)).concat([Q(s)]).concat(h.breadcrumbs),description:h.description,details:h.details,options:x.options.concat(h.options),arguments:x.arguments.concat(h.arguments),subcommands:h.subcommands}},async execute(x){let h=await p(x);return await u.execute(h)}}}catch(o){return{computeUsage(){let s=e.computeUsage();return{breadcrumbs:s.arguments.map(a=>F(a.label)).concat([Q("<SUBCOMMAND>")]),description:r.description,details:r.details,options:s.options,arguments:s.arguments,subcommands:Object.entries(t).map(([a,u])=>({name:a,description:u.getDescription()}))}},async execute(s){throw o}}}}}}function F(r){return{argument:r}}function Q(r){return{command:r}}function Ue(r,e){return{computeUsage(){let t=new Array;for(let o in r.options){let s=r.options[o];t.push(s.generateUsage())}let n=new Array;for(let o of r.arguments)n.push(o.generateUsage());return{options:t,arguments:n}},createResolver(t){let n={};for(let s in r.options){let a=r.options[s];n[s]=a.prepareConsumer(t)}let o=[];for(let s of r.arguments)o.push(s.consumeValue(t));return()=>{let s={};for(let a in n)s[a]=n[a]();return async a=>await e(a,{options:s,arguments:o})}}}}function c(r,e){if(r==="none")return e.value;if(r==="tty"){let t=e.color?Re[e.color]:"",n=e.bold?Ae:"";return`${t}${n}${e.value}${$e}`}if(r==="html"){let t=e.color?`<span style="color: ${e.color}">`:"",n=e.color?"</span>":"",o=e.bold?"<b>":"",s=e.bold?"</b>":"";return`${t}${o}${e.value}${s}${n}`}if(r==="mock")return e.color&&e.bold?`{${e.value}}@${e.color}+`:e.color?`{${e.value}}@${e.color}`:e.bold?`{${e.value}}+`:`{${e.value}}`;throw new Error(`Unknown typo support: ${r}`)}function G(){if(!process)return"none";if(process.env){if(process.env.FORCE_COLOR==="0")return"none";if(process.env.FORCE_COLOR)return"tty";if("NO_COLOR"in process.env)return"none"}return!process.stdout||!process.stdout.isTTY?"none":"tty"}var $e="\x1B[0m",Ae="\x1B[1m",Re={darkBlack:"\x1B[30m",darkRed:"\x1B[31m",darkGreen:"\x1B[32m",darkYellow:"\x1B[33m",darkBlue:"\x1B[34m",darkMagenta:"\x1B[35m",darkCyan:"\x1B[36m",darkWhite:"\x1B[37m",brightBlack:"\x1B[90m",brightRed:"\x1B[91m",brightGreen:"\x1B[92m",brightYellow:"\x1B[93m",brightBlue:"\x1B[94m",brightMagenta:"\x1B[95m",brightCyan:"\x1B[96m",brightWhite:"\x1B[97m"};function I(r,e,t=""){let n=new Array,o=new Array;for(let s of r)for(let a=0;a<s.length;a++){let u=s[a],p=X(u);(o[a]===void 0||p>o[a])&&(o[a]=p)}for(let s of r){let a=new Array;for(let u=0;u<s.length;u++){let p=s[u],x=p.map(h=>c(e,h));if(u<s.length-1){let h=X(p),L=" ".repeat(o[u]-h);a.push(x.join("")+L)}else a.push(x.join(""))}n.push(a.join(t))}return n}function X(r){let e=0;for(let t of r)e+=t.value.length;return e}function Ee(r){return{generateUsage(){return{description:r.description,long:r.long,short:r.short,label:void 0}},prepareConsumer(e){let t=r.short?`-${r.short}, --${r.long}`:`--${r.long}`,n=[r.long];r.aliases?.longs&&n.push(...r.aliases?.longs);let o=r.short?[r.short]:[];return r.aliases?.shorts&&o.push(...r.aliases?.shorts),e.registerFlag({key:t,longs:n,shorts:o}),()=>{let s=e.consumeFlag(t);return s===void 0?r.default?r.default():!1:s}}}}function ve(r){let e=r.label??r.type.label;return{generateUsage(){return{description:r.description,long:r.long,short:r.short,label:`<${e}>`}},prepareConsumer(t){let n=r.short?`-${r.short}, --${r.long}`:`--${r.long}`,o=r.long?[r.long]:[];r.aliases?.longs&&o.push(...r.aliases?.longs);let s=r.short?[r.short]:[];return r.aliases?.shorts&&s.push(...r.aliases?.shorts),t.registerOption({key:n,longs:o,shorts:s}),()=>t.consumeOption(n).map(a=>f(r.type,a,`${n}: ${e}`))}}}function Oe(r){let e=r.label??r.type.label;return{generateUsage(){return{description:r.description,long:r.long,short:r.short,label:`<${e}>`}},prepareConsumer(t){let n=r.short?`-${r.short}, --${r.long}`:`--${r.long}`,o=[r.long];r.aliases?.longs&&o.push(...r.aliases?.longs);let s=r.short?[r.short]:[];return r.aliases?.shorts&&s.push(...r.aliases?.shorts),t.registerOption({key:n,longs:o,shorts:s}),()=>{let a=t.consumeOption(n);if(a.length>1)throw new Error(`Multiple values provided for option: ${n}, expected only one`);let u=a[0];return u===void 0?r.default():f(r.type,u,`${n}: ${e}`)}}}}var M,O,w,C,U,$,b,A,R,E,y,l,B,N,ee,j,re,k,v,z,S,P=class{constructor(e){m(this,l);m(this,M);m(this,O);m(this,w);m(this,C);m(this,U);m(this,$);m(this,b);m(this,A);m(this,R);m(this,E);m(this,y);d(this,M,e),d(this,O,0),d(this,w,!1),d(this,C,new Map),d(this,U,new Map),d(this,$,new Map),d(this,b,new Map),d(this,A,new Map),d(this,R,new Map),d(this,E,new Map),d(this,y,new Map)}registerFlag(e){g(this,l,z).call(this,e.key),i(this,$).set(e.key,{});for(let t of e.shorts)g(this,l,S).call(this,t),i(this,C).set(t,e.key);for(let t of e.longs)g(this,l,S).call(this,t),i(this,U).set(t,e.key)}registerOption(e){g(this,l,z).call(this,e.key),i(this,E).set(e.key,{});for(let t of e.shorts)g(this,l,S).call(this,t),i(this,A).set(t,e.key);for(let t of e.longs)g(this,l,S).call(this,t),i(this,R).set(t,e.key)}consumeFlag(e){if(i(this,$).get(e)===void 0)throw new Error(`Flag not registered: ${e}`);let n=i(this,b).get(e);if(n===void 0){i(this,b).set(e,null);return}if(n===null)throw new Error(`Flag already consumed: ${e}`);return i(this,b).set(e,null),n}consumeOption(e){if(i(this,E).get(e)===void 0)throw new Error(`Option not registered: ${e}`);let n=i(this,y).get(e);if(n===void 0)return i(this,y).set(e,null),new Array;if(n===null)throw new Error(`Option already consumed: ${e}`);return i(this,y).set(e,null),n}consumePositional(){for(;;){let e=g(this,l,B).call(this);if(e===null)return;let t=g(this,l,ee).call(this,e);if(t!==null)return t}}};M=new WeakMap,O=new WeakMap,w=new WeakMap,C=new WeakMap,U=new WeakMap,$=new WeakMap,b=new WeakMap,A=new WeakMap,R=new WeakMap,E=new WeakMap,y=new WeakMap,l=new WeakSet,B=function(){let e=i(this,M)[i(this,O)];return e===void 0?null:(J(this,O)._++,!i(this,w)&&e==="--"?(d(this,w,!0),g(this,l,B).call(this)):e)},N=function(e){let t=g(this,l,B).call(this);if(t===null)throw new Error(`Option ${e} requires a value but none was provided`);if(i(this,w))throw new Error(`Option ${e} requires a value before "--"`);if(t.startsWith("-"))throw new Error(`Option ${e} requires a value, got: "${t}"`);return t},ee=function(e){if(i(this,w))return e;if(e.startsWith("--")){let t=e.indexOf("=");return t===-1?g(this,l,j).call(this,e.slice(2),null):g(this,l,j).call(this,e.slice(2,t),e.slice(t+1)),null}if(e.startsWith("-")){let t=1,n=2;for(;n<=e.length;){let o=e.slice(t,n),s=e.slice(n),a=g(this,l,re).call(this,o,s);if(a===!0)return null;a===!1&&(t=n),n++}throw new Error(`Unknown flags or option: -${e.slice(t)}`)}return e},j=function(e,t){let n=i(this,U).get(e);if(n!==void 0){if(t!==null){let s=Z(t);if(s!==void 0)return g(this,l,k).call(this,n,s);throw new Error(`Invalid value for flag: --${e}: "${t}"`)}return g(this,l,k).call(this,n,!0)}let o=i(this,R).get(e);if(o!==void 0)return t!==null?g(this,l,v).call(this,o,t):g(this,l,v).call(this,o,g(this,l,N).call(this,`--${e}`));throw new Error(`Unknown long flag or option: --${e}`)},re=function(e,t){let n=i(this,C).get(e);if(n!==void 0){if(t.startsWith("=")){let s=Z(t.slice(1));if(s!==void 0)return g(this,l,k).call(this,n,s),!0;throw new Error(`Invalid value for flag: -${e}: "${t}"`)}return g(this,l,k).call(this,n,!0),t===""}let o=i(this,A).get(e);return o!==void 0?t===""?(g(this,l,v).call(this,o,g(this,l,N).call(this,`-${e}`)),!0):(t.startsWith("=")?g(this,l,v).call(this,o,t.slice(1)):g(this,l,v).call(this,o,t),!0):null},k=function(e,t){if(i(this,b).has(e))throw new Error(`Flag already set: ${e}`);i(this,b).set(e,t)},v=function(e,t){let n=i(this,y).get(e)??new Array;n.push(t),i(this,y).set(e,n)},z=function(e){if(i(this,$).has(e))throw new Error(`Flag already registered: ${e}`);if(i(this,E).has(e))throw new Error(`Option already registered: ${e}`)},S=function(e){if(i(this,C).has(e))throw new Error(`Flag already registered: -${e}`);if(i(this,U).has(e))throw new Error(`Flag already registered: --${e}`);if(i(this,A).has(e))throw new Error(`Option already registered: -${e}`);if(i(this,R).has(e))throw new Error(`Option already registered: --${e}`)};function Z(r){let e=r.toLowerCase();if(e==="true"||e==="t"||e==="y"||e==="yes")return!0;if(e==="false"||e==="f"||e==="n"||e==="no")return!1}function H(r){let{cliName:e,commandUsage:t,typoSupport:n}=r,o=new Array;o.push(c(n,{value:t.description,bold:!0})),t.details&&o.push(c(n,{value:t.details,color:"brightBlack"})),o.push("");let s=[c(n,{value:"Usage:",color:"brightMagenta",bold:!0}),c(n,V(e))].concat(t.breadcrumbs.map(a=>{if("argument"in a)return c(n,_(a.argument));if("command"in a)return c(n,V(a.command));throw new Error(`Unknown breadcrumb: ${JSON.stringify(a)}`)}));if(o.push(s.join(" ")),t.arguments.length>0){o.push(""),o.push(c(n,W("Arguments:")));let a=new Array;for(let u of t.arguments){let p=new Array;p.push([T()]),p.push([_(u.label)]),u.description&&(p.push([T()]),p.push([q(u.description)])),a.push(p)}o.push(...I(a,n))}if(t.subcommands.length>0){o.push(""),o.push(c(n,W("Subcommands:")));let a=new Array;for(let u of t.subcommands){let p=new Array;p.push([T()]),p.push([V(u.name)]),u.description&&(p.push([T()]),p.push([q(u.description)])),a.push(p)}o.push(...I(a,n))}if(t.options.length>0){o.push(""),o.push(c(n,W("Options:")));let a=new Array;for(let u of t.options){let p=new Array;p.push([T()]),u.short?p.push([V(`-${u.short}`),{value:", "}]):p.push([]),u.label?p.push([V(`--${u.long} `),_(u.label)]):p.push([V(`--${u.long}`)]),u.description&&(p.push([T()]),p.push([q(u.description)])),a.push(p)}o.push(...I(a,n))}return o.push(""),o}function W(r){return{value:r,color:"brightGreen",bold:!0}}function q(r){return{value:r}}function V(r){return{value:r,color:"brightCyan",bold:!0}}function _(r){return{value:r,color:"brightBlue"}}function T(){return{value:" "}}async function Ve(r,e,t,n,o){let s=new P(e);o?.buildVersion&&s.registerFlag({key:"version",shorts:[],longs:["version"]}),(o?.usageOnHelp??!0)&&s.registerFlag({key:"help",shorts:[],longs:["help"]});let a=n.buildInterpreter(s);if(o?.buildVersion&&s.consumeFlag("version"))return(o?.onLogStdOut??console.log)([r,o.buildVersion].join(" ")),(o?.onExit??process.exit)(0);if((o?.usageOnHelp??!0)&&s.consumeFlag("help"))return(o?.onLogStdOut??console.log)(te(r,a,o?.useColors)),(o?.onExit??process.exit)(0);try{return await a.execute(t),(o?.onExit??process.exit)(0)}catch(u){if((o?.usageOnError??!0)&&(o?.onLogStdErr??console.error)(te(r,a,o?.useColors)),o?.onError)o.onError(u);else{let p=ne(o?.useColors);(o?.onLogStdErr??console.error)([c(p,{value:"Error:",color:"brightRed",bold:!0}),c(p,{value:u instanceof Error?u.message:String(u),bold:!0})].join(" "))}return(o?.onExit??process.exit)(1)}}function te(r,e,t){return H({cliName:r,commandUsage:e.computeUsage(),typoSupport:ne(t)}).join(`
2
+ `)}function ne(r){return r===void 0?G():r?"tty":"none"}0&&(module.exports={ReaderTokenizer,argumentOptional,argumentRequired,argumentVariadics,command,commandWithSubcommands,execution,gridToPrintableLines,optionFlag,optionRepeatable,optionSingleValue,runAndExit,typeBigInt,typeBoolean,typeCommaList,typeCommaTuple,typeDate,typeDecode,typeNumber,typeString,typoInferProcessSupport,typoPrintableString,usageToPrintableLines});
3
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/Type.ts","../src/lib/Argument.ts","../src/lib/Command.ts","../src/lib/Execution.ts","../src/lib/Typo.ts","../src/lib/Grid.ts","../src/lib/Option.ts","../src/lib/Reader.ts","../src/lib/Usage.ts","../src/lib/Run.ts"],"sourcesContent":["export * from \"./lib/Argument\";\nexport * from \"./lib/Command\";\nexport * from \"./lib/Execution\";\nexport * from \"./lib/Grid\";\nexport * from \"./lib/Option\";\nexport * from \"./lib/Reader\";\nexport * from \"./lib/Run\";\nexport * from \"./lib/Type\";\nexport * from \"./lib/Typo\";\nexport * from \"./lib/Usage\";\n","export type Type<Value> = {\n label: Uppercase<string>; // TODO - is there a better way to enforce uppercase labels?\n decoder(value: string): Value;\n};\n\nexport const typeBoolean: Type<boolean> = {\n label: \"BOOLEAN\",\n decoder(value: string) {\n if (value === \"true\") {\n return true;\n }\n if (value === \"false\") {\n return false;\n }\n throw new Error(`Invalid boolean: ${value}`);\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}`);\n }\n return new Date(timestamp);\n },\n};\n\nexport const typeString: Type<string> = {\n label: \"STRING\",\n decoder(value: string) {\n return value;\n },\n};\n\nexport const typeNumber: Type<number> = {\n label: \"NUMBER\",\n decoder(value: string) {\n return Number(value);\n },\n};\n\nexport const typeBigInt: Type<bigint> = {\n label: \"BIGINT\",\n decoder(value: string) {\n return BigInt(value);\n },\n};\n\nexport function typeCommaTuple<\n const Elements extends Array<any>,\n>(elementTypes: {\n [K in keyof Elements]: Type<Elements[K]>;\n}): Type<Elements> {\n return {\n label: elementTypes\n .map((elementType) => elementType.label)\n .join(\",\") as Uppercase<string>,\n decoder(value: string) {\n const parts = value.split(\",\", elementTypes.length);\n if (parts.length !== elementTypes.length) {\n throw new Error(\n `Invalid tuple value: ${value}, expected ${elementTypes.length} comma-separated parts`,\n );\n }\n return parts.map((part, index) =>\n typeDecode(\n elementTypes[index]!,\n part,\n `[${index}].${elementTypes[index]!.label}`,\n ),\n ) as Elements;\n },\n };\n}\n\nexport function typeCommaList<Value>(\n elementType: Type<Value>,\n): Type<Array<Value>> {\n return {\n label:\n `${elementType.label}[,${elementType.label}...]` as Uppercase<string>,\n decoder(value: string) {\n return value\n .split(\",\")\n .map((part, index) =>\n typeDecode(elementType, part, `[${index}].${elementType.label}`),\n );\n },\n };\n}\n\nexport function typeDecode<Value>(\n type: Type<Value>,\n value: string,\n context: string,\n): Value {\n try {\n return type.decoder(value);\n } catch (error) {\n throw new Error(\n `Invalid value for ${context}: \"${value}\": ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n}\n","import { ReaderPositionals } from \"./Reader\";\nimport { Type, typeDecode } from \"./Type\";\n\nexport type Argument<Value> = {\n generateUsage(): ArgumentUsage;\n consumeValue(readerPositionals: ReaderPositionals): Value;\n};\n\nexport type ArgumentUsage = {\n description: string | undefined;\n label: string;\n};\n\nexport function argumentRequired<Value>(definition: {\n description?: string;\n type: Type<Value>;\n label?: Uppercase<string>;\n}): Argument<Value> {\n const label = definition.label ?? definition.type.label;\n return {\n generateUsage() {\n return {\n description: definition.description,\n label: `<${label}>`,\n };\n },\n consumeValue(readerPositionals: ReaderPositionals) {\n const positional = readerPositionals.consumePositional();\n if (positional === undefined) {\n throw new Error(`Missing required argument: ${label}`);\n }\n return typeDecode(definition.type, positional, label);\n },\n };\n}\n\nexport function argumentOptional<Value>(definition: {\n description?: string;\n type: Type<Value>;\n label?: Uppercase<string>;\n default: () => Value;\n}): Argument<Value> {\n const label = definition.label ?? definition.type.label;\n return {\n generateUsage() {\n return {\n description: definition.description,\n label: `[${label}]`,\n };\n },\n consumeValue(readerPositionals: ReaderPositionals) {\n const positional = readerPositionals.consumePositional();\n if (positional === undefined) {\n return definition.default();\n }\n return typeDecode(definition.type, positional, label);\n },\n };\n}\n\nexport function argumentVariadics<Value>(definition: {\n description?: string;\n type: Type<Value>;\n label?: Uppercase<string>;\n endDelimiter?: string;\n}): Argument<Array<Value>> {\n const label = definition.label ?? definition.type.label;\n return {\n generateUsage() {\n return {\n description: definition.description,\n label:\n `[${label}...]` +\n (definition.endDelimiter\n ? ` (end with ${definition.endDelimiter})`\n : \"\"),\n };\n },\n consumeValue(readerPositionals: ReaderPositionals) {\n const values: Array<Value> = [];\n while (true) {\n const positional = readerPositionals.consumePositional();\n if (\n positional === undefined ||\n positional === definition.endDelimiter\n ) {\n break;\n }\n values.push(typeDecode(definition.type, positional, label));\n }\n return values;\n },\n };\n}\n","import { ArgumentUsage } from \"./Argument\";\nimport { Execution } from \"./Execution\";\nimport { OptionUsage } from \"./Option\";\nimport { ReaderTokenizer } from \"./Reader\";\n\nexport type Command<Context, Result> = {\n getDescription(): string | undefined;\n buildInterpreter(\n readerTokenizer: ReaderTokenizer,\n ): CommandInterpreter<Context, Result>;\n};\n\nexport type CommandMetadata = {\n description: string;\n details?: string;\n // TODO - printable examples ?\n};\n\nexport type CommandInterpreter<Context, Result> = {\n computeUsage(): CommandUsage;\n execute(context: Context): Promise<Result>;\n};\n\nexport type CommandUsage = {\n breadcrumbs: Array<CommandUsageBreadcrumb>;\n description: string;\n details: string | undefined;\n options: Array<OptionUsage>;\n arguments: Array<ArgumentUsage>;\n subcommands: Array<{ name: string; description: string | undefined }>;\n};\n\nexport type CommandUsageBreadcrumb = { argument: string } | { command: string };\n\nexport function command<Context, Result>(\n metadata: CommandMetadata,\n execution: Execution<Context, Result>,\n): Command<Context, Result> {\n return {\n getDescription() {\n return metadata.description;\n },\n buildInterpreter(readerTokenizer: ReaderTokenizer) {\n function computeUsage(): CommandUsage {\n const executionUsage = execution.computeUsage();\n return {\n breadcrumbs: executionUsage.arguments.map((argument) =>\n breadcrumbArgument(argument.label),\n ),\n description: metadata.description,\n details: metadata.details,\n options: executionUsage.options,\n arguments: executionUsage.arguments,\n subcommands: [],\n };\n }\n try {\n const executionResolver = execution.createResolver(readerTokenizer);\n const lastPositional = readerTokenizer.consumePositional();\n if (lastPositional !== undefined) {\n throw Error(`Unexpected argument: \"${lastPositional}\"`);\n }\n const executionCallback = executionResolver();\n return {\n computeUsage,\n async execute(context: Context) {\n return await executionCallback(context);\n },\n };\n } catch (error) {\n return {\n computeUsage,\n async execute(_context: Context) {\n throw error;\n },\n };\n }\n },\n };\n}\n\nexport function commandWithSubcommands<Context, Payload, Result>(\n metadata: CommandMetadata,\n execution: Execution<Context, Payload>,\n subcommands: { [subcommand: Lowercase<string>]: Command<Payload, Result> },\n): Command<Context, Result> {\n return {\n getDescription() {\n return metadata.description;\n },\n buildInterpreter(readerTokenizer: ReaderTokenizer) {\n try {\n const executionResolver = execution.createResolver(readerTokenizer);\n const subcommandName = readerTokenizer.consumePositional();\n if (subcommandName === undefined) {\n throw new Error(\"Missing required SUBCOMMAND argument\");\n }\n const subcommandInput =\n subcommands[subcommandName as Lowercase<string>];\n if (subcommandInput === undefined) {\n throw new Error(`Unknown subcommand name: \"${subcommandName}\"`);\n }\n const subcommandInterpreter =\n subcommandInput.buildInterpreter(readerTokenizer);\n const executionCallback = executionResolver();\n return {\n computeUsage() {\n const executionUsage = execution.computeUsage();\n const subcommandUsage = subcommandInterpreter.computeUsage();\n return {\n breadcrumbs: executionUsage.arguments\n .map((argument) => breadcrumbArgument(argument.label))\n .concat([breadcrumbCommand(subcommandName)])\n .concat(subcommandUsage.breadcrumbs),\n description: subcommandUsage.description,\n details: subcommandUsage.details,\n options: executionUsage.options.concat(subcommandUsage.options),\n arguments: executionUsage.arguments.concat(\n subcommandUsage.arguments,\n ),\n subcommands: subcommandUsage.subcommands,\n };\n },\n async execute(context: Context) {\n const payload = await executionCallback(context);\n return await subcommandInterpreter.execute(payload);\n },\n };\n } catch (error) {\n return {\n computeUsage() {\n const executionUsage = execution.computeUsage();\n return {\n breadcrumbs: executionUsage.arguments\n .map((argument) => breadcrumbArgument(argument.label))\n .concat([breadcrumbCommand(\"<SUBCOMMAND>\")]),\n description: metadata.description,\n details: metadata.details,\n options: executionUsage.options,\n arguments: executionUsage.arguments,\n subcommands: Object.entries(subcommands).map(\n ([name, subcommand]) => ({\n name,\n description: subcommand.getDescription(),\n }),\n ),\n };\n },\n async execute(_context: Context) {\n throw error;\n },\n };\n }\n },\n };\n}\n\nfunction breadcrumbArgument(value: string): CommandUsageBreadcrumb {\n return { argument: value };\n}\n\nfunction breadcrumbCommand(value: string): CommandUsageBreadcrumb {\n return { command: value };\n}\n","import { Argument, ArgumentUsage } from \"./Argument\";\nimport { Option, OptionUsage } from \"./Option\";\nimport { ReaderTokenizer } from \"./Reader\";\n\nexport type Execution<Context, Result> = {\n computeUsage(): ExecutionUsage;\n createResolver(\n readerTokenizer: ReaderTokenizer,\n ): ExecutionResolver<Context, Result>;\n};\n\nexport type ExecutionResolver<Context, Result> = () => ExecutionCallback<\n Context,\n Result\n>;\n\nexport type ExecutionCallback<Context, Result> = (\n context: Context,\n) => Promise<Result>;\n\nexport type ExecutionUsage = {\n options: Array<OptionUsage>;\n arguments: Array<ArgumentUsage>;\n};\n\nexport function execution<\n Context,\n Result,\n Options extends { [option: string]: any },\n const Arguments extends Array<any>,\n>(\n inputs: {\n options: { [K in keyof Options]: Option<Options[K]> };\n arguments: { [K in keyof Arguments]: Argument<Arguments[K]> };\n },\n handler: (\n context: Context,\n inputs: {\n options: Options;\n arguments: Arguments;\n },\n ) => Promise<Result>,\n): Execution<Context, Result> {\n return {\n computeUsage() {\n const optionsUsage = new Array<OptionUsage>();\n for (const optionKey in inputs.options) {\n const optionInput = inputs.options[optionKey]!;\n optionsUsage.push(optionInput.generateUsage());\n }\n const argumentsUsage = new Array<ArgumentUsage>();\n for (const argumentInput of inputs.arguments) {\n argumentsUsage.push(argumentInput.generateUsage());\n }\n return { options: optionsUsage, arguments: argumentsUsage };\n },\n createResolver(readerTokenizer: ReaderTokenizer) {\n const optionsConsumers: any = {};\n for (const optionKey in inputs.options) {\n const optionInput = inputs.options[optionKey]!;\n optionsConsumers[optionKey] =\n optionInput.prepareConsumer(readerTokenizer);\n }\n const argumentsValues: any = [];\n for (const argumentInput of inputs.arguments) {\n argumentsValues.push(argumentInput.consumeValue(readerTokenizer));\n }\n return () => {\n const optionsValues: any = {};\n for (const optionKey in optionsConsumers) {\n optionsValues[optionKey] = optionsConsumers[optionKey]!();\n }\n return async (context: Context) => {\n return await handler(context, {\n options: optionsValues,\n arguments: argumentsValues,\n });\n };\n };\n },\n };\n}\n","export type TypoSupport = \"none\" | \"tty\" | \"html\" | \"mock\";\n\nexport type TypoText = {\n value: string;\n color?: keyof typeof colorCodes;\n bold?: boolean;\n};\n\nexport function typoPrintableString(\n typoSupport: TypoSupport,\n typoText: TypoText,\n): string {\n if (typoSupport === \"none\") {\n return typoText.value;\n }\n if (typoSupport === \"tty\") {\n const colorStartCode = typoText.color ? colorCodes[typoText.color] : \"\";\n const colorBoldCode = typoText.bold ? boldCode : \"\";\n return `${colorStartCode}${colorBoldCode}${typoText.value}${resetCode}`;\n }\n if (typoSupport === \"html\") {\n const colorStartTag = typoText.color\n ? `<span style=\"color: ${typoText.color}\">`\n : \"\";\n const colorEndTag = typoText.color ? \"</span>\" : \"\";\n const boldStartTag = typoText.bold ? \"<b>\" : \"\";\n const boldEndTag = typoText.bold ? \"</b>\" : \"\";\n return `${colorStartTag}${boldStartTag}${typoText.value}${boldEndTag}${colorEndTag}`;\n }\n if (typoSupport === \"mock\") {\n if (typoText.color && typoText.bold) {\n return `{${typoText.value}}@${typoText.color}+`;\n }\n if (typoText.color) {\n return `{${typoText.value}}@${typoText.color}`;\n }\n if (typoText.bold) {\n return `{${typoText.value}}+`;\n }\n return `{${typoText.value}}`;\n }\n throw new Error(`Unknown typo support: ${typoSupport}`);\n}\n\nexport function typoInferProcessSupport(): TypoSupport {\n if (!process) {\n return \"none\";\n }\n if (process.env) {\n if (process.env[\"FORCE_COLOR\"] === \"0\") {\n return \"none\";\n }\n if (process.env[\"FORCE_COLOR\"]) {\n return \"tty\";\n }\n if (\"NO_COLOR\" in process.env) {\n return \"none\";\n }\n }\n if (!process.stdout || !process.stdout.isTTY) {\n return \"none\";\n }\n return \"tty\";\n}\n\nconst resetCode = \"\\x1b[0m\";\nconst boldCode = \"\\x1b[1m\";\nconst colorCodes = {\n darkBlack: \"\\x1b[30m\",\n darkRed: \"\\x1b[31m\",\n darkGreen: \"\\x1b[32m\",\n darkYellow: \"\\x1b[33m\",\n darkBlue: \"\\x1b[34m\",\n darkMagenta: \"\\x1b[35m\",\n darkCyan: \"\\x1b[36m\",\n darkWhite: \"\\x1b[37m\",\n brightBlack: \"\\x1b[90m\",\n brightRed: \"\\x1b[91m\",\n brightGreen: \"\\x1b[92m\",\n brightYellow: \"\\x1b[93m\",\n brightBlue: \"\\x1b[94m\",\n brightMagenta: \"\\x1b[95m\",\n brightCyan: \"\\x1b[96m\",\n brightWhite: \"\\x1b[97m\",\n};\n","import { TypoSupport, TypoText, typoPrintableString } from \"./Typo\";\n\nexport type Grid = Array<GridRow>;\nexport type GridRow = Array<GridCell>;\nexport type GridCell = Array<TypoText>;\n\nexport function gridToPrintableLines(\n grid: Grid,\n typoSupport: TypoSupport,\n delimiter: string = \"\",\n): Array<string> {\n const lines = new Array<string>();\n const gridWidths = new Array<number>();\n for (const gridRow of grid) {\n for (\n let gridColumnIndex = 0;\n gridColumnIndex < gridRow.length;\n gridColumnIndex++\n ) {\n const gridCell = gridRow[gridColumnIndex]!;\n const length = gridCellLength(gridCell);\n if (\n gridWidths[gridColumnIndex] === undefined ||\n length > gridWidths[gridColumnIndex]!\n ) {\n gridWidths[gridColumnIndex] = length;\n }\n }\n }\n for (const gridRow of grid) {\n const lineColumns = new Array<string>();\n for (\n let gridColumnIndex = 0;\n gridColumnIndex < gridRow.length;\n gridColumnIndex++\n ) {\n const gridCell = gridRow[gridColumnIndex]!;\n const parts = gridCell.map((text) =>\n typoPrintableString(typoSupport, text),\n );\n if (gridColumnIndex < gridRow.length - 1) {\n const length = gridCellLength(gridCell);\n const padding = \" \".repeat(gridWidths[gridColumnIndex]! - length);\n lineColumns.push(parts.join(\"\") + padding);\n } else {\n lineColumns.push(parts.join(\"\"));\n }\n }\n lines.push(lineColumns.join(delimiter));\n }\n return lines;\n}\n\nfunction gridCellLength(cell: GridCell): number {\n let length = 0;\n for (const text of cell) {\n length += text.value.length;\n }\n return length;\n}\n","import { ReaderTokenizer } from \"./Reader\";\nimport { Type, typeDecode } from \"./Type\";\n\nexport type Option<Value> = {\n generateUsage(): OptionUsage;\n prepareConsumer(readerTokenizer: ReaderTokenizer): OptionConsumer<Value>;\n};\n\nexport type OptionUsage = {\n description: string | undefined;\n long: Lowercase<string>; // TODO - better type for long option names ?\n short: string | undefined;\n label: Uppercase<string> | undefined;\n // TODO - default value for usage ? but it can be dynamic, so maybe not\n};\n\nexport type OptionConsumer<Value> = () => Value;\n\nexport function optionFlag(definition: {\n description?: string;\n long: Lowercase<string>;\n short?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n default?: () => boolean;\n}): Option<boolean> {\n return {\n generateUsage() {\n return {\n description: definition.description,\n long: definition.long,\n short: definition.short,\n label: undefined,\n };\n },\n prepareConsumer(readerTokenizer: ReaderTokenizer) {\n const key = definition.short\n ? `-${definition.short}, --${definition.long}`\n : `--${definition.long}`;\n const longs = [definition.long];\n if (definition.aliases?.longs) {\n longs.push(...definition.aliases?.longs);\n }\n const shorts = definition.short ? [definition.short] : [];\n if (definition.aliases?.shorts) {\n shorts.push(...definition.aliases?.shorts);\n }\n readerTokenizer.registerFlag({ key, longs, shorts });\n return () => {\n const value = readerTokenizer.consumeFlag(key);\n if (value === undefined) {\n return definition.default ? definition.default() : false;\n }\n return value;\n };\n },\n };\n}\n\n// TODO - option with comma-separated values, e.g. --names=alice,bob,charlie\n\nexport function optionRepeatable<Value>(definition: {\n description?: string;\n type: Type<Value>;\n long: Lowercase<string>;\n short?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n label?: Uppercase<string>;\n}): Option<Array<Value>> {\n const label = definition.label ?? definition.type.label;\n return {\n generateUsage() {\n // TODO - showcase that it can be repeated ?\n return {\n description: definition.description,\n long: definition.long,\n short: definition.short,\n label: `<${label}>` as Uppercase<string>,\n };\n },\n prepareConsumer(readerTokenizer: ReaderTokenizer) {\n const key = definition.short\n ? `-${definition.short}, --${definition.long}`\n : `--${definition.long}`;\n const longs = definition.long ? [definition.long] : [];\n if (definition.aliases?.longs) {\n longs.push(...definition.aliases?.longs);\n }\n const shorts = definition.short ? [definition.short] : [];\n if (definition.aliases?.shorts) {\n shorts.push(...definition.aliases?.shorts);\n }\n readerTokenizer.registerOption({ key, longs, shorts });\n return () => {\n return readerTokenizer\n .consumeOption(key)\n .map((value) =>\n typeDecode(definition.type, value, `${key}: ${label}`),\n );\n };\n },\n };\n}\n\nexport function optionSingleValue<Value>(definition: {\n description?: string;\n type: Type<Value>;\n long: Lowercase<string>;\n short?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n label?: Uppercase<string>;\n default: () => Value;\n}): Option<Value> {\n const label = definition.label ?? definition.type.label;\n return {\n generateUsage() {\n return {\n description: definition.description,\n long: definition.long,\n short: definition.short,\n label: `<${label}>` as Uppercase<string>,\n };\n },\n prepareConsumer(readerTokenizer: ReaderTokenizer) {\n const key = definition.short\n ? `-${definition.short}, --${definition.long}`\n : `--${definition.long}`;\n const longs = [definition.long];\n if (definition.aliases?.longs) {\n longs.push(...definition.aliases?.longs);\n }\n const shorts = definition.short ? [definition.short] : [];\n if (definition.aliases?.shorts) {\n shorts.push(...definition.aliases?.shorts);\n }\n readerTokenizer.registerOption({ key, longs, shorts });\n return () => {\n const values = readerTokenizer.consumeOption(key);\n if (values.length > 1) {\n throw new Error(\n `Multiple values provided for option: ${key}, expected only one`,\n );\n }\n const firstValue = values[0];\n if (firstValue === undefined) {\n return definition.default();\n }\n return typeDecode(definition.type, firstValue, `${key}: ${label}`);\n };\n },\n };\n}\n","export type ReaderPositionals = {\n consumePositional(): string | undefined;\n};\n\nexport class ReaderTokenizer {\n #parsedArgs: Array<string>;\n #parsedIndex: number;\n #parsedDouble: boolean;\n\n #flagKeyByShort: Map<string, string>;\n #flagKeyByLong: Map<string, string>;\n #flagInfoByKey: Map<string, {}>;\n #flagResultByKey: Map<string, boolean | null>;\n\n #optionKeyByShort: Map<string, string>;\n #optionKeyByLong: Map<string, string>;\n #optionInfoByKey: Map<string, {}>; // TODO - what dis for\n #optionResultByKey: Map<string, Array<string> | null>;\n\n constructor(args: Array<string>) {\n this.#parsedArgs = args;\n this.#parsedIndex = 0;\n this.#parsedDouble = false;\n\n // TODO - this seems like a good candidate for abstraction\n this.#flagKeyByShort = new Map();\n this.#flagKeyByLong = new Map();\n this.#flagInfoByKey = new Map();\n this.#flagResultByKey = new Map();\n\n this.#optionKeyByShort = new Map();\n this.#optionKeyByLong = new Map();\n this.#optionInfoByKey = new Map();\n this.#optionResultByKey = new Map();\n }\n\n registerFlag(definition: {\n key: string;\n shorts: Array<string>;\n longs: Array<string>;\n }) {\n this.#ensureUniqueKey(definition.key);\n this.#flagInfoByKey.set(definition.key, {});\n for (const short of definition.shorts) {\n this.#ensureUniqueName(short);\n this.#flagKeyByShort.set(short, definition.key);\n }\n for (const long of definition.longs) {\n this.#ensureUniqueName(long);\n this.#flagKeyByLong.set(long, definition.key);\n }\n }\n\n registerOption(definition: {\n key: string;\n shorts: Array<string>;\n longs: Array<string>;\n }) {\n this.#ensureUniqueKey(definition.key);\n this.#optionInfoByKey.set(definition.key, {});\n for (const short of definition.shorts) {\n this.#ensureUniqueName(short);\n this.#optionKeyByShort.set(short, definition.key);\n }\n for (const long of definition.longs) {\n this.#ensureUniqueName(long);\n this.#optionKeyByLong.set(long, definition.key);\n }\n }\n\n consumeFlag(key: string): boolean | undefined {\n const flagInfo = this.#flagInfoByKey.get(key);\n if (flagInfo === undefined) {\n throw new Error(`Flag not registered: ${key}`);\n }\n const result = this.#flagResultByKey.get(key);\n if (result === undefined) {\n this.#flagResultByKey.set(key, null);\n return undefined;\n }\n if (result === null) {\n throw new Error(`Flag already consumed: ${key}`);\n }\n this.#flagResultByKey.set(key, null);\n return result;\n }\n\n consumeOption(key: string): Array<string> {\n const optionInfo = this.#optionInfoByKey.get(key);\n if (optionInfo === undefined) {\n throw new Error(`Option not registered: ${key}`);\n }\n const result = this.#optionResultByKey.get(key);\n if (result === undefined) {\n this.#optionResultByKey.set(key, null);\n return new Array<string>();\n }\n if (result === null) {\n throw new Error(`Option already consumed: ${key}`);\n }\n this.#optionResultByKey.set(key, null);\n return result;\n }\n\n consumePositional(): string | undefined {\n while (true) {\n const arg = this.#consumeArg();\n if (arg === null) {\n return undefined;\n }\n const positional = this.#parseAsPositional(arg);\n if (positional !== null) {\n return positional;\n }\n }\n }\n\n #consumeArg(): string | null {\n const arg = this.#parsedArgs[this.#parsedIndex];\n if (arg === undefined) {\n return null;\n }\n this.#parsedIndex++;\n if (!this.#parsedDouble) {\n if (arg === \"--\") {\n this.#parsedDouble = true;\n return this.#consumeArg();\n }\n }\n return arg;\n }\n\n #consumeOptionValue(name: string) {\n const arg = this.#consumeArg();\n if (arg === null) {\n throw new Error(`Option ${name} requires a value but none was provided`);\n }\n if (this.#parsedDouble) {\n throw new Error(`Option ${name} requires a value before --`);\n }\n // TODO - is that weird, could a valid value start with dash ?\n if (arg.startsWith(\"-\")) {\n throw new Error(`Option ${name} requires a value, got: ${arg}`);\n }\n return arg;\n }\n\n #parseAsPositional(arg: string): string | null {\n if (this.#parsedDouble) {\n return arg;\n }\n if (arg.startsWith(\"--\")) {\n const valueIndexStart = arg.indexOf(\"=\");\n if (valueIndexStart === -1) {\n this.#consumeOptionLong(arg.slice(2), null);\n } else {\n this.#consumeOptionLong(\n arg.slice(2, valueIndexStart),\n arg.slice(valueIndexStart + 1),\n );\n }\n return null;\n }\n if (arg.startsWith(\"-\")) {\n let shortIndexStart = 1;\n let shortIndexEnd = 2;\n while (shortIndexEnd <= arg.length) {\n const short = arg.slice(shortIndexStart, shortIndexEnd);\n const rest = arg.slice(shortIndexEnd);\n const result = this.#tryConsumeOptionShort(short, rest);\n if (result === true) {\n return null;\n }\n if (result === false) {\n shortIndexStart = shortIndexEnd;\n }\n shortIndexEnd++;\n }\n throw new Error(\n `Unknown flags or option: -${arg.slice(shortIndexStart)}`,\n );\n }\n return arg;\n }\n\n #consumeOptionLong(long: string, direct: string | null): void {\n const flagKey = this.#flagKeyByLong.get(long);\n if (flagKey !== undefined) {\n if (direct !== null) {\n const value = asBoolean(direct);\n if (value !== undefined) {\n return this.#acknowledgeFlag(flagKey, value);\n }\n throw new Error(`Invalid value for flag: --${long}: ${direct}`);\n }\n return this.#acknowledgeFlag(flagKey, true);\n }\n const optionKey = this.#optionKeyByLong.get(long);\n if (optionKey !== undefined) {\n if (direct !== null) {\n return this.#acknowledgeOption(optionKey, direct);\n }\n return this.#acknowledgeOption(optionKey, this.#consumeOptionValue(long));\n }\n throw new Error(`Unknown long flag or option: --${long}`);\n }\n\n #tryConsumeOptionShort(short: string, rest: string): boolean | null {\n const flagKey = this.#flagKeyByShort.get(short);\n if (flagKey !== undefined) {\n if (rest.startsWith(\"=\")) {\n const value = asBoolean(rest.slice(1));\n if (value !== undefined) {\n this.#acknowledgeFlag(flagKey, value);\n return true;\n }\n throw new Error(`Invalid value for flag: -${short}: ${rest}`);\n }\n this.#acknowledgeFlag(flagKey, true);\n return rest === \"\";\n }\n const optionKey = this.#optionKeyByShort.get(short);\n if (optionKey !== undefined) {\n if (rest === \"\") {\n this.#acknowledgeOption(optionKey, this.#consumeOptionValue(short));\n return true;\n }\n if (rest.startsWith(\"=\")) {\n this.#acknowledgeOption(optionKey, rest.slice(1));\n } else {\n this.#acknowledgeOption(optionKey, rest);\n }\n return true;\n }\n return null;\n }\n\n #acknowledgeFlag(key: string, value: boolean) {\n if (this.#flagResultByKey.has(key)) {\n throw new Error(`Flag already set: ${key}`);\n }\n this.#flagResultByKey.set(key, value);\n }\n\n #acknowledgeOption(key: string, value: string) {\n const values = this.#optionResultByKey.get(key) ?? new Array<string>();\n values.push(value);\n this.#optionResultByKey.set(key, values);\n }\n\n #ensureUniqueKey(key: string) {\n if (this.#flagInfoByKey.has(key)) {\n throw new Error(`Flag already registered: ${key}`);\n }\n if (this.#optionInfoByKey.has(key)) {\n throw new Error(`Option already registered: ${key}`);\n }\n }\n\n #ensureUniqueName(nameShortOrLong: string) {\n // TODO - overall better error handling\n // TODO - short flag overlap might be annoying here\n if (this.#flagKeyByShort.has(nameShortOrLong)) {\n throw new Error(`Flag already registered: -${nameShortOrLong}`);\n }\n if (this.#flagKeyByLong.has(nameShortOrLong)) {\n throw new Error(`Flag already registered: --${nameShortOrLong}`);\n }\n if (this.#optionKeyByShort.has(nameShortOrLong)) {\n throw new Error(`Option already registered: -${nameShortOrLong}`);\n }\n if (this.#optionKeyByLong.has(nameShortOrLong)) {\n throw new Error(`Option already registered: --${nameShortOrLong}`);\n }\n }\n}\n\nfunction asBoolean(value: string): boolean | undefined {\n const lower = value.toLowerCase();\n if (lower === \"true\" || lower === \"t\" || lower === \"y\" || lower === \"yes\") {\n return true;\n }\n if (lower === \"false\" || lower === \"f\" || lower === \"n\" || lower === \"no\") {\n return false;\n }\n return undefined;\n}\n","import { CommandUsage } from \"./Command\";\nimport { GridCell, GridRow, gridToPrintableLines } from \"./Grid\";\nimport { TypoSupport, TypoText, typoPrintableString } from \"./Typo\";\n\nexport function usageToPrintableLines(params: {\n cliName: Lowercase<string>;\n commandUsage: CommandUsage;\n typoSupport: TypoSupport;\n}) {\n const { cliName, commandUsage, typoSupport } = params;\n\n const lines = new Array<string>();\n\n lines.push(\n typoPrintableString(typoSupport, {\n value: commandUsage.description,\n bold: true,\n }),\n );\n if (commandUsage.details) {\n lines.push(\n typoPrintableString(typoSupport, {\n value: commandUsage.details,\n color: \"brightBlack\",\n }),\n );\n }\n\n lines.push(\"\");\n const breadcrumbs = [\n typoPrintableString(typoSupport, {\n value: \"Usage:\",\n color: \"brightMagenta\",\n bold: true,\n }),\n typoPrintableString(typoSupport, textFixed(cliName)),\n ].concat(\n commandUsage.breadcrumbs.map((breadcrumb) => {\n if (\"argument\" in breadcrumb) {\n return typoPrintableString(typoSupport, textInput(breadcrumb.argument));\n }\n if (\"command\" in breadcrumb) {\n return typoPrintableString(typoSupport, textFixed(breadcrumb.command));\n }\n throw new Error(`Unknown breadcrumb: ${JSON.stringify(breadcrumb)}`);\n }),\n );\n lines.push(breadcrumbs.join(\" \"));\n\n if (commandUsage.arguments.length > 0) {\n lines.push(\"\");\n lines.push(typoPrintableString(typoSupport, textBlockTitle(\"Arguments:\")));\n const grid = new Array<GridRow>();\n for (const argumentUsage of commandUsage.arguments) {\n const gridRow = new Array<GridCell>();\n gridRow.push([textDelimiter()]);\n gridRow.push([textInput(argumentUsage.label)]);\n if (argumentUsage.description) {\n gridRow.push([textDelimiter()]);\n gridRow.push([textDescription(argumentUsage.description)]);\n }\n grid.push(gridRow);\n }\n lines.push(...gridToPrintableLines(grid, typoSupport));\n }\n\n if (commandUsage.subcommands.length > 0) {\n lines.push(\"\");\n lines.push(\n typoPrintableString(typoSupport, textBlockTitle(\"Subcommands:\")),\n );\n const grid = new Array<GridRow>();\n for (const subcommand of commandUsage.subcommands) {\n const gridRow = new Array<GridCell>();\n gridRow.push([textDelimiter()]);\n gridRow.push([textFixed(subcommand.name)]);\n if (subcommand.description) {\n gridRow.push([textDelimiter()]);\n gridRow.push([textDescription(subcommand.description)]);\n }\n grid.push(gridRow);\n }\n lines.push(...gridToPrintableLines(grid, typoSupport));\n }\n\n if (commandUsage.options.length > 0) {\n lines.push(\"\");\n lines.push(typoPrintableString(typoSupport, textBlockTitle(\"Options:\")));\n const grid = new Array<GridRow>();\n for (const optionUsage of commandUsage.options) {\n const gridRow = new Array<GridCell>();\n gridRow.push([textDelimiter()]);\n if (optionUsage.short) {\n gridRow.push([textFixed(`-${optionUsage.short}`), { value: \", \" }]);\n } else {\n gridRow.push([]);\n }\n if (optionUsage.label) {\n gridRow.push([\n textFixed(`--${optionUsage.long} `),\n textInput(optionUsage.label),\n ]);\n } else {\n gridRow.push([textFixed(`--${optionUsage.long}`)]);\n }\n if (optionUsage.description) {\n gridRow.push([textDelimiter()]);\n gridRow.push([textDescription(optionUsage.description)]);\n }\n grid.push(gridRow);\n }\n lines.push(...gridToPrintableLines(grid, typoSupport));\n }\n\n lines.push(\"\");\n return lines;\n}\n\nfunction textBlockTitle(text: string): TypoText {\n return { value: text, color: \"brightGreen\", bold: true };\n}\n\nfunction textDescription(text: string): TypoText {\n return { value: text };\n}\n\nfunction textFixed(text: string): TypoText {\n return { value: text, color: \"brightCyan\", bold: true };\n}\n\nfunction textInput(text: string): TypoText {\n return { value: text, color: \"brightBlue\" };\n}\n\nfunction textDelimiter(): TypoText {\n return { value: \" \" };\n}\n","import { Command, CommandInterpreter } from \"./Command\";\nimport { ReaderTokenizer } from \"./Reader\";\nimport {\n typoInferProcessSupport,\n typoPrintableString,\n TypoSupport,\n} from \"./Typo\";\nimport { usageToPrintableLines } from \"./Usage\";\n\n// TODO - add unit tests for this\n\nexport async function runAndExit<Context>(\n cliName: Lowercase<string>,\n cliArgs: Array<string>,\n context: Context,\n command: Command<Context, void>,\n application?: {\n usageOnError?: boolean | undefined;\n usageOnHelp?: boolean | undefined;\n buildVersion?: string | undefined;\n useColors?: boolean | undefined;\n onLogStdOut?: ((message: string) => void) | undefined;\n onLogStdErr?: ((message: string) => void) | undefined;\n onExit?: ((code: number) => never) | undefined;\n onError?: ((error: unknown) => void) | undefined;\n },\n): Promise<never> {\n const readerTokenizer = new ReaderTokenizer(cliArgs);\n if (application?.buildVersion) {\n readerTokenizer.registerFlag({\n key: \"version\",\n shorts: [],\n longs: [\"version\"],\n });\n }\n if (application?.usageOnHelp ?? true) {\n readerTokenizer.registerFlag({\n key: \"help\",\n shorts: [],\n longs: [\"help\"],\n });\n }\n /*\n // TODO - handle completions ?\n readerTokenizer.registerFlag({\n key: \"completion\",\n shorts: [],\n longs: [\"completion\"],\n });\n */\n const commandInterpreter = command.buildInterpreter(readerTokenizer);\n if (application?.buildVersion) {\n if (readerTokenizer.consumeFlag(\"version\")) {\n (application?.onLogStdOut ?? console.log)(\n [cliName, application.buildVersion].join(\" \"),\n );\n return (application?.onExit ?? process.exit)(0);\n }\n }\n if (application?.usageOnHelp ?? true) {\n if (readerTokenizer.consumeFlag(\"help\")) {\n (application?.onLogStdOut ?? console.log)(\n computeUsageString(cliName, commandInterpreter, application?.useColors),\n );\n return (application?.onExit ?? process.exit)(0);\n }\n }\n try {\n await commandInterpreter.execute(context);\n return (application?.onExit ?? process.exit)(0);\n } catch (error) {\n if (application?.usageOnError ?? true) {\n (application?.onLogStdErr ?? console.error)(\n computeUsageString(cliName, commandInterpreter, application?.useColors),\n );\n }\n if (application?.onError) {\n application.onError(error);\n } else {\n const typoSupport = chooseTypoSupport(application?.useColors);\n (application?.onLogStdErr ?? console.error)(\n [\n typoPrintableString(typoSupport, {\n value: \"Error:\",\n color: \"brightRed\",\n bold: true,\n }),\n typoPrintableString(typoSupport, {\n value: error instanceof Error ? error.message : String(error),\n bold: true,\n }),\n ].join(\" \"),\n );\n }\n return (application?.onExit ?? process.exit)(1);\n }\n}\n\nfunction computeUsageString<Context, Result>(\n cliName: Lowercase<string>,\n commandInterpreter: CommandInterpreter<Context, Result>,\n useColors: boolean | undefined,\n) {\n return usageToPrintableLines({\n cliName,\n commandUsage: commandInterpreter.computeUsage(),\n typoSupport: chooseTypoSupport(useColors),\n }).join(\"\\n\");\n}\n\nfunction chooseTypoSupport(useColors?: boolean): TypoSupport {\n if (useColors === undefined) {\n return typoInferProcessSupport();\n }\n return useColors ? \"tty\" : \"none\";\n}\n"],"mappings":"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","names":["index_exports","__export","ReaderTokenizer","argumentOptional","argumentRequired","argumentVariadics","command","commandWithSubcommands","execution","gridToPrintableLines","optionFlag","optionRepeatable","optionSingleValue","runAndExit","typeBigInt","typeBoolean","typeCommaList","typeCommaTuple","typeDate","typeDecode","typeNumber","typeString","typoInferProcessSupport","typoPrintableString","usageToPrintableLines","__toCommonJS","typeBoolean","value","typeDate","timestamp","typeString","typeNumber","typeBigInt","typeCommaTuple","elementTypes","elementType","parts","part","index","typeDecode","typeCommaList","type","context","error","argumentRequired","definition","label","readerPositionals","positional","typeDecode","argumentOptional","argumentVariadics","values","command","metadata","execution","readerTokenizer","computeUsage","executionUsage","argument","breadcrumbArgument","executionResolver","lastPositional","executionCallback","context","error","_context","commandWithSubcommands","subcommands","subcommandName","subcommandInput","subcommandInterpreter","subcommandUsage","breadcrumbCommand","payload","name","subcommand","value","execution","inputs","handler","optionsUsage","optionKey","optionInput","argumentsUsage","argumentInput","readerTokenizer","optionsConsumers","argumentsValues","optionsValues","context","typoPrintableString","typoSupport","typoText","colorStartCode","colorCodes","colorBoldCode","boldCode","resetCode","colorStartTag","colorEndTag","boldStartTag","boldEndTag","typoInferProcessSupport","gridToPrintableLines","grid","typoSupport","delimiter","lines","gridWidths","gridRow","gridColumnIndex","gridCell","length","gridCellLength","lineColumns","parts","text","typoPrintableString","padding","cell","optionFlag","definition","readerTokenizer","key","longs","shorts","value","optionRepeatable","label","typeDecode","optionSingleValue","values","firstValue","_parsedArgs","_parsedIndex","_parsedDouble","_flagKeyByShort","_flagKeyByLong","_flagInfoByKey","_flagResultByKey","_optionKeyByShort","_optionKeyByLong","_optionInfoByKey","_optionResultByKey","_ReaderTokenizer_instances","consumeArg_fn","consumeOptionValue_fn","parseAsPositional_fn","consumeOptionLong_fn","tryConsumeOptionShort_fn","acknowledgeFlag_fn","acknowledgeOption_fn","ensureUniqueKey_fn","ensureUniqueName_fn","ReaderTokenizer","args","__privateAdd","__privateSet","definition","__privateMethod","__privateGet","short","long","key","result","arg","positional","__privateWrapper","name","valueIndexStart","shortIndexStart","shortIndexEnd","rest","direct","flagKey","value","asBoolean","optionKey","values","nameShortOrLong","lower","usageToPrintableLines","params","cliName","commandUsage","typoSupport","lines","typoPrintableString","breadcrumbs","textFixed","breadcrumb","textInput","textBlockTitle","grid","argumentUsage","gridRow","textDelimiter","textDescription","gridToPrintableLines","subcommand","optionUsage","text","runAndExit","cliName","cliArgs","context","command","application","readerTokenizer","ReaderTokenizer","commandInterpreter","computeUsageString","error","typoSupport","chooseTypoSupport","typoPrintableString","useColors","usageToPrintableLines","typoInferProcessSupport"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/lib/Type.ts","../src/lib/Argument.ts","../src/lib/Command.ts","../src/lib/Execution.ts","../src/lib/Typo.ts","../src/lib/Grid.ts","../src/lib/Option.ts","../src/lib/Reader.ts","../src/lib/Usage.ts","../src/lib/Run.ts"],"sourcesContent":["export * from \"./lib/Argument\";\nexport * from \"./lib/Command\";\nexport * from \"./lib/Execution\";\nexport * from \"./lib/Grid\";\nexport * from \"./lib/Option\";\nexport * from \"./lib/Reader\";\nexport * from \"./lib/Run\";\nexport * from \"./lib/Type\";\nexport * from \"./lib/Typo\";\nexport * from \"./lib/Usage\";\n","export type Type<Value> = {\n label: Uppercase<string>; // TODO - is there a better way to enforce uppercase labels?\n decoder(value: string): Value;\n};\n\nexport const typeBoolean: Type<boolean> = {\n label: \"BOOLEAN\",\n decoder(value: string) {\n if (value === \"true\") {\n return true;\n }\n if (value === \"false\") {\n return false;\n }\n throw new Error(`Invalid boolean: ${value}`);\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}`);\n }\n return new Date(timestamp);\n },\n};\n\nexport const typeString: Type<string> = {\n label: \"STRING\",\n decoder(value: string) {\n return value;\n },\n};\n\nexport const typeNumber: Type<number> = {\n label: \"NUMBER\",\n decoder(value: string) {\n return Number(value);\n },\n};\n\nexport const typeBigInt: Type<bigint> = {\n label: \"BIGINT\",\n decoder(value: string) {\n return BigInt(value);\n },\n};\n\nexport function typeCommaTuple<\n const Elements extends Array<any>,\n>(elementTypes: {\n [K in keyof Elements]: Type<Elements[K]>;\n}): Type<Elements> {\n return {\n label: elementTypes\n .map((elementType) => elementType.label)\n .join(\",\") as Uppercase<string>,\n decoder(value: string) {\n const parts = value.split(\",\", elementTypes.length);\n if (parts.length !== elementTypes.length) {\n throw new Error(\n `Invalid tuple value: \"${value}\", expected ${elementTypes.length} comma-separated parts`,\n );\n }\n return parts.map((part, index) =>\n typeDecode(\n elementTypes[index]!,\n part,\n `[${index}].${elementTypes[index]!.label}`,\n ),\n ) as Elements;\n },\n };\n}\n\nexport function typeCommaList<Value>(\n elementType: Type<Value>,\n): Type<Array<Value>> {\n return {\n label:\n `${elementType.label}[,${elementType.label}...]` as Uppercase<string>,\n decoder(value: string) {\n return value\n .split(\",\")\n .map((part, index) =>\n typeDecode(elementType, part, `[${index}].${elementType.label}`),\n );\n },\n };\n}\n\nexport function typeDecode<Value>(\n type: Type<Value>,\n value: string,\n context: string,\n): Value {\n try {\n return type.decoder(value);\n } catch (error) {\n throw new Error(\n `Failed to decode value \"${value}\" for ${context}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n}\n","import { ReaderPositionals } from \"./Reader\";\nimport { Type, typeDecode } from \"./Type\";\n\nexport type Argument<Value> = {\n generateUsage(): ArgumentUsage;\n consumeValue(readerPositionals: ReaderPositionals): Value;\n};\n\nexport type ArgumentUsage = {\n description: string | undefined;\n label: string;\n};\n\nexport function argumentRequired<Value>(definition: {\n description?: string;\n type: Type<Value>;\n label?: Uppercase<string>;\n}): Argument<Value> {\n const label = definition.label ?? definition.type.label;\n return {\n generateUsage() {\n return {\n description: definition.description,\n label: `<${label}>`,\n };\n },\n consumeValue(readerPositionals: ReaderPositionals) {\n const positional = readerPositionals.consumePositional();\n if (positional === undefined) {\n throw new Error(`Missing required argument: ${label}`);\n }\n return typeDecode(definition.type, positional, label);\n },\n };\n}\n\nexport function argumentOptional<Value>(definition: {\n description?: string;\n type: Type<Value>;\n label?: Uppercase<string>;\n default: () => Value;\n}): Argument<Value> {\n const label = definition.label ?? definition.type.label;\n return {\n generateUsage() {\n return {\n description: definition.description,\n label: `[${label}]`,\n };\n },\n consumeValue(readerPositionals: ReaderPositionals) {\n const positional = readerPositionals.consumePositional();\n if (positional === undefined) {\n return definition.default();\n }\n return typeDecode(definition.type, positional, label);\n },\n };\n}\n\nexport function argumentVariadics<Value>(definition: {\n description?: string;\n type: Type<Value>;\n label?: Uppercase<string>;\n endDelimiter?: string;\n}): Argument<Array<Value>> {\n const label = definition.label ?? definition.type.label;\n return {\n generateUsage() {\n return {\n description: definition.description,\n label:\n `[${label}...]` +\n (definition.endDelimiter\n ? ` (end with ${definition.endDelimiter})`\n : \"\"),\n };\n },\n consumeValue(readerPositionals: ReaderPositionals) {\n const values: Array<Value> = [];\n while (true) {\n const positional = readerPositionals.consumePositional();\n if (\n positional === undefined ||\n positional === definition.endDelimiter\n ) {\n break;\n }\n values.push(typeDecode(definition.type, positional, label));\n }\n return values;\n },\n };\n}\n","import { ArgumentUsage } from \"./Argument\";\nimport { Execution } from \"./Execution\";\nimport { OptionUsage } from \"./Option\";\nimport { ReaderTokenizer } from \"./Reader\";\n\nexport type Command<Context, Result> = {\n getDescription(): string | undefined;\n buildInterpreter(\n readerTokenizer: ReaderTokenizer,\n ): CommandInterpreter<Context, Result>;\n};\n\nexport type CommandMetadata = {\n description: string;\n details?: string;\n // TODO - printable examples ?\n};\n\nexport type CommandInterpreter<Context, Result> = {\n computeUsage(): CommandUsage;\n execute(context: Context): Promise<Result>;\n};\n\nexport type CommandUsage = {\n breadcrumbs: Array<CommandUsageBreadcrumb>;\n description: string;\n details: string | undefined;\n options: Array<OptionUsage>;\n arguments: Array<ArgumentUsage>;\n subcommands: Array<{ name: string; description: string | undefined }>;\n};\n\nexport type CommandUsageBreadcrumb = { argument: string } | { command: string };\n\nexport function command<Context, Result>(\n metadata: CommandMetadata,\n execution: Execution<Context, Result>,\n): Command<Context, Result> {\n return {\n getDescription() {\n return metadata.description;\n },\n buildInterpreter(readerTokenizer: ReaderTokenizer) {\n function computeUsage(): CommandUsage {\n const executionUsage = execution.computeUsage();\n return {\n breadcrumbs: executionUsage.arguments.map((argument) =>\n breadcrumbArgument(argument.label),\n ),\n description: metadata.description,\n details: metadata.details,\n options: executionUsage.options,\n arguments: executionUsage.arguments,\n subcommands: [],\n };\n }\n try {\n const executionResolver = execution.createResolver(readerTokenizer);\n const lastPositional = readerTokenizer.consumePositional();\n if (lastPositional !== undefined) {\n throw Error(`Unexpected argument: \"${lastPositional}\"`);\n }\n const executionCallback = executionResolver();\n return {\n computeUsage,\n async execute(context: Context) {\n return await executionCallback(context);\n },\n };\n } catch (error) {\n return {\n computeUsage,\n async execute(_context: Context) {\n throw error;\n },\n };\n }\n },\n };\n}\n\nexport function commandWithSubcommands<Context, Payload, Result>(\n metadata: CommandMetadata,\n execution: Execution<Context, Payload>,\n subcommands: { [subcommand: Lowercase<string>]: Command<Payload, Result> },\n): Command<Context, Result> {\n return {\n getDescription() {\n return metadata.description;\n },\n buildInterpreter(readerTokenizer: ReaderTokenizer) {\n try {\n const executionResolver = execution.createResolver(readerTokenizer);\n const subcommandName = readerTokenizer.consumePositional();\n if (subcommandName === undefined) {\n throw new Error(\"Missing required SUBCOMMAND argument\");\n }\n const subcommandInput =\n subcommands[subcommandName as Lowercase<string>];\n if (subcommandInput === undefined) {\n throw new Error(`Unknown subcommand name: \"${subcommandName}\"`);\n }\n const subcommandInterpreter =\n subcommandInput.buildInterpreter(readerTokenizer);\n const executionCallback = executionResolver();\n return {\n computeUsage() {\n const executionUsage = execution.computeUsage();\n const subcommandUsage = subcommandInterpreter.computeUsage();\n return {\n breadcrumbs: executionUsage.arguments\n .map((argument) => breadcrumbArgument(argument.label))\n .concat([breadcrumbCommand(subcommandName)])\n .concat(subcommandUsage.breadcrumbs),\n description: subcommandUsage.description,\n details: subcommandUsage.details,\n options: executionUsage.options.concat(subcommandUsage.options),\n arguments: executionUsage.arguments.concat(\n subcommandUsage.arguments,\n ),\n subcommands: subcommandUsage.subcommands,\n };\n },\n async execute(context: Context) {\n const payload = await executionCallback(context);\n return await subcommandInterpreter.execute(payload);\n },\n };\n } catch (error) {\n return {\n computeUsage() {\n const executionUsage = execution.computeUsage();\n return {\n breadcrumbs: executionUsage.arguments\n .map((argument) => breadcrumbArgument(argument.label))\n .concat([breadcrumbCommand(\"<SUBCOMMAND>\")]),\n description: metadata.description,\n details: metadata.details,\n options: executionUsage.options,\n arguments: executionUsage.arguments,\n subcommands: Object.entries(subcommands).map(\n ([name, subcommand]) => ({\n name,\n description: subcommand.getDescription(),\n }),\n ),\n };\n },\n async execute(_context: Context) {\n throw error;\n },\n };\n }\n },\n };\n}\n\nfunction breadcrumbArgument(value: string): CommandUsageBreadcrumb {\n return { argument: value };\n}\n\nfunction breadcrumbCommand(value: string): CommandUsageBreadcrumb {\n return { command: value };\n}\n","import { Argument, ArgumentUsage } from \"./Argument\";\nimport { Option, OptionUsage } from \"./Option\";\nimport { ReaderTokenizer } from \"./Reader\";\n\nexport type Execution<Context, Result> = {\n computeUsage(): ExecutionUsage;\n createResolver(\n readerTokenizer: ReaderTokenizer,\n ): ExecutionResolver<Context, Result>;\n};\n\nexport type ExecutionResolver<Context, Result> = () => ExecutionCallback<\n Context,\n Result\n>;\n\nexport type ExecutionCallback<Context, Result> = (\n context: Context,\n) => Promise<Result>;\n\nexport type ExecutionUsage = {\n options: Array<OptionUsage>;\n arguments: Array<ArgumentUsage>;\n};\n\nexport function execution<\n Context,\n Result,\n Options extends { [option: string]: any },\n const Arguments extends Array<any>,\n>(\n inputs: {\n options: { [K in keyof Options]: Option<Options[K]> };\n arguments: { [K in keyof Arguments]: Argument<Arguments[K]> };\n },\n handler: (\n context: Context,\n inputs: {\n options: Options;\n arguments: Arguments;\n },\n ) => Promise<Result>,\n): Execution<Context, Result> {\n return {\n computeUsage() {\n const optionsUsage = new Array<OptionUsage>();\n for (const optionKey in inputs.options) {\n const optionInput = inputs.options[optionKey]!;\n optionsUsage.push(optionInput.generateUsage());\n }\n const argumentsUsage = new Array<ArgumentUsage>();\n for (const argumentInput of inputs.arguments) {\n argumentsUsage.push(argumentInput.generateUsage());\n }\n return { options: optionsUsage, arguments: argumentsUsage };\n },\n createResolver(readerTokenizer: ReaderTokenizer) {\n const optionsConsumers: any = {};\n for (const optionKey in inputs.options) {\n const optionInput = inputs.options[optionKey]!;\n optionsConsumers[optionKey] =\n optionInput.prepareConsumer(readerTokenizer);\n }\n const argumentsValues: any = [];\n for (const argumentInput of inputs.arguments) {\n argumentsValues.push(argumentInput.consumeValue(readerTokenizer));\n }\n return () => {\n const optionsValues: any = {};\n for (const optionKey in optionsConsumers) {\n optionsValues[optionKey] = optionsConsumers[optionKey]!();\n }\n return async (context: Context) => {\n return await handler(context, {\n options: optionsValues,\n arguments: argumentsValues,\n });\n };\n };\n },\n };\n}\n","export type TypoSupport = \"none\" | \"tty\" | \"html\" | \"mock\";\n\nexport type TypoText = {\n value: string;\n color?: keyof typeof colorCodes;\n bold?: boolean;\n};\n\nexport function typoPrintableString(\n typoSupport: TypoSupport,\n typoText: TypoText,\n): string {\n if (typoSupport === \"none\") {\n return typoText.value;\n }\n if (typoSupport === \"tty\") {\n const colorStartCode = typoText.color ? colorCodes[typoText.color] : \"\";\n const colorBoldCode = typoText.bold ? boldCode : \"\";\n return `${colorStartCode}${colorBoldCode}${typoText.value}${resetCode}`;\n }\n if (typoSupport === \"html\") {\n const colorStartTag = typoText.color\n ? `<span style=\"color: ${typoText.color}\">`\n : \"\";\n const colorEndTag = typoText.color ? \"</span>\" : \"\";\n const boldStartTag = typoText.bold ? \"<b>\" : \"\";\n const boldEndTag = typoText.bold ? \"</b>\" : \"\";\n return `${colorStartTag}${boldStartTag}${typoText.value}${boldEndTag}${colorEndTag}`;\n }\n if (typoSupport === \"mock\") {\n if (typoText.color && typoText.bold) {\n return `{${typoText.value}}@${typoText.color}+`;\n }\n if (typoText.color) {\n return `{${typoText.value}}@${typoText.color}`;\n }\n if (typoText.bold) {\n return `{${typoText.value}}+`;\n }\n return `{${typoText.value}}`;\n }\n throw new Error(`Unknown typo support: ${typoSupport}`);\n}\n\nexport function typoInferProcessSupport(): TypoSupport {\n if (!process) {\n return \"none\";\n }\n if (process.env) {\n if (process.env[\"FORCE_COLOR\"] === \"0\") {\n return \"none\";\n }\n if (process.env[\"FORCE_COLOR\"]) {\n return \"tty\";\n }\n if (\"NO_COLOR\" in process.env) {\n return \"none\";\n }\n }\n if (!process.stdout || !process.stdout.isTTY) {\n return \"none\";\n }\n return \"tty\";\n}\n\nconst resetCode = \"\\x1b[0m\";\nconst boldCode = \"\\x1b[1m\";\nconst colorCodes = {\n darkBlack: \"\\x1b[30m\",\n darkRed: \"\\x1b[31m\",\n darkGreen: \"\\x1b[32m\",\n darkYellow: \"\\x1b[33m\",\n darkBlue: \"\\x1b[34m\",\n darkMagenta: \"\\x1b[35m\",\n darkCyan: \"\\x1b[36m\",\n darkWhite: \"\\x1b[37m\",\n brightBlack: \"\\x1b[90m\",\n brightRed: \"\\x1b[91m\",\n brightGreen: \"\\x1b[92m\",\n brightYellow: \"\\x1b[93m\",\n brightBlue: \"\\x1b[94m\",\n brightMagenta: \"\\x1b[95m\",\n brightCyan: \"\\x1b[96m\",\n brightWhite: \"\\x1b[97m\",\n};\n","import { TypoSupport, TypoText, typoPrintableString } from \"./Typo\";\n\nexport type Grid = Array<GridRow>;\nexport type GridRow = Array<GridCell>;\nexport type GridCell = Array<TypoText>;\n\nexport function gridToPrintableLines(\n grid: Grid,\n typoSupport: TypoSupport,\n delimiter: string = \"\",\n): Array<string> {\n const lines = new Array<string>();\n const gridWidths = new Array<number>();\n for (const gridRow of grid) {\n for (\n let gridColumnIndex = 0;\n gridColumnIndex < gridRow.length;\n gridColumnIndex++\n ) {\n const gridCell = gridRow[gridColumnIndex]!;\n const length = gridCellLength(gridCell);\n if (\n gridWidths[gridColumnIndex] === undefined ||\n length > gridWidths[gridColumnIndex]!\n ) {\n gridWidths[gridColumnIndex] = length;\n }\n }\n }\n for (const gridRow of grid) {\n const lineColumns = new Array<string>();\n for (\n let gridColumnIndex = 0;\n gridColumnIndex < gridRow.length;\n gridColumnIndex++\n ) {\n const gridCell = gridRow[gridColumnIndex]!;\n const parts = gridCell.map((text) =>\n typoPrintableString(typoSupport, text),\n );\n if (gridColumnIndex < gridRow.length - 1) {\n const length = gridCellLength(gridCell);\n const padding = \" \".repeat(gridWidths[gridColumnIndex]! - length);\n lineColumns.push(parts.join(\"\") + padding);\n } else {\n lineColumns.push(parts.join(\"\"));\n }\n }\n lines.push(lineColumns.join(delimiter));\n }\n return lines;\n}\n\nfunction gridCellLength(cell: GridCell): number {\n let length = 0;\n for (const text of cell) {\n length += text.value.length;\n }\n return length;\n}\n","import { ReaderTokenizer } from \"./Reader\";\nimport { Type, typeDecode } from \"./Type\";\n\nexport type Option<Value> = {\n generateUsage(): OptionUsage;\n prepareConsumer(readerTokenizer: ReaderTokenizer): OptionConsumer<Value>;\n};\n\nexport type OptionUsage = {\n description: string | undefined;\n long: Lowercase<string>; // TODO - better type for long option names ?\n short: string | undefined;\n label: Uppercase<string> | undefined;\n // TODO - default value for usage ? but it can be dynamic, so maybe not\n};\n\nexport type OptionConsumer<Value> = () => Value;\n\nexport function optionFlag(definition: {\n description?: string;\n long: Lowercase<string>;\n short?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n default?: () => boolean;\n}): Option<boolean> {\n return {\n generateUsage() {\n return {\n description: definition.description,\n long: definition.long,\n short: definition.short,\n label: undefined,\n };\n },\n prepareConsumer(readerTokenizer: ReaderTokenizer) {\n const key = definition.short\n ? `-${definition.short}, --${definition.long}`\n : `--${definition.long}`;\n const longs = [definition.long];\n if (definition.aliases?.longs) {\n longs.push(...definition.aliases?.longs);\n }\n const shorts = definition.short ? [definition.short] : [];\n if (definition.aliases?.shorts) {\n shorts.push(...definition.aliases?.shorts);\n }\n readerTokenizer.registerFlag({ key, longs, shorts });\n return () => {\n const value = readerTokenizer.consumeFlag(key);\n if (value === undefined) {\n return definition.default ? definition.default() : false;\n }\n return value;\n };\n },\n };\n}\n\n// TODO - option with comma-separated values, e.g. --names=alice,bob,charlie\n\nexport function optionRepeatable<Value>(definition: {\n description?: string;\n type: Type<Value>;\n long: Lowercase<string>;\n short?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n label?: Uppercase<string>;\n}): Option<Array<Value>> {\n const label = definition.label ?? definition.type.label;\n return {\n generateUsage() {\n // TODO - showcase that it can be repeated ?\n return {\n description: definition.description,\n long: definition.long,\n short: definition.short,\n label: `<${label}>` as Uppercase<string>,\n };\n },\n prepareConsumer(readerTokenizer: ReaderTokenizer) {\n const key = definition.short\n ? `-${definition.short}, --${definition.long}`\n : `--${definition.long}`;\n const longs = definition.long ? [definition.long] : [];\n if (definition.aliases?.longs) {\n longs.push(...definition.aliases?.longs);\n }\n const shorts = definition.short ? [definition.short] : [];\n if (definition.aliases?.shorts) {\n shorts.push(...definition.aliases?.shorts);\n }\n readerTokenizer.registerOption({ key, longs, shorts });\n return () => {\n return readerTokenizer\n .consumeOption(key)\n .map((value) =>\n typeDecode(definition.type, value, `${key}: ${label}`),\n );\n };\n },\n };\n}\n\nexport function optionSingleValue<Value>(definition: {\n description?: string;\n type: Type<Value>;\n long: Lowercase<string>;\n short?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n label?: Uppercase<string>;\n default: () => Value;\n}): Option<Value> {\n const label = definition.label ?? definition.type.label;\n return {\n generateUsage() {\n return {\n description: definition.description,\n long: definition.long,\n short: definition.short,\n label: `<${label}>` as Uppercase<string>,\n };\n },\n prepareConsumer(readerTokenizer: ReaderTokenizer) {\n const key = definition.short\n ? `-${definition.short}, --${definition.long}`\n : `--${definition.long}`;\n const longs = [definition.long];\n if (definition.aliases?.longs) {\n longs.push(...definition.aliases?.longs);\n }\n const shorts = definition.short ? [definition.short] : [];\n if (definition.aliases?.shorts) {\n shorts.push(...definition.aliases?.shorts);\n }\n readerTokenizer.registerOption({ key, longs, shorts });\n return () => {\n const values = readerTokenizer.consumeOption(key);\n if (values.length > 1) {\n throw new Error(\n `Multiple values provided for option: ${key}, expected only one`,\n );\n }\n const firstValue = values[0];\n if (firstValue === undefined) {\n return definition.default();\n }\n return typeDecode(definition.type, firstValue, `${key}: ${label}`);\n };\n },\n };\n}\n","export type ReaderPositionals = {\n consumePositional(): string | undefined;\n};\n\nexport class ReaderTokenizer {\n #parsedArgs: Array<string>;\n #parsedIndex: number;\n #parsedDouble: boolean;\n\n #flagKeyByShort: Map<string, string>;\n #flagKeyByLong: Map<string, string>;\n #flagInfoByKey: Map<string, {}>;\n #flagResultByKey: Map<string, boolean | null>;\n\n #optionKeyByShort: Map<string, string>;\n #optionKeyByLong: Map<string, string>;\n #optionInfoByKey: Map<string, {}>; // TODO - what dis for\n #optionResultByKey: Map<string, Array<string> | null>;\n\n constructor(args: Array<string>) {\n this.#parsedArgs = args;\n this.#parsedIndex = 0;\n this.#parsedDouble = false;\n\n // TODO - this seems like a good candidate for abstraction\n this.#flagKeyByShort = new Map();\n this.#flagKeyByLong = new Map();\n this.#flagInfoByKey = new Map();\n this.#flagResultByKey = new Map();\n\n this.#optionKeyByShort = new Map();\n this.#optionKeyByLong = new Map();\n this.#optionInfoByKey = new Map();\n this.#optionResultByKey = new Map();\n }\n\n registerFlag(definition: {\n key: string;\n shorts: Array<string>;\n longs: Array<string>;\n }) {\n this.#ensureUniqueKey(definition.key);\n this.#flagInfoByKey.set(definition.key, {});\n for (const short of definition.shorts) {\n this.#ensureUniqueName(short);\n this.#flagKeyByShort.set(short, definition.key);\n }\n for (const long of definition.longs) {\n this.#ensureUniqueName(long);\n this.#flagKeyByLong.set(long, definition.key);\n }\n }\n\n registerOption(definition: {\n key: string;\n shorts: Array<string>;\n longs: Array<string>;\n }) {\n this.#ensureUniqueKey(definition.key);\n this.#optionInfoByKey.set(definition.key, {});\n for (const short of definition.shorts) {\n this.#ensureUniqueName(short);\n this.#optionKeyByShort.set(short, definition.key);\n }\n for (const long of definition.longs) {\n this.#ensureUniqueName(long);\n this.#optionKeyByLong.set(long, definition.key);\n }\n }\n\n consumeFlag(key: string): boolean | undefined {\n const flagInfo = this.#flagInfoByKey.get(key);\n if (flagInfo === undefined) {\n throw new Error(`Flag not registered: ${key}`);\n }\n const result = this.#flagResultByKey.get(key);\n if (result === undefined) {\n this.#flagResultByKey.set(key, null);\n return undefined;\n }\n if (result === null) {\n throw new Error(`Flag already consumed: ${key}`);\n }\n this.#flagResultByKey.set(key, null);\n return result;\n }\n\n consumeOption(key: string): Array<string> {\n const optionInfo = this.#optionInfoByKey.get(key);\n if (optionInfo === undefined) {\n throw new Error(`Option not registered: ${key}`);\n }\n const result = this.#optionResultByKey.get(key);\n if (result === undefined) {\n this.#optionResultByKey.set(key, null);\n return new Array<string>();\n }\n if (result === null) {\n throw new Error(`Option already consumed: ${key}`);\n }\n this.#optionResultByKey.set(key, null);\n return result;\n }\n\n consumePositional(): string | undefined {\n while (true) {\n const arg = this.#consumeArg();\n if (arg === null) {\n return undefined;\n }\n const positional = this.#parseAsPositional(arg);\n if (positional !== null) {\n return positional;\n }\n }\n }\n\n #consumeArg(): string | null {\n const arg = this.#parsedArgs[this.#parsedIndex];\n if (arg === undefined) {\n return null;\n }\n this.#parsedIndex++;\n if (!this.#parsedDouble) {\n if (arg === \"--\") {\n this.#parsedDouble = true;\n return this.#consumeArg();\n }\n }\n return arg;\n }\n\n #consumeOptionValue(key: string) {\n const arg = this.#consumeArg();\n if (arg === null) {\n throw new Error(`Option ${key} requires a value but none was provided`);\n }\n if (this.#parsedDouble) {\n throw new Error(`Option ${key} requires a value before \"--\"`);\n }\n // TODO - is that weird, could a valid value start with dash ?\n if (arg.startsWith(\"-\")) {\n throw new Error(`Option ${key} requires a value, got: \"${arg}\"`);\n }\n return arg;\n }\n\n #parseAsPositional(arg: string): string | null {\n if (this.#parsedDouble) {\n return arg;\n }\n if (arg.startsWith(\"--\")) {\n const valueIndexStart = arg.indexOf(\"=\");\n if (valueIndexStart === -1) {\n this.#consumeOptionLong(arg.slice(2), null);\n } else {\n this.#consumeOptionLong(\n arg.slice(2, valueIndexStart),\n arg.slice(valueIndexStart + 1),\n );\n }\n return null;\n }\n if (arg.startsWith(\"-\")) {\n let shortIndexStart = 1;\n let shortIndexEnd = 2;\n while (shortIndexEnd <= arg.length) {\n const short = arg.slice(shortIndexStart, shortIndexEnd);\n const rest = arg.slice(shortIndexEnd);\n const result = this.#tryConsumeOptionShort(short, rest);\n if (result === true) {\n return null;\n }\n if (result === false) {\n shortIndexStart = shortIndexEnd;\n }\n shortIndexEnd++;\n }\n throw new Error(\n `Unknown flags or option: -${arg.slice(shortIndexStart)}`,\n );\n }\n return arg;\n }\n\n #consumeOptionLong(long: string, direct: string | null): void {\n const flagKey = this.#flagKeyByLong.get(long);\n if (flagKey !== undefined) {\n if (direct !== null) {\n const value = asBoolean(direct);\n if (value !== undefined) {\n return this.#acknowledgeFlag(flagKey, value);\n }\n throw new Error(`Invalid value for flag: --${long}: \"${direct}\"`);\n }\n return this.#acknowledgeFlag(flagKey, true);\n }\n const optionKey = this.#optionKeyByLong.get(long);\n if (optionKey !== undefined) {\n if (direct !== null) {\n return this.#acknowledgeOption(optionKey, direct);\n }\n return this.#acknowledgeOption(\n optionKey,\n this.#consumeOptionValue(`--${long}`),\n );\n }\n throw new Error(`Unknown long flag or option: --${long}`);\n }\n\n #tryConsumeOptionShort(short: string, rest: string): boolean | null {\n const flagKey = this.#flagKeyByShort.get(short);\n if (flagKey !== undefined) {\n if (rest.startsWith(\"=\")) {\n const value = asBoolean(rest.slice(1));\n if (value !== undefined) {\n this.#acknowledgeFlag(flagKey, value);\n return true;\n }\n throw new Error(`Invalid value for flag: -${short}: \"${rest}\"`);\n }\n this.#acknowledgeFlag(flagKey, true);\n return rest === \"\";\n }\n const optionKey = this.#optionKeyByShort.get(short);\n if (optionKey !== undefined) {\n if (rest === \"\") {\n this.#acknowledgeOption(\n optionKey,\n this.#consumeOptionValue(`-${short}`),\n );\n return true;\n }\n if (rest.startsWith(\"=\")) {\n this.#acknowledgeOption(optionKey, rest.slice(1));\n } else {\n this.#acknowledgeOption(optionKey, rest);\n }\n return true;\n }\n return null;\n }\n\n #acknowledgeFlag(key: string, value: boolean) {\n if (this.#flagResultByKey.has(key)) {\n throw new Error(`Flag already set: ${key}`);\n }\n this.#flagResultByKey.set(key, value);\n }\n\n #acknowledgeOption(key: string, value: string) {\n const values = this.#optionResultByKey.get(key) ?? new Array<string>();\n values.push(value);\n this.#optionResultByKey.set(key, values);\n }\n\n #ensureUniqueKey(key: string) {\n if (this.#flagInfoByKey.has(key)) {\n throw new Error(`Flag already registered: ${key}`);\n }\n if (this.#optionInfoByKey.has(key)) {\n throw new Error(`Option already registered: ${key}`);\n }\n }\n\n #ensureUniqueName(nameShortOrLong: string) {\n // TODO - overall better error handling\n // TODO - short flag overlap might be annoying here\n if (this.#flagKeyByShort.has(nameShortOrLong)) {\n throw new Error(`Flag already registered: -${nameShortOrLong}`);\n }\n if (this.#flagKeyByLong.has(nameShortOrLong)) {\n throw new Error(`Flag already registered: --${nameShortOrLong}`);\n }\n if (this.#optionKeyByShort.has(nameShortOrLong)) {\n throw new Error(`Option already registered: -${nameShortOrLong}`);\n }\n if (this.#optionKeyByLong.has(nameShortOrLong)) {\n throw new Error(`Option already registered: --${nameShortOrLong}`);\n }\n }\n}\n\nfunction asBoolean(value: string): boolean | undefined {\n const lower = value.toLowerCase();\n if (lower === \"true\" || lower === \"t\" || lower === \"y\" || lower === \"yes\") {\n return true;\n }\n if (lower === \"false\" || lower === \"f\" || lower === \"n\" || lower === \"no\") {\n return false;\n }\n return undefined;\n}\n","import { CommandUsage } from \"./Command\";\nimport { GridCell, GridRow, gridToPrintableLines } from \"./Grid\";\nimport { TypoSupport, TypoText, typoPrintableString } from \"./Typo\";\n\nexport function usageToPrintableLines(params: {\n cliName: Lowercase<string>;\n commandUsage: CommandUsage;\n typoSupport: TypoSupport;\n}) {\n const { cliName, commandUsage, typoSupport } = params;\n\n const lines = new Array<string>();\n\n lines.push(\n typoPrintableString(typoSupport, {\n value: commandUsage.description,\n bold: true,\n }),\n );\n if (commandUsage.details) {\n lines.push(\n typoPrintableString(typoSupport, {\n value: commandUsage.details,\n color: \"brightBlack\",\n }),\n );\n }\n\n lines.push(\"\");\n const breadcrumbs = [\n typoPrintableString(typoSupport, {\n value: \"Usage:\",\n color: \"brightMagenta\",\n bold: true,\n }),\n typoPrintableString(typoSupport, textFixed(cliName)),\n ].concat(\n commandUsage.breadcrumbs.map((breadcrumb) => {\n if (\"argument\" in breadcrumb) {\n return typoPrintableString(typoSupport, textInput(breadcrumb.argument));\n }\n if (\"command\" in breadcrumb) {\n return typoPrintableString(typoSupport, textFixed(breadcrumb.command));\n }\n throw new Error(`Unknown breadcrumb: ${JSON.stringify(breadcrumb)}`);\n }),\n );\n lines.push(breadcrumbs.join(\" \"));\n\n if (commandUsage.arguments.length > 0) {\n lines.push(\"\");\n lines.push(typoPrintableString(typoSupport, textBlockTitle(\"Arguments:\")));\n const grid = new Array<GridRow>();\n for (const argumentUsage of commandUsage.arguments) {\n const gridRow = new Array<GridCell>();\n gridRow.push([textDelimiter()]);\n gridRow.push([textInput(argumentUsage.label)]);\n if (argumentUsage.description) {\n gridRow.push([textDelimiter()]);\n gridRow.push([textDescription(argumentUsage.description)]);\n }\n grid.push(gridRow);\n }\n lines.push(...gridToPrintableLines(grid, typoSupport));\n }\n\n if (commandUsage.subcommands.length > 0) {\n lines.push(\"\");\n lines.push(\n typoPrintableString(typoSupport, textBlockTitle(\"Subcommands:\")),\n );\n const grid = new Array<GridRow>();\n for (const subcommand of commandUsage.subcommands) {\n const gridRow = new Array<GridCell>();\n gridRow.push([textDelimiter()]);\n gridRow.push([textFixed(subcommand.name)]);\n if (subcommand.description) {\n gridRow.push([textDelimiter()]);\n gridRow.push([textDescription(subcommand.description)]);\n }\n grid.push(gridRow);\n }\n lines.push(...gridToPrintableLines(grid, typoSupport));\n }\n\n if (commandUsage.options.length > 0) {\n lines.push(\"\");\n lines.push(typoPrintableString(typoSupport, textBlockTitle(\"Options:\")));\n const grid = new Array<GridRow>();\n for (const optionUsage of commandUsage.options) {\n const gridRow = new Array<GridCell>();\n gridRow.push([textDelimiter()]);\n if (optionUsage.short) {\n gridRow.push([textFixed(`-${optionUsage.short}`), { value: \", \" }]);\n } else {\n gridRow.push([]);\n }\n if (optionUsage.label) {\n gridRow.push([\n textFixed(`--${optionUsage.long} `),\n textInput(optionUsage.label),\n ]);\n } else {\n gridRow.push([textFixed(`--${optionUsage.long}`)]);\n }\n if (optionUsage.description) {\n gridRow.push([textDelimiter()]);\n gridRow.push([textDescription(optionUsage.description)]);\n }\n grid.push(gridRow);\n }\n lines.push(...gridToPrintableLines(grid, typoSupport));\n }\n\n lines.push(\"\");\n return lines;\n}\n\nfunction textBlockTitle(text: string): TypoText {\n return { value: text, color: \"brightGreen\", bold: true };\n}\n\nfunction textDescription(text: string): TypoText {\n return { value: text };\n}\n\nfunction textFixed(text: string): TypoText {\n return { value: text, color: \"brightCyan\", bold: true };\n}\n\nfunction textInput(text: string): TypoText {\n return { value: text, color: \"brightBlue\" };\n}\n\nfunction textDelimiter(): TypoText {\n return { value: \" \" };\n}\n","import { Command, CommandInterpreter } from \"./Command\";\nimport { ReaderTokenizer } from \"./Reader\";\nimport {\n typoInferProcessSupport,\n typoPrintableString,\n TypoSupport,\n} from \"./Typo\";\nimport { usageToPrintableLines } from \"./Usage\";\n\n// TODO - add unit tests for this\n\nexport async function runAndExit<Context>(\n cliName: Lowercase<string>,\n cliArgs: Array<string>,\n context: Context,\n command: Command<Context, void>,\n application?: {\n usageOnError?: boolean | undefined;\n usageOnHelp?: boolean | undefined;\n buildVersion?: string | undefined;\n useColors?: boolean | undefined;\n onLogStdOut?: ((message: string) => void) | undefined;\n onLogStdErr?: ((message: string) => void) | undefined;\n onExit?: ((code: number) => never) | undefined;\n onError?: ((error: unknown) => void) | undefined;\n },\n): Promise<never> {\n const readerTokenizer = new ReaderTokenizer(cliArgs);\n if (application?.buildVersion) {\n readerTokenizer.registerFlag({\n key: \"version\",\n shorts: [],\n longs: [\"version\"],\n });\n }\n if (application?.usageOnHelp ?? true) {\n readerTokenizer.registerFlag({\n key: \"help\",\n shorts: [],\n longs: [\"help\"],\n });\n }\n /*\n // TODO - handle completions ?\n readerTokenizer.registerFlag({\n key: \"completion\",\n shorts: [],\n longs: [\"completion\"],\n });\n */\n const commandInterpreter = command.buildInterpreter(readerTokenizer);\n if (application?.buildVersion) {\n if (readerTokenizer.consumeFlag(\"version\")) {\n (application?.onLogStdOut ?? console.log)(\n [cliName, application.buildVersion].join(\" \"),\n );\n return (application?.onExit ?? process.exit)(0);\n }\n }\n if (application?.usageOnHelp ?? true) {\n if (readerTokenizer.consumeFlag(\"help\")) {\n (application?.onLogStdOut ?? console.log)(\n computeUsageString(cliName, commandInterpreter, application?.useColors),\n );\n return (application?.onExit ?? process.exit)(0);\n }\n }\n try {\n await commandInterpreter.execute(context);\n return (application?.onExit ?? process.exit)(0);\n } catch (error) {\n if (application?.usageOnError ?? true) {\n (application?.onLogStdErr ?? console.error)(\n computeUsageString(cliName, commandInterpreter, application?.useColors),\n );\n }\n if (application?.onError) {\n application.onError(error);\n } else {\n const typoSupport = chooseTypoSupport(application?.useColors);\n (application?.onLogStdErr ?? console.error)(\n [\n typoPrintableString(typoSupport, {\n value: \"Error:\",\n color: \"brightRed\",\n bold: true,\n }),\n typoPrintableString(typoSupport, {\n value: error instanceof Error ? error.message : String(error),\n bold: true,\n }),\n ].join(\" \"),\n );\n }\n return (application?.onExit ?? process.exit)(1);\n }\n}\n\nfunction computeUsageString<Context, Result>(\n cliName: Lowercase<string>,\n commandInterpreter: CommandInterpreter<Context, Result>,\n useColors: boolean | undefined,\n) {\n return usageToPrintableLines({\n cliName,\n commandUsage: commandInterpreter.computeUsage(),\n typoSupport: chooseTypoSupport(useColors),\n }).join(\"\\n\");\n}\n\nfunction chooseTypoSupport(useColors?: boolean): TypoSupport {\n if (useColors === undefined) {\n return typoInferProcessSupport();\n }\n return useColors ? \"tty\" : \"none\";\n}\n"],"mappings":"+2BAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,qBAAAE,EAAA,qBAAAC,GAAA,qBAAAC,GAAA,sBAAAC,GAAA,YAAAC,GAAA,2BAAAC,GAAA,cAAAC,GAAA,yBAAAC,EAAA,eAAAC,GAAA,qBAAAC,GAAA,sBAAAC,GAAA,eAAAC,GAAA,eAAAC,GAAA,gBAAAC,GAAA,kBAAAC,GAAA,mBAAAC,GAAA,aAAAC,GAAA,eAAAC,EAAA,eAAAC,GAAA,eAAAC,GAAA,4BAAAC,EAAA,wBAAAC,EAAA,0BAAAC,IAAA,eAAAC,GAAAzB,ICKO,IAAM0B,GAA6B,CACxC,MAAO,UACP,QAAQC,EAAe,CACrB,GAAIA,IAAU,OACZ,MAAO,GAET,GAAIA,IAAU,QACZ,MAAO,GAET,MAAM,IAAI,MAAM,oBAAoBA,CAAK,EAAE,CAC7C,CACF,EAEaC,GAAuB,CAClC,MAAO,OACP,QAAQD,EAAe,CACrB,IAAME,EAAY,KAAK,MAAMF,CAAK,EAClC,GAAI,MAAME,CAAS,EACjB,MAAM,IAAI,MAAM,iBAAiBF,CAAK,EAAE,EAE1C,OAAO,IAAI,KAAKE,CAAS,CAC3B,CACF,EAEaC,GAA2B,CACtC,MAAO,SACP,QAAQH,EAAe,CACrB,OAAOA,CACT,CACF,EAEaI,GAA2B,CACtC,MAAO,SACP,QAAQJ,EAAe,CACrB,OAAO,OAAOA,CAAK,CACrB,CACF,EAEaK,GAA2B,CACtC,MAAO,SACP,QAAQL,EAAe,CACrB,OAAO,OAAOA,CAAK,CACrB,CACF,EAEO,SAASM,GAEdC,EAEiB,CACjB,MAAO,CACL,MAAOA,EACJ,IAAKC,GAAgBA,EAAY,KAAK,EACtC,KAAK,GAAG,EACX,QAAQR,EAAe,CACrB,IAAMS,EAAQT,EAAM,MAAM,IAAKO,EAAa,MAAM,EAClD,GAAIE,EAAM,SAAWF,EAAa,OAChC,MAAM,IAAI,MACR,yBAAyBP,CAAK,eAAeO,EAAa,MAAM,wBAClE,EAEF,OAAOE,EAAM,IAAI,CAACC,EAAMC,IACtBC,EACEL,EAAaI,CAAK,EAClBD,EACA,IAAIC,CAAK,KAAKJ,EAAaI,CAAK,EAAG,KAAK,EAC1C,CACF,CACF,CACF,CACF,CAEO,SAASE,GACdL,EACoB,CACpB,MAAO,CACL,MACE,GAAGA,EAAY,KAAK,KAAKA,EAAY,KAAK,OAC5C,QAAQR,EAAe,CACrB,OAAOA,EACJ,MAAM,GAAG,EACT,IAAI,CAACU,EAAMC,IACVC,EAAWJ,EAAaE,EAAM,IAAIC,CAAK,KAAKH,EAAY,KAAK,EAAE,CACjE,CACJ,CACF,CACF,CAEO,SAASI,EACdE,EACAd,EACAe,EACO,CACP,GAAI,CACF,OAAOD,EAAK,QAAQd,CAAK,CAC3B,OAASgB,EAAO,CACd,MAAM,IAAI,MACR,2BAA2BhB,CAAK,SAASe,CAAO,KAC9CC,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,CACvD,EACF,CACF,CACF,CC9FO,SAASC,GAAwBC,EAIpB,CAClB,IAAMC,EAAQD,EAAW,OAASA,EAAW,KAAK,MAClD,MAAO,CACL,eAAgB,CACd,MAAO,CACL,YAAaA,EAAW,YACxB,MAAO,IAAIC,CAAK,GAClB,CACF,EACA,aAAaC,EAAsC,CACjD,IAAMC,EAAaD,EAAkB,kBAAkB,EACvD,GAAIC,IAAe,OACjB,MAAM,IAAI,MAAM,8BAA8BF,CAAK,EAAE,EAEvD,OAAOG,EAAWJ,EAAW,KAAMG,EAAYF,CAAK,CACtD,CACF,CACF,CAEO,SAASI,GAAwBL,EAKpB,CAClB,IAAMC,EAAQD,EAAW,OAASA,EAAW,KAAK,MAClD,MAAO,CACL,eAAgB,CACd,MAAO,CACL,YAAaA,EAAW,YACxB,MAAO,IAAIC,CAAK,GAClB,CACF,EACA,aAAaC,EAAsC,CACjD,IAAMC,EAAaD,EAAkB,kBAAkB,EACvD,OAAIC,IAAe,OACVH,EAAW,QAAQ,EAErBI,EAAWJ,EAAW,KAAMG,EAAYF,CAAK,CACtD,CACF,CACF,CAEO,SAASK,GAAyBN,EAKd,CACzB,IAAMC,EAAQD,EAAW,OAASA,EAAW,KAAK,MAClD,MAAO,CACL,eAAgB,CACd,MAAO,CACL,YAAaA,EAAW,YACxB,MACE,IAAIC,CAAK,QACRD,EAAW,aACR,cAAcA,EAAW,YAAY,IACrC,GACR,CACF,EACA,aAAaE,EAAsC,CACjD,IAAMK,EAAuB,CAAC,EAC9B,OAAa,CACX,IAAMJ,EAAaD,EAAkB,kBAAkB,EACvD,GACEC,IAAe,QACfA,IAAeH,EAAW,aAE1B,MAEFO,EAAO,KAAKH,EAAWJ,EAAW,KAAMG,EAAYF,CAAK,CAAC,CAC5D,CACA,OAAOM,CACT,CACF,CACF,CC3DO,SAASC,GACdC,EACAC,EAC0B,CAC1B,MAAO,CACL,gBAAiB,CACf,OAAOD,EAAS,WAClB,EACA,iBAAiBE,EAAkC,CACjD,SAASC,GAA6B,CACpC,IAAMC,EAAiBH,EAAU,aAAa,EAC9C,MAAO,CACL,YAAaG,EAAe,UAAU,IAAKC,GACzCC,EAAmBD,EAAS,KAAK,CACnC,EACA,YAAaL,EAAS,YACtB,QAASA,EAAS,QAClB,QAASI,EAAe,QACxB,UAAWA,EAAe,UAC1B,YAAa,CAAC,CAChB,CACF,CACA,GAAI,CACF,IAAMG,EAAoBN,EAAU,eAAeC,CAAe,EAC5DM,EAAiBN,EAAgB,kBAAkB,EACzD,GAAIM,IAAmB,OACrB,MAAM,MAAM,yBAAyBA,CAAc,GAAG,EAExD,IAAMC,EAAoBF,EAAkB,EAC5C,MAAO,CACL,aAAAJ,EACA,MAAM,QAAQO,EAAkB,CAC9B,OAAO,MAAMD,EAAkBC,CAAO,CACxC,CACF,CACF,OAASC,EAAO,CACd,MAAO,CACL,aAAAR,EACA,MAAM,QAAQS,EAAmB,CAC/B,MAAMD,CACR,CACF,CACF,CACF,CACF,CACF,CAEO,SAASE,GACdb,EACAC,EACAa,EAC0B,CAC1B,MAAO,CACL,gBAAiB,CACf,OAAOd,EAAS,WAClB,EACA,iBAAiBE,EAAkC,CACjD,GAAI,CACF,IAAMK,EAAoBN,EAAU,eAAeC,CAAe,EAC5Da,EAAiBb,EAAgB,kBAAkB,EACzD,GAAIa,IAAmB,OACrB,MAAM,IAAI,MAAM,sCAAsC,EAExD,IAAMC,EACJF,EAAYC,CAAmC,EACjD,GAAIC,IAAoB,OACtB,MAAM,IAAI,MAAM,6BAA6BD,CAAc,GAAG,EAEhE,IAAME,EACJD,EAAgB,iBAAiBd,CAAe,EAC5CO,EAAoBF,EAAkB,EAC5C,MAAO,CACL,cAAe,CACb,IAAMH,EAAiBH,EAAU,aAAa,EACxCiB,EAAkBD,EAAsB,aAAa,EAC3D,MAAO,CACL,YAAab,EAAe,UACzB,IAAKC,GAAaC,EAAmBD,EAAS,KAAK,CAAC,EACpD,OAAO,CAACc,EAAkBJ,CAAc,CAAC,CAAC,EAC1C,OAAOG,EAAgB,WAAW,EACrC,YAAaA,EAAgB,YAC7B,QAASA,EAAgB,QACzB,QAASd,EAAe,QAAQ,OAAOc,EAAgB,OAAO,EAC9D,UAAWd,EAAe,UAAU,OAClCc,EAAgB,SAClB,EACA,YAAaA,EAAgB,WAC/B,CACF,EACA,MAAM,QAAQR,EAAkB,CAC9B,IAAMU,EAAU,MAAMX,EAAkBC,CAAO,EAC/C,OAAO,MAAMO,EAAsB,QAAQG,CAAO,CACpD,CACF,CACF,OAAST,EAAO,CACd,MAAO,CACL,cAAe,CACb,IAAMP,EAAiBH,EAAU,aAAa,EAC9C,MAAO,CACL,YAAaG,EAAe,UACzB,IAAKC,GAAaC,EAAmBD,EAAS,KAAK,CAAC,EACpD,OAAO,CAACc,EAAkB,cAAc,CAAC,CAAC,EAC7C,YAAanB,EAAS,YACtB,QAASA,EAAS,QAClB,QAASI,EAAe,QACxB,UAAWA,EAAe,UAC1B,YAAa,OAAO,QAAQU,CAAW,EAAE,IACvC,CAAC,CAACO,EAAMC,CAAU,KAAO,CACvB,KAAAD,EACA,YAAaC,EAAW,eAAe,CACzC,EACF,CACF,CACF,EACA,MAAM,QAAQV,EAAmB,CAC/B,MAAMD,CACR,CACF,CACF,CACF,CACF,CACF,CAEA,SAASL,EAAmBiB,EAAuC,CACjE,MAAO,CAAE,SAAUA,CAAM,CAC3B,CAEA,SAASJ,EAAkBI,EAAuC,CAChE,MAAO,CAAE,QAASA,CAAM,CAC1B,CC1IO,SAASC,GAMdC,EAIAC,EAO4B,CAC5B,MAAO,CACL,cAAe,CACb,IAAMC,EAAe,IAAI,MACzB,QAAWC,KAAaH,EAAO,QAAS,CACtC,IAAMI,EAAcJ,EAAO,QAAQG,CAAS,EAC5CD,EAAa,KAAKE,EAAY,cAAc,CAAC,CAC/C,CACA,IAAMC,EAAiB,IAAI,MAC3B,QAAWC,KAAiBN,EAAO,UACjCK,EAAe,KAAKC,EAAc,cAAc,CAAC,EAEnD,MAAO,CAAE,QAASJ,EAAc,UAAWG,CAAe,CAC5D,EACA,eAAeE,EAAkC,CAC/C,IAAMC,EAAwB,CAAC,EAC/B,QAAWL,KAAaH,EAAO,QAAS,CACtC,IAAMI,EAAcJ,EAAO,QAAQG,CAAS,EAC5CK,EAAiBL,CAAS,EACxBC,EAAY,gBAAgBG,CAAe,CAC/C,CACA,IAAME,EAAuB,CAAC,EAC9B,QAAWH,KAAiBN,EAAO,UACjCS,EAAgB,KAAKH,EAAc,aAAaC,CAAe,CAAC,EAElE,MAAO,IAAM,CACX,IAAMG,EAAqB,CAAC,EAC5B,QAAWP,KAAaK,EACtBE,EAAcP,CAAS,EAAIK,EAAiBL,CAAS,EAAG,EAE1D,MAAO,OAAOQ,GACL,MAAMV,EAAQU,EAAS,CAC5B,QAASD,EACT,UAAWD,CACb,CAAC,CAEL,CACF,CACF,CACF,CCzEO,SAASG,EACdC,EACAC,EACQ,CACR,GAAID,IAAgB,OAClB,OAAOC,EAAS,MAElB,GAAID,IAAgB,MAAO,CACzB,IAAME,EAAiBD,EAAS,MAAQE,GAAWF,EAAS,KAAK,EAAI,GAC/DG,EAAgBH,EAAS,KAAOI,GAAW,GACjD,MAAO,GAAGH,CAAc,GAAGE,CAAa,GAAGH,EAAS,KAAK,GAAGK,EAAS,EACvE,CACA,GAAIN,IAAgB,OAAQ,CAC1B,IAAMO,EAAgBN,EAAS,MAC3B,uBAAuBA,EAAS,KAAK,KACrC,GACEO,EAAcP,EAAS,MAAQ,UAAY,GAC3CQ,EAAeR,EAAS,KAAO,MAAQ,GACvCS,EAAaT,EAAS,KAAO,OAAS,GAC5C,MAAO,GAAGM,CAAa,GAAGE,CAAY,GAAGR,EAAS,KAAK,GAAGS,CAAU,GAAGF,CAAW,EACpF,CACA,GAAIR,IAAgB,OAClB,OAAIC,EAAS,OAASA,EAAS,KACtB,IAAIA,EAAS,KAAK,KAAKA,EAAS,KAAK,IAE1CA,EAAS,MACJ,IAAIA,EAAS,KAAK,KAAKA,EAAS,KAAK,GAE1CA,EAAS,KACJ,IAAIA,EAAS,KAAK,KAEpB,IAAIA,EAAS,KAAK,IAE3B,MAAM,IAAI,MAAM,yBAAyBD,CAAW,EAAE,CACxD,CAEO,SAASW,GAAuC,CACrD,GAAI,CAAC,QACH,MAAO,OAET,GAAI,QAAQ,IAAK,CACf,GAAI,QAAQ,IAAI,cAAmB,IACjC,MAAO,OAET,GAAI,QAAQ,IAAI,YACd,MAAO,MAET,GAAI,aAAc,QAAQ,IACxB,MAAO,MAEX,CACA,MAAI,CAAC,QAAQ,QAAU,CAAC,QAAQ,OAAO,MAC9B,OAEF,KACT,CAEA,IAAML,GAAY,UACZD,GAAW,UACXF,GAAa,CACjB,UAAW,WACX,QAAS,WACT,UAAW,WACX,WAAY,WACZ,SAAU,WACV,YAAa,WACb,SAAU,WACV,UAAW,WACX,YAAa,WACb,UAAW,WACX,YAAa,WACb,aAAc,WACd,WAAY,WACZ,cAAe,WACf,WAAY,WACZ,YAAa,UACf,EC9EO,SAASS,EACdC,EACAC,EACAC,EAAoB,GACL,CACf,IAAMC,EAAQ,IAAI,MACZC,EAAa,IAAI,MACvB,QAAWC,KAAWL,EACpB,QACMM,EAAkB,EACtBA,EAAkBD,EAAQ,OAC1BC,IACA,CACA,IAAMC,EAAWF,EAAQC,CAAe,EAClCE,EAASC,EAAeF,CAAQ,GAEpCH,EAAWE,CAAe,IAAM,QAChCE,EAASJ,EAAWE,CAAe,KAEnCF,EAAWE,CAAe,EAAIE,EAElC,CAEF,QAAWH,KAAWL,EAAM,CAC1B,IAAMU,EAAc,IAAI,MACxB,QACMJ,EAAkB,EACtBA,EAAkBD,EAAQ,OAC1BC,IACA,CACA,IAAMC,EAAWF,EAAQC,CAAe,EAClCK,EAAQJ,EAAS,IAAKK,GAC1BC,EAAoBZ,EAAaW,CAAI,CACvC,EACA,GAAIN,EAAkBD,EAAQ,OAAS,EAAG,CACxC,IAAMG,EAASC,EAAeF,CAAQ,EAChCO,EAAU,IAAI,OAAOV,EAAWE,CAAe,EAAKE,CAAM,EAChEE,EAAY,KAAKC,EAAM,KAAK,EAAE,EAAIG,CAAO,CAC3C,MACEJ,EAAY,KAAKC,EAAM,KAAK,EAAE,CAAC,CAEnC,CACAR,EAAM,KAAKO,EAAY,KAAKR,CAAS,CAAC,CACxC,CACA,OAAOC,CACT,CAEA,SAASM,EAAeM,EAAwB,CAC9C,IAAIP,EAAS,EACb,QAAWI,KAAQG,EACjBP,GAAUI,EAAK,MAAM,OAEvB,OAAOJ,CACT,CCzCO,SAASQ,GAAWC,EAMP,CAClB,MAAO,CACL,eAAgB,CACd,MAAO,CACL,YAAaA,EAAW,YACxB,KAAMA,EAAW,KACjB,MAAOA,EAAW,MAClB,MAAO,MACT,CACF,EACA,gBAAgBC,EAAkC,CAChD,IAAMC,EAAMF,EAAW,MACnB,IAAIA,EAAW,KAAK,OAAOA,EAAW,IAAI,GAC1C,KAAKA,EAAW,IAAI,GAClBG,EAAQ,CAACH,EAAW,IAAI,EAC1BA,EAAW,SAAS,OACtBG,EAAM,KAAK,GAAGH,EAAW,SAAS,KAAK,EAEzC,IAAMI,EAASJ,EAAW,MAAQ,CAACA,EAAW,KAAK,EAAI,CAAC,EACxD,OAAIA,EAAW,SAAS,QACtBI,EAAO,KAAK,GAAGJ,EAAW,SAAS,MAAM,EAE3CC,EAAgB,aAAa,CAAE,IAAAC,EAAK,MAAAC,EAAO,OAAAC,CAAO,CAAC,EAC5C,IAAM,CACX,IAAMC,EAAQJ,EAAgB,YAAYC,CAAG,EAC7C,OAAIG,IAAU,OACLL,EAAW,QAAUA,EAAW,QAAQ,EAAI,GAE9CK,CACT,CACF,CACF,CACF,CAIO,SAASC,GAAwBN,EAOf,CACvB,IAAMO,EAAQP,EAAW,OAASA,EAAW,KAAK,MAClD,MAAO,CACL,eAAgB,CAEd,MAAO,CACL,YAAaA,EAAW,YACxB,KAAMA,EAAW,KACjB,MAAOA,EAAW,MAClB,MAAO,IAAIO,CAAK,GAClB,CACF,EACA,gBAAgBN,EAAkC,CAChD,IAAMC,EAAMF,EAAW,MACnB,IAAIA,EAAW,KAAK,OAAOA,EAAW,IAAI,GAC1C,KAAKA,EAAW,IAAI,GAClBG,EAAQH,EAAW,KAAO,CAACA,EAAW,IAAI,EAAI,CAAC,EACjDA,EAAW,SAAS,OACtBG,EAAM,KAAK,GAAGH,EAAW,SAAS,KAAK,EAEzC,IAAMI,EAASJ,EAAW,MAAQ,CAACA,EAAW,KAAK,EAAI,CAAC,EACxD,OAAIA,EAAW,SAAS,QACtBI,EAAO,KAAK,GAAGJ,EAAW,SAAS,MAAM,EAE3CC,EAAgB,eAAe,CAAE,IAAAC,EAAK,MAAAC,EAAO,OAAAC,CAAO,CAAC,EAC9C,IACEH,EACJ,cAAcC,CAAG,EACjB,IAAKG,GACJG,EAAWR,EAAW,KAAMK,EAAO,GAAGH,CAAG,KAAKK,CAAK,EAAE,CACvD,CAEN,CACF,CACF,CAEO,SAASE,GAAyBT,EAQvB,CAChB,IAAMO,EAAQP,EAAW,OAASA,EAAW,KAAK,MAClD,MAAO,CACL,eAAgB,CACd,MAAO,CACL,YAAaA,EAAW,YACxB,KAAMA,EAAW,KACjB,MAAOA,EAAW,MAClB,MAAO,IAAIO,CAAK,GAClB,CACF,EACA,gBAAgBN,EAAkC,CAChD,IAAMC,EAAMF,EAAW,MACnB,IAAIA,EAAW,KAAK,OAAOA,EAAW,IAAI,GAC1C,KAAKA,EAAW,IAAI,GAClBG,EAAQ,CAACH,EAAW,IAAI,EAC1BA,EAAW,SAAS,OACtBG,EAAM,KAAK,GAAGH,EAAW,SAAS,KAAK,EAEzC,IAAMI,EAASJ,EAAW,MAAQ,CAACA,EAAW,KAAK,EAAI,CAAC,EACxD,OAAIA,EAAW,SAAS,QACtBI,EAAO,KAAK,GAAGJ,EAAW,SAAS,MAAM,EAE3CC,EAAgB,eAAe,CAAE,IAAAC,EAAK,MAAAC,EAAO,OAAAC,CAAO,CAAC,EAC9C,IAAM,CACX,IAAMM,EAAST,EAAgB,cAAcC,CAAG,EAChD,GAAIQ,EAAO,OAAS,EAClB,MAAM,IAAI,MACR,wCAAwCR,CAAG,qBAC7C,EAEF,IAAMS,EAAaD,EAAO,CAAC,EAC3B,OAAIC,IAAe,OACVX,EAAW,QAAQ,EAErBQ,EAAWR,EAAW,KAAMW,EAAY,GAAGT,CAAG,KAAKK,CAAK,EAAE,CACnE,CACF,CACF,CACF,CCtJA,IAAAK,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,GAAAC,EAAAC,GAAAC,EAAAC,EAAAC,EAAAC,EAIaC,EAAN,KAAsB,CAe3B,YAAYC,EAAqB,CAf5BC,EAAA,KAAAZ,GACLY,EAAA,KAAAvB,GACAuB,EAAA,KAAAtB,GACAsB,EAAA,KAAArB,GAEAqB,EAAA,KAAApB,GACAoB,EAAA,KAAAnB,GACAmB,EAAA,KAAAlB,GACAkB,EAAA,KAAAjB,GAEAiB,EAAA,KAAAhB,GACAgB,EAAA,KAAAf,GACAe,EAAA,KAAAd,GACAc,EAAA,KAAAb,GAGEc,EAAA,KAAKxB,EAAcsB,GACnBE,EAAA,KAAKvB,EAAe,GACpBuB,EAAA,KAAKtB,EAAgB,IAGrBsB,EAAA,KAAKrB,EAAkB,IAAI,KAC3BqB,EAAA,KAAKpB,EAAiB,IAAI,KAC1BoB,EAAA,KAAKnB,EAAiB,IAAI,KAC1BmB,EAAA,KAAKlB,EAAmB,IAAI,KAE5BkB,EAAA,KAAKjB,EAAoB,IAAI,KAC7BiB,EAAA,KAAKhB,EAAmB,IAAI,KAC5BgB,EAAA,KAAKf,EAAmB,IAAI,KAC5Be,EAAA,KAAKd,EAAqB,IAAI,IAChC,CAEA,aAAae,EAIV,CACDC,EAAA,KAAKf,EAAAQ,GAAL,UAAsBM,EAAW,KACjCE,EAAA,KAAKtB,GAAe,IAAIoB,EAAW,IAAK,CAAC,CAAC,EAC1C,QAAWG,KAASH,EAAW,OAC7BC,EAAA,KAAKf,EAAAS,GAAL,UAAuBQ,GACvBD,EAAA,KAAKxB,GAAgB,IAAIyB,EAAOH,EAAW,GAAG,EAEhD,QAAWI,KAAQJ,EAAW,MAC5BC,EAAA,KAAKf,EAAAS,GAAL,UAAuBS,GACvBF,EAAA,KAAKvB,GAAe,IAAIyB,EAAMJ,EAAW,GAAG,CAEhD,CAEA,eAAeA,EAIZ,CACDC,EAAA,KAAKf,EAAAQ,GAAL,UAAsBM,EAAW,KACjCE,EAAA,KAAKlB,GAAiB,IAAIgB,EAAW,IAAK,CAAC,CAAC,EAC5C,QAAWG,KAASH,EAAW,OAC7BC,EAAA,KAAKf,EAAAS,GAAL,UAAuBQ,GACvBD,EAAA,KAAKpB,GAAkB,IAAIqB,EAAOH,EAAW,GAAG,EAElD,QAAWI,KAAQJ,EAAW,MAC5BC,EAAA,KAAKf,EAAAS,GAAL,UAAuBS,GACvBF,EAAA,KAAKnB,GAAiB,IAAIqB,EAAMJ,EAAW,GAAG,CAElD,CAEA,YAAYK,EAAkC,CAE5C,GADiBH,EAAA,KAAKtB,GAAe,IAAIyB,CAAG,IAC3B,OACf,MAAM,IAAI,MAAM,wBAAwBA,CAAG,EAAE,EAE/C,IAAMC,EAASJ,EAAA,KAAKrB,GAAiB,IAAIwB,CAAG,EAC5C,GAAIC,IAAW,OAAW,CACxBJ,EAAA,KAAKrB,GAAiB,IAAIwB,EAAK,IAAI,EACnC,MACF,CACA,GAAIC,IAAW,KACb,MAAM,IAAI,MAAM,0BAA0BD,CAAG,EAAE,EAEjD,OAAAH,EAAA,KAAKrB,GAAiB,IAAIwB,EAAK,IAAI,EAC5BC,CACT,CAEA,cAAcD,EAA4B,CAExC,GADmBH,EAAA,KAAKlB,GAAiB,IAAIqB,CAAG,IAC7B,OACjB,MAAM,IAAI,MAAM,0BAA0BA,CAAG,EAAE,EAEjD,IAAMC,EAASJ,EAAA,KAAKjB,GAAmB,IAAIoB,CAAG,EAC9C,GAAIC,IAAW,OACb,OAAAJ,EAAA,KAAKjB,GAAmB,IAAIoB,EAAK,IAAI,EAC9B,IAAI,MAEb,GAAIC,IAAW,KACb,MAAM,IAAI,MAAM,4BAA4BD,CAAG,EAAE,EAEnD,OAAAH,EAAA,KAAKjB,GAAmB,IAAIoB,EAAK,IAAI,EAC9BC,CACT,CAEA,mBAAwC,CACtC,OAAa,CACX,IAAMC,EAAMN,EAAA,KAAKf,EAAAC,GAAL,WACZ,GAAIoB,IAAQ,KACV,OAEF,IAAMC,EAAaP,EAAA,KAAKf,EAAAG,IAAL,UAAwBkB,GAC3C,GAAIC,IAAe,KACjB,OAAOA,CAEX,CACF,CAsKF,EApREjC,EAAA,YACAC,EAAA,YACAC,EAAA,YAEAC,EAAA,YACAC,EAAA,YACAC,EAAA,YACAC,EAAA,YAEAC,EAAA,YACAC,EAAA,YACAC,EAAA,YACAC,EAAA,YAbKC,EAAA,YAiHLC,EAAW,UAAkB,CAC3B,IAAMoB,EAAML,EAAA,KAAK3B,GAAY2B,EAAA,KAAK1B,EAAY,EAC9C,OAAI+B,IAAQ,OACH,MAETE,EAAA,KAAKjC,GAAL,IACI,CAAC0B,EAAA,KAAKzB,IACJ8B,IAAQ,MACVR,EAAA,KAAKtB,EAAgB,IACdwB,EAAA,KAAKf,EAAAC,GAAL,YAGJoB,EACT,EAEAnB,EAAmB,SAACiB,EAAa,CAC/B,IAAME,EAAMN,EAAA,KAAKf,EAAAC,GAAL,WACZ,GAAIoB,IAAQ,KACV,MAAM,IAAI,MAAM,UAAUF,CAAG,yCAAyC,EAExE,GAAIH,EAAA,KAAKzB,GACP,MAAM,IAAI,MAAM,UAAU4B,CAAG,+BAA+B,EAG9D,GAAIE,EAAI,WAAW,GAAG,EACpB,MAAM,IAAI,MAAM,UAAUF,CAAG,4BAA4BE,CAAG,GAAG,EAEjE,OAAOA,CACT,EAEAlB,GAAkB,SAACkB,EAA4B,CAC7C,GAAIL,EAAA,KAAKzB,GACP,OAAO8B,EAET,GAAIA,EAAI,WAAW,IAAI,EAAG,CACxB,IAAMG,EAAkBH,EAAI,QAAQ,GAAG,EACvC,OAAIG,IAAoB,GACtBT,EAAA,KAAKf,EAAAI,GAAL,UAAwBiB,EAAI,MAAM,CAAC,EAAG,MAEtCN,EAAA,KAAKf,EAAAI,GAAL,UACEiB,EAAI,MAAM,EAAGG,CAAe,EAC5BH,EAAI,MAAMG,EAAkB,CAAC,GAG1B,IACT,CACA,GAAIH,EAAI,WAAW,GAAG,EAAG,CACvB,IAAII,EAAkB,EAClBC,EAAgB,EACpB,KAAOA,GAAiBL,EAAI,QAAQ,CAClC,IAAMJ,EAAQI,EAAI,MAAMI,EAAiBC,CAAa,EAChDC,EAAON,EAAI,MAAMK,CAAa,EAC9BN,EAASL,EAAA,KAAKf,EAAAK,IAAL,UAA4BY,EAAOU,GAClD,GAAIP,IAAW,GACb,OAAO,KAELA,IAAW,KACbK,EAAkBC,GAEpBA,GACF,CACA,MAAM,IAAI,MACR,6BAA6BL,EAAI,MAAMI,CAAe,CAAC,EACzD,CACF,CACA,OAAOJ,CACT,EAEAjB,EAAkB,SAACc,EAAcU,EAA6B,CAC5D,IAAMC,EAAUb,EAAA,KAAKvB,GAAe,IAAIyB,CAAI,EAC5C,GAAIW,IAAY,OAAW,CACzB,GAAID,IAAW,KAAM,CACnB,IAAME,EAAQC,EAAUH,CAAM,EAC9B,GAAIE,IAAU,OACZ,OAAOf,EAAA,KAAKf,EAAAM,GAAL,UAAsBuB,EAASC,GAExC,MAAM,IAAI,MAAM,6BAA6BZ,CAAI,MAAMU,CAAM,GAAG,CAClE,CACA,OAAOb,EAAA,KAAKf,EAAAM,GAAL,UAAsBuB,EAAS,GACxC,CACA,IAAMG,EAAYhB,EAAA,KAAKnB,GAAiB,IAAIqB,CAAI,EAChD,GAAIc,IAAc,OAChB,OAAIJ,IAAW,KACNb,EAAA,KAAKf,EAAAO,GAAL,UAAwByB,EAAWJ,GAErCb,EAAA,KAAKf,EAAAO,GAAL,UACLyB,EACAjB,EAAA,KAAKf,EAAAE,GAAL,UAAyB,KAAKgB,CAAI,KAGtC,MAAM,IAAI,MAAM,kCAAkCA,CAAI,EAAE,CAC1D,EAEAb,GAAsB,SAACY,EAAeU,EAA8B,CAClE,IAAME,EAAUb,EAAA,KAAKxB,GAAgB,IAAIyB,CAAK,EAC9C,GAAIY,IAAY,OAAW,CACzB,GAAIF,EAAK,WAAW,GAAG,EAAG,CACxB,IAAMG,EAAQC,EAAUJ,EAAK,MAAM,CAAC,CAAC,EACrC,GAAIG,IAAU,OACZ,OAAAf,EAAA,KAAKf,EAAAM,GAAL,UAAsBuB,EAASC,GACxB,GAET,MAAM,IAAI,MAAM,4BAA4Bb,CAAK,MAAMU,CAAI,GAAG,CAChE,CACA,OAAAZ,EAAA,KAAKf,EAAAM,GAAL,UAAsBuB,EAAS,IACxBF,IAAS,EAClB,CACA,IAAMK,EAAYhB,EAAA,KAAKpB,GAAkB,IAAIqB,CAAK,EAClD,OAAIe,IAAc,OACZL,IAAS,IACXZ,EAAA,KAAKf,EAAAO,GAAL,UACEyB,EACAjB,EAAA,KAAKf,EAAAE,GAAL,UAAyB,IAAIe,CAAK,KAE7B,KAELU,EAAK,WAAW,GAAG,EACrBZ,EAAA,KAAKf,EAAAO,GAAL,UAAwByB,EAAWL,EAAK,MAAM,CAAC,GAE/CZ,EAAA,KAAKf,EAAAO,GAAL,UAAwByB,EAAWL,GAE9B,IAEF,IACT,EAEArB,EAAgB,SAACa,EAAaW,EAAgB,CAC5C,GAAId,EAAA,KAAKrB,GAAiB,IAAIwB,CAAG,EAC/B,MAAM,IAAI,MAAM,qBAAqBA,CAAG,EAAE,EAE5CH,EAAA,KAAKrB,GAAiB,IAAIwB,EAAKW,CAAK,CACtC,EAEAvB,EAAkB,SAACY,EAAaW,EAAe,CAC7C,IAAMG,EAASjB,EAAA,KAAKjB,GAAmB,IAAIoB,CAAG,GAAK,IAAI,MACvDc,EAAO,KAAKH,CAAK,EACjBd,EAAA,KAAKjB,GAAmB,IAAIoB,EAAKc,CAAM,CACzC,EAEAzB,EAAgB,SAACW,EAAa,CAC5B,GAAIH,EAAA,KAAKtB,GAAe,IAAIyB,CAAG,EAC7B,MAAM,IAAI,MAAM,4BAA4BA,CAAG,EAAE,EAEnD,GAAIH,EAAA,KAAKlB,GAAiB,IAAIqB,CAAG,EAC/B,MAAM,IAAI,MAAM,8BAA8BA,CAAG,EAAE,CAEvD,EAEAV,EAAiB,SAACyB,EAAyB,CAGzC,GAAIlB,EAAA,KAAKxB,GAAgB,IAAI0C,CAAe,EAC1C,MAAM,IAAI,MAAM,6BAA6BA,CAAe,EAAE,EAEhE,GAAIlB,EAAA,KAAKvB,GAAe,IAAIyC,CAAe,EACzC,MAAM,IAAI,MAAM,8BAA8BA,CAAe,EAAE,EAEjE,GAAIlB,EAAA,KAAKpB,GAAkB,IAAIsC,CAAe,EAC5C,MAAM,IAAI,MAAM,+BAA+BA,CAAe,EAAE,EAElE,GAAIlB,EAAA,KAAKnB,GAAiB,IAAIqC,CAAe,EAC3C,MAAM,IAAI,MAAM,gCAAgCA,CAAe,EAAE,CAErE,EAGF,SAASH,EAAUD,EAAoC,CACrD,IAAMK,EAAQL,EAAM,YAAY,EAChC,GAAIK,IAAU,QAAUA,IAAU,KAAOA,IAAU,KAAOA,IAAU,MAClE,MAAO,GAET,GAAIA,IAAU,SAAWA,IAAU,KAAOA,IAAU,KAAOA,IAAU,KACnE,MAAO,EAGX,CChSO,SAASC,EAAsBC,EAInC,CACD,GAAM,CAAE,QAAAC,EAAS,aAAAC,EAAc,YAAAC,CAAY,EAAIH,EAEzCI,EAAQ,IAAI,MAElBA,EAAM,KACJC,EAAoBF,EAAa,CAC/B,MAAOD,EAAa,YACpB,KAAM,EACR,CAAC,CACH,EACIA,EAAa,SACfE,EAAM,KACJC,EAAoBF,EAAa,CAC/B,MAAOD,EAAa,QACpB,MAAO,aACT,CAAC,CACH,EAGFE,EAAM,KAAK,EAAE,EACb,IAAME,EAAc,CAClBD,EAAoBF,EAAa,CAC/B,MAAO,SACP,MAAO,gBACP,KAAM,EACR,CAAC,EACDE,EAAoBF,EAAaI,EAAUN,CAAO,CAAC,CACrD,EAAE,OACAC,EAAa,YAAY,IAAKM,GAAe,CAC3C,GAAI,aAAcA,EAChB,OAAOH,EAAoBF,EAAaM,EAAUD,EAAW,QAAQ,CAAC,EAExE,GAAI,YAAaA,EACf,OAAOH,EAAoBF,EAAaI,EAAUC,EAAW,OAAO,CAAC,EAEvE,MAAM,IAAI,MAAM,uBAAuB,KAAK,UAAUA,CAAU,CAAC,EAAE,CACrE,CAAC,CACH,EAGA,GAFAJ,EAAM,KAAKE,EAAY,KAAK,GAAG,CAAC,EAE5BJ,EAAa,UAAU,OAAS,EAAG,CACrCE,EAAM,KAAK,EAAE,EACbA,EAAM,KAAKC,EAAoBF,EAAaO,EAAe,YAAY,CAAC,CAAC,EACzE,IAAMC,EAAO,IAAI,MACjB,QAAWC,KAAiBV,EAAa,UAAW,CAClD,IAAMW,EAAU,IAAI,MACpBA,EAAQ,KAAK,CAACC,EAAc,CAAC,CAAC,EAC9BD,EAAQ,KAAK,CAACJ,EAAUG,EAAc,KAAK,CAAC,CAAC,EACzCA,EAAc,cAChBC,EAAQ,KAAK,CAACC,EAAc,CAAC,CAAC,EAC9BD,EAAQ,KAAK,CAACE,EAAgBH,EAAc,WAAW,CAAC,CAAC,GAE3DD,EAAK,KAAKE,CAAO,CACnB,CACAT,EAAM,KAAK,GAAGY,EAAqBL,EAAMR,CAAW,CAAC,CACvD,CAEA,GAAID,EAAa,YAAY,OAAS,EAAG,CACvCE,EAAM,KAAK,EAAE,EACbA,EAAM,KACJC,EAAoBF,EAAaO,EAAe,cAAc,CAAC,CACjE,EACA,IAAMC,EAAO,IAAI,MACjB,QAAWM,KAAcf,EAAa,YAAa,CACjD,IAAMW,EAAU,IAAI,MACpBA,EAAQ,KAAK,CAACC,EAAc,CAAC,CAAC,EAC9BD,EAAQ,KAAK,CAACN,EAAUU,EAAW,IAAI,CAAC,CAAC,EACrCA,EAAW,cACbJ,EAAQ,KAAK,CAACC,EAAc,CAAC,CAAC,EAC9BD,EAAQ,KAAK,CAACE,EAAgBE,EAAW,WAAW,CAAC,CAAC,GAExDN,EAAK,KAAKE,CAAO,CACnB,CACAT,EAAM,KAAK,GAAGY,EAAqBL,EAAMR,CAAW,CAAC,CACvD,CAEA,GAAID,EAAa,QAAQ,OAAS,EAAG,CACnCE,EAAM,KAAK,EAAE,EACbA,EAAM,KAAKC,EAAoBF,EAAaO,EAAe,UAAU,CAAC,CAAC,EACvE,IAAMC,EAAO,IAAI,MACjB,QAAWO,KAAehB,EAAa,QAAS,CAC9C,IAAMW,EAAU,IAAI,MACpBA,EAAQ,KAAK,CAACC,EAAc,CAAC,CAAC,EAC1BI,EAAY,MACdL,EAAQ,KAAK,CAACN,EAAU,IAAIW,EAAY,KAAK,EAAE,EAAG,CAAE,MAAO,IAAK,CAAC,CAAC,EAElEL,EAAQ,KAAK,CAAC,CAAC,EAEbK,EAAY,MACdL,EAAQ,KAAK,CACXN,EAAU,KAAKW,EAAY,IAAI,GAAG,EAClCT,EAAUS,EAAY,KAAK,CAC7B,CAAC,EAEDL,EAAQ,KAAK,CAACN,EAAU,KAAKW,EAAY,IAAI,EAAE,CAAC,CAAC,EAE/CA,EAAY,cACdL,EAAQ,KAAK,CAACC,EAAc,CAAC,CAAC,EAC9BD,EAAQ,KAAK,CAACE,EAAgBG,EAAY,WAAW,CAAC,CAAC,GAEzDP,EAAK,KAAKE,CAAO,CACnB,CACAT,EAAM,KAAK,GAAGY,EAAqBL,EAAMR,CAAW,CAAC,CACvD,CAEA,OAAAC,EAAM,KAAK,EAAE,EACNA,CACT,CAEA,SAASM,EAAeS,EAAwB,CAC9C,MAAO,CAAE,MAAOA,EAAM,MAAO,cAAe,KAAM,EAAK,CACzD,CAEA,SAASJ,EAAgBI,EAAwB,CAC/C,MAAO,CAAE,MAAOA,CAAK,CACvB,CAEA,SAASZ,EAAUY,EAAwB,CACzC,MAAO,CAAE,MAAOA,EAAM,MAAO,aAAc,KAAM,EAAK,CACxD,CAEA,SAASV,EAAUU,EAAwB,CACzC,MAAO,CAAE,MAAOA,EAAM,MAAO,YAAa,CAC5C,CAEA,SAASL,GAA0B,CACjC,MAAO,CAAE,MAAO,IAAK,CACvB,CC7HA,eAAsBM,GACpBC,EACAC,EACAC,EACAC,EACAC,EAUgB,CAChB,IAAMC,EAAkB,IAAIC,EAAgBL,CAAO,EAC/CG,GAAa,cACfC,EAAgB,aAAa,CAC3B,IAAK,UACL,OAAQ,CAAC,EACT,MAAO,CAAC,SAAS,CACnB,CAAC,GAECD,GAAa,aAAe,KAC9BC,EAAgB,aAAa,CAC3B,IAAK,OACL,OAAQ,CAAC,EACT,MAAO,CAAC,MAAM,CAChB,CAAC,EAUH,IAAME,EAAqBJ,EAAQ,iBAAiBE,CAAe,EACnE,GAAID,GAAa,cACXC,EAAgB,YAAY,SAAS,EACvC,OAACD,GAAa,aAAe,QAAQ,KACnC,CAACJ,EAASI,EAAY,YAAY,EAAE,KAAK,GAAG,CAC9C,GACQA,GAAa,QAAU,QAAQ,MAAM,CAAC,EAGlD,IAAIA,GAAa,aAAe,KAC1BC,EAAgB,YAAY,MAAM,EACpC,OAACD,GAAa,aAAe,QAAQ,KACnCI,GAAmBR,EAASO,EAAoBH,GAAa,SAAS,CACxE,GACQA,GAAa,QAAU,QAAQ,MAAM,CAAC,EAGlD,GAAI,CACF,aAAMG,EAAmB,QAAQL,CAAO,GAChCE,GAAa,QAAU,QAAQ,MAAM,CAAC,CAChD,OAASK,EAAO,CAMd,IALIL,GAAa,cAAgB,MAC9BA,GAAa,aAAe,QAAQ,OACnCI,GAAmBR,EAASO,EAAoBH,GAAa,SAAS,CACxE,EAEEA,GAAa,QACfA,EAAY,QAAQK,CAAK,MACpB,CACL,IAAMC,EAAcC,GAAkBP,GAAa,SAAS,GAC3DA,GAAa,aAAe,QAAQ,OACnC,CACEQ,EAAoBF,EAAa,CAC/B,MAAO,SACP,MAAO,YACP,KAAM,EACR,CAAC,EACDE,EAAoBF,EAAa,CAC/B,MAAOD,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EAC5D,KAAM,EACR,CAAC,CACH,EAAE,KAAK,GAAG,CACZ,CACF,CACA,OAAQL,GAAa,QAAU,QAAQ,MAAM,CAAC,CAChD,CACF,CAEA,SAASI,GACPR,EACAO,EACAM,EACA,CACA,OAAOC,EAAsB,CAC3B,QAAAd,EACA,aAAcO,EAAmB,aAAa,EAC9C,YAAaI,GAAkBE,CAAS,CAC1C,CAAC,EAAE,KAAK;AAAA,CAAI,CACd,CAEA,SAASF,GAAkBE,EAAkC,CAC3D,OAAIA,IAAc,OACTE,EAAwB,EAE1BF,EAAY,MAAQ,MAC7B","names":["index_exports","__export","ReaderTokenizer","argumentOptional","argumentRequired","argumentVariadics","command","commandWithSubcommands","execution","gridToPrintableLines","optionFlag","optionRepeatable","optionSingleValue","runAndExit","typeBigInt","typeBoolean","typeCommaList","typeCommaTuple","typeDate","typeDecode","typeNumber","typeString","typoInferProcessSupport","typoPrintableString","usageToPrintableLines","__toCommonJS","typeBoolean","value","typeDate","timestamp","typeString","typeNumber","typeBigInt","typeCommaTuple","elementTypes","elementType","parts","part","index","typeDecode","typeCommaList","type","context","error","argumentRequired","definition","label","readerPositionals","positional","typeDecode","argumentOptional","argumentVariadics","values","command","metadata","execution","readerTokenizer","computeUsage","executionUsage","argument","breadcrumbArgument","executionResolver","lastPositional","executionCallback","context","error","_context","commandWithSubcommands","subcommands","subcommandName","subcommandInput","subcommandInterpreter","subcommandUsage","breadcrumbCommand","payload","name","subcommand","value","execution","inputs","handler","optionsUsage","optionKey","optionInput","argumentsUsage","argumentInput","readerTokenizer","optionsConsumers","argumentsValues","optionsValues","context","typoPrintableString","typoSupport","typoText","colorStartCode","colorCodes","colorBoldCode","boldCode","resetCode","colorStartTag","colorEndTag","boldStartTag","boldEndTag","typoInferProcessSupport","gridToPrintableLines","grid","typoSupport","delimiter","lines","gridWidths","gridRow","gridColumnIndex","gridCell","length","gridCellLength","lineColumns","parts","text","typoPrintableString","padding","cell","optionFlag","definition","readerTokenizer","key","longs","shorts","value","optionRepeatable","label","typeDecode","optionSingleValue","values","firstValue","_parsedArgs","_parsedIndex","_parsedDouble","_flagKeyByShort","_flagKeyByLong","_flagInfoByKey","_flagResultByKey","_optionKeyByShort","_optionKeyByLong","_optionInfoByKey","_optionResultByKey","_ReaderTokenizer_instances","consumeArg_fn","consumeOptionValue_fn","parseAsPositional_fn","consumeOptionLong_fn","tryConsumeOptionShort_fn","acknowledgeFlag_fn","acknowledgeOption_fn","ensureUniqueKey_fn","ensureUniqueName_fn","ReaderTokenizer","args","__privateAdd","__privateSet","definition","__privateMethod","__privateGet","short","long","key","result","arg","positional","__privateWrapper","valueIndexStart","shortIndexStart","shortIndexEnd","rest","direct","flagKey","value","asBoolean","optionKey","values","nameShortOrLong","lower","usageToPrintableLines","params","cliName","commandUsage","typoSupport","lines","typoPrintableString","breadcrumbs","textFixed","breadcrumb","textInput","textBlockTitle","grid","argumentUsage","gridRow","textDelimiter","textDescription","gridToPrintableLines","subcommand","optionUsage","text","runAndExit","cliName","cliArgs","context","command","application","readerTokenizer","ReaderTokenizer","commandInterpreter","computeUsageString","error","typoSupport","chooseTypoSupport","typoPrintableString","useColors","usageToPrintableLines","typoInferProcessSupport"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cli-kiss",
3
- "version": "0.0.9",
3
+ "version": "0.0.10",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "devDependencies": {
package/src/lib/Reader.ts CHANGED
@@ -130,17 +130,17 @@ export class ReaderTokenizer {
130
130
  return arg;
131
131
  }
132
132
 
133
- #consumeOptionValue(name: string) {
133
+ #consumeOptionValue(key: string) {
134
134
  const arg = this.#consumeArg();
135
135
  if (arg === null) {
136
- throw new Error(`Option ${name} requires a value but none was provided`);
136
+ throw new Error(`Option ${key} requires a value but none was provided`);
137
137
  }
138
138
  if (this.#parsedDouble) {
139
- throw new Error(`Option ${name} requires a value before --`);
139
+ throw new Error(`Option ${key} requires a value before "--"`);
140
140
  }
141
141
  // TODO - is that weird, could a valid value start with dash ?
142
142
  if (arg.startsWith("-")) {
143
- throw new Error(`Option ${name} requires a value, got: ${arg}`);
143
+ throw new Error(`Option ${key} requires a value, got: "${arg}"`);
144
144
  }
145
145
  return arg;
146
146
  }
@@ -191,7 +191,7 @@ export class ReaderTokenizer {
191
191
  if (value !== undefined) {
192
192
  return this.#acknowledgeFlag(flagKey, value);
193
193
  }
194
- throw new Error(`Invalid value for flag: --${long}: ${direct}`);
194
+ throw new Error(`Invalid value for flag: --${long}: "${direct}"`);
195
195
  }
196
196
  return this.#acknowledgeFlag(flagKey, true);
197
197
  }
@@ -200,7 +200,10 @@ export class ReaderTokenizer {
200
200
  if (direct !== null) {
201
201
  return this.#acknowledgeOption(optionKey, direct);
202
202
  }
203
- return this.#acknowledgeOption(optionKey, this.#consumeOptionValue(long));
203
+ return this.#acknowledgeOption(
204
+ optionKey,
205
+ this.#consumeOptionValue(`--${long}`),
206
+ );
204
207
  }
205
208
  throw new Error(`Unknown long flag or option: --${long}`);
206
209
  }
@@ -214,7 +217,7 @@ export class ReaderTokenizer {
214
217
  this.#acknowledgeFlag(flagKey, value);
215
218
  return true;
216
219
  }
217
- throw new Error(`Invalid value for flag: -${short}: ${rest}`);
220
+ throw new Error(`Invalid value for flag: -${short}: "${rest}"`);
218
221
  }
219
222
  this.#acknowledgeFlag(flagKey, true);
220
223
  return rest === "";
@@ -222,7 +225,10 @@ export class ReaderTokenizer {
222
225
  const optionKey = this.#optionKeyByShort.get(short);
223
226
  if (optionKey !== undefined) {
224
227
  if (rest === "") {
225
- this.#acknowledgeOption(optionKey, this.#consumeOptionValue(short));
228
+ this.#acknowledgeOption(
229
+ optionKey,
230
+ this.#consumeOptionValue(`-${short}`),
231
+ );
226
232
  return true;
227
233
  }
228
234
  if (rest.startsWith("=")) {
package/src/lib/Type.ts CHANGED
@@ -61,7 +61,7 @@ export function typeCommaTuple<
61
61
  const parts = value.split(",", elementTypes.length);
62
62
  if (parts.length !== elementTypes.length) {
63
63
  throw new Error(
64
- `Invalid tuple value: ${value}, expected ${elementTypes.length} comma-separated parts`,
64
+ `Invalid tuple value: "${value}", expected ${elementTypes.length} comma-separated parts`,
65
65
  );
66
66
  }
67
67
  return parts.map((part, index) =>
@@ -100,7 +100,7 @@ export function typeDecode<Value>(
100
100
  return type.decoder(value);
101
101
  } catch (error) {
102
102
  throw new Error(
103
- `Invalid value for ${context}: "${value}": ${
103
+ `Failed to decode value "${value}" for ${context}: ${
104
104
  error instanceof Error ? error.message : String(error)
105
105
  }`,
106
106
  );