UNPKG

shadcn

Version:

Add components to your apps.

31 lines (29 loc) 28.1 kB
import { z } from 'zod'; import { promises } from 'fs'; import { tmpdir, homedir } from 'os'; import * as v from 'path'; import v__default from 'path'; import * as E from 'fs/promises'; import { createMatchPath, loadConfig } from 'tsconfig-paths'; import { Project, ScriptKind, SyntaxKind, QuoteKind } from 'ts-morph'; import M from 'fs-extra'; import J from 'fast-glob'; import { red, yellow, cyan, green } from 'kleur/colors'; import { cosmiconfig } from 'cosmiconfig'; import mt from 'ora'; import L from 'deepmerge'; import yt from 'stringify-object'; import { HttpsProxyAgent } from 'https-proxy-agent'; import It from 'node-fetch'; var ge=z.enum(["registry:lib","registry:block","registry:component","registry:ui","registry:hook","registry:page","registry:file","registry:theme","registry:style","registry:item","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:ge.exclude(["registry:file","registry:page"]),target:z.string().optional()})]),Fe=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()}),ee=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()}),Ve=z.record(z.string(),z.lazy(()=>z.union([z.string(),z.record(z.string(),z.union([z.string(),z.record(z.string(),z.string())]))]))),Oe=z.record(z.string(),z.string()),I=z.object({$schema:z.string().optional(),extends:z.string().optional(),name:z.string(),type:ge,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:Fe.optional(),cssVars:ee.optional(),css:Ve.optional(),envVars:Oe.optional(),meta:z.record(z.string(),z.any()).optional(),docs:z.string().optional(),categories:z.array(z.string()).optional()}),Bt=z.object({name:z.string(),homepage:z.string(),items:z.array(I)}),te=z.array(I),de=z.array(z.object({name:z.string(),label:z.string()})),me=z.record(z.string(),z.record(z.string(),z.string())),ue=z.object({inlineColors:z.object({light:z.record(z.string(),z.string()),dark:z.record(z.string(),z.string())}),cssVars:ee,cssVarsV4:ee.optional(),inlineColorsTemplate:z.string(),cssVarsTemplate:z.string()}),he=I.pick({dependencies:!0,devDependencies:!0,files:!0,tailwind:!0,cssVars:!0,css:!0,envVars:!0,docs:!0});async function P(e,t){return createMatchPath(t.absoluteBaseUrl,t.paths)(e,void 0,()=>!0,[".ts",".tsx",".jsx",".js",".css"])}var ye=[".tsx",".ts",".jsx",".js",".css"],we=["lib/utils.ts"],_e=[/^(react|react-dom|next)(\/.*)?$/,/^(node|jsr|npm):.*$/],Ue=new Project({compilerOptions:{}});function We(e){if(_e.some(t=>t.test(e)))return null;if(!e.startsWith("@")&&e.includes("/")&&(e=e.split("/")[0]),e.startsWith("@")){let t=e.split("/");t.length>2&&(e=t.slice(0,2).join("/"));}return e}async function Me(e,t,r,s=new Set){let i=v.resolve(t.resolvedPaths.cwd,e),n=v.relative(t.resolvedPaths.cwd,i);if(we.includes(n))return {dependencies:[],files:[]};let l=v.extname(e);if(!ye.includes(l))return {dependencies:[],files:[]};if(s.has(n))return {dependencies:[],files:[]};if(s.add(n),!(await E.stat(i)).isFile())return {dependencies:[],files:[]};let u=await E.readFile(i,"utf-8"),b=await Be(v.basename(i)),p=Ue.createSourceFile(b,u,{scriptKind:ScriptKind.TSX}),T=await loadConfig(t.resolvedPaths.cwd);if(T.resultType==="failed")return {dependencies:[],files:[]};let g=[],A=new Set,F=xe(e),D={path:n,type:F,target:""};g.push(D);let c=p.getImportDeclarations();for(let V of c){let k=V.getModuleSpecifierValue(),N=k.startsWith(".");if(!k.startsWith(`${r.aliasPrefix}/`)&&!N){let S=We(k);S&&A.add(S);continue}let O=await P(k,T);if(N&&(O=v.resolve(v.dirname(i),k)),!O)continue;if(!v.extname(O))for(let S of ye){let fe=`${O}${S}`;try{await E.access(fe),O=fe;break}catch{continue}}let _=v.relative(t.resolvedPaths.cwd,O);if(s.has(_)||we.includes(_))continue;let Z=xe(k),pe={path:_,type:Z,target:""};(Z==="registry:page"||Z==="registry:file")&&(pe.target=k),g.push(pe);let U=await Me(_,t,r,s);if(U.files)for(let S of U.files)s.has(S.path)||(s.add(S.path),g.push(S));U.dependencies&&U.dependencies.forEach(S=>A.add(S));}let h=Array.from(new Map(g.map(V=>[V.path,V])).values());return {dependencies:Array.from(A),files:h}}async function Be(e){let t=await E.mkdtemp(v.join(tmpdir(),"shadcn-"));return v.join(t,e)}function xe(e){return e.includes("/ui/")?"registry:ui":e.includes("/lib/")?"registry:lib":e.includes("/hooks/")?"registry:hook":(e.includes("/components/"),"registry:component")}function Je(e){try{return new URL(e),!0}catch{return !1}}function $(e){return e.endsWith(".json")&&!Je(e)}function Zt(e){return !!e?.files?.length&&e.files.every(t=>!!t.target&&t.type==="registry:file")}var x={"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 re(e="",t=!0){let r=v__default.join(e,"package.json");return M.readJSONSync(r,{throws:t})}var G=["**/node_modules/**",".next","public","dist","build"];z.object({compilerOptions:z.object({paths:z.record(z.string().or(z.array(z.string())))})});async function Y(e){let[t,r,s,i,n,l,d,u]=await Promise.all([J.glob("**/{next,vite,astro,app}.config.*|gatsby-config.*|composer.json|react-router.config.*",{cwd:e,deep:3,ignore:G}),M.pathExists(v__default.resolve(e,"src")),Ze(e),qe(e),Qe(e),be(e),Xe(e),re(e,!1)]),b=await M.pathExists(v__default.resolve(e,`${r?"src/":""}app`)),p={framework:x.manual,isSrcDir:r,isRSC:!1,isTsx:s,tailwindConfigFile:i,tailwindCssFile:n,tailwindVersion:l,aliasPrefix:d};if(t.find(g=>g.startsWith("next.config."))?.length)return p.framework=b?x["next-app"]:x["next-pages"],p.isRSC=b,p;if(t.find(g=>g.startsWith("astro.config."))?.length)return p.framework=x.astro,p;if(t.find(g=>g.startsWith("gatsby-config."))?.length)return p.framework=x.gatsby,p;if(t.find(g=>g.startsWith("composer.json"))?.length)return p.framework=x.laravel,p;if(Object.keys(u?.dependencies??{}).find(g=>g.startsWith("@remix-run/")))return p.framework=x.remix,p;if([...Object.keys(u?.dependencies??{}),...Object.keys(u?.devDependencies??{})].find(g=>g.startsWith("@tanstack/react-start")))return p.framework=x["tanstack-start"],p;if(t.find(g=>g.startsWith("react-router.config."))?.length)return p.framework=x["react-router"],p;if(t.find(g=>g.startsWith("vite.config."))?.length)return p.framework=x.vite,p;let T=t.find(g=>g.startsWith("app.config"));return T?.length&&(await M.readFile(v__default.resolve(e,T),"utf8")).includes("defineConfig")?(p.framework=x.vite,p):(u?.dependencies?.expo&&(p.framework=x.expo),p)}async function be(e){let[t,r]=await Promise.all([re(e,!1),B(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 Qe(e){let[t,r]=await Promise.all([J.glob(["**/*.css","**/*.scss"],{cwd:e,deep:5,ignore:G}),be(e)]);if(!t.length)return null;for(let i of t){let n=await M.readFile(v__default.resolve(e,i),"utf8");if(n.includes('@import "tailwindcss"')||n.includes("@import 'tailwindcss'")||n.includes("@tailwind base"))return i}return null}async function qe(e){let t=await J.glob("tailwind.config.*",{cwd:e,deep:3,ignore:G});return t.length?t[0]:null}async function Xe(e){let t=await loadConfig(e);if(t?.resultType==="failed"||!Object.entries(t?.paths).length)return null;for(let[r,s]of Object.entries(t.paths))if(s.includes("./*")||s.includes("./src/*")||s.includes("./app/*")||s.includes("./resources/js/*"))return r.replace(/\/\*$/,"")??null;return Object.keys(t?.paths)?.[0].replace(/\/\*$/,"")??null}async function Ze(e){return (await J.glob("tsconfig.*",{cwd:e,deep:1,ignore:G})).length>0}async function yr(e,t=null){let[r,s]=await Promise.all([B(e),t?Promise.resolve(t):Y(e)]);if(r)return r;if(!s||!s.tailwindCssFile||s.tailwindVersion==="v3"&&!s.tailwindConfigFile)return null;let i={$schema:"https://ui.shadcn.com/schema.json",rsc:s.isRSC,tsx:s.isTsx,style:"new-york",tailwind:{config:s.tailwindConfigFile??"",baseColor:"zinc",css:s.tailwindCssFile,cssVariables:!0,prefix:""},iconLibrary:"lucide",aliases:{components:`${s.aliasPrefix}/components`,ui:`${s.aliasPrefix}/components/ui`,hooks:`${s.aliasPrefix}/hooks`,lib:`${s.aliasPrefix}/lib`,utils:`${s.aliasPrefix}/lib/utils`}};return await se(e,i)}async function Pe(e){if(!e.resolvedPaths?.cwd)return "v3";let t=await Y(e.resolvedPaths.cwd);return t?.tailwindVersion?t.tailwindVersion:null}var w={error:red,warn:yellow,info:cyan,success:green};var Ir="@/components",Lr="@/lib/utils",Rr="app/globals.css",Ar="tailwind.config.js";var at=cosmiconfig("components",{searchPlaces:["components.json"]}),ve=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(),Se=ve.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()})}),lt=z.record(Se);async function B(e){let t=await ct(e);return t?(t.iconLibrary||(t.iconLibrary=t.style==="new-york"?"radix":"lucide"),await se(e,t)):null}async function se(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 Se.parse({...t,resolvedPaths:{cwd:e,tailwindConfig:t.tailwind.config?v__default.resolve(e,t.tailwind.config):"",tailwindCss:v__default.resolve(e,t.tailwind.css),utils:await P(t.aliases.utils,r),components:await P(t.aliases.components,r),ui:t.aliases.ui?await P(t.aliases.ui,r):v__default.resolve(await P(t.aliases.components,r)??e,"ui"),lib:t.aliases.lib?await P(t.aliases.lib,r):v__default.resolve(await P(t.aliases.utils,r)??e,".."),hooks:t.aliases.hooks?await P(t.aliases.hooks,r):v__default.resolve(await P(t.aliases.components,r)??e,"..","hooks")}})}async function ct(e){try{let t=await at.search(e);return t?ve.parse(t.config):null}catch{let r=`${e}/components.json`;throw new Error(`Invalid configuration found in ${w.info(r)}.`)}}async function Fr(e){let t={};for(let s of Object.keys(e.aliases)){if(!ft(s,e))continue;let i=e.resolvedPaths[s],n=await pt(e.resolvedPaths.cwd,i);if(!n){t[s]=e;continue}t[s]=await B(n);}let r=lt.safeParse(t);return r.success?r.data:null}async function pt(e,t){let r=gt(e,t),s=v__default.relative(r,t),n=(await J.glob("**/package.json",{cwd:r,deep:3,ignore:["**/node_modules/**","**/dist/**","**/build/**","**/public/**"]})).map(l=>v__default.dirname(l)).find(l=>s.startsWith(l));return n?v__default.join(r,n):null}function ft(e,t){return Object.keys(t.resolvedPaths).filter(r=>r!=="utils").includes(e)}function gt(e,t){let r=e.split(v__default.sep),s=t.split(v__default.sep),i=[];for(let n=0;n<Math.min(r.length,s.length)&&r[n]===s[n];n++)i.push(r[n]);return i.join(v__default.sep)}async function ie(e,t){return (await Y(e))?.tailwindVersion==="v4"?"new-york-v4":t}function Vr(e){let t={resolvedPaths:{cwd:process.cwd(),tailwindConfig:"",tailwindCss:"",utils:"",components:"",ui:"",lib:"",hooks:""},style:"",tailwind:{config:"",css:"",baseColor:"",cssVariables:!1},rsc:!1,tsx:!0,aliases:{components:"",utils:""}};return e?{...t,...e,resolvedPaths:{...t.resolvedPaths,...e.resolvedPaths||{}},tailwind:{...t.tailwind,...e.tailwind||{}},aliases:{...t.aliases,...e.aliases||{}}}:t}var m={error(...e){console.log(w.error(e.join(" ")));},warn(...e){console.log(w.warn(e.join(" ")));},info(...e){console.log(w.info(e.join(" ")));},success(...e){console.log(w.success(e.join(" ")));},log(...e){console.log(e.join(" "));},break(){console.log("");}};function C(e){if(m.error("Something went wrong. Please check the error below for more details."),m.error("If the problem persists, please open an issue on GitHub."),m.error(""),typeof e=="string"&&(m.error(e),m.break(),process.exit(1)),e instanceof z.ZodError){m.error("Validation failed:");for(let[t,r]of Object.entries(e.flatten().fieldErrors))m.error(`- ${w.info(t)}: ${r}`);m.break(),process.exit(1);}e instanceof Error&&(m.error(e.message),m.break(),process.exit(1)),m.break(),process.exit(1);}function Ce(e,t){return mt({text:e,isSilent:t?.silent})}async function rs(e,t,r){if(!e||(r={silent:!1,tailwindVersion:"v3",...r},r.tailwindVersion==="v4"))return;let s=v__default.relative(t.resolvedPaths.cwd,t.resolvedPaths.tailwindConfig),i=Ce(`Updating ${w.info(s)}`,{silent:r.silent}).start(),n=await promises.readFile(t.resolvedPaths.tailwindConfig,"utf8"),l=await bt(n,e,t);await promises.writeFile(t.resolvedPaths.tailwindConfig,l,"utf8"),i?.succeed();}async function bt(e,t,r){let s=await ke(e,r),i=s.getDescendantsOfKind(SyntaxKind.ObjectLiteralExpression).find(l=>l.getProperties().some(d=>d.isKind(SyntaxKind.PropertyAssignment)&&d.getName()==="content"));if(!i)return e;let n=Ct(i);return Pt(i,{name:"darkMode",value:"class"},{quoteChar:n}),t.plugins?.forEach(l=>{St(i,l);}),t.theme&&await vt(i,t.theme),s.getFullText()}function Pt(e,t,{quoteChar:r}){let s=e.getProperty("darkMode");if(!s){let i={name:t.name,initializer:`[${r}${t.value}${r}]`};return t.name==="darkMode"?(e.insertPropertyAssignment(0,i),e):(e.addPropertyAssignment(i),e)}if(s.isKind(SyntaxKind.PropertyAssignment)){let i=s.getInitializer(),n=`${r}${t.value}${r}`;if(i?.isKind(SyntaxKind.StringLiteral)){let l=i.getText();return i.replaceWithText(`[${l}, ${n}]`),e}if(i?.isKind(SyntaxKind.ArrayLiteralExpression)){if(i.getElements().map(l=>l.getText()).includes(n))return e;i.addElement(n);}return e}return e}async function vt(e,t){e.getProperty("theme")||e.addPropertyAssignment({name:"theme",initializer:"{}"}),oe(e);let s=(e.getPropertyOrThrow("theme")?.asKindOrThrow(SyntaxKind.PropertyAssignment)).getInitializer();if(s?.isKind(SyntaxKind.ObjectLiteralExpression)){let i=s.getText(),n=await Tt(i),l=L(n,t,{arrayMerge:(u,b)=>b}),d=yt(l).replace(/\'\.\.\.(.*)\'/g,"...$1").replace(/\'\"/g,"'").replace(/\"\'/g,"'").replace(/\'\[/g,"[").replace(/\]\'/g,"]").replace(/\'\\\'/g,"'").replace(/\\\'/g,"'").replace(/\\\'\'/g,"'").replace(/\'\'/g,"'");s.replaceWithText(d);}ae(e);}function St(e,t){let r=e.getProperty("plugins");if(!r)return e.addPropertyAssignment({name:"plugins",initializer:`[${t}]`}),e;if(r.isKind(SyntaxKind.PropertyAssignment)){let s=r.getInitializer();if(s?.isKind(SyntaxKind.ArrayLiteralExpression)){if(s.getElements().map(i=>i.getText().replace(/["']/g,"")).includes(t.replace(/["']/g,"")))return e;s.addElement(t);}return e}return e}async function ke(e,t){let r=await promises.mkdtemp(v__default.join(tmpdir(),"shadcn-")),s=t?.resolvedPaths?.tailwindConfig||"tailwind.config.ts",i=v__default.join(r,`shadcn-${v__default.basename(s)}`);return new Project({compilerOptions:{}}).createSourceFile(i,e,{scriptKind:v__default.extname(s)===".ts"?ScriptKind.TS:ScriptKind.JS})}function Ct(e){return e.getFirstDescendantByKind(SyntaxKind.StringLiteral)?.getQuoteKind()===QuoteKind.Single?"'":'"'}function oe(e){let t=e.getProperties();for(let r=0;r<t.length;r++){let s=t[r];if(s.isKind(SyntaxKind.SpreadAssignment)){let i=s.asKindOrThrow(SyntaxKind.SpreadAssignment),n=i.getExpression().getText();e.insertPropertyAssignment(r,{name:`"___${n.replace(/^\.\.\./,"")}"`,initializer:`"...${n.replace(/^\.\.\./,"")}"`}),i.remove();}else if(s.isKind(SyntaxKind.PropertyAssignment)){let n=s.asKindOrThrow(SyntaxKind.PropertyAssignment).getInitializer();n&&n.isKind(SyntaxKind.ObjectLiteralExpression)?oe(n.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)):n&&n.isKind(SyntaxKind.ArrayLiteralExpression)&&Ee(n.asKindOrThrow(SyntaxKind.ArrayLiteralExpression));}}}function Ee(e){let t=e.getElements();for(let r=0;r<t.length;r++){let s=t[r];if(s.isKind(SyntaxKind.ObjectLiteralExpression))oe(s.asKindOrThrow(SyntaxKind.ObjectLiteralExpression));else if(s.isKind(SyntaxKind.ArrayLiteralExpression))Ee(s.asKindOrThrow(SyntaxKind.ArrayLiteralExpression));else if(s.isKind(SyntaxKind.SpreadElement)){let i=s.getText();e.removeElement(r),e.insertElement(r,`"${i}"`);}}}function ae(e){let t=e.getProperties();for(let r=0;r<t.length;r++){let s=t[r];if(s.isKind(SyntaxKind.PropertyAssignment)){let i=s,n=i.getInitializer();if(n&&n.isKind(SyntaxKind.StringLiteral)){let l=n.asKindOrThrow(SyntaxKind.StringLiteral).getLiteralValue();l.startsWith("...")&&(e.insertSpreadAssignment(r,{expression:l.slice(3)}),i.remove());}else n?.isKind(SyntaxKind.ObjectLiteralExpression)?ae(n):n&&n.isKind(SyntaxKind.ArrayLiteralExpression)&&je(n.asKindOrThrow(SyntaxKind.ArrayLiteralExpression));}}}function je(e){let t=e.getElements();for(let r=0;r<t.length;r++){let s=t[r];if(s.isKind(SyntaxKind.ObjectLiteralExpression))ae(s.asKindOrThrow(SyntaxKind.ObjectLiteralExpression));else if(s.isKind(SyntaxKind.ArrayLiteralExpression))je(s.asKindOrThrow(SyntaxKind.ArrayLiteralExpression));else if(s.isKind(SyntaxKind.StringLiteral)){let i=s.getText(),n=/(?:^['"])(\.\.\..*)(?:['"]$)/g;n.test(i)&&(e.removeElement(r),e.insertElement(r,i.replace(n,"$1")));}}}async function Tt(e){let r=(await ke(`const theme = ${e}`,null)).getStatements()[0];if(r?.getKind()===SyntaxKind.VariableStatement){let i=(r.getDeclarationList()?.getDeclarations()[0]).getInitializer();if(i?.isKind(SyntaxKind.ObjectLiteralExpression))return await H(i)}throw new Error("Invalid input: not an object literal")}function H(e){let t={};for(let r of e.getProperties())if(r.isKind(SyntaxKind.PropertyAssignment)){let s=r.getName().replace(/\'/g,"");r.getInitializer()?.isKind(SyntaxKind.ObjectLiteralExpression)?t[s]=H(r.getInitializer()):r.getInitializer()?.isKind(SyntaxKind.ArrayLiteralExpression)?t[s]=Ie(r.getInitializer()):t[s]=le(r.getInitializer());}return t}function Ie(e){let t=[];for(let r of e.getElements())r.isKind(SyntaxKind.ObjectLiteralExpression)?t.push(H(r.asKindOrThrow(SyntaxKind.ObjectLiteralExpression))):r.isKind(SyntaxKind.ArrayLiteralExpression)?t.push(Ie(r.asKindOrThrow(SyntaxKind.ArrayLiteralExpression))):t.push(le(r));return t}function le(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(le);case SyntaxKind.ObjectLiteralExpression:return H(e);default:return e.getText()}}function Le(e){let t={};for(let r of Object.keys(e)){let s=r.split("-"),i=s[0],n=s.slice(1).join("-");n===""?typeof t[i]=="object"?t[i].DEFAULT=`hsl(var(--${r}))`:t[i]=`hsl(var(--${r}))`:(typeof t[i]!="object"&&(t[i]={DEFAULT:`hsl(var(--${i}))`}),t[i][n]=`hsl(var(--${r}))`);}for(let[r,s]of Object.entries(t))typeof s=="object"&&s.DEFAULT===`hsl(var(--${r}))`&&!(r in e)&&delete s.DEFAULT;return t}var Rt=process.env.REGISTRY_URL??"https://ui.shadcn.com/r",At=process.env.https_proxy?new HttpsProxyAgent(process.env.https_proxy):void 0,Q=new Map,Ft=[{name:"neutral",label:"Neutral"},{name:"gray",label:"Gray"},{name:"zinc",label:"Zinc"},{name:"stone",label:"Stone"},{name:"slate",label:"Slate"}];async function Vt(){try{let[e]=await j(["index.json"]);return te.parse(e)}catch(e){m.error(` `),C(e);}}async function bs(){try{let[e]=await j(["styles/index.json"]);return de.parse(e)}catch(e){return m.error(` `),C(e),[]}}async function Ps(){try{let[e]=await j(["icons/index.json"]);return me.parse(e)}catch(e){return C(e),{}}}async function q(e,t){try{if($(e))return await Ot(e);let[r]=await j([R(e)?e:`styles/${t}/${e}.json`]);return I.parse(r)}catch(r){return m.break(),C(r),null}}async function Ot(e){try{let t=e;e.startsWith("~/")&&(t=v__default.join(homedir(),e.slice(2)));let r=v__default.resolve(t),s=await promises.readFile(r,"utf8"),i=JSON.parse(s);return I.parse(i)}catch(t){return m.error(`Failed to read local registry file: ${e}`),C(t),null}}async function vs(){return Ft}async function $t(e){try{let[t]=await j([`colors/${e}.json`]);return ue.parse(t)}catch(t){C(t);}}async function Kt(e,t){let r=[];for(let s of t){let i=e.find(n=>n.name===s);if(i&&(r.push(i),i.registryDependencies)){let n=await Kt(e,i.registryDependencies);r.push(...n);}}return r.filter((s,i,n)=>n.findIndex(l=>l.name===s.name)===i)}async function Ss(e,t){try{let r=t.map(i=>`styles/${e}/${i.name}.json`),s=await j(r);return te.parse(s)}catch(r){C(r);}}async function Cs(e,t,r){if(r)return r;if(t.type==="registry:ui")return e.resolvedPaths.ui??e.resolvedPaths.components;let[s,i]=t.type?.split(":")??[];return s in e.resolvedPaths?v__default.join(e.resolvedPaths[s],i):null}async function j(e,t={}){t={useCache:!0,...t};try{return await Promise.all(e.map(async s=>{let i=Re(s);if(t.useCache&&Q.has(i))return Q.get(i);let n=(async()=>{let l=await It(i,{agent:At});if(!l.ok){let d={400:"Bad request",401:"Unauthorized",403:"Forbidden",404:"Not found",500:"Internal server error"};if(l.status===401)throw new Error(`You are not authorized to access the component at ${w.info(i)}. If this is a remote registry, you may need to authenticate.`);if(l.status===404)throw new Error(`The component at ${w.info(i)} was not found. It may not exist at the registry. Please make sure it is a valid component.`);if(l.status===403)throw new Error(`You do not have access to the component at ${w.info(i)}. If this is a remote registry, you may need to authenticate or a token.`);let u=await l.json(),b=u&&typeof u=="object"&&"error"in u?u.error:l.statusText||d[l.status];throw new Error(`Failed to fetch from ${w.info(i)}. ${b}`)}return l.json()})();return t.useCache&&Q.set(i,n),n}))}catch(r){return m.error(` `),C(r),[]}}function Ts(){Q.clear();}async function X(e,t,r=new Set){let s=[],i=[];for(let n of e)if(!r.has(n)){if(r.add(n),R(n)||$(n)){let l=await q(n,"");if(l&&(s.push(l),l.registryDependencies)){let d=await X(l.registryDependencies,t,r);s.push(...d.items),i.push(...d.registryNames);}}else if(i.push(n),t){let l=t.resolvedPaths?.cwd?await ie(t.resolvedPaths.cwd,t.style):t.style;try{let d=await q(n,l);if(d&&d.registryDependencies){let u=await X(d.registryDependencies,t,r);s.push(...u.items),i.push(...u.registryNames);}}catch{}}}return {items:s,registryNames:i}}async function zt(e,t){try{let r=e.filter(c=>$(c)),s=e.filter(c=>R(c)),i=e.filter(c=>!$(c)&&!R(c)),n=[],l=[];for(let c of r){let h=await q(c,"");h&&(n.push(h),h.registryDependencies&&l.push(...h.registryDependencies));}for(let c of s){let h=await q(c,"");h&&(n.push(h),h.registryDependencies&&l.push(...h.registryDependencies));}let{items:d,registryNames:u}=await X(l,t);n.push(...d);let b=[...i,...u];if(b.length>0){if(await Vt()){let h=Array.from(new Set(b));h.includes("index")&&h.unshift("index");let V=await _t(h,t),k=await j(V),N=z.array(I).parse(k);n.push(...N);}else if(n.length===0)return null}if(!n.length)return null;if(b.includes("index")&&t.tailwind.baseColor){let c=await Nt(t.tailwind.baseColor,t);c&&n.unshift(c);}n.sort((c,h)=>c.type==="registry:theme"?-1:1);let p={};n.forEach(c=>{p=L(p,c.tailwind??{});});let T={};n.forEach(c=>{T=L(T,c.cssVars??{});});let g={};n.forEach(c=>{g=L(g,c.css??{});});let A="";n.forEach(c=>{c.docs&&(A+=`${c.docs} `);});let F={};n.forEach(c=>{F=L(F,c.envVars??{});});let D=he.parse({dependencies:L.all(n.map(c=>c.dependencies??[])),devDependencies:L.all(n.map(c=>c.devDependencies??[])),files:L.all(n.map(c=>c.files??[])),tailwind:p,cssVars:T,css:g,docs:A});return Object.keys(F).length>0&&(D.envVars=F),D}catch(r){return C(r),null}}async function Dt(e,t){let{registryNames:r}=await X([e],t),s=t.resolvedPaths?.cwd?await ie(t.resolvedPaths.cwd,t.style):t.style,i=r.map(n=>Re(R(n)?n:`styles/${s}/${n}.json`));return Array.from(new Set(i))}async function Nt(e,t){let[r,s]=await Promise.all([$t(e),Pe(t)]);if(!r)return null;let i={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&&(i.tailwind.config.theme.extend.colors={...i.tailwind.config.theme.extend.colors,...Le(r.cssVars.dark??{})},i.cssVars={theme:{...r.cssVars.theme,...i.cssVars.theme},light:{...r.cssVars.light,...i.cssVars.light},dark:{...r.cssVars.dark,...i.cssVars.dark}},s==="v4"&&r.cssVarsV4&&(i.cssVars={theme:{...r.cssVarsV4.theme,...i.cssVars.theme},light:{radius:"0.625rem",...r.cssVarsV4.light},dark:{...r.cssVarsV4.dark}})),i}function Re(e){if(R(e)){let t=new URL(e);return t.pathname.match(/\/chat\/b\//)&&!t.pathname.endsWith("/json")&&(t.pathname=`${t.pathname}/json`),t.toString()}return `${Rt}/${e}`}function R(e){try{return new URL(e),!0}catch{return !1}}async function _t(e,t){let r=[],s=e.filter(i=>!$(i)&&!R(i));for(let i of s){let n=await Dt(i,t);r.push(...n);}return Array.from(new Set(r))}function ks(){return new Map([["registry:ui","ui"],["registry:lib","lib"],["registry:hook","hooks"],["registry:block","components"],["registry:component","components"]])}function Es(e){let t=new Map;return e.forEach(r=>{r.registryDependencies&&r.registryDependencies.forEach(s=>{t.set(s,r);});}),t} export { Nt as $, Ct as A, ge as B, Ae as C, Fe as D, ee as E, Ve as F, Oe as G, I as H, Bt as I, te as J, de as K, me as L, ue as M, he as N, Ft as O, Vt as P, bs as Q, Ps as R, q as S, vs as T, $t as U, Kt as V, Ss as W, Cs as X, j as Y, Ts as Z, zt as _, w as a, R as aa, P as b, _t as ba, Ir as c, ks as ca, Lr as d, Es as da, Rr as e, Ar as f, ve as g, B as h, se as i, Fr as j, pt as k, gt as l, Vr as m, re as n, Y as o, yr as p, Pe as q, m as r, Ce as s, Me as t, Je as u, $ as v, Zt as w, C as x, rs as y, ke as z }; //# sourceMappingURL=out.js.map //# sourceMappingURL=chunk-P4EM45ZN.js.map