shadcn 2.9.3 → 2.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-UBC2EX4X.js → chunk-MLPJ4AFS.js} +4 -4
- package/dist/chunk-P4EM45ZN.js +31 -0
- package/dist/chunk-P4EM45ZN.js.map +1 -0
- package/dist/{index-4a90b588.d.ts → index-8c784f6a.d.ts} +23 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js +67 -57
- package/dist/index.js.map +1 -1
- package/dist/mcp/index.js +2 -2
- package/dist/registry/index.d.ts +1 -1
- package/dist/registry/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-BJAN3BBB.js +0 -31
- package/dist/chunk-BJAN3BBB.js.map +0 -1
- /package/dist/{chunk-UBC2EX4X.js.map → chunk-MLPJ4AFS.js.map} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { S, Y, I } from './chunk-P4EM45ZN.js';
|
|
2
2
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
3
|
import { ListToolsRequestSchema, CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
4
4
|
import { z } from 'zod';
|
|
@@ -27,11 +27,11 @@ var p=new Server({name:"shadcn",version:"0.0.1"},{capabilities:{resources:{},too
|
|
|
27
27
|
- Before using any item, you need to add it first.
|
|
28
28
|
- Adding the items will install all dependencies for the item and format the code as per the project.
|
|
29
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
|
|
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 S(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 S(n,"")?{content:[{type:"text",text:`To install the ${t} item, run the following command:
|
|
31
31
|
\`\`\`bash
|
|
32
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
|
|
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 Y([r],{useCache:!1});return I.parse(e)}function s(r,e){return `${e.replace(/\/registry\.json$/,"")}/${r}.json`}
|
|
34
34
|
|
|
35
35
|
export { p as a };
|
|
36
36
|
//# sourceMappingURL=out.js.map
|
|
37
|
-
//# sourceMappingURL=chunk-
|
|
37
|
+
//# sourceMappingURL=chunk-MLPJ4AFS.js.map
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { promises } from 'fs';
|
|
3
|
+
import { tmpdir, homedir } from 'os';
|
|
4
|
+
import * as v from 'path';
|
|
5
|
+
import v__default from 'path';
|
|
6
|
+
import * as E from 'fs/promises';
|
|
7
|
+
import { createMatchPath, loadConfig } from 'tsconfig-paths';
|
|
8
|
+
import { Project, ScriptKind, SyntaxKind, QuoteKind } from 'ts-morph';
|
|
9
|
+
import M from 'fs-extra';
|
|
10
|
+
import J from 'fast-glob';
|
|
11
|
+
import { red, yellow, cyan, green } from 'kleur/colors';
|
|
12
|
+
import { cosmiconfig } from 'cosmiconfig';
|
|
13
|
+
import mt from 'ora';
|
|
14
|
+
import L from 'deepmerge';
|
|
15
|
+
import yt from 'stringify-object';
|
|
16
|
+
import { HttpsProxyAgent } from 'https-proxy-agent';
|
|
17
|
+
import It from 'node-fetch';
|
|
18
|
+
|
|
19
|
+
var ge=z.enum(["registry:lib","registry:block","registry:component","registry:ui","registry:hook","registry:page","registry:file","registry:theme","registry:style","registry:item","registry:example","registry:internal"]),Ae=z.discriminatedUnion("type",[z.object({path:z.string(),content:z.string().optional(),type:z.enum(["registry:file","registry:page"]),target:z.string()}),z.object({path:z.string(),content:z.string().optional(),type:ge.exclude(["registry:file","registry:page"]),target:z.string().optional()})]),Fe=z.object({config:z.object({content:z.array(z.string()).optional(),theme:z.record(z.string(),z.any()).optional(),plugins:z.array(z.string()).optional()}).optional()}),ee=z.object({theme:z.record(z.string(),z.string()).optional(),light:z.record(z.string(),z.string()).optional(),dark:z.record(z.string(),z.string()).optional()}),Ve=z.record(z.string(),z.lazy(()=>z.union([z.string(),z.record(z.string(),z.union([z.string(),z.record(z.string(),z.string())]))]))),Oe=z.record(z.string(),z.string()),I=z.object({$schema:z.string().optional(),extends:z.string().optional(),name:z.string(),type:ge,title:z.string().optional(),author:z.string().min(2).optional(),description:z.string().optional(),dependencies:z.array(z.string()).optional(),devDependencies:z.array(z.string()).optional(),registryDependencies:z.array(z.string()).optional(),files:z.array(Ae).optional(),tailwind:Fe.optional(),cssVars:ee.optional(),css:Ve.optional(),envVars:Oe.optional(),meta:z.record(z.string(),z.any()).optional(),docs:z.string().optional(),categories:z.array(z.string()).optional()}),Bt=z.object({name:z.string(),homepage:z.string(),items:z.array(I)}),te=z.array(I),de=z.array(z.object({name:z.string(),label:z.string()})),me=z.record(z.string(),z.record(z.string(),z.string())),ue=z.object({inlineColors:z.object({light:z.record(z.string(),z.string()),dark:z.record(z.string(),z.string())}),cssVars:ee,cssVarsV4:ee.optional(),inlineColorsTemplate:z.string(),cssVarsTemplate:z.string()}),he=I.pick({dependencies:!0,devDependencies:!0,files:!0,tailwind:!0,cssVars:!0,css:!0,envVars:!0,docs:!0});async function P(e,t){return createMatchPath(t.absoluteBaseUrl,t.paths)(e,void 0,()=>!0,[".ts",".tsx",".jsx",".js",".css"])}var ye=[".tsx",".ts",".jsx",".js",".css"],we=["lib/utils.ts"],_e=[/^(react|react-dom|next)(\/.*)?$/,/^(node|jsr|npm):.*$/],Ue=new Project({compilerOptions:{}});function We(e){if(_e.some(t=>t.test(e)))return null;if(!e.startsWith("@")&&e.includes("/")&&(e=e.split("/")[0]),e.startsWith("@")){let t=e.split("/");t.length>2&&(e=t.slice(0,2).join("/"));}return e}async function Me(e,t,r,s=new Set){let i=v.resolve(t.resolvedPaths.cwd,e),n=v.relative(t.resolvedPaths.cwd,i);if(we.includes(n))return {dependencies:[],files:[]};let l=v.extname(e);if(!ye.includes(l))return {dependencies:[],files:[]};if(s.has(n))return {dependencies:[],files:[]};if(s.add(n),!(await E.stat(i)).isFile())return {dependencies:[],files:[]};let u=await E.readFile(i,"utf-8"),b=await Be(v.basename(i)),p=Ue.createSourceFile(b,u,{scriptKind:ScriptKind.TSX}),T=await loadConfig(t.resolvedPaths.cwd);if(T.resultType==="failed")return {dependencies:[],files:[]};let g=[],A=new Set,F=xe(e),D={path:n,type:F,target:""};g.push(D);let c=p.getImportDeclarations();for(let V of c){let k=V.getModuleSpecifierValue(),N=k.startsWith(".");if(!k.startsWith(`${r.aliasPrefix}/`)&&!N){let S=We(k);S&&A.add(S);continue}let O=await P(k,T);if(N&&(O=v.resolve(v.dirname(i),k)),!O)continue;if(!v.extname(O))for(let S of ye){let fe=`${O}${S}`;try{await E.access(fe),O=fe;break}catch{continue}}let _=v.relative(t.resolvedPaths.cwd,O);if(s.has(_)||we.includes(_))continue;let Z=xe(k),pe={path:_,type:Z,target:""};(Z==="registry:page"||Z==="registry:file")&&(pe.target=k),g.push(pe);let U=await Me(_,t,r,s);if(U.files)for(let S of U.files)s.has(S.path)||(s.add(S.path),g.push(S));U.dependencies&&U.dependencies.forEach(S=>A.add(S));}let h=Array.from(new Map(g.map(V=>[V.path,V])).values());return {dependencies:Array.from(A),files:h}}async function Be(e){let t=await E.mkdtemp(v.join(tmpdir(),"shadcn-"));return v.join(t,e)}function xe(e){return e.includes("/ui/")?"registry:ui":e.includes("/lib/")?"registry:lib":e.includes("/hooks/")?"registry:hook":(e.includes("/components/"),"registry:component")}function Je(e){try{return new URL(e),!0}catch{return !1}}function $(e){return e.endsWith(".json")&&!Je(e)}function Zt(e){return !!e?.files?.length&&e.files.every(t=>!!t.target&&t.type==="registry:file")}var x={"next-app":{name:"next-app",label:"Next.js",links:{installation:"https://ui.shadcn.com/docs/installation/next",tailwind:"https://tailwindcss.com/docs/guides/nextjs"}},"next-pages":{name:"next-pages",label:"Next.js",links:{installation:"https://ui.shadcn.com/docs/installation/next",tailwind:"https://tailwindcss.com/docs/guides/nextjs"}},remix:{name:"remix",label:"Remix",links:{installation:"https://ui.shadcn.com/docs/installation/remix",tailwind:"https://tailwindcss.com/docs/guides/remix"}},"react-router":{name:"react-router",label:"React Router",links:{installation:"https://ui.shadcn.com/docs/installation/react-router",tailwind:"https://tailwindcss.com/docs/installation/framework-guides/react-router"}},vite:{name:"vite",label:"Vite",links:{installation:"https://ui.shadcn.com/docs/installation/vite",tailwind:"https://tailwindcss.com/docs/guides/vite"}},astro:{name:"astro",label:"Astro",links:{installation:"https://ui.shadcn.com/docs/installation/astro",tailwind:"https://tailwindcss.com/docs/guides/astro"}},laravel:{name:"laravel",label:"Laravel",links:{installation:"https://ui.shadcn.com/docs/installation/laravel",tailwind:"https://tailwindcss.com/docs/guides/laravel"}},"tanstack-start":{name:"tanstack-start",label:"TanStack Start",links:{installation:"https://ui.shadcn.com/docs/installation/tanstack",tailwind:"https://tailwindcss.com/docs/installation/using-postcss"}},gatsby:{name:"gatsby",label:"Gatsby",links:{installation:"https://ui.shadcn.com/docs/installation/gatsby",tailwind:"https://tailwindcss.com/docs/guides/gatsby"}},expo:{name:"expo",label:"Expo",links:{installation:"https://ui.shadcn.com/docs/installation/expo",tailwind:"https://www.nativewind.dev/docs/getting-started/installation"}},manual:{name:"manual",label:"Manual",links:{installation:"https://ui.shadcn.com/docs/installation/manual",tailwind:"https://tailwindcss.com/docs/installation"}}};function re(e="",t=!0){let r=v__default.join(e,"package.json");return M.readJSONSync(r,{throws:t})}var G=["**/node_modules/**",".next","public","dist","build"];z.object({compilerOptions:z.object({paths:z.record(z.string().or(z.array(z.string())))})});async function Y(e){let[t,r,s,i,n,l,d,u]=await Promise.all([J.glob("**/{next,vite,astro,app}.config.*|gatsby-config.*|composer.json|react-router.config.*",{cwd:e,deep:3,ignore:G}),M.pathExists(v__default.resolve(e,"src")),Ze(e),qe(e),Qe(e),be(e),Xe(e),re(e,!1)]),b=await M.pathExists(v__default.resolve(e,`${r?"src/":""}app`)),p={framework:x.manual,isSrcDir:r,isRSC:!1,isTsx:s,tailwindConfigFile:i,tailwindCssFile:n,tailwindVersion:l,aliasPrefix:d};if(t.find(g=>g.startsWith("next.config."))?.length)return p.framework=b?x["next-app"]:x["next-pages"],p.isRSC=b,p;if(t.find(g=>g.startsWith("astro.config."))?.length)return p.framework=x.astro,p;if(t.find(g=>g.startsWith("gatsby-config."))?.length)return p.framework=x.gatsby,p;if(t.find(g=>g.startsWith("composer.json"))?.length)return p.framework=x.laravel,p;if(Object.keys(u?.dependencies??{}).find(g=>g.startsWith("@remix-run/")))return p.framework=x.remix,p;if([...Object.keys(u?.dependencies??{}),...Object.keys(u?.devDependencies??{})].find(g=>g.startsWith("@tanstack/react-start")))return p.framework=x["tanstack-start"],p;if(t.find(g=>g.startsWith("react-router.config."))?.length)return p.framework=x["react-router"],p;if(t.find(g=>g.startsWith("vite.config."))?.length)return p.framework=x.vite,p;let T=t.find(g=>g.startsWith("app.config"));return T?.length&&(await M.readFile(v__default.resolve(e,T),"utf8")).includes("defineConfig")?(p.framework=x.vite,p):(u?.dependencies?.expo&&(p.framework=x.expo),p)}async function be(e){let[t,r]=await Promise.all([re(e,!1),B(e)]);return r?.tailwind?.config===""?"v4":!t?.dependencies?.tailwindcss&&!t?.devDependencies?.tailwindcss?null:/^(?:\^|~)?3(?:\.\d+)*(?:-.*)?$/.test(t?.dependencies?.tailwindcss||t?.devDependencies?.tailwindcss||"")?"v3":"v4"}async function Qe(e){let[t,r]=await Promise.all([J.glob(["**/*.css","**/*.scss"],{cwd:e,deep:5,ignore:G}),be(e)]);if(!t.length)return null;for(let i of t){let n=await M.readFile(v__default.resolve(e,i),"utf8");if(n.includes('@import "tailwindcss"')||n.includes("@import 'tailwindcss'")||n.includes("@tailwind base"))return i}return null}async function qe(e){let t=await J.glob("tailwind.config.*",{cwd:e,deep:3,ignore:G});return t.length?t[0]:null}async function Xe(e){let t=await loadConfig(e);if(t?.resultType==="failed"||!Object.entries(t?.paths).length)return null;for(let[r,s]of Object.entries(t.paths))if(s.includes("./*")||s.includes("./src/*")||s.includes("./app/*")||s.includes("./resources/js/*"))return r.replace(/\/\*$/,"")??null;return Object.keys(t?.paths)?.[0].replace(/\/\*$/,"")??null}async function Ze(e){return (await J.glob("tsconfig.*",{cwd:e,deep:1,ignore:G})).length>0}async function yr(e,t=null){let[r,s]=await Promise.all([B(e),t?Promise.resolve(t):Y(e)]);if(r)return r;if(!s||!s.tailwindCssFile||s.tailwindVersion==="v3"&&!s.tailwindConfigFile)return null;let i={$schema:"https://ui.shadcn.com/schema.json",rsc:s.isRSC,tsx:s.isTsx,style:"new-york",tailwind:{config:s.tailwindConfigFile??"",baseColor:"zinc",css:s.tailwindCssFile,cssVariables:!0,prefix:""},iconLibrary:"lucide",aliases:{components:`${s.aliasPrefix}/components`,ui:`${s.aliasPrefix}/components/ui`,hooks:`${s.aliasPrefix}/hooks`,lib:`${s.aliasPrefix}/lib`,utils:`${s.aliasPrefix}/lib/utils`}};return await se(e,i)}async function Pe(e){if(!e.resolvedPaths?.cwd)return "v3";let t=await Y(e.resolvedPaths.cwd);return t?.tailwindVersion?t.tailwindVersion:null}var w={error:red,warn:yellow,info:cyan,success:green};var Ir="@/components",Lr="@/lib/utils",Rr="app/globals.css",Ar="tailwind.config.js";var at=cosmiconfig("components",{searchPlaces:["components.json"]}),ve=z.object({$schema:z.string().optional(),style:z.string(),rsc:z.coerce.boolean().default(!1),tsx:z.coerce.boolean().default(!0),tailwind:z.object({config:z.string().optional(),css:z.string(),baseColor:z.string(),cssVariables:z.boolean().default(!0),prefix:z.string().default("").optional()}),aliases:z.object({components:z.string(),utils:z.string(),ui:z.string().optional(),lib:z.string().optional(),hooks:z.string().optional()}),iconLibrary:z.string().optional()}).strict(),Se=ve.extend({resolvedPaths:z.object({cwd:z.string(),tailwindConfig:z.string(),tailwindCss:z.string(),utils:z.string(),components:z.string(),lib:z.string(),hooks:z.string(),ui:z.string()})}),lt=z.record(Se);async function B(e){let t=await ct(e);return t?(t.iconLibrary||(t.iconLibrary=t.style==="new-york"?"radix":"lucide"),await se(e,t)):null}async function se(e,t){let r=await loadConfig(e);if(r.resultType==="failed")throw new Error(`Failed to load ${t.tsx?"tsconfig":"jsconfig"}.json. ${r.message??""}`.trim());return Se.parse({...t,resolvedPaths:{cwd:e,tailwindConfig:t.tailwind.config?v__default.resolve(e,t.tailwind.config):"",tailwindCss:v__default.resolve(e,t.tailwind.css),utils:await P(t.aliases.utils,r),components:await P(t.aliases.components,r),ui:t.aliases.ui?await P(t.aliases.ui,r):v__default.resolve(await P(t.aliases.components,r)??e,"ui"),lib:t.aliases.lib?await P(t.aliases.lib,r):v__default.resolve(await P(t.aliases.utils,r)??e,".."),hooks:t.aliases.hooks?await P(t.aliases.hooks,r):v__default.resolve(await P(t.aliases.components,r)??e,"..","hooks")}})}async function ct(e){try{let t=await at.search(e);return t?ve.parse(t.config):null}catch{let r=`${e}/components.json`;throw new Error(`Invalid configuration found in ${w.info(r)}.`)}}async function Fr(e){let t={};for(let s of Object.keys(e.aliases)){if(!ft(s,e))continue;let i=e.resolvedPaths[s],n=await pt(e.resolvedPaths.cwd,i);if(!n){t[s]=e;continue}t[s]=await B(n);}let r=lt.safeParse(t);return r.success?r.data:null}async function pt(e,t){let r=gt(e,t),s=v__default.relative(r,t),n=(await J.glob("**/package.json",{cwd:r,deep:3,ignore:["**/node_modules/**","**/dist/**","**/build/**","**/public/**"]})).map(l=>v__default.dirname(l)).find(l=>s.startsWith(l));return n?v__default.join(r,n):null}function ft(e,t){return Object.keys(t.resolvedPaths).filter(r=>r!=="utils").includes(e)}function gt(e,t){let r=e.split(v__default.sep),s=t.split(v__default.sep),i=[];for(let n=0;n<Math.min(r.length,s.length)&&r[n]===s[n];n++)i.push(r[n]);return i.join(v__default.sep)}async function ie(e,t){return (await Y(e))?.tailwindVersion==="v4"?"new-york-v4":t}function Vr(e){let t={resolvedPaths:{cwd:process.cwd(),tailwindConfig:"",tailwindCss:"",utils:"",components:"",ui:"",lib:"",hooks:""},style:"",tailwind:{config:"",css:"",baseColor:"",cssVariables:!1},rsc:!1,tsx:!0,aliases:{components:"",utils:""}};return e?{...t,...e,resolvedPaths:{...t.resolvedPaths,...e.resolvedPaths||{}},tailwind:{...t.tailwind,...e.tailwind||{}},aliases:{...t.aliases,...e.aliases||{}}}:t}var m={error(...e){console.log(w.error(e.join(" ")));},warn(...e){console.log(w.warn(e.join(" ")));},info(...e){console.log(w.info(e.join(" ")));},success(...e){console.log(w.success(e.join(" ")));},log(...e){console.log(e.join(" "));},break(){console.log("");}};function C(e){if(m.error("Something went wrong. Please check the error below for more details."),m.error("If the problem persists, please open an issue on GitHub."),m.error(""),typeof e=="string"&&(m.error(e),m.break(),process.exit(1)),e instanceof z.ZodError){m.error("Validation failed:");for(let[t,r]of Object.entries(e.flatten().fieldErrors))m.error(`- ${w.info(t)}: ${r}`);m.break(),process.exit(1);}e instanceof Error&&(m.error(e.message),m.break(),process.exit(1)),m.break(),process.exit(1);}function Ce(e,t){return mt({text:e,isSilent:t?.silent})}async function rs(e,t,r){if(!e||(r={silent:!1,tailwindVersion:"v3",...r},r.tailwindVersion==="v4"))return;let s=v__default.relative(t.resolvedPaths.cwd,t.resolvedPaths.tailwindConfig),i=Ce(`Updating ${w.info(s)}`,{silent:r.silent}).start(),n=await promises.readFile(t.resolvedPaths.tailwindConfig,"utf8"),l=await bt(n,e,t);await promises.writeFile(t.resolvedPaths.tailwindConfig,l,"utf8"),i?.succeed();}async function bt(e,t,r){let s=await ke(e,r),i=s.getDescendantsOfKind(SyntaxKind.ObjectLiteralExpression).find(l=>l.getProperties().some(d=>d.isKind(SyntaxKind.PropertyAssignment)&&d.getName()==="content"));if(!i)return e;let n=Ct(i);return Pt(i,{name:"darkMode",value:"class"},{quoteChar:n}),t.plugins?.forEach(l=>{St(i,l);}),t.theme&&await vt(i,t.theme),s.getFullText()}function Pt(e,t,{quoteChar:r}){let s=e.getProperty("darkMode");if(!s){let i={name:t.name,initializer:`[${r}${t.value}${r}]`};return t.name==="darkMode"?(e.insertPropertyAssignment(0,i),e):(e.addPropertyAssignment(i),e)}if(s.isKind(SyntaxKind.PropertyAssignment)){let i=s.getInitializer(),n=`${r}${t.value}${r}`;if(i?.isKind(SyntaxKind.StringLiteral)){let l=i.getText();return i.replaceWithText(`[${l}, ${n}]`),e}if(i?.isKind(SyntaxKind.ArrayLiteralExpression)){if(i.getElements().map(l=>l.getText()).includes(n))return e;i.addElement(n);}return e}return e}async function vt(e,t){e.getProperty("theme")||e.addPropertyAssignment({name:"theme",initializer:"{}"}),oe(e);let s=(e.getPropertyOrThrow("theme")?.asKindOrThrow(SyntaxKind.PropertyAssignment)).getInitializer();if(s?.isKind(SyntaxKind.ObjectLiteralExpression)){let i=s.getText(),n=await Tt(i),l=L(n,t,{arrayMerge:(u,b)=>b}),d=yt(l).replace(/\'\.\.\.(.*)\'/g,"...$1").replace(/\'\"/g,"'").replace(/\"\'/g,"'").replace(/\'\[/g,"[").replace(/\]\'/g,"]").replace(/\'\\\'/g,"'").replace(/\\\'/g,"'").replace(/\\\'\'/g,"'").replace(/\'\'/g,"'");s.replaceWithText(d);}ae(e);}function St(e,t){let r=e.getProperty("plugins");if(!r)return e.addPropertyAssignment({name:"plugins",initializer:`[${t}]`}),e;if(r.isKind(SyntaxKind.PropertyAssignment)){let s=r.getInitializer();if(s?.isKind(SyntaxKind.ArrayLiteralExpression)){if(s.getElements().map(i=>i.getText().replace(/["']/g,"")).includes(t.replace(/["']/g,"")))return e;s.addElement(t);}return e}return e}async function ke(e,t){let r=await promises.mkdtemp(v__default.join(tmpdir(),"shadcn-")),s=t?.resolvedPaths?.tailwindConfig||"tailwind.config.ts",i=v__default.join(r,`shadcn-${v__default.basename(s)}`);return new Project({compilerOptions:{}}).createSourceFile(i,e,{scriptKind:v__default.extname(s)===".ts"?ScriptKind.TS:ScriptKind.JS})}function Ct(e){return e.getFirstDescendantByKind(SyntaxKind.StringLiteral)?.getQuoteKind()===QuoteKind.Single?"'":'"'}function oe(e){let t=e.getProperties();for(let r=0;r<t.length;r++){let s=t[r];if(s.isKind(SyntaxKind.SpreadAssignment)){let i=s.asKindOrThrow(SyntaxKind.SpreadAssignment),n=i.getExpression().getText();e.insertPropertyAssignment(r,{name:`"___${n.replace(/^\.\.\./,"")}"`,initializer:`"...${n.replace(/^\.\.\./,"")}"`}),i.remove();}else if(s.isKind(SyntaxKind.PropertyAssignment)){let n=s.asKindOrThrow(SyntaxKind.PropertyAssignment).getInitializer();n&&n.isKind(SyntaxKind.ObjectLiteralExpression)?oe(n.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)):n&&n.isKind(SyntaxKind.ArrayLiteralExpression)&&Ee(n.asKindOrThrow(SyntaxKind.ArrayLiteralExpression));}}}function Ee(e){let t=e.getElements();for(let r=0;r<t.length;r++){let s=t[r];if(s.isKind(SyntaxKind.ObjectLiteralExpression))oe(s.asKindOrThrow(SyntaxKind.ObjectLiteralExpression));else if(s.isKind(SyntaxKind.ArrayLiteralExpression))Ee(s.asKindOrThrow(SyntaxKind.ArrayLiteralExpression));else if(s.isKind(SyntaxKind.SpreadElement)){let i=s.getText();e.removeElement(r),e.insertElement(r,`"${i}"`);}}}function ae(e){let t=e.getProperties();for(let r=0;r<t.length;r++){let s=t[r];if(s.isKind(SyntaxKind.PropertyAssignment)){let i=s,n=i.getInitializer();if(n&&n.isKind(SyntaxKind.StringLiteral)){let l=n.asKindOrThrow(SyntaxKind.StringLiteral).getLiteralValue();l.startsWith("...")&&(e.insertSpreadAssignment(r,{expression:l.slice(3)}),i.remove());}else n?.isKind(SyntaxKind.ObjectLiteralExpression)?ae(n):n&&n.isKind(SyntaxKind.ArrayLiteralExpression)&&je(n.asKindOrThrow(SyntaxKind.ArrayLiteralExpression));}}}function je(e){let t=e.getElements();for(let r=0;r<t.length;r++){let s=t[r];if(s.isKind(SyntaxKind.ObjectLiteralExpression))ae(s.asKindOrThrow(SyntaxKind.ObjectLiteralExpression));else if(s.isKind(SyntaxKind.ArrayLiteralExpression))je(s.asKindOrThrow(SyntaxKind.ArrayLiteralExpression));else if(s.isKind(SyntaxKind.StringLiteral)){let i=s.getText(),n=/(?:^['"])(\.\.\..*)(?:['"]$)/g;n.test(i)&&(e.removeElement(r),e.insertElement(r,i.replace(n,"$1")));}}}async function Tt(e){let r=(await ke(`const theme = ${e}`,null)).getStatements()[0];if(r?.getKind()===SyntaxKind.VariableStatement){let i=(r.getDeclarationList()?.getDeclarations()[0]).getInitializer();if(i?.isKind(SyntaxKind.ObjectLiteralExpression))return await H(i)}throw new Error("Invalid input: not an object literal")}function H(e){let t={};for(let r of e.getProperties())if(r.isKind(SyntaxKind.PropertyAssignment)){let s=r.getName().replace(/\'/g,"");r.getInitializer()?.isKind(SyntaxKind.ObjectLiteralExpression)?t[s]=H(r.getInitializer()):r.getInitializer()?.isKind(SyntaxKind.ArrayLiteralExpression)?t[s]=Ie(r.getInitializer()):t[s]=le(r.getInitializer());}return t}function Ie(e){let t=[];for(let r of e.getElements())r.isKind(SyntaxKind.ObjectLiteralExpression)?t.push(H(r.asKindOrThrow(SyntaxKind.ObjectLiteralExpression))):r.isKind(SyntaxKind.ArrayLiteralExpression)?t.push(Ie(r.asKindOrThrow(SyntaxKind.ArrayLiteralExpression))):t.push(le(r));return t}function le(e){switch(e.getKind()){case SyntaxKind.StringLiteral:return e.getText();case SyntaxKind.NumericLiteral:return Number(e.getText());case SyntaxKind.TrueKeyword:return !0;case SyntaxKind.FalseKeyword:return !1;case SyntaxKind.NullKeyword:return null;case SyntaxKind.ArrayLiteralExpression:return e.getElements().map(le);case SyntaxKind.ObjectLiteralExpression:return H(e);default:return e.getText()}}function Le(e){let t={};for(let r of Object.keys(e)){let s=r.split("-"),i=s[0],n=s.slice(1).join("-");n===""?typeof t[i]=="object"?t[i].DEFAULT=`hsl(var(--${r}))`:t[i]=`hsl(var(--${r}))`:(typeof t[i]!="object"&&(t[i]={DEFAULT:`hsl(var(--${i}))`}),t[i][n]=`hsl(var(--${r}))`);}for(let[r,s]of Object.entries(t))typeof s=="object"&&s.DEFAULT===`hsl(var(--${r}))`&&!(r in e)&&delete s.DEFAULT;return t}var Rt=process.env.REGISTRY_URL??"https://ui.shadcn.com/r",At=process.env.https_proxy?new HttpsProxyAgent(process.env.https_proxy):void 0,Q=new Map,Ft=[{name:"neutral",label:"Neutral"},{name:"gray",label:"Gray"},{name:"zinc",label:"Zinc"},{name:"stone",label:"Stone"},{name:"slate",label:"Slate"}];async function Vt(){try{let[e]=await j(["index.json"]);return te.parse(e)}catch(e){m.error(`
|
|
20
|
+
`),C(e);}}async function bs(){try{let[e]=await j(["styles/index.json"]);return de.parse(e)}catch(e){return m.error(`
|
|
21
|
+
`),C(e),[]}}async function Ps(){try{let[e]=await j(["icons/index.json"]);return me.parse(e)}catch(e){return C(e),{}}}async function q(e,t){try{if($(e))return await Ot(e);let[r]=await j([R(e)?e:`styles/${t}/${e}.json`]);return I.parse(r)}catch(r){return m.break(),C(r),null}}async function Ot(e){try{let t=e;e.startsWith("~/")&&(t=v__default.join(homedir(),e.slice(2)));let r=v__default.resolve(t),s=await promises.readFile(r,"utf8"),i=JSON.parse(s);return I.parse(i)}catch(t){return m.error(`Failed to read local registry file: ${e}`),C(t),null}}async function vs(){return Ft}async function $t(e){try{let[t]=await j([`colors/${e}.json`]);return ue.parse(t)}catch(t){C(t);}}async function Kt(e,t){let r=[];for(let s of t){let i=e.find(n=>n.name===s);if(i&&(r.push(i),i.registryDependencies)){let n=await Kt(e,i.registryDependencies);r.push(...n);}}return r.filter((s,i,n)=>n.findIndex(l=>l.name===s.name)===i)}async function Ss(e,t){try{let r=t.map(i=>`styles/${e}/${i.name}.json`),s=await j(r);return te.parse(s)}catch(r){C(r);}}async function Cs(e,t,r){if(r)return r;if(t.type==="registry:ui")return e.resolvedPaths.ui??e.resolvedPaths.components;let[s,i]=t.type?.split(":")??[];return s in e.resolvedPaths?v__default.join(e.resolvedPaths[s],i):null}async function j(e,t={}){t={useCache:!0,...t};try{return await Promise.all(e.map(async s=>{let i=Re(s);if(t.useCache&&Q.has(i))return Q.get(i);let n=(async()=>{let l=await It(i,{agent:At});if(!l.ok){let d={400:"Bad request",401:"Unauthorized",403:"Forbidden",404:"Not found",500:"Internal server error"};if(l.status===401)throw new Error(`You are not authorized to access the component at ${w.info(i)}.
|
|
22
|
+
If this is a remote registry, you may need to authenticate.`);if(l.status===404)throw new Error(`The component at ${w.info(i)} was not found.
|
|
23
|
+
It may not exist at the registry. Please make sure it is a valid component.`);if(l.status===403)throw new Error(`You do not have access to the component at ${w.info(i)}.
|
|
24
|
+
If this is a remote registry, you may need to authenticate or a token.`);let u=await l.json(),b=u&&typeof u=="object"&&"error"in u?u.error:l.statusText||d[l.status];throw new Error(`Failed to fetch from ${w.info(i)}.
|
|
25
|
+
${b}`)}return l.json()})();return t.useCache&&Q.set(i,n),n}))}catch(r){return m.error(`
|
|
26
|
+
`),C(r),[]}}function Ts(){Q.clear();}async function X(e,t,r=new Set){let s=[],i=[];for(let n of e)if(!r.has(n)){if(r.add(n),R(n)||$(n)){let l=await q(n,"");if(l&&(s.push(l),l.registryDependencies)){let d=await X(l.registryDependencies,t,r);s.push(...d.items),i.push(...d.registryNames);}}else if(i.push(n),t){let l=t.resolvedPaths?.cwd?await ie(t.resolvedPaths.cwd,t.style):t.style;try{let d=await q(n,l);if(d&&d.registryDependencies){let u=await X(d.registryDependencies,t,r);s.push(...u.items),i.push(...u.registryNames);}}catch{}}}return {items:s,registryNames:i}}async function zt(e,t){try{let r=e.filter(c=>$(c)),s=e.filter(c=>R(c)),i=e.filter(c=>!$(c)&&!R(c)),n=[],l=[];for(let c of r){let h=await q(c,"");h&&(n.push(h),h.registryDependencies&&l.push(...h.registryDependencies));}for(let c of s){let h=await q(c,"");h&&(n.push(h),h.registryDependencies&&l.push(...h.registryDependencies));}let{items:d,registryNames:u}=await X(l,t);n.push(...d);let b=[...i,...u];if(b.length>0){if(await Vt()){let h=Array.from(new Set(b));h.includes("index")&&h.unshift("index");let V=await _t(h,t),k=await j(V),N=z.array(I).parse(k);n.push(...N);}else if(n.length===0)return null}if(!n.length)return null;if(b.includes("index")&&t.tailwind.baseColor){let c=await Nt(t.tailwind.baseColor,t);c&&n.unshift(c);}n.sort((c,h)=>c.type==="registry:theme"?-1:1);let p={};n.forEach(c=>{p=L(p,c.tailwind??{});});let T={};n.forEach(c=>{T=L(T,c.cssVars??{});});let g={};n.forEach(c=>{g=L(g,c.css??{});});let A="";n.forEach(c=>{c.docs&&(A+=`${c.docs}
|
|
27
|
+
`);});let F={};n.forEach(c=>{F=L(F,c.envVars??{});});let D=he.parse({dependencies:L.all(n.map(c=>c.dependencies??[])),devDependencies:L.all(n.map(c=>c.devDependencies??[])),files:L.all(n.map(c=>c.files??[])),tailwind:p,cssVars:T,css:g,docs:A});return Object.keys(F).length>0&&(D.envVars=F),D}catch(r){return C(r),null}}async function Dt(e,t){let{registryNames:r}=await X([e],t),s=t.resolvedPaths?.cwd?await ie(t.resolvedPaths.cwd,t.style):t.style,i=r.map(n=>Re(R(n)?n:`styles/${s}/${n}.json`));return Array.from(new Set(i))}async function Nt(e,t){let[r,s]=await Promise.all([$t(e),Pe(t)]);if(!r)return null;let i={name:e,type:"registry:theme",tailwind:{config:{theme:{extend:{borderRadius:{lg:"var(--radius)",md:"calc(var(--radius) - 2px)",sm:"calc(var(--radius) - 4px)"},colors:{}}}}},cssVars:{theme:{},light:{radius:"0.5rem"},dark:{}}};return t.tailwind.cssVariables&&(i.tailwind.config.theme.extend.colors={...i.tailwind.config.theme.extend.colors,...Le(r.cssVars.dark??{})},i.cssVars={theme:{...r.cssVars.theme,...i.cssVars.theme},light:{...r.cssVars.light,...i.cssVars.light},dark:{...r.cssVars.dark,...i.cssVars.dark}},s==="v4"&&r.cssVarsV4&&(i.cssVars={theme:{...r.cssVarsV4.theme,...i.cssVars.theme},light:{radius:"0.625rem",...r.cssVarsV4.light},dark:{...r.cssVarsV4.dark}})),i}function Re(e){if(R(e)){let t=new URL(e);return t.pathname.match(/\/chat\/b\//)&&!t.pathname.endsWith("/json")&&(t.pathname=`${t.pathname}/json`),t.toString()}return `${Rt}/${e}`}function R(e){try{return new URL(e),!0}catch{return !1}}async function _t(e,t){let r=[],s=e.filter(i=>!$(i)&&!R(i));for(let i of s){let n=await Dt(i,t);r.push(...n);}return Array.from(new Set(r))}function ks(){return new Map([["registry:ui","ui"],["registry:lib","lib"],["registry:hook","hooks"],["registry:block","components"],["registry:component","components"]])}function Es(e){let t=new Map;return e.forEach(r=>{r.registryDependencies&&r.registryDependencies.forEach(s=>{t.set(s,r);});}),t}
|
|
28
|
+
|
|
29
|
+
export { Nt as $, Ct as A, ge as B, Ae as C, Fe as D, ee as E, Ve as F, Oe as G, I as H, Bt as I, te as J, de as K, me as L, ue as M, he as N, Ft as O, Vt as P, bs as Q, Ps as R, q as S, vs as T, $t as U, Kt as V, Ss as W, Cs as X, j as Y, Ts as Z, zt as _, w as a, R as aa, P as b, _t as ba, Ir as c, ks as ca, Lr as d, Es as da, Rr as e, Ar as f, ve as g, B as h, se as i, Fr as j, pt as k, gt as l, Vr as m, re as n, Y as o, yr as p, Pe as q, m as r, Ce as s, Me as t, Je as u, $ as v, Zt as w, C as x, rs as y, ke as z };
|
|
30
|
+
//# sourceMappingURL=out.js.map
|
|
31
|
+
//# sourceMappingURL=chunk-P4EM45ZN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/registry/schema.ts","../src/registry/api.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","fs","homedir","path","tmpdir","createMatchPath","resolveImport","importPath","config","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","rawConfigSchema","configSchema","workspaceConfigSchema","getRawConfig","configResult","componentPath","getWorkspaceConfig","resolvedAliases","key","isAliasKey","resolvedPath","packageRoot","findPackageRoot","result","commonRoot","findCommonRoot","relativePath","matchingPackageRoot","pkgPath","pkgDir","parts1","parts2","commonParts","i","getTargetStyleFromConfig","fallback","createConfig","partial","defaultConfig","logger","args","handleError","error","value","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","name","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","item","getItemTargetPath","override","parent","url","getRegistryUrl","fetchPromise","response","errorMessages","message","clearRegistryCache","resolveDependenciesRecursively","visited","items","registryNames","nested","registryResolveItemsTree","localFiles","urls","payload","allDependencies","localFile","dependencyItems","dependencyRegistryNames","allRegistryNames","uniqueRegistryNames","registryItems","resolveRegistryItems","registryPayload","registryGetTheme","a","b","tailwind","css","docs","envVars","resolveRegistryDependencies","registryDependencies","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","import { promises as fs } from \"fs\"\nimport { homedir } from \"os\"\nimport path from \"path\"\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 const response = await fetch(url, { agent })\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 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.`\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.`\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.`\n )\n }\n\n const result = await response.json()\n const message =\n result && typeof result === \"object\" && \"error\" in result\n ? result.error\n : response.statusText || errorMessages[response.status]\n throw new Error(\n `Failed to fetch from ${highlighter.info(url)}.\\n${message}`\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): Promise<{\n items: z.infer<typeof registryItemSchema>[]\n registryNames: string[]\n}> {\n const items: z.infer<typeof registryItemSchema>[] = []\n const registryNames: string[] = []\n\n for (const dep of dependencies) {\n // Avoid infinite recursion.\n if (visited.has(dep)) {\n continue\n }\n visited.add(dep)\n\n if (isUrl(dep) || isLocalFile(dep)) {\n const item = await getRegistryItem(dep, \"\")\n if (item) {\n items.push(item)\n if (item.registryDependencies) {\n const nested = await resolveDependenciesRecursively(\n item.registryDependencies,\n config,\n visited\n )\n items.push(...nested.items)\n registryNames.push(...nested.registryNames)\n }\n }\n } else {\n // Registry name - add it to the list\n registryNames.push(dep)\n\n // If we have config, we can also fetch the item to get its dependencies\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(dep, style)\n if (item && item.registryDependencies) {\n const nested = await resolveDependenciesRecursively(\n item.registryDependencies,\n config,\n visited\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, collecting their dependencies.\n const allDependencies: 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 allDependencies.push(...item.registryDependencies)\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 allDependencies.push(...item.registryDependencies)\n }\n }\n }\n\n // Recursively resolve all dependencies.\n const { items: dependencyItems, registryNames: dependencyRegistryNames } =\n await resolveDependenciesRecursively(allDependencies, config)\n\n payload.push(...dependencyItems)\n\n // Handle registry names using existing resolveRegistryItems logic.\n const allRegistryNames = [...registryNames, ...dependencyRegistryNames]\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, b) => {\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): Promise<string[]> {\n const { registryNames } = await resolveDependenciesRecursively([url], config)\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 // Filter out local files and URLs - these should be handled directly by getRegistryItem\n const registryNames = names.filter(\n (name) => !isLocalFile(name) && !isUrl(name)\n )\n\n for (const name of registryNames) {\n const itemRegistryDependencies = await resolveRegistryDependencies(\n name,\n config\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","import * as fs from \"fs/promises\"\nimport { tmpdir } from \"os\"\nimport * as path from \"path\"\nimport { registryItemSchema } from \"@/src/registry\"\nimport { configSchema } from \"@/src/utils/get-config\"\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 { 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 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 })\n .strict()\n\nexport type RawConfig = z.infer<typeof rawConfigSchema>\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\nexport type Config = z.infer<typeof configSchema>\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\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(cwd: string, config: RawConfig) {\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(cwd: string): Promise<RawConfig | 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 { FRAMEWORKS, Framework } from \"@/src/utils/frameworks\"\nimport {\n Config,\n RawConfig,\n getConfig,\n resolveConfigPaths,\n} 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: RawConfig = {\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.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"]}
|
|
@@ -209,6 +209,7 @@ declare const registryItemCssVarsSchema: z.ZodObject<{
|
|
|
209
209
|
dark?: Record<string, string> | undefined;
|
|
210
210
|
}>;
|
|
211
211
|
declare const registryItemCssSchema: z.ZodRecord<z.ZodString, z.ZodLazy<z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>>]>>>;
|
|
212
|
+
declare const registryItemEnvVarsSchema: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
212
213
|
declare const registryItemSchema: z.ZodObject<{
|
|
213
214
|
$schema: z.ZodOptional<z.ZodString>;
|
|
214
215
|
extends: z.ZodOptional<z.ZodString>;
|
|
@@ -292,6 +293,7 @@ declare const registryItemSchema: z.ZodObject<{
|
|
|
292
293
|
dark?: Record<string, string> | undefined;
|
|
293
294
|
}>>;
|
|
294
295
|
css: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodLazy<z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>>]>>>>;
|
|
296
|
+
envVars: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
295
297
|
meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
|
|
296
298
|
docs: z.ZodOptional<z.ZodString>;
|
|
297
299
|
categories: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
@@ -330,6 +332,7 @@ declare const registryItemSchema: z.ZodObject<{
|
|
|
330
332
|
light?: Record<string, string> | undefined;
|
|
331
333
|
dark?: Record<string, string> | undefined;
|
|
332
334
|
} | undefined;
|
|
335
|
+
envVars?: Record<string, string> | undefined;
|
|
333
336
|
meta?: Record<string, any> | undefined;
|
|
334
337
|
docs?: string | undefined;
|
|
335
338
|
categories?: string[] | undefined;
|
|
@@ -368,6 +371,7 @@ declare const registryItemSchema: z.ZodObject<{
|
|
|
368
371
|
light?: Record<string, string> | undefined;
|
|
369
372
|
dark?: Record<string, string> | undefined;
|
|
370
373
|
} | undefined;
|
|
374
|
+
envVars?: Record<string, string> | undefined;
|
|
371
375
|
meta?: Record<string, any> | undefined;
|
|
372
376
|
docs?: string | undefined;
|
|
373
377
|
categories?: string[] | undefined;
|
|
@@ -459,6 +463,7 @@ declare const registrySchema: z.ZodObject<{
|
|
|
459
463
|
dark?: Record<string, string> | undefined;
|
|
460
464
|
}>>;
|
|
461
465
|
css: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodLazy<z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>>]>>>>;
|
|
466
|
+
envVars: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
462
467
|
meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
|
|
463
468
|
docs: z.ZodOptional<z.ZodString>;
|
|
464
469
|
categories: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
@@ -497,6 +502,7 @@ declare const registrySchema: z.ZodObject<{
|
|
|
497
502
|
light?: Record<string, string> | undefined;
|
|
498
503
|
dark?: Record<string, string> | undefined;
|
|
499
504
|
} | undefined;
|
|
505
|
+
envVars?: Record<string, string> | undefined;
|
|
500
506
|
meta?: Record<string, any> | undefined;
|
|
501
507
|
docs?: string | undefined;
|
|
502
508
|
categories?: string[] | undefined;
|
|
@@ -535,6 +541,7 @@ declare const registrySchema: z.ZodObject<{
|
|
|
535
541
|
light?: Record<string, string> | undefined;
|
|
536
542
|
dark?: Record<string, string> | undefined;
|
|
537
543
|
} | undefined;
|
|
544
|
+
envVars?: Record<string, string> | undefined;
|
|
538
545
|
meta?: Record<string, any> | undefined;
|
|
539
546
|
docs?: string | undefined;
|
|
540
547
|
categories?: string[] | undefined;
|
|
@@ -577,6 +584,7 @@ declare const registrySchema: z.ZodObject<{
|
|
|
577
584
|
light?: Record<string, string> | undefined;
|
|
578
585
|
dark?: Record<string, string> | undefined;
|
|
579
586
|
} | undefined;
|
|
587
|
+
envVars?: Record<string, string> | undefined;
|
|
580
588
|
meta?: Record<string, any> | undefined;
|
|
581
589
|
docs?: string | undefined;
|
|
582
590
|
categories?: string[] | undefined;
|
|
@@ -619,6 +627,7 @@ declare const registrySchema: z.ZodObject<{
|
|
|
619
627
|
light?: Record<string, string> | undefined;
|
|
620
628
|
dark?: Record<string, string> | undefined;
|
|
621
629
|
} | undefined;
|
|
630
|
+
envVars?: Record<string, string> | undefined;
|
|
622
631
|
meta?: Record<string, any> | undefined;
|
|
623
632
|
docs?: string | undefined;
|
|
624
633
|
categories?: string[] | undefined;
|
|
@@ -708,6 +717,7 @@ declare const registryIndexSchema: z.ZodArray<z.ZodObject<{
|
|
|
708
717
|
dark?: Record<string, string> | undefined;
|
|
709
718
|
}>>;
|
|
710
719
|
css: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodLazy<z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>>]>>>>;
|
|
720
|
+
envVars: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
711
721
|
meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
|
|
712
722
|
docs: z.ZodOptional<z.ZodString>;
|
|
713
723
|
categories: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
@@ -746,6 +756,7 @@ declare const registryIndexSchema: z.ZodArray<z.ZodObject<{
|
|
|
746
756
|
light?: Record<string, string> | undefined;
|
|
747
757
|
dark?: Record<string, string> | undefined;
|
|
748
758
|
} | undefined;
|
|
759
|
+
envVars?: Record<string, string> | undefined;
|
|
749
760
|
meta?: Record<string, any> | undefined;
|
|
750
761
|
docs?: string | undefined;
|
|
751
762
|
categories?: string[] | undefined;
|
|
@@ -784,6 +795,7 @@ declare const registryIndexSchema: z.ZodArray<z.ZodObject<{
|
|
|
784
795
|
light?: Record<string, string> | undefined;
|
|
785
796
|
dark?: Record<string, string> | undefined;
|
|
786
797
|
} | undefined;
|
|
798
|
+
envVars?: Record<string, string> | undefined;
|
|
787
799
|
meta?: Record<string, any> | undefined;
|
|
788
800
|
docs?: string | undefined;
|
|
789
801
|
categories?: string[] | undefined;
|
|
@@ -956,10 +968,11 @@ declare const registryResolvedItemsTreeSchema: z.ZodObject<Pick<{
|
|
|
956
968
|
dark?: Record<string, string> | undefined;
|
|
957
969
|
}>>;
|
|
958
970
|
css: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodLazy<z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>>]>>>>;
|
|
971
|
+
envVars: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
959
972
|
meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
|
|
960
973
|
docs: z.ZodOptional<z.ZodString>;
|
|
961
974
|
categories: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
962
|
-
}, "tailwind" | "css" | "dependencies" | "devDependencies" | "files" | "cssVars" | "docs">, "strip", z.ZodTypeAny, {
|
|
975
|
+
}, "tailwind" | "css" | "dependencies" | "devDependencies" | "files" | "cssVars" | "envVars" | "docs">, "strip", z.ZodTypeAny, {
|
|
963
976
|
tailwind?: {
|
|
964
977
|
config?: {
|
|
965
978
|
content?: string[] | undefined;
|
|
@@ -986,6 +999,7 @@ declare const registryResolvedItemsTreeSchema: z.ZodObject<Pick<{
|
|
|
986
999
|
light?: Record<string, string> | undefined;
|
|
987
1000
|
dark?: Record<string, string> | undefined;
|
|
988
1001
|
} | undefined;
|
|
1002
|
+
envVars?: Record<string, string> | undefined;
|
|
989
1003
|
docs?: string | undefined;
|
|
990
1004
|
}, {
|
|
991
1005
|
tailwind?: {
|
|
@@ -1014,6 +1028,7 @@ declare const registryResolvedItemsTreeSchema: z.ZodObject<Pick<{
|
|
|
1014
1028
|
light?: Record<string, string> | undefined;
|
|
1015
1029
|
dark?: Record<string, string> | undefined;
|
|
1016
1030
|
} | undefined;
|
|
1031
|
+
envVars?: Record<string, string> | undefined;
|
|
1017
1032
|
docs?: string | undefined;
|
|
1018
1033
|
}>;
|
|
1019
1034
|
|
|
@@ -1068,6 +1083,7 @@ declare function getRegistryIndex(): Promise<{
|
|
|
1068
1083
|
light?: Record<string, string> | undefined;
|
|
1069
1084
|
dark?: Record<string, string> | undefined;
|
|
1070
1085
|
} | undefined;
|
|
1086
|
+
envVars?: Record<string, string> | undefined;
|
|
1071
1087
|
meta?: Record<string, any> | undefined;
|
|
1072
1088
|
docs?: string | undefined;
|
|
1073
1089
|
categories?: string[] | undefined;
|
|
@@ -1112,6 +1128,7 @@ declare function getRegistryItem(name: string, style: string): Promise<{
|
|
|
1112
1128
|
light?: Record<string, string> | undefined;
|
|
1113
1129
|
dark?: Record<string, string> | undefined;
|
|
1114
1130
|
} | undefined;
|
|
1131
|
+
envVars?: Record<string, string> | undefined;
|
|
1115
1132
|
meta?: Record<string, any> | undefined;
|
|
1116
1133
|
docs?: string | undefined;
|
|
1117
1134
|
categories?: string[] | undefined;
|
|
@@ -1185,6 +1202,7 @@ declare function resolveTree(index: z.infer<typeof registryIndexSchema>, names:
|
|
|
1185
1202
|
light?: Record<string, string> | undefined;
|
|
1186
1203
|
dark?: Record<string, string> | undefined;
|
|
1187
1204
|
} | undefined;
|
|
1205
|
+
envVars?: Record<string, string> | undefined;
|
|
1188
1206
|
meta?: Record<string, any> | undefined;
|
|
1189
1207
|
docs?: string | undefined;
|
|
1190
1208
|
categories?: string[] | undefined;
|
|
@@ -1224,6 +1242,7 @@ declare function fetchTree(style: string, tree: z.infer<typeof registryIndexSche
|
|
|
1224
1242
|
light?: Record<string, string> | undefined;
|
|
1225
1243
|
dark?: Record<string, string> | undefined;
|
|
1226
1244
|
} | undefined;
|
|
1245
|
+
envVars?: Record<string, string> | undefined;
|
|
1227
1246
|
meta?: Record<string, any> | undefined;
|
|
1228
1247
|
docs?: string | undefined;
|
|
1229
1248
|
categories?: string[] | undefined;
|
|
@@ -1260,6 +1279,7 @@ declare function registryResolveItemsTree(names: z.infer<typeof registryItemSche
|
|
|
1260
1279
|
light?: Record<string, string> | undefined;
|
|
1261
1280
|
dark?: Record<string, string> | undefined;
|
|
1262
1281
|
} | undefined;
|
|
1282
|
+
envVars?: Record<string, string> | undefined;
|
|
1263
1283
|
docs?: string | undefined;
|
|
1264
1284
|
} | null>;
|
|
1265
1285
|
declare function registryGetTheme(name: string, config: Config): Promise<{
|
|
@@ -1325,9 +1345,10 @@ declare function getRegistryParentMap(registryItems: z.infer<typeof registryItem
|
|
|
1325
1345
|
light?: Record<string, string> | undefined;
|
|
1326
1346
|
dark?: Record<string, string> | undefined;
|
|
1327
1347
|
} | undefined;
|
|
1348
|
+
envVars?: Record<string, string> | undefined;
|
|
1328
1349
|
meta?: Record<string, any> | undefined;
|
|
1329
1350
|
docs?: string | undefined;
|
|
1330
1351
|
categories?: string[] | undefined;
|
|
1331
1352
|
}>;
|
|
1332
1353
|
|
|
1333
|
-
export {
|
|
1354
|
+
export { registryIndexSchema as A, BASE_COLORS as B, stylesSchema as C, iconsSchema as D, registryBaseColorSchema as E, registryResolvedItemsTreeSchema as F, RegistryItem as R, getRegistryStyles as a, getRegistryIcons as b, getRegistryItem as c, getRegistryBaseColors as d, getRegistryBaseColor as e, fetchTree as f, getRegistryIndex as g, getItemTargetPath as h, fetchRegistry as i, clearRegistryCache as j, registryResolveItemsTree as k, registryGetTheme as l, isUrl as m, resolveRegistryItems as n, getRegistryTypeAliasMap as o, getRegistryParentMap as p, registryItemTypeSchema as q, resolveTree as r, registryItemFileSchema as s, registryItemTailwindSchema as t, registryItemCssVarsSchema as u, registryItemCssSchema as v, registryItemEnvVarsSchema as w, registryItemSchema as x, registrySchema as y, Registry as z };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
export { B as BASE_COLORS, j as clearRegistryCache, i as fetchRegistry, f as fetchTree, h as getItemTargetPath, e as getRegistryBaseColor, d as getRegistryBaseColors, b as getRegistryIcons, g as getRegistryIndex, c as getRegistryItem, p as getRegistryParentMap, a as getRegistryStyles, o as getRegistryTypeAliasMap, m as isUrl, l as registryGetTheme, k as registryResolveItemsTree, n as resolveRegistryItems, r as resolveTree } from './index-
|
|
2
|
+
export { B as BASE_COLORS, j as clearRegistryCache, i as fetchRegistry, f as fetchTree, h as getItemTargetPath, e as getRegistryBaseColor, d as getRegistryBaseColors, b as getRegistryIcons, g as getRegistryIndex, c as getRegistryItem, p as getRegistryParentMap, a as getRegistryStyles, o as getRegistryTypeAliasMap, m as isUrl, l as registryGetTheme, k as registryResolveItemsTree, n as resolveRegistryItems, r as resolveTree } from './index-8c784f6a.js';
|
|
3
3
|
import 'zod';
|