argzod
Version:
Minimalistic typescript-first CLI parser powerd with Zod
4 lines (3 loc) • 13 kB
JavaScript
;var ue=Object.create;var P=Object.defineProperty,ge=Object.defineProperties,fe=Object.getOwnPropertyDescriptor,he=Object.getOwnPropertyDescriptors,ye=Object.getOwnPropertyNames,F=Object.getOwnPropertySymbols,Oe=Object.getPrototypeOf,H=Object.prototype.hasOwnProperty,ve=Object.prototype.propertyIsEnumerable;var U=r=>{throw TypeError(r)};var k=(r,e,t)=>e in r?P(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,h=(r,e)=>{for(var t in e||(e={}))H.call(e,t)&&k(r,t,e[t]);if(F)for(var t of F(e))ve.call(e,t)&&k(r,t,e[t]);return r},O=(r,e)=>ge(r,he(e));var G=(r,e)=>{for(var t in e)P(r,t,{get:e[t],enumerable:!0})},W=(r,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of ye(e))!H.call(r,n)&&n!==t&&P(r,n,{get:()=>e[n],enumerable:!(o=fe(e,n))||o.enumerable});return r};var z=(r,e,t)=>(t=r!=null?ue(Oe(r)):{},W(e||!r||!r.__esModule?P(t,"default",{value:r,enumerable:!0}):t,r)),Ee=r=>W(P({},"__esModule",{value:!0}),r);var Z=(r,e,t)=>e.has(r)||U("Cannot "+t);var L=(r,e,t)=>(Z(r,e,"read from private field"),t?t.call(r):e.get(r)),K=(r,e,t)=>e.has(r)?U("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(r):e.set(r,t),Y=(r,e,t,o)=>(Z(r,e,"write to private field"),o?o.call(r,t):e.set(r,t),t);var Se={};G(Se,{ArgzodError:()=>d,EntryType:()=>c,ErrorCode:()=>m,ErrorLevel:()=>y,OptionParseType:()=>u,OptionValueStyle:()=>x,OptionVariant:()=>E,argzod:()=>S,createCommand:()=>D,createProgram:()=>ce,default:()=>Ve});module.exports=Ee(Se);var S={};G(S,{ArgzodError:()=>d,EntryType:()=>c,ErrorCode:()=>m,ErrorLevel:()=>y,OptionParseType:()=>u,OptionValueStyle:()=>x,OptionVariant:()=>E,createCommand:()=>D,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"};var q=z(require("chalk"));var J={[m.Validation]:r=>r.issues.map(e=>e.message).join(`
`),[m.CommandNotFound]:r=>`Unknown command${r?` ${q.default.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 T,R=class R extends Error{constructor(t){let o=h({},J),n="",s,i,a,p=y.Error;if(typeof t=="string")i=t,n=o[i];else if("ctx"in t){let l=o[t.code];n=l(...t.ctx),s=t.ctx,i=t.code,a=t.path}else n=o[t.code],i=t.code,a=t.path,t.level&&(p=t.level);super(n);K(this,T);Object.setPrototypeOf(this,R.prototype),this.name="ArgzodError",this.ctx=s,Y(this,T,i),this.path=a,this.level=p}get code(){return L(this,T)}__applyMessageMap(t){if(!t)return;let o=t[L(this,T)];if(o){if(typeof o=="string")this.message=o;else if(typeof o=="function"){let n=o,s=this.ctx;this.message=n(...s)}}}__setPath(t){this.path=t}};T=new WeakMap;var d=R;var Q={parse:u.Boolean,description:"Logs out detailed infromation about a command",name:["help","h"]};var b=(r,e)=>Object.entries(e).find(([,t])=>typeof t.name=="string"?t.name===r:t.name.some(o=>o===r)),ee=(r,e)=>{let t=[];return typeof r.name=="string"?t.push(r.name):t.push(...r.name),e.reduce((o,n,s)=>{if(!t.some(p=>p===n.name))return o;let a=O(h({},n),{index:s});return[...o,a]},[])},j=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}},X=r=>r.length>1?"--"+r:"-"+r,re=r=>r.name instanceof Array?r.name.map(e=>X(e)).join(", "):X(r.name);var te=r=>{let e=[...r].findIndex(t=>t!=="-");return e===-1?r.length:e};var w=r=>{let e=/^[a-zA-Z]$/,t=/^[a-zA-Z][a-zA-Z0-9-]*$/;return e.test(r)||t.test(r)},oe=r=>/^[0-9]+$/.test(r),ne=()=>{let r=()=>((1+Math.random())*65536|0).toString(16).substring(1);return r()+r()+"-"+r()+"-"+r()+"-"+r()+"-"+r()+r()+r()},se=(r,e)=>r.reduce((o,n)=>{var i;let s=(i=e(n))!=null?i:n.level;return O(h({},o),{[s]:o[s].concat(n)})},{[y.Error]:[],[y.Warn]:[],[y.Ignore]:[]});var I=r=>{try{return{data:r(),success:!0}}catch(e){return{success:!1,error:e}}};var ie=Symbol("operation-stop"),v=r=>{let e={errors:new Set,break:()=>{throw ie}};return(...t)=>{let o=I(()=>r(e,...t));return o.success?ae({errors:e.errors,success:!0,value:o.data,manuallyStopped:!1}):(o.error===d&&e.errors.add(o.error),ae({errors:e.errors,success:!1,manuallyStopped:o.error===ie}))}},ae=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 pe=v((r,e,t)=>t.reduce((n,s)=>{let i=te(s);if(!i||i===s.length)return n.concat({type:c.Argument,value:s});if(i===1&&oe(s.slice(1)))return n.concat({type:c.Argument,value:s});if(s.includes("=")&&(i===1||i===2)){let p=I(()=>xe({entry:s,leadingDashes:i}));return p.success?n.concat(p.data):(r.errors.add(p.error),n)}let a=s.slice(i);if(!w(a))return r.errors.add(new d({code:m.InvalidOption})),n;if(i===1){if(a.length===1)return n.concat({type:c.Option,original:s,value:[],name:a,variant:E.Short,fullName:s});let p=Ce({entry:s,optionDefinitions:e.options});return n.concat(...p)}return i===2?a.length>1?(n.push({type:c.Option,original:s,value:[],name:a,variant:E.Long,fullName:s}),n):(r.errors.add(new d({code:m.InvalidOption,path:s})),n):(r.errors.add(new d({code:m.InvalidOption,path:s})),n)},[])),xe=({leadingDashes:r,entry:e})=>{var s,i;let t=e.slice(r).split("=");if(r===1||((i=(s=t[0])==null?void 0:s.length)!=null?i:0)<2)throw new d({code:m.InvalidOption});if(t.length!==2)throw new d({code:m.InvalidOption});let[o,n]=t;if(!w(o))throw new d({code:m.InvalidOption});return{type:c.Option,value:[n],name:o,variant:E.Short,fullName:`--${o}`,valueStyle:x.Inline,original:e}},Ce=({entry:r,optionDefinitions:e})=>{let o=r.slice(1).split(""),n=new Map;for(let[a,p]of o.entries()){if(!w(p))continue;if(n.has(p))throw new d({code:m.InvalidOption});let l=b(p,e);if(!l||l[1].parse===u.Boolean){let f=o.slice(a+1).filter(M=>!w(M)),N=f.length?f.join(""):void 0;n.set(p,N);continue}let g=o.slice(a+1).join("");n.set(p,g);break}let s=Array.from(n.keys());return Array.from(n.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:s}}})};var me=v((r,e,t)=>{let o=!1;return t.reduce((s,i,a,p)=>{if(i.type===c.Argument)return o?s:[...s,i];o=!0;let l=b(i.name,e.options),g=Ae(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:N,args:M}=Te(i,g,f);return i.value=[...i.value,...N],[...s,i,...M]},[])}),Te=(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)},Ae=r=>{let e=[];for(let t of r){if(t.type===c.Option)break;e.push(t)}return e};var de=v((r,e,t)=>{let o=t.filter(s=>s.type===c.Argument),n=e.args.reduce((s,i,a)=>{var g;let p=(g=o[a])==null?void 0:g.value;if(!i.schema)return i===void 0?s:[...s,i];let l=i.schema.safeParse(p);return l.success?[...s,l.data]:(r.errors.add(new d({code:m.Validation,path:`Argument ${a+1}`,ctx:[l.error]})),s)},[]);return o.length>e.args.length&&r.errors.add(new d({code:m.InvalidArguments})),n});var le=v((r,e,t)=>{let o=new Set,n=Object.fromEntries(Object.entries(t).map(([i,a])=>{let p=ee(a,e);p.forEach(f=>o.add(f.index));let l=Pe(a,p);if(l instanceof d)return l.__setPath(j(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:j(a),ctx:[f.error]})),[i,{value:void 0,definition:a,options:p}];g=f.data}return[i,{value:g,options:p,definition:a}]})),s=e.filter((i,a)=>!o.has(a));return{validated:n,unknown:s}}),Pe=(r,e)=>({[u.Boolean]:we,[u.Single]:be,[u.Many]:Ie})[r.parse](e),we=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},be=r=>{var o;if(!r.length)return;let e=r.length<2,t=r.every(n=>n.value.length===0||n.value.length===1);return!e||!t?new d({code:m.InvalidOptionValue,ctx:[{shouldBe:u.Single}]}):(o=r[0])==null?void 0:o.value[0]},Ie=r=>r.reduce((e,t)=>[...e,...t.value],[]);var D=r=>new $(r),$=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=pe(this,e).unwrap(this.program),o=me(this,t).unwrap(this.program),n=o.filter(p=>p.type===c.Option),s=o.filter(p=>p.type===c.Argument),i=le(n,this.options).unwrap(this.program),a=de(this,s).unwrap(this.program);return{entries:e,parsedEntries:t,resolvedEntries:o,validatedOptions:i,validatedArgs:a}}attachBuiltIns(e){return Object.assign({help:Q},e)}};var B="\u26A0";var C=z(require("chalk"));var A=z(require("chalk"));var V=class{constructor(e){this.config=e}alignLog(e){let t=Math.max(...e.map(n=>n.left.length)),o=6;e.forEach(n=>{console.log(`${n.left.padEnd(t+o)}${n.right}`)})}indent(e=1){return" ".repeat(e*4)}log(){let{targetCommand:e,programDescription:t,commands:o}=this.config,n=o.find(s=>!s.name);if(n&&(console.log(),this.logCommandHelp(n)),t&&(console.log(),console.log(t),console.log()),n!==e){this.logCommandHelp(e);return}console.log(A.default.bold("Commands:")),this.alignLog(o.filter(s=>s.name).map(s=>({left:this.indent()+s.name,right:s.description?A.default.italic(s.description):""}))),console.log()}logCommandHelp(e){console.log(A.default.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(A.default.bold(`
Options:`)),this.alignLog(Object.values(e.options).map(o=>({left:this.indent()+re(o),right:o.description?A.default.italic(o.description):""}))))}};var De={name:"",undefinedOptionsBehavior:y.Error},ce=r=>new _(r),_=class{constructor(e){this._id=ne(),this.commands=[],this.config=h(h({},De),e),this.errors=new Set}run(e=process.argv.slice(2)){this.cleanUp();let{process:t,targetCommand:o,indexCommand:n}=this.matchCommand(e),{validatedArgs:s,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:n}),process.exit(0)),this.errors.size){let{error:g}=this.logErrors();g.length&&process.exit(1)}o.action({args:s,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=D(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(s=>s.name===e[0]),o=this.commands.find(s=>s.name===void 0),n=t!=null?t:o;return e=n===o?e:e.slice(1),n||this._registerError(new d({code:m.CommandNotFound,ctx:[e[0]]}),"exit"),{targetCommand:n,namedCommand:t,indexCommand:o,commandEntries:e,process:()=>n.process(e)}}logHelp({indexCommand:e,targetCommand:t}){new V({commands:this.commands,targetCommand:t,isIndexCommand:t===e,programName:this.config.name,programDescription:this.config.description}).log()}logErrors(){var o,n;this.errors.forEach(s=>s.__applyMessageMap(this.config.messages));let e=Array.from(this.errors),t=se(e,s=>{if(this.config.undefinedOptionsBehavior===y.Warn&&s.code===m.OptionNotDefined)return y.Warn});return(n=(o=this.config).onError)==null||n.call(o,t),t.warn.forEach(s=>{console.log(`${C.default.yellow(`[${B} ${C.default.bold("Warning")}]`)}${s.path?` | ${C.default.bold(s.path)}`:""} | ${s.message}`)}),t.error.forEach(s=>{console.log(`${C.default.red(`[${B} ${C.default.bold("Error")}]`)}${s.path?` | ${C.default.bold(s.path)}`:""} | ${s.message}`)}),t}_registerError(e,t){let o;if(e instanceof d)o=e;else try{return e()}catch(n){if(!(n instanceof d))throw new Error("You should never see this. If you do please create a GitHub issue");o=n}this.errors.add(o),t&&(this.logErrors(),process.exit(1))}_errorExit(){this.logErrors(),process.exit(1)}cleanUp(){this.errors=new Set}};var Ve=S;0&&(module.exports={ArgzodError,EntryType,ErrorCode,ErrorLevel,OptionParseType,OptionValueStyle,OptionVariant,argzod,createCommand,createProgram});