cleye 2.3.0 → 2.5.0

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.cjs CHANGED
@@ -1,10 +1,10 @@
1
- "use strict";var D=Object.defineProperty;var o=(t,e)=>D(t,"name",{value:e,configurable:!0});var M=require("type-flag"),R=require("tty"),F=require("terminal-columns");const A=new Uint32Array(65536),U=o((t,e)=>{const r=t.length,a=e.length,n=1<<r-1;let s=-1,i=0,f=r,l=r;for(;l--;)A[t.charCodeAt(l)]|=1<<l;for(l=0;l<a;l++){let h=A[e.charCodeAt(l)];const u=h|i;h|=(h&s)+s^s,i|=~(h|s),s&=h,i&n&&f++,s&n&&f--,i=i<<1|1,s=s<<1|~(u|i),i&=u}for(l=r;l--;)A[t.charCodeAt(l)]=0;return f},"myers_32"),L=o((t,e)=>{const r=e.length,a=t.length,n=[],s=[],i=Math.ceil(r/32),f=Math.ceil(a/32);for(let c=0;c<i;c++)s[c]=-1,n[c]=0;let l=0;for(;l<f-1;l++){let c=0,p=-1;const m=l*32,y=Math.min(32,a)+m;for(let d=m;d<y;d++)A[t.charCodeAt(d)]|=1<<d;for(let d=0;d<r;d++){const v=A[e.charCodeAt(d)],w=s[d/32|0]>>>d&1,g=n[d/32|0]>>>d&1,N=v|c,q=((v|g)&p)+p^p|v|g;let x=c|~(q|p),j=p&q;x>>>31^w&&(s[d/32|0]^=1<<d),j>>>31^g&&(n[d/32|0]^=1<<d),x=x<<1|w,j=j<<1|g,p=j|~(N|x),c=x&N}for(let d=m;d<y;d++)A[t.charCodeAt(d)]=0}let h=0,u=-1;const $=l*32,C=Math.min(32,a-$)+$;for(let c=$;c<C;c++)A[t.charCodeAt(c)]|=1<<c;let E=a;for(let c=0;c<r;c++){const p=A[e.charCodeAt(c)],m=s[c/32|0]>>>c&1,y=n[c/32|0]>>>c&1,d=p|h,v=((p|y)&u)+u^u|p|y;let w=h|~(v|u),g=u&v;E+=w>>>a-1&1,E-=g>>>a-1&1,w>>>31^m&&(s[c/32|0]^=1<<c),g>>>31^y&&(n[c/32|0]^=1<<c),w=w<<1|m,g=g<<1|y,u=g|~(d|w),h=w&d}for(let c=$;c<C;c++)A[t.charCodeAt(c)]=0;return E},"myers_x"),k=o((t,e)=>{if(t.length<e.length){const r=e;e=t,t=r}return e.length===0?t.length:t.length<=32?U(t,e):L(t,e)},"distance"),T=o((t,e)=>{let r=1/0,a=0;for(let n=0;n<e.length;n++){const s=k(t,e[n]);s<r&&(r=s,a=n)}return e[a]},"closest"),H=o(t=>t.replaceAll(/[\W_]([a-z\d])?/gi,(e,r)=>r?r.toUpperCase():""),"camelCase"),V=o(t=>t.replaceAll(/\B([A-Z])/g,"-$1").toLowerCase(),"kebabCase"),J={"> 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 W(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:`--${V(n)}`,aliasesEnabled:e,aliasFormatted:i?`-${s.alias}`:void 0}}).map(n=>(n.aliasesEnabled=e,[{type:"flagName",data:n},{type:"flagDescription",data:n}])),tableBreakpoints:J}}}o(W,"renderFlags");const B=o(t=>!t||(t.version??(t.help?t.help.version:void 0)),"getVersion"),P=o(t=>{const e="parent"in t&&t.parent?.name;return(e?`${e} `:"")+t.name},"getName");function z(t){const e=[];t.name&&e.push(P(t));const r=B(t)??("parent"in t&&B(t.parent));if(r&&e.push(`v${r}`),e.length!==0)return{id:"name",type:"text",data:`${e.join(" ")}
1
+ "use strict";var D=Object.defineProperty;var o=(t,e)=>D(t,"name",{value:e,configurable:!0});var M=require("type-flag"),R=require("tty"),q=require("terminal-columns");const A=new Uint32Array(65536),U=o((t,e)=>{const r=t.length,a=e.length,n=1<<r-1;let s=-1,i=0,f=r,l=r;for(;l--;)A[t.charCodeAt(l)]|=1<<l;for(l=0;l<a;l++){let h=A[e.charCodeAt(l)];const u=h|i;h|=(h&s)+s^s,i|=~(h|s),s&=h,i&n&&f++,s&n&&f--,i=i<<1|1,s=s<<1|~(u|i),i&=u}for(l=r;l--;)A[t.charCodeAt(l)]=0;return f},"myers_32"),L=o((t,e)=>{const r=e.length,a=t.length,n=[],s=[],i=Math.ceil(r/32),f=Math.ceil(a/32);for(let c=0;c<i;c++)s[c]=-1,n[c]=0;let l=0;for(;l<f-1;l++){let c=0,p=-1;const m=l*32,y=Math.min(32,a)+m;for(let d=m;d<y;d++)A[t.charCodeAt(d)]|=1<<d;for(let d=0;d<r;d++){const v=A[e.charCodeAt(d)],w=s[d/32|0]>>>d&1,g=n[d/32|0]>>>d&1,O=v|c,N=((v|g)&p)+p^p|v|g;let x=c|~(N|p),j=p&N;x>>>31^w&&(s[d/32|0]^=1<<d),j>>>31^g&&(n[d/32|0]^=1<<d),x=x<<1|w,j=j<<1|g,p=j|~(O|x),c=x&O}for(let d=m;d<y;d++)A[t.charCodeAt(d)]=0}let h=0,u=-1;const $=l*32,C=Math.min(32,a-$)+$;for(let c=$;c<C;c++)A[t.charCodeAt(c)]|=1<<c;let E=a;for(let c=0;c<r;c++){const p=A[e.charCodeAt(c)],m=s[c/32|0]>>>c&1,y=n[c/32|0]>>>c&1,d=p|h,v=((p|y)&u)+u^u|p|y;let w=h|~(v|u),g=u&v;E+=w>>>a-1&1,E-=g>>>a-1&1,w>>>31^m&&(s[c/32|0]^=1<<c),g>>>31^y&&(n[c/32|0]^=1<<c),w=w<<1|m,g=g<<1|y,u=g|~(d|w),h=w&d}for(let c=$;c<C;c++)A[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?U(t,e):L(t,e)},"distance"),T=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"),H=o(t=>t.replaceAll(/[\W_]([a-z\d])?/gi,(e,r)=>r?r.toUpperCase():""),"camelCase"),V=o(t=>t.replaceAll(/\B([A-Z])/g,"-$1").toLowerCase(),"kebabCase"),J={"> 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 W(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:`--${V(n)}`,aliasesEnabled:e,aliasFormatted:i?`-${s.alias}`:void 0}}).map(n=>(n.aliasesEnabled=e,[{type:"flagName",data:n},{type:"flagDescription",data:n}])),tableBreakpoints:J}}}o(W,"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 z(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(" ")}
2
2
  `}}o(z,"getNameAndVersion");function K(t){const{help:e}=t;if(!(!e||!e.description))return{id:"description",type:"text",data:`${e.description}
3
3
  `}}o(K,"getDescription");function Z(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(`
4
- `):e.usage}}:void 0;if(t.name){const r=[],a=[P(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(f=>f.startsWith("<"));a.push(n.map(f=>f!=="--"?f: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(`
4
+ `):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(f=>f.startsWith("<"));a.push(n.map(f=>f!=="--"?f: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(`
5
5
  `)}}}}o(Z,"getUsage");function G(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(G,"getCommands");function Q(t){if(!(!t.flags||Object.keys(t.flags).length===0))return{id:"flags",type:"section",data:{title:"Flags:",body:W(t.flags),indentBody:0}}}o(Q,"getFlags");function X(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(`
6
6
  `)),r)return{id:"examples",type:"section",data:{title:"Examples:",body:r}}}o(X,"getExamples");function Y(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(Y,"getAliases");const ee=o(t=>[z,K,Z,G,Q,X,Y].map(e=>e(t)).filter(Boolean),"generateHelp"),te=R.WriteStream.prototype.hasColors();class re{static{o(this,"Renderers")}text(e){return e}bold(e){return te?`\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)}
