shadcn 2.6.2 → 2.6.4
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-26TTVK5I.js +29 -0
- package/dist/chunk-26TTVK5I.js.map +1 -0
- package/dist/{chunk-TDVR3XZC.js → chunk-63R22Q5C.js} +2 -2
- package/dist/index.js +47 -47
- package/dist/index.js.map +1 -1
- package/dist/mcp/index.js +2 -2
- package/dist/registry/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-TPOJ2QOW.js +0 -29
- package/dist/chunk-TPOJ2QOW.js.map +0 -1
- /package/dist/{chunk-TDVR3XZC.js.map → chunk-63R22Q5C.js.map} +0 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import w from 'path';
|
|
3
|
+
import K from 'fs-extra';
|
|
4
|
+
import S from 'fast-glob';
|
|
5
|
+
import { loadConfig, createMatchPath } from 'tsconfig-paths';
|
|
6
|
+
import { red, yellow, cyan, green } from 'kleur/colors';
|
|
7
|
+
import { cosmiconfig } from 'cosmiconfig';
|
|
8
|
+
import { promises } from 'fs';
|
|
9
|
+
import { tmpdir } from 'os';
|
|
10
|
+
import Re from 'ora';
|
|
11
|
+
import T from 'deepmerge';
|
|
12
|
+
import $e from 'stringify-object';
|
|
13
|
+
import { SyntaxKind, Project, ScriptKind, QuoteKind } from 'ts-morph';
|
|
14
|
+
import { HttpsProxyAgent } from 'https-proxy-agent';
|
|
15
|
+
import Ge from 'node-fetch';
|
|
16
|
+
|
|
17
|
+
var W=z.enum(["registry:lib","registry:block","registry:component","registry:ui","registry:hook","registry:page","registry:file","registry:theme","registry:style","registry:example","registry:internal"]),ae=z.discriminatedUnion("type",[z.object({path:z.string(),content:z.string().optional(),type:z.enum(["registry:file","registry:page"]),target:z.string()}),z.object({path:z.string(),content:z.string().optional(),type:W.exclude(["registry:file","registry:page"]),target:z.string().optional()})]),le=z.object({config:z.object({content:z.array(z.string()).optional(),theme:z.record(z.string(),z.any()).optional(),plugins:z.array(z.string()).optional()}).optional()}),R=z.object({theme:z.record(z.string(),z.string()).optional(),light:z.record(z.string(),z.string()).optional(),dark:z.record(z.string(),z.string()).optional()}),ce=z.record(z.string(),z.lazy(()=>z.union([z.string(),z.record(z.string(),z.union([z.string(),z.record(z.string(),z.string())]))]))),k=z.object({$schema:z.string().optional(),extends:z.string().optional(),name:z.string(),type:W,title:z.string().optional(),author:z.string().min(2).optional(),description:z.string().optional(),dependencies:z.array(z.string()).optional(),devDependencies:z.array(z.string()).optional(),registryDependencies:z.array(z.string()).optional(),files:z.array(ae).optional(),tailwind:le.optional(),cssVars:R.optional(),css:ce.optional(),meta:z.record(z.string(),z.any()).optional(),docs:z.string().optional(),categories:z.array(z.string()).optional()}),nt=z.object({name:z.string(),homepage:z.string(),items:z.array(k)}),V=z.array(k),M=z.array(z.object({name:z.string(),label:z.string()})),B=z.record(z.string(),z.record(z.string(),z.string())),G=z.object({inlineColors:z.object({light:z.record(z.string(),z.string()),dark:z.record(z.string(),z.string())}),cssVars:R,cssVarsV4:R.optional(),inlineColorsTemplate:z.string(),cssVarsTemplate:z.string()}),J=k.pick({dependencies:!0,devDependencies:!0,files:!0,tailwind:!0,cssVars:!0,css:!0,docs:!0});var y={"next-app":{name:"next-app",label:"Next.js",links:{installation:"https://ui.shadcn.com/docs/installation/next",tailwind:"https://tailwindcss.com/docs/guides/nextjs"}},"next-pages":{name:"next-pages",label:"Next.js",links:{installation:"https://ui.shadcn.com/docs/installation/next",tailwind:"https://tailwindcss.com/docs/guides/nextjs"}},remix:{name:"remix",label:"Remix",links:{installation:"https://ui.shadcn.com/docs/installation/remix",tailwind:"https://tailwindcss.com/docs/guides/remix"}},"react-router":{name:"react-router",label:"React Router",links:{installation:"https://ui.shadcn.com/docs/installation/react-router",tailwind:"https://tailwindcss.com/docs/installation/framework-guides/react-router"}},vite:{name:"vite",label:"Vite",links:{installation:"https://ui.shadcn.com/docs/installation/vite",tailwind:"https://tailwindcss.com/docs/guides/vite"}},astro:{name:"astro",label:"Astro",links:{installation:"https://ui.shadcn.com/docs/installation/astro",tailwind:"https://tailwindcss.com/docs/guides/astro"}},laravel:{name:"laravel",label:"Laravel",links:{installation:"https://ui.shadcn.com/docs/installation/laravel",tailwind:"https://tailwindcss.com/docs/guides/laravel"}},"tanstack-start":{name:"tanstack-start",label:"TanStack Start",links:{installation:"https://ui.shadcn.com/docs/installation/tanstack",tailwind:"https://tailwindcss.com/docs/installation/using-postcss"}},gatsby:{name:"gatsby",label:"Gatsby",links:{installation:"https://ui.shadcn.com/docs/installation/gatsby",tailwind:"https://tailwindcss.com/docs/guides/gatsby"}},manual:{name:"manual",label:"Manual",links:{installation:"https://ui.shadcn.com/docs/installation/manual",tailwind:"https://tailwindcss.com/docs/installation"}}};function O(e="",t=!0){let r=w.join(e,"package.json");return K.readJSONSync(r,{throws:t})}var j=["**/node_modules/**",".next","public","dist","build"];z.object({compilerOptions:z.object({paths:z.record(z.string().or(z.array(z.string())))})});async function L(e){let[t,r,i,s,o,l,g,f]=await Promise.all([S.glob("**/{next,vite,astro,app}.config.*|gatsby-config.*|composer.json|react-router.config.*",{cwd:e,deep:3,ignore:j}),K.pathExists(w.resolve(e,"src")),he(e),de(e),me(e),Y(e),ue(e),O(e,!1)]),h=await K.pathExists(w.resolve(e,`${r?"src/":""}app`)),c={framework:y.manual,isSrcDir:r,isRSC:!1,isTsx:i,tailwindConfigFile:s,tailwindCssFile:o,tailwindVersion:l,aliasPrefix:g};return t.find(d=>d.startsWith("next.config."))?.length?(c.framework=h?y["next-app"]:y["next-pages"],c.isRSC=h,c):t.find(d=>d.startsWith("astro.config."))?.length?(c.framework=y.astro,c):t.find(d=>d.startsWith("gatsby-config."))?.length?(c.framework=y.gatsby,c):t.find(d=>d.startsWith("composer.json"))?.length?(c.framework=y.laravel,c):Object.keys(f?.dependencies??{}).find(d=>d.startsWith("@remix-run/"))?(c.framework=y.remix,c):[...Object.keys(f?.dependencies??{}),...Object.keys(f?.devDependencies??{})].find(d=>d.startsWith("@tanstack/react-start"))?(c.framework=y["tanstack-start"],c):t.find(d=>d.startsWith("react-router.config."))?.length?(c.framework=y["react-router"],c):(t.find(d=>d.startsWith("vite.config."))?.length&&(c.framework=y.vite),c)}async function Y(e){let[t,r]=await Promise.all([O(e,!1),E(e)]);return r?.tailwind?.config===""?"v4":!t?.dependencies?.tailwindcss&&!t?.devDependencies?.tailwindcss?null:/^(?:\^|~)?3(?:\.\d+)*(?:-.*)?$/.test(t?.dependencies?.tailwindcss||t?.devDependencies?.tailwindcss||"")?"v3":"v4"}async function me(e){let[t,r]=await Promise.all([S.glob(["**/*.css","**/*.scss"],{cwd:e,deep:5,ignore:j}),Y(e)]);if(!t.length)return null;for(let s of t){let o=await K.readFile(w.resolve(e,s),"utf8");if(o.includes('@import "tailwindcss"')||o.includes("@import 'tailwindcss'")||o.includes("@tailwind base"))return s}return null}async function de(e){let t=await S.glob("tailwind.config.*",{cwd:e,deep:3,ignore:j});return t.length?t[0]:null}async function ue(e){let t=await loadConfig(e);if(t?.resultType==="failed"||!Object.entries(t?.paths).length)return null;for(let[r,i]of Object.entries(t.paths))if(i.includes("./*")||i.includes("./src/*")||i.includes("./app/*")||i.includes("./resources/js/*"))return r.replace(/\/\*$/,"")??null;return Object.keys(t?.paths)?.[0].replace(/\/\*$/,"")??null}async function he(e){return (await S.glob("tsconfig.*",{cwd:e,deep:1,ignore:j})).length>0}async function Ct(e,t=null){let[r,i]=await Promise.all([E(e),t?Promise.resolve(t):L(e)]);if(r)return r;if(!i||!i.tailwindCssFile||i.tailwindVersion==="v3"&&!i.tailwindConfigFile)return null;let s={$schema:"https://ui.shadcn.com/schema.json",rsc:i.isRSC,tsx:i.isTsx,style:"new-york",tailwind:{config:i.tailwindConfigFile??"",baseColor:"zinc",css:i.tailwindCssFile,cssVariables:!0,prefix:""},iconLibrary:"lucide",aliases:{components:`${i.aliasPrefix}/components`,ui:`${i.aliasPrefix}/components/ui`,hooks:`${i.aliasPrefix}/hooks`,lib:`${i.aliasPrefix}/lib`,utils:`${i.aliasPrefix}/lib/utils`}};return await F(e,s)}async function H(e){if(!e.resolvedPaths?.cwd)return "v3";let t=await L(e.resolvedPaths.cwd);return t?.tailwindVersion?t.tailwindVersion:null}var u={error:red,warn:yellow,info:cyan,success:green};async function x(e,t){return createMatchPath(t.absoluteBaseUrl,t.paths)(e,void 0,()=>!0,[".ts",".tsx",".jsx",".js",".css"])}var Ft="@/components",zt="@/lib/utils",Dt="app/globals.css",_t="tailwind.config.js";var ve=cosmiconfig("components",{searchPlaces:["components.json"]}),Q=z.object({$schema:z.string().optional(),style:z.string(),rsc:z.coerce.boolean().default(!1),tsx:z.coerce.boolean().default(!0),tailwind:z.object({config:z.string().optional(),css:z.string(),baseColor:z.string(),cssVariables:z.boolean().default(!0),prefix:z.string().default("").optional()}),aliases:z.object({components:z.string(),utils:z.string(),ui:z.string().optional(),lib:z.string().optional(),hooks:z.string().optional()}),iconLibrary:z.string().optional()}).strict(),Z=Q.extend({resolvedPaths:z.object({cwd:z.string(),tailwindConfig:z.string(),tailwindCss:z.string(),utils:z.string(),components:z.string(),lib:z.string(),hooks:z.string(),ui:z.string()})}),Ee=z.record(Z);async function E(e){let t=await Se(e);return t?(t.iconLibrary||(t.iconLibrary=t.style==="new-york"?"radix":"lucide"),await F(e,t)):null}async function F(e,t){let r=await loadConfig(e);if(r.resultType==="failed")throw new Error(`Failed to load ${t.tsx?"tsconfig":"jsconfig"}.json. ${r.message??""}`.trim());return Z.parse({...t,resolvedPaths:{cwd:e,tailwindConfig:t.tailwind.config?w.resolve(e,t.tailwind.config):"",tailwindCss:w.resolve(e,t.tailwind.css),utils:await x(t.aliases.utils,r),components:await x(t.aliases.components,r),ui:t.aliases.ui?await x(t.aliases.ui,r):w.resolve(await x(t.aliases.components,r)??e,"ui"),lib:t.aliases.lib?await x(t.aliases.lib,r):w.resolve(await x(t.aliases.utils,r)??e,".."),hooks:t.aliases.hooks?await x(t.aliases.hooks,r):w.resolve(await x(t.aliases.components,r)??e,"..","hooks")}})}async function Se(e){try{let t=await ve.search(e);return t?Q.parse(t.config):null}catch{let r=`${e}/components.json`;throw new Error(`Invalid configuration found in ${u.info(r)}.`)}}async function Ut(e){let t={};for(let i of Object.keys(e.aliases)){if(!Le(i,e))continue;let s=e.resolvedPaths[i],o=await je(e.resolvedPaths.cwd,s);if(!o){t[i]=e;continue}t[i]=await E(o);}let r=Ee.safeParse(t);return r.success?r.data:null}async function je(e,t){let r=Ie(e,t),i=w.relative(r,t),o=(await S.glob("**/package.json",{cwd:r,deep:3,ignore:["**/node_modules/**","**/dist/**","**/build/**","**/public/**"]})).map(l=>w.dirname(l)).find(l=>i.startsWith(l));return o?w.join(r,o):null}function Le(e,t){return Object.keys(t.resolvedPaths).filter(r=>r!=="utils").includes(e)}function Ie(e,t){let r=e.split(w.sep),i=t.split(w.sep),s=[];for(let o=0;o<Math.min(r.length,i.length)&&r[o]===i[o];o++)s.push(r[o]);return s.join(w.sep)}async function q(e,t){return (await L(e))?.tailwindVersion==="v4"?"new-york-v4":t}var m={error(...e){console.log(u.error(e.join(" ")));},warn(...e){console.log(u.warn(e.join(" ")));},info(...e){console.log(u.info(e.join(" ")));},success(...e){console.log(u.success(e.join(" ")));},log(...e){console.log(e.join(" "));},break(){console.log("");}};function b(e){if(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(`- ${u.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 X(e,t){return Re({text:e,isSilent:t?.silent})}async function cr(e,t,r){if(!e||(r={silent:!1,tailwindVersion:"v3",...r},r.tailwindVersion==="v4"))return;let i=w.relative(t.resolvedPaths.cwd,t.resolvedPaths.tailwindConfig),s=X(`Updating ${u.info(i)}`,{silent:r.silent}).start(),o=await promises.readFile(t.resolvedPaths.tailwindConfig,"utf8"),l=await ze(o,e,t);await promises.writeFile(t.resolvedPaths.tailwindConfig,l,"utf8"),s?.succeed();}async function ze(e,t,r){let i=await te(e,r),s=i.getDescendantsOfKind(SyntaxKind.ObjectLiteralExpression).find(l=>l.getProperties().some(g=>g.isKind(SyntaxKind.PropertyAssignment)&&g.getName()==="content"));if(!s)return e;let o=Ne(s);return De(s,{name:"darkMode",value:"class"},{quoteChar:o}),t.plugins?.forEach(l=>{Ue(s,l);}),t.theme&&await _e(s,t.theme),i.getFullText()}function De(e,t,{quoteChar:r}){let i=e.getProperty("darkMode");if(!i){let s={name:t.name,initializer:`[${r}${t.value}${r}]`};return t.name==="darkMode"?(e.insertPropertyAssignment(0,s),e):(e.addPropertyAssignment(s),e)}if(i.isKind(SyntaxKind.PropertyAssignment)){let s=i.getInitializer(),o=`${r}${t.value}${r}`;if(s?.isKind(SyntaxKind.StringLiteral)){let l=s.getText();return s.replaceWithText(`[${l}, ${o}]`),e}if(s?.isKind(SyntaxKind.ArrayLiteralExpression)){if(s.getElements().map(l=>l.getText()).includes(o))return e;s.addElement(o);}return e}return e}async function _e(e,t){e.getProperty("theme")||e.addPropertyAssignment({name:"theme",initializer:"{}"}),D(e);let i=(e.getPropertyOrThrow("theme")?.asKindOrThrow(SyntaxKind.PropertyAssignment)).getInitializer();if(i?.isKind(SyntaxKind.ObjectLiteralExpression)){let s=i.getText(),o=await We(s),l=T(o,t,{arrayMerge:(f,h)=>h}),g=$e(l).replace(/\'\.\.\.(.*)\'/g,"...$1").replace(/\'\"/g,"'").replace(/\"\'/g,"'").replace(/\'\[/g,"[").replace(/\]\'/g,"]").replace(/\'\\\'/g,"'").replace(/\\\'/g,"'").replace(/\\\'\'/g,"'").replace(/\'\'/g,"'");i.replaceWithText(g);}_(e);}function Ue(e,t){let r=e.getProperty("plugins");if(!r)return e.addPropertyAssignment({name:"plugins",initializer:`[${t}]`}),e;if(r.isKind(SyntaxKind.PropertyAssignment)){let i=r.getInitializer();if(i?.isKind(SyntaxKind.ArrayLiteralExpression)){if(i.getElements().map(s=>s.getText().replace(/["']/g,"")).includes(t.replace(/["']/g,"")))return e;i.addElement(t);}return e}return e}async function te(e,t){let r=await promises.mkdtemp(w.join(tmpdir(),"shadcn-")),i=t?.resolvedPaths?.tailwindConfig||"tailwind.config.ts",s=w.join(r,`shadcn-${w.basename(i)}`);return new Project({compilerOptions:{}}).createSourceFile(s,e,{scriptKind:w.extname(i)===".ts"?ScriptKind.TS:ScriptKind.JS})}function Ne(e){return e.getFirstDescendantByKind(SyntaxKind.StringLiteral)?.getQuoteKind()===QuoteKind.Single?"'":'"'}function D(e){let t=e.getProperties();for(let r=0;r<t.length;r++){let i=t[r];if(i.isKind(SyntaxKind.SpreadAssignment)){let s=i.asKindOrThrow(SyntaxKind.SpreadAssignment),o=s.getExpression().getText();e.insertPropertyAssignment(r,{name:`"___${o.replace(/^\.\.\./,"")}"`,initializer:`"...${o.replace(/^\.\.\./,"")}"`}),s.remove();}else if(i.isKind(SyntaxKind.PropertyAssignment)){let o=i.asKindOrThrow(SyntaxKind.PropertyAssignment).getInitializer();o&&o.isKind(SyntaxKind.ObjectLiteralExpression)?D(o.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)):o&&o.isKind(SyntaxKind.ArrayLiteralExpression)&&re(o.asKindOrThrow(SyntaxKind.ArrayLiteralExpression));}}}function re(e){let t=e.getElements();for(let r=0;r<t.length;r++){let i=t[r];if(i.isKind(SyntaxKind.ObjectLiteralExpression))D(i.asKindOrThrow(SyntaxKind.ObjectLiteralExpression));else if(i.isKind(SyntaxKind.ArrayLiteralExpression))re(i.asKindOrThrow(SyntaxKind.ArrayLiteralExpression));else if(i.isKind(SyntaxKind.SpreadElement)){let s=i.getText();e.removeElement(r),e.insertElement(r,`"${s}"`);}}}function _(e){let t=e.getProperties();for(let r=0;r<t.length;r++){let i=t[r];if(i.isKind(SyntaxKind.PropertyAssignment)){let s=i,o=s.getInitializer();if(o&&o.isKind(SyntaxKind.StringLiteral)){let l=o.asKindOrThrow(SyntaxKind.StringLiteral).getLiteralValue();l.startsWith("...")&&(e.insertSpreadAssignment(r,{expression:l.slice(3)}),s.remove());}else o?.isKind(SyntaxKind.ObjectLiteralExpression)?_(o):o&&o.isKind(SyntaxKind.ArrayLiteralExpression)&&ie(o.asKindOrThrow(SyntaxKind.ArrayLiteralExpression));}}}function ie(e){let t=e.getElements();for(let r=0;r<t.length;r++){let i=t[r];if(i.isKind(SyntaxKind.ObjectLiteralExpression))_(i.asKindOrThrow(SyntaxKind.ObjectLiteralExpression));else if(i.isKind(SyntaxKind.ArrayLiteralExpression))ie(i.asKindOrThrow(SyntaxKind.ArrayLiteralExpression));else if(i.isKind(SyntaxKind.StringLiteral)){let s=i.getText(),o=/(?:^['"])(\.\.\..*)(?:['"]$)/g;o.test(s)&&(e.removeElement(r),e.insertElement(r,s.replace(o,"$1")));}}}async function We(e){let r=(await te(`const theme = ${e}`,null)).getStatements()[0];if(r?.getKind()===SyntaxKind.VariableStatement){let s=(r.getDeclarationList()?.getDeclarations()[0]).getInitializer();if(s?.isKind(SyntaxKind.ObjectLiteralExpression))return await I(s)}throw new Error("Invalid input: not an object literal")}function I(e){let t={};for(let r of e.getProperties())if(r.isKind(SyntaxKind.PropertyAssignment)){let i=r.getName().replace(/\'/g,"");r.getInitializer()?.isKind(SyntaxKind.ObjectLiteralExpression)?t[i]=I(r.getInitializer()):r.getInitializer()?.isKind(SyntaxKind.ArrayLiteralExpression)?t[i]=se(r.getInitializer()):t[i]=U(r.getInitializer());}return t}function se(e){let t=[];for(let r of e.getElements())r.isKind(SyntaxKind.ObjectLiteralExpression)?t.push(I(r.asKindOrThrow(SyntaxKind.ObjectLiteralExpression))):r.isKind(SyntaxKind.ArrayLiteralExpression)?t.push(se(r.asKindOrThrow(SyntaxKind.ArrayLiteralExpression))):t.push(U(r));return t}function U(e){switch(e.getKind()){case SyntaxKind.StringLiteral:return e.getText();case SyntaxKind.NumericLiteral:return Number(e.getText());case SyntaxKind.TrueKeyword:return !0;case SyntaxKind.FalseKeyword:return !1;case SyntaxKind.NullKeyword:return null;case SyntaxKind.ArrayLiteralExpression:return e.getElements().map(U);case SyntaxKind.ObjectLiteralExpression:return I(e);default:return e.getText()}}function ne(e){let t={};for(let r of Object.keys(e)){let i=r.split("-"),s=i[0],o=i.slice(1).join("-");o===""?typeof t[s]=="object"?t[s].DEFAULT=`hsl(var(--${r}))`:t[s]=`hsl(var(--${r}))`:(typeof t[s]!="object"&&(t[s]={DEFAULT:`hsl(var(--${s}))`}),t[s][o]=`hsl(var(--${r}))`);}for(let[r,i]of Object.entries(t))typeof i=="object"&&i.DEFAULT===`hsl(var(--${r}))`&&!(r in e)&&delete i.DEFAULT;return t}var Ye=process.env.REGISTRY_URL??"https://ui.shadcn.com/r",He=process.env.https_proxy?new HttpsProxyAgent(process.env.https_proxy):void 0,A=new Map,Qe=[{name:"neutral",label:"Neutral"},{name:"gray",label:"Gray"},{name:"zinc",label:"Zinc"},{name:"stone",label:"Stone"},{name:"slate",label:"Slate"}];async function Ze(){try{let[e]=await P(["index.json"]);return V.parse(e)}catch(e){m.error(`
|
|
18
|
+
`),b(e);}}async function Tr(){try{let[e]=await P(["styles/index.json"]);return M.parse(e)}catch(e){return m.error(`
|
|
19
|
+
`),b(e),[]}}async function vr(){try{let[e]=await P(["icons/index.json"]);return B.parse(e)}catch(e){return b(e),{}}}async function Er(e,t){try{let[r]=await P([N(e)?e:`styles/${t}/${e}.json`]);return k.parse(r)}catch(r){return m.break(),b(r),null}}async function Sr(){return Qe}async function qe(e){try{let[t]=await P([`colors/${e}.json`]);return G.parse(t)}catch(t){b(t);}}async function Xe(e,t){let r=[];for(let i of t){let s=e.find(o=>o.name===i);if(s&&(r.push(s),s.registryDependencies)){let o=await Xe(e,s.registryDependencies);r.push(...o);}}return r.filter((i,s,o)=>o.findIndex(l=>l.name===i.name)===s)}async function jr(e,t){try{let r=t.map(s=>`styles/${e}/${s.name}.json`),i=await P(r);return V.parse(i)}catch(r){b(r);}}async function Lr(e,t,r){if(r)return r;if(t.type==="registry:ui")return e.resolvedPaths.ui??e.resolvedPaths.components;let[i,s]=t.type?.split(":")??[];return i in e.resolvedPaths?w.join(e.resolvedPaths[i],s):null}async function P(e,t={}){t={useCache:!0,...t};try{return await Promise.all(e.map(async i=>{let s=oe(i);if(t.useCache&&A.has(s))return A.get(s);let o=(async()=>{let l=await Ge(s,{agent:He});if(!l.ok){let g={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 ${u.info(s)}.
|
|
20
|
+
If this is a remote registry, you may need to authenticate.`);if(l.status===404)throw new Error(`The component at ${u.info(s)} was not found.
|
|
21
|
+
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 ${u.info(s)}.
|
|
22
|
+
If this is a remote registry, you may need to authenticate or a token.`);let f=await l.json(),h=f&&typeof f=="object"&&"error"in f?f.error:l.statusText||g[l.status];throw new Error(`Failed to fetch from ${u.info(s)}.
|
|
23
|
+
${h}`)}return l.json()})();return t.useCache&&A.set(s,o),o}))}catch(r){return m.error(`
|
|
24
|
+
`),b(r),[]}}function Ir(){A.clear();}async function et(e,t){try{if(!await Ze())return null;e.includes("index")&&e.unshift("index");let i=await it(e,t),s=await P(i),o=z.array(k).parse(s);if(!o)return null;if(e.includes("index")&&t.tailwind.baseColor){let c=await rt(t.tailwind.baseColor,t);c&&o.unshift(c);}o.sort((c,d)=>c.type==="registry:theme"?-1:1);let l={};o.forEach(c=>{l=T(l,c.tailwind??{});});let g={};o.forEach(c=>{g=T(g,c.cssVars??{});});let f={};o.forEach(c=>{f=T(f,c.css??{});});let h="";return o.forEach(c=>{c.docs&&(h+=`${c.docs}
|
|
25
|
+
`);}),J.parse({dependencies:T.all(o.map(c=>c.dependencies??[])),devDependencies:T.all(o.map(c=>c.devDependencies??[])),files:T.all(o.map(c=>c.files??[])),tailwind:l,cssVars:g,css:f,docs:h})}catch(r){return b(r),null}}async function tt(e,t){let r=new Set,i=[],s=t.resolvedPaths?.cwd?await q(t.resolvedPaths.cwd,t.style):t.style;async function o(l){let g=oe(N(l)?l:`styles/${s}/${l}.json`);if(!r.has(g)){r.add(g);try{let[f]=await P([g]),h=k.parse(f);if(i.push(g),h.registryDependencies)for(let c of h.registryDependencies)await o(c);}catch(f){console.error(`Error fetching or parsing registry item at ${l}:`,f);}}}return await o(e),Array.from(new Set(i))}async function rt(e,t){let[r,i]=await Promise.all([qe(e),H(t)]);if(!r)return null;let s={name:e,type:"registry:theme",tailwind:{config:{theme:{extend:{borderRadius:{lg:"var(--radius)",md:"calc(var(--radius) - 2px)",sm:"calc(var(--radius) - 4px)"},colors:{}}}}},cssVars:{theme:{},light:{radius:"0.5rem"},dark:{}}};return t.tailwind.cssVariables&&(s.tailwind.config.theme.extend.colors={...s.tailwind.config.theme.extend.colors,...ne(r.cssVars.dark??{})},s.cssVars={theme:{...r.cssVars.theme,...s.cssVars.theme},light:{...r.cssVars.light,...s.cssVars.light},dark:{...r.cssVars.dark,...s.cssVars.dark}},i==="v4"&&r.cssVarsV4&&(s.cssVars={theme:{...r.cssVarsV4.theme,...s.cssVars.theme},light:{radius:"0.625rem",...r.cssVarsV4.light},dark:{...r.cssVarsV4.dark}})),s}function oe(e){if(N(e)){let t=new URL(e);return t.pathname.match(/\/chat\/b\//)&&!t.pathname.endsWith("/json")&&(t.pathname=`${t.pathname}/json`),t.toString()}return `${Ye}/${e}`}function N(e){try{return new URL(e),!0}catch{return !1}}async function it(e,t){let r=[];for(let i of e){let s=await tt(i,t);r.push(...s);}return Array.from(new Set(r))}function Ar(){return new Map([["registry:ui","ui"],["registry:lib","lib"],["registry:hook","hooks"],["registry:block","components"],["registry:component","components"]])}function Rr(e){let t=new Map;return e.forEach(r=>{r.registryDependencies&&r.registryDependencies.forEach(i=>{t.set(i,r);});}),t}
|
|
26
|
+
|
|
27
|
+
export { ce as A, k as B, nt as C, V as D, M as E, B as F, G, J as H, Qe as I, Ze as J, Tr as K, vr as L, Er as M, Sr as N, qe as O, Xe as P, jr as Q, Lr as R, P as S, Ir as T, et as U, rt as V, N as W, it as X, Ar as Y, Rr as Z, u as a, x as b, Ft as c, zt as d, Dt as e, _t as f, Q as g, E as h, F as i, Ut as j, je as k, Ie as l, O as m, L as n, Ct as o, H as p, m as q, X as r, b as s, cr as t, te as u, Ne as v, W as w, ae as x, le as y, R as z };
|
|
28
|
+
//# sourceMappingURL=out.js.map
|
|
29
|
+
//# sourceMappingURL=chunk-26TTVK5I.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/registry/schema.ts","../src/registry/api.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/resolve-import.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","registryItemSchema","registrySchema","registryIndexSchema","stylesSchema","iconsSchema","registryBaseColorSchema","registryResolvedItemsTreeSchema","path","FRAMEWORKS","fs","getPackageInfo","cwd","shouldThrow","packageJsonPath","fg","loadConfig","PROJECT_SHARED_IGNORE","TS_CONFIG_SCHEMA","getProjectInfo","configFiles","isSrcDir","isTsx","tailwindConfigFile","tailwindCssFile","tailwindVersion","aliasPrefix","packageJson","isTypeScriptProject","getTailwindConfigFile","getTailwindCssFile","getTailwindVersion","getTsConfigAliasPrefix","isUsingAppDir","type","file","dep","packageInfo","config","getConfig","files","needle","contents","tsConfig","alias","paths","getProjectConfig","defaultProjectInfo","existingConfig","projectInfo","resolveConfigPaths","getProjectTailwindVersionFromConfig","cyan","green","red","yellow","highlighter","createMatchPath","resolveImport","importPath","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","logger","args","handleError","error","value","tmpdir","ora","spinner","text","options","deepmerge","objectToString","Project","QuoteKind","ScriptKind","SyntaxKind","updateTailwindConfig","tailwindConfig","tailwindFileRelativePath","tailwindSpinner","raw","output","transformTailwindConfig","input","sourceFile","_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","dir","tempFile","obj","properties","prop","spreadAssignment","spreadText","nestSpreadElements","arr","elements","j","propAssignment","unnsetSpreadElements","spreadTest","objectLiteralString","statement","parseObjectLiteralExpression","name","parseArrayLiteralExpression","parseValue","buildTailwindThemeColorsFromCssVars","cssVars","parts","colorName","subType","HttpsProxyAgent","fetch","REGISTRY_URL","agent","registryCache","BASE_COLORS","getRegistryIndex","fetchRegistry","getRegistryStyles","getRegistryIcons","getRegistryItem","style","isUrl","getRegistryBaseColors","getRegistryBaseColor","baseColor","resolveTree","index","names","tree","entry","dependencies","component","self","c","fetchTree","item","getItemTargetPath","override","parent","url","getRegistryUrl","fetchPromise","response","errorMessages","message","clearRegistryCache","registryResolveItemsTree","registryItems","resolveRegistryItems","payload","registryGetTheme","a","b","tailwind","css","docs","resolveRegistryDependencies","visited","resolveDependencies","itemUrl","dependency","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\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 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 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 docs: true,\n})\n","import path from \"path\"\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 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\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\nexport async function registryResolveItemsTree(\n names: z.infer<typeof registryItemSchema>[\"name\"][],\n config: Config\n) {\n try {\n const index = await getRegistryIndex()\n if (!index) {\n return null\n }\n\n // If we're resolving the index, we want it to go first.\n if (names.includes(\"index\")) {\n names.unshift(\"index\")\n }\n\n let registryItems = await resolveRegistryItems(names, config)\n let result = await fetchRegistry(registryItems)\n const payload = z.array(registryItemSchema).parse(result)\n\n if (!payload) {\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 (names.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 return 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 } 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 visited = new Set<string>()\n const payload: string[] = []\n\n const style = config.resolvedPaths?.cwd\n ? await getTargetStyleFromConfig(config.resolvedPaths.cwd, config.style)\n : config.style\n\n async function resolveDependencies(itemUrl: string) {\n const url = getRegistryUrl(\n isUrl(itemUrl) ? itemUrl : `styles/${style}/${itemUrl}.json`\n )\n\n if (visited.has(url)) {\n return\n }\n\n visited.add(url)\n\n try {\n const [result] = await fetchRegistry([url])\n const item = registryItemSchema.parse(result)\n payload.push(url)\n\n if (item.registryDependencies) {\n for (const dependency of item.registryDependencies) {\n await resolveDependencies(dependency)\n }\n }\n } catch (error) {\n console.error(\n `Error fetching or parsing registry item at ${itemUrl}:`,\n error\n )\n }\n }\n\n await resolveDependencies(url)\n return Array.from(new Set(payload))\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 for (const name of names) {\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 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","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 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 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 { 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 { 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 unnsetSpreadElements(\n initializer.asKindOrThrow(SyntaxKind.ArrayLiteralExpression)\n )\n }\n }\n }\n}\n\nexport function unnsetSpreadElements(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 unnsetSpreadElements(\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"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { M, S, C } from './chunk-
|
|
1
|
+
import { M, S, C } from './chunk-26TTVK5I.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';
|
|
@@ -34,4 +34,4 @@ var p=new Server({name:"shadcn",version:"0.0.1"},{capabilities:{resources:{},too
|
|
|
34
34
|
|
|
35
35
|
export { p as a };
|
|
36
36
|
//# sourceMappingURL=out.js.map
|
|
37
|
-
//# sourceMappingURL=chunk-
|
|
37
|
+
//# sourceMappingURL=chunk-63R22Q5C.js.map
|