love-ui 1.2.20 → 1.2.22
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/chunk-L7XDZOUL.js +122 -0
- package/dist/index.js +75 -75
- package/dist/mcp-server.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-NJPHI6KT.js +0 -121
package/dist/index.js
CHANGED
|
@@ -1,49 +1,49 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{$ as
|
|
2
|
+
import{$ as ae,A as Ot,Aa as tn,B as ze,Ba as $r,C as At,Ca as rn,D as Nt,Da as jm,E as Lt,Ea as Tm,F as _t,Fa as F,G as Vt,Ga as on,H as Lo,Ha as ct,I as Dt,Ia as Ke,J as Ut,Ja as nn,K as _o,Ka as sn,L as Mt,La as an,M as Bt,Ma as ln,N as Sr,Na as cn,O as Vo,P as Do,Q as Uo,R as Mo,S as q,T as Bo,U as Wt,V as Wo,W as zo,X as Jo,Y as Go,Z as Ho,_ as j,a as S,aa as Je,b as xo,ba as Ko,c as re,ca as Ir,d as Tt,da as je,e as d,ea as Ge,f as l,fa as L,g as M,ga as ne,h as B,ha as zt,i as W,ia as Yo,j as So,ja as Pr,k as Io,ka as qo,l as Po,la as le,m as Eo,ma as ce,n as $o,na as Zo,o as jo,oa as R,p as Ft,pa as Im,q as z,qa as ie,r as To,ra as Pm,s as lt,sa as Em,t as $e,ta as He,u as Fo,ua as Er,v as xr,va as Xo,w as Oo,wa as Qo,x as Ao,xa as Jt,y as No,ya as $m,z as b,za as en}from"./chunk-L7XDZOUL.js";import Pl from"path";import{promises as Ja}from"fs";import ue from"path";import mn from"path";import jr from"fs-extra";async function pn(e){let t={};if(!jr.existsSync(e.cwd)||!jr.existsSync(mn.resolve(e.cwd,"package.json")))return t["1"]=!0,{errors:t,projectInfo:null};let r=b("Preflight checks.",{silent:e.silent}).start();jr.existsSync(mn.resolve(e.cwd,"components.json"))&&!e.force&&(r?.fail(),l.break(),l.error(`A ${d.info("components.json")} file already exists at ${d.info(e.cwd)}.
|
|
3
3
|
To start over, remove the ${d.info("components.json")} file and run ${d.info("init")} again.`),l.break(),process.exit(1)),r?.succeed();let o=b("Verifying framework.",{silent:e.silent}).start(),n=e.existingConfig?.tailwind,i=await F(e.cwd,{configCssFile:typeof n?.css=="string"?n.css:void 0});if(!i||i?.framework.name==="manual"){if(t["7"]=!0,o?.fail(),!e.monorepo&&await M(e.cwd)){let f=await B(e.cwd);f.length>0&&(W("init",f),process.exit(1))}l.break(),i?.framework.links.installation&&l.error(`We could not detect a supported framework at ${d.info(e.cwd)}.
|
|
4
4
|
Visit ${d.info(i?.framework.links.installation)} to manually configure your project.
|
|
5
|
-
Once configured, you can use the cli to add components.`),l.break(),process.exit(1)}o?.succeed(`Verifying framework. Found ${d.info(i.framework.label)}.`);let s="Validating Tailwind CSS.";i.tailwindVersion==="v4"&&(s=`Validating Tailwind CSS. Found ${d.info("v4")}.`);let c=b(s,{silent:e.silent}).start();i.tailwindVersion==="v3"&&(!i?.tailwindConfigFile||!i?.tailwindCssFile)?(t["5"]=!0,c?.fail()):i.tailwindVersion==="v4"&&!i?.tailwindCssFile?(t["5"]=!0,c?.fail()):i.tailwindVersion?c?.succeed():(t["5"]=!0,c?.fail());let a=b("Validating import alias.",{silent:e.silent}).start();return i?.aliasPrefix?a?.succeed():(t["6"]=!0,a?.fail()),Object.keys(t).length>0&&(t["5"]&&(l.break(),l.error(`No Tailwind CSS configuration found at ${d.info(e.cwd)}.`),l.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),l.error("Install Tailwind CSS then try again."),i?.framework.links.tailwind&&l.error(`Visit ${d.info(i?.framework.links.tailwind)} to get started.`)),t["6"]&&(l.break(),l.error(`Could not find valid path aliases or package imports for ${d.info("init")}.`),l.error(`Configure path aliases in ${d.info("tsconfig.json")} or imports in ${d.info("package.json")}, then run ${d.info("init")} again.`),l.error(`Learn more at ${d.info(`${S}/docs/installation/manual#configure-import-aliases`)}.`)),l.break(),process.exit(1)),{errors:t,projectInfo:i}}var
|
|
6
|
-
`,"utf-8"),p.succeed()}return{config:a,newRegistries:Object.keys(s)}}import
|
|
7
|
-
`)}i&&await V.remove(r),c&&t==="npm"&&await
|
|
8
|
-
`)}}}function
|
|
9
|
-
`)}n?.succeed(`Creating a new ${e} project.`)}catch(i){n?.fail(`Something went wrong creating a new ${e} project.`),R(i)}}}async function
|
|
10
|
-
|
|
11
|
-
`)),s}function
|
|
12
|
-
`,between:" "}}),t.append(r),t.insertBefore(r,N.comment({text:"---break---"}))),r!==void 0&&Object.entries(e).forEach(([o,n])=>{let i=o==="light"?":root":`.${o}`;
|
|
13
|
-
`}}),e.append(o)),Object.entries(r).forEach(([n,i])=>{let s=`--${n.replace(/^--/,"")}`,c=N.decl({prop:s,value:i,raws:{semicolon:!0}}),a=o?.nodes.find(f=>f.type==="decl"&&f.prop===s);a?a.replaceWith(c):o?.append(c)})}function
|
|
14
|
-
`}}),r.append(s),r.insertBefore(s,N.comment({text:"---break---"}))),Object.entries(n).forEach(([c,a])=>{let f=`--${c.replace(/^--/,"")}`;f==="--sidebar-background"&&(f="--sidebar"),
|
|
15
|
-
`}}),e.append(t),e.insertBefore(t,N.comment({text:"---break---"}))),t}function
|
|
16
|
-
`}});if(o.length>0){let i=o[o.length-1];t.insertAfter(i,n)}else t.insertAfter(t.nodes[0],n);t.insertBefore(n,N.comment({text:"---break---"}))}}}}function
|
|
17
|
-
`}});t.insertAfter(i,a),t.insertBefore(a,N.comment({text:"---break---"}))}}}}function
|
|
5
|
+
Once configured, you can use the cli to add components.`),l.break(),process.exit(1)}o?.succeed(`Verifying framework. Found ${d.info(i.framework.label)}.`);let s="Validating Tailwind CSS.";i.tailwindVersion==="v4"&&(s=`Validating Tailwind CSS. Found ${d.info("v4")}.`);let c=b(s,{silent:e.silent}).start();i.tailwindVersion==="v3"&&(!i?.tailwindConfigFile||!i?.tailwindCssFile)?(t["5"]=!0,c?.fail()):i.tailwindVersion==="v4"&&!i?.tailwindCssFile?(t["5"]=!0,c?.fail()):i.tailwindVersion?c?.succeed():(t["5"]=!0,c?.fail());let a=b("Validating import alias.",{silent:e.silent}).start();return i?.aliasPrefix?a?.succeed():(t["6"]=!0,a?.fail()),Object.keys(t).length>0&&(t["5"]&&(l.break(),l.error(`No Tailwind CSS configuration found at ${d.info(e.cwd)}.`),l.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),l.error("Install Tailwind CSS then try again."),i?.framework.links.tailwind&&l.error(`Visit ${d.info(i?.framework.links.tailwind)} to get started.`)),t["6"]&&(l.break(),l.error(`Could not find valid path aliases or package imports for ${d.info("init")}.`),l.error(`Configure path aliases in ${d.info("tsconfig.json")} or imports in ${d.info("package.json")}, then run ${d.info("init")} again.`),l.error(`Learn more at ${d.info(`${S}/docs/installation/manual#configure-import-aliases`)}.`)),l.break(),process.exit(1)),{errors:t,projectInfo:i}}var Es=["nova","vega","maia","lyra","mira","luma","sera","rhea"],Tr=["neutral","stone","zinc","gray","mauve","olive","mist","taupe"],Ht=["neutral","stone","zinc","gray","amber","blue","cyan","emerald","fuchsia","green","indigo","lime","orange","pink","purple","red","rose","sky","teal","violet","yellow","mauve","olive","mist","taupe"],$s=Ht,un={neutral:"blue",stone:"lime",zinc:"amber",mauve:"emerald",olive:"violet",mist:"rose",taupe:"cyan"},Fr=["lucide","hugeicons","tabler","phosphor","remixicon","love-ui/icons"],Kt=["inter","noto-sans","nunito-sans","figtree","roboto","raleway","dm-sans","public-sans","outfit","jetbrains-mono","geist","geist-mono","lora","merriweather","playfair-display","noto-serif","roboto-slab","oxanium","manrope","space-grotesk","montserrat","ibm-plex-sans","source-sans-3","instrument-sans","eb-garamond","instrument-serif"],Or=["inherit",...Kt],js=["default","none","small","medium","large"],Ar=["subtle","bold"],Nr=["default","inverted","default-translucent","inverted-translucent"],dn=[{key:"menuColor",values:Nr,bits:3},{key:"menuAccent",values:Ar,bits:3},{key:"radius",values:js,bits:4},{key:"font",values:Kt,bits:6},{key:"iconLibrary",values:Fr,bits:6},{key:"theme",values:Ht,bits:6},{key:"baseColor",values:Tr,bits:6},{key:"style",values:Es,bits:6}],Lr=[...dn,{key:"chartColor",values:$s,bits:6},{key:"fontHeading",values:Or,bits:5}],Ts=Object.fromEntries(Lr.map(e=>[e.key,e.values[0]])),_r="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",Fs="b",gn=["a","b"];function Os(e){if(e===0)return"0";let t="",r=e;for(;r>0;)t=_r[r%62]+t,r=Math.floor(r/62);return t}function As(e){let t=0;for(let r=0;r<e.length;r++){let o=_r.indexOf(e[r]);if(o===-1)return-1;t=t*62+o}return t}function hn(e){let t={...Ts,...e},r=0,o=0;for(let n of Lr){let i=n.values.indexOf(t[n.key]);r+=(i===-1?0:i)*2**o,o+=n.bits}return Fs+Os(r)}function Ye(e){if(!e||e.length<2)return null;let t=e[0];if(!gn.includes(t))return null;let r=t==="a"?dn:Lr,o=As(e.slice(1));if(o<0)return null;let n={},i=0;for(let s of r){let c=Math.floor(o/2**i)%2**s.bits;n[s.key]=c<s.values.length?s.values[c]:s.values[0],i+=s.bits}return t==="a"&&(n.fontHeading="inherit"),n}function qe(e){if(!e||e.length<2||e.length>10||!gn.includes(e[0]))return!1;for(let t=1;t<e.length;t++)if(_r.indexOf(e[t])===-1)return!1;return!0}import Ns from"path";async function yn(e,t){let r=new Set,o=new Set,n=[...e];for(;n.length>0;){let i=n.shift();if(o.has(i))continue;o.add(i);let{registry:s}=Ft(i);s&&!re[s]&&r.add(s);try{let[c]=await qo([i],t,{useCache:!0});if(c?.registryDependencies)for(let a of c.registryDependencies){let{registry:f}=Ft(a);f&&!re[f]&&r.add(f),o.has(a)||n.push(a)}}catch(c){if(c instanceof jo){let{registry:a}=Ft(i);a&&!re[a]&&r.add(a);continue}continue}}return Array.from(r)}import Ls from"fs-extra";async function G(e,t,r={}){r={silent:!1,writeFile:!0,...r};let n=(await yn(e,t)).filter(f=>!t.registries?.[f]&&!Object.keys(re).includes(f));if(n.length===0)return{config:t,newRegistries:[]};let i=await rn({useCache:process.env.NODE_ENV!=="development"});if(!i)return{config:t,newRegistries:[]};let s={};for(let f of n)i[f]&&(s[f]=i[f]);if(Object.keys(s).length===0)return{config:t,newRegistries:[]};let c=Object.fromEntries(Object.entries(t.registries||{}).filter(([f])=>!Object.keys(re).includes(f))),a={...t,registries:{...c,...s}};if(r.writeFile){let{resolvedPaths:f,...m}=a,p=b("Updating components.json.",{silent:r.silent}).start(),u=z.parse(m);await Ls.writeFile(Ns.resolve(t.resolvedPaths.cwd,"components.json"),JSON.stringify(u,null,2)+`
|
|
6
|
+
`,"utf-8"),p.succeed()}return{config:a,newRegistries:Object.keys(s)}}import _s from"open";import wn from"prompts";var Z={nova:{title:"Nova",description:"Geist",style:"nova",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"love-ui/icons",font:"geist",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},vega:{title:"Vega",description:"Inter",style:"vega",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"love-ui/icons",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},maia:{title:"Maia",description:"Figtree",style:"maia",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"love-ui/icons",font:"figtree",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},lyra:{title:"Lyra",description:"JetBrains Mono",style:"lyra",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"love-ui/icons",font:"jetbrains-mono",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},mira:{title:"Mira",description:"Inter",style:"mira",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"love-ui/icons",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},luma:{title:"Luma",description:"Inter",style:"luma",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"love-ui/icons",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},sera:{title:"Sera",description:"Noto Sans + Playfair Display",style:"sera",baseColor:"taupe",theme:"taupe",chartColor:"taupe",iconLibrary:"love-ui/icons",font:"noto-sans",fontHeading:"playfair-display",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},rhea:{title:"Rhea",description:"Inter",style:"rhea",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"love-ui/icons",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1}};function Vr(e){let t=new URL(`${S}/create`),{rtl:r,pointer:o,...n}=e??{};for(let[i,s]of Object.entries(n))s!==void 0&&t.searchParams.set(i,String(s));return r&&t.searchParams.set("rtl","true"),o&&t.searchParams.set("pointer","true"),t.toString()}async function Dr(e){if(l.break(),l.log(` Build your custom preset on ${d.info(e.createUrl)}`),l.log(` ${e.followUp}`),l.break(),e.prompt===!1)return;let{proceed:t}=await wn({type:"confirm",name:"proceed",message:"Open in browser?",initial:!0});t&&await _s(e.createUrl)}function he(e,t){let r=new URLSearchParams({base:"base",style:e.style,baseColor:e.baseColor,theme:e.theme,iconLibrary:"love-ui/icons",font:e.font,rtl:String(e.rtl??!1),menuAccent:e.menuAccent,menuColor:e.menuColor,radius:e.radius});return e.chartColor&&e.chartColor!=="neutral"&&r.set("chartColor",e.chartColor),e.fontHeading&&e.fontHeading!=="inherit"&&r.set("fontHeading",e.fontHeading),t?.preset&&r.set("preset",t.preset),t?.template&&r.set("template",t.template),t?.only&&r.set("only",t.only),t?.pointer&&r.set("pointer","true"),r.set("track","1"),`${S}/init?${r.toString()}`}async function Ze(){return"base"}async function ft(e){let t=Object.entries(Z),{selectedPreset:r}=await wn({type:"select",name:"selectedPreset",message:`Which ${d.info("preset")} would you like to use?`,choices:[...t.map(([n,i])=>({title:i.title,description:i.description,value:n})),{title:"Custom",description:`Build your own at ${d.info(`${S}/create`)}`,value:"custom"}]});if(r||process.exit(1),r==="custom"){let n=Vr({command:"init",rtl:e.rtl,pointer:e.pointer,base:e.base,...e.template&&{template:e.template}});await Dr({createUrl:n,followUp:`Then ${d.info("copy and run the command")} from loveui.dev.`}),process.exit(0)}let o=Z[r];return o||process.exit(1),{url:he({...o,base:e.base,rtl:e.rtl},{template:e.template,pointer:e.pointer}),base:e.base}}async function Te(e,t,r){let o=L(Ge({resolvedPaths:{cwd:t},...r?.registries&&{registries:r.registries}})),{config:n}=await G([e],o,{silent:!0,writeFile:!1});o=n,Yo(e,o);let[i]=await ie([e],{config:o,useCache:!0}),s=i?.type==="registry:base"&&i.config?i.config:void 0,c=e;if(Vs(e)){let a=new URL(e);a.searchParams.delete("track"),c=a.toString()}return{registryBaseConfig:s,installStyleIndex:i?.extends!=="none",url:c}}function Vs(e){try{return new URL(e).pathname==="/init"&&e.startsWith(S)}catch{return!1}}import An from"dedent";import Ds from"os";import me from"path";import{execa as Fe}from"execa";import V from"fs-extra";var Us=process.env.LOVEUI_GITHUB_URL??"https://github.com/loveconnor/loveui.git";function X(e){return{...e,frameworks:e.frameworks??[],scaffold:e.scaffold??kn({title:e.title,templateDir:e.templateDir}),postInit:e.postInit??zs}}function Oe(e,{monorepo:t}){if(!t||!e.monorepo)return e;let r=e.monorepo,o={...e,templateDir:r.templateDir,defaultProjectName:r.defaultProjectName??r.templateDir,init:r.init??e.init,files:r.files??e.files};return o.scaffold=kn({title:e.title,templateDir:r.templateDir}),o}function Ms(e){switch(e){case"pnpm":return["--no-frozen-lockfile"];case"yarn":return["--no-immutable"];default:return[]}}async function Bs(e,t){if(t==="pnpm")return;let r=me.join(e,"pnpm-workspace.yaml"),o=me.join(e,"package.json"),n=me.join(e,"pnpm-lock.yaml");V.existsSync(n)&&await V.remove(n);let i=V.existsSync(r),s=i?So(await V.readFile(r,"utf8")):[],c=s.length>0;if(V.existsSync(o)){let a=await V.readFile(o,"utf8"),f=JSON.parse(a);c?f.packageManager=await Ws(t):delete f.packageManager,c&&(f.workspaces=s),await V.writeFile(o,JSON.stringify(f,null,2)+`
|
|
7
|
+
`)}i&&await V.remove(r),c&&t==="npm"&&await bn(e)}async function Ws(e){try{let{stdout:t}=await Fe(e,["--version"]);return`${e}@${t.trim()}`}catch{return`${e}@*`}}async function bn(e){let t=await V.readdir(e,{withFileTypes:!0});for(let r of t){if(r.name==="node_modules")continue;let o=me.join(e,r.name);if(r.isDirectory())await bn(o);else if(r.name==="package.json"){let n=await V.readFile(o,"utf8");if(!n.includes("workspace:"))continue;let i=JSON.parse(n),s=!1;for(let c of["dependencies","devDependencies","peerDependencies","optionalDependencies"]){let a=i[c];if(a)for(let[f,m]of Object.entries(a))typeof m=="string"&&m.startsWith("workspace:")&&(a[f]="*",s=!0)}s&&await V.writeFile(o,JSON.stringify(i,null,2)+`
|
|
8
|
+
`)}}}function kn({title:e,templateDir:t}){return async({projectPath:r,packageManager:o})=>{let n=b(`Creating a new ${e} project. This may take a few minutes.`).start();try{let i=process.env.LOVEUI_TEMPLATE_DIR;if(i){let f=me.resolve(i,t);await V.copy(f,r,{filter:m=>!m.includes("node_modules")})}else{let f=me.join(Ds.tmpdir(),`love-ui-template-${Date.now()}`);await Fe("git",["clone","--depth","1","--filter=blob:none","--sparse",Us,f]),await Fe("git",["-C",f,"sparse-checkout","set",`templates/${t}`]);let m=me.resolve(f,"templates",t);await V.move(m,r),await V.remove(f)}await Bs(r,o);let c=["install",...Ms(o)];await Fe(o,c,{cwd:r});let a=me.join(r,"package.json");if(V.existsSync(a)){let f=await V.readFile(a,"utf8"),m=JSON.parse(f);m.name=me.basename(r),await V.writeFile(a,JSON.stringify(m,null,2)+`
|
|
9
|
+
`)}n?.succeed(`Creating a new ${e} project.`)}catch(i){n?.fail(`Something went wrong creating a new ${e} project.`),R(i)}}}async function zs({projectPath:e}){try{await Fe("git",["init"],{cwd:e}),await Fe("git",["add","-A"],{cwd:e}),await Fe("git",["commit","-m","feat: initial commit"],{cwd:e})}catch{}}import Qt from"path";import ke from"path";var vn={"--font-heading":"cn-font-heading"};function Js(e){return e.startsWith("--")?e:`--${e}`}function Ae(e){let t=new Set;for(let r of e){for(let o of r.fonts??[]){let n=o.font?.variable;if(!n)continue;let i=vn[n];i&&t.add(i)}for(let o of Object.values(r.cssVars??{}))for(let n of Object.keys(o??{})){let i=vn[Js(n)];i&&t.add(i)}}return Array.from(t)}import Xe from"path";function Cn(e,t){if(e.includes("\0"))return!1;let r;try{r=e;let u="";for(;r!==u&&r.includes("%");)u=r,r=decodeURIComponent(r)}catch{return!1}let o=Xe.normalize(r.replace(/\\/g,"/")),n=Xe.normalize(t),i=u=>u.replace(/\[\.\.\..*?\]/g,"").includes("..");if(i(o)||i(r)||i(e))return!1;let s=u=>u.replace(/\[\.\.\..*?\]/g,""),c=s(e),a=s(r);if([/\.\.[\/\\]/,/[\/\\]\.\./,/\.\./,/\.\.%/,/\x00/,/[\x01-\x1f]/].some(u=>u.test(c)||u.test(a))||(e.includes("~")||r.includes("~"))&&(e.includes("../")||r.includes("../")))return!1;if(/^[a-zA-Z]:[\/\\]/.test(r))return process.platform==="win32"?r.toLowerCase().startsWith(t.toLowerCase()):!1;if(Xe.isAbsolute(o))return o.startsWith(n+Xe.sep);let p=Xe.resolve(n,o);return p.startsWith(n+Xe.sep)||p===n}import{promises as Pn}from"fs";import na from"path";import{promises as Rn}from"fs";import Gs from"path";import N from"postcss";import Hs from"postcss/lib/at-rule";import{z as ye}from"zod";async function Yt(e,t,r){if(!t.resolvedPaths.tailwindCss||!Object.keys(e??{}).length)return;r={cleanupDefaultNextStyles:!1,silent:!1,tailwindVersion:"v3",overwriteCssVars:!1,...r};let o=t.resolvedPaths.tailwindCss,n=Gs.relative(t.resolvedPaths.cwd,o),i=b(`Updating CSS variables in ${d.info(n)}`,{silent:r.silent}).start(),s=await Rn.readFile(o,"utf8"),c=await mt(s,e??{},t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars});await Rn.writeFile(o,c,"utf8"),i.succeed()}async function mt(e,t,r,o={cleanupDefaultNextStyles:!1,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:!1}){o={cleanupDefaultNextStyles:!1,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:!1,...o};let n=[Ks(t)];o.cleanupDefaultNextStyles&&n.push(Sn()),o.tailwindVersion==="v4"&&(n=[],n.push(Xs({params:"dark (&:is(.dark *))"})),o.cleanupDefaultNextStyles&&n.push(Sn()),n.push(qs(t,{overwriteCssVars:o.overwriteCssVars})),n.push(Zs(t)),o.tailwindConfig&&(n.push(Qs(o.tailwindConfig)),n.push(ta(o.tailwindConfig)),n.push(ea(o.tailwindConfig))));let s=(await N(n).process(e,{from:void 0})).css;return s=s.replace(/\/\* ---break--- \*\//g,""),o.tailwindVersion==="v4"&&(s=s.replace(/(\n\s*\n)+/g,`
|
|
10
|
+
|
|
11
|
+
`)),s}function Ks(e){return{postcssPlugin:"update-css-vars",Once(t){let r=t.nodes.find(o=>o.type==="atrule"&&o.name==="layer"&&o.params==="base");r instanceof Hs||(r=N.atRule({name:"layer",params:"base",nodes:[],raws:{semicolon:!0,before:`
|
|
12
|
+
`,between:" "}}),t.append(r),t.insertBefore(r,N.comment({text:"---break---"}))),r!==void 0&&Object.entries(e).forEach(([o,n])=>{let i=o==="light"?":root":`.${o}`;Ys(r,i,n)})}}}function xn(e){let t=e.nodes.find(r=>r.type==="rule"&&r.selector===":root");if(t){let r=["--background","--foreground"];t.nodes.filter(o=>o.type==="decl"&&r.includes(o.prop)).forEach(o=>o.remove()),t.nodes.length===0&&t.remove()}}function Sn(){return{postcssPlugin:"cleanup-default-next-styles",Once(e){let t=e.nodes.find(o=>o.type==="rule"&&o.selector==="body");t&&(t.nodes.find(o=>o.type==="decl"&&o.prop==="color"&&["rgb(var(--foreground-rgb))","var(--foreground)"].includes(o.value))?.remove(),t.nodes.find(o=>o.type==="decl"&&o.prop==="background"&&(o.value.startsWith("linear-gradient")||o.value==="var(--background)"))?.remove(),t.nodes.find(o=>o.type==="decl"&&o.prop==="font-family"&&o.value==="Arial, Helvetica, sans-serif")?.remove(),t.nodes.length===0&&t.remove()),xn(e);let r=e.nodes.find(o=>o.type==="atrule"&&o.params==="(prefers-color-scheme: dark)");r&&(xn(r),r.nodes.length===0&&r.remove())}}}function Ys(e,t,r){let o=e.nodes?.find(n=>n.type==="rule"&&n.selector===t);o||Object.keys(r).length>0&&(o=N.rule({selector:t,raws:{between:" ",before:`
|
|
13
|
+
`}}),e.append(o)),Object.entries(r).forEach(([n,i])=>{let s=`--${n.replace(/^--/,"")}`,c=N.decl({prop:s,value:i,raws:{semicolon:!0}}),a=o?.nodes.find(f=>f.type==="decl"&&f.prop===s);a?a.replaceWith(c):o?.append(c)})}function qs(e,t){return{postcssPlugin:"update-css-vars-v4",Once(r){Object.entries(e).forEach(([o,n])=>{let i=o==="light"?":root":`.${o}`;if(o==="theme"){i="@theme";let c=qt(r);Object.entries(n).forEach(([a,f])=>{let m=`--${a.replace(/^--/,"")}`,p=N.decl({prop:m,value:f,raws:{semicolon:!0}}),u=c?.nodes?.find(h=>h.type==="decl"&&h.prop===m);t.overwriteCssVars?u?u.replaceWith(p):c?.append(p):u||c?.append(p)});return}let s=r.nodes?.find(c=>c.type==="rule"&&c.selector===i);!s&&Object.keys(n).length>0&&(s=N.rule({selector:i,nodes:[],raws:{semicolon:!0,between:" ",before:`
|
|
14
|
+
`}}),r.append(s),r.insertBefore(s,N.comment({text:"---break---"}))),Object.entries(n).forEach(([c,a])=>{let f=`--${c.replace(/^--/,"")}`;f==="--sidebar-background"&&(f="--sidebar"),In(a)&&(a=`hsl(${a})`);let m=N.decl({prop:f,value:a,raws:{semicolon:!0}}),p=s?.nodes.find(u=>u.type==="decl"&&u.prop===f);t.overwriteCssVars?p?p.replaceWith(m):s?.append(m):p||s?.append(m)})})}}}function Zs(e){return{postcssPlugin:"update-theme",Once(t){let r=Array.from(new Set(Object.keys(e).flatMap(i=>Object.keys(e[i]||{}))));if(!r.length)return;let o=qt(t),n=o.nodes?.filter(i=>i.type==="decl"&&i.prop.startsWith("--"));for(let i of r){let s=Object.values(e).find(p=>p[i])?.[i];if(!s)continue;if(i==="radius"){let p={sm:"calc(var(--radius) * 0.6)",md:"calc(var(--radius) * 0.8)",lg:"var(--radius)",xl:"calc(var(--radius) * 1.4)","2xl":"calc(var(--radius) * 1.8)","3xl":"calc(var(--radius) * 2.2)","4xl":"calc(var(--radius) * 2.6)"};for(let[u,h]of Object.entries(p)){let g=N.decl({prop:`--radius-${u}`,value:h,raws:{semicolon:!0}});o?.nodes?.find(y=>y.type==="decl"&&y.prop===g.prop)||o?.append(g)}continue}let c=In(s)||oa(s)?`--color-${i.replace(/^--/,"")}`:`--${i.replace(/^--/,"")}`;c==="--color-sidebar-background"&&(c="--color-sidebar");let a=`var(--${i})`;c==="--color-sidebar"&&(a="var(--sidebar)");let f=N.decl({prop:c,value:a,raws:{semicolon:!0}});o?.nodes?.find(p=>p.type==="decl"&&p.prop===f.prop)||(n?.length?o?.insertAfter(n[n.length-1],f):o?.append(f))}}}}function qt(e){let t=e.nodes.find(r=>r.type==="atrule"&&r.name==="theme"&&r.params==="inline");return t||(t=N.atRule({name:"theme",params:"inline",nodes:[],raws:{semicolon:!0,between:" ",before:`
|
|
15
|
+
`}}),e.append(t),e.insertBefore(t,N.comment({text:"---break---"}))),t}function Xs({params:e}){return{postcssPlugin:"add-custom-variant",Once(t){if(!t.nodes.find(o=>o.type==="atrule"&&o.name==="custom-variant")){let o=t.nodes.filter(i=>i.type==="atrule"&&i.name==="import"),n=N.atRule({name:"custom-variant",params:e,raws:{semicolon:!0,before:`
|
|
16
|
+
`}});if(o.length>0){let i=o[o.length-1];t.insertAfter(i,n)}else t.insertAfter(t.nodes[0],n);t.insertBefore(n,N.comment({text:"---break---"}))}}}}function Qs(e){return{postcssPlugin:"update-tailwind-config",Once(t){if(!e?.plugins)return;let o=ra(t)==="single"?"'":'"',n=t.nodes.filter(s=>s.type==="atrule"&&s.name==="plugin"),i=n[n.length-1]||t.nodes[0];for(let s of e.plugins){let c=s.replace(/^require\(["']|["']\)$/g,"");if(n.some(f=>f.params.replace(/["']/g,"")===c))continue;let a=N.atRule({name:"plugin",params:`${o}${c}${o}`,raws:{semicolon:!0,before:`
|
|
17
|
+
`}});t.insertAfter(i,a),t.insertBefore(a,N.comment({text:"---break---"}))}}}}function ea(e){return{postcssPlugin:"update-tailwind-config-keyframes",Once(t){if(!e?.theme?.extend?.keyframes)return;let r=qt(t),o=r.nodes?.filter(i=>i.type==="atrule"&&i.name==="keyframes"),n=ye.record(ye.string(),ye.record(ye.string(),ye.string()));for(let[i,s]of Object.entries(e.theme.extend.keyframes)){if(typeof i!="string")continue;let c=n.safeParse(s);if(!c.success||o?.find(f=>f.type==="atrule"&&f.name==="keyframes"&&f.params===i))continue;let a=N.atRule({name:"keyframes",params:i,nodes:[],raws:{semicolon:!0,between:" ",before:`
|
|
18
18
|
`}});for(let[f,m]of Object.entries(c.data)){let p=N.rule({selector:f,nodes:Object.entries(m).map(([u,h])=>N.decl({prop:u,value:h,raws:{semicolon:!0,before:`
|
|
19
19
|
`,between:": "}})),raws:{semicolon:!0,between:" ",before:`
|
|
20
|
-
`}});a.append(p)}r.append(a),r.insertBefore(a,N.comment({text:"---break---"}))}}}}function
|
|
21
|
-
`}});r.append(a)}}}}function
|
|
20
|
+
`}});a.append(p)}r.append(a),r.insertBefore(a,N.comment({text:"---break---"}))}}}}function ta(e){return{postcssPlugin:"update-tailwind-config-animation",Once(t){if(!e?.theme?.extend?.animation)return;let r=qt(t),o=r.nodes?.filter(i=>i.type==="decl"&&i.prop.startsWith("--animate-")),n=ye.record(ye.string(),ye.string()).safeParse(e.theme.extend.animation);if(n.success)for(let[i,s]of Object.entries(n.data)){let c=`--animate-${i}`;if(o?.find(f=>f.prop===c))continue;let a=N.decl({prop:c,value:s,raws:{semicolon:!0,between:": ",before:`
|
|
21
|
+
`}});r.append(a)}}}}function ra(e){return e.nodes[0].toString().includes("'")?"single":"double"}function In(e){if(e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch"))return!1;let t=e.split(" ");return t.length===3&&t.slice(1,3).every(r=>r.includes("%"))}function oa(e){return e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch")||e.includes("--color-")}import P from"postcss";import{twMerge as ia}from"tailwind-merge";async function pt(e,t,r){let o=e&&Object.keys(e).length>0,n=Object.keys(r.cssVars??{}).length>0;if(!t.resolvedPaths.tailwindCss||!o&&!n)return;r={silent:!1,...r};let i=t.resolvedPaths.tailwindCss,s=na.relative(t.resolvedPaths.cwd,i),c=b(`Updating ${d.info(s)}`,{silent:r.silent}).start(),a=await Pn.readFile(i,"utf8");n&&(a=await mt(a,r.cssVars,t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars})),o&&(a=await Ur(a,e)),await Pn.writeFile(i,a,"utf8"),c.succeed()}async function Ur(e,t){let r=[sa(t)],o=await P(r).process(e,{from:void 0}),n=o.css,i=o.root;if(i.nodes&&i.nodes.length>0){let s=i.nodes[i.nodes.length-1];s.type==="atrule"&&!s.nodes&&!n.trimEnd().endsWith(";")&&(n=n.trimEnd()+";")}return n=n.replace(/\/\* ---break--- \*\//g,""),n=n.replace(/(\n\s*\n)+/g,`
|
|
22
22
|
|
|
23
|
-
`),n=n.trimEnd(),n}function
|
|
23
|
+
`),n=n.trimEnd(),n}function sa(e){return{postcssPlugin:"update-css",Once(t){for(let[r,o]of Object.entries(e))if(r.startsWith("@")){let n=r.match(/@([a-zA-Z-]+)\s*(.*)/);if(!n)continue;let[,i,s]=n;if(i==="import"){if(!t.nodes?.find(a=>a.type==="atrule"&&a.name==="import"&&a.params===s)){let a=P.atRule({name:"import",params:s,raws:{semicolon:!0}}),f=t.nodes?.filter(m=>m.type==="atrule"&&m.name==="import");if(f&&f.length>0){let m=f[f.length-1];a.raws.before=`
|
|
24
24
|
`,t.insertAfter(m,a)}else!t.nodes||t.nodes.length,a.raws.before="",t.prepend(a)}}else if(i==="plugin"){let c=s;s&&!s.startsWith('"')&&!s.startsWith("'")&&(c=`"${s}"`);let a=m=>m.startsWith('"')&&m.endsWith('"')||m.startsWith("'")&&m.endsWith("'")?m.slice(1,-1):m;if(!t.nodes?.find(m=>m.type!=="atrule"||m.name!=="plugin"?!1:a(m.params)===a(s))){let m=P.atRule({name:"plugin",params:c,raws:{semicolon:!0,before:`
|
|
25
25
|
`}}),p=t.nodes?.filter(h=>h.type==="atrule"&&h.name==="import"),u=t.nodes?.filter(h=>h.type==="atrule"&&h.name==="plugin");if(u&&u.length>0){let h=u[u.length-1];t.insertAfter(h,m)}else if(p&&p.length>0){let h=p[p.length-1];t.insertAfter(h,m),t.insertBefore(m,P.comment({text:"---break---"})),t.insertAfter(m,P.comment({text:"---break---"}))}else t.prepend(m),t.insertBefore(m,P.comment({text:"---break---"})),t.insertAfter(m,P.comment({text:"---break---"}))}}else if(typeof o=="object"&&Object.keys(o).length===0){if(!t.nodes?.find(a=>a.type==="atrule"&&a.name===i&&a.params===s)){let a=P.atRule({name:i,params:s,raws:{semicolon:!0}});t.append(a),t.insertBefore(a,P.comment({text:"---break---"}))}}else if(i==="keyframes"){let c=t.nodes?.find(m=>m.type==="atrule"&&m.name==="theme"&&m.params==="inline");c||(c=P.atRule({name:"theme",params:"inline",raws:{semicolon:!0,between:" ",before:`
|
|
26
26
|
`}}),t.append(c),t.insertBefore(c,P.comment({text:"---break---"})));let a=c.nodes?.find(m=>m.type==="atrule"&&m.name==="keyframes"&&m.params===s),f;if(a?(f=P.atRule({name:"keyframes",params:s,raws:{semicolon:!0,between:" ",before:`
|
|
27
27
|
`}}),a.replaceWith(f)):(f=P.atRule({name:"keyframes",params:s,raws:{semicolon:!0,between:" ",before:`
|
|
28
|
-
`}}),c.append(f)),typeof o=="object")for(let[m,p]of Object.entries(o))
|
|
28
|
+
`}}),c.append(f)),typeof o=="object")for(let[m,p]of Object.entries(o))Ne(f,m,p)}else if(i==="utility"){let c=t.nodes?.find(a=>a.type==="atrule"&&a.name===i&&a.params===s);if(c){if(typeof o=="object")for(let[a,f]of Object.entries(o))if(typeof f=="string"){let m=c.nodes?.find(u=>u.type==="decl"&&u.prop===a),p=P.decl({prop:a,value:f,raws:{semicolon:!0,before:`
|
|
29
29
|
`}});m?m.replaceWith(p):c.append(p)}else if(a.startsWith("@")&&typeof f=="object"&&f!==null&&Object.keys(f).length===0){let m=a.match(/@([a-zA-Z-]+)\s*(.*)/);if(m){let[,p,u]=m;if(!c.nodes?.find(g=>g.type==="atrule"&&g.name===p&&g.params===u)){let g=P.atRule({name:p,params:u,raws:{semicolon:!0,before:`
|
|
30
|
-
`}});c.append(g)}}}else typeof f=="object"&&
|
|
30
|
+
`}});c.append(g)}}}else typeof f=="object"&&Ne(c,a,f)}else{let a=P.atRule({name:i,params:s,raws:{semicolon:!0,between:" ",before:`
|
|
31
31
|
`}});if(t.append(a),t.insertBefore(a,P.comment({text:"---break---"})),typeof o=="object")for(let[f,m]of Object.entries(o))if(typeof m=="string"){let p=P.decl({prop:f,value:m,raws:{semicolon:!0,before:`
|
|
32
32
|
`}});a.append(p)}else if(f.startsWith("@")&&typeof m=="object"&&m!==null&&Object.keys(m).length===0){let p=f.match(/@([a-zA-Z-]+)\s*(.*)/);if(p){let[,u,h]=p;if(!a.nodes?.find(y=>y.type==="atrule"&&y.name===u&&y.params===h)){let y=P.atRule({name:u,params:h,raws:{semicolon:!0,before:`
|
|
33
|
-
`}});a.append(y)}}}else typeof m=="object"&&
|
|
34
|
-
`}}),e.append(n),e.insertBefore(n,P.comment({text:"---break---"}))),typeof o=="object")for(let[i,s]of Object.entries(o))if(i.startsWith("@")){let c=i.match(/@([a-zA-Z-]+)\s*(.*)/);if(c){let[,a,f]=c;
|
|
33
|
+
`}});a.append(y)}}}else typeof m=="object"&&Ne(a,f,m)}}else i==="property"?Ne(t,r,o):En(t,i,s,o)}else Ne(t,r,o)}}}function En(e,t,r,o){let n=e.nodes?.find(i=>i.type==="atrule"&&i.name===t&&i.params===r);if(n||(n=P.atRule({name:t,params:r,raws:{semicolon:!0,between:" ",before:`
|
|
34
|
+
`}}),e.append(n),e.insertBefore(n,P.comment({text:"---break---"}))),typeof o=="object")for(let[i,s]of Object.entries(o))if(i.startsWith("@")){let c=i.match(/@([a-zA-Z-]+)\s*(.*)/);if(c){let[,a,f]=c;En(n,a,f,s)}}else Ne(n,i,s);else if(typeof o=="string")try{let s=P.parse(`.temp{${o}}`).first;if(s&&s.nodes){let c=P.rule({selector:"temp",raws:{semicolon:!0,between:" ",before:`
|
|
35
35
|
`}});s.nodes.forEach(a=>{if(a.type==="decl"){let f=a.clone();f.raws.before=`
|
|
36
|
-
`,c.append(f)}}),c.nodes?.length&&n.append(c)}}catch(i){throw console.error("Error parsing at-rule content:",o,i),i}}function
|
|
37
|
-
`}}),e.append(o)),typeof r=="object"){for(let[n,i]of Object.entries(r))if(n.startsWith("@")&&typeof i=="object"&&i!==null&&Object.keys(i).length===0){let s=n.match(/@([a-zA-Z-]+)\s*(.*)/);if(s){let[,c,a]=s;if(!o.nodes?.find(m=>m.type==="atrule"&&m.name===c&&m.params===a)){if(c==="apply"){let p=o.nodes?.find(u=>u.type==="atrule"&&u.name==="apply");if(p){p.params=
|
|
36
|
+
`,c.append(f)}}),c.nodes?.length&&n.append(c)}}catch(i){throw console.error("Error parsing at-rule content:",o,i),i}}function Ne(e,t,r){let o=e.nodes?.find(n=>n.type==="rule"&&n.selector===t);if(o||(o=P.rule({selector:t,raws:{semicolon:!0,between:" ",before:`
|
|
37
|
+
`}}),e.append(o)),typeof r=="object"){for(let[n,i]of Object.entries(r))if(n.startsWith("@")&&typeof i=="object"&&i!==null&&Object.keys(i).length===0){let s=n.match(/@([a-zA-Z-]+)\s*(.*)/);if(s){let[,c,a]=s;if(!o.nodes?.find(m=>m.type==="atrule"&&m.name===c&&m.params===a)){if(c==="apply"){let p=o.nodes?.find(u=>u.type==="atrule"&&u.name==="apply");if(p){p.params=ia(p.params,a);continue}}let m=P.atRule({name:c,params:a,raws:{semicolon:!0,before:`
|
|
38
38
|
`}});o.append(m)}}}else if(typeof i=="string"){let s=P.decl({prop:n,value:i,raws:{semicolon:!0,before:`
|
|
39
|
-
`}}),c=o.nodes?.find(a=>a.type==="decl"&&a.prop===n);c?c.replaceWith(s):o.append(s)}else if(typeof i=="object"){let s=n.startsWith("&")?t.replace(/^([^:]+)/,`$1${n.substring(1)}`):n;
|
|
40
|
-
`,o?.append(c)}})}catch(n){throw console.error("Error parsing rule content:",t,r,n),n}}import{execa as we}from"execa";import
|
|
39
|
+
`}}),c=o.nodes?.find(a=>a.type==="decl"&&a.prop===n);c?c.replaceWith(s):o.append(s)}else if(typeof i=="object"){let s=n.startsWith("&")?t.replace(/^([^:]+)/,`$1${n.substring(1)}`):n;Ne(e,s,i)}}else if(typeof r=="string")try{let i=P.parse(`.temp{${r}}`).first;i&&i.nodes&&i.nodes.forEach(s=>{if(s.type==="decl"){let c=s.clone();c.raws.before=`
|
|
40
|
+
`,o?.append(c)}})}catch(n){throw console.error("Error parsing rule content:",t,r,n),n}}import{execa as we}from"execa";import aa from"prompts";var la=/^(?:@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/i;async function D(e,t,r,o){if(e=Array.from(new Set(e)),t=Array.from(new Set(t)),!e?.length&&!t?.length)return;o={silent:!1,...o};let n=b("Installing dependencies.",{silent:o.silent})?.start(),i=await fa(r),s="";if(ca(r)&&i==="npm")if(o.silent)s="force";else{n.stopAndPersist(),l.warn(`
|
|
41
41
|
It looks like you are using React 19.
|
|
42
42
|
Some packages may fail to install due to peer dependency issues in npm (see ${S}/react-19).
|
|
43
|
-
`);let c=await
|
|
44
|
-
`),m=[],p=null,u=null;if(c){let h=await Mr.readFile(i,"utf-8"),g=
|
|
45
|
-
`,"utf-8"),u=
|
|
46
|
-
`)}s.push(I),ha(p)&&c.push(p.font.variable.replace("--",""))}}let a=new Set(["font-sans","font-serif","font-mono"]),f=[...c].reverse().find(p=>a.has(p)),m=c.filter(p=>!a.has(p));return f&&m.unshift(f),s.length>0&&Ra(n,s,m,r),n.getFullText()}function da(e){let t={};return e.font.subsets?.length&&(t.subsets=e.font.subsets),e.font.weight?.length&&(t.weight=e.font.weight),t.variable=e.font.variable,JSON.stringify(t).replace(/"([^"]+)":/g,"$1:").replace(/"/g,"'")}function Zt(e){return fa.has(e)}function ga(e){return Zt(e)?"html":null}function ha(e){return!e.font.selector&&Zt(e.font.variable)}function ya(e,t){let r=wa(e);return Zt(t)?r:`${r}${ba(t.replace(/^--font-/,""))}`}function wa(e){return e.split("_").map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function ba(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function ka(e,t){let r=e.getVariableStatements();for(let o of r)for(let n of o.getDeclarations()){let i=n.getInitializer();if(!i||i.getKind()!==be.CallExpression)continue;let c=i.getArguments();if(c.length===0)continue;let a=c[0].getText();if(a.includes("variable:")&&a.includes(t))return n}return null}function va(e,t){let r=e.getVariableStatements();for(let o of r)for(let n of o.getDeclarations()){let i=n.getInitializer();if(!i||i.getKind()!==be.CallExpression)continue;let s=i;if(s.getExpression().getText()!==t)continue;let c=s.getArguments();if(!c.length)continue;let a=c[0].getText();if(a.includes("variable:")&&a.includes("--font-heading"))return!0}return!1}function Ca(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function Ra(e,t,r,o){let n=e.getDescendantsOfKind(be.JsxOpeningElement);for(let i of n){if(i.getTagNameNode().getText()!=="html")continue;let c=r.map(h=>`"${h}"`),a=t.map(h=>`${h}.variable`),f=[...c,...a],m=i.getAttribute("className");if(!m){pt(e,o),i.addAttribute({name:"className",initializer:`{cn(${f.join(", ")})}`});return}if(m.getKind()!==be.JsxAttribute)return;let p=m.asKindOrThrow(be.JsxAttribute),u=p.getInitializer();if(!u)return;if(u.getKind()===be.StringLiteral){let h=u.getText().slice(1,-1);pt(e,o),p.setInitializer(`{cn("${h}", ${f.join(", ")})}`)}else if(u.getKind()===be.JsxExpression){let h=u.asKindOrThrow(be.JsxExpression),g=h.getExpression();if(!g)return;let y=g.getText();if(y.startsWith("cn(")){let k=a.every($=>y.includes($)),v=r.every($=>y.includes(`"${$}"`)),I=["font-sans","font-serif","font-mono"].filter($=>!r.includes($)).some($=>y.includes(`"${$}"`));if(k&&v&&!I)continue;let x=Sa(y,a);x=Ia(x);let C=Pa(x,f);h.replaceWithText(`{${C}}`)}else if(/^\w+\.variable$/.test(y)){if(a.includes(y)&&r.length===0)continue;pt(e,o);let v=(y.split(".")[0]??"").toLowerCase().includes("heading")||r.length===0;h.replaceWithText(v?`{cn(${y}, ${f.join(", ")})}`:`{cn(${f.join(", ")})}`)}else if(y.startsWith("`")&&y.endsWith("`")){let k=xa(y);pt(e,o);let v=new Set(f),I=new Set(["font-sans","font-serif","font-mono"].map(C=>`"${C}"`)),x=k.filter(C=>!v.has(C)&&!I.has(C));h.replaceWithText(`{cn(${[...x,...f].join(", ")})}`)}else pt(e,o),h.replaceWithText(`{cn(${y}, ${f.join(", ")})}`)}}}function pt(e,t){if(!e.getImportDeclaration(o=>o.getNamedImports().some(i=>i.getName()==="cn"))){let o=e.getImportDeclaration(n=>n.getModuleSpecifierValue().includes("/lib/utils"));o?o.getNamedImports().some(i=>i.getName()==="cn")||o.addNamedImport("cn"):e.addImportDeclaration({moduleSpecifier:t.aliases.utils,namedImports:["cn"]})}}function xa(e){let t=[],r=[],n=e.slice(1,-1).split(/(\$\{[^}]+\})/);for(let i of n)if(i)if(i.startsWith("${")&&i.endsWith("}")){let s=i.slice(2,-1).trim();s&&r.push(s)}else{let s=i.trim().split(/\s+/).filter(Boolean);for(let c of s)t.push(`"${c}"`)}return[...t,...r]}function Sa(e,t){let r=e;for(let o of t)r=r.replace(new RegExp(`,?\\s*${o.replace(".","\\.")}`,"g"),"").replace(/cn\(\s*,/,"cn(");return r}function Ia(e){let t=e;for(let r of["font-sans","font-serif","font-mono"])t=t.replace(new RegExp(`,?\\s*"${r}"`,"g"),"").replace(/cn\(\s*,/,"cn(");return t}function Pa(e,t){let r=t.join(", ");return e.replace(/\)$/,`, ${r})`)}import{z as $a}from"zod";async function pe(e,t,r){r={overwrite:!1,silent:!1,isNewProject:!1,...r};let o=await ze(t);return o&&o.ui&&o.ui.resolvedPaths.cwd!==t.resolvedPaths.cwd?await ja(e,t,o,{...r,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await Ea(e,t,{...r,skipFonts:r.skipFonts})}async function Ea(e,t,r){if(!e.length)return;let o=b("Checking registry.",{silent:r.silent})?.start(),n=await le(e,L(t));if(!n)return o?.fail(),R(new Error("Failed to fetch components from registry."));try{Sn(n.files??[],t.resolvedPaths.cwd)}catch(a){return o?.fail(),R(a)}o?.succeed();let i=await lt(t);r.skipFonts||(n=await ut(n,t));let s=Ne([n]);await D(n.dependencies,n.devDependencies,t,{silent:r.silent}),await Ir(n.tailwind?.config,t,{silent:r.silent,tailwindVersion:i}),await Br(n.envVars,t,{silent:r.silent}),r.skipFonts||await dt(n.fonts,t,{silent:r.silent}),await xr(n.files,t,{overwrite:r.overwrite,silent:r.silent,path:r.path,supportedFontMarkers:s});let c=n.cssVars?r.overwriteCssVars??await xn(e,t):void 0;await mt(n.css,t,{silent:r.silent,cssVars:n.cssVars,cleanupDefaultNextStyles:r.isNewProject,overwriteCssVars:c,tailwindVersion:i,tailwindConfig:n.tailwind?.config}),n.docs&&l.info(n.docs)}async function ja(e,t,r,o){if(!e.length)return;let n=b("Checking registry.",{silent:o.silent})?.start(),i=await le(e,L(t));if(!i)return n?.fail(),R(new Error("Failed to fetch components from registry."));try{Sn(i.files??[],t.resolvedPaths.cwd)}catch(E){return n?.fail(),R(E)}n?.succeed();let s=[],c=[],a=[],f=b("Installing components.")?.start(),m=r.ui,p=await lt(m),u=Sr(t.resolvedPaths.cwd,m.resolvedPaths.ui);i=await ut(i,t);let h=Ne([i]);await D(i.dependencies,i.devDependencies,m,{silent:!0}),i.tailwind?.config&&(await Ir(i.tailwind?.config,m,{silent:!0,tailwindVersion:p}),c.push(ke.relative(u,m.resolvedPaths.tailwindConfig))),i.envVars&&await Br(i.envVars,m,{silent:!0}),await dt(i.fonts,t,{silent:!0});let g=["components","ui","lib","hooks"],y=new Map,k={"registry:ui":"ui","registry:hook":"hooks","registry:lib":"lib"},v=E=>g.includes(E),I=E=>{let se=E?.match(/^@([^/]+)\//);return se&&v(se[1])?se[1]:null},x=E=>I(E.target)??k[E.type||"registry:ui"]??"components",C=E=>E&&r[E]?r[E]:t;for(let E of i.files??[]){let se=x(E);y.has(se)||y.set(se,[]),y.get(se).push(E)}for(let E of Array.from(y.keys())){let se=y.get(E),Be=C(E),gs=(i.files??[]).filter(Ee=>C(x(Ee)).resolvedPaths.cwd===Be.resolvedPaths.cwd),Et=Sr(t.resolvedPaths.cwd,Be.resolvedPaths.ui||Be.resolvedPaths.cwd),vr=await Bo(Et,Be.resolvedPaths.cwd)??Be.resolvedPaths.cwd,Cr=await xr(se,Be,{overwrite:o.overwrite,silent:!0,rootSpinner:f,isRemote:o.isRemote,isWorkspace:!0,path:o.path,plannedFiles:gs,supportedFontMarkers:h});s.push(...Cr.filesCreated.map(Ee=>ke.relative(Et,ke.join(vr,Ee)))),c.push(...Cr.filesUpdated.map(Ee=>ke.relative(Et,ke.join(vr,Ee)))),a.push(...Cr.filesSkipped.map(Ee=>ke.relative(Et,ke.join(vr,Ee))))}let $=i.cssVars?o.overwriteCssVars??await xn(e,t):void 0;await mt(i.css,m,{silent:!0,cssVars:i.cssVars,overwriteCssVars:$,tailwindVersion:p,tailwindConfig:i.tailwind?.config}),(i.cssVars||i.css)&&c.push(ke.relative(u,m.resolvedPaths.tailwindCss)),f?.succeed();let U=Array.from(new Set(s)).sort(),Y=Array.from(new Set(c.filter(E=>!s.includes(E)))).sort(),$e=Array.from(new Set(a)).sort();if(!(U.length||Y.length)&&!$e.length&&b("No files updated.",{silent:o.silent})?.info(),U.length){b(`Created ${U.length} ${U.length===1?"file":"files"}:`,{silent:o.silent})?.succeed();for(let E of U)l.log(` - ${E}`)}if(Y.length){b(`Updated ${Y.length} ${Y.length===1?"file":"files"}:`,{silent:o.silent})?.info();for(let E of Y)l.log(` - ${E}`)}if($e.length){b(`Skipped ${$e.length} ${$e.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:o.silent})?.info();for(let E of $e)l.log(` - ${E}`)}i.docs&&l.info(i.docs)}async function xn(e,t){let r=await ie(e,{config:t});return $a.array(at).parse(r).some(n=>n.type==="registry:theme"||n.type==="registry:style"||n.type==="registry:font"||n.type==="registry:base")}function Sn(e,t){for(let r of e)if(r?.target&&!gn(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}import In from"deepmerge";import Qt from"fs-extra";async function ve(e){let t=Xt.resolve(e.projectPath,"packages/ui"),r=Xt.resolve(e.projectPath,"apps/web"),o=Xt.resolve(t,"components.json"),n=await Qt.readJson(o);e.registryBaseConfig&&(n=In(n,e.registryBaseConfig)),n.tailwind.baseColor="neutral",e.rtl&&(n.rtl=!0),e.menuColor&&(n.menuColor=e.menuColor),e.menuAccent&&(n.menuAccent=e.menuAccent),e.iconLibrary&&(n.iconLibrary=e.iconLibrary),await Qt.writeJson(o,n,{spaces:2});let i=Xt.resolve(r,"components.json"),s=await Qt.readJson(i);e.registryBaseConfig&&(s=In(s,e.registryBaseConfig)),s.tailwind.baseColor="neutral",e.rtl&&(s.rtl=!0),e.menuColor&&(s.menuColor=e.menuColor),e.menuAccent&&(s.menuAccent=e.menuAccent),e.iconLibrary&&(s.iconLibrary=e.iconLibrary),await Qt.writeJson(i,s,{spaces:2});let c=await ae(t,z.parse(n)),{config:a}=await G(e.components,c,{silent:!0});await pe(e.components,a,{overwrite:!0,silent:e.silent,isNewProject:!0,skipFonts:!0});let f=await ae(r,z.parse(s)),m=await le(e.components,L(a));if(m?.fonts?.length){let u={},h=new Set;for(let g of m.fonts){let y=g.name.replace(/^font-heading-/,"").replace("font-",""),k=g.font.dependency??`@fontsource-variable/${y}`;u[g.font.variable]=g.font.family,h.add(k)}await D(Array.from(h),[],c,{silent:!0}),await Kt({theme:u},c,{silent:e.silent,overwriteCssVars:!1,tailwindVersion:"v4"}),await mt(Object.fromEntries(Array.from(h).map(g=>[`@import "${g}"`,{}])),c,{silent:e.silent})}let p=c.iconLibrary;if(p&&p in We){let u=[...We[p].packages];await D(u,[],c,{silent:!0}),await D(u,[],f,{silent:!0})}return f}var $n=X({name:"astro",title:"Astro",defaultProjectName:"astro-app",templateDir:"astro-app",frameworks:["astro"],create:async()=>{},files:[{type:"registry:page",path:"src/pages/index.astro",target:"src/pages/index.astro",content:Pn`---
|
|
43
|
+
`);let c=await aa([{type:"select",name:"flag",message:"How would you like to proceed?",choices:[{title:"Use --force",value:"force"},{title:"Use --legacy-peer-deps",value:"legacy-peer-deps"}]}]);c&&(s=c.flag)}n?.start(),await ma(i,e,t,r.resolvedPaths.cwd,s),n?.succeed()}function ca(e){let t=$e(e.resolvedPaths.cwd,!1);if(!t?.dependencies?.react)return!1;let r=/^(?:\^|~)?19(?:\.\d+)*(?:-.*)?$/.test(t.dependencies.react),o=t.dependencies["react-day-picker"]?.startsWith("8");return r&&o}async function fa(e){return $e(e.resolvedPaths.cwd,!1)?.dependencies?.expo?"expo":ce(e.resolvedPaths.cwd)}async function ma(e,t,r,o,n){if(e==="npm")return pa(t,r,o,n);if(e==="deno")return ua(t,r,o);if(e==="expo")return da(t,r,o);t?.length&&await we(e,["add",...t],{cwd:o}),r?.length&&await we(e,["add","-D",...r],{cwd:o})}async function pa(e,t,r,o){let n=e.map($n),i=t.map($n);n.length&&await we("npm",["install",...o?[`--${o}`]:[],...n],{cwd:r}),i.length&&await we("npm",["install",...o?[`--${o}`]:[],"-D",...i],{cwd:r})}function $n(e){return la.test(e)?`${e}@latest`:e}async function ua(e,t,r){e?.length&&await we("deno",["add",...e.map(o=>`npm:${o}`)],{cwd:r}),t?.length&&await we("deno",["add","-D",...t.map(o=>`npm:${o}`)],{cwd:r})}async function da(e,t,r){e.length&&await we("npx",["expo","install",...e],{cwd:r}),t.length&&await we("npx",["expo","install","-- -D",...t],{cwd:r})}import{existsSync as ga,promises as Mr}from"fs";import Zt from"path";async function Br(e,t,r){if(!e||Object.keys(e).length===0)return{envVarsAdded:[],envFileUpdated:null,envFileCreated:null};r={silent:!1,...r};let o=b("Adding environment variables.",{silent:r.silent})?.start(),n=t.resolvedPaths.cwd,i=Zt.join(n,".env.local"),s=Oo(n);s&&(i=s);let c=ga(i),a=Zt.basename(i),f=Object.entries(e).map(([h,g])=>`${h}=${g}`).join(`
|
|
44
|
+
`),m=[],p=null,u=null;if(c){let h=await Mr.readFile(i,"utf-8"),g=No(h,f);if(m=Ao(h,f),m.length>0){if(await Mr.writeFile(i,g,"utf-8"),p=Zt.relative(n,i),o?.succeed(`Added the following variables to ${d.info(a)}:`),!r.silent)for(let y of m)l.log(` ${d.success("+")} ${y}`)}else o?.stop()}else if(await Mr.writeFile(i,f+`
|
|
45
|
+
`,"utf-8"),u=Zt.relative(n,i),m=Object.keys(e),o?.succeed(`Added the following variables to ${d.info(a)}:`),!r.silent)for(let h of m)l.log(` ${d.success("+")} ${h}`);return!r.silent&&m.length>0&&l.break(),{envVarsAdded:m,envFileUpdated:p,envFileCreated:u}}import{existsSync as ha,promises as jn}from"fs";import ya from"path";import{Project as wa,ScriptKind as ba,SyntaxKind as be,VariableDeclarationKind as ka}from"ts-morph";var va=new Set(["--font-sans","--font-serif","--font-mono"]);async function dt(e,t){if(!e.fonts?.length)return e;let r=await F(t.resolvedPaths.cwd);if(!r)return e;e.cssVars??={},e.cssVars.theme??={};let o=r.framework.name==="next-app"||r.framework.name==="next-pages";for(let n of e.fonts)if(o)e.cssVars.theme[n.font.variable]=`var(${n.font.variable})`;else{let i=n.name.replace("font-",""),s=n.font.dependency??`@fontsource-variable/${i}`;e.dependencies??=[],e.dependencies.push(s),e.css??={},e.css[`@import "${s}"`]={},e.cssVars.theme[n.font.variable]=n.font.family}if(e.fonts.length>0){let n=new Map;for(let i of e.fonts){let s=i.font.selector??Ia(i.font.variable);if(!s)continue;let c=i.font.variable.replace("--","");n.has(s)||n.set(s,[]),n.get(s).push(c)}e.css??={},e.css["@layer base"]??={};for(let[i,s]of Array.from(n.entries())){let c=s.join(" ");e.css["@layer base"][i]??={};let a=Object.keys(e.css["@layer base"][i]).find(f=>f.startsWith("@apply "));a?(delete e.css["@layer base"][i][a],e.css["@layer base"][i][`${a} ${c}`]={}):e.css["@layer base"][i][`@apply ${c}`]={}}}return e}async function gt(e,t,r){if(!e?.length)return;let o=await F(t.resolvedPaths.cwd);if(!o||o.framework.name!=="next-app"&&o.framework.name!=="next-pages")return;let n=b("Updating fonts.",{silent:r.silent})?.start();try{await Ca(e,t,o),n?.succeed("Updating fonts.")}catch(i){throw n?.fail("Failed to update fonts."),i}}async function Ca(e,t,r){let o=await Ra(t,r);if(!o)return;let n=await jn.readFile(o,"utf-8"),i=await xa(n,e,t);i!==n&&await jn.writeFile(o,i,"utf-8")}async function Ra(e,t){let r=e.resolvedPaths.cwd,o=t.isSrcDir,i=t.isTsx?"tsx":"jsx",s=o?[`src/app/layout.${i}`,`app/layout.${i}`]:[`app/layout.${i}`];for(let c of s){let a=ya.join(r,c);if(ha(a))return a}return null}async function xa(e,t,r){let n=new wa({compilerOptions:{}}).createSourceFile("layout.tsx",e,{scriptKind:ba.TSX}),i=t.filter(p=>p.font.provider==="google"),s=[],c=[];for(let p of i){let u=p.font.import;if(!u)continue;let h=n.getImportDeclaration(x=>x.getModuleSpecifierValue()==="next/font/google"),g=!1;h?(g=h.getNamedImports().some(C=>C.getName()===u),g||h.addNamedImport(u)):n.addImportDeclaration({moduleSpecifier:"next/font/google",namedImports:[u]});let y=Ea(u,p.font.variable),k=Sa(p),v=Ta(n,p.font.variable),I=y;if(!(g&&!v&&Xt(p.font.variable)&&!Fa(n,u))){if(v)v.setInitializer(`${u}(${k})`),v.getName()!==y&&v.rename(y),I=y;else{let x=Oa(n);n.insertVariableStatement(x,{declarationKind:ka.Const,declarations:[{name:y,initializer:`${u}(${k})`}]}).appendWhitespace(`
|
|
46
|
+
`)}s.push(I),Pa(p)&&c.push(p.font.variable.replace("--",""))}}let a=new Set(["font-sans","font-serif","font-mono"]),f=[...c].reverse().find(p=>a.has(p)),m=c.filter(p=>!a.has(p));return f&&m.unshift(f),s.length>0&&Aa(n,s,m,r),n.getFullText()}function Sa(e){let t={};return e.font.subsets?.length&&(t.subsets=e.font.subsets),e.font.weight?.length&&(t.weight=e.font.weight),t.variable=e.font.variable,JSON.stringify(t).replace(/"([^"]+)":/g,"$1:").replace(/"/g,"'")}function Xt(e){return va.has(e)}function Ia(e){return Xt(e)?"html":null}function Pa(e){return!e.font.selector&&Xt(e.font.variable)}function Ea(e,t){let r=$a(e);return Xt(t)?r:`${r}${ja(t.replace(/^--font-/,""))}`}function $a(e){return e.split("_").map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function ja(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function Ta(e,t){let r=e.getVariableStatements();for(let o of r)for(let n of o.getDeclarations()){let i=n.getInitializer();if(!i||i.getKind()!==be.CallExpression)continue;let c=i.getArguments();if(c.length===0)continue;let a=c[0].getText();if(a.includes("variable:")&&a.includes(t))return n}return null}function Fa(e,t){let r=e.getVariableStatements();for(let o of r)for(let n of o.getDeclarations()){let i=n.getInitializer();if(!i||i.getKind()!==be.CallExpression)continue;let s=i;if(s.getExpression().getText()!==t)continue;let c=s.getArguments();if(!c.length)continue;let a=c[0].getText();if(a.includes("variable:")&&a.includes("--font-heading"))return!0}return!1}function Oa(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function Aa(e,t,r,o){let n=e.getDescendantsOfKind(be.JsxOpeningElement);for(let i of n){if(i.getTagNameNode().getText()!=="html")continue;let c=r.map(h=>`"${h}"`),a=t.map(h=>`${h}.variable`),f=[...c,...a],m=i.getAttribute("className");if(!m){ut(e,o),i.addAttribute({name:"className",initializer:`{cn(${f.join(", ")})}`});return}if(m.getKind()!==be.JsxAttribute)return;let p=m.asKindOrThrow(be.JsxAttribute),u=p.getInitializer();if(!u)return;if(u.getKind()===be.StringLiteral){let h=u.getText().slice(1,-1);ut(e,o),p.setInitializer(`{cn("${h}", ${f.join(", ")})}`)}else if(u.getKind()===be.JsxExpression){let h=u.asKindOrThrow(be.JsxExpression),g=h.getExpression();if(!g)return;let y=g.getText();if(y.startsWith("cn(")){let k=a.every(E=>y.includes(E)),v=r.every(E=>y.includes(`"${E}"`)),I=["font-sans","font-serif","font-mono"].filter(E=>!r.includes(E)).some(E=>y.includes(`"${E}"`));if(k&&v&&!I)continue;let x=La(y,a);x=_a(x);let C=Va(x,f);h.replaceWithText(`{${C}}`)}else if(/^\w+\.variable$/.test(y)){if(a.includes(y)&&r.length===0)continue;ut(e,o);let v=(y.split(".")[0]??"").toLowerCase().includes("heading")||r.length===0;h.replaceWithText(v?`{cn(${y}, ${f.join(", ")})}`:`{cn(${f.join(", ")})}`)}else if(y.startsWith("`")&&y.endsWith("`")){let k=Na(y);ut(e,o);let v=new Set(f),I=new Set(["font-sans","font-serif","font-mono"].map(C=>`"${C}"`)),x=k.filter(C=>!v.has(C)&&!I.has(C));h.replaceWithText(`{cn(${[...x,...f].join(", ")})}`)}else ut(e,o),h.replaceWithText(`{cn(${y}, ${f.join(", ")})}`)}}}function ut(e,t){if(!e.getImportDeclaration(o=>o.getNamedImports().some(i=>i.getName()==="cn"))){let o=e.getImportDeclaration(n=>n.getModuleSpecifierValue().includes("/lib/utils"));o?o.getNamedImports().some(i=>i.getName()==="cn")||o.addNamedImport("cn"):e.addImportDeclaration({moduleSpecifier:t.aliases.utils,namedImports:["cn"]})}}function Na(e){let t=[],r=[],n=e.slice(1,-1).split(/(\$\{[^}]+\})/);for(let i of n)if(i)if(i.startsWith("${")&&i.endsWith("}")){let s=i.slice(2,-1).trim();s&&r.push(s)}else{let s=i.trim().split(/\s+/).filter(Boolean);for(let c of s)t.push(`"${c}"`)}return[...t,...r]}function La(e,t){let r=e;for(let o of t)r=r.replace(new RegExp(`,?\\s*${o.replace(".","\\.")}`,"g"),"").replace(/cn\(\s*,/,"cn(");return r}function _a(e){let t=e;for(let r of["font-sans","font-serif","font-mono"])t=t.replace(new RegExp(`,?\\s*"${r}"`,"g"),"").replace(/cn\(\s*,/,"cn(");return t}function Va(e,t){let r=t.join(", ");return e.replace(/\)$/,`, ${r})`)}import{z as Da}from"zod";async function pe(e,t,r){r={overwrite:!1,silent:!1,isNewProject:!1,...r};let o=await Je(t);return o&&o.ui&&o.ui.resolvedPaths.cwd!==t.resolvedPaths.cwd?await Ma(e,t,o,{...r,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await Ua(e,t,{...r,skipFonts:r.skipFonts})}async function Ua(e,t,r){if(!e.length)return;let o=b("Checking registry.",{silent:r.silent})?.start(),n=await le(e,L(t));if(!n)return o?.fail(),R(new Error("Failed to fetch components from registry."));try{Fn(n.files??[],t.resolvedPaths.cwd)}catch(a){return o?.fail(),R(a)}o?.succeed();let i=await ct(t);r.skipFonts||(n=await dt(n,t));let s=Ae([n]);await D(n.dependencies,n.devDependencies,t,{silent:r.silent}),await Pr(n.tailwind?.config,t,{silent:r.silent,tailwindVersion:i}),await Br(n.envVars,t,{silent:r.silent}),r.skipFonts||await gt(n.fonts,t,{silent:r.silent}),await Sr(n.files,t,{overwrite:r.overwrite,silent:r.silent,path:r.path,supportedFontMarkers:s});let c=n.cssVars?r.overwriteCssVars??await Tn(e,t):void 0;await pt(n.css,t,{silent:r.silent,cssVars:n.cssVars,cleanupDefaultNextStyles:r.isNewProject,overwriteCssVars:c,tailwindVersion:i,tailwindConfig:n.tailwind?.config}),n.docs&&l.info(n.docs)}async function Ma(e,t,r,o){if(!e.length)return;let n=b("Checking registry.",{silent:o.silent})?.start(),i=await le(e,L(t));if(!i)return n?.fail(),R(new Error("Failed to fetch components from registry."));try{Fn(i.files??[],t.resolvedPaths.cwd)}catch($){return n?.fail(),R($)}n?.succeed();let s=[],c=[],a=[],f=b("Installing components.")?.start(),m=r.ui,p=await ct(m),u=Ir(t.resolvedPaths.cwd,m.resolvedPaths.ui);i=await dt(i,t);let h=Ae([i]);await D(i.dependencies,i.devDependencies,m,{silent:!0}),i.tailwind?.config&&(await Pr(i.tailwind?.config,m,{silent:!0,tailwindVersion:p}),c.push(ke.relative(u,m.resolvedPaths.tailwindConfig))),i.envVars&&await Br(i.envVars,m,{silent:!0}),await gt(i.fonts,t,{silent:!0});let g=["components","ui","lib","hooks"],y=new Map,k={"registry:ui":"ui","registry:hook":"hooks","registry:lib":"lib"},v=$=>g.includes($),I=$=>{let se=$?.match(/^@([^/]+)\//);return se&&v(se[1])?se[1]:null},x=$=>I($.target)??k[$.type||"registry:ui"]??"components",C=$=>$&&r[$]?r[$]:t;for(let $ of i.files??[]){let se=x($);y.has(se)||y.set(se,[]),y.get(se).push($)}for(let $ of Array.from(y.keys())){let se=y.get($),We=C($),Is=(i.files??[]).filter(Ee=>C(x(Ee)).resolvedPaths.cwd===We.resolvedPaths.cwd),jt=Ir(t.resolvedPaths.cwd,We.resolvedPaths.ui||We.resolvedPaths.cwd),Cr=await Ko(jt,We.resolvedPaths.cwd)??We.resolvedPaths.cwd,Rr=await Sr(se,We,{overwrite:o.overwrite,silent:!0,rootSpinner:f,isRemote:o.isRemote,isWorkspace:!0,path:o.path,plannedFiles:Is,supportedFontMarkers:h});s.push(...Rr.filesCreated.map(Ee=>ke.relative(jt,ke.join(Cr,Ee)))),c.push(...Rr.filesUpdated.map(Ee=>ke.relative(jt,ke.join(Cr,Ee)))),a.push(...Rr.filesSkipped.map(Ee=>ke.relative(jt,ke.join(Cr,Ee))))}let E=i.cssVars?o.overwriteCssVars??await Tn(e,t):void 0;await pt(i.css,m,{silent:!0,cssVars:i.cssVars,overwriteCssVars:E,tailwindVersion:p,tailwindConfig:i.tailwind?.config}),(i.cssVars||i.css)&&c.push(ke.relative(u,m.resolvedPaths.tailwindCss)),f?.succeed();let U=Array.from(new Set(s)).sort(),Y=Array.from(new Set(c.filter($=>!s.includes($)))).sort(),Pe=Array.from(new Set(a)).sort();if(!(U.length||Y.length)&&!Pe.length&&b("No files updated.",{silent:o.silent})?.info(),U.length){b(`Created ${U.length} ${U.length===1?"file":"files"}:`,{silent:o.silent})?.succeed();for(let $ of U)l.log(` - ${$}`)}if(Y.length){b(`Updated ${Y.length} ${Y.length===1?"file":"files"}:`,{silent:o.silent})?.info();for(let $ of Y)l.log(` - ${$}`)}if(Pe.length){b(`Skipped ${Pe.length} ${Pe.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:o.silent})?.info();for(let $ of Pe)l.log(` - ${$}`)}i.docs&&l.info(i.docs)}async function Tn(e,t){let r=await ie(e,{config:t});return Da.array(lt).parse(r).some(n=>n.type==="registry:theme"||n.type==="registry:style"||n.type==="registry:font"||n.type==="registry:base")}function Fn(e,t){for(let r of e)if(r?.target&&!Cn(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}import On from"deepmerge";import er from"fs-extra";async function ve(e){let t=Qt.resolve(e.projectPath,"packages/ui"),r=Qt.resolve(e.projectPath,"apps/web"),o=Qt.resolve(t,"components.json"),n=await er.readJson(o);e.registryBaseConfig&&(n=On(n,e.registryBaseConfig)),n.tailwind.baseColor="neutral",e.rtl&&(n.rtl=!0),e.menuColor&&(n.menuColor=e.menuColor),e.menuAccent&&(n.menuAccent=e.menuAccent),e.iconLibrary&&(n.iconLibrary=e.iconLibrary),await er.writeJson(o,n,{spaces:2});let i=Qt.resolve(r,"components.json"),s=await er.readJson(i);e.registryBaseConfig&&(s=On(s,e.registryBaseConfig)),s.tailwind.baseColor="neutral",e.rtl&&(s.rtl=!0),e.menuColor&&(s.menuColor=e.menuColor),e.menuAccent&&(s.menuAccent=e.menuAccent),e.iconLibrary&&(s.iconLibrary=e.iconLibrary),await er.writeJson(i,s,{spaces:2});let c=await ae(t,z.parse(n)),{config:a}=await G(e.components,c,{silent:!0});await pe(e.components,a,{overwrite:!0,silent:e.silent,isNewProject:!0,skipFonts:!0});let f=await ae(r,z.parse(s)),m=await le(e.components,L(a));if(m?.fonts?.length){let u={},h=new Set;for(let g of m.fonts){let y=g.name.replace(/^font-heading-/,"").replace("font-",""),k=g.font.dependency??`@fontsource-variable/${y}`;u[g.font.variable]=g.font.family,h.add(k)}await D(Array.from(h),[],c,{silent:!0}),await Yt({theme:u},c,{silent:e.silent,overwriteCssVars:!1,tailwindVersion:"v4"}),await pt(Object.fromEntries(Array.from(h).map(g=>[`@import "${g}"`,{}])),c,{silent:e.silent})}let p=c.iconLibrary;if(p&&p in ze){let u=[...ze[p].packages];await D(u,[],c,{silent:!0}),await D(u,[],f,{silent:!0})}return f}var Nn=X({name:"astro",title:"Astro",defaultProjectName:"astro-app",templateDir:"astro-app",frameworks:["astro"],create:async()=>{},files:[{type:"registry:page",path:"src/pages/index.astro",target:"src/pages/index.astro",content:An`---
|
|
47
47
|
import Layout from "@/layouts/main.astro"
|
|
48
48
|
import { ComponentExample } from "@/components/component-example"
|
|
49
49
|
---
|
|
@@ -51,7 +51,7 @@ import { ComponentExample } from "@/components/component-example"
|
|
|
51
51
|
<Layout>
|
|
52
52
|
<ComponentExample client:load />
|
|
53
53
|
</Layout>
|
|
54
|
-
`}],monorepo:{templateDir:"astro-monorepo",init:ve,files:[{type:"registry:page",path:"src/pages/index.astro",target:"src/pages/index.astro",content:
|
|
54
|
+
`}],monorepo:{templateDir:"astro-monorepo",init:ve,files:[{type:"registry:page",path:"src/pages/index.astro",target:"src/pages/index.astro",content:An`---
|
|
55
55
|
import "@workspace/ui/globals.css"
|
|
56
56
|
import { ComponentExample } from "@/components/component-example"
|
|
57
57
|
---
|
|
@@ -66,27 +66,27 @@ import { ComponentExample } from "@/components/component-example"
|
|
|
66
66
|
<ComponentExample client:load />
|
|
67
67
|
</body>
|
|
68
68
|
</html>
|
|
69
|
-
`}]}});var
|
|
69
|
+
`}]}});var Ln=X({name:"laravel",title:"Laravel",description:"Requires `laravel new`",defaultProjectName:"laravel-app",templateDir:"laravel-app",frameworks:["laravel"],scaffold:async()=>{l.break(),l.log(` Please create a new app with ${d.info("laravel new --react")} first then run ${d.info("love-ui init")}.`),l.log(` See ${d.info(`${S}/docs/installation/laravel`)} for more information.`),l.break(),process.exit(0)},create:async()=>{}});import tr from"path";import _n from"dedent";import Vn from"deepmerge";import rr from"fs-extra";var Dn=X({name:"next",title:"Next.js",defaultProjectName:"next-app",templateDir:"next-app",frameworks:["next-app","next-pages"],create:async()=>{},files:[{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:_n`import { ComponentExample } from "@/components/component-example";
|
|
70
70
|
|
|
71
71
|
export default function Page() {
|
|
72
72
|
return <ComponentExample />;
|
|
73
73
|
}
|
|
74
|
-
`}],monorepo:{templateDir:"next-monorepo",init:async e=>{let t=
|
|
74
|
+
`}],monorepo:{templateDir:"next-monorepo",init:async e=>{let t=tr.resolve(e.projectPath,"packages/ui"),r=tr.resolve(e.projectPath,"apps/web"),o=tr.resolve(t,"components.json"),n=await rr.readJson(o);e.registryBaseConfig&&(n=Vn(n,e.registryBaseConfig)),n.tailwind.baseColor="neutral",e.rtl&&(n.rtl=!0),await rr.writeJson(o,n,{spaces:2});let i=tr.resolve(r,"components.json"),s=await rr.readJson(i);e.registryBaseConfig&&(s=Vn(s,e.registryBaseConfig)),s.tailwind.baseColor="neutral",e.rtl&&(s.rtl=!0),await rr.writeJson(i,s,{spaces:2});let c=await ae(t,z.parse(n)),{config:a}=await G(e.components,c,{silent:!0});await pe(e.components,a,{overwrite:!0,silent:e.silent,isNewProject:!0,skipFonts:!0});let f=await ae(r,z.parse(s)),m=await le(e.components,L(a));if(m?.fonts?.length){let u={};for(let h of m.fonts)u[h.font.variable]=`var(${h.font.variable})`;await Yt({theme:u},c,{silent:e.silent,overwriteCssVars:!1,tailwindVersion:"v4"}),await gt(m.fonts,f,{silent:e.silent})}let p=c.iconLibrary;if(p&&p in ze){let u=[...ze[p].packages];await D(u,[],c,{silent:!0}),await D(u,[],f,{silent:!0})}return f},files:[{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:_n`import { ComponentExample } from "@/components/component-example";
|
|
75
75
|
|
|
76
76
|
export default function Page() {
|
|
77
77
|
return <ComponentExample />;
|
|
78
78
|
}
|
|
79
|
-
`}]}});import
|
|
79
|
+
`}]}});import Un from"dedent";var Mn=X({name:"react-router",title:"React Router",defaultProjectName:"react-router-app",templateDir:"react-router-app",frameworks:["react-router"],create:async()=>{},files:[{type:"registry:file",path:"app/routes/home.tsx",target:"app/routes/home.tsx",content:Un`import { ComponentExample } from "@/components/component-example";
|
|
80
80
|
|
|
81
81
|
export default function Home() {
|
|
82
82
|
return <ComponentExample />;
|
|
83
83
|
}
|
|
84
|
-
`}],monorepo:{templateDir:"react-router-monorepo",init:ve,files:[{type:"registry:file",path:"app/routes/home.tsx",target:"app/routes/home.tsx",content:
|
|
84
|
+
`}],monorepo:{templateDir:"react-router-monorepo",init:ve,files:[{type:"registry:file",path:"app/routes/home.tsx",target:"app/routes/home.tsx",content:Un`import { ComponentExample } from "@/components/component-example";
|
|
85
85
|
|
|
86
86
|
export default function Home() {
|
|
87
87
|
return <ComponentExample />;
|
|
88
88
|
}
|
|
89
|
-
`}]}});import
|
|
89
|
+
`}]}});import Bn from"dedent";var Wn=X({name:"start",title:"TanStack Start",defaultProjectName:"start-app",templateDir:"start-app",frameworks:["tanstack-start"],create:async()=>{},files:[{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:Bn`import { createFileRoute } from "@tanstack/react-router";
|
|
90
90
|
import { ComponentExample } from "@/components/component-example";
|
|
91
91
|
|
|
92
92
|
export const Route = createFileRoute("/")({ component: App });
|
|
@@ -96,7 +96,7 @@ function App() {
|
|
|
96
96
|
<ComponentExample />
|
|
97
97
|
);
|
|
98
98
|
}
|
|
99
|
-
`}],monorepo:{templateDir:"start-monorepo",init:ve,files:[{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:
|
|
99
|
+
`}],monorepo:{templateDir:"start-monorepo",init:ve,files:[{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:Bn`import { createFileRoute } from "@tanstack/react-router";
|
|
100
100
|
import { ComponentExample } from "@/components/component-example";
|
|
101
101
|
|
|
102
102
|
export const Route = createFileRoute("/")({ component: App });
|
|
@@ -106,66 +106,66 @@ function App() {
|
|
|
106
106
|
<ComponentExample />
|
|
107
107
|
);
|
|
108
108
|
}
|
|
109
|
-
`}]}});import
|
|
109
|
+
`}]}});import zn from"dedent";var Jn=X({name:"vite",title:"Vite",defaultProjectName:"vite-app",templateDir:"vite-app",frameworks:["vite"],create:async()=>{},files:[{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:zn`import { ComponentExample } from "@/components/component-example";
|
|
110
110
|
|
|
111
111
|
export function App() {
|
|
112
112
|
return <ComponentExample />;
|
|
113
113
|
}
|
|
114
114
|
|
|
115
115
|
export default App;
|
|
116
|
-
`}],monorepo:{templateDir:"vite-monorepo",init:ve,files:[{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:
|
|
116
|
+
`}],monorepo:{templateDir:"vite-monorepo",init:ve,files:[{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:zn`import { ComponentExample } from "@/components/component-example";
|
|
117
117
|
|
|
118
118
|
export function App() {
|
|
119
119
|
return <ComponentExample />;
|
|
120
120
|
}
|
|
121
121
|
|
|
122
122
|
export default App;
|
|
123
|
-
`}]}});var Q={next:
|
|
124
|
-
Would you like to start a new project?`,choices:Object.entries(Q).map(([m,p])=>({title:p.title,value:m,description:p.description})),initial:0},{type:e.name?null:"text",name:"name",message:"What is your project named?",initial:o,format:m=>m.trim(),validate:m=>m.length>128?"Name should be less than 128 characters.":!0}]);t=a??t,o=f??o}let i=
|
|
125
|
-
You may now add components.`),process.removeListener("exit",n),
|
|
126
|
-
`,"utf8"),g.succeed();let I=await ae(e.cwd,p),x=await
|
|
127
|
-
Before you can add components, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),l.error(`Learn more at ${d.info(`${S}/docs/components-json`)}.`),l.break(),process.exit(1)}}import{existsSync as Jr,promises as
|
|
128
|
-
`)}function
|
|
129
|
-
`),s=>K(`+${s}`));else{let s=
|
|
130
|
-
`)}function
|
|
131
|
-
`)}function
|
|
132
|
-
`);r.push(`${w("\u251C")} ${H(s.path)} ${w("(")}${
|
|
133
|
-
`)}function
|
|
134
|
-
`),r=>K(`+${r}`));else{let r=
|
|
135
|
-
`);o.push(`${w("\u251C")} ${H(s.path)} ${w("(")}${
|
|
136
|
-
`);o.push(`${w("\u251C")} ${H(e.css.path)} ${w("(")}${
|
|
137
|
-
`)}function
|
|
123
|
+
`}]}});var Q={next:Dn,vite:Jn,start:Wn,"react-router":Mn,astro:Nn,laravel:Ln};function Qe(e){if(e){for(let[t,r]of Object.entries(Q))if(r.frameworks.includes(e))return t}}function Hn(e,t){let r=t?.lib??or(e,"lib");return{ui:t?.ui??or(e,"ui"),lib:r,hooks:t?.hooks??or(e,"hooks"),utils:t?.utils??or(e,"utils",r)}}function or(e,t,r){let o=e||Wt;if(t==="ui")return`${o}/ui`;if(t==="utils"){let n=r||Gn(o,"lib");return n?`${n}/utils`:Wo}return Gn(o,t)}function Gn(e,t){return e==="components"?t:e.endsWith("/components")?`${e.slice(0,-11)}/${t}`:e.endsWith("components")&&!e.includes("/")?`${e.slice(0,-10)}${t}`:""}import Kn from"path";import Wr from"fs-extra";import Ba from"prompts";async function nr(e){let t=e.template&&e.template in Q?e.template:"next",r=Oe(Q[t],{monorepo:e.monorepo}),o=e.name??r.defaultProjectName,n=e.components?.length===1&&!!e.components[0].match(/\/chat\/b\//);if(n&&(t="next"),!e.force){let{type:a,name:f}=await Ba([{type:e.template||n?null:"select",name:"type",message:`The path ${d.info(e.cwd)} does not contain a package.json file.
|
|
124
|
+
Would you like to start a new project?`,choices:Object.entries(Q).map(([m,p])=>({title:p.title,value:m,description:p.description})),initial:0},{type:e.name?null:"text",name:"name",message:"What is your project named?",initial:o,format:m=>m.trim(),validate:m=>m.length>128?"Name should be less than 128 characters.":!0}]);t=a??t,o=f??o}let i=Oe(Q[t],{monorepo:e.monorepo}),s=await ce(e.cwd,{withFallback:!0}),c=Kn.join(e.cwd,o);try{await Wr.access(e.cwd,Wr.constants.W_OK)}catch{l.break(),l.error(`The path ${d.info(e.cwd)} is not writable.`),l.error(`It is likely you do not have write permissions for this folder or the path ${d.info(e.cwd)} does not exist.`),l.break(),process.exit(1)}return Wr.existsSync(Kn.resolve(e.cwd,o,"package.json"))&&(l.break(),l.error(`A project with the name ${d.info(o)} already exists.`),l.error("Please choose a different name and try again."),l.break(),process.exit(1)),await i.scaffold({projectPath:c,packageManager:s,cwd:e.cwd}),{projectPath:c,projectName:o,template:t}}import{existsSync as Wa}from"fs";import{join as za}from"path";async function ee(e=process.cwd()){try{let{config:t}=await import("@dotenvx/dotenvx"),r=[".env.local",".env.development.local",".env.development",".env"];for(let o of r){let n=za(e,o);Wa(n)&&t({path:n,overload:!1,quiet:!0})}}catch(t){l.warn("Failed to load env files:",t)}}import Le from"fs-extra";var rt=".bak",et=class extends Error{filePath;constructor(t){super(`Could not back up ${t}.`),this.name="FileBackupError",this.filePath=t}};function ht(e){if(!Le.existsSync(e))return null;let t=`${e}${rt}`;try{return Le.renameSync(e,t),t}catch{return null}}function tt(e){let t=`${e}${rt}`;if(!Le.existsSync(t))return!1;try{return Le.renameSync(t,e),!0}catch(r){return console.error(`Warning: Could not restore backup file ${t}: ${r}`),!1}}function yt(e){let t=`${e}${rt}`;if(!Le.existsSync(t))return!1;try{return Le.unlinkSync(t),!0}catch{return!1}}async function Yn(e,t){if(!Le.existsSync(e))return t();if(!ht(e))throw new et(e);let o=()=>tt(e);process.on("exit",o);try{let n=await t();return process.removeListener("exit",o),yt(e),n}catch(n){throw process.removeListener("exit",o),tt(e),n}}import{Command as Ga}from"commander";import Ha from"deepmerge";import de from"fs-extra";import _e from"prompts";import{z as T}from"zod";var Ka=T.object({cwd:T.string(),name:T.string().optional(),preset:T.union([T.boolean(),T.string()]).optional(),components:T.array(T.string()).optional(),yes:T.boolean(),defaults:T.boolean(),force:T.boolean(),reinstall:T.boolean().optional(),silent:T.boolean(),isNewProject:T.boolean().default(!1),cssVariables:T.boolean().default(!0),rtl:T.boolean().optional(),pointer:T.boolean().optional(),base:T.enum(["base"]).optional(),template:T.string().optional(),monorepo:T.boolean().optional(),existingConfig:T.record(T.unknown()).optional(),installStyleIndex:T.boolean().default(!0),registryBaseConfig:z.deepPartial().optional(),menuColor:T.enum(["default","inverted","default-translucent","inverted-translucent"]).optional(),menuAccent:T.enum(["subtle","bold"]).optional(),iconLibrary:T.string().optional()});function Ya(e,t){return t.rtl?e.searchParams.set("rtl","true"):t.rtl===!1&&e.searchParams.delete("rtl"),t.pointer?e.searchParams.set("pointer","true"):t.pointer===!1&&e.searchParams.delete("pointer"),e}var qn=new Ga().name("init").alias("create").description("initialize your project and install dependencies").argument("[components...]","names, url or local path to component").option("-t, --template <template>","the template to use. (next, start, vite, react-router, laravel, astro)").option("-b, --base <base>","the component library to use. (base)").option("--monorepo","scaffold a monorepo project.").option("--no-monorepo","skip the monorepo prompt.").option("-p, --preset [name]","use a preset configuration").option("-y, --yes","skip confirmation prompt.",!0).option("-d, --defaults","use default configuration: --template=next --preset=base-nova",!1).option("-f, --force","force overwrite of existing configuration.",!1).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-n, --name <name>","the name for the new project.").option("-s, --silent","mute output.",!1).option("--css-variables","use css variables for theming.",!0).option("--no-css-variables","do not use css variables for theming.").option("--rtl","enable RTL support.").option("--no-rtl","disable RTL support.").option("--pointer","enable pointer cursor for buttons.").option("--no-pointer","disable pointer cursor for buttons.").option("--reinstall","re-install existing UI components.").option("--no-reinstall","do not re-install existing UI components.").action(async(e,t)=>{let r,o=[],n=()=>{r&&tt(r.replace(rt,""))};process.on("exit",n);try{let i=Ka.parse({...t,reinstall:t.reinstall,cwd:ue.resolve(t.cwd)}),s=new Map(Object.entries(Z)),c;if(i.defaults&&(i.template=i.template||"next",i.base=i.base||"base",i.reinstall=i.reinstall??!1),i.template&&!(i.template in Q)&&(l.error(`Invalid template: ${d.info(i.template)}. Available templates: ${Object.keys(Q).map(u=>d.info(u)).join(", ")}.`),l.break(),process.exit(1)),typeof i.preset=="string"&&!q(i.preset)&&!qe(i.preset)){let u=Array.from(s.keys());s.has(i.preset)||(l.error(`Invalid preset: ${d.info(i.preset)}. Available presets: ${u.join(", ")}`),l.break(),process.exit(1))}let a=i.cwd,f=de.existsSync(ue.resolve(a,"components.json"));if(!i.monorepo&&!f&&await M(a)){let u=await F(a);if(!u||u.framework.name==="manual"){let h=await B(a);h.length>0&&(W("init",h),process.exit(1))}}if(f&&!i.force){let{overwrite:u}=await _e({type:"confirm",name:"overwrite",message:`A ${d.info("components.json")} file already exists. Would you like to overwrite it?`,initial:!1});u||(l.info(` To start over, remove the ${d.info("components.json")} file and run ${d.info("init")} again.`),l.break(),process.exit(1)),i.force=!0}let m;if(f){try{m=await de.readJson(ue.resolve(a,"components.json"))}catch{}m&&(i.existingConfig=m);let u=i.reinstall;if(u===void 0){let{reinstall:h}=await _e({type:"confirm",name:"reinstall",message:"Would you like to re-install existing UI components?",initial:!1});u=h}if(u&&(o=await Ke(a),o.length)){l.break(),l.log(" The following components will be re-installed and overwritten:");for(let h=0;h<o.length;h+=8)l.log(` - ${o.slice(h,h+8).join(", ")}`);l.break()}}if(i.preset===void 0&&e.length===0&&!i.defaults){let u=de.existsSync(ue.resolve(a,"package.json"));if(!i.template&&!u){let{template:h}=await _e({type:"select",name:"template",message:"Select a template",choices:Object.entries(Q).map(([g,y])=>({title:y.title,value:g,description:y.description,disabled:i.monorepo&&g==="laravel"}))});h||process.exit(1),i.template=h}if(!i.template&&u){let h=await F(a),g=Qe(h?.framework.name);g&&(i.template=g)}if(i.template==="laravel"&&!u&&(l.break(),l.log(` Please create a new app with ${d.info("laravel new --react")} first then run ${d.info("love-ui init")}.`),l.log(` See ${d.info(`${S}/docs/installation/laravel`)} for more information.`),l.break(),process.exit(0)),i.monorepo===void 0&&!u&&i.template&&Q[i.template]?.monorepo){let{monorepo:h}=await _e({type:"confirm",name:"monorepo",message:"Would you like to set up a monorepo?",initial:!1});i.monorepo=h}i.base||(i.base=await Ze()),i.preset=!0}if(i.preset!==void 0){let u=i.preset===!0?!0:i.preset;if(u===!0){let h=await ft({rtl:i.rtl??!1,template:i.template,base:i.base,pointer:i.pointer});e=[h.url,...e],c=h.base}if(typeof u=="string"){let h;if(q(u)){let g=new URL(u);Ya(g,i),g.pathname==="/init"&&u.startsWith(S)&&g.searchParams.set("track","1"),h=g.toString(),c=g.searchParams.get("base")??void 0}else if(qe(u)){let g=Ye(u);g||(l.error(`Invalid preset code: ${d.info(u)}`),l.break(),process.exit(1)),h=he({...g,base:"base",rtl:i.rtl??!1},{template:i.template,preset:u,pointer:i.pointer}),c=void 0}else{let g=s.get(u);if(!g)throw new Error(`Unknown preset: ${u}`);h=he({...g,base:"base",rtl:i.rtl??g.rtl},{template:i.template,pointer:i.pointer}),c=void 0}e=[h,...e]}}let p=i.base??c??(m?.style?"base":"");if(!p)if(e.length>0)p="base";else{let u=await Ze();p=u,i.base=u}if(i.defaults&&!e.some(q)&&(e=[he({...Z.nova,base:p,rtl:i.rtl??!1},{template:i.template,pointer:i.pointer}),...e]),e.length>0&&q(e[0])){let u=new URL(e[0]);u.searchParams.set("base",p),e[0]=u.toString()}if(m?.style){let u=await Xa(m.style,p);if(u!==p&&(p=u,e.length>0&&q(e[0]))){let h=new URL(e[0]);h.searchParams.set("base",u),e[0]=h.toString()}}if(o.length&&(e=[...e,...o]),i.components=e,await ee(i.cwd),e.length>0){let u=ue.resolve(a,"components.json");f&&(r=ht(u)??void 0,r||l.warn(`Could not back up ${d.info("components.json")}.`));let{registryBaseConfig:h,installStyleIndex:g,url:y}=await Te(e[0],a,{registries:m?.registries});e[0]=y,g||(i.installStyleIndex=!1),h&&(i.registryBaseConfig=h)}await ot(i),l.break(),l.log(`Project initialization completed.
|
|
125
|
+
You may now add components.`),process.removeListener("exit",n),yt(ue.resolve(a,"components.json")),l.break()}catch(i){process.removeListener("exit",n),n(),l.break(),R(i)}finally{ne()}});async function ot(e){let t,r,o,n=e.template,i=n?Oe(Q[n],{monorepo:e.monorepo}):void 0;if(e.monorepo&&i?.init&&de.existsSync(ue.resolve(e.cwd,"package.json")))t=await F(e.cwd);else if(e.skipPreflight)t=await F(e.cwd);else{let C=await pn(e);if(C.errors["1"]){let{projectPath:E,template:U}=await nr(e);E||process.exit(1),e.cwd=E,e.isNewProject=!0,o=U,t=await F(e.cwd)}else t=C.projectInfo}r=await on(e.cwd,t);let c=o??n,a=c?Oe(Q[c],{monorepo:e.monorepo}):void 0,f=[...e.installStyleIndex?["index"]:[],...e.components??[],...a?["button"]:[]],m=o?a?.postInit:void 0;if(a?.init){let C=await a.init({projectPath:e.cwd,components:f,registryBaseConfig:e.registryBaseConfig,rtl:e.rtl??!1,menuColor:e.menuColor,menuAccent:e.menuAccent,iconLibrary:e.iconLibrary,silent:e.silent});return m&&await m({projectPath:e.cwd}),C}let p=r?await Za(r,e):await qa(await j(e.cwd));if(!e.yes){let{proceed:C}=await _e({type:"confirm",name:"proceed",message:`Write configuration to ${d.info("components.json")}. Proceed?`,initial:!0});C||process.exit(1)}let u=await ae(e.cwd,p),{config:h}=await G(f,u,{silent:!0});h.registries&&(p.registries=h.registries);let g=b("Writing components.json.").start(),y=ue.resolve(e.cwd,"components.json"),k=`${y}${rt}`,v=(C,E)=>{let{registries:U,...Y}=Ha(C,E);return{...Y,registries:U}};if(de.existsSync(k)){let C=await de.readJson(k);e.force?C.registries&&(p.registries={...C.registries,...p.registries||{}}):p=v(C,p)}e.registryBaseConfig&&(p=v(p,e.registryBaseConfig)),e.rtl!==void 0&&(p.rtl=e.rtl),p.registries=Object.fromEntries(Object.entries(p.registries||{}).filter(([C])=>!Object.keys(re).includes(C))),await Ja.writeFile(y,`${JSON.stringify(p,null,2)}
|
|
126
|
+
`,"utf8"),g.succeed();let I=await ae(e.cwd,p),x=await Je(I);if(x){let C={};if(p.menuColor&&(C.menuColor=p.menuColor),p.menuAccent&&(C.menuAccent=p.menuAccent),p.rtl!==void 0&&(C.rtl=p.rtl),p.iconLibrary&&(C.iconLibrary=p.iconLibrary),Object.keys(C).length>0)for(let E of Object.keys(x)){let U=x[E];if(U.resolvedPaths.cwd===I.resolvedPaths.cwd)continue;let Y=ue.resolve(U.resolvedPaths.cwd,"components.json");if(de.existsSync(Y)){let Pe=await de.readJson(Y);await de.writeJson(Y,{...Pe,...C},{spaces:2})}}}return Ho.clearCaches(),await pe(f,I,{overwrite:!0,overwriteCssVars:e.reinstall||void 0,silent:e.silent,isNewProject:e.isNewProject||t?.framework.name==="next-app"}),m&&await m({projectPath:e.cwd}),I}async function qa(e=null){let[t,r]=await Promise.all([Er(),Qo()]);l.info("");let o=await _e([{type:"toggle",name:"typescript",message:`Would you like to use ${d.info("TypeScript")} (recommended)?`,initial:e?.tsx??!0,active:"yes",inactive:"no"},{type:"select",name:"style",message:`Which ${d.info("style")} would you like to use?`,choices:t.map(s=>({title:s.label,value:s.name}))},{type:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${d.info("base color")}?`,choices:r.map(s=>({title:s.label,value:s.name}))},{type:"text",name:"tailwindCss",message:`Where is your ${d.info("global CSS")} file?`,initial:e?.tailwind.css??zo},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${d.info("CSS variables")} for theming?`,initial:e?.tailwind.cssVariables??!0,active:"yes",inactive:"no"},{type:"text",name:"tailwindPrefix",message:`Are you using a custom ${d.info("tailwind prefix eg. tw-")}? (Leave blank if not)`,initial:""},{type:"text",name:"tailwindConfig",message:`Where is your ${d.info("tailwind.config.js")} located?`,initial:e?.tailwind.config??Jo},{type:"text",name:"components",message:`Configure the import alias for ${d.info("components")}:`,initial:e?.aliases.components??Wt},{type:"toggle",name:"rsc",message:`Are you using ${d.info("React Server Components")}?`,initial:e?.rsc??!0,active:"yes",inactive:"no"}]);o.style||process.exit(1);let n=e&&e.aliases.components===o.components?e.aliases:void 0,i=Hn(o.components,n);return z.parse({$schema:"https://www.loveui.dev/schema.json",style:o.style,tailwind:{config:o.tailwindConfig,css:o.tailwindCss,baseColor:o.tailwindBaseColor,cssVariables:o.tailwindCssVariables,prefix:o.tailwindPrefix},rsc:o.rsc,tsx:o.typescript,aliases:{components:o.components,ui:i.ui,lib:i.lib,hooks:i.hooks,utils:i.utils}})}async function Za(e,t){let r=typeof t.registryBaseConfig?.style=="string"?t.registryBaseConfig.style:e.style,o=typeof t.registryBaseConfig?.tailwind?.baseColor=="string"?t.registryBaseConfig.tailwind.baseColor:"neutral",n=e.tailwind.cssVariables,i=Go;if(!t.defaults&&!t.registryBaseConfig?.style){let[s,c]=await Promise.all([Er(),ct(e)]);r=(await _e([{type:c==="v4"||r?null:"select",name:"style",message:`Which ${d.info("style")} would you like to use?`,choices:s.map(f=>({title:f.name==="new-york"?"New York (Recommended)":f.label,value:f.name})),initial:0}])).style??r??"new-york"}return n=t.cssVariables,z.parse({$schema:e?.$schema,style:r,tailwind:{...e?.tailwind,baseColor:o,cssVariables:n},rsc:e?.rsc,tsx:e?.tsx,iconLibrary:i,rtl:t.rtl??e?.rtl??!1,aliases:e?.aliases})}async function Xa(e,t){return e.startsWith("base-")?t:(l.warn(` Existing config uses ${d.info(e)}. Love UI now uses ${d.info("Base UI")} presets only.`),l.break(),"base")}import Zn from"path";import zr from"fs-extra";async function Xn(e){let t={};if(!zr.existsSync(e.cwd)||!zr.existsSync(Zn.resolve(e.cwd,"package.json")))return t["1"]=!0,{errors:t,config:null};if(!zr.existsSync(Zn.resolve(e.cwd,"components.json"))){if(await M(e.cwd)){let r=await B(e.cwd);r.length>0&&(W("add [component]",r),process.exit(1))}return t["3"]=!0,{errors:t,config:null}}try{let r=await j(e.cwd);return{errors:t,config:r}}catch{l.break(),l.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e.cwd)}.
|
|
127
|
+
Before you can add components, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),l.error(`Learn more at ${d.info(`${S}/docs/components-json`)}.`),l.break(),process.exit(1)}}import{existsSync as Jr,promises as Qn}from"fs";import ir from"path";import{Project as Qa}from"ts-morph";import{loadConfig as el}from"tsconfig-paths";async function ei(e,t,r={}){let o={files:[],dependencies:[],devDependencies:[],css:null,envVars:null,fonts:[],docs:null};if(!e.length)return o;let n=await le(e,L(t));if(!n)throw new Error("Failed to fetch components from registry.");r.skipFonts||(n=await dt(n,t));let i=Ae([n]);return o.dependencies=Array.from(new Set(n.dependencies??[])),o.devDependencies=Array.from(new Set(n.devDependencies??[])),o.docs=n.docs??null,await tl(n,t,o,r,i),await rl(n,t,o,r),ol(n,t,o),r.skipFonts||nl(n,o),o}async function tl(e,t,r,o,n){let i=e.files;if(!i?.length)return;let[s,c]=await Promise.all([F(t.resolvedPaths.cwd),t.tailwind.baseColor?Jt(t.tailwind.baseColor):Promise.resolve(void 0)]),a;try{a=el(t.resolvedPaths.cwd)}catch{a={resultType:"failed"}}let f=new Qa({compilerOptions:{}}),m=Uo(i,t,{isSrcDir:s?.isSrcDir,framework:s?.framework.name});for(let p=0;p<i.length;p++){let u=i[p];if(!u.content)continue;let h=Vo(u,t,{isSrcDir:s?.isSrcDir,framework:s?.framework.name,commonRoot:Do(i.map(E=>E.path),u.path),fileIndex:p});if(!h)continue;t.tsx||(h=h.replace(/\.tsx?$/,E=>E===".tsx"?".jsx":".js"));let g=Jr(h),y=ir.relative(t.resolvedPaths.cwd,h),k=u.type==="registry:file"||u.type==="registry:item",v=xr(h)||k?u.content:await Ut({filename:u.path,raw:u.content,config:t,baseColor:c,transformJsx:!t.tsx,isRemote:!1,supportedFontMarkers:n},[Nt,Lt,Ot,Dt,At,Bt,_o,Vt,Mt,_t]),I=xr(h)||k?v:await Mo({config:t,content:v,filePaths:m,project:f,projectInfo:s,resolvedPath:h,tsConfig:a}),x="create",C;g&&(C=await Qn.readFile(h,"utf-8"),Fo(C,I)?x="skip":x="overwrite"),r.files.push({path:y,action:x,content:I,...x==="overwrite"&&{existingContent:C},type:u.type??"registry:ui"})}}async function rl(e,t,r,o){let n=e.css&&Object.keys(e.css).length>0,i=Object.keys(e.cssVars??{}).length>0;if(!t.resolvedPaths.tailwindCss||!n&&!i)return;let s=t.resolvedPaths.tailwindCss,c=Jr(s),a=ir.relative(t.resolvedPaths.cwd,s),f=c?await Qn.readFile(s,"utf8"):"",m=f;i&&(m=await mt(m,e.cssVars,t,{overwriteCssVars:o.overwriteCssVars})),n&&(m=await Ur(m,e.css));let p=0;if(e.cssVars)for(let u of Object.values(e.cssVars))u&&(p+=Object.keys(u).length);r.css={path:a,content:m,...c&&{existingContent:f},action:c?"update":"create",cssVarsCount:p}}function ol(e,t,r){if(!e.envVars||Object.keys(e.envVars).length===0)return;let o=ir.join(t.resolvedPaths.cwd,".env.local"),n=Jr(o),i=ir.relative(t.resolvedPaths.cwd,o);r.envVars={path:i,variables:e.envVars,action:n?"update":"create"}}function nl(e,t){if(e.fonts?.length)for(let r of e.fonts)t.fonts.push({name:r.font.family,provider:r.font.provider==="google"?"Google Fonts":r.font.provider})}import{diffWords as il,structuredPatch as sl}from"diff";import{bold as H,cyan as Gr,dim as w,green as K,red as Hr,yellow as nt}from"kleur/colors";var Ce=5,al=w("\u250C"+"\u2500".repeat(46)),ll=w("\u2514"+"\u2500".repeat(46)),cl={create:"+",overwrite:"~",skip:"="},fl={create:"create",overwrite:"overwrite",skip:"skip (identical)"};function wt(e){return e==="create"?K(e):e==="overwrite"||e==="update"?nt(e):w(e)}function bt(e){return`${H("\u250C")} ${H(`love-ui add ${e.join(", ")}`)} ${w("(dry run)")}`}function oi(e,t){return e===t||e.includes(t)||e.endsWith(t)}function Ve(e,t,r=o=>o){e.push(`${w("\u2502")} ${al}`);for(let o of t)e.push(`${w("\u2502")} ${w("\u2502")} ${r(o)}`);e.push(`${w("\u2502")} ${ll}`)}function ni(e,t,r={}){return r.diff?typeof r.diff=="string"?pl(e,t,r.diff):ul(e,t):r.view?typeof r.view=="string"?gl(e,t,r.view):dl(e,t):ml(e,t)}function ml(e,t){let r=[];r.push(bt(t)),r.push(w("\u2502")),hl(e,r),ti("Dependencies",e.dependencies,r),ti("Dev Dependencies",e.devDependencies,r),yl(e,r),wl(e,r),bl(e,r);let o=e.files.filter(i=>i.action==="overwrite").length;o>0&&(r.push(nt(`\u26A0 ${o} ${o===1?"file":"files"} will be overwritten.`)),r.push(w("\u2502")));let n=[];return e.files.length>0&&n.push(`${e.files.length} ${e.files.length===1?"file":"files"}`),e.dependencies.length>0&&n.push(`${e.dependencies.length} ${e.dependencies.length===1?"dep":"deps"}`),e.css?.cssVarsCount&&n.push(`${e.css.cssVarsCount} CSS vars`),n.length>0&&(r.push(`${w("\u2502")} ${w(n.join(", "))}`),r.push(w("\u2502"))),r.push(`${w("\u2502")} ${w("Run with --diff to view changes.")}`),r.push(`${w("\u2502")} ${w("Run with --view to view file contents.")}`),r.push(`${w("\u2514")} ${w("Run without --dry-run to apply.")}`),r.join(`
|
|
128
|
+
`)}function pl(e,t,r){let o=[];o.push(bt(t)),o.push(w("\u2502"));let n=si(e.files,r),i=e.css&&oi(e.css.path,r);if(n.length===0&&!i)o.push(`${w("\u2502")} ${nt(`No file matching "${r}" found.`)}`),o.push(w("\u2502"));else{for(let s of n)ii(s,o);if(i&&e.css){if(o.push(`${w("\u251C")} ${H(e.css.path)} ${w("(")}${wt(e.css.action)}${w(")")}`),e.css.action==="create"||!e.css.existingContent)Ve(o,e.css.content.split(`
|
|
129
|
+
`),s=>K(`+${s}`));else{let s=ai(e.css.existingContent,e.css.content,e.css.path,{fullContext:!0});Ve(o,s)}o.push(w("\u2502"))}}return o.push(`${w("\u2514")} ${w("Run without --dry-run to apply.")}`),o.join(`
|
|
130
|
+
`)}function ul(e,t){let r=[];r.push(bt(t)),r.push(w("\u2502"));let o=e.files.slice(0,Ce);if(o.length===0&&!e.css)r.push(`${w("\u2502")} ${w("No changes.")}`),r.push(w("\u2502"));else{for(let s of o)ii(s,r);e.files.length>Ce&&r.push(w("\u2502"))}let n=e.files.length;return n>Ce&&r.push(` ${w(`Showing ${Ce} of ${n} files. Use --diff <path> to view a specific file.`)}`),r.push(`${w("\u2514")} ${w("Run without --dry-run to apply.")}`),r.join(`
|
|
131
|
+
`)}function dl(e,t){let r=[];r.push(bt(t)),r.push(w("\u2502"));let o=e.files.slice(0,Ce);if(o.length===0&&!e.css)r.push(`${w("\u2502")} ${w("No files.")}`),r.push(w("\u2502"));else{for(let s of o){let c=s.content.split(`
|
|
132
|
+
`);r.push(`${w("\u251C")} ${H(s.path)} ${w("(")}${wt(s.action)}${w(")")} ${w(`${c.length} lines`)}`),Ve(r,c),r.push(w("\u2502"))}e.files.length>Ce&&r.push(w("\u2502"))}let n=e.files.length;return n>Ce&&r.push(` ${w(`Showing ${Ce} of ${n} files. Use --view <path> to view a specific file.`)}`),r.push(`${w("\u2514")} ${w("Run without --dry-run to apply.")}`),r.join(`
|
|
133
|
+
`)}function ii(e,t){if(t.push(`${w("\u251C")} ${H(e.path)} ${w("(")}${wt(e.action)}${w(")")}`),e.action==="skip")t.push(`${w("\u2502")} ${w("No changes.")}`);else if(e.action==="create")Ve(t,e.content.split(`
|
|
134
|
+
`),r=>K(`+${r}`));else{let r=ai(e.existingContent,e.content,e.path);Ve(t,r)}t.push(w("\u2502"))}function gl(e,t,r){let o=[];o.push(bt(t)),o.push(w("\u2502"));let n=si(e.files,r),i=e.css&&oi(e.css.path,r);if(n.length===0&&!i)o.push(`${w("\u2502")} ${nt(`No file matching "${r}" found.`)}`),o.push(w("\u2502"));else{for(let s of n){let c=s.content.split(`
|
|
135
|
+
`);o.push(`${w("\u251C")} ${H(s.path)} ${w("(")}${wt(s.action)}${w(")")} ${w(`${c.length} lines`)}`),Ve(o,c),o.push(w("\u2502"))}if(i&&e.css){let s=e.css.content.split(`
|
|
136
|
+
`);o.push(`${w("\u251C")} ${H(e.css.path)} ${w("(")}${wt(e.css.action)}${w(")")} ${w(`${s.length} lines`)}`),Ve(o,s),o.push(w("\u2502"))}}return o.push(`${w("\u2514")} ${w("Run without --dry-run to apply.")}`),o.join(`
|
|
137
|
+
`)}function hl(e,t){if(e.files.length===0)return;let r={create:0,overwrite:0,skip:0};for(let s of e.files)r[s.action]++;let o=[];r.create>0&&o.push(K(`+${r.create} new`)),r.overwrite>0&&o.push(nt(`~${r.overwrite} overwrite`)),r.skip>0&&o.push(w(`=${r.skip} skip`));let n=o.length>0?` ${o.join(w(", "))}`:"";t.push(`${w("\u251C")} ${H("Files")} ${w(`(${e.files.length})`)}${n}`);let i=Math.max(...e.files.map(s=>s.path.length));for(let s of e.files){let c=cl[s.action],a=fl[s.action],f=" ".repeat(Math.max(1,i-s.path.length+2)),m=s.action==="create"?K:s.action==="overwrite"?nt:w,p=s.action==="skip"?w(s.path):s.path;t.push(`${w("\u2502")} ${m(c)} ${p}${f}${m(a)}`)}t.push(w("\u2502"))}function ti(e,t,r){if(t.length){r.push(`${w("\u251C")} ${H(e)} ${w(`(${t.length})`)}`);for(let o of t)r.push(`${w("\u2502")} ${K("+")} ${o}`);r.push(w("\u2502"))}}function yl(e,t){e.css&&(t.push(`${w("\u251C")} ${H("CSS")}`),e.css.cssVarsCount>0?t.push(`${w("\u2502")} ${K("+")} ${e.css.cssVarsCount} CSS variables added to ${Gr(e.css.path)}`):t.push(`${w("\u2502")} ${K("+")} Updated ${Gr(e.css.path)}`),t.push(w("\u2502")))}function wl(e,t){if(!e.envVars)return;let r=Object.keys(e.envVars.variables);t.push(`${w("\u251C")} ${H("Environment Variables")}`);for(let o of r)t.push(`${w("\u2502")} ${K("+")} ${o}`);t.push(w("\u2502"))}function bl(e,t){if(e.fonts.length){t.push(`${w("\u251C")} ${H("Fonts")}`);for(let r of e.fonts)t.push(`${w("\u2502")} ${K("+")} ${r.name} ${w(`(${r.provider})`)}`);t.push(w("\u2502"))}}function si(e,t){let r=e.filter(o=>o.path===t);return r.length>0?r:e.filter(o=>o.path.includes(t)||o.path.replace(/\\/g,"/").includes(t))}function ai(e,t,r,o={}){if(xl(e,t))return[w(" Formatting-only changes (spacing, quotes, semicolons).")];let n=ri(e),i=ri(t),s=o.fullContext?Math.max(n.split(`
|
|
138
138
|
`).length,i.split(`
|
|
139
|
-
`).length):3,c=
|
|
140
|
-
`);for(let m of c.hunks){let{entries:p,newLineIndex:u}=
|
|
139
|
+
`).length):3,c=sl(`a/${r}`,`b/${r}`,n,i,"","",{context:s});if(!c.hunks.length)return[w(" No changes.")];let a=[w(`--- a/${r}`),w(`+++ b/${r}`)],f=t.split(`
|
|
140
|
+
`);for(let m of c.hunks){let{entries:p,newLineIndex:u}=kl(m,f);if(!p.some(k=>k.kind!=="context"))continue;let h=p.filter(k=>k.kind==="context").length,g=p.filter(k=>k.kind==="removed").length,y=p.filter(k=>k.kind==="added").length;a.push(Gr(`@@ -${m.oldStart},${h+g} +${m.newStart},${h+y} @@`));for(let k of p)a.push(k.formatted)}return a}function kl(e,t){let r=[],o=e.newStart-1,n=0;for(;n<e.lines.length;){let i=e.lines[n];if(i.startsWith("-")){let s=[];for(;n<e.lines.length&&e.lines[n].startsWith("-");)s.push(e.lines[n].slice(1)),n++;for(;n<e.lines.length&&e.lines[n].startsWith("\\");)n++;let c=[];for(;n<e.lines.length&&e.lines[n].startsWith("+");)c.push(e.lines[n].slice(1)),n++;for(;n<e.lines.length&&e.lines[n].startsWith("\\");)n++;o=vl(s,c,t,o,r)}else if(i.startsWith("+")){let s=t[o]??i.slice(1);r.push({kind:"added",formatted:K(`+${s}`)}),o++,n++}else if(i.startsWith("\\"))n++;else{let s=t[o]??i.slice(1);r.push({kind:"context",formatted:w(` ${s}`)}),o++,n++}}return{entries:r,newLineIndex:o}}function vl(e,t,r,o,n){if(Sl(e,t)){for(let a=0;a<t.length;a++){let f=r[o]??t[a];n.push({kind:"context",formatted:w(` ${f}`)}),o++}return o}let i=Cl(e),s=i.map(sr),c=new Set;for(let a=0;a<t.length;a++){let f=r[o]??t[a],m=sr(t[a]),p=s.findIndex((u,h)=>!c.has(h)&&u===m);if(p!==-1)c.add(p),n.push({kind:"context",formatted:w(` ${f}`)});else{let u=s.findIndex((h,g)=>!c.has(g));if(u!==-1){c.add(u);let{oldHighlighted:h,newHighlighted:g}=Rl(i[u],f);n.push({kind:"removed",formatted:h}),n.push({kind:"added",formatted:g})}else n.push({kind:"added",formatted:K(`+${f}`)})}o++}for(let a=0;a<i.length;a++)c.has(a)||n.push({kind:"removed",formatted:Hr(`-${i[a]}`)});return o}function ri(e){return e.split(`
|
|
141
141
|
`).map(t=>{let r=t.match(/^(\s*)/)?.[1]??"",o=t.slice(r.length);return r+o.replace(/['"]/g,'"').replace(/;$/g,"")}).join(`
|
|
142
|
-
`)}function
|
|
143
|
-
`).map(
|
|
142
|
+
`)}function Cl(e){let t=[];for(let r=0;r<e.length;r++){let o=e[r];for(;r+1<e.length&&o.trimEnd().endsWith(":");)r++,o=o.trimEnd()+" "+e[r].trim();t.push(o)}return t}function Rl(e,t){let r=il(e,t),o="-",n="+";for(let i of r)i.added?n+=H(K(i.value)):i.removed?o+=H(Hr(i.value)):(o+=Hr(i.value),n+=K(i.value));return{oldHighlighted:o,newHighlighted:n}}function sr(e){return e.replace(/\s+/g," ").trim().replace(/['"]/g,"'").replace(/;/g,"").replace(/,$/,"")}function xl(e,t){let r=o=>o.split(`
|
|
143
|
+
`).map(sr).filter(n=>n.length>0).join(" ");return r(e)===r(t)}function Sl(e,t){let r=o=>o.map(sr).filter(n=>n.length>0).join(" ");return r(e)===r(t)}import li from"fs/promises";import Il from"path";async function ci(e,t){let r=Il.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await li.stat(r)).isFile())return;let[o]=await ie([e],{config:t});if(!o?.meta?.importSpecifier||!o?.meta?.moduleSpecifier)return;let n=`import { ${o?.meta?.importSpecifier} } from "${o.meta.moduleSpecifier}"
|
|
144
144
|
|
|
145
145
|
export default function Page() {
|
|
146
146
|
return <${o?.meta?.importSpecifier} />
|
|
147
|
-
}`;await
|
|
148
|
-
Existing CSS variables and components will be overwritten. Continue?`)});y||(l.break(),l.log("Installation cancelled."),l.break(),process.exit(1))}}r.components?.length||(r.components=await
|
|
149
|
-
Before you can apply a preset, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),l.error(`Learn more at ${d.info(`${S}/docs/components-json`)}.`),l.break(),process.exit(1)}}import{Command as
|
|
150
|
-
`))l.error(o);l.break(),process.exit(1)}r instanceof
|
|
151
|
-
`));return
|
|
152
|
-
`));return Array.from(new Set(r.map(n=>t[n])))}function
|
|
153
|
-
`))}function
|
|
147
|
+
}`;await li.writeFile(r,n,"utf8")}import{Command as El}from"commander";import Kr from"prompts";import{z as _}from"zod";var $l=_.object({components:_.array(_.string()).optional(),yes:_.boolean(),overwrite:_.boolean(),cwd:_.string(),all:_.boolean(),path:_.string().optional(),silent:_.boolean(),dryRun:_.boolean(),diff:_.union([_.string(),_.literal(!0)]).optional(),view:_.union([_.string(),_.literal(!0)]).optional()}),fi=new El().name("add").description("add a component to your project").argument("[components...]","names, url or local path to component").option("-y, --yes","skip confirmation prompt.",!1).option("-o, --overwrite","overwrite existing files.",!1).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-a, --all","add all available components",!1).option("-p, --path <path>","the path to add the component to.").option("-s, --silent","mute output.",!1).option("--dry-run","preview changes without writing files.",!1).option("--diff [path]","show diff for a file.").option("--view [path]","show file contents.").action(async(e,t)=>{try{let r=$l.parse({components:e,...t,cwd:Pl.resolve(t.cwd)});await ee(r.cwd);let o=r.dryRun||r.diff||r.view,n=await j(r.cwd);n||(n=Ge({style:"new-york",resolvedPaths:{cwd:r.cwd}}));let i=!1;if(e.length>0){let{config:g,newRegistries:y}=await G(e,n,{silent:r.silent,writeFile:!1});n=g,i=y.length>0}let s,c=!0;if(e.length>0){let[g]=await ie([e[0]],{config:n});if(s=g?.type,c=s!=="registry:theme"&&s!=="registry:style"&&s!=="registry:base",Bo(g)&&!o){await pe(e,n,r);return}if(!r.yes&&!o&&(s==="registry:style"||s==="registry:theme")){l.break();let{confirm:y}=await Kr({type:"confirm",name:"confirm",message:d.warn(`You are about to install a new ${s.replace("registry:","")}.
|
|
148
|
+
Existing CSS variables and components will be overwritten. Continue?`)});y||(l.break(),l.log("Installation cancelled."),l.break(),process.exit(1))}}r.components?.length||(r.components=await jl(r));let a=await F(r.cwd);if(a?.tailwindVersion==="v4"){let g=Tt.filter(y=>r.components?.includes(y.name));g?.length&&(l.break(),g.forEach(y=>{l.warn(d.warn(y.message))}),l.break(),process.exit(1))}let{errors:f,config:m}=await Xn(r),p=!1;if(f["3"]){let{proceed:g}=await Kr({type:"confirm",name:"proceed",message:`You need to create a ${d.info("components.json")} file to add components. Proceed?`,initial:!0});g||(l.break(),process.exit(1));let y=Qe(a?.framework.name),k=await Ze(),{url:v}=await ft({rtl:!1,base:k,template:y}),{registryBaseConfig:I,installStyleIndex:x,url:C}=await Te(v,r.cwd);m=await ot({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:r.silent&&!i,isNewProject:!1,cssVariables:!0,rtl:!1,installStyleIndex:x,components:[C,...r.components??[]],registryBaseConfig:I}),p=!0}let u=!1;if(f["1"]){let{projectPath:g,template:y}=await nr({cwd:r.cwd,force:r.overwrite,components:r.components});g||(l.break(),process.exit(1)),r.cwd=g;let k=await Ze(),{url:v}=await ft({rtl:!1,base:k,template:y}),{registryBaseConfig:I,installStyleIndex:x,url:C}=await Te(v,r.cwd);m=await ot({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!i&&r.silent,isNewProject:!0,cssVariables:!0,rtl:!1,installStyleIndex:x,components:[C,...r.components??[]],registryBaseConfig:I}),p=!0,u=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//)}if(!m)throw new Error(`Failed to read config at ${d.info(r.cwd)}.`);let{config:h}=await G(r.components,m,{silent:r.silent||i,writeFile:!o});if(m=h,o){let g=b("Resolving items.",{silent:r.silent}).start(),y=await ei(r.components,m,{overwrite:r.overwrite});g.stop(),l.log(ni(y,r.components,{diff:r.diff,view:r.view}));return}p||await pe(r.components,m,r),u&&await ci(r.components[0],m)}catch(r){l.break(),R(r)}finally{ne()}});async function jl(e){let t=await He();if(!t)return l.break(),R(new Error("Failed to fetch registry index.")),[];if(e.all)return t.map(n=>n.name).filter(n=>!Tt.some(i=>i.name===n));if(e.components?.length)return e.components;let{components:r}=await Kr({type:"multiselect",name:"components",message:"Which components would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:!1,choices:t.filter(n=>n.type==="registry:ui"&&!Tt.some(i=>i.name===n.name)).map(n=>({title:n.name,value:n.name,selected:e.all?!0:e.components?.includes(n.name)}))});r?.length||(l.warn("No components selected. Exiting."),l.info(""),process.exit(1));let o=_.array(_.string()).safeParse(r);return o.success?o.data:(l.error(""),R(new Error("Something went wrong. Please try again.")),[])}import Xr from"path";import Yr from"path";import qr from"fs-extra";async function mi(e){let t={};if(!qr.existsSync(e.cwd)||!qr.existsSync(Yr.resolve(e.cwd,"package.json")))return t["1"]=!0,{errors:t,config:null};if(!qr.existsSync(Yr.resolve(e.cwd,"components.json"))){if(await M(e.cwd)){let r=await B(e.cwd),o=[];for(let n of r){let i=await F(Yr.resolve(e.cwd,n.name));i?.framework&&i.framework.name!=="manual"&&o.push(n)}o.length>0&&(W("apply --preset <preset>",o,{cwdFlag:"-c"}),process.exit(1))}return t["3"]=!0,{errors:t,config:null}}try{let r=await j(e.cwd);return{errors:t,config:r}}catch{l.break(),l.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e.cwd)}.
|
|
149
|
+
Before you can apply a preset, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),l.error(`Learn more at ${d.info(`${S}/docs/components-json`)}.`),l.break(),process.exit(1)}}import{Command as Tl}from"commander";import Zr from"fs-extra";import Fl from"prompts";import{z as ge}from"zod";var Ol=ge.object({cwd:ge.string(),positionalPreset:ge.string().optional(),preset:ge.string().optional(),only:ge.union([ge.boolean(),ge.string()]).optional(),yes:ge.boolean(),silent:ge.boolean()}),di=["theme","font"],it=class extends Error{constructor(t){super(t),this.name="ApplyOnlyError"}},ar=class extends Error{constructor(t){super(t),this.name="ApplyWorkspaceSyncError"}},gi=new Tl().name("apply").description("apply a preset to an existing project").argument("[preset]","the preset to apply").option("--preset <preset>","preset configuration to apply").option("--only [parts]","apply only parts of a preset: theme, font").option("-y, --yes","skip confirmation prompt.",!1).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",!1).action(async(e,t)=>{try{let r=Ol.parse({...t,cwd:Xr.resolve(t.cwd),positionalPreset:e}),o=Al(r),n=pi(r.only);_l({preset:o,only:n});let i=await mi(r);i.errors["1"]&&(l.break(),l.error(`The ${d.info("apply")} command only works in an existing project.`),l.error(`Run ${d.info(ui(o))} first.`),l.break(),process.exit(1)),i.errors["3"]&&(l.break(),l.error(`No ${d.info("components.json")} found at ${d.info(r.cwd)}.`),l.error(`Run ${d.info(ui(o))} first.`),l.break(),process.exit(1));let s=i.config;s||process.exit(1);let c=s.rtl??!1,a=await Ul(r.cwd);if(!o){let y=Vr({command:"init",template:a,base:je(s.style),rtl:c});await Dr({createUrl:y,followUp:`Then run ${d.info("love-ui apply --preset <preset>")} with the preset code or preset URL from loveui.dev.`,prompt:!r.yes}),process.exit(0)}Dl(o);let f=n??pi(Nl(o)),m=!f,p=m?await Ke(r.cwd):[];if(!r.yes){if(l.break(),f?l.warn(d.warn("Applying the selected preset parts will update your project configuration and styles.")):l.warn(d.warn("Applying a new preset will overwrite existing UI components, fonts, and CSS variables.")),l.warn("Commit or stash your changes before continuing so you can easily go back."),m)if(l.break(),l.log(" The following components will be re-installed:"),p.length)for(let k=0;k<p.length;k+=8)l.log(` - ${p.slice(k,k+8).join(", ")}`);else l.log(" - No installed UI components were detected.");l.break();let{proceed:y}=await Fl({type:"confirm",name:"proceed",message:"Would you like to continue?",initial:!1});y||(l.break(),process.exit(1))}await ee(r.cwd);let u=je(s.style),h=Wl(o,u,{template:a,rtl:c,only:f?.join(",")}),g=await Yn(Xr.resolve(r.cwd,"components.json"),async()=>{let{registryBaseConfig:y,installStyleIndex:k,url:v}=await Te(h,r.cwd,{registries:s.registries}),I=Vl({registryBaseConfig:y,existingConfig:s,only:f});return await ot({cwd:r.cwd,yes:!0,force:!1,reinstall:m,defaults:!1,silent:r.silent,isNewProject:!1,cssVariables:!0,installStyleIndex:k,registryBaseConfig:I,existingConfig:s,components:[v,...p]})});await Ml(g,{only:f}),l.break(),l.log("Preset applied successfully."),l.break()}catch(r){if(r instanceof it){for(let o of r.message.split(`
|
|
150
|
+
`))l.error(o);l.break(),process.exit(1)}r instanceof et&&(l.error(`Could not back up ${d.info("components.json")}. Aborting.`),l.break(),process.exit(1)),r instanceof ar&&(l.error(r.message),l.break(),process.exit(1)),l.break(),R(r)}finally{ne()}});function Al(e){let t=e.positionalPreset?.trim(),r=e.preset?.trim();return t&&r&&t!==r&&(l.error(`Received two different preset values. Use either the positional preset or ${d.info("--preset")}, or pass the same value to both.`),l.break(),process.exit(1)),r??t}function Nl(e){if(!q(e))return;let t=new URL(e);if(t.pathname==="/init")return t.searchParams.get("only")??void 0}function pi(e){if(!(e===void 0||e===!1)){if(e===!0)throw new it(["Missing value for --only.",`Use one or more of: ${di.join(", ")}.`,"Example: love-ui apply <preset> --only theme,font."].join(`
|
|
151
|
+
`));return Ll(e)}}function Ll(e){let t={theme:"theme",font:"font",fonts:"font"},r=e.split(",").map(n=>n.trim().toLowerCase()).filter(Boolean),o=r.filter(n=>!t[n]);if(!r.length||o.length)throw new it([`Invalid value for --only: ${e}.`,`Use one or more of: ${di.join(", ")}.`,"Example: love-ui apply <preset> --only theme,font."].join(`
|
|
152
|
+
`));return Array.from(new Set(r.map(n=>t[n])))}function _l(e){if(!(!e.only||e.preset))throw new it(["Missing preset for --only.","Use: love-ui apply <preset> --only theme,font."].join(`
|
|
153
|
+
`))}function Vl(e){if(!e.only||e.only.includes("theme"))return e.registryBaseConfig;let t=typeof e.existingConfig.tailwind=="object"&&e.existingConfig.tailwind!==null?e.existingConfig.tailwind:{},r=typeof e.registryBaseConfig?.tailwind=="object"&&e.registryBaseConfig.tailwind!==null?e.registryBaseConfig.tailwind:{},o={...e.registryBaseConfig,tailwind:{...t,...r}};return e.existingConfig.menuColor&&(o.menuColor=e.existingConfig.menuColor),e.existingConfig.menuAccent&&(o.menuAccent=e.existingConfig.menuAccent),o}function Dl(e){if(q(e)||qe(e))return;let t=Object.keys(Z);t.includes(e)||(l.error(`Invalid preset: ${d.info(e)}.
|
|
154
154
|
Use one of the available presets: ${t.join(", ")}
|
|
155
|
-
or build your own at ${d.info(`${S}/create`)}`),l.break(),process.exit(1))}async function
|
|
155
|
+
or build your own at ${d.info(`${S}/create`)}`),l.break(),process.exit(1))}async function Ul(e){let t=await F(e);return Qe(t?.framework.name)}async function Ml(e,t){if(t?.only&&!t.only.includes("theme"))return;let r=await Bl(e);if(!r.length)return;let o={style:e.style,tailwind:{baseColor:e.tailwind.baseColor,cssVariables:e.tailwind.cssVariables},...e.iconLibrary?{iconLibrary:e.iconLibrary}:{},...e.rtl!==void 0?{rtl:e.rtl}:{},...e.menuColor?{menuColor:e.menuColor}:{},...e.menuAccent?{menuAccent:e.menuAccent}:{}},n=[];for(let i of r){let s=Xr.resolve(i.resolvedPaths.cwd,"components.json");await Zr.pathExists(s)&&n.push({configPath:s,existingConfig:await Zr.readJson(s)})}try{for(let i of n)if(!ht(i.configPath))throw new et(i.configPath);for(let i of n)await Zr.writeJson(i.configPath,{...i.existingConfig,...o,tailwind:{...i.existingConfig.tailwind,...o.tailwind}},{spaces:2});for(let i of n)yt(i.configPath)}catch(i){for(let s of[...n].reverse())tt(s.configPath);throw new ar(`Failed to sync linked workspace configs.${i instanceof Error?` ${i.message}`:""}`)}}async function Bl(e){let t=await Je(e);if(!t)return[];let r=new Map;for(let o of Object.values(t))o.resolvedPaths.cwd!==e.resolvedPaths.cwd&&r.set(o.resolvedPaths.cwd,o);return Array.from(r.values()).sort((o,n)=>o.resolvedPaths.cwd.localeCompare(n.resolvedPaths.cwd))}function Wl(e,t,r={}){if(q(e)){let n=new URL(e);return n.pathname==="/init"&&e.startsWith(S)&&n.searchParams.set("track","1"),n.searchParams.set("base",t),n.searchParams.set("rtl",String(r.rtl??!1)),r.only&&n.searchParams.set("only",r.only),n.toString()}if(qe(e)){let n=Ye(e);return n||(l.error(`Invalid preset code: ${d.info(e)}`),l.break(),process.exit(1)),he({...n,base:t,rtl:r.rtl??!1},{preset:e,template:r.template,only:r.only})}let o=Z[e];return he({...o,base:t,rtl:r.rtl??o.rtl},{template:r.template,only:r.only})}function zl(e){return/[^A-Za-z0-9_./:-]/.test(e)?JSON.stringify(e):e}function ui(e){return e?`love-ui init --preset ${zl(e)}`:"love-ui init"}import*as kt from"fs/promises";import*as De from"path";import yi from"path";import wi from"fs-extra";async function bi(e){let t={},r={cwd:e.cwd,registryFile:yi.resolve(e.cwd,e.registryFile),outputDir:yi.resolve(e.cwd,e.outputDir)};return wi.existsSync(r.registryFile)||(t["13"]=!0),await wi.mkdir(r.outputDir,{recursive:!0}),Object.keys(t).length>0&&(t["13"]&&(l.break(),l.error(`The path ${d.info(r.registryFile)} does not exist.`)),l.break(),process.exit(1)),{errors:t,resolvePaths:r}}import{Command as Jl}from"commander";import{z as lr}from"zod";var Gl=lr.object({cwd:lr.string(),registryFile:lr.string(),outputDir:lr.string()}),ki=new Jl().name("build").description("build components for a Love UI registry").argument("[registry]","path to registry.json file","./registry.json").option("-o, --output <path>","destination directory for json files","./public/r").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=Gl.parse({cwd:De.resolve(t.cwd),registryFile:e,outputDir:t.output}),{resolvePaths:o}=await bi(r),n=await nn(o.registryFile,{cwd:o.cwd}),i=n.registry,s=n.usesInclude?De.dirname(o.registryFile):o.cwd,c=sn(n,s,o.cwd),a=b("Building registry...");for(let f of i.items){a.start(`Building ${f.name}...`);let m=await an(f,n,s,o.cwd);await kt.writeFile(De.resolve(o.outputDir,`${m.name}.json`),JSON.stringify(m,null,2))}n.usesInclude?await kt.writeFile(De.resolve(o.outputDir,"registry.json"),JSON.stringify(c,null,2)):await kt.copyFile(o.registryFile,De.resolve(o.outputDir,"registry.json")),a.succeed("Building registry.")}catch(r){l.break(),R(r)}});import{existsSync as Qr,promises as Hl}from"fs";import eo from"path";import{Command as Kl}from"commander";import{diffLines as Yl}from"diff";import{z as vt}from"zod";var ql=vt.object({component:vt.string().optional(),yes:vt.boolean(),cwd:vt.string(),path:vt.string().optional()}),Ci=new Kl().name("diff").description("[DEPRECATED] Use `add [component] --diff` instead.").argument("[component]","the component name").option("-y, --yes","skip confirmation prompt.",!1).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=ql.parse({component:e,...t}),o=eo.resolve(r.cwd);Qr(o)||(l.error(`The path ${o} does not exist. Please try again.`),process.exit(1));let n=await j(o);if(!n){if(await M(o)){let a=await B(o);a.length>0&&(W("diff [component]",a),process.exit(1))}l.warn(`Configuration is missing. Please run ${d.success("init")} to create a components.json file.`),process.exit(1)}let i=await He();if(i||(R(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let a=n.resolvedPaths.components,f=i.filter(p=>{for(let u of p.files??[]){let h=eo.resolve(a,typeof u=="string"?u:u.path);if(Qr(h))return!0}return!1}),m=[];for(let p of f){let u=await vi(p,n);u.length&&m.push({name:p.name,changes:u})}m.length||(l.info("No updates found."),process.exit(0)),l.info("The following components have updates available:");for(let p of m){l.info(`- ${p.name}`);for(let u of p.changes)l.info(` - ${u.filePath}`)}l.break(),l.info(`Run ${d.success("diff <component>")} to see the changes.`),process.exit(0)}let s=i.find(a=>a.name===r.component);s||(l.error(`The component ${d.success(r.component)} does not exist.`),process.exit(1));let c=await vi(s,n);c.length||(l.info(`No updates found for ${r.component}.`),process.exit(0));for(let a of c)l.info(`- ${a.filePath}`),await Zl(a.patch),l.info("")}catch(r){R(r)}});async function vi(e,t){let r=await en(t.style,[e]),o=await Jt(t.tailwind.baseColor),n=Ae(r);if(!r)return[];let i=[];for(let s of r){let c=await tn(t,s);if(c)for(let a of s.files??[]){let f=eo.resolve(c,typeof a=="string"?a:a.path);if(!Qr(f))continue;let m=await Hl.readFile(f,"utf8");if(typeof a=="string"||!a.content)continue;let p=await Ut({filename:a.path,raw:a.content,config:t,baseColor:o,supportedFontMarkers:n},[Nt,Lt,Ot,Dt,At,Bt,Vt,Mt,_t]),u=Yl(p,m);u.length>1&&i.push({filePath:f,patch:u})}}return i}async function Zl(e){e.forEach(t=>{if(t)return t.added?process.stdout.write(d.success(t.value)):t.removed?process.stdout.write(d.error(t.value)):process.stdout.write(t.value)})}import Xl from"path";import{Command as Ql}from"commander";var Ri="https://www.loveui.dev",xi=new Ql().name("docs").description("get docs, api references and usage examples for components").argument("<components...>","component names").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-b, --base <base>","the base to use either 'base' or 'radix'. defaults to project base.").option("--json","output as JSON.",!1).action(async(e,t)=>{try{let r=Xl.resolve(t.cwd),o=await j(r),n=t.base??je(o?.style),i=await He();i||(l.error("Failed to fetch the registry index."),process.exit(1));let s=[];for(let a of e){let f=i.find(p=>p.name===a);f||(l.error(`Component ${d.info(a)} not found in the Love UI registry.`),process.exit(1));let m=f.meta?.links?.[n];if(!m||Object.keys(m).length===0){l.warn(`No documentation links available for ${d.info(a)}.`);continue}s.push({component:a,base:n,links:ec(m)})}if(t.json){console.log(JSON.stringify({base:n,results:s},null,2));return}let c=Math.max(...s.flatMap(a=>Object.keys(a.links).map(f=>f.length)));for(let{component:a,links:f}of s){l.log(d.info(a));for(let[m,p]of Object.entries(f))l.log(` - ${m.padEnd(c+2)}${p}`);l.break()}}catch(r){R(r)}});function ec(e){return Object.fromEntries(Object.entries(e).map(([t,r])=>[t,r.startsWith(Ri)?`${S}${r.slice(Ri.length)}`:r]))}import{promises as to}from"fs";import te from"path";import{Command as tc}from"commander";import{execa as cr}from"execa";import Ct from"fs-extra";import rc from"prompts";import{z as fr}from"zod";var Si=/@import\s+["']love-ui\/tailwind\.css["'];?\s*\n?/,oc=fr.object({cwd:fr.string(),yes:fr.boolean(),silent:fr.boolean()}),Ii=new tc().name("eject").description("inline love-ui/tailwind.css and remove the love-ui dependency").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-y, --yes","skip confirmation prompt.",!1).option("-s, --silent","mute output.",!1).action(async e=>{try{let t=oc.parse({cwd:te.resolve(e.cwd),yes:e.yes,silent:e.silent});await nc(t)}catch(t){R(t)}});async function nc(e){if(!Ct.existsSync(te.resolve(e.cwd,"components.json"))){if(await M(e.cwd)){let m=await B(e.cwd);m.length>0&&(W("eject",m),process.exit(1))}l.break(),l.error(`No ${d.info("components.json")} found. Run ${d.info("love-ui init")} first.`),l.error(`Learn more at ${d.info(`${S}/docs/components-json`)}.`),l.break(),process.exit(1)}let t=await j(e.cwd);t?.resolvedPaths.tailwindCss||(l.break(),l.error("Could not resolve the Tailwind CSS file from components.json."),l.break(),process.exit(1));let r=t.resolvedPaths.tailwindCss,o=te.relative(e.cwd,r),n=await to.readFile(r,"utf8");Si.test(n)||(l.break(),l.error(`Could not find ${d.info('@import "love-ui/tailwind.css"')} in ${d.info(o)}.`),l.error("Nothing to eject."),l.break(),process.exit(1));let i=$e(e.cwd,!1),s=ic(i),c=ac(e.cwd),a=await to.readFile(c,"utf8");if(e.silent||(l.break(),l.warn("This action is not reversible. Future Love UI CLI updates to tailwind.css will not apply automatically."),l.break()),!e.yes){l.log("This will:"),l.log(` - Inline ${d.info("love-ui/tailwind.css")} into ${d.info(o)}`),l.log(` - Remove the ${d.info("love-ui")} dependency`),l.break();let{proceed:m}=await rc({type:"confirm",name:"proceed",message:"Proceed?",initial:!1});m||process.exit(0)}let f=b(`Inlining ${d.info("love-ui/tailwind.css")}.`,{silent:e.silent})?.start();if(n=n.replace(Si,()=>`/* ejected from love-ui@${s} */
|
|
156
156
|
${a.trim()}
|
|
157
157
|
|
|
158
|
-
`),await to.writeFile(r,n,"utf8"),f?.succeed(),Yl(i)){let m=b(`Removing ${d.info("love-ui")}.`,{silent:e.silent})?.start();await Zl(e.cwd),m?.succeed()}else e.silent||l.warn(`The ${d.info("love-ui")} package was not found in package.json. Skipped removal.`);l.break(),l.log(`Ejected ${d.info("love-ui/tailwind.css")} into ${d.info(o)}.`),l.break()}function Kl(e){return e?(e.dependencies?.["love-ui"]??e.devDependencies?.["love-ui"]??"unknown").replace(/^[\^~]/,"").trim():"unknown"}function Yl(e){return e?!!(e.dependencies?.["love-ui"]||e.devDependencies?.["love-ui"]):!1}function ql(e){let t=te.join(e,"node_modules/love-ui/dist/tailwind.css");if(vt.existsSync(t))return t;let r=process.argv[1]?te.dirname(te.resolve(process.argv[1])):e;for(let o of[te.join(r,"tailwind.css"),te.join(r,"dist","tailwind.css"),te.join(r,"src","tailwind.css"),te.join(process.cwd(),"src/tailwind.css"),te.join(process.cwd(),"dist/tailwind.css")])if(vt.existsSync(o))return o;throw new Error("Could not resolve love-ui/tailwind.css.")}async function Zl(e){switch(await ce(e)){case"npm":await lr("npm",["uninstall","love-ui"],{cwd:e});break;case"pnpm":await lr("pnpm",["remove","love-ui"],{cwd:e});break;case"yarn":await lr("yarn",["remove","love-ui"],{cwd:e});break;case"bun":await lr("bun",["remove","love-ui"],{cwd:e});break;case"deno":{let r=te.join(e,"package.json"),o=await vt.readJson(r);for(let n of["dependencies","devDependencies"])o[n]?.["love-ui"]&&delete o[n]["love-ui"];await vt.writeJson(r,o,{spaces:2});break}}}import{existsSync as Dc}from"fs";import Ai from"path";import{existsSync as rc,promises as Pi}from"fs";import oc from"path";var Xl=["50","100","200","300","400","500","600","700","800","900","950"],Ql=["red","orange","amber","yellow","lime","green","emerald","teal","cyan","sky","blue","indigo","violet","purple","fuchsia","pink","rose","slate","gray","zinc","neutral","stone","mauve","olive","mist","taupe"],ec={red:{50:"oklch(97.1% 0.013 17.38)",100:"oklch(93.6% 0.032 17.717)",200:"oklch(88.5% 0.062 18.334)",300:"oklch(80.8% 0.114 19.571)",400:"oklch(70.4% 0.191 22.216)",500:"oklch(63.7% 0.237 25.331)",600:"oklch(57.7% 0.245 27.325)",700:"oklch(50.5% 0.213 27.518)",800:"oklch(44.4% 0.177 26.899)",900:"oklch(39.6% 0.141 25.723)",950:"oklch(25.8% 0.092 26.042)"},orange:{50:"oklch(98% 0.016 73.684)",100:"oklch(95.4% 0.038 75.164)",200:"oklch(90.1% 0.076 70.697)",300:"oklch(83.7% 0.128 66.29)",400:"oklch(75% 0.183 55.934)",500:"oklch(70.5% 0.213 47.604)",600:"oklch(64.6% 0.222 41.116)",700:"oklch(55.3% 0.195 38.402)",800:"oklch(47% 0.157 37.304)",900:"oklch(40.8% 0.123 38.172)",950:"oklch(26.6% 0.079 36.259)"},amber:{50:"oklch(98.7% 0.022 95.277)",100:"oklch(96.2% 0.059 95.617)",200:"oklch(92.4% 0.12 95.746)",300:"oklch(87.9% 0.169 91.605)",400:"oklch(82.8% 0.189 84.429)",500:"oklch(76.9% 0.188 70.08)",600:"oklch(66.6% 0.179 58.318)",700:"oklch(55.5% 0.163 48.998)",800:"oklch(47.3% 0.137 46.201)",900:"oklch(41.4% 0.112 45.904)",950:"oklch(27.9% 0.077 45.635)"},yellow:{50:"oklch(98.7% 0.026 102.212)",100:"oklch(97.3% 0.071 103.193)",200:"oklch(94.5% 0.129 101.54)",300:"oklch(90.5% 0.182 98.111)",400:"oklch(85.2% 0.199 91.936)",500:"oklch(79.5% 0.184 86.047)",600:"oklch(68.1% 0.162 75.834)",700:"oklch(55.4% 0.135 66.442)",800:"oklch(47.6% 0.114 61.907)",900:"oklch(42.1% 0.095 57.708)",950:"oklch(28.6% 0.066 53.813)"},lime:{50:"oklch(98.6% 0.031 120.757)",100:"oklch(96.7% 0.067 122.328)",200:"oklch(93.8% 0.127 124.321)",300:"oklch(89.7% 0.196 126.665)",400:"oklch(84.1% 0.238 128.85)",500:"oklch(76.8% 0.233 130.85)",600:"oklch(64.8% 0.2 131.684)",700:"oklch(53.2% 0.157 131.589)",800:"oklch(45.3% 0.124 130.933)",900:"oklch(40.5% 0.101 131.063)",950:"oklch(27.4% 0.072 132.109)"},green:{50:"oklch(98.2% 0.018 155.826)",100:"oklch(96.2% 0.044 156.743)",200:"oklch(92.5% 0.084 155.995)",300:"oklch(87.1% 0.15 154.449)",400:"oklch(79.2% 0.209 151.711)",500:"oklch(72.3% 0.219 149.579)",600:"oklch(62.7% 0.194 149.214)",700:"oklch(52.7% 0.154 150.069)",800:"oklch(44.8% 0.119 151.328)",900:"oklch(39.3% 0.095 152.535)",950:"oklch(26.6% 0.065 152.934)"},emerald:{50:"oklch(97.9% 0.021 166.113)",100:"oklch(95% 0.052 163.051)",200:"oklch(90.5% 0.093 164.15)",300:"oklch(84.5% 0.143 164.978)",400:"oklch(76.5% 0.177 163.223)",500:"oklch(69.6% 0.17 162.48)",600:"oklch(59.6% 0.145 163.225)",700:"oklch(50.8% 0.118 165.612)",800:"oklch(43.2% 0.095 166.913)",900:"oklch(37.8% 0.077 168.94)",950:"oklch(26.2% 0.051 172.552)"},teal:{50:"oklch(98.4% 0.014 180.72)",100:"oklch(95.3% 0.051 180.801)",200:"oklch(91% 0.096 180.426)",300:"oklch(85.5% 0.138 181.071)",400:"oklch(77.7% 0.152 181.912)",500:"oklch(70.4% 0.14 182.503)",600:"oklch(60% 0.118 184.704)",700:"oklch(51.1% 0.096 186.391)",800:"oklch(43.7% 0.078 188.216)",900:"oklch(38.6% 0.063 188.416)",950:"oklch(27.7% 0.046 192.524)"},cyan:{50:"oklch(98.4% 0.019 200.873)",100:"oklch(95.6% 0.045 203.388)",200:"oklch(91.7% 0.08 205.041)",300:"oklch(86.5% 0.127 207.078)",400:"oklch(78.9% 0.154 211.53)",500:"oklch(71.5% 0.143 215.221)",600:"oklch(60.9% 0.126 221.723)",700:"oklch(52% 0.105 223.128)",800:"oklch(45% 0.085 224.283)",900:"oklch(39.8% 0.07 227.392)",950:"oklch(30.2% 0.056 229.695)"},sky:{50:"oklch(97.7% 0.013 236.62)",100:"oklch(95.1% 0.026 236.824)",200:"oklch(90.1% 0.058 230.902)",300:"oklch(82.8% 0.111 230.318)",400:"oklch(74.6% 0.16 232.661)",500:"oklch(68.5% 0.169 237.323)",600:"oklch(58.8% 0.158 241.966)",700:"oklch(50% 0.134 242.749)",800:"oklch(44.3% 0.11 240.79)",900:"oklch(39.1% 0.09 240.876)",950:"oklch(29.3% 0.066 243.157)"},blue:{50:"oklch(97% 0.014 254.604)",100:"oklch(93.2% 0.032 255.585)",200:"oklch(88.2% 0.059 254.128)",300:"oklch(80.9% 0.105 251.813)",400:"oklch(70.7% 0.165 254.624)",500:"oklch(62.3% 0.214 259.815)",600:"oklch(54.6% 0.245 262.881)",700:"oklch(48.8% 0.243 264.376)",800:"oklch(42.4% 0.199 265.638)",900:"oklch(37.9% 0.146 265.522)",950:"oklch(28.2% 0.091 267.935)"},indigo:{50:"oklch(96.2% 0.018 272.314)",100:"oklch(93% 0.034 272.788)",200:"oklch(87% 0.065 274.039)",300:"oklch(78.5% 0.115 274.713)",400:"oklch(67.3% 0.182 276.935)",500:"oklch(58.5% 0.233 277.117)",600:"oklch(51.1% 0.262 276.966)",700:"oklch(45.7% 0.24 277.023)",800:"oklch(39.8% 0.195 277.366)",900:"oklch(35.9% 0.144 278.697)",950:"oklch(25.7% 0.09 281.288)"},violet:{50:"oklch(96.9% 0.016 293.756)",100:"oklch(94.3% 0.029 294.588)",200:"oklch(89.4% 0.057 293.283)",300:"oklch(81.1% 0.111 293.571)",400:"oklch(70.2% 0.183 293.541)",500:"oklch(60.6% 0.25 292.717)",600:"oklch(54.1% 0.281 293.009)",700:"oklch(49.1% 0.27 292.581)",800:"oklch(43.2% 0.232 292.759)",900:"oklch(38% 0.189 293.745)",950:"oklch(28.3% 0.141 291.089)"},purple:{50:"oklch(97.7% 0.014 308.299)",100:"oklch(94.6% 0.033 307.174)",200:"oklch(90.2% 0.063 306.703)",300:"oklch(82.7% 0.119 306.383)",400:"oklch(71.4% 0.203 305.504)",500:"oklch(62.7% 0.265 303.9)",600:"oklch(55.8% 0.288 302.321)",700:"oklch(49.6% 0.265 301.924)",800:"oklch(43.8% 0.218 303.724)",900:"oklch(38.1% 0.176 304.987)",950:"oklch(29.1% 0.149 302.717)"},fuchsia:{50:"oklch(97.7% 0.017 320.058)",100:"oklch(95.2% 0.037 318.852)",200:"oklch(90.3% 0.076 319.62)",300:"oklch(83.3% 0.145 321.434)",400:"oklch(74% 0.238 322.16)",500:"oklch(66.7% 0.295 322.15)",600:"oklch(59.1% 0.293 322.896)",700:"oklch(51.8% 0.253 323.949)",800:"oklch(45.2% 0.211 324.591)",900:"oklch(40.1% 0.17 325.612)",950:"oklch(29.3% 0.136 325.661)"},pink:{50:"oklch(97.1% 0.014 343.198)",100:"oklch(94.8% 0.028 342.258)",200:"oklch(89.9% 0.061 343.231)",300:"oklch(82.3% 0.12 346.018)",400:"oklch(71.8% 0.202 349.761)",500:"oklch(65.6% 0.241 354.308)",600:"oklch(59.2% 0.249 0.584)",700:"oklch(52.5% 0.223 3.958)",800:"oklch(45.9% 0.187 3.815)",900:"oklch(40.8% 0.153 2.432)",950:"oklch(28.4% 0.109 3.907)"},rose:{50:"oklch(96.9% 0.015 12.422)",100:"oklch(94.1% 0.03 12.58)",200:"oklch(89.2% 0.058 10.001)",300:"oklch(81% 0.117 11.638)",400:"oklch(71.2% 0.194 13.428)",500:"oklch(64.5% 0.246 16.439)",600:"oklch(58.6% 0.253 17.585)",700:"oklch(51.4% 0.222 16.935)",800:"oklch(45.5% 0.188 13.697)",900:"oklch(41% 0.159 10.272)",950:"oklch(27.1% 0.105 12.094)"},slate:{50:"oklch(98.4% 0.003 247.858)",100:"oklch(96.8% 0.007 247.896)",200:"oklch(92.9% 0.013 255.508)",300:"oklch(86.9% 0.022 252.894)",400:"oklch(70.4% 0.04 256.788)",500:"oklch(55.4% 0.046 257.417)",600:"oklch(44.6% 0.043 257.281)",700:"oklch(37.2% 0.044 257.287)",800:"oklch(27.9% 0.041 260.031)",900:"oklch(20.8% 0.042 265.755)",950:"oklch(12.9% 0.042 264.695)"},gray:{50:"oklch(98.5% 0.002 247.839)",100:"oklch(96.7% 0.003 264.542)",200:"oklch(92.8% 0.006 264.531)",300:"oklch(87.2% 0.01 258.338)",400:"oklch(70.7% 0.022 261.325)",500:"oklch(55.1% 0.027 264.364)",600:"oklch(44.6% 0.03 256.802)",700:"oklch(37.3% 0.034 259.733)",800:"oklch(27.8% 0.033 256.848)",900:"oklch(21% 0.034 264.665)",950:"oklch(13% 0.028 261.692)"},zinc:{50:"oklch(98.5% 0 0)",100:"oklch(96.7% 0.001 286.375)",200:"oklch(92% 0.004 286.32)",300:"oklch(87.1% 0.006 286.286)",400:"oklch(70.5% 0.015 286.067)",500:"oklch(55.2% 0.016 285.938)",600:"oklch(44.2% 0.017 285.786)",700:"oklch(37% 0.013 285.805)",800:"oklch(27.4% 0.006 286.033)",900:"oklch(21% 0.006 285.885)",950:"oklch(14.1% 0.005 285.823)"},neutral:{50:"oklch(98.5% 0 0)",100:"oklch(97% 0 0)",200:"oklch(92.2% 0 0)",300:"oklch(87% 0 0)",400:"oklch(70.8% 0 0)",500:"oklch(55.6% 0 0)",600:"oklch(43.9% 0 0)",700:"oklch(37.1% 0 0)",800:"oklch(26.9% 0 0)",900:"oklch(20.5% 0 0)",950:"oklch(14.5% 0 0)"},stone:{50:"oklch(98.5% 0.001 106.423)",100:"oklch(97% 0.001 106.424)",200:"oklch(92.3% 0.003 48.717)",300:"oklch(86.9% 0.005 56.366)",400:"oklch(70.9% 0.01 56.259)",500:"oklch(55.3% 0.013 58.071)",600:"oklch(44.4% 0.011 73.639)",700:"oklch(37.4% 0.01 67.558)",800:"oklch(26.8% 0.007 34.298)",900:"oklch(21.6% 0.006 56.043)",950:"oklch(14.7% 0.004 49.25)"},mauve:{50:"oklch(98.5% 0 0)",100:"oklch(96% 0.003 325.6)",200:"oklch(92.2% 0.005 325.62)",300:"oklch(86.5% 0.012 325.68)",400:"oklch(71.1% 0.019 323.02)",500:"oklch(54.2% 0.034 322.5)",600:"oklch(43.5% 0.029 321.78)",700:"oklch(36.4% 0.029 323.89)",800:"oklch(26.3% 0.024 320.12)",900:"oklch(21.2% 0.019 322.12)",950:"oklch(14.5% 0.008 326)"},olive:{50:"oklch(98.8% 0.003 106.5)",100:"oklch(96.6% 0.005 106.5)",200:"oklch(93% 0.007 106.5)",300:"oklch(88% 0.011 106.6)",400:"oklch(73.7% 0.021 106.9)",500:"oklch(58% 0.031 107.3)",600:"oklch(46.6% 0.025 107.3)",700:"oklch(39.4% 0.023 107.4)",800:"oklch(28.6% 0.016 107.4)",900:"oklch(22.8% 0.013 107.4)",950:"oklch(15.3% 0.006 107.1)"},mist:{50:"oklch(98.7% 0.002 197.1)",100:"oklch(96.3% 0.002 197.1)",200:"oklch(92.5% 0.005 214.3)",300:"oklch(87.2% 0.007 219.6)",400:"oklch(72.3% 0.014 214.4)",500:"oklch(56% 0.021 213.5)",600:"oklch(45% 0.017 213.2)",700:"oklch(37.8% 0.015 216)",800:"oklch(27.5% 0.011 216.9)",900:"oklch(21.8% 0.008 223.9)",950:"oklch(14.8% 0.004 228.8)"},taupe:{50:"oklch(98.6% 0.002 67.8)",100:"oklch(96% 0.002 17.2)",200:"oklch(92.2% 0.005 34.3)",300:"oklch(86.8% 0.007 39.5)",400:"oklch(71.4% 0.014 41.2)",500:"oklch(54.7% 0.021 43.1)",600:"oklch(43.8% 0.017 39.3)",700:"oklch(36.7% 0.016 35.7)",800:"oklch(26.8% 0.011 36.5)",900:"oklch(21.4% 0.009 43.1)",950:"oklch(14.7% 0.004 49.3)"}},tc={"220.9 39.3% 11%":"gray","210 20% 98%":"gray","12 76% 61%":"gray","220 70% 50%":"gray"},vi=new Map;for(let e of Ql)for(let t of Xl)vi.set(Ri(ec[e][t]),e);function Ci(e){let t=Ri(e);return t?vi.get(t)??tc[t]??null:null}function Ri(e){if(!e)return"";let t=e.trim().replace(/\s+/g," ").toLowerCase();if(!t.startsWith("oklch(")||!t.endsWith(")"))return t;let r=t.slice(6,-1).trim(),[o]=r.split(/\s*\/\s*/),n=o.split(/\s+/);if(n.length<3)return t;let i=ro(n[0],{percentage:!0}),s=ro(n[1]),c=ro(n[2]);return`oklch(${i} ${s} ${c})`}function ro(e,t={}){return t.percentage&&e.endsWith("%")?ki(Number.parseFloat(e)/100):ki(Number.parseFloat(e))}function ki(e){return Number.isNaN(e)?"":Number(e.toFixed(12)).toString()}import nc from"postcss";import{Node as Ue,Project as ic,ScriptKind as sc,SyntaxKind as Ct}from"ts-morph";var ac=new Set(jr),lc=new Set(Tr),cc=new Set(Or),fc=new Set(Ar),mc=new Set(Ht),pc=new Set(Fr),uc=new Set(Gt),dc=new Set(["eb-garamond","instrument-serif","lora","merriweather","playfair-display","noto-serif","roboto-slab"]),gc=new Set(["jetbrains-mono","geist-mono"]),Rt=["--font-sans","--font-serif","--font-mono"],$i=new Set(Rt),hc=[...Rt,"--font-heading"],Ei=new Set(hc),xi={appliedBodyVariable:null,variables:{}},yc={0:"none","0rem":"none","0.45rem":"small","0.625rem":"default","0.875rem":"large"};async function pr(e,t){let r=bc(e.style);if(!r)return{code:null,fallbacks:[],values:null};let o=Z[r],n=await wc(e.resolvedPaths.tailwindCss),i=fr(ac,e.tailwind.baseColor),s=Cc(n),c=Rc(n),a=fr(lc,e.iconLibrary),f=Si(n,xi),m=f??o.font,p=Ii(n,m,xi);if(!f||!p){let I=t;if(t===void 0)try{I=await F(e.resolvedPaths.cwd,{configCssFile:e.tailwind.css})}catch{I=null}let x=await $c(e,I);f??=Si(n,x),m=f??o.font,p??=Ii(n,m,x)}let u=Sc(p??o.fontHeading,m,o.fontHeading),h=xc(n.rootVars["--radius"]),g=fr(cc,e.menuAccent),y=fr(fc,e.menuColor),k={style:r,baseColor:i??o.baseColor,theme:s??o.theme,chartColor:c??o.chartColor,iconLibrary:a??o.iconLibrary,font:m,fontHeading:u,radius:h??o.radius,menuAccent:g??o.menuAccent,menuColor:y??o.menuColor},v=[!i&&"baseColor",!s&&"theme",!c&&"chartColor",!a&&"iconLibrary",!f&&"font",!p&&"fontHeading",!h&&"radius",!g&&"menuAccent",!y&&"menuColor"].filter(Boolean);return{code:fn(k),fallbacks:v,values:k}}async function wc(e){let t={darkVars:{},imports:[],rootVars:{},themeVars:{}};if(!e)return t;try{let r=await Pi.readFile(e,"utf8");return kc(r)}catch{return t}}function bc(e){if(!e)return null;let t=e.replace(/^(base|radix)-/,"");return t in Z?t:null}function kc(e){let t=nc.parse(e),r={darkVars:{},imports:[],rootVars:{},themeVars:{}};return t.walkAtRules("import",o=>{let n=vc(o.params);n&&r.imports.push(n)}),t.walkRules(o=>{let n=o.selector.split(",").map(i=>i.trim()).filter(Boolean);n.includes(":root")&&oo(o,r.rootVars),n.includes(".dark")&&oo(o,r.darkVars)}),t.walkAtRules("theme",o=>{o.params.trim()==="inline"&&oo(o,r.themeVars)}),r}function oo(e,t){for(let r of e.nodes??[])r.type!=="decl"||!r.prop.startsWith("--")||(t[r.prop]=r.value.trim())}function vc(e){let t=e.trim();return(t.match(/^url\((['"]?)(.+?)\1\)$/)??t.match(/^(['"])(.+?)\1$/))?.[2]??null}function Cc(e){let t=mr(e.rootVars["--primary"]);if(!t)return null;let r=e.darkVars["--primary"];return r?mr(r)===t?t:null:t}function Rc(e){let t=mr(e.rootVars["--chart-1"]);if(!t)return null;let r=e.darkVars["--chart-1"];return r?mr(r)===t?t:null:t}function mr(e){let t=Ci(e);return!t||!uc.has(t)?null:t}function xc(e){if(!e)return null;let t=ur(e);return yc[t]??null}function Si(e,t){for(let r of Rt){let o=Ti(e,r);if(o)return o}for(let r of Rt){let o=Ic(e.imports,r);if(o)return o}return Pc(t)}function Ii(e,t,r){let o=no(e,"--font-heading"),n=o?Oi(o):null;if(n)return n===t?"inherit":n;let i=r.variables["--font-heading"],s=ji(e,"--font-heading");if(!s)return i&&i!==t?i:null;let c=io(s);if(c&&$i.has(c)){let a=Ti(e,c),f=r.variables[c],m=a??f??null;return!m||m===t?"inherit":m}return c==="--font-heading"?i?i===t?"inherit":i:null:i&&i!==t?i:null}function Sc(e,t,r){let o=e===t?"inherit":e;return pc.has(o)?o:r}function no(e,t,r=new Set){if(r.has(t))return null;r.add(t);let o=ji(e,t);if(!o)return null;let n=io(o);return n?Ei.has(n)?no(e,n,r):null:o}function ji(e,t){let r=e.themeVars[t];return r&&io(r)!==t?r:e.rootVars[t]??r??null}function io(e){return ur(e).match(/^var\((--[a-z0-9-]+)\)$/)?.[1]??null}function Ti(e,t){let r=no(e,t),o=r?Oi(r):null;return o||null}function Ic(e,t){let r=e.flatMap(o=>{let n=Lc(o);return n&&Vc(n)===t?[n]:[]});return r.length===1?r[0]:null}function Pc(e){if(e.appliedBodyVariable&&e.variables[e.appliedBodyVariable])return e.variables[e.appliedBodyVariable]??null;let t=Rt.map(r=>e.variables[r]).filter(Boolean).filter((r,o,n)=>n.indexOf(r)===o);return t.length===1?t[0]:null}async function $c(e,t){let r={appliedBodyVariable:null,variables:{}};if(!t||t.framework.name!=="next-app"&&t.framework.name!=="next-pages")return r;let o=Ec(e,t);if(!o)return r;try{let n=await Pi.readFile(o,"utf8");return jc(n,t.framework.name)}catch{return r}}function Ec(e,t){let r=t.isTsx?"tsx":"jsx",o=t.framework.name==="next-app"?t.isSrcDir?[`src/app/layout.${r}`,`app/layout.${r}`]:[`app/layout.${r}`]:t.isSrcDir?[`src/pages/_app.${r}`,`pages/_app.${r}`]:[`pages/_app.${r}`];for(let n of o){let i=oc.join(e.resolvedPaths.cwd,n);if(rc(i))return i}return null}function jc(e,t){let o=new ic({compilerOptions:{}}).createSourceFile("font-source.tsx",e,{overwrite:!0,scriptKind:sc.TSX}),n=new Map;for(let c of o.getImportDeclarations())if(c.getModuleSpecifierValue()==="next/font/google")for(let a of c.getNamedImports()){let f=a.getName(),m=a.getAliasNode()?.getText()??f,p=_c(f);p&&n.set(m,p)}let i={},s=new Map;for(let c of o.getVariableStatements())for(let a of c.getDeclarations()){let f=a.getInitializer();if(!f?.isKind(Ct.CallExpression))continue;let m=n.get(f.getExpression().getText());if(!m)continue;let p=Tc(f);p&&(s.set(a.getName(),p),i[p]=m)}return{appliedBodyVariable:Fc(o,s,t),variables:i}}function Tc(e){let t=e.getArguments()[0];if(!t||!Ue.isObjectLiteralExpression(t))return null;let r=t.getProperty("variable");if(!r||!Ue.isPropertyAssignment(r))return null;let o=r.getInitializer();if(!o)return null;let n=Fi(o.getText());return Ei.has(n)?n:null}function Fc(e,t,r){let o=e.getDescendantsOfKind(Ct.JsxOpeningElement).filter(i=>r==="next-app"?i.getTagNameNode().getText()==="html":!0),n=new Set;for(let i of o){let s=i.getAttribute("className");if(!s||!Ue.isJsxAttribute(s))continue;let c=s.getInitializer();if(!c)continue;let a=Oc(c,t),f=Ac(c);if(f&&a.includes(f))return f;a.length===1&&n.add(a[0])}return n.size===1?Array.from(n)[0]:null}function Oc(e,t){let r=Ue.isJsxExpression(e)?[e.getExpression(),...e.getDescendantsOfKind(Ct.PropertyAccessExpression)].filter(Boolean):[],o=new Set;for(let n of r){if(!n||!Ue.isPropertyAccessExpression(n)||n.getName()!=="variable")continue;let i=n.getExpression().getText(),s=t.get(i);s&&$i.has(s)&&o.add(s)}return Array.from(o)}function Ac(e){let t=Nc(e);return/\bfont-sans\b/.test(t)?"--font-sans":/\bfont-serif\b/.test(t)?"--font-serif":/\bfont-mono\b/.test(t)?"--font-mono":null}function Nc(e){let t=[];(Ue.isStringLiteral(e)||Ue.isNoSubstitutionTemplateLiteral(e))&&t.push(e.getLiteralValue());for(let r of e.getDescendantsOfKind(Ct.StringLiteral))t.push(r.getLiteralValue());for(let r of e.getDescendantsOfKind(Ct.NoSubstitutionTemplateLiteral))t.push(r.getLiteralValue());return t.length>0?t.join(" "):e.getText()}function Fi(e){return e.replace(/^['"]|['"]$/g,"")}function Oi(e){if(!e)return null;let t=Fi(e.split(",")[0]?.trim()??"").replace(/\s+variable$/i,"").trim();return t?so(t.replace(/\s+/g,"-")):null}function Lc(e){if(!e)return null;let t=ur(e),r="@fontsource-variable/";return t.startsWith(r)?so(t.slice(r.length)):null}function _c(e){return e?so(e.replace(/_/g,"-")):null}function so(e){let t=ur(e);return mc.has(t)?t:null}function Vc(e){return gc.has(e)?"--font-mono":dc.has(e)?"--font-serif":"--font-sans"}function ur(e){return e?e.trim().replace(/\s+/g," ").replace(/\s*,\s*/g,", ").replace(/"/g,"'").toLowerCase():""}function fr(e,t){return t&&e.has(t)?t:null}import{Command as Uc}from"commander";var Ni=`${S}/code/apps/v4/registry/bases`,Li=new Uc().name("info").description("get information about your project").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("--json","output as JSON.",!1).action(async e=>{try{let t=Ai.resolve(e.cwd);if(!Dc(Ai.resolve(t,"components.json"))&&await M(t)){let c=await B(t);c.length>0&&(e.json?console.log(JSON.stringify({error:"monorepo_root",message:"You are running info from a monorepo root. Use the -c flag to specify a workspace.",targets:c.map(a=>a.name)},null,2)):W("info",c),process.exit(1))}let r=await F(t),o=await j(t),n=await He(t),i=Te(o?.style),s=await Bc(r,o,n,i);if(e.json){console.log(JSON.stringify(s,null,2));return}Wc(s)}catch(t){R(t)}});function Mc(e){if(!e)return{};let t={};for(let[r,o]of Object.entries(e))t[r]=typeof o=="string"?o:o.url;return t}async function Bc(e,t,r,o){let n=t?await pr(t,e):null;return{project:e?{framework:e.framework.label,frameworkName:e.framework.name,frameworkVersion:e.frameworkVersion??null,srcDirectory:e.isSrcDir,rsc:e.isRSC,typescript:e.isTsx,tailwindVersion:e.tailwindVersion??null,tailwindConfig:e.tailwindConfigFile??null,tailwindCss:e.tailwindCssFile??null,importAlias:e.aliasPrefix??null}:null,config:t?{style:t.style,base:o,rsc:t.rsc,typescript:t.tsx,iconLibrary:t.iconLibrary??null,rtl:t.rtl??!1,menuColor:t.menuColor??null,menuAccent:t.menuAccent??null,aliases:{components:t.aliases.components,utils:t.aliases.utils,ui:t.aliases.ui??null,lib:t.aliases.lib??null,hooks:t.aliases.hooks??null},resolvedPaths:{cwd:t.resolvedPaths.cwd,tailwindConfig:t.resolvedPaths.tailwindConfig||null,tailwindCss:t.resolvedPaths.tailwindCss||null,utils:t.resolvedPaths.utils,components:t.resolvedPaths.components,lib:t.resolvedPaths.lib,hooks:t.resolvedPaths.hooks,ui:t.resolvedPaths.ui},registries:Mc(t.registries)}:null,preset:n,components:r,links:{docs:`${S}/docs`,components:`${S}/docs/components/${o}/[component].md`,ui:`${Ni}/${o}/ui/[component].tsx`,examples:`${Ni}/${o}/examples/[component]-example.tsx`,schema:`${S}/schema.json`}}}function Wc(e){l.log(d.info("Project")),e.project?xe({framework:`${e.project.framework} (${e.project.frameworkName})`,frameworkVersion:e.project.frameworkVersion??"-",srcDirectory:e.project.srcDirectory?"Yes":"No",rsc:e.project.rsc?"Yes":"No",typescript:e.project.typescript?"Yes":"No",tailwindVersion:e.project.tailwindVersion??"-",tailwindConfig:e.project.tailwindConfig??"-",tailwindCss:e.project.tailwindCss??"-",importAlias:e.project.importAlias??"-"}):l.log(" No project info detected."),l.break(),l.log(d.info("Configuration")),e.config?(xe({style:e.config.style,base:e.config.base,rsc:e.config.rsc?"Yes":"No",typescript:e.config.typescript?"Yes":"No",iconLibrary:e.config.iconLibrary??"-",rtl:e.config.rtl?"Yes":"No",menuColor:e.config.menuColor??"-",menuAccent:e.config.menuAccent??"-"}),l.break(),dr(e.preset),l.break(),l.log(d.info("Aliases")),xe({components:e.config.aliases.components,utils:e.config.aliases.utils,ui:e.config.aliases.ui??"-",lib:e.config.aliases.lib??"-",hooks:e.config.aliases.hooks??"-"}),l.break(),l.log(d.info("Resolved Paths")),xe({cwd:e.config.resolvedPaths.cwd,tailwindConfig:e.config.resolvedPaths.tailwindConfig??"-",tailwindCss:e.config.resolvedPaths.tailwindCss??"-",utils:e.config.resolvedPaths.utils,components:e.config.resolvedPaths.components,lib:e.config.resolvedPaths.lib,hooks:e.config.resolvedPaths.hooks,ui:e.config.resolvedPaths.ui}),Object.keys(e.config.registries).length>0&&(l.break(),l.log("registries:"),xe(e.config.registries))):l.log(" No components.json found."),l.break(),l.log(d.info("Installed Components")),e.components.length>0?l.log(` ${e.components.join(", ")}`):l.log(" No components installed."),l.break(),l.log(d.info("Links")),xe(e.links),l.break()}function dr(e,t={}){if(l.log(d.info("Preset")),!e?.code)xe({code:"-"});else{let r=e.fallbacks??[],o=(n,i)=>{let s=r.includes(n)?"*":"";return`${i??"-"}${s}`};xe({code:e.code,version:e.code[0],style:e.values?.style??"-",baseColor:o("baseColor",e.values?.baseColor),theme:o("theme",e.values?.theme),chartColor:o("chartColor",e.values?.chartColor),iconLibrary:o("iconLibrary",e.values?.iconLibrary),font:o("font",e.values?.font),fontHeading:o("fontHeading",e.values?.fontHeading),radius:o("radius",e.values?.radius),menuAccent:o("menuAccent",e.values?.menuAccent),menuColor:o("menuColor",e.values?.menuColor),url:`${S}/create?preset=${e.code}`}),r.length>0&&(l.log(""),l.log(t.fallbackNote??" * Uses preset defaults for values not available as options on love-ui create."))}}function xe(e){let t=Math.max(...Object.keys(e).map(r=>r.length));for(let[r,o]of Object.entries(e))l.log(` ${r.padEnd(t+2)}${o}`)}import{promises as _i}from"fs";import Vi from"path";import{StdioServerTransport as zc}from"@modelcontextprotocol/sdk/server/stdio.js";import{Command as Jc}from"commander";import Gc from"deepmerge";import{execa as Di}from"execa";import Hc from"fs-extra";import Kc from"prompts";import ao from"zod";var Me="latest",hr=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{loveui:{command:"npx",args:[`love-ui@${Me}`,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{loveui:{command:"npx",args:[`love-ui@${Me}`,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{loveui:{command:"npx",args:[`love-ui@${Me}`,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.loveui]
|
|
158
|
+
`),await to.writeFile(r,n,"utf8"),f?.succeed(),sc(i)){let m=b(`Removing ${d.info("love-ui")}.`,{silent:e.silent})?.start();await lc(e.cwd),m?.succeed()}else e.silent||l.warn(`The ${d.info("love-ui")} package was not found in package.json. Skipped removal.`);l.break(),l.log(`Ejected ${d.info("love-ui/tailwind.css")} into ${d.info(o)}.`),l.break()}function ic(e){return e?(e.dependencies?.["love-ui"]??e.devDependencies?.["love-ui"]??"unknown").replace(/^[\^~]/,"").trim():"unknown"}function sc(e){return e?!!(e.dependencies?.["love-ui"]||e.devDependencies?.["love-ui"]):!1}function ac(e){let t=te.join(e,"node_modules/love-ui/dist/tailwind.css");if(Ct.existsSync(t))return t;let r=process.argv[1]?te.dirname(te.resolve(process.argv[1])):e;for(let o of[te.join(r,"tailwind.css"),te.join(r,"dist","tailwind.css"),te.join(r,"src","tailwind.css"),te.join(process.cwd(),"src/tailwind.css"),te.join(process.cwd(),"dist/tailwind.css")])if(Ct.existsSync(o))return o;throw new Error("Could not resolve love-ui/tailwind.css.")}async function lc(e){switch(await ce(e)){case"npm":await cr("npm",["uninstall","love-ui"],{cwd:e});break;case"pnpm":await cr("pnpm",["remove","love-ui"],{cwd:e});break;case"yarn":await cr("yarn",["remove","love-ui"],{cwd:e});break;case"bun":await cr("bun",["remove","love-ui"],{cwd:e});break;case"deno":{let r=te.join(e,"package.json"),o=await Ct.readJson(r);for(let n of["dependencies","devDependencies"])o[n]?.["love-ui"]&&delete o[n]["love-ui"];await Ct.writeJson(r,o,{spaces:2});break}}}import{existsSync as qc}from"fs";import Mi from"path";import{existsSync as uc,promises as Ai}from"fs";import dc from"path";var cc=["50","100","200","300","400","500","600","700","800","900","950"],fc=["red","orange","amber","yellow","lime","green","emerald","teal","cyan","sky","blue","indigo","violet","purple","fuchsia","pink","rose","slate","gray","zinc","neutral","stone","mauve","olive","mist","taupe"],mc={red:{50:"oklch(97.1% 0.013 17.38)",100:"oklch(93.6% 0.032 17.717)",200:"oklch(88.5% 0.062 18.334)",300:"oklch(80.8% 0.114 19.571)",400:"oklch(70.4% 0.191 22.216)",500:"oklch(63.7% 0.237 25.331)",600:"oklch(57.7% 0.245 27.325)",700:"oklch(50.5% 0.213 27.518)",800:"oklch(44.4% 0.177 26.899)",900:"oklch(39.6% 0.141 25.723)",950:"oklch(25.8% 0.092 26.042)"},orange:{50:"oklch(98% 0.016 73.684)",100:"oklch(95.4% 0.038 75.164)",200:"oklch(90.1% 0.076 70.697)",300:"oklch(83.7% 0.128 66.29)",400:"oklch(75% 0.183 55.934)",500:"oklch(70.5% 0.213 47.604)",600:"oklch(64.6% 0.222 41.116)",700:"oklch(55.3% 0.195 38.402)",800:"oklch(47% 0.157 37.304)",900:"oklch(40.8% 0.123 38.172)",950:"oklch(26.6% 0.079 36.259)"},amber:{50:"oklch(98.7% 0.022 95.277)",100:"oklch(96.2% 0.059 95.617)",200:"oklch(92.4% 0.12 95.746)",300:"oklch(87.9% 0.169 91.605)",400:"oklch(82.8% 0.189 84.429)",500:"oklch(76.9% 0.188 70.08)",600:"oklch(66.6% 0.179 58.318)",700:"oklch(55.5% 0.163 48.998)",800:"oklch(47.3% 0.137 46.201)",900:"oklch(41.4% 0.112 45.904)",950:"oklch(27.9% 0.077 45.635)"},yellow:{50:"oklch(98.7% 0.026 102.212)",100:"oklch(97.3% 0.071 103.193)",200:"oklch(94.5% 0.129 101.54)",300:"oklch(90.5% 0.182 98.111)",400:"oklch(85.2% 0.199 91.936)",500:"oklch(79.5% 0.184 86.047)",600:"oklch(68.1% 0.162 75.834)",700:"oklch(55.4% 0.135 66.442)",800:"oklch(47.6% 0.114 61.907)",900:"oklch(42.1% 0.095 57.708)",950:"oklch(28.6% 0.066 53.813)"},lime:{50:"oklch(98.6% 0.031 120.757)",100:"oklch(96.7% 0.067 122.328)",200:"oklch(93.8% 0.127 124.321)",300:"oklch(89.7% 0.196 126.665)",400:"oklch(84.1% 0.238 128.85)",500:"oklch(76.8% 0.233 130.85)",600:"oklch(64.8% 0.2 131.684)",700:"oklch(53.2% 0.157 131.589)",800:"oklch(45.3% 0.124 130.933)",900:"oklch(40.5% 0.101 131.063)",950:"oklch(27.4% 0.072 132.109)"},green:{50:"oklch(98.2% 0.018 155.826)",100:"oklch(96.2% 0.044 156.743)",200:"oklch(92.5% 0.084 155.995)",300:"oklch(87.1% 0.15 154.449)",400:"oklch(79.2% 0.209 151.711)",500:"oklch(72.3% 0.219 149.579)",600:"oklch(62.7% 0.194 149.214)",700:"oklch(52.7% 0.154 150.069)",800:"oklch(44.8% 0.119 151.328)",900:"oklch(39.3% 0.095 152.535)",950:"oklch(26.6% 0.065 152.934)"},emerald:{50:"oklch(97.9% 0.021 166.113)",100:"oklch(95% 0.052 163.051)",200:"oklch(90.5% 0.093 164.15)",300:"oklch(84.5% 0.143 164.978)",400:"oklch(76.5% 0.177 163.223)",500:"oklch(69.6% 0.17 162.48)",600:"oklch(59.6% 0.145 163.225)",700:"oklch(50.8% 0.118 165.612)",800:"oklch(43.2% 0.095 166.913)",900:"oklch(37.8% 0.077 168.94)",950:"oklch(26.2% 0.051 172.552)"},teal:{50:"oklch(98.4% 0.014 180.72)",100:"oklch(95.3% 0.051 180.801)",200:"oklch(91% 0.096 180.426)",300:"oklch(85.5% 0.138 181.071)",400:"oklch(77.7% 0.152 181.912)",500:"oklch(70.4% 0.14 182.503)",600:"oklch(60% 0.118 184.704)",700:"oklch(51.1% 0.096 186.391)",800:"oklch(43.7% 0.078 188.216)",900:"oklch(38.6% 0.063 188.416)",950:"oklch(27.7% 0.046 192.524)"},cyan:{50:"oklch(98.4% 0.019 200.873)",100:"oklch(95.6% 0.045 203.388)",200:"oklch(91.7% 0.08 205.041)",300:"oklch(86.5% 0.127 207.078)",400:"oklch(78.9% 0.154 211.53)",500:"oklch(71.5% 0.143 215.221)",600:"oklch(60.9% 0.126 221.723)",700:"oklch(52% 0.105 223.128)",800:"oklch(45% 0.085 224.283)",900:"oklch(39.8% 0.07 227.392)",950:"oklch(30.2% 0.056 229.695)"},sky:{50:"oklch(97.7% 0.013 236.62)",100:"oklch(95.1% 0.026 236.824)",200:"oklch(90.1% 0.058 230.902)",300:"oklch(82.8% 0.111 230.318)",400:"oklch(74.6% 0.16 232.661)",500:"oklch(68.5% 0.169 237.323)",600:"oklch(58.8% 0.158 241.966)",700:"oklch(50% 0.134 242.749)",800:"oklch(44.3% 0.11 240.79)",900:"oklch(39.1% 0.09 240.876)",950:"oklch(29.3% 0.066 243.157)"},blue:{50:"oklch(97% 0.014 254.604)",100:"oklch(93.2% 0.032 255.585)",200:"oklch(88.2% 0.059 254.128)",300:"oklch(80.9% 0.105 251.813)",400:"oklch(70.7% 0.165 254.624)",500:"oklch(62.3% 0.214 259.815)",600:"oklch(54.6% 0.245 262.881)",700:"oklch(48.8% 0.243 264.376)",800:"oklch(42.4% 0.199 265.638)",900:"oklch(37.9% 0.146 265.522)",950:"oklch(28.2% 0.091 267.935)"},indigo:{50:"oklch(96.2% 0.018 272.314)",100:"oklch(93% 0.034 272.788)",200:"oklch(87% 0.065 274.039)",300:"oklch(78.5% 0.115 274.713)",400:"oklch(67.3% 0.182 276.935)",500:"oklch(58.5% 0.233 277.117)",600:"oklch(51.1% 0.262 276.966)",700:"oklch(45.7% 0.24 277.023)",800:"oklch(39.8% 0.195 277.366)",900:"oklch(35.9% 0.144 278.697)",950:"oklch(25.7% 0.09 281.288)"},violet:{50:"oklch(96.9% 0.016 293.756)",100:"oklch(94.3% 0.029 294.588)",200:"oklch(89.4% 0.057 293.283)",300:"oklch(81.1% 0.111 293.571)",400:"oklch(70.2% 0.183 293.541)",500:"oklch(60.6% 0.25 292.717)",600:"oklch(54.1% 0.281 293.009)",700:"oklch(49.1% 0.27 292.581)",800:"oklch(43.2% 0.232 292.759)",900:"oklch(38% 0.189 293.745)",950:"oklch(28.3% 0.141 291.089)"},purple:{50:"oklch(97.7% 0.014 308.299)",100:"oklch(94.6% 0.033 307.174)",200:"oklch(90.2% 0.063 306.703)",300:"oklch(82.7% 0.119 306.383)",400:"oklch(71.4% 0.203 305.504)",500:"oklch(62.7% 0.265 303.9)",600:"oklch(55.8% 0.288 302.321)",700:"oklch(49.6% 0.265 301.924)",800:"oklch(43.8% 0.218 303.724)",900:"oklch(38.1% 0.176 304.987)",950:"oklch(29.1% 0.149 302.717)"},fuchsia:{50:"oklch(97.7% 0.017 320.058)",100:"oklch(95.2% 0.037 318.852)",200:"oklch(90.3% 0.076 319.62)",300:"oklch(83.3% 0.145 321.434)",400:"oklch(74% 0.238 322.16)",500:"oklch(66.7% 0.295 322.15)",600:"oklch(59.1% 0.293 322.896)",700:"oklch(51.8% 0.253 323.949)",800:"oklch(45.2% 0.211 324.591)",900:"oklch(40.1% 0.17 325.612)",950:"oklch(29.3% 0.136 325.661)"},pink:{50:"oklch(97.1% 0.014 343.198)",100:"oklch(94.8% 0.028 342.258)",200:"oklch(89.9% 0.061 343.231)",300:"oklch(82.3% 0.12 346.018)",400:"oklch(71.8% 0.202 349.761)",500:"oklch(65.6% 0.241 354.308)",600:"oklch(59.2% 0.249 0.584)",700:"oklch(52.5% 0.223 3.958)",800:"oklch(45.9% 0.187 3.815)",900:"oklch(40.8% 0.153 2.432)",950:"oklch(28.4% 0.109 3.907)"},rose:{50:"oklch(96.9% 0.015 12.422)",100:"oklch(94.1% 0.03 12.58)",200:"oklch(89.2% 0.058 10.001)",300:"oklch(81% 0.117 11.638)",400:"oklch(71.2% 0.194 13.428)",500:"oklch(64.5% 0.246 16.439)",600:"oklch(58.6% 0.253 17.585)",700:"oklch(51.4% 0.222 16.935)",800:"oklch(45.5% 0.188 13.697)",900:"oklch(41% 0.159 10.272)",950:"oklch(27.1% 0.105 12.094)"},slate:{50:"oklch(98.4% 0.003 247.858)",100:"oklch(96.8% 0.007 247.896)",200:"oklch(92.9% 0.013 255.508)",300:"oklch(86.9% 0.022 252.894)",400:"oklch(70.4% 0.04 256.788)",500:"oklch(55.4% 0.046 257.417)",600:"oklch(44.6% 0.043 257.281)",700:"oklch(37.2% 0.044 257.287)",800:"oklch(27.9% 0.041 260.031)",900:"oklch(20.8% 0.042 265.755)",950:"oklch(12.9% 0.042 264.695)"},gray:{50:"oklch(98.5% 0.002 247.839)",100:"oklch(96.7% 0.003 264.542)",200:"oklch(92.8% 0.006 264.531)",300:"oklch(87.2% 0.01 258.338)",400:"oklch(70.7% 0.022 261.325)",500:"oklch(55.1% 0.027 264.364)",600:"oklch(44.6% 0.03 256.802)",700:"oklch(37.3% 0.034 259.733)",800:"oklch(27.8% 0.033 256.848)",900:"oklch(21% 0.034 264.665)",950:"oklch(13% 0.028 261.692)"},zinc:{50:"oklch(98.5% 0 0)",100:"oklch(96.7% 0.001 286.375)",200:"oklch(92% 0.004 286.32)",300:"oklch(87.1% 0.006 286.286)",400:"oklch(70.5% 0.015 286.067)",500:"oklch(55.2% 0.016 285.938)",600:"oklch(44.2% 0.017 285.786)",700:"oklch(37% 0.013 285.805)",800:"oklch(27.4% 0.006 286.033)",900:"oklch(21% 0.006 285.885)",950:"oklch(14.1% 0.005 285.823)"},neutral:{50:"oklch(98.5% 0 0)",100:"oklch(97% 0 0)",200:"oklch(92.2% 0 0)",300:"oklch(87% 0 0)",400:"oklch(70.8% 0 0)",500:"oklch(55.6% 0 0)",600:"oklch(43.9% 0 0)",700:"oklch(37.1% 0 0)",800:"oklch(26.9% 0 0)",900:"oklch(20.5% 0 0)",950:"oklch(14.5% 0 0)"},stone:{50:"oklch(98.5% 0.001 106.423)",100:"oklch(97% 0.001 106.424)",200:"oklch(92.3% 0.003 48.717)",300:"oklch(86.9% 0.005 56.366)",400:"oklch(70.9% 0.01 56.259)",500:"oklch(55.3% 0.013 58.071)",600:"oklch(44.4% 0.011 73.639)",700:"oklch(37.4% 0.01 67.558)",800:"oklch(26.8% 0.007 34.298)",900:"oklch(21.6% 0.006 56.043)",950:"oklch(14.7% 0.004 49.25)"},mauve:{50:"oklch(98.5% 0 0)",100:"oklch(96% 0.003 325.6)",200:"oklch(92.2% 0.005 325.62)",300:"oklch(86.5% 0.012 325.68)",400:"oklch(71.1% 0.019 323.02)",500:"oklch(54.2% 0.034 322.5)",600:"oklch(43.5% 0.029 321.78)",700:"oklch(36.4% 0.029 323.89)",800:"oklch(26.3% 0.024 320.12)",900:"oklch(21.2% 0.019 322.12)",950:"oklch(14.5% 0.008 326)"},olive:{50:"oklch(98.8% 0.003 106.5)",100:"oklch(96.6% 0.005 106.5)",200:"oklch(93% 0.007 106.5)",300:"oklch(88% 0.011 106.6)",400:"oklch(73.7% 0.021 106.9)",500:"oklch(58% 0.031 107.3)",600:"oklch(46.6% 0.025 107.3)",700:"oklch(39.4% 0.023 107.4)",800:"oklch(28.6% 0.016 107.4)",900:"oklch(22.8% 0.013 107.4)",950:"oklch(15.3% 0.006 107.1)"},mist:{50:"oklch(98.7% 0.002 197.1)",100:"oklch(96.3% 0.002 197.1)",200:"oklch(92.5% 0.005 214.3)",300:"oklch(87.2% 0.007 219.6)",400:"oklch(72.3% 0.014 214.4)",500:"oklch(56% 0.021 213.5)",600:"oklch(45% 0.017 213.2)",700:"oklch(37.8% 0.015 216)",800:"oklch(27.5% 0.011 216.9)",900:"oklch(21.8% 0.008 223.9)",950:"oklch(14.8% 0.004 228.8)"},taupe:{50:"oklch(98.6% 0.002 67.8)",100:"oklch(96% 0.002 17.2)",200:"oklch(92.2% 0.005 34.3)",300:"oklch(86.8% 0.007 39.5)",400:"oklch(71.4% 0.014 41.2)",500:"oklch(54.7% 0.021 43.1)",600:"oklch(43.8% 0.017 39.3)",700:"oklch(36.7% 0.016 35.7)",800:"oklch(26.8% 0.011 36.5)",900:"oklch(21.4% 0.009 43.1)",950:"oklch(14.7% 0.004 49.3)"}},pc={"220.9 39.3% 11%":"gray","210 20% 98%":"gray","12 76% 61%":"gray","220 70% 50%":"gray"},Ei=new Map;for(let e of fc)for(let t of cc)Ei.set(ji(mc[e][t]),e);function $i(e){let t=ji(e);return t?Ei.get(t)??pc[t]??null:null}function ji(e){if(!e)return"";let t=e.trim().replace(/\s+/g," ").toLowerCase();if(!t.startsWith("oklch(")||!t.endsWith(")"))return t;let r=t.slice(6,-1).trim(),[o]=r.split(/\s*\/\s*/),n=o.split(/\s+/);if(n.length<3)return t;let i=ro(n[0],{percentage:!0}),s=ro(n[1]),c=ro(n[2]);return`oklch(${i} ${s} ${c})`}function ro(e,t={}){return t.percentage&&e.endsWith("%")?Pi(Number.parseFloat(e)/100):Pi(Number.parseFloat(e))}function Pi(e){return Number.isNaN(e)?"":Number(e.toFixed(12)).toString()}import gc from"postcss";import{Node as Ue,Project as hc,ScriptKind as yc,SyntaxKind as Rt}from"ts-morph";var wc=new Set(Tr),bc=new Set(Fr),kc=new Set(Ar),vc=new Set(Nr),Cc=new Set(Kt),Rc=new Set(Or),xc=new Set(Ht),Sc=new Set(["eb-garamond","instrument-serif","lora","merriweather","playfair-display","noto-serif","roboto-slab"]),Ic=new Set(["jetbrains-mono","geist-mono"]),xt=["--font-sans","--font-serif","--font-mono"],Ni=new Set(xt),Pc=[...xt,"--font-heading"],Li=new Set(Pc),Ti={appliedBodyVariable:null,variables:{}},Ec={0:"none","0rem":"none","0.45rem":"small","0.625rem":"default","0.875rem":"large"};async function ur(e,t){let r=jc(e.style);if(!r)return{code:null,fallbacks:[],values:null};let o=Z[r],n=await $c(e.resolvedPaths.tailwindCss),i=mr(wc,e.tailwind.baseColor),s=Oc(n),c=Ac(n),a=mr(bc,e.iconLibrary),f=Fi(n,Ti),m=f??o.font,p=Oi(n,m,Ti);if(!f||!p){let I=t;if(t===void 0)try{I=await F(e.resolvedPaths.cwd,{configCssFile:e.tailwind.css})}catch{I=null}let x=await Dc(e,I);f??=Fi(n,x),m=f??o.font,p??=Oi(n,m,x)}let u=Lc(p??o.fontHeading,m,o.fontHeading),h=Nc(n.rootVars["--radius"]),g=mr(kc,e.menuAccent),y=mr(vc,e.menuColor),k={style:r,baseColor:i??o.baseColor,theme:s??o.theme,chartColor:c??o.chartColor,iconLibrary:a??o.iconLibrary,font:m,fontHeading:u,radius:h??o.radius,menuAccent:g??o.menuAccent,menuColor:y??o.menuColor},v=[!i&&"baseColor",!s&&"theme",!c&&"chartColor",!a&&"iconLibrary",!f&&"font",!p&&"fontHeading",!h&&"radius",!g&&"menuAccent",!y&&"menuColor"].filter(Boolean);return{code:hn(k),fallbacks:v,values:k}}async function $c(e){let t={darkVars:{},imports:[],rootVars:{},themeVars:{}};if(!e)return t;try{let r=await Ai.readFile(e,"utf8");return Tc(r)}catch{return t}}function jc(e){if(!e)return null;let t=e.replace(/^(base|radix)-/,"");return t in Z?t:null}function Tc(e){let t=gc.parse(e),r={darkVars:{},imports:[],rootVars:{},themeVars:{}};return t.walkAtRules("import",o=>{let n=Fc(o.params);n&&r.imports.push(n)}),t.walkRules(o=>{let n=o.selector.split(",").map(i=>i.trim()).filter(Boolean);n.includes(":root")&&oo(o,r.rootVars),n.includes(".dark")&&oo(o,r.darkVars)}),t.walkAtRules("theme",o=>{o.params.trim()==="inline"&&oo(o,r.themeVars)}),r}function oo(e,t){for(let r of e.nodes??[])r.type!=="decl"||!r.prop.startsWith("--")||(t[r.prop]=r.value.trim())}function Fc(e){let t=e.trim();return(t.match(/^url\((['"]?)(.+?)\1\)$/)??t.match(/^(['"])(.+?)\1$/))?.[2]??null}function Oc(e){let t=pr(e.rootVars["--primary"]);if(!t)return null;let r=e.darkVars["--primary"];return r?pr(r)===t?t:null:t}function Ac(e){let t=pr(e.rootVars["--chart-1"]);if(!t)return null;let r=e.darkVars["--chart-1"];return r?pr(r)===t?t:null:t}function pr(e){let t=$i(e);return!t||!xc.has(t)?null:t}function Nc(e){if(!e)return null;let t=dr(e);return Ec[t]??null}function Fi(e,t){for(let r of xt){let o=Vi(e,r);if(o)return o}for(let r of xt){let o=_c(e.imports,r);if(o)return o}return Vc(t)}function Oi(e,t,r){let o=no(e,"--font-heading"),n=o?Ui(o):null;if(n)return n===t?"inherit":n;let i=r.variables["--font-heading"],s=_i(e,"--font-heading");if(!s)return i&&i!==t?i:null;let c=io(s);if(c&&Ni.has(c)){let a=Vi(e,c),f=r.variables[c],m=a??f??null;return!m||m===t?"inherit":m}return c==="--font-heading"?i?i===t?"inherit":i:null:i&&i!==t?i:null}function Lc(e,t,r){let o=e===t?"inherit":e;return Rc.has(o)?o:r}function no(e,t,r=new Set){if(r.has(t))return null;r.add(t);let o=_i(e,t);if(!o)return null;let n=io(o);return n?Li.has(n)?no(e,n,r):null:o}function _i(e,t){let r=e.themeVars[t];return r&&io(r)!==t?r:e.rootVars[t]??r??null}function io(e){return dr(e).match(/^var\((--[a-z0-9-]+)\)$/)?.[1]??null}function Vi(e,t){let r=no(e,t),o=r?Ui(r):null;return o||null}function _c(e,t){let r=e.flatMap(o=>{let n=Hc(o);return n&&Yc(n)===t?[n]:[]});return r.length===1?r[0]:null}function Vc(e){if(e.appliedBodyVariable&&e.variables[e.appliedBodyVariable])return e.variables[e.appliedBodyVariable]??null;let t=xt.map(r=>e.variables[r]).filter(Boolean).filter((r,o,n)=>n.indexOf(r)===o);return t.length===1?t[0]:null}async function Dc(e,t){let r={appliedBodyVariable:null,variables:{}};if(!t||t.framework.name!=="next-app"&&t.framework.name!=="next-pages")return r;let o=Uc(e,t);if(!o)return r;try{let n=await Ai.readFile(o,"utf8");return Mc(n,t.framework.name)}catch{return r}}function Uc(e,t){let r=t.isTsx?"tsx":"jsx",o=t.framework.name==="next-app"?t.isSrcDir?[`src/app/layout.${r}`,`app/layout.${r}`]:[`app/layout.${r}`]:t.isSrcDir?[`src/pages/_app.${r}`,`pages/_app.${r}`]:[`pages/_app.${r}`];for(let n of o){let i=dc.join(e.resolvedPaths.cwd,n);if(uc(i))return i}return null}function Mc(e,t){let o=new hc({compilerOptions:{}}).createSourceFile("font-source.tsx",e,{overwrite:!0,scriptKind:yc.TSX}),n=new Map;for(let c of o.getImportDeclarations())if(c.getModuleSpecifierValue()==="next/font/google")for(let a of c.getNamedImports()){let f=a.getName(),m=a.getAliasNode()?.getText()??f,p=Kc(f);p&&n.set(m,p)}let i={},s=new Map;for(let c of o.getVariableStatements())for(let a of c.getDeclarations()){let f=a.getInitializer();if(!f?.isKind(Rt.CallExpression))continue;let m=n.get(f.getExpression().getText());if(!m)continue;let p=Bc(f);p&&(s.set(a.getName(),p),i[p]=m)}return{appliedBodyVariable:Wc(o,s,t),variables:i}}function Bc(e){let t=e.getArguments()[0];if(!t||!Ue.isObjectLiteralExpression(t))return null;let r=t.getProperty("variable");if(!r||!Ue.isPropertyAssignment(r))return null;let o=r.getInitializer();if(!o)return null;let n=Di(o.getText());return Li.has(n)?n:null}function Wc(e,t,r){let o=e.getDescendantsOfKind(Rt.JsxOpeningElement).filter(i=>r==="next-app"?i.getTagNameNode().getText()==="html":!0),n=new Set;for(let i of o){let s=i.getAttribute("className");if(!s||!Ue.isJsxAttribute(s))continue;let c=s.getInitializer();if(!c)continue;let a=zc(c,t),f=Jc(c);if(f&&a.includes(f))return f;a.length===1&&n.add(a[0])}return n.size===1?Array.from(n)[0]:null}function zc(e,t){let r=Ue.isJsxExpression(e)?[e.getExpression(),...e.getDescendantsOfKind(Rt.PropertyAccessExpression)].filter(Boolean):[],o=new Set;for(let n of r){if(!n||!Ue.isPropertyAccessExpression(n)||n.getName()!=="variable")continue;let i=n.getExpression().getText(),s=t.get(i);s&&Ni.has(s)&&o.add(s)}return Array.from(o)}function Jc(e){let t=Gc(e);return/\bfont-sans\b/.test(t)?"--font-sans":/\bfont-serif\b/.test(t)?"--font-serif":/\bfont-mono\b/.test(t)?"--font-mono":null}function Gc(e){let t=[];(Ue.isStringLiteral(e)||Ue.isNoSubstitutionTemplateLiteral(e))&&t.push(e.getLiteralValue());for(let r of e.getDescendantsOfKind(Rt.StringLiteral))t.push(r.getLiteralValue());for(let r of e.getDescendantsOfKind(Rt.NoSubstitutionTemplateLiteral))t.push(r.getLiteralValue());return t.length>0?t.join(" "):e.getText()}function Di(e){return e.replace(/^['"]|['"]$/g,"")}function Ui(e){if(!e)return null;let t=Di(e.split(",")[0]?.trim()??"").replace(/\s+variable$/i,"").trim();return t?so(t.replace(/\s+/g,"-")):null}function Hc(e){if(!e)return null;let t=dr(e),r="@fontsource-variable/";return t.startsWith(r)?so(t.slice(r.length)):null}function Kc(e){return e?so(e.replace(/_/g,"-")):null}function so(e){let t=dr(e);return Cc.has(t)?t:null}function Yc(e){return Ic.has(e)?"--font-mono":Sc.has(e)?"--font-serif":"--font-sans"}function dr(e){return e?e.trim().replace(/\s+/g," ").replace(/\s*,\s*/g,", ").replace(/"/g,"'").toLowerCase():""}function mr(e,t){return t&&e.has(t)?t:null}import{Command as Zc}from"commander";var Bi=`${S}/code/apps/v4/registry/bases`,Wi=new Zc().name("info").description("get information about your project").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("--json","output as JSON.",!1).action(async e=>{try{let t=Mi.resolve(e.cwd);if(!qc(Mi.resolve(t,"components.json"))&&await M(t)){let c=await B(t);c.length>0&&(e.json?console.log(JSON.stringify({error:"monorepo_root",message:"You are running info from a monorepo root. Use the -c flag to specify a workspace.",targets:c.map(a=>a.name)},null,2)):W("info",c),process.exit(1))}let r=await F(t),o=await j(t),n=await Ke(t),i=je(o?.style),s=await Qc(r,o,n,i);if(e.json){console.log(JSON.stringify(s,null,2));return}ef(s)}catch(t){R(t)}});function Xc(e){if(!e)return{};let t={};for(let[r,o]of Object.entries(e))t[r]=typeof o=="string"?o:o.url;return t}async function Qc(e,t,r,o){let n=t?await ur(t,e):null;return{project:e?{framework:e.framework.label,frameworkName:e.framework.name,frameworkVersion:e.frameworkVersion??null,srcDirectory:e.isSrcDir,rsc:e.isRSC,typescript:e.isTsx,tailwindVersion:e.tailwindVersion??null,tailwindConfig:e.tailwindConfigFile??null,tailwindCss:e.tailwindCssFile??null,importAlias:e.aliasPrefix??null}:null,config:t?{style:t.style,base:o,rsc:t.rsc,typescript:t.tsx,iconLibrary:t.iconLibrary??null,rtl:t.rtl??!1,menuColor:t.menuColor??null,menuAccent:t.menuAccent??null,aliases:{components:t.aliases.components,utils:t.aliases.utils,ui:t.aliases.ui??null,lib:t.aliases.lib??null,hooks:t.aliases.hooks??null},resolvedPaths:{cwd:t.resolvedPaths.cwd,tailwindConfig:t.resolvedPaths.tailwindConfig||null,tailwindCss:t.resolvedPaths.tailwindCss||null,utils:t.resolvedPaths.utils,components:t.resolvedPaths.components,lib:t.resolvedPaths.lib,hooks:t.resolvedPaths.hooks,ui:t.resolvedPaths.ui},registries:Xc(t.registries)}:null,preset:n,components:r,links:{docs:`${S}/docs`,components:`${S}/docs/components/${o}/[component].md`,ui:`${Bi}/${o}/ui/[component].tsx`,examples:`${Bi}/${o}/examples/[component]-example.tsx`,schema:`${S}/schema.json`}}}function ef(e){l.log(d.info("Project")),e.project?Re({framework:`${e.project.framework} (${e.project.frameworkName})`,frameworkVersion:e.project.frameworkVersion??"-",srcDirectory:e.project.srcDirectory?"Yes":"No",rsc:e.project.rsc?"Yes":"No",typescript:e.project.typescript?"Yes":"No",tailwindVersion:e.project.tailwindVersion??"-",tailwindConfig:e.project.tailwindConfig??"-",tailwindCss:e.project.tailwindCss??"-",importAlias:e.project.importAlias??"-"}):l.log(" No project info detected."),l.break(),l.log(d.info("Configuration")),e.config?(Re({style:e.config.style,base:e.config.base,rsc:e.config.rsc?"Yes":"No",typescript:e.config.typescript?"Yes":"No",iconLibrary:e.config.iconLibrary??"-",rtl:e.config.rtl?"Yes":"No",menuColor:e.config.menuColor??"-",menuAccent:e.config.menuAccent??"-"}),l.break(),gr(e.preset),l.break(),l.log(d.info("Aliases")),Re({components:e.config.aliases.components,utils:e.config.aliases.utils,ui:e.config.aliases.ui??"-",lib:e.config.aliases.lib??"-",hooks:e.config.aliases.hooks??"-"}),l.break(),l.log(d.info("Resolved Paths")),Re({cwd:e.config.resolvedPaths.cwd,tailwindConfig:e.config.resolvedPaths.tailwindConfig??"-",tailwindCss:e.config.resolvedPaths.tailwindCss??"-",utils:e.config.resolvedPaths.utils,components:e.config.resolvedPaths.components,lib:e.config.resolvedPaths.lib,hooks:e.config.resolvedPaths.hooks,ui:e.config.resolvedPaths.ui}),Object.keys(e.config.registries).length>0&&(l.break(),l.log("registries:"),Re(e.config.registries))):l.log(" No components.json found."),l.break(),l.log(d.info("Installed Components")),e.components.length>0?l.log(` ${e.components.join(", ")}`):l.log(" No components installed."),l.break(),l.log(d.info("Links")),Re(e.links),l.break()}function gr(e,t={}){if(l.log(d.info("Preset")),!e?.code)Re({code:"-"});else{let r=e.fallbacks??[],o=(n,i)=>{let s=r.includes(n)?"*":"";return`${i??"-"}${s}`};Re({code:e.code,version:e.code[0],style:e.values?.style??"-",baseColor:o("baseColor",e.values?.baseColor),theme:o("theme",e.values?.theme),chartColor:o("chartColor",e.values?.chartColor),iconLibrary:o("iconLibrary",e.values?.iconLibrary),font:o("font",e.values?.font),fontHeading:o("fontHeading",e.values?.fontHeading),radius:o("radius",e.values?.radius),menuAccent:o("menuAccent",e.values?.menuAccent),menuColor:o("menuColor",e.values?.menuColor),url:`${S}/create?preset=${e.code}`}),r.length>0&&(l.log(""),l.log(t.fallbackNote??" * Uses preset defaults for values not available as options on love-ui create."))}}function Re(e){let t=Math.max(...Object.keys(e).map(r=>r.length));for(let[r,o]of Object.entries(e))l.log(` ${r.padEnd(t+2)}${o}`)}import{Command as tf}from"commander";import zi from"node-fetch";import rf from"prompts";import{z as Me}from"zod";var of=Me.object({email:Me.string().email().optional(),token:Me.string().optional(),apiUrl:Me.string().url(),registryUrl:Me.string(),silent:Me.boolean()}),Ji=new tf().name("login").description("login to LoveUI Pro").option("--email <email>","email address with LoveUI Pro access").option("--token <token>","LoveUI Pro access token").option("--api-url <url>","LoveUI site URL used for auth.",Io()).option("--registry-url <url>","LoveUI Pro registry URL.",xo).option("-s, --silent","mute output.",!1).action(async e=>{try{let t=of.parse({email:e.email,token:e.token,apiUrl:e.apiUrl.replace(/\/$/,""),registryUrl:e.registryUrl,silent:e.silent}),r=t.token??await nf(t),o=await sf(r,t.apiUrl);await Po({email:o.email??t.email,token:r,apiUrl:t.apiUrl,registryUrl:t.registryUrl}),t.silent||(b("Logged in to LoveUI Pro.")?.succeed(),l.log(`Use ${d.info("love-ui add @love-ui-pro/<component>")} or ${d.info("npx loveui-pro add <component>")}.`))}catch(t){l.break(),R(t)}});async function nf(e){let t=e.email;if(t||(t=(await rf({type:"text",name:"email",message:"Email with LoveUI Pro access",validate:s=>Me.string().email().safeParse(s).success||"Enter a valid email."})).email),!t)throw new Error("Email is required to login.");let r=b("Checking LoveUI Pro access.",{silent:e.silent}).start(),o=await zi(`${e.apiUrl}/api/pro/cli-token`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({email:t})}),n=await o.json().catch(()=>null);if(!o.ok||!n?.token)throw r.fail(),new Error(n?.error??"Unable to create a LoveUI Pro access token.");return r.succeed(),n.token}async function sf(e,t){let r=await zi(`${t}/api/pro/cli-token`,{headers:{authorization:`Bearer ${e}`,accept:"application/json"}}),o=await r.json().catch(()=>null);if(!r.ok||!o?.hasAccess)throw new Error(o?.error??"LoveUI Pro token verification failed.");return o}import{Command as af}from"commander";var Gi=new af().name("logout").description("logout of LoveUI Pro").action(async()=>{try{await Eo(),b("Logged out of LoveUI Pro.")?.succeed()}catch(e){l.break(),R(e)}});import{promises as Hi}from"fs";import Ki from"path";import{StdioServerTransport as lf}from"@modelcontextprotocol/sdk/server/stdio.js";import{Command as cf}from"commander";import ff from"deepmerge";import{execa as Yi}from"execa";import mf from"fs-extra";import pf from"prompts";import ao from"zod";var Be="latest",yr=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{loveui:{command:"npx",args:[`love-ui@${Be}`,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{loveui:{command:"npx",args:[`love-ui@${Be}`,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{loveui:{command:"npx",args:[`love-ui@${Be}`,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.loveui]
|
|
159
159
|
command = "npx"
|
|
160
|
-
args = ["love-ui@${
|
|
161
|
-
`},{name:"opencode",label:"OpenCode",configPath:"opencode.json",config:{$schema:"https://opencode.ai/config.json",mcp:{loveui:{type:"local",command:["npx",`love-ui@${
|
|
160
|
+
args = ["love-ui@${Be}", "mcp"]
|
|
161
|
+
`},{name:"opencode",label:"OpenCode",configPath:"opencode.json",config:{$schema:"https://opencode.ai/config.json",mcp:{loveui:{type:"local",command:["npx",`love-ui@${Be}`,"mcp"],enabled:!0}}}}],hr=[`love-ui@${Be}`],lo=new cf().name("mcp").description("MCP server and configuration commands").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{try{await ee(e.cwd);let t=new lf;await cn.connect(t)}catch(t){l.break(),R(t)}}),uf=ao.object({client:ao.enum(["claude","cursor","vscode","codex","opencode"]),cwd:ao.string()});lo.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${yr.map(e=>e.name).join(", ")})`).action(async(e,t)=>{try{let o=(t.parent?.opts()||{}).cwd||process.cwd(),n=e.client;if(!n){let f=await pf({type:"select",name:"client",message:"Which MCP client are you using?",choices:yr.map(m=>({title:m.label,value:m.name}))});f.client||(l.break(),process.exit(1)),n=f.client}let i=uf.parse({client:n,cwd:o}),s=await j(i.cwd);if(i.client==="codex"){if(s)await D([],hr,s,{silent:!1});else{let f=await ce(i.cwd),m=f==="npm"?"install":"add",p=f==="npm"?"--save-dev":"-D",u=b("Installing dependencies...").start();await Yi(f,[m,p,...hr],{cwd:i.cwd}),u.succeed("Installing dependencies.")}l.break(),l.log("To configure the Love UI MCP server in Codex:"),l.break(),l.log(`1. Open or create the file ${d.info("~/.codex/config.toml")}`),l.log("2. Add the following configuration:"),l.log(),l.info(`[mcp_servers.loveui]
|
|
162
162
|
command = "npx"
|
|
163
|
-
args = ["love-ui@${
|
|
164
|
-
`,"utf-8"),o.configPath}import
|
|
165
|
-
`),s.succeed("Updated package.json."),await D(["radix-ui"],[],e,{silent:!1})}l.info(""),l.info("Migration complete. The following packages may be removed if no longer in use:"),l.info(d.info(a.join(", "))),l.info("Please review your codebase before removing.")}else s.succeed("No packages found in source files.")}catch{s.fail("Failed to update package.json"),l.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui")}}async function
|
|
163
|
+
args = ["love-ui@${Be}", "mcp"]`),l.break(),l.info("3. Restart Codex to load the MCP server"),l.break(),process.exit(0)}let c=b("Configuring MCP server...").start(),a=await gf(i);if(c.succeed("Configuring MCP server."),s)await D([],hr,s,{silent:!1});else{let f=await ce(i.cwd),m=f==="npm"?"install":"add",p=f==="npm"?"--save-dev":"-D",u=b("Installing dependencies...").start();await Yi(f,[m,p,...hr],{cwd:i.cwd}),u.succeed("Installing dependencies.")}l.break(),l.success(`Configuration saved to ${a}.`),l.break()}catch(r){R(r)}});var df=(e,t)=>t;async function gf(e){let{client:t,cwd:r}=e,o=yr.find(a=>a.name===t);if(!o)throw new Error(`Unknown client: ${t}. Available clients: ${yr.map(a=>a.name).join(", ")}`);let n=Ki.join(r,o.configPath),i=Ki.dirname(n);await mf.ensureDir(i);let s={};try{let a=await Hi.readFile(n,"utf-8");s=JSON.parse(a)}catch{}let c=ff(s,o.config,{arrayMerge:df});return await Hi.writeFile(n,JSON.stringify(c,null,2)+`
|
|
164
|
+
`,"utf-8"),o.configPath}import jf from"path";import{randomBytes as hf}from"crypto";import{promises as co}from"fs";import{tmpdir as yf}from"os";import wr from"path";var xe={lucide:{name:"lucide-react",package:"lucide-react",import:"lucide-react"},radix:{name:"@radix-ui/react-icons",package:"@radix-ui/react-icons",import:"@radix-ui/react-icons"}};import wf from"fast-glob";import qi from"prompts";import{Project as bf,ScriptKind as kf,SyntaxKind as vf}from"ts-morph";async function Zi(e){if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let t=e.resolvedPaths.ui,[r,o]=await Promise.all([wf("**/*.{js,ts,jsx,tsx}",{cwd:t}),Xo()]);if(Object.keys(o).length===0)throw new Error("Something went wrong fetching the registry icons.");let n=Object.entries(xe).map(([m,p])=>({title:p.name,value:m})),i=await qi([{type:"select",name:"sourceLibrary",message:`Which icon library would you like to ${d.info("migrate from")}?`,choices:n},{type:"select",name:"targetLibrary",message:`Which icon library would you like to ${d.info("migrate to")}?`,choices:n}]);if(i.sourceLibrary===i.targetLibrary)throw new Error("You cannot migrate to the same icon library. Please choose a different icon library.");if(!(i.sourceLibrary in xe&&i.targetLibrary in xe))throw new Error("Invalid icon library. Please choose a valid icon library.");let s=xe[i.sourceLibrary],c=xe[i.targetLibrary],{confirm:a}=await qi({type:"confirm",name:"confirm",initial:!0,message:`We will migrate ${d.info(r.length)} files in ${d.info(`./${wr.relative(e.resolvedPaths.cwd,t)}`)} from ${d.info(s.name)} to ${d.info(c.name)}. Continue?`});a||(l.info("Migration cancelled."),process.exit(0)),c.package&&await D([c.package],[],e,{silent:!1});let f=b("Migrating icons...")?.start();await Promise.all(r.map(async m=>{f.text=`Migrating ${m}...`;let p=wr.join(t,m),u=await co.readFile(p,"utf-8"),h=await Cf(u,i.sourceLibrary,i.targetLibrary,o);await co.writeFile(p,h)})),f.succeed("Migration complete.")}async function Cf(e,t,r,o){let n=xe[t]?.import,i=xe[r]?.import,s=await co.mkdtemp(wr.join(yf(),"love-ui-")),c=new bf({compilerOptions:{}}),a=wr.join(s,`love-ui-icons-${hf(4).toString("hex")}.tsx`),f=c.createSourceFile(a,e,{scriptKind:kf.TSX}),m=[];for(let p of f.getImportDeclarations()??[])if(p.getModuleSpecifier()?.getText()===`"${n}"`){for(let u of p.getNamedImports()??[]){let h=u.getName(),g=Object.values(o).find(y=>y[t]===h)?.[r];!g||m.includes(g)||(m.push(g),u.remove(),f.getDescendantsOfKind(vf.JsxSelfClosingElement).filter(y=>y.getTagNameNode()?.getText()===h).forEach(y=>y.getTagNameNode()?.replaceWithText(g)))}p.getNamedImports()?.length===0&&p.remove()}return m.length>0&&f.addImportDeclaration({moduleSpecifier:i,namedImports:m.map(p=>({name:p}))}),await f.getText()}import{promises as br}from"fs";import kr from"path";import fo from"fast-glob";import Rf from"prompts";function xf(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function Sf(e,t,r,o){let i=e.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").trim().split(",").map(s=>s.trim()).filter(Boolean);for(let s of i){let c=s.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?$/),a=s.match(/^(\w+)\s+as\s+(\w+)$/);if(c){let f=c[1],m=c[2];o==="slot"&&f==="Slot"&&!m?r.push({name:"Slot",alias:"SlotPrimitive",isType:!0}):r.push({name:f,alias:m,isType:!0})}else if(a){let f=a[1],m=a[2];o==="slot"&&f==="Slot"&&m==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:f,alias:m,isType:t})}else o==="slot"&&s==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:s,isType:t})}}async function Xi(e,t={}){let r,o;if(t.path){if(o=e.resolvedPaths.cwd,t.path.includes("*"))r=await fo(t.path,{cwd:o,onlyFiles:!0,ignore:["**/node_modules/**"]});else{let a=kr.resolve(o,t.path),f=await br.stat(a).catch(()=>null);if(!f)throw new Error(`File not found: ${t.path}`);if(f.isDirectory())o=a,r=await fo("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:!0,ignore:["**/node_modules/**"]});else if(f.isFile())r=[t.path];else throw new Error(`Unsupported path type: ${t.path}`)}if(r.length===0)throw new Error(`No files found matching: ${t.path}`)}else{if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");o=e.resolvedPaths.ui,r=await fo("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:!0})}if(!t.yes){let c=t.path?t.path:`./${kr.relative(e.resolvedPaths.cwd,o)}`,{confirm:a}=await Rf({type:"confirm",name:"confirm",initial:!0,message:`We will migrate ${d.info(r.length)} file(s) in ${d.info(c)} to ${d.info("radix-ui")}. Continue?`});a||(l.info("Migration cancelled."),process.exit(0))}let n=b("Migrating imports...")?.start(),i=new Set;await Promise.all(r.map(async c=>{n.text=`Migrating ${c}...`;let a=kr.join(o,c),f=await br.readFile(a,"utf-8"),{content:m,replacedPackages:p}=await If(f);p.forEach(u=>i.add(u)),await br.writeFile(a,m)})),n.succeed("Migrating imports.");let s=b("Updating package.json...")?.start();try{let c=$e(e.resolvedPaths.cwd,!1);if(!c){s.fail("Could not read package.json"),l.warn("Could not update package.json. You may need to manually replace @radix-ui/react-* packages with radix-ui");return}let a=Array.from(i);if(a.length>0){if(c.dependencies||(c.dependencies={}),c.dependencies?.["radix-ui"]||c.devDependencies?.["radix-ui"])s.succeed("radix-ui already in package.json.");else{c.dependencies["radix-ui"]="latest";let m=kr.join(e.resolvedPaths.cwd,"package.json");await br.writeFile(m,JSON.stringify(c,null,2)+`
|
|
165
|
+
`),s.succeed("Updated package.json."),await D(["radix-ui"],[],e,{silent:!1})}l.info(""),l.info("Migration complete. The following packages may be removed if no longer in use:"),l.info(d.info(a.join(", "))),l.info("Please review your codebase before removing.")}else s.succeed("No packages found in source files.")}catch{s.fail("Failed to update package.json"),l.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui")}}async function If(e){let t=/import\s+(?:(type)\s+)?(?:\*\s+as\s+(\w+)|{([^}]+)})\s+from\s+(["'])@radix-ui\/react-([^"']+)\4(;?)/g,r=[],o=[],n=[],i='"',s=!1,c=e,a;for(;(a=t.exec(e))!==null;){let[g,y,k,v,I,x,C]=a;if(x==="icons"||x.startsWith("icons/"))continue;o.push(g),o.length===1&&(i=I,s=C===";"),n.push(`@radix-ui/react-${x}`);let E=!!y;if(k){let U=xf(x);r.push({name:U,alias:k,isType:E})}else v&&Sf(v,E,r,x)}if(r.length===0)return{content:e,replacedPackages:[]};let f=r.filter((g,y,k)=>y===k.findIndex(v=>v.name===g.name&&v.alias===g.alias&&v.isType===g.isType)),p=`import { ${f.map(g=>{let y=g.isType?"type ":"";return g.alias?`${y}${g.name} as ${g.alias}`:`${y}${g.name}`}).join(", ")} } from ${i}radix-ui${i}${s?";":""}`;c=o.reduce((g,y,k)=>g.replace(y,k===0?p:""),c),c=c.replace(/\n\s*\n\s*\n/g,`
|
|
166
166
|
|
|
167
167
|
`),f.some(g=>g.name==="Slot"&&g.alias==="SlotPrimitive")&&(c=c.split(`
|
|
168
|
-
`).map(k=>{if(k.trim().startsWith("import "))return k;let v=k;return v=v.replace(/\b(asChild\s*\?\s*)Slot(\s*:)/g,"$1__SLOT_PLACEHOLDER__$2"),v=v.replace(/\bReact\.ComponentProps<typeof\s+Slot>/g,"React.ComponentProps<typeof __SLOT_PLACEHOLDER__>"),v=v.replace(/\bComponentProps<typeof\s+Slot>/g,"ComponentProps<typeof __SLOT_PLACEHOLDER__>"),v=v.replace(/(<\/?)Slot(\s*\/?>)/g,"$1__SLOT_PLACEHOLDER__$2"),v=v.replace(/\bSlot\b/g,(I,x,C)=>{let
|
|
169
|
-
`));let h=Array.from(new Set(n));return{content:c,replacedPackages:h}}import{promises as
|
|
170
|
-
`),n.succeed("Updated components.json.")}catch{throw n.fail("Failed to update components.json."),new Error("Could not update components.json. Please manually set `rtl: true`.")}let i=b("Migrating files to RTL...").start(),s=0,c=[];if(await Promise.all(r.map(async a=>{i.text=`Migrating ${a}...`;let f=
|
|
171
|
-
Before you can run a migration, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),l.error(`Learn more at ${d.info(`${S}/docs/components-json`)}.`),l.break(),process.exit(1)}}import{Command as df}from"commander";import{z as it}from"zod";var Gi=[{name:"icons",description:"migrate your ui components to a different icon library."},{name:"radix",description:"migrate to radix-ui."},{name:"rtl",description:"migrate your components to support RTL (right-to-left)."}],gf=it.object({cwd:it.string(),list:it.boolean(),yes:it.boolean(),migration:it.string().refine(e=>e&&Gi.some(t=>t.name===e),{message:"You must specify a valid migration. Run `love-ui migrate --list` to see available migrations."}).optional(),path:it.string().optional()}),Hi=new df().name("migrate").description("run a migration.").argument("[migration]","the migration to run.").argument("[path]","optional path or glob pattern to migrate.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-l, --list","list all migrations.",!1).option("-y, --yes","skip confirmation prompt.",!1).action(async(e,t,r)=>{try{let o=gf.parse({cwd:uf.resolve(r.cwd),migration:e,path:t,list:r.list,yes:r.yes});if(o.list||!o.migration){l.info("Available migrations:");for(let s of Gi)l.info(`- ${s.name}: ${s.description}`);return}if(!o.migration)throw new Error("You must specify a migration. Run `love-ui migrate --list` to see available migrations.");let{errors:n,config:i}=await Ji(o);if(n["1"]||n["3"])throw new Error("No `components.json` file found. Ensure you are at the root of your project.");if(!i)throw new Error("Something went wrong reading your `components.json` file. Please ensure you have a valid `components.json` file.");o.migration==="icons"&&await Mi(i),o.migration==="radix"&&await Bi(i,{yes:o.yes,path:o.path}),o.migration==="rtl"&&await Wi(i,{yes:o.yes,path:o.path})}catch(o){l.break(),R(o)}});import{existsSync as hf}from"fs";import Ki from"path";import{Command as It}from"commander";import yf from"open";function wf(e){return`${S}/create?preset=${e}`}function uo(e){let t=Ke(e);if(!t)throw new Error(`Invalid preset code: ${e}`);let r=[],o=t.chartColor??an[t.theme]??t.theme;return t.chartColor||r.push("chartColor"),{code:e,version:e[0],values:{...t,chartColor:o},derived:r,url:wf(e)}}function bf(e){dr({code:e.code,fallbacks:e.derived,values:e.values},{fallbackNote:" * Compatibility value for older preset versions."})}var kf=new It().name("decode").description("decode a preset code").argument("<code>","the preset code to decode").option("--json","output as JSON.",!1).action((e,t)=>{try{let r=uo(e);if(t.json){console.log(JSON.stringify({code:r.code,version:r.version,values:r.values,derived:r.derived,url:r.url},null,2));return}bf(r)}catch(r){kr(r)}}),vf=new It().name("url").description("get the create URL for a preset code").argument("<code>","the preset code").action(e=>{try{l.log(uo(e).url)}catch(t){kr(t)}}),Cf=new It().name("open").description("open a preset code in the browser").argument("<code>","the preset code").action(async e=>{let t;try{t=uo(e).url}catch(r){kr(r);return}l.break(),l.log(` Opening ${t} in your browser.`),l.break();try{await yf(t)}catch(r){let o=r instanceof Error?r.message:String(r);kr(new Error(`Failed to open preset URL: ${o}`))}}),Rf=new It().name("resolve").alias("info").description("resolve a preset from your project").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("--json","output as JSON.",!1).action(async e=>{try{let t=Ki.resolve(e.cwd);if(!hf(Ki.resolve(t,"components.json"))&&await M(t)){let i=await B(t);i.length>0&&(e.json?console.log(JSON.stringify({error:"monorepo_root",message:"You are running preset resolve from a monorepo root. Use the -c flag to specify a workspace.",targets:i.map(s=>s.name)},null,2)):W("preset resolve",i),process.exit(1))}let r=await j(t);if(!r){if(e.json){console.log(JSON.stringify(null,null,2));return}l.log("No components.json found.");return}let o=await F(t),n=await pr(r,o);if(e.json){console.log(JSON.stringify(n.code?n:null,null,2));return}dr(n)}catch(t){R(t)}}),go=new It().name("preset").description("manage presets").addCommand(kf).addCommand(Rf).addCommand(vf).addCommand(Cf).action(()=>{go.outputHelp()});function kr(e){e instanceof Error&&l.error(e.message),process.exit(1)}import Yi from"path";import{Command as xf}from"commander";import ho from"fs-extra";import Sf from"prompts";import{z as yo}from"zod";var If=yo.object({cwd:yo.string(),silent:yo.boolean()}),qi=new xf().name("add").description("add registries to your project").argument("[registries...]","registries (@namespace) or registry URLs (@namespace=url)").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",!1).action(async(e,t)=>{try{let r=If.parse({cwd:Yi.resolve(t.cwd),silent:t.silent}),o=e.length>0?e:await Ef({silent:r.silent});await $f(o,r.cwd,{silent:r.silent})}catch(r){l.break(),R(r)}});function Pf(e){let[t,...r]=e.split("="),o=r.length>0?r.join("="):void 0;if(!t.startsWith("@"))throw new Error(`Invalid registry namespace: ${d.info(t)}. Registry names must start with @ (e.g., @acme).`);return{namespace:t,url:o}}function wo(e,t,r){return`${e} ${e===1?t:r}`}async function $f(e,t,r){let o=Yi.resolve(t,"components.json");if(!ho.existsSync(o))throw new Error(`No ${d.info("components.json")} found. Run ${d.info("love-ui init")} first.`);let n=e.map(Pf),i=n.filter(g=>!g.url),s=[];if(i.length>0){let g=b("Fetching registries.",{silent:r.silent}).start(),y=await $r();if(!y)throw g.fail(),new Error("Failed to fetch registries.");g.succeed(),s=y}let c={};for(let{namespace:g,url:y}of n){if(g in re){l.warn(`${d.info(g)} is a built-in registry and cannot be added.`);continue}if(y){if(!y.includes("{name}"))throw new Error(`Invalid registry URL for ${d.info(g)}. URL must include {name} placeholder. Example: ${d.info(`${g}=https://example.com/r/{name}.json`)}`);c[g]=y}else{let k=s.find(v=>v.name===g);if(!k)throw new Error(`Registry ${d.info(g)} not found. Provide a URL: ${d.info(`${g}=https://.../{name}.json`)}`);c[g]=k.url}}if(Object.keys(c).length===0)return{addedRegistries:[]};let a=await ho.readJson(o),f=a.registries||{},m={},p=[];for(let[g,y]of Object.entries(c))f[g]?p.push(g):m[g]=y;if(Object.keys(m).length===0){if(p.length>0&&!r.silent){b(`Skipped ${wo(p.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let g of p)l.log(` - ${g}`)}else r.silent||l.info("No new registries to add.");return}let u={...a,registries:{...f,...m}},h=b("Updating components.json.",{silent:r.silent}).start();if(await ho.writeJson(o,u,{spaces:2}),h.succeed(),!r.silent){let g=Object.keys(m);b(`Added ${wo(g.length,"registry","registries")}:`,{silent:r.silent})?.succeed();for(let y of g)l.log(` - ${y}`);if(p.length>0){b(`Skipped ${wo(p.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let y of p)l.log(` - ${y}`)}}}async function Ef(e){let t=b("Fetching registries.",{silent:e.silent}).start(),r=await $r();if(!r)throw t.fail(),new Error("Failed to fetch registries.");t.succeed();let o=[...r].sort((i,s)=>i.name.localeCompare(s.name)),{selected:n}=await Sf({type:"autocompleteMultiselect",name:"selected",message:"Which registries would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:!1,choices:o.map(i=>({title:i.name,description:i.description,value:i.name}))});return n?.length||(l.warn("No registries selected. Exiting."),l.info(""),process.exit(1)),n}import*as Pe from"path";import*as vo from"fs/promises";import*as O from"path";import{z as Ie}from"zod";var Zi=32,jf=Io.options.filter(e=>e!=="registry:example"&&e!=="registry:internal"),Tf=Ie.record(Ie.string(),Ie.unknown()),Ff=Ie.array(Ie.string()),Of=Ie.array(Ie.unknown());async function Qi(e){let t=O.resolve(e.cwd),r=O.resolve(t,e.registryFile),o={cwd:t,rootFile:r,usesInclude:!1,diagnostics:[],registryFiles:new Set,checkedRegistryFiles:new Set,itemsChecked:0,itemSourcesByItem:new Map,firstIncludedFrom:new Map};if(O.basename(r)!=="registry.json"&&A(o,{registryFile:r,message:"Root source registry file must be named registry.json.",suggestion:"Rename the file to registry.json and pass that file to love-ui registry validate."}),!Co(r,t))return A(o,{registryFile:r,message:`Root registry file must stay inside ${st(t,t)}.`,suggestion:"Run the command from the registry root or pass a registry.json file inside --cwd."}),ko(o,[]);let n=await ts(r,o);if(!n)return ko(o,[]);o.usesInclude=!!n.include?.length,Af(n,r,o);let i=await es(r,n,o,[]);return Lf(i,o),await _f(i,o),ko(o,i)}async function es(e,t,r,o){if(o.length>=Zi)return A(r,{registryFile:e,message:`Registry include tree is too deep. The maximum include depth is ${Zi}.`,suggestion:"Flatten part of the registry include tree or reduce nested include depth."}),[];if(o.includes(e))return A(r,{registryFile:e,message:`Registry include cycle detected: ${zf([...o,e])}.`,suggestion:"Remove one include so the registry graph is acyclic."}),[];let n=o.at(-1)??e,i=r.firstIncludedFrom.get(e);if(i)return A(r,{registryFile:e,message:`Registry file included more than once. First included from ${st(i,r.cwd)}, then included from ${st(n,r.cwd)}.`,suggestion:"Remove one include or move shared items into a single included registry.json."}),[];r.registryFiles.add(e),r.firstIncludedFrom.set(e,n);let s=O.dirname(e),c=[...o,e],a=[];for(let m of t.include??[]){let p=Nf(m,e,s,r);if(!p)continue;let u=await ts(p,r);if(!u)continue;let h=await es(p,u,r,c);a.push(...h)}let f=!r.usesInclude&&e===r.rootFile?r.cwd:s;return t.items.forEach((m,p)=>{r.itemSourcesByItem.set(m,{registryFile:e,registryDir:f,itemIndex:p})}),[...a,...t.items]}async function ts(e,t){t.checkedRegistryFiles.add(e);let r;try{r=await vo.readFile(e,"utf-8")}catch{return A(t,{registryFile:e,message:"Registry file was not found or could not be read.",suggestion:"Check that the registry.json file exists and is readable."}),null}let o;try{o=JSON.parse(r)}catch{return A(t,{registryFile:e,message:"Registry file contains invalid JSON.",suggestion:"Fix the JSON syntax in the registry.json file."}),null}return Uf(o,e,t)}function Af(e,t,r){!e.name&&!e.hasName&&A(r,{registryFile:t,message:'Root registry.json must define "name".',suggestion:'Add a top-level "name" field to the root registry.json.'}),!e.homepage&&!e.hasHomepage&&A(r,{registryFile:t,message:'Root registry.json must define "homepage".',suggestion:'Add a top-level "homepage" field to the root registry.json.'})}function Nf(e,t,r,o){if(q(e))return A(o,{registryFile:t,includePath:e,message:`Remote include "${e}" is not supported.`,suggestion:"Use a relative path to an explicit registry.json file in the same repository."}),null;if(O.isAbsolute(e))return A(o,{registryFile:t,includePath:e,message:`Include "${e}" must be relative.`,suggestion:'Use a path like "components/ui/registry.json".'}),null;if(rs(e))return A(o,{registryFile:t,includePath:e,message:`Include "${e}" cannot use parent-directory traversal.`,suggestion:"Registry includes must descend from the including chunk. Move shared registries into the registry root and include them from there."}),null;if(O.basename(e)!=="registry.json")return A(o,{registryFile:t,includePath:e,message:`Include "${e}" must explicitly reference a registry.json file.`,suggestion:'Use a path like "components/ui/registry.json".'}),null;let n=O.resolve(r,e);return Co(n,o.cwd)?n:(A(o,{registryFile:t,includePath:e,message:`Include "${e}" must stay inside ${st(o.cwd,o.cwd)}.`,suggestion:"Keep included registry.json files inside the registry root."}),null)}function Lf(e,t){let r=new Map;for(let o of e){let n=r.get(o.name);if(!n){r.set(o.name,o);continue}let i=t.itemSourcesByItem.get(n),s=t.itemSourcesByItem.get(o);A(t,{registryFile:s?.registryFile??t.rootFile,itemName:o.name,itemIndex:s?.itemIndex,message:`Duplicate registry item name "${o.name}". First defined at ${Jf(i,t.cwd)}.`,suggestion:"Rename one of these items so each name is unique across the resolved registry."})}}async function _f(e,t){let r=Wf(t);for(let o of e){let n=t.itemSourcesByItem.get(o),i={...Df(o,t,r),$schema:"https://www.loveui.dev/schema/registry-item.json"};for(let c=0;c<(o.files?.length??0);c++){let a=o.files?.[c];if(!a||!n)continue;let f=Vf(o,a.path,n,t);if(f)try{await vo.readFile(f,"utf-8")}catch{A(t,{registryFile:n.registryFile,itemName:o.name,itemIndex:n.itemIndex,filePath:a.path,message:`File "${a.path}" was not found or could not be read.`,suggestion:"Make sure the file path is relative to the registry.json file that declares the item."})}}let s=at.safeParse(i);s.success||Pt(s.error,n?.registryFile??t.rootFile,t,{itemName:o.name,itemIndex:n?.itemIndex,suggestion:"Update the registry item so the built item matches the registry item schema."})}}function Vf(e,t,r,o){if(q(t))return A(o,{registryFile:r.registryFile,itemName:e.name,itemIndex:r.itemIndex,filePath:t,message:`File path "${t}" cannot be remote.`,suggestion:"Use a local file path relative to the registry.json file that declares the item."}),null;if(O.isAbsolute(t))return A(o,{registryFile:r.registryFile,itemName:e.name,itemIndex:r.itemIndex,filePath:t,message:`File path "${t}" must be relative.`,suggestion:"Use a local file path relative to the registry.json file that declares the item."}),null;if(rs(t))return A(o,{registryFile:r.registryFile,itemName:e.name,itemIndex:r.itemIndex,filePath:t,message:`File path "${t}" cannot use parent-directory traversal.`,suggestion:"Keep item files inside the registry chunk directory."}),null;let n=O.resolve(r.registryDir,t);return Co(n,r.registryDir)?n:(A(o,{registryFile:r.registryFile,itemName:e.name,itemIndex:r.itemIndex,filePath:t,message:`File path "${t}" must stay inside the registry chunk directory.`,suggestion:"Move the file into the same registry chunk directory or update the registry item path."}),null)}function Df(e,t,r){let o=t.itemSourcesByItem.get(e);return{...e,files:e.files?.map(n=>{let i=O.resolve(o?.registryDir??t.cwd,n.path);return{...n,path:O.relative(r,i).split(O.sep).join("/")}})}}function Uf(e,t,r){let o=Tf.safeParse(e);if(!o.success)return Pt(o.error,t,r,{suggestion:"Update the registry.json file so it matches the schema."}),null;let n=o.data,i={$schema:bo(n,"$schema",t,r),name:bo(n,"name",t,r),homepage:bo(n,"homepage",t,r),hasName:n.name!==void 0,hasHomepage:n.homepage!==void 0,items:[]};if(n.include!==void 0){let s=Ff.safeParse(n.include);s.success?i.include=s.data:Pt(s.error,t,r,{pathPrefix:["include"],suggestion:"Update include so it is an array of registry.json paths."})}if(n.items!==void 0){let s=Of.safeParse(n.items);s.success?(r.itemsChecked+=s.data.length,i.items=Mf(s.data,t,r)):Pt(s.error,t,r,{pathPrefix:["items"],suggestion:"Update items so it is an array of registry items."})}return n.items===void 0&&n.include===void 0&&A(r,{registryFile:t,message:"Registry must define at least one of `items` or `include`.",suggestion:'Add an "items" array, an "include" array, or both to registry.json.'}),i}function Mf(e,t,r){let o=[];return e.forEach((n,i)=>{let s=at.safeParse(n);if(!s.success){Pt(s.error,t,r,{itemName:Bf(n),itemIndex:i,suggestion:"Update the registry item so it matches the registry item schema."});return}o.push(s.data)}),o}function bo(e,t,r,o){let n=e[t];if(n!==void 0){if(typeof n=="string")return n;A(o,{registryFile:r,message:`${t}: Expected string, received ${typeof n}.`,suggestion:`Update "${t}" so it is a string.`})}}function Bf(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e.name;return typeof t=="string"?t:void 0}function Pt(e,t,r,o){for(let n of e.errors)A(r,{registryFile:t,itemName:o.itemName,itemIndex:o.itemIndex,message:Gf(n,o.pathPrefix),suggestion:o.suggestion})}function A(e,t){e.diagnostics.push(t)}function ko(e,t){return{valid:e.diagnostics.length===0,cwd:e.cwd,registryFiles:e.checkedRegistryFiles.size,registryFilePaths:Array.from(e.checkedRegistryFiles),items:e.itemsChecked,diagnostics:e.diagnostics}}function Wf(e){return e.usesInclude?O.dirname(e.rootFile):e.cwd}function rs(e){return e.split(/[\\/]+/).includes("..")}function Co(e,t){let r=O.relative(t,e);return!!r&&!r.startsWith("..")&&!O.isAbsolute(r)}function zf(e){return e.map(t=>st(t,O.dirname(e[0]))).join(" -> ")}function Jf(e,t){return e?`${st(e.registryFile,t)} items[${e.itemIndex}]`:"unknown source"}function Xi(e){return e.length?e.join("."):"(root)"}function Gf(e,t=[]){let r=[...t,...e.path];return e.code===Ie.ZodIssueCode.invalid_union_discriminator&&e.path.at(-1)==="type"?`${Xi(r)}: Invalid registry item type. Expected ${jf.map(o=>`"${o}"`).join(" | ")}.`:`${Xi(r)}: ${e.message}`}function st(e,t){let r=O.relative(t,e);return r&&!r.startsWith("..")&&!O.isAbsolute(r)?r.split(O.sep).join("/"):r?e:"."}import{Command as Hf}from"commander";import{z as Ro}from"zod";var Kf=Ro.object({cwd:Ro.string(),registryFile:Ro.string()}),is=new Hf().name("validate").description("validate a Love UI registry").argument("[registry]","path to registry.json file","./registry.json").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{let r;try{let o=Kf.parse({cwd:Pe.resolve(t.cwd),registryFile:e});r=b("Validating registry.").start();let n=await Qi(o);Yf(n,r),n.valid||(process.exitCode=1)}catch(o){r?.fail("Registry validation failed."),l.break(),R(o)}});function Yf(e,t){if(e.valid){t.succeed("Registry is valid."),os(e,{success:!0});return}t.fail("Registry validation failed."),os(e),l.break();for(let[r,o]of Array.from(qf(e))){l.log(d.info(ss(r,e.cwd)));for(let n of o)l.error(` - ${Zf(n)}`),n.suggestion&&l.log(` ${n.suggestion}`);l.break()}}function os(e,t={}){let r=`Checked ${ns(e.registryFiles,"registry file","registry files")} and ${ns(e.items,"item","items")}.`;t.success?Xf(r):l.log(` ${r}`);for(let o of e.registryFilePaths)l.log(` - ${ss(o,e.cwd)}`)}function qf(e){let t=new Map;for(let r of e.diagnostics){let o=t.get(r.registryFile)??[];o.push(r),t.set(r.registryFile,o)}return t}function Zf(e){let t=[];return e.itemIndex!==void 0&&t.push(`items[${e.itemIndex}]`),e.itemName&&t.push(`"${e.itemName}"`),e.includePath&&t.push(`include "${e.includePath}"`),e.filePath&&t.push(`file "${e.filePath}"`),t.length?`${t.join(" ")}: ${e.message}`:e.message}function ss(e,t){let r=Pe.relative(t,e);return r&&!r.startsWith("..")&&!Pe.isAbsolute(r)?r.split(Pe.sep).join("/"):r?e:"."}function Xf(e){b(e).succeed()}function ns(e,t,r){return`${e} ${e===1?t:r}`}import{Command as Qf}from"commander";var as=new Qf().name("registry").description("manage registries").addCommand(qi).addCommand(is);import ls from"path";import{Command as em}from"commander";import cs from"fs-extra";import{z as $t}from"zod";var tm=$t.object({cwd:$t.string(),query:$t.string().optional(),limit:$t.number().optional(),offset:$t.number().optional()}),fs=new em().name("search").alias("list").description("search items from registries").argument("<registries...>","the registry names or urls to search items from. Names must be prefixed with @.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-q, --query <query>","query string").option("-l, --limit <number>","maximum number of items to display per registry","100").option("-o, --offset <number>","number of items to skip","0").action(async(e,t)=>{try{let r=tm.parse({cwd:ls.resolve(t.cwd),query:t.query,limit:t.limit?parseInt(t.limit,10):void 0,offset:t.offset?parseInt(t.offset,10):void 0});await ee(r.cwd);let o=Je({style:"new-york",resolvedPaths:{cwd:r.cwd}}),n=L(o),i=ls.resolve(r.cwd,"components.json");if(cs.existsSync(i)){let m=await cs.readJson(i),p=z.partial().parse(m);n=L({...o,...p})}let s=n;try{let m=await j(r.cwd);m&&(s=L(m))}catch{}let{config:c,newRegistries:a}=await G(e.map(m=>`${m}/registry`),s,{silent:!0,writeFile:!1});a.length>0&&(s.registries=c.registries),Wt(e,s);let f=await tn(e,{query:r.query,limit:r.limit,offset:r.offset,config:s});console.log(JSON.stringify(f,null,2)),process.exit(0)}catch(r){R(r)}finally{ne()}});import ms from"path";import{Command as rm}from"commander";import ps from"fs-extra";import{z as us}from"zod";var om=us.object({cwd:us.string()}),ds=new rm().name("view").description("view items from the registry").argument("<items...>","the item names or URLs to view").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=om.parse({cwd:ms.resolve(t.cwd)});await ee(r.cwd);let o=L({}),n=ms.resolve(r.cwd,"components.json");if(ps.existsSync(n)){let f=await ps.readJson(n),m=z.partial().parse(f);o=L(m)}let i=o;try{let f=await j(r.cwd);f&&(i=L(f))}catch{}let{config:s,newRegistries:c}=await G(e,i,{silent:!0,writeFile:!1});c.length>0&&(i.registries=s.registries),Wt(e,i);let a=await ie(e,{config:i});console.log(JSON.stringify(a,null,2)),process.exit(0)}catch(r){R(r)}finally{ne()}});import{Command as nm}from"commander";process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function im(){let e=new nm().name("love-ui").description("build your Love UI component library").version(Jo.version||"1.0.0","-v, --version","display the version number");e.addCommand(Wn).addCommand(li).addCommand(oi).addCommand(gi).addCommand(yi).addCommand(ds).addCommand(fs).addCommand(Hi).addCommand(bi).addCommand(Li).addCommand(ui).addCommand(lo).addCommand(go).addCommand(as),e.parse()}im();export{Ko as fetchTree,Yo as getItemTargetPath,Ge as getLoveUIRegistryIndex,um as getPreset,pm as getPresets,$r as getRegistries,fm as getRegistriesConfig,qo as getRegistriesIndex,lm as getRegistry,zt as getRegistryBaseColor,Ho as getRegistryBaseColors,Go as getRegistryIcons,ie as getRegistryItems,Pr as getRegistryStyles,cm as resolveRegistryItems,mm as resolveTree};
|
|
168
|
+
`).map(k=>{if(k.trim().startsWith("import "))return k;let v=k;return v=v.replace(/\b(asChild\s*\?\s*)Slot(\s*:)/g,"$1__SLOT_PLACEHOLDER__$2"),v=v.replace(/\bReact\.ComponentProps<typeof\s+Slot>/g,"React.ComponentProps<typeof __SLOT_PLACEHOLDER__>"),v=v.replace(/\bComponentProps<typeof\s+Slot>/g,"ComponentProps<typeof __SLOT_PLACEHOLDER__>"),v=v.replace(/(<\/?)Slot(\s*\/?>)/g,"$1__SLOT_PLACEHOLDER__$2"),v=v.replace(/\bSlot\b/g,(I,x,C)=>{let E=C.substring(0,x),U=(E.match(/"/g)||[]).length,Y=(E.match(/'/g)||[]).length;return U%2!==0||Y%2!==0?I:"__SLOT_PLACEHOLDER__"}),v=v.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),v}).join(`
|
|
169
|
+
`));let h=Array.from(new Set(n));return{content:c,replacedPackages:h}}import{promises as St}from"fs";import It from"path";import mo from"fast-glob";import Pf from"prompts";var Ef=["sidebar.tsx","pagination.tsx","calendar.tsx"],$f=`${S}/docs/rtl#manual-migration-optional`;async function Qi(e,t={}){let r,o;if(t.path){if(o=e.resolvedPaths.cwd,t.path.includes("*"))r=await mo(t.path,{cwd:o,onlyFiles:!0,ignore:["**/node_modules/**"]});else{let f=It.resolve(o,t.path),m=await St.stat(f).catch(()=>null);if(!m)throw new Error(`File not found: ${t.path}`);if(m.isDirectory())o=f,r=await mo("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:!0,ignore:["**/node_modules/**"]});else if(m.isFile())r=[t.path];else throw new Error(`Unsupported path type: ${t.path}`)}if(r.length===0)throw new Error(`No files found matching: ${t.path}`)}else{if(!e.resolvedPaths.ui)throw new Error("Could not find a valid `ui` path in your `components.json`. Please provide a path or glob pattern.");o=e.resolvedPaths.ui,r=await mo("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:!0})}if(!t.yes){let a=t.path?t.path:`./${It.relative(e.resolvedPaths.cwd,o)}`,{confirm:f}=await Pf({type:"confirm",name:"confirm",initial:!0,message:`We will migrate ${d.info(r.length)} file(s) in ${d.info(a)} to RTL. Continue?`});f||(l.info("Migration cancelled."),process.exit(0))}let n=b("Updating components.json...").start();try{let a=It.resolve(e.resolvedPaths.cwd,"components.json"),f=JSON.parse(await St.readFile(a,"utf-8"));f.rtl=!0,await St.writeFile(a,JSON.stringify(f,null,2)+`
|
|
170
|
+
`),n.succeed("Updated components.json.")}catch{throw n.fail("Failed to update components.json."),new Error("Could not update components.json. Please manually set `rtl: true`.")}let i=b("Migrating files to RTL...").start(),s=0,c=[];if(await Promise.all(r.map(async a=>{i.text=`Migrating ${a}...`;let f=It.join(o,a),m=await St.readFile(f,"utf-8"),p=await Lo(m,!0);p!==m&&(await St.writeFile(f,p),s++);let u=It.basename(a);Ef.includes(u)&&c.push(a)})),i.succeed(`Migration complete. ${s} file(s) transformed.`),c.length>0){l.break(),l.warn("The following components may need manual RTL adjustments:");for(let a of c)l.info(` - ${a}`);l.break(),l.info(`See ${d.info($f)} for more information.`)}}import es from"path";import po from"fs-extra";async function ts(e){let t={};if(!po.existsSync(e.cwd)||!po.existsSync(es.resolve(e.cwd,"package.json")))return t["1"]=!0,{errors:t,config:null};if(!po.existsSync(es.resolve(e.cwd,"components.json")))return t["3"]=!0,{errors:t,config:null};try{let r=await j(e.cwd);return{errors:t,config:r}}catch{l.break(),l.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e.cwd)}.
|
|
171
|
+
Before you can run a migration, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),l.error(`Learn more at ${d.info(`${S}/docs/components-json`)}.`),l.break(),process.exit(1)}}import{Command as Tf}from"commander";import{z as st}from"zod";var rs=[{name:"icons",description:"migrate your ui components to a different icon library."},{name:"radix",description:"migrate to radix-ui."},{name:"rtl",description:"migrate your components to support RTL (right-to-left)."}],Ff=st.object({cwd:st.string(),list:st.boolean(),yes:st.boolean(),migration:st.string().refine(e=>e&&rs.some(t=>t.name===e),{message:"You must specify a valid migration. Run `love-ui migrate --list` to see available migrations."}).optional(),path:st.string().optional()}),os=new Tf().name("migrate").description("run a migration.").argument("[migration]","the migration to run.").argument("[path]","optional path or glob pattern to migrate.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-l, --list","list all migrations.",!1).option("-y, --yes","skip confirmation prompt.",!1).action(async(e,t,r)=>{try{let o=Ff.parse({cwd:jf.resolve(r.cwd),migration:e,path:t,list:r.list,yes:r.yes});if(o.list||!o.migration){l.info("Available migrations:");for(let s of rs)l.info(`- ${s.name}: ${s.description}`);return}if(!o.migration)throw new Error("You must specify a migration. Run `love-ui migrate --list` to see available migrations.");let{errors:n,config:i}=await ts(o);if(n["1"]||n["3"])throw new Error("No `components.json` file found. Ensure you are at the root of your project.");if(!i)throw new Error("Something went wrong reading your `components.json` file. Please ensure you have a valid `components.json` file.");o.migration==="icons"&&await Zi(i),o.migration==="radix"&&await Xi(i,{yes:o.yes,path:o.path}),o.migration==="rtl"&&await Qi(i,{yes:o.yes,path:o.path})}catch(o){l.break(),R(o)}});import{existsSync as Of}from"fs";import ns from"path";import{Command as Pt}from"commander";import Af from"open";function Nf(e){return`${S}/create?preset=${e}`}function uo(e){let t=Ye(e);if(!t)throw new Error(`Invalid preset code: ${e}`);let r=[],o=t.chartColor??un[t.theme]??t.theme;return t.chartColor||r.push("chartColor"),{code:e,version:e[0],values:{...t,chartColor:o},derived:r,url:Nf(e)}}function Lf(e){gr({code:e.code,fallbacks:e.derived,values:e.values},{fallbackNote:" * Compatibility value for older preset versions."})}var _f=new Pt().name("decode").description("decode a preset code").argument("<code>","the preset code to decode").option("--json","output as JSON.",!1).action((e,t)=>{try{let r=uo(e);if(t.json){console.log(JSON.stringify({code:r.code,version:r.version,values:r.values,derived:r.derived,url:r.url},null,2));return}Lf(r)}catch(r){vr(r)}}),Vf=new Pt().name("url").description("get the create URL for a preset code").argument("<code>","the preset code").action(e=>{try{l.log(uo(e).url)}catch(t){vr(t)}}),Df=new Pt().name("open").description("open a preset code in the browser").argument("<code>","the preset code").action(async e=>{let t;try{t=uo(e).url}catch(r){vr(r);return}l.break(),l.log(` Opening ${t} in your browser.`),l.break();try{await Af(t)}catch(r){let o=r instanceof Error?r.message:String(r);vr(new Error(`Failed to open preset URL: ${o}`))}}),Uf=new Pt().name("resolve").alias("info").description("resolve a preset from your project").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("--json","output as JSON.",!1).action(async e=>{try{let t=ns.resolve(e.cwd);if(!Of(ns.resolve(t,"components.json"))&&await M(t)){let i=await B(t);i.length>0&&(e.json?console.log(JSON.stringify({error:"monorepo_root",message:"You are running preset resolve from a monorepo root. Use the -c flag to specify a workspace.",targets:i.map(s=>s.name)},null,2)):W("preset resolve",i),process.exit(1))}let r=await j(t);if(!r){if(e.json){console.log(JSON.stringify(null,null,2));return}l.log("No components.json found.");return}let o=await F(t),n=await ur(r,o);if(e.json){console.log(JSON.stringify(n.code?n:null,null,2));return}gr(n)}catch(t){R(t)}}),go=new Pt().name("preset").description("manage presets").addCommand(_f).addCommand(Uf).addCommand(Vf).addCommand(Df).action(()=>{go.outputHelp()});function vr(e){e instanceof Error&&l.error(e.message),process.exit(1)}import is from"path";import{Command as Mf}from"commander";import ho from"fs-extra";import Bf from"prompts";import{z as yo}from"zod";var Wf=yo.object({cwd:yo.string(),silent:yo.boolean()}),ss=new Mf().name("add").description("add registries to your project").argument("[registries...]","registries (@namespace) or registry URLs (@namespace=url)").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",!1).action(async(e,t)=>{try{let r=Wf.parse({cwd:is.resolve(t.cwd),silent:t.silent}),o=e.length>0?e:await Gf({silent:r.silent});await Jf(o,r.cwd,{silent:r.silent})}catch(r){l.break(),R(r)}});function zf(e){let[t,...r]=e.split("="),o=r.length>0?r.join("="):void 0;if(!t.startsWith("@"))throw new Error(`Invalid registry namespace: ${d.info(t)}. Registry names must start with @ (e.g., @acme).`);return{namespace:t,url:o}}function wo(e,t,r){return`${e} ${e===1?t:r}`}async function Jf(e,t,r){let o=is.resolve(t,"components.json");if(!ho.existsSync(o))throw new Error(`No ${d.info("components.json")} found. Run ${d.info("love-ui init")} first.`);let n=e.map(zf),i=n.filter(g=>!g.url),s=[];if(i.length>0){let g=b("Fetching registries.",{silent:r.silent}).start(),y=await $r();if(!y)throw g.fail(),new Error("Failed to fetch registries.");g.succeed(),s=y}let c={};for(let{namespace:g,url:y}of n){if(g in re){l.warn(`${d.info(g)} is a built-in registry and cannot be added.`);continue}if(y){if(!y.includes("{name}"))throw new Error(`Invalid registry URL for ${d.info(g)}. URL must include {name} placeholder. Example: ${d.info(`${g}=https://example.com/r/{name}.json`)}`);c[g]=y}else{let k=s.find(v=>v.name===g);if(!k)throw new Error(`Registry ${d.info(g)} not found. Provide a URL: ${d.info(`${g}=https://.../{name}.json`)}`);c[g]=k.url}}if(Object.keys(c).length===0)return{addedRegistries:[]};let a=await ho.readJson(o),f=a.registries||{},m={},p=[];for(let[g,y]of Object.entries(c))f[g]?p.push(g):m[g]=y;if(Object.keys(m).length===0){if(p.length>0&&!r.silent){b(`Skipped ${wo(p.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let g of p)l.log(` - ${g}`)}else r.silent||l.info("No new registries to add.");return}let u={...a,registries:{...f,...m}},h=b("Updating components.json.",{silent:r.silent}).start();if(await ho.writeJson(o,u,{spaces:2}),h.succeed(),!r.silent){let g=Object.keys(m);b(`Added ${wo(g.length,"registry","registries")}:`,{silent:r.silent})?.succeed();for(let y of g)l.log(` - ${y}`);if(p.length>0){b(`Skipped ${wo(p.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let y of p)l.log(` - ${y}`)}}}async function Gf(e){let t=b("Fetching registries.",{silent:e.silent}).start(),r=await $r();if(!r)throw t.fail(),new Error("Failed to fetch registries.");t.succeed();let o=[...r].sort((i,s)=>i.name.localeCompare(s.name)),{selected:n}=await Bf({type:"autocompleteMultiselect",name:"selected",message:"Which registries would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:!1,choices:o.map(i=>({title:i.name,description:i.description,value:i.name}))});return n?.length||(l.warn("No registries selected. Exiting."),l.info(""),process.exit(1)),n}import*as Ie from"path";import*as vo from"fs/promises";import*as O from"path";import{z as Se}from"zod";var as=32,Hf=To.options.filter(e=>e!=="registry:example"&&e!=="registry:internal"),Kf=Se.record(Se.string(),Se.unknown()),Yf=Se.array(Se.string()),qf=Se.array(Se.unknown());async function cs(e){let t=O.resolve(e.cwd),r=O.resolve(t,e.registryFile),o={cwd:t,rootFile:r,usesInclude:!1,diagnostics:[],registryFiles:new Set,checkedRegistryFiles:new Set,itemsChecked:0,itemSourcesByItem:new Map,firstIncludedFrom:new Map};if(O.basename(r)!=="registry.json"&&A(o,{registryFile:r,message:"Root source registry file must be named registry.json.",suggestion:"Rename the file to registry.json and pass that file to love-ui registry validate."}),!Co(r,t))return A(o,{registryFile:r,message:`Root registry file must stay inside ${at(t,t)}.`,suggestion:"Run the command from the registry root or pass a registry.json file inside --cwd."}),ko(o,[]);let n=await ms(r,o);if(!n)return ko(o,[]);o.usesInclude=!!n.include?.length,Zf(n,r,o);let i=await fs(r,n,o,[]);return Qf(i,o),await em(i,o),ko(o,i)}async function fs(e,t,r,o){if(o.length>=as)return A(r,{registryFile:e,message:`Registry include tree is too deep. The maximum include depth is ${as}.`,suggestion:"Flatten part of the registry include tree or reduce nested include depth."}),[];if(o.includes(e))return A(r,{registryFile:e,message:`Registry include cycle detected: ${am([...o,e])}.`,suggestion:"Remove one include so the registry graph is acyclic."}),[];let n=o.at(-1)??e,i=r.firstIncludedFrom.get(e);if(i)return A(r,{registryFile:e,message:`Registry file included more than once. First included from ${at(i,r.cwd)}, then included from ${at(n,r.cwd)}.`,suggestion:"Remove one include or move shared items into a single included registry.json."}),[];r.registryFiles.add(e),r.firstIncludedFrom.set(e,n);let s=O.dirname(e),c=[...o,e],a=[];for(let m of t.include??[]){let p=Xf(m,e,s,r);if(!p)continue;let u=await ms(p,r);if(!u)continue;let h=await fs(p,u,r,c);a.push(...h)}let f=!r.usesInclude&&e===r.rootFile?r.cwd:s;return t.items.forEach((m,p)=>{r.itemSourcesByItem.set(m,{registryFile:e,registryDir:f,itemIndex:p})}),[...a,...t.items]}async function ms(e,t){t.checkedRegistryFiles.add(e);let r;try{r=await vo.readFile(e,"utf-8")}catch{return A(t,{registryFile:e,message:"Registry file was not found or could not be read.",suggestion:"Check that the registry.json file exists and is readable."}),null}let o;try{o=JSON.parse(r)}catch{return A(t,{registryFile:e,message:"Registry file contains invalid JSON.",suggestion:"Fix the JSON syntax in the registry.json file."}),null}return om(o,e,t)}function Zf(e,t,r){!e.name&&!e.hasName&&A(r,{registryFile:t,message:'Root registry.json must define "name".',suggestion:'Add a top-level "name" field to the root registry.json.'}),!e.homepage&&!e.hasHomepage&&A(r,{registryFile:t,message:'Root registry.json must define "homepage".',suggestion:'Add a top-level "homepage" field to the root registry.json.'})}function Xf(e,t,r,o){if(q(e))return A(o,{registryFile:t,includePath:e,message:`Remote include "${e}" is not supported.`,suggestion:"Use a relative path to an explicit registry.json file in the same repository."}),null;if(O.isAbsolute(e))return A(o,{registryFile:t,includePath:e,message:`Include "${e}" must be relative.`,suggestion:'Use a path like "components/ui/registry.json".'}),null;if(ps(e))return A(o,{registryFile:t,includePath:e,message:`Include "${e}" cannot use parent-directory traversal.`,suggestion:"Registry includes must descend from the including chunk. Move shared registries into the registry root and include them from there."}),null;if(O.basename(e)!=="registry.json")return A(o,{registryFile:t,includePath:e,message:`Include "${e}" must explicitly reference a registry.json file.`,suggestion:'Use a path like "components/ui/registry.json".'}),null;let n=O.resolve(r,e);return Co(n,o.cwd)?n:(A(o,{registryFile:t,includePath:e,message:`Include "${e}" must stay inside ${at(o.cwd,o.cwd)}.`,suggestion:"Keep included registry.json files inside the registry root."}),null)}function Qf(e,t){let r=new Map;for(let o of e){let n=r.get(o.name);if(!n){r.set(o.name,o);continue}let i=t.itemSourcesByItem.get(n),s=t.itemSourcesByItem.get(o);A(t,{registryFile:s?.registryFile??t.rootFile,itemName:o.name,itemIndex:s?.itemIndex,message:`Duplicate registry item name "${o.name}". First defined at ${lm(i,t.cwd)}.`,suggestion:"Rename one of these items so each name is unique across the resolved registry."})}}async function em(e,t){let r=sm(t);for(let o of e){let n=t.itemSourcesByItem.get(o),i={...rm(o,t,r),$schema:"https://www.loveui.dev/schema/registry-item.json"};for(let c=0;c<(o.files?.length??0);c++){let a=o.files?.[c];if(!a||!n)continue;let f=tm(o,a.path,n,t);if(f)try{await vo.readFile(f,"utf-8")}catch{A(t,{registryFile:n.registryFile,itemName:o.name,itemIndex:n.itemIndex,filePath:a.path,message:`File "${a.path}" was not found or could not be read.`,suggestion:"Make sure the file path is relative to the registry.json file that declares the item."})}}let s=lt.safeParse(i);s.success||Et(s.error,n?.registryFile??t.rootFile,t,{itemName:o.name,itemIndex:n?.itemIndex,suggestion:"Update the registry item so the built item matches the registry item schema."})}}function tm(e,t,r,o){if(q(t))return A(o,{registryFile:r.registryFile,itemName:e.name,itemIndex:r.itemIndex,filePath:t,message:`File path "${t}" cannot be remote.`,suggestion:"Use a local file path relative to the registry.json file that declares the item."}),null;if(O.isAbsolute(t))return A(o,{registryFile:r.registryFile,itemName:e.name,itemIndex:r.itemIndex,filePath:t,message:`File path "${t}" must be relative.`,suggestion:"Use a local file path relative to the registry.json file that declares the item."}),null;if(ps(t))return A(o,{registryFile:r.registryFile,itemName:e.name,itemIndex:r.itemIndex,filePath:t,message:`File path "${t}" cannot use parent-directory traversal.`,suggestion:"Keep item files inside the registry chunk directory."}),null;let n=O.resolve(r.registryDir,t);return Co(n,r.registryDir)?n:(A(o,{registryFile:r.registryFile,itemName:e.name,itemIndex:r.itemIndex,filePath:t,message:`File path "${t}" must stay inside the registry chunk directory.`,suggestion:"Move the file into the same registry chunk directory or update the registry item path."}),null)}function rm(e,t,r){let o=t.itemSourcesByItem.get(e);return{...e,files:e.files?.map(n=>{let i=O.resolve(o?.registryDir??t.cwd,n.path);return{...n,path:O.relative(r,i).split(O.sep).join("/")}})}}function om(e,t,r){let o=Kf.safeParse(e);if(!o.success)return Et(o.error,t,r,{suggestion:"Update the registry.json file so it matches the schema."}),null;let n=o.data,i={$schema:bo(n,"$schema",t,r),name:bo(n,"name",t,r),homepage:bo(n,"homepage",t,r),hasName:n.name!==void 0,hasHomepage:n.homepage!==void 0,items:[]};if(n.include!==void 0){let s=Yf.safeParse(n.include);s.success?i.include=s.data:Et(s.error,t,r,{pathPrefix:["include"],suggestion:"Update include so it is an array of registry.json paths."})}if(n.items!==void 0){let s=qf.safeParse(n.items);s.success?(r.itemsChecked+=s.data.length,i.items=nm(s.data,t,r)):Et(s.error,t,r,{pathPrefix:["items"],suggestion:"Update items so it is an array of registry items."})}return n.items===void 0&&n.include===void 0&&A(r,{registryFile:t,message:"Registry must define at least one of `items` or `include`.",suggestion:'Add an "items" array, an "include" array, or both to registry.json.'}),i}function nm(e,t,r){let o=[];return e.forEach((n,i)=>{let s=lt.safeParse(n);if(!s.success){Et(s.error,t,r,{itemName:im(n),itemIndex:i,suggestion:"Update the registry item so it matches the registry item schema."});return}o.push(s.data)}),o}function bo(e,t,r,o){let n=e[t];if(n!==void 0){if(typeof n=="string")return n;A(o,{registryFile:r,message:`${t}: Expected string, received ${typeof n}.`,suggestion:`Update "${t}" so it is a string.`})}}function im(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e.name;return typeof t=="string"?t:void 0}function Et(e,t,r,o){for(let n of e.errors)A(r,{registryFile:t,itemName:o.itemName,itemIndex:o.itemIndex,message:cm(n,o.pathPrefix),suggestion:o.suggestion})}function A(e,t){e.diagnostics.push(t)}function ko(e,t){return{valid:e.diagnostics.length===0,cwd:e.cwd,registryFiles:e.checkedRegistryFiles.size,registryFilePaths:Array.from(e.checkedRegistryFiles),items:e.itemsChecked,diagnostics:e.diagnostics}}function sm(e){return e.usesInclude?O.dirname(e.rootFile):e.cwd}function ps(e){return e.split(/[\\/]+/).includes("..")}function Co(e,t){let r=O.relative(t,e);return!!r&&!r.startsWith("..")&&!O.isAbsolute(r)}function am(e){return e.map(t=>at(t,O.dirname(e[0]))).join(" -> ")}function lm(e,t){return e?`${at(e.registryFile,t)} items[${e.itemIndex}]`:"unknown source"}function ls(e){return e.length?e.join("."):"(root)"}function cm(e,t=[]){let r=[...t,...e.path];return e.code===Se.ZodIssueCode.invalid_union_discriminator&&e.path.at(-1)==="type"?`${ls(r)}: Invalid registry item type. Expected ${Hf.map(o=>`"${o}"`).join(" | ")}.`:`${ls(r)}: ${e.message}`}function at(e,t){let r=O.relative(t,e);return r&&!r.startsWith("..")&&!O.isAbsolute(r)?r.split(O.sep).join("/"):r?e:"."}import{Command as fm}from"commander";import{z as Ro}from"zod";var mm=Ro.object({cwd:Ro.string(),registryFile:Ro.string()}),gs=new fm().name("validate").description("validate a Love UI registry").argument("[registry]","path to registry.json file","./registry.json").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{let r;try{let o=mm.parse({cwd:Ie.resolve(t.cwd),registryFile:e});r=b("Validating registry.").start();let n=await cs(o);pm(n,r),n.valid||(process.exitCode=1)}catch(o){r?.fail("Registry validation failed."),l.break(),R(o)}});function pm(e,t){if(e.valid){t.succeed("Registry is valid."),us(e,{success:!0});return}t.fail("Registry validation failed."),us(e),l.break();for(let[r,o]of Array.from(um(e))){l.log(d.info(hs(r,e.cwd)));for(let n of o)l.error(` - ${dm(n)}`),n.suggestion&&l.log(` ${n.suggestion}`);l.break()}}function us(e,t={}){let r=`Checked ${ds(e.registryFiles,"registry file","registry files")} and ${ds(e.items,"item","items")}.`;t.success?gm(r):l.log(` ${r}`);for(let o of e.registryFilePaths)l.log(` - ${hs(o,e.cwd)}`)}function um(e){let t=new Map;for(let r of e.diagnostics){let o=t.get(r.registryFile)??[];o.push(r),t.set(r.registryFile,o)}return t}function dm(e){let t=[];return e.itemIndex!==void 0&&t.push(`items[${e.itemIndex}]`),e.itemName&&t.push(`"${e.itemName}"`),e.includePath&&t.push(`include "${e.includePath}"`),e.filePath&&t.push(`file "${e.filePath}"`),t.length?`${t.join(" ")}: ${e.message}`:e.message}function hs(e,t){let r=Ie.relative(t,e);return r&&!r.startsWith("..")&&!Ie.isAbsolute(r)?r.split(Ie.sep).join("/"):r?e:"."}function gm(e){b(e).succeed()}function ds(e,t,r){return`${e} ${e===1?t:r}`}import{Command as hm}from"commander";var ys=new hm().name("registry").description("manage registries").addCommand(ss).addCommand(gs);import ws from"path";import{Command as ym}from"commander";import bs from"fs-extra";import{z as $t}from"zod";var wm=$t.object({cwd:$t.string(),query:$t.string().optional(),limit:$t.number().optional(),offset:$t.number().optional()}),ks=new ym().name("search").alias("list").description("search items from registries").argument("<registries...>","the registry names or urls to search items from. Names must be prefixed with @.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-q, --query <query>","query string").option("-l, --limit <number>","maximum number of items to display per registry","100").option("-o, --offset <number>","number of items to skip","0").action(async(e,t)=>{try{let r=wm.parse({cwd:ws.resolve(t.cwd),query:t.query,limit:t.limit?parseInt(t.limit,10):void 0,offset:t.offset?parseInt(t.offset,10):void 0});await ee(r.cwd);let o=Ge({style:"new-york",resolvedPaths:{cwd:r.cwd}}),n=L(o),i=ws.resolve(r.cwd,"components.json");if(bs.existsSync(i)){let m=await bs.readJson(i),p=z.partial().parse(m);n=L({...o,...p})}let s=n;try{let m=await j(r.cwd);m&&(s=L(m))}catch{}let{config:c,newRegistries:a}=await G(e.map(m=>`${m}/registry`),s,{silent:!0,writeFile:!1});a.length>0&&(s.registries=c.registries),zt(e,s);let f=await ln(e,{query:r.query,limit:r.limit,offset:r.offset,config:s});console.log(JSON.stringify(f,null,2)),process.exit(0)}catch(r){R(r)}finally{ne()}});import vs from"path";import{Command as bm}from"commander";import Cs from"fs-extra";import{z as Rs}from"zod";var km=Rs.object({cwd:Rs.string()}),xs=new bm().name("view").description("view items from the registry").argument("<items...>","the item names or URLs to view").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=km.parse({cwd:vs.resolve(t.cwd)});await ee(r.cwd);let o=L({}),n=vs.resolve(r.cwd,"components.json");if(Cs.existsSync(n)){let f=await Cs.readJson(n),m=z.partial().parse(f);o=L(m)}let i=o;try{let f=await j(r.cwd);f&&(i=L(f))}catch{}let{config:s,newRegistries:c}=await G(e,i,{silent:!0,writeFile:!1});c.length>0&&(i.registries=s.registries),zt(e,i);let a=await ie(e,{config:i});console.log(JSON.stringify(a,null,2)),process.exit(0)}catch(r){R(r)}finally{ne()}});import{Command as vm}from"commander";var Ss=new vm().name("whoami").description("show current LoveUI Pro login").action(async()=>{try{let e=await $o();if(!e?.token){l.warn("Not logged in to LoveUI Pro.");return}l.log(e.email?`Logged in as ${e.email}.`:"Logged in.")}catch(e){l.break(),R(e)}});import{Command as Cm}from"commander";process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function Rm(){let e=new Cm().name("love-ui").description("build your Love UI component library").version(Zo.version||"1.0.0","-v, --version","display the version number");e.addCommand(qn).addCommand(gi).addCommand(fi).addCommand(Ci).addCommand(xi).addCommand(xs).addCommand(ks).addCommand(os).addCommand(Ii).addCommand(Wi).addCommand(ki).addCommand(lo).addCommand(go).addCommand(Ji).addCommand(Gi).addCommand(Ss).addCommand(ys),e.parse()}Rm();export{en as fetchTree,tn as getItemTargetPath,He as getLoveUIRegistryIndex,Tm as getPreset,jm as getPresets,$r as getRegistries,Em as getRegistriesConfig,rn as getRegistriesIndex,Im as getRegistry,Jt as getRegistryBaseColor,Qo as getRegistryBaseColors,Xo as getRegistryIcons,ie as getRegistryItems,Er as getRegistryStyles,Pm as resolveRegistryItems,$m as resolveTree};
|