love-ui 1.2.10 → 1.2.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,9 +1,15 @@
1
1
  #!/usr/bin/env node
2
- import{spawnSync as I}from"child_process";import{existsSync as $}from"fs";import{mkdir as A,readdir as z,readFile as P,writeFile as S}from"fs/promises";import c from"path";import{pathToFileURL as J,fileURLToPath as B}from"url";var M=c.dirname(B(import.meta.url)),X=c.resolve(M,".."),W=c.join(X,"packages"),H=new Set([".ts",".tsx",".cts",".mts",".js",".jsx",".css",".scss",".sass",".mdx",".md"]),V=new Set(["node_modules","dist",".turbo",".next","build",".cache"]),U=new Set(["accordion","alert","alert-dialog","autocomplete","avatar","badge","breadcrumb","button","card","checkbox","checkbox-group","collapsible","combobox","command","dialog","empty","field","fieldset","form","frame","group","input","label","menu","meter","number-field","pagination","popover","preview-card","progress","radio-group","scroll-area","select","separator","sheet","skeleton","slider","switch","table","tabs","textarea","toast","toggle","toggle-group","toolbar","tooltip"]);function N(e){if(!e)return e;let t=e.split("/");return t[t.length-1]||e}function Y(e){let t=e.trim();return t&&((t.startsWith("@/")||t.startsWith("~/"))&&(t=`src/${t.slice(2)}`),t.startsWith("/")&&(t=t.slice(1)),t=t.replace(/^\.\//,""),t=t.replace(/\/+$/,""),t)}function _(e){let t=N(e);return t==="ui"?"love-ui":t}function q(e){let t=e.loveui??{},n=typeof t.target=="string"?t.target.trim():"",s=t.category;if(n){let i=typeof t.includePackageName=="boolean"?t.includePackageName:!1;return{base:n.replace(/\/+$/,""),includePackageName:i}}return s==="feature"?{base:"components",includePackageName:!0}:s==="block"?{base:"components/blocks",includePackageName:!0}:{base:"components/ui",includePackageName:!0}}function G(e,t,n){let s=e.startsWith("src/")?e.slice(4):e;if(!t.includePackageName){let f=t.base.split("/").filter(Boolean),p=f[f.length-1];p&&s.startsWith(`${p}/`)&&(s=s.slice(p.length+1))}let l=`${(t.includePackageName?`${t.base}/${n}`:t.base).replace(/\/+/g,"/")}/${s}`.replace(/\/+/g,"/");return{cleanedPath:s,target:l}}async function K(e){let t=c.join(e,"components.json");try{let n=await P(t,"utf8"),i=JSON.parse(n).aliases?.components;return i?Y(i):null}catch{return null}}async function Q(e){let t=["tsconfig.json","jsconfig.json"].map(n=>c.join(e,n)).find(n=>$(n));if(t)try{let n=await P(t,"utf8"),i=JSON.parse(n).compilerOptions?.paths;if(i&&typeof i=="object")for(let a of Object.keys(i)){let l=i[a];if(a==="@/*"&&Array.isArray(l)&&l.some(f=>f.startsWith("src/")||f.startsWith("./src/")))return"src/components";if(a==="@/*"&&Array.isArray(l)&&l.some(f=>f.startsWith("app/")||f.startsWith("./app/")))return"app/components"}}catch{}return $(c.join(e,"src"))?"src/components":$(c.join(e,"app"))?"app/components":"components"}function T(e,t,n){let s=a=>{let l=a.startsWith("/"),f=a.endsWith("/"),p=a.split("/").filter(Boolean),m=[];for(let k of p)m[m.length-1]!==k&&m.push(k);let u=m.join("/");return`${l?"/":""}${u}${f?"/":""}`};if(n)return s(e);let i=t.replace(/\/+$/,"");if(e.startsWith("components/")){let a=e.slice(10);return s(`${i}${a}`.replace(/^\//,""))}if(e.startsWith("lib/")){if(i.startsWith("src/"))return s(`src/${e}`);if(i.startsWith("app/"))return s(`app/${e}`)}if(e.startsWith("hooks/")){if(i.startsWith("src/"))return s(`src/${e}`);if(i.startsWith("app/"))return s(`app/${e}`)}return e.startsWith("ui/")?s(`${i}/${e}`):s(e)}async function E(e,t){let n=c.dirname(c.join(t,e));await A(n,{recursive:!0})}async function Z(e,t){let n=c.join(e,"package.json"),s={};try{let p=await P(n,"utf8");s=JSON.parse(p)}catch{}let i=q(s),a=N(t),l=[];async function f(p,m){let u=await z(p,{withFileTypes:!0});for(let k of u){if(V.has(k.name))continue;let j=c.join(p,k.name);if(k.isDirectory()){await f(j,m);continue}let x=c.extname(k.name);if(!H.has(x)||k.name==="package.json")continue;let R=c.relative(m,j).split(c.sep).join("/"),{target:v}=G(R,i,a),F=await P(j,"utf8");l.push({path:R,target:v,content:F})}}return await f(e,e),l}async function ee(e){let t=c.join(W,"love-ui"),n=c.join(t,"src","ui",`${e}.tsx`);if(!$(n))return null;try{let s=[],i=await P(n,"utf8");i=i.replace(/from\s+["']@loveui\/ui\/lib\/utils["']/g,'from "@/lib/utils"'),s.push({path:`src/ui/${e}.tsx`,target:`components/ui/${e}.tsx`,content:i});let a=c.join(t,"src","lib","utils.ts");if($(a)){let l=await P(a,"utf8");s.push({path:"src/lib/utils.ts",target:"lib/utils.ts",content:l})}return s}catch(s){return console.warn(`Warning: unable to read ${e} component`,s),null}}async function te(e){if(U.has(e))return await ee(e);let t=_(e),n=c.join(W,t);if(!$(n))return null;try{return await Z(n,e)}catch(s){return console.warn(`Warning: unable to read bundled sources for ${e}`,s),null}}var ne={"@base-ui-components/react":"1.0.0-beta.4","class-variance-authority":"^0.7.1",clsx:"^2.1.1","tailwind-merge":"^3.3.1"};async function se(e){if(U.has(e))return{...ne};let t=_(e),n=c.join(W,t,"package.json");try{let s=await P(n,"utf8");return JSON.parse(s).dependencies??{}}catch{return{}}}async function ie(e){return $(c.join(e,"bun.lockb"))?"bun":$(c.join(e,"pnpm-lock.yaml"))?"pnpm":$(c.join(e,"yarn.lock"))?"yarn":"npm"}async function re(e,t,n){let s=Object.entries(e);if(s.length===0)return!0;console.log(`
3
- Installing dependencies...`);let i=s.map(([f,p])=>`${f}@${p}`),a;switch(t){case"bun":a=`bun add ${i.join(" ")}`;break;case"pnpm":a=`pnpm add ${i.join(" ")}`;break;case"yarn":a=`yarn add ${i.join(" ")}`;break;default:a=`npm install ${i.join(" ")}`}let l=I(a,{stdio:"inherit",shell:!0,cwd:n});return l.error||l.status!==0?(console.warn(`
4
- Failed to install dependencies. You may need to install them manually:`),console.warn(` ${i.join(`
2
+ import{spawnSync as Y}from"child_process";import{existsSync as p}from"fs";import{mkdir as O,readdir as q,readFile as j,writeFile as A}from"fs/promises";import a from"path";import{pathToFileURL as K,fileURLToPath as Q}from"url";var Z=a.dirname(Q(import.meta.url)),tt=a.resolve(Z,".."),E=a.join(tt,"packages"),et=new Set([".ts",".tsx",".cts",".mts",".js",".jsx",".css",".scss",".sass",".mdx",".md"]),nt=new Set(["node_modules","dist",".turbo",".next","build",".cache"]),B=new Set(["accordion","alert","alert-dialog","autocomplete","avatar","badge","breadcrumb","button","card","checkbox","checkbox-group","collapsible","combobox","command","dialog","empty","field","fieldset","form","frame","group","input","label","menu","meter","number-field","pagination","popover","preview-card","progress","radio-group","scroll-area","select","separator","sheet","skeleton","slider","switch","table","tabs","textarea","toast","toggle","toggle-group","toolbar","tooltip"]),st=[".ts",".tsx",".js",".jsx"],J=/(^|\/)lib\/utils(?:\.[a-z]+)?$/i,it=/@loveui\/ui\/lib\/utils|@loveui\/shadcn-ui\/lib\/utils|@love-ui\/shadcn-ui\/lib\/utils|@\/lib\/utils|~\/lib\/utils|(?:\.\.\/)+ui\/src\/lib\/utils/,rt=`import { clsx, type ClassValue } from "clsx"
3
+ import { twMerge } from "tailwind-merge"
4
+
5
+ export function cn(...inputs: ClassValue[]) {
6
+ return twMerge(clsx(inputs))
7
+ }
8
+ `;function V(t){if(!t)return t;let e=t.split("/");return e[e.length-1]||t}function X(t){let e=t.trim();return e&&((e.startsWith("@/")||e.startsWith("~/"))&&(e=`src/${e.slice(2)}`),e.startsWith("/")&&(e=e.slice(1)),e=e.replace(/^\.\//,""),e=e.replace(/\/+$/,""),e)}function ot(t){return t.trim().replace(/\/+$/,"")}function k(t){return t.replace(/\.(?:ts|tsx|js|jsx)$/i,"")}function z(t){let e=k(t);return st.map(s=>`${e}${s}`)}function at(t){let e=t.replace(/\/+$/,"");return e==="src"||e.startsWith("src/")?"src":e==="app"||e.startsWith("app/")?"app":null}function G(t){let e=V(t);return e==="ui"?"love-ui":e}function ct(t){let e=t.loveui??{},s=typeof e.target=="string"?e.target.trim():"",n=e.category;if(s){let r=typeof e.includePackageName=="boolean"?e.includePackageName:!1;return{base:s.replace(/\/+$/,""),includePackageName:r}}return n==="feature"?{base:"components",includePackageName:!0}:n==="block"?{base:"components/blocks",includePackageName:!0}:{base:"components/ui",includePackageName:!0}}function lt(t,e,s){let n=t.startsWith("src/")?t.slice(4):t;if(!e.includePackageName){let d=e.base.split("/").filter(Boolean),u=d[d.length-1];u&&n.startsWith(`${u}/`)&&(n=n.slice(u.length+1))}let c=`${(e.includePackageName?`${e.base}/${s}`:e.base).replace(/\/+/g,"/")}/${n}`.replace(/\/+/g,"/");return{cleanedPath:n,target:c}}async function ut(t){let e=a.join(t,"components.json");try{let s=await j(e,"utf8");return JSON.parse(s).aliases??null}catch{return null}}async function gt(t){let e=["tsconfig.json","jsconfig.json"].map(s=>a.join(t,s)).find(s=>p(s));if(!e)return null;try{let s=await j(e,"utf8"),r=JSON.parse(s).compilerOptions?.paths;return!r||typeof r!="object"?null:r}catch{return null}}function pt(t,e){if(typeof t=="string"){if(t.trim().startsWith("~/"))return"~/";if(t.trim().startsWith("@/"))return"@/"}if(e){if(Object.prototype.hasOwnProperty.call(e,"~/*"))return"~/";if(Object.prototype.hasOwnProperty.call(e,"@/*"))return"@/"}return"@/"}async function ft(t,e,s){if(e&&e.length>0)return e;let n=["src/components/ui","app/components/ui","components/ui"];for(let i of n)if(p(a.join(t,i)))return i.replace(/\/ui$/,"");let r=["src/components","app/components","components"];for(let i of r)if(p(a.join(t,i)))return i;if(s){let i=s["@/*"]??s["~/*"]??[];if(Array.isArray(i)&&i.some(c=>/^\.?\/?src\//.test(c)))return"src/components";if(Array.isArray(i)&&i.some(c=>/^\.?\/?app\//.test(c)))return"app/components"}return p(a.join(t,"src"))?"src/components":p(a.join(t,"app"))?"app/components":"components"}async function dt(t,e,s,n){let r=n?.utils??(n?.lib?`${n.lib.replace(/\/+$/,"")}/utils`:void 0);if(r&&r.trim().length>0){let u=k(ot(r)),f=k(X(r));for(let w of z(f))if(p(a.join(t,w)))return{utilsImportPath:u,utilsFilePath:w};return{utilsImportPath:u,utilsFilePath:`${f}.ts`}}let i=at(e),c=i?`${i}/lib/utils`:"lib/utils",d=Array.from(new Set([c,"src/lib/utils","app/lib/utils","lib/utils"]));for(let u of d)for(let f of z(u))if(p(a.join(t,f)))return{utilsImportPath:`${s}lib/utils`,utilsFilePath:f};return{utilsImportPath:`${s}lib/utils`,utilsFilePath:`${c}.ts`}}function M(t,e,s){let n=c=>{let d=c.startsWith("/"),u=c.endsWith("/"),f=c.split("/").filter(Boolean),w=[];for(let $ of f)w[w.length-1]!==$&&w.push($);let x=w.join("/");return`${d?"/":""}${x}${u?"/":""}`},r=e.replace(/\/+$/,""),i=t.replace(/^\.?\//,"");if(J.test(i))return n(s);if(i.startsWith("components/")){let c=i.slice(10);return n(`${r}${c}`.replace(/^\//,""))}if(i.startsWith("lib/")){if(r.startsWith("src/"))return n(`src/${i}`);if(r.startsWith("app/"))return n(`app/${i}`)}if(i.startsWith("hooks/")){if(r.startsWith("src/"))return n(`src/${i}`);if(r.startsWith("app/"))return n(`app/${i}`)}return i.startsWith("ui/")?n(`${r}/${i}`):n(i)}function _(t,e){let s=e.startsWith("~/")?"~/":"@/",n=t;return n=n.replace(/@\/registry\/building-blocks\/default\/components\//g,`${s}components/`),n=n.replace(/@\/registry\/building-blocks\/default\/ui\//g,`${s}components/ui/`),n=n.replace(/@\/registry\/building-blocks\/default\/lib\//g,`${s}lib/`),n=n.replace(/@\/registry\/building-blocks\/default\/hooks\//g,`${s}hooks/`),n=n.replace(/@\/registry\/default\/components\//g,`${s}components/`),n=n.replace(/@\/registry\/default\/ui\//g,`${s}components/ui/`),n=n.replace(/@\/registry\/default\/lib\//g,`${s}lib/`),n=n.replace(/@\/registry\/default\/hooks\//g,`${s}hooks/`),n=n.replace(/from\s+["']@loveui\/ui\/lib\/utils["']/g,`from "${e}"`),n=n.replace(/from\s+["']@loveui\/shadcn-ui\/lib\/utils["']/g,`from "${e}"`),n=n.replace(/from\s+["']@love-ui\/shadcn-ui\/lib\/utils["']/g,`from "${e}"`),n=n.replace(/from\s+["']@\/lib\/utils["']/g,`from "${e}"`),n=n.replace(/from\s+["']~\/lib\/utils["']/g,`from "${e}"`),n=n.replace(/from\s+["'](?:\.\.\/)+ui\/src\/lib\/utils["']/g,`from "${e}"`),n}async function mt(t,e){if(p(a.join(t,e)))return!1;let s=rt,n=a.join(E,"love-ui","src","lib","utils.ts");if(p(n))try{s=await j(n,"utf8")}catch{}return await L(e,t),await A(a.join(t,e),s,"utf8"),!0}async function L(t,e){let s=a.dirname(a.join(e,t));await O(s,{recursive:!0})}async function ht(t,e){let s=a.join(t,"package.json"),n={};try{let u=await j(s,"utf8");n=JSON.parse(u)}catch{}let r=ct(n),i=V(e),c=[];async function d(u,f){let w=await q(u,{withFileTypes:!0});for(let x of w){if(nt.has(x.name))continue;let $=a.join(u,x.name);if(x.isDirectory()){await d($,f);continue}let P=a.extname(x.name);if(!et.has(P)||x.name==="package.json")continue;let g=a.relative(f,$).split(a.sep).join("/"),{target:v}=lt(g,r,i),R=await j($,"utf8");c.push({path:g,target:v,content:R})}}return await d(t,t),c}async function yt(t,e){let s=a.join(E,"love-ui"),n=a.join(s,"src","ui",`${t}.tsx`);if(!p(n))return null;try{let r=[],i=await j(n,"utf8");i=_(i,e),r.push({path:`src/ui/${t}.tsx`,target:`components/ui/${t}.tsx`,content:i});let c=a.join(s,"src","lib","utils.ts");if(p(c)){let d=await j(c,"utf8");r.push({path:"src/lib/utils.ts",target:"lib/utils.ts",content:d})}return r}catch(r){return console.warn(`Warning: unable to read ${t} component`,r),null}}async function bt(t,e){if(B.has(t))return await yt(t,e);let s=G(t),n=a.join(E,s);if(!p(n))return null;try{return await ht(n,t)}catch(r){return console.warn(`Warning: unable to read bundled sources for ${t}`,r),null}}var $t={"@base-ui-components/react":"1.0.0-beta.4","class-variance-authority":"^0.7.1",clsx:"^2.1.1","tailwind-merge":"^3.3.1"};async function wt(t){if(B.has(t))return{...$t};let e=G(t),s=a.join(E,e,"package.json");try{let n=await j(s,"utf8");return JSON.parse(n).dependencies??{}}catch{return{}}}async function Pt(t){return p(a.join(t,"bun.lockb"))?"bun":p(a.join(t,"pnpm-lock.yaml"))?"pnpm":p(a.join(t,"yarn.lock"))?"yarn":"npm"}async function jt(t,e,s){let n=Object.entries(t);if(n.length===0)return!0;console.log(`
9
+ Installing dependencies...`);let r=n.map(([d,u])=>`${d}@${u}`),i;switch(e){case"bun":i=`bun add ${r.join(" ")}`;break;case"pnpm":i=`pnpm add ${r.join(" ")}`;break;case"yarn":i=`yarn add ${r.join(" ")}`;break;default:i=`npm install ${r.join(" ")}`}let c=Y(i,{stdio:"inherit",shell:!0,cwd:s});return c.error||c.status!==0?(console.warn(`
10
+ Failed to install dependencies. You may need to install them manually:`),console.warn(` ${r.join(`
5
11
  `)}`),!1):(console.log(`Dependencies installed successfully!
6
- `),!0)}async function oe(e=process.argv.slice(2)){(e.length===0||e.length===1&&(e[0]==="--version"||e[0]==="-v"))&&(console.log("love-ui version 1.1.9"),process.exit(0)),(e.length<2||e[0]!=="add")&&(console.log("Usage: npx love-ui add [...packages]"),console.log(" npx love-ui --version"),process.exit(1));let t=e.slice(1),n=process.cwd(),s=await K(n),i=await Q(n),a=s??i,l=s!==null,f=await ie(n),p={};for(let m of t){if(!m.trim())continue;console.log(`
7
- Adding ${m}...`);let u=null,k=null;if(m.startsWith("http://")||m.startsWith("https://")){let r=m;r.includes("/building-blocks/r/")&&(r=r.replace("/building-blocks/r/","/building-blocks/"),console.log(`Auto-corrected URL to: ${r}`));try{let o=await fetch(r);o.ok?u=await o.json():console.warn(`Failed to fetch ${r}: HTTP ${o.status}`)}catch(o){console.warn(`Failed to fetch from ${r}:`,o)}}else{let r=new URL(`r/${m}.json`,"https://www.loveui.dev/");try{let o=await fetch(r);o.ok&&(u=await o.json())}catch{}k=await te(m)}let j=k??u?.files??[];j=j.map(r=>{let o=r.target||r.path;return o.startsWith("registry/default/")&&(o=o.replace("registry/default/","")),{...r,target:o}});let x=j.find(r=>r.target.match(/^components\/comp-\d+\.tsx$/));if(x){let r=j.filter(o=>o.target.match(/^components\/[^/]+\//)&&o.target!==x.target);if(r.length>0&&r[0]){let o=r[0].target.match(/^components\/([^/]+)\//);if(o&&o[1]){let h=o[1];x.target=`components/${h}-demo.tsx`}}else if(u?.meta?.tags&&Array.isArray(u.meta.tags)&&u.meta.tags.length>0){let h=u.meta.tags.slice(0,2).filter(b=>b.length>0);if(h.length>0){let b=h.join("-").toLowerCase().replace(/\s+/g,"-");x.target=`components/${b}.tsx`}}}if(!j.length){console.warn(`Component "${m}" not found. Available components can be found at https://loveui.dev`);continue}l||await A(c.join(n,a),{recursive:!0});let R=0,v=0;for(let r of j){if(!r.content)continue;let o=T(r.target,a,l),h=c.join(n,o),b=$(h),g=r.content;if(g=g.replace(/@\/registry\/building-blocks\/default\/components\//g,"@/components/"),g=g.replace(/@\/registry\/building-blocks\/default\/ui\//g,"@/components/ui/"),g=g.replace(/@\/registry\/building-blocks\/default\/lib\//g,"@/lib/"),g=g.replace(/@\/registry\/building-blocks\/default\/hooks\//g,"@/hooks/"),g=g.replace(/@\/registry\/default\/components\//g,"@/components/"),g=g.replace(/@\/registry\/default\/ui\//g,"@/components/ui/"),g=g.replace(/@\/registry\/default\/lib\//g,"@/lib/"),g=g.replace(/@\/registry\/default\/hooks\//g,"@/hooks/"),b)try{if(await P(h,"utf8")===g)continue}catch{}await E(o,n),await S(h,g,"utf8"),b?v++:R++}if(R>0&&console.log(`\u2713 Created ${R} file${R>1?"s":""}`),v>0&&console.log(`\u2713 Updated ${v} file${v>1?"s":""}`),u?.registryDependencies&&u.registryDependencies.length>0){console.log(`
8
- Installing ${u.registryDependencies.length} required component${u.registryDependencies.length>1?"s":""}...`);for(let r of u.registryDependencies){let o=r;r.startsWith("https://loveui.dev/building-blocks/r/")&&(o=`https://ui.loveui.dev/ui/r/${r.split("/").pop()}`);try{let h=await fetch(o);if(h.ok){let b=await h.json(),C=(b?.files??[]).map(y=>{let w=y.target||y.path;return w.startsWith("registry/default/")&&(w=w.replace("registry/default/","")),{...y,target:w}});for(let y of C){if(!y.content)continue;let w=T(y.target,a,l),D=c.join(n,w),L=$(D),d=y.content;if(d=d.replace(/@\/registry\/building-blocks\/default\/components\//g,"@/components/"),d=d.replace(/@\/registry\/building-blocks\/default\/ui\//g,"@/components/ui/"),d=d.replace(/@\/registry\/building-blocks\/default\/lib\//g,"@/lib/"),d=d.replace(/@\/registry\/building-blocks\/default\/hooks\//g,"@/hooks/"),d=d.replace(/@\/registry\/default\/components\//g,"@/components/"),d=d.replace(/@\/registry\/default\/ui\//g,"@/components/ui/"),d=d.replace(/@\/registry\/default\/lib\//g,"@/lib/"),d=d.replace(/@\/registry\/default\/hooks\//g,"@/hooks/"),L)try{if(await P(D,"utf8")===d)continue}catch{}await E(w,n),await S(D,d,"utf8")}let O=["@loveui/shadcn-ui","jotai","lucide-react","react","react-dom"];if(b?.dependencies)if(Array.isArray(b.dependencies))b.dependencies.forEach(y=>{O.includes(y)||(p[y]="latest")});else{let y=b.dependencies;Object.keys(y).forEach(w=>{!O.includes(w)&&y[w]&&(p[w]=y[w])})}}else console.warn(` \u2717 Failed to fetch ${o}: HTTP ${h.status}`)}catch(h){console.warn(` \u2717 Failed to install ${o}:`,h.message)}}console.log("\u2713 Installed registry dependencies")}let F={};u?.dependencies?Array.isArray(u.dependencies)?u.dependencies.forEach(r=>{F[r]="latest"}):F=u.dependencies:F=await se(m),Object.assign(p,F)}Object.keys(p).length>0&&await re(p,f,n),console.log(`
9
- \u2713 Done! You can now import and use the components in your app.`)}var ae=process.argv[1]&&(import.meta.url===J(process.argv[1]).href||process.argv[1].includes("love-ui")||process.argv[1].includes("loveui"));ae&&oe().catch(e=>{console.error(e),process.exit(1)});export{oe as run};
12
+ `),!0)}async function xt(t=process.argv.slice(2)){(t.length===0||t.length===1&&(t[0]==="--version"||t[0]==="-v"))&&(console.log("love-ui version 1.1.9"),process.exit(0)),(t.length<2||t[0]!=="add")&&(console.log("Usage: npx love-ui add [...packages]"),console.log(" npx love-ui --version"),process.exit(1));let e=t.slice(1),s=process.cwd(),n=await ut(s),r=await gt(s),i=n?.components?X(n.components):null,c=await ft(s,i,r),d=pt(n?.components,r),{utilsImportPath:u,utilsFilePath:f}=await dt(s,c,d,n),w=await Pt(s),x=c.endsWith("/ui")?c:`${c}/ui`;await O(a.join(s,c),{recursive:!0}),await O(a.join(s,x),{recursive:!0});let $={};for(let P of e){if(!P.trim())continue;console.log(`
13
+ Adding ${P}...`);let g=null,v=null;if(P.startsWith("http://")||P.startsWith("https://")){let o=P;o.includes("/building-blocks/r/")&&(o=o.replace("/building-blocks/r/","/building-blocks/"),console.log(`Auto-corrected URL to: ${o}`));try{let l=await fetch(o);l.ok?g=await l.json():console.warn(`Failed to fetch ${o}: HTTP ${l.status}`)}catch(l){console.warn(`Failed to fetch from ${o}:`,l)}}else{let o=new URL(`r/${P}.json`,"https://www.loveui.dev/");try{let l=await fetch(o);l.ok&&(g=await l.json())}catch{}v=await bt(P,u)}let R=v??g?.files??[];R=R.map(o=>{let l=o.target||o.path;return l.startsWith("registry/default/")&&(l=l.replace("registry/default/","")),{...o,target:l}});let F=R.find(o=>o.target.match(/^components\/comp-\d+\.tsx$/));if(F){let o=R.filter(l=>l.target.match(/^components\/[^/]+\//)&&l.target!==F.target);if(o.length>0&&o[0]){let l=o[0].target.match(/^components\/([^/]+)\//);if(l&&l[1]){let m=l[1];F.target=`components/${m}-demo.tsx`}}else if(g?.meta?.tags&&Array.isArray(g.meta.tags)&&g.meta.tags.length>0){let m=g.meta.tags.slice(0,2).filter(y=>y.length>0);if(m.length>0){let y=m.join("-").toLowerCase().replace(/\s+/g,"-");F.target=`components/${y}.tsx`}}}if(!R.length){console.warn(`Component "${P}" not found. Available components can be found at https://loveui.dev`);continue}R.some(o=>J.test(o.target)||typeof o.content=="string"&&it.test(o.content))&&await mt(s,f);let T=0,C=0;for(let o of R){if(!o.content)continue;let l=M(o.target,c,f),m=a.join(s,l),y=p(m);if(k(l)===k(f)&&y)continue;let D=_(o.content,u);if(y)try{if(await j(m,"utf8")===D)continue}catch{}await L(l,s),await A(m,D,"utf8"),y?C++:T++}if(T>0&&console.log(`\u2713 Created ${T} file${T>1?"s":""}`),C>0&&console.log(`\u2713 Updated ${C} file${C>1?"s":""}`),g?.registryDependencies&&g.registryDependencies.length>0){console.log(`
14
+ Installing ${g.registryDependencies.length} required component${g.registryDependencies.length>1?"s":""}...`);for(let o of g.registryDependencies){let l=o;o.startsWith("https://loveui.dev/building-blocks/r/")&&(l=`https://ui.loveui.dev/ui/r/${o.split("/").pop()}`);try{let m=await fetch(l);if(m.ok){let y=await m.json(),D=(y?.files??[]).map(h=>{let b=h.target||h.path;return b.startsWith("registry/default/")&&(b=b.replace("registry/default/","")),{...h,target:b}});for(let h of D){if(!h.content)continue;let b=M(h.target,c,f),W=a.join(s,b),N=p(W);if(k(b)===k(f)&&N)continue;let I=_(h.content,u);if(N)try{if(await j(W,"utf8")===I)continue}catch{}await L(b,s),await A(W,I,"utf8")}let S=["@loveui/shadcn-ui","jotai","lucide-react","react","react-dom"];if(y?.dependencies)if(Array.isArray(y.dependencies))y.dependencies.forEach(h=>{S.includes(h)||($[h]="latest")});else{let h=y.dependencies;Object.keys(h).forEach(b=>{!S.includes(b)&&h[b]&&($[b]=h[b])})}}else console.warn(` \u2717 Failed to fetch ${l}: HTTP ${m.status}`)}catch(m){console.warn(` \u2717 Failed to install ${l}:`,m.message)}}console.log("\u2713 Installed registry dependencies")}let U={};g?.dependencies?Array.isArray(g.dependencies)?g.dependencies.forEach(o=>{U[o]="latest"}):U=g.dependencies:U=await wt(P),Object.assign($,U)}Object.keys($).length>0&&await jt($,w,s),console.log(`
15
+ \u2713 Done! You can now import and use the components in your app.`)}var Rt=process.argv[1]&&(import.meta.url===K(process.argv[1]).href||process.argv[1].includes("love-ui")||process.argv[1].includes("loveui"));Rt&&xt().catch(t=>{console.error(t),process.exit(1)});export{xt as run};
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{constants as ke}from"fs";import{access as Se,readFile as V}from"fs/promises";import c from"path";import{fileURLToPath as Pe}from"url";import{Server as be}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as je}from"@modelcontextprotocol/sdk/server/stdio.js";import{CallToolRequestSchema as Ee,ErrorCode as g,ListResourceTemplatesRequestSchema as Te,ListResourcesRequestSchema as xe,ListToolsRequestSchema as Ie,McpError as d,ReadResourceRequestSchema as _e}from"@modelcontextprotocol/sdk/types.js";var N={name:"love-ui",version:"1.2.10",private:!1,license:"AGPL-3.0-or-later",type:"module",bin:{loveui:"dist/index.js","love-ui":"dist/index.js","loveui-mcp":"dist/mcp-server.js"},files:["dist","packages","*.ts","*.tsx","*.css","*.mdx"],main:"packages/love-ui/index.ts",types:"packages/love-ui/index.ts",exports:{".":{import:"./packages/love-ui/index.ts",require:"./packages/love-ui/index.ts"},"./lib/*":"./packages/love-ui/*","./components/*":"./packages/love-ui/components/*","./shadcn-ui/*":"./packages/shadcn-ui/*","./package.json":"./package.json"},dependencies:{"@modelcontextprotocol/sdk":"^1.18.1",postcss:"^8.5.6","postcss-nested":"^7.0.2"},scripts:{build:"tsup",postbuild:"node ./scripts/copy-packages.mjs",clean:"rimraf dist packages"},devDependencies:{"@types/node":"^20.14.10",rimraf:"^6.0.1",tsup:"^8.5.0"}};import{constants as re}from"fs";import{access as ie,readFile as U,readdir as W}from"fs/promises";import I,{extname as G,join as x,relative as oe}from"path";import{fileURLToPath as ae}from"url";import q from"postcss";import ce from"postcss-nested";var le=I.dirname(ae(import.meta.url)),pe=I.resolve(le,".."),J=I.join(pe,"packages"),me=new Set([".turbo",".next",".git","dist","build","storybook-static","node_modules","__tests__","__mocks__","coverage"]),ue=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".css",".scss",".sass",".mdx"]),ge=new Set(["package.json","tsconfig.json","tsconfig.build.json","tsconfig.test.json","README.md",".DS_Store"]),de=new Set(["shadcn-ui","typescript-config","patterns","loveui","love-ui"]),ye=e=>e.replace(/\\/g,"/"),H=async(e,t,s)=>{let n=await W(e,{withFileTypes:!0});for(let r of n){let o=x(e,r.name);if(r.isDirectory()){if(me.has(r.name))continue;await H(o,t,s);continue}let y=G(r.name);!ue.has(y)||ge.has(r.name)||r.name.endsWith(".d.ts")||r.name.endsWith(".test.ts")||r.name.endsWith(".test.tsx")||r.name.endsWith(".stories.tsx")||s.push({absolute:o,relative:ye(oe(t,o))})}},fe=(e,t)=>{let s=e.loveui??{},n=typeof s.target=="string"?s.target.trim():"",r=s.category;if(n.length>0){let o=typeof s.includePackageName=="boolean"?s.includePackageName:!1;return{base:n.replace(/\/+$/,""),includePackageName:o}}return r==="feature"?{base:"components",includePackageName:!0}:r==="block"?{base:"components/blocks",includePackageName:!0}:{base:"components/ui",includePackageName:!0}},he=e=>{let s=(e.loveui??{}).type;return typeof s=="string"&&s.trim().length>0?s:"registry:ui"},ve=async e=>{try{return await ie(e,re.F_OK),!0}catch{return!1}},Re=e=>e.startsWith("@loveui/")||e.startsWith("@repo/"),we=e=>e.replace(/^@repo\//,"").replace(/^@loveui\//,""),K=async()=>(await W(J,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!de.has(t)).sort((t,s)=>t.localeCompare(s)),M=async e=>{let t=x(J,e),s=x(t,"package.json");if(!await ve(s))throw new Error(`Missing package.json for ${e}`);let n=JSON.parse(await U(s,"utf8")),r=he(n),o=Object.keys(n.dependencies??{}),y=Object.keys(n.peerDependencies??{}),D=Object.keys(n.devDependencies??{}),S=new Set([...o,...y,...D].filter(Re).filter(i=>i!=="@loveui/shadcn-ui")),A=[...new Set([...o,...y].filter(i=>!S.has(i)))],C=[...new Set(D.filter(i=>!S.has(i)&&!["@loveui/typescript-config","@types/react","@types/react-dom","typescript"].includes(i)))],P=[];for(let i of S){let h=we(i);P.push(`https://www.loveui.dev/r/${h}.json`)}let $=[];await H(t,t,$);let f=[],l={},m=fe(n,e);for(let i of $){let h=await U(i.absolute,"utf8"),b=G(i.absolute);if(b===".css"||b===".scss"||b===".sass"){let v=await q([ce]).process(h,{from:void 0});q.parse(v.css).walkAtRules("layer",j=>{let E=`@layer ${j.params}`;l[E]??={},j.walkRules(a=>{if(a.parent&&a.parent.type==="atrule"&&a.parent.name==="media")return;let w=a.selector,p={};a.walkDecls(k=>{p[k.prop]=k.value}),Object.keys(p).length>0&&(l[E][w]=p)}),j.walkAtRules("media",a=>{let w=`@media ${a.params}`,p=l[E];p[w]??={};let k=p[w];a.walkRules(L=>{let se=L.selector,T={};L.walkDecls(F=>{T[F.prop]=F.value}),Object.keys(T).length>0&&(k[se]=T)})})});continue}let u=i.relative.startsWith("src/")?i.relative.slice(4):i.relative;if(!m.includePackageName){let v=m.base.split("/").filter(Boolean),R=v[v.length-1];R&&u.startsWith(`${R}/`)&&(u=u.slice(R.length+1))}let ee=e.includes("/")?e.split("/").pop()??e:e,te=(m.includePackageName?`${m.base}/${ee}`:m.base).replace(/\/+$/,"");f.push({type:r,path:u,target:`${te}/${u}`.replace(/\/+/g,"/"),content:h})}let Z=!f.length&&Object.keys(l).length>0?"registry:style":r;return{$schema:"https://ui.shadcn.com/schema/registry-item.json",name:e,type:Z,title:n.title??e,description:n.description,author:n.author??"Connor Love <hello@loveconnor.com>",dependencies:A.length?A:void 0,devDependencies:C.length?C:void 0,registryDependencies:P.length?Array.from(new Set(P)):void 0,files:f.length?f:void 0,css:Object.keys(l).length?l:void 0}};var O="loveui://registry/",Oe="loveui://registry/{package}",B="get-loveui-package",De=e=>`${O}${e}`,Ae=c.dirname(Pe(import.meta.url)),z=c.resolve(Ae,".."),Ce=[c.join(z,"public","r"),c.resolve(z,"..","..","apps","ui","public","r"),c.resolve(process.cwd(),"apps","ui","public","r")],Y=async e=>{try{return await Se(e,ke.R_OK),!0}catch{return!1}},_=null,Q=async()=>(_||(_=(async()=>{for(let e of Ce){let t=c.join(e,"registry.json");if(await Y(t))try{let s=JSON.parse(await V(t,"utf8")),n=Array.from(new Set((s.items??[]).map(r=>r.name?.trim()).filter(r=>!!r))).sort((r,o)=>r.localeCompare(o));if(n.length===0)continue;return{dir:e,names:n,nameSet:new Set(n)}}catch{continue}}return null})()),_),$e=async()=>{let[e,t]=await Promise.all([Q(),K()]),s=new Set(t);for(let n of e?.names??[])s.add(n);return Array.from(s).sort((n,r)=>n.localeCompare(r))},Le=async e=>{let t=await Q();if(!t||!t.nameSet.has(e))return null;let s=c.join(t.dir,`${e}.json`);return await Y(s)?JSON.parse(await V(s,"utf8")):null},Fe=e=>{if(!e.startsWith(O))throw new d(g.InvalidParams,`Unsupported resource URI: ${e}`);let t=decodeURIComponent(e.slice(O.length)).trim();if(!t)throw new d(g.InvalidParams,"Package name is required.");return t},X=async e=>{try{let t=await Le(e);return t||await M(e)}catch(t){throw new d(g.InvalidParams,t instanceof Error?t.message:String(t))}};async function Ne(){let e=new be({name:"loveui-mcp",version:N.version??"0.0.0"},{capabilities:{resources:{listChanged:!0},tools:{listChanged:!0}}});e.setRequestHandler(xe,async()=>({resources:(await $e()).map(n=>({uri:De(n),name:n,description:`loveui registry definition for ${n}`,mimeType:"application/json"}))})),e.setRequestHandler(Te,async()=>({resourceTemplates:[{name:"loveui-registry",uriTemplate:Oe,description:"loveui registry definitions by package name",mimeType:"application/json"}]})),e.setRequestHandler(_e,async s=>{let n=Fe(s.params.uri),r=await X(n);return{contents:[{uri:s.params.uri,mimeType:"application/json",text:JSON.stringify(r,null,2)}]}}),e.setRequestHandler(Ie,async()=>({tools:[{name:B,description:"Fetch a loveui registry definition by package name.",inputSchema:{type:"object",additionalProperties:!1,properties:{name:{type:"string",description:"Package name, e.g. badge"}},required:["name"]}}]})),e.setRequestHandler(Ee,async s=>{if(s.params.name!==B)throw new d(g.InvalidParams,`Tool ${s.params.name} not found`);let n=s.params.arguments?.name;if(typeof n!="string"||n.trim()==="")throw new d(g.InvalidParams,"Package name is required.");let r=await X(n.trim());return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}});let t=new je;await e.connect(t)}Ne().catch(e=>{console.error(e),process.exit(1)});
2
+ import{constants as xe}from"fs";import{access as Te,readFile as Q}from"fs/promises";import l from"path";import{fileURLToPath as _e}from"url";import{Server as Ne}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as Oe}from"@modelcontextprotocol/sdk/server/stdio.js";import{CallToolRequestSchema as Ae,ErrorCode as u,ListResourceTemplatesRequestSchema as Ce,ListResourcesRequestSchema as Le,ListToolsRequestSchema as $e,McpError as p,ReadResourceRequestSchema as Fe}from"@modelcontextprotocol/sdk/types.js";var F={name:"love-ui",version:"1.2.10",private:!1,license:"AGPL-3.0-or-later",type:"module",bin:{loveui:"dist/index.js","love-ui":"dist/index.js","loveui-mcp":"dist/mcp-server.js"},files:["dist","packages","*.ts","*.tsx","*.css","*.mdx"],main:"packages/love-ui/index.ts",types:"packages/love-ui/index.ts",exports:{".":{import:"./packages/love-ui/index.ts",require:"./packages/love-ui/index.ts"},"./lib/*":"./packages/love-ui/*","./components/*":"./packages/love-ui/components/*","./shadcn-ui/*":"./packages/shadcn-ui/*","./package.json":"./package.json"},dependencies:{"@modelcontextprotocol/sdk":"^1.18.1",postcss:"^8.5.6","postcss-nested":"^7.0.2"},scripts:{build:"tsup",postbuild:"node ./scripts/copy-packages.mjs",clean:"rimraf dist packages"},devDependencies:{"@types/node":"^20.14.10",rimraf:"^6.0.1",tsup:"^8.5.0"}};import{constants as me}from"fs";import{access as ue,readFile as U,readdir as q}from"fs/promises";import x,{extname as W,join as j,relative as ge}from"path";import{fileURLToPath as ye}from"url";import z from"postcss";import fe from"postcss-nested";var he=x.dirname(ye(import.meta.url)),ve=x.resolve(he,".."),G=x.join(ve,"packages"),we=new Set([".turbo",".next",".git","dist","build","storybook-static","node_modules","__tests__","__mocks__","coverage"]),Re=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".css",".scss",".sass",".mdx"]),ke=new Set(["package.json","tsconfig.json","tsconfig.build.json","tsconfig.test.json","README.md",".DS_Store"]),Se=new Set(["shadcn-ui","typescript-config","patterns","loveui","love-ui"]),Ee=e=>e.replace(/\\/g,"/"),H=async(e,t,n)=>{let s=await q(e,{withFileTypes:!0});for(let i of s){let o=j(e,i.name);if(i.isDirectory()){if(we.has(i.name))continue;await H(o,t,n);continue}let a=W(i.name);!Re.has(a)||ke.has(i.name)||i.name.endsWith(".d.ts")||i.name.endsWith(".test.ts")||i.name.endsWith(".test.tsx")||i.name.endsWith(".stories.tsx")||n.push({absolute:o,relative:Ee(ge(t,o))})}},Ie=(e,t)=>{let n=e.loveui??{},s=typeof n.target=="string"?n.target.trim():"",i=n.category;if(s.length>0){let o=typeof n.includePackageName=="boolean"?n.includePackageName:!1;return{base:s.replace(/\/+$/,""),includePackageName:o}}return i==="feature"?{base:"components",includePackageName:!0}:i==="block"?{base:"components/blocks",includePackageName:!0}:{base:"components/ui",includePackageName:!0}},De=e=>{let n=(e.loveui??{}).type;return typeof n=="string"&&n.trim().length>0?n:"registry:ui"},Pe=async e=>{try{return await ue(e,me.F_OK),!0}catch{return!1}},b=e=>e.startsWith("@loveui/")||e.startsWith("@love-ui/")||e.startsWith("@repo/"),be=e=>e.replace(/^@repo\//,"").replace(/^@loveui\//,"").replace(/^@love-ui\//,""),je=new Set(["@loveui/shadcn-ui","@love-ui/shadcn-ui"]),J=async()=>(await q(G,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!Se.has(t)).sort((t,n)=>t.localeCompare(n)),K=async e=>{let t=j(G,e),n=j(t,"package.json");if(!await Pe(n))throw new Error(`Missing package.json for ${e}`);let s=JSON.parse(await U(n,"utf8")),i=De(s),o=Object.keys(s.dependencies??{}),a=Object.keys(s.peerDependencies??{}),N=Object.keys(s.devDependencies??{}),oe=new Set([...o,...a,...N].filter(b).filter(r=>!je.has(r))),O=[...new Set([...o,...a].filter(r=>!b(r)))],A=[...new Set(N.filter(r=>!b(r)&&!["@loveui/typescript-config","@types/react","@types/react-dom","typescript"].includes(r)))],S=[];for(let r of oe){let h=be(r);S.push(`https://www.loveui.dev/r/${h}.json`)}let C=[];await H(t,t,C);let f=[],d={},g=Ie(s,e);for(let r of C){let h=await U(r.absolute,"utf8"),E=W(r.absolute);if(E===".css"||E===".scss"||E===".sass"){let v=await z([fe]).process(h,{from:void 0});z.parse(v.css).walkAtRules("layer",I=>{let D=`@layer ${I.params}`;d[D]??={},I.walkRules(c=>{if(c.parent&&c.parent.type==="atrule"&&c.parent.name==="media")return;let R=c.selector,m={};c.walkDecls(k=>{m[k.prop]=k.value}),Object.keys(m).length>0&&(d[D][R]=m)}),I.walkAtRules("media",c=>{let R=`@media ${c.params}`,m=d[D];m[R]??={};let k=m[R];c.walkRules(L=>{let pe=L.selector,P={};L.walkDecls($=>{P[$.prop]=$.value}),Object.keys(P).length>0&&(k[pe]=P)})})});continue}let y=r.relative.startsWith("src/")?r.relative.slice(4):r.relative;if(!g.includePackageName){let v=g.base.split("/").filter(Boolean),w=v[v.length-1];w&&y.startsWith(`${w}/`)&&(y=y.slice(w.length+1))}let ce=e.includes("/")?e.split("/").pop()??e:e,le=(g.includePackageName?`${g.base}/${ce}`:g.base).replace(/\/+$/,"");f.push({type:i,path:y,target:`${le}/${y}`.replace(/\/+/g,"/"),content:h})}let ae=!f.length&&Object.keys(d).length>0?"registry:style":i;return{$schema:"https://ui.shadcn.com/schema/registry-item.json",name:e,type:ae,title:s.title??e,description:s.description,author:s.author??"Connor Love <hello@loveconnor.com>",dependencies:O.length?O:void 0,devDependencies:A.length?A:void 0,registryDependencies:S.length?Array.from(new Set(S)):void 0,files:f.length?f:void 0,css:Object.keys(d).length?d:void 0}};var _="loveui://registry/",Ue="loveui://registry/{package}",M="get-loveui-package",Z=new Set(["shadcn-ui","typescript-config","eslint-config","patterns","loveui","love-ui"]),ze=["@loveui/","@love-ui/","@repo/"],ee=new Set(["@loveui/shadcn-ui","@love-ui/shadcn-ui"]),qe=e=>`${_}${e}`,We=l.dirname(_e(import.meta.url)),X=l.resolve(We,".."),Ge=[l.join(X,"public","r"),l.resolve(X,"..","..","apps","ui","public","r"),l.resolve(process.cwd(),"apps","ui","public","r")],te=async e=>{try{return await Te(e,xe.R_OK),!0}catch{return!1}},ne=e=>ze.some(t=>e.startsWith(t)),He=e=>e.replace(/^@repo\//,"").replace(/^@loveui\//,"").replace(/^@love-ui\//,""),se=e=>Array.isArray(e)?e.filter(t=>typeof t=="string"):e&&typeof e=="object"?Object.keys(e):[],B=e=>{let t=Array.from(new Set(se(e).filter(n=>!ne(n)&&!ee.has(n))));return t.length>0?t:void 0},Je=e=>{let t=Array.from(new Set(se(e).map(n=>n.trim()).filter(Boolean).filter(n=>!ee.has(n)).map(n=>ne(n)?`https://www.loveui.dev/r/${He(n)}.json`:n)));return t.length>0?t:void 0},ie=e=>e.trim().replace(/^@repo\//,"").replace(/^@loveui\//,"").replace(/^@love-ui\//,""),Ke=e=>{let t=ie(e);if(Z.has(t))throw new p(u.InvalidParams,`${t} is an internal package and should not be used directly. Use \`npx love-ui add <component>\` with a public component name.`);return t},Y=e=>{if(!e||typeof e!="object")return{mcpHints:{installPattern:"npx love-ui add <component>",neverInstall:["@loveui/*","@love-ui/*","@repo/*"]}};let t={...e},n=B(t.dependencies),s=B(t.devDependencies),i=Je(t.registryDependencies),o=typeof t.name=="string"&&t.name.trim().length>0?t.name.trim():"<component>",a={...t,mcpHints:{installPattern:"npx love-ui add <component>",installCommand:`npx love-ui add ${o}`,neverInstall:["@loveui/*","@love-ui/*","@repo/*","@loveui/shadcn-ui"]}};return n?a.dependencies=n:delete a.dependencies,s?a.devDependencies=s:delete a.devDependencies,i?a.registryDependencies=i:delete a.registryDependencies,a},T=null,re=async()=>(T||(T=(async()=>{for(let e of Ge){let t=l.join(e,"registry.json");if(await te(t))try{let n=JSON.parse(await Q(t,"utf8")),s=Array.from(new Set((n.items??[]).map(i=>i.name?.trim()).filter(i=>!!i))).sort((i,o)=>i.localeCompare(o));if(s.length===0)continue;return{dir:e,names:s,nameSet:new Set(s)}}catch{continue}}return null})()),T),Me=async()=>{let[e,t]=await Promise.all([re(),J()]),n=new Set(t);for(let s of e?.names??[])n.add(s);return Array.from(n).map(s=>ie(s)).filter(s=>!Z.has(s)).sort((s,i)=>s.localeCompare(i))},Xe=async e=>{let t=await re();if(!t||!t.nameSet.has(e))return null;let n=l.join(t.dir,`${e}.json`);return await te(n)?JSON.parse(await Q(n,"utf8")):null},Be=e=>{if(!e.startsWith(_))throw new p(u.InvalidParams,`Unsupported resource URI: ${e}`);let t=decodeURIComponent(e.slice(_.length)).trim();if(!t)throw new p(u.InvalidParams,"Package name is required.");return t},V=async e=>{try{let t=Ke(e),n=await Xe(t);return Y(n||await K(t))}catch(t){throw t instanceof p?t:new p(u.InvalidParams,t instanceof Error?t.message:String(t))}};async function Ye(){let e=new Ne({name:"loveui-mcp",version:F.version??"0.0.0"},{capabilities:{resources:{listChanged:!0},tools:{listChanged:!0}}});e.setRequestHandler(Le,async()=>({resources:(await Me()).map(s=>({uri:qe(s),name:s,description:`loveui registry definition for ${s}`,mimeType:"application/json"}))})),e.setRequestHandler(Ce,async()=>({resourceTemplates:[{name:"loveui-registry",uriTemplate:Ue,description:"loveui registry definitions by package name",mimeType:"application/json"}]})),e.setRequestHandler(Fe,async n=>{let s=Be(n.params.uri),i=await V(s);return{contents:[{uri:n.params.uri,mimeType:"application/json",text:JSON.stringify(i,null,2)}]}}),e.setRequestHandler($e,async()=>({tools:[{name:M,description:"Fetch a loveui registry definition by package name. Always install with `npx love-ui add <component>` and never install @loveui/* packages directly.",inputSchema:{type:"object",additionalProperties:!1,properties:{name:{type:"string",description:"Package name, e.g. badge"}},required:["name"]}}]})),e.setRequestHandler(Ae,async n=>{if(n.params.name!==M)throw new p(u.InvalidParams,`Tool ${n.params.name} not found`);let s=n.params.arguments?.name;if(typeof s!="string"||s.trim()==="")throw new p(u.InvalidParams,"Package name is required.");let i=await V(s.trim());return{content:[{type:"text",text:JSON.stringify(i,null,2)}]}});let t=new Oe;await e.connect(t)}Ye().catch(e=>{console.error(e),process.exit(1)});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "love-ui",
3
- "version": "1.2.10",
3
+ "version": "1.2.11",
4
4
  "private": false,
5
5
  "license": "AGPL-3.0-or-later",
6
6
  "type": "module",