UNPKG

cleye

Version:

The intuitive CLI development tool

11 lines (10 loc) 9.97 kB
var _=Object.defineProperty;var o=(t,e)=>_(t,"name",{value:e,configurable:!0});import{typeFlag as D}from"type-flag";import M from"tty";import{terminalColumns as R,breakpoints as U}from"terminal-columns";const b=new Uint32Array(65536),L=o((t,e)=>{const r=t.length,a=e.length,n=1<<r-1;let s=-1,i=0,d=r,l=r;for(;l--;)b[t.charCodeAt(l)]|=1<<l;for(l=0;l<a;l++){let h=b[e.charCodeAt(l)];const u=h|i;h|=(h&s)+s^s,i|=~(h|s),s&=h,i&n&&d++,s&n&&d--,i=i<<1|1,s=s<<1|~(u|i),i&=u}for(l=r;l--;)b[t.charCodeAt(l)]=0;return d},"myers_32"),T=o((t,e)=>{const r=e.length,a=t.length,n=[],s=[],i=Math.ceil(r/32),d=Math.ceil(a/32);for(let c=0;c<i;c++)s[c]=-1,n[c]=0;let l=0;for(;l<d-1;l++){let c=0,g=-1;const m=l*32,y=Math.min(32,a)+m;for(let f=m;f<y;f++)b[t.charCodeAt(f)]|=1<<f;for(let f=0;f<r;f++){const v=b[e.charCodeAt(f)],w=s[f/32|0]>>>f&1,p=n[f/32|0]>>>f&1,N=v|c,q=((v|p)&g)+g^g|v|p;let x=c|~(q|g),j=g&q;x>>>31^w&&(s[f/32|0]^=1<<f),j>>>31^p&&(n[f/32|0]^=1<<f),x=x<<1|w,j=j<<1|p,g=j|~(N|x),c=x&N}for(let f=m;f<y;f++)b[t.charCodeAt(f)]=0}let h=0,u=-1;const C=l*32,$=Math.min(32,a-C)+C;for(let c=C;c<$;c++)b[t.charCodeAt(c)]|=1<<c;let E=a;for(let c=0;c<r;c++){const g=b[e.charCodeAt(c)],m=s[c/32|0]>>>c&1,y=n[c/32|0]>>>c&1,f=g|h,v=((g|y)&u)+u^u|g|y;let w=h|~(v|u),p=u&v;E+=w>>>a-1&1,E-=p>>>a-1&1,w>>>31^m&&(s[c/32|0]^=1<<c),p>>>31^y&&(n[c/32|0]^=1<<c),w=w<<1|m,p=p<<1|y,u=p|~(f|w),h=w&f}for(let c=C;c<$;c++)b[t.charCodeAt(c)]=0;return E},"myers_x"),F=o((t,e)=>{if(t.length<e.length){const r=e;e=t,t=r}return e.length===0?t.length:t.length<=32?L(t,e):T(t,e)},"distance"),H=o((t,e)=>{let r=1/0,a=0;for(let n=0;n<e.length;n++){const s=F(t,e[n]);s<r&&(r=s,a=n)}return e[a]},"closest"),V=o(t=>t.replaceAll(/[\W_]([a-z\d])?/gi,(e,r)=>r?r.toUpperCase():""),"camelCase"),J=o(t=>t.replaceAll(/\B([A-Z])/g,"-$1").toLowerCase(),"kebabCase"),W={"> 80":[{width:"content-width",paddingLeft:2,paddingRight:8},{width:"auto"}],"> 40":[{width:"auto",paddingLeft:2,paddingRight:8,preprocess:o(t=>t.trim(),"preprocess")},{width:"100%",paddingLeft:2,paddingBottom:1}],"> 0":{stdoutColumns:1e3,columns:[{width:"content-width",paddingLeft:2,paddingRight:8},{width:"content-width"}]}};function z(t){let e=!1;return{type:"table",data:{tableData:Object.keys(t).sort((n,s)=>n.localeCompare(s)).map(n=>{const s=t[n],i="alias"in s;return i&&(e=!0),{name:n,flag:s,flagFormatted:`--${J(n)}`,aliasesEnabled:e,aliasFormatted:i?`-${s.alias}`:void 0}}).map(n=>(n.aliasesEnabled=e,[{type:"flagName",data:n},{type:"flagDescription",data:n}])),tableBreakpoints:W}}}o(z,"renderFlags");const k=o(t=>!t||(t.version??(t.help?t.help.version:void 0)),"getVersion"),B=o(t=>{const e="parent"in t&&t.parent?.name;return(e?`${e} `:"")+t.name},"getName");function K(t){const e=[];t.name&&e.push(B(t));const r=k(t)??("parent"in t&&k(t.parent));if(r&&e.push(`v${r}`),e.length!==0)return{id:"name",type:"text",data:`${e.join(" ")} `}}o(K,"getNameAndVersion");function Z(t){const{help:e}=t;if(!(!e||!e.description))return{id:"description",type:"text",data:`${e.description} `}}o(Z,"getDescription");function G(t){const e=t.help||{};if("usage"in e)return e.usage?{id:"usage",type:"section",data:{title:"Usage:",body:Array.isArray(e.usage)?e.usage.join(` `):e.usage}}:void 0;if(t.name){const r=[],a=[B(t)];if(t.flags&&Object.keys(t.flags).length>0&&a.push("[flags...]"),t.parameters&&t.parameters.length>0){const{parameters:n}=t,s=n.indexOf("--"),i=s!==-1&&n.slice(s+1).some(d=>d.startsWith("<"));a.push(n.map(d=>d!=="--"?d:i?"--":"[--]").join(" "))}if(a.length>1&&r.push(a.join(" ")),"commands"in t&&t.commands?.length&&r.push(`${t.name} <command>`),r.length>0)return{id:"usage",type:"section",data:{title:"Usage:",body:r.join(` `)}}}}o(G,"getUsage");function Q(t){return!("commands"in t)||!t.commands?.length?void 0:{id:"commands",type:"section",data:{title:"Commands:",body:{type:"table",data:{tableData:t.commands.map(a=>{const{help:n}=a.options;return[a.options.name,typeof n=="object"&&n.description||""]}),tableOptions:[{width:"content-width",paddingLeft:2,paddingRight:8}]}},indentBody:0}}}o(Q,"getCommands");function X(t){if(!(!t.flags||Object.keys(t.flags).length===0))return{id:"flags",type:"section",data:{title:"Flags:",body:z(t.flags),indentBody:0}}}o(X,"getFlags");function Y(t){const{help:e}=t;if(!e||!e.examples||e.examples.length===0)return;let{examples:r}=e;if(Array.isArray(r)&&(r=r.join(` `)),r)return{id:"examples",type:"section",data:{title:"Examples:",body:r}}}o(Y,"getExamples");function ee(t){if(!("alias"in t)||!t.alias)return;const{alias:e}=t;return{id:"aliases",type:"section",data:{title:"Aliases:",body:Array.isArray(e)?e.join(", "):e}}}o(ee,"getAliases");const te=o(t=>[K,Z,G,Q,X,Y,ee].map(e=>e(t)).filter(Boolean),"generateHelp"),re=M.WriteStream.prototype.hasColors();class ne{static{o(this,"Renderers")}text(e){return e}bold(e){return re?`\x1B[1m${e}\x1B[22m`:e.toLocaleUpperCase()}indentText({text:e,spaces:r}){return e.replaceAll(/^/gm," ".repeat(r))}heading(e){return this.bold(e)}section({title:e,body:r,indentBody:a=2}){return`${(e?`${this.heading(e)} `:"")+(r?this.indentText({text:this.render(r),spaces:a}):"")} `}table({tableData:e,tableOptions:r,tableBreakpoints:a}){return R(e.map(n=>n.map(s=>this.render(s))),a?U(a):r)}flagParameter(e){return e===Boolean?"":e===String?"<string>":e===Number?"<number>":Array.isArray(e)?this.flagParameter(e[0]):"<value>"}flagOperator(e){return" "}flagName(e){const{flag:r,flagFormatted:a,aliasesEnabled:n,aliasFormatted:s}=e;let i="";if(s?i+=`${s}, `:n&&(i+=" "),i+=a,"placeholder"in r&&typeof r.placeholder=="string")i+=`${this.flagOperator(e)}${r.placeholder}`;else{const d=this.flagParameter("type"in r?r.type:r);d&&(i+=`${this.flagOperator(e)}${d}`)}return i}flagDefault(e){return JSON.stringify(e)}flagDescription({flag:e}){let r="description"in e?e.description??"":"";if("default"in e){let{default:a}=e;typeof a=="function"&&(a=a()),a&&(r+=` (default: ${this.flagDefault(a)})`)}return r}render(e){if(typeof e=="string")return e;if(Array.isArray(e))return e.map(r=>this.render(r)).join(` `);if("type"in e&&this[e.type]){const r=this[e.type];if(typeof r=="function")return r.call(this,e.data)}throw new Error(`Invalid node type: ${JSON.stringify(e)}`)}}const O=o(t=>t.length>0&&!t.includes(" "),"isValidScriptName"),{stringify:A}=JSON,ae=/[|\\{}()[\]^$+*?.]/;function P(t){const e=[];let r,a;for(const n of t){if(a)throw new Error(`Invalid parameter: Spread parameter ${A(a)} must be last`);const s=n[0],i=n.at(-1);let d;if(s==="<"&&i===">"&&(d=!0,r))throw new Error(`Invalid parameter: Required parameter ${A(n)} cannot come after optional parameter ${A(r)}`);if(s==="["&&i==="]"&&(d=!1,r=n),d===void 0)throw new Error(`Invalid parameter: ${A(n)}. Must be wrapped in <> (required parameter) or [] (optional parameter)`);let l=n.slice(1,-1);const h=l.slice(-3)==="...";h&&(a=n,l=l.slice(0,-3));const u=l.match(ae);if(u)throw new Error(`Invalid parameter: ${A(n)}. Invalid character found ${A(u[0])}`);e.push({name:l,required:d,spread:h})}return e}o(P,"parseParameters");function S(t,e,r,a){for(let n=0;n<e.length;n+=1){const{name:s,required:i,spread:d}=e[n],l=V(s);if(l in t)throw new Error(`Invalid parameter: ${A(s)} is used more than once.`);const h=d?r.slice(n):r[n];if(d&&(n=e.length),i&&(!h||d&&h.length===0))return console.error(`Error: Missing required parameter ${A(s)} `),a(),process.exit(1);t[l]=h}}o(S,"mapParametersToArguments");function se(t){return t!==!1}o(se,"helpEnabled");const ie=o(t=>{const e=[];for(const[r,a]of Object.entries(t))if(e.push(r),a&&typeof a=="object"&&"alias"in a){const{alias:n}=a;typeof n=="string"&&n?e.push(n):Array.isArray(n)&&e.push(...n.filter(Boolean))}return e},"getKnownFlagNames"),oe=o((t,e)=>{if(t.length<3||e.length===0)return;const r=H(t,e);return F(t,r)<=2?r:void 0},"findClosestFlag"),le=o((t,e)=>{const r=Object.keys(t);if(r.length!==0){for(const a of r){const n=oe(a,e),s=n?` (Did you mean --${n}?)`:"";console.error(`Error: Unknown flag: --${a}.${s}`)}process.exit(1)}},"handleUnknownFlags");function I(t,e,r,a){const n={...e.flags},s=e.version&&!("version"in n);s&&(n.version={type:Boolean,description:"Show version"});const{help:i}=e,d=se(i);d&&!("help"in n)&&(n.help={type:Boolean,alias:"h",description:"Show help"});const l=D(n,a,{ignore:e.ignoreArgv}),h=o(()=>{console.log(e.version)},"showVersion");if(s&&l.flags.version===!0)return h(),process.exit(0);const u=new ne,C=d&&i?.render?i.render:m=>u.render(m),$=o(m=>{const y=te({...e,...m?{help:m}:{},flags:n});console.log(C(y,u))},"showHelp");if(d&&l.flags.help===!0)return $(),process.exit(0);if((e.strictFlags??e.parent?.strictFlags)&&le(l.unknownFlags,ie(n)),e.parameters){let{parameters:m}=e,y=l._;const f=m.indexOf("--"),v=m.slice(f+1),w=Object.create(null);let p=[];f>-1&&v.length>0&&(m=m.slice(0,f),p=l._["--"],y=y.slice(0,-p.length||void 0)),S(w,P(m),y,$),f>-1&&v.length>0&&S(w,P(v),p,$),Object.assign(l._,w)}const c={...l,showVersion:h,showHelp:$},g={command:t,...c};if(typeof r=="function"){const m=r(c);if(m&&"then"in m)return Object.assign(Promise.resolve(m),g)}return g}o(I,"cliBase");function ce(t,e){const r=new Map;for(const a of e){const n=[a.options.name],{alias:s}=a.options;s&&(Array.isArray(s)?n.push(...s):n.push(s));for(const i of n){if(r.has(i))throw new Error(`Duplicate command name found: ${A(i)}`);r.set(i,a)}}return r.get(t)}o(ce,"getCommand");function fe(t,e,r=process.argv.slice(2)){if(!t)throw new Error("Options is required");if("name"in t&&(!t.name||!O(t.name)))throw new Error(`Invalid script name: ${A(t.name)}`);const a=r[0];if(t.commands&&a&&O(a)){const n=ce(a,t.commands);if(n)return I(n.options.name,{...n.options,parent:t},n.callback,r.slice(1))}return I(void 0,t,e,r)}o(fe,"cli");function de(t,e){if(!t)throw new Error("Command options are required");const{name:r}=t;if(r===void 0)throw new Error("Command name is required");if(!O(r))throw new Error(`Invalid command name ${JSON.stringify(r)}. Command names must be one word.`);return{options:t,callback:e}}o(de,"command");export{fe as cli,de as command};