UNPKG

heroui-cli

Version:

A CLI tool that unlocks seamless HeroUI integration (Previously NextUI CLI)

85 lines (82 loc) 53.8 kB
#!/usr/bin/env node import D from 'chalk'; import { Command } from 'commander'; import xt, { existsSync, readFileSync, mkdirSync, writeFileSync, renameSync, readdirSync, statSync } from 'node:fs'; import { join as join$1, basename as basename$1 } from 'node:path'; import * as q from '@clack/prompts'; import { spinner, text, select, cancel, isCancel, confirm } from '@clack/prompts'; import In, { resolve, join, basename } from 'pathe'; import { findUp } from 'find-up'; import { fileURLToPath } from 'node:url'; import rt from '@winches/prompts'; import Dt from 'gradient-string'; import { exec, execSync } from 'node:child_process'; import { validate, compareVersions } from 'compare-versions'; import qn from 'fast-glob'; import ko from 'async-retry'; import Tn, { oraPromise } from 'ora'; import { Readable } from 'node:stream'; import { pipeline } from 'node:stream/promises'; import ar from 'tar'; var _=process.cwd(),P=e=>resolve(_,e),$e=resolve(fileURLToPath(import.meta.url),"../components.json");var Rt=["#F54180","#338EF7"],nt=Dt(...Rt),wn=nt("HeroUI CLI:"),a=class{constructor(){}static log(...t){console.log(...t);}static info(...t){console.info(...t.map(o=>D.blue(o)));}static success(...t){console.info(...t.map(o=>D.green(o)));}static warn(...t){console.warn(...t.map(o=>D.yellow(o)));}static error(...t){console.error(...t.map(o=>D.red(o)));}static grey(...t){console.log(...t.map(o=>D.gray(o)));}static gradient(t,o){this.log(Dt(...o?.colors??Rt)(String(t)));}static prefix(t,...o){return this[t](wn,...o)}static newLine(t){t||(t=1);for(let o=0;o<t;o++)this.log();}};var it={onCancel:()=>{a.log(`${D.red("\u2716")} Operation cancelled`),process.exit(0);}};async function he(e,t){return (await rt({hint:"- Space to select. Return to submit",message:e,min:1,name:"value",type:"autocompleteMultiselect",...t?{choices:t}:{}},it)).value}async function ae(e,t){return (await rt({message:e,name:"value",type:"select",...t?{choices:t}:{}},it)).value}async function Lt(e,t){return (await rt({hint:"- Space to select. Return to submit",message:e,min:1,name:"value",type:"multiselect",...t?{choices:t}:{}},it)).value}var Ne=["npm","bun","pnpm","yarn"];var Mt={"bun.lockb":"bun","npm-shrinkwrap.json":"npm","package-lock.json":"npm","pnpm-lock.yaml":"pnpm","yarn.lock":"yarn"};async function j(e=_){let t,o=await findUp(Object.keys(Mt),{cwd:e});return o?t=Mt[In.basename(o)]:t=await ae("No agent found, please choose one",Ne.map(n=>({title:n,value:n}))),t}var st={bold:{bottomLeft:"\u2517",bottomRight:"\u251B",horizontal:"\u2501",topLeft:"\u250F",topRight:"\u2513",vertical:"\u2503"},classic:{bottomLeft:"+",bottomRight:"+",horizontal:"-",topLeft:"+",topRight:"+",vertical:"|"},double:{bottomLeft:"\u255A",bottomRight:"\u255D",horizontal:"\u2550",topLeft:"\u2554",topRight:"\u2557",vertical:"\u2551"},doubleSingle:{bottomLeft:"\u2558",bottomRight:"\u255B",horizontal:"\u2550",topLeft:"\u2552",topRight:"\u2555",vertical:"\u2502"},round:{bottomLeft:"\u2570",bottomRight:"\u256F",horizontal:"\u2500",topLeft:"\u256D",topRight:"\u256E",vertical:"\u2502"},single:{bottomLeft:"\u2514",bottomRight:"\u2518",horizontal:"\u2500",topLeft:"\u250C",topRight:"\u2510",vertical:"\u2502"},singleDouble:{bottomLeft:"\u2559",bottomRight:"\u255C",horizontal:"\u2500",topLeft:"\u2553",topRight:"\u2556",vertical:"\u2551"}};function E(e="",t=""){if(!validate(e))return -1;try{return compareVersions(e,t)}catch{return 0}}async function Dn(){if(!existsSync($e)){await Nt();return}let e=JSON.parse(readFileSync($e,"utf-8")),t=e.version,o=e.betaVersion,n=await te("latestVersion"),r=await te("betaVersion");(E(t,n)===-1||o&&E(o,r)===-1)&&await Nt(n,r);}async function at(){let e={};await Dn();try{e=JSON.parse(readFileSync($e,"utf-8"));}catch(t){}return e}async function pt(e,t){t=t??`Executing ${e}`;let o=Tn({discardStdin:!1,spinner:{frames:[`\u280B ${D.gray(`${t}.`)}`,`\u2819 ${D.gray(`${t}..`)}`,`\u2839 ${D.gray(`${t}...`)}`,`\u2838 ${D.gray(`${t}.`)}`,`\u283C ${D.gray(`${t}..`)}`,`\u2834 ${D.gray(`${t}...`)}`,`\u2826 ${D.gray(`${t}.`)}`,`\u2827 ${D.gray(`${t}..`)}`,`\u2807 ${D.gray(`${t}...`)}`,`\u280F ${D.gray(`${t}.`)}`],interval:150}});o.start();let n=await new Promise(r=>{exec(e,(i,s)=>{i&&(a.error(`Exec cmd ${e} error`),process.exit(1)),r(s.trim());});});return o.stop(),n}async function F(e){return y.heroUIComponentsPackageMap[e]?y.heroUIComponentsPackageMap[e].version:(await jt(e)).version}var Ot=e=>`https://unpkg.com/@heroui/react@${e}/dist/components.json`;async function Nt(e,t){[e,t]=await Promise.all([e||te("latestVersion"),t||te("betaVersion")]);let o=Ot(e),[n,r]=await Promise.all([Ht(o),L("beta")&&t?Ht(Ot(t),!1):Promise.resolve([])]),i=r.filter(p=>!n.find(m=>m.name===p.name));n.push(...i);let s={betaComponents:r,betaVersion:t,components:n,version:e};return writeFileSync($e,JSON.stringify(s,null,2),"utf-8"),s}async function Ht(e,t=!0){let o;return await oraPromise(ko(async n=>{try{let r=await fetch(e,{body:null,headers:{"Content-Type":"application/json",accept:"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"},method:"GET",mode:"cors"});o=JSON.parse(await r.text());}catch(r){n(r);}},{retries:3}),{failText(n){t&&a.prefix("error",`Update components data error: ${n}`),process.exit(1);},...t?{successText:D.greenBright(`Components data updated successfully! `)}:{},text:"Fetching components data..."}),o}process.env.CI==="true";var qt=resolve(fileURLToPath(import.meta.url),"../.."),ct=e=>resolve(qt,e),Yt=resolve(fileURLToPath(import.meta.url),".."),Ln=existsSync(join(Yt,"components.json")),He=Ln?resolve(`${Yt}/.heroui-cli-cache`):resolve(join(qt,".."),"node_modules/.heroui-cli-cache"),_e=resolve(`${He}/data.json`);var Hn=30*6e4,lt=!1;function mt(e=lt){lt=!!e,!existsSync(He)&&(mkdirSync(He,{recursive:!0}),writeFileSync(_e,JSON.stringify({}),"utf8"));}function je(){let e=readFileSync(_e,"utf8");return JSON.parse(e)}function Kt(e,t,o){mt();let n=o??je(),r=new Date,i=+r+Hn;n[e]={...t,date:r,expiredDate:i,expiredFormatDate:new Date(i).toString(),formatDate:r.toString()},writeFileSync(_e,JSON.stringify(n,void 0,2),"utf-8");}function _n(){return +new Date}function jn(e){return _n()-e}function Jt(e,t){if(lt)return !0;let n=(t??je())[e];return n?.expiredDate?jn(n.expiredDate)>0:!0}async function jt(e){let t=je();if(Jt(e,t)){let r={version:await pt(`npm view ${e} version`,`Fetching ${e} latest version`)};return Kt(e,r,t),r}return t[e]}async function W(e,t){let o=je();if(Jt(e,o)){let i={execResult:await pt(e,t)};return Kt(e,i,o),i.execResult}return o[e].execResult}async function Ve(e){return await W(`npm view ${e} dist-tags --json`,`Fetching ${e} tags`)}function zt(e){return `@heroui/${e.replace("@heroui/","")}`}async function pe(e){if(y.betaHeroUIComponentsPackageMap[e])return y.betaHeroUIComponentsPackageMap[e].version;let t=await Ve(e);try{return JSON.parse(t).beta}catch(o){a.error(`Get beta version error: ${o}`),process.exit(1);}}async function Wt(e){return await Promise.all(e.map(zt).map(async o=>{let n=await pe(o);return `${zt(o)}@${n}`}))}function $(e,t=!0){let o;try{o=JSON.parse(readFileSync(e,"utf-8"));}catch(c){a.prefix("error",`Error reading package.json file: ${e} Error: ${c}`);}let n=o.devDependencies||{},r=o.dependencies||{},i={...n,...r},s=new Set(Object.keys(i)),p=y.heroUIComponents.map(c=>{let u=c.version,g=c.versionMode;if(s.has(c.package)){let d=G(i,c.package);u=t?`${d.currentVersion} new: ${u}`:d.currentVersion,g=d.versionMode;}return {...c,version:u,versionMode:g}}).filter(c=>s.has(c.package)),m=s.has(I);return {allDependencies:i,allDependenciesKeys:s,currentComponents:p,dependencies:r,devDependencies:n,isAllComponents:m,packageJson:o}}function Gt(e){return e.map(t=>{let n=y.heroUIComponentsMap[t]?.package;return n||t})}async function Qt(e,t,o=!0){let n=[];for(let r of e){let{currentVersion:i}=G(t,r),{versionMode:s}=G(t,r),p=(await W(`npm show ${r} homepage`)||"").replace(/\n/,""),m=(await W(`npm show ${r} description`)||"").replace(/\n/,""),c=y.heroUIComponentsPackageMap[r]?.version||await F(r);i=o?`${i} new: ${c}`:i;let u={description:m||"",docs:p||"",name:r,package:r,peerDependencies:{},status:"stable",style:"",version:i,versionMode:s};n.push(u);}return n}var Xt="heroui-cli",ve="framer-motion",Se="tailwindcss",I="@heroui/react",Y="@heroui/theme",oe="@heroui/system";var Zt="@heroui",ut="https://heroui.com/docs/guide/installation#global-installation",Fe="https://heroui.com/docs/guide/installation#tailwind-css-setup";var eo="https://heroui.com/docs/guide/installation#setup-pnpm-optional",qe="https://heroui.com/docs/guide/installation#provider-setup",v={checkPluginsRegex:/heroui(([\W\w]+)?)/,content:"./node_modules/@heroui/theme/dist/**/*.{js,ts,jsx,tsx}",darkMode:'darkMode: "class"',importContent:(e=!1)=>e?"import {heroui} from '@heroui/theme';":"const {heroui} = require('@heroui/theme');",plugins:"heroui()"},Ye={content:(e,t)=>{e.forEach(r=>{let i=to(r,t);e.push(...i);});let o=[...new Set(e.map(r=>r.style||r.name))];return o.length===1?`./node_modules/@heroui/theme/dist/components/${o[0]}.js`:`./node_modules/@heroui/theme/dist/components/(${o.reduce((r,i)=>r+=`${i}|`,"").replace(/\|$/,"")}).js`},plugins:"heroui()"},ft={import:"HeroUIProvider"},O={content:"public-hoist-pattern[]=*@heroui/*"};function to(e,t){let o=e.name,n=P(`node_modules/@heroui/${o}`),r=[e];if(!existsSync(n)&&t){let s=P("node_modules/.pnpm"),p=qn.sync(`**/@heroui/${o}`,{absolute:!0,cwd:s,onlyDirectories:!0})[0];if(p)n=p;else return r}let{currentComponents:i}=$(join(n,"package.json"));if(i.length)for(let s of i){let p=to(s,t);r.push(...p);}return r}var y={debug:!1,beta:!1,cliLatestVersion:"",latestVersion:"",betaVersion:"",betaHeroUIComponents:[],betaHeroUIIComponentsKeys:[],betaHeroUIComponentsKeysSet:new Set,betaHeroUIComponentsMap:{},betaHeroUIComponentsPackageMap:{},betaHeroUIcomponentsPackages:[],heroUIComponents:[],heroUIComponentsKeys:[],heroUIComponentsKeysSet:new Set,heroUIComponentsMap:{},heroUIComponentsPackageMap:{},heroUIcomponentsPackages:[]};async function te(e){let t=y[e];return t||(e==="latestVersion"?(t=await F(I),y[e]=t):e==="cliLatestVersion"?(t=await F(Xt),y[e]=t):e==="betaVersion"&&(t=await pe(I),y[e]=t)),t}function L(e){return y[e]}function Bn(e){let t=e.map(s=>s.name),o=e.map(s=>s.package),n=new Set(t),r=e.reduce((s,p)=>(s[p.name]=p,s),{}),i=e.reduce((s,p)=>(s[p.package]=p,s),{});return {heroUIComponentsKeys:t,heroUIComponentsKeysSet:n,heroUIComponentsMap:r,heroUIComponentsPackageMap:i,heroUIcomponentsPackages:o}}function dt({beta:e,heroUIComponents:t}){let{heroUIComponentsKeys:o,heroUIComponentsKeysSet:n,heroUIComponentsMap:r,heroUIComponentsPackageMap:i,heroUIcomponentsPackages:s}=Bn(t);e?(y.betaHeroUIComponents=t,y.betaHeroUIIComponentsKeys=o,y.betaHeroUIComponentsKeysSet=n,y.betaHeroUIComponentsMap=r,y.betaHeroUIComponentsPackageMap=i,y.betaHeroUIcomponentsPackages=s):(y.heroUIComponents=t,y.heroUIComponentsKeys=o,y.heroUIComponentsKeysSet=n,y.heroUIComponentsMap=r,y.heroUIComponentsPackageMap=i,y.heroUIcomponentsPackages=s);}var Be=["package","version","status","docs"],oo=["package","version","status"];var M=/\u001b\[[\d;]+m/g,U=st.round,gt=" ",Ue=`${U.vertical}${gt}`,no=`${gt}${U.vertical}${gt}`,ro=/([\W\w]+)\snew:/,io=/new:\s([\W\w]+)/;function ce({commandName:e,components:t,message:o=`Current installed components: `,warnError:n=!0}){if(!t.length){n&&a.prefix("warn","No components found");return}let r={description:0,docs:0,name:0,originVersion:0,package:0,peerDependencies:0,status:0,style:0,version:0};for(let u of t)for(let g in u){let d=String(u[g]);if(g==="version"){let f=d.match(io)?.[1],l=d.match(ro)?.[1],x=R(so(l,f));r[g]=Math.max(r[g],Math.max(x.length,7)),r.originVersion=Math.max(r.originVersion,l.length);continue}r[g]=Math.max(r[g],d.length);}let i=t.reduce((u,g)=>{let d=Ue;for(let f of Be){let l=ne(g[f],r[f]);if(e!=="list"&&f==="version"){let x=l.match(ro)?.[1]?.trim(),w=l.match(io)?.[1]?.trim();x===w?(l=l.replace(/\snew:\s[\W\w]+(\s+)?/,""),l=ne(`${ne(l,r.originVersion)} \u{1F680}latest`,r[f]),l=l.replace("latest",D.magentaBright.underline("latest"))):w&&(l=ne(so(ne(x,r.originVersion),w),r[f]));}g.status==="stable"&&oo.includes(f)?l=D.greenBright(l):g.status==="new"?l=D.magentaBright(l):g.status==="updated"&&(l=D.blueBright(l)),d+=l+no;}return u.push(d),u},[]),s=U.topLeft+Ue.replace(/.*/g,U.horizontal).slice(1),p=Ue,m=U.vertical+Ue.replace(/.*/g,U.horizontal).slice(1);for(let u of Be)s+=`${U.horizontal.padEnd(r[u]+7,U.horizontal)}`,p+=D.redBright(po(u).padEnd(r[u]))+no,m+=`${U.horizontal.padEnd(r[u]+7,U.horizontal)}`;s=s.slice(0,-2)+U.topRight,m=m.slice(0,-2)+U.vertical;let c=U.bottomLeft+Ue.replace(/.*/g,U.horizontal).slice(1);for(let u of Be)c+=`${U.horizontal.padEnd(r[u]+7,U.horizontal)}`;c=c.slice(0,-2)+U.bottomRight,i=[s,p,m,...i,c],a.info(o),a.log(i.join(` `));}function ao(){a.newLine(),a.log(D.redBright("Environment Info:")),a.log(D.blueBright(" System:")),a.log(D.blueBright(" OS:"),process.platform),a.log(D.blueBright(" CPU:"),process.arch),a.log(D.greenBright(" Binaries:")),a.log(D.greenBright(" Node:"),process.version),a.newLine();}function Te({align:e="center",borderStyle:t="round",center:o=!1,color:n,log:r=!0,padding:i=0,text:s,title:p}){let m=st[t],c=n?Object.fromEntries(Object.entries(m).map(([S,T])=>[S,D[n](T)])):m,u=s.split(` `),g=u.map(S=>S.replace(M,"")),d=i>0,f=i,l=o||d,x=g.reduce((S,T)=>T.length>S?T.length:S,0);x=d?x+f*4:x;let w=p?p.replace(M,""):"",h=p?w.length:0,b=x-h,C=2;for(;h+C+f>=x;)x+=Math.floor(h/2);b=x-h;let k=(()=>{if(p)if(e==="center"){let S=Math.floor(b/2)-1,T=Math.ceil(b/2)-1,ot=S>0?c.horizontal.repeat(S):"",ee=T>0?c.horizontal.repeat(T):"";return `${ot} ${p} ${ee}`}else return e==="left"?` ${p} ${c.horizontal.repeat(b-2)}`:`${c.horizontal.repeat(b-2)} ${p} `;return c.horizontal.repeat(x)})(),A=c.topLeft+k+c.topRight,H=c.bottomLeft+c.horizontal.repeat(x)+c.bottomRight,Z=u.reduce((S,T)=>{let ot=T.replace(M,""),ee=x-ot.length,gn=" ".repeat(ee),Ut=Math.floor(ee/2),Tt=Math.ceil(ee/2),hn=Ut>0?" ".repeat(Ut):"",yn=Tt>0?" ".repeat(Tt):"";if(o)S.push(`${c.vertical}${ee?`${hn}${T}${yn}`:T}${c.vertical}`);else if(i){let xn=ee-f*2;S.push(`${c.vertical}${" ".repeat(f*2)}${T}${" ".repeat(xn)}${c.vertical}`);}else S.push(`${c.vertical}${ee>0?`${T}${gn}`:T}${c.vertical}`);return S},[]);if(l)for(let S=0;S<f;S++)Z.unshift(`${c.vertical}${" ".repeat(x)}${c.vertical}`),Z.push(`${c.vertical}${" ".repeat(x)}${c.vertical}`);return Z=[A,...Z,H],r&&a.log(Z.join(` `)),Z.join(` `)}function so(e,t){return `${D.white(`${e} ->`)} ${D.yellowBright(`${t} (new)`)}`}var Ke=/([\^~])/;function mo(e,t){return a.gradient(e),t}function po(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}var me=(e,t)=>qn.sync(e,{absolute:!0,cwd:_,deep:5,ignore:["node_modules/**","dist/**","build/**","coverage/**","public/**","out/**"],onlyFiles:!0,...t});function We(e){return e==="false"?!1:!!e}function uo(e,t){return Object.fromEntries(Object.entries(e).filter(([o])=>!t.includes(o)))}function Q(e,t){return e=re(e),t=re(t),Je(e,t)?Je(e,t):ze(e,t)?ze(e,t):lo(e,t)?lo(e,t):t}function Je(e,t){let o=e.split("."),n=t.split(".");return o[0]!==n[0]?D.redBright(n.join(".")):""}function ze(e,t){let o=e.split("."),n=t.split(".");return o[1]!==n[1]?`${D.white(n[0])}${D.white(".")}${D.cyanBright(n.slice(1).join("."))}`:""}function lo(e,t){let o=e.split("."),n=t.split(".");return o[2]!==n[2]?`${D.white(n.slice(0,2).join("."))}${D.white(".")}${D.greenBright(n.slice(2).join("."))}`:""}function G(e,t){let o=e[t].replace(Ke,""),n=e[t].match(Ke)?.[1]||"";return {currentVersion:o,versionMode:n}}function xe(e){return {bun:{install:"add",remove:"remove",run:"run"},npm:{install:"install",remove:"uninstall",run:"run"},pnpm:{install:"add",remove:"remove",run:"run"},yarn:{install:"add",remove:"remove",run:"run"}}[e]}function re(e,t=!1){return e.split("||").map(r=>r.trim()).map(r=>r.replace(/^[<=>^~]+\s*/,"").trim()).sort((r,i)=>t?compareVersions(i,r):compareVersions(r,i))[0]}function ne(e,t){let o=e.replace(M,""),n=t-o.length>0?" ".repeat(t-o.length):"";return `${e}${n}`}function R(e){return e.replace(M,"")}var ht=new Map;async function B(e,t){return new Promise((o,n)=>{try{let{cache:r=!0,logCmd:i=!0}=t||{};ht.has(e)&&r&&o(ht.get(e)),i&&(a.newLine(),a.log(`${e}`));let s=execSync(e,{stdio:"inherit",...t?uo(t,["logCmd"]):{}});if(s){let p=s.toString();o(p),ht.set(e,p);}o("");}catch(r){n(r);}})}var yt=e=>{isCancel(e)&&(cancel(`${D.red("\u2716")} Operation cancelled`),process.exit(0));},ho=async e=>{let t=await text(e);return yt(t),t},Ce=async e=>{let t=await select(e);return yt(t),t};var fo=spinner(),yo=async e=>{let{failText:t,successText:o,task:n,text:r}=e,i=null;try{fo.start(r),i=await(n instanceof Promise?n:Promise.resolve(n)),fo.stop(o);}catch{cancel(t??i??"Task failed"),process.exit(0);}return i},xo=async e=>{let t=await confirm(e);return yt(t),t},Co=async()=>{let t=readdirSync(process.cwd()).filter(n=>statSync(join(process.cwd(),n)).isDirectory()).map(n=>({label:n,value:n})).filter(n=>!["node_modules","dist","build","output",/^\./].some(r=>typeof r=="string"?n.value.includes(r):r.test(n.value)));return t.length?await Ce({message:"Please select the directory to add the codebase",options:t}):"src"};async function wo(e){let t=e.match(/^https?:\/\//)?.[0]??"",[o,n,r,i,s]=e.replace(t,"").split("/");return {baseStorageUrl:`${t}${o}/sandbox/files/${r}?sandboxId=${i}`,chatTitle:s,sandboxId:i,userId:n??""}}async function pr(e){let t=await fetch(e);if(!t.body)throw new Error(`Failed to download: ${e}`);return Readable.fromWeb(t.body)}async function bo(e,t){await ko(async o=>{try{await pipeline(await pr(t),ar.x({cwd:e}));}catch(n){o(new Error(`Failed to download ${t} Error: ${n}`));}},{retries:3});}async function Io(e,t){let{fetchInfo:o,throwError:n=!0,...r}=t??{},i=`Fetching ${o??basename$1(e)}`,s=Tn({discardStdin:!1,spinner:{frames:[`\u280B ${D.gray(`${i}.`)}`,`\u2819 ${D.gray(`${i}..`)}`,`\u2839 ${D.gray(`${i}...`)}`,`\u2838 ${D.gray(`${i}.`)}`,`\u283C ${D.gray(`${i}..`)}`,`\u2834 ${D.gray(`${i}...`)}`,`\u2826 ${D.gray(`${i}.`)}`,`\u2827 ${D.gray(`${i}..`)}`,`\u2807 ${D.gray(`${i}...`)}`,`\u280F ${D.gray(`${i}.`)}`],interval:150}});s.start();try{return await ko(async()=>{let p=await fetch(e,{...r,headers:{Accept:"application/json",...r?.headers}});if(!p.ok&&n)throw new Error(`Request failed with status ${p.status}`);return p},{retries:2})}catch(p){throw p instanceof Error&&p.message.includes("fetch failed")?new Error("Connection failed. Please check your network connection."):p}finally{s.stop();}}async function Po(e,t){return (await(await Io(e,{fetchInfo:"codebase files",headers:{userId:t}})).json()).entries??{}}function Ge(e){let t=/import {?\s*([\W\w]+?)\s*}? from ["'](.+)["']/g,o=e.match(t)??[],n=[];for(let i of o)n.push(r(i));return n.length?n:[];function r(i){let s=/import {?\s*([\W\w]+?)\s*}? from ["'](.+)["']/,p=i.match(s)??[];return [p[1]??"",p[2]??""]}}function $o(e){return e.replace(/^["'`](.*)["'`]$/,"$1")}function J(e,t){let o=new RegExp(`\\s*${e}:\\s\\[([\\w\\W]*?)\\]\\s*`);return o.test(t)?t.match(o)?.[1]?.split(/,\s/g).map(n=>$o(n.trim())).filter(Boolean)??[]:[]}function we(e,t,o,n){let r=new RegExp(`\\s*${e}:\\s\\[([\\w\\W]*?)\\]\\s*`),i=n??o.map(u=>JSON.stringify(u)).join(", ");if(r.test(t)){let u=e==="content"?` ${e}: [${i}]`:` ${e}: [${o}]`;return t.replace(r,u)}let s=t.split(` `),p=s.findIndex(u=>u.includes("content:")),m=s.findIndex(u=>u.includes("module.exports =")),c=p!==-1?p-1:m!==-1?m:0;return e==="content"?s.splice(c+1,0,` ${e}: [${i}],`):s.splice(c+1,0,` ${e}: [${o.map(u=>$o(u))}],`),s.join(` `)}function cr(e){return Ge(e).map(n=>n.find(r=>r.includes("./"))).filter(Boolean)}async function vo(e){let{content:t,entries:o,filePath:n}=e,r=[];async function i(s){let p=cr(s);p.length!==0&&await Promise.all(p.map(async m=>{let c=o?.find(l=>basename$1(l.name).includes(basename$1(m))),u=c?.name.split(".").pop(),g=`${m.split("/").pop()}`,d=`src/${m.replace(/.*?\//,"")}${u?`.${u}`:""}`;if(r.some(l=>l.fileName===g))return;let f=c?.content??"";r.push({fileContent:f,fileName:g,filePath:d}),await i(f);}));}try{await i(t),r.push({fileContent:t,fileName:n.split("/").pop(),filePath:n});}catch(s){a.error(s),process.exit(1);}return r}function Ct(e,t,o){if(t.includes("/")){let n=t.split("/").slice(0,-1).join("/");xt.mkdirSync(`${e}/${n}`,{recursive:!0}),xt.writeFileSync(`${e}/${t}`,o,"utf8");}else xt.writeFileSync(`${e}/${t}`,o,"utf8");}var fr=/^https?:\/\//,wt="App.tsx";function Qe(e){return e.some(t=>fr.test(t))}async function Uo(e,t){q.intro(D.cyan("Starting to add Hero Chat codebase"));let o=resolve(process.cwd(),t.directory??await Co()),{baseStorageUrl:n,chatTitle:r,userId:i}=await wo(e[0]),s=r?`${r}.tsx`:void 0;xt.existsSync(o)||(a.error(`Directory ${o} does not exist`),process.exit(1));let m=await Po(n,i),c=m.find(g=>g.name.includes(wt)),u=m.find(g=>g.name.includes("package.json"))?.content;if(c){let g=await vo({content:c.content,entries:m,filePath:"src/App.tsx"});for(let d of g){if(d.fileName.includes(wt)){Ct(o,`${s||wt}`,d.fileContent);continue}Ct(o,`${d.filePath.replace("src/","")}`,d.fileContent);}}if(u){let g=JSON.parse(u),{allDependenciesKeys:d}=$(join$1(process.cwd(),"package.json")),f=Object.keys(g.dependencies).filter(l=>!d.has(l));if(f.length>0){q.log.warn(`The project is missing the following dependencies to run the codebase: ${f.join(", ")}`);let l=await xo({message:"Do you want to add the missing dependencies?"}),x=await j(),h=`${x} ${x==="npm"?"install":"add"} ${f.map(b=>`${b}@${g.dependencies[b]}`).join(" ")}`;if(l)try{await B(h);}catch{q.log.error(`Failed to install dependencies. Please add ${f.join(" ")} manually.`);}else q.note(`Run \`${h}\` to start!`,"Next steps");}}q.outro(D.green("\u2705 Hero Chat codebase added successfully!"));}function dr(e,t){let o=0,n=e.length,r=t.length,i=0,s=0;for(;i<n&&s<r;)e[i]===t[s]&&(o++,s++),i++;return o}function Ee(e,t){let o=0,n="";for(let r of e){let i=dr(r,t);i>o&&(o=i,n=r);}return n!==""?n:null}function kt(e,t){let o=Ee(e,t);o?a.error(`Unknown option '${t}', Did you mean '${o}'?`):a.error(`Unknown option '${t}'`),process.exit(1);}var Xe={name:"heroui-cli",private:!1,type:"module",license:"MIT",version:"1.2.2",homepage:"https://github.com/heroui-inc/heroui-cli#readme",description:"A CLI tool that unlocks seamless HeroUI integration (Previously NextUI CLI)",keywords:["UI","CLI","Tool","NextUI","Template","Integration","Add Component","HeroUI"],author:{name:"HeroUI",email:"support@heroui.com",url:"https://github.com/heroui-inc"},repository:{type:"git",url:"https://github.com/heroui-inc/heroui-cli.git"},bugs:{url:"https://github.com/heroui-inc/heroui-cli/issues"},publishConfig:{access:"public",registry:"https://registry.npmjs.org/"},files:["dist"],bin:{heroui:"./dist/index.js"},main:"./dist/index.js",module:"./dist/index.js",types:"./dist/index.d.ts",scripts:{dev:"tsup --watch","link:cli":"pnpm link --global","link:remove":"pnpm uninstall --global heroui-cli",build:"tsup","update:components":"tsx src/scripts/update/update-components.ts","sync:docs":"tsx src/scripts/sync/sync.ts","clean:cache":"tsx src/scripts/cache/clean.ts",lint:"eslint . --max-warnings=0","lint:fix":"eslint . --max-warnings=0 --fix","check:prettier":"prettier --check .","check:types":"tsc --noEmit",changelog:"npx conventional-changelog -p angular -i CHANGELOG.md -s --commit-path .",release:"bumpp --execute='pnpm run changelog' --all",prepare:"husky install",prebuild:"pnpm run update:components",prepublishOnly:"pnpm run build"},dependencies:{"@clack/prompts":"0.7.0","@winches/prompts":"0.0.7","async-retry":"1.3.3",chalk:"5.3.0",commander:"11.0.0","compare-versions":"6.1.1","fast-glob":"3.3.2","find-up":"7.0.0","gradient-string":"2.0.2",ora:"8.0.1",pathe:"1.1.2",tar:"6.2.1"},devDependencies:{"@commitlint/cli":"17.7.1","@commitlint/config-conventional":"17.7.0","@types/gradient-string":"1.1.3","@types/node":"20.11.30","@typescript-eslint/eslint-plugin":"6.7.2","@typescript-eslint/parser":"6.7.2",bumpp:"9.4.0","clean-package":"2.2.0","commitlint-plugin-function-rules":"2.0.2","conventional-changelog-cli":"4.1.0",eslint:"8.50.0","eslint-config-prettier":"9.0.0","eslint-import-resolver-typescript":"3.6.1","eslint-plugin-import":"2.28.1","eslint-plugin-prettier":"5.0.0","eslint-plugin-sort-destructure-keys":"1.5.0","eslint-plugin-sort-keys-fix":"1.1.2","eslint-plugin-unicorn":"52.0.0","eslint-plugin-unused-imports":"3.0.0",husky:"8.0.3","lint-staged":"14.0.1",prettier:"3.3.2",tsup:"7.2.0",tsx:"4.7.1",typescript:"5.2.2"},engines:{pnpm:">=9.x"},packageManager:"pnpm@9.6.0"};async function To(e){return y.beta?await pe(e):await F(e)}async function Eo(e){let o=Object.keys(e).filter(r=>!y.heroUIcomponentsPackages.includes(r)&&r.startsWith(Zt));return o.length?await Promise.all(o.map(async r=>{let{currentVersion:i,versionMode:s}=G(e,r),p=await To(r),m=E(i,p)>=0;return {isLatest:m,latestVersion:Q(i,m?i:p),package:r,version:i,versionMode:s}})):[]}var ue="".padEnd(7),Ro="Missing";async function Lo(e){let{all:t,allDependencies:o,isHeroUIAll:n,upgradeOptionList:r}=e,i=[],s=new Set,p=await yr(t,n,o,s),m=await Eo(o),c=r.map(l=>({...l,latestVersion:Q(l.version,l.latestVersion)})),u=await Promise.all(r.map(l=>De(l.package,o,s,l.peerDependencies))),g=await xr([...s]),d=[...c,...p.allOutputList],f=[...m,...u.flat(),...p.allPeerDepList,...g].filter((l,x,w)=>x===w.findIndex(h=>h.package===l.package));return hr(d,f),i=[...d,...f].filter((l,x,w)=>!l.isLatest&&x===w.findIndex(h=>h.package===l.package)),Cr(i),i}function Do(e,t=!1){if(!e.length)return "";let o=[],n={latestVersion:0,package:0,version:0};for(let r of e)for(let i in r){if(!Object.prototype.hasOwnProperty.call(r,i)||!r[i])continue;i==="version"&&(r[i]=r[i].replace(Ke,""));let s=i==="version"?r[i].replace(M,"").length:r[i].length;n[i]=Math.max(n[i],s);}for(let r of e){if(r.isLatest){if(t)continue;o.push(` ${D.white(`${`${r.package}@${r.versionMode||""}${r.latestVersion}`.padEnd(n.package+ue.length+ue.length)}`)}${ue}${D.greenBright("latest").padStart(n.version)}${ue}`);continue}o.push(` ${D.white(`${r.package.padEnd(n.package+ue.length)}${ue}${ne(`${r.versionMode||""}${r.version}`,n.version)} -> ${r.versionMode||""}${r.latestVersion}`)}${ue}`);}return o.join(` `)}async function De(e,t,o,n){if(n=n||JSON.parse(await W(`npm show ${e} peerDependencies --json`))||{},!n||!Object.keys(n).length)return [];let r=[];for(let[i,s]of Object.entries(n)){if(r.some(g=>g.package===i))continue;let p=t[i],m=re(s);if(!p){o.add({name:i,version:m});continue}let{versionMode:c}=G(t,i),u=E(p,m)>=0;u?m=re(p):m=await F(i),r.push({isLatest:u,latestVersion:u?m:Q(p,m),package:i,version:p,versionMode:c});}return r}function hr(e,t){let o=e.length===1?"Component":"Components",n={components:{color:"blue",text:"",title:D.blue(o)},peerDependencies:{color:"yellow",text:"",title:D.yellow("PeerDependencies")}},r=Do(e),i=Do(t,!0),s=t.filter(p=>!p.isLatest);r.length&&Te({...n.components,text:r}),a.newLine(),s.length&&a.log(D.gray(`Required min version: ${s.map(p=>`${p.package}>=${p.latestVersion.replace(M,"")}`).join(", ")}`)),i.length&&Te({...n.peerDependencies,text:i});}async function yr(e,t,o,n){if(!e||!t)return {allOutputList:[],allPeerDepList:[]};let r=y.latestVersion,{currentVersion:i,versionMode:s}=G(o,I),p=Q(i,r),m=E(i,r)>=0,c=await De(I,o,n),u=await De(Y,o,n),g=[{isLatest:m,latestVersion:p,package:I,version:i,versionMode:s}],d=[...c,...u];return {allOutputList:g,allPeerDepList:d}}async function xr(e){let t=[];for(let o of e){let n={isLatest:!1,latestVersion:o.version,package:o.name,version:D.red(Ro),versionMode:""};t.push(n);}return t}function Cr(e){let t={major:0,minor:0,patch:0};for(let n of e){if(n.version===Ro){t.major++;continue}let r=R(n.latestVersion);Je(n.version,r)?t.major++:ze(n.version,r)?t.minor++:t.patch++;}let o=Object.entries(t).reduce((n,[r,i])=>i?`${n}${D.yellowBright(i)} ${r}, `:n,"").replace(/, $/,"");return o&&(a.log(o),a.newLine()),t}function Mo({dependencies:e,devDependencies:t,upgradePackageList:o}){for(let n of o){let r=R(n.latestVersion);if(t[n.package]){t[n.package]=r;continue}e[n.package]=r;}}function fe(e,t){let{errorInfo:o,missingDependencies:n,tailwindName:r}=t;return e==="missingDependencies"?{level:"error",name:"missingDependencies",outputFn:()=>{a.log("You have not installed the required dependencies"),a.newLine(),a.log("The required dependencies are:"),n.forEach(i=>{a.log(`- ${i}`);}),a.newLine(),a.log(`See more info here: ${D.underline(ut)}`);}}:e==="incorrectTailwind"?{level:"error",name:"incorrectTailwind",outputFn:()=>{a.log(`Your ${r} is incorrect`),a.newLine(),a.log("The missing part is:"),o.forEach(i=>{a.log(`- need to add ${i}`);}),a.newLine(),a.log(`See more info here: ${D.underline(`${Fe}-1`)}`);}}:{level:"error",name:"incorrectApp",outputFn:()=>{a.log("Your App.tsx is incorrect"),a.newLine(),a.log("The missing part is:"),o.forEach(i=>{a.log(`- need to add ${i}`);}),a.newLine(),a.log(`See more info here: ${D.underline(ut)}`);}}}async function de(e,t,o){let n=[],{allDependencies:r,beta:i,packageNames:s,peerDependencies:p}=o??{},m=[];if(p){let c=await wr({allDependencies:r,packageNames:s});m.push(...c);}if(e==="all"){let c=t.has(I),u=t.has(ve),g=t.has(Se);if(c&&u&&!m.length)return [!0];!c&&n.push(i?`${I}@${y.betaVersion}`:I),!u&&n.push(ve),!g&&n.push(Se);}else if(e==="partial"){let c=t.has(ve),u=t.has(Se),g=t.has(oe),d=t.has(Y);if(c&&g&&d&&!m.length)return [!0];!c&&n.push(ve);let f=await Ve(oe),l=await Ve(Y);!g&&n.push(i?`${oe}@${f}`:oe),!d&&n.push(i?`${Y}@${l}`:Y),!u&&n.push(Se);}return [!1,...n,...p?m:[]]}async function wr(e){let{allDependencies:t,packageNames:o}=e,n=[];for(let r of o){let i=await De(r,t,new Set);for(let s of i)if(!s.isLatest){let p=n.findIndex(u=>u.includes(s.package)),c=R(n[p]||"")?.match(/@([\d.]+)/)?.[1];c&&E(c,R(s.latestVersion))<=0&&n.splice(p,1),n.push(`${s.package}@${s.latestVersion}`);}}return n}function ge(e,t,o,n,r,i){if(e==="partial"&&!o.length)return [!0];let s=[],p=r??readFileSync(t,"utf-8"),m=J("content",p),c=J("plugins",p);if(e==="all"){let g=J("darkMode",p).some(l=>l.includes("class"))||/darkMode:\s*["'`]class/.test(p),d=m.some(l=>l.includes(v.content)),f=c.some(l=>v.checkPluginsRegex.test(l));if(g&&d&&f)return [!0];!g&&s.push(v.darkMode),!d&&s.push(v.content),!f&&s.push(v.plugins);}else if(e==="partial"){let u=Ye.content(o,n),g=!1,d=m.some(l=>l.includes(v.content)?(g=!0,!0):l.includes(u));i&&g&&a.log(` ${D.yellow("Attention")} Individual components from HeroUI do not require the "${D.bold(v.content)}" in the tailwind config For optimized bundle sizes, consider using "${D.bold(u)}" instead`);let f=c.some(l=>v.checkPluginsRegex.test(l));if(d&&f)return [!0];!d&&s.push(u),!f&&s.push(v.plugins);}return [!1,...s]}function Re(e,t){let o=[];if(e==="all"||e==="partial"){let n=readFileSync(t,"utf-8"),i=Ge(n).some(([s])=>s.includes(ft.import));if(i)return [!0];!i&&o.push(ft.import);}return [!1,...o]}function ke(e){let t=[],o;if(e){try{o=readFileSync(e,"utf-8");let n=o.includes(O.content);if(n)return [!0];!n&&t.push(O.content);}catch(n){t.push(`Error reading .npmrc file: ${e} Error: ${n}`);}return [!1,...t]}return [!1,...t]}async function be(e=[],t=!0){let o=[];for(let n of e)if(!y.heroUIComponentsKeysSet.has(n)){let r=Ee(y.heroUIComponentsKeys,n);o.push([n,r]);}if(o.length){let[n,r]=o.reduce((i,[s,p])=>[i[0]+D.underline(s)+", ",i[1]+(p?D.underline(p)+", ":"")],["",""]);return t&&a.prefix("error",`Illegal components: ${n.replace(/, $/,"")}${r?` ${"".padEnd(12)}It may be a typo, did you mean ${r.replace(/, $/,"")}?`:""}`),!1}return !0}async function Ze(e){try{await e();}catch(t){t&&(await Ce({message:`${D.red("Error: ")}a unexpected error occurred, run "pnpm install" maybe can fix it or report it as a bug`,options:[{label:"Re-run pnpm install",value:"re-run-pnpm-install"},{label:"Exit",value:"exit"}]})==="exit"&&process.exit(1),await B("pnpm install --force"),await e());}}async function It(e,t=[]){if(L("debug"))for(let o of t)a.warn(`Debug: ${o}`);else await Ze(()=>B(e));}function No(e,t){if(!e.length||!L("debug"))return;let{dependencies:o,packageJson:n}=$(t);for(let r of e){let i=y.heroUIComponentsMap[r];i&&(o[i.package]=`${i.package}@${i.version}`);}writeFileSync(t,JSON.stringify({...n,dependencies:o},null,2),"utf-8");}function Ho(e,t){if(!e.length||!L("debug"))return;let{dependencies:o,packageJson:n}=$(t);for(let r of e){let i=y.heroUIComponentsMap[r];i&&delete o[i.package];}writeFileSync(t,JSON.stringify({...n,dependencies:o},null,2),"utf-8");}function _o(e,t){let{format:o=!1,write:n=!0}=t,r=readFileSync(e,"utf-8");r=`import {HeroUIProvider} from "@heroui/react"; ${r}`,r=Ir(r),n&&writeFileSync(e,r,"utf-8"),o&&execSync(`npx prettier --write ${e}`,{stdio:"ignore"});}function Ir(e){let t=/return\s*\(([\S\s]*?)\);/g;return e.replace(t,(n,r)=>`return ( <HeroUIProvider> ${r.trim()} </HeroUIProvider> );`)}function tt(e,t){let{errorInfoList:o,format:n=!1,tailwindPath:r,write:i=!0}=t;if(!o.length)return;let s=readFileSync(r,"utf-8"),p=J("content",s),m=J("plugins",s);for(let c of o){let[u,g]=Pr(c);if(u==="content"){if(p.includes(v.content))continue;p=p.filter(f=>!f.includes("@heroui/theme/dist/")),p.push(g),s=we("content",s,p,p.map((f,l,x)=>l===0?x.length===1?` ${JSON.stringify(f)} `:` ${JSON.stringify(f)}`:x.length-1===l?` ${JSON.stringify(f)} `:` ${JSON.stringify(f)}`).join(`, `));}else u==="plugins"&&(m.push(g),s=we("plugins",s,m),s=`${v.importContent(r.endsWith(".ts"))} ${s}`);if(e==="all"&&u==="darkMode"){let d=s.indexOf("plugins")-1,f=v.darkMode;s=`${s.slice(0,d)} ${f}, ${s.slice(d)}`;}}if(i&&writeFileSync(r,s,"utf-8"),n)try{execSync(`npx prettier --write ${r}`,{stdio:"ignore"});}catch{a.warn(`Prettier failed to format ${r}`);}}function Pr(e){return v.darkMode.includes(e)?["darkMode",e]:v.plugins.includes(e)?["plugins",e]:["content",e]}function Ie(e,t=!0,o=!0,n=void 0){if(!existsSync(e))t&&writeFileSync(e,O.content,"utf-8");else {let r=readFileSync(e,"utf-8");r=`${O.content} ${r}`,t&&writeFileSync(e,r,"utf-8");}if(!n){a.newLine(),a.log(`Added the required content in file: ${e}`),o&&!L("debug")&&(a.newLine(),a.log("Pnpm restructure will be run now"),execSync("pnpm install",{stdio:"inherit"}));return}n({message:`Added the required content in file: ${e}`,runInstall:o});}var jo="https://codeload.github.com/heroui-inc/next-app-template/tar.gz/main",Vo="https://codeload.github.com/heroui-inc/next-pages-template/tar.gz/main",Fo="https://codeload.github.com/heroui-inc/vite-template/tar.gz/main",qo="next-app-template-main",Yo="next-pages-template-main",Bo="vite-template-main",Ko="next-app-template",Jo="next-pages-template",zo="vite-template";function Wo(e,t){return e==="all"?`// tailwind.config.js const {heroui} = require("@heroui/react"); /** @type {import('tailwindcss').Config} */ module.exports = { content: [ "./node_modules/@heroui/theme/dist/**/*.{js,ts,jsx,tsx}", ], theme: { extend: {}, }, darkMode: "class", plugins: [heroui()], };`:`// tailwind.config.js const {heroui} = require("@heroui/theme"); /** @type {import('tailwindcss').Config} */ module.exports = { content: [ ${JSON.stringify(t)}, ], theme: { extend: {}, }, darkMode: "class", plugins: [heroui()], };`}async function Xo(e,t){Qe(e)&&(await Uo(e,t),process.exit(0));let{addApp:o=!1,all:n=!1,appPath:r,beta:i=!1,packagePath:s=P("package.json"),tailwindPath:p=me("**/tailwind.config.(j|t)s")[0]}=t;var{allDependencies:m,allDependenciesKeys:x,currentComponents:w}=$(s);let c=t.prettier??x.has("prettier"),u=!!m[I];if(!e.length&&!n){let C=y.heroUIComponents.filter(k=>!w.some(A=>A.name===k.name));C.length||(a.success("\u2705 All components have been added"),process.exit(0)),e=await he("Which components would you like to add?",C.map(k=>({description:k.description,title:k.name,value:k.name})));}else n&&(e=[I]);if(!n&&!be(e,!0))return;var{allDependenciesKeys:x,currentComponents:w}=$(s);let g=w.map(C=>C.name),d=e.filter(C=>g.includes(C)||u&&C===I);if(d.length&&!L("debug")){a.prefix("error",`\u274C You have already added the following components: ${d.map(C=>D.underline(C)).join(", ")}`);return}if(o&&!r){a.prefix("error","\u274C App.(j|t)sx file not found. Please specify the appPath if the default search path does not locate your file. 'add --appPath=yourAppPath'");return}let f=await j(),l=f==="npm"?"install":"add";if(n){let[,...C]=await de("all",x,{allDependencies:m,beta:i,packageNames:[I],peerDependencies:!0});C=C.map(k=>R(k)),C.length&&(a.info(`Adding required dependencies: ${[...C].map(k=>D.underline(k)).join(", ")}`),await It(`${f} ${l} ${[...C].join(" ")}`,C));}else {let C=i?await Wt(e):e.map(H=>y.heroUIComponentsMap[H].package),[,...k]=await de("partial",x,{allDependencies:m,beta:i,packageNames:C,peerDependencies:!0}),A=[...k,...C].map(H=>R(H));a.info(`Adding required dependencies: ${[...A].map(H=>D.underline(H)).join(", ")}`),await It(`${f} ${l} ${[...A].join(" ")}`,A);}L("debug")&&No(e,s);var{allDependenciesKeys:x,currentComponents:w}=$(s);let h=n?"all":"partial",b=f==="pnpm";if(p){let[,...C]=ge(h,p,w,b,void 0,!0);tt(h,{errorInfoList:C,format:c,tailwindPath:p}),a.newLine(),a.log(`Tailwind CSS settings have been updated in: ${p}`);}else {let C=Ye.content(w,b),k=Wo(h,C),A=P("tailwind.config.js");writeFileSync(A,k,"utf-8"),a.newLine(),a.info(`Tailwind CSS configuration file created at: ${A}`);}if(o&&r&&existsSync(r)){let[C]=Re(h,r);C||(_o(r,{format:c}),a.newLine(),a.info(`HeroUIProvider successfully added to the App file at: ${r}`),a.warn("Please check the placement of HeroUIProvider in the App file to ensure it's correctly integrated.'"));}if(f==="pnpm"){let C=P(".npmrc");if(!existsSync(C))writeFileSync(P(".npmrc"),O.content,"utf-8");else {let[k]=ke(C);k||Ie(C);}}a.newLine(),a.success("\u2705 Components added successfully"),(x.has(I)||n)&&w.length&&(a.newLine(),a.log(`${D.yellow("Attention")} Individual components from HeroUI do not require the \`@heroui/react\` package. For optimized bundle sizes, consider using individual components.`),a.log("The redundant dependencies are:"),[...new Set(w)].forEach(C=>{a.log(`- ${C.package}`);})),a.newLine(),a.grey(`Please check the ${D.bold("HeroUIProvider")} whether in the correct place (ignore if added) See more info here: ${qe}`),L("debug")&&Ho(e,s),process.exit(0);}async function en(e){let{appPath:t=me("**/App.(j|t)sx")[0],checkApp:o=!1,checkPnpm:n=!0,checkTailwind:r=!0,packagePath:i=P("package.json"),tailwindPath:s=me("**/tailwind.config.(j|t)s")}=e,p=We(o),m=We(n),c=We(r),u=[s].flat(),{allDependencies:g,allDependenciesKeys:d,currentComponents:f,isAllComponents:l}=$(i);if(!f.length&&!l){a.prefix("error",`\u274C No ${D.underline("HeroUI components")} found in your project. Please consult the installation guide at: https://heroui.com/docs/guide/installation#global-installation`);return}let x=[];if(l&&f.length&&x.push({level:"warn",name:"redundantDependencies",outputFn:()=>{a.log("You have installed some unnecessary dependencies. Consider removing them for optimal performance."),a.newLine(),a.log("The following dependencies are redundant:"),f.forEach(w=>{a.log(`- ${w.package}`);});}}),c&&!u.length&&x.push({level:"error",name:"missingTailwind",outputFn:()=>{a.log("Missing tailwind.config.(j|t)s file. To set up, visit: "+D.underline(Fe));}}),p&&!t&&x.push({level:"error",name:"missingApp",outputFn:()=>{a.log("App.(j|t)sx file not found. Please specify the path using: doctor --appPath=[yourAppPath]");}}),l){let[w,...h]=await de("all",d,{allDependencies:g,packageNames:[I],peerDependencies:!0});if(f.length){let[b,...C]=await de("partial",d,{allDependencies:g,packageNames:f.map(k=>k.package),peerDependencies:!0});w=b||w,h=[...C,...h].filter((k,A,H)=>(k=R(k).replace(/@[\d.]+/g,""),H.findIndex(Z=>R(Z).replace(/@[\d.]+/g,"")===k)===A));}if(w||x.push(fe("missingDependencies",{missingDependencies:h})),c)for(let b of u){let[C,...k]=ge("all",b);if(!C){let A=basename(b);x.push(fe("incorrectTailwind",{errorInfo:k,tailwindName:A}));}}if(p&&t){let[b,...C]=Re("all",t);b||x.push(fe("incorrectApp",{errorInfo:C}));}}else if(f.length){let[w,...h]=await de("partial",d,{allDependencies:g,packageNames:f.map(b=>b.package),peerDependencies:!0});if(w||x.push(fe("missingDependencies",{missingDependencies:h})),c){let b=await j()==="pnpm";for(let C of u){let[k,...A]=ge("partial",C,f,b,void 0,!0);if(!k){let H=basename(C);x.push(fe("incorrectTailwind",{errorInfo:A,tailwindName:H}));}}}if(p&&t){let[b,...C]=Re("partial",t);b||x.push(fe("incorrectApp",{errorInfo:C}));}}if(m&&await j()==="pnpm"){let h=P(".npmrc"),[b,...C]=ke(h);b||x.push({level:"error",name:"incorrectPnpm",outputFn:()=>{a.log(`The pnpm setup is incorrect Please update your configuration according to the guidelines provided at: `+D.underline(eo)),a.newLine(),a.log("Required changes:"),C.forEach(k=>{a.log(`- Add ${k}`);});}});}if(!x.length){a.newLine(),a.success("\u2705 Your project has no detected issues.");return}a.prefix("error",`\u274C Your project has ${D.underline(x.length)} issue${x.length===1?"":"s"} that require attention`),a.newLine();for(let w=0;w<x.length;w++){let h=x[w];a[h.level](`\u2757\uFE0FIssue ${w+1}: ${D.bold(h.name)}`),a.newLine(),h.outputFn(),a.newLine();}process.exit(0);}async function tn(e){let{packagePath:t=P("package.json")}=e,{currentComponents:o}=$(t);ce({components:o}),ao(),process.exit(0);}var Ar="package-lock=true";function on(e){writeFileSync(e,Ar,"utf-8");}function nn(e,t){e&&(Object.keys(Oe).includes(e)||kt(Object.keys(Oe),e)),t&&(Ne.includes(t)||kt(Ne,t));}var Oe={app:Ko,pages:Jo,vite:zo};async function sn(e,t){let{package:o="npm",template:n}=t;nn(n,o),q.intro(D.cyanBright("Create a new project"));let{packageName:r,projectName:i,template:s}=await Ur(o,e,n),{run:p}=xe(r);existsSync(ct(`${_}/${i}`))&&(q.cancel(`The project name ${D.redBright(i)} already exists`),process.exit(1)),s==="app"?(await At(jo),vt(qo,i)):s==="pages"?(await At(Vo),vt(Yo,i)):s==="vite"&&(await At(Fo),vt(Bo,i));let m=ct(`${_}/${i}/.npmrc`);on(m),r==="pnpm"&&Ie(m,!0,!1,({message:c})=>{q.log.message(c);}),q.note(`cd ${D.cyanBright(i)} ${D.cyanBright(r)} install`,"Next steps"),q.outro(`\u{1F680} Get started with ${D.cyanBright(`${r} ${p} dev`)}`),process.exit(0);}async function At(e){await yo({failText:"Template creation failed",successText:"Template created successfully!",task:bo(_,e),text:"Creating template..."});}function vt(e,t){try{renameSync(join(_,e),join(_,t));}catch(o){o&&(q.cancel(`rename Error: ${o}`),process.exit(0));}}async function Ur(e,t,o){let n=[{hint:"A Next.js 14 with app directory template pre-configured with HeroUI (v2) and Tailwind CSS.",label:D.gray("App"),value:"app"},{hint:"A Next.js 14 with pages directory template pre-configured with HeroUI (v2) and Tailwind CSS.",label:D.gray("Pages"),value:"pages"},{hint:"A Vite template pre-configured with HeroUI (v2) and Tailwind CSS.",label:D.gray("Vite"),value:"vite"}];return o=await Ce({initialValue:o,message:"Select a template (Enter to select)",options:n}),t=await ho({initialValue:t??Oe[o],message:"New project name (Enter to skip with default name)",placeholder:t??Oe[o]}),e=await Ce({initialValue:e,message:"Select a package manager (Enter to select)",options:[{label:D.gray("npm"),value:"npm"},{label:D.gray("yarn"),value:"yarn"},{label:D.gray("pnpm"),value:"pnpm"},{label:D.gray("bun"),value:"bun"}]}),{packageName:e,projectName:t,template:o}}async function an(e){let{packagePath:t=P("package.json"),remote:o=!1}=e,n=y.heroUIComponents;try{if(!o){let{currentComponents:r}=await $(t);n=r;}if(!n.length){a.warn(`No HeroUI components detected in the specified package.json at: ${t}`);return}o?ce({commandName:"list",components:n}):ce({components:n});}catch(r){a.prefix("error",`An error occurred while attempting to list the components: ${r}`);}process.exit(0);}async function pn(e,t){let{remove:o}=xe(t);await B(`${t} ${o} ${e.join(" ")}`);}async function cn(e,t){let{currentComponents:o,isHeroUIAll:n,isPnpm:r,prettier:i,tailwindPath:s}=t;if(s&&!existsSync(s)){a.prefix("warn","No tailwind.config.(j|t)s found remove action skipped");return}let p=readFileSync(s,"utf-8"),m=J("content",p),c=J("plugins",p),u=m.some(d=>d.includes(v.content));if(!o.length&&!n){let d=c.findIndex(f=>f.includes("heroui"));d!==-1&&c.splice(d,1),p=we("plugins",p,c),p=p.replace(/(const|var|let|import)[\W\w]+?heroui.*?;\n/,"");}if(!u){for(;m.some(d=>d.includes("heroui"));)m.splice(m.findIndex(d=>d.includes("heroui")),1);p=we("content",p,m);}writeFileSync(s,p,"utf-8");let[,...g]=ge(e,s,o,r,void 0,!0);tt(e,{errorInfoList:g,format:i,tailwindPath:s}),a.newLine(),a.info(`Remove the removed components tailwind content in file: ${s}`);}async function mn(e,t){let{all:o=!1,packagePath:n=P("package.json"),tailwindPath:r=me("**/tailwind.config.(j|t)s")[0]}=t;var{allDependencies:f,allDependenciesKeys:i,currentComponents:l}=$(n);let s=await j(),p=t.prettier??i.has("prettier"),m=!!f[I];if(!l.length&&!m){a.prefix("error",`No HeroUI components detected in your package.json at: ${n}`);return}if(o||m)e=m?[I]:l.map(w=>w.package);else if(!e.length)e=await he("Select the components to remove",l.map(w=>({title:w.package,value:w.package})));else {if(!be(e))return;e=Gt(e);}let c=e.includes(I)?await Qt(e,f):l.filter(w=>e.some(h=>h.includes(w.package)||h.includes(w.name)));ce({components:c,message:D.yellowBright("\u2757\uFE0F Components slated for removal:")}),await ae("Confirm removal of these components:",[{title:"Yes",value:!0},{title:"No",value:!1}])||process.exit(0);let g=[...e];l.filter(w=>!e.includes(w.package)).length||(f[Y]&&g.push(Y),f[oe]&&g.push(oe)),await pn(g,s);var{allDependencies:f,currentComponents:l}=$(n,!1);if(m=!!f[I],cn(m?"all":"partial",{currentComponents:l,isHeroUIAll:m,isPnpm:s==="pnpm",prettier:p,tailwindPath:r}),!l.length&&!m){if(s==="pnpm"){let w=P(".npmrc");if(existsSync(w)){let h=readFileSync(w,"utf-8");h=h.replace(O.content,""),a.newLine(),a.info("Removing specified .npmrc file content"),writeFileSync(w,h,"utf-8");}}a.newLine(),a.warn(`No HeroUI components remain installed. Ensure the HeroUIProvider is also removed if necessary. For more information, visit: ${qe}`);}a.newLine(),a.success(`\u2705 Successfully removed the specified HeroUI components: ${e.map(w=>D.underline(w)).join(", ")}`),process.exit(0);}async function un(e){if(e==="pnpm"){let t=P(".npmrc");if(!existsSync(t))writeFileSync(P(".npmrc"),O.content,"utf-8");else {let[o]=ke(t);o||Ie(t);}}}function fn(e,t,o){let n=e.match(/(^\w+$)/)?.[1];if(n)return t.includes(n);let r=E(e,t);return o&&r===1&&!e.includes("beta")?!1:r>=0}async function dn(e,t){let{all:o=!1,beta:n=!1,packagePath:r=P("package.json"),write:i=!1}=t,{allDependencies:s,currentComponents:p,dependencies:m,devDependencies:c,packageJson:u}=$(r,!1),g=!!s[I],d=[];if(await Promise.all(p.map(async h=>{let b=y.heroUIComponentsMap[h.name]?.version||await F(h.package),C=n?await pe(h.package):b,k=fn(h.version,C,n);d.push({...h,isLatest:k,latestVersion:C});})),!d.length&&!g){a.prefix("error",`No HeroUI components detected in your package.json at: ${r}`);return}if(o)e=p.map(h=>h.package);else if(e.length){if(!be(e))return}else {if(g){let h={isLatest:E(y.latestVersion,re(s[I]))<=0,latestVersion:y.latestVersion,package:I,version:re(s[I])};d.push(h);}d.every(h=>h.isLatest)&&(a.success("\u2705 All HeroUI packages are up to date"),process.exit(0)),e=await he("Select the components to upgrade",d.map(h=>{let b=fn(h.version,h.latestVersion,n);return {disabled:b,disabledMessage:"Already up to date",title:`${h.package}${b?"":`@${h.version} -> ${Q(h.version,h.latestVersion)}`}`,value:h.package}}));}e=e.map(h=>y.heroUIComponentsMap[h]?.package?y.heroUIComponentsMap[h].package:h);let f=d.filter(h=>e.includes(h.package)),l=await Lo({all:o,allDependencies:s,isHeroUIAll:g,upgradeOptionList:f}),x=[],w=await j();if(l.length){let h=await ae("Would you like to proceed with the upgrade?",[{title:"Yes",value:!0},{description:"Select this if you wish to exclude certain packages from the upgrade",title:"No",value:!1}]),{install:b}=xe(w);h||await ae("Would you like to exclude any packages from the upgrade?",[{description:"Select this to choose packages to exclude",title:"Yes",value:!0},{description:"Select this to proceed without excluding any packages",title:"No",value:!1}])&&(x=await Lt("Select the packages you want to exclude from the upgrade:",l.map(k=>({description:`${k.version} -> ${Q(k.version,k.latestVersion)}`,title:k.package,value:k.package})))),l=l.filter(C=>!x.some(k=>C.package===k)),i?(Mo({dependencies:m,devDependencies:c,upgradePackageList:l}),xt.writeFileSync(r,JSON.stringify(u,null,2),"utf-8"),a.newLine(),a.success("\u2705 Upgrade version written to package.json"),process.exit(0)):await Ze(()=>B(`${w} ${b} ${l.reduce((C,k,A)=>`${C}${A===0?"":" "}${k.package}@${k.latestVersion.replace(M,"")}`,"")}`));}un(w),a.newLine(),a.success("\u2705 Upgrade complete. All components are up to date."),process.exit(0);}var St=["add","env","init","list","upgrade","doctor","remove"],z=new Command;z.name("heroui").usage("[command]").description(mo(` HeroUI CLI v${Xe.version} `,"")).version(Xe.version,"-v, --version","Output the current version").helpOption("-h, --help","Display help for command").allowUnknownOption().option("--no-cache","Disable cache, by default data will be cached for 30m after the first request").option("-d, --debug","Debug mode will not install dependencies").action(async(e,t)=>{let o=!1;if(t){let n=t.args?.[0];if(n&&!St.includes(n)){o=!0;let r=Ee(St,n);r?a.error(`Unknown command '${n}', Did you mean '${D.underline(r)}'?`):a.error(`Unknown command '${n}'`);}}if(!o){let r=(await W("heroui --help")).split(` `);r=r.filter(i=>i&&!i.includes("HeroUI CLI v")),r=r.map(i=>{let s=i.match(/(\w+)\s\[/)?.[1];return s?i.replace(s,D.cyan(s)):i}),a.log(r.join(` `));}process.exit(0);});z.command("init").description("Initializes a new project").argument("[projectName]","Name of the project to initialize").option("-t --template [string]","Specify a template for the new project, e.g., app, pages").opt