hghcn 3.6.21 → 3.6.23

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/index.js CHANGED
@@ -1,62 +1,66 @@
1
1
  #!/usr/bin/env node
2
- import {b,a as a$1}from'./chunk-2NUTTJQY.js';import {a,J,v,M,S,C,p,Q as Q$1,K,q,r,I,x,c as c$1,V,D as D$1,F as F$1,ca,H,da,$,Z,aa,E,G,L,ea,b as b$1,ba,s,X,w,o as o$1,O as O$1,i,P,y,u,N,t,z as z$2,B,A}from'./chunk-XYXOKYQL.js';export{$ as fetchTree,aa as getItemTargetPath,da as getPreset,ca as getPresets,U as getRegistriesConfig,ba as getRegistriesIndex,R as getRegistry,Z as getRegistryBaseColor,Y as getRegistryBaseColors,X as getRegistryIcons,S as getRegistryItems,W as getRegistryStyles,V as getShadcnRegistryIndex,T as resolveRegistryItems,_ as resolveTree}from'./chunk-XYXOKYQL.js';import {c,o,n}from'./chunk-WKG3W635.js';import'./chunk-PMFK2ZSQ.js';import'./chunk-BFNVF2P5.js';import*as D from'path';import D__default,{join}from'path';import {execa}from'execa';import Q from'fs-extra';import Ce from'prompts';import We,{z as z$1}from'zod';import {existsSync,promises}from'fs';import {Command}from'commander';import Rr from'deepmerge';import x$1 from'postcss';import jr from'postcss/lib/at-rule';import {Project,ScriptKind,SyntaxKind,VariableDeclarationKind}from'ts-morph';import*as _ from'fs/promises';import _e from'dedent';import zt from'open';import {diffLines}from'diff';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {randomBytes}from'crypto';import {tmpdir}from'os';import Ji from'fast-glob';var yt={next:"next","next-monorepo":"next-monorepo",vite:"vite",start:"start"};async function T(t=process.cwd()){try{let{config:e}=await import('@dotenvx/dotenvx'),r=[".env.local",".env.development.local",".env.development",".env"];for(let i of r){let n=join(t,i);existsSync(n)&&e({path:n,overload:!1,quiet:!0});}}catch(e){C.warn("Failed to load env files:",e);}}var Fe=".bak";function wt(t){if(!Q.existsSync(t))return null;let e=`${t}${Fe}`;try{return Q.renameSync(t,e),e}catch(r){return console.error(`Failed to create backup of ${t}: ${r}`),null}}function bt(t){let e=`${t}${Fe}`;if(!Q.existsSync(e))return false;try{return Q.renameSync(e,t),!0}catch(r){return console.error(`Warning: Could not restore backup file ${e}: ${r}`),false}}function Oe(t){let e=`${t}${Fe}`;if(!Q.existsSync(e))return false;try{return Q.unlinkSync(e),!0}catch{return false}}async function xt(t,e){let r=new Set,i$1=new Set,n=[...t];for(;n.length>0;){let o=n.shift();if(i$1.has(o))continue;i$1.add(o);let{registry:a}=o$1(o);a&&!b$1[a]&&r.add(a);try{let[s]=await O$1([o],e,{useCache:!0});if(s?.registryDependencies)for(let c of s.registryDependencies){let{registry:m}=o$1(c);m&&!b$1[m]&&r.add(m),i$1.has(c)||n.push(c);}}catch(s){if(s instanceof i){let{registry:c}=o$1(o);c&&!b$1[c]&&r.add(c);continue}continue}}return Array.from(r)}async function F(t,e,r={}){r={silent:false,writeFile:true,...r};let n=(await xt(t,e)).filter(m=>!e.registries?.[m]&&!Object.keys(b$1).includes(m));if(n.length===0)return {config:e,newRegistries:[]};let o=await ba({useCache:process.env.NODE_ENV!=="development"});if(!o)return {config:e,newRegistries:[]};let a={};for(let m of n)o[m]&&(a[m]=o[m]);if(Object.keys(a).length===0)return {config:e,newRegistries:[]};let s=Object.fromEntries(Object.entries(e.registries||{}).filter(([m])=>!Object.keys(b$1).includes(m))),c$1={...e,registries:{...s,...a}};if(r.writeFile){let{resolvedPaths:m,...l}=c$1,f=D$1("Updating components.json.",{silent:r.silent}).start(),d=c.parse(l);await Q.writeFile(D__default.resolve(e.resolvedPaths.cwd,"components.json"),JSON.stringify(d,null,2)+`
3
- `,"utf-8"),f.succeed();}return {config:c$1,newRegistries:Object.keys(a)}}process.on("exit",t=>{let e=D__default.resolve(process.cwd(),"components.json");return t===0?Oe(e):bt(e)});var Ae=z$1.object({cwd:z$1.string(),name:z$1.string().optional(),components:z$1.array(z$1.string()).optional(),yes:z$1.boolean(),defaults:z$1.boolean(),force:z$1.boolean(),silent:z$1.boolean(),isNewProject:z$1.boolean(),srcDir:z$1.boolean().optional(),cssVariables:z$1.boolean(),template:z$1.string().optional().refine(t=>t?yt[t]:true,{message:"Invalid template. Please use 'next', 'vite', 'start' or 'next-monorepo'."}),baseColor:z$1.string().optional().refine(t=>t?a.find(e=>e.name===t):true,{message:`Invalid base color. Please use '${a.map(t=>t.name).join("', '")}'`}),baseStyle:z$1.boolean(),registryBaseConfig:c.deepPartial().optional()}),St=new Command().name("init").description("initialize your project and install dependencies").argument("[components...]","names, url or local path to component").option("-t, --template <template>","the template to use. (next, start, vite, next-monorepo)").option("-b, --base-color <base-color>","the base color to use. (neutral, gray, zinc, stone, slate)",void 0).option("-y, --yes","skip confirmation prompt.",true).option("-d, --defaults,","use default configuration.",false).option("-f, --force","force overwrite of existing configuration.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",false).option("--src-dir","use the src directory when creating a new project.",false).option("--no-src-dir","do not use the src directory when creating a new project.").option("--css-variables","use css variables for theming.",true).option("--no-css-variables","do not use css variables for theming.").option("--no-base-style","do not install the base shadcn style.").action(async(t,e)=>{try{e.defaults&&(e.template=e.template||"next",e.baseColor=e.baseColor||"neutral");let r=Ae.parse({cwd:D__default.resolve(e.cwd),isNewProject:!1,components:t,...e});if(await T(r.cwd),t.length>0){let i=J(v({resolvedPaths:{cwd:r.cwd}})),n=D__default.resolve(r.cwd,"components.json");if(Q.existsSync(n)){let s=await Q.readJson(n),c$1=c.partial().parse(s),m=v({resolvedPaths:{cwd:r.cwd}});i=J({...c$1,resolvedPaths:{...m.resolvedPaths,cwd:r.cwd}}),wt(n);}let{config:o}=await F(t,i,{silent:!0,writeFile:!1});i=o,M(t[0],i);let[a]=await S([t[0]],{config:i});a?.type==="registry:base"&&(a.config&&(i=J(Rr(i,a.config)),r.registryBaseConfig=a.config),r.baseStyle=a.extends==="none"?!1:r.baseStyle),a?.type==="registry:style"&&(r.baseColor="neutral",r.baseStyle=a.extends==="none"?!1:r.baseStyle);}r.baseStyle||(r.baseColor="neutral"),await ne(r),C.log(`${p.success("Success!")} Project initialization completed.
4
- You may now add components.`),Oe(D__default.resolve(r.cwd,"components.json")),C.break();}catch(r){C.break(),Q$1(r);}finally{K();}});async function ne(t){let e=await q(t.cwd);console.log({config:e});[...t.baseStyle?["index"]:[],...t.components??[]];let i=await r(t.cwd,e);return console.log({fullConfig:i}),i}function Ct(t,e){if(t.includes("\0"))return false;let r;try{r=t;let d="";for(;r!==d&&r.includes("%");)d=r,r=decodeURIComponent(r);}catch{return false}let i=D__default.normalize(r.replace(/\\/g,"/")),n=D__default.normalize(e),o=d=>d.replace(/\[\.\.\..*?\]/g,"").includes("..");if(o(i)||o(r)||o(t))return false;let a=d=>d.replace(/\[\.\.\..*?\]/g,""),s=a(t),c=a(r);if([/\.\.[\/\\]/,/[\/\\]\.\./,/\.\./,/\.\.%/,/\x00/,/[\x01-\x1f]/].some(d=>d.test(s)||d.test(c))||(t.includes("~")||r.includes("~"))&&(t.includes("../")||r.includes("../")))return false;if(/^[a-zA-Z]:[\/\\]/.test(r))return process.platform==="win32"?r.toLowerCase().startsWith(e.toLowerCase()):false;if(D__default.isAbsolute(i))return i.startsWith(n+D__default.sep);let f=D__default.resolve(n,i);return f.startsWith(n+D__default.sep)||f===n}async function It(t,e,r){if(!e.resolvedPaths.tailwindCss||!t||Object.keys(t).length===0)return;r={silent:false,...r};let i=e.resolvedPaths.tailwindCss,n=D__default.relative(e.resolvedPaths.cwd,i),o=D$1(`Updating ${p.info(n)}`,{silent:r.silent}).start(),a=await promises.readFile(i,"utf8"),s=await kr(a,t);await promises.writeFile(i,s,"utf8"),o.succeed();}async function kr(t,e){let r=[Pr(e)],i=await x$1(r).process(t,{from:void 0}),n=i.css,o=i.root;if(o.nodes&&o.nodes.length>0){let a=o.nodes[o.nodes.length-1];a.type==="atrule"&&!a.nodes&&!n.trimEnd().endsWith(";")&&(n=n.trimEnd()+";");}return n=n.replace(/\/\* ---break--- \*\//g,""),n=n.replace(/(\n\s*\n)+/g,`
2
+ import {b,a as a$1}from'./chunk-DGLIMMUD.js';import {a,N,m,Q,X,r,d,V as V$1,O,o,i,p,$,ba,g,h,e,f,q,M,c as c$1,_,s,J as J$1,ha,L as L$1,ia,ea,ca,fa,I,K,P,ja,b as b$1,ga,R,j,aa,n as n$1,E as E$1,T,y,U,l,S,k,F,H,G}from'./chunk-SCGCXD6H.js';export{ea as fetchTree,fa as getItemTargetPath,ia as getPreset,ha as getPresets,Z as getRegistriesConfig,ga as getRegistriesIndex,W as getRegistry,ca as getRegistryBaseColor,ba as getRegistryBaseColors,aa as getRegistryIcons,X as getRegistryItems,$ as getRegistryStyles,_ as getShadcnRegistryIndex,Y as resolveRegistryItems,da as resolveTree}from'./chunk-SCGCXD6H.js';import {c,o as o$1,n}from'./chunk-WKG3W635.js';import'./chunk-PMFK2ZSQ.js';import'./chunk-BFNVF2P5.js';import*as E from'path';import E__default,{join}from'path';import v from'fs-extra';import Be,{tmpdir}from'os';import {execa}from'execa';import Ne from'prompts';import Ze,{z as z$1}from'zod';import {existsSync,promises}from'fs';import {Command}from'commander';import Kr from'deepmerge';import x from'postcss';import ti from'postcss/lib/at-rule';import {Project,ScriptKind,SyntaxKind,VariableDeclarationKind}from'ts-morph';import*as z from'fs/promises';import qe from'dedent';import cr from'open';import {diffLines}from'diff';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {randomBytes}from'crypto';import bo from'fast-glob';async function At(e){let t={};if(!v.existsSync(e.cwd)||!v.existsSync(E__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,projectInfo:null};let i=s("Preflight checks.",{silent:e.silent}).start();v.existsSync(E__default.resolve(e.cwd,"components.json"))&&!e.force&&(i?.fail(),r.break(),r.error(`A ${d.info("components.json")} file already exists at ${d.info(e.cwd)}.
3
+ To start over, remove the ${d.info("components.json")} file and run ${d.info("init")} again.`),r.break(),process.exit(1)),i?.succeed();let r$1=s("Verifying framework.",{silent:e.silent}).start(),o$1=await o(e.cwd);(!o$1||o$1?.framework.name==="manual")&&(t["7"]=true,r$1?.fail(),r.break(),o$1?.framework.links.installation&&r.error(`We could not detect a supported framework at ${d.info(e.cwd)}.
4
+ Visit ${d.info(o$1?.framework.links.installation)} to manually configure your project.
5
+ Once configured, you can use the cli to add components.`),r.break(),process.exit(1)),r$1?.succeed(`Verifying framework. Found ${d.info(o$1.framework.label)}.`);let n="Validating Tailwind CSS.";o$1.tailwindVersion==="v4"&&(n=`Validating Tailwind CSS config. Found ${d.info("v4")}.`);let a=s(n,{silent:e.silent}).start();o$1.tailwindVersion==="v3"&&(!o$1?.tailwindConfigFile||!o$1?.tailwindCssFile)?(t["5"]=true,a?.fail()):o$1.tailwindVersion==="v4"&&!o$1?.tailwindCssFile?(t["5"]=true,a?.fail()):o$1.tailwindVersion?a?.succeed():(t["5"]=true,a?.fail());let s$1=s("Validating import alias.",{silent:e.silent}).start();return o$1?.aliasPrefix?s$1?.succeed():(t["6"]=true,s$1?.fail()),Object.keys(t).length>0&&(t["5"]&&(r.break(),r.error(`No Tailwind CSS configuration found at ${d.info(e.cwd)}.`),r.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),r.error("Install Tailwind CSS then try again."),o$1?.framework.links.tailwind&&r.error(`Visit ${d.info(o$1?.framework.links.tailwind)} to get started.`)),t["6"]&&(r.break(),r.error("No import alias found in your tsconfig.json file."),o$1?.framework.links.installation&&r.error(`Visit ${d.info(o$1?.framework.links.installation)} to learn how to set an import alias.`)),r.break(),process.exit(1)),{errors:t,projectInfo:o$1}}var Ue="https://codeload.github.com/shadcn-ui/ui/tar.gz/main",A={next:"next","next-monorepo":"next-monorepo",vite:"vite",start:"start"};async function Dt(e){e={srcDir:false,...e};let t=e.template&&A[e.template]?e.template:"next",i=e.name??(t===A.next||t===A.vite||t===A.start?"my-app":"my-monorepo"),r$1="latest",o=e.components?.length===1&&!!e.components[0].match(/\/chat\/b\//);if(e.components&&o)try{let[s]=await R(e.components),{meta:c}=z$1.object({meta:z$1.object({nextVersion:z$1.string()})}).parse(s);r$1=c.nextVersion,t=A.next;}catch(s){r.break(),V$1(s);}if(!e.force){let{type:s,name:c}=await Ne([{type:e.template||o?null:"select",name:"type",message:`The path ${d.info(e.cwd)} does not contain a package.json file.
6
+ Would you like to start a new project?`,choices:[{title:"Next.js",value:"next"},{title:"Next.js (Monorepo)",value:"next-monorepo"},{title:"Vite",value:"vite"},{title:"TanStack Start",value:"start"}],initial:0},{type:e.name?null:"text",name:"name",message:"What is your project named?",initial:i,format:m=>m.trim(),validate:m=>m.length>128?"Name should be less than 128 characters.":true}]);t=s??t,i=c??i;}let n=await a$1(e.cwd,{withFallback:true}),a=`${e.cwd}/${i}`;try{await v.access(e.cwd,v.constants.W_OK);}catch{r.break(),r.error(`The path ${d.info(e.cwd)} is not writable.`),r.error(`It is likely you do not have write permissions for this folder or the path ${d.info(e.cwd)} does not exist.`),r.break(),process.exit(1);}return v.existsSync(E__default.resolve(e.cwd,i,"package.json"))&&(r.break(),r.error(`A project with the name ${d.info(i)} already exists.`),r.error("Please choose a different name and try again."),r.break(),process.exit(1)),t===A.next&&await Vr(a,{version:r$1,cwd:e.cwd,packageManager:n,srcDir:!!e.srcDir}),t===A["next-monorepo"]&&await Wr(a,{packageManager:n}),t===A.vite&&await Mr(a,{packageManager:n}),t===A.start&&await zr(a,{packageManager:n}),{projectPath:a,projectName:i,template:t}}async function Vr(e,t){let i=s("Creating a new Next.js project. This may take a few minutes.").start(),r$1=["--tailwind","--eslint","--typescript","--app",t.srcDir?"--src-dir":"--no-src-dir","--no-import-alias",`--use-${t.packageManager}`];(t.version.startsWith("15")||t.version.startsWith("latest")||t.version.startsWith("canary"))&&r$1.push("--turbopack"),(t.version.startsWith("latest")||t.version.startsWith("canary"))&&r$1.push("--no-react-compiler");try{await execa("npx",[`create-next-app@${t.version}`,e,"--silent",...r$1],{cwd:t.cwd});}catch{r.break(),r.error("Something went wrong creating a new Next.js project. Please try again."),process.exit(1);}i?.succeed("Creating a new Next.js project.");}async function Wr(e,t){let i=s("Creating a new Next.js monorepo. This may take a few minutes.").start();try{let r=E__default.join(Be.tmpdir(),`shadcn-template-${Date.now()}`);await v.ensureDir(r);let o=await fetch(Ue);if(!o.ok)throw new Error(`Failed to download template: ${o.statusText}`);let n=E__default.resolve(r,"template.tar.gz");await v.writeFile(n,Buffer.from(await o.arrayBuffer())),await execa("tar",["-xzf",n,"-C",r,"--strip-components=2","ui-main/templates/monorepo-next"]);let a=E__default.resolve(r,"monorepo-next");await v.move(a,e),await v.remove(r),await execa(t.packageManager,["install"],{cwd:e});let s=E__default.join(e,"package.json");if(v.existsSync(s)){let m=await v.readFile(s,"utf8"),l=JSON.parse(m);l.name=e.split("/").pop(),await v.writeFile(s,JSON.stringify(l,null,2));}let c=process.cwd();await execa("git",["--version"],{cwd:e}),await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","Initial commit"],{cwd:e}),i?.succeed("Creating a new Next.js monorepo.");}catch(r){i?.fail("Something went wrong creating a new Next.js monorepo."),V$1(r);}}async function Mr(e,t){let i=s("Creating a new Vite project. This may take a few minutes.").start();try{let r=E__default.join(Be.tmpdir(),`shadcn-template-${Date.now()}`);await v.ensureDir(r);let o=await fetch(Ue);if(!o.ok)throw new Error(`Failed to download template: ${o.statusText}`);let n=E__default.resolve(r,"template.tar.gz");await v.writeFile(n,Buffer.from(await o.arrayBuffer())),await execa("tar",["-xzf",n,"-C",r,"--strip-components=2","ui-main/templates/vite-app"]);let a=E__default.resolve(r,"vite-app");if(await v.move(a,e),await v.remove(r),t.packageManager!=="pnpm"){let c=E__default.join(e,"pnpm-lock.yaml");v.existsSync(c)&&await v.remove(c);}await execa(t.packageManager,["install"],{cwd:e});let s=E__default.join(e,"package.json");if(v.existsSync(s)){let c=await v.readFile(s,"utf8"),m=JSON.parse(c);m.name=e.split("/").pop(),await v.writeFile(s,JSON.stringify(m,null,2));}await execa("git",["--version"],{cwd:e}),await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","Initial commit"],{cwd:e}),i?.succeed("Creating a new Vite project.");}catch(r){i?.fail("Something went wrong creating a new Vite project."),V$1(r);}}async function zr(e,t){let i=s("Creating a new TanStack Start project. This may take a few minutes.").start();try{let r=E__default.join(Be.tmpdir(),`shadcn-template-${Date.now()}`);await v.ensureDir(r);let o=await fetch(Ue);if(!o.ok)throw new Error(`Failed to download template: ${o.statusText}`);let n=E__default.resolve(r,"template.tar.gz");await v.writeFile(n,Buffer.from(await o.arrayBuffer())),await execa("tar",["-xzf",n,"-C",r,"--strip-components=2","ui-main/templates/start-app"]);let a=E__default.resolve(r,"start-app");if(await v.move(a,e),await v.remove(r),t.packageManager!=="pnpm"){let c=E__default.join(e,"pnpm-lock.yaml");v.existsSync(c)&&await v.remove(c);}await execa(t.packageManager,["install"],{cwd:e});let s=E__default.join(e,"package.json");if(v.existsSync(s)){let c=await v.readFile(s,"utf8"),m=JSON.parse(c);m.name=e.split("/").pop(),await v.writeFile(s,JSON.stringify(m,null,2));}await execa("git",["--version"],{cwd:e}),await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","Initial commit"],{cwd:e}),i?.succeed("Creating a new TanStack Start project.");}catch(r){i?.fail("Something went wrong creating a new TanStack Start project."),V$1(r);}}async function L(e=process.cwd()){try{let{config:t}=await import('@dotenvx/dotenvx'),i=[".env.local",".env.development.local",".env.development",".env"];for(let r of i){let o=join(e,r);existsSync(o)&&t({path:o,overload:!1,quiet:!0});}}catch(t){r.warn("Failed to load env files:",t);}}var Ge=".bak";function _t(e){if(!v.existsSync(e))return null;let t=`${e}${Ge}`;try{return v.renameSync(e,t),t}catch(i){return console.error(`Failed to create backup of ${e}: ${i}`),null}}function Lt(e){let t=`${e}${Ge}`;if(!v.existsSync(t))return false;try{return v.renameSync(t,e),!0}catch(i){return console.error(`Warning: Could not restore backup file ${t}: ${i}`),false}}function Je(e){let t=`${e}${Ge}`;if(!v.existsSync(t))return false;try{return v.unlinkSync(t),!0}catch{return false}}async function Vt(e,t){let i=new Set,r=new Set,o=[...e];for(;o.length>0;){let n=o.shift();if(r.has(n))continue;r.add(n);let{registry:a}=E$1(n);a&&!b$1[a]&&i.add(a);try{let[s]=await T([n],t,{useCache:!0});if(s?.registryDependencies)for(let c of s.registryDependencies){let{registry:m}=E$1(c);m&&!b$1[m]&&i.add(m),r.has(c)||o.push(c);}}catch(s){if(s instanceof y){let{registry:c}=E$1(n);c&&!b$1[c]&&i.add(c);continue}continue}}return Array.from(i)}async function V(e,t,i={}){i={silent:false,writeFile:true,...i};let o=(await Vt(e,t)).filter(m=>!t.registries?.[m]&&!Object.keys(b$1).includes(m));if(o.length===0)return {config:t,newRegistries:[]};let n=await ga({useCache:process.env.NODE_ENV!=="development"});if(!n)return {config:t,newRegistries:[]};let a={};for(let m of o)n[m]&&(a[m]=n[m]);if(Object.keys(a).length===0)return {config:t,newRegistries:[]};let s$1=Object.fromEntries(Object.entries(t.registries||{}).filter(([m])=>!Object.keys(b$1).includes(m))),c$1={...t,registries:{...s$1,...a}};if(i.writeFile){let{resolvedPaths:m,...l}=c$1,p=s("Updating components.json.",{silent:i.silent}).start(),u=c.parse(l);await v.writeFile(E__default.resolve(t.resolvedPaths.cwd,"components.json"),JSON.stringify(u,null,2)+`
7
+ `,"utf-8"),p.succeed();}return {config:c$1,newRegistries:Object.keys(a)}}process.on("exit",e=>{let t=E__default.resolve(process.cwd(),"components.json");return e===0?Je(t):Lt(t)});var Ye=z$1.object({cwd:z$1.string(),name:z$1.string().optional(),components:z$1.array(z$1.string()).optional(),yes:z$1.boolean(),defaults:z$1.boolean(),force:z$1.boolean(),silent:z$1.boolean(),isNewProject:z$1.boolean(),srcDir:z$1.boolean().optional(),cssVariables:z$1.boolean(),template:z$1.string().optional().refine(e=>e?A[e]:true,{message:"Invalid template. Please use 'next', 'vite', 'start' or 'next-monorepo'."}),baseColor:z$1.string().optional().refine(e=>e?a.find(t=>t.name===e):true,{message:`Invalid base color. Please use '${a.map(e=>e.name).join("', '")}'`}),baseStyle:z$1.boolean(),registryBaseConfig:c.deepPartial().optional()}),zt=new Command().name("init").description("initialize your project and install dependencies").argument("[components...]","names, url or local path to component").option("-t, --template <template>","the template to use. (next, start, vite, next-monorepo)").option("-b, --base-color <base-color>","the base color to use. (neutral, gray, zinc, stone, slate)",void 0).option("-y, --yes","skip confirmation prompt.",true).option("-d, --defaults,","use default configuration.",false).option("-f, --force","force overwrite of existing configuration.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",false).option("--src-dir","use the src directory when creating a new project.",false).option("--no-src-dir","do not use the src directory when creating a new project.").option("--css-variables","use css variables for theming.",true).option("--no-css-variables","do not use css variables for theming.").option("--no-base-style","do not install the base shadcn style.").action(async(e,t)=>{try{t.defaults&&(t.template=t.template||"next",t.baseColor=t.baseColor||"neutral");let i=Ye.parse({cwd:E__default.resolve(t.cwd),isNewProject:!1,components:e,...t});if(await L(i.cwd),e.length>0){let r=N(m({resolvedPaths:{cwd:i.cwd}})),o=E__default.resolve(i.cwd,"components.json");if(v.existsSync(o)){let s=await v.readJson(o),c$1=c.partial().parse(s),m$1=m({resolvedPaths:{cwd:i.cwd}});r=N({...c$1,resolvedPaths:{...m$1.resolvedPaths,cwd:i.cwd}}),_t(o);}let{config:n}=await V(e,r,{silent:!0,writeFile:!1});r=n,Q(e[0],r);let[a]=await X([e[0]],{config:r});a?.type==="registry:base"&&(a.config&&(r=N(Kr(r,a.config)),i.registryBaseConfig=a.config),i.baseStyle=a.extends==="none"?!1:i.baseStyle),a?.type==="registry:style"&&(i.baseColor="neutral",i.baseStyle=a.extends==="none"?!1:i.baseStyle);}i.baseStyle||(i.baseColor="neutral"),await pe(i),r.log(`${d.success("Success!")} Project initialization completed.
8
+ You may now add components.`),Je(E__default.resolve(i.cwd,"components.json")),r.break();}catch(i){r.break(),V$1(i);}finally{O();}});async function pe(e){let t,i$1;if(e.skipPreflight)t=await o(e.cwd);else {let a=await At(e);if(a.errors["1"]){let{projectPath:s,template:c}=await Dt(e);s||process.exit(1),e.cwd=s,e.isNewProject=true,i$1=c,t=await o(e.cwd);}else t=a.projectInfo;}if(i$1==="next-monorepo")return e.cwd=E__default.resolve(e.cwd,"apps/web"),await i(e.cwd);let r=await p(e.cwd,t),o$1=r?await Hr(r,e):await qr(await i(e.cwd));console.log({config:o$1,options:e});[...e.baseStyle?["index"]:[],...e.components??[]];}async function qr(e$1=null){let[t,i]=await Promise.all([$(),ba()]);r.info("");let r$1=await Ne([{type:"toggle",name:"typescript",message:`Would you like to use ${d.info("TypeScript")} (recommended)?`,initial:e$1?.tsx??true,active:"yes",inactive:"no"},{type:"select",name:"style",message:`Which ${d.info("style")} would you like to use?`,choices:t.map(o=>({title:o.label,value:o.name}))},{type:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${d.info("base color")}?`,choices:i.map(o=>({title:o.label,value:o.name}))},{type:"text",name:"tailwindCss",message:`Where is your ${d.info("global CSS")} file?`,initial:e$1?.tailwind.css??g},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${d.info("CSS variables")} for theming?`,initial:e$1?.tailwind.cssVariables??true,active:"yes",inactive:"no"},{type:"text",name:"tailwindPrefix",message:`Are you using a custom ${d.info("tailwind prefix eg. tw-")}? (Leave blank if not)`,initial:""},{type:"text",name:"tailwindConfig",message:`Where is your ${d.info("tailwind.config.js")} located?`,initial:e$1?.tailwind.config??h},{type:"text",name:"components",message:`Configure the import alias for ${d.info("components")}:`,initial:e$1?.aliases.components??e},{type:"text",name:"utils",message:`Configure the import alias for ${d.info("utils")}:`,initial:e$1?.aliases.utils??f},{type:"toggle",name:"rsc",message:`Are you using ${d.info("React Server Components")}?`,initial:e$1?.rsc??true,active:"yes",inactive:"no"}]);return c.parse({$schema:"https://ui.shadcn.com/schema.json",style:r$1.style,tailwind:{config:r$1.tailwindConfig,css:r$1.tailwindCss,baseColor:r$1.tailwindBaseColor,cssVariables:r$1.tailwindCssVariables,prefix:r$1.tailwindPrefix},rsc:r$1.rsc,tsx:r$1.typescript,aliases:{utils:r$1.utils,components:r$1.components,lib:r$1.components.replace(/\/components$/,"lib"),hooks:r$1.components.replace(/\/components$/,"hooks")}})}async function Hr(e,t){let i=e.style,r=t.baseColor,o=e.tailwind.cssVariables,n=e.iconLibrary??"lucide";if(!t.defaults){let[a,s,c]=await Promise.all([$(),ba(),q(e)]),m=await Ne([{type:c==="v4"||i?null:"select",name:"style",message:`Which ${d.info("style")} would you like to use?`,choices:a.map(l=>({title:l.name==="new-york"?"New York (Recommended)":l.label,value:l.name})),initial:0},{type:t.baseColor?null:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${d.info("base color")}?`,choices:s.map(l=>({title:l.label,value:l.name}))}]);i=m.style??i??"new-york",r=m.tailwindBaseColor??r,o=t.cssVariables;}return c.parse({$schema:e?.$schema,style:i,tailwind:{...e?.tailwind,baseColor:r,cssVariables:o},rsc:e?.rsc,tsx:e?.tsx,iconLibrary:n,aliases:e?.aliases})}function Bt(e,t){if(e.includes("\0"))return false;let i;try{i=e;let u="";for(;i!==u&&i.includes("%");)u=i,i=decodeURIComponent(i);}catch{return false}let r=E__default.normalize(i.replace(/\\/g,"/")),o=E__default.normalize(t),n=u=>u.replace(/\[\.\.\..*?\]/g,"").includes("..");if(n(r)||n(i)||n(e))return false;let a=u=>u.replace(/\[\.\.\..*?\]/g,""),s=a(e),c=a(i);if([/\.\.[\/\\]/,/[\/\\]\.\./,/\.\./,/\.\.%/,/\x00/,/[\x01-\x1f]/].some(u=>u.test(s)||u.test(c))||(e.includes("~")||i.includes("~"))&&(e.includes("../")||i.includes("../")))return false;if(/^[a-zA-Z]:[\/\\]/.test(i))return process.platform==="win32"?i.toLowerCase().startsWith(t.toLowerCase()):false;if(E__default.isAbsolute(r))return r.startsWith(o+E__default.sep);let p=E__default.resolve(o,r);return p.startsWith(o+E__default.sep)||p===o}async function Gt(e,t,i){if(!t.resolvedPaths.tailwindCss||!e||Object.keys(e).length===0)return;i={silent:false,...i};let r=t.resolvedPaths.tailwindCss,o=E__default.relative(t.resolvedPaths.cwd,r),n=s(`Updating ${d.info(o)}`,{silent:i.silent}).start(),a=await promises.readFile(r,"utf8"),s$1=await Zr(a,e);await promises.writeFile(r,s$1,"utf8"),n.succeed();}async function Zr(e,t){let i=[Qr(t)],r=await x(i).process(e,{from:void 0}),o=r.css,n=r.root;if(n.nodes&&n.nodes.length>0){let a=n.nodes[n.nodes.length-1];a.type==="atrule"&&!a.nodes&&!o.trimEnd().endsWith(";")&&(o=o.trimEnd()+";");}return o=o.replace(/\/\* ---break--- \*\//g,""),o=o.replace(/(\n\s*\n)+/g,`
5
9
 
6
- `),n=n.trimEnd(),n}function Pr(t){return {postcssPlugin:"update-css",Once(e){for(let[r,i]of Object.entries(t))if(r.startsWith("@")){let n=r.match(/@([a-zA-Z-]+)\s*(.*)/);if(!n)continue;let[,o,a]=n;if(o==="import"){if(!e.nodes?.find(c=>c.type==="atrule"&&c.name==="import"&&c.params===a)){let c=x$1.atRule({name:"import",params:a,raws:{semicolon:true}}),m=e.nodes?.filter(l=>l.type==="atrule"&&l.name==="import");if(m&&m.length>0){let l=m[m.length-1];c.raws.before=`
7
- `,e.insertAfter(l,c);}else !e.nodes||e.nodes.length,c.raws.before="",e.prepend(c);}}else if(o==="plugin"){let s=a;a&&!a.startsWith('"')&&!a.startsWith("'")&&(s=`"${a}"`);let c=l=>l.startsWith('"')&&l.endsWith('"')||l.startsWith("'")&&l.endsWith("'")?l.slice(1,-1):l;if(!e.nodes?.find(l=>l.type!=="atrule"||l.name!=="plugin"?false:c(l.params)===c(a))){let l=x$1.atRule({name:"plugin",params:s,raws:{semicolon:true,before:`
8
- `}}),f=e.nodes?.filter(g=>g.type==="atrule"&&g.name==="import"),d=e.nodes?.filter(g=>g.type==="atrule"&&g.name==="plugin");if(d&&d.length>0){let g=d[d.length-1];e.insertAfter(g,l);}else if(f&&f.length>0){let g=f[f.length-1];e.insertAfter(g,l),e.insertBefore(l,x$1.comment({text:"---break---"})),e.insertAfter(l,x$1.comment({text:"---break---"}));}else e.prepend(l),e.insertBefore(l,x$1.comment({text:"---break---"})),e.insertAfter(l,x$1.comment({text:"---break---"}));}}else if(typeof i=="object"&&Object.keys(i).length===0){if(!e.nodes?.find(c=>c.type==="atrule"&&c.name===o&&c.params===a)){let c=x$1.atRule({name:o,params:a,raws:{semicolon:true}});e.append(c),e.insertBefore(c,x$1.comment({text:"---break---"}));}}else if(o==="keyframes"){let s=e.nodes?.find(l=>l.type==="atrule"&&l.name==="theme"&&l.params==="inline");s||(s=x$1.atRule({name:"theme",params:"inline",raws:{semicolon:true,between:" ",before:`
9
- `}}),e.append(s),e.insertBefore(s,x$1.comment({text:"---break---"})));let c=s.nodes?.find(l=>l.type==="atrule"&&l.name==="keyframes"&&l.params===a),m;if(c?(m=x$1.atRule({name:"keyframes",params:a,raws:{semicolon:true,between:" ",before:`
10
- `}}),c.replaceWith(m)):(m=x$1.atRule({name:"keyframes",params:a,raws:{semicolon:true,between:" ",before:`
11
- `}}),s.append(m)),typeof i=="object")for(let[l,f]of Object.entries(i))Y(m,l,f);}else if(o==="utility"){let s=e.nodes?.find(c=>c.type==="atrule"&&c.name===o&&c.params===a);if(s){if(typeof i=="object")for(let[c,m]of Object.entries(i))if(typeof m=="string"){let l=s.nodes?.find(d=>d.type==="decl"&&d.prop===c),f=x$1.decl({prop:c,value:m,raws:{semicolon:true,before:`
12
- `}});l?l.replaceWith(f):s.append(f);}else typeof m=="object"&&Y(s,c,m);}else {let c=x$1.atRule({name:o,params:a,raws:{semicolon:true,between:" ",before:`
13
- `}});if(e.append(c),e.insertBefore(c,x$1.comment({text:"---break---"})),typeof i=="object")for(let[m,l]of Object.entries(i))if(typeof l=="string"){let f=x$1.decl({prop:m,value:l,raws:{semicolon:true,before:`
14
- `}});c.append(f);}else typeof l=="object"&&Y(c,m,l);}}else o==="property"?Y(e,r,i):kt(e,o,a,i);}else Y(e,r,i);}}}function kt(t,e,r,i){let n=t.nodes?.find(o=>o.type==="atrule"&&o.name===e&&o.params===r);if(n||(n=x$1.atRule({name:e,params:r,raws:{semicolon:true,between:" ",before:`
15
- `}}),t.append(n),t.insertBefore(n,x$1.comment({text:"---break---"}))),typeof i=="object")for(let[o,a]of Object.entries(i))if(o.startsWith("@")){let s=o.match(/@([a-zA-Z-]+)\s*(.*)/);if(s){let[,c,m]=s;kt(n,c,m,a);}}else Y(n,o,a);else if(typeof i=="string")try{let a=x$1.parse(`.temp{${i}}`).first;if(a&&a.nodes){let s=x$1.rule({selector:"temp",raws:{semicolon:!0,between:" ",before:`
10
+ `),o=o.trimEnd(),o}function Qr(e){return {postcssPlugin:"update-css",Once(t){for(let[i,r]of Object.entries(e))if(i.startsWith("@")){let o=i.match(/@([a-zA-Z-]+)\s*(.*)/);if(!o)continue;let[,n,a]=o;if(n==="import"){if(!t.nodes?.find(c=>c.type==="atrule"&&c.name==="import"&&c.params===a)){let c=x.atRule({name:"import",params:a,raws:{semicolon:true}}),m=t.nodes?.filter(l=>l.type==="atrule"&&l.name==="import");if(m&&m.length>0){let l=m[m.length-1];c.raws.before=`
11
+ `,t.insertAfter(l,c);}else !t.nodes||t.nodes.length,c.raws.before="",t.prepend(c);}}else if(n==="plugin"){let s=a;a&&!a.startsWith('"')&&!a.startsWith("'")&&(s=`"${a}"`);let c=l=>l.startsWith('"')&&l.endsWith('"')||l.startsWith("'")&&l.endsWith("'")?l.slice(1,-1):l;if(!t.nodes?.find(l=>l.type!=="atrule"||l.name!=="plugin"?false:c(l.params)===c(a))){let l=x.atRule({name:"plugin",params:s,raws:{semicolon:true,before:`
12
+ `}}),p=t.nodes?.filter(g=>g.type==="atrule"&&g.name==="import"),u=t.nodes?.filter(g=>g.type==="atrule"&&g.name==="plugin");if(u&&u.length>0){let g=u[u.length-1];t.insertAfter(g,l);}else if(p&&p.length>0){let g=p[p.length-1];t.insertAfter(g,l),t.insertBefore(l,x.comment({text:"---break---"})),t.insertAfter(l,x.comment({text:"---break---"}));}else t.prepend(l),t.insertBefore(l,x.comment({text:"---break---"})),t.insertAfter(l,x.comment({text:"---break---"}));}}else if(typeof r=="object"&&Object.keys(r).length===0){if(!t.nodes?.find(c=>c.type==="atrule"&&c.name===n&&c.params===a)){let c=x.atRule({name:n,params:a,raws:{semicolon:true}});t.append(c),t.insertBefore(c,x.comment({text:"---break---"}));}}else if(n==="keyframes"){let s=t.nodes?.find(l=>l.type==="atrule"&&l.name==="theme"&&l.params==="inline");s||(s=x.atRule({name:"theme",params:"inline",raws:{semicolon:true,between:" ",before:`
13
+ `}}),t.append(s),t.insertBefore(s,x.comment({text:"---break---"})));let c=s.nodes?.find(l=>l.type==="atrule"&&l.name==="keyframes"&&l.params===a),m;if(c?(m=x.atRule({name:"keyframes",params:a,raws:{semicolon:true,between:" ",before:`
14
+ `}}),c.replaceWith(m)):(m=x.atRule({name:"keyframes",params:a,raws:{semicolon:true,between:" ",before:`
15
+ `}}),s.append(m)),typeof r=="object")for(let[l,p]of Object.entries(r))ee(m,l,p);}else if(n==="utility"){let s=t.nodes?.find(c=>c.type==="atrule"&&c.name===n&&c.params===a);if(s){if(typeof r=="object")for(let[c,m]of Object.entries(r))if(typeof m=="string"){let l=s.nodes?.find(u=>u.type==="decl"&&u.prop===c),p=x.decl({prop:c,value:m,raws:{semicolon:true,before:`
16
+ `}});l?l.replaceWith(p):s.append(p);}else typeof m=="object"&&ee(s,c,m);}else {let c=x.atRule({name:n,params:a,raws:{semicolon:true,between:" ",before:`
17
+ `}});if(t.append(c),t.insertBefore(c,x.comment({text:"---break---"})),typeof r=="object")for(let[m,l]of Object.entries(r))if(typeof l=="string"){let p=x.decl({prop:m,value:l,raws:{semicolon:true,before:`
18
+ `}});c.append(p);}else typeof l=="object"&&ee(c,m,l);}}else n==="property"?ee(t,i,r):Jt(t,n,a,r);}else ee(t,i,r);}}}function Jt(e,t,i,r){let o=e.nodes?.find(n=>n.type==="atrule"&&n.name===t&&n.params===i);if(o||(o=x.atRule({name:t,params:i,raws:{semicolon:true,between:" ",before:`
19
+ `}}),e.append(o),e.insertBefore(o,x.comment({text:"---break---"}))),typeof r=="object")for(let[n,a]of Object.entries(r))if(n.startsWith("@")){let s=n.match(/@([a-zA-Z-]+)\s*(.*)/);if(s){let[,c,m]=s;Jt(o,c,m,a);}}else ee(o,n,a);else if(typeof r=="string")try{let a=x.parse(`.temp{${r}}`).first;if(a&&a.nodes){let s=x.rule({selector:"temp",raws:{semicolon:!0,between:" ",before:`
16
20
  `}});a.nodes.forEach(c=>{if(c.type==="decl"){let m=c.clone();m.raws.before=`
17
- `,s.append(m);}}),s.nodes?.length&&n.append(s);}}catch(o){throw console.error("Error parsing at-rule content:",i,o),o}}function Y(t,e,r){let i=t.nodes?.find(n=>n.type==="rule"&&n.selector===e);if(i||(i=x$1.rule({selector:e,raws:{semicolon:true,between:" ",before:`
18
- `}}),t.append(i)),typeof r=="object"){for(let[n,o]of Object.entries(r))if(n.startsWith("@")&&typeof o=="object"&&o!==null&&Object.keys(o).length===0){let a=n.match(/@([a-zA-Z-]+)\s*(.*)/);if(a){let[,s,c]=a,m=x$1.atRule({name:s,params:c,raws:{semicolon:true,before:`
19
- `}});i.append(m);}}else if(typeof o=="string"){let a=x$1.decl({prop:n,value:o,raws:{semicolon:true,before:`
20
- `}}),s=i.nodes?.find(c=>c.type==="decl"&&c.prop===n);s?s.replaceWith(a):i.append(a);}else if(typeof o=="object"){let a=n.startsWith("&")?e.replace(/^([^:]+)/,`$1${n.substring(1)}`):n;Y(t,a,o);}}else if(typeof r=="string")try{let o=x$1.parse(`.temp{${r}}`).first;o&&o.nodes&&o.nodes.forEach(a=>{if(a.type==="decl"){let s=a.clone();s.raws.before=`
21
- `,i?.append(s);}});}catch(n){throw console.error("Error parsing rule content:",e,r,n),n}}async function $t(t,e,r){if(!e.resolvedPaths.tailwindCss||!Object.keys(t??{}).length)return;r={cleanupDefaultNextStyles:false,silent:false,tailwindVersion:"v3",overwriteCssVars:false,initIndex:true,...r};let i=e.resolvedPaths.tailwindCss,n=D__default.relative(e.resolvedPaths.cwd,i),o=D$1(`Updating CSS variables in ${p.info(n)}`,{silent:r.silent}).start(),a=await promises.readFile(i,"utf8"),s=await $r(a,t??{},e,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars,initIndex:r.initIndex});await promises.writeFile(i,s,"utf8"),o.succeed();}async function $r(t,e,r,i={cleanupDefaultNextStyles:false,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:false,initIndex:false}){i={cleanupDefaultNextStyles:false,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:false,initIndex:false,...i};let n=[Tr(e)];if(i.cleanupDefaultNextStyles&&n.push(jt()),i.tailwindVersion==="v4"){if(n=[],r.resolvedPaths?.cwd){let s=w(r.resolvedPaths.cwd);!s?.dependencies?.["tailwindcss-animate"]&&!s?.devDependencies?.["tailwindcss-animate"]&&i.initIndex&&n.push(_r({params:"tw-animate-css"}));}n.push(Dr({params:"dark (&:is(.dark *))"})),i.cleanupDefaultNextStyles&&n.push(jt()),n.push(Or(e,{overwriteCssVars:i.overwriteCssVars})),n.push(Ar(e)),i.tailwindConfig&&(n.push(Lr(i.tailwindConfig)),n.push(Wr(i.tailwindConfig)),n.push(Vr(i.tailwindConfig)));}r.tailwind.cssVariables&&i.initIndex&&n.push(Nr({tailwindVersion:i.tailwindVersion}));let a=(await x$1(n).process(t,{from:void 0})).css;return a=a.replace(/\/\* ---break--- \*\//g,""),i.tailwindVersion==="v4"&&(a=a.replace(/(\n\s*\n)+/g,`
21
+ `,s.append(m);}}),s.nodes?.length&&o.append(s);}}catch(n){throw console.error("Error parsing at-rule content:",r,n),n}}function ee(e,t,i){let r=e.nodes?.find(o=>o.type==="rule"&&o.selector===t);if(r||(r=x.rule({selector:t,raws:{semicolon:true,between:" ",before:`
22
+ `}}),e.append(r)),typeof i=="object"){for(let[o,n]of Object.entries(i))if(o.startsWith("@")&&typeof n=="object"&&n!==null&&Object.keys(n).length===0){let a=o.match(/@([a-zA-Z-]+)\s*(.*)/);if(a){let[,s,c]=a,m=x.atRule({name:s,params:c,raws:{semicolon:true,before:`
23
+ `}});r.append(m);}}else if(typeof n=="string"){let a=x.decl({prop:o,value:n,raws:{semicolon:true,before:`
24
+ `}}),s=r.nodes?.find(c=>c.type==="decl"&&c.prop===o);s?s.replaceWith(a):r.append(a);}else if(typeof n=="object"){let a=o.startsWith("&")?t.replace(/^([^:]+)/,`$1${o.substring(1)}`):o;ee(e,a,n);}}else if(typeof i=="string")try{let n=x.parse(`.temp{${i}}`).first;n&&n.nodes&&n.nodes.forEach(a=>{if(a.type==="decl"){let s=a.clone();s.raws.before=`
25
+ `,r?.append(s);}});}catch(o){throw console.error("Error parsing rule content:",t,i,o),o}}async function Ht(e,t,i){if(!t.resolvedPaths.tailwindCss||!Object.keys(e??{}).length)return;i={cleanupDefaultNextStyles:false,silent:false,tailwindVersion:"v3",overwriteCssVars:false,initIndex:true,...i};let r=t.resolvedPaths.tailwindCss,o=E__default.relative(t.resolvedPaths.cwd,r),n=s(`Updating CSS variables in ${d.info(o)}`,{silent:i.silent}).start(),a=await promises.readFile(r,"utf8"),s$1=await ri(a,e??{},t,{cleanupDefaultNextStyles:i.cleanupDefaultNextStyles,tailwindVersion:i.tailwindVersion,tailwindConfig:i.tailwindConfig,overwriteCssVars:i.overwriteCssVars,initIndex:i.initIndex});await promises.writeFile(r,s$1,"utf8"),n.succeed();}async function ri(e,t,i,r={cleanupDefaultNextStyles:false,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:false,initIndex:false}){r={cleanupDefaultNextStyles:false,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:false,initIndex:false,...r};let o=[oi(t)];if(r.cleanupDefaultNextStyles&&o.push(qt()),r.tailwindVersion==="v4"){if(o=[],i.resolvedPaths?.cwd){let s=n$1(i.resolvedPaths.cwd);!s?.dependencies?.["tailwindcss-animate"]&&!s?.devDependencies?.["tailwindcss-animate"]&&r.initIndex&&o.push(li({params:"tw-animate-css"}));}o.push(ci({params:"dark (&:is(.dark *))"})),r.cleanupDefaultNextStyles&&o.push(qt()),o.push(si(t,{overwriteCssVars:r.overwriteCssVars})),o.push(ai(t)),r.tailwindConfig&&(o.push(mi(r.tailwindConfig)),o.push(pi(r.tailwindConfig)),o.push(fi(r.tailwindConfig)));}i.tailwind.cssVariables&&r.initIndex&&o.push(ii({tailwindVersion:r.tailwindVersion}));let a=(await x(o).process(e,{from:void 0})).css;return a=a.replace(/\/\* ---break--- \*\//g,""),r.tailwindVersion==="v4"&&(a=a.replace(/(\n\s*\n)+/g,`
22
26
 
23
- `)),a}function Nr({tailwindVersion:t}){return {postcssPlugin:"update-base-layer",Once(e){let r=[{selector:"*",apply:t==="v4"?"border-border outline-ring/50":"border-border"},{selector:"body",apply:"bg-background text-foreground"}],i=e.nodes.find(n=>n.type==="atrule"&&n.name==="layer"&&n.params==="base"&&r.every(({selector:o,apply:a})=>n.nodes?.some(s=>s.type==="rule"&&s.selector===o&&s.nodes.some(c=>c.type==="atrule"&&c.name==="apply"&&c.params===a))));i||(i=x$1.atRule({name:"layer",params:"base",raws:{semicolon:true,between:" ",before:`
24
- `}}),e.append(i),e.insertBefore(i,x$1.comment({text:"---break---"}))),r.forEach(({selector:n,apply:o})=>{i?.nodes?.find(s=>s.type==="rule"&&s.selector===n)||i?.append(x$1.rule({selector:n,nodes:[x$1.atRule({name:"apply",params:o,raws:{semicolon:true,before:`
27
+ `)),a}function ii({tailwindVersion:e}){return {postcssPlugin:"update-base-layer",Once(t){let i=[{selector:"*",apply:e==="v4"?"border-border outline-ring/50":"border-border"},{selector:"body",apply:"bg-background text-foreground"}],r=t.nodes.find(o=>o.type==="atrule"&&o.name==="layer"&&o.params==="base"&&i.every(({selector:n,apply:a})=>o.nodes?.some(s=>s.type==="rule"&&s.selector===n&&s.nodes.some(c=>c.type==="atrule"&&c.name==="apply"&&c.params===a))));r||(r=x.atRule({name:"layer",params:"base",raws:{semicolon:true,between:" ",before:`
28
+ `}}),t.append(r),t.insertBefore(r,x.comment({text:"---break---"}))),i.forEach(({selector:o,apply:n})=>{r?.nodes?.find(s=>s.type==="rule"&&s.selector===o)||r?.append(x.rule({selector:o,nodes:[x.atRule({name:"apply",params:n,raws:{semicolon:true,before:`
25
29
  `}})],raws:{semicolon:true,between:" ",before:`
26
- `}}));});}}}function Tr(t){return {postcssPlugin:"update-css-vars",Once(e){let r=e.nodes.find(i=>i.type==="atrule"&&i.name==="layer"&&i.params==="base");r instanceof jr||(r=x$1.atRule({name:"layer",params:"base",nodes:[],raws:{semicolon:true,before:`
27
- `,between:" "}}),e.append(r),e.insertBefore(r,x$1.comment({text:"---break---"}))),r!==void 0&&Object.entries(t).forEach(([i,n])=>{let o=i==="light"?":root":`.${i}`;Fr(r,o,n);});}}}function Et(t){let e=t.nodes.find(r=>r.type==="rule"&&r.selector===":root");if(e){let r=["--background","--foreground"];e.nodes.filter(i=>i.type==="decl"&&r.includes(i.prop)).forEach(i=>i.remove()),e.nodes.length===0&&e.remove();}}function jt(){return {postcssPlugin:"cleanup-default-next-styles",Once(t){let e=t.nodes.find(i=>i.type==="rule"&&i.selector==="body");e&&(e.nodes.find(i=>i.type==="decl"&&i.prop==="color"&&["rgb(var(--foreground-rgb))","var(--foreground)"].includes(i.value))?.remove(),e.nodes.find(i=>i.type==="decl"&&i.prop==="background"&&(i.value.startsWith("linear-gradient")||i.value==="var(--background)"))?.remove(),e.nodes.find(i=>i.type==="decl"&&i.prop==="font-family"&&i.value==="Arial, Helvetica, sans-serif")?.remove(),e.nodes.length===0&&e.remove()),Et(t);let r=t.nodes.find(i=>i.type==="atrule"&&i.params==="(prefers-color-scheme: dark)");r&&(Et(r),r.nodes.length===0&&r.remove());}}}function Fr(t,e,r){let i=t.nodes?.find(n=>n.type==="rule"&&n.selector===e);i||Object.keys(r).length>0&&(i=x$1.rule({selector:e,raws:{between:" ",before:`
28
- `}}),t.append(i)),Object.entries(r).forEach(([n,o])=>{let a=`--${n.replace(/^--/,"")}`,s=x$1.decl({prop:a,value:o,raws:{semicolon:true}}),c=i?.nodes.find(m=>m.type==="decl"&&m.prop===a);c?c.replaceWith(s):i?.append(s);});}function Or(t,e){return {postcssPlugin:"update-css-vars-v4",Once(r){Object.entries(t).forEach(([i,n])=>{let o=i==="light"?":root":`.${i}`;if(i==="theme"){o="@theme";let s=be(r);Object.entries(n).forEach(([c,m])=>{let l=`--${c.replace(/^--/,"")}`,f=x$1.decl({prop:l,value:m,raws:{semicolon:true}}),d=s?.nodes?.find(g=>g.type==="decl"&&g.prop===l);e.overwriteCssVars?d?d.replaceWith(f):s?.append(f):d||s?.append(f);});return}let a=r.nodes?.find(s=>s.type==="rule"&&s.selector===o);!a&&Object.keys(n).length>0&&(a=x$1.rule({selector:o,nodes:[],raws:{semicolon:true,between:" ",before:`
29
- `}}),r.append(a),r.insertBefore(a,x$1.comment({text:"---break---"}))),Object.entries(n).forEach(([s,c])=>{let m=`--${s.replace(/^--/,"")}`;m==="--sidebar-background"&&(m="--sidebar"),Nt(c)&&(c=`hsl(${c})`);let l=x$1.decl({prop:m,value:c,raws:{semicolon:true}}),f=a?.nodes.find(d=>d.type==="decl"&&d.prop===m);e.overwriteCssVars?f?f.replaceWith(l):a?.append(l):f||a?.append(l);});});}}}function Ar(t){return {postcssPlugin:"update-theme",Once(e){let r=Array.from(new Set(Object.keys(t).flatMap(o=>Object.keys(t[o]||{}))));if(!r.length)return;let i=be(e),n=i.nodes?.filter(o=>o.type==="decl"&&o.prop.startsWith("--"));for(let o of r){let a=Object.values(t).find(f=>f[o])?.[o];if(!a)continue;if(o==="radius"){let f={sm:"calc(var(--radius) - 4px)",md:"calc(var(--radius) - 2px)",lg:"var(--radius)",xl:"calc(var(--radius) + 4px)","2xl":"calc(var(--radius) + 8px)","3xl":"calc(var(--radius) + 12px)","4xl":"calc(var(--radius) + 16px)"};for(let[d,g]of Object.entries(f)){let h=x$1.decl({prop:`--radius-${d}`,value:g,raws:{semicolon:true}});i?.nodes?.find(y=>y.type==="decl"&&y.prop===h.prop)||i?.append(h);}continue}let s=Nt(a)||zr(a)?`--color-${o.replace(/^--/,"")}`:`--${o.replace(/^--/,"")}`;s==="--color-sidebar-background"&&(s="--color-sidebar");let c=`var(--${o})`;s==="--color-sidebar"&&(c="var(--sidebar)");let m=x$1.decl({prop:s,value:c,raws:{semicolon:true}});i?.nodes?.find(f=>f.type==="decl"&&f.prop===m.prop)||(n?.length?i?.insertAfter(n[n.length-1],m):i?.append(m));}}}}function be(t){let e=t.nodes.find(r=>r.type==="atrule"&&r.name==="theme"&&r.params==="inline");return e||(e=x$1.atRule({name:"theme",params:"inline",nodes:[],raws:{semicolon:true,between:" ",before:`
30
- `}}),t.append(e),t.insertBefore(e,x$1.comment({text:"---break---"}))),e}function Dr({params:t}){return {postcssPlugin:"add-custom-variant",Once(e){if(!e.nodes.find(i=>i.type==="atrule"&&i.name==="custom-variant")){let i=e.nodes.filter(o=>o.type==="atrule"&&o.name==="import"),n=x$1.atRule({name:"custom-variant",params:t,raws:{semicolon:true,before:`
31
- `}});if(i.length>0){let o=i[i.length-1];e.insertAfter(o,n);}else e.insertAfter(e.nodes[0],n);e.insertBefore(n,x$1.comment({text:"---break---"}));}}}}function _r({params:t}){return {postcssPlugin:"add-custom-import",Once(e){let r=e.nodes.filter(o=>o.type==="atrule"&&o.name==="import"),i=e.nodes.find(o=>o.type==="atrule"&&o.name==="custom-variant");if(!r.some(o=>o.params.replace(/["']/g,"")===t)){let o=x$1.atRule({name:"import",params:`"${t}"`,raws:{semicolon:true,before:`
32
- `}});if(r.length>0){let a=r[r.length-1];e.insertAfter(a,o);}else i?(e.insertBefore(i,o),e.insertBefore(i,x$1.comment({text:"---break---"}))):(e.prepend(o),e.insertAfter(o,x$1.comment({text:"---break---"})));}}}}function Lr(t){return {postcssPlugin:"update-tailwind-config",Once(e){if(!t?.plugins)return;let i=Mr(e)==="single"?"'":'"',n=e.nodes.filter(a=>a.type==="atrule"&&a.name==="plugin"),o=n[n.length-1]||e.nodes[0];for(let a of t.plugins){let s=a.replace(/^require\(["']|["']\)$/g,"");if(n.some(m=>m.params.replace(/["']/g,"")===s))continue;let c=x$1.atRule({name:"plugin",params:`${i}${s}${i}`,raws:{semicolon:true,before:`
33
- `}});e.insertAfter(o,c),e.insertBefore(c,x$1.comment({text:"---break---"}));}}}}function Vr(t){return {postcssPlugin:"update-tailwind-config-keyframes",Once(e){if(!t?.theme?.extend?.keyframes)return;let r=be(e),i=r.nodes?.filter(o=>o.type==="atrule"&&o.name==="keyframes"),n=z$1.record(z$1.string(),z$1.record(z$1.string(),z$1.string()));for(let[o,a]of Object.entries(t.theme.extend.keyframes)){if(typeof o!="string")continue;let s=n.safeParse(a);if(!s.success||i?.find(m=>m.type==="atrule"&&m.name==="keyframes"&&m.params===o))continue;let c=x$1.atRule({name:"keyframes",params:o,nodes:[],raws:{semicolon:true,between:" ",before:`
34
- `}});for(let[m,l]of Object.entries(s.data)){let f=x$1.rule({selector:m,nodes:Object.entries(l).map(([d,g])=>x$1.decl({prop:d,value:g,raws:{semicolon:true,before:`
30
+ `}}));});}}}function oi(e){return {postcssPlugin:"update-css-vars",Once(t){let i=t.nodes.find(r=>r.type==="atrule"&&r.name==="layer"&&r.params==="base");i instanceof ti||(i=x.atRule({name:"layer",params:"base",nodes:[],raws:{semicolon:true,before:`
31
+ `,between:" "}}),t.append(i),t.insertBefore(i,x.comment({text:"---break---"}))),i!==void 0&&Object.entries(e).forEach(([r,o])=>{let n=r==="light"?":root":`.${r}`;ni(i,n,o);});}}}function Kt(e){let t=e.nodes.find(i=>i.type==="rule"&&i.selector===":root");if(t){let i=["--background","--foreground"];t.nodes.filter(r=>r.type==="decl"&&i.includes(r.prop)).forEach(r=>r.remove()),t.nodes.length===0&&t.remove();}}function qt(){return {postcssPlugin:"cleanup-default-next-styles",Once(e){let t=e.nodes.find(r=>r.type==="rule"&&r.selector==="body");t&&(t.nodes.find(r=>r.type==="decl"&&r.prop==="color"&&["rgb(var(--foreground-rgb))","var(--foreground)"].includes(r.value))?.remove(),t.nodes.find(r=>r.type==="decl"&&r.prop==="background"&&(r.value.startsWith("linear-gradient")||r.value==="var(--background)"))?.remove(),t.nodes.find(r=>r.type==="decl"&&r.prop==="font-family"&&r.value==="Arial, Helvetica, sans-serif")?.remove(),t.nodes.length===0&&t.remove()),Kt(e);let i=e.nodes.find(r=>r.type==="atrule"&&r.params==="(prefers-color-scheme: dark)");i&&(Kt(i),i.nodes.length===0&&i.remove());}}}function ni(e,t,i){let r=e.nodes?.find(o=>o.type==="rule"&&o.selector===t);r||Object.keys(i).length>0&&(r=x.rule({selector:t,raws:{between:" ",before:`
32
+ `}}),e.append(r)),Object.entries(i).forEach(([o,n])=>{let a=`--${o.replace(/^--/,"")}`,s=x.decl({prop:a,value:n,raws:{semicolon:true}}),c=r?.nodes.find(m=>m.type==="decl"&&m.prop===a);c?c.replaceWith(s):r?.append(s);});}function si(e,t){return {postcssPlugin:"update-css-vars-v4",Once(i){Object.entries(e).forEach(([r,o])=>{let n=r==="light"?":root":`.${r}`;if(r==="theme"){n="@theme";let s=ke(i);Object.entries(o).forEach(([c,m])=>{let l=`--${c.replace(/^--/,"")}`,p=x.decl({prop:l,value:m,raws:{semicolon:true}}),u=s?.nodes?.find(g=>g.type==="decl"&&g.prop===l);t.overwriteCssVars?u?u.replaceWith(p):s?.append(p):u||s?.append(p);});return}let a=i.nodes?.find(s=>s.type==="rule"&&s.selector===n);!a&&Object.keys(o).length>0&&(a=x.rule({selector:n,nodes:[],raws:{semicolon:true,between:" ",before:`
33
+ `}}),i.append(a),i.insertBefore(a,x.comment({text:"---break---"}))),Object.entries(o).forEach(([s,c])=>{let m=`--${s.replace(/^--/,"")}`;m==="--sidebar-background"&&(m="--sidebar"),Xt(c)&&(c=`hsl(${c})`);let l=x.decl({prop:m,value:c,raws:{semicolon:true}}),p=a?.nodes.find(u=>u.type==="decl"&&u.prop===m);t.overwriteCssVars?p?p.replaceWith(l):a?.append(l):p||a?.append(l);});});}}}function ai(e){return {postcssPlugin:"update-theme",Once(t){let i=Array.from(new Set(Object.keys(e).flatMap(n=>Object.keys(e[n]||{}))));if(!i.length)return;let r=ke(t),o=r.nodes?.filter(n=>n.type==="decl"&&n.prop.startsWith("--"));for(let n of i){let a=Object.values(e).find(p=>p[n])?.[n];if(!a)continue;if(n==="radius"){let p={sm:"calc(var(--radius) - 4px)",md:"calc(var(--radius) - 2px)",lg:"var(--radius)",xl:"calc(var(--radius) + 4px)","2xl":"calc(var(--radius) + 8px)","3xl":"calc(var(--radius) + 12px)","4xl":"calc(var(--radius) + 16px)"};for(let[u,g]of Object.entries(p)){let h=x.decl({prop:`--radius-${u}`,value:g,raws:{semicolon:true}});r?.nodes?.find(y=>y.type==="decl"&&y.prop===h.prop)||r?.append(h);}continue}let s=Xt(a)||ui(a)?`--color-${n.replace(/^--/,"")}`:`--${n.replace(/^--/,"")}`;s==="--color-sidebar-background"&&(s="--color-sidebar");let c=`var(--${n})`;s==="--color-sidebar"&&(c="var(--sidebar)");let m=x.decl({prop:s,value:c,raws:{semicolon:true}});r?.nodes?.find(p=>p.type==="decl"&&p.prop===m.prop)||(o?.length?r?.insertAfter(o[o.length-1],m):r?.append(m));}}}}function ke(e){let t=e.nodes.find(i=>i.type==="atrule"&&i.name==="theme"&&i.params==="inline");return t||(t=x.atRule({name:"theme",params:"inline",nodes:[],raws:{semicolon:true,between:" ",before:`
34
+ `}}),e.append(t),e.insertBefore(t,x.comment({text:"---break---"}))),t}function ci({params:e}){return {postcssPlugin:"add-custom-variant",Once(t){if(!t.nodes.find(r=>r.type==="atrule"&&r.name==="custom-variant")){let r=t.nodes.filter(n=>n.type==="atrule"&&n.name==="import"),o=x.atRule({name:"custom-variant",params:e,raws:{semicolon:true,before:`
35
+ `}});if(r.length>0){let n=r[r.length-1];t.insertAfter(n,o);}else t.insertAfter(t.nodes[0],o);t.insertBefore(o,x.comment({text:"---break---"}));}}}}function li({params:e}){return {postcssPlugin:"add-custom-import",Once(t){let i=t.nodes.filter(n=>n.type==="atrule"&&n.name==="import"),r=t.nodes.find(n=>n.type==="atrule"&&n.name==="custom-variant");if(!i.some(n=>n.params.replace(/["']/g,"")===e)){let n=x.atRule({name:"import",params:`"${e}"`,raws:{semicolon:true,before:`
36
+ `}});if(i.length>0){let a=i[i.length-1];t.insertAfter(a,n);}else r?(t.insertBefore(r,n),t.insertBefore(r,x.comment({text:"---break---"}))):(t.prepend(n),t.insertAfter(n,x.comment({text:"---break---"})));}}}}function mi(e){return {postcssPlugin:"update-tailwind-config",Once(t){if(!e?.plugins)return;let r=di(t)==="single"?"'":'"',o=t.nodes.filter(a=>a.type==="atrule"&&a.name==="plugin"),n=o[o.length-1]||t.nodes[0];for(let a of e.plugins){let s=a.replace(/^require\(["']|["']\)$/g,"");if(o.some(m=>m.params.replace(/["']/g,"")===s))continue;let c=x.atRule({name:"plugin",params:`${r}${s}${r}`,raws:{semicolon:true,before:`
37
+ `}});t.insertAfter(n,c),t.insertBefore(c,x.comment({text:"---break---"}));}}}}function fi(e){return {postcssPlugin:"update-tailwind-config-keyframes",Once(t){if(!e?.theme?.extend?.keyframes)return;let i=ke(t),r=i.nodes?.filter(n=>n.type==="atrule"&&n.name==="keyframes"),o=z$1.record(z$1.string(),z$1.record(z$1.string(),z$1.string()));for(let[n,a]of Object.entries(e.theme.extend.keyframes)){if(typeof n!="string")continue;let s=o.safeParse(a);if(!s.success||r?.find(m=>m.type==="atrule"&&m.name==="keyframes"&&m.params===n))continue;let c=x.atRule({name:"keyframes",params:n,nodes:[],raws:{semicolon:true,between:" ",before:`
38
+ `}});for(let[m,l]of Object.entries(s.data)){let p=x.rule({selector:m,nodes:Object.entries(l).map(([u,g])=>x.decl({prop:u,value:g,raws:{semicolon:true,before:`
35
39
  `,between:": "}})),raws:{semicolon:true,between:" ",before:`
36
- `}});c.append(f);}r.append(c),r.insertBefore(c,x$1.comment({text:"---break---"}));}}}}function Wr(t){return {postcssPlugin:"update-tailwind-config-animation",Once(e){if(!t?.theme?.extend?.animation)return;let r=be(e),i=r.nodes?.filter(o=>o.type==="decl"&&o.prop.startsWith("--animate-")),n=z$1.record(z$1.string(),z$1.string()).safeParse(t.theme.extend.animation);if(n.success)for(let[o,a]of Object.entries(n.data)){let s=`--animate-${o}`;if(i?.find(m=>m.prop===s))continue;let c=x$1.decl({prop:s,value:a,raws:{semicolon:true,between:": ",before:`
37
- `}});r.append(c);}}}}function Mr(t){return t.nodes[0].toString().includes("'")?"single":"double"}function Nt(t){if(t.startsWith("hsl")||t.startsWith("rgb")||t.startsWith("#")||t.startsWith("oklch"))return false;let e=t.split(" ");return e.length===3&&e.slice(1,3).every(r=>r.includes("%"))}function zr(t){return t.startsWith("hsl")||t.startsWith("rgb")||t.startsWith("#")||t.startsWith("oklch")||t.includes("--color-")}async function O(t,e,r,i){if(t=Array.from(new Set(t)),e=Array.from(new Set(e)),!t?.length&&!e?.length)return;i={silent:false,...i};let n=D$1("Installing dependencies.",{silent:i.silent})?.start(),o=await Gr(r),a="";if(Ur(r)&&o==="npm")if(i.silent)a="force";else {n.stopAndPersist(),C.warn(`
40
+ `}});c.append(p);}i.append(c),i.insertBefore(c,x.comment({text:"---break---"}));}}}}function pi(e){return {postcssPlugin:"update-tailwind-config-animation",Once(t){if(!e?.theme?.extend?.animation)return;let i=ke(t),r=i.nodes?.filter(n=>n.type==="decl"&&n.prop.startsWith("--animate-")),o=z$1.record(z$1.string(),z$1.string()).safeParse(e.theme.extend.animation);if(o.success)for(let[n,a]of Object.entries(o.data)){let s=`--animate-${n}`;if(r?.find(m=>m.prop===s))continue;let c=x.decl({prop:s,value:a,raws:{semicolon:true,between:": ",before:`
41
+ `}});i.append(c);}}}}function di(e){return e.nodes[0].toString().includes("'")?"single":"double"}function Xt(e){if(e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch"))return false;let t=e.split(" ");return t.length===3&&t.slice(1,3).every(i=>i.includes("%"))}function ui(e){return e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch")||e.includes("--color-")}async function W(e,t,i,r$1){if(e=Array.from(new Set(e)),t=Array.from(new Set(t)),!e?.length&&!t?.length)return;r$1={silent:false,...r$1};let o=s("Installing dependencies.",{silent:r$1.silent})?.start(),n=await yi(i),a="";if(hi(i)&&n==="npm")if(r$1.silent)a="force";else {o.stopAndPersist(),r.warn(`
38
42
  It looks like you are using React 19.
39
43
  Some packages may fail to install due to peer dependency issues in npm (see https://ui.shadcn.com/react-19).
40
- `);let s=await Ce([{type:"select",name:"flag",message:"How would you like to proceed?",choices:[{title:"Use --force",value:"force"},{title:"Use --legacy-peer-deps",value:"legacy-peer-deps"}]}]);s&&(a=s.flag);}n?.start(),await Jr(o,t,e,r.resolvedPaths.cwd,a),n?.succeed();}function Ur(t){let e=w(t.resolvedPaths.cwd,false);if(!e?.dependencies?.react)return false;let r=/^(?:\^|~)?19(?:\.\d+)*(?:-.*)?$/.test(e.dependencies.react),i=e.dependencies["react-day-picker"]?.startsWith("8");return r&&i}async function Gr(t){return w(t.resolvedPaths.cwd,false)?.dependencies?.expo?"expo":a$1(t.resolvedPaths.cwd)}async function Jr(t,e,r,i,n){if(t==="npm")return Yr(e,r,i,n);if(t==="deno")return Kr(e,r,i);if(t==="expo")return qr(e,r,i);e?.length&&await execa(t,["add",...e],{cwd:i}),r?.length&&await execa(t,["add","-D",...r],{cwd:i});}async function Yr(t,e,r,i){t.length&&await execa("npm",["install",...i?[`--${i}`]:[],...t],{cwd:r}),e.length&&await execa("npm",["install",...i?[`--${i}`]:[],"-D",...e],{cwd:r});}async function Kr(t,e,r){t?.length&&await execa("deno",["add",...t.map(i=>`npm:${i}`)],{cwd:r}),e?.length&&await execa("deno",["add","-D",...e.map(i=>`npm:${i}`)],{cwd:r});}async function qr(t,e,r){t.length&&await execa("npx",["expo","install",...t],{cwd:r}),e.length&&await execa("npx",["expo","install","-- -D",...e],{cwd:r});}async function Tt(t,e,r){if(!t||Object.keys(t).length===0)return {envVarsAdded:[],envFileUpdated:null,envFileCreated:null};r={silent:false,...r};let i=D$1("Adding environment variables.",{silent:r.silent})?.start(),n=e.resolvedPaths.cwd,o=D__default.join(n,".env.local"),a=z$2(n);a&&(o=a);let s=existsSync(o),c=D__default.basename(o),m=Object.entries(t).map(([g,h])=>`${g}=${h}`).join(`
41
- `),l=[],f=null,d=null;if(s){let g=await promises.readFile(o,"utf-8"),h=B(g,m);if(l=A(g,m),l.length>0){if(await promises.writeFile(o,h,"utf-8"),f=D__default.relative(n,o),i?.succeed(`Added the following variables to ${p.info(c)}:`),!r.silent)for(let y of l)C.log(` ${p.success("+")} ${y}`);}else i?.stop();}else if(await promises.writeFile(o,m+`
42
- `,"utf-8"),d=D__default.relative(n,o),l=Object.keys(t),i?.succeed(`Added the following variables to ${p.info(c)}:`),!r.silent)for(let g of l)C.log(` ${p.success("+")} ${g}`);return !r.silent&&l.length>0&&C.break(),{envVarsAdded:l,envFileUpdated:f,envFileCreated:d}}async function Ot(t,e,r){if(!t?.length)return;let i=await x(e.resolvedPaths.cwd);if(!i||i.framework.name!=="next-app"&&i.framework.name!=="next-pages")return;let n=D$1("Updating fonts.",{silent:r.silent})?.start();try{await ri(t,e,i),n?.succeed("Updating fonts.");}catch(o){throw n?.fail("Failed to update fonts."),o}}async function ri(t,e,r){let i=await ii(e,r);if(!i)return;let n=await promises.readFile(i,"utf-8"),o=await oi(n,t);o!==n&&await promises.writeFile(i,o,"utf-8");}async function ii(t,e){let r=t.resolvedPaths.cwd,i=e.isSrcDir,o=e.isTsx?"tsx":"jsx",a=i?[`src/app/layout.${o}`,`app/layout.${o}`]:[`app/layout.${o}`];for(let s of a){let c=D__default.join(r,s);if(existsSync(c))return c}return null}async function oi(t,e,r){let n=new Project({compilerOptions:{}}).createSourceFile("layout.tsx",t,{scriptKind:ScriptKind.TSX}),o=e.filter(s=>s.font.provider==="google"),a=[];for(let s of o){let c=s.font.import;if(!c)continue;let m=si(c),l=n.getImportDeclaration(g=>g.getModuleSpecifierValue()==="next/font/google"),f=ni(s);l?l.getNamedImports().some(y=>y.getName()===c)||l.addNamedImport(c):n.addImportDeclaration({moduleSpecifier:"next/font/google",namedImports:[c]});let d=ai(n,s.font.variable);if(d)d.setInitializer(`${c}(${f})`),d.getName()!==m&&d.rename(m);else {let g=ci(n);n.insertVariableStatement(g,{declarationKind:VariableDeclarationKind.Const,declarations:[{name:m,initializer:`${c}(${f})`}]}).appendWhitespace(`
43
- `);}a.push(m);}return a.length>0&&li(n,a),n.getFullText()}function ni(t){let e={};return t.font.subsets?.length&&(e.subsets=t.font.subsets),t.font.weight?.length&&(e.weight=t.font.weight),e.variable=t.font.variable,JSON.stringify(e).replace(/"([^"]+)":/g,"$1:").replace(/"/g,"'")}function si(t){return t.split("_").map((e,r)=>r===0?e.toLowerCase():e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join("")}function ai(t,e){let r=t.getVariableStatements();for(let i of r)for(let n of i.getDeclarations()){let o=n.getInitializer();if(!o||o.getKind()!==SyntaxKind.CallExpression)continue;let s=o.getArguments();if(s.length===0)continue;let c=s[0].getText();if(c.includes("variable:")&&c.includes(e))return n}return null}function ci(t){let e=t.getImportDeclarations();return e.length>0?e[e.length-1].getChildIndex()+1:0}function li(t,e){let r=t.getDescendantsOfKind(SyntaxKind.JsxOpeningElement);for(let i of r){if(i.getTagNameNode().getText()!=="html")continue;let o=i.getAttribute("className");if(!o){let m=e.map(l=>`${l}.variable`).join(", ");e.length===1?i.addAttribute({name:"className",initializer:`{${m}}`}):(se(t),i.addAttribute({name:"className",initializer:`{cn(${m})}`}));return}if(o.getKind()!==SyntaxKind.JsxAttribute)return;let a=o.asKindOrThrow(SyntaxKind.JsxAttribute),s=a.getInitializer();if(!s)return;let c=e.map(m=>`${m}.variable`);if(s.getKind()===SyntaxKind.StringLiteral){let m=s.getText().slice(1,-1);se(t),a.setInitializer(`{cn("${m}", ${c.join(", ")})}`);}else if(s.getKind()===SyntaxKind.JsxExpression){let m=s.asKindOrThrow(SyntaxKind.JsxExpression),l=m.getExpression();if(!l)return;let f=l.getText();if(f.startsWith("cn(")){if(c.every(y=>f.includes(y)))continue;let g=pi(f),h=fi(g,c);m.replaceWithText(`{${h}}`);}else if(/^\w+\.variable$/.test(f)){if(c.includes(f))continue;c.length===1?m.replaceWithText(`{${c[0]}}`):(se(t),m.replaceWithText(`{cn(${c.join(", ")})}`));}else if(f.startsWith("`")&&f.endsWith("`")){let d=mi(f);se(t),m.replaceWithText(`{cn(${[...d,...c].join(", ")})}`);}else se(t),m.replaceWithText(`{cn(${f}, ${c.join(", ")})}`);}}}function se(t){if(!t.getImportDeclaration(r=>r.getNamedImports().some(n=>n.getName()==="cn"))){let r=t.getImportDeclaration(i=>i.getModuleSpecifierValue().includes("/lib/utils"));r?r.getNamedImports().some(n=>n.getName()==="cn")||r.addNamedImport("cn"):t.addImportDeclaration({moduleSpecifier:"@/lib/utils",namedImports:["cn"]});}}function mi(t){let e=[],r=[],n=t.slice(1,-1).split(/(\$\{[^}]+\})/);for(let o of n)if(o)if(o.startsWith("${")&&o.endsWith("}")){let a=o.slice(2,-1).trim();a&&r.push(a);}else {let a=o.trim().split(/\s+/).filter(Boolean);for(let s of a)e.push(`"${s}"`);}return [...e,...r]}function pi(t){return t.replace(/,?\s*\w+\.variable/g,"").replace(/cn\(\s*,/,"cn(")}function fi(t,e){let r=e.join(", ");return t.replace(/\)$/,`, ${r})`)}async function ve(t,e,r){r={overwrite:false,silent:false,isNewProject:false,baseStyle:true,...r};let i=await s(e);return i&&i.ui&&i.ui.resolvedPaths.cwd!==e.resolvedPaths.cwd?await gi(t,e,i,{...r,isRemote:t?.length===1&&!!t[0].match(/\/chat\/b\//)}):await ui(t,e,r)}async function ui(t,e,r){if(!r.baseStyle&&!t.length)return;let i=D$1("Checking registry.",{silent:r.silent})?.start(),n=await P(t,J(e));if(!n)return i?.fail(),Q$1(new Error("Failed to fetch components from registry."));try{At(n.files??[],e.resolvedPaths.cwd);}catch(o){return i?.fail(),Q$1(o)}i?.succeed(),await O(n.dependencies,n.devDependencies,e,{silent:r.silent}),await F$1(n.files,e,{overwrite:r.overwrite,silent:r.silent,path:r.path}),n.docs&&C.info(n.docs);}async function gi(t$1,e,r,i){if(!i.baseStyle&&!t$1.length)return;let n=D$1("Checking registry.",{silent:i.silent})?.start(),o=await P(t$1,J(e));if(!o)return n?.fail(),Q$1(new Error("Failed to fetch components from registry."));try{At(o.files??[],e.resolvedPaths.cwd);}catch(y){return n?.fail(),Q$1(y)}n?.succeed();let a=[],s=[],c=[],m=D$1("Installing components.")?.start(),l=r.ui,f=await y(l),d=u(e.resolvedPaths.cwd,l.resolvedPaths.ui);if(o.tailwind?.config&&(await N(o.tailwind?.config,l,{silent:true,tailwindVersion:f}),s.push(D__default.relative(d,l.resolvedPaths.tailwindConfig))),o.cssVars){let y=await hi(t$1,e);await $t(o.cssVars,l,{silent:true,tailwindVersion:f,tailwindConfig:o.tailwind?.config,overwriteCssVars:y}),s.push(D__default.relative(d,l.resolvedPaths.tailwindCss));}o.css&&(await It(o.css,l,{silent:true}),s.push(D__default.relative(d,l.resolvedPaths.tailwindCss))),o.envVars&&await Tt(o.envVars,l,{silent:true}),await O(o.dependencies,o.devDependencies,l,{silent:true}),await Ot(o.fonts,l,{silent:true});let g=new Map;for(let y of o.files??[]){let C=y.type||"registry:ui";g.has(C)||g.set(C,[]),g.get(C).push(y);}for(let y of Array.from(g.keys())){let C=g.get(y),v=y==="registry:ui"?r.ui:e,L=u(e.resolvedPaths.cwd,v.resolvedPaths.ui||v.resolvedPaths.cwd),E=await t(L,v.resolvedPaths.cwd)??v.resolvedPaths.cwd,B=await F$1(C,v,{overwrite:i.overwrite,silent:true,rootSpinner:m,isRemote:i.isRemote,isWorkspace:true,path:i.path});a.push(...B.filesCreated.map(j=>D__default.relative(L,D__default.join(E,j)))),s.push(...B.filesUpdated.map(j=>D__default.relative(L,D__default.join(E,j)))),c.push(...B.filesSkipped.map(j=>D__default.relative(L,D__default.join(E,j))));}if(m?.succeed(),a.sort(),s.sort(),c.sort(),!(a.length||s.length)&&!c.length&&D$1("No files updated.",{silent:i.silent})?.info(),a.length){D$1(`Created ${a.length} ${a.length===1?"file":"files"}:`,{silent:i.silent})?.succeed();for(let y of a)C.log(` - ${y}`);}if(s.length){D$1(`Updated ${s.length} ${s.length===1?"file":"files"}:`,{silent:i.silent})?.info();for(let y of s)C.log(` - ${y}`);}if(c.length){D$1(`Skipped ${c.length} ${s.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:i.silent})?.info();for(let y of c)C.log(` - ${y}`);}o.docs&&C.info(o.docs);}async function hi(t,e){let r=await S(t,{config:e});return z$1.array(n).parse(r).some(n=>n.type==="registry:theme"||n.type==="registry:style"||n.type==="registry:font"||n.type==="registry:base")}function At(t,e){for(let r of t)if(r?.target&&!Ct(r.target,e))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}var bi=z$1.object({components:z$1.array(z$1.string()).optional(),yes:z$1.boolean(),overwrite:z$1.boolean(),cwd:z$1.string(),all:z$1.boolean(),path:z$1.string().optional(),silent:z$1.boolean(),srcDir:z$1.boolean().optional(),cssVariables:z$1.boolean()}),_t=new Command().name("add").description("add a component to your project").argument("[components...]","names, url or local path to component").option("-y, --yes","skip confirmation prompt.",false).option("-o, --overwrite","overwrite existing files.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-a, --all","add all available components",false).option("-p, --path <path>","the path to add the component to.").option("-s, --silent","mute output.",false).option("--src-dir","use the src directory when creating a new project.",false).option("--no-src-dir","do not use the src directory when creating a new project.").option("--css-variables","use css variables for theming.",true).option("--no-css-variables","do not use css variables for theming.").action(async(t,e)=>{try{let r=bi.parse({components:t,cwd:D__default.resolve(e.cwd),...e});await T(r.cwd);let i=await q(r.cwd);i||(i=v({style:"new-york",resolvedPaths:{cwd:r.cwd}}));let n=["sidebar-","login-","signup-","otp-","calendar-"],o=["base-","radix-"];if(t.length>0&&i?.style&&o.some(f=>i?.style.startsWith(f))){let f=t.filter(d=>n.some(g=>d.startsWith(g)));f.length&&(C.warn(`The ${p.info(f.map(d=>d).join(", "))} component(s) are not available for the ${p.info(i.style)} style yet. They are coming soon.`),C.warn("In the meantime, you can visit the blocks page on https://ui.shadcn.com/blocks and copy the code."),C.break(),process.exit(1));}let a=!1;if(t.length>0){let{config:l,newRegistries:f}=await F(t,i,{silent:r.silent,writeFile:!1});i=l,a=f.length>0;}let s,c=!0;if(t.length>0){let[l]=await S([t[0]],{config:i});if(s=l?.type,c=s!=="registry:theme"&&s!=="registry:style",I(l)){await ve(t,i,{...r,baseStyle:c});return}if(!r.yes&&(s==="registry:style"||s==="registry:theme")){C.break();let{confirm:f}=await Ce({type:"confirm",name:"confirm",message:p.warn(`You are about to install a new ${s.replace("registry:","")}.
44
- Existing CSS variables and components will be overwritten. Continue?`)});f||(C.break(),C.log("Installation cancelled."),C.break(),process.exit(1));}}if(r.components?.length||(r.components=await xi(r)),(await x(r.cwd))?.tailwindVersion==="v4"){let l=c$1.filter(f=>r.components?.includes(f.name));l?.length&&(C.break(),l.forEach(f=>{C.warn(p.warn(f.message));}),C.break(),process.exit(1));}await ne({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:r.silent&&!a,isNewProject:!1,srcDir:r.srcDir,cssVariables:r.cssVariables,baseStyle:c,baseColor:c?void 0:"neutral",components:r.components});}catch(r){console.log("add error"),C.break(),Q$1(r);}finally{K();}});async function xi(t){let e=await V();if(!e)return C.break(),Q$1(new Error("Failed to fetch registry index.")),[];if(t.all)return e.map(n=>n.name).filter(n=>!c$1.some(o=>o.name===n));if(t.components?.length)return t.components;let{components:r}=await Ce({type:"multiselect",name:"components",message:"Which components would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:false,choices:e.filter(n=>n.type==="registry:ui"&&!c$1.some(o=>o.name===n.name)).map(n=>({title:n.name,value:n.name,selected:t.all?true:t.components?.includes(n.name)}))});r?.length||(C.warn("No components selected. Exiting."),C.info(""),process.exit(1));let i=z$1.array(z$1.string()).safeParse(r);return i.success?i.data:(C.error(""),Q$1(new Error("Something went wrong. Please try again.")),[])}async function Wt(t){let e={},r={cwd:t.cwd,registryFile:D__default.resolve(t.cwd,t.registryFile),outputDir:D__default.resolve(t.cwd,t.outputDir)};return Q.existsSync(r.registryFile)||(e["13"]=true),await Q.mkdir(r.outputDir,{recursive:true}),Object.keys(e).length>0&&(e["13"]&&(C.break(),C.error(`The path ${p.info(r.registryFile)} does not exist.`)),C.break(),process.exit(1)),{errors:e,resolvePaths:r}}var Si=z$1.object({cwd:z$1.string(),registryFile:z$1.string(),outputDir:z$1.string()}),Mt=new Command().name("build").description("build components for a shadcn registry").argument("[registry]","path to registry.json file","./registry.json").option("-o, --output <path>","destination directory for json files","./public/r").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(t,e)=>{try{let r=Si.parse({cwd:D.resolve(e.cwd),registryFile:t,outputDir:e.output}),{resolvePaths:i}=await Wt(r),n$1=await _.readFile(i.registryFile,"utf-8"),o$1=o.safeParse(JSON.parse(n$1));o$1.success||(C.error(`Invalid registry file found at ${p.info(i.registryFile)}.`),process.exit(1));let a=D$1("Building registry...");for(let s of o$1.data.items){a.start(`Building ${s.name}...`),s.$schema="https://ui.shadcn.com/schema/registry-item.json";for(let m of s.files??[])m.content=await _.readFile(D.resolve(i.cwd,m.path),"utf-8");let c=n.safeParse(s);if(!c.success){C.error(`Invalid registry item found for ${p.info(s.name)}.`);continue}await _.writeFile(D.resolve(i.outputDir,`${c.data.name}.json`),JSON.stringify(c.data,null,2));}await _.copyFile(i.registryFile,D.resolve(i.outputDir,"registry.json")),a.succeed("Building registry.");}catch(r){C.break(),Q$1(r);}});var Bt="https://ui.shadcn.com",Ii={next:"Next.js",vite:"Vite",start:"TanStack Start"},Ut=new Command().name("create").description("create a new project with shadcn/ui").argument("[name]","the name of your project").option("-t, --template <template>","the template to use. e.g. next, start or vite").option("-p, --preset [name]","use a preset configuration").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("--src-dir","use the src directory when creating a new project.",false).option("--no-src-dir","do not use the src directory when creating a new project.").option("-y, --yes","skip confirmation prompt.",true).action(async(t,e)=>{try{if(!t&&!e.template&&!e.preset){let h=Gt();C.log("Build your own shadcn/ui."),C.log(`You will be taken to ${p.info(h)} to build your custom design system.`),C.break();let{proceed:y}=await Ce({type:"confirm",name:"proceed",message:"Open in browser?",initial:!0});y&&await zt(h),process.exit(0);}let i=t;if(!i){let{enteredName:h}=await Ce({type:"text",name:"enteredName",message:"What is your project named?",initial:e.template?`${e.template}-app`:"my-app",format:y=>y.trim(),validate:y=>y.length>128?"Name should be less than 128 characters.":!0});h||process.exit(0),i=h;}let n=e.template;if(!n){let{selectedTemplate:h}=await Ce({type:"select",name:"selectedTemplate",message:`Which ${p.info("template")} would you like to use?`,choices:Object.entries(Ii).map(([y,C])=>({title:C,value:y}))});h||process.exit(0),n=h;}let o=await Pi(e.preset??!0);o||process.exit(0);let a,s;"_isUrl"in o?(a=o.url,s=new URL(o.url).searchParams.get("baseColor")??"neutral"):(a=ki(o),s=o.baseColor);let c=J({}),{config:m}=await F([a],c,{silent:!0});c=m;let[l]=await S([a],{config:c}),f;l?.type==="registry:base"&&l.config&&(f=l.config);let d=Ae.parse({cwd:D__default.resolve(e.cwd),name:i,components:[a],yes:e.yes,defaults:!1,force:!1,silent:!1,isNewProject:!0,srcDir:e.srcDir,cssVariables:!0,template:n,baseColor:s,baseStyle:!1,registryBaseConfig:f,skipPreflight:!1}),g=await ne(d);if(g){await ve(["component-example"],g,{baseStyle:!1,silent:!0,overwrite:!0});let h=Ei(n);h.length>0&&await F$1(h,g,{overwrite:!0,silent:!0});}C.log(`${p.success("Success!")} Project initialization completed.
45
- You may now add components.`),C.break();}catch(r){C.break(),Q$1(r);}finally{K();}});function ki(t){let e=new URLSearchParams({base:t.base,style:t.style,baseColor:t.baseColor,theme:t.theme,iconLibrary:t.iconLibrary,font:t.font,menuAccent:t.menuAccent,menuColor:t.menuColor,radius:t.radius});return `${ji()}?${e.toString()}`}async function Pi(t){if(t===true){let e=await ca(),{selectedPreset:r}=await Ce({type:"select",name:"selectedPreset",message:`Which ${p.info("preset")} would you like to use?`,choices:[...e.map(i=>({title:i.title,description:i.description,value:i.name})),{title:"Custom",description:"Build your own on https://ui.shadcn.com",value:"custom"}]});if(!r)return null;if(r==="custom"){let i=Gt();return C.info(`
46
- Opening ${p.info(i)} in your browser...
47
- `),await zt(i),null}return e.find(i=>i.name===r)??null}if(typeof t=="string"){if(H(t))return {_isUrl:true,url:t};let e=await da(t);if(!e){let i=(await ca()).map(n=>n.name).join(", ");C.error(`Preset "${t}" not found. Available presets: ${i}`),process.exit(1);}return e}return null}function Ei(t){switch(t){case "vite":return [{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:_e`import { ComponentExample } from "@/components/component-example";
44
+ `);let s=await Ne([{type:"select",name:"flag",message:"How would you like to proceed?",choices:[{title:"Use --force",value:"force"},{title:"Use --legacy-peer-deps",value:"legacy-peer-deps"}]}]);s&&(a=s.flag);}o?.start(),await wi(n,e,t,i.resolvedPaths.cwd,a),o?.succeed();}function hi(e){let t=n$1(e.resolvedPaths.cwd,false);if(!t?.dependencies?.react)return false;let i=/^(?:\^|~)?19(?:\.\d+)*(?:-.*)?$/.test(t.dependencies.react),r=t.dependencies["react-day-picker"]?.startsWith("8");return i&&r}async function yi(e){return n$1(e.resolvedPaths.cwd,false)?.dependencies?.expo?"expo":a$1(e.resolvedPaths.cwd)}async function wi(e,t,i,r,o){if(e==="npm")return bi(t,i,r,o);if(e==="deno")return xi(t,i,r);if(e==="expo")return vi(t,i,r);t?.length&&await execa(e,["add",...t],{cwd:r}),i?.length&&await execa(e,["add","-D",...i],{cwd:r});}async function bi(e,t,i,r){e.length&&await execa("npm",["install",...r?[`--${r}`]:[],...e],{cwd:i}),t.length&&await execa("npm",["install",...r?[`--${r}`]:[],"-D",...t],{cwd:i});}async function xi(e,t,i){e?.length&&await execa("deno",["add",...e.map(r=>`npm:${r}`)],{cwd:i}),t?.length&&await execa("deno",["add","-D",...t.map(r=>`npm:${r}`)],{cwd:i});}async function vi(e,t,i){e.length&&await execa("npx",["expo","install",...e],{cwd:i}),t.length&&await execa("npx",["expo","install","-- -D",...t],{cwd:i});}async function Zt(e,t,i){if(!e||Object.keys(e).length===0)return {envVarsAdded:[],envFileUpdated:null,envFileCreated:null};i={silent:false,...i};let r$1=s("Adding environment variables.",{silent:i.silent})?.start(),o=t.resolvedPaths.cwd,n=E__default.join(o,".env.local"),a=F(o);a&&(n=a);let s$1=existsSync(n),c=E__default.basename(n),m=Object.entries(e).map(([g,h])=>`${g}=${h}`).join(`
45
+ `),l=[],p=null,u=null;if(s$1){let g=await promises.readFile(n,"utf-8"),h=H(g,m);if(l=G(g,m),l.length>0){if(await promises.writeFile(n,h,"utf-8"),p=E__default.relative(o,n),r$1?.succeed(`Added the following variables to ${d.info(c)}:`),!i.silent)for(let y of l)r.log(` ${d.success("+")} ${y}`);}else r$1?.stop();}else if(await promises.writeFile(n,m+`
46
+ `,"utf-8"),u=E__default.relative(o,n),l=Object.keys(e),r$1?.succeed(`Added the following variables to ${d.info(c)}:`),!i.silent)for(let g of l)r.log(` ${d.success("+")} ${g}`);return !i.silent&&l.length>0&&r.break(),{envVarsAdded:l,envFileUpdated:p,envFileCreated:u}}async function er(e,t,i){if(!e?.length)return;let r=await o(t.resolvedPaths.cwd);if(!r||r.framework.name!=="next-app"&&r.framework.name!=="next-pages")return;let o$1=s("Updating fonts.",{silent:i.silent})?.start();try{await Ei(e,t,r),o$1?.succeed("Updating fonts.");}catch(n){throw o$1?.fail("Failed to update fonts."),n}}async function Ei(e,t,i){let r=await ji(t,i);if(!r)return;let o=await promises.readFile(r,"utf-8"),n=await Ni(o,e);n!==o&&await promises.writeFile(r,n,"utf-8");}async function ji(e,t){let i=e.resolvedPaths.cwd,r=t.isSrcDir,n=t.isTsx?"tsx":"jsx",a=r?[`src/app/layout.${n}`,`app/layout.${n}`]:[`app/layout.${n}`];for(let s of a){let c=E__default.join(i,s);if(existsSync(c))return c}return null}async function Ni(e,t,i){let o=new Project({compilerOptions:{}}).createSourceFile("layout.tsx",e,{scriptKind:ScriptKind.TSX}),n=t.filter(s=>s.font.provider==="google"),a=[];for(let s of n){let c=s.font.import;if(!c)continue;let m=Ti(c),l=o.getImportDeclaration(g=>g.getModuleSpecifierValue()==="next/font/google"),p=$i(s);l?l.getNamedImports().some(y=>y.getName()===c)||l.addNamedImport(c):o.addImportDeclaration({moduleSpecifier:"next/font/google",namedImports:[c]});let u=Oi(o,s.font.variable);if(u)u.setInitializer(`${c}(${p})`),u.getName()!==m&&u.rename(m);else {let g=Fi(o);o.insertVariableStatement(g,{declarationKind:VariableDeclarationKind.Const,declarations:[{name:m,initializer:`${c}(${p})`}]}).appendWhitespace(`
47
+ `);}a.push(m);}return a.length>0&&Ai(o,a),o.getFullText()}function $i(e){let t={};return e.font.subsets?.length&&(t.subsets=e.font.subsets),e.font.weight?.length&&(t.weight=e.font.weight),t.variable=e.font.variable,JSON.stringify(t).replace(/"([^"]+)":/g,"$1:").replace(/"/g,"'")}function Ti(e){return e.split("_").map((t,i)=>i===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function Oi(e,t){let i=e.getVariableStatements();for(let r of i)for(let o of r.getDeclarations()){let n=o.getInitializer();if(!n||n.getKind()!==SyntaxKind.CallExpression)continue;let s=n.getArguments();if(s.length===0)continue;let c=s[0].getText();if(c.includes("variable:")&&c.includes(t))return o}return null}function Fi(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function Ai(e,t){let i=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement);for(let r of i){if(r.getTagNameNode().getText()!=="html")continue;let n=r.getAttribute("className");if(!n){let m=t.map(l=>`${l}.variable`).join(", ");t.length===1?r.addAttribute({name:"className",initializer:`{${m}}`}):(de(e),r.addAttribute({name:"className",initializer:`{cn(${m})}`}));return}if(n.getKind()!==SyntaxKind.JsxAttribute)return;let a=n.asKindOrThrow(SyntaxKind.JsxAttribute),s=a.getInitializer();if(!s)return;let c=t.map(m=>`${m}.variable`);if(s.getKind()===SyntaxKind.StringLiteral){let m=s.getText().slice(1,-1);de(e),a.setInitializer(`{cn("${m}", ${c.join(", ")})}`);}else if(s.getKind()===SyntaxKind.JsxExpression){let m=s.asKindOrThrow(SyntaxKind.JsxExpression),l=m.getExpression();if(!l)return;let p=l.getText();if(p.startsWith("cn(")){if(c.every(y=>p.includes(y)))continue;let g=_i(p),h=Li(g,c);m.replaceWithText(`{${h}}`);}else if(/^\w+\.variable$/.test(p)){if(c.includes(p))continue;c.length===1?m.replaceWithText(`{${c[0]}}`):(de(e),m.replaceWithText(`{cn(${c.join(", ")})}`));}else if(p.startsWith("`")&&p.endsWith("`")){let u=Di(p);de(e),m.replaceWithText(`{cn(${[...u,...c].join(", ")})}`);}else de(e),m.replaceWithText(`{cn(${p}, ${c.join(", ")})}`);}}}function de(e){if(!e.getImportDeclaration(i=>i.getNamedImports().some(o=>o.getName()==="cn"))){let i=e.getImportDeclaration(r=>r.getModuleSpecifierValue().includes("/lib/utils"));i?i.getNamedImports().some(o=>o.getName()==="cn")||i.addNamedImport("cn"):e.addImportDeclaration({moduleSpecifier:"@/lib/utils",namedImports:["cn"]});}}function Di(e){let t=[],i=[],o=e.slice(1,-1).split(/(\$\{[^}]+\})/);for(let n of o)if(n)if(n.startsWith("${")&&n.endsWith("}")){let a=n.slice(2,-1).trim();a&&i.push(a);}else {let a=n.trim().split(/\s+/).filter(Boolean);for(let s of a)t.push(`"${s}"`);}return [...t,...i]}function _i(e){return e.replace(/,?\s*\w+\.variable/g,"").replace(/cn\(\s*,/,"cn(")}function Li(e,t){let i=t.join(", ");return e.replace(/\)$/,`, ${i})`)}async function Ee(e,t,i){i={overwrite:false,silent:false,isNewProject:false,baseStyle:true,...i};let r=await j(t);return r&&r.ui&&r.ui.resolvedPaths.cwd!==t.resolvedPaths.cwd?await Mi(e,t,r,{...i,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await Wi(e,t,i)}async function Wi(e,t,i){if(!i.baseStyle&&!e.length)return;let r$1=s("Checking registry.",{silent:i.silent})?.start(),o=await U(e,N(t));if(!o)return r$1?.fail(),V$1(new Error("Failed to fetch components from registry."));try{tr(o.files??[],t.resolvedPaths.cwd);}catch(n){return r$1?.fail(),V$1(n)}r$1?.succeed(),await W(o.dependencies,o.devDependencies,t,{silent:i.silent}),await J$1(o.files,t,{overwrite:i.overwrite,silent:i.silent,path:i.path}),o.docs&&r.info(o.docs);}async function Mi(e,t,i,r$1){if(!r$1.baseStyle&&!e.length)return;let o=s("Checking registry.",{silent:r$1.silent})?.start(),n=await U(e,N(t));if(!n)return o?.fail(),V$1(new Error("Failed to fetch components from registry."));try{tr(n.files??[],t.resolvedPaths.cwd);}catch(y){return o?.fail(),V$1(y)}o?.succeed();let a=[],s$1=[],c=[],m=s("Installing components.")?.start(),l$1=i.ui,p=await q(l$1),u=l(t.resolvedPaths.cwd,l$1.resolvedPaths.ui);if(n.tailwind?.config&&(await S(n.tailwind?.config,l$1,{silent:true,tailwindVersion:p}),s$1.push(E__default.relative(u,l$1.resolvedPaths.tailwindConfig))),n.cssVars){let y=await zi(e,t);await Ht(n.cssVars,l$1,{silent:true,tailwindVersion:p,tailwindConfig:n.tailwind?.config,overwriteCssVars:y}),s$1.push(E__default.relative(u,l$1.resolvedPaths.tailwindCss));}n.css&&(await Gt(n.css,l$1,{silent:true}),s$1.push(E__default.relative(u,l$1.resolvedPaths.tailwindCss))),n.envVars&&await Zt(n.envVars,l$1,{silent:true}),await W(n.dependencies,n.devDependencies,l$1,{silent:true}),await er(n.fonts,l$1,{silent:true});let g=new Map;for(let y of n.files??[]){let k=y.type||"registry:ui";g.has(k)||g.set(k,[]),g.get(k).push(y);}for(let y of Array.from(g.keys())){let k$1=g.get(y),S=y==="registry:ui"?i.ui:t,B=l(t.resolvedPaths.cwd,S.resolvedPaths.ui||S.resolvedPaths.cwd),T=await k(B,S.resolvedPaths.cwd)??S.resolvedPaths.cwd,Y=await J$1(k$1,S,{overwrite:r$1.overwrite,silent:true,rootSpinner:m,isRemote:r$1.isRemote,isWorkspace:true,path:r$1.path});a.push(...Y.filesCreated.map(O=>E__default.relative(B,E__default.join(T,O)))),s$1.push(...Y.filesUpdated.map(O=>E__default.relative(B,E__default.join(T,O)))),c.push(...Y.filesSkipped.map(O=>E__default.relative(B,E__default.join(T,O))));}if(m?.succeed(),a.sort(),s$1.sort(),c.sort(),!(a.length||s$1.length)&&!c.length&&s("No files updated.",{silent:r$1.silent})?.info(),a.length){s(`Created ${a.length} ${a.length===1?"file":"files"}:`,{silent:r$1.silent})?.succeed();for(let y of a)r.log(` - ${y}`);}if(s$1.length){s(`Updated ${s$1.length} ${s$1.length===1?"file":"files"}:`,{silent:r$1.silent})?.info();for(let y of s$1)r.log(` - ${y}`);}if(c.length){s(`Skipped ${c.length} ${s$1.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:r$1.silent})?.info();for(let y of c)r.log(` - ${y}`);}n.docs&&r.info(n.docs);}async function zi(e,t){let i=await X(e,{config:t});return z$1.array(n).parse(i).some(o=>o.type==="registry:theme"||o.type==="registry:style"||o.type==="registry:font"||o.type==="registry:base")}function tr(e,t){for(let i of e)if(i?.target&&!Bt(i.target,t))throw new Error(`We found an unsafe file path "${i.target} in the registry item. Installation aborted.`)}var Gi=z$1.object({components:z$1.array(z$1.string()).optional(),yes:z$1.boolean(),overwrite:z$1.boolean(),cwd:z$1.string(),all:z$1.boolean(),path:z$1.string().optional(),silent:z$1.boolean(),srcDir:z$1.boolean().optional(),cssVariables:z$1.boolean()}),ir=new Command().name("add").description("add a component to your project").argument("[components...]","names, url or local path to component").option("-y, --yes","skip confirmation prompt.",false).option("-o, --overwrite","overwrite existing files.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-a, --all","add all available components",false).option("-p, --path <path>","the path to add the component to.").option("-s, --silent","mute output.",false).option("--src-dir","use the src directory when creating a new project.",false).option("--no-src-dir","do not use the src directory when creating a new project.").option("--css-variables","use css variables for theming.",true).option("--no-css-variables","do not use css variables for theming.").action(async(e,t)=>{try{let i$1=Gi.parse({components:e,cwd:E__default.resolve(t.cwd),...t});await L(i$1.cwd);let r$1=await i(i$1.cwd);r$1||(r$1=m({style:"new-york",resolvedPaths:{cwd:i$1.cwd}}));let o$1=["sidebar-","login-","signup-","otp-","calendar-"],n=["base-","radix-"];if(e.length>0&&r$1?.style&&n.some(p=>r$1?.style.startsWith(p))){let p=e.filter(u=>o$1.some(g=>u.startsWith(g)));p.length&&(r.warn(`The ${d.info(p.map(u=>u).join(", "))} component(s) are not available for the ${d.info(r$1.style)} style yet. They are coming soon.`),r.warn("In the meantime, you can visit the blocks page on https://ui.shadcn.com/blocks and copy the code."),r.break(),process.exit(1));}let a=!1;if(e.length>0){let{config:l,newRegistries:p}=await V(e,r$1,{silent:i$1.silent,writeFile:!1});r$1=l,a=p.length>0;}let s,c=!0;if(e.length>0){let[l]=await X([e[0]],{config:r$1});if(s=l?.type,c=s!=="registry:theme"&&s!=="registry:style",M(l)){await Ee(e,r$1,{...i$1,baseStyle:c});return}if(!i$1.yes&&(s==="registry:style"||s==="registry:theme")){r.break();let{confirm:p}=await Ne({type:"confirm",name:"confirm",message:d.warn(`You are about to install a new ${s.replace("registry:","")}.
48
+ Existing CSS variables and components will be overwritten. Continue?`)});p||(r.break(),r.log("Installation cancelled."),r.break(),process.exit(1));}}if(i$1.components?.length||(i$1.components=await Ji(i$1)),(await o(i$1.cwd))?.tailwindVersion==="v4"){let l=c$1.filter(p=>i$1.components?.includes(p.name));l?.length&&(r.break(),l.forEach(p=>{r.warn(d.warn(p.message));}),r.break(),process.exit(1));}console.log({options:i$1}),await pe({cwd:i$1.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:i$1.silent&&!a,isNewProject:!1,srcDir:i$1.srcDir,cssVariables:i$1.cssVariables,baseStyle:c,baseColor:c?void 0:"neutral",components:i$1.components});}catch(i){console.log("add error"),r.break(),V$1(i);}finally{O();}});async function Ji(e){let t=await _();if(!t)return r.break(),V$1(new Error("Failed to fetch registry index.")),[];if(e.all)return t.map(o=>o.name).filter(o=>!c$1.some(n=>n.name===o));if(e.components?.length)return e.components;let{components:i}=await Ne({type:"multiselect",name:"components",message:"Which components would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:false,choices:t.filter(o=>o.type==="registry:ui"&&!c$1.some(n=>n.name===o.name)).map(o=>({title:o.name,value:o.name,selected:e.all?true:e.components?.includes(o.name)}))});i?.length||(r.warn("No components selected. Exiting."),r.info(""),process.exit(1));let r$1=z$1.array(z$1.string()).safeParse(i);return r$1.success?r$1.data:(r.error(""),V$1(new Error("Something went wrong. Please try again.")),[])}async function sr(e){let t={},i={cwd:e.cwd,registryFile:E__default.resolve(e.cwd,e.registryFile),outputDir:E__default.resolve(e.cwd,e.outputDir)};return v.existsSync(i.registryFile)||(t["13"]=true),await v.mkdir(i.outputDir,{recursive:true}),Object.keys(t).length>0&&(t["13"]&&(r.break(),r.error(`The path ${d.info(i.registryFile)} does not exist.`)),r.break(),process.exit(1)),{errors:t,resolvePaths:i}}var Ki=z$1.object({cwd:z$1.string(),registryFile:z$1.string(),outputDir:z$1.string()}),ar=new Command().name("build").description("build components for a shadcn registry").argument("[registry]","path to registry.json file","./registry.json").option("-o, --output <path>","destination directory for json files","./public/r").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let i=Ki.parse({cwd:E.resolve(t.cwd),registryFile:e,outputDir:t.output}),{resolvePaths:r$1}=await sr(i),o=await z.readFile(r$1.registryFile,"utf-8"),n$1=o$1.safeParse(JSON.parse(o));n$1.success||(r.error(`Invalid registry file found at ${d.info(r$1.registryFile)}.`),process.exit(1));let a=s("Building registry...");for(let s of n$1.data.items){a.start(`Building ${s.name}...`),s.$schema="https://ui.shadcn.com/schema/registry-item.json";for(let m of s.files??[])m.content=await z.readFile(E.resolve(r$1.cwd,m.path),"utf-8");let c=n.safeParse(s);if(!c.success){r.error(`Invalid registry item found for ${d.info(s.name)}.`);continue}await z.writeFile(E.resolve(r$1.outputDir,`${c.data.name}.json`),JSON.stringify(c.data,null,2));}await z.copyFile(r$1.registryFile,E.resolve(r$1.outputDir,"registry.json")),a.succeed("Building registry.");}catch(i){r.break(),V$1(i);}});var lr="https://ui.shadcn.com",Xi={next:"Next.js",vite:"Vite",start:"TanStack Start"},mr=new Command().name("create").description("create a new project with shadcn/ui").argument("[name]","the name of your project").option("-t, --template <template>","the template to use. e.g. next, start or vite").option("-p, --preset [name]","use a preset configuration").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("--src-dir","use the src directory when creating a new project.",false).option("--no-src-dir","do not use the src directory when creating a new project.").option("-y, --yes","skip confirmation prompt.",true).action(async(e,t)=>{try{if(!e&&!t.template&&!t.preset){let h=fr();r.log("Build your own shadcn/ui."),r.log(`You will be taken to ${d.info(h)} to build your custom design system.`),r.break();let{proceed:y}=await Ne({type:"confirm",name:"proceed",message:"Open in browser?",initial:!0});y&&await cr(h),process.exit(0);}let r$1=e;if(!r$1){let{enteredName:h}=await Ne({type:"text",name:"enteredName",message:"What is your project named?",initial:t.template?`${t.template}-app`:"my-app",format:y=>y.trim(),validate:y=>y.length>128?"Name should be less than 128 characters.":!0});h||process.exit(0),r$1=h;}let o=t.template;if(!o){let{selectedTemplate:h}=await Ne({type:"select",name:"selectedTemplate",message:`Which ${d.info("template")} would you like to use?`,choices:Object.entries(Xi).map(([y,k])=>({title:k,value:y}))});h||process.exit(0),o=h;}let n=await Qi(t.preset??!0);n||process.exit(0);let a,s;"_isUrl"in n?(a=n.url,s=new URL(n.url).searchParams.get("baseColor")??"neutral"):(a=Zi(n),s=n.baseColor);let c=N({}),{config:m}=await V([a],c,{silent:!0});c=m;let[l]=await X([a],{config:c}),p;l?.type==="registry:base"&&l.config&&(p=l.config);let u=Ye.parse({cwd:E__default.resolve(t.cwd),name:r$1,components:[a],yes:t.yes,defaults:!1,force:!1,silent:!1,isNewProject:!0,srcDir:t.srcDir,cssVariables:!0,template:o,baseColor:s,baseStyle:!1,registryBaseConfig:p,skipPreflight:!1}),g=await pe(u);if(g){await Ee(["component-example"],g,{baseStyle:!1,silent:!0,overwrite:!0});let h=eo(o);h.length>0&&await J$1(h,g,{overwrite:!0,silent:!0});}r.log(`${d.success("Success!")} Project initialization completed.
49
+ You may now add components.`),r.break();}catch(i){r.break(),V$1(i);}finally{O();}});function Zi(e){let t=new URLSearchParams({base:e.base,style:e.style,baseColor:e.baseColor,theme:e.theme,iconLibrary:e.iconLibrary,font:e.font,menuAccent:e.menuAccent,menuColor:e.menuColor,radius:e.radius});return `${to()}?${t.toString()}`}async function Qi(e){if(e===true){let t=await ha(),{selectedPreset:i}=await Ne({type:"select",name:"selectedPreset",message:`Which ${d.info("preset")} would you like to use?`,choices:[...t.map(r=>({title:r.title,description:r.description,value:r.name})),{title:"Custom",description:"Build your own on https://ui.shadcn.com",value:"custom"}]});if(!i)return null;if(i==="custom"){let r$1=fr();return r.info(`
50
+ Opening ${d.info(r$1)} in your browser...
51
+ `),await cr(r$1),null}return t.find(r=>r.name===i)??null}if(typeof e=="string"){if(L$1(e))return {_isUrl:true,url:e};let t=await ia(e);if(!t){let r$1=(await ha()).map(o=>o.name).join(", ");r.error(`Preset "${e}" not found. Available presets: ${r$1}`),process.exit(1);}return t}return null}function eo(e){switch(e){case "vite":return [{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:qe`import { ComponentExample } from "@/components/component-example";
48
52
 
49
53
  export function App() {
50
54
  return <ComponentExample />;
51
55
  }
52
56
 
53
57
  export default App;
54
- `}];case "next":return [{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:_e`import { ComponentExample } from "@/components/component-example";
58
+ `}];case "next":return [{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:qe`import { ComponentExample } from "@/components/component-example";
55
59
 
56
60
  export default function Page() {
57
61
  return <ComponentExample />;
58
62
  }
59
- `}];case "start":return [{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:_e`import { createFileRoute } from "@tanstack/react-router";
63
+ `}];case "start":return [{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:qe`import { createFileRoute } from "@tanstack/react-router";
60
64
  import { ComponentExample } from "@/components/component-example";
61
65
 
62
66
  export const Route = createFileRoute("/")({ component: App });
@@ -66,18 +70,18 @@ function App() {
66
70
  <ComponentExample />
67
71
  );
68
72
  }
69
- `}];default:return []}}function Gt(){return `${Bt}/create`}function ji(){return `${Bt}/init`}var Fi=z$1.object({component:z$1.string().optional(),yes:z$1.boolean(),cwd:z$1.string(),path:z$1.string().optional()}),Yt=new Command().name("diff").description("check for updates against the registry").argument("[component]","the component name").option("-y, --yes","skip confirmation prompt.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(t,e)=>{try{let r=Fi.parse({component:t,...e}),i=D__default.resolve(r.cwd);existsSync(i)||(C.error(`The path ${i} does not exist. Please try again.`),process.exit(1));let n=await q(i);n||(C.warn(`Configuration is missing. Please run ${p.success("init")} to create a components.json file.`),process.exit(1));let o=await V();if(o||(Q$1(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let c=n.resolvedPaths.components,m=o.filter(f=>{for(let d of f.files??[]){let g=D__default.resolve(c,typeof d=="string"?d:d.path);if(existsSync(g))return !0}return !1}),l=[];for(let f of m){let d=await Jt(f,n);d.length&&l.push({name:f.name,changes:d});}l.length||(C.info("No updates found."),process.exit(0)),C.info("The following components have updates available:");for(let f of l){C.info(`- ${f.name}`);for(let d of f.changes)C.info(` - ${d.filePath}`);}C.break(),C.info(`Run ${p.success("diff <component>")} to see the changes.`),process.exit(0);}let a=o.find(c=>c.name===r.component);a||(C.error(`The component ${p.success(r.component)} does not exist.`),process.exit(1));let s=await Jt(a,n);s.length||(C.info(`No updates found for ${r.component}.`),process.exit(0));for(let c of s)C.info(`- ${c.filePath}`),await Oi(c.patch),C.info("");}catch(r){Q$1(r);}});async function Jt(t,e){let r=await $(e.style,[t]),i=await Z(e.tailwind.baseColor);if(!r)return [];let n=[];for(let o of r){let a=await aa(e,o);if(a)for(let s of o.files??[]){let c=D__default.resolve(a,typeof s=="string"?s:s.path);if(!existsSync(c))continue;let m=await promises.readFile(c,"utf8");if(typeof s=="string"||!s.content)continue;let l=await E({filename:s.path,raw:s.content,config:e,baseColor:i}),f=diffLines(l,m);f.length>1&&n.push({filePath:c,patch:f});}}return n}async function Oi(t){t.forEach(e=>{if(e)return e.added?process.stdout.write(p.success(e.value)):e.removed?process.stdout.write(p.error(e.value)):process.stdout.write(e.value)});}var Kt=new Command().name("info").description("get information about your project").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async t=>{try{C.info("> project info"),console.log(await x(t.cwd)),C.break(),C.info("> components.json"),console.log(await q(t.cwd));}catch(e){Q$1(e);}});var re="latest",Ie=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${re}`,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${re}`,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{shadcn:{command:"npx",args:[`shadcn@${re}`,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.shadcn]
73
+ `}];default:return []}}function fr(){return `${lr}/create`}function to(){return `${lr}/init`}var no=z$1.object({component:z$1.string().optional(),yes:z$1.boolean(),cwd:z$1.string(),path:z$1.string().optional()}),dr=new Command().name("diff").description("check for updates against the registry").argument("[component]","the component name").option("-y, --yes","skip confirmation prompt.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let i$1=no.parse({component:e,...t}),r$1=E__default.resolve(i$1.cwd);existsSync(r$1)||(r.error(`The path ${r$1} does not exist. Please try again.`),process.exit(1));let o=await i(r$1);o||(r.warn(`Configuration is missing. Please run ${d.success("init")} to create a components.json file.`),process.exit(1));let n=await _();if(n||(V$1(new Error("Failed to fetch registry index.")),process.exit(1)),!i$1.component){let c=o.resolvedPaths.components,m=n.filter(p=>{for(let u of p.files??[]){let g=E__default.resolve(c,typeof u=="string"?u:u.path);if(existsSync(g))return !0}return !1}),l=[];for(let p of m){let u=await pr(p,o);u.length&&l.push({name:p.name,changes:u});}l.length||(r.info("No updates found."),process.exit(0)),r.info("The following components have updates available:");for(let p of l){r.info(`- ${p.name}`);for(let u of p.changes)r.info(` - ${u.filePath}`);}r.break(),r.info(`Run ${d.success("diff <component>")} to see the changes.`),process.exit(0);}let a=n.find(c=>c.name===i$1.component);a||(r.error(`The component ${d.success(i$1.component)} does not exist.`),process.exit(1));let s=await pr(a,o);s.length||(r.info(`No updates found for ${i$1.component}.`),process.exit(0));for(let c of s)r.info(`- ${c.filePath}`),await so(c.patch),r.info("");}catch(i){V$1(i);}});async function pr(e,t){let i=await ea(t.style,[e]),r=await ca(t.tailwind.baseColor);if(!i)return [];let o=[];for(let n of i){let a=await fa(t,n);if(a)for(let s of n.files??[]){let c=E__default.resolve(a,typeof s=="string"?s:s.path);if(!existsSync(c))continue;let m=await promises.readFile(c,"utf8");if(typeof s=="string"||!s.content)continue;let l=await I({filename:s.path,raw:s.content,config:t,baseColor:r}),p=diffLines(l,m);p.length>1&&o.push({filePath:c,patch:p});}}return o}async function so(e){e.forEach(t=>{if(t)return t.added?process.stdout.write(d.success(t.value)):t.removed?process.stdout.write(d.error(t.value)):process.stdout.write(t.value)});}var ur=new Command().name("info").description("get information about your project").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{try{r.info("> project info"),console.log(await o(e.cwd)),r.break(),r.info("> components.json"),console.log(await i(e.cwd));}catch(t){V$1(t);}});var ce="latest",Te=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${ce}`,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${ce}`,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{shadcn:{command:"npx",args:[`shadcn@${ce}`,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.shadcn]
70
74
  command = "npx"
71
- args = ["shadcn@${re}", "mcp"]
72
- `}],Re=[`shadcn@${re}`],Me=new Command().name("mcp").description("MCP server and configuration commands").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async t=>{try{await T(t.cwd);let e=new StdioServerTransport;await b.connect(e);}catch(e){C.break(),Q$1(e);}}),Mi=We.object({client:We.enum(["claude","cursor","vscode","codex"]),cwd:We.string()});Me.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${Ie.map(t=>t.name).join(", ")})`).action(async(t,e)=>{try{let i=(e.parent?.opts()||{}).cwd||process.cwd(),n=t.client;if(!n){let m=await Ce({type:"select",name:"client",message:"Which MCP client are you using?",choices:Ie.map(l=>({title:l.label,value:l.name}))});m.client||(C.break(),process.exit(1)),n=m.client;}let o=Mi.parse({client:n,cwd:i}),a=await q(o.cwd);if(o.client==="codex"){if(a)await O([],Re,a,{silent:!1});else {let m=await a$1(o.cwd),l=m==="npm"?"install":"add",f=m==="npm"?"--save-dev":"-D",d=D$1("Installing dependencies...").start();await execa(m,[l,f,...Re],{cwd:o.cwd}),d.succeed("Installing dependencies.");}C.break(),C.log("To configure the shadcn MCP server in Codex:"),C.break(),C.log(`1. Open or create the file ${p.info("~/.codex/config.toml")}`),C.log("2. Add the following configuration:"),C.log(),C.info(`[mcp_servers.shadcn]
75
+ args = ["shadcn@${ce}", "mcp"]
76
+ `}],$e=[`shadcn@${ce}`],Qe=new Command().name("mcp").description("MCP server and configuration commands").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{try{await L(e.cwd);let t=new StdioServerTransport;await b.connect(t);}catch(t){r.break(),V$1(t);}}),uo=Ze.object({client:Ze.enum(["claude","cursor","vscode","codex"]),cwd:Ze.string()});Qe.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${Te.map(e=>e.name).join(", ")})`).action(async(e,t)=>{try{let r$1=(t.parent?.opts()||{}).cwd||process.cwd(),o=e.client;if(!o){let m=await Ne({type:"select",name:"client",message:"Which MCP client are you using?",choices:Te.map(l=>({title:l.label,value:l.name}))});m.client||(r.break(),process.exit(1)),o=m.client;}let n=uo.parse({client:o,cwd:r$1}),a=await i(n.cwd);if(n.client==="codex"){if(a)await W([],$e,a,{silent:!1});else {let m=await a$1(n.cwd),l=m==="npm"?"install":"add",p=m==="npm"?"--save-dev":"-D",u=s("Installing dependencies...").start();await execa(m,[l,p,...$e],{cwd:n.cwd}),u.succeed("Installing dependencies.");}r.break(),r.log("To configure the shadcn MCP server in Codex:"),r.break(),r.log(`1. Open or create the file ${d.info("~/.codex/config.toml")}`),r.log("2. Add the following configuration:"),r.log(),r.info(`[mcp_servers.shadcn]
73
77
  command = "npx"
74
- args = ["shadcn@${re}", "mcp"]`),C.break(),C.info("3. Restart Codex to load the MCP server"),C.break(),process.exit(0);}let s=D$1("Configuring MCP server...").start(),c=await Bi(o);if(s.succeed("Configuring MCP server."),a)await O([],Re,a,{silent:!1});else {let m=await a$1(o.cwd),l=m==="npm"?"install":"add",f=m==="npm"?"--save-dev":"-D",d=D$1("Installing dependencies...").start();await execa(m,[l,f,...Re],{cwd:o.cwd}),d.succeed("Installing dependencies.");}C.break(),C.success(`Configuration saved to ${c}.`),C.break();}catch(r){Q$1(r);}});var zi=(t,e)=>e;async function Bi(t){let{client:e,cwd:r}=t,i=Ie.find(c=>c.name===e);if(!i)throw new Error(`Unknown client: ${e}. Available clients: ${Ie.map(c=>c.name).join(", ")}`);let n=D__default.join(r,i.configPath),o=D__default.dirname(n);await Q.ensureDir(o);let a={};try{let c=await promises.readFile(n,"utf-8");a=JSON.parse(c);}catch{}let s=Rr(a,i.config,{arrayMerge:zi});return await promises.writeFile(n,JSON.stringify(s,null,2)+`
75
- `,"utf-8"),i.configPath}var z={lucide:{name:"lucide-react",package:"lucide-react",import:"lucide-react"},radix:{name:"@radix-ui/react-icons",package:"@radix-ui/react-icons",import:"@radix-ui/react-icons"}};async function Qt(t){if(!t.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let e=t.resolvedPaths.ui,[r,i]=await Promise.all([Ji("**/*.{js,ts,jsx,tsx}",{cwd:e}),X()]);if(Object.keys(i).length===0)throw new Error("Something went wrong fetching the registry icons.");let n=Object.entries(z).map(([l,f])=>({title:f.name,value:l})),o=await Ce([{type:"select",name:"sourceLibrary",message:`Which icon library would you like to ${p.info("migrate from")}?`,choices:n},{type:"select",name:"targetLibrary",message:`Which icon library would you like to ${p.info("migrate to")}?`,choices:n}]);if(o.sourceLibrary===o.targetLibrary)throw new Error("You cannot migrate to the same icon library. Please choose a different icon library.");if(!(o.sourceLibrary in z&&o.targetLibrary in z))throw new Error("Invalid icon library. Please choose a valid icon library.");let a=z[o.sourceLibrary],s=z[o.targetLibrary],{confirm:c}=await Ce({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${p.info(r.length)} files in ${p.info(`./${D__default.relative(t.resolvedPaths.cwd,e)}`)} from ${p.info(a.name)} to ${p.info(s.name)}. Continue?`});c||(C.info("Migration cancelled."),process.exit(0)),s.package&&await O([s.package],[],t,{silent:false});let m=D$1("Migrating icons...")?.start();await Promise.all(r.map(async l=>{m.text=`Migrating ${l}...`;let f=D__default.join(e,l),d=await promises.readFile(f,"utf-8"),g=await Hi(d,o.sourceLibrary,o.targetLibrary,i);await promises.writeFile(f,g);})),m.succeed("Migration complete.");}async function Hi(t,e,r,i){let n=z[e]?.import,o=z[r]?.import,a=await promises.mkdtemp(D__default.join(tmpdir(),"shadcn-")),s=new Project({compilerOptions:{}}),c=D__default.join(a,`shadcn-icons-${randomBytes(4).toString("hex")}.tsx`),m=s.createSourceFile(c,t,{scriptKind:ScriptKind.TSX}),l=[];for(let f of m.getImportDeclarations()??[])if(f.getModuleSpecifier()?.getText()===`"${n}"`){for(let d of f.getNamedImports()??[]){let g=d.getName(),h=Object.values(i).find(y=>y[e]===g)?.[r];!h||l.includes(h)||(l.push(h),d.remove(),m.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).filter(y=>y.getTagNameNode()?.getText()===g).forEach(y=>y.getTagNameNode()?.replaceWithText(h)));}f.getNamedImports()?.length===0&&f.remove();}return l.length>0&&m.addImportDeclaration({moduleSpecifier:o,namedImports:l.map(f=>({name:f}))}),await m.getText()}function Qi(t){return t.split("-").map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join("")}function eo(t,e,r,i){let o=t.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").trim().split(",").map(a=>a.trim()).filter(Boolean);for(let a of o){let s=a.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?$/),c=a.match(/^(\w+)\s+as\s+(\w+)$/);if(s){let m=s[1],l=s[2];i==="slot"&&m==="Slot"&&!l?r.push({name:"Slot",alias:"SlotPrimitive",isType:true}):r.push({name:m,alias:l,isType:true});}else if(c){let m=c[1],l=c[2];i==="slot"&&m==="Slot"&&l==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:e}):r.push({name:m,alias:l,isType:e});}else i==="slot"&&a==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:e}):r.push({name:a,isType:e});}}async function er(t,e={}){if(!t.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let r=t.resolvedPaths.ui,i=await Ji("**/*.{js,ts,jsx,tsx}",{cwd:r});if(!e.yes){let{confirm:s}=await Ce({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${p.info(i.length)} files in ${p.info(`./${D__default.relative(t.resolvedPaths.cwd,r)}`)} to ${p.info("radix-ui")}. Continue?`});s||(C.info("Migration cancelled."),process.exit(0));}let n=D$1("Migrating imports...")?.start(),o=new Set;await Promise.all(i.map(async s=>{n.text=`Migrating ${s}...`;let c=D__default.join(r,s),m=await promises.readFile(c,"utf-8"),{content:l,replacedPackages:f}=await to(m);f.forEach(d=>o.add(d)),await promises.writeFile(c,l);})),n.succeed("Migrating imports.");let a=D$1("Updating package.json...")?.start();try{let s=w(t.resolvedPaths.cwd,!1);if(!s){a.fail("Could not read package.json"),C.warn("Could not update package.json. You may need to manually replace @radix-ui/react-* packages with radix-ui");return}let c=Array.from(o),m=["dependencies","devDependencies"];for(let l of m)if(s[l])for(let f of c)s[l][f]&&delete s[l][f];if(c.length>0){s.dependencies||(s.dependencies={}),s.dependencies["radix-ui"]="latest";let l=D__default.join(t.resolvedPaths.cwd,"package.json");await promises.writeFile(l,JSON.stringify(s,null,2)+`
76
- `),a.succeed("Updated package.json."),await O(["radix-ui"],[],t,{silent:!1});}else a.succeed("No packages found in source files.");}catch{a.fail("Failed to update package.json"),C.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui");}}async function to(t){let e=/import\s+(?:(type)\s+)?(?:\*\s+as\s+(\w+)|{([^}]+)})\s+from\s+(["'])@radix-ui\/react-([^"']+)\4(;?)/g,r=[],i=[],n=[],o='"',a=false,s=t,c;for(;(c=e.exec(t))!==null;){let[h,y,C,v,L,E,B]=c;if(E==="icons"||E.startsWith("icons/"))continue;i.push(h),i.length===1&&(o=L,a=B===";"),n.push(`@radix-ui/react-${E}`);let j=!!y;if(C){let Pe=Qi(E);r.push({name:Pe,alias:C,isType:j});}else v&&eo(v,j,r,E);}if(r.length===0)return {content:t,replacedPackages:[]};let m=r.filter((h,y,C)=>y===C.findIndex(v=>v.name===h.name&&v.alias===h.alias&&v.isType===h.isType)),f=`import { ${m.map(h=>{let y=h.isType?"type ":"";return h.alias?`${y}${h.name} as ${h.alias}`:`${y}${h.name}`}).join(", ")} } from ${o}radix-ui${o}${a?";":""}`;s=i.reduce((h,y,C)=>h.replace(y,C===0?f:""),s),s=s.replace(/\n\s*\n\s*\n/g,`
78
+ args = ["shadcn@${ce}", "mcp"]`),r.break(),r.info("3. Restart Codex to load the MCP server"),r.break(),process.exit(0);}let s$1=s("Configuring MCP server...").start(),c=await ho(n);if(s$1.succeed("Configuring MCP server."),a)await W([],$e,a,{silent:!1});else {let m=await a$1(n.cwd),l=m==="npm"?"install":"add",p=m==="npm"?"--save-dev":"-D",u=s("Installing dependencies...").start();await execa(m,[l,p,...$e],{cwd:n.cwd}),u.succeed("Installing dependencies.");}r.break(),r.success(`Configuration saved to ${c}.`),r.break();}catch(i){V$1(i);}});var go=(e,t)=>t;async function ho(e){let{client:t,cwd:i}=e,r=Te.find(c=>c.name===t);if(!r)throw new Error(`Unknown client: ${t}. Available clients: ${Te.map(c=>c.name).join(", ")}`);let o=E__default.join(i,r.configPath),n=E__default.dirname(o);await v.ensureDir(n);let a={};try{let c=await promises.readFile(o,"utf-8");a=JSON.parse(c);}catch{}let s=Kr(a,r.config,{arrayMerge:go});return await promises.writeFile(o,JSON.stringify(s,null,2)+`
79
+ `,"utf-8"),r.configPath}var J={lucide:{name:"lucide-react",package:"lucide-react",import:"lucide-react"},radix:{name:"@radix-ui/react-icons",package:"@radix-ui/react-icons",import:"@radix-ui/react-icons"}};async function br(e){if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let t=e.resolvedPaths.ui,[i,r$1]=await Promise.all([bo("**/*.{js,ts,jsx,tsx}",{cwd:t}),aa()]);if(Object.keys(r$1).length===0)throw new Error("Something went wrong fetching the registry icons.");let o=Object.entries(J).map(([l,p])=>({title:p.name,value:l})),n=await Ne([{type:"select",name:"sourceLibrary",message:`Which icon library would you like to ${d.info("migrate from")}?`,choices:o},{type:"select",name:"targetLibrary",message:`Which icon library would you like to ${d.info("migrate to")}?`,choices:o}]);if(n.sourceLibrary===n.targetLibrary)throw new Error("You cannot migrate to the same icon library. Please choose a different icon library.");if(!(n.sourceLibrary in J&&n.targetLibrary in J))throw new Error("Invalid icon library. Please choose a valid icon library.");let a=J[n.sourceLibrary],s$1=J[n.targetLibrary],{confirm:c}=await Ne({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${d.info(i.length)} files in ${d.info(`./${E__default.relative(e.resolvedPaths.cwd,t)}`)} from ${d.info(a.name)} to ${d.info(s$1.name)}. Continue?`});c||(r.info("Migration cancelled."),process.exit(0)),s$1.package&&await W([s$1.package],[],e,{silent:false});let m=s("Migrating icons...")?.start();await Promise.all(i.map(async l=>{m.text=`Migrating ${l}...`;let p=E__default.join(t,l),u=await promises.readFile(p,"utf-8"),g=await Ro(u,n.sourceLibrary,n.targetLibrary,r$1);await promises.writeFile(p,g);})),m.succeed("Migration complete.");}async function Ro(e,t,i,r){let o=J[t]?.import,n=J[i]?.import,a=await promises.mkdtemp(E__default.join(tmpdir(),"shadcn-")),s=new Project({compilerOptions:{}}),c=E__default.join(a,`shadcn-icons-${randomBytes(4).toString("hex")}.tsx`),m=s.createSourceFile(c,e,{scriptKind:ScriptKind.TSX}),l=[];for(let p of m.getImportDeclarations()??[])if(p.getModuleSpecifier()?.getText()===`"${o}"`){for(let u of p.getNamedImports()??[]){let g=u.getName(),h=Object.values(r).find(y=>y[t]===g)?.[i];!h||l.includes(h)||(l.push(h),u.remove(),m.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).filter(y=>y.getTagNameNode()?.getText()===g).forEach(y=>y.getTagNameNode()?.replaceWithText(h)));}p.getNamedImports()?.length===0&&p.remove();}return l.length>0&&m.addImportDeclaration({moduleSpecifier:n,namedImports:l.map(p=>({name:p}))}),await m.getText()}function ko(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function Po(e,t,i,r){let n=e.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").trim().split(",").map(a=>a.trim()).filter(Boolean);for(let a of n){let s=a.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?$/),c=a.match(/^(\w+)\s+as\s+(\w+)$/);if(s){let m=s[1],l=s[2];r==="slot"&&m==="Slot"&&!l?i.push({name:"Slot",alias:"SlotPrimitive",isType:true}):i.push({name:m,alias:l,isType:true});}else if(c){let m=c[1],l=c[2];r==="slot"&&m==="Slot"&&l==="Slot"?i.push({name:"Slot",alias:"SlotPrimitive",isType:t}):i.push({name:m,alias:l,isType:t});}else r==="slot"&&a==="Slot"?i.push({name:"Slot",alias:"SlotPrimitive",isType:t}):i.push({name:a,isType:t});}}async function xr(e,t={}){if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let i=e.resolvedPaths.ui,r$1=await bo("**/*.{js,ts,jsx,tsx}",{cwd:i});if(!t.yes){let{confirm:s}=await Ne({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${d.info(r$1.length)} files in ${d.info(`./${E__default.relative(e.resolvedPaths.cwd,i)}`)} to ${d.info("radix-ui")}. Continue?`});s||(r.info("Migration cancelled."),process.exit(0));}let o=s("Migrating imports...")?.start(),n=new Set;await Promise.all(r$1.map(async s=>{o.text=`Migrating ${s}...`;let c=E__default.join(i,s),m=await promises.readFile(c,"utf-8"),{content:l,replacedPackages:p}=await Eo(m);p.forEach(u=>n.add(u)),await promises.writeFile(c,l);})),o.succeed("Migrating imports.");let a=s("Updating package.json...")?.start();try{let s=n$1(e.resolvedPaths.cwd,!1);if(!s){a.fail("Could not read package.json"),r.warn("Could not update package.json. You may need to manually replace @radix-ui/react-* packages with radix-ui");return}let c=Array.from(n),m=["dependencies","devDependencies"];for(let l of m)if(s[l])for(let p of c)s[l][p]&&delete s[l][p];if(c.length>0){s.dependencies||(s.dependencies={}),s.dependencies["radix-ui"]="latest";let l=E__default.join(e.resolvedPaths.cwd,"package.json");await promises.writeFile(l,JSON.stringify(s,null,2)+`
80
+ `),a.succeed("Updated package.json."),await W(["radix-ui"],[],e,{silent:!1});}else a.succeed("No packages found in source files.");}catch{a.fail("Failed to update package.json"),r.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui");}}async function Eo(e){let t=/import\s+(?:(type)\s+)?(?:\*\s+as\s+(\w+)|{([^}]+)})\s+from\s+(["'])@radix-ui\/react-([^"']+)\4(;?)/g,i=[],r=[],o=[],n='"',a=false,s=e,c;for(;(c=t.exec(e))!==null;){let[h,y,k,S,B,T,Y]=c;if(T==="icons"||T.startsWith("icons/"))continue;r.push(h),r.length===1&&(n=B,a=Y===";"),o.push(`@radix-ui/react-${T}`);let O=!!y;if(k){let Fe=ko(T);i.push({name:Fe,alias:k,isType:O});}else S&&Po(S,O,i,T);}if(i.length===0)return {content:e,replacedPackages:[]};let m=i.filter((h,y,k)=>y===k.findIndex(S=>S.name===h.name&&S.alias===h.alias&&S.isType===h.isType)),p=`import { ${m.map(h=>{let y=h.isType?"type ":"";return h.alias?`${y}${h.name} as ${h.alias}`:`${y}${h.name}`}).join(", ")} } from ${n}radix-ui${n}${a?";":""}`;s=r.reduce((h,y,k)=>h.replace(y,k===0?p:""),s),s=s.replace(/\n\s*\n\s*\n/g,`
77
81
 
78
82
  `),m.some(h=>h.name==="Slot"&&h.alias==="SlotPrimitive")&&(s=s.split(`
79
- `).map(C=>{if(C.trim().startsWith("import "))return C;let v=C;return v=v.replace(/\b(asChild\s*\?\s*)Slot(\s*:)/g,"$1__SLOT_PLACEHOLDER__$2"),v=v.replace(/\bReact\.ComponentProps<typeof\s+Slot>/g,"React.ComponentProps<typeof __SLOT_PLACEHOLDER__>"),v=v.replace(/\bComponentProps<typeof\s+Slot>/g,"ComponentProps<typeof __SLOT_PLACEHOLDER__>"),v=v.replace(/(<\/?)Slot(\s*\/?>)/g,"$1__SLOT_PLACEHOLDER__$2"),v=v.replace(/\bSlot\b/g,(L,E,B)=>{let j=B.substring(0,E),Pe=(j.match(/"/g)||[]).length,hr=(j.match(/'/g)||[]).length;return Pe%2!==0||hr%2!==0?L:"__SLOT_PLACEHOLDER__"}),v=v.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),v}).join(`
80
- `));let g=Array.from(new Set(n));return {content:s,replacedPackages:g}}async function rr(t){let e={};if(!Q.existsSync(t.cwd)||!Q.existsSync(D__default.resolve(t.cwd,"package.json")))return e["1"]=true,{errors:e,config:null};if(!Q.existsSync(D__default.resolve(t.cwd,"components.json")))return e["3"]=true,{errors:e,config:null};try{let r=await q(t.cwd);return {errors:e,config:r}}catch{C.break(),C.error(`An invalid ${p.info("components.json")} file was found at ${p.info(t.cwd)}.
81
- Before you can run a migration, you must create a valid ${p.info("components.json")} file by running the ${p.info("init")} command.`),C.error(`Learn more at ${p.info("https://ui.shadcn.com/docs/components-json")}.`),C.break(),process.exit(1);}}var ir=[{name:"icons",description:"migrate your ui components to a different icon library."},{name:"radix",description:"migrate to radix-ui."}],oo=z$1.object({cwd:z$1.string(),list:z$1.boolean(),yes:z$1.boolean(),migration:z$1.string().refine(t=>t&&ir.some(e=>e.name===t),{message:"You must specify a valid migration. Run `shadcn migrate --list` to see available migrations."}).optional()}),or=new Command().name("migrate").description("run a migration.").argument("[migration]","the migration to run.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-l, --list","list all migrations.",false).option("-y, --yes","skip confirmation prompt.",false).action(async(t,e)=>{try{let r=oo.parse({cwd:D__default.resolve(e.cwd),migration:t,list:e.list,yes:e.yes});if(r.list||!r.migration){C.info("Available migrations:");for(let o of ir)C.info(`- ${o.name}: ${o.description}`);return}if(!r.migration)throw new Error("You must specify a migration. Run `shadcn migrate --list` to see available migrations.");let{errors:i,config:n}=await rr(r);if(i["1"]||i["3"])throw new Error("No `components.json` file found. Ensure you are at the root of your project.");if(!n)throw new Error("Something went wrong reading your `components.json` file. Please ensure you have a valid `components.json` file.");r.migration==="icons"&&await Qt(n),r.migration==="radix"&&await er(n,{yes:r.yes});}catch(r){C.break(),Q$1(r);}});async function nr(t){let e={},r={cwd:t.cwd,registryFile:D__default.resolve(t.cwd,t.registryFile),outputDir:D__default.resolve(t.cwd,t.outputDir)};if(!Q.existsSync(r.registryFile))return e["13"]=true,{errors:e,resolvePaths:null,config:null};if(!Q.existsSync(D__default.resolve(t.cwd,"components.json")))return e["3"]=true,{errors:e,resolvePaths:null,config:null};await Q.mkdir(r.outputDir,{recursive:true});try{let i=await q(t.cwd);return {errors:e,config:i,resolvePaths:r}}catch{C.break(),C.error(`An invalid ${p.info("components.json")} file was found at ${p.info(t.cwd)}.
82
- Before you can build the registry, you must create a valid ${p.info("components.json")} file by running the ${p.info("init")} command.`),C.break(),process.exit(1);}}var so=z$1.object({cwd:z$1.string(),registryFile:z$1.string(),outputDir:z$1.string(),verbose:z$1.boolean().optional().default(false)}),sr=new Command().name("registry:build").description("builds the registry [EXPERIMENTAL]").argument("[registry]","path to registry.json file","./registry.json").option("-o, --output <path>","destination directory for json files","./public/r").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-v, --verbose","verbose output").action(async(t,e)=>{await ao({cwd:D.resolve(e.cwd),registryFile:t,outputDir:e.output,verbose:e.verbose});});async function ao(t){try{let e=so.parse(t),[{errors:r,resolvePaths:i,config:n$1},o$1]=await Promise.all([nr(e),x(e.cwd)]);(r["3"]||!n$1||!o$1)&&(C.error(`A ${p.info("components.json")} file is required to build the registry. Run ${p.info("shadcn init")} to create one.`),C.break(),process.exit(1)),(r["13"]||!i)&&(C.error(`We could not find a registry file at ${p.info(D.resolve(e.cwd,e.registryFile))}.`),C.break(),process.exit(1));let a=await _.readFile(i.registryFile,"utf-8"),s=o.safeParse(JSON.parse(a));s.success||(C.error(`Invalid registry file found at ${p.info(i.registryFile)}.`),C.break(),process.exit(1));let c=D$1("Building registry..."),m=await co(s.data,n$1,o$1);for(let l of m.items)l.files=l.files?.filter((f,d,g)=>d===g.findIndex(h=>h.path===f.path)),l.dependencies&&(l.dependencies=l.dependencies.filter((f,d,g)=>d===g.findIndex(h=>h===f)));for(let l of m.items){if(!l.files)continue;c.start(`Building ${l.name}...`),l.$schema="https://ui.shadcn.com/schema/registry-item.json";for(let d of l.files){let g=D.resolve(i.cwd,d.path);try{if(!(await _.stat(g)).isFile())continue;d.content=await _.readFile(g,"utf-8");}catch(h){console.error("Error reading file in registry build:",g,h);continue}}let f=n.safeParse(l);if(!f.success){C.error(`Invalid registry item found for ${p.info(l.name)}.`);continue}await _.writeFile(D.resolve(i.outputDir,`${f.data.name}.json`),JSON.stringify(f.data,null,2));}if(await _.copyFile(i.registryFile,D.resolve(i.outputDir,"registry.json")),c.succeed("Building registry."),e.verbose){D$1(`The registry has ${p.info(m.items.length.toString())} items:`).succeed();for(let l of m.items){C.log(` - ${l.name} (${p.info(l.type)})`);for(let f of l.files??[])C.log(` - ${f.path}`);}}}catch(e){C.break(),Q$1(e);}}async function co(t,e,r){for(let i of t.items)if(i.files?.length)for(let n of i.files){let o=await G(n.path,e,r);o.files=o.files?.filter(a=>a.path!==n.path),o.files&&i.files.push(...o.files),o.dependencies&&(i.dependencies=i.dependencies?i.dependencies.concat(o.dependencies):o.dependencies);}return t}var ar=new Command().name("registry:mcp").description("starts the registry MCP server [DEPRECATED]").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async()=>{C.warn(`The ${p.info("shadcn registry:mcp")} command is deprecated. Use the ${p.info("shadcn mcp")} command instead.`),C.break();});var po=z$1.object({cwd:z$1.string(),query:z$1.string().optional(),limit:z$1.number().optional(),offset:z$1.number().optional()}),mr=new Command().name("search").alias("list").description("search items from registries").argument("<registries...>","the registry names or urls to search items from. Names must be prefixed with @.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-q, --query <query>","query string").option("-l, --limit <number>","maximum number of items to display per registry","100").option("-o, --offset <number>","number of items to skip","0").action(async(t,e)=>{try{let r=po.parse({cwd:D__default.resolve(e.cwd),query:e.query,limit:e.limit?parseInt(e.limit,10):void 0,offset:e.offset?parseInt(e.offset,10):void 0});await T(r.cwd);let i=v({style:"new-york",resolvedPaths:{cwd:r.cwd}}),n=J(i),o=D__default.resolve(r.cwd,"components.json");if(Q.existsSync(o)){let l=await Q.readJson(o),f=c.partial().parse(l);n=J({...i,...f});}let a=n;try{let l=await q(r.cwd);l&&(a=J(l));}catch{}let{config:s,newRegistries:c$1}=await F(t.map(l=>`${l}/registry`),a,{silent:!0,writeFile:!1});c$1.length>0&&(a.registries=s.registries),L(t,a);let m=await ea(t,{query:r.query,limit:r.limit,offset:r.offset,config:a});console.log(JSON.stringify(m,null,2)),process.exit(0);}catch(r){Q$1(r);}finally{K();}});var uo=z$1.object({cwd:z$1.string()}),ur=new Command().name("view").description("view items from the registry").argument("<items...>","the item names or URLs to view").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(t,e)=>{try{let r=uo.parse({cwd:D__default.resolve(e.cwd)});await T(r.cwd);let i=J({}),n=D__default.resolve(r.cwd,"components.json");if(Q.existsSync(n)){let m=await Q.readJson(n),l=c.partial().parse(m);i=J(l);}let o=i;try{let m=await q(r.cwd);m&&(o=J(m));}catch{}let{config:a,newRegistries:s}=await F(t,o,{silent:!0,writeFile:!1});s.length>0&&(o.registries=a.registries),L(t,o);let c$1=await S(t,{config:o});console.log(JSON.stringify(c$1,null,2)),process.exit(0);}catch(r){Q$1(r);}finally{K();}});var gr={version:"3.6.20"};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function yo(){let t=new Command().name("shadcn").description("add items from registries to your project").version(gr.version,"-v, --version","display the version number");t.addCommand(St).addCommand(Ut).addCommand(_t).addCommand(Yt).addCommand(ur).addCommand(mr).addCommand(or).addCommand(Kt).addCommand(Mt).addCommand(Me),t.addCommand(sr).addCommand(ar),t.parse();}yo();//# sourceMappingURL=index.js.map
83
+ `).map(k=>{if(k.trim().startsWith("import "))return k;let S=k;return S=S.replace(/\b(asChild\s*\?\s*)Slot(\s*:)/g,"$1__SLOT_PLACEHOLDER__$2"),S=S.replace(/\bReact\.ComponentProps<typeof\s+Slot>/g,"React.ComponentProps<typeof __SLOT_PLACEHOLDER__>"),S=S.replace(/\bComponentProps<typeof\s+Slot>/g,"ComponentProps<typeof __SLOT_PLACEHOLDER__>"),S=S.replace(/(<\/?)Slot(\s*\/?>)/g,"$1__SLOT_PLACEHOLDER__$2"),S=S.replace(/\bSlot\b/g,(B,T,Y)=>{let O=Y.substring(0,T),Fe=(O.match(/"/g)||[]).length,Dr=(O.match(/'/g)||[]).length;return Fe%2!==0||Dr%2!==0?B:"__SLOT_PLACEHOLDER__"}),S=S.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),S}).join(`
84
+ `));let g=Array.from(new Set(o));return {content:s,replacedPackages:g}}async function Sr(e){let t={};if(!v.existsSync(e.cwd)||!v.existsSync(E__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!v.existsSync(E__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,config:null};try{let i$1=await i(e.cwd);return {errors:t,config:i$1}}catch{r.break(),r.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e.cwd)}.
85
+ Before you can run a migration, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),r.error(`Learn more at ${d.info("https://ui.shadcn.com/docs/components-json")}.`),r.break(),process.exit(1);}}var Rr=[{name:"icons",description:"migrate your ui components to a different icon library."},{name:"radix",description:"migrate to radix-ui."}],$o=z$1.object({cwd:z$1.string(),list:z$1.boolean(),yes:z$1.boolean(),migration:z$1.string().refine(e=>e&&Rr.some(t=>t.name===e),{message:"You must specify a valid migration. Run `shadcn migrate --list` to see available migrations."}).optional()}),Cr=new Command().name("migrate").description("run a migration.").argument("[migration]","the migration to run.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-l, --list","list all migrations.",false).option("-y, --yes","skip confirmation prompt.",false).action(async(e,t)=>{try{let i=$o.parse({cwd:E__default.resolve(t.cwd),migration:e,list:t.list,yes:t.yes});if(i.list||!i.migration){r.info("Available migrations:");for(let n of Rr)r.info(`- ${n.name}: ${n.description}`);return}if(!i.migration)throw new Error("You must specify a migration. Run `shadcn migrate --list` to see available migrations.");let{errors:r$1,config:o}=await Sr(i);if(r$1["1"]||r$1["3"])throw new Error("No `components.json` file found. Ensure you are at the root of your project.");if(!o)throw new Error("Something went wrong reading your `components.json` file. Please ensure you have a valid `components.json` file.");i.migration==="icons"&&await br(o),i.migration==="radix"&&await xr(o,{yes:i.yes});}catch(i){r.break(),V$1(i);}});async function Ir(e){let t={},i$1={cwd:e.cwd,registryFile:E__default.resolve(e.cwd,e.registryFile),outputDir:E__default.resolve(e.cwd,e.outputDir)};if(!v.existsSync(i$1.registryFile))return t["13"]=true,{errors:t,resolvePaths:null,config:null};if(!v.existsSync(E__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,resolvePaths:null,config:null};await v.mkdir(i$1.outputDir,{recursive:true});try{let r=await i(e.cwd);return {errors:t,config:r,resolvePaths:i$1}}catch{r.break(),r.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e.cwd)}.
86
+ Before you can build the registry, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),r.break(),process.exit(1);}}var Oo=z$1.object({cwd:z$1.string(),registryFile:z$1.string(),outputDir:z$1.string(),verbose:z$1.boolean().optional().default(false)}),kr=new Command().name("registry:build").description("builds the registry [EXPERIMENTAL]").argument("[registry]","path to registry.json file","./registry.json").option("-o, --output <path>","destination directory for json files","./public/r").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-v, --verbose","verbose output").action(async(e,t)=>{await Fo({cwd:E.resolve(t.cwd),registryFile:e,outputDir:t.output,verbose:t.verbose});});async function Fo(e){try{let t=Oo.parse(e),[{errors:i,resolvePaths:r$1,config:o$2},n$1]=await Promise.all([Ir(t),o(t.cwd)]);(i["3"]||!o$2||!n$1)&&(r.error(`A ${d.info("components.json")} file is required to build the registry. Run ${d.info("shadcn init")} to create one.`),r.break(),process.exit(1)),(i["13"]||!r$1)&&(r.error(`We could not find a registry file at ${d.info(E.resolve(t.cwd,t.registryFile))}.`),r.break(),process.exit(1));let a=await z.readFile(r$1.registryFile,"utf-8"),s$1=o$1.safeParse(JSON.parse(a));s$1.success||(r.error(`Invalid registry file found at ${d.info(r$1.registryFile)}.`),r.break(),process.exit(1));let c=s("Building registry..."),m=await Ao(s$1.data,o$2,n$1);for(let l of m.items)l.files=l.files?.filter((p,u,g)=>u===g.findIndex(h=>h.path===p.path)),l.dependencies&&(l.dependencies=l.dependencies.filter((p,u,g)=>u===g.findIndex(h=>h===p)));for(let l of m.items){if(!l.files)continue;c.start(`Building ${l.name}...`),l.$schema="https://ui.shadcn.com/schema/registry-item.json";for(let u of l.files){let g=E.resolve(r$1.cwd,u.path);try{if(!(await z.stat(g)).isFile())continue;u.content=await z.readFile(g,"utf-8");}catch(h){console.error("Error reading file in registry build:",g,h);continue}}let p=n.safeParse(l);if(!p.success){r.error(`Invalid registry item found for ${d.info(l.name)}.`);continue}await z.writeFile(E.resolve(r$1.outputDir,`${p.data.name}.json`),JSON.stringify(p.data,null,2));}if(await z.copyFile(r$1.registryFile,E.resolve(r$1.outputDir,"registry.json")),c.succeed("Building registry."),t.verbose){s(`The registry has ${d.info(m.items.length.toString())} items:`).succeed();for(let l of m.items){r.log(` - ${l.name} (${d.info(l.type)})`);for(let p of l.files??[])r.log(` - ${p.path}`);}}}catch(t){r.break(),V$1(t);}}async function Ao(e,t,i){for(let r of e.items)if(r.files?.length)for(let o of r.files){let n=await K(o.path,t,i);n.files=n.files?.filter(a=>a.path!==o.path),n.files&&r.files.push(...n.files),n.dependencies&&(r.dependencies=r.dependencies?r.dependencies.concat(n.dependencies):n.dependencies);}return e}var Pr=new Command().name("registry:mcp").description("starts the registry MCP server [DEPRECATED]").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async()=>{r.warn(`The ${d.info("shadcn registry:mcp")} command is deprecated. Use the ${d.info("shadcn mcp")} command instead.`),r.break();});var Lo=z$1.object({cwd:z$1.string(),query:z$1.string().optional(),limit:z$1.number().optional(),offset:z$1.number().optional()}),Nr=new Command().name("search").alias("list").description("search items from registries").argument("<registries...>","the registry names or urls to search items from. Names must be prefixed with @.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-q, --query <query>","query string").option("-l, --limit <number>","maximum number of items to display per registry","100").option("-o, --offset <number>","number of items to skip","0").action(async(e,t)=>{try{let i$1=Lo.parse({cwd:E__default.resolve(t.cwd),query:t.query,limit:t.limit?parseInt(t.limit,10):void 0,offset:t.offset?parseInt(t.offset,10):void 0});await L(i$1.cwd);let r=m({style:"new-york",resolvedPaths:{cwd:i$1.cwd}}),o=N(r),n=E__default.resolve(i$1.cwd,"components.json");if(v.existsSync(n)){let l=await v.readJson(n),p=c.partial().parse(l);o=N({...r,...p});}let a=o;try{let l=await i(i$1.cwd);l&&(a=N(l));}catch{}let{config:s,newRegistries:c$1}=await V(e.map(l=>`${l}/registry`),a,{silent:!0,writeFile:!1});c$1.length>0&&(a.registries=s.registries),P(e,a);let m$1=await ja(e,{query:i$1.query,limit:i$1.limit,offset:i$1.offset,config:a});console.log(JSON.stringify(m$1,null,2)),process.exit(0);}catch(i){V$1(i);}finally{O();}});var Wo=z$1.object({cwd:z$1.string()}),Fr=new Command().name("view").description("view items from the registry").argument("<items...>","the item names or URLs to view").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let i$1=Wo.parse({cwd:E__default.resolve(t.cwd)});await L(i$1.cwd);let r=N({}),o=E__default.resolve(i$1.cwd,"components.json");if(v.existsSync(o)){let m=await v.readJson(o),l=c.partial().parse(m);r=N(l);}let n=r;try{let m=await i(i$1.cwd);m&&(n=N(m));}catch{}let{config:a,newRegistries:s}=await V(e,n,{silent:!0,writeFile:!1});s.length>0&&(n.registries=a.registries),P(e,n);let c$1=await X(e,{config:n});console.log(JSON.stringify(c$1,null,2)),process.exit(0);}catch(i){V$1(i);}finally{O();}});var Ar={version:"3.6.22"};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function Bo(){let e=new Command().name("shadcn").description("add items from registries to your project").version(Ar.version,"-v, --version","display the version number");e.addCommand(zt).addCommand(mr).addCommand(ir).addCommand(dr).addCommand(Fr).addCommand(Nr).addCommand(Cr).addCommand(ur).addCommand(ar).addCommand(Qe),e.addCommand(kr).addCommand(Pr),e.parse();}Bo();//# sourceMappingURL=index.js.map
83
87
  //# sourceMappingURL=index.js.map