UNPKG

argzod

Version:

Minimalistic typescript-first CLI parser powerd with Zod

4 lines (3 loc) 12.3 kB
var F=Object.defineProperty,ae=Object.defineProperties;var pe=Object.getOwnPropertyDescriptors;var B=Object.getOwnPropertySymbols;var me=Object.prototype.hasOwnProperty,de=Object.prototype.propertyIsEnumerable;var k=r=>{throw TypeError(r)};var _=(r,e,t)=>e in r?F(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,h=(r,e)=>{for(var t in e||(e={}))me.call(e,t)&&_(r,t,e[t]);if(B)for(var t of B(e))de.call(e,t)&&_(r,t,e[t]);return r},O=(r,e)=>ae(r,pe(e));var le=(r,e)=>{for(var t in e)F(r,t,{get:e[t],enumerable:!0})};var H=(r,e,t)=>e.has(r)||k("Cannot "+t);var S=(r,e,t)=>(H(r,e,"read from private field"),t?t.call(r):e.get(r)),U=(r,e,t)=>e.has(r)?k("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(r):e.set(r,t),G=(r,e,t,o)=>(H(r,e,"write to private field"),o?o.call(r,t):e.set(r,t),t);var $={};le($,{ArgzodError:()=>d,EntryType:()=>c,ErrorCode:()=>m,ErrorLevel:()=>y,OptionParseType:()=>u,OptionValueStyle:()=>x,OptionVariant:()=>E,createCommand:()=>L,createProgram:()=>Ce});var E={Long:"long",Short:"short"},c={Argument:"argument",Option:"option"},x={Inline:"inline",SpaceSeparated:"space",Attached:"attached"},y={Error:"error",Warn:"warn",Ignore:"ignore"},u={Boolean:"boolean",Single:"single",Many:"many"};var m={Internal:"internal",Validation:"zod-parse",InvalidOption:"unknown-option",OptionNotDefined:"option-not-defined",InvalidArguments:"invalid-args",CommandNotFound:"command-not-found",InvalidDefinitions:"invalid-definitions",InvalidOptionValue:"invalid-opt-value"};import ce from"chalk";var W={[m.Validation]:r=>r.issues.map(e=>e.message).join(` `),[m.CommandNotFound]:r=>`Unknown command${r?` ${ce.bold(r)}`:""}`,[m.InvalidOption]:"Option format is invalid. Type --help to get instructions.",[m.InvalidOptionValue]:({shouldBe:r})=>r===u.Boolean?"Expected no values but got values":r===u.Single?"Expected single value but got multiple or no values":"Expected multiple values but got single or no values",[m.OptionNotDefined]:"Option is not defined.",[m.Internal]:"This should not happen. It you see this please add a GitHub issue on argzod.",[m.InvalidArguments]:"Invalid positional",[m.InvalidDefinitions]:"Command, option or argument definitions are invalid"};var C,N=class N extends Error{constructor(t){let o=h({},W),s="",n,i,a,p=y.Error;if(typeof t=="string")i=t,s=o[i];else if("ctx"in t){let l=o[t.code];s=l(...t.ctx),n=t.ctx,i=t.code,a=t.path}else s=o[t.code],i=t.code,a=t.path,t.level&&(p=t.level);super(s);U(this,C);Object.setPrototypeOf(this,N.prototype),this.name="ArgzodError",this.ctx=n,G(this,C,i),this.path=a,this.level=p}get code(){return S(this,C)}__applyMessageMap(t){if(!t)return;let o=t[S(this,C)];if(o){if(typeof o=="string")this.message=o;else if(typeof o=="function"){let s=o,n=this.ctx;this.message=s(...n)}}}__setPath(t){this.path=t}};C=new WeakMap;var d=N;var Z={parse:u.Boolean,description:"Logs out detailed infromation about a command",name:["help","h"]};var w=(r,e)=>Object.entries(e).find(([,t])=>typeof t.name=="string"?t.name===r:t.name.some(o=>o===r)),Y=(r,e)=>{let t=[];return typeof r.name=="string"?t.push(r.name):t.push(...r.name),e.reduce((o,s,n)=>{if(!t.some(p=>p===s.name))return o;let a=O(h({},s),{index:n});return[...o,a]},[])},M=r=>{let e=t=>t.length>1;if(typeof r.name=="string")return e(r.name)?"--"+r.name:"-"+r.name;{let t=r.name[0];return e(t)?"--"+t:"-"+t}},K=r=>r.length>1?"--"+r:"-"+r,q=r=>r.name instanceof Array?r.name.map(e=>K(e)).join(", "):K(r.name);var J=r=>{let e=[...r].findIndex(t=>t!=="-");return e===-1?r.length:e};var A=r=>{let e=/^[a-zA-Z]$/,t=/^[a-zA-Z][a-zA-Z0-9-]*$/;return e.test(r)||t.test(r)},Q=r=>/^[0-9]+$/.test(r),X=()=>{let r=()=>((1+Math.random())*65536|0).toString(16).substring(1);return r()+r()+"-"+r()+"-"+r()+"-"+r()+"-"+r()+r()+r()},ee=(r,e)=>r.reduce((o,s)=>{var i;let n=(i=e(s))!=null?i:s.level;return O(h({},o),{[n]:o[n].concat(s)})},{[y.Error]:[],[y.Warn]:[],[y.Ignore]:[]});var b=r=>{try{return{data:r(),success:!0}}catch(e){return{success:!1,error:e}}};var re=Symbol("operation-stop"),v=r=>{let e={errors:new Set,break:()=>{throw re}};return(...t)=>{let o=b(()=>r(e,...t));return o.success?te({errors:e.errors,success:!0,value:o.data,manuallyStopped:!1}):(o.error===d&&e.errors.add(o.error),te({errors:e.errors,success:!1,manuallyStopped:o.error===re}))}},te=r=>{let e=t=>{if(r.errors.forEach(o=>t._registerError(o)),!r.success)throw Array.from(r.errors).at(-1);return r.value};return O(h({},r),{unwrap:e})};var oe=v((r,e,t)=>t.reduce((s,n)=>{let i=J(n);if(!i||i===n.length)return s.concat({type:c.Argument,value:n});if(i===1&&Q(n.slice(1)))return s.concat({type:c.Argument,value:n});if(n.includes("=")&&(i===1||i===2)){let p=b(()=>ue({entry:n,leadingDashes:i}));return p.success?s.concat(p.data):(r.errors.add(p.error),s)}let a=n.slice(i);if(!A(a))return r.errors.add(new d({code:m.InvalidOption})),s;if(i===1){if(a.length===1)return s.concat({type:c.Option,original:n,value:[],name:a,variant:E.Short,fullName:n});let p=ge({entry:n,optionDefinitions:e.options});return s.concat(...p)}return i===2?a.length>1?(s.push({type:c.Option,original:n,value:[],name:a,variant:E.Long,fullName:n}),s):(r.errors.add(new d({code:m.InvalidOption,path:n})),s):(r.errors.add(new d({code:m.InvalidOption,path:n})),s)},[])),ue=({leadingDashes:r,entry:e})=>{var n,i;let t=e.slice(r).split("=");if(r===1||((i=(n=t[0])==null?void 0:n.length)!=null?i:0)<2)throw new d({code:m.InvalidOption});if(t.length!==2)throw new d({code:m.InvalidOption});let[o,s]=t;if(!A(o))throw new d({code:m.InvalidOption});return{type:c.Option,value:[s],name:o,variant:E.Short,fullName:`--${o}`,valueStyle:x.Inline,original:e}},ge=({entry:r,optionDefinitions:e})=>{let o=r.slice(1).split(""),s=new Map;for(let[a,p]of o.entries()){if(!A(p))continue;if(s.has(p))throw new d({code:m.InvalidOption});let l=w(p,e);if(!l||l[1].parse===u.Boolean){let f=o.slice(a+1).filter(V=>!A(V)),D=f.length?f.join(""):void 0;s.set(p,D);continue}let g=o.slice(a+1).join("");s.set(p,g);break}let n=Array.from(s.keys());return Array.from(s.entries(),([a,p])=>{let l=typeof p=="string";return{fullName:"-"+a,name:a,original:r,type:c.Option,value:l?[p]:[],variant:E.Short,valueStyle:l?x.Attached:void 0,bunled:{fullName:r,opts:n}}})};var ne=v((r,e,t)=>{let o=!1;return t.reduce((n,i,a,p)=>{if(i.type===c.Argument)return o?n:[...n,i];o=!0;let l=w(i.name,e.options),g=he(p.slice(a+1)),f=l?{boolean:0,single:1,many:l[1].parse==="many"?l[1].maxValues:void 0}[l[1].parse]:void 0,{values:D,args:V}=fe(i,g,f);return i.value=[...i.value,...D],[...n,i,...V]},[])}),fe=(r,e,t)=>r.valueStyle&&r.valueStyle!==x.SpaceSeparated?{values:[],args:e}:typeof t!="number"?{values:e.map(o=>o.value),args:[]}:{values:e.slice(0,t).map(o=>o.value),args:e.slice(t)},he=r=>{let e=[];for(let t of r){if(t.type===c.Option)break;e.push(t)}return e};var se=v((r,e,t)=>{let o=t.filter(n=>n.type===c.Argument),s=e.args.reduce((n,i,a)=>{var g;let p=(g=o[a])==null?void 0:g.value;if(!i.schema)return i===void 0?n:[...n,i];let l=i.schema.safeParse(p);return l.success?[...n,l.data]:(r.errors.add(new d({code:m.Validation,path:`Argument ${a+1}`,ctx:[l.error]})),n)},[]);return o.length>e.args.length&&r.errors.add(new d({code:m.InvalidArguments})),s});var ie=v((r,e,t)=>{let o=new Set,s=Object.fromEntries(Object.entries(t).map(([i,a])=>{let p=Y(a,e);p.forEach(f=>o.add(f.index));let l=ye(a,p);if(l instanceof d)return l.__setPath(M(a)),r.errors.add(l),[i,{value:void 0,definition:a,options:p}];let g=l;if(a.schema){let f=a.schema.safeParse(l);if(!f.success)return r.errors.add(new d({code:m.Validation,path:M(a),ctx:[f.error]})),[i,{value:void 0,definition:a,options:p}];g=f.data}return[i,{value:g,options:p,definition:a}]})),n=e.filter((i,a)=>!o.has(a));return{validated:s,unknown:n}}),ye=(r,e)=>({[u.Boolean]:Oe,[u.Single]:ve,[u.Many]:Ee})[r.parse](e),Oe=r=>{if(!r.length)return!1;let e=r.every(o=>o.value.length===0),t=r.length<2;return!e||!t?new d({code:m.InvalidOptionValue,ctx:[{shouldBe:u.Boolean}]}):r.length===1},ve=r=>{var o;if(!r.length)return;let e=r.length<2,t=r.every(s=>s.value.length===0||s.value.length===1);return!e||!t?new d({code:m.InvalidOptionValue,ctx:[{shouldBe:u.Single}]}):(o=r[0])==null?void 0:o.value[0]},Ee=r=>r.reduce((e,t)=>[...e,...t.value],[]);var L=r=>new z(r),z=class{constructor(e){var t,o;this.name=e.name,this.action=e.action,this.options=this.attachBuiltIns((t=e.options)!=null?t:{}),this.args=(o=e.args)!=null?o:[],this.program=e.program,this.description=e.description}process(e){let t=oe(this,e).unwrap(this.program),o=ne(this,t).unwrap(this.program),s=o.filter(p=>p.type===c.Option),n=o.filter(p=>p.type===c.Argument),i=ie(s,this.options).unwrap(this.program),a=se(this,n).unwrap(this.program);return{entries:e,parsedEntries:t,resolvedEntries:o,validatedOptions:i,validatedArgs:a}}attachBuiltIns(e){return Object.assign({help:Z},e)}};var R="\u26A0";import T from"chalk";import P from"chalk";var I=class{constructor(e){this.config=e}alignLog(e){let t=Math.max(...e.map(s=>s.left.length)),o=6;e.forEach(s=>{console.log(`${s.left.padEnd(t+o)}${s.right}`)})}indent(e=1){return" ".repeat(e*4)}log(){let{targetCommand:e,programDescription:t,commands:o}=this.config,s=o.find(n=>!n.name);if(s&&(console.log(),this.logCommandHelp(s)),t&&(console.log(),console.log(t),console.log()),s!==e){this.logCommandHelp(e);return}console.log(P.bold("Commands:")),this.alignLog(o.filter(n=>n.name).map(n=>({left:this.indent()+n.name,right:n.description?P.italic(n.description):""}))),console.log()}logCommandHelp(e){console.log(P.bold("Usage:"));let t=[this.config.programName,e.name,e.args.length?"<args>":"","[options]"].filter(Boolean).join(" ");console.log(`${this.indent()}${t}`),e.options&&(console.log(P.bold(` Options:`)),this.alignLog(Object.values(e.options).map(o=>({left:this.indent()+q(o),right:o.description?P.italic(o.description):""}))))}};var xe={name:"",undefinedOptionsBehavior:y.Error},Ce=r=>new j(r),j=class{constructor(e){this._id=X(),this.commands=[],this.config=h(h({},xe),e),this.errors=new Set}run(e=process.argv.slice(2)){this.cleanUp();let{process:t,targetCommand:o,indexCommand:s}=this.matchCommand(e),{validatedArgs:n,validatedOptions:i,parsedEntries:a}=t(),p=Object.fromEntries(Object.entries(i.validated).map(([g,f])=>[g,f.value]));if(p.help&&(this.logHelp({targetCommand:o,indexCommand:s}),process.exit(0)),this.errors.size){let{error:g}=this.logErrors();g.length&&process.exit(1)}o.action({args:n,options:p,unknownOptions:i.unknown,parsedEntries:a})}command(e){if(this.commands.find(o=>o.name===e.name))throw new d({code:m.InvalidDefinitions});let t=L(O(h({},e),{program:this}));return this.commands.push(t),t}attachCommand(e){if(this.commands.find(t=>t.name===e.name))throw new d({code:m.InvalidDefinitions});return this.commands.push(e),this}matchCommand(e){let t=this.commands.find(n=>n.name===e[0]),o=this.commands.find(n=>n.name===void 0),s=t!=null?t:o;return e=s===o?e:e.slice(1),s||this._registerError(new d({code:m.CommandNotFound,ctx:[e[0]]}),"exit"),{targetCommand:s,namedCommand:t,indexCommand:o,commandEntries:e,process:()=>s.process(e)}}logHelp({indexCommand:e,targetCommand:t}){new I({commands:this.commands,targetCommand:t,isIndexCommand:t===e,programName:this.config.name,programDescription:this.config.description}).log()}logErrors(){var o,s;this.errors.forEach(n=>n.__applyMessageMap(this.config.messages));let e=Array.from(this.errors),t=ee(e,n=>{if(this.config.undefinedOptionsBehavior===y.Warn&&n.code===m.OptionNotDefined)return y.Warn});return(s=(o=this.config).onError)==null||s.call(o,t),t.warn.forEach(n=>{console.log(`${T.yellow(`[${R} ${T.bold("Warning")}]`)}${n.path?` | ${T.bold(n.path)}`:""} | ${n.message}`)}),t.error.forEach(n=>{console.log(`${T.red(`[${R} ${T.bold("Error")}]`)}${n.path?` | ${T.bold(n.path)}`:""} | ${n.message}`)}),t}_registerError(e,t){let o;if(e instanceof d)o=e;else try{return e()}catch(s){if(!(s instanceof d))throw new Error("You should never see this. If you do please create a GitHub issue");o=s}this.errors.add(o),t&&(this.logErrors(),process.exit(1))}_errorExit(){this.logErrors(),process.exit(1)}cleanUp(){this.errors=new Set}};var Kr=$;export{d as ArgzodError,c as EntryType,m as ErrorCode,y as ErrorLevel,u as OptionParseType,x as OptionValueStyle,E as OptionVariant,$ as argzod,L as createCommand,Ce as createProgram,Kr as default};