@miregma/miregen
Version:
A CLI tool that unlocks seamless Miregma Template Generation.
15 lines • 5.41 kB
JavaScript
import s from'chalk';import {Command}from'commander';import B from'inquirer';import {execSync}from'node:child_process';import m from'compare-versions';import G from'node:https';import u from'node:fs';import ee,{basename}from'node:path';import {Readable}from'node:stream';import {pipeline}from'node:stream/promises';import z from'async-retry';import W from'ora';import Q from'tar';var $=()=>{try{let e=process.version.replace(/^v/,""),t=m.compare(e,"22.0.0",">=");return {message:t?`Node version is ${e} \u2705`:`Node version is ${e}, but >= 22.0.0 is required \u274C`,ok:t}}catch(e){return {message:e instanceof Error?e.message:"Failed to check Node version \u274C",ok:false}}},J=()=>{try{let t=execSync("flutter --version",{encoding:"utf-8"}).match(/Flutter (\d+\.\d+\.\d+)/);if(!t||!t[1])return {message:"Cannot parse Flutter version \u274C",ok:!1};let r=t[1],o=m.compare(r,"3.2.0",">=");return {message:o?`Flutter version is ${r} \u2705`:`Flutter version is ${r}, but >= 3.2.0 is required \u274C`,ok:o}}catch(e){return {message:e instanceof Error?e.message:"Flutter is not installed or not in PATH \u274C",ok:false}}},V=()=>{try{let t=execSync("dart --version",{encoding:"utf-8",stdio:"pipe"}).match(/Dart SDK version: (\d+\.\d+\.\d+)/);if(!t||!t[1])return {message:"Cannot parse Dart version \u274C",ok:!1};let r=t[1],o=m.compare(r,"3.8.0",">=");return {message:o?`Dart version is ${r} \u2705`:`Dart version is ${r}, but >= 3.8.0 is required \u274C`,ok:o}}catch(e){return {message:e instanceof Error?e.message:"Dart is not installed or not in PATH \u274C",ok:false}}},g=()=>[$(),J(),V()];var A="2.0.7";var p=()=>{try{return A}catch{return "unknown"}},j=e=>new Promise((t,r)=>{G.get(`https://registry.npmjs.org/${e}/latest`,o=>{let n="";o.on("data",i=>n+=i),o.on("end",()=>{try{let i=JSON.parse(n);t(i.version);}catch(i){r(i);}});}).on("error",r);}),O=async()=>{let e=p(),t;try{t=await j("@miregma/miregen");}catch{t=s.red("failed to fetch");}process.stdout.write(`${s.blue("Miregen CLI")}
Current: ${s.yellow(e)}
Latest: ${s.green(t)}
`),t!=="failed to fetch"&&t!==e&&process.stdout.write(s.magenta(`Update available: npm install -g miregen@latest
`));};async function Z(e){let t=await fetch(e);if(!t.ok||!t.body)throw new Error(`Failed to fetch tarball: ${t.status} ${t.statusText}`);return Readable.fromWeb(t.body)}async function R(e,t){let r=W(`Downloading template from ${basename(t)}...`).start();try{await z(async o=>{try{await pipeline(await Z(t),Q.x({cwd:e,strip:1}));}catch(n){o(new Error(`Failed to download ${t}: ${n instanceof Error?n.message:n}`));}},{minTimeout:500,retries:3}),r.succeed(s.green(`Template downloaded to ${e}`));}catch(o){throw r.fail(s.red(`Failed to download template: ${o instanceof Error?o.message:o}`)),o}}var a=async e=>{if(e.length===0){process.stderr.write(s.red(`No templates available
`));return}let{template:t}=await B.prompt([{choices:e.map(n=>n.name),message:"Select a template:",name:"template",type:"list"}]),r=e.find(n=>n.name===t);if(!r){process.stderr.write(s.red(`Template not found!
`));return}let o=ee.join(process.cwd(),r.name);u.existsSync(o)||u.mkdirSync(o);try{return await R(o,r.repo),o}catch(n){process.stderr.write(s.red(`Failed to download template: ${n instanceof Error?n.message:n}
`));return}};var w="miregen-nest-app",P="https://codeload.github.com/miregma/miregen-nestjs-template/tar.gz/main",h="miregen-next-landing-heroui",F="",L="miregen-next-landing-shadcn",M="",C="miregen-next-docs-fumadocs",k="",S="miregen-next-dashboard-heroui",b="",y="miregen-next-dashboard-shadcn",x="",I="miregen-flutty-template",v="",U="miregen-miregma-template",H="";var _=async()=>{await a([{name:w,repo:P}]);};var l=async()=>{await a([{name:h,repo:F},{name:L,repo:M},{name:C,repo:k},{name:S,repo:b},{name:y,repo:x}]);};var d=async()=>{await a([{name:I,repo:v},{name:U,repo:H}]);};var N=new Command;N.name("miregen").description("Miregen CLI for generating project templates").version(p(),"-v, --version","Show CLI version").option("--init <type>","Initialize a project type: backend|frontend|mobile").option("--template_name <name>","Select a specific template").option("--doctor","Check your environment setup");N.parse(process.argv);var T=N.opts(),X=()=>{let e=g();e.forEach(o=>{let n=o.ok?s.green(o.message):s.red(o.message);process.stdout.write(n+`
`);});let r=e.every(o=>o.ok)?s.green("All checks passed \u2705"):s.red("Some checks failed \u274C");process.stdout.write(r+`
`);},re=async()=>{let{action:e}=await B.prompt([{choices:["Backend","Frontend","Mobile",new B.Separator,s.green("Doctor"),s.blue("Version")],message:"Select an option:",name:"action",type:"list"}]);switch(e){case "Backend":await _();break;case "Frontend":await l();break;case "Mobile":await d();break;case s.green("Doctor"):X();break;case s.blue("Version"):await O();break;default:process.stderr.write(s.red(`Invalid selection
`));break}},ne=async()=>{if(T.init){let e=T.init.toLowerCase();switch(["backend","frontend","mobile"].includes(e)||(process.stderr.write(s.red(`Invalid project type! Use backend|frontend|mobile
`)),process.exit(1)),e){case "backend":await _();break;case "frontend":await l();break;case "mobile":await d();break}}else T.doctor?X():await re();};ne().catch(e=>{process.stderr.write(s.red(`CLI error: ${e instanceof Error?e.message:String(e)}
`)),process.exit(1);});//# sourceMappingURL=index.js.map
//# sourceMappingURL=index.js.map