shadcn 0.0.0-beta.f29aebd → 0.0.0-beta.f7256b24

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.
@@ -0,0 +1,67 @@
1
+ import { z } from 'zod';
2
+ import { promises } from 'fs';
3
+ import { tmpdir, homedir } from 'os';
4
+ import * as C from 'path';
5
+ import C__default from 'path';
6
+ import * as F from 'fs/promises';
7
+ import { createMatchPath, loadConfig } from 'tsconfig-paths';
8
+ import { Project, ScriptKind, SyntaxKind, QuoteKind } from 'ts-morph';
9
+ import Y from 'fs-extra';
10
+ import Z from 'fast-glob';
11
+ import { red, yellow, cyan, green } from 'kleur/colors';
12
+ import { cosmiconfig } from 'cosmiconfig';
13
+ import Rt from 'ora';
14
+ import O from 'deepmerge';
15
+ import Ft from 'stringify-object';
16
+ import { HttpsProxyAgent } from 'https-proxy-agent';
17
+ import Mt from 'node-fetch';
18
+
19
+ var be=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"]),Me=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:be.exclude(["registry:file","registry:page"]),target:z.string().optional()})]),He=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()}),ie=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()}),Be=z.record(z.string(),z.lazy(()=>z.union([z.string(),z.record(z.string(),z.union([z.string(),z.record(z.string(),z.string())]))]))),Ge=z.record(z.string(),z.string()),A=z.object({$schema:z.string().optional(),extends:z.string().optional(),name:z.string(),type:be,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(Me).optional(),tailwind:He.optional(),cssVars:ie.optional(),css:Be.optional(),envVars:Ge.optional(),meta:z.record(z.string(),z.any()).optional(),docs:z.string().optional(),categories:z.array(z.string()).optional()}),nr=z.object({name:z.string(),homepage:z.string(),items:z.array(A)}),ne=z.array(A),Se=z.array(z.object({name:z.string(),label:z.string()})),Ce=z.record(z.string(),z.record(z.string(),z.string())),Ee=z.object({inlineColors:z.object({light:z.record(z.string(),z.string()),dark:z.record(z.string(),z.string())}),cssVars:ie,cssVarsV4:ie.optional(),inlineColorsTemplate:z.string(),cssVarsTemplate:z.string()}),Pe=A.pick({dependencies:!0,devDependencies:!0,files:!0,tailwind:!0,cssVars:!0,css:!0,envVars:!0,docs:!0}),Je=z.union([z.string().refine(e=>e.includes("{name}"),{message:"Registry URL must include {name} placeholder"}),z.object({url:z.string().refine(e=>e.includes("{name}"),{message:"Registry URL must include {name} placeholder"}),params:z.record(z.string(),z.string()).optional(),headers:z.record(z.string(),z.string()).optional()})]),Ye=z.record(z.string().refine(e=>e.startsWith("@"),{message:"Registry names must start with @ (e.g., @v0, @acme)"}),Je),oe=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(),registries:Ye.optional()}).strict(),ae=oe.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()})}),ke=z.record(ae);var le={headers:{}};function ce(e){le.headers=e;}function je(e){return le.headers[e]||{}}function ar(){le.headers={};}var qe=/^(@[a-zA-Z0-9](?:[a-zA-Z0-9-_]*[a-zA-Z0-9])?)\/(.+)$/;function D(e){if(!e.startsWith("@"))return {registry:null,item:e};let t=e.match(qe);return t?{registry:t[1],item:t[2]}:{registry:null,item:e}}function N(e){return e.replace(/\${(\w+)}/g,(t,r)=>process.env[r]||"")}function _(e){let t=[],r=/\${(\w+)}/g,s;for(;(s=r.exec(e))!==null;)t.push(s[1]);return t}function Te(e,t){if(typeof t=="string")return N(t.replace("{name}",e));let r=N(t.url.replace("{name}",e));if(t.params){let s=new URLSearchParams;for(let[o,l]of Object.entries(t.params)){let g=N(l);g&&s.append(o,g);}let i=s.toString();i&&(r+=(r.includes("?")?"&":"?")+i);}return r}function Re(e){if(typeof e=="string"||!e.headers)return {};let t={};for(let[r,s]of Object.entries(e.headers)){let i=N(s);if(s.includes("${")){let o=s.replace(/\${[^}]+}/g,"").trim();i.trim()!==o&&(t[r]=i);}else i.trim()&&(t[r]=i);}return t}function Ze(e){let t=new Set;return typeof e=="string"?_(e).forEach(r=>t.add(r)):(_(e.url).forEach(r=>t.add(r)),e.params&&Object.values(e.params).forEach(r=>{_(r).forEach(s=>t.add(s));}),e.headers&&Object.values(e.headers).forEach(r=>{_(r).forEach(s=>t.add(s));})),Array.from(t)}function Ie(e,t){let s=Ze(t).filter(i=>!process.env[i]);if(s.length>0){let i=s.map(o=>o.includes("TOKEN")?`export ${o}="your-token-here"`:o.includes("KEY")?`export ${o}="your-api-key-here"`:o.includes("SECRET")?`export ${o}="your-secret-here"`:`export ${o}="your-value-here"`);throw new Error(`Registry "${e}" requires environment variables:
20
+
21
+ `+s.map(o=>` \u2022 ${o}`).join(`
22
+ `)+`
23
+
24
+ Set them in your environment:
25
+
26
+ `+i.map(o=>` ${o}`).join(`
27
+ `)+`
28
+
29
+ Or add them to a .env file in your project root.`)}}function pe(e,t){let r={},s=[...e];t||ce({});for(let i=0;i<s.length;i++){let o=G(s[i],t);o&&(s[i]=o.url,Object.keys(o.headers).length>0&&(r[o.url]=o.headers));}return ce(r),s}function G(e,t={}){let{registry:r,item:s}=D(e);if(!r)return null;let i=t[r];if(!i)throw new Error(`Unknown registry "${r}". Make sure it is defined in components.json as follows:
30
+ {
31
+ "registries": {
32
+ "${r}": "https://example.com/{name}.json"
33
+ }
34
+ }`);return Ie(r,i),{url:Te(s,i),headers:Re(i)}}async function S(e,t){return createMatchPath(t.absoluteBaseUrl,t.paths)(e,void 0,()=>!0,[".ts",".tsx",".jsx",".js",".css"])}var Le=[".tsx",".ts",".jsx",".js",".css"],Fe=["lib/utils.ts"],st=[/^(react|react-dom|next)(\/.*)?$/,/^(node|jsr|npm):.*$/],it=new Project({compilerOptions:{}});function nt(e){if(st.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 ot(e,t,r,s=new Set){let i=C.resolve(t.resolvedPaths.cwd,e),o=C.relative(t.resolvedPaths.cwd,i);if(Fe.includes(o))return {dependencies:[],files:[]};let l=C.extname(e);if(!Le.includes(l))return {dependencies:[],files:[]};if(s.has(o))return {dependencies:[],files:[]};if(s.add(o),!(await F.stat(i)).isFile())return {dependencies:[],files:[]};let m=await F.readFile(i,"utf-8"),f=await at(C.basename(i)),c=it.createSourceFile(f,m,{scriptKind:ScriptKind.TSX}),x=await loadConfig(t.resolvedPaths.cwd);if(x.resultType==="failed")return {dependencies:[],files:[]};let d=[],I=new Set,M=$e(e),p={path:o,type:M,target:""};d.push(p);let u=c.getImportDeclarations();for(let E of u){let v=E.getModuleSpecifierValue(),L=v.startsWith(".");if(!v.startsWith(`${r.aliasPrefix}/`)&&!L){let k=nt(v);k&&I.add(k);continue}let z=await S(v,x);if(L&&(z=C.resolve(C.dirname(i),v)),!z)continue;if(!C.extname(z))for(let k of Le){let ve=`${z}${k}`;try{await F.access(ve),z=ve;break}catch{continue}}let H=C.relative(t.resolvedPaths.cwd,z);if(s.has(H)||Fe.includes(H))continue;let se=$e(v),xe={path:H,type:se,target:""};(se==="registry:page"||se==="registry:file")&&(xe.target=v),d.push(xe);let B=await ot(H,t,r,s);if(B.files)for(let k of B.files)s.has(k.path)||(s.add(k.path),d.push(k));B.dependencies&&B.dependencies.forEach(k=>I.add(k));}let T=Array.from(new Map(d.map(E=>[E.path,E])).values());return {dependencies:Array.from(I),files:T}}async function at(e){let t=await F.mkdtemp(C.join(tmpdir(),"shadcn-"));return C.join(t,e)}function $e(e){return e.includes("/ui/")?"registry:ui":e.includes("/lib/")?"registry:lib":e.includes("/hooks/")?"registry:hook":(e.includes("/components/"),"registry:component")}function lt(e){try{return new URL(e),!0}catch{return !1}}function V(e){return e.endsWith(".json")&&!lt(e)}function kr(e){return !!e?.files?.length&&e.files.every(t=>!!t.target&&t.type==="registry:file")}var b={"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 ge(e="",t=!0){let r=C__default.join(e,"package.json");return Y.readJSONSync(r,{throws:t})}var Q=["**/node_modules/**",".next","public","dist","build"];z.object({compilerOptions:z.object({paths:z.record(z.string().or(z.array(z.string())))})});async function X(e){let[t,r,s,i,o,l,g,m]=await Promise.all([Z.glob("**/{next,vite,astro,app}.config.*|gatsby-config.*|composer.json|react-router.config.*",{cwd:e,deep:3,ignore:Q}),Y.pathExists(C__default.resolve(e,"src")),ut(e),mt(e),ft(e),Ae(e),dt(e),ge(e,!1)]),f=await Y.pathExists(C__default.resolve(e,`${r?"src/":""}app`)),c={framework:b.manual,isSrcDir:r,isRSC:!1,isTsx:s,tailwindConfigFile:i,tailwindCssFile:o,tailwindVersion:l,aliasPrefix:g};if(t.find(d=>d.startsWith("next.config."))?.length)return c.framework=f?b["next-app"]:b["next-pages"],c.isRSC=f,c;if(t.find(d=>d.startsWith("astro.config."))?.length)return c.framework=b.astro,c;if(t.find(d=>d.startsWith("gatsby-config."))?.length)return c.framework=b.gatsby,c;if(t.find(d=>d.startsWith("composer.json"))?.length)return c.framework=b.laravel,c;if(Object.keys(m?.dependencies??{}).find(d=>d.startsWith("@remix-run/")))return c.framework=b.remix,c;if([...Object.keys(m?.dependencies??{}),...Object.keys(m?.devDependencies??{})].find(d=>d.startsWith("@tanstack/react-start")))return c.framework=b["tanstack-start"],c;if(t.find(d=>d.startsWith("react-router.config."))?.length)return c.framework=b["react-router"],c;if(t.find(d=>d.startsWith("vite.config."))?.length)return c.framework=b.vite,c;let x=t.find(d=>d.startsWith("app.config"));return x?.length&&(await Y.readFile(C__default.resolve(e,x),"utf8")).includes("defineConfig")?(c.framework=b.vite,c):(m?.dependencies?.expo&&(c.framework=b.expo),c)}async function Ae(e){let[t,r]=await Promise.all([ge(e,!1),q(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 ft(e){let[t,r]=await Promise.all([Z.glob(["**/*.css","**/*.scss"],{cwd:e,deep:5,ignore:Q}),Ae(e)]);if(!t.length)return null;for(let i of t){let o=await Y.readFile(C__default.resolve(e,i),"utf8");if(o.includes('@import "tailwindcss"')||o.includes("@import 'tailwindcss'")||o.includes("@tailwind base"))return i}return null}async function mt(e){let t=await Z.glob("tailwind.config.*",{cwd:e,deep:3,ignore:Q});return t.length?t[0]:null}async function dt(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 ut(e){return (await Z.glob("tsconfig.*",{cwd:e,deep:1,ignore:Q})).length>0}async function Wr(e,t=null){let[r,s]=await Promise.all([q(e),t?Promise.resolve(t):X(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 fe(e,i)}async function Ve(e){if(!e.resolvedPaths?.cwd)return "v3";let t=await X(e.resolvedPaths.cwd);return t?.tailwindVersion?t.tailwindVersion:null}var w={error:red,warn:yellow,info:cyan,success:green};var ts="@/components",rs="@/lib/utils",ss="app/globals.css",is="tailwind.config.js";var Ct=cosmiconfig("components",{searchPlaces:["components.json"]});async function q(e){let t=await Et(e);return t?(t.iconLibrary||(t.iconLibrary=t.style==="new-york"?"radix":"lucide"),await fe(e,t)):null}async function fe(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 ae.parse({...t,resolvedPaths:{cwd:e,tailwindConfig:t.tailwind.config?C__default.resolve(e,t.tailwind.config):"",tailwindCss:C__default.resolve(e,t.tailwind.css),utils:await S(t.aliases.utils,r),components:await S(t.aliases.components,r),ui:t.aliases.ui?await S(t.aliases.ui,r):C__default.resolve(await S(t.aliases.components,r)??e,"ui"),lib:t.aliases.lib?await S(t.aliases.lib,r):C__default.resolve(await S(t.aliases.utils,r)??e,".."),hooks:t.aliases.hooks?await S(t.aliases.hooks,r):C__default.resolve(await S(t.aliases.components,r)??e,"..","hooks")}})}async function Et(e){try{let t=await Ct.search(e);return t?oe.parse(t.config):null}catch{let r=`${e}/components.json`;throw new Error(`Invalid configuration found in ${w.info(r)}.`)}}async function ns(e){let t={};for(let s of Object.keys(e.aliases)){if(!kt(s,e))continue;let i=e.resolvedPaths[s],o=await Pt(e.resolvedPaths.cwd,i);if(!o){t[s]=e;continue}t[s]=await q(o);}let r=ke.safeParse(t);return r.success?r.data:null}async function Pt(e,t){let r=jt(e,t),s=C__default.relative(r,t),o=(await Z.glob("**/package.json",{cwd:r,deep:3,ignore:["**/node_modules/**","**/dist/**","**/build/**","**/public/**"]})).map(l=>C__default.dirname(l)).find(l=>s.startsWith(l));return o?C__default.join(r,o):null}function kt(e,t){return Object.keys(t.resolvedPaths).filter(r=>r!=="utils").includes(e)}function jt(e,t){let r=e.split(C__default.sep),s=t.split(C__default.sep),i=[];for(let o=0;o<Math.min(r.length,s.length)&&r[o]===s[o];o++)i.push(r[o]);return i.join(C__default.sep)}async function me(e,t){return (await X(e))?.tailwindVersion==="v4"?"new-york-v4":t}function os(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 h={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 j(e){if(h.break(),h.error("Something went wrong. Please check the error below for more details."),h.error("If the problem persists, please open an issue on GitHub."),h.error(""),typeof e=="string"&&(h.error(e),h.break(),process.exit(1)),e instanceof z.ZodError){h.error("Validation failed:");for(let[t,r]of Object.entries(e.flatten().fieldErrors))h.error(`- ${w.info(t)}: ${r}`);h.break(),process.exit(1);}e instanceof Error&&(h.error(e.message),h.break(),process.exit(1)),h.break(),process.exit(1);}function Oe(e,t){return Rt({text:e,isSilent:t?.silent})}async function Ts(e,t,r){if(!e||(r={silent:!1,tailwindVersion:"v3",...r},r.tailwindVersion==="v4"))return;let s=C__default.relative(t.resolvedPaths.cwd,t.resolvedPaths.tailwindConfig),i=Oe(`Updating ${w.info(s)}`,{silent:r.silent}).start(),o=await promises.readFile(t.resolvedPaths.tailwindConfig,"utf8"),l=await Vt(o,e,t);await promises.writeFile(t.resolvedPaths.tailwindConfig,l,"utf8"),i?.succeed();}async function Vt(e,t,r){let s=await De(e,r),i=s.getDescendantsOfKind(SyntaxKind.ObjectLiteralExpression).find(l=>l.getProperties().some(g=>g.isKind(SyntaxKind.PropertyAssignment)&&g.getName()==="content"));if(!i)return e;let o=Kt(i);return Ot(i,{name:"darkMode",value:"class"},{quoteChar:o}),t.plugins?.forEach(l=>{Dt(i,l);}),t.theme&&await zt(i,t.theme),s.getFullText()}function Ot(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(),o=`${r}${t.value}${r}`;if(i?.isKind(SyntaxKind.StringLiteral)){let l=i.getText();return i.replaceWithText(`[${l}, ${o}]`),e}if(i?.isKind(SyntaxKind.ArrayLiteralExpression)){if(i.getElements().map(l=>l.getText()).includes(o))return e;i.addElement(o);}return e}return e}async function zt(e,t){e.getProperty("theme")||e.addPropertyAssignment({name:"theme",initializer:"{}"}),ue(e);let s=(e.getPropertyOrThrow("theme")?.asKindOrThrow(SyntaxKind.PropertyAssignment)).getInitializer();if(s?.isKind(SyntaxKind.ObjectLiteralExpression)){let i=s.getText(),o=await Nt(i),l=O(o,t,{arrayMerge:(m,f)=>f}),g=Ft(l).replace(/\'\.\.\.(.*)\'/g,"...$1").replace(/\'\"/g,"'").replace(/\"\'/g,"'").replace(/\'\[/g,"[").replace(/\]\'/g,"]").replace(/\'\\\'/g,"'").replace(/\\\'/g,"'").replace(/\\\'\'/g,"'").replace(/\'\'/g,"'");s.replaceWithText(g);}he(e);}function Dt(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 De(e,t){let r=await promises.mkdtemp(C__default.join(tmpdir(),"shadcn-")),s=t?.resolvedPaths?.tailwindConfig||"tailwind.config.ts",i=C__default.join(r,`shadcn-${C__default.basename(s)}`);return new Project({compilerOptions:{}}).createSourceFile(i,e,{scriptKind:C__default.extname(s)===".ts"?ScriptKind.TS:ScriptKind.JS})}function Kt(e){return e.getFirstDescendantByKind(SyntaxKind.StringLiteral)?.getQuoteKind()===QuoteKind.Single?"'":'"'}function ue(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),o=i.getExpression().getText();e.insertPropertyAssignment(r,{name:`"___${o.replace(/^\.\.\./,"")}"`,initializer:`"...${o.replace(/^\.\.\./,"")}"`}),i.remove();}else if(s.isKind(SyntaxKind.PropertyAssignment)){let o=s.asKindOrThrow(SyntaxKind.PropertyAssignment).getInitializer();o&&o.isKind(SyntaxKind.ObjectLiteralExpression)?ue(o.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)):o&&o.isKind(SyntaxKind.ArrayLiteralExpression)&&Ke(o.asKindOrThrow(SyntaxKind.ArrayLiteralExpression));}}}function Ke(e){let t=e.getElements();for(let r=0;r<t.length;r++){let s=t[r];if(s.isKind(SyntaxKind.ObjectLiteralExpression))ue(s.asKindOrThrow(SyntaxKind.ObjectLiteralExpression));else if(s.isKind(SyntaxKind.ArrayLiteralExpression))Ke(s.asKindOrThrow(SyntaxKind.ArrayLiteralExpression));else if(s.isKind(SyntaxKind.SpreadElement)){let i=s.getText();e.removeElement(r),e.insertElement(r,`"${i}"`);}}}function he(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,o=i.getInitializer();if(o&&o.isKind(SyntaxKind.StringLiteral)){let l=o.asKindOrThrow(SyntaxKind.StringLiteral).getLiteralValue();l.startsWith("...")&&(e.insertSpreadAssignment(r,{expression:l.slice(3)}),i.remove());}else o?.isKind(SyntaxKind.ObjectLiteralExpression)?he(o):o&&o.isKind(SyntaxKind.ArrayLiteralExpression)&&Ne(o.asKindOrThrow(SyntaxKind.ArrayLiteralExpression));}}}function Ne(e){let t=e.getElements();for(let r=0;r<t.length;r++){let s=t[r];if(s.isKind(SyntaxKind.ObjectLiteralExpression))he(s.asKindOrThrow(SyntaxKind.ObjectLiteralExpression));else if(s.isKind(SyntaxKind.ArrayLiteralExpression))Ne(s.asKindOrThrow(SyntaxKind.ArrayLiteralExpression));else if(s.isKind(SyntaxKind.StringLiteral)){let i=s.getText(),o=/(?:^['"])(\.\.\..*)(?:['"]$)/g;o.test(i)&&(e.removeElement(r),e.insertElement(r,i.replace(o,"$1")));}}}async function Nt(e){let r=(await De(`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 ee(i)}throw new Error("Invalid input: not an object literal")}function ee(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]=ee(r.getInitializer()):r.getInitializer()?.isKind(SyntaxKind.ArrayLiteralExpression)?t[s]=_e(r.getInitializer()):t[s]=ye(r.getInitializer());}return t}function _e(e){let t=[];for(let r of e.getElements())r.isKind(SyntaxKind.ObjectLiteralExpression)?t.push(ee(r.asKindOrThrow(SyntaxKind.ObjectLiteralExpression))):r.isKind(SyntaxKind.ArrayLiteralExpression)?t.push(_e(r.asKindOrThrow(SyntaxKind.ArrayLiteralExpression))):t.push(ye(r));return t}function ye(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(ye);case SyntaxKind.ObjectLiteralExpression:return ee(e);default:return e.getText()}}function Ue(e){let t={};for(let r of Object.keys(e)){let s=r.split("-"),i=s[0],o=s.slice(1).join("-");o===""?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][o]=`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 Bt=process.env.REGISTRY_URL??"https://ui.shadcn.com/r",Gt=process.env.https_proxy?new HttpsProxyAgent(process.env.https_proxy):void 0,te=new Map,Jt=[{name:"neutral",label:"Neutral"},{name:"gray",label:"Gray"},{name:"zinc",label:"Zinc"},{name:"stone",label:"Stone"},{name:"slate",label:"Slate"}];async function Yt(){try{let[e]=await $(["index.json"]);return ne.parse(e)}catch(e){h.error(`
35
+ `),j(e);}}async function Ys(){try{let[e]=await $(["styles/index.json"]);return Se.parse(e)}catch(e){return h.error(`
36
+ `),j(e),[]}}async function qs(){try{let[e]=await $(["icons/index.json"]);return Ce.parse(e)}catch(e){return j(e),{}}}async function re(e,t){try{if(V(e))return await qt(e);let[r]=await $([R(e)?e:`styles/${t}/${e}.json`]);return A.parse(r)}catch(r){return h.break(),j(r),null}}async function qt(e){try{let t=e;e.startsWith("~/")&&(t=C__default.join(homedir(),e.slice(2)));let r=C__default.resolve(t),s=await promises.readFile(r,"utf8"),i=JSON.parse(s);return A.parse(i)}catch(t){return h.error(`Failed to read local registry file: ${e}`),j(t),null}}async function Zs(){return Jt}async function Zt(e){try{let[t]=await $([`colors/${e}.json`]);return Ee.parse(t)}catch(t){j(t);}}async function Qt(e,t){let r=[];for(let s of t){let i=e.find(o=>o.name===s);if(i&&(r.push(i),i.registryDependencies)){let o=await Qt(e,i.registryDependencies);r.push(...o);}}return r.filter((s,i,o)=>o.findIndex(l=>l.name===s.name)===i)}async function Qs(e,t){try{let r=t.map(i=>`styles/${e}/${i.name}.json`),s=await $(r);return ne.parse(s)}catch(r){j(r);}}async function Xs(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?C__default.join(e.resolvedPaths[s],i):null}async function $(e,t={}){t={useCache:!0,...t};try{return await Promise.all(e.map(async s=>{let i=We(s);if(t.useCache&&te.has(i))return te.get(i);let o=(async()=>{let l=je(i),g=await Mt(i,{agent:Gt,headers:{...l}});if(!g.ok){let m={400:"Bad request",401:"Unauthorized",403:"Forbidden",404:"Not found",500:"Internal server error"},f="";try{let c=await g.json();if(c&&typeof c=="object"){let x=[];"error"in c&&c.error&&x.push(`[${c.error}]: `),"message"in c&&c.message&&x.push(c.message),x.length>0&&(f=`
37
+
38
+ Server response:
39
+ ${x.join("")}`);}}catch{}throw g.status===401?new Error(`You are not authorized to access the component at ${w.info(i)}.
40
+ If this is a remote registry, you may need to authenticate.${f}`):g.status===404?new Error(`The component at ${w.info(i)} was not found.
41
+ It may not exist at the registry. Please make sure it is a valid component.${f}`):g.status===403?new Error(`You do not have access to the component at ${w.info(i)}.
42
+ If this is a remote registry, you may need to authenticate or a token.${f}`):new Error(`Failed to fetch from ${w.info(i)}.
43
+ ${f||g.statusText||m[g.status]}`)}return g.json()})();return t.useCache&&te.set(i,o),o}))}catch(r){return h.error(`
44
+ `),j(r),[]}}function ei(){te.clear();}async function W(e,t,r=new Set,s){let i=[],o=[];for(let l of e){if(r.has(l))continue;r.add(l);let g=l;if(t?.registries&&!R(l)&&!V(l))try{let m=G(l,t.registries);m&&(g=m.url);}catch(m){if(s&&m instanceof Error){let{registry:f}=D(l);if(f)throw new Error(`The items you're adding depend on unknown registry ${f}.
45
+ Make sure it is defined in components.json as follows:
46
+ {
47
+ "registries": {
48
+ "${f}": "https://example.com/{name}.json"
49
+ }
50
+ }`)}throw m}if(R(g)||V(g)){let m=await re(g,"");if(m&&(i.push(m),m.registryDependencies)){let f=await W(m.registryDependencies,t,r,m.name||l);i.push(...f.items),o.push(...f.registryNames);}}else if(o.push(g),t){let m=t.resolvedPaths?.cwd?await me(t.resolvedPaths.cwd,t.style):t.style;try{let f=await re(g,m);if(f&&f.registryDependencies){let c=await W(f.registryDependencies,t,r,f.name||g);i.push(...c.items),o.push(...c.registryNames);}}catch{}}}return {items:i,registryNames:o}}async function Xt(e,t){try{let r=e.filter(p=>V(p)),s=e.filter(p=>R(p)),i=e.filter(p=>!V(p)&&!R(p)),o=[],l=[],g=[];for(let p of r){let u=await re(p,"");if(u&&(o.push(u),u.registryDependencies)){let T=u.registryDependencies;if(t?.registries)T=pe(u.registryDependencies,t.registries);else {let L=u.registryDependencies.filter(P=>P.startsWith("@"));if(L.length>0){let{registry:P}=D(L[0]);throw new Error(`The items you're adding depend on unknown registry ${P}.
51
+ Make sure it is defined in components.json as follows:
52
+ {
53
+ "registries": {
54
+ "${P}": "https://example.com/{name}.json"
55
+ }
56
+ }`)}}let{items:E,registryNames:v}=await W(T,t,new Set,u.name||p);l.push(...E),g.push(...v);}}for(let p of s){let u=await re(p,"");if(u&&(o.push(u),u.registryDependencies)){let T=u.registryDependencies;if(t?.registries)T=pe(u.registryDependencies,t.registries);else {let L=u.registryDependencies.filter(P=>P.startsWith("@"));if(L.length>0){let{registry:P}=D(L[0]);throw new Error(`The items you're adding depend on unknown registry ${P}.
57
+ Make sure it is defined in components.json as follows:
58
+ {
59
+ "registries": {
60
+ "${P}": "https://example.com/{name}.json"
61
+ }
62
+ }`)}}let{items:E,registryNames:v}=await W(T,t,new Set,u.name||p);l.push(...E),g.push(...v);}}o.push(...l);let m=[...i,...g];if(m.length>0){if(await Yt()){let u=Array.from(new Set(m));u.includes("index")&&u.unshift("index");let T=await rr(u,t),E=await $(T),v=z.array(A).parse(E);o.push(...v);}else if(o.length===0)return null}if(!o.length)return null;if(m.includes("index")&&t.tailwind.baseColor){let p=await tr(t.tailwind.baseColor,t);p&&o.unshift(p);}o.sort(p=>p.type==="registry:theme"?-1:1);let f={};o.forEach(p=>{f=O(f,p.tailwind??{});});let c={};o.forEach(p=>{c=O(c,p.cssVars??{});});let x={};o.forEach(p=>{x=O(x,p.css??{});});let d="";o.forEach(p=>{p.docs&&(d+=`${p.docs}
63
+ `);});let I={};o.forEach(p=>{I=O(I,p.envVars??{});});let M=Pe.parse({dependencies:O.all(o.map(p=>p.dependencies??[])),devDependencies:O.all(o.map(p=>p.devDependencies??[])),files:O.all(o.map(p=>p.files??[])),tailwind:f,cssVars:c,css:x,docs:d});return Object.keys(I).length>0&&(M.envVars=I),M}catch(r){return j(r),null}}async function er(e,t,r){if(R(e))return [e];let{registryNames:s}=await W([e],t,new Set,r),i=t.resolvedPaths?.cwd?await me(t.resolvedPaths.cwd,t.style):t.style,o=s.map(l=>We(R(l)?l:`styles/${i}/${l}.json`));return Array.from(new Set(o))}async function tr(e,t){let[r,s]=await Promise.all([Zt(e),Ve(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,...Ue(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 We(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 `${Bt}/${e}`}function R(e){try{return new URL(e),!0}catch{return !1}}async function rr(e,t){let r=[],s=e.filter(i=>!V(i)&&!R(i));for(let i of s){let o=i;if(t.registries)try{let g=G(i,t.registries);g&&(o=g.url);}catch{}let l=await er(o,t,i);r.push(...l);}return Array.from(new Set(r))}function ti(){return new Map([["registry:ui","ui"],["registry:lib","lib"],["registry:hook","hooks"],["registry:block","components"],["registry:component","components"]])}function ri(e){let t=new Map;return e.forEach(r=>{r.registryDependencies&&r.registryDependencies.forEach(s=>{t.set(s,r);});}),t}
64
+
65
+ export { is as $, h as A, j as B, Oe as C, Ts as D, De as E, Kt as F, Jt as G, Yt as H, Ys as I, qs as J, re as K, Zs as L, Zt as M, Qt as N, Qs as O, Xs as P, $ as Q, ei as R, Xt as S, tr as T, R as U, rr as V, ti as W, ri as X, ts as Y, rs as Z, ss as _, be as a, q as aa, Me as b, fe as ba, He as c, ns as ca, ie as d, Pt as da, Be as e, jt as ea, Ge as f, os as fa, A as g, ge as ga, nr as h, X as ha, ne as i, Wr as ia, Se as j, Ve as ja, Ce as k, Ee as l, Pe as m, Je as n, Ye as o, oe as p, ae as q, ke as r, ar as s, pe as t, S as u, ot as v, lt as w, V as x, kr as y, w as z };
66
+ //# sourceMappingURL=out.js.map
67
+ //# sourceMappingURL=chunk-JWGTL2JC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/registry/schema.ts","../src/registry/api.ts","../src/registry/context.ts","../src/registry/parser.ts","../src/registry/env.ts","../src/registry/builder.ts","../src/registry/validator.ts","../src/registry/resolver.ts","../src/registry/utils.ts","../src/utils/resolve-import.ts","../src/utils/get-config.ts","../src/utils/get-project-info.ts","../src/utils/frameworks.ts","../src/utils/get-package-info.ts","../src/utils/highlighter.ts","../src/utils/logger.ts","../src/utils/handle-error.ts","../src/utils/updaters/update-tailwind-config.ts","../src/utils/spinner.ts"],"names":["z","registryItemTypeSchema","registryItemFileSchema","registryItemTailwindSchema","registryItemCssVarsSchema","registryItemCssSchema","registryItemEnvVarsSchema","registryItemSchema","registrySchema","registryIndexSchema","stylesSchema","iconsSchema","registryBaseColorSchema","registryResolvedItemsTreeSchema","registryConfigItemSchema","s","registryConfigSchema","key","rawConfigSchema","configSchema","workspaceConfigSchema","fs","homedir","path","context","setRegistryHeaders","headers","getRegistryHeadersFromContext","url","clearRegistryContext","REGISTRY_PATTERN","parseRegistryAndItemFromString","name","match","expandEnvVars","value","_match","extractEnvVars","vars","regex","buildUrlFromRegistryConfig","item","config","params","expanded","queryString","buildHeadersFromRegistryConfig","templateWithoutVars","extractRegistryEnvVars","v","validateRegistryConfig","registryName","missing","suggestions","resolveRegistryItemsFromRegistries","items","registries","registryHeaders","resolvedItems","resolved","resolveRegistryItemFromRegistries","registry","tmpdir","createMatchPath","resolveImport","importPath","Project","ScriptKind","loadConfig","FILE_EXTENSIONS_FOR_LOOKUP","FILE_PATH_SKIP_LIST","DEPENDENCY_SKIP_LIST","project","getDependencyFromModuleSpecifier","moduleSpecifier","pattern","parts","recursivelyResolveFileImports","filePath","projectInfo","processedFiles","resolvedFilePath","relativeRegistryFilePath","fileExtension","content","tempFile","createTempSourceFile","sourceFile","tsConfig","files","dependencies","fileType","determineFileType","originalFile","importStatements","importStatement","isRelativeImport","dependency","probableImportFilePath","ext","pathWithExt","nestedRelativeRegistryFilePath","file","nestedResults","dep","uniqueFiles","filename","dir","isUrl","isLocalFile","isUniversalRegistryItem","registryItem","FRAMEWORKS","getPackageInfo","cwd","shouldThrow","packageJsonPath","fg","PROJECT_SHARED_IGNORE","TS_CONFIG_SCHEMA","getProjectInfo","configFiles","isSrcDir","isTsx","tailwindConfigFile","tailwindCssFile","tailwindVersion","aliasPrefix","packageJson","isTypeScriptProject","getTailwindConfigFile","getTailwindCssFile","getTailwindVersion","getTsConfigAliasPrefix","isUsingAppDir","type","appConfig","packageInfo","getConfig","needle","contents","alias","paths","getProjectConfig","defaultProjectInfo","existingConfig","resolveConfigPaths","getProjectTailwindVersionFromConfig","cyan","green","red","yellow","highlighter","cosmiconfig","DEFAULT_COMPONENTS","DEFAULT_UTILS","DEFAULT_TAILWIND_CSS","DEFAULT_TAILWIND_CONFIG","explorer","getRawConfig","configResult","componentPath","getWorkspaceConfig","resolvedAliases","isAliasKey","resolvedPath","packageRoot","findPackageRoot","result","commonRoot","findCommonRoot","relativePath","matchingPackageRoot","pkgPath","pkgDir","parts1","parts2","commonParts","i","getTargetStyleFromConfig","fallback","createConfig","partial","defaultConfig","logger","args","handleError","error","ora","spinner","text","options","deepmerge","objectToString","QuoteKind","SyntaxKind","updateTailwindConfig","tailwindConfig","tailwindFileRelativePath","tailwindSpinner","raw","output","transformTailwindConfig","input","_createSourceFile","configObject","node","property","quoteChar","_getQuoteChar","addTailwindConfigProperty","plugin","addTailwindConfigPlugin","addTailwindConfigTheme","existingProperty","newProperty","initializer","newValue","initializerText","element","theme","nestSpreadProperties","themeInitializer","themeObjectString","themeObject","parseObjectLiteral","dst","src","resultString","unnestSpreadProperties","existingPlugins","obj","properties","prop","spreadAssignment","spreadText","nestSpreadElements","arr","elements","j","propAssignment","unsetSpreadElements","spreadTest","objectLiteralString","statement","parseObjectLiteralExpression","parseArrayLiteralExpression","parseValue","buildTailwindThemeColorsFromCssVars","cssVars","colorName","subType","HttpsProxyAgent","fetch","REGISTRY_URL","agent","registryCache","BASE_COLORS","getRegistryIndex","fetchRegistry","getRegistryStyles","getRegistryIcons","getRegistryItem","style","getLocalRegistryItem","expandedPath","parsed","getRegistryBaseColors","getRegistryBaseColor","baseColor","resolveTree","index","names","tree","entry","component","self","c","fetchTree","getItemTargetPath","override","parent","getRegistryUrl","fetchPromise","response","errorMessages","errorDetails","messages","clearRegistryCache","resolveDependenciesRecursively","visited","parentName","registryNames","resolvedDep","nested","registryResolveItemsTree","localFiles","urls","payload","allDependencyItems","allDependencyRegistryNames","localFile","resolvedDependencies","namespacedDeps","allRegistryNames","uniqueRegistryNames","registryItems","resolveRegistryItems","registryPayload","registryGetTheme","a","tailwind","css","docs","envVars","resolveRegistryDependencies","registryDependencies","resolvedName","itemRegistryDependencies","getRegistryTypeAliasMap","getRegistryParentMap","map"],"mappings":"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","sourcesContent":["import { z } from \"zod\"\n\n// Note: if you edit the schema here, you must also edit the schema in the\n// apps/www/public/schema/registry-item.json file.\n\nexport const registryItemTypeSchema = z.enum([\n \"registry:lib\",\n \"registry:block\",\n \"registry:component\",\n \"registry:ui\",\n \"registry:hook\",\n \"registry:page\",\n \"registry:file\",\n \"registry:theme\",\n \"registry:style\",\n \"registry:item\",\n\n // Internal use only\n \"registry:example\",\n \"registry:internal\",\n])\n\nexport const registryItemFileSchema = z.discriminatedUnion(\"type\", [\n // Target is required for registry:file and registry:page\n z.object({\n path: z.string(),\n content: z.string().optional(),\n type: z.enum([\"registry:file\", \"registry:page\"]),\n target: z.string(),\n }),\n z.object({\n path: z.string(),\n content: z.string().optional(),\n type: registryItemTypeSchema.exclude([\"registry:file\", \"registry:page\"]),\n target: z.string().optional(),\n }),\n])\n\nexport const registryItemTailwindSchema = z.object({\n config: z\n .object({\n content: z.array(z.string()).optional(),\n theme: z.record(z.string(), z.any()).optional(),\n plugins: z.array(z.string()).optional(),\n })\n .optional(),\n})\n\nexport const registryItemCssVarsSchema = z.object({\n theme: z.record(z.string(), z.string()).optional(),\n light: z.record(z.string(), z.string()).optional(),\n dark: z.record(z.string(), z.string()).optional(),\n})\n\nexport const registryItemCssSchema = z.record(\n z.string(),\n z.lazy(() =>\n z.union([\n z.string(),\n z.record(\n z.string(),\n z.union([z.string(), z.record(z.string(), z.string())])\n ),\n ])\n )\n)\n\nexport const registryItemEnvVarsSchema = z.record(z.string(), z.string())\n\nexport const registryItemSchema = z.object({\n $schema: z.string().optional(),\n extends: z.string().optional(),\n name: z.string(),\n type: registryItemTypeSchema,\n title: z.string().optional(),\n author: z.string().min(2).optional(),\n description: z.string().optional(),\n dependencies: z.array(z.string()).optional(),\n devDependencies: z.array(z.string()).optional(),\n registryDependencies: z.array(z.string()).optional(),\n files: z.array(registryItemFileSchema).optional(),\n tailwind: registryItemTailwindSchema.optional(),\n cssVars: registryItemCssVarsSchema.optional(),\n css: registryItemCssSchema.optional(),\n envVars: registryItemEnvVarsSchema.optional(),\n meta: z.record(z.string(), z.any()).optional(),\n docs: z.string().optional(),\n categories: z.array(z.string()).optional(),\n})\n\nexport type RegistryItem = z.infer<typeof registryItemSchema>\n\nexport const registrySchema = z.object({\n name: z.string(),\n homepage: z.string(),\n items: z.array(registryItemSchema),\n})\n\nexport type Registry = z.infer<typeof registrySchema>\n\nexport const registryIndexSchema = z.array(registryItemSchema)\n\nexport const stylesSchema = z.array(\n z.object({\n name: z.string(),\n label: z.string(),\n })\n)\n\nexport const iconsSchema = z.record(\n z.string(),\n z.record(z.string(), z.string())\n)\n\nexport const registryBaseColorSchema = z.object({\n inlineColors: z.object({\n light: z.record(z.string(), z.string()),\n dark: z.record(z.string(), z.string()),\n }),\n cssVars: registryItemCssVarsSchema,\n cssVarsV4: registryItemCssVarsSchema.optional(),\n inlineColorsTemplate: z.string(),\n cssVarsTemplate: z.string(),\n})\n\nexport const registryResolvedItemsTreeSchema = registryItemSchema.pick({\n dependencies: true,\n devDependencies: true,\n files: true,\n tailwind: true,\n cssVars: true,\n css: true,\n envVars: true,\n docs: true,\n})\n\nexport const registryConfigItemSchema = z.union([\n // Simple string format: \"https://example.com/{name}.json\"\n z.string().refine((s) => s.includes(\"{name}\"), {\n message: \"Registry URL must include {name} placeholder\",\n }),\n // Advanced object format with auth options\n z.object({\n url: z.string().refine((s) => s.includes(\"{name}\"), {\n message: \"Registry URL must include {name} placeholder\",\n }),\n params: z.record(z.string(), z.string()).optional(),\n headers: z.record(z.string(), z.string()).optional(),\n }),\n])\n\nexport const registryConfigSchema = z.record(\n z.string().refine((key) => key.startsWith(\"@\"), {\n message: \"Registry names must start with @ (e.g., @v0, @acme)\",\n }),\n registryConfigItemSchema\n)\n\nexport const rawConfigSchema = z\n .object({\n $schema: z.string().optional(),\n style: z.string(),\n rsc: z.coerce.boolean().default(false),\n tsx: z.coerce.boolean().default(true),\n tailwind: z.object({\n config: z.string().optional(),\n css: z.string(),\n baseColor: z.string(),\n cssVariables: z.boolean().default(true),\n prefix: z.string().default(\"\").optional(),\n }),\n aliases: z.object({\n components: z.string(),\n utils: z.string(),\n ui: z.string().optional(),\n lib: z.string().optional(),\n hooks: z.string().optional(),\n }),\n iconLibrary: z.string().optional(),\n registries: registryConfigSchema.optional(),\n })\n .strict()\n\nexport const configSchema = rawConfigSchema.extend({\n resolvedPaths: z.object({\n cwd: z.string(),\n tailwindConfig: z.string(),\n tailwindCss: z.string(),\n utils: z.string(),\n components: z.string(),\n lib: z.string(),\n hooks: z.string(),\n ui: z.string(),\n }),\n})\n\n// TODO: type the key.\n// Okay for now since I don't want a breaking change.\nexport const workspaceConfigSchema = z.record(configSchema)\n","import { promises as fs } from \"fs\"\nimport { homedir } from \"os\"\nimport path from \"path\"\nimport { getRegistryHeadersFromContext } from \"@/src/registry/context\"\nimport { parseRegistryAndItemFromString } from \"@/src/registry/parser\"\nimport {\n resolveRegistryItemFromRegistries,\n resolveRegistryItemsFromRegistries,\n} from \"@/src/registry/resolver\"\nimport { isLocalFile } from \"@/src/registry/utils\"\nimport { Config, getTargetStyleFromConfig } from \"@/src/utils/get-config\"\nimport { getProjectTailwindVersionFromConfig } from \"@/src/utils/get-project-info\"\nimport { handleError } from \"@/src/utils/handle-error\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport { buildTailwindThemeColorsFromCssVars } from \"@/src/utils/updaters/update-tailwind-config\"\nimport deepmerge from \"deepmerge\"\nimport { HttpsProxyAgent } from \"https-proxy-agent\"\nimport fetch from \"node-fetch\"\nimport { z } from \"zod\"\n\nimport {\n iconsSchema,\n registryBaseColorSchema,\n registryIndexSchema,\n registryItemSchema,\n registryResolvedItemsTreeSchema,\n stylesSchema,\n} from \"./schema\"\n\nconst REGISTRY_URL = process.env.REGISTRY_URL ?? \"https://ui.shadcn.com/r\"\n\nconst agent = process.env.https_proxy\n ? new HttpsProxyAgent(process.env.https_proxy)\n : undefined\n\nconst registryCache = new Map<string, Promise<any>>()\n\nexport const BASE_COLORS = [\n {\n name: \"neutral\",\n label: \"Neutral\",\n },\n {\n name: \"gray\",\n label: \"Gray\",\n },\n {\n name: \"zinc\",\n label: \"Zinc\",\n },\n {\n name: \"stone\",\n label: \"Stone\",\n },\n {\n name: \"slate\",\n label: \"Slate\",\n },\n] as const\n\nexport async function getRegistryIndex() {\n try {\n const [result] = await fetchRegistry([\"index.json\"])\n\n return registryIndexSchema.parse(result)\n } catch (error) {\n logger.error(\"\\n\")\n handleError(error)\n }\n}\n\nexport async function getRegistryStyles() {\n try {\n const [result] = await fetchRegistry([\"styles/index.json\"])\n\n return stylesSchema.parse(result)\n } catch (error) {\n logger.error(\"\\n\")\n handleError(error)\n return []\n }\n}\n\nexport async function getRegistryIcons() {\n try {\n const [result] = await fetchRegistry([\"icons/index.json\"])\n return iconsSchema.parse(result)\n } catch (error) {\n handleError(error)\n return {}\n }\n}\n\nexport async function getRegistryItem(name: string, style: string) {\n try {\n // Handle local file paths\n if (isLocalFile(name)) {\n return await getLocalRegistryItem(name)\n }\n\n // Handle URLs and component names\n const [result] = await fetchRegistry([\n isUrl(name) ? name : `styles/${style}/${name}.json`,\n ])\n\n return registryItemSchema.parse(result)\n } catch (error) {\n logger.break()\n handleError(error)\n return null\n }\n}\n\nasync function getLocalRegistryItem(filePath: string) {\n try {\n // Handle tilde expansion for home directory\n let expandedPath = filePath\n if (filePath.startsWith(\"~/\")) {\n expandedPath = path.join(homedir(), filePath.slice(2))\n }\n\n const resolvedPath = path.resolve(expandedPath)\n const content = await fs.readFile(resolvedPath, \"utf8\")\n const parsed = JSON.parse(content)\n\n return registryItemSchema.parse(parsed)\n } catch (error) {\n logger.error(`Failed to read local registry file: ${filePath}`)\n handleError(error)\n return null\n }\n}\n\nexport async function getRegistryBaseColors() {\n return BASE_COLORS\n}\n\nexport async function getRegistryBaseColor(baseColor: string) {\n try {\n const [result] = await fetchRegistry([`colors/${baseColor}.json`])\n\n return registryBaseColorSchema.parse(result)\n } catch (error) {\n handleError(error)\n }\n}\n\nexport async function resolveTree(\n index: z.infer<typeof registryIndexSchema>,\n names: string[]\n) {\n const tree: z.infer<typeof registryIndexSchema> = []\n\n for (const name of names) {\n const entry = index.find((entry) => entry.name === name)\n\n if (!entry) {\n continue\n }\n\n tree.push(entry)\n\n if (entry.registryDependencies) {\n const dependencies = await resolveTree(index, entry.registryDependencies)\n tree.push(...dependencies)\n }\n }\n\n return tree.filter(\n (component, index, self) =>\n self.findIndex((c) => c.name === component.name) === index\n )\n}\n\nexport async function fetchTree(\n style: string,\n tree: z.infer<typeof registryIndexSchema>\n) {\n try {\n const paths = tree.map((item) => `styles/${style}/${item.name}.json`)\n const result = await fetchRegistry(paths)\n return registryIndexSchema.parse(result)\n } catch (error) {\n handleError(error)\n }\n}\n\nexport async function getItemTargetPath(\n config: Config,\n item: Pick<z.infer<typeof registryItemSchema>, \"type\">,\n override?: string\n) {\n if (override) {\n return override\n }\n\n if (item.type === \"registry:ui\") {\n return config.resolvedPaths.ui ?? config.resolvedPaths.components\n }\n\n const [parent, type] = item.type?.split(\":\") ?? []\n if (!(parent in config.resolvedPaths)) {\n return null\n }\n\n return path.join(\n config.resolvedPaths[parent as keyof typeof config.resolvedPaths],\n type\n )\n}\n\nexport async function fetchRegistry(\n paths: string[],\n options: { useCache?: boolean } = {}\n) {\n options = {\n useCache: true,\n ...options,\n }\n\n try {\n const results = await Promise.all(\n paths.map(async (path) => {\n const url = getRegistryUrl(path)\n\n // Check cache first if caching is enabled\n if (options.useCache && registryCache.has(url)) {\n return registryCache.get(url)\n }\n\n // Store the promise in the cache before awaiting if caching is enabled\n const fetchPromise = (async () => {\n // Get headers from context for this URL\n const headers = getRegistryHeadersFromContext(url)\n\n const response = await fetch(url, {\n agent,\n headers: {\n ...headers,\n },\n })\n\n if (!response.ok) {\n const errorMessages: { [key: number]: string } = {\n 400: \"Bad request\",\n 401: \"Unauthorized\",\n 403: \"Forbidden\",\n 404: \"Not found\",\n 500: \"Internal server error\",\n }\n\n let errorDetails = \"\"\n try {\n const result = await response.json()\n if (result && typeof result === \"object\") {\n const messages = []\n if (\"error\" in result && result.error) {\n messages.push(`[${result.error}]: `)\n }\n if (\"message\" in result && result.message) {\n messages.push(result.message)\n }\n if (messages.length > 0) {\n errorDetails = `\\n\\nServer response: \\n${messages.join(\"\")}`\n }\n }\n } catch {\n // If we can't parse JSON, that's okay\n }\n\n if (response.status === 401) {\n throw new Error(\n `You are not authorized to access the component at ${highlighter.info(\n url\n )}.\\nIf this is a remote registry, you may need to authenticate.${errorDetails}`\n )\n }\n\n if (response.status === 404) {\n throw new Error(\n `The component at ${highlighter.info(\n url\n )} was not found.\\nIt may not exist at the registry. Please make sure it is a valid component.${errorDetails}`\n )\n }\n\n if (response.status === 403) {\n throw new Error(\n `You do not have access to the component at ${highlighter.info(\n url\n )}.\\nIf this is a remote registry, you may need to authenticate or a token.${errorDetails}`\n )\n }\n\n throw new Error(\n `Failed to fetch from ${highlighter.info(url)}.\\n${\n errorDetails ||\n response.statusText ||\n errorMessages[response.status]\n }`\n )\n }\n\n return response.json()\n })()\n\n if (options.useCache) {\n registryCache.set(url, fetchPromise)\n }\n return fetchPromise\n })\n )\n\n return results\n } catch (error) {\n logger.error(\"\\n\")\n handleError(error)\n return []\n }\n}\n\nexport function clearRegistryCache() {\n registryCache.clear()\n}\n\nasync function resolveDependenciesRecursively(\n dependencies: string[],\n config?: Config,\n visited: Set<string> = new Set(),\n parentName?: string\n) {\n const items: z.infer<typeof registryItemSchema>[] = []\n const registryNames: string[] = []\n\n for (const dep of dependencies) {\n if (visited.has(dep)) {\n continue\n }\n visited.add(dep)\n\n let resolvedDep = dep\n if (config?.registries && !isUrl(dep) && !isLocalFile(dep)) {\n try {\n const resolved = resolveRegistryItemFromRegistries(\n dep,\n config.registries\n )\n if (resolved) {\n resolvedDep = resolved.url\n }\n } catch (error) {\n // Enhance error message with parent context.\n if (parentName && error instanceof Error) {\n const { registry } = parseRegistryAndItemFromString(dep)\n if (registry) {\n throw new Error(\n `The items you're adding depend on unknown registry ${registry}. \\nMake sure it is defined in components.json as follows:\\n` +\n `{\\n \"registries\": {\\n \"${registry}\": \"https://example.com/{name}.json\"\\n }\\n}`\n )\n }\n }\n throw error\n }\n }\n\n if (isUrl(resolvedDep) || isLocalFile(resolvedDep)) {\n const item = await getRegistryItem(resolvedDep, \"\")\n if (item) {\n items.push(item)\n if (item.registryDependencies) {\n const nested = await resolveDependenciesRecursively(\n item.registryDependencies,\n config,\n visited,\n item.name || dep\n )\n items.push(...nested.items)\n registryNames.push(...nested.registryNames)\n }\n }\n } else {\n registryNames.push(resolvedDep)\n\n if (config) {\n const style = config.resolvedPaths?.cwd\n ? await getTargetStyleFromConfig(\n config.resolvedPaths.cwd,\n config.style\n )\n : config.style\n\n try {\n const item = await getRegistryItem(resolvedDep, style)\n if (item && item.registryDependencies) {\n const nested = await resolveDependenciesRecursively(\n item.registryDependencies,\n config,\n visited,\n item.name || resolvedDep\n )\n items.push(...nested.items)\n registryNames.push(...nested.registryNames)\n }\n } catch (error) {\n // If we can't fetch the registry item, that's okay - we'll still include the name.\n }\n }\n }\n }\n\n return { items, registryNames }\n}\n\nexport async function registryResolveItemsTree(\n names: z.infer<typeof registryItemSchema>[\"name\"][],\n config: Config\n) {\n try {\n // Separate local files, URLs, and registry names.\n const localFiles = names.filter((name) => isLocalFile(name))\n const urls = names.filter((name) => isUrl(name))\n const registryNames = names.filter(\n (name) => !isLocalFile(name) && !isUrl(name)\n )\n\n const payload: z.infer<typeof registryItemSchema>[] = []\n\n // Handle local files and URLs directly, resolving their dependencies individually.\n let allDependencyItems: z.infer<typeof registryItemSchema>[] = []\n let allDependencyRegistryNames: string[] = []\n\n for (const localFile of localFiles) {\n const item = await getRegistryItem(localFile, \"\")\n if (item) {\n payload.push(item)\n if (item.registryDependencies) {\n // Resolve namespace syntax and set headers for dependencies\n let resolvedDependencies = item.registryDependencies\n\n // Check for namespaced dependencies when no registries are configured\n if (!config?.registries) {\n const namespacedDeps = item.registryDependencies.filter((dep) =>\n dep.startsWith(\"@\")\n )\n if (namespacedDeps.length > 0) {\n const { registry } = parseRegistryAndItemFromString(\n namespacedDeps[0]\n )\n throw new Error(\n `The items you're adding depend on unknown registry ${registry}. \\nMake sure it is defined in components.json as follows:\\n` +\n `{\\n \"registries\": {\\n \"${registry}\": \"https://example.com/{name}.json\"\\n }\\n}`\n )\n }\n } else {\n resolvedDependencies = resolveRegistryItemsFromRegistries(\n item.registryDependencies,\n config.registries\n )\n }\n\n const { items, registryNames } = await resolveDependenciesRecursively(\n resolvedDependencies,\n config,\n new Set(),\n item.name || localFile\n )\n allDependencyItems.push(...items)\n allDependencyRegistryNames.push(...registryNames)\n }\n }\n }\n\n for (const url of urls) {\n const item = await getRegistryItem(url, \"\")\n if (item) {\n payload.push(item)\n if (item.registryDependencies) {\n // Resolve namespace syntax and set headers for dependencies\n let resolvedDependencies = item.registryDependencies\n\n // Check for namespaced dependencies when no registries are configured\n if (!config?.registries) {\n const namespacedDeps = item.registryDependencies.filter((dep) =>\n dep.startsWith(\"@\")\n )\n if (namespacedDeps.length > 0) {\n const { registry } = parseRegistryAndItemFromString(\n namespacedDeps[0]\n )\n throw new Error(\n `The items you're adding depend on unknown registry ${registry}. \\nMake sure it is defined in components.json as follows:\\n` +\n `{\\n \"registries\": {\\n \"${registry}\": \"https://example.com/{name}.json\"\\n }\\n}`\n )\n }\n } else {\n resolvedDependencies = resolveRegistryItemsFromRegistries(\n item.registryDependencies,\n config.registries\n )\n }\n\n const { items, registryNames } = await resolveDependenciesRecursively(\n resolvedDependencies,\n config,\n new Set(),\n item.name || url\n )\n\n allDependencyItems.push(...items)\n allDependencyRegistryNames.push(...registryNames)\n }\n }\n }\n\n payload.push(...allDependencyItems)\n\n // Handle registry names using existing resolveRegistryItems logic.\n const allRegistryNames = [...registryNames, ...allDependencyRegistryNames]\n if (allRegistryNames.length > 0) {\n const index = await getRegistryIndex()\n if (!index) {\n // If we only have local files or URLs, that's fine.\n if (payload.length === 0) {\n return null\n }\n } else {\n // Remove duplicates.\n const uniqueRegistryNames = Array.from(new Set(allRegistryNames))\n\n // If we're resolving the index, we want it to go first.\n if (uniqueRegistryNames.includes(\"index\")) {\n uniqueRegistryNames.unshift(\"index\")\n }\n\n let registryItems = await resolveRegistryItems(\n uniqueRegistryNames,\n config\n )\n let result = await fetchRegistry(registryItems)\n const registryPayload = z.array(registryItemSchema).parse(result)\n payload.push(...registryPayload)\n }\n }\n\n if (!payload.length) {\n return null\n }\n\n // If we're resolving the index, we want to fetch\n // the theme item if a base color is provided.\n // We do this for index only.\n // Other components will ship with their theme tokens.\n if (allRegistryNames.includes(\"index\")) {\n if (config.tailwind.baseColor) {\n const theme = await registryGetTheme(config.tailwind.baseColor, config)\n if (theme) {\n payload.unshift(theme)\n }\n }\n }\n\n // Sort the payload so that registry:theme is always first.\n payload.sort((a) => {\n if (a.type === \"registry:theme\") {\n return -1\n }\n return 1\n })\n\n let tailwind = {}\n payload.forEach((item) => {\n tailwind = deepmerge(tailwind, item.tailwind ?? {})\n })\n\n let cssVars = {}\n payload.forEach((item) => {\n cssVars = deepmerge(cssVars, item.cssVars ?? {})\n })\n\n let css = {}\n payload.forEach((item) => {\n css = deepmerge(css, item.css ?? {})\n })\n\n let docs = \"\"\n payload.forEach((item) => {\n if (item.docs) {\n docs += `${item.docs}\\n`\n }\n })\n\n let envVars = {}\n payload.forEach((item) => {\n envVars = deepmerge(envVars, item.envVars ?? {})\n })\n\n const parsed = registryResolvedItemsTreeSchema.parse({\n dependencies: deepmerge.all(\n payload.map((item) => item.dependencies ?? [])\n ),\n devDependencies: deepmerge.all(\n payload.map((item) => item.devDependencies ?? [])\n ),\n files: deepmerge.all(payload.map((item) => item.files ?? [])),\n tailwind,\n cssVars,\n css,\n docs,\n })\n\n if (Object.keys(envVars).length > 0) {\n parsed.envVars = envVars\n }\n\n return parsed\n } catch (error) {\n handleError(error)\n return null\n }\n}\n\nasync function resolveRegistryDependencies(\n url: string,\n config: Config,\n parentName?: string\n) {\n if (isUrl(url)) {\n return [url]\n }\n\n const { registryNames } = await resolveDependenciesRecursively(\n [url],\n config,\n new Set(),\n parentName\n )\n\n const style = config.resolvedPaths?.cwd\n ? await getTargetStyleFromConfig(config.resolvedPaths.cwd, config.style)\n : config.style\n\n const urls = registryNames.map((name) =>\n getRegistryUrl(isUrl(name) ? name : `styles/${style}/${name}.json`)\n )\n\n return Array.from(new Set(urls))\n}\n\nexport async function registryGetTheme(name: string, config: Config) {\n const [baseColor, tailwindVersion] = await Promise.all([\n getRegistryBaseColor(name),\n getProjectTailwindVersionFromConfig(config),\n ])\n if (!baseColor) {\n return null\n }\n\n // TODO: Move this to the registry i.e registry:theme.\n const theme = {\n name,\n type: \"registry:theme\",\n tailwind: {\n config: {\n theme: {\n extend: {\n borderRadius: {\n lg: \"var(--radius)\",\n md: \"calc(var(--radius) - 2px)\",\n sm: \"calc(var(--radius) - 4px)\",\n },\n colors: {},\n },\n },\n },\n },\n cssVars: {\n theme: {},\n light: {\n radius: \"0.5rem\",\n },\n dark: {},\n },\n } satisfies z.infer<typeof registryItemSchema>\n\n if (config.tailwind.cssVariables) {\n theme.tailwind.config.theme.extend.colors = {\n ...theme.tailwind.config.theme.extend.colors,\n ...buildTailwindThemeColorsFromCssVars(baseColor.cssVars.dark ?? {}),\n }\n theme.cssVars = {\n theme: {\n ...baseColor.cssVars.theme,\n ...theme.cssVars.theme,\n },\n light: {\n ...baseColor.cssVars.light,\n ...theme.cssVars.light,\n },\n dark: {\n ...baseColor.cssVars.dark,\n ...theme.cssVars.dark,\n },\n }\n\n if (tailwindVersion === \"v4\" && baseColor.cssVarsV4) {\n theme.cssVars = {\n theme: {\n ...baseColor.cssVarsV4.theme,\n ...theme.cssVars.theme,\n },\n light: {\n radius: \"0.625rem\",\n ...baseColor.cssVarsV4.light,\n },\n dark: {\n ...baseColor.cssVarsV4.dark,\n },\n }\n }\n }\n\n return theme\n}\n\nfunction getRegistryUrl(path: string) {\n if (isUrl(path)) {\n // If the url contains /chat/b/, we assume it's the v0 registry.\n // We need to add the /json suffix if it's missing.\n const url = new URL(path)\n if (url.pathname.match(/\\/chat\\/b\\//) && !url.pathname.endsWith(\"/json\")) {\n url.pathname = `${url.pathname}/json`\n }\n\n return url.toString()\n }\n\n return `${REGISTRY_URL}/${path}`\n}\n\nexport function isUrl(path: string) {\n try {\n new URL(path)\n return true\n } catch (error) {\n return false\n }\n}\n\n// TODO: We're double-fetching here. Use a cache.\nexport async function resolveRegistryItems(names: string[], config: Config) {\n let registryDependencies: string[] = []\n\n const registryNames = names.filter(\n (name) => !isLocalFile(name) && !isUrl(name)\n )\n\n for (const name of registryNames) {\n let resolvedName = name\n if (config.registries) {\n try {\n const resolved = resolveRegistryItemFromRegistries(\n name,\n config.registries\n )\n if (resolved) {\n resolvedName = resolved.url\n }\n } catch (error) {}\n }\n\n const itemRegistryDependencies = await resolveRegistryDependencies(\n resolvedName,\n config,\n name\n )\n registryDependencies.push(...itemRegistryDependencies)\n }\n\n return Array.from(new Set(registryDependencies))\n}\n\nexport function getRegistryTypeAliasMap() {\n return new Map<string, string>([\n [\"registry:ui\", \"ui\"],\n [\"registry:lib\", \"lib\"],\n [\"registry:hook\", \"hooks\"],\n [\"registry:block\", \"components\"],\n [\"registry:component\", \"components\"],\n ])\n}\n\n// Track a dependency and its parent.\nexport function getRegistryParentMap(\n registryItems: z.infer<typeof registryItemSchema>[]\n) {\n const map = new Map<string, z.infer<typeof registryItemSchema>>()\n registryItems.forEach((item) => {\n if (!item.registryDependencies) {\n return\n }\n\n item.registryDependencies.forEach((dependency) => {\n map.set(dependency, item)\n })\n })\n return map\n}\n","interface RegistryContext {\n headers: Record<string, Record<string, string>>\n}\n\nlet context: RegistryContext = {\n headers: {},\n}\n\nexport function setRegistryHeaders(\n headers: Record<string, Record<string, string>>\n) {\n context.headers = headers\n}\n\nexport function getRegistryHeadersFromContext(\n url: string\n): Record<string, string> {\n return context.headers[url] || {}\n}\n\nexport function clearRegistryContext() {\n context.headers = {}\n}\n","// Valid registry name pattern: @namespace where namespace is alphanumeric with hyphens/underscores\nconst REGISTRY_PATTERN = /^(@[a-zA-Z0-9](?:[a-zA-Z0-9-_]*[a-zA-Z0-9])?)\\/(.+)$/\n\nexport function parseRegistryAndItemFromString(name: string) {\n if (!name.startsWith(\"@\")) {\n return {\n registry: null,\n item: name,\n }\n }\n\n const match = name.match(REGISTRY_PATTERN)\n if (match) {\n return {\n registry: match[1],\n item: match[2],\n }\n }\n\n return {\n registry: null,\n item: name,\n }\n}\n","export function expandEnvVars(value: string) {\n return value.replace(/\\${(\\w+)}/g, (_match, key) => process.env[key] || \"\")\n}\n\nexport function extractEnvVars(value: string) {\n const vars: string[] = []\n const regex = /\\${(\\w+)}/g\n let match: RegExpExecArray | null\n\n while ((match = regex.exec(value)) !== null) {\n vars.push(match[1])\n }\n\n return vars\n}\n","import { registryConfigItemSchema } from \"@/src/registry/schema\"\nimport { z } from \"zod\"\n\nimport { expandEnvVars } from \"./env\"\n\nexport function buildUrlFromRegistryConfig(\n item: string,\n config: z.infer<typeof registryConfigItemSchema>\n): string {\n if (typeof config === \"string\") {\n return expandEnvVars(config.replace(\"{name}\", item))\n }\n\n let url = expandEnvVars(config.url.replace(\"{name}\", item))\n\n if (config.params) {\n const params = new URLSearchParams()\n for (const [key, value] of Object.entries(config.params)) {\n const expanded = expandEnvVars(value)\n if (expanded) {\n params.append(key, expanded)\n }\n }\n const queryString = params.toString()\n if (queryString) {\n url += (url.includes(\"?\") ? \"&\" : \"?\") + queryString\n }\n }\n\n return url\n}\n\nexport function buildHeadersFromRegistryConfig(\n config: z.infer<typeof registryConfigItemSchema>\n): Record<string, string> {\n if (typeof config === \"string\" || !config.headers) {\n return {}\n }\n\n const headers: Record<string, string> = {}\n for (const [key, value] of Object.entries(config.headers)) {\n const expanded = expandEnvVars(value)\n\n if (value.includes(\"${\")) {\n const templateWithoutVars = value.replace(/\\${[^}]+}/g, \"\").trim()\n if (expanded.trim() !== templateWithoutVars) {\n headers[key] = expanded\n }\n } else {\n if (expanded.trim()) {\n headers[key] = expanded\n }\n }\n }\n return headers\n}\n","import { z } from \"zod\"\n\nimport { extractEnvVars } from \"./env\"\nimport { registryConfigItemSchema } from \"./schema\"\n\nexport function extractRegistryEnvVars(\n config: z.infer<typeof registryConfigItemSchema>\n): string[] {\n const vars = new Set<string>()\n\n if (typeof config === \"string\") {\n extractEnvVars(config).forEach((v) => vars.add(v))\n } else {\n extractEnvVars(config.url).forEach((v) => vars.add(v))\n\n if (config.params) {\n Object.values(config.params).forEach((value) => {\n extractEnvVars(value).forEach((v) => vars.add(v))\n })\n }\n\n if (config.headers) {\n Object.values(config.headers).forEach((value) => {\n extractEnvVars(value).forEach((v) => vars.add(v))\n })\n }\n }\n\n return Array.from(vars)\n}\n\nexport function validateRegistryConfig(\n registryName: string,\n config: z.infer<typeof registryConfigItemSchema>\n): void {\n const requiredVars = extractRegistryEnvVars(config)\n const missing = requiredVars.filter((v) => !process.env[v])\n\n if (missing.length > 0) {\n const suggestions = missing.map((v) => {\n // Common patterns for environment variable names\n if (v.includes(\"TOKEN\")) return `export ${v}=\"your-token-here\"`\n if (v.includes(\"KEY\")) return `export ${v}=\"your-api-key-here\"`\n if (v.includes(\"SECRET\")) return `export ${v}=\"your-secret-here\"`\n return `export ${v}=\"your-value-here\"`\n })\n\n throw new Error(\n `Registry \"${registryName}\" requires environment variables:\\n\\n` +\n missing.map((v) => ` • ${v}`).join(\"\\n\") +\n \"\\n\\nSet them in your environment:\\n\\n\" +\n suggestions.map((s) => ` ${s}`).join(\"\\n\") +\n \"\\n\\nOr add them to a .env file in your project root.\"\n )\n }\n}\n","import { registryConfigSchema } from \"@/src/registry/schema\"\nimport { z } from \"zod\"\n\nimport {\n buildHeadersFromRegistryConfig,\n buildUrlFromRegistryConfig,\n} from \"./builder\"\nimport { setRegistryHeaders } from \"./context\"\nimport { parseRegistryAndItemFromString } from \"./parser\"\nimport { validateRegistryConfig } from \"./validator\"\n\nexport function resolveRegistryItemsFromRegistries(\n items: string[],\n registries?: z.infer<typeof registryConfigSchema>\n) {\n const registryHeaders: Record<string, Record<string, string>> = {}\n const resolvedItems = [...items]\n\n if (!registries) {\n setRegistryHeaders({})\n }\n\n for (let i = 0; i < resolvedItems.length; i++) {\n const resolved = resolveRegistryItemFromRegistries(\n resolvedItems[i],\n registries\n )\n\n if (resolved) {\n // Replace registry item with resolved URL.\n resolvedItems[i] = resolved.url\n\n // Store headers for this URL if any exist.\n if (Object.keys(resolved.headers).length > 0) {\n registryHeaders[resolved.url] = resolved.headers\n }\n }\n }\n\n // Set registry headers in context for fetch operations.\n setRegistryHeaders(registryHeaders)\n\n return resolvedItems\n}\n\nexport function resolveRegistryItemFromRegistries(\n name: string,\n registries: z.infer<typeof registryConfigSchema> = {}\n) {\n const { registry, item } = parseRegistryAndItemFromString(name)\n\n if (!registry) {\n return null\n }\n\n const config = registries[registry]\n if (!config) {\n throw new Error(\n `Unknown registry \"${registry}\". Make sure it is defined in components.json as follows:\\n` +\n `{\\n \"registries\": {\\n \"${registry}\": \"https://example.com/{name}.json\"\\n }\\n}`\n )\n }\n\n // Validate that required environment variables are set\n validateRegistryConfig(registry, config)\n\n return {\n url: buildUrlFromRegistryConfig(item, config),\n headers: buildHeadersFromRegistryConfig(config),\n }\n}\n","import * as fs from \"fs/promises\"\nimport { tmpdir } from \"os\"\nimport * as path from \"path\"\nimport { configSchema, registryItemSchema } from \"@/src/registry\"\nimport { ProjectInfo } from \"@/src/utils/get-project-info\"\nimport { resolveImport } from \"@/src/utils/resolve-import\"\nimport { Project, ScriptKind } from \"ts-morph\"\nimport { loadConfig } from \"tsconfig-paths\"\nimport { z } from \"zod\"\n\nconst FILE_EXTENSIONS_FOR_LOOKUP = [\".tsx\", \".ts\", \".jsx\", \".js\", \".css\"]\nconst FILE_PATH_SKIP_LIST = [\"lib/utils.ts\"]\nconst DEPENDENCY_SKIP_LIST = [\n /^(react|react-dom|next)(\\/.*)?$/, // Matches react, react-dom, next and their submodules\n /^(node|jsr|npm):.*$/, // Matches node:, jsr:, and npm: prefixed modules\n]\n\nconst project = new Project({\n compilerOptions: {},\n})\n\n// This returns the dependency from the module specifier.\n// Here dependency means an npm package.\nexport function getDependencyFromModuleSpecifier(\n moduleSpecifier: string\n): string | null {\n // Skip if the dependency matches any pattern in the skip list\n if (DEPENDENCY_SKIP_LIST.some((pattern) => pattern.test(moduleSpecifier))) {\n return null\n }\n\n // If the module specifier does not start with `@` and has a /, add the dependency first part only.\n // E.g. `foo/bar` -> `foo`\n if (!moduleSpecifier.startsWith(\"@\") && moduleSpecifier.includes(\"/\")) {\n moduleSpecifier = moduleSpecifier.split(\"/\")[0]\n }\n\n // For scoped packages, we want to keep the first two parts\n // E.g. `@types/react/dom` -> `@types/react`\n if (moduleSpecifier.startsWith(\"@\")) {\n const parts = moduleSpecifier.split(\"/\")\n if (parts.length > 2) {\n moduleSpecifier = parts.slice(0, 2).join(\"/\")\n }\n }\n\n return moduleSpecifier\n}\n\nexport async function recursivelyResolveFileImports(\n filePath: string,\n config: z.infer<typeof configSchema>,\n projectInfo: ProjectInfo,\n processedFiles: Set<string> = new Set()\n): Promise<Pick<z.infer<typeof registryItemSchema>, \"files\" | \"dependencies\">> {\n const resolvedFilePath = path.resolve(config.resolvedPaths.cwd, filePath)\n const relativeRegistryFilePath = path.relative(\n config.resolvedPaths.cwd,\n resolvedFilePath\n )\n\n // Skip if the file is in the skip list\n if (FILE_PATH_SKIP_LIST.includes(relativeRegistryFilePath)) {\n return { dependencies: [], files: [] }\n }\n\n // Skip if the file extension is not one of the supported extensions\n const fileExtension = path.extname(filePath)\n if (!FILE_EXTENSIONS_FOR_LOOKUP.includes(fileExtension)) {\n return { dependencies: [], files: [] }\n }\n\n // Prevent infinite loop: skip if already processed\n if (processedFiles.has(relativeRegistryFilePath)) {\n return { dependencies: [], files: [] }\n }\n processedFiles.add(relativeRegistryFilePath)\n\n const stat = await fs.stat(resolvedFilePath)\n if (!stat.isFile()) {\n // Optionally log or handle this case\n return { dependencies: [], files: [] }\n }\n\n const content = await fs.readFile(resolvedFilePath, \"utf-8\")\n const tempFile = await createTempSourceFile(path.basename(resolvedFilePath))\n const sourceFile = project.createSourceFile(tempFile, content, {\n scriptKind: ScriptKind.TSX,\n })\n const tsConfig = await loadConfig(config.resolvedPaths.cwd)\n if (tsConfig.resultType === \"failed\") {\n return { dependencies: [], files: [] }\n }\n\n const files: z.infer<typeof registryItemSchema>[\"files\"] = []\n const dependencies = new Set<string>()\n\n // Add the original file first\n const fileType = determineFileType(filePath)\n const originalFile = {\n path: relativeRegistryFilePath,\n type: fileType,\n target: \"\",\n }\n files.push(originalFile)\n\n // 1. Find all import statements in the file.\n const importStatements = sourceFile.getImportDeclarations()\n for (const importStatement of importStatements) {\n const moduleSpecifier = importStatement.getModuleSpecifierValue()\n\n const isRelativeImport = moduleSpecifier.startsWith(\".\")\n const isAliasImport = moduleSpecifier.startsWith(\n `${projectInfo.aliasPrefix}/`\n )\n\n // If not a local import, add to the dependencies array.\n if (!isAliasImport && !isRelativeImport) {\n const dependency = getDependencyFromModuleSpecifier(moduleSpecifier)\n if (dependency) {\n dependencies.add(dependency)\n }\n continue\n }\n\n let probableImportFilePath = await resolveImport(moduleSpecifier, tsConfig)\n\n if (isRelativeImport) {\n probableImportFilePath = path.resolve(\n path.dirname(resolvedFilePath),\n moduleSpecifier\n )\n }\n\n if (!probableImportFilePath) {\n continue\n }\n\n // Check if the probable import path has a file extension.\n // Try each extension until we find a file that exists.\n const hasExtension = path.extname(probableImportFilePath)\n if (!hasExtension) {\n for (const ext of FILE_EXTENSIONS_FOR_LOOKUP) {\n const pathWithExt: string = `${probableImportFilePath}${ext}`\n try {\n await fs.access(pathWithExt)\n probableImportFilePath = pathWithExt\n break\n } catch {\n continue\n }\n }\n }\n\n const nestedRelativeRegistryFilePath = path.relative(\n config.resolvedPaths.cwd,\n probableImportFilePath\n )\n\n // Skip if we've already processed this file or if it's in the skip list\n if (\n processedFiles.has(nestedRelativeRegistryFilePath) ||\n FILE_PATH_SKIP_LIST.includes(nestedRelativeRegistryFilePath)\n ) {\n continue\n }\n\n const fileType = determineFileType(moduleSpecifier)\n const file = {\n path: nestedRelativeRegistryFilePath,\n type: fileType,\n target: \"\",\n }\n\n // TODO (shadcn): fix this.\n if (fileType === \"registry:page\" || fileType === \"registry:file\") {\n file.target = moduleSpecifier\n }\n\n files.push(file)\n\n // Recursively process the imported file, passing the shared processedFiles set\n const nestedResults = await recursivelyResolveFileImports(\n nestedRelativeRegistryFilePath,\n config,\n projectInfo,\n processedFiles\n )\n\n if (nestedResults.files) {\n // Only add files that haven't been processed yet\n for (const file of nestedResults.files) {\n if (!processedFiles.has(file.path)) {\n processedFiles.add(file.path)\n files.push(file)\n }\n }\n }\n\n if (nestedResults.dependencies) {\n nestedResults.dependencies.forEach((dep) => dependencies.add(dep))\n }\n }\n\n // Deduplicate files by path\n const uniqueFiles = Array.from(\n new Map(files.map((file) => [file.path, file])).values()\n )\n\n return {\n dependencies: Array.from(dependencies),\n files: uniqueFiles,\n }\n}\n\nasync function createTempSourceFile(filename: string) {\n const dir = await fs.mkdtemp(path.join(tmpdir(), \"shadcn-\"))\n return path.join(dir, filename)\n}\n\n// This is a bit tricky to accurately determine.\n// For now we'll use the module specifier to determine the type.\nfunction determineFileType(\n moduleSpecifier: string\n): z.infer<typeof registryItemSchema>[\"type\"] {\n if (moduleSpecifier.includes(\"/ui/\")) {\n return \"registry:ui\"\n }\n\n if (moduleSpecifier.includes(\"/lib/\")) {\n return \"registry:lib\"\n }\n\n if (moduleSpecifier.includes(\"/hooks/\")) {\n return \"registry:hook\"\n }\n\n if (moduleSpecifier.includes(\"/components/\")) {\n return \"registry:component\"\n }\n\n return \"registry:component\"\n}\n\n// Additional utility functions for local file support\nexport function isUrl(path: string) {\n try {\n new URL(path)\n return true\n } catch (error) {\n return false\n }\n}\n\nexport function isLocalFile(path: string) {\n return path.endsWith(\".json\") && !isUrl(path)\n}\n\n/**\n * Check if a registry item is universal (framework-agnostic).\n * A universal registry item must have all files with:\n * 1. Explicit targets\n * 2. Type \"registry:file\"\n * It can be installed without framework detection or components.json.\n */\nexport function isUniversalRegistryItem(\n registryItem:\n | Pick<z.infer<typeof registryItemSchema>, \"files\">\n | null\n | undefined\n): boolean {\n return (\n !!registryItem?.files?.length &&\n registryItem.files.every(\n (file) => !!file.target && file.type === \"registry:file\"\n )\n )\n}\n","import { createMatchPath, type ConfigLoaderSuccessResult } from \"tsconfig-paths\"\n\nexport async function resolveImport(\n importPath: string,\n config: Pick<ConfigLoaderSuccessResult, \"absoluteBaseUrl\" | \"paths\">\n) {\n return createMatchPath(config.absoluteBaseUrl, config.paths)(\n importPath,\n undefined,\n () => true,\n [\".ts\", \".tsx\", \".jsx\", \".js\", \".css\"]\n )\n}\n","import path from \"path\"\nimport {\n configSchema,\n rawConfigSchema,\n workspaceConfigSchema,\n} from \"@/src/registry\"\nimport { getProjectInfo } from \"@/src/utils/get-project-info\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { resolveImport } from \"@/src/utils/resolve-import\"\nimport { cosmiconfig } from \"cosmiconfig\"\nimport fg from \"fast-glob\"\nimport { loadConfig } from \"tsconfig-paths\"\nimport { z } from \"zod\"\n\nexport const DEFAULT_STYLE = \"default\"\nexport const DEFAULT_COMPONENTS = \"@/components\"\nexport const DEFAULT_UTILS = \"@/lib/utils\"\nexport const DEFAULT_TAILWIND_CSS = \"app/globals.css\"\nexport const DEFAULT_TAILWIND_CONFIG = \"tailwind.config.js\"\nexport const DEFAULT_TAILWIND_BASE_COLOR = \"slate\"\n\n// TODO: Figure out if we want to support all cosmiconfig formats.\n// A simple components.json file would be nice.\nconst explorer = cosmiconfig(\"components\", {\n searchPlaces: [\"components.json\"],\n})\n\nexport type Config = z.infer<typeof configSchema>\n\nexport async function getConfig(cwd: string) {\n const config = await getRawConfig(cwd)\n\n if (!config) {\n return null\n }\n\n // Set default icon library if not provided.\n if (!config.iconLibrary) {\n config.iconLibrary = config.style === \"new-york\" ? \"radix\" : \"lucide\"\n }\n\n return await resolveConfigPaths(cwd, config)\n}\n\nexport async function resolveConfigPaths(\n cwd: string,\n config: z.infer<typeof rawConfigSchema>\n) {\n // Read tsconfig.json.\n const tsConfig = await loadConfig(cwd)\n\n if (tsConfig.resultType === \"failed\") {\n throw new Error(\n `Failed to load ${config.tsx ? \"tsconfig\" : \"jsconfig\"}.json. ${\n tsConfig.message ?? \"\"\n }`.trim()\n )\n }\n\n return configSchema.parse({\n ...config,\n resolvedPaths: {\n cwd,\n tailwindConfig: config.tailwind.config\n ? path.resolve(cwd, config.tailwind.config)\n : \"\",\n tailwindCss: path.resolve(cwd, config.tailwind.css),\n utils: await resolveImport(config.aliases[\"utils\"], tsConfig),\n components: await resolveImport(config.aliases[\"components\"], tsConfig),\n ui: config.aliases[\"ui\"]\n ? await resolveImport(config.aliases[\"ui\"], tsConfig)\n : path.resolve(\n (await resolveImport(config.aliases[\"components\"], tsConfig)) ??\n cwd,\n \"ui\"\n ),\n // TODO: Make this configurable.\n // For now, we assume the lib and hooks directories are one level up from the components directory.\n lib: config.aliases[\"lib\"]\n ? await resolveImport(config.aliases[\"lib\"], tsConfig)\n : path.resolve(\n (await resolveImport(config.aliases[\"utils\"], tsConfig)) ?? cwd,\n \"..\"\n ),\n hooks: config.aliases[\"hooks\"]\n ? await resolveImport(config.aliases[\"hooks\"], tsConfig)\n : path.resolve(\n (await resolveImport(config.aliases[\"components\"], tsConfig)) ??\n cwd,\n \"..\",\n \"hooks\"\n ),\n },\n })\n}\n\nexport async function getRawConfig(\n cwd: string\n): Promise<z.infer<typeof rawConfigSchema> | null> {\n try {\n const configResult = await explorer.search(cwd)\n\n if (!configResult) {\n return null\n }\n\n return rawConfigSchema.parse(configResult.config)\n } catch (error) {\n const componentPath = `${cwd}/components.json`\n throw new Error(\n `Invalid configuration found in ${highlighter.info(componentPath)}.`\n )\n }\n}\n\n// Note: we can check for -workspace.yaml or \"workspace\" in package.json.\n// Since cwd is not necessarily the root of the project.\n// We'll instead check if ui aliases resolve to a different root.\nexport async function getWorkspaceConfig(config: Config) {\n let resolvedAliases: any = {}\n\n for (const key of Object.keys(config.aliases)) {\n if (!isAliasKey(key, config)) {\n continue\n }\n\n const resolvedPath = config.resolvedPaths[key]\n const packageRoot = await findPackageRoot(\n config.resolvedPaths.cwd,\n resolvedPath\n )\n\n if (!packageRoot) {\n resolvedAliases[key] = config\n continue\n }\n\n resolvedAliases[key] = await getConfig(packageRoot)\n }\n\n const result = workspaceConfigSchema.safeParse(resolvedAliases)\n if (!result.success) {\n return null\n }\n\n return result.data\n}\n\nexport async function findPackageRoot(cwd: string, resolvedPath: string) {\n const commonRoot = findCommonRoot(cwd, resolvedPath)\n const relativePath = path.relative(commonRoot, resolvedPath)\n\n const packageRoots = await fg.glob(\"**/package.json\", {\n cwd: commonRoot,\n deep: 3,\n ignore: [\"**/node_modules/**\", \"**/dist/**\", \"**/build/**\", \"**/public/**\"],\n })\n\n const matchingPackageRoot = packageRoots\n .map((pkgPath) => path.dirname(pkgPath))\n .find((pkgDir) => relativePath.startsWith(pkgDir))\n\n return matchingPackageRoot ? path.join(commonRoot, matchingPackageRoot) : null\n}\n\nfunction isAliasKey(\n key: string,\n config: Config\n): key is keyof Config[\"aliases\"] {\n return Object.keys(config.resolvedPaths)\n .filter((key) => key !== \"utils\")\n .includes(key)\n}\n\nexport function findCommonRoot(cwd: string, resolvedPath: string) {\n const parts1 = cwd.split(path.sep)\n const parts2 = resolvedPath.split(path.sep)\n const commonParts = []\n\n for (let i = 0; i < Math.min(parts1.length, parts2.length); i++) {\n if (parts1[i] !== parts2[i]) {\n break\n }\n commonParts.push(parts1[i])\n }\n\n return commonParts.join(path.sep)\n}\n\n// TODO: Cache this call.\nexport async function getTargetStyleFromConfig(cwd: string, fallback: string) {\n const projectInfo = await getProjectInfo(cwd)\n return projectInfo?.tailwindVersion === \"v4\" ? \"new-york-v4\" : fallback\n}\n\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P]\n}\n\n/**\n * Creates a config object with sensible defaults.\n * Useful for universal registry items that bypass framework detection.\n *\n * @param partial - Partial config values to override defaults\n * @returns A complete Config object\n */\nexport function createConfig(partial?: DeepPartial<Config>): Config {\n const defaultConfig: Config = {\n resolvedPaths: {\n cwd: process.cwd(),\n tailwindConfig: \"\",\n tailwindCss: \"\",\n utils: \"\",\n components: \"\",\n ui: \"\",\n lib: \"\",\n hooks: \"\",\n },\n style: \"\",\n tailwind: {\n config: \"\",\n css: \"\",\n baseColor: \"\",\n cssVariables: false,\n },\n rsc: false,\n tsx: true,\n aliases: {\n components: \"\",\n utils: \"\",\n },\n }\n\n // Deep merge the partial config with defaults\n if (partial) {\n return {\n ...defaultConfig,\n ...partial,\n resolvedPaths: {\n ...defaultConfig.resolvedPaths,\n ...(partial.resolvedPaths || {}),\n },\n tailwind: {\n ...defaultConfig.tailwind,\n ...(partial.tailwind || {}),\n },\n aliases: {\n ...defaultConfig.aliases,\n ...(partial.aliases || {}),\n },\n }\n }\n\n return defaultConfig\n}\n","import path from \"path\"\nimport { rawConfigSchema } from \"@/src/registry\"\nimport { FRAMEWORKS, Framework } from \"@/src/utils/frameworks\"\nimport { Config, getConfig, resolveConfigPaths } from \"@/src/utils/get-config\"\nimport { getPackageInfo } from \"@/src/utils/get-package-info\"\nimport fg from \"fast-glob\"\nimport fs from \"fs-extra\"\nimport { loadConfig } from \"tsconfig-paths\"\nimport { z } from \"zod\"\n\nexport type TailwindVersion = \"v3\" | \"v4\" | null\n\nexport type ProjectInfo = {\n framework: Framework\n isSrcDir: boolean\n isRSC: boolean\n isTsx: boolean\n tailwindConfigFile: string | null\n tailwindCssFile: string | null\n tailwindVersion: TailwindVersion\n aliasPrefix: string | null\n}\n\nconst PROJECT_SHARED_IGNORE = [\n \"**/node_modules/**\",\n \".next\",\n \"public\",\n \"dist\",\n \"build\",\n]\n\nconst TS_CONFIG_SCHEMA = z.object({\n compilerOptions: z.object({\n paths: z.record(z.string().or(z.array(z.string()))),\n }),\n})\n\nexport async function getProjectInfo(cwd: string): Promise<ProjectInfo | null> {\n const [\n configFiles,\n isSrcDir,\n isTsx,\n tailwindConfigFile,\n tailwindCssFile,\n tailwindVersion,\n aliasPrefix,\n packageJson,\n ] = await Promise.all([\n fg.glob(\n \"**/{next,vite,astro,app}.config.*|gatsby-config.*|composer.json|react-router.config.*\",\n {\n cwd,\n deep: 3,\n ignore: PROJECT_SHARED_IGNORE,\n }\n ),\n fs.pathExists(path.resolve(cwd, \"src\")),\n isTypeScriptProject(cwd),\n getTailwindConfigFile(cwd),\n getTailwindCssFile(cwd),\n getTailwindVersion(cwd),\n getTsConfigAliasPrefix(cwd),\n getPackageInfo(cwd, false),\n ])\n\n const isUsingAppDir = await fs.pathExists(\n path.resolve(cwd, `${isSrcDir ? \"src/\" : \"\"}app`)\n )\n\n const type: ProjectInfo = {\n framework: FRAMEWORKS[\"manual\"],\n isSrcDir,\n isRSC: false,\n isTsx,\n tailwindConfigFile,\n tailwindCssFile,\n tailwindVersion,\n aliasPrefix,\n }\n\n // Next.js.\n if (configFiles.find((file) => file.startsWith(\"next.config.\"))?.length) {\n type.framework = isUsingAppDir\n ? FRAMEWORKS[\"next-app\"]\n : FRAMEWORKS[\"next-pages\"]\n type.isRSC = isUsingAppDir\n return type\n }\n\n // Astro.\n if (configFiles.find((file) => file.startsWith(\"astro.config.\"))?.length) {\n type.framework = FRAMEWORKS[\"astro\"]\n return type\n }\n\n // Gatsby.\n if (configFiles.find((file) => file.startsWith(\"gatsby-config.\"))?.length) {\n type.framework = FRAMEWORKS[\"gatsby\"]\n return type\n }\n\n // Laravel.\n if (configFiles.find((file) => file.startsWith(\"composer.json\"))?.length) {\n type.framework = FRAMEWORKS[\"laravel\"]\n return type\n }\n\n // Remix.\n if (\n Object.keys(packageJson?.dependencies ?? {}).find((dep) =>\n dep.startsWith(\"@remix-run/\")\n )\n ) {\n type.framework = FRAMEWORKS[\"remix\"]\n return type\n }\n\n // TanStack Start.\n if (\n [\n ...Object.keys(packageJson?.dependencies ?? {}),\n ...Object.keys(packageJson?.devDependencies ?? {}),\n ].find((dep) => dep.startsWith(\"@tanstack/react-start\"))\n ) {\n type.framework = FRAMEWORKS[\"tanstack-start\"]\n return type\n }\n\n // React Router.\n if (\n configFiles.find((file) => file.startsWith(\"react-router.config.\"))?.length\n ) {\n type.framework = FRAMEWORKS[\"react-router\"]\n return type\n }\n\n // Vite.\n // Some Remix templates also have a vite.config.* file.\n // We'll assume that it got caught by the Remix check above.\n if (configFiles.find((file) => file.startsWith(\"vite.config.\"))?.length) {\n type.framework = FRAMEWORKS[\"vite\"]\n return type\n }\n\n // Vinxi-based (such as @tanstack/start and @solidjs/solid-start)\n // They are vite-based, and the same configurations used for Vite should work flawlessly\n const appConfig = configFiles.find((file) => file.startsWith(\"app.config\"))\n if (appConfig?.length) {\n const appConfigContents = await fs.readFile(\n path.resolve(cwd, appConfig),\n \"utf8\"\n )\n if (appConfigContents.includes(\"defineConfig\")) {\n type.framework = FRAMEWORKS[\"vite\"]\n return type\n }\n }\n\n // Expo.\n if (packageJson?.dependencies?.expo) {\n type.framework = FRAMEWORKS[\"expo\"]\n return type\n }\n\n return type\n}\n\nexport async function getTailwindVersion(\n cwd: string\n): Promise<ProjectInfo[\"tailwindVersion\"]> {\n const [packageInfo, config] = await Promise.all([\n getPackageInfo(cwd, false),\n getConfig(cwd),\n ])\n\n // If the config file is empty, we can assume that it's a v4 project.\n if (config?.tailwind?.config === \"\") {\n return \"v4\"\n }\n\n if (\n !packageInfo?.dependencies?.tailwindcss &&\n !packageInfo?.devDependencies?.tailwindcss\n ) {\n return null\n }\n\n if (\n /^(?:\\^|~)?3(?:\\.\\d+)*(?:-.*)?$/.test(\n packageInfo?.dependencies?.tailwindcss ||\n packageInfo?.devDependencies?.tailwindcss ||\n \"\"\n )\n ) {\n return \"v3\"\n }\n\n return \"v4\"\n}\n\nexport async function getTailwindCssFile(cwd: string) {\n const [files, tailwindVersion] = await Promise.all([\n fg.glob([\"**/*.css\", \"**/*.scss\"], {\n cwd,\n deep: 5,\n ignore: PROJECT_SHARED_IGNORE,\n }),\n getTailwindVersion(cwd),\n ])\n\n if (!files.length) {\n return null\n }\n\n const needle =\n tailwindVersion === \"v4\" ? `@import \"tailwindcss\"` : \"@tailwind base\"\n for (const file of files) {\n const contents = await fs.readFile(path.resolve(cwd, file), \"utf8\")\n if (\n contents.includes(`@import \"tailwindcss\"`) ||\n contents.includes(`@import 'tailwindcss'`) ||\n contents.includes(`@tailwind base`)\n ) {\n return file\n }\n }\n\n return null\n}\n\nexport async function getTailwindConfigFile(cwd: string) {\n const files = await fg.glob(\"tailwind.config.*\", {\n cwd,\n deep: 3,\n ignore: PROJECT_SHARED_IGNORE,\n })\n\n if (!files.length) {\n return null\n }\n\n return files[0]\n}\n\nexport async function getTsConfigAliasPrefix(cwd: string) {\n const tsConfig = await loadConfig(cwd)\n\n if (\n tsConfig?.resultType === \"failed\" ||\n !Object.entries(tsConfig?.paths).length\n ) {\n return null\n }\n\n // This assume that the first alias is the prefix.\n for (const [alias, paths] of Object.entries(tsConfig.paths)) {\n if (\n paths.includes(\"./*\") ||\n paths.includes(\"./src/*\") ||\n paths.includes(\"./app/*\") ||\n paths.includes(\"./resources/js/*\") // Laravel.\n ) {\n return alias.replace(/\\/\\*$/, \"\") ?? null\n }\n }\n\n // Use the first alias as the prefix.\n return Object.keys(tsConfig?.paths)?.[0].replace(/\\/\\*$/, \"\") ?? null\n}\n\nexport async function isTypeScriptProject(cwd: string) {\n const files = await fg.glob(\"tsconfig.*\", {\n cwd,\n deep: 1,\n ignore: PROJECT_SHARED_IGNORE,\n })\n\n return files.length > 0\n}\n\nexport async function getTsConfig(cwd: string) {\n for (const fallback of [\n \"tsconfig.json\",\n \"tsconfig.web.json\",\n \"tsconfig.app.json\",\n ]) {\n const filePath = path.resolve(cwd, fallback)\n if (!(await fs.pathExists(filePath))) {\n continue\n }\n\n // We can't use fs.readJSON because it doesn't support comments.\n const contents = await fs.readFile(filePath, \"utf8\")\n const cleanedContents = contents.replace(/\\/\\*\\s*\\*\\//g, \"\")\n const result = TS_CONFIG_SCHEMA.safeParse(JSON.parse(cleanedContents))\n\n if (result.error) {\n continue\n }\n\n return result.data\n }\n\n return null\n}\n\nexport async function getProjectConfig(\n cwd: string,\n defaultProjectInfo: ProjectInfo | null = null\n): Promise<Config | null> {\n // Check for existing component config.\n const [existingConfig, projectInfo] = await Promise.all([\n getConfig(cwd),\n !defaultProjectInfo\n ? getProjectInfo(cwd)\n : Promise.resolve(defaultProjectInfo),\n ])\n\n if (existingConfig) {\n return existingConfig\n }\n\n if (\n !projectInfo ||\n !projectInfo.tailwindCssFile ||\n (projectInfo.tailwindVersion === \"v3\" && !projectInfo.tailwindConfigFile)\n ) {\n return null\n }\n\n const config: z.infer<typeof rawConfigSchema> = {\n $schema: \"https://ui.shadcn.com/schema.json\",\n rsc: projectInfo.isRSC,\n tsx: projectInfo.isTsx,\n style: \"new-york\",\n tailwind: {\n config: projectInfo.tailwindConfigFile ?? \"\",\n baseColor: \"zinc\",\n css: projectInfo.tailwindCssFile,\n cssVariables: true,\n prefix: \"\",\n },\n iconLibrary: \"lucide\",\n aliases: {\n components: `${projectInfo.aliasPrefix}/components`,\n ui: `${projectInfo.aliasPrefix}/components/ui`,\n hooks: `${projectInfo.aliasPrefix}/hooks`,\n lib: `${projectInfo.aliasPrefix}/lib`,\n utils: `${projectInfo.aliasPrefix}/lib/utils`,\n },\n }\n\n return await resolveConfigPaths(cwd, config)\n}\n\nexport async function getProjectTailwindVersionFromConfig(\n config: Config\n): Promise<TailwindVersion> {\n if (!config.resolvedPaths?.cwd) {\n return \"v3\"\n }\n\n const projectInfo = await getProjectInfo(config.resolvedPaths.cwd)\n\n if (!projectInfo?.tailwindVersion) {\n return null\n }\n\n return projectInfo.tailwindVersion\n}\n","export const FRAMEWORKS = {\n \"next-app\": {\n name: \"next-app\",\n label: \"Next.js\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/next\",\n tailwind: \"https://tailwindcss.com/docs/guides/nextjs\",\n },\n },\n \"next-pages\": {\n name: \"next-pages\",\n label: \"Next.js\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/next\",\n tailwind: \"https://tailwindcss.com/docs/guides/nextjs\",\n },\n },\n remix: {\n name: \"remix\",\n label: \"Remix\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/remix\",\n tailwind: \"https://tailwindcss.com/docs/guides/remix\",\n },\n },\n \"react-router\": {\n name: \"react-router\",\n label: \"React Router\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/react-router\",\n tailwind:\n \"https://tailwindcss.com/docs/installation/framework-guides/react-router\",\n },\n },\n vite: {\n name: \"vite\",\n label: \"Vite\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/vite\",\n tailwind: \"https://tailwindcss.com/docs/guides/vite\",\n },\n },\n astro: {\n name: \"astro\",\n label: \"Astro\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/astro\",\n tailwind: \"https://tailwindcss.com/docs/guides/astro\",\n },\n },\n laravel: {\n name: \"laravel\",\n label: \"Laravel\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/laravel\",\n tailwind: \"https://tailwindcss.com/docs/guides/laravel\",\n },\n },\n \"tanstack-start\": {\n name: \"tanstack-start\",\n label: \"TanStack Start\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/tanstack\",\n tailwind: \"https://tailwindcss.com/docs/installation/using-postcss\",\n },\n },\n gatsby: {\n name: \"gatsby\",\n label: \"Gatsby\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/gatsby\",\n tailwind: \"https://tailwindcss.com/docs/guides/gatsby\",\n },\n },\n expo: {\n name: \"expo\",\n label: \"Expo\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/expo\",\n tailwind: \"https://www.nativewind.dev/docs/getting-started/installation\",\n },\n },\n manual: {\n name: \"manual\",\n label: \"Manual\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/manual\",\n tailwind: \"https://tailwindcss.com/docs/installation\",\n },\n },\n} as const\n\nexport type Framework = (typeof FRAMEWORKS)[keyof typeof FRAMEWORKS]\n","import path from \"path\"\nimport fs from \"fs-extra\"\nimport { type PackageJson } from \"type-fest\"\n\nexport function getPackageInfo(\n cwd: string = \"\",\n shouldThrow: boolean = true\n): PackageJson | null {\n const packageJsonPath = path.join(cwd, \"package.json\")\n\n return fs.readJSONSync(packageJsonPath, {\n throws: shouldThrow,\n }) as PackageJson\n}\n","import { cyan, green, red, yellow } from \"kleur/colors\"\n\nexport const highlighter = {\n error: red,\n warn: yellow,\n info: cyan,\n success: green,\n}\n","import { highlighter } from \"@/src/utils/highlighter\"\n\nexport const logger = {\n error(...args: unknown[]) {\n console.log(highlighter.error(args.join(\" \")))\n },\n warn(...args: unknown[]) {\n console.log(highlighter.warn(args.join(\" \")))\n },\n info(...args: unknown[]) {\n console.log(highlighter.info(args.join(\" \")))\n },\n success(...args: unknown[]) {\n console.log(highlighter.success(args.join(\" \")))\n },\n log(...args: unknown[]) {\n console.log(args.join(\" \"))\n },\n break() {\n console.log(\"\")\n },\n}\n","import { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport { z } from \"zod\"\n\nexport function handleError(error: unknown) {\n logger.break()\n logger.error(\n `Something went wrong. Please check the error below for more details.`\n )\n logger.error(`If the problem persists, please open an issue on GitHub.`)\n logger.error(\"\")\n if (typeof error === \"string\") {\n logger.error(error)\n logger.break()\n process.exit(1)\n }\n\n if (error instanceof z.ZodError) {\n logger.error(\"Validation failed:\")\n for (const [key, value] of Object.entries(error.flatten().fieldErrors)) {\n logger.error(`- ${highlighter.info(key)}: ${value}`)\n }\n logger.break()\n process.exit(1)\n }\n\n if (error instanceof Error) {\n logger.error(error.message)\n logger.break()\n process.exit(1)\n }\n\n logger.break()\n process.exit(1)\n}\n","import { promises as fs } from \"fs\"\nimport { tmpdir } from \"os\"\nimport path from \"path\"\nimport {\n registryItemCssVarsSchema,\n registryItemTailwindSchema,\n} from \"@/src/registry/schema\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { TailwindVersion } from \"@/src/utils/get-project-info\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport deepmerge from \"deepmerge\"\nimport objectToString from \"stringify-object\"\nimport { type Config as TailwindConfig } from \"tailwindcss\"\nimport {\n ArrayLiteralExpression,\n ObjectLiteralExpression,\n Project,\n PropertyAssignment,\n QuoteKind,\n ScriptKind,\n SyntaxKind,\n VariableStatement,\n} from \"ts-morph\"\nimport { z } from \"zod\"\n\nexport type UpdaterTailwindConfig = Omit<TailwindConfig, \"plugins\"> & {\n // We only want string plugins for now.\n plugins?: string[]\n}\n\nexport async function updateTailwindConfig(\n tailwindConfig:\n | z.infer<typeof registryItemTailwindSchema>[\"config\"]\n | undefined,\n config: Config,\n options: {\n silent?: boolean\n tailwindVersion?: TailwindVersion\n }\n) {\n if (!tailwindConfig) {\n return\n }\n\n options = {\n silent: false,\n tailwindVersion: \"v3\",\n ...options,\n }\n\n // No tailwind config in v4.\n if (options.tailwindVersion === \"v4\") {\n return\n }\n\n const tailwindFileRelativePath = path.relative(\n config.resolvedPaths.cwd,\n config.resolvedPaths.tailwindConfig\n )\n const tailwindSpinner = spinner(\n `Updating ${highlighter.info(tailwindFileRelativePath)}`,\n {\n silent: options.silent,\n }\n ).start()\n const raw = await fs.readFile(config.resolvedPaths.tailwindConfig, \"utf8\")\n const output = await transformTailwindConfig(raw, tailwindConfig, config)\n await fs.writeFile(config.resolvedPaths.tailwindConfig, output, \"utf8\")\n tailwindSpinner?.succeed()\n}\n\nexport async function transformTailwindConfig(\n input: string,\n tailwindConfig: UpdaterTailwindConfig,\n config: Config\n) {\n const sourceFile = await _createSourceFile(input, config)\n // Find the object with content property.\n // This is faster than traversing the default export.\n // TODO: maybe we do need to traverse the default export?\n const configObject = sourceFile\n .getDescendantsOfKind(SyntaxKind.ObjectLiteralExpression)\n .find((node) =>\n node\n .getProperties()\n .some(\n (property) =>\n property.isKind(SyntaxKind.PropertyAssignment) &&\n property.getName() === \"content\"\n )\n )\n\n // We couldn't find the config object, so we return the input as is.\n if (!configObject) {\n return input\n }\n\n const quoteChar = _getQuoteChar(configObject)\n\n // Add darkMode.\n addTailwindConfigProperty(\n configObject,\n {\n name: \"darkMode\",\n value: \"class\",\n },\n { quoteChar }\n )\n\n // Add Tailwind config plugins.\n tailwindConfig.plugins?.forEach((plugin) => {\n addTailwindConfigPlugin(configObject, plugin)\n })\n\n // Add Tailwind config theme.\n if (tailwindConfig.theme) {\n await addTailwindConfigTheme(configObject, tailwindConfig.theme)\n }\n\n return sourceFile.getFullText()\n}\n\nfunction addTailwindConfigProperty(\n configObject: ObjectLiteralExpression,\n property: {\n name: string\n value: string\n },\n {\n quoteChar,\n }: {\n quoteChar: string\n }\n) {\n const existingProperty = configObject.getProperty(\"darkMode\")\n\n if (!existingProperty) {\n const newProperty = {\n name: property.name,\n initializer: `[${quoteChar}${property.value}${quoteChar}]`,\n }\n\n // We need to add darkMode as the first property.\n if (property.name === \"darkMode\") {\n configObject.insertPropertyAssignment(0, newProperty)\n return configObject\n }\n\n configObject.addPropertyAssignment(newProperty)\n\n return configObject\n }\n\n if (existingProperty.isKind(SyntaxKind.PropertyAssignment)) {\n const initializer = existingProperty.getInitializer()\n const newValue = `${quoteChar}${property.value}${quoteChar}`\n\n // If property is a string, change it to an array and append.\n if (initializer?.isKind(SyntaxKind.StringLiteral)) {\n const initializerText = initializer.getText()\n initializer.replaceWithText(`[${initializerText}, ${newValue}]`)\n return configObject\n }\n\n // If property is an array, append.\n if (initializer?.isKind(SyntaxKind.ArrayLiteralExpression)) {\n // Check if the array already contains the value.\n if (\n initializer\n .getElements()\n .map((element) => element.getText())\n .includes(newValue)\n ) {\n return configObject\n }\n initializer.addElement(newValue)\n }\n\n return configObject\n }\n\n return configObject\n}\n\nasync function addTailwindConfigTheme(\n configObject: ObjectLiteralExpression,\n theme: UpdaterTailwindConfig[\"theme\"]\n) {\n // Ensure there is a theme property.\n if (!configObject.getProperty(\"theme\")) {\n configObject.addPropertyAssignment({\n name: \"theme\",\n initializer: \"{}\",\n })\n }\n\n // Nest all spread properties.\n nestSpreadProperties(configObject)\n\n const themeProperty = configObject\n .getPropertyOrThrow(\"theme\")\n ?.asKindOrThrow(SyntaxKind.PropertyAssignment)\n\n const themeInitializer = themeProperty.getInitializer()\n if (themeInitializer?.isKind(SyntaxKind.ObjectLiteralExpression)) {\n const themeObjectString = themeInitializer.getText()\n const themeObject = await parseObjectLiteral(themeObjectString)\n const result = deepmerge(themeObject, theme, {\n arrayMerge: (dst, src) => src,\n })\n const resultString = objectToString(result)\n .replace(/\\'\\.\\.\\.(.*)\\'/g, \"...$1\") // Remove quote around spread element\n .replace(/\\'\\\"/g, \"'\") // Replace `\\\" with \"\n .replace(/\\\"\\'/g, \"'\") // Replace `\\\" with \"\n .replace(/\\'\\[/g, \"[\") // Replace `[ with [\n .replace(/\\]\\'/g, \"]\") // Replace `] with ]\n .replace(/\\'\\\\\\'/g, \"'\") // Replace `\\' with '\n .replace(/\\\\\\'/g, \"'\") // Replace \\' with '\n .replace(/\\\\\\'\\'/g, \"'\")\n .replace(/\\'\\'/g, \"'\")\n themeInitializer.replaceWithText(resultString)\n }\n\n // Unnest all spread properties.\n unnestSpreadProperties(configObject)\n}\n\nfunction addTailwindConfigPlugin(\n configObject: ObjectLiteralExpression,\n plugin: string\n) {\n const existingPlugins = configObject.getProperty(\"plugins\")\n\n if (!existingPlugins) {\n configObject.addPropertyAssignment({\n name: \"plugins\",\n initializer: `[${plugin}]`,\n })\n\n return configObject\n }\n\n if (existingPlugins.isKind(SyntaxKind.PropertyAssignment)) {\n const initializer = existingPlugins.getInitializer()\n\n if (initializer?.isKind(SyntaxKind.ArrayLiteralExpression)) {\n if (\n initializer\n .getElements()\n .map((element) => {\n return element.getText().replace(/[\"']/g, \"\")\n })\n .includes(plugin.replace(/[\"']/g, \"\"))\n ) {\n return configObject\n }\n initializer.addElement(plugin)\n }\n\n return configObject\n }\n\n return configObject\n}\n\nexport async function _createSourceFile(input: string, config: Config | null) {\n const dir = await fs.mkdtemp(path.join(tmpdir(), \"shadcn-\"))\n const resolvedPath =\n config?.resolvedPaths?.tailwindConfig || \"tailwind.config.ts\"\n const tempFile = path.join(dir, `shadcn-${path.basename(resolvedPath)}`)\n\n const project = new Project({\n compilerOptions: {},\n })\n const sourceFile = project.createSourceFile(tempFile, input, {\n // Note: .js and .mjs can still be valid for TS projects.\n // We can't infer TypeScript from config.tsx.\n scriptKind:\n path.extname(resolvedPath) === \".ts\" ? ScriptKind.TS : ScriptKind.JS,\n })\n\n return sourceFile\n}\n\nexport function _getQuoteChar(configObject: ObjectLiteralExpression) {\n return configObject\n .getFirstDescendantByKind(SyntaxKind.StringLiteral)\n ?.getQuoteKind() === QuoteKind.Single\n ? \"'\"\n : '\"'\n}\n\nexport function nestSpreadProperties(obj: ObjectLiteralExpression) {\n const properties = obj.getProperties()\n\n for (let i = 0; i < properties.length; i++) {\n const prop = properties[i]\n if (prop.isKind(SyntaxKind.SpreadAssignment)) {\n const spreadAssignment = prop.asKindOrThrow(SyntaxKind.SpreadAssignment)\n const spreadText = spreadAssignment.getExpression().getText()\n\n // Replace spread with a property assignment\n obj.insertPropertyAssignment(i, {\n // Need to escape the name with \" so that deepmerge doesn't mishandle the key\n name: `\"___${spreadText.replace(/^\\.\\.\\./, \"\")}\"`,\n initializer: `\"...${spreadText.replace(/^\\.\\.\\./, \"\")}\"`,\n })\n\n // Remove the original spread assignment\n spreadAssignment.remove()\n } else if (prop.isKind(SyntaxKind.PropertyAssignment)) {\n const propAssignment = prop.asKindOrThrow(SyntaxKind.PropertyAssignment)\n const initializer = propAssignment.getInitializer()\n\n if (\n initializer &&\n initializer.isKind(SyntaxKind.ObjectLiteralExpression)\n ) {\n // Recursively process nested object literals\n nestSpreadProperties(\n initializer.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n )\n } else if (\n initializer &&\n initializer.isKind(SyntaxKind.ArrayLiteralExpression)\n ) {\n nestSpreadElements(\n initializer.asKindOrThrow(SyntaxKind.ArrayLiteralExpression)\n )\n }\n }\n }\n}\n\nexport function nestSpreadElements(arr: ArrayLiteralExpression) {\n const elements = arr.getElements()\n for (let j = 0; j < elements.length; j++) {\n const element = elements[j]\n if (element.isKind(SyntaxKind.ObjectLiteralExpression)) {\n // Recursive check on objects within arrays\n nestSpreadProperties(\n element.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n )\n } else if (element.isKind(SyntaxKind.ArrayLiteralExpression)) {\n // Recursive check on nested arrays\n nestSpreadElements(\n element.asKindOrThrow(SyntaxKind.ArrayLiteralExpression)\n )\n } else if (element.isKind(SyntaxKind.SpreadElement)) {\n const spreadText = element.getText()\n // Spread element within an array\n arr.removeElement(j)\n arr.insertElement(j, `\"${spreadText}\"`)\n }\n }\n}\n\nexport function unnestSpreadProperties(obj: ObjectLiteralExpression) {\n const properties = obj.getProperties()\n\n for (let i = 0; i < properties.length; i++) {\n const prop = properties[i]\n if (prop.isKind(SyntaxKind.PropertyAssignment)) {\n const propAssignment = prop as PropertyAssignment\n const initializer = propAssignment.getInitializer()\n\n if (initializer && initializer.isKind(SyntaxKind.StringLiteral)) {\n const value = initializer\n .asKindOrThrow(SyntaxKind.StringLiteral)\n .getLiteralValue()\n if (value.startsWith(\"...\")) {\n obj.insertSpreadAssignment(i, { expression: value.slice(3) })\n propAssignment.remove()\n }\n } else if (initializer?.isKind(SyntaxKind.ObjectLiteralExpression)) {\n unnestSpreadProperties(initializer as ObjectLiteralExpression)\n } else if (\n initializer &&\n initializer.isKind(SyntaxKind.ArrayLiteralExpression)\n ) {\n unsetSpreadElements(\n initializer.asKindOrThrow(SyntaxKind.ArrayLiteralExpression)\n )\n }\n }\n }\n}\n\nexport function unsetSpreadElements(arr: ArrayLiteralExpression) {\n const elements = arr.getElements()\n for (let j = 0; j < elements.length; j++) {\n const element = elements[j]\n if (element.isKind(SyntaxKind.ObjectLiteralExpression)) {\n // Recursive check on objects within arrays\n unnestSpreadProperties(\n element.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n )\n } else if (element.isKind(SyntaxKind.ArrayLiteralExpression)) {\n // Recursive check on nested arrays\n unsetSpreadElements(\n element.asKindOrThrow(SyntaxKind.ArrayLiteralExpression)\n )\n } else if (element.isKind(SyntaxKind.StringLiteral)) {\n const spreadText = element.getText()\n // check if spread element\n const spreadTest = /(?:^['\"])(\\.\\.\\..*)(?:['\"]$)/g\n if (spreadTest.test(spreadText)) {\n arr.removeElement(j)\n arr.insertElement(j, spreadText.replace(spreadTest, \"$1\"))\n }\n }\n }\n}\n\nasync function parseObjectLiteral(objectLiteralString: string): Promise<any> {\n const sourceFile = await _createSourceFile(\n `const theme = ${objectLiteralString}`,\n null\n )\n\n const statement = sourceFile.getStatements()[0]\n if (statement?.getKind() === SyntaxKind.VariableStatement) {\n const declaration = (statement as VariableStatement)\n .getDeclarationList()\n ?.getDeclarations()[0]\n const initializer = declaration.getInitializer()\n if (initializer?.isKind(SyntaxKind.ObjectLiteralExpression)) {\n return await parseObjectLiteralExpression(initializer)\n }\n }\n\n throw new Error(\"Invalid input: not an object literal\")\n}\n\nfunction parseObjectLiteralExpression(node: ObjectLiteralExpression): any {\n const result: any = {}\n for (const property of node.getProperties()) {\n if (property.isKind(SyntaxKind.PropertyAssignment)) {\n const name = property.getName().replace(/\\'/g, \"\")\n if (\n property.getInitializer()?.isKind(SyntaxKind.ObjectLiteralExpression)\n ) {\n result[name] = parseObjectLiteralExpression(\n property.getInitializer() as ObjectLiteralExpression\n )\n } else if (\n property.getInitializer()?.isKind(SyntaxKind.ArrayLiteralExpression)\n ) {\n result[name] = parseArrayLiteralExpression(\n property.getInitializer() as ArrayLiteralExpression\n )\n } else {\n result[name] = parseValue(property.getInitializer())\n }\n }\n }\n return result\n}\n\nfunction parseArrayLiteralExpression(node: ArrayLiteralExpression): any[] {\n const result: any[] = []\n for (const element of node.getElements()) {\n if (element.isKind(SyntaxKind.ObjectLiteralExpression)) {\n result.push(\n parseObjectLiteralExpression(\n element.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n )\n )\n } else if (element.isKind(SyntaxKind.ArrayLiteralExpression)) {\n result.push(\n parseArrayLiteralExpression(\n element.asKindOrThrow(SyntaxKind.ArrayLiteralExpression)\n )\n )\n } else {\n result.push(parseValue(element))\n }\n }\n return result\n}\n\nfunction parseValue(node: any): any {\n switch (node.getKind()) {\n case SyntaxKind.StringLiteral:\n return node.getText()\n case SyntaxKind.NumericLiteral:\n return Number(node.getText())\n case SyntaxKind.TrueKeyword:\n return true\n case SyntaxKind.FalseKeyword:\n return false\n case SyntaxKind.NullKeyword:\n return null\n case SyntaxKind.ArrayLiteralExpression:\n return node.getElements().map(parseValue)\n case SyntaxKind.ObjectLiteralExpression:\n return parseObjectLiteralExpression(node)\n default:\n return node.getText()\n }\n}\n\nexport function buildTailwindThemeColorsFromCssVars(\n cssVars: z.infer<typeof registryItemCssVarsSchema>\n) {\n const result: Record<string, any> = {}\n\n for (const key of Object.keys(cssVars)) {\n const parts = key.split(\"-\")\n const colorName = parts[0]\n const subType = parts.slice(1).join(\"-\")\n\n if (subType === \"\") {\n if (typeof result[colorName] === \"object\") {\n result[colorName].DEFAULT = `hsl(var(--${key}))`\n } else {\n result[colorName] = `hsl(var(--${key}))`\n }\n } else {\n if (typeof result[colorName] !== \"object\") {\n result[colorName] = { DEFAULT: `hsl(var(--${colorName}))` }\n }\n result[colorName][subType] = `hsl(var(--${key}))`\n }\n }\n\n // Remove DEFAULT if it's not in the original cssVars\n for (const [colorName, value] of Object.entries(result)) {\n if (\n typeof value === \"object\" &&\n value.DEFAULT === `hsl(var(--${colorName}))` &&\n !(colorName in cssVars)\n ) {\n delete value.DEFAULT\n }\n }\n\n return result\n}\n","import ora, { type Options } from \"ora\"\n\nexport function spinner(\n text: Options[\"text\"],\n options?: {\n silent?: boolean\n }\n) {\n return ora({\n text,\n isSilent: options?.silent,\n })\n}\n"]}
@@ -0,0 +1,37 @@
1
+ import { K, Q, h } from './chunk-JWGTL2JC.js';
2
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
+ import { ListToolsRequestSchema, CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js';
4
+ import { z } from 'zod';
5
+ import { zodToJsonSchema } from 'zod-to-json-schema';
6
+
7
+ var p=new Server({name:"shadcn",version:"0.0.1"},{capabilities:{resources:{},tools:{}}});p.setRequestHandler(ListToolsRequestSchema,async()=>({tools:[{name:"init",description:"Initialize a new project using a registry style project structure.",inputSchema:zodToJsonSchema(z.object({}))},{name:"get_items",description:"List all the available items in the registry",inputSchema:zodToJsonSchema(z.object({}))},{name:"get_item",description:"Get an item from the registry",inputSchema:zodToJsonSchema(z.object({name:z.string().describe("The name of the item to get from the registry. This is required.")}))},{name:"add_item",description:"Add an item from the registry",inputSchema:zodToJsonSchema(z.object({name:z.string().describe("The name of the item to add to the registry. This is required.")}))}]}));p.setRequestHandler(CallToolRequestSchema,async r=>{try{if(!r.params.arguments)throw new Error("Arguments are required");let e=process.env.REGISTRY_URL;if(!e)throw new Error("REGISTRY_URL is not set");switch(r.params.name){case"init":{let t=await u(e),n=t.items.find(o=>o.type==="registry:style"),a="To initialize a new project, run the following command:\n ```bash\n npx shadcn@canary init\n ```\n - This will install all the dependencies and theme for the project.\n - If running the init command installs a rules i.e registry.mdc file, you should follow the instructions in the file to configure the project.\n ",l=t.items.find(o=>o.type==="registry:file"&&o.name==="rules");return l&&(a+=`
8
+ You should also install the rules for the project.
9
+ \`\`\`bash
10
+ npx shadcn@canary add ${s(l.name,e)}
11
+ \`\`\`
12
+ `),n?{content:[{type:"text",text:`To initialize a new project using the ${n.name} style, run the following command:
13
+ \`\`\`bash
14
+ npx shadcn@canary init ${s(n.name,e)}
15
+ \`\`\`
16
+ `}]}:{content:[{type:"text",text:a}]}}case"get_items":{let t=await u(e);return t.items?{content:[{type:"text",text:`The following items are available in the registry:
17
+ ${JSON.stringify(t.items.map(n=>`- ${n.name} (${n.type}): ${n.description}`),null,2)}.
18
+ - To install and use an item in your project, you run the following command:
19
+ \`\`\`bash
20
+ npx shadcn@canary add ${s("NAME_OF_THE_ITEM",e)}
21
+ \`\`\`
22
+ - Example: npx shadcn@canary add ${s(t.items[0].name,e)} to install the ${t.items[0].name} item.
23
+ - To install multiple registry.items, you can do the following:
24
+ \`\`\`bash
25
+ npx shadcn@canary add ${s("NAME_OF_THE_ITEM_1",e)} ${s("NAME_OF_THE_ITEM_2",e)}
26
+ \`\`\`
27
+ - Before using any item, you need to add it first.
28
+ - Adding the items will install all dependencies for the item and format the code as per the project.
29
+ - Example components should not be installed directly unless asked. These components should be used as a reference to build other components.
30
+ `}]}:{content:[{type:"text",text:"No items found in the registry"}]}}case"get_item":{let t=z.string().parse(r.params.arguments.name);if(!t)throw new Error("Name is required");let n=s(t,e),a=await K(n,"");return {content:[{type:"text",text:JSON.stringify(a,null,2)}]}}case"add_item":{let t=z.string().parse(r.params.arguments.name);if(!t)throw new Error("Name is required");let n=s(t,e);return await K(n,"")?{content:[{type:"text",text:`To install the ${t} item, run the following command:
31
+ \`\`\`bash
32
+ npx shadcn@canary add ${n}
33
+ \`\`\``}]}:{content:[{type:"text",text:`Item ${t} not found in the registry.`}]}}default:throw new Error(`Tool ${r.params.name} not found`)}}catch(e){throw e instanceof z.ZodError?new Error(`Invalid input: ${JSON.stringify(e.errors)}`):e}});async function u(r){let[e]=await Q([r],{useCache:!1});return h.parse(e)}function s(r,e){return `${e.replace(/\/registry\.json$/,"")}/${r}.json`}
34
+
35
+ export { p as a };
36
+ //# sourceMappingURL=out.js.map
37
+ //# sourceMappingURL=chunk-KZJQQEKA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mcp/index.ts"],"names":["Server","CallToolRequestSchema","ListToolsRequestSchema","z","zodToJsonSchema","server","request","REGISTRY_URL","registry","getRegistry","style","item","text","rules","getRegistryItemUrl","name","itemUrl","getRegistryItem","error","registryUrl","registryJson","fetchRegistry","registrySchema","itemName"],"mappings":"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","sourcesContent":["import { registrySchema } from \"@/src/registry\"\nimport { fetchRegistry, getRegistryItem } from \"@/src/registry/api\"\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\"\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\"\nimport { z } from \"zod\"\nimport { zodToJsonSchema } from \"zod-to-json-schema\"\n\nexport const server = new Server(\n {\n name: \"shadcn\",\n version: \"0.0.1\",\n },\n {\n capabilities: {\n resources: {},\n tools: {},\n },\n }\n)\n\nserver.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: [\n {\n name: \"init\",\n description:\n \"Initialize a new project using a registry style project structure.\",\n inputSchema: zodToJsonSchema(z.object({})),\n },\n {\n name: \"get_items\",\n description: \"List all the available items in the registry\",\n inputSchema: zodToJsonSchema(z.object({})),\n },\n {\n name: \"get_item\",\n description: \"Get an item from the registry\",\n inputSchema: zodToJsonSchema(\n z.object({\n name: z\n .string()\n .describe(\n \"The name of the item to get from the registry. This is required.\"\n ),\n })\n ),\n },\n {\n name: \"add_item\",\n description: \"Add an item from the registry\",\n inputSchema: zodToJsonSchema(\n z.object({\n name: z\n .string()\n .describe(\n \"The name of the item to add to the registry. This is required.\"\n ),\n })\n ),\n },\n ],\n }\n})\n\nserver.setRequestHandler(CallToolRequestSchema, async (request) => {\n try {\n if (!request.params.arguments) {\n throw new Error(\"Arguments are required\")\n }\n\n const REGISTRY_URL = process.env.REGISTRY_URL\n\n if (!REGISTRY_URL) {\n throw new Error(\"REGISTRY_URL is not set\")\n }\n\n switch (request.params.name) {\n case \"init\": {\n const registry = await getRegistry(REGISTRY_URL)\n const style = registry.items.find(\n (item) => item.type === \"registry:style\"\n )\n\n let text = `To initialize a new project, run the following command:\n \\`\\`\\`bash\n npx shadcn@canary init\n \\`\\`\\`\n - This will install all the dependencies and theme for the project.\n - If running the init command installs a rules i.e registry.mdc file, you should follow the instructions in the file to configure the project.\n `\n\n const rules = registry.items.find(\n (item) => item.type === \"registry:file\" && item.name === \"rules\"\n )\n\n if (rules) {\n text += `\n You should also install the rules for the project.\n \\`\\`\\`bash\n npx shadcn@canary add ${getRegistryItemUrl(\n rules.name,\n REGISTRY_URL\n )}\n \\`\\`\\`\n `\n }\n\n if (!style) {\n return {\n content: [\n {\n type: \"text\",\n text,\n },\n ],\n }\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: `To initialize a new project using the ${\n style.name\n } style, run the following command:\n \\`\\`\\`bash\n npx shadcn@canary init ${getRegistryItemUrl(\n style.name,\n REGISTRY_URL\n )}\n \\`\\`\\`\n `,\n },\n ],\n }\n }\n case \"get_items\": {\n const registry = await getRegistry(REGISTRY_URL)\n\n if (!registry.items) {\n return {\n content: [\n {\n type: \"text\",\n text: \"No items found in the registry\",\n },\n ],\n }\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: `The following items are available in the registry:\n ${JSON.stringify(\n registry.items.map(\n (item) => `- ${item.name} (${item.type}): ${item.description}`\n ),\n null,\n 2\n )}.\n - To install and use an item in your project, you run the following command:\n \\`\\`\\`bash\n npx shadcn@canary add ${getRegistryItemUrl(\n \"NAME_OF_THE_ITEM\",\n REGISTRY_URL\n )}\n \\`\\`\\`\n - Example: npx shadcn@canary add ${getRegistryItemUrl(\n registry.items[0].name,\n REGISTRY_URL\n )} to install the ${registry.items[0].name} item.\n - To install multiple registry.items, you can do the following:\n \\`\\`\\`bash\n npx shadcn@canary add ${getRegistryItemUrl(\n \"NAME_OF_THE_ITEM_1\",\n REGISTRY_URL\n )} ${getRegistryItemUrl(\"NAME_OF_THE_ITEM_2\", REGISTRY_URL)}\n \\`\\`\\`\n - Before using any item, you need to add it first.\n - Adding the items will install all dependencies for the item and format the code as per the project.\n - Example components should not be installed directly unless asked. These components should be used as a reference to build other components.\n `,\n },\n ],\n }\n }\n\n case \"get_item\": {\n const name = z.string().parse(request.params.arguments.name)\n\n if (!name) {\n throw new Error(\"Name is required\")\n }\n\n const itemUrl = getRegistryItemUrl(name, REGISTRY_URL)\n const item = await getRegistryItem(itemUrl, \"\")\n\n return {\n content: [{ type: \"text\", text: JSON.stringify(item, null, 2) }],\n }\n }\n\n case \"add_item\": {\n const name = z.string().parse(request.params.arguments.name)\n\n if (!name) {\n throw new Error(\"Name is required\")\n }\n\n const itemUrl = getRegistryItemUrl(name, REGISTRY_URL)\n const item = await getRegistryItem(itemUrl, \"\")\n\n if (!item) {\n return {\n content: [\n {\n type: \"text\",\n text: `Item ${name} not found in the registry.`,\n },\n ],\n }\n }\n return {\n content: [\n {\n type: \"text\",\n text: `To install the ${name} item, run the following command:\n \\`\\`\\`bash\n npx shadcn@canary add ${itemUrl}\n \\`\\`\\``,\n },\n ],\n }\n }\n default:\n throw new Error(`Tool ${request.params.name} not found`)\n }\n } catch (error) {\n if (error instanceof z.ZodError) {\n throw new Error(`Invalid input: ${JSON.stringify(error.errors)}`)\n }\n\n throw error\n }\n})\n\nasync function getRegistry(registryUrl: string) {\n const [registryJson] = await fetchRegistry([registryUrl], {\n useCache: false,\n })\n return registrySchema.parse(registryJson)\n}\n\nfunction getRegistryItemUrl(itemName: string, registryUrl: string) {\n const registryBaseUrl = registryUrl.replace(/\\/registry\\.json$/, \"\")\n return `${registryBaseUrl}/${itemName}.json`\n}\n"]}