7
7
  `:"")+(r?this.indentText({text:this.render(r),spaces:a}):"")}
8
- `}table({tableData:e,tableOptions:r,tableBreakpoints:a}){return F.terminalColumns(e.map(n=>n.map(s=>this.render(s))),a?F.breakpoints(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 f=this.flagParameter("type"in r?r.type:r);f&&(i+=`${this.flagOperator(e)}${f}`)}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(`
9
- `);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:b}=JSON,ne=/[|\\{}()[\]^$+*?.]/;function S(t){const e=[];let r,a;for(const n of t){if(a)throw new Error(`Invalid parameter: Spread parameter ${b(a)} must be last`);const s=n[0],i=n.at(-1);let f;if(s==="<"&&i===">"&&(f=!0,r))throw new Error(`Invalid parameter: Required parameter ${b(n)} cannot come after optional parameter ${b(r)}`);if(s==="["&&i==="]"&&(f=!1,r=n),f===void 0)throw new Error(`Invalid parameter: ${b(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(ne);if(u)throw new Error(`Invalid parameter: ${b(n)}. Invalid character found ${b(u[0])}`);e.push({name:l,required:f,spread:h})}return e}o(S,"parseParameters");function I(t,e,r,a){for(let n=0;n<e.length;n+=1){const{name:s,required:i,spread:f}=e[n],l=H(s);if(l in t)throw new Error(`Invalid parameter: ${b(s)} is used more than once.`);const h=f?r.slice(n):r[n];if(f&&(n=e.length),i&&(!h||f&&h.length===0))return console.error(`Error: Missing required parameter ${b(s)}
10
- `),a(),process.exit(1);t[l]=h}}o(I,"mapParametersToArguments");function ae(t){return t!==!1}o(ae,"helpEnabled");const se=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"),ie=o((t,e)=>{if(t.length<3||e.length===0)return;const r=T(t,e);return k(t,r)<=2?r:void 0},"findClosestFlag"),oe=o((t,e)=>{const r=Object.keys(t);if(r.length!==0){for(const a of r){const n=ie(a,e),s=n?` (Did you mean --${n}?)`:"";console.error(`Error: Unknown flag: --${a}.${s}`)}process.exit(1)}},"handleUnknownFlags");function _(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,f=ae(i);f&&!("help"in n)&&(n.help={type:Boolean,alias:"h",description:"Show help"});const l=M.typeFlag(n,a,{ignore:e.ignoreArgv,booleanNegation:e.booleanFlagNegation??e.parent?.booleanFlagNegation}),h=o(()=>{console.log(e.version)},"showVersion");if(s&&l.flags.version===!0)return h(),process.exit(0);const u=new re,$=f&&i?.render?i.render:m=>u.render(m),C=o(m=>{const y=ee({...e,...m?{help:m}:{},flags:n});console.log($(y,u))},"showHelp");if(f&&l.flags.help===!0)return C(),process.exit(0);if((e.strictFlags??e.parent?.strictFlags)&&oe(l.unknownFlags,se(n)),e.parameters){let{parameters:m}=e,y=l._;const d=m.indexOf("--"),v=m.slice(d+1),w=Object.create(null);let g=[];d>-1&&v.length>0&&(m=m.slice(0,d),g=l._["--"],y=y.slice(0,-g.length||void 0)),I(w,S(m),y,C),d>-1&&v.length>0&&I(w,S(v),g,C),Object.assign(l._,w)}const c={...l,showVersion:h,showHelp:C},p={command:t,...c};if(typeof r=="function"){const m=r(c);if(m&&"then"in m)return Object.assign(Promise.resolve(m),p)}return p}o(_,"cliBase");function le(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: ${b(i)}`);r.set(i,a)}}return r.get(t)}o(le,"getCommand");function ce(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: ${b(t.name)}`);const a=r[0];if(t.commands&&a&&O(a)){const n=le(a,t.commands);if(n)return _(n.options.name,{...n.options,parent:t},n.callback,r.slice(1))}return _(void 0,t,e,r)}o(ce,"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"),exports.cli=ce,exports.command=de;
8
+ `}table({tableData:e,tableOptions:r,tableBreakpoints:a}){return q.terminalColumns(e.map(n=>n.map(s=>this.render(s))),a?q.breakpoints(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 f=this.flagParameter("type"in r?r.type:r);f&&(i+=`${this.flagOperator(e)}${f}`)}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(`
9
+ `);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 P=o(t=>t.length>0&&!t.includes(" "),"isValidScriptName"),{stringify:b}=JSON,ne=/[|\\{}()[\]^$+*?.]/;function S(t){const e=[];let r,a;for(const n of t){if(a)throw new Error(`Invalid parameter: Spread parameter ${b(a)} must be last`);const s=n[0],i=n.at(-1);let f;if(s==="<"&&i===">"&&(f=!0,r))throw new Error(`Invalid parameter: Required parameter ${b(n)} cannot come after optional parameter ${b(r)}`);if(s==="["&&i==="]"&&(f=!1,r=n),f===void 0)throw new Error(`Invalid parameter: ${b(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(ne);if(u)throw new Error(`Invalid parameter: ${b(n)}. Invalid character found ${b(u[0])}`);e.push({name:l,required:f,spread:h})}return e}o(S,"parseParameters");function I(t,e,r,a){for(let n=0;n<e.length;n+=1){const{name:s,required:i,spread:f}=e[n],l=H(s);if(l in t)throw new Error(`Invalid parameter: ${b(s)} is used more than once.`);const h=f?r.slice(n):r[n];if(f&&(n=e.length),i&&(!h||f&&h.length===0))return console.error(`Error: Missing required parameter ${b(s)}
10
+ `),a(),process.exit(1);t[l]=h}}o(I,"mapParametersToArguments");function ae(t){return t!==!1}o(ae,"helpEnabled");const se=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"),ie=o((t,e)=>{if(t.length<3||e.length===0)return;const r=T(t,e);return F(t,r)<=2?r:void 0},"findClosestFlag"),oe=o((t,e)=>{const r=Object.keys(t);if(r.length!==0){for(const a of r){const n=ie(a,e),s=n?` (Did you mean --${n}?)`:"";console.error(`Error: Unknown flag: --${a}.${s}`)}process.exit(1)}},"handleUnknownFlags");function _(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,f=ae(i);f&&!("help"in n)&&(n.help={type:Boolean,alias:"h",description:"Show help"});const l=M.typeFlag(n,a,{ignore:e.ignoreArgv,booleanNegation:e.booleanFlagNegation??e.parent?.booleanFlagNegation}),h=o(()=>{console.log(e.version)},"showVersion");if(s&&l.flags.version===!0)return h(),process.exit(0);const u=new re,$=f&&i?.render?i.render:m=>u.render(m),C=o(m=>{const y=ee({...e,...m?{help:m}:{},flags:n});console.log($(y,u))},"showHelp");if(f&&l.flags.help===!0)return C(),process.exit(0);if((e.strictFlags??e.parent?.strictFlags)&&oe(l.unknownFlags,se(n)),e.parameters){let{parameters:m}=e,y=l._;const d=m.indexOf("--"),v=m.slice(d+1),w=Object.create(null);let g=[];d>-1&&v.length>0&&(m=m.slice(0,d),g=l._["--"],y=y.slice(0,-g.length||void 0)),I(w,S(m),y,C),d>-1&&v.length>0&&I(w,S(v),g,C),Object.assign(l._,w)}const c={...l,showVersion:h,showHelp:C},p={command:t,...c};if(typeof r=="function"){const m=r(c);if(m&&"then"in m)return Object.assign(Promise.resolve(m),p)}return p}o(_,"cliBase");function le(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: ${b(i)}`);r.set(i,a)}}return r.get(t)}o(le,"getCommand");function ce(t,e,r=process.argv.slice(2)){if(!t)throw new Error("Options is required");if("name"in t&&(!t.name||t.name!==t.name.trim()))throw new Error(`Invalid script name: ${b(t.name)}`);const a=r[0];if(t.commands&&a&&P(a)){const n=le(a,t.commands);if(n)return _(n.options.name,{...n.options,parent:t},n.callback,r.slice(1))}return _(void 0,t,e,r)}o(ce,"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(!P(r))throw new Error(`Invalid command name ${JSON.stringify(r)}. Command names must be one word.`);return{options:t,callback:e}}o(de,"command"),exports.cli=ce,exports.command=de;
package/dist/index.mjs CHANGED
@@ -1,10 +1,10 @@
1
- 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 A=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--;)A[t.charCodeAt(l)]|=1<<l;for(l=0;l<a;l++){let h=A[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--;)A[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,p=-1;const m=l*32,y=Math.min(32,a)+m;for(let f=m;f<y;f++)A[t.charCodeAt(f)]|=1<<f;for(let f=0;f<r;f++){const v=A[e.charCodeAt(f)],w=s[f/32|0]>>>f&1,g=n[f/32|0]>>>f&1,N=v|c,F=((v|g)&p)+p^p|v|g;let x=c|~(F|p),j=p&F;x>>>31^w&&(s[f/32|0]^=1<<f),j>>>31^g&&(n[f/32|0]^=1<<f),x=x<<1|w,j=j<<1|g,p=j|~(N|x),c=x&N}for(let f=m;f<y;f++)A[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++)A[t.charCodeAt(c)]|=1<<c;let E=a;for(let c=0;c<r;c++){const p=A[e.charCodeAt(c)],m=s[c/32|0]>>>c&1,y=n[c/32|0]>>>c&1,f=p|h,v=((p|y)&u)+u^u|p|y;let w=h|~(v|u),g=u&v;E+=w>>>a-1&1,E-=g>>>a-1&1,w>>>31^m&&(s[c/32|0]^=1<<c),g>>>31^y&&(n[c/32|0]^=1<<c),w=w<<1|m,g=g<<1|y,u=g|~(f|w),h=w&f}for(let c=C;c<$;c++)A[t.charCodeAt(c)]=0;return E},"myers_x"),q=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=q(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(" ")}
1
+ 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 A=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--;)A[t.charCodeAt(l)]|=1<<l;for(l=0;l<a;l++){let h=A[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--;)A[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,p=-1;const m=l*32,y=Math.min(32,a)+m;for(let f=m;f<y;f++)A[t.charCodeAt(f)]|=1<<f;for(let f=0;f<r;f++){const v=A[e.charCodeAt(f)],w=s[f/32|0]>>>f&1,g=n[f/32|0]>>>f&1,O=v|c,N=((v|g)&p)+p^p|v|g;let x=c|~(N|p),j=p&N;x>>>31^w&&(s[f/32|0]^=1<<f),j>>>31^g&&(n[f/32|0]^=1<<f),x=x<<1|w,j=j<<1|g,p=j|~(O|x),c=x&O}for(let f=m;f<y;f++)A[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++)A[t.charCodeAt(c)]|=1<<c;let E=a;for(let c=0;c<r;c++){const p=A[e.charCodeAt(c)],m=s[c/32|0]>>>c&1,y=n[c/32|0]>>>c&1,f=p|h,v=((p|y)&u)+u^u|p|y;let w=h|~(v|u),g=u&v;E+=w>>>a-1&1,E-=g>>>a-1&1,w>>>31^m&&(s[c/32|0]^=1<<c),g>>>31^y&&(n[c/32|0]^=1<<c),w=w<<1|m,g=g<<1|y,u=g|~(f|w),h=w&f}for(let c=C;c<$;c++)A[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 q=o(t=>!t||(t.version??(t.help?t.help.version:void 0)),"getVersion"),k=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(k(t));const r=q(t)??("parent"in t&&q(t.parent));if(r&&e.push(`v${r}`),e.length!==0)return{id:"name",type:"text",data:`${e.join(" ")}
2
2
  `}}o(K,"getNameAndVersion");function Z(t){const{help:e}=t;if(!(!e||!e.description))return{id:"description",type:"text",data:`${e.description}
3
3
  `}}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(`
4
- `):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(`
4
+ `):e.usage}}:void 0;if(t.name){const r=[],a=[k(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(`
5
5
  `)}}}}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(`
6
6
  `)),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)}
