shadcn 4.3.1 → 4.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +71 -67
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,50 +1,50 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {b as b$1,a as a$2}from'./chunk-KJ7WG52C.js';import {r,q}from'./chunk-XEZLDAV3.js';import {b,a,G as G$1,ra as ra$1,ua
|
|
2
|
+
import {b as b$1,a as a$2}from'./chunk-KJ7WG52C.js';import {r,q}from'./chunk-XEZLDAV3.js';import {b,a,G as G$1,ra as ra$1,ua,c as c$1,$,V,sa,N,O,w,d,P,M,fa as fa$1,ha,K,L,I,J as J$1,ta as ta$1,T as T$1,ba as ba$1,H as H$1,e,ea as ea$1,S,ka,ia,la as la$1,B as B$1,x,y,A,z as z$2,ma,U as U$1,W,va,_,X,na,ga,qa,q as q$1,Z,k,R,Y as Y$1,Q,D as D$1,E,F,s,C,r as r$1,t,v,u}from'./chunk-42UQOK2K.js';export{ka as fetchTree,la as getItemTargetPath,pa as getPreset,oa as getPresets,ma as getRegistries,da as getRegistriesConfig,na as getRegistriesIndex,aa as getRegistry,ia as getRegistryBaseColor,ha as getRegistryBaseColors,ga as getRegistryIcons,ba as getRegistryItems,fa as getRegistryStyles,ea as getShadcnRegistryIndex,ca as resolveRegistryItems,ja as resolveTree}from'./chunk-42UQOK2K.js';import {c,o,n}from'./chunk-HW2MEAJZ.js';import {a as a$1,c as c$2,g,d as d$1,f,e as e$1}from'./chunk-WLJDV6SE.js';import {a as a$3}from'./chunk-CHWMSXYA.js';import*as ie from'path';import ie__default,{join}from'path';import {promises,existsSync}from'fs';import xr from'fast-glob';import T from'fs-extra';import Mo from'open';import we from'prompts';import xn from'dedent';import Bo,{tmpdir}from'os';import {execa}from'execa';import $$1 from'postcss';import Xo from'postcss/lib/at-rule';import yr,{z as z$1}from'zod';import {twMerge}from'tailwind-merge';import {Project,ScriptKind,SyntaxKind,VariableDeclarationKind}from'ts-morph';import bn from'deepmerge';import {Command}from'commander';import {diffLines,structuredPatch,diffWords}from'diff';import {dim,yellow,bold,green,cyan,red}from'kleur/colors';import*as Fe from'fs/promises';import Fe__default from'fs/promises';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {randomBytes}from'crypto';var Do=["next.config.*","vite.config.*","astro.config.*","remix.config.*","nuxt.config.*","svelte.config.*","gatsby-config.*","angular.json"];async function J(e){if(T.existsSync(ie__default.resolve(e,"pnpm-workspace.yaml")))return true;let t=ie__default.resolve(e,"package.json");if(T.existsSync(t))try{if((await T.readJson(t)).workspaces)return !0}catch{}return !!(T.existsSync(ie__default.resolve(e,"lerna.json"))||T.existsSync(ie__default.resolve(e,"nx.json")))}async function G(e){let t=await Lo(e);if(!t.length)return [];let r=await xr(t,{cwd:e,onlyDirectories:true,ignore:["**/node_modules/**"]}),n=[];for(let i of r){let o=ie__default.resolve(e,i);if(!T.existsSync(ie__default.resolve(o,"package.json")))continue;let s=T.existsSync(ie__default.resolve(o,"components.json")),c=Do.some(a=>xr.sync(a,{cwd:o,dot:true}).length>0);(s||c)&&n.push({name:i,hasConfig:s});}return n}function H(e,t,r){let n=r?.cwdFlag??"-c";b.break(),b.log(`It looks like you are running ${a.info(e)} from a monorepo root.`),b.log(`To use shadcn in a specific workspace, use the ${a.info(n)} flag:`),b.break();for(let i of t)b.log(` shadcn ${e} ${n} ${i.name}`);b.break();}async function Lo(e){let t=[],r=ie__default.resolve(e,"pnpm-workspace.yaml");if(T.existsSync(r)){let i=await T.readFile(r,"utf8"),o=Array.from(i.matchAll(/^\s*-\s*["']?([^"'\n#]+)["']?\s*$/gm));for(let s of o)t.push(s[1].trim());}let n=ie__default.resolve(e,"package.json");if(T.existsSync(n))try{let i=await T.readJson(n),o=Array.isArray(i.workspaces)?i.workspaces:i.workspaces?.packages;Array.isArray(o)&&t.push(...o.filter(s=>!s.startsWith("!")));}catch{}return Array.from(new Set(t))}async function nn(e){let t={};if(!T.existsSync(e.cwd)||!T.existsSync(ie__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,projectInfo:null};let r=w("Preflight checks.",{silent:e.silent}).start();T.existsSync(ie__default.resolve(e.cwd,"components.json"))&&!e.force&&(r?.fail(),b.break(),b.error(`A ${a.info("components.json")} file already exists at ${a.info(e.cwd)}.
|
|
3
3
|
To start over, remove the ${a.info("components.json")} file and run ${a.info("init")} again.`),b.break(),process.exit(1)),r?.succeed();let n=w("Verifying framework.",{silent:e.silent}).start(),i=e.existingConfig?.tailwind,o=await ra$1(e.cwd,{configCssFile:typeof i?.css=="string"?i.css:void 0});if(!o||o?.framework.name==="manual"){if(t["7"]=true,n?.fail(),!e.monorepo&&await J(e.cwd)){let f=await G(e.cwd);f.length>0&&(H("init",f),process.exit(1));}b.break(),o?.framework.links.installation&&b.error(`We could not detect a supported framework at ${a.info(e.cwd)}.
|
|
4
4
|
Visit ${a.info(o?.framework.links.installation)} to manually configure your project.
|
|
5
|
-
Once configured, you can use the cli to add components.`),b.break(),process.exit(1);}n?.succeed(`Verifying framework. Found ${a.info(o.framework.label)}.`);let s="Validating Tailwind CSS.";o.tailwindVersion==="v4"&&(s=`Validating Tailwind CSS. Found ${a.info("v4")}.`);let c=w(s,{silent:e.silent}).start();o.tailwindVersion==="v3"&&(!o?.tailwindConfigFile||!o?.tailwindCssFile)?(t["5"]=true,c?.fail()):o.tailwindVersion==="v4"&&!o?.tailwindCssFile?(t["5"]=true,c?.fail()):o.tailwindVersion?c?.succeed():(t["5"]=true,c?.fail());let a$1=w("Validating import alias.",{silent:e.silent}).start();return o?.aliasPrefix?a$1?.succeed():(t["6"]=true,a$1?.fail()),Object.keys(t).length>0&&(t["5"]&&(b.break(),b.error(`No Tailwind CSS configuration found at ${a.info(e.cwd)}.`),b.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),b.error("Install Tailwind CSS then try again."),o?.framework.links.tailwind&&b.error(`Visit ${a.info(o?.framework.links.tailwind)} to get started.`)),t["6"]&&(b.break(),b.error("No import alias found in your tsconfig.json file."),o?.framework.links.installation&&b.error(`Visit ${a.info(o?.framework.links.installation)} to learn how to set an import alias.`)),b.break(),process.exit(1)),{errors:t,projectInfo:o}}async function
|
|
6
|
-
`,"utf-8"),m.succeed();}return {config:a,newRegistries:Object.keys(s)}}var
|
|
5
|
+
Once configured, you can use the cli to add components.`),b.break(),process.exit(1);}n?.succeed(`Verifying framework. Found ${a.info(o.framework.label)}.`);let s="Validating Tailwind CSS.";o.tailwindVersion==="v4"&&(s=`Validating Tailwind CSS. Found ${a.info("v4")}.`);let c=w(s,{silent:e.silent}).start();o.tailwindVersion==="v3"&&(!o?.tailwindConfigFile||!o?.tailwindCssFile)?(t["5"]=true,c?.fail()):o.tailwindVersion==="v4"&&!o?.tailwindCssFile?(t["5"]=true,c?.fail()):o.tailwindVersion?c?.succeed():(t["5"]=true,c?.fail());let a$1=w("Validating import alias.",{silent:e.silent}).start();return o?.aliasPrefix?a$1?.succeed():(t["6"]=true,a$1?.fail()),Object.keys(t).length>0&&(t["5"]&&(b.break(),b.error(`No Tailwind CSS configuration found at ${a.info(e.cwd)}.`),b.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),b.error("Install Tailwind CSS then try again."),o?.framework.links.tailwind&&b.error(`Visit ${a.info(o?.framework.links.tailwind)} to get started.`)),t["6"]&&(b.break(),b.error("No import alias found in your tsconfig.json file."),o?.framework.links.installation&&b.error(`Visit ${a.info(o?.framework.links.installation)} to learn how to set an import alias.`)),b.break(),process.exit(1)),{errors:t,projectInfo:o}}async function on(e,t){let r=new Set,n=new Set,i=[...e];for(;i.length>0;){let o=i.shift();if(n.has(o))continue;n.add(o);let{registry:s}=q$1(o);s&&!d[s]&&r.add(s);try{let[c]=await Z([o],t,{useCache:!0});if(c?.registryDependencies)for(let a of c.registryDependencies){let{registry:f}=q$1(a);f&&!d[f]&&r.add(f),n.has(a)||i.push(a);}}catch(c){if(c instanceof k){let{registry:a}=q$1(o);a&&!d[a]&&r.add(a);continue}continue}}return Array.from(r)}async function U(e,t,r={}){r={silent:false,writeFile:true,...r};let i=(await on(e,t)).filter(f=>!t.registries?.[f]&&!Object.keys(d).includes(f));if(i.length===0)return {config:t,newRegistries:[]};let o=await na({useCache:process.env.NODE_ENV!=="development"});if(!o)return {config:t,newRegistries:[]};let s={};for(let f of i)o[f]&&(s[f]=o[f]);if(Object.keys(s).length===0)return {config:t,newRegistries:[]};let c$1=Object.fromEntries(Object.entries(t.registries||{}).filter(([f])=>!Object.keys(d).includes(f))),a={...t,registries:{...c$1,...s}};if(r.writeFile){let{resolvedPaths:f,...p}=a,m=w("Updating components.json.",{silent:r.silent}).start(),d=c.parse(p);await T.writeFile(ie__default.resolve(t.resolvedPaths.cwd,"components.json"),JSON.stringify(d,null,2)+`
|
|
6
|
+
`,"utf-8"),m.succeed();}return {config:a,newRegistries:Object.keys(s)}}var pe={nova:{title:"Nova",description:"Lucide / Geist",style:"nova",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"geist",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},vega:{title:"Vega",description:"Lucide / Inter",style:"vega",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},maia:{title:"Maia",description:"Hugeicons / Figtree",style:"maia",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"hugeicons",font:"figtree",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},lyra:{title:"Lyra",description:"Phosphor / JetBrains Mono",style:"lyra",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"phosphor",font:"jetbrains-mono",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},mira:{title:"Mira",description:"Hugeicons / Inter",style:"mira",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"hugeicons",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},luma:{title:"Luma",description:"Lucide / Inter",style:"luma",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},sera:{title:"Sera",description:"Lucide / Noto Sans + Playfair Display",style:"sera",baseColor:"taupe",theme:"taupe",chartColor:"taupe",iconLibrary:"lucide",font:"noto-sans",fontHeading:"playfair-display",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false}};function tr(e){let t=new URL(`${c$1}/create`),{rtl:r,...n}=e??{};for(let[i,o]of Object.entries(n))o!==void 0&&t.searchParams.set(i,String(o));return r&&t.searchParams.set("rtl","true"),t.toString()}async function rr(e){if(b.break(),b.log(` Build your custom preset on ${a.info(e.createUrl)}`),b.log(` ${e.followUp}`),b.break(),e.prompt===false)return;let{proceed:t}=await we({type:"confirm",name:"proceed",message:"Open in browser?",initial:true});t&&await Mo(e.createUrl);}function me(e,t){let r=new URLSearchParams({base:e.base,style:e.style,baseColor:e.baseColor,theme:e.theme,iconLibrary:e.iconLibrary,font:e.font,rtl:String(e.rtl??false),menuAccent:e.menuAccent,menuColor:e.menuColor,radius:e.radius});return e.chartColor&&r.set("chartColor",e.chartColor),e.fontHeading&&e.fontHeading!=="inherit"&&r.set("fontHeading",e.fontHeading),t?.preset&&r.set("preset",t.preset),t?.template&&r.set("template",t.template),t?.only&&r.set("only",t.only),r.set("track","1"),`${c$1}/init?${r.toString()}`}async function _e(){let{base:e}=await we({type:"select",name:"base",message:`Select a ${a.info("component library")}`,choices:[{title:"Radix",value:"radix"},{title:"Base",value:"base"}]});return e||process.exit(1),e}async function qe(e){let t=Object.entries(pe),{selectedPreset:r}=await we({type:"select",name:"selectedPreset",message:`Which ${a.info("preset")} would you like to use?`,choices:[...t.map(([i,o])=>({title:o.title,description:o.description,value:i})),{title:"Custom",description:`Build your own at ${a.info(`${c$1}/create`)}`,value:"custom"}]});if(r||process.exit(1),r==="custom"){let i=tr({command:"init",rtl:e.rtl,base:e.base,...e.template&&{template:e.template}});await rr({createUrl:i,followUp:`Then ${a.info("copy and run the command")} from ui.shadcn.com.`}),process.exit(0);}let n=pe[r];return n||process.exit(1),{url:me({...n,base:e.base,rtl:e.rtl},{template:e.template}),base:e.base}}async function Se(e,t,r){let n=U$1(T$1({resolvedPaths:{cwd:t},...r?.registries&&{registries:r.registries}})),{config:i}=await U([e],n,{silent:true,writeFile:false});n=i,X(e,n);let[o]=await ba$1([e],{config:n,useCache:true}),s=o?.type==="registry:base"&&o.config?o.config:void 0,c=e;if(Wo(e)){let a=new URL(e);a.searchParams.delete("track"),c=a.toString();}return {registryBaseConfig:s,installStyleIndex:o?.extends!=="none",url:c}}function Wo(e){try{return new URL(e).pathname==="/init"&&e.startsWith(c$1)}catch{return false}}var zo=process.env.SHADCN_GITHUB_URL??"https://github.com/shadcn-ui/ui.git";function B(e){return {...e,frameworks:e.frameworks??[],scaffold:e.scaffold??an({title:e.title,templateDir:e.templateDir}),postInit:e.postInit??Yo}}function $e(e,{monorepo:t}){if(!t||!e.monorepo)return e;let r=e.monorepo,n={...e,templateDir:r.templateDir,defaultProjectName:r.defaultProjectName??r.templateDir,init:r.init??e.init,files:r.files??e.files};return n.scaffold=an({title:e.title,templateDir:r.templateDir}),n}function Jo(e){switch(e){case "pnpm":return ["--no-frozen-lockfile"];default:return []}}async function Go(e,t){if(t==="pnpm")return;let r=ie__default.join(e,"pnpm-workspace.yaml"),n=ie__default.join(e,"package.json"),i=ie__default.join(e,"pnpm-lock.yaml");T.existsSync(i)&&await T.remove(i);let o=T.existsSync(r);if(T.existsSync(n)){let s=await T.readFile(n,"utf8"),c=JSON.parse(s);if(o?c.packageManager=await Ho(t):delete c.packageManager,o){let a=await T.readFile(r,"utf8"),f=[];for(let p of a.split(`
|
|
7
7
|
`)){let m=p.match(/^\s*-\s*["']?(.+?)["']?\s*$/);m&&f.push(m[1]);}c.workspaces=f,await T.remove(r);}await T.writeFile(n,JSON.stringify(c,null,2)+`
|
|
8
|
-
`);}o&&t==="npm"&&await
|
|
9
|
-
`);}}}function
|
|
10
|
-
`);}i?.succeed(`Creating a new ${e} project.`);}catch(o){i?.fail(`Something went wrong creating a new ${e} project.`),$(o);}}}async function
|
|
11
|
-
|
|
12
|
-
`)),s}function
|
|
13
|
-
`,between:" "}}),t.append(r),t.insertBefore(r,$$1.comment({text:"---break---"}))),r!==void 0&&Object.entries(e).forEach(([n,i])=>{let o=n==="light"?":root":`.${n}`;
|
|
14
|
-
`}}),e.append(n)),Object.entries(r).forEach(([i,o])=>{let s=`--${i.replace(/^--/,"")}`,c=$$1.decl({prop:s,value:o,raws:{semicolon:true}}),a=n?.nodes.find(f=>f.type==="decl"&&f.prop===s);a?a.replaceWith(c):n?.append(c);});}function
|
|
15
|
-
`}}),r.append(s),r.insertBefore(s,$$1.comment({text:"---break---"}))),Object.entries(i).forEach(([c,a])=>{let f=`--${c.replace(/^--/,"")}`;f==="--sidebar-background"&&(f="--sidebar"),
|
|
16
|
-
`}}),e.append(t),e.insertBefore(t,$$1.comment({text:"---break---"}))),t}function
|
|
17
|
-
`}});if(n.length>0){let o=n[n.length-1];t.insertAfter(o,i);}else t.insertAfter(t.nodes[0],i);t.insertBefore(i,$$1.comment({text:"---break---"}));}}}}function
|
|
18
|
-
`}});t.insertAfter(o,a),t.insertBefore(a,$$1.comment({text:"---break---"}));}}}}function
|
|
8
|
+
`);}o&&t==="npm"&&await sn(e);}async function Ho(e){try{let{stdout:t}=await execa(e,["--version"]);return `${e}@${t.trim()}`}catch{return `${e}@*`}}async function sn(e){let t=await T.readdir(e,{withFileTypes:true});for(let r of t){if(r.name==="node_modules")continue;let n=ie__default.join(e,r.name);if(r.isDirectory())await sn(n);else if(r.name==="package.json"){let i=await T.readFile(n,"utf8");if(!i.includes("workspace:"))continue;let o=JSON.parse(i),s=false;for(let c of ["dependencies","devDependencies","peerDependencies","optionalDependencies"]){let a=o[c];if(a)for(let[f,p]of Object.entries(a))typeof p=="string"&&p.startsWith("workspace:")&&(a[f]="*",s=true);}s&&await T.writeFile(n,JSON.stringify(o,null,2)+`
|
|
9
|
+
`);}}}function an({title:e,templateDir:t}){return async({projectPath:r,packageManager:n})=>{let i=w(`Creating a new ${e} project. This may take a few minutes.`).start();try{let o=process.env.SHADCN_TEMPLATE_DIR;if(o){let f=ie__default.resolve(o,t);await T.copy(f,r,{filter:p=>!p.includes("node_modules")});}else {let f=ie__default.join(Bo.tmpdir(),`shadcn-template-${Date.now()}`);await execa("git",["clone","--depth","1","--filter=blob:none","--sparse",zo,f]),await execa("git",["-C",f,"sparse-checkout","set",`templates/${t}`]);let p=ie__default.resolve(f,"templates",t);await T.move(p,r),await T.remove(f);}await Go(r,n);let c=["install",...Jo(n)];await execa(n,c,{cwd:r});let a=ie__default.join(r,"package.json");if(T.existsSync(a)){let f=await T.readFile(a,"utf8"),p=JSON.parse(f);p.name=ie__default.basename(r),await T.writeFile(a,JSON.stringify(p,null,2)+`
|
|
10
|
+
`);}i?.succeed(`Creating a new ${e} project.`);}catch(o){i?.fail(`Something went wrong creating a new ${e} project.`),$(o);}}}async function Yo({projectPath:e}){try{await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","feat: initial commit"],{cwd:e});}catch{}}var cn={"--font-heading":"cn-font-heading"};function Ko(e){return e.startsWith("--")?e:`--${e}`}function Ie(e){let t=new Set;for(let r of e){for(let n of r.fonts??[]){let i=n.font?.variable;if(!i)continue;let o=cn[i];o&&t.add(o);}for(let n of Object.values(r.cssVars??{}))for(let i of Object.keys(n??{})){let o=cn[Ko(i)];o&&t.add(o);}}return Array.from(t)}function ln(e,t){if(e.includes("\0"))return false;let r;try{r=e;let d="";for(;r!==d&&r.includes("%");)d=r,r=decodeURIComponent(r);}catch{return false}let n=ie__default.normalize(r.replace(/\\/g,"/")),i=ie__default.normalize(t),o=d=>d.replace(/\[\.\.\..*?\]/g,"").includes("..");if(o(n)||o(r)||o(e))return false;let s=d=>d.replace(/\[\.\.\..*?\]/g,""),c=s(e),a=s(r);if([/\.\.[\/\\]/,/[\/\\]\.\./,/\.\./,/\.\.%/,/\x00/,/[\x01-\x1f]/].some(d=>d.test(c)||d.test(a))||(e.includes("~")||r.includes("~"))&&(e.includes("../")||r.includes("../")))return false;if(/^[a-zA-Z]:[\/\\]/.test(r))return process.platform==="win32"?r.toLowerCase().startsWith(t.toLowerCase()):false;if(ie__default.isAbsolute(n))return n.startsWith(i+ie__default.sep);let m=ie__default.resolve(i,n);return m.startsWith(i+ie__default.sep)||m===i}async function Pt(e,t,r){if(!t.resolvedPaths.tailwindCss||!Object.keys(e??{}).length)return;r={cleanupDefaultNextStyles:false,silent:false,tailwindVersion:"v3",overwriteCssVars:false,...r};let n=t.resolvedPaths.tailwindCss,i=ie__default.relative(t.resolvedPaths.cwd,n),o=w(`Updating CSS variables in ${a.info(i)}`,{silent:r.silent}).start(),s=await promises.readFile(n,"utf8"),c=await Xe(s,e??{},t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars});await promises.writeFile(n,c,"utf8"),o.succeed();}async function Xe(e,t,r,n={cleanupDefaultNextStyles:false,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:false}){n={cleanupDefaultNextStyles:false,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:false,...n};let i=[Zo(t)];n.cleanupDefaultNextStyles&&i.push(mn()),n.tailwindVersion==="v4"&&(i=[],i.push(ri({params:"dark (&:is(.dark *))"})),n.cleanupDefaultNextStyles&&i.push(mn()),i.push(ei(t,{overwriteCssVars:n.overwriteCssVars})),i.push(ti(t)),n.tailwindConfig&&(i.push(ni(n.tailwindConfig)),i.push(ii(n.tailwindConfig)),i.push(oi(n.tailwindConfig))));let s=(await $$1(i).process(e,{from:void 0})).css;return s=s.replace(/\/\* ---break--- \*\//g,""),n.tailwindVersion==="v4"&&(s=s.replace(/(\n\s*\n)+/g,`
|
|
11
|
+
|
|
12
|
+
`)),s}function Zo(e){return {postcssPlugin:"update-css-vars",Once(t){let r=t.nodes.find(n=>n.type==="atrule"&&n.name==="layer"&&n.params==="base");r instanceof Xo||(r=$$1.atRule({name:"layer",params:"base",nodes:[],raws:{semicolon:true,before:`
|
|
13
|
+
`,between:" "}}),t.append(r),t.insertBefore(r,$$1.comment({text:"---break---"}))),r!==void 0&&Object.entries(e).forEach(([n,i])=>{let o=n==="light"?":root":`.${n}`;Qo(r,o,i);});}}}function pn(e){let t=e.nodes.find(r=>r.type==="rule"&&r.selector===":root");if(t){let r=["--background","--foreground"];t.nodes.filter(n=>n.type==="decl"&&r.includes(n.prop)).forEach(n=>n.remove()),t.nodes.length===0&&t.remove();}}function mn(){return {postcssPlugin:"cleanup-default-next-styles",Once(e){let t=e.nodes.find(n=>n.type==="rule"&&n.selector==="body");t&&(t.nodes.find(n=>n.type==="decl"&&n.prop==="color"&&["rgb(var(--foreground-rgb))","var(--foreground)"].includes(n.value))?.remove(),t.nodes.find(n=>n.type==="decl"&&n.prop==="background"&&(n.value.startsWith("linear-gradient")||n.value==="var(--background)"))?.remove(),t.nodes.find(n=>n.type==="decl"&&n.prop==="font-family"&&n.value==="Arial, Helvetica, sans-serif")?.remove(),t.nodes.length===0&&t.remove()),pn(e);let r=e.nodes.find(n=>n.type==="atrule"&&n.params==="(prefers-color-scheme: dark)");r&&(pn(r),r.nodes.length===0&&r.remove());}}}function Qo(e,t,r){let n=e.nodes?.find(i=>i.type==="rule"&&i.selector===t);n||Object.keys(r).length>0&&(n=$$1.rule({selector:t,raws:{between:" ",before:`
|
|
14
|
+
`}}),e.append(n)),Object.entries(r).forEach(([i,o])=>{let s=`--${i.replace(/^--/,"")}`,c=$$1.decl({prop:s,value:o,raws:{semicolon:true}}),a=n?.nodes.find(f=>f.type==="decl"&&f.prop===s);a?a.replaceWith(c):n?.append(c);});}function ei(e,t){return {postcssPlugin:"update-css-vars-v4",Once(r){Object.entries(e).forEach(([n,i])=>{let o=n==="light"?":root":`.${n}`;if(n==="theme"){o="@theme";let c=jt(r);Object.entries(i).forEach(([a,f])=>{let p=`--${a.replace(/^--/,"")}`,m=$$1.decl({prop:p,value:f,raws:{semicolon:true}}),d=c?.nodes?.find(h=>h.type==="decl"&&h.prop===p);t.overwriteCssVars?d?d.replaceWith(m):c?.append(m):d||c?.append(m);});return}let s=r.nodes?.find(c=>c.type==="rule"&&c.selector===o);!s&&Object.keys(i).length>0&&(s=$$1.rule({selector:o,nodes:[],raws:{semicolon:true,between:" ",before:`
|
|
15
|
+
`}}),r.append(s),r.insertBefore(s,$$1.comment({text:"---break---"}))),Object.entries(i).forEach(([c,a])=>{let f=`--${c.replace(/^--/,"")}`;f==="--sidebar-background"&&(f="--sidebar"),dn(a)&&(a=`hsl(${a})`);let p=$$1.decl({prop:f,value:a,raws:{semicolon:true}}),m=s?.nodes.find(d=>d.type==="decl"&&d.prop===f);t.overwriteCssVars?m?m.replaceWith(p):s?.append(p):m||s?.append(p);});});}}}function ti(e){return {postcssPlugin:"update-theme",Once(t){let r=Array.from(new Set(Object.keys(e).flatMap(o=>Object.keys(e[o]||{}))));if(!r.length)return;let n=jt(t),i=n.nodes?.filter(o=>o.type==="decl"&&o.prop.startsWith("--"));for(let o of r){let s=Object.values(e).find(m=>m[o])?.[o];if(!s)continue;if(o==="radius"){let m={sm:"calc(var(--radius) * 0.6)",md:"calc(var(--radius) * 0.8)",lg:"var(--radius)",xl:"calc(var(--radius) * 1.4)","2xl":"calc(var(--radius) * 1.8)","3xl":"calc(var(--radius) * 2.2)","4xl":"calc(var(--radius) * 2.6)"};for(let[d,h]of Object.entries(m)){let g=$$1.decl({prop:`--radius-${d}`,value:h,raws:{semicolon:true}});n?.nodes?.find(w=>w.type==="decl"&&w.prop===g.prop)||n?.append(g);}continue}let c=dn(s)||ai(s)?`--color-${o.replace(/^--/,"")}`:`--${o.replace(/^--/,"")}`;c==="--color-sidebar-background"&&(c="--color-sidebar");let a=`var(--${o})`;c==="--color-sidebar"&&(a="var(--sidebar)");let f=$$1.decl({prop:c,value:a,raws:{semicolon:true}});n?.nodes?.find(m=>m.type==="decl"&&m.prop===f.prop)||(i?.length?n?.insertAfter(i[i.length-1],f):n?.append(f));}}}}function jt(e){let t=e.nodes.find(r=>r.type==="atrule"&&r.name==="theme"&&r.params==="inline");return t||(t=$$1.atRule({name:"theme",params:"inline",nodes:[],raws:{semicolon:true,between:" ",before:`
|
|
16
|
+
`}}),e.append(t),e.insertBefore(t,$$1.comment({text:"---break---"}))),t}function ri({params:e}){return {postcssPlugin:"add-custom-variant",Once(t){if(!t.nodes.find(n=>n.type==="atrule"&&n.name==="custom-variant")){let n=t.nodes.filter(o=>o.type==="atrule"&&o.name==="import"),i=$$1.atRule({name:"custom-variant",params:e,raws:{semicolon:true,before:`
|
|
17
|
+
`}});if(n.length>0){let o=n[n.length-1];t.insertAfter(o,i);}else t.insertAfter(t.nodes[0],i);t.insertBefore(i,$$1.comment({text:"---break---"}));}}}}function ni(e){return {postcssPlugin:"update-tailwind-config",Once(t){if(!e?.plugins)return;let n=si(t)==="single"?"'":'"',i=t.nodes.filter(s=>s.type==="atrule"&&s.name==="plugin"),o=i[i.length-1]||t.nodes[0];for(let s of e.plugins){let c=s.replace(/^require\(["']|["']\)$/g,"");if(i.some(f=>f.params.replace(/["']/g,"")===c))continue;let a=$$1.atRule({name:"plugin",params:`${n}${c}${n}`,raws:{semicolon:true,before:`
|
|
18
|
+
`}});t.insertAfter(o,a),t.insertBefore(a,$$1.comment({text:"---break---"}));}}}}function oi(e){return {postcssPlugin:"update-tailwind-config-keyframes",Once(t){if(!e?.theme?.extend?.keyframes)return;let r=jt(t),n=r.nodes?.filter(o=>o.type==="atrule"&&o.name==="keyframes"),i=z$1.record(z$1.string(),z$1.record(z$1.string(),z$1.string()));for(let[o,s]of Object.entries(e.theme.extend.keyframes)){if(typeof o!="string")continue;let c=i.safeParse(s);if(!c.success||n?.find(f=>f.type==="atrule"&&f.name==="keyframes"&&f.params===o))continue;let a=$$1.atRule({name:"keyframes",params:o,nodes:[],raws:{semicolon:true,between:" ",before:`
|
|
19
19
|
`}});for(let[f,p]of Object.entries(c.data)){let m=$$1.rule({selector:f,nodes:Object.entries(p).map(([d,h])=>$$1.decl({prop:d,value:h,raws:{semicolon:true,before:`
|
|
20
20
|
`,between:": "}})),raws:{semicolon:true,between:" ",before:`
|
|
21
|
-
`}});a.append(m);}r.append(a),r.insertBefore(a,$$1.comment({text:"---break---"}));}}}}function
|
|
22
|
-
`}});r.append(a);}}}}function
|
|
21
|
+
`}});a.append(m);}r.append(a),r.insertBefore(a,$$1.comment({text:"---break---"}));}}}}function ii(e){return {postcssPlugin:"update-tailwind-config-animation",Once(t){if(!e?.theme?.extend?.animation)return;let r=jt(t),n=r.nodes?.filter(o=>o.type==="decl"&&o.prop.startsWith("--animate-")),i=z$1.record(z$1.string(),z$1.string()).safeParse(e.theme.extend.animation);if(i.success)for(let[o,s]of Object.entries(i.data)){let c=`--animate-${o}`;if(n?.find(f=>f.prop===c))continue;let a=$$1.decl({prop:c,value:s,raws:{semicolon:true,between:": ",before:`
|
|
22
|
+
`}});r.append(a);}}}}function si(e){return e.nodes[0].toString().includes("'")?"single":"double"}function dn(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(r=>r.includes("%"))}function ai(e){return e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch")||e.includes("--color-")}async function Ze(e,t,r){let n=e&&Object.keys(e).length>0,i=Object.keys(r.cssVars??{}).length>0;if(!t.resolvedPaths.tailwindCss||!n&&!i)return;r={silent:false,...r};let o=t.resolvedPaths.tailwindCss,s=ie__default.relative(t.resolvedPaths.cwd,o),c=w(`Updating ${a.info(s)}`,{silent:r.silent}).start(),a$1=await promises.readFile(o,"utf8");i&&(a$1=await Xe(a$1,r.cssVars,t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars})),n&&(a$1=await nr(a$1,e)),await promises.writeFile(o,a$1,"utf8"),c.succeed();}async function nr(e,t){let r=[fi(t)],n=await $$1(r).process(e,{from:void 0}),i=n.css,o=n.root;if(o.nodes&&o.nodes.length>0){let s=o.nodes[o.nodes.length-1];s.type==="atrule"&&!s.nodes&&!i.trimEnd().endsWith(";")&&(i=i.trimEnd()+";");}return i=i.replace(/\/\* ---break--- \*\//g,""),i=i.replace(/(\n\s*\n)+/g,`
|
|
23
23
|
|
|
24
|
-
`),i=i.trimEnd(),i}function
|
|
24
|
+
`),i=i.trimEnd(),i}function fi(e){return {postcssPlugin:"update-css",Once(t){for(let[r,n]of Object.entries(e))if(r.startsWith("@")){let i=r.match(/@([a-zA-Z-]+)\s*(.*)/);if(!i)continue;let[,o,s]=i;if(o==="import"){if(!t.nodes?.find(a=>a.type==="atrule"&&a.name==="import"&&a.params===s)){let a=$$1.atRule({name:"import",params:s,raws:{semicolon:true}}),f=t.nodes?.filter(p=>p.type==="atrule"&&p.name==="import");if(f&&f.length>0){let p=f[f.length-1];a.raws.before=`
|
|
25
25
|
`,t.insertAfter(p,a);}else !t.nodes||t.nodes.length,a.raws.before="",t.prepend(a);}}else if(o==="plugin"){let c=s;s&&!s.startsWith('"')&&!s.startsWith("'")&&(c=`"${s}"`);let a=p=>p.startsWith('"')&&p.endsWith('"')||p.startsWith("'")&&p.endsWith("'")?p.slice(1,-1):p;if(!t.nodes?.find(p=>p.type!=="atrule"||p.name!=="plugin"?false:a(p.params)===a(s))){let p=$$1.atRule({name:"plugin",params:c,raws:{semicolon:true,before:`
|
|
26
26
|
`}}),m=t.nodes?.filter(h=>h.type==="atrule"&&h.name==="import"),d=t.nodes?.filter(h=>h.type==="atrule"&&h.name==="plugin");if(d&&d.length>0){let h=d[d.length-1];t.insertAfter(h,p);}else if(m&&m.length>0){let h=m[m.length-1];t.insertAfter(h,p),t.insertBefore(p,$$1.comment({text:"---break---"})),t.insertAfter(p,$$1.comment({text:"---break---"}));}else t.prepend(p),t.insertBefore(p,$$1.comment({text:"---break---"})),t.insertAfter(p,$$1.comment({text:"---break---"}));}}else if(typeof n=="object"&&Object.keys(n).length===0){if(!t.nodes?.find(a=>a.type==="atrule"&&a.name===o&&a.params===s)){let a=$$1.atRule({name:o,params:s,raws:{semicolon:true}});t.append(a),t.insertBefore(a,$$1.comment({text:"---break---"}));}}else if(o==="keyframes"){let c=t.nodes?.find(p=>p.type==="atrule"&&p.name==="theme"&&p.params==="inline");c||(c=$$1.atRule({name:"theme",params:"inline",raws:{semicolon:true,between:" ",before:`
|
|
27
27
|
`}}),t.append(c),t.insertBefore(c,$$1.comment({text:"---break---"})));let a=c.nodes?.find(p=>p.type==="atrule"&&p.name==="keyframes"&&p.params===s),f;if(a?(f=$$1.atRule({name:"keyframes",params:s,raws:{semicolon:true,between:" ",before:`
|
|
28
28
|
`}}),a.replaceWith(f)):(f=$$1.atRule({name:"keyframes",params:s,raws:{semicolon:true,between:" ",before:`
|
|
29
|
-
`}}),c.append(f)),typeof n=="object")for(let[p,m]of Object.entries(n))
|
|
29
|
+
`}}),c.append(f)),typeof n=="object")for(let[p,m]of Object.entries(n))Pe(f,p,m);}else if(o==="utility"){let c=t.nodes?.find(a=>a.type==="atrule"&&a.name===o&&a.params===s);if(c){if(typeof n=="object")for(let[a,f]of Object.entries(n))if(typeof f=="string"){let p=c.nodes?.find(d=>d.type==="decl"&&d.prop===a),m=$$1.decl({prop:a,value:f,raws:{semicolon:true,before:`
|
|
30
30
|
`}});p?p.replaceWith(m):c.append(m);}else if(a.startsWith("@")&&typeof f=="object"&&f!==null&&Object.keys(f).length===0){let p=a.match(/@([a-zA-Z-]+)\s*(.*)/);if(p){let[,m,d]=p;if(!c.nodes?.find(g=>g.type==="atrule"&&g.name===m&&g.params===d)){let g=$$1.atRule({name:m,params:d,raws:{semicolon:true,before:`
|
|
31
|
-
`}});c.append(g);}}}else typeof f=="object"&&
|
|
31
|
+
`}});c.append(g);}}}else typeof f=="object"&&Pe(c,a,f);}else {let a=$$1.atRule({name:o,params:s,raws:{semicolon:true,between:" ",before:`
|
|
32
32
|
`}});if(t.append(a),t.insertBefore(a,$$1.comment({text:"---break---"})),typeof n=="object")for(let[f,p]of Object.entries(n))if(typeof p=="string"){let m=$$1.decl({prop:f,value:p,raws:{semicolon:true,before:`
|
|
33
33
|
`}});a.append(m);}else if(f.startsWith("@")&&typeof p=="object"&&p!==null&&Object.keys(p).length===0){let m=f.match(/@([a-zA-Z-]+)\s*(.*)/);if(m){let[,d,h]=m;if(!a.nodes?.find(w=>w.type==="atrule"&&w.name===d&&w.params===h)){let w=$$1.atRule({name:d,params:h,raws:{semicolon:true,before:`
|
|
34
|
-
`}});a.append(w);}}}else typeof p=="object"&&
|
|
35
|
-
`}}),e.append(i),e.insertBefore(i,$$1.comment({text:"---break---"}))),typeof n=="object")for(let[o,s]of Object.entries(n))if(o.startsWith("@")){let c=o.match(/@([a-zA-Z-]+)\s*(.*)/);if(c){let[,a,f]=c;
|
|
34
|
+
`}});a.append(w);}}}else typeof p=="object"&&Pe(a,f,p);}}else o==="property"?Pe(t,r,n):gn(t,o,s,n);}else Pe(t,r,n);}}}function gn(e,t,r,n){let i=e.nodes?.find(o=>o.type==="atrule"&&o.name===t&&o.params===r);if(i||(i=$$1.atRule({name:t,params:r,raws:{semicolon:true,between:" ",before:`
|
|
35
|
+
`}}),e.append(i),e.insertBefore(i,$$1.comment({text:"---break---"}))),typeof n=="object")for(let[o,s]of Object.entries(n))if(o.startsWith("@")){let c=o.match(/@([a-zA-Z-]+)\s*(.*)/);if(c){let[,a,f]=c;gn(i,a,f,s);}}else Pe(i,o,s);else if(typeof n=="string")try{let s=$$1.parse(`.temp{${n}}`).first;if(s&&s.nodes){let c=$$1.rule({selector:"temp",raws:{semicolon:!0,between:" ",before:`
|
|
36
36
|
`}});s.nodes.forEach(a=>{if(a.type==="decl"){let f=a.clone();f.raws.before=`
|
|
37
|
-
`,c.append(f);}}),c.nodes?.length&&i.append(c);}}catch(o){throw console.error("Error parsing at-rule content:",n,o),o}}function
|
|
37
|
+
`,c.append(f);}}),c.nodes?.length&&i.append(c);}}catch(o){throw console.error("Error parsing at-rule content:",n,o),o}}function Pe(e,t,r){let n=e.nodes?.find(i=>i.type==="rule"&&i.selector===t);if(n||(n=$$1.rule({selector:t,raws:{semicolon:true,between:" ",before:`
|
|
38
38
|
`}}),e.append(n)),typeof r=="object"){for(let[i,o]of Object.entries(r))if(i.startsWith("@")&&typeof o=="object"&&o!==null&&Object.keys(o).length===0){let s=i.match(/@([a-zA-Z-]+)\s*(.*)/);if(s){let[,c,a]=s;if(!n.nodes?.find(p=>p.type==="atrule"&&p.name===c&&p.params===a)){if(c==="apply"){let m=n.nodes?.find(d=>d.type==="atrule"&&d.name==="apply");if(m){m.params=twMerge(m.params,a);continue}}let p=$$1.atRule({name:c,params:a,raws:{semicolon:true,before:`
|
|
39
39
|
`}});n.append(p);}}}else if(typeof o=="string"){let s=$$1.decl({prop:i,value:o,raws:{semicolon:true,before:`
|
|
40
|
-
`}}),c=n.nodes?.find(a=>a.type==="decl"&&a.prop===i);c?c.replaceWith(s):n.append(s);}else if(typeof o=="object"){let s=i.startsWith("&")?t.replace(/^([^:]+)/,`$1${i.substring(1)}`):i;
|
|
41
|
-
`,n?.append(c);}});}catch(i){throw console.error("Error parsing rule content:",t,r,i),i}}async function D(e,t,r,n){if(e=Array.from(new Set(e)),t=Array.from(new Set(t)),!e?.length&&!t?.length)return;n={silent:false,...n};let i=w("Installing dependencies.",{silent:n.silent})?.start(),o=await
|
|
40
|
+
`}}),c=n.nodes?.find(a=>a.type==="decl"&&a.prop===i);c?c.replaceWith(s):n.append(s);}else if(typeof o=="object"){let s=i.startsWith("&")?t.replace(/^([^:]+)/,`$1${i.substring(1)}`):i;Pe(e,s,o);}}else if(typeof r=="string")try{let o=$$1.parse(`.temp{${r}}`).first;o&&o.nodes&&o.nodes.forEach(s=>{if(s.type==="decl"){let c=s.clone();c.raws.before=`
|
|
41
|
+
`,n?.append(c);}});}catch(i){throw console.error("Error parsing rule content:",t,r,i),i}}async function D(e,t,r,n){if(e=Array.from(new Set(e)),t=Array.from(new Set(t)),!e?.length&&!t?.length)return;n={silent:false,...n};let i=w("Installing dependencies.",{silent:n.silent})?.start(),o=await di(r),s="";if(mi(r)&&o==="npm")if(n.silent)s="force";else {i.stopAndPersist(),b.warn(`
|
|
42
42
|
It looks like you are using React 19.
|
|
43
43
|
Some packages may fail to install due to peer dependency issues in npm (see ${c$1}/react-19).
|
|
44
|
-
`);let c=await
|
|
44
|
+
`);let c=await we([{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"}]}]);c&&(s=c.flag);}i?.start(),await ui(o,e,t,r.resolvedPaths.cwd,s),i?.succeed();}function mi(e){let t=qa(e.resolvedPaths.cwd,false);if(!t?.dependencies?.react)return false;let r=/^(?:\^|~)?19(?:\.\d+)*(?:-.*)?$/.test(t.dependencies.react),n=t.dependencies["react-day-picker"]?.startsWith("8");return r&&n}async function di(e){return qa(e.resolvedPaths.cwd,false)?.dependencies?.expo?"expo":a$2(e.resolvedPaths.cwd)}async function ui(e,t,r,n,i){if(e==="npm")return gi(t,r,n,i);if(e==="deno")return hi(t,r,n);if(e==="expo")return yi(t,r,n);t?.length&&await execa(e,["add",...t],{cwd:n}),r?.length&&await execa(e,["add","-D",...r],{cwd:n});}async function gi(e,t,r,n){e.length&&await execa("npm",["install",...n?[`--${n}`]:[],...e],{cwd:r}),t.length&&await execa("npm",["install",...n?[`--${n}`]:[],"-D",...t],{cwd:r});}async function hi(e,t,r){e?.length&&await execa("deno",["add",...e.map(n=>`npm:${n}`)],{cwd:r}),t?.length&&await execa("deno",["add","-D",...t.map(n=>`npm:${n}`)],{cwd:r});}async function yi(e,t,r){e.length&&await execa("npx",["expo","install",...e],{cwd:r}),t.length&&await execa("npx",["expo","install","-- -D",...t],{cwd:r});}async function ir(e,t$1,r){if(!e||Object.keys(e).length===0)return {envVarsAdded:[],envFileUpdated:null,envFileCreated:null};r={silent:false,...r};let n=w("Adding environment variables.",{silent:r.silent})?.start(),i=t$1.resolvedPaths.cwd,o=ie__default.join(i,".env.local"),s=t(i);s&&(o=s);let c=existsSync(o),a$1=ie__default.basename(o),f=Object.entries(e).map(([h,g])=>`${h}=${g}`).join(`
|
|
45
45
|
`),p=[],m=null,d=null;if(c){let h=await promises.readFile(o,"utf-8"),g=v(h,f);if(p=u(h,f),p.length>0){if(await promises.writeFile(o,g,"utf-8"),m=ie__default.relative(i,o),n?.succeed(`Added the following variables to ${a.info(a$1)}:`),!r.silent)for(let w of p)b.log(` ${a.success("+")} ${w}`);}else n?.stop();}else if(await promises.writeFile(o,f+`
|
|
46
|
-
`,"utf-8"),d=ie__default.relative(i,o),p=Object.keys(e),n?.succeed(`Added the following variables to ${a.info(a$1)}:`),!r.silent)for(let h of p)b.log(` ${a.success("+")} ${h}`);return !r.silent&&p.length>0&&b.break(),{envVarsAdded:p,envFileUpdated:m,envFileCreated:d}}var
|
|
47
|
-
`);}s.push(P),Ii(m)&&c.push(m.font.variable.replace("--",""));}}let a=new Set(["font-sans","font-serif","font-mono"]),f=[...c].reverse().find(m=>a.has(m)),p=c.filter(m=>!a.has(m));return f&&p.unshift(f),s.length>0&&Ai(i,s,p,r),i.getFullText()}function ki(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 Et(e){return vi.has(e)}function $i(e){return Et(e)?"html":null}function Ii(e){return !e.font.selector&&Et(e.font.variable)}function Pi(e,t){let r=ji(e);return Et(t)?r:`${r}${Ei(t.replace(/^--font-/,""))}`}function ji(e){return e.split("_").map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function Ei(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function Fi(e,t){let r=e.getVariableStatements();for(let n of r)for(let i of n.getDeclarations()){let o=i.getInitializer();if(!o||o.getKind()!==SyntaxKind.CallExpression)continue;let c=o.getArguments();if(c.length===0)continue;let a=c[0].getText();if(a.includes("variable:")&&a.includes(t))return i}return null}function Oi(e,t){let r=e.getVariableStatements();for(let n of r)for(let i of n.getDeclarations()){let o=i.getInitializer();if(!o||o.getKind()!==SyntaxKind.CallExpression)continue;let s=o;if(s.getExpression().getText()!==t)continue;let c=s.getArguments();if(!c.length)continue;let a=c[0].getText();if(a.includes("variable:")&&a.includes("--font-heading"))return true}return false}function Ni(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function Ai(e,t,r,n){let i=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement);for(let o of i){if(o.getTagNameNode().getText()!=="html")continue;let c=r.map(h=>`"${h}"`),a=t.map(h=>`${h}.variable`),f=[...c,...a],p=o.getAttribute("className");if(!p){Ze(e,n),o.addAttribute({name:"className",initializer:`{cn(${f.join(", ")})}`});return}if(p.getKind()!==SyntaxKind.JsxAttribute)return;let m=p.asKindOrThrow(SyntaxKind.JsxAttribute),d=m.getInitializer();if(!d)return;if(d.getKind()===SyntaxKind.StringLiteral){let h=d.getText().slice(1,-1);Ze(e,n),m.setInitializer(`{cn("${h}", ${f.join(", ")})}`);}else if(d.getKind()===SyntaxKind.JsxExpression){let h=d.asKindOrThrow(SyntaxKind.JsxExpression),g=h.getExpression();if(!g)return;let w=g.getText();if(w.startsWith("cn(")){let v=a.every(R=>w.includes(R)),x=r.every(R=>w.includes(`"${R}"`)),P=["font-sans","font-serif","font-mono"].filter(R=>!r.includes(R)).some(R=>w.includes(`"${R}"`));if(v&&x&&!P)continue;let k=Di(w,a);k=Li(k);let C=_i(k,f);h.replaceWithText(`{${C}}`);}else if(/^\w+\.variable$/.test(w)){if(a.includes(w)&&r.length===0)continue;Ze(e,n);let x=(w.split(".")[0]??"").toLowerCase().includes("heading")||r.length===0;h.replaceWithText(x?`{cn(${w}, ${f.join(", ")})}`:`{cn(${f.join(", ")})}`);}else if(w.startsWith("`")&&w.endsWith("`")){let v=Ti(w);Ze(e,n);let x=new Set(f),P=new Set(["font-sans","font-serif","font-mono"].map(C=>`"${C}"`)),k=v.filter(C=>!x.has(C)&&!P.has(C));h.replaceWithText(`{cn(${[...k,...f].join(", ")})}`);}else Ze(e,n),h.replaceWithText(`{cn(${w}, ${f.join(", ")})}`);}}}function Ze(e,t){if(!e.getImportDeclaration(n=>n.getNamedImports().some(o=>o.getName()==="cn"))){let n=e.getImportDeclaration(i=>i.getModuleSpecifierValue().includes("/lib/utils"));n?n.getNamedImports().some(o=>o.getName()==="cn")||n.addNamedImport("cn"):e.addImportDeclaration({moduleSpecifier:t.aliases.utils,namedImports:["cn"]});}}function Ti(e){let t=[],r=[],i=e.slice(1,-1).split(/(\$\{[^}]+\})/);for(let o of i)if(o)if(o.startsWith("${")&&o.endsWith("}")){let s=o.slice(2,-1).trim();s&&r.push(s);}else {let s=o.trim().split(/\s+/).filter(Boolean);for(let c of s)t.push(`"${c}"`);}return [...t,...r]}function Di(e,t){let r=e;for(let n of t)r=r.replace(new RegExp(`,?\\s*${n.replace(".","\\.")}`,"g"),"").replace(/cn\(\s*,/,"cn(");return r}function Li(e){let t=e;for(let r of ["font-sans","font-serif","font-mono"])t=t.replace(new RegExp(`,?\\s*"${r}"`,"g"),"").replace(/cn\(\s*,/,"cn(");return t}function _i(e,t){let r=t.join(", ");return e.replace(/\)$/,`, ${r})`)}async function ae(e,t,r){r={overwrite:false,silent:false,isNewProject:false,...r};let n=await P(t);return n&&n.ui&&n.ui.resolvedPaths.cwd!==t.resolvedPaths.cwd?await Ui(e,t,n,{...r,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await Mi(e,t,{...r,skipFonts:r.skipFonts})}async function Mi(e,t,r){if(!e.length)return;let n=w("Checking registry.",{silent:r.silent})?.start(),i=await _(e,U(t));if(!i)return n?.fail(),$(new Error("Failed to fetch components from registry."));try{yn(i.files??[],t.resolvedPaths.cwd);}catch(a){return n?.fail(),$(a)}n?.succeed();let o=await ta$1(t);r.skipFonts||(i=await Qe(i,t));let s=$e([i]);await D(i.dependencies,i.devDependencies,t,{silent:r.silent}),await Y$1(i.tailwind?.config,t,{silent:r.silent,tailwindVersion:o}),await or(i.envVars,t,{silent:r.silent}),r.skipFonts||await et(i.fonts,t,{silent:r.silent}),await D$1(i.files,t,{overwrite:r.overwrite,silent:r.silent,path:r.path,supportedFontMarkers:s});let c=i.cssVars?r.overwriteCssVars??await hn(e,t):void 0;await Xe(i.css,t,{silent:r.silent,cssVars:i.cssVars,cleanupDefaultNextStyles:r.isNewProject,overwriteCssVars:c,tailwindVersion:o,tailwindConfig:i.tailwind?.config}),i.docs&&b.info(i.docs);}async function Ui(e,t,r,n){if(!e.length)return;let i=w("Checking registry.",{silent:n.silent})?.start(),o=await _(e,U(t));if(!o)return i?.fail(),$(new Error("Failed to fetch components from registry."));try{yn(o.files??[],t.resolvedPaths.cwd);}catch(R){return i?.fail(),$(R)}i?.succeed();let s=[],c=[],a=[],f=w("Installing components.")?.start(),p=r.ui,m=await ta$1(p),d=R(t.resolvedPaths.cwd,p.resolvedPaths.ui);o=await Qe(o,t);let h=$e([o]);await D(o.dependencies,o.devDependencies,p,{silent:true}),o.tailwind?.config&&(await Y$1(o.tailwind?.config,p,{silent:true,tailwindVersion:m}),c.push(ie__default.relative(d,p.resolvedPaths.tailwindConfig))),o.envVars&&await or(o.envVars,p,{silent:true}),await et(o.fonts,t,{silent:true});let g=new Map;for(let R of o.files??[]){let L=R.type||"registry:ui";g.has(L)||g.set(L,[]),g.get(L).push(R);}let w$1={"registry:ui":"ui","registry:hook":"hooks","registry:lib":"lib"};for(let R$1 of Array.from(g.keys())){let L=g.get(R$1),K=w$1[R$1],xe=K&&r[K]?r[K]:t,ct=R(t.resolvedPaths.cwd,xe.resolvedPaths.ui||xe.resolvedPaths.cwd),Jt=await Q(ct,xe.resolvedPaths.cwd)??xe.resolvedPaths.cwd,Gt=await D$1(L,xe,{overwrite:n.overwrite,silent:true,rootSpinner:f,isRemote:n.isRemote,isWorkspace:true,path:n.path,supportedFontMarkers:h});s.push(...Gt.filesCreated.map(Ge=>ie__default.relative(ct,ie__default.join(Jt,Ge)))),c.push(...Gt.filesUpdated.map(Ge=>ie__default.relative(ct,ie__default.join(Jt,Ge)))),a.push(...Gt.filesSkipped.map(Ge=>ie__default.relative(ct,ie__default.join(Jt,Ge))));}let v=o.cssVars?n.overwriteCssVars??await hn(e,t):void 0;await Xe(o.css,p,{silent:true,cssVars:o.cssVars,overwriteCssVars:v,tailwindVersion:m,tailwindConfig:o.tailwind?.config}),(o.cssVars||o.css)&&c.push(ie__default.relative(d,p.resolvedPaths.tailwindCss)),f?.succeed();let x=Array.from(new Set(s)).sort(),P=Array.from(new Set(c.filter(R=>!s.includes(R)))).sort(),k=Array.from(new Set(a)).sort();if(!(x.length||P.length)&&!k.length&&w("No files updated.",{silent:n.silent})?.info(),x.length){w(`Created ${x.length} ${x.length===1?"file":"files"}:`,{silent:n.silent})?.succeed();for(let R of x)b.log(` - ${R}`);}if(P.length){w(`Updated ${P.length} ${P.length===1?"file":"files"}:`,{silent:n.silent})?.info();for(let R of P)b.log(` - ${R}`);}if(k.length){w(`Skipped ${k.length} ${k.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:n.silent})?.info();for(let R of k)b.log(` - ${R}`);}o.docs&&b.info(o.docs);}async function hn(e,t){let r=await ba(e,{config:t});return z$1.array(n).parse(r).some(i=>i.type==="registry:theme"||i.type==="registry:style"||i.type==="registry:font"||i.type==="registry:base")}function yn(e,t){for(let r of e)if(r?.target&&!cn(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}async function he(e){let t=ie__default.resolve(e.projectPath,"packages/ui"),r=ie__default.resolve(e.projectPath,"apps/web"),n=ie__default.resolve(t,"components.json"),i=await T.readJson(n);e.registryBaseConfig&&(i=wn(i,e.registryBaseConfig)),i.tailwind.baseColor="neutral",e.rtl&&(i.rtl=true),e.menuColor&&(i.menuColor=e.menuColor),e.menuAccent&&(i.menuAccent=e.menuAccent),e.iconLibrary&&(i.iconLibrary=e.iconLibrary),await T.writeJson(n,i,{spaces:2});let o=ie__default.resolve(r,"components.json"),s=await T.readJson(o);e.registryBaseConfig&&(s=wn(s,e.registryBaseConfig)),s.tailwind.baseColor="neutral",e.rtl&&(s.rtl=true),e.menuColor&&(s.menuColor=e.menuColor),e.menuAccent&&(s.menuAccent=e.menuAccent),e.iconLibrary&&(s.iconLibrary=e.iconLibrary),await T.writeJson(o,s,{spaces:2});let c$1=await O(t,c.parse(i)),{config:a}=await M(e.components,c$1,{silent:true});await ae(e.components,a,{overwrite:true,silent:e.silent,isNewProject:true,skipFonts:true});let f=await O(r,c.parse(s)),p=await _(e.components,U(a));if(p?.fonts?.length){let d={},h=new Set;for(let g of p.fonts){let w=g.name.replace(/^font-heading-/,"").replace("font-",""),v=g.font.dependency??`@fontsource-variable/${w}`;d[g.font.variable]=g.font.family,h.add(v);}await D(Array.from(h),[],c$1,{silent:true}),await It({theme:d},c$1,{silent:e.silent,overwriteCssVars:false,tailwindVersion:"v4"}),await Xe(Object.fromEntries(Array.from(h).map(g=>[`@import "${g}"`,{}])),c$1,{silent:e.silent});}let m=c$1.iconLibrary;if(m&&m in a$3){let d=[...a$3[m].packages];await D(d,[],c$1,{silent:true}),await D(d,[],f,{silent:true});}return f}var xn=B({name:"astro",title:"Astro",defaultProjectName:"astro-app",templateDir:"astro-app",frameworks:["astro"],create:async()=>{},files:[{type:"registry:page",path:"src/pages/index.astro",target:"src/pages/index.astro",content:bn`---
|
|
46
|
+
`,"utf-8"),d=ie__default.relative(i,o),p=Object.keys(e),n?.succeed(`Added the following variables to ${a.info(a$1)}:`),!r.silent)for(let h of p)b.log(` ${a.success("+")} ${h}`);return !r.silent&&p.length>0&&b.break(),{envVarsAdded:p,envFileUpdated:m,envFileCreated:d}}var Si=new Set(["--font-sans","--font-serif","--font-mono"]);async function et(e,t){if(!e.fonts?.length)return e;let r=await ra$1(t.resolvedPaths.cwd);if(!r)return e;e.cssVars??={},e.cssVars.theme??={};let n=r.framework.name==="next-app"||r.framework.name==="next-pages";for(let i of e.fonts)if(n)e.cssVars.theme[i.font.variable]=`var(${i.font.variable})`;else {let o=i.name.replace("font-",""),s=i.font.dependency??`@fontsource-variable/${o}`;e.dependencies??=[],e.dependencies.push(s),e.css??={},e.css[`@import "${s}"`]={},e.cssVars.theme[i.font.variable]=i.font.family;}if(e.fonts.length>0){let i=new Map;for(let o of e.fonts){let s=o.font.selector??ji(o.font.variable);if(!s)continue;let c=o.font.variable.replace("--","");i.has(s)||i.set(s,[]),i.get(s).push(c);}e.css??={},e.css["@layer base"]??={};for(let[o,s]of Array.from(i.entries())){let c=s.join(" ");e.css["@layer base"][o]??={};let a=Object.keys(e.css["@layer base"][o]).find(f=>f.startsWith("@apply "));a?(delete e.css["@layer base"][o][a],e.css["@layer base"][o][`${a} ${c}`]={}):e.css["@layer base"][o][`@apply ${c}`]={};}}return e}async function tt(e,t,r){if(!e?.length)return;let n=await ra$1(t.resolvedPaths.cwd);if(!n||n.framework.name!=="next-app"&&n.framework.name!=="next-pages")return;let i=w("Updating fonts.",{silent:r.silent})?.start();try{await ki(e,t,n),i?.succeed("Updating fonts.");}catch(o){throw i?.fail("Failed to update fonts."),o}}async function ki(e,t,r){let n=await $i(t,r);if(!n)return;let i=await promises.readFile(n,"utf-8"),o=await Ii(i,e,t);o!==i&&await promises.writeFile(n,o,"utf-8");}async function $i(e,t){let r=e.resolvedPaths.cwd,n=t.isSrcDir,o=t.isTsx?"tsx":"jsx",s=n?[`src/app/layout.${o}`,`app/layout.${o}`]:[`app/layout.${o}`];for(let c of s){let a=ie__default.join(r,c);if(existsSync(a))return a}return null}async function Ii(e,t,r){let i=new Project({compilerOptions:{}}).createSourceFile("layout.tsx",e,{scriptKind:ScriptKind.TSX}),o=t.filter(m=>m.font.provider==="google"),s=[],c=[];for(let m of o){let d=m.font.import;if(!d)continue;let h=i.getImportDeclaration(k=>k.getModuleSpecifierValue()==="next/font/google"),g=false;h?(g=h.getNamedImports().some(v=>v.getName()===d),g||h.addNamedImport(d)):i.addImportDeclaration({moduleSpecifier:"next/font/google",namedImports:[d]});let w=Fi(d,m.font.variable),C=Pi(m),b=Ni(i,m.font.variable),P=w;if(!(g&&!b&&Ft(m.font.variable)&&!Ti(i,d))){if(b)b.setInitializer(`${d}(${C})`),b.getName()!==w&&b.rename(w),P=w;else {let k=Di(i);i.insertVariableStatement(k,{declarationKind:VariableDeclarationKind.Const,declarations:[{name:w,initializer:`${d}(${C})`}]}).appendWhitespace(`
|
|
47
|
+
`);}s.push(P),Ei(m)&&c.push(m.font.variable.replace("--",""));}}let a=new Set(["font-sans","font-serif","font-mono"]),f=[...c].reverse().find(m=>a.has(m)),p=c.filter(m=>!a.has(m));return f&&p.unshift(f),s.length>0&&Li(i,s,p,r),i.getFullText()}function Pi(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 Ft(e){return Si.has(e)}function ji(e){return Ft(e)?"html":null}function Ei(e){return !e.font.selector&&Ft(e.font.variable)}function Fi(e,t){let r=Oi(e);return Ft(t)?r:`${r}${Ai(t.replace(/^--font-/,""))}`}function Oi(e){return e.split("_").map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function Ai(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function Ni(e,t){let r=e.getVariableStatements();for(let n of r)for(let i of n.getDeclarations()){let o=i.getInitializer();if(!o||o.getKind()!==SyntaxKind.CallExpression)continue;let c=o.getArguments();if(c.length===0)continue;let a=c[0].getText();if(a.includes("variable:")&&a.includes(t))return i}return null}function Ti(e,t){let r=e.getVariableStatements();for(let n of r)for(let i of n.getDeclarations()){let o=i.getInitializer();if(!o||o.getKind()!==SyntaxKind.CallExpression)continue;let s=o;if(s.getExpression().getText()!==t)continue;let c=s.getArguments();if(!c.length)continue;let a=c[0].getText();if(a.includes("variable:")&&a.includes("--font-heading"))return true}return false}function Di(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function Li(e,t,r,n){let i=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement);for(let o of i){if(o.getTagNameNode().getText()!=="html")continue;let c=r.map(h=>`"${h}"`),a=t.map(h=>`${h}.variable`),f=[...c,...a],p=o.getAttribute("className");if(!p){Qe(e,n),o.addAttribute({name:"className",initializer:`{cn(${f.join(", ")})}`});return}if(p.getKind()!==SyntaxKind.JsxAttribute)return;let m=p.asKindOrThrow(SyntaxKind.JsxAttribute),d=m.getInitializer();if(!d)return;if(d.getKind()===SyntaxKind.StringLiteral){let h=d.getText().slice(1,-1);Qe(e,n),m.setInitializer(`{cn("${h}", ${f.join(", ")})}`);}else if(d.getKind()===SyntaxKind.JsxExpression){let h=d.asKindOrThrow(SyntaxKind.JsxExpression),g=h.getExpression();if(!g)return;let w=g.getText();if(w.startsWith("cn(")){let C=a.every(R=>w.includes(R)),b=r.every(R=>w.includes(`"${R}"`)),P=["font-sans","font-serif","font-mono"].filter(R=>!r.includes(R)).some(R=>w.includes(`"${R}"`));if(C&&b&&!P)continue;let k=Vi(w,a);k=Ui(k);let v=Mi(k,f);h.replaceWithText(`{${v}}`);}else if(/^\w+\.variable$/.test(w)){if(a.includes(w)&&r.length===0)continue;Qe(e,n);let b=(w.split(".")[0]??"").toLowerCase().includes("heading")||r.length===0;h.replaceWithText(b?`{cn(${w}, ${f.join(", ")})}`:`{cn(${f.join(", ")})}`);}else if(w.startsWith("`")&&w.endsWith("`")){let C=_i(w);Qe(e,n);let b=new Set(f),P=new Set(["font-sans","font-serif","font-mono"].map(v=>`"${v}"`)),k=C.filter(v=>!b.has(v)&&!P.has(v));h.replaceWithText(`{cn(${[...k,...f].join(", ")})}`);}else Qe(e,n),h.replaceWithText(`{cn(${w}, ${f.join(", ")})}`);}}}function Qe(e,t){if(!e.getImportDeclaration(n=>n.getNamedImports().some(o=>o.getName()==="cn"))){let n=e.getImportDeclaration(i=>i.getModuleSpecifierValue().includes("/lib/utils"));n?n.getNamedImports().some(o=>o.getName()==="cn")||n.addNamedImport("cn"):e.addImportDeclaration({moduleSpecifier:t.aliases.utils,namedImports:["cn"]});}}function _i(e){let t=[],r=[],i=e.slice(1,-1).split(/(\$\{[^}]+\})/);for(let o of i)if(o)if(o.startsWith("${")&&o.endsWith("}")){let s=o.slice(2,-1).trim();s&&r.push(s);}else {let s=o.trim().split(/\s+/).filter(Boolean);for(let c of s)t.push(`"${c}"`);}return [...t,...r]}function Vi(e,t){let r=e;for(let n of t)r=r.replace(new RegExp(`,?\\s*${n.replace(".","\\.")}`,"g"),"").replace(/cn\(\s*,/,"cn(");return r}function Ui(e){let t=e;for(let r of ["font-sans","font-serif","font-mono"])t=t.replace(new RegExp(`,?\\s*"${r}"`,"g"),"").replace(/cn\(\s*,/,"cn(");return t}function Mi(e,t){let r=t.join(", ");return e.replace(/\)$/,`, ${r})`)}async function ae(e,t,r){r={overwrite:false,silent:false,isNewProject:false,...r};let n=await P(t);return n&&n.ui&&n.ui.resolvedPaths.cwd!==t.resolvedPaths.cwd?await zi(e,t,n,{...r,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await Bi(e,t,{...r,skipFonts:r.skipFonts})}async function Bi(e,t,r){if(!e.length)return;let n=w("Checking registry.",{silent:r.silent})?.start(),i=await _(e,U$1(t));if(!i)return n?.fail(),$(new Error("Failed to fetch components from registry."));try{wn(i.files??[],t.resolvedPaths.cwd);}catch(a){return n?.fail(),$(a)}n?.succeed();let o=await ta$1(t);r.skipFonts||(i=await et(i,t));let s=Ie([i]);await D(i.dependencies,i.devDependencies,t,{silent:r.silent}),await Y$1(i.tailwind?.config,t,{silent:r.silent,tailwindVersion:o}),await ir(i.envVars,t,{silent:r.silent}),r.skipFonts||await tt(i.fonts,t,{silent:r.silent}),await D$1(i.files,t,{overwrite:r.overwrite,silent:r.silent,path:r.path,supportedFontMarkers:s});let c=i.cssVars?r.overwriteCssVars??await yn(e,t):void 0;await Ze(i.css,t,{silent:r.silent,cssVars:i.cssVars,cleanupDefaultNextStyles:r.isNewProject,overwriteCssVars:c,tailwindVersion:o,tailwindConfig:i.tailwind?.config}),i.docs&&b.info(i.docs);}async function zi(e,t,r,n){if(!e.length)return;let i=w("Checking registry.",{silent:n.silent})?.start(),o=await _(e,U$1(t));if(!o)return i?.fail(),$(new Error("Failed to fetch components from registry."));try{wn(o.files??[],t.resolvedPaths.cwd);}catch(R){return i?.fail(),$(R)}i?.succeed();let s=[],c=[],a=[],f=w("Installing components.")?.start(),p=r.ui,m=await ta$1(p),d=R(t.resolvedPaths.cwd,p.resolvedPaths.ui);o=await et(o,t);let h=Ie([o]);await D(o.dependencies,o.devDependencies,p,{silent:true}),o.tailwind?.config&&(await Y$1(o.tailwind?.config,p,{silent:true,tailwindVersion:m}),c.push(ie__default.relative(d,p.resolvedPaths.tailwindConfig))),o.envVars&&await ir(o.envVars,p,{silent:true}),await tt(o.fonts,t,{silent:true});let g=new Map;for(let R of o.files??[]){let L=R.type||"registry:ui";g.has(L)||g.set(L,[]),g.get(L).push(R);}let w$1={"registry:ui":"ui","registry:hook":"hooks","registry:lib":"lib"};for(let R$1 of Array.from(g.keys())){let L=g.get(R$1),K=w$1[R$1],Ce=K&&r[K]?r[K]:t,lt=R(t.resolvedPaths.cwd,Ce.resolvedPaths.ui||Ce.resolvedPaths.cwd),Gt=await Q(lt,Ce.resolvedPaths.cwd)??Ce.resolvedPaths.cwd,Ht=await D$1(L,Ce,{overwrite:n.overwrite,silent:true,rootSpinner:f,isRemote:n.isRemote,isWorkspace:true,path:n.path,supportedFontMarkers:h});s.push(...Ht.filesCreated.map(He=>ie__default.relative(lt,ie__default.join(Gt,He)))),c.push(...Ht.filesUpdated.map(He=>ie__default.relative(lt,ie__default.join(Gt,He)))),a.push(...Ht.filesSkipped.map(He=>ie__default.relative(lt,ie__default.join(Gt,He))));}let C=o.cssVars?n.overwriteCssVars??await yn(e,t):void 0;await Ze(o.css,p,{silent:true,cssVars:o.cssVars,overwriteCssVars:C,tailwindVersion:m,tailwindConfig:o.tailwind?.config}),(o.cssVars||o.css)&&c.push(ie__default.relative(d,p.resolvedPaths.tailwindCss)),f?.succeed();let b$1=Array.from(new Set(s)).sort(),P=Array.from(new Set(c.filter(R=>!s.includes(R)))).sort(),k=Array.from(new Set(a)).sort();if(!(b$1.length||P.length)&&!k.length&&w("No files updated.",{silent:n.silent})?.info(),b$1.length){w(`Created ${b$1.length} ${b$1.length===1?"file":"files"}:`,{silent:n.silent})?.succeed();for(let R of b$1)b.log(` - ${R}`);}if(P.length){w(`Updated ${P.length} ${P.length===1?"file":"files"}:`,{silent:n.silent})?.info();for(let R of P)b.log(` - ${R}`);}if(k.length){w(`Skipped ${k.length} ${k.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:n.silent})?.info();for(let R of k)b.log(` - ${R}`);}o.docs&&b.info(o.docs);}async function yn(e,t){let r=await ba$1(e,{config:t});return z$1.array(n).parse(r).some(i=>i.type==="registry:theme"||i.type==="registry:style"||i.type==="registry:font"||i.type==="registry:base")}function wn(e,t){for(let r of e)if(r?.target&&!ln(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}async function ye(e){let t=ie__default.resolve(e.projectPath,"packages/ui"),r=ie__default.resolve(e.projectPath,"apps/web"),n=ie__default.resolve(t,"components.json"),i=await T.readJson(n);e.registryBaseConfig&&(i=bn(i,e.registryBaseConfig)),i.tailwind.baseColor="neutral",e.rtl&&(i.rtl=true),e.menuColor&&(i.menuColor=e.menuColor),e.menuAccent&&(i.menuAccent=e.menuAccent),e.iconLibrary&&(i.iconLibrary=e.iconLibrary),await T.writeJson(n,i,{spaces:2});let o=ie__default.resolve(r,"components.json"),s=await T.readJson(o);e.registryBaseConfig&&(s=bn(s,e.registryBaseConfig)),s.tailwind.baseColor="neutral",e.rtl&&(s.rtl=true),e.menuColor&&(s.menuColor=e.menuColor),e.menuAccent&&(s.menuAccent=e.menuAccent),e.iconLibrary&&(s.iconLibrary=e.iconLibrary),await T.writeJson(o,s,{spaces:2});let c$1=await O(t,c.parse(i)),{config:a}=await U(e.components,c$1,{silent:true});await ae(e.components,a,{overwrite:true,silent:e.silent,isNewProject:true,skipFonts:true});let f=await O(r,c.parse(s)),p=await _(e.components,U$1(a));if(p?.fonts?.length){let d={},h=new Set;for(let g of p.fonts){let w=g.name.replace(/^font-heading-/,"").replace("font-",""),C=g.font.dependency??`@fontsource-variable/${w}`;d[g.font.variable]=g.font.family,h.add(C);}await D(Array.from(h),[],c$1,{silent:true}),await Pt({theme:d},c$1,{silent:e.silent,overwriteCssVars:false,tailwindVersion:"v4"}),await Ze(Object.fromEntries(Array.from(h).map(g=>[`@import "${g}"`,{}])),c$1,{silent:e.silent});}let m=c$1.iconLibrary;if(m&&m in a$3){let d=[...a$3[m].packages];await D(d,[],c$1,{silent:true}),await D(d,[],f,{silent:true});}return f}var Cn=B({name:"astro",title:"Astro",defaultProjectName:"astro-app",templateDir:"astro-app",frameworks:["astro"],create:async()=>{},files:[{type:"registry:page",path:"src/pages/index.astro",target:"src/pages/index.astro",content:xn`---
|
|
48
48
|
import Layout from "@/layouts/main.astro"
|
|
49
49
|
import { ComponentExample } from "@/components/component-example"
|
|
50
50
|
---
|
|
@@ -52,7 +52,7 @@ import { ComponentExample } from "@/components/component-example"
|
|
|
52
52
|
<Layout>
|
|
53
53
|
<ComponentExample client:load />
|
|
54
54
|
</Layout>
|
|
55
|
-
`}],monorepo:{templateDir:"astro-monorepo",init:
|
|
55
|
+
`}],monorepo:{templateDir:"astro-monorepo",init:ye,files:[{type:"registry:page",path:"src/pages/index.astro",target:"src/pages/index.astro",content:xn`---
|
|
56
56
|
import "@workspace/ui/globals.css"
|
|
57
57
|
import { ComponentExample } from "@/components/component-example"
|
|
58
58
|
---
|
|
@@ -67,27 +67,27 @@ import { ComponentExample } from "@/components/component-example"
|
|
|
67
67
|
<ComponentExample client:load />
|
|
68
68
|
</body>
|
|
69
69
|
</html>
|
|
70
|
-
`}]}});var vn=B({name:"laravel",title:"Laravel",description:"Requires `laravel new`",defaultProjectName:"laravel-app",templateDir:"laravel-app",frameworks:["laravel"],scaffold:async()=>{b.break(),b.log(` Please create a new app with ${a.info("laravel new --react")} first then run ${a.info("shadcn init")}.`),b.log(` See ${a.info(`${c$1}/docs/installation/laravel`)} for more information.`),b.break(),process.exit(0);},create:async()=>{}});var
|
|
70
|
+
`}]}});var vn=B({name:"laravel",title:"Laravel",description:"Requires `laravel new`",defaultProjectName:"laravel-app",templateDir:"laravel-app",frameworks:["laravel"],scaffold:async()=>{b.break(),b.log(` Please create a new app with ${a.info("laravel new --react")} first then run ${a.info("shadcn init")}.`),b.log(` See ${a.info(`${c$1}/docs/installation/laravel`)} for more information.`),b.break(),process.exit(0);},create:async()=>{}});var kn=B({name:"next",title:"Next.js",defaultProjectName:"next-app",templateDir:"next-app",frameworks:["next-app","next-pages"],create:async()=>{},files:[{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:xn`import { ComponentExample } from "@/components/component-example";
|
|
71
71
|
|
|
72
72
|
export default function Page() {
|
|
73
73
|
return <ComponentExample />;
|
|
74
74
|
}
|
|
75
|
-
`}],monorepo:{templateDir:"next-monorepo",init:async e=>{let t=ie__default.resolve(e.projectPath,"packages/ui"),r=ie__default.resolve(e.projectPath,"apps/web"),n=ie__default.resolve(t,"components.json"),i=await T.readJson(n);e.registryBaseConfig&&(i=
|
|
75
|
+
`}],monorepo:{templateDir:"next-monorepo",init:async e=>{let t=ie__default.resolve(e.projectPath,"packages/ui"),r=ie__default.resolve(e.projectPath,"apps/web"),n=ie__default.resolve(t,"components.json"),i=await T.readJson(n);e.registryBaseConfig&&(i=bn(i,e.registryBaseConfig)),i.tailwind.baseColor="neutral",e.rtl&&(i.rtl=true),await T.writeJson(n,i,{spaces:2});let o=ie__default.resolve(r,"components.json"),s=await T.readJson(o);e.registryBaseConfig&&(s=bn(s,e.registryBaseConfig)),s.tailwind.baseColor="neutral",e.rtl&&(s.rtl=true),await T.writeJson(o,s,{spaces:2});let c$1=await O(t,c.parse(i)),{config:a}=await U(e.components,c$1,{silent:true});await ae(e.components,a,{overwrite:true,silent:e.silent,isNewProject:true,skipFonts:true});let f=await O(r,c.parse(s)),p=await _(e.components,U$1(a));if(p?.fonts?.length){let d={};for(let h of p.fonts)d[h.font.variable]=`var(${h.font.variable})`;await Pt({theme:d},c$1,{silent:e.silent,overwriteCssVars:false,tailwindVersion:"v4"}),await tt(p.fonts,f,{silent:e.silent});}let m=c$1.iconLibrary;if(m&&m in a$3){let d=[...a$3[m].packages];await D(d,[],c$1,{silent:true}),await D(d,[],f,{silent:true});}return f},files:[{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:xn`import { ComponentExample } from "@/components/component-example";
|
|
76
76
|
|
|
77
77
|
export default function Page() {
|
|
78
78
|
return <ComponentExample />;
|
|
79
79
|
}
|
|
80
|
-
`}]}});var
|
|
80
|
+
`}]}});var In=B({name:"react-router",title:"React Router",defaultProjectName:"react-router-app",templateDir:"react-router-app",frameworks:["react-router"],create:async()=>{},files:[{type:"registry:file",path:"app/routes/home.tsx",target:"app/routes/home.tsx",content:xn`import { ComponentExample } from "@/components/component-example";
|
|
81
81
|
|
|
82
82
|
export default function Home() {
|
|
83
83
|
return <ComponentExample />;
|
|
84
84
|
}
|
|
85
|
-
`}],monorepo:{templateDir:"react-router-monorepo",init:
|
|
85
|
+
`}],monorepo:{templateDir:"react-router-monorepo",init:ye,files:[{type:"registry:file",path:"app/routes/home.tsx",target:"app/routes/home.tsx",content:xn`import { ComponentExample } from "@/components/component-example";
|
|
86
86
|
|
|
87
87
|
export default function Home() {
|
|
88
88
|
return <ComponentExample />;
|
|
89
89
|
}
|
|
90
|
-
`}]}});var
|
|
90
|
+
`}]}});var jn=B({name:"start",title:"TanStack Start",defaultProjectName:"start-app",templateDir:"start-app",frameworks:["tanstack-start"],create:async()=>{},files:[{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:xn`import { createFileRoute } from "@tanstack/react-router";
|
|
91
91
|
import { ComponentExample } from "@/components/component-example";
|
|
92
92
|
|
|
93
93
|
export const Route = createFileRoute("/")({ component: App });
|
|
@@ -97,7 +97,7 @@ function App() {
|
|
|
97
97
|
<ComponentExample />
|
|
98
98
|
);
|
|
99
99
|
}
|
|
100
|
-
`}],monorepo:{templateDir:"start-monorepo",init:
|
|
100
|
+
`}],monorepo:{templateDir:"start-monorepo",init:ye,files:[{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:xn`import { createFileRoute } from "@tanstack/react-router";
|
|
101
101
|
import { ComponentExample } from "@/components/component-example";
|
|
102
102
|
|
|
103
103
|
export const Route = createFileRoute("/")({ component: App });
|
|
@@ -107,59 +107,63 @@ function App() {
|
|
|
107
107
|
<ComponentExample />
|
|
108
108
|
);
|
|
109
109
|
}
|
|
110
|
-
`}]}});var
|
|
110
|
+
`}]}});var Fn=B({name:"vite",title:"Vite",defaultProjectName:"vite-app",templateDir:"vite-app",frameworks:["vite"],create:async()=>{},files:[{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:xn`import { ComponentExample } from "@/components/component-example";
|
|
111
111
|
|
|
112
112
|
export function App() {
|
|
113
113
|
return <ComponentExample />;
|
|
114
114
|
}
|
|
115
115
|
|
|
116
116
|
export default App;
|
|
117
|
-
`}],monorepo:{templateDir:"vite-monorepo",init:
|
|
117
|
+
`}],monorepo:{templateDir:"vite-monorepo",init:ye,files:[{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:xn`import { ComponentExample } from "@/components/component-example";
|
|
118
118
|
|
|
119
119
|
export function App() {
|
|
120
120
|
return <ComponentExample />;
|
|
121
121
|
}
|
|
122
122
|
|
|
123
123
|
export default App;
|
|
124
|
-
`}]}});var z={next:
|
|
125
|
-
Would you like to start a new project?`,choices:Object.entries(z).map(([p,m])=>({title:m.title,value:p,description:m.description})),initial:0},{type:e.name?null:"text",name:"name",message:"What is your project named?",initial:n,format:p=>p.trim(),validate:p=>p.length>128?"Name should be less than 128 characters.":true}]);t=a$1??t,n=f??n;}let o
|
|
126
|
-
You may now add components.`),process.removeListener("exit",i),
|
|
127
|
-
`,"utf8"),g.succeed();let P$1=await O(e.cwd,m),k=await P(P$1);if(k){let
|
|
128
|
-
Before you can add components, you must create a valid ${a.info("components.json")} file by running the ${a.info("init")} command.`),b.error(`Learn more at ${a.info(`${c$1}/docs/components-json`)}.`),b.break(),process.exit(1);}}async function
|
|
129
|
-
`)}function
|
|
130
|
-
`),s=>green(`+${s}`));else {let s=
|
|
131
|
-
`)}function
|
|
132
|
-
`)}function
|
|
133
|
-
`);r.push(`${dim("\u251C")} ${bold(s.path)} ${dim("(")}${
|
|
134
|
-
`)}function
|
|
135
|
-
`),r=>green(`+${r}`));else {let r=
|
|
136
|
-
`);n.push(`${dim("\u251C")} ${bold(s.path)} ${dim("(")}${
|
|
137
|
-
`);n.push(`${dim("\u251C")} ${bold(e.css.path)} ${dim("(")}${
|
|
138
|
-
`)}function
|
|
124
|
+
`}]}});var z={next:kn,vite:Fn,start:jn,"react-router":In,astro:Cn,laravel:vn};function Ue(e){if(e){for(let[t,r]of Object.entries(z))if(r.frameworks.includes(e))return t}}async function Dt(e){let t=e.template&&e.template in z?e.template:"next",r=$e(z[t],{monorepo:e.monorepo}),n=e.name??r.defaultProjectName,i=e.components?.length===1&&!!e.components[0].match(/\/chat\/b\//);if(i&&(t="next"),!e.force){let{type:a$1,name:f}=await we([{type:e.template||i?null:"select",name:"type",message:`The path ${a.info(e.cwd)} does not contain a package.json file.
|
|
125
|
+
Would you like to start a new project?`,choices:Object.entries(z).map(([p,m])=>({title:m.title,value:p,description:m.description})),initial:0},{type:e.name?null:"text",name:"name",message:"What is your project named?",initial:n,format:p=>p.trim(),validate:p=>p.length>128?"Name should be less than 128 characters.":true}]);t=a$1??t,n=f??n;}let o=$e(z[t],{monorepo:e.monorepo}),s=await a$2(e.cwd,{withFallback:true}),c=ie__default.join(e.cwd,n);try{await T.access(e.cwd,T.constants.W_OK);}catch{b.break(),b.error(`The path ${a.info(e.cwd)} is not writable.`),b.error(`It is likely you do not have write permissions for this folder or the path ${a.info(e.cwd)} does not exist.`),b.break(),process.exit(1);}return T.existsSync(ie__default.resolve(e.cwd,n,"package.json"))&&(b.break(),b.error(`A project with the name ${a.info(n)} already exists.`),b.error("Please choose a different name and try again."),b.break(),process.exit(1)),await o.scaffold({projectPath:c,packageManager:s,cwd:e.cwd}),{projectPath:c,projectName:n,template:t}}async function Y(e=process.cwd()){try{let{config:t}=await import('@dotenvx/dotenvx'),r=[".env.local",".env.development.local",".env.development",".env"];for(let n of r){let i=join(e,n);existsSync(i)&&t({path:i,overload:!1,quiet:!0});}}catch(t){b.warn("Failed to load env files:",t);}}var Me=".bak";function ar(e){if(!T.existsSync(e))return null;let t=`${e}${Me}`;try{return T.renameSync(e,t),t}catch(r){return console.error(`Failed to create backup of ${e}: ${r}`),null}}function Lt(e){let t=`${e}${Me}`;if(!T.existsSync(t))return false;try{return T.renameSync(t,e),!0}catch(r){return console.error(`Warning: Could not restore backup file ${t}: ${r}`),false}}function cr(e){let t=`${e}${Me}`;if(!T.existsSync(t))return false;try{return T.unlinkSync(t),!0}catch{return false}}async function An(e,t,r={}){if(!T.existsSync(e))return t();if(!ar(e))throw r.onBackupFailure?.(e),new Error(`Could not back up ${e}.`);let i=()=>Lt(e);process.on("exit",i);try{let o=await t();return process.removeListener("exit",i),cr(e),o}catch(o){throw process.removeListener("exit",i),Lt(e),o}}var Xi=z$1.object({cwd:z$1.string(),name:z$1.string().optional(),preset:z$1.union([z$1.boolean(),z$1.string()]).optional(),components:z$1.array(z$1.string()).optional(),yes:z$1.boolean(),defaults:z$1.boolean(),force:z$1.boolean(),reinstall:z$1.boolean().optional(),silent:z$1.boolean(),isNewProject:z$1.boolean().default(false),cssVariables:z$1.boolean().default(true),rtl:z$1.boolean().optional(),base:z$1.enum(["radix","base"]).optional(),template:z$1.string().optional(),monorepo:z$1.boolean().optional(),existingConfig:z$1.record(z$1.unknown()).optional(),installStyleIndex:z$1.boolean().default(true),registryBaseConfig:c.deepPartial().optional(),menuColor:z$1.enum(["default","inverted","default-translucent","inverted-translucent"]).optional(),menuAccent:z$1.enum(["subtle","bold"]).optional(),iconLibrary:z$1.string().optional()}),Nn=new Command().name("init").alias("create").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, react-router, laravel, astro)").option("-b, --base <base>","the component library to use. (radix, base)").option("--monorepo","scaffold a monorepo project.").option("--no-monorepo","skip the monorepo prompt.").option("-p, --preset [name]","use a preset configuration").option("-y, --yes","skip confirmation prompt.",true).option("-d, --defaults","use default configuration: --template=next --preset=base-nova",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("-n, --name <name>","the name for the new project.").option("-s, --silent","mute output.",false).option("--css-variables","use css variables for theming.",true).option("--no-css-variables","do not use css variables for theming.").option("--rtl","enable RTL support.").option("--no-rtl","disable RTL support.").option("--reinstall","re-install existing UI components.").option("--no-reinstall","do not re-install existing UI components.").action(async(e,t)=>{let r$1,n=[],i=()=>{r$1&&Lt(r$1.replace(Me,""));};process.on("exit",i);try{let o=Xi.parse({...t,reinstall:t.reinstall,cwd:ie__default.resolve(t.cwd)}),s=new Map(Object.entries(pe)),c;if(o.defaults&&(o.template=o.template||"next",o.base=o.base||"base",o.reinstall=o.reinstall??!1),o.template&&!(o.template in z)&&(b.error(`Invalid template: ${a.info(o.template)}. Available templates: ${Object.keys(z).map(d=>a.info(d)).join(", ")}.`),b.break(),process.exit(1)),typeof o.preset=="string"&&!G$1(o.preset)&&!r(o.preset)){let d=Array.from(s.keys());s.has(o.preset)||(b.error(`Invalid preset: ${a.info(o.preset)}. Available presets: ${d.join(", ")}`),b.break(),process.exit(1));}let a$1=o.cwd,f=T.existsSync(ie__default.resolve(a$1,"components.json"));if(!o.monorepo&&!f&&await J(a$1)){let d=await ra$1(a$1);if(!d||d.framework.name==="manual"){let h=await G(a$1);h.length>0&&(H("init",h),process.exit(1));}}if(f&&!o.force){let{overwrite:d}=await we({type:"confirm",name:"overwrite",message:`A ${a.info("components.json")} file already exists. Would you like to overwrite it?`,initial:!1});d||(b.info(` To start over, remove the ${a.info("components.json")} file and run ${a.info("init")} again.`),b.break(),process.exit(1)),o.force=!0;}let p;if(f){try{p=await T.readJson(ie__default.resolve(a$1,"components.json"));}catch{}p&&(o.existingConfig=p);let d=o.reinstall;if(d===void 0){let{reinstall:h}=await we({type:"confirm",name:"reinstall",message:"Would you like to re-install existing UI components?",initial:!1});d=h;}if(d&&(n=await ua(a$1),n.length)){b.break(),b.log(" The following components will be re-installed and overwritten:");for(let h=0;h<n.length;h+=8)b.log(` - ${n.slice(h,h+8).join(", ")}`);b.break();}}if(o.preset===void 0&&e.length===0&&!o.defaults){let d=T.existsSync(ie__default.resolve(a$1,"package.json"));if(!o.template&&!d){let{template:h}=await we({type:"select",name:"template",message:"Select a template",choices:Object.entries(z).map(([g,w])=>({title:w.title,value:g,description:w.description,disabled:o.monorepo&&g==="laravel"}))});h||process.exit(1),o.template=h;}if(!o.template&&d){let h=await ra$1(a$1),g=Ue(h?.framework.name);g&&(o.template=g);}if(o.template==="laravel"&&!d&&(b.break(),b.log(` Please create a new app with ${a.info("laravel new --react")} first then run ${a.info("shadcn init")}.`),b.log(` See ${a.info(`${c$1}/docs/installation/laravel`)} for more information.`),b.break(),process.exit(0)),o.monorepo===void 0&&!d&&o.template&&z[o.template]?.monorepo){let{monorepo:h}=await we({type:"confirm",name:"monorepo",message:"Would you like to set up a monorepo?",initial:!1});o.monorepo=h;}o.base||(o.base=await _e()),o.preset=!0;}if(o.preset!==void 0){let d=o.preset===!0?!0:o.preset;if(d===!0){let h=await qe({rtl:o.rtl??!1,template:o.template,base:o.base});e=[h.url,...e],c=h.base;}if(typeof d=="string"){let h;if(G$1(d)){let g=new URL(d);o.rtl?g.searchParams.set("rtl","true"):o.rtl===!1&&g.searchParams.delete("rtl"),g.pathname==="/init"&&d.startsWith(c$1)&&g.searchParams.set("track","1"),h=g.toString(),c=g.searchParams.get("base")??void 0;}else if(r(d)){let g=q(d);g||(b.error(`Invalid preset code: ${a.info(d)}`),b.break(),process.exit(1)),h=me({...g,base:"radix",rtl:o.rtl??!1},{template:o.template,preset:d}),c=void 0;}else {let g=s.get(d);if(!g)throw new Error(`Unknown preset: ${d}`);h=me({...g,base:o.base??"radix",rtl:o.rtl??g.rtl},{template:o.template}),c=void 0;}e=[h,...e];}}let m=o.base??c??(p?.style?p.style.startsWith("base-")?"base":"radix":"");if(!m)if(e.length>0)m="radix";else {let d=await _e();m=d,o.base=d;}if(o.defaults&&!e.some(G$1)&&(e=[me({...pe.nova,base:m,rtl:o.rtl??!1},{template:o.template}),...e]),e.length>0&&G$1(e[0])){let d=new URL(e[0]);d.searchParams.set("base",m),e[0]=d.toString();}if(p?.style){let d=await es(p.style,m);if(d!==m&&(m=d,e.length>0&&G$1(e[0]))){let h=new URL(e[0]);h.searchParams.set("base",d),e[0]=h.toString();}}if(n.length&&(e=[...e,...n]),o.components=e,await Y(o.cwd),e.length>0){let d=ie__default.resolve(a$1,"components.json");f&&(r$1=ar(d)??void 0,r$1||b.warn(`Could not back up ${a.info("components.json")}.`));let{registryBaseConfig:h,installStyleIndex:g,url:w}=await Se(e[0],a$1,{registries:p?.registries});e[0]=w,g||(o.installStyleIndex=!1),h&&(o.registryBaseConfig=h);}await We(o),b.break(),b.log(`Project initialization completed.
|
|
126
|
+
You may now add components.`),process.removeListener("exit",i),cr(ie__default.resolve(a$1,"components.json")),b.break();}catch(o){process.removeListener("exit",i),i(),b.break(),$(o);}finally{V();}});async function We(e){let t,r,n=e.template,i=n?$e(z[n],{monorepo:e.monorepo}):void 0;if(e.monorepo&&i?.init&&T.existsSync(ie__default.resolve(e.cwd,"package.json")))t=await ra$1(e.cwd);else if(e.skipPreflight)t=await ra$1(e.cwd);else {let v=await nn(e);if(v.errors["1"]){let{projectPath:R,template:L}=await Dt(e);R||process.exit(1),e.cwd=R,e.isNewProject=true,r=L,t=await ra$1(e.cwd);}else t=v.projectInfo;}let s=!!r,c=r??n,a$1=c?$e(z[c],{monorepo:e.monorepo}):void 0,f=[...e.installStyleIndex?["index"]:[],...e.components??[],...a$1?["button"]:[]];if(a$1?.init){let v=await a$1.init({projectPath:e.cwd,components:f,registryBaseConfig:e.registryBaseConfig,rtl:e.rtl??false,menuColor:e.menuColor,menuAccent:e.menuAccent,iconLibrary:e.iconLibrary,silent:e.silent});return s&&await a$1.postInit({projectPath:e.cwd}),v}let p=await sa(e.cwd,t),m=p?await Qi(p,e):await Zi(await N(e.cwd));if(!e.yes){let{proceed:v}=await we({type:"confirm",name:"proceed",message:`Write configuration to ${a.info("components.json")}. Proceed?`,initial:true});v||process.exit(1);}let d$1=await O(e.cwd,m),{config:h}=await U(f,d$1,{silent:true});h.registries&&(m.registries=h.registries);let g=w("Writing components.json.").start(),w$1=ie__default.resolve(e.cwd,"components.json"),C=`${w$1}${Me}`,b=(v,R)=>{let{registries:L,...K}=bn(v,R);return {...K,registries:L}};if(T.existsSync(C)){let v=await T.readJson(C);e.force?v.registries&&(m.registries={...v.registries,...m.registries||{}}):m=b(v,m);}e.registryBaseConfig&&(m=b(m,e.registryBaseConfig)),e.rtl!==void 0&&(m.rtl=e.rtl),m.registries=Object.fromEntries(Object.entries(m.registries||{}).filter(([v])=>!Object.keys(d).includes(v))),await promises.writeFile(w$1,`${JSON.stringify(m,null,2)}
|
|
127
|
+
`,"utf8"),g.succeed();let P$1=await O(e.cwd,m),k=await P(P$1);if(k){let v={};if(m.menuColor&&(v.menuColor=m.menuColor),m.menuAccent&&(v.menuAccent=m.menuAccent),m.rtl!==void 0&&(v.rtl=m.rtl),m.iconLibrary&&(v.iconLibrary=m.iconLibrary),Object.keys(v).length>0)for(let R of Object.keys(k)){let L=k[R];if(L.resolvedPaths.cwd===P$1.resolvedPaths.cwd)continue;let K=ie__default.resolve(L.resolvedPaths.cwd,"components.json");if(T.existsSync(K)){let Ce=await T.readJson(K);await T.writeJson(K,{...Ce,...v},{spaces:2});}}}return M.clearCaches(),await ae(f,P$1,{overwrite:true,overwriteCssVars:e.reinstall||void 0,silent:e.silent,isNewProject:e.isNewProject||t?.framework.name==="next-app"}),a$1&&s&&await a$1.postInit({projectPath:e.cwd}),P$1}async function Zi(e=null){let[t,r]=await Promise.all([fa$1(),ha()]);b.info("");let n=await we([{type:"toggle",name:"typescript",message:`Would you like to use ${a.info("TypeScript")} (recommended)?`,initial:e?.tsx??true,active:"yes",inactive:"no"},{type:"select",name:"style",message:`Which ${a.info("style")} would you like to use?`,choices:t.map(i=>({title:i.label,value:i.name}))},{type:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${a.info("base color")}?`,choices:r.map(i=>({title:i.label,value:i.name}))},{type:"text",name:"tailwindCss",message:`Where is your ${a.info("global CSS")} file?`,initial:e?.tailwind.css??K},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${a.info("CSS variables")} for theming?`,initial:e?.tailwind.cssVariables??true,active:"yes",inactive:"no"},{type:"text",name:"tailwindPrefix",message:`Are you using a custom ${a.info("tailwind prefix eg. tw-")}? (Leave blank if not)`,initial:""},{type:"text",name:"tailwindConfig",message:`Where is your ${a.info("tailwind.config.js")} located?`,initial:e?.tailwind.config??L},{type:"text",name:"components",message:`Configure the import alias for ${a.info("components")}:`,initial:e?.aliases.components??I},{type:"text",name:"utils",message:`Configure the import alias for ${a.info("utils")}:`,initial:e?.aliases.utils??J$1},{type:"toggle",name:"rsc",message:`Are you using ${a.info("React Server Components")}?`,initial:e?.rsc??true,active:"yes",inactive:"no"}]);return n.style||process.exit(1),c.parse({$schema:"https://ui.shadcn.com/schema.json",style:n.style,tailwind:{config:n.tailwindConfig,css:n.tailwindCss,baseColor:n.tailwindBaseColor,cssVariables:n.tailwindCssVariables,prefix:n.tailwindPrefix},rsc:n.rsc,tsx:n.typescript,aliases:{utils:n.utils,components:n.components,lib:n.components.replace(/\/components$/,"lib"),hooks:n.components.replace(/\/components$/,"hooks")}})}async function Qi(e,t){let r=e.style,n="neutral",i=e.tailwind.cssVariables,o=e.iconLibrary??"lucide";if(!t.defaults){let[s,c]=await Promise.all([fa$1(),ta$1(e)]);r=(await we([{type:c==="v4"||r?null:"select",name:"style",message:`Which ${a.info("style")} would you like to use?`,choices:s.map(f=>({title:f.name==="new-york"?"New York (Recommended)":f.label,value:f.name})),initial:0}])).style??r??"new-york";}return i=t.cssVariables,c.parse({$schema:e?.$schema,style:r,tailwind:{...e?.tailwind,baseColor:n,cssVariables:i},rsc:e?.rsc,tsx:e?.tsx,iconLibrary:o,rtl:t.rtl??e?.rtl??false,aliases:e?.aliases})}async function es(e,t){let r=e.startsWith("base-")?"base":"radix";if(t===r)return t;b.warn(` You are switching from ${a.info(r)} to ${a.info(t)}.`),b.warn(` Components outside the ${a.info("ui")} directory that depend on ${a.info(r)} primitives may need manual updates.`),b.break();let{proceed:n}=await we({type:"confirm",name:"proceed",message:"Would you like to continue?",initial:false});return n?t:r}async function Dn(e){let t={};if(!T.existsSync(e.cwd)||!T.existsSync(ie__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!T.existsSync(ie__default.resolve(e.cwd,"components.json"))){if(await J(e.cwd)){let r=await G(e.cwd);r.length>0&&(H("add [component]",r),process.exit(1));}return t["3"]=true,{errors:t,config:null}}try{let r=await N(e.cwd);return {errors:t,config:r}}catch{b.break(),b.error(`An invalid ${a.info("components.json")} file was found at ${a.info(e.cwd)}.
|
|
128
|
+
Before you can add components, you must create a valid ${a.info("components.json")} file by running the ${a.info("init")} command.`),b.error(`Learn more at ${a.info(`${c$1}/docs/components-json`)}.`),b.break(),process.exit(1);}}async function _n(e,t,r={}){let n={files:[],dependencies:[],devDependencies:[],css:null,envVars:null,fonts:[],docs:null};if(!e.length)return n;let i=await _(e,U$1(t));if(!i)throw new Error("Failed to fetch components from registry.");r.skipFonts||(i=await et(i,t));let o=Ie([i]);return n.dependencies=Array.from(new Set(i.dependencies??[])),n.devDependencies=Array.from(new Set(i.devDependencies??[])),n.docs=i.docs??null,await ts(i,t,n,r,o),await rs(i,t,n,r),ns(i,t,n),r.skipFonts||os(i,n),n}async function ts(e,t,r,n,i){let o=e.files;if(!o?.length)return;let[s$1,c]=await Promise.all([ra$1(t.resolvedPaths.cwd),t.tailwind.baseColor?ia(t.tailwind.baseColor):Promise.resolve(void 0)]);for(let a=0;a<o.length;a++){let f$1=o[a];if(!f$1.content)continue;let p=E(f$1,t,{isSrcDir:s$1?.isSrcDir,framework:s$1?.framework.name,commonRoot:F(o.map(b=>b.path),f$1.path),fileIndex:a});if(!p)continue;t.tsx||(p=p.replace(/\.tsx?$/,b=>b===".tsx"?".jsx":".js"));let m=existsSync(p),d=ie__default.relative(t.resolvedPaths.cwd,p),h=f$1.type==="registry:file"||f$1.type==="registry:item",g$1=s(p)||h?f$1.content:await B$1({filename:f$1.path,raw:f$1.content,config:t,baseColor:c,transformJsx:!t.tsx,isRemote:false,supportedFontMarkers:i},[x,y,a$1,A,c$2,g,C,d$1,f,z$2]),w="create",C$1;m&&(C$1=await promises.readFile(p,"utf-8"),r$1(C$1,g$1)?w="skip":w="overwrite"),r.files.push({path:d,action:w,content:g$1,...w==="overwrite"&&{existingContent:C$1},type:f$1.type??"registry:ui"});}}async function rs(e,t,r,n){let i=e.css&&Object.keys(e.css).length>0,o=Object.keys(e.cssVars??{}).length>0;if(!t.resolvedPaths.tailwindCss||!i&&!o)return;let s=t.resolvedPaths.tailwindCss,c=existsSync(s),a=ie__default.relative(t.resolvedPaths.cwd,s),f=c?await promises.readFile(s,"utf8"):"",p=f;o&&(p=await Xe(p,e.cssVars,t,{overwriteCssVars:n.overwriteCssVars})),i&&(p=await nr(p,e.css));let m=0;if(e.cssVars)for(let d of Object.values(e.cssVars))d&&(m+=Object.keys(d).length);r.css={path:a,content:p,...c&&{existingContent:f},action:c?"update":"create",cssVarsCount:m};}function ns(e,t,r){if(!e.envVars||Object.keys(e.envVars).length===0)return;let n=ie__default.join(t.resolvedPaths.cwd,".env.local"),i=existsSync(n),o=ie__default.relative(t.resolvedPaths.cwd,n);r.envVars={path:o,variables:e.envVars,action:i?"update":"create"};}function os(e,t){if(e.fonts?.length)for(let r of e.fonts)t.fonts.push({name:r.font.family,provider:r.font.provider==="google"?"Google Fonts":r.font.provider});}var be=5,as=dim("\u250C"+"\u2500".repeat(46)),cs=dim("\u2514"+"\u2500".repeat(46)),ls={create:"+",overwrite:"~",skip:"="},fs={create:"create",overwrite:"overwrite",skip:"skip (identical)"};function rt(e){return e==="create"?green(e):e==="overwrite"||e==="update"?yellow(e):dim(e)}function nt(e){return `${bold("\u250C")} ${bold(`shadcn add ${e.join(", ")}`)} ${dim("(dry run)")}`}function Mn(e,t){return e===t||e.includes(t)||e.endsWith(t)}function Ee(e,t,r=n=>n){e.push(`${dim("\u2502")} ${as}`);for(let n of t)e.push(`${dim("\u2502")} ${dim("\u2502")} ${r(n)}`);e.push(`${dim("\u2502")} ${cs}`);}function Wn(e,t,r={}){return r.diff?typeof r.diff=="string"?ms(e,t,r.diff):ds(e,t):r.view?typeof r.view=="string"?gs(e,t,r.view):us(e,t):ps(e,t)}function ps(e,t){let r=[];r.push(nt(t)),r.push(dim("\u2502")),hs(e,r),Vn("Dependencies",e.dependencies,r),Vn("Dev Dependencies",e.devDependencies,r),ys(e,r),ws(e,r),bs(e,r);let n=e.files.filter(o=>o.action==="overwrite").length;n>0&&(r.push(yellow(`\u26A0 ${n} ${n===1?"file":"files"} will be overwritten.`)),r.push(dim("\u2502")));let i=[];return e.files.length>0&&i.push(`${e.files.length} ${e.files.length===1?"file":"files"}`),e.dependencies.length>0&&i.push(`${e.dependencies.length} ${e.dependencies.length===1?"dep":"deps"}`),e.css?.cssVarsCount&&i.push(`${e.css.cssVarsCount} CSS vars`),i.length>0&&(r.push(`${dim("\u2502")} ${dim(i.join(", "))}`),r.push(dim("\u2502"))),r.push(`${dim("\u2502")} ${dim("Run with --diff to view changes.")}`),r.push(`${dim("\u2502")} ${dim("Run with --view to view file contents.")}`),r.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),r.join(`
|
|
129
|
+
`)}function ms(e,t,r){let n=[];n.push(nt(t)),n.push(dim("\u2502"));let i=zn(e.files,r),o=e.css&&Mn(e.css.path,r);if(i.length===0&&!o)n.push(`${dim("\u2502")} ${yellow(`No file matching "${r}" found.`)}`),n.push(dim("\u2502"));else {for(let s of i)Bn(s,n);if(o&&e.css){if(n.push(`${dim("\u251C")} ${bold(e.css.path)} ${dim("(")}${rt(e.css.action)}${dim(")")}`),e.css.action==="create"||!e.css.existingContent)Ee(n,e.css.content.split(`
|
|
130
|
+
`),s=>green(`+${s}`));else {let s=Jn(e.css.existingContent,e.css.content,e.css.path,{fullContext:true});Ee(n,s);}n.push(dim("\u2502"));}}return n.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),n.join(`
|
|
131
|
+
`)}function ds(e,t){let r=[];r.push(nt(t)),r.push(dim("\u2502"));let n=e.files.slice(0,be);if(n.length===0&&!e.css)r.push(`${dim("\u2502")} ${dim("No changes.")}`),r.push(dim("\u2502"));else {for(let s of n)Bn(s,r);e.files.length>be&&r.push(dim("\u2502"));}let i=e.files.length;return i>be&&r.push(` ${dim(`Showing ${be} of ${i} files. Use --diff <path> to view a specific file.`)}`),r.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),r.join(`
|
|
132
|
+
`)}function us(e,t){let r=[];r.push(nt(t)),r.push(dim("\u2502"));let n=e.files.slice(0,be);if(n.length===0&&!e.css)r.push(`${dim("\u2502")} ${dim("No files.")}`),r.push(dim("\u2502"));else {for(let s of n){let c=s.content.split(`
|
|
133
|
+
`);r.push(`${dim("\u251C")} ${bold(s.path)} ${dim("(")}${rt(s.action)}${dim(")")} ${dim(`${c.length} lines`)}`),Ee(r,c),r.push(dim("\u2502"));}e.files.length>be&&r.push(dim("\u2502"));}let i=e.files.length;return i>be&&r.push(` ${dim(`Showing ${be} of ${i} files. Use --view <path> to view a specific file.`)}`),r.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),r.join(`
|
|
134
|
+
`)}function Bn(e,t){if(t.push(`${dim("\u251C")} ${bold(e.path)} ${dim("(")}${rt(e.action)}${dim(")")}`),e.action==="skip")t.push(`${dim("\u2502")} ${dim("No changes.")}`);else if(e.action==="create")Ee(t,e.content.split(`
|
|
135
|
+
`),r=>green(`+${r}`));else {let r=Jn(e.existingContent,e.content,e.path);Ee(t,r);}t.push(dim("\u2502"));}function gs(e,t,r){let n=[];n.push(nt(t)),n.push(dim("\u2502"));let i=zn(e.files,r),o=e.css&&Mn(e.css.path,r);if(i.length===0&&!o)n.push(`${dim("\u2502")} ${yellow(`No file matching "${r}" found.`)}`),n.push(dim("\u2502"));else {for(let s of i){let c=s.content.split(`
|
|
136
|
+
`);n.push(`${dim("\u251C")} ${bold(s.path)} ${dim("(")}${rt(s.action)}${dim(")")} ${dim(`${c.length} lines`)}`),Ee(n,c),n.push(dim("\u2502"));}if(o&&e.css){let s=e.css.content.split(`
|
|
137
|
+
`);n.push(`${dim("\u251C")} ${bold(e.css.path)} ${dim("(")}${rt(e.css.action)}${dim(")")} ${dim(`${s.length} lines`)}`),Ee(n,s),n.push(dim("\u2502"));}}return n.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),n.join(`
|
|
138
|
+
`)}function hs(e,t){if(e.files.length===0)return;let r={create:0,overwrite:0,skip:0};for(let s of e.files)r[s.action]++;let n=[];r.create>0&&n.push(green(`+${r.create} new`)),r.overwrite>0&&n.push(yellow(`~${r.overwrite} overwrite`)),r.skip>0&&n.push(dim(`=${r.skip} skip`));let i=n.length>0?` ${n.join(dim(", "))}`:"";t.push(`${dim("\u251C")} ${bold("Files")} ${dim(`(${e.files.length})`)}${i}`);let o=Math.max(...e.files.map(s=>s.path.length));for(let s of e.files){let c=ls[s.action],a=fs[s.action],f=" ".repeat(Math.max(1,o-s.path.length+2)),p=s.action==="create"?green:s.action==="overwrite"?yellow:dim,m=s.action==="skip"?dim(s.path):s.path;t.push(`${dim("\u2502")} ${p(c)} ${m}${f}${p(a)}`);}t.push(dim("\u2502"));}function Vn(e,t,r){if(t.length){r.push(`${dim("\u251C")} ${bold(e)} ${dim(`(${t.length})`)}`);for(let n of t)r.push(`${dim("\u2502")} ${green("+")} ${n}`);r.push(dim("\u2502"));}}function ys(e,t){e.css&&(t.push(`${dim("\u251C")} ${bold("CSS")}`),e.css.cssVarsCount>0?t.push(`${dim("\u2502")} ${green("+")} ${e.css.cssVarsCount} CSS variables added to ${cyan(e.css.path)}`):t.push(`${dim("\u2502")} ${green("+")} Updated ${cyan(e.css.path)}`),t.push(dim("\u2502")));}function ws(e,t){if(!e.envVars)return;let r=Object.keys(e.envVars.variables);t.push(`${dim("\u251C")} ${bold("Environment Variables")}`);for(let n of r)t.push(`${dim("\u2502")} ${green("+")} ${n}`);t.push(dim("\u2502"));}function bs(e,t){if(e.fonts.length){t.push(`${dim("\u251C")} ${bold("Fonts")}`);for(let r of e.fonts)t.push(`${dim("\u2502")} ${green("+")} ${r.name} ${dim(`(${r.provider})`)}`);t.push(dim("\u2502"));}}function zn(e,t){let r=e.filter(n=>n.path===t);return r.length>0?r:e.filter(n=>n.path.includes(t)||n.path.replace(/\\/g,"/").includes(t))}function Jn(e,t,r,n={}){if(Ss(e,t))return [dim(" Formatting-only changes (spacing, quotes, semicolons).")];let i=Un(e),o=Un(t),s=n.fullContext?Math.max(i.split(`
|
|
139
139
|
`).length,o.split(`
|
|
140
140
|
`).length):3,c=structuredPatch(`a/${r}`,`b/${r}`,i,o,"","",{context:s});if(!c.hunks.length)return [dim(" No changes.")];let a=[dim(`--- a/${r}`),dim(`+++ b/${r}`)],f=t.split(`
|
|
141
|
-
`);for(let p of c.hunks){let{entries:m}=
|
|
141
|
+
`);for(let p of c.hunks){let{entries:m}=xs(p,f);if(!m.some(C=>C.kind!=="context"))continue;let h=m.filter(C=>C.kind==="context").length,g=m.filter(C=>C.kind==="removed").length,w=m.filter(C=>C.kind==="added").length;a.push(cyan(`@@ -${p.oldStart},${h+g} +${p.newStart},${h+w} @@`));for(let C of m)a.push(C.formatted);}return a}function xs(e,t){let r=[],n=e.newStart-1,i=0;for(;i<e.lines.length;){let o=e.lines[i];if(o.startsWith("-")){let s=[];for(;i<e.lines.length&&e.lines[i].startsWith("-");)s.push(e.lines[i].slice(1)),i++;for(;i<e.lines.length&&e.lines[i].startsWith("\\");)i++;let c=[];for(;i<e.lines.length&&e.lines[i].startsWith("+");)c.push(e.lines[i].slice(1)),i++;for(;i<e.lines.length&&e.lines[i].startsWith("\\");)i++;n=Cs(s,c,t,n,r);}else if(o.startsWith("+")){let s=t[n]??o.slice(1);r.push({kind:"added",formatted:green(`+${s}`)}),n++,i++;}else if(o.startsWith("\\"))i++;else {let s=t[n]??o.slice(1);r.push({kind:"context",formatted:dim(` ${s}`)}),n++,i++;}}return {entries:r,newLineIndex:n}}function Cs(e,t,r,n,i){if(ks(e,t)){for(let a=0;a<t.length;a++){let f=r[n]??t[a];i.push({kind:"context",formatted:dim(` ${f}`)}),n++;}return n}let o=vs(e),s=o.map(Vt),c=new Set;for(let a=0;a<t.length;a++){let f=r[n]??t[a],p=Vt(t[a]),m=s.findIndex((d,h)=>!c.has(h)&&d===p);if(m!==-1)c.add(m),i.push({kind:"context",formatted:dim(` ${f}`)});else {let d=s.findIndex((h,g)=>!c.has(g));if(d!==-1){c.add(d);let{oldHighlighted:h,newHighlighted:g}=Rs(o[d],f);i.push({kind:"removed",formatted:h}),i.push({kind:"added",formatted:g});}else i.push({kind:"added",formatted:green(`+${f}`)});}n++;}for(let a=0;a<o.length;a++)c.has(a)||i.push({kind:"removed",formatted:red(`-${o[a]}`)});return n}function Un(e){return e.split(`
|
|
142
142
|
`).map(t=>{let r=t.match(/^(\s*)/)?.[1]??"",n=t.slice(r.length);return r+n.replace(/['"]/g,'"').replace(/;$/g,"")}).join(`
|
|
143
|
-
`)}function
|
|
144
|
-
`).map(
|
|
143
|
+
`)}function vs(e){let t=[];for(let r=0;r<e.length;r++){let n=e[r];for(;r+1<e.length&&n.trimEnd().endsWith(":");)r++,n=n.trimEnd()+" "+e[r].trim();t.push(n);}return t}function Rs(e,t){let r=diffWords(e,t),n="-",i="+";for(let o of r)o.added?i+=bold(green(o.value)):o.removed?n+=bold(red(o.value)):(n+=red(o.value),i+=green(o.value));return {oldHighlighted:n,newHighlighted:i}}function Vt(e){return e.replace(/\s+/g," ").trim().replace(/['"]/g,"'").replace(/;/g,"").replace(/,$/,"")}function Ss(e,t){let r=n=>n.split(`
|
|
144
|
+
`).map(Vt).filter(i=>i.length>0).join(" ");return r(e)===r(t)}function ks(e,t){let r=n=>n.map(Vt).filter(i=>i.length>0).join(" ");return r(e)===r(t)}async function Hn(e,t){let r=ie__default.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await Fe__default.stat(r)).isFile())return;let[n]=await ba$1([e],{config:t});if(!n?.meta?.importSpecifier||!n?.meta?.moduleSpecifier)return;let i=`import { ${n?.meta?.importSpecifier} } from "${n.meta.moduleSpecifier}"
|
|
145
145
|
|
|
146
146
|
export default function Page() {
|
|
147
147
|
return <${n?.meta?.importSpecifier} />
|
|
148
|
-
}`;await
|
|
149
|
-
Existing CSS variables and components will be overwritten. Continue?`)});w||(b.break(),b.log("Installation cancelled."),b.break(),process.exit(1));}}r.components?.length||(r.components=await
|
|
150
|
-
Before you can apply a preset, you must create a valid ${a.info("components.json")} file by running the ${a.info("init")} command.`),b.error(`Learn more at ${a.info(`${c$1}/docs/components-json`)}.`),b.break(),process.exit(1);}}var
|
|
148
|
+
}`;await Fe__default.writeFile(r,i,"utf8");}var js=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(),dryRun:z$1.boolean(),diff:z$1.union([z$1.string(),z$1.literal(true)]).optional(),view:z$1.union([z$1.string(),z$1.literal(true)]).optional()}),Yn=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("--dry-run","preview changes without writing files.",false).option("--diff [path]","show diff for a file.").option("--view [path]","show file contents.").action(async(e$1,t)=>{try{let r=js.parse({components:e$1,...t,cwd:ie__default.resolve(t.cwd)});await Y(r.cwd);let n=r.dryRun||r.diff||r.view,i=await N(r.cwd);i||(i=T$1({style:"new-york",resolvedPaths:{cwd:r.cwd}}));let o=!1;if(e$1.length>0){let{config:g,newRegistries:w}=await U(e$1,i,{silent:r.silent,writeFile:!1});i=g,o=w.length>0;}let s,c=!0;if(e$1.length>0){let[g]=await ba$1([e$1[0]],{config:i});if(s=g?.type,c=s!=="registry:theme"&&s!=="registry:style"&&s!=="registry:base",H$1(g)&&!n){await ae(e$1,i,r);return}if(!r.yes&&!n&&(s==="registry:style"||s==="registry:theme")){b.break();let{confirm:w}=await we({type:"confirm",name:"confirm",message:a.warn(`You are about to install a new ${s.replace("registry:","")}.
|
|
149
|
+
Existing CSS variables and components will be overwritten. Continue?`)});w||(b.break(),b.log("Installation cancelled."),b.break(),process.exit(1));}}r.components?.length||(r.components=await Es(r));let a$1=await ra$1(r.cwd);if(a$1?.tailwindVersion==="v4"){let g=e.filter(w=>r.components?.includes(w.name));g?.length&&(b.break(),g.forEach(w=>{b.warn(a.warn(w.message));}),b.break(),process.exit(1));}let{errors:f,config:p}=await Dn(r),m=!1;if(f["3"]){let{proceed:g}=await we({type:"confirm",name:"proceed",message:`You need to create a ${a.info("components.json")} file to add components. Proceed?`,initial:!0});g||(b.break(),process.exit(1));let w=Ue(a$1?.framework.name),C=await _e(),{url:b$1}=await qe({rtl:!1,base:C,template:w}),{registryBaseConfig:P,installStyleIndex:k,url:v}=await Se(b$1,r.cwd);p=await We({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:r.silent&&!o,isNewProject:!1,cssVariables:!0,rtl:!1,installStyleIndex:k,components:[v,...r.components??[]],registryBaseConfig:P}),m=!0;}let d=!1;if(f["1"]){let{projectPath:g,template:w}=await Dt({cwd:r.cwd,force:r.overwrite,components:r.components});g||(b.break(),process.exit(1)),r.cwd=g;let C=await _e(),{url:b$1}=await qe({rtl:!1,base:C,template:w}),{registryBaseConfig:P,installStyleIndex:k,url:v}=await Se(b$1,r.cwd);p=await We({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!o&&r.silent,isNewProject:!0,cssVariables:!0,rtl:!1,installStyleIndex:k,components:[v,...r.components??[]],registryBaseConfig:P}),m=!0,d=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//);}if(!p)throw new Error(`Failed to read config at ${a.info(r.cwd)}.`);let{config:h}=await U(r.components,p,{silent:r.silent||o,writeFile:!n});if(p=h,n){let g=w("Resolving items.",{silent:r.silent}).start(),w$1=await _n(r.components,p,{overwrite:r.overwrite});g.stop(),b.log(Wn(w$1,r.components,{diff:r.diff,view:r.view}));return}m||await ae(r.components,p,r),d&&await Hn(r.components[0],p);}catch(r){b.break(),$(r);}finally{V();}});async function Es(e$1){let t=await ea$1();if(!t)return b.break(),$(new Error("Failed to fetch registry index.")),[];if(e$1.all)return t.map(i=>i.name).filter(i=>!e.some(o=>o.name===i));if(e$1.components?.length)return e$1.components;let{components:r}=await we({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(i=>i.type==="registry:ui"&&!e.some(o=>o.name===i.name)).map(i=>({title:i.name,value:i.name,selected:e$1.all?true:e$1.components?.includes(i.name)}))});r?.length||(b.warn("No components selected. Exiting."),b.info(""),process.exit(1));let n=z$1.array(z$1.string()).safeParse(r);return n.success?n.data:(b.error(""),$(new Error("Something went wrong. Please try again.")),[])}async function qn(e){let t={};if(!T.existsSync(e.cwd)||!T.existsSync(ie__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!T.existsSync(ie__default.resolve(e.cwd,"components.json"))){if(await J(e.cwd)){let r=await G(e.cwd);r.length>0&&(H("apply --preset <preset>",r,{cwdFlag:"-c"}),process.exit(1));}return t["3"]=true,{errors:t,config:null}}try{let r=await N(e.cwd);return {errors:t,config:r}}catch{b.break(),b.error(`An invalid ${a.info("components.json")} file was found at ${a.info(e.cwd)}.
|
|
150
|
+
Before you can apply a preset, you must create a valid ${a.info("components.json")} file by running the ${a.info("init")} command.`),b.error(`Learn more at ${a.info(`${c$1}/docs/components-json`)}.`),b.break(),process.exit(1);}}var As=z$1.object({cwd:z$1.string(),positionalPreset:z$1.string().optional(),preset:z$1.string().optional(),only:z$1.union([z$1.boolean(),z$1.string()]).optional(),yes:z$1.boolean(),silent:z$1.boolean()}),eo=["theme","font"],ze=class extends Error{constructor(t){super(t),this.name="ApplyOnlyError";}},to=new Command().name("apply").description("apply a preset to an existing project").argument("[preset]","the preset to apply").option("--preset <preset>","preset configuration to apply").option("--only [parts]","apply only parts of a preset: theme, font").option("-y, --yes","skip confirmation prompt.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",false).action(async(e,t)=>{try{let r=As.parse({...t,cwd:ie__default.resolve(t.cwd),positionalPreset:e}),n=Ns(r),i=Zn(r.only);Ls({preset:n,only:i});let o=await qn(r);o.errors["1"]&&(b.break(),b.error(`The ${a.info("apply")} command only works in an existing project.`),b.error(`Run ${a.info(Qn(n))} first.`),b.break(),process.exit(1)),o.errors["3"]&&(b.break(),b.error(`No ${a.info("components.json")} found at ${a.info(r.cwd)}.`),b.error(`Run ${a.info(Qn(n))} first.`),b.break(),process.exit(1));let s=o.config;s||process.exit(1);let c=s.rtl??!1,a$1=await Us(r.cwd);if(!n){let g=tr({command:"init",template:a$1,base:S(s.style),rtl:c});await rr({createUrl:g,followUp:`Then run ${a.info("shadcn apply --preset <preset>")} with the preset code or preset URL from ui.shadcn.com.`,prompt:!r.yes}),process.exit(0);}Vs(n);let f=i??Zn(Ts(n)),p=!f,m=p?await ua(r.cwd):[];if(!r.yes){if(b.break(),f?b.warn(a.warn("Applying the selected preset parts will update your project configuration and styles.")):b.warn(a.warn("Applying a new preset will overwrite existing UI components, fonts, and CSS variables.")),b.warn("Commit or stash your changes before continuing so you can easily go back."),p)if(b.break(),b.log(" The following components will be re-installed:"),m.length)for(let w=0;w<m.length;w+=8)b.log(` - ${m.slice(w,w+8).join(", ")}`);else b.log(" - No installed UI components were detected.");b.break();let{proceed:g}=await we({type:"confirm",name:"proceed",message:"Would you like to continue?",initial:!1});g||(b.break(),process.exit(1));}await Y(r.cwd);let d=S(s.style),h=Ms(n,d,{template:a$1,rtl:c,only:f?.join(",")});await An(ie__default.resolve(r.cwd,"components.json"),async()=>{let{registryBaseConfig:g,installStyleIndex:w,url:C}=await Se(h,r.cwd,{registries:s.registries}),b=_s({registryBaseConfig:g,existingConfig:s,only:f});await We({cwd:r.cwd,yes:!0,force:!1,reinstall:p,defaults:!1,silent:r.silent,isNewProject:!1,cssVariables:!0,installStyleIndex:w,registryBaseConfig:b,existingConfig:s,components:[C,...m]});},{onBackupFailure:()=>{b.error(`Could not back up ${a.info("components.json")}. Aborting.`);}}),b.break(),b.log("Preset applied successfully."),b.break();}catch(r){if(r instanceof ze){for(let n of r.message.split(`
|
|
151
|
+
`))b.error(n);b.break(),process.exit(1);}b.break(),$(r);}finally{V();}});function Ns(e){let t=e.positionalPreset?.trim(),r=e.preset?.trim();return t&&r&&t!==r&&(b.error(`Received two different preset values. Use either the positional preset or ${a.info("--preset")}, or pass the same value to both.`),b.break(),process.exit(1)),r??t}function Ts(e){if(!G$1(e))return;let t=new URL(e);if(t.pathname==="/init")return t.searchParams.get("only")??void 0}function Zn(e){if(!(e===void 0||e===false)){if(e===true)throw new ze(["Missing value for --only.",`Use one or more of: ${eo.join(", ")}.`,"Example: shadcn apply <preset> --only theme,font."].join(`
|
|
152
|
+
`));return Ds(e)}}function Ds(e){let t={theme:"theme",font:"font",fonts:"font"},r=e.split(",").map(i=>i.trim().toLowerCase()).filter(Boolean),n=r.filter(i=>!t[i]);if(!r.length||n.length)throw new ze([`Invalid value for --only: ${e}.`,`Use one or more of: ${eo.join(", ")}.`,"Example: shadcn apply <preset> --only theme,font."].join(`
|
|
153
|
+
`));return Array.from(new Set(r.map(i=>t[i])))}function Ls(e){if(!(!e.only||e.preset))throw new ze(["Missing preset for --only.","Use: shadcn apply <preset> --only theme,font."].join(`
|
|
154
|
+
`))}function _s(e){if(!e.only||e.only.includes("theme"))return e.registryBaseConfig;let t=typeof e.existingConfig.tailwind=="object"&&e.existingConfig.tailwind!==null?e.existingConfig.tailwind:{},r=typeof e.registryBaseConfig?.tailwind=="object"&&e.registryBaseConfig.tailwind!==null?e.registryBaseConfig.tailwind:{},n={...e.registryBaseConfig,tailwind:{...t,...r}};return e.existingConfig.menuColor&&(n.menuColor=e.existingConfig.menuColor),e.existingConfig.menuAccent&&(n.menuAccent=e.existingConfig.menuAccent),n}function Vs(e){if(G$1(e)||r(e))return;let t=Object.keys(pe);t.includes(e)||(b.error(`Invalid preset: ${a.info(e)}.
|
|
151
155
|
Use one of the available presets: ${t.join(", ")}
|
|
152
|
-
or build your own at ${a.info(`${c$1}/create`)}`),b.break(),process.exit(1));}async function Ns(e){let t=await ra$1(e);return Ve(t?.framework.name)}function As(e,t,r$1={}){if(G$1(e)){let i=new URL(e);return i.pathname==="/init"&&e.startsWith(c$1)&&i.searchParams.set("track","1"),i.searchParams.set("base",t),i.searchParams.set("rtl",String(r$1.rtl??false)),i.toString()}if(r(e)){let i=q(e);return i||(b.error(`Invalid preset code: ${a.info(e)}`),b.break(),process.exit(1)),pe({...i,base:t,rtl:r$1.rtl??false},{preset:e,template:r$1.template})}let n=fe[e];return pe({...n,base:t,rtl:r$1.rtl??n.rtl},{template:r$1.template})}function Ts(e){return /[^A-Za-z0-9_./:-]/.test(e)?JSON.stringify(e):e}function Xn(e){return e?`shadcn init --preset ${Ts(e)}`:"shadcn init"}async function ro(e){let t={},r={cwd:e.cwd,registryFile:ie__default.resolve(e.cwd,e.registryFile),outputDir:ie__default.resolve(e.cwd,e.outputDir)};return T.existsSync(r.registryFile)||(t["13"]=true),await T.mkdir(r.outputDir,{recursive:true}),Object.keys(t).length>0&&(t["13"]&&(b.break(),b.error(`The path ${a.info(r.registryFile)} does not exist.`)),b.break(),process.exit(1)),{errors:t,resolvePaths:r}}var Ls=z$1.object({cwd:z$1.string(),registryFile:z$1.string(),outputDir:z$1.string()}),no=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 r=Ls.parse({cwd:ie.resolve(t.cwd),registryFile:e,outputDir:t.output}),{resolvePaths:n$1}=await ro(r),i=await Ee.readFile(n$1.registryFile,"utf-8"),o$1=o.safeParse(JSON.parse(i));o$1.success||(b.error(`Invalid registry file found at ${a.info(n$1.registryFile)}.`),process.exit(1));let s=w("Building registry...");for(let c of o$1.data.items){s.start(`Building ${c.name}...`),c.$schema="https://ui.shadcn.com/schema/registry-item.json";for(let f of c.files??[])f.content=await Ee.readFile(ie.resolve(n$1.cwd,f.path),"utf-8");let a$1=n.safeParse(c);if(!a$1.success){b.error(`Invalid registry item found for ${a.info(c.name)}.`);continue}await Ee.writeFile(ie.resolve(n$1.outputDir,`${a$1.data.name}.json`),JSON.stringify(a$1.data,null,2));}await Ee.copyFile(n$1.registryFile,ie.resolve(n$1.outputDir,"registry.json")),s.succeed("Building registry.");}catch(r){b.break(),$(r);}});var Us=z$1.object({component:z$1.string().optional(),yes:z$1.boolean(),cwd:z$1.string(),path:z$1.string().optional()}),io=new Command().name("diff").description("[DEPRECATED] Use `add [component] --diff` instead.").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 r=Us.parse({component:e,...t}),n=ie__default.resolve(r.cwd);existsSync(n)||(b.error(`The path ${n} does not exist. Please try again.`),process.exit(1));let i=await N(n);if(!i){if(await J(n)){let a=await G(n);a.length>0&&(H("diff [component]",a),process.exit(1));}b.warn(`Configuration is missing. Please run ${a.success("init")} to create a components.json file.`),process.exit(1);}let o=await ea();if(o||($(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let a$1=i.resolvedPaths.components,f=o.filter(m=>{for(let d of m.files??[]){let h=ie__default.resolve(a$1,typeof d=="string"?d:d.path);if(existsSync(h))return !0}return !1}),p=[];for(let m of f){let d=await oo(m,i);d.length&&p.push({name:m.name,changes:d});}p.length||(b.info("No updates found."),process.exit(0)),b.info("The following components have updates available:");for(let m of p){b.info(`- ${m.name}`);for(let d of m.changes)b.info(` - ${d.filePath}`);}b.break(),b.info(`Run ${a.success("diff <component>")} to see the changes.`),process.exit(0);}let s=o.find(a=>a.name===r.component);s||(b.error(`The component ${a.success(r.component)} does not exist.`),process.exit(1));let c=await oo(s,i);c.length||(b.info(`No updates found for ${r.component}.`),process.exit(0));for(let a of c)b.info(`- ${a.filePath}`),await Ws(a.patch),b.info("");}catch(r){$(r);}});async function oo(e,t){let r=await ka$1(t.style,[e]),n=await ia(t.tailwind.baseColor),i=$e(r);if(!r)return [];let o=[];for(let s of r){let c=await la(t,s);if(c)for(let a of s.files??[]){let f$1=ie__default.resolve(c,typeof a=="string"?a:a.path);if(!existsSync(f$1))continue;let p=await promises.readFile(f$1,"utf8");if(typeof a=="string"||!a.content)continue;let m=await B$1({filename:a.path,raw:a.content,config:t,baseColor:n,supportedFontMarkers:i},[x,y,a$1,A,c$2,g,d$1,f,z$2]),d=diffLines(m,p);d.length>1&&o.push({filePath:f$1,patch:d});}}return o}async function Ws(e){e.forEach(t=>{if(t)return t.added?process.stdout.write(a.success(t.value)):t.removed?process.stdout.write(a.error(t.value)):process.stdout.write(t.value)});}var so=new Command().name("docs").description("get docs, api references and usage examples for components").argument("<components...>","component names").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-b, --base <base>","the base to use either 'base' or 'radix'. defaults to project base.").option("--json","output as JSON.",false).action(async(e,t)=>{try{let r=ie__default.resolve(t.cwd),n=await N(r),i=t.base??S(n?.style),o=await ea();o||(b.error("Failed to fetch the registry index."),process.exit(1));let s=[];for(let a$1 of e){let f=o.find(m=>m.name===a$1);f||(b.error(`Component ${a.info(a$1)} not found in the shadcn registry.`),process.exit(1));let p=f.meta?.links?.[i];if(!p||Object.keys(p).length===0){b.warn(`No documentation links available for ${a.info(a$1)}.`);continue}s.push({component:a$1,base:i,links:p});}if(t.json){console.log(JSON.stringify({base:i,results:s},null,2));return}let c=Math.max(...s.flatMap(a=>Object.keys(a.links).map(f=>f.length)));for(let{component:a$1,links:f}of s){b.log(a.info(a$1));for(let[p,m]of Object.entries(f))b.log(` - ${p.padEnd(c+2)}${m}`);b.break();}}catch(r){$(r);}});var co="https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases",lo=new Command().name("info").description("get information about your project").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("--json","output as JSON.",false).action(async e=>{try{let t=ie__default.resolve(e.cwd);if(!existsSync(ie__default.resolve(t,"components.json"))&&await J(t)){let c=await G(t);c.length>0&&(e.json?console.log(JSON.stringify({error:"monorepo_root",message:"You are running info from a monorepo root. Use the -c flag to specify a workspace.",targets:c.map(a=>a.name)},null,2)):H("info",c),process.exit(1));}let r=await ra$1(t),n=await N(t),i=await ua$1(t),o=S(n?.style),s=Ys(r,n,i,o);if(e.json){console.log(JSON.stringify(s,null,2));return}Ks(s);}catch(t){$(t);}});function Hs(e){if(!e)return {};let t={};for(let[r,n]of Object.entries(e))t[r]=typeof n=="string"?n:n.url;return t}function Ys(e,t,r,n){return {project:e?{framework:e.framework.label,frameworkName:e.framework.name,frameworkVersion:e.frameworkVersion??null,srcDirectory:e.isSrcDir,rsc:e.isRSC,typescript:e.isTsx,tailwindVersion:e.tailwindVersion??null,tailwindConfig:e.tailwindConfigFile??null,tailwindCss:e.tailwindCssFile??null,importAlias:e.aliasPrefix??null}:null,config:t?{style:t.style,base:n,rsc:t.rsc,typescript:t.tsx,iconLibrary:t.iconLibrary??null,rtl:t.rtl??false,menuColor:t.menuColor??null,menuAccent:t.menuAccent??null,aliases:{components:t.aliases.components,utils:t.aliases.utils,ui:t.aliases.ui??null,lib:t.aliases.lib??null,hooks:t.aliases.hooks??null},resolvedPaths:{cwd:t.resolvedPaths.cwd,tailwindConfig:t.resolvedPaths.tailwindConfig||null,tailwindCss:t.resolvedPaths.tailwindCss||null,utils:t.resolvedPaths.utils,components:t.resolvedPaths.components,lib:t.resolvedPaths.lib,hooks:t.resolvedPaths.hooks,ui:t.resolvedPaths.ui},registries:Hs(t.registries)}:null,components:r,links:{docs:`${c$1}/docs`,components:`${c$1}/docs/components/${n}/[component].md`,ui:`${co}/${n}/ui/[component].tsx`,examples:`${co}/${n}/examples/[component]-example.tsx`,schema:"https://ui.shadcn.com/schema.json"}}}function Ks(e){b.log(a.info("Project")),e.project?ze({framework:`${e.project.framework} (${e.project.frameworkName})`,frameworkVersion:e.project.frameworkVersion??"-",srcDirectory:e.project.srcDirectory?"Yes":"No",rsc:e.project.rsc?"Yes":"No",typescript:e.project.typescript?"Yes":"No",tailwindVersion:e.project.tailwindVersion??"-",tailwindConfig:e.project.tailwindConfig??"-",tailwindCss:e.project.tailwindCss??"-",importAlias:e.project.importAlias??"-"}):b.log(" No project info detected."),b.break(),b.log(a.info("Configuration")),e.config?(ze({style:e.config.style,base:e.config.base,rsc:e.config.rsc?"Yes":"No",typescript:e.config.typescript?"Yes":"No",iconLibrary:e.config.iconLibrary??"-",rtl:e.config.rtl?"Yes":"No",menuColor:e.config.menuColor??"-",menuAccent:e.config.menuAccent??"-"}),b.break(),b.log(a.info("Aliases")),ze({components:e.config.aliases.components,utils:e.config.aliases.utils,ui:e.config.aliases.ui??"-",lib:e.config.aliases.lib??"-",hooks:e.config.aliases.hooks??"-"}),b.break(),b.log(a.info("Resolved Paths")),ze({cwd:e.config.resolvedPaths.cwd,tailwindConfig:e.config.resolvedPaths.tailwindConfig??"-",tailwindCss:e.config.resolvedPaths.tailwindCss??"-",utils:e.config.resolvedPaths.utils,components:e.config.resolvedPaths.components,lib:e.config.resolvedPaths.lib,hooks:e.config.resolvedPaths.hooks,ui:e.config.resolvedPaths.ui}),Object.keys(e.config.registries).length>0&&(b.break(),b.log("registries:"),ze(e.config.registries))):b.log(" No components.json found."),b.break(),b.log(a.info("Installed Components")),e.components.length>0?b.log(` ${e.components.join(", ")}`):b.log(" No components installed."),b.break(),b.log(a.info("Links")),ze(e.links),b.break();}function ze(e){let t=Math.max(...Object.keys(e).map(r=>r.length));for(let[r,n]of Object.entries(e))b.log(` ${r.padEnd(t+2)}${n}`);}var Fe="latest",Ut=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${Fe}`,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${Fe}`,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{shadcn:{command:"npx",args:[`shadcn@${Fe}`,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.shadcn]
|
|
156
|
+
or build your own at ${a.info(`${c$1}/create`)}`),b.break(),process.exit(1));}async function Us(e){let t=await ra$1(e);return Ue(t?.framework.name)}function Ms(e,t,r$1={}){if(G$1(e)){let i=new URL(e);return i.pathname==="/init"&&e.startsWith(c$1)&&i.searchParams.set("track","1"),i.searchParams.set("base",t),i.searchParams.set("rtl",String(r$1.rtl??false)),r$1.only&&i.searchParams.set("only",r$1.only),i.toString()}if(r(e)){let i=q(e);return i||(b.error(`Invalid preset code: ${a.info(e)}`),b.break(),process.exit(1)),me({...i,base:t,rtl:r$1.rtl??false},{preset:e,template:r$1.template,only:r$1.only})}let n=pe[e];return me({...n,base:t,rtl:r$1.rtl??n.rtl},{template:r$1.template,only:r$1.only})}function Ws(e){return /[^A-Za-z0-9_./:-]/.test(e)?JSON.stringify(e):e}function Qn(e){return e?`shadcn init --preset ${Ws(e)}`:"shadcn init"}async function io(e){let t={},r={cwd:e.cwd,registryFile:ie__default.resolve(e.cwd,e.registryFile),outputDir:ie__default.resolve(e.cwd,e.outputDir)};return T.existsSync(r.registryFile)||(t["13"]=true),await T.mkdir(r.outputDir,{recursive:true}),Object.keys(t).length>0&&(t["13"]&&(b.break(),b.error(`The path ${a.info(r.registryFile)} does not exist.`)),b.break(),process.exit(1)),{errors:t,resolvePaths:r}}var zs=z$1.object({cwd:z$1.string(),registryFile:z$1.string(),outputDir:z$1.string()}),so=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 r=zs.parse({cwd:ie.resolve(t.cwd),registryFile:e,outputDir:t.output}),{resolvePaths:n$1}=await io(r),i=await Fe.readFile(n$1.registryFile,"utf-8"),o$1=o.safeParse(JSON.parse(i));o$1.success||(b.error(`Invalid registry file found at ${a.info(n$1.registryFile)}.`),process.exit(1));let s=w("Building registry...");for(let c of o$1.data.items){s.start(`Building ${c.name}...`),c.$schema="https://ui.shadcn.com/schema/registry-item.json";for(let f of c.files??[])f.content=await Fe.readFile(ie.resolve(n$1.cwd,f.path),"utf-8");let a$1=n.safeParse(c);if(!a$1.success){b.error(`Invalid registry item found for ${a.info(c.name)}.`);continue}await Fe.writeFile(ie.resolve(n$1.outputDir,`${a$1.data.name}.json`),JSON.stringify(a$1.data,null,2));}await Fe.copyFile(n$1.registryFile,ie.resolve(n$1.outputDir,"registry.json")),s.succeed("Building registry.");}catch(r){b.break(),$(r);}});var Ys=z$1.object({component:z$1.string().optional(),yes:z$1.boolean(),cwd:z$1.string(),path:z$1.string().optional()}),co=new Command().name("diff").description("[DEPRECATED] Use `add [component] --diff` instead.").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 r=Ys.parse({component:e,...t}),n=ie__default.resolve(r.cwd);existsSync(n)||(b.error(`The path ${n} does not exist. Please try again.`),process.exit(1));let i=await N(n);if(!i){if(await J(n)){let a=await G(n);a.length>0&&(H("diff [component]",a),process.exit(1));}b.warn(`Configuration is missing. Please run ${a.success("init")} to create a components.json file.`),process.exit(1);}let o=await ea$1();if(o||($(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let a$1=i.resolvedPaths.components,f=o.filter(m=>{for(let d of m.files??[]){let h=ie__default.resolve(a$1,typeof d=="string"?d:d.path);if(existsSync(h))return !0}return !1}),p=[];for(let m of f){let d=await ao(m,i);d.length&&p.push({name:m.name,changes:d});}p.length||(b.info("No updates found."),process.exit(0)),b.info("The following components have updates available:");for(let m of p){b.info(`- ${m.name}`);for(let d of m.changes)b.info(` - ${d.filePath}`);}b.break(),b.info(`Run ${a.success("diff <component>")} to see the changes.`),process.exit(0);}let s=o.find(a=>a.name===r.component);s||(b.error(`The component ${a.success(r.component)} does not exist.`),process.exit(1));let c=await ao(s,i);c.length||(b.info(`No updates found for ${r.component}.`),process.exit(0));for(let a of c)b.info(`- ${a.filePath}`),await Ks(a.patch),b.info("");}catch(r){$(r);}});async function ao(e,t){let r=await ka(t.style,[e]),n=await ia(t.tailwind.baseColor),i=Ie(r);if(!r)return [];let o=[];for(let s of r){let c=await la$1(t,s);if(c)for(let a of s.files??[]){let f$1=ie__default.resolve(c,typeof a=="string"?a:a.path);if(!existsSync(f$1))continue;let p=await promises.readFile(f$1,"utf8");if(typeof a=="string"||!a.content)continue;let m=await B$1({filename:a.path,raw:a.content,config:t,baseColor:n,supportedFontMarkers:i},[x,y,a$1,A,c$2,g,d$1,f,z$2]),d=diffLines(m,p);d.length>1&&o.push({filePath:f$1,patch:d});}}return o}async function Ks(e){e.forEach(t=>{if(t)return t.added?process.stdout.write(a.success(t.value)):t.removed?process.stdout.write(a.error(t.value)):process.stdout.write(t.value)});}var lo=new Command().name("docs").description("get docs, api references and usage examples for components").argument("<components...>","component names").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-b, --base <base>","the base to use either 'base' or 'radix'. defaults to project base.").option("--json","output as JSON.",false).action(async(e,t)=>{try{let r=ie__default.resolve(t.cwd),n=await N(r),i=t.base??S(n?.style),o=await ea$1();o||(b.error("Failed to fetch the registry index."),process.exit(1));let s=[];for(let a$1 of e){let f=o.find(m=>m.name===a$1);f||(b.error(`Component ${a.info(a$1)} not found in the shadcn registry.`),process.exit(1));let p=f.meta?.links?.[i];if(!p||Object.keys(p).length===0){b.warn(`No documentation links available for ${a.info(a$1)}.`);continue}s.push({component:a$1,base:i,links:p});}if(t.json){console.log(JSON.stringify({base:i,results:s},null,2));return}let c=Math.max(...s.flatMap(a=>Object.keys(a.links).map(f=>f.length)));for(let{component:a$1,links:f}of s){b.log(a.info(a$1));for(let[p,m]of Object.entries(f))b.log(` - ${p.padEnd(c+2)}${m}`);b.break();}}catch(r){$(r);}});var po="https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases",mo=new Command().name("info").description("get information about your project").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("--json","output as JSON.",false).action(async e=>{try{let t=ie__default.resolve(e.cwd);if(!existsSync(ie__default.resolve(t,"components.json"))&&await J(t)){let c=await G(t);c.length>0&&(e.json?console.log(JSON.stringify({error:"monorepo_root",message:"You are running info from a monorepo root. Use the -c flag to specify a workspace.",targets:c.map(a=>a.name)},null,2)):H("info",c),process.exit(1));}let r=await ra$1(t),n=await N(t),i=await ua(t),o=S(n?.style),s=ta(r,n,i,o);if(e.json){console.log(JSON.stringify(s,null,2));return}ra(s);}catch(t){$(t);}});function ea(e){if(!e)return {};let t={};for(let[r,n]of Object.entries(e))t[r]=typeof n=="string"?n:n.url;return t}function ta(e,t,r,n){return {project:e?{framework:e.framework.label,frameworkName:e.framework.name,frameworkVersion:e.frameworkVersion??null,srcDirectory:e.isSrcDir,rsc:e.isRSC,typescript:e.isTsx,tailwindVersion:e.tailwindVersion??null,tailwindConfig:e.tailwindConfigFile??null,tailwindCss:e.tailwindCssFile??null,importAlias:e.aliasPrefix??null}:null,config:t?{style:t.style,base:n,rsc:t.rsc,typescript:t.tsx,iconLibrary:t.iconLibrary??null,rtl:t.rtl??false,menuColor:t.menuColor??null,menuAccent:t.menuAccent??null,aliases:{components:t.aliases.components,utils:t.aliases.utils,ui:t.aliases.ui??null,lib:t.aliases.lib??null,hooks:t.aliases.hooks??null},resolvedPaths:{cwd:t.resolvedPaths.cwd,tailwindConfig:t.resolvedPaths.tailwindConfig||null,tailwindCss:t.resolvedPaths.tailwindCss||null,utils:t.resolvedPaths.utils,components:t.resolvedPaths.components,lib:t.resolvedPaths.lib,hooks:t.resolvedPaths.hooks,ui:t.resolvedPaths.ui},registries:ea(t.registries)}:null,components:r,links:{docs:`${c$1}/docs`,components:`${c$1}/docs/components/${n}/[component].md`,ui:`${po}/${n}/ui/[component].tsx`,examples:`${po}/${n}/examples/[component]-example.tsx`,schema:"https://ui.shadcn.com/schema.json"}}}function ra(e){b.log(a.info("Project")),e.project?Je({framework:`${e.project.framework} (${e.project.frameworkName})`,frameworkVersion:e.project.frameworkVersion??"-",srcDirectory:e.project.srcDirectory?"Yes":"No",rsc:e.project.rsc?"Yes":"No",typescript:e.project.typescript?"Yes":"No",tailwindVersion:e.project.tailwindVersion??"-",tailwindConfig:e.project.tailwindConfig??"-",tailwindCss:e.project.tailwindCss??"-",importAlias:e.project.importAlias??"-"}):b.log(" No project info detected."),b.break(),b.log(a.info("Configuration")),e.config?(Je({style:e.config.style,base:e.config.base,rsc:e.config.rsc?"Yes":"No",typescript:e.config.typescript?"Yes":"No",iconLibrary:e.config.iconLibrary??"-",rtl:e.config.rtl?"Yes":"No",menuColor:e.config.menuColor??"-",menuAccent:e.config.menuAccent??"-"}),b.break(),b.log(a.info("Aliases")),Je({components:e.config.aliases.components,utils:e.config.aliases.utils,ui:e.config.aliases.ui??"-",lib:e.config.aliases.lib??"-",hooks:e.config.aliases.hooks??"-"}),b.break(),b.log(a.info("Resolved Paths")),Je({cwd:e.config.resolvedPaths.cwd,tailwindConfig:e.config.resolvedPaths.tailwindConfig??"-",tailwindCss:e.config.resolvedPaths.tailwindCss??"-",utils:e.config.resolvedPaths.utils,components:e.config.resolvedPaths.components,lib:e.config.resolvedPaths.lib,hooks:e.config.resolvedPaths.hooks,ui:e.config.resolvedPaths.ui}),Object.keys(e.config.registries).length>0&&(b.break(),b.log("registries:"),Je(e.config.registries))):b.log(" No components.json found."),b.break(),b.log(a.info("Installed Components")),e.components.length>0?b.log(` ${e.components.join(", ")}`):b.log(" No components installed."),b.break(),b.log(a.info("Links")),Je(e.links),b.break();}function Je(e){let t=Math.max(...Object.keys(e).map(r=>r.length));for(let[r,n]of Object.entries(e))b.log(` ${r.padEnd(t+2)}${n}`);}var Oe="latest",Wt=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${Oe}`,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${Oe}`,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{shadcn:{command:"npx",args:[`shadcn@${Oe}`,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.shadcn]
|
|
153
157
|
command = "npx"
|
|
154
|
-
args = ["shadcn@${
|
|
155
|
-
`},{name:"opencode",label:"OpenCode",configPath:"opencode.json",config:{$schema:"https://opencode.ai/config.json",mcp:{shadcn:{type:"local",command:["npx",`shadcn@${
|
|
158
|
+
args = ["shadcn@${Oe}", "mcp"]
|
|
159
|
+
`},{name:"opencode",label:"OpenCode",configPath:"opencode.json",config:{$schema:"https://opencode.ai/config.json",mcp:{shadcn:{type:"local",command:["npx",`shadcn@${Oe}`,"mcp"],enabled:true}}}}],Mt=[`shadcn@${Oe}`],wr=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 Y(e.cwd);let t=new StdioServerTransport;await b$1.connect(t);}catch(t){b.break(),$(t);}}),ca=yr.object({client:yr.enum(["claude","cursor","vscode","codex","opencode"]),cwd:yr.string()});wr.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${Wt.map(e=>e.name).join(", ")})`).action(async(e,t)=>{try{let n=(t.parent?.opts()||{}).cwd||process.cwd(),i=e.client;if(!i){let f=await we({type:"select",name:"client",message:"Which MCP client are you using?",choices:Wt.map(p=>({title:p.label,value:p.name}))});f.client||(b.break(),process.exit(1)),i=f.client;}let o=ca.parse({client:i,cwd:n}),s=await N(o.cwd);if(o.client==="codex"){if(s)await D([],Mt,s,{silent:!1});else {let f=await a$2(o.cwd),p=f==="npm"?"install":"add",m=f==="npm"?"--save-dev":"-D",d=w("Installing dependencies...").start();await execa(f,[p,m,...Mt],{cwd:o.cwd}),d.succeed("Installing dependencies.");}b.break(),b.log("To configure the shadcn MCP server in Codex:"),b.break(),b.log(`1. Open or create the file ${a.info("~/.codex/config.toml")}`),b.log("2. Add the following configuration:"),b.log(),b.info(`[mcp_servers.shadcn]
|
|
156
160
|
command = "npx"
|
|
157
|
-
args = ["shadcn@${
|
|
158
|
-
`,"utf-8"),n.configPath}var
|
|
159
|
-
`),s.succeed("Updated package.json."),await D(["radix-ui"],[],e,{silent:!1});}b.info(""),b.info("Migration complete. The following packages may be removed if no longer in use:"),b.info(a.info(a$1.join(", "))),b.info("Please review your codebase before removing.");}else s.succeed("No packages found in source files.");}catch{s.fail("Failed to update package.json"),b.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui");}}async function
|
|
161
|
+
args = ["shadcn@${Oe}", "mcp"]`),b.break(),b.info("3. Restart Codex to load the MCP server"),b.break(),process.exit(0);}let c=w("Configuring MCP server...").start(),a$1=await fa(o);if(c.succeed("Configuring MCP server."),s)await D([],Mt,s,{silent:!1});else {let f=await a$2(o.cwd),p=f==="npm"?"install":"add",m=f==="npm"?"--save-dev":"-D",d=w("Installing dependencies...").start();await execa(f,[p,m,...Mt],{cwd:o.cwd}),d.succeed("Installing dependencies.");}b.break(),b.success(`Configuration saved to ${a$1}.`),b.break();}catch(r){$(r);}});var la=(e,t)=>t;async function fa(e){let{client:t,cwd:r}=e,n=Wt.find(a=>a.name===t);if(!n)throw new Error(`Unknown client: ${t}. Available clients: ${Wt.map(a=>a.name).join(", ")}`);let i=ie__default.join(r,n.configPath),o=ie__default.dirname(i);await T.ensureDir(o);let s={};try{let a=await promises.readFile(i,"utf-8");s=JSON.parse(a);}catch{}let c=bn(s,n.config,{arrayMerge:la});return await promises.writeFile(i,JSON.stringify(c,null,2)+`
|
|
162
|
+
`,"utf-8"),n.configPath}var xe={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 wo(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,[r,n]=await Promise.all([xr("**/*.{js,ts,jsx,tsx}",{cwd:t}),ga()]);if(Object.keys(n).length===0)throw new Error("Something went wrong fetching the registry icons.");let i=Object.entries(xe).map(([p,m])=>({title:m.name,value:p})),o=await we([{type:"select",name:"sourceLibrary",message:`Which icon library would you like to ${a.info("migrate from")}?`,choices:i},{type:"select",name:"targetLibrary",message:`Which icon library would you like to ${a.info("migrate to")}?`,choices:i}]);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 xe&&o.targetLibrary in xe))throw new Error("Invalid icon library. Please choose a valid icon library.");let s=xe[o.sourceLibrary],c=xe[o.targetLibrary],{confirm:a$1}=await we({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${a.info(r.length)} files in ${a.info(`./${ie__default.relative(e.resolvedPaths.cwd,t)}`)} from ${a.info(s.name)} to ${a.info(c.name)}. Continue?`});a$1||(b.info("Migration cancelled."),process.exit(0)),c.package&&await D([c.package],[],e,{silent:false});let f=w("Migrating icons...")?.start();await Promise.all(r.map(async p=>{f.text=`Migrating ${p}...`;let m=ie__default.join(t,p),d=await promises.readFile(m,"utf-8"),h=await ya(d,o.sourceLibrary,o.targetLibrary,n);await promises.writeFile(m,h);})),f.succeed("Migration complete.");}async function ya(e,t,r,n){let i=xe[t]?.import,o=xe[r]?.import,s=await promises.mkdtemp(ie__default.join(tmpdir(),"shadcn-")),c=new Project({compilerOptions:{}}),a=ie__default.join(s,`shadcn-icons-${randomBytes(4).toString("hex")}.tsx`),f=c.createSourceFile(a,e,{scriptKind:ScriptKind.TSX}),p=[];for(let m of f.getImportDeclarations()??[])if(m.getModuleSpecifier()?.getText()===`"${i}"`){for(let d of m.getNamedImports()??[]){let h=d.getName(),g=Object.values(n).find(w=>w[t]===h)?.[r];!g||p.includes(g)||(p.push(g),d.remove(),f.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).filter(w=>w.getTagNameNode()?.getText()===h).forEach(w=>w.getTagNameNode()?.replaceWithText(g)));}m.getNamedImports()?.length===0&&m.remove();}return p.length>0&&f.addImportDeclaration({moduleSpecifier:o,namedImports:p.map(m=>({name:m}))}),await f.getText()}function ba(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function xa(e,t,r,n){let o=e.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").trim().split(",").map(s=>s.trim()).filter(Boolean);for(let s of o){let c=s.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?$/),a=s.match(/^(\w+)\s+as\s+(\w+)$/);if(c){let f=c[1],p=c[2];n==="slot"&&f==="Slot"&&!p?r.push({name:"Slot",alias:"SlotPrimitive",isType:true}):r.push({name:f,alias:p,isType:true});}else if(a){let f=a[1],p=a[2];n==="slot"&&f==="Slot"&&p==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:f,alias:p,isType:t});}else n==="slot"&&s==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:s,isType:t});}}async function bo(e,t={}){let r,n;if(t.path){if(n=e.resolvedPaths.cwd,t.path.includes("*"))r=await xr(t.path,{cwd:n,onlyFiles:true,ignore:["**/node_modules/**"]});else {let a=ie__default.resolve(n,t.path),f=await promises.stat(a).catch(()=>null);if(!f)throw new Error(`File not found: ${t.path}`);if(f.isDirectory())n=a,r=await xr("**/*.{js,ts,jsx,tsx}",{cwd:n,onlyFiles:true,ignore:["**/node_modules/**"]});else if(f.isFile())r=[t.path];else throw new Error(`Unsupported path type: ${t.path}`)}if(r.length===0)throw new Error(`No files found matching: ${t.path}`)}else {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.");n=e.resolvedPaths.ui,r=await xr("**/*.{js,ts,jsx,tsx}",{cwd:n,onlyFiles:true});}if(!t.yes){let c=t.path?t.path:`./${ie__default.relative(e.resolvedPaths.cwd,n)}`,{confirm:a$1}=await we({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${a.info(r.length)} file(s) in ${a.info(c)} to ${a.info("radix-ui")}. Continue?`});a$1||(b.info("Migration cancelled."),process.exit(0));}let i=w("Migrating imports...")?.start(),o=new Set;await Promise.all(r.map(async c=>{i.text=`Migrating ${c}...`;let a=ie__default.join(n,c),f=await promises.readFile(a,"utf-8"),{content:p,replacedPackages:m}=await Ca(f);m.forEach(d=>o.add(d)),await promises.writeFile(a,p);})),i.succeed("Migrating imports.");let s=w("Updating package.json...")?.start();try{let c=qa(e.resolvedPaths.cwd,!1);if(!c){s.fail("Could not read package.json"),b.warn("Could not update package.json. You may need to manually replace @radix-ui/react-* packages with radix-ui");return}let a$1=Array.from(o);if(a$1.length>0){if(c.dependencies||(c.dependencies={}),c.dependencies?.["radix-ui"]||c.devDependencies?.["radix-ui"])s.succeed("radix-ui already in package.json.");else {c.dependencies["radix-ui"]="latest";let p=ie__default.join(e.resolvedPaths.cwd,"package.json");await promises.writeFile(p,JSON.stringify(c,null,2)+`
|
|
163
|
+
`),s.succeed("Updated package.json."),await D(["radix-ui"],[],e,{silent:!1});}b.info(""),b.info("Migration complete. The following packages may be removed if no longer in use:"),b.info(a.info(a$1.join(", "))),b.info("Please review your codebase before removing.");}else s.succeed("No packages found in source files.");}catch{s.fail("Failed to update package.json"),b.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui");}}async function Ca(e){let t=/import\s+(?:(type)\s+)?(?:\*\s+as\s+(\w+)|{([^}]+)})\s+from\s+(["'])@radix-ui\/react-([^"']+)\4(;?)/g,r=[],n=[],i=[],o='"',s=false,c=e,a;for(;(a=t.exec(e))!==null;){let[g,w,C,b,P,k,v]=a;if(k==="icons"||k.startsWith("icons/"))continue;n.push(g),n.length===1&&(o=P,s=v===";"),i.push(`@radix-ui/react-${k}`);let R=!!w;if(C){let L=ba(k);r.push({name:L,alias:C,isType:R});}else b&&xa(b,R,r,k);}if(r.length===0)return {content:e,replacedPackages:[]};let f=r.filter((g,w,C)=>w===C.findIndex(b=>b.name===g.name&&b.alias===g.alias&&b.isType===g.isType)),m=`import { ${f.map(g=>{let w=g.isType?"type ":"";return g.alias?`${w}${g.name} as ${g.alias}`:`${w}${g.name}`}).join(", ")} } from ${o}radix-ui${o}${s?";":""}`;c=n.reduce((g,w,C)=>g.replace(w,C===0?m:""),c),c=c.replace(/\n\s*\n\s*\n/g,`
|
|
160
164
|
|
|
161
165
|
`),f.some(g=>g.name==="Slot"&&g.alias==="SlotPrimitive")&&(c=c.split(`
|
|
162
|
-
`).map(
|
|
163
|
-
`));let h=Array.from(new Set(i));return {content:c,replacedPackages:h}}var
|
|
164
|
-
`),i.succeed("Updated components.json.");}catch{throw i.fail("Failed to update components.json."),new Error("Could not update components.json. Please manually set `rtl: true`.")}let o=w("Migrating files to RTL...").start(),s=0,c=[];if(await Promise.all(r.map(async a=>{o.text=`Migrating ${a}...`;let f=ie__default.join(n,a),p=await promises.readFile(f,"utf-8"),m=await e$1(p,true);m!==p&&(await promises.writeFile(f,m),s++);let d=ie__default.basename(a);
|
|
165
|
-
Before you can run a migration, you must create a valid ${a.info("components.json")} file by running the ${a.info("init")} command.`),b.error(`Learn more at ${a.info(`${c$1}/docs/components-json`)}.`),b.break(),process.exit(1);}}var
|
|
166
|
+
`).map(C=>{if(C.trim().startsWith("import "))return C;let b=C;return b=b.replace(/\b(asChild\s*\?\s*)Slot(\s*:)/g,"$1__SLOT_PLACEHOLDER__$2"),b=b.replace(/\bReact\.ComponentProps<typeof\s+Slot>/g,"React.ComponentProps<typeof __SLOT_PLACEHOLDER__>"),b=b.replace(/\bComponentProps<typeof\s+Slot>/g,"ComponentProps<typeof __SLOT_PLACEHOLDER__>"),b=b.replace(/(<\/?)Slot(\s*\/?>)/g,"$1__SLOT_PLACEHOLDER__$2"),b=b.replace(/\bSlot\b/g,(P,k,v)=>{let R=v.substring(0,k),L=(R.match(/"/g)||[]).length,K=(R.match(/'/g)||[]).length;return L%2!==0||K%2!==0?P:"__SLOT_PLACEHOLDER__"}),b=b.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),b}).join(`
|
|
167
|
+
`));let h=Array.from(new Set(i));return {content:c,replacedPackages:h}}var Ra=["sidebar.tsx","pagination.tsx","calendar.tsx"],Sa=`${c$1}/docs/rtl#manual-migration-optional`;async function xo(e,t={}){let r,n;if(t.path){if(n=e.resolvedPaths.cwd,t.path.includes("*"))r=await xr(t.path,{cwd:n,onlyFiles:true,ignore:["**/node_modules/**"]});else {let f=ie__default.resolve(n,t.path),p=await promises.stat(f).catch(()=>null);if(!p)throw new Error(`File not found: ${t.path}`);if(p.isDirectory())n=f,r=await xr("**/*.{js,ts,jsx,tsx}",{cwd:n,onlyFiles:true,ignore:["**/node_modules/**"]});else if(p.isFile())r=[t.path];else throw new Error(`Unsupported path type: ${t.path}`)}if(r.length===0)throw new Error(`No files found matching: ${t.path}`)}else {if(!e.resolvedPaths.ui)throw new Error("Could not find a valid `ui` path in your `components.json`. Please provide a path or glob pattern.");n=e.resolvedPaths.ui,r=await xr("**/*.{js,ts,jsx,tsx}",{cwd:n,onlyFiles:true});}if(!t.yes){let a$1=t.path?t.path:`./${ie__default.relative(e.resolvedPaths.cwd,n)}`,{confirm:f}=await we({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${a.info(r.length)} file(s) in ${a.info(a$1)} to RTL. Continue?`});f||(b.info("Migration cancelled."),process.exit(0));}let i=w("Updating components.json...").start();try{let a=ie__default.resolve(e.resolvedPaths.cwd,"components.json"),f=JSON.parse(await promises.readFile(a,"utf-8"));f.rtl=!0,await promises.writeFile(a,JSON.stringify(f,null,2)+`
|
|
168
|
+
`),i.succeed("Updated components.json.");}catch{throw i.fail("Failed to update components.json."),new Error("Could not update components.json. Please manually set `rtl: true`.")}let o=w("Migrating files to RTL...").start(),s=0,c=[];if(await Promise.all(r.map(async a=>{o.text=`Migrating ${a}...`;let f=ie__default.join(n,a),p=await promises.readFile(f,"utf-8"),m=await e$1(p,true);m!==p&&(await promises.writeFile(f,m),s++);let d=ie__default.basename(a);Ra.includes(d)&&c.push(a);})),o.succeed(`Migration complete. ${s} file(s) transformed.`),c.length>0){b.break(),b.warn("The following components may need manual RTL adjustments:");for(let a of c)b.info(` - ${a}`);b.break(),b.info(`See ${a.info(Sa)} for more information.`);}}async function vo(e){let t={};if(!T.existsSync(e.cwd)||!T.existsSync(ie__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!T.existsSync(ie__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,config:null};try{let r=await N(e.cwd);return {errors:t,config:r}}catch{b.break(),b.error(`An invalid ${a.info("components.json")} file was found at ${a.info(e.cwd)}.
|
|
169
|
+
Before you can run a migration, you must create a valid ${a.info("components.json")} file by running the ${a.info("init")} command.`),b.error(`Learn more at ${a.info(`${c$1}/docs/components-json`)}.`),b.break(),process.exit(1);}}var Ro=[{name:"icons",description:"migrate your ui components to a different icon library."},{name:"radix",description:"migrate to radix-ui."},{name:"rtl",description:"migrate your components to support RTL (right-to-left)."}],Ia=z$1.object({cwd:z$1.string(),list:z$1.boolean(),yes:z$1.boolean(),migration:z$1.string().refine(e=>e&&Ro.some(t=>t.name===e),{message:"You must specify a valid migration. Run `shadcn migrate --list` to see available migrations."}).optional(),path:z$1.string().optional()}),So=new Command().name("migrate").description("run a migration.").argument("[migration]","the migration to run.").argument("[path]","optional path or glob pattern to migrate.").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,r)=>{try{let n=Ia.parse({cwd:ie__default.resolve(r.cwd),migration:e,path:t,list:r.list,yes:r.yes});if(n.list||!n.migration){b.info("Available migrations:");for(let s of Ro)b.info(`- ${s.name}: ${s.description}`);return}if(!n.migration)throw new Error("You must specify a migration. Run `shadcn migrate --list` to see available migrations.");let{errors:i,config:o}=await vo(n);if(i["1"]||i["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.");n.migration==="icons"&&await wo(o),n.migration==="radix"&&await bo(o,{yes:n.yes,path:n.path}),n.migration==="rtl"&&await xo(o,{yes:n.yes,path:n.path});}catch(n){b.break(),$(n);}});var Ea=z$1.object({cwd:z$1.string(),silent:z$1.boolean()}),$o=new Command().name("add").description("add registries to your project").argument("[registries...]","registries (@namespace) or registry URLs (@namespace=url)").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",false).action(async(e,t)=>{try{let r=Ea.parse({cwd:ie__default.resolve(t.cwd),silent:t.silent}),n=e.length>0?e:await Aa({silent:r.silent});await Oa(n,r.cwd,{silent:r.silent});}catch(r){b.break(),$(r);}});function Fa(e){let[t,...r]=e.split("="),n=r.length>0?r.join("="):void 0;if(!t.startsWith("@"))throw new Error(`Invalid registry namespace: ${a.info(t)}. Registry names must start with @ (e.g., @acme).`);return {namespace:t,url:n}}function kr(e,t,r){return `${e} ${e===1?t:r}`}async function Oa(e,t,r){let n=ie__default.resolve(t,"components.json");if(!T.existsSync(n))throw new Error(`No ${a.info("components.json")} found. Run ${a.info("shadcn init")} first.`);let i=e.map(Fa),o=i.filter(g=>!g.url),s=[];if(o.length>0){let g=w("Fetching registries.",{silent:r.silent}).start(),w$1=await ma();if(!w$1)throw g.fail(),new Error("Failed to fetch registries.");g.succeed(),s=w$1;}let c={};for(let{namespace:g,url:w}of i){if(g in d){b.warn(`${a.info(g)} is a built-in registry and cannot be added.`);continue}if(w){if(!w.includes("{name}"))throw new Error(`Invalid registry URL for ${a.info(g)}. URL must include {name} placeholder. Example: ${a.info(`${g}=https://example.com/r/{name}.json`)}`);c[g]=w;}else {let C=s.find(b=>b.name===g);if(!C)throw new Error(`Registry ${a.info(g)} not found. Provide a URL: ${a.info(`${g}=https://.../{name}.json`)}`);c[g]=C.url;}}if(Object.keys(c).length===0)return {addedRegistries:[]};let a$1=await T.readJson(n),f=a$1.registries||{},p={},m=[];for(let[g,w]of Object.entries(c))f[g]?m.push(g):p[g]=w;if(Object.keys(p).length===0){if(m.length>0&&!r.silent){w(`Skipped ${kr(m.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let g of m)b.log(` - ${g}`);}else r.silent||b.info("No new registries to add.");return}let d$1={...a$1,registries:{...f,...p}},h=w("Updating components.json.",{silent:r.silent}).start();if(await T.writeJson(n,d$1,{spaces:2}),h.succeed(),!r.silent){let g=Object.keys(p);w(`Added ${kr(g.length,"registry","registries")}:`,{silent:r.silent})?.succeed();for(let w of g)b.log(` - ${w}`);if(m.length>0){w(`Skipped ${kr(m.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let w of m)b.log(` - ${w}`);}}}async function Aa(e){let t=w("Fetching registries.",{silent:e.silent}).start(),r=await ma();if(!r)throw t.fail(),new Error("Failed to fetch registries.");t.succeed();let n=[...r].sort((o,s)=>o.name.localeCompare(s.name)),{selected:i}=await we({type:"autocompleteMultiselect",name:"selected",message:"Which registries would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:false,choices:n.map(o=>({title:o.name,description:o.description,value:o.name}))});return i?.length||(b.warn("No registries selected. Exiting."),b.info(""),process.exit(1)),i}var Io=new Command().name("registry").description("manage registries").addCommand($o);var Da=z$1.object({cwd:z$1.string(),query:z$1.string().optional(),limit:z$1.number().optional(),offset:z$1.number().optional()}),Eo=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 r=Da.parse({cwd:ie__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 Y(r.cwd);let n=T$1({style:"new-york",resolvedPaths:{cwd:r.cwd}}),i=U$1(n),o=ie__default.resolve(r.cwd,"components.json");if(T.existsSync(o)){let p=await T.readJson(o),m=c.partial().parse(p);i=U$1({...n,...m});}let s=i;try{let p=await N(r.cwd);p&&(s=U$1(p));}catch{}let{config:c$1,newRegistries:a}=await U(e.map(p=>`${p}/registry`),s,{silent:!0,writeFile:!1});a.length>0&&(s.registries=c$1.registries),W(e,s);let f=await va(e,{query:r.query,limit:r.limit,offset:r.offset,config:s});console.log(JSON.stringify(f,null,2)),process.exit(0);}catch(r){$(r);}finally{V();}});var _a=z$1.object({cwd:z$1.string()}),No=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 r=_a.parse({cwd:ie__default.resolve(t.cwd)});await Y(r.cwd);let n=U$1({}),i=ie__default.resolve(r.cwd,"components.json");if(T.existsSync(i)){let f=await T.readJson(i),p=c.partial().parse(f);n=U$1(p);}let o=n;try{let f=await N(r.cwd);f&&(o=U$1(f));}catch{}let{config:s,newRegistries:c$1}=await U(e,o,{silent:!0,writeFile:!1});c$1.length>0&&(o.registries=s.registries),W(e,o);let a=await ba$1(e,{config:o});console.log(JSON.stringify(a,null,2)),process.exit(0);}catch(r){$(r);}finally{V();}});var To={version:"4.4.0"};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function Ma(){let e=new Command().name("shadcn").description("build your component library").version(To.version,"-v, --version","display the version number");e.addCommand(Nn).addCommand(to).addCommand(Yn).addCommand(co).addCommand(lo).addCommand(No).addCommand(Eo).addCommand(So).addCommand(mo).addCommand(so).addCommand(wr).addCommand(Io),e.parse();}Ma();
|