UNPKG

shadcn

Version:

Add components to your apps.

29 lines (27 loc) 23.5 kB
import { z } from 'zod'; import w from 'path'; import K from 'fs-extra'; import S from 'fast-glob'; import { loadConfig, createMatchPath } from 'tsconfig-paths'; import { red, yellow, cyan, green } from 'kleur/colors'; import { cosmiconfig } from 'cosmiconfig'; import { promises } from 'fs'; import { tmpdir } from 'os'; import Re from 'ora'; import C from 'deepmerge'; import $e from 'stringify-object'; import { SyntaxKind, Project, ScriptKind, QuoteKind } from 'ts-morph'; import { HttpsProxyAgent } from 'https-proxy-agent'; import Ge from 'node-fetch'; var W=z.enum(["registry:lib","registry:block","registry:component","registry:ui","registry:hook","registry:page","registry:file","registry:theme","registry:style","registry:example","registry:internal"]),ae=z.discriminatedUnion("type",[z.object({path:z.string(),content:z.string().optional(),type:z.enum(["registry:file","registry:page"]),target:z.string()}),z.object({path:z.string(),content:z.string().optional(),type:W.exclude(["registry:file","registry:page"]),target:z.string().optional()})]),le=z.object({config:z.object({content:z.array(z.string()).optional(),theme:z.record(z.string(),z.any()).optional(),plugins:z.array(z.string()).optional()}).optional()}),R=z.object({theme:z.record(z.string(),z.string()).optional(),light:z.record(z.string(),z.string()).optional(),dark:z.record(z.string(),z.string()).optional()}),ce=z.record(z.string(),z.lazy(()=>z.union([z.string(),z.record(z.string(),z.union([z.string(),z.record(z.string(),z.string())]))]))),k=z.object({$schema:z.string().optional(),extends:z.string().optional(),name:z.string(),type:W,title:z.string().optional(),author:z.string().min(2).optional(),description:z.string().optional(),dependencies:z.array(z.string()).optional(),devDependencies:z.array(z.string()).optional(),registryDependencies:z.array(z.string()).optional(),files:z.array(ae).optional(),tailwind:le.optional(),cssVars:R.optional(),css:ce.optional(),meta:z.record(z.string(),z.any()).optional(),docs:z.string().optional(),categories:z.array(z.string()).optional()}),nt=z.object({name:z.string(),homepage:z.string(),items:z.array(k)}),V=z.array(k),M=z.array(z.object({name:z.string(),label:z.string()})),B=z.record(z.string(),z.record(z.string(),z.string())),G=z.object({inlineColors:z.object({light:z.record(z.string(),z.string()),dark:z.record(z.string(),z.string())}),cssVars:R,cssVarsV4:R.optional(),inlineColorsTemplate:z.string(),cssVarsTemplate:z.string()}),J=k.pick({dependencies:!0,devDependencies:!0,files:!0,tailwind:!0,cssVars:!0,css:!0,docs:!0});var y={"next-app":{name:"next-app",label:"Next.js",links:{installation:"https://ui.shadcn.com/docs/installation/next",tailwind:"https://tailwindcss.com/docs/guides/nextjs"}},"next-pages":{name:"next-pages",label:"Next.js",links:{installation:"https://ui.shadcn.com/docs/installation/next",tailwind:"https://tailwindcss.com/docs/guides/nextjs"}},remix:{name:"remix",label:"Remix",links:{installation:"https://ui.shadcn.com/docs/installation/remix",tailwind:"https://tailwindcss.com/docs/guides/remix"}},"react-router":{name:"react-router",label:"React Router",links:{installation:"https://ui.shadcn.com/docs/installation/react-router",tailwind:"https://tailwindcss.com/docs/installation/framework-guides/react-router"}},vite:{name:"vite",label:"Vite",links:{installation:"https://ui.shadcn.com/docs/installation/vite",tailwind:"https://tailwindcss.com/docs/guides/vite"}},astro:{name:"astro",label:"Astro",links:{installation:"https://ui.shadcn.com/docs/installation/astro",tailwind:"https://tailwindcss.com/docs/guides/astro"}},laravel:{name:"laravel",label:"Laravel",links:{installation:"https://ui.shadcn.com/docs/installation/laravel",tailwind:"https://tailwindcss.com/docs/guides/laravel"}},"tanstack-start":{name:"tanstack-start",label:"TanStack Start",links:{installation:"https://ui.shadcn.com/docs/installation/tanstack",tailwind:"https://tailwindcss.com/docs/installation/using-postcss"}},gatsby:{name:"gatsby",label:"Gatsby",links:{installation:"https://ui.shadcn.com/docs/installation/gatsby",tailwind:"https://tailwindcss.com/docs/guides/gatsby"}},expo:{name:"expo",label:"Expo",links:{installation:"https://ui.shadcn.com/docs/installation/expo",tailwind:"https://www.nativewind.dev/docs/getting-started/installation"}},manual:{name:"manual",label:"Manual",links:{installation:"https://ui.shadcn.com/docs/installation/manual",tailwind:"https://tailwindcss.com/docs/installation"}}};function O(e="",t=!0){let r=w.join(e,"package.json");return K.readJSONSync(r,{throws:t})}var j=["**/node_modules/**",".next","public","dist","build"];z.object({compilerOptions:z.object({paths:z.record(z.string().or(z.array(z.string())))})});async function L(e){let[t,r,i,s,o,c,f,g]=await Promise.all([S.glob("**/{next,vite,astro,app}.config.*|gatsby-config.*|composer.json|react-router.config.*",{cwd:e,deep:3,ignore:j}),K.pathExists(w.resolve(e,"src")),he(e),me(e),de(e),Y(e),ue(e),O(e,!1)]),h=await K.pathExists(w.resolve(e,`${r?"src/":""}app`)),l={framework:y.manual,isSrcDir:r,isRSC:!1,isTsx:i,tailwindConfigFile:s,tailwindCssFile:o,tailwindVersion:c,aliasPrefix:f};return t.find(m=>m.startsWith("next.config."))?.length?(l.framework=h?y["next-app"]:y["next-pages"],l.isRSC=h,l):t.find(m=>m.startsWith("astro.config."))?.length?(l.framework=y.astro,l):t.find(m=>m.startsWith("gatsby-config."))?.length?(l.framework=y.gatsby,l):t.find(m=>m.startsWith("composer.json"))?.length?(l.framework=y.laravel,l):Object.keys(g?.dependencies??{}).find(m=>m.startsWith("@remix-run/"))?(l.framework=y.remix,l):[...Object.keys(g?.dependencies??{}),...Object.keys(g?.devDependencies??{})].find(m=>m.startsWith("@tanstack/react-start"))?(l.framework=y["tanstack-start"],l):t.find(m=>m.startsWith("react-router.config."))?.length?(l.framework=y["react-router"],l):t.find(m=>m.startsWith("vite.config."))?.length?(l.framework=y.vite,l):(g?.dependencies?.expo&&(l.framework=y.expo),l)}async function Y(e){let[t,r]=await Promise.all([O(e,!1),E(e)]);return r?.tailwind?.config===""?"v4":!t?.dependencies?.tailwindcss&&!t?.devDependencies?.tailwindcss?null:/^(?:\^|~)?3(?:\.\d+)*(?:-.*)?$/.test(t?.dependencies?.tailwindcss||t?.devDependencies?.tailwindcss||"")?"v3":"v4"}async function de(e){let[t,r]=await Promise.all([S.glob(["**/*.css","**/*.scss"],{cwd:e,deep:5,ignore:j}),Y(e)]);if(!t.length)return null;for(let s of t){let o=await K.readFile(w.resolve(e,s),"utf8");if(o.includes('@import "tailwindcss"')||o.includes("@import 'tailwindcss'")||o.includes("@tailwind base"))return s}return null}async function me(e){let t=await S.glob("tailwind.config.*",{cwd:e,deep:3,ignore:j});return t.length?t[0]:null}async function ue(e){let t=await loadConfig(e);if(t?.resultType==="failed"||!Object.entries(t?.paths).length)return null;for(let[r,i]of Object.entries(t.paths))if(i.includes("./*")||i.includes("./src/*")||i.includes("./app/*")||i.includes("./resources/js/*"))return r.replace(/\/\*$/,"")??null;return Object.keys(t?.paths)?.[0].replace(/\/\*$/,"")??null}async function he(e){return (await S.glob("tsconfig.*",{cwd:e,deep:1,ignore:j})).length>0}async function vt(e,t=null){let[r,i]=await Promise.all([E(e),t?Promise.resolve(t):L(e)]);if(r)return r;if(!i||!i.tailwindCssFile||i.tailwindVersion==="v3"&&!i.tailwindConfigFile)return null;let s={$schema:"https://ui.shadcn.com/schema.json",rsc:i.isRSC,tsx:i.isTsx,style:"new-york",tailwind:{config:i.tailwindConfigFile??"",baseColor:"zinc",css:i.tailwindCssFile,cssVariables:!0,prefix:""},iconLibrary:"lucide",aliases:{components:`${i.aliasPrefix}/components`,ui:`${i.aliasPrefix}/components/ui`,hooks:`${i.aliasPrefix}/hooks`,lib:`${i.aliasPrefix}/lib`,utils:`${i.aliasPrefix}/lib/utils`}};return await F(e,s)}async function H(e){if(!e.resolvedPaths?.cwd)return "v3";let t=await L(e.resolvedPaths.cwd);return t?.tailwindVersion?t.tailwindVersion:null}var u={error:red,warn:yellow,info:cyan,success:green};async function x(e,t){return createMatchPath(t.absoluteBaseUrl,t.paths)(e,void 0,()=>!0,[".ts",".tsx",".jsx",".js",".css"])}var Ft="@/components",zt="@/lib/utils",Dt="app/globals.css",_t="tailwind.config.js";var Te=cosmiconfig("components",{searchPlaces:["components.json"]}),Q=z.object({$schema:z.string().optional(),style:z.string(),rsc:z.coerce.boolean().default(!1),tsx:z.coerce.boolean().default(!0),tailwind:z.object({config:z.string().optional(),css:z.string(),baseColor:z.string(),cssVariables:z.boolean().default(!0),prefix:z.string().default("").optional()}),aliases:z.object({components:z.string(),utils:z.string(),ui:z.string().optional(),lib:z.string().optional(),hooks:z.string().optional()}),iconLibrary:z.string().optional()}).strict(),Z=Q.extend({resolvedPaths:z.object({cwd:z.string(),tailwindConfig:z.string(),tailwindCss:z.string(),utils:z.string(),components:z.string(),lib:z.string(),hooks:z.string(),ui:z.string()})}),Ee=z.record(Z);async function E(e){let t=await Se(e);return t?(t.iconLibrary||(t.iconLibrary=t.style==="new-york"?"radix":"lucide"),await F(e,t)):null}async function F(e,t){let r=await loadConfig(e);if(r.resultType==="failed")throw new Error(`Failed to load ${t.tsx?"tsconfig":"jsconfig"}.json. ${r.message??""}`.trim());return Z.parse({...t,resolvedPaths:{cwd:e,tailwindConfig:t.tailwind.config?w.resolve(e,t.tailwind.config):"",tailwindCss:w.resolve(e,t.tailwind.css),utils:await x(t.aliases.utils,r),components:await x(t.aliases.components,r),ui:t.aliases.ui?await x(t.aliases.ui,r):w.resolve(await x(t.aliases.components,r)??e,"ui"),lib:t.aliases.lib?await x(t.aliases.lib,r):w.resolve(await x(t.aliases.utils,r)??e,".."),hooks:t.aliases.hooks?await x(t.aliases.hooks,r):w.resolve(await x(t.aliases.components,r)??e,"..","hooks")}})}async function Se(e){try{let t=await Te.search(e);return t?Q.parse(t.config):null}catch{let r=`${e}/components.json`;throw new Error(`Invalid configuration found in ${u.info(r)}.`)}}async function Ut(e){let t={};for(let i of Object.keys(e.aliases)){if(!Le(i,e))continue;let s=e.resolvedPaths[i],o=await je(e.resolvedPaths.cwd,s);if(!o){t[i]=e;continue}t[i]=await E(o);}let r=Ee.safeParse(t);return r.success?r.data:null}async function je(e,t){let r=Ie(e,t),i=w.relative(r,t),o=(await S.glob("**/package.json",{cwd:r,deep:3,ignore:["**/node_modules/**","**/dist/**","**/build/**","**/public/**"]})).map(c=>w.dirname(c)).find(c=>i.startsWith(c));return o?w.join(r,o):null}function Le(e,t){return Object.keys(t.resolvedPaths).filter(r=>r!=="utils").includes(e)}function Ie(e,t){let r=e.split(w.sep),i=t.split(w.sep),s=[];for(let o=0;o<Math.min(r.length,i.length)&&r[o]===i[o];o++)s.push(r[o]);return s.join(w.sep)}async function q(e,t){return (await L(e))?.tailwindVersion==="v4"?"new-york-v4":t}var d={error(...e){console.log(u.error(e.join(" ")));},warn(...e){console.log(u.warn(e.join(" ")));},info(...e){console.log(u.info(e.join(" ")));},success(...e){console.log(u.success(e.join(" ")));},log(...e){console.log(e.join(" "));},break(){console.log("");}};function b(e){if(d.error("Something went wrong. Please check the error below for more details."),d.error("If the problem persists, please open an issue on GitHub."),d.error(""),typeof e=="string"&&(d.error(e),d.break(),process.exit(1)),e instanceof z.ZodError){d.error("Validation failed:");for(let[t,r]of Object.entries(e.flatten().fieldErrors))d.error(`- ${u.info(t)}: ${r}`);d.break(),process.exit(1);}e instanceof Error&&(d.error(e.message),d.break(),process.exit(1)),d.break(),process.exit(1);}function X(e,t){return Re({text:e,isSilent:t?.silent})}async function cr(e,t,r){if(!e||(r={silent:!1,tailwindVersion:"v3",...r},r.tailwindVersion==="v4"))return;let i=w.relative(t.resolvedPaths.cwd,t.resolvedPaths.tailwindConfig),s=X(`Updating ${u.info(i)}`,{silent:r.silent}).start(),o=await promises.readFile(t.resolvedPaths.tailwindConfig,"utf8"),c=await ze(o,e,t);await promises.writeFile(t.resolvedPaths.tailwindConfig,c,"utf8"),s?.succeed();}async function ze(e,t,r){let i=await te(e,r),s=i.getDescendantsOfKind(SyntaxKind.ObjectLiteralExpression).find(c=>c.getProperties().some(f=>f.isKind(SyntaxKind.PropertyAssignment)&&f.getName()==="content"));if(!s)return e;let o=Ne(s);return De(s,{name:"darkMode",value:"class"},{quoteChar:o}),t.plugins?.forEach(c=>{Ue(s,c);}),t.theme&&await _e(s,t.theme),i.getFullText()}function De(e,t,{quoteChar:r}){let i=e.getProperty("darkMode");if(!i){let s={name:t.name,initializer:`[${r}${t.value}${r}]`};return t.name==="darkMode"?(e.insertPropertyAssignment(0,s),e):(e.addPropertyAssignment(s),e)}if(i.isKind(SyntaxKind.PropertyAssignment)){let s=i.getInitializer(),o=`${r}${t.value}${r}`;if(s?.isKind(SyntaxKind.StringLiteral)){let c=s.getText();return s.replaceWithText(`[${c}, ${o}]`),e}if(s?.isKind(SyntaxKind.ArrayLiteralExpression)){if(s.getElements().map(c=>c.getText()).includes(o))return e;s.addElement(o);}return e}return e}async function _e(e,t){e.getProperty("theme")||e.addPropertyAssignment({name:"theme",initializer:"{}"}),D(e);let i=(e.getPropertyOrThrow("theme")?.asKindOrThrow(SyntaxKind.PropertyAssignment)).getInitializer();if(i?.isKind(SyntaxKind.ObjectLiteralExpression)){let s=i.getText(),o=await We(s),c=C(o,t,{arrayMerge:(g,h)=>h}),f=$e(c).replace(/\'\.\.\.(.*)\'/g,"...$1").replace(/\'\"/g,"'").replace(/\"\'/g,"'").replace(/\'\[/g,"[").replace(/\]\'/g,"]").replace(/\'\\\'/g,"'").replace(/\\\'/g,"'").replace(/\\\'\'/g,"'").replace(/\'\'/g,"'");i.replaceWithText(f);}_(e);}function Ue(e,t){let r=e.getProperty("plugins");if(!r)return e.addPropertyAssignment({name:"plugins",initializer:`[${t}]`}),e;if(r.isKind(SyntaxKind.PropertyAssignment)){let i=r.getInitializer();if(i?.isKind(SyntaxKind.ArrayLiteralExpression)){if(i.getElements().map(s=>s.getText().replace(/["']/g,"")).includes(t.replace(/["']/g,"")))return e;i.addElement(t);}return e}return e}async function te(e,t){let r=await promises.mkdtemp(w.join(tmpdir(),"shadcn-")),i=t?.resolvedPaths?.tailwindConfig||"tailwind.config.ts",s=w.join(r,`shadcn-${w.basename(i)}`);return new Project({compilerOptions:{}}).createSourceFile(s,e,{scriptKind:w.extname(i)===".ts"?ScriptKind.TS:ScriptKind.JS})}function Ne(e){return e.getFirstDescendantByKind(SyntaxKind.StringLiteral)?.getQuoteKind()===QuoteKind.Single?"'":'"'}function D(e){let t=e.getProperties();for(let r=0;r<t.length;r++){let i=t[r];if(i.isKind(SyntaxKind.SpreadAssignment)){let s=i.asKindOrThrow(SyntaxKind.SpreadAssignment),o=s.getExpression().getText();e.insertPropertyAssignment(r,{name:`"___${o.replace(/^\.\.\./,"")}"`,initializer:`"...${o.replace(/^\.\.\./,"")}"`}),s.remove();}else if(i.isKind(SyntaxKind.PropertyAssignment)){let o=i.asKindOrThrow(SyntaxKind.PropertyAssignment).getInitializer();o&&o.isKind(SyntaxKind.ObjectLiteralExpression)?D(o.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)):o&&o.isKind(SyntaxKind.ArrayLiteralExpression)&&re(o.asKindOrThrow(SyntaxKind.ArrayLiteralExpression));}}}function re(e){let t=e.getElements();for(let r=0;r<t.length;r++){let i=t[r];if(i.isKind(SyntaxKind.ObjectLiteralExpression))D(i.asKindOrThrow(SyntaxKind.ObjectLiteralExpression));else if(i.isKind(SyntaxKind.ArrayLiteralExpression))re(i.asKindOrThrow(SyntaxKind.ArrayLiteralExpression));else if(i.isKind(SyntaxKind.SpreadElement)){let s=i.getText();e.removeElement(r),e.insertElement(r,`"${s}"`);}}}function _(e){let t=e.getProperties();for(let r=0;r<t.length;r++){let i=t[r];if(i.isKind(SyntaxKind.PropertyAssignment)){let s=i,o=s.getInitializer();if(o&&o.isKind(SyntaxKind.StringLiteral)){let c=o.asKindOrThrow(SyntaxKind.StringLiteral).getLiteralValue();c.startsWith("...")&&(e.insertSpreadAssignment(r,{expression:c.slice(3)}),s.remove());}else o?.isKind(SyntaxKind.ObjectLiteralExpression)?_(o):o&&o.isKind(SyntaxKind.ArrayLiteralExpression)&&ie(o.asKindOrThrow(SyntaxKind.ArrayLiteralExpression));}}}function ie(e){let t=e.getElements();for(let r=0;r<t.length;r++){let i=t[r];if(i.isKind(SyntaxKind.ObjectLiteralExpression))_(i.asKindOrThrow(SyntaxKind.ObjectLiteralExpression));else if(i.isKind(SyntaxKind.ArrayLiteralExpression))ie(i.asKindOrThrow(SyntaxKind.ArrayLiteralExpression));else if(i.isKind(SyntaxKind.StringLiteral)){let s=i.getText(),o=/(?:^['"])(\.\.\..*)(?:['"]$)/g;o.test(s)&&(e.removeElement(r),e.insertElement(r,s.replace(o,"$1")));}}}async function We(e){let r=(await te(`const theme = ${e}`,null)).getStatements()[0];if(r?.getKind()===SyntaxKind.VariableStatement){let s=(r.getDeclarationList()?.getDeclarations()[0]).getInitializer();if(s?.isKind(SyntaxKind.ObjectLiteralExpression))return await I(s)}throw new Error("Invalid input: not an object literal")}function I(e){let t={};for(let r of e.getProperties())if(r.isKind(SyntaxKind.PropertyAssignment)){let i=r.getName().replace(/\'/g,"");r.getInitializer()?.isKind(SyntaxKind.ObjectLiteralExpression)?t[i]=I(r.getInitializer()):r.getInitializer()?.isKind(SyntaxKind.ArrayLiteralExpression)?t[i]=se(r.getInitializer()):t[i]=U(r.getInitializer());}return t}function se(e){let t=[];for(let r of e.getElements())r.isKind(SyntaxKind.ObjectLiteralExpression)?t.push(I(r.asKindOrThrow(SyntaxKind.ObjectLiteralExpression))):r.isKind(SyntaxKind.ArrayLiteralExpression)?t.push(se(r.asKindOrThrow(SyntaxKind.ArrayLiteralExpression))):t.push(U(r));return t}function U(e){switch(e.getKind()){case SyntaxKind.StringLiteral:return e.getText();case SyntaxKind.NumericLiteral:return Number(e.getText());case SyntaxKind.TrueKeyword:return !0;case SyntaxKind.FalseKeyword:return !1;case SyntaxKind.NullKeyword:return null;case SyntaxKind.ArrayLiteralExpression:return e.getElements().map(U);case SyntaxKind.ObjectLiteralExpression:return I(e);default:return e.getText()}}function ne(e){let t={};for(let r of Object.keys(e)){let i=r.split("-"),s=i[0],o=i.slice(1).join("-");o===""?typeof t[s]=="object"?t[s].DEFAULT=`hsl(var(--${r}))`:t[s]=`hsl(var(--${r}))`:(typeof t[s]!="object"&&(t[s]={DEFAULT:`hsl(var(--${s}))`}),t[s][o]=`hsl(var(--${r}))`);}for(let[r,i]of Object.entries(t))typeof i=="object"&&i.DEFAULT===`hsl(var(--${r}))`&&!(r in e)&&delete i.DEFAULT;return t}var Ye=process.env.REGISTRY_URL??"https://ui.shadcn.com/r",He=process.env.https_proxy?new HttpsProxyAgent(process.env.https_proxy):void 0,A=new Map,Qe=[{name:"neutral",label:"Neutral"},{name:"gray",label:"Gray"},{name:"zinc",label:"Zinc"},{name:"stone",label:"Stone"},{name:"slate",label:"Slate"}];async function Ze(){try{let[e]=await P(["index.json"]);return V.parse(e)}catch(e){d.error(` `),b(e);}}async function Cr(){try{let[e]=await P(["styles/index.json"]);return M.parse(e)}catch(e){return d.error(` `),b(e),[]}}async function Tr(){try{let[e]=await P(["icons/index.json"]);return B.parse(e)}catch(e){return b(e),{}}}async function Er(e,t){try{let[r]=await P([N(e)?e:`styles/${t}/${e}.json`]);return k.parse(r)}catch(r){return d.break(),b(r),null}}async function Sr(){return Qe}async function qe(e){try{let[t]=await P([`colors/${e}.json`]);return G.parse(t)}catch(t){b(t);}}async function Xe(e,t){let r=[];for(let i of t){let s=e.find(o=>o.name===i);if(s&&(r.push(s),s.registryDependencies)){let o=await Xe(e,s.registryDependencies);r.push(...o);}}return r.filter((i,s,o)=>o.findIndex(c=>c.name===i.name)===s)}async function jr(e,t){try{let r=t.map(s=>`styles/${e}/${s.name}.json`),i=await P(r);return V.parse(i)}catch(r){b(r);}}async function Lr(e,t,r){if(r)return r;if(t.type==="registry:ui")return e.resolvedPaths.ui??e.resolvedPaths.components;let[i,s]=t.type?.split(":")??[];return i in e.resolvedPaths?w.join(e.resolvedPaths[i],s):null}async function P(e,t={}){t={useCache:!0,...t};try{return await Promise.all(e.map(async i=>{let s=oe(i);if(t.useCache&&A.has(s))return A.get(s);let o=(async()=>{let c=await Ge(s,{agent:He});if(!c.ok){let f={400:"Bad request",401:"Unauthorized",403:"Forbidden",404:"Not found",500:"Internal server error"};if(c.status===401)throw new Error(`You are not authorized to access the component at ${u.info(s)}. If this is a remote registry, you may need to authenticate.`);if(c.status===404)throw new Error(`The component at ${u.info(s)} was not found. It may not exist at the registry. Please make sure it is a valid component.`);if(c.status===403)throw new Error(`You do not have access to the component at ${u.info(s)}. If this is a remote registry, you may need to authenticate or a token.`);let g=await c.json(),h=g&&typeof g=="object"&&"error"in g?g.error:c.statusText||f[c.status];throw new Error(`Failed to fetch from ${u.info(s)}. ${h}`)}return c.json()})();return t.useCache&&A.set(s,o),o}))}catch(r){return d.error(` `),b(r),[]}}function Ir(){A.clear();}async function et(e,t){try{if(!await Ze())return null;e.includes("index")&&e.unshift("index");let i=await it(e,t),s=await P(i),o=z.array(k).parse(s);if(!o)return null;if(e.includes("index")&&t.tailwind.baseColor){let l=await rt(t.tailwind.baseColor,t);l&&o.unshift(l);}o.sort((l,m)=>l.type==="registry:theme"?-1:1);let c={};o.forEach(l=>{c=C(c,l.tailwind??{});});let f={};o.forEach(l=>{f=C(f,l.cssVars??{});});let g={};o.forEach(l=>{g=C(g,l.css??{});});let h="";return o.forEach(l=>{l.docs&&(h+=`${l.docs} `);}),J.parse({dependencies:C.all(o.map(l=>l.dependencies??[])),devDependencies:C.all(o.map(l=>l.devDependencies??[])),files:C.all(o.map(l=>l.files??[])),tailwind:c,cssVars:f,css:g,docs:h})}catch(r){return b(r),null}}async function tt(e,t){let r=new Set,i=[],s=t.resolvedPaths?.cwd?await q(t.resolvedPaths.cwd,t.style):t.style;async function o(c){let f=oe(N(c)?c:`styles/${s}/${c}.json`);if(!r.has(f)){r.add(f);try{let[g]=await P([f]),h=k.parse(g);if(i.push(f),h.registryDependencies)for(let l of h.registryDependencies)await o(l);}catch(g){console.error(`Error fetching or parsing registry item at ${c}:`,g);}}}return await o(e),Array.from(new Set(i))}async function rt(e,t){let[r,i]=await Promise.all([qe(e),H(t)]);if(!r)return null;let s={name:e,type:"registry:theme",tailwind:{config:{theme:{extend:{borderRadius:{lg:"var(--radius)",md:"calc(var(--radius) - 2px)",sm:"calc(var(--radius) - 4px)"},colors:{}}}}},cssVars:{theme:{},light:{radius:"0.5rem"},dark:{}}};return t.tailwind.cssVariables&&(s.tailwind.config.theme.extend.colors={...s.tailwind.config.theme.extend.colors,...ne(r.cssVars.dark??{})},s.cssVars={theme:{...r.cssVars.theme,...s.cssVars.theme},light:{...r.cssVars.light,...s.cssVars.light},dark:{...r.cssVars.dark,...s.cssVars.dark}},i==="v4"&&r.cssVarsV4&&(s.cssVars={theme:{...r.cssVarsV4.theme,...s.cssVars.theme},light:{radius:"0.625rem",...r.cssVarsV4.light},dark:{...r.cssVarsV4.dark}})),s}function oe(e){if(N(e)){let t=new URL(e);return t.pathname.match(/\/chat\/b\//)&&!t.pathname.endsWith("/json")&&(t.pathname=`${t.pathname}/json`),t.toString()}return `${Ye}/${e}`}function N(e){try{return new URL(e),!0}catch{return !1}}async function it(e,t){let r=[];for(let i of e){let s=await tt(i,t);r.push(...s);}return Array.from(new Set(r))}function Ar(){return new Map([["registry:ui","ui"],["registry:lib","lib"],["registry:hook","hooks"],["registry:block","components"],["registry:component","components"]])}function Rr(e){let t=new Map;return e.forEach(r=>{r.registryDependencies&&r.registryDependencies.forEach(i=>{t.set(i,r);});}),t} export { ce as A, k as B, nt as C, V as D, M as E, B as F, G, J as H, Qe as I, Ze as J, Cr as K, Tr as L, Er as M, Sr as N, qe as O, Xe as P, jr as Q, Lr as R, P as S, Ir as T, et as U, rt as V, N as W, it as X, Ar as Y, Rr as Z, u as a, x as b, Ft as c, zt as d, Dt as e, _t as f, Q as g, E as h, F as i, Ut as j, je as k, Ie as l, O as m, L as n, vt as o, H as p, d as q, X as r, b as s, cr as t, te as u, Ne as v, W as w, ae as x, le as y, R as z }; //# sourceMappingURL=out.js.map //# sourceMappingURL=chunk-JJ2VRW56.js.map