7
7
  `:"")+(r?this.indentText({text:this.render(r),spaces:a}):"")}
8
8
  `}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(`
9
- `);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:b}=JSON,ae=/[|\\{}()[\]^$+*?.]/;function P(t){const e=[];let r,a;for(const n of t){if(a)throw new Error(`Invalid parameter: Spread parameter ${b(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 ${b(n)} cannot come after optional parameter ${b(r)}`);if(s==="["&&i==="]"&&(d=!1,r=n),d===void 0)throw new Error(`Invalid parameter: ${b(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: ${b(n)}. Invalid character found ${b(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: ${b(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 ${b(s)}
10
- `),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 q(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,booleanNegation:e.booleanFlagNegation??e.parent?.booleanFlagNegation}),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 g=[];f>-1&&v.length>0&&(m=m.slice(0,f),g=l._["--"],y=y.slice(0,-g.length||void 0)),S(w,P(m),y,$),f>-1&&v.length>0&&S(w,P(v),g,$),Object.assign(l._,w)}const c={...l,showVersion:h,showHelp:$},p={command:t,...c};if(typeof r=="function"){const m=r(c);if(m&&"then"in m)return Object.assign(Promise.resolve(m),p)}return p}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: ${b(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: ${b(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};
9
+ `);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 B=o(t=>t.length>0&&!t.includes(" "),"isValidScriptName"),{stringify:b}=JSON,ae=/[|\\{}()[\]^$+*?.]/;function P(t){const e=[];let r,a;for(const n of t){if(a)throw new Error(`Invalid parameter: Spread parameter ${b(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 ${b(n)} cannot come after optional parameter ${b(r)}`);if(s==="["&&i==="]"&&(d=!1,r=n),d===void 0)throw new Error(`Invalid parameter: ${b(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: ${b(n)}. Invalid character found ${b(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: ${b(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 ${b(s)}
10
+ `),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,booleanNegation:e.booleanFlagNegation??e.parent?.booleanFlagNegation}),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 g=[];f>-1&&v.length>0&&(m=m.slice(0,f),g=l._["--"],y=y.slice(0,-g.length||void 0)),S(w,P(m),y,$),f>-1&&v.length>0&&S(w,P(v),g,$),Object.assign(l._,w)}const c={...l,showVersion:h,showHelp:$},p={command:t,...c};if(typeof r=="function"){const m=r(c);if(m&&"then"in m)return Object.assign(Promise.resolve(m),p)}return p}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: ${b(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||t.name!==t.name.trim()))throw new Error(`Invalid script name: ${b(t.name)}`);const a=r[0];if(t.commands&&a&&B(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(!B(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};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cleye",
3
- "version": "2.3.0",
3
+ "version": "2.5.0",
4
4
  "description": "The intuitive CLI development tool",
5
5
  "keywords": [
6
6
  "cli",
@@ -19,8 +19,10 @@
19
19
  "email": "hiroki.osame@gmail.com"
20
20
  },
21
21
  "files": [
22
- "dist"
22
+ "dist",
23
+ "skills"
23
24
  ],
25
+ "type": "module",
24
26
  "main": "./dist/index.cjs",
25
27
  "module": "./dist/index.mjs",
26
28
  "types": "./dist/index.d.cts",
@@ -0,0 +1,263 @@
1
+ ---
2
+ name: cleye
3
+ description: cleye CLI development tool — argv parsing with typed parameters, flags, commands, and auto-generated help. Use when building Node.js CLI scripts with cleye or when the user imports `cli` or `command` from `cleye`.
4
+ ---
5
+
6
+ # cleye
7
+
8
+ ## Quick Patterns
9
+
10
+ | Task | Pattern |
11
+ |------|---------|
12
+ | Basic CLI | `cli({ name, parameters, flags })` |
13
+ | Named command | `command({ name, parameters, flags }, callback)` |
14
+ | Register commands | `cli({ commands: [cmd1, cmd2] })` |
15
+ | Async callback | `await cli({ ... }, async (argv) => { ... })` |
16
+ | Raw argv | `cli({ ... }, callback, process.argv.slice(2))` |
17
+
18
+ ## Parameters
19
+
20
+ Positional arguments mapped to named properties on `argv._`.
21
+
22
+ | Format | Description |
23
+ |--------|-------------|
24
+ | `<name>` | Required |
25
+ | `[name]` | Optional |
26
+ | `<name...>` | Required spread (1+) |
27
+ | `[name...]` | Optional spread (0+) |
28
+ | `--` | End-of-flags separator |
29
+
30
+ ```ts
31
+ const argv = cli({
32
+ parameters: ['<required>', '[optional]', '[rest...]']
33
+ })
34
+ argv._.required // string
35
+ argv._.optional // string | undefined
36
+ argv._.rest // string[]
37
+ argv._['--'] // string[] — everything after --
38
+ ```
39
+
40
+ Multi-word names use camelCase on `argv._`: `'<first name>'` → `argv._.firstName`.
41
+
42
+ ## Flags
43
+
44
+ ```ts
45
+ const argv = cli({
46
+ flags: {
47
+ verbose: Boolean, // shorthand
48
+ output: {
49
+ type: String,
50
+ alias: 'o',
51
+ default: 'dist',
52
+ description: 'Output directory',
53
+ placeholder: '<path>'
54
+ },
55
+ count: {
56
+ type: [Number], // array: -n 1 -n 2
57
+ alias: 'n'
58
+ }
59
+ }
60
+ })
61
+
62
+ argv.flags.verbose // boolean | undefined
63
+ argv.flags.output // string
64
+ argv.flags.count // number[]
65
+ ```
66
+
67
+ Flag name is camelCase; parsed from kebab-case CLI input (`--output-dir` → `outputDir`).
68
+
69
+ **Delimiters** — `=`, `:`, and `.` all work as value separators:
70
+
71
+ ```sh
72
+ --flag=value --flag:value --flag.value
73
+ ```
74
+
75
+ Use `:` when the value itself contains `=` (e.g. `--define:KEY=VALUE`).
76
+
77
+ **Counting flags** — use `[Boolean]` and check `.length`:
78
+
79
+ ```ts
80
+ cli({
81
+ flags: {
82
+ verbose: {
83
+ type: [Boolean],
84
+ alias: 'v'
85
+ }
86
+ }
87
+ })
88
+ // -vvv → argv.flags.verbose.length === 3
89
+ ```
90
+
91
+ **Optional value** — custom type returns `true` when no value is given:
92
+
93
+ ```ts
94
+ const OptionalString = (value: string) => value || true
95
+ cli({ flags: { tag: OptionalString } })
96
+ // --tag → true
97
+ // --tag beta → 'beta'
98
+ ```
99
+
100
+ ## Boolean Flag Negation
101
+
102
+ By default, set a boolean flag to `false` using the `=` operator:
103
+
104
+ ```sh
105
+ --verbose=false # → false
106
+ --verbose false # → true (false treated as separate argument)
107
+ ```
108
+
109
+ To also support the `--no-<flag>` convention, enable `booleanFlagNegation` (additive — `=false` still works):
110
+
111
+ ```ts
112
+ cli({
113
+ flags: { verbose: Boolean },
114
+ booleanFlagNegation: true
115
+ })
116
+ // --no-verbose → false
117
+ // --verbose=false → false (still works)
118
+ // Last-wins: --verbose --no-verbose → false
119
+ ```
120
+
121
+ Commands inherit `booleanFlagNegation` from the parent `cli()` but can override it.
122
+
123
+ ## Strict Flags
124
+
125
+ ```ts
126
+ cli({
127
+ flags: { foo: Boolean },
128
+ strictFlags: true
129
+ })
130
+ // --baz → Error: Unknown flag: --baz. (Did you mean --foo?)
131
+ ```
132
+
133
+ Commands inherit `strictFlags` but can override it.
134
+
135
+ ## Commands
136
+
137
+ ```ts
138
+ // install-command.ts
139
+ export const installCommand = command({
140
+ name: 'install',
141
+ alias: ['i', 'add'],
142
+ parameters: ['<package name>'],
143
+ flags: { saveDev: Boolean }
144
+ }, (argv) => {
145
+ argv._.packageName // string
146
+ argv.flags.saveDev // boolean | undefined
147
+ })
148
+
149
+ // main.ts
150
+ cli({
151
+ name: 'npm',
152
+ version: '1.0.0',
153
+ commands: [installCommand]
154
+ })
155
+ ```
156
+
157
+ When a command is matched, `argv.command` narrows the type for type-safe branching.
158
+
159
+ ## Help & Version
160
+
161
+ ```ts
162
+ cli({
163
+ name: 'my-script',
164
+ version: '1.2.3', // enables --version; also shown in --help
165
+ help: {
166
+ description: 'Does things',
167
+ usage: 'my-script [flags] <file>',
168
+ examples: ['my-script foo.txt', 'my-script --output=dist foo.txt'],
169
+ version: '1.2.3' // show version in --help without handling --version
170
+ }
171
+ })
172
+ // help: false — disables --help handling; call argv.showHelp() manually
173
+ ```
174
+
175
+ ## Custom Flag Types
176
+
177
+ Any function `(value: string) => T` works as a flag type — the return type is inferred.
178
+
179
+ ```ts
180
+ // Validation + narrowing
181
+ const Port = (value: string) => {
182
+ const n = Number(value)
183
+ if (!Number.isInteger(n) || n < 1 || n > 65_535) { throw new Error(`Invalid port: ${value}`) }
184
+ return n
185
+ }
186
+ // argv.flags.port → number
187
+
188
+ // Enum
189
+ const sizes = ['small', 'medium', 'large'] as const
190
+ const Size = (v: string) => {
191
+ if (!(sizes as readonly string[]).includes(v)) { throw new Error(`Expected: ${sizes.join(', ')}`) }
192
+ return v as typeof sizes[number]
193
+ }
194
+ // argv.flags.size → 'small' | 'medium' | 'large'
195
+
196
+ // Comma-separated list
197
+ const List = (v: string) => v.split(',')
198
+ // --tags a,b,c → argv.flags.tags === ['a', 'b', 'c']
199
+
200
+ // Inline JSON
201
+ cli({ flags: { data: JSON.parse } })
202
+ // --data '{"key":1}' → argv.flags.data === { key: 1 }
203
+
204
+ // Dot-nested object (combine with . delimiter)
205
+ const Env = (v: string): Record<string, string | true> => {
206
+ const [k, value] = v.split('=')
207
+ return { [k]: value ?? true }
208
+ }
209
+ cli({ flags: { env: [Env] } })
210
+ // --env.TOKEN=abc --env.CI → merge to { TOKEN: 'abc', CI: true }
211
+ ```
212
+
213
+ ## Help Customization
214
+
215
+ ```ts
216
+ cli({
217
+ help: {
218
+ render(nodes, renderers) {
219
+ nodes.push('\nDocs: https://example.com')
220
+ renderers.flagOperator = () => '=' // --flag=<value>
221
+ return renderers.render(nodes)
222
+ }
223
+ }
224
+ })
225
+ ```
226
+
227
+ Default renderers: `/src/render-help/renderers.ts`.
228
+
229
+ ## ignoreArgv
230
+
231
+ ```ts
232
+ cli({
233
+ ignoreArgv(type, flagOrArgv, value) {
234
+ if (type === 'unknown-flag') { return true } // silently skip unknown flags
235
+ }
236
+ })
237
+ ```
238
+
239
+ `type`: `'known-flag' | 'unknown-flag' | 'argument'`
240
+
241
+ ## Return Type
242
+
243
+ ```ts
244
+ type ParsedArgv = {
245
+ _: string[] & Parameters
246
+ flags: { [name: string]: InferredType }
247
+ unknownFlags: { [name: string]: (string | boolean)[] }
248
+ showVersion: () => void
249
+ showHelp: (options?: HelpOptions) => void
250
+ }
251
+ ```
252
+
253
+ ## TypeScript Exports
254
+
255
+ ```ts
256
+ import type { Flags, Renderers, TypeFlag } from 'cleye'
257
+ ```
258
+
259
+ | Type | Use |
260
+ |------|-----|
261
+ | `Flags` | Type for the `flags` option object |
262
+ | `Renderers` | Help renderer class type for `help.render` customization |
263
+ | `TypeFlag` | Re-export from `type-flag` for portable type declarations |