@geeth.io/cli
Version:
A minimal, class-based CLI command engine with support for nested commands, options, and attributes.
9 lines (8 loc) • 10 kB
JavaScript
;var oe=Object.create;var I=Object.defineProperty;var ne=Object.getOwnPropertyDescriptor;var ie=Object.getOwnPropertyNames;var se=Object.getPrototypeOf,ae=Object.prototype.hasOwnProperty;var L=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var le=(e,t,s,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ie(t))!ae.call(e,o)&&o!==s&&I(e,o,{get:()=>t[o],enumerable:!(r=ne(t,o))||r.enumerable});return e};var $=(e,t,s)=>(s=e!=null?oe(se(e)):{},le(t||!e||!e.__esModule?I(s,"default",{value:e,enumerable:!0}):s,e));var C=L((ke,M)=>{"use strict";var U=Object.defineProperty,ue=Object.getOwnPropertyDescriptor,ge=Object.getOwnPropertyNames,ce=Object.prototype.hasOwnProperty,pe=(e,t)=>{for(var s in t)U(e,s,{get:t[s],enumerable:!0})},de=(e,t,s,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ge(t))!ce.call(e,o)&&o!==s&&U(e,o,{get:()=>t[o],enumerable:!(r=ue(t,o))||r.enumerable});return e},me=e=>de(U({},"__esModule",{value:!0}),e),D={};pe(D,{logger:()=>he});M.exports=me(D);var fe="\x1B[0m",k={cyan:"\x1B[36m",green:"\x1B[32m",yellow:"\x1B[33m",red:"\x1B[31m",magenta:"\x1B[35m"};function E(e,t){return`${t}[${e.toUpperCase()}]${fe}`}var he={info:e=>{console.log(`${E("info",k.cyan)} ${e}`)},success:e=>{console.log(`${E("success",k.green)} ${e}`)},warn:e=>{console.warn(`${E("warn",k.yellow)} ${e}`)},error:e=>{console.error(`${E("error",k.red)} ${e}`)},debug:e=>{process.env.DEBUG==="true"&&console.debug(`${E("debug",k.magenta)} ${e}`)}}});var W=L((Ee,B)=>{"use strict";var F=Object.defineProperty,$e=Object.getOwnPropertyDescriptor,ye=Object.getOwnPropertyNames,we=Object.prototype.hasOwnProperty,be=(e,t)=>{for(var s in t)F(e,s,{get:t[s],enumerable:!0})},je=(e,t,s,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ye(t))!we.call(e,o)&&o!==s&&F(e,o,{get:()=>t[o],enumerable:!(r=$e(t,o))||r.enumerable});return e},Ce=e=>je(F({},"__esModule",{value:!0}),e),A={};be(A,{CommandEngine:()=>ve});B.exports=Ce(A);var ve=class{constructor(){this.commands=[],this.currentContext=[]}withContext(e,t){this.currentContext.push(e),t(),this.currentContext.pop()}command(e,t){let s=[...this.currentContext,e].join(" ").trim(),r={name:s,description:t,attributes:[],options:[],action:()=>{console.log(`No action defined for command: ${s}`)}};r.help=()=>{if(console.log(`
Usage: ${r.name} ${r.attributes.map(n=>n.required?`<${n.name}>`:`[${n.name}]`).join(" ")}`),console.log(`
${r.description}
`),r.attributes.length){console.log("Attributes:");for(let n of r.attributes)console.log(` ${n.name.padEnd(15)} ${n.description}${n.required?" (required)":""}${n.default!==void 0?` [default: ${JSON.stringify(n.default)}]`:""}`)}if(r.options.length){console.log(`
Options:`);for(let n of r.options){let l=n.alias?`, -${n.alias}`:"",i=n.default!==void 0?` [default: ${JSON.stringify(n.default)}]`:"";console.log(` --${n.flag}${l}`.padEnd(20)+n.description+(n.required?" (required)":"")+i)}}console.log("")},this.commands.push(r);let o={addAttribute:(n,l,i={})=>{let{required:u,default:g}=i;return r.attributes.push({name:n,description:l,required:u,default:g}),o},addOption:(n,l,i={})=>{let{required:u,alias:g,default:p}=i;return r.options.push({flag:n,description:l,required:u,alias:g,default:p}),o},action:n=>(r.action=n,o)};return o}parseValue(e){if(e==="true")return!0;if(e==="false")return!1;if(!isNaN(Number(e)))return Number(e);try{return JSON.parse(e)}catch{return e}}parse(e){let[,,...t]=e,s=t.filter(a=>a.trim()!=="");if(s.includes("--help")){for(let a=s.length;a>0;a--){let f=s.slice(0,a).join(" ").replace(/\s+/g," ").trim(),c=this.commands.find(d=>d.name===f);if(c?.help)return c.help()}return this.showHelp()}let r,o=[];for(let a=s.length;a>0;a--){let f=s.slice(0,a).join(" ").replace(/\s+/g," ").trim();if(r=this.commands.find(c=>c.name===f),r){o=s.slice(0,a);break}}if(!r)return console.error(`
\u274C Unknown command: ${s.join(" ")}`),this.showHelp();let n=s.slice(o.length),l={},i={},u=0,g=r.attributes,p=r.options;for(let a=0;a<n.length;a++){let f=n[a];if(f.startsWith("--")){let c=f.slice(2),d=p.find(h=>h.flag===c);if(d){let h=n[a+1];h&&!h.startsWith("-")?(i[c]=this.parseValue(h),a++):i[c]=d.default??!0}else console.warn(`\u26A0\uFE0F Unknown option: --${c}`)}else if(f.startsWith("-")){let c=f.slice(1),d=p.find(h=>h.alias===c);if(d){let h=n[a+1];h&&!h.startsWith("-")?(i[d.flag]=this.parseValue(h),a++):i[d.flag]=d.default??!0}else console.warn(`\u26A0\uFE0F Unknown alias: -${c}`)}else{let c=n[a+1];if(g.find(d=>d.name===f)&&c&&!c.startsWith("-"))l[f]=this.parseValue(c),a++;else if(u<g.length){let d=g[u++];l[d.name]=this.parseValue(f)}else console.warn(`\u26A0\uFE0F Unrecognized input: ${f}`)}}for(let a of g)!(a.name in l)&&a.default!==void 0&&(l[a.name]=a.default);for(let a of p)!(a.flag in i)&&a.default!==void 0&&(i[a.flag]=a.default);let m=g.filter(a=>a.required&&!(a.name in l));if(m.length>0)return console.error(`\u274C Missing required attributes: ${m.map(a=>`<${a.name}>`).join(", ")}`),r.help?.();let j=p.filter(a=>a.required&&!(a.flag in i));if(j.length>0)return console.error(`\u274C Missing required options: ${j.map(a=>`--${a.flag}`).join(", ")}`),r.help?.();r.action({attributes:l,options:i})}showHelp(){console.log(`
Available Commands:`);for(let e of this.commands)console.log(` ${e.name.padEnd(25)} ${e.description}`);console.log("\nUse `--help` with a command to learn more.\n")}}});var ee=$(C()),te=$(W());var b=$(C()),R=require("child_process"),S=require("fs"),O=$(require("path"));function V(e,t="install"){e.command(t,"Install a geeth.io CLI plugin").addAttribute("package","NPM package name (e.g. @geeth.io/plugin-logger)",{required:!0}).action(({attributes:s})=>{let r=s.package,o=O.default.resolve(__dirname,".."),n=O.default.join(o,"node_modules"),l=O.default.join(n,...r.split("/"));try{b.logger.info(`\u{1F4E6} Installing ${r} into CLI node_modules...`);let i=(0,R.spawnSync)("npm",["install",r],{cwd:o,stdio:"inherit",shell:!0});if(i.error)throw i.error;if(!(0,S.existsSync)(l)){b.logger.error(`\u274C Plugin not found after install: ${l}`);return}let u=O.default.join(l,"package.json");if((0,S.existsSync)(u)&&!JSON.parse((0,S.readFileSync)(u,"utf8")).plugin?.register){b.logger.warn(`\u26A0\uFE0F Plugin ${r} installed but does not declare "plugin.register: true"`);return}let g=require(l),p=g.default?.register||g.register;typeof p=="function"?(p(e),b.logger.success(`\u2705 Registered ${r} commands immediately.`)):b.logger.warn(`\u26A0\uFE0F Plugin ${r} does not export a register() function.`)}catch(i){b.logger.error(`\u274C Failed to install plugin: ${i instanceof Error?i.message:String(i)}`)}})}var N=$(C()),H=require("child_process"),z=require("fs"),q=$(require("path"));function G(e,t="uninstall"){e.command(t,"Uninstall a geeth.io CLI plugin").addAttribute("package","NPM package name (e.g. @geeth.io/logger)",{required:!0}).action(({attributes:s})=>{let r=s.package,o=q.default.resolve(__dirname,".."),n=q.default.join(o,"node_modules"),l=q.default.join(n,...r.split("/"));try{N.logger.info(`\u{1F9F9} Uninstalling ${r} from CLI node_modules...`);let i=(0,H.spawnSync)("npm",["uninstall",r],{cwd:o,stdio:"inherit",shell:!0});if(i.error)throw i.error;(0,z.existsSync)(l)?N.logger.warn(`\u26A0\uFE0F Plugin folder still exists after uninstall: ${l}`):N.logger.success(`\u2705 Uninstalled ${r} successfully.`)}catch(i){N.logger.error(`\u274C Failed to uninstall plugin: ${i instanceof Error?i.message:String(i)}`)}})}var _=$(C()),y=require("fs"),v=$(require("path"));function K(e,t="list"){e.command(t,"List installed geeth.io CLI plugins").action(()=>{let s=v.default.resolve(__dirname,".."),r=v.default.join(s,"node_modules");if(!(0,y.existsSync)(r)){_.logger.warn("\u26A0\uFE0F No node_modules found.");return}if(!(0,y.readdirSync)(r).filter(u=>u==="@geeth.io").length){_.logger.info("\u{1F4E6} No @geeth.io scoped plugins found.");return}let n=v.default.join(r,"@geeth.io"),l=(0,y.readdirSync)(n),i=!1;for(let u of l){let g=v.default.join(n,u),p=v.default.join(g,"package.json");if(!(0,y.existsSync)(p))continue;let m=JSON.parse((0,y.readFileSync)(p,"utf8"));m.plugin?.register&&(_.logger.success(`\u2705 ${m.name} (${m.version})`),i=!0)}i||_.logger.info("\u{1F4E6} No registered plugins found.")})}var P=$(C()),Q=require("child_process"),T=require("fs"),J=$(require("path"));function X(e,t="update"){e.command(t,"Update all installed geeth.io CLI plugins").action(()=>{let s=J.default.resolve(__dirname,".."),r=J.default.join(s,"package.json");try{let n=JSON.parse((0,T.readFileSync)(r,"utf8")).dependencies||{},l=Object.keys(n).filter(i=>i.startsWith("@geeth.io/cli-plugin"));if(l.length===0){P.logger.info("\u{1F4E6} No @geeth.io plugins found to update.");return}for(let i of l){P.logger.info(`\u2B06\uFE0F Updating ${i} to latest...`);let u=(0,Q.spawnSync)("npm",["install",`${i}@latest`,"--save"],{cwd:s,stdio:"inherit",shell:!0});u.error?P.logger.error(`\u274C Failed to update ${i}: ${u.error.message}`):P.logger.success(`\u2705 Updated ${i} to latest.`)}}catch(o){P.logger.error(`\u274C Failed to update plugins: ${o instanceof Error?o.message:String(o)}`)}})}var Y=(e,t="plugin")=>{e.withContext(t,()=>{V(e),G(e),K(e),X(e)})};var Z=(e,t="cli")=>{e.withContext(t,()=>{Y(e)})};var w=require("fs"),x=$(require("path")),re=async()=>{let e=new te.CommandEngine;try{Z(e),await Pe(e),e.parse(process.argv)}catch(t){ee.logger.error(`[ERROR] ${t instanceof Error?t.message:String(t)}`),process.exit(1)}};async function Pe(e){let t=x.default.resolve(__dirname,".."),s=x.default.join(t,"node_modules");if(!(0,w.existsSync)(s))return;let r=(0,w.readdirSync)(s).filter(o=>o.startsWith("@geeth.io"));for(let o of r){let n=x.default.join(s,o),l=(0,w.readdirSync)(n);for(let i of l){let u=x.default.join(n,i),g=x.default.join(u,"package.json");if((0,w.existsSync)(g)&&JSON.parse((0,w.readFileSync)(g,"utf8")).plugin?.register)try{let m=require(u),j=m.default?.register||m.register;typeof j=="function"&&j(e)}catch(m){console.warn(`\u26A0\uFE0F Failed to load plugin ${o}/${i}: ${m}`)}}}}(async()=>await re())();