shadcn 4.9.0 → 4.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-MKTVVRV2.js +108 -0
- package/dist/{chunk-NAQBA4XN.js → chunk-OY2PM3KO.js} +4 -4
- package/dist/index.d.ts +156 -0
- package/dist/index.js +69 -69
- package/dist/mcp/index.js +1 -1
- package/dist/registry/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-2X25ZGWB.js +0 -97
package/dist/index.js
CHANGED
|
@@ -1,49 +1,49 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {a as a$2}from'./chunk-
|
|
3
|
-
To start over, remove the ${d.info("components.json")} file and run ${d.info("init")} again.`),e.break(),process.exit(1)),r?.succeed();let n=E("Verifying framework.",{silent:e$1.silent}).start(),o=e$1.existingConfig?.tailwind,i=await
|
|
2
|
+
import {a as a$2}from'./chunk-OY2PM3KO.js';import {r,q,c as c$3,g as g$2,k,l,h as h$1,i,d as d$2,p,f as f$3}from'./chunk-NUMOKWW5.js';import {e,d,Q as Q$1,f,Fa as Fa$1,g,h,Ia,a,oa as oa$1,ea as ea$1,Ga as Ga$1,Y,Z as Z$1,E,b,_ as _$1,X as X$1,ua as ua$1,wa,V,W,T,Ha as Ha$1,ca as ca$1,qa as qa$1,R,c as c$1,ta as ta$1,ba as ba$1,La,Ma as Ma$1,Na as Na$1,za as za$1,xa,Aa,J as J$1,F,G,I,H,y,la as la$1,Ba as Ba$1,ha as ha$1,S,da as da$1,fa as fa$1,Oa as Oa$1,ka as ka$1,ga as ga$1,Ca,va,na as na$1,x,ja as ja$1,p as p$1,aa as aa$1,ia as ia$1,$,L as L$1,U,O,M,N as N$1,A as A$1,K,P,z as z$1,i as i$1,B,D,C}from'./chunk-MKTVVRV2.js';export{za as fetchTree,Aa as getItemTargetPath,Ea as getPreset,Da as getPresets,Ba as getRegistries,sa as getRegistriesConfig,Ca as getRegistriesIndex,pa as getRegistry,xa as getRegistryBaseColor,wa as getRegistryBaseColors,va as getRegistryIcons,qa as getRegistryItems,ua as getRegistryStyles,ta as getShadcnRegistryIndex,ra as resolveRegistryItems,ya as resolveTree}from'./chunk-MKTVVRV2.js';import {c,f as f$2,n}from'./chunk-3ORLOMOE.js';import {a as a$1,c as c$2,g as g$1,d as d$1,f as f$1,e as e$1}from'./chunk-7SBJAAAY.js';import {a as a$3}from'./chunk-CHWMSXYA.js';import*as A from'path';import A__default,{join}from'path';import {promises,existsSync}from'fs';import L from'fs-extra';import ys from'open';import ve from'prompts';import xo from'dedent';import bs,{tmpdir}from'os';import {execa}from'execa';import P$1 from'postcss';import Ps from'postcss/lib/at-rule';import Xr,{z}from'zod';import {twMerge}from'tailwind-merge';import {Project,ScriptKind,SyntaxKind,VariableDeclarationKind,Node}from'ts-morph';import vo from'deepmerge';import {Command}from'commander';import {loadConfig}from'tsconfig-paths';import {diffLines,structuredPatch,diffWords}from'diff';import {dim,yellow,bold,green,cyan,red}from'kleur/colors';import*as bt from'fs/promises';import bt__default from'fs/promises';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {randomBytes}from'crypto';import tn from'fast-glob';async function ao(e$1){let t={};if(!L.existsSync(e$1.cwd)||!L.existsSync(A__default.resolve(e$1.cwd,"package.json")))return t["1"]=true,{errors:t,projectInfo:null};let r=E("Preflight checks.",{silent:e$1.silent}).start();L.existsSync(A__default.resolve(e$1.cwd,"components.json"))&&!e$1.force&&(r?.fail(),e.break(),e.error(`A ${d.info("components.json")} file already exists at ${d.info(e$1.cwd)}.
|
|
3
|
+
To start over, remove the ${d.info("components.json")} file and run ${d.info("init")} again.`),e.break(),process.exit(1)),r?.succeed();let n=E("Verifying framework.",{silent:e$1.silent}).start(),o=e$1.existingConfig?.tailwind,i=await Fa$1(e$1.cwd,{configCssFile:typeof o?.css=="string"?o.css:void 0});if(!i||i?.framework.name==="manual"){if(t["7"]=true,n?.fail(),!e$1.monorepo&&await f(e$1.cwd)){let f=await g(e$1.cwd);f.length>0&&(h("init",f),process.exit(1));}e.break(),i?.framework.links.installation&&e.error(`We could not detect a supported framework at ${d.info(e$1.cwd)}.
|
|
4
4
|
Visit ${d.info(i?.framework.links.installation)} to manually configure your project.
|
|
5
|
-
Once configured, you can use the cli to add components.`),e.break(),process.exit(1);}n?.succeed(`Verifying framework. Found ${d.info(i.framework.label)}.`);let s="Validating Tailwind CSS.";i.tailwindVersion==="v4"&&(s=`Validating Tailwind CSS. Found ${d.info("v4")}.`);let l=E(s,{silent:e$1.silent}).start();i.tailwindVersion==="v3"&&(!i?.tailwindConfigFile||!i?.tailwindCssFile)?(t["5"]=true,l?.fail()):i.tailwindVersion==="v4"&&!i?.tailwindCssFile?(t["5"]=true,l?.fail()):i.tailwindVersion?l?.succeed():(t["5"]=true,l?.fail());let a$1=E("Validating import alias.",{silent:e$1.silent}).start();return i?.aliasPrefix?a$1?.succeed():(t["6"]=true,a$1?.fail()),Object.keys(t).length>0&&(t["5"]&&(e.break(),e.error(`No Tailwind CSS configuration found at ${d.info(e$1.cwd)}.`),e.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),e.error("Install Tailwind CSS then try again."),i?.framework.links.tailwind&&e.error(`Visit ${d.info(i?.framework.links.tailwind)} to get started.`)),t["6"]&&(e.break(),e.error(`Could not find valid path aliases or package imports for ${d.info("init")}.`),e.error(`Configure path aliases in ${d.info("tsconfig.json")} or imports in ${d.info("package.json")}, then run ${d.info("init")} again.`),e.error(`Learn more at ${d.info(`${a}/docs/installation/manual#configure-import-aliases`)}.`)),e.break(),process.exit(1)),{errors:t,projectInfo:i}}async function
|
|
6
|
-
`,"utf-8"),p.succeed();}return {config:a,newRegistries:Object.keys(s)}}var Z={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},rhea:{title:"Rhea",description:"Lucide / Inter",style:"rhea",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false}};function jr(e){let t=new URL(`${a}/create`),{rtl:r,pointer:n,...o}=e??{};for(let[i,s]of Object.entries(o))s!==void 0&&t.searchParams.set(i,String(s));return r&&t.searchParams.set("rtl","true"),n&&t.searchParams.set("pointer","true"),t.toString()}async function Er(e$1){if(e.break(),e.log(` Build your custom preset on ${d.info(e$1.createUrl)}`),e.log(` ${e$1.followUp}`),e.break(),e$1.prompt===false)return;let{proceed:t}=await
|
|
7
|
-
`);}i&&await L.remove(r),l&&t==="npm"&&await
|
|
8
|
-
`);}}}function
|
|
9
|
-
`);}o?.succeed(`Creating a new ${e} project.`);}catch(i){o?.fail(`Something went wrong creating a new ${e} project.`),
|
|
10
|
-
|
|
11
|
-
`)),s}function
|
|
12
|
-
`,between:" "}}),t.append(r),t.insertBefore(r,P$1.comment({text:"---break---"}))),r!==void 0&&Object.entries(e).forEach(([n,o])=>{let i=n==="light"?":root":`.${n}`;
|
|
13
|
-
`}}),e.append(n)),Object.entries(r).forEach(([o,i])=>{let s=`--${o.replace(/^--/,"")}`,l=P$1.decl({prop:s,value:i,raws:{semicolon:true}}),a=n?.nodes.find(f=>f.type==="decl"&&f.prop===s);a?a.replaceWith(l):n?.append(l);});}function
|
|
14
|
-
`}}),r.append(s),r.insertBefore(s,P$1.comment({text:"---break---"}))),Object.entries(o).forEach(([l,a])=>{let f=`--${l.replace(/^--/,"")}`;f==="--sidebar-background"&&(f="--sidebar"),
|
|
15
|
-
`}}),e.append(t),e.insertBefore(t,P$1.comment({text:"---break---"}))),t}function
|
|
16
|
-
`}});if(n.length>0){let i=n[n.length-1];t.insertAfter(i,o);}else t.insertAfter(t.nodes[0],o);t.insertBefore(o,P$1.comment({text:"---break---"}));}}}}function
|
|
17
|
-
`}});t.insertAfter(i,a),t.insertBefore(a,P$1.comment({text:"---break---"}));}}}}function
|
|
5
|
+
Once configured, you can use the cli to add components.`),e.break(),process.exit(1);}n?.succeed(`Verifying framework. Found ${d.info(i.framework.label)}.`);let s="Validating Tailwind CSS.";i.tailwindVersion==="v4"&&(s=`Validating Tailwind CSS. Found ${d.info("v4")}.`);let l=E(s,{silent:e$1.silent}).start();i.tailwindVersion==="v3"&&(!i?.tailwindConfigFile||!i?.tailwindCssFile)?(t["5"]=true,l?.fail()):i.tailwindVersion==="v4"&&!i?.tailwindCssFile?(t["5"]=true,l?.fail()):i.tailwindVersion?l?.succeed():(t["5"]=true,l?.fail());let a$1=E("Validating import alias.",{silent:e$1.silent}).start();return i?.aliasPrefix?a$1?.succeed():(t["6"]=true,a$1?.fail()),Object.keys(t).length>0&&(t["5"]&&(e.break(),e.error(`No Tailwind CSS configuration found at ${d.info(e$1.cwd)}.`),e.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),e.error("Install Tailwind CSS then try again."),i?.framework.links.tailwind&&e.error(`Visit ${d.info(i?.framework.links.tailwind)} to get started.`)),t["6"]&&(e.break(),e.error(`Could not find valid path aliases or package imports for ${d.info("init")}.`),e.error(`Configure path aliases in ${d.info("tsconfig.json")} or imports in ${d.info("package.json")}, then run ${d.info("init")} again.`),e.error(`Learn more at ${d.info(`${a}/docs/installation/manual#configure-import-aliases`)}.`)),e.break(),process.exit(1)),{errors:t,projectInfo:i}}async function co(e,t){let r=new Set,n=new Set,o=[...e];for(;o.length>0;){let i=o.shift();if(n.has(i))continue;n.add(i);let{registry:s}=x(i);s&&!b[s]&&r.add(s);try{let[l]=await ja$1([i],t,{useCache:!0});if(l?.registryDependencies)for(let a of l.registryDependencies){let{registry:f}=x(a);f&&!b[f]&&r.add(f),n.has(a)||o.push(a);}}catch(l){if(l instanceof p$1){let{registry:a}=x(i);a&&!b[a]&&r.add(a);continue}continue}}return Array.from(r)}async function J(e,t,r={}){r={silent:false,writeFile:true,...r};let o=(await co(e,t)).filter(f=>!t.registries?.[f]&&!Object.keys(b).includes(f));if(o.length===0)return {config:t,newRegistries:[]};let i=await Ca({useCache:process.env.NODE_ENV!=="development"});if(!i)return {config:t,newRegistries:[]};let s={};for(let f of o)i[f]&&(s[f]=i[f]);if(Object.keys(s).length===0)return {config:t,newRegistries:[]};let l=Object.fromEntries(Object.entries(t.registries||{}).filter(([f])=>!Object.keys(b).includes(f))),a={...t,registries:{...l,...s}};if(r.writeFile){let{resolvedPaths:f,...m}=a,p=E("Updating components.json.",{silent:r.silent}).start(),u=c.parse(m);await L.writeFile(A__default.resolve(t.resolvedPaths.cwd,"components.json"),JSON.stringify(u,null,2)+`
|
|
6
|
+
`,"utf-8"),p.succeed();}return {config:a,newRegistries:Object.keys(s)}}var Z={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},rhea:{title:"Rhea",description:"Lucide / Inter",style:"rhea",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false}};function jr(e){let t=new URL(`${a}/create`),{rtl:r,pointer:n,...o}=e??{};for(let[i,s]of Object.entries(o))s!==void 0&&t.searchParams.set(i,String(s));return r&&t.searchParams.set("rtl","true"),n&&t.searchParams.set("pointer","true"),t.toString()}async function Er(e$1){if(e.break(),e.log(` Build your custom preset on ${d.info(e$1.createUrl)}`),e.log(` ${e$1.followUp}`),e.break(),e$1.prompt===false)return;let{proceed:t}=await ve({type:"confirm",name:"proceed",message:"Open in browser?",initial:true});t&&await ys(e$1.createUrl);}function ye(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&&e.chartColor!=="neutral"&&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),t?.pointer&&r.set("pointer","true"),r.set("track","1"),`${a}/init?${r.toString()}`}async function qe(){let{base:e}=await ve({type:"select",name:"base",message:`Select a ${d.info("component library")}`,choices:[{title:"Radix",value:"radix"},{title:"Base",value:"base"}]});return e||process.exit(1),e}async function lt(e){let t=Object.entries(Z),{selectedPreset:r}=await ve({type:"select",name:"selectedPreset",message:`Which ${d.info("preset")} would you like to use?`,choices:[...t.map(([o,i])=>({title:i.title,description:i.description,value:o})),{title:"Custom",description:`Build your own at ${d.info(`${a}/create`)}`,value:"custom"}]});if(r||process.exit(1),r==="custom"){let o=jr({command:"init",rtl:e.rtl,pointer:e.pointer,base:e.base,...e.template&&{template:e.template}});await Er({createUrl:o,followUp:`Then ${d.info("copy and run the command")} from ui.shadcn.com.`}),process.exit(0);}let n=Z[r];return n||process.exit(1),{url:ye({...n,base:e.base,rtl:e.rtl},{template:e.template,pointer:e.pointer}),base:e.base}}async function Te(e,t,r){let n=da$1(ca$1({resolvedPaths:{cwd:t},...r?.registries&&{registries:r.registries}})),{config:o}=await J([e],n,{silent:true,writeFile:false});n=o,ga$1(e,n);let[i]=await qa$1([e],{config:n,useCache:true}),s=i?.type==="registry:base"&&i.config?i.config:void 0,l=e;if(ws(e)){let a=new URL(e);a.searchParams.delete("track"),l=a.toString();}return {registryBaseConfig:s,installStyleIndex:i?.extends!=="none",url:l}}function ws(e){try{return new URL(e).pathname==="/init"&&e.startsWith(a)}catch{return false}}var ks=process.env.SHADCN_GITHUB_URL??"https://github.com/shadcn-ui/ui.git";function X(e){return {...e,frameworks:e.frameworks??[],scaffold:e.scaffold??fo({title:e.title,templateDir:e.templateDir}),postInit:e.postInit??xs}}function Ne(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=fo({title:e.title,templateDir:r.templateDir}),n}function Cs(e){switch(e){case "pnpm":return ["--no-frozen-lockfile"];case "yarn":return ["--no-immutable"];default:return []}}async function Rs(e,t){if(t==="pnpm")return;let r=A__default.join(e,"pnpm-workspace.yaml"),n=A__default.join(e,"package.json"),o=A__default.join(e,"pnpm-lock.yaml");L.existsSync(o)&&await L.remove(o);let i=L.existsSync(r),s=i?i$1(await L.readFile(r,"utf8")):[],l=s.length>0;if(L.existsSync(n)){let a=await L.readFile(n,"utf8"),f=JSON.parse(a);l?f.packageManager=await vs(t):delete f.packageManager,l&&(f.workspaces=s),await L.writeFile(n,JSON.stringify(f,null,2)+`
|
|
7
|
+
`);}i&&await L.remove(r),l&&t==="npm"&&await lo(e);}async function vs(e){try{let{stdout:t}=await execa(e,["--version"]);return `${e}@${t.trim()}`}catch{return `${e}@*`}}async function lo(e){let t=await L.readdir(e,{withFileTypes:true});for(let r of t){if(r.name==="node_modules")continue;let n=A__default.join(e,r.name);if(r.isDirectory())await lo(n);else if(r.name==="package.json"){let o=await L.readFile(n,"utf8");if(!o.includes("workspace:"))continue;let i=JSON.parse(o),s=false;for(let l of ["dependencies","devDependencies","peerDependencies","optionalDependencies"]){let a=i[l];if(a)for(let[f,m]of Object.entries(a))typeof m=="string"&&m.startsWith("workspace:")&&(a[f]="*",s=true);}s&&await L.writeFile(n,JSON.stringify(i,null,2)+`
|
|
8
|
+
`);}}}function fo({title:e,templateDir:t}){return async({projectPath:r,packageManager:n})=>{let o=E(`Creating a new ${e} project. This may take a few minutes.`).start();try{let i=process.env.SHADCN_TEMPLATE_DIR;if(i){let f=A__default.resolve(i,t);await L.copy(f,r,{filter:m=>!m.includes("node_modules")});}else {let f=A__default.join(bs.tmpdir(),`shadcn-template-${Date.now()}`);await execa("git",["clone","--depth","1","--filter=blob:none","--sparse",ks,f]),await execa("git",["-C",f,"sparse-checkout","set",`templates/${t}`]);let m=A__default.resolve(f,"templates",t);await L.move(m,r),await L.remove(f);}await Rs(r,n);let l=["install",...Cs(n)];await execa(n,l,{cwd:r});let a=A__default.join(r,"package.json");if(L.existsSync(a)){let f=await L.readFile(a,"utf8"),m=JSON.parse(f);m.name=A__default.basename(r),await L.writeFile(a,JSON.stringify(m,null,2)+`
|
|
9
|
+
`);}o?.succeed(`Creating a new ${e} project.`);}catch(i){o?.fail(`Something went wrong creating a new ${e} project.`),oa$1(i);}}}async function xs({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 mo={"--font-heading":"cn-font-heading"};function Ss(e){return e.startsWith("--")?e:`--${e}`}function Oe(e){let t=new Set;for(let r of e){for(let n of r.fonts??[]){let o=n.font?.variable;if(!o)continue;let i=mo[o];i&&t.add(i);}for(let n of Object.values(r.cssVars??{}))for(let o of Object.keys(n??{})){let i=mo[Ss(o)];i&&t.add(i);}}return Array.from(t)}function po(e,t){if(e.includes("\0"))return false;let r;try{r=e;let u="";for(;r!==u&&r.includes("%");)u=r,r=decodeURIComponent(r);}catch{return false}let n=A__default.normalize(r.replace(/\\/g,"/")),o=A__default.normalize(t),i=u=>u.replace(/\[\.\.\..*?\]/g,"").includes("..");if(i(n)||i(r)||i(e))return false;let s=u=>u.replace(/\[\.\.\..*?\]/g,""),l=s(e),a=s(r);if([/\.\.[\/\\]/,/[\/\\]\.\./,/\.\./,/\.\.%/,/\x00/,/[\x01-\x1f]/].some(u=>u.test(l)||u.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(A__default.isAbsolute(n))return n.startsWith(o+A__default.sep);let p=A__default.resolve(o,n);return p.startsWith(o+A__default.sep)||p===o}async function Jt(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,o=A__default.relative(t.resolvedPaths.cwd,n),i=E(`Updating CSS variables in ${d.info(o)}`,{silent:r.silent}).start(),s=await promises.readFile(n,"utf8"),l=await ft(s,e??{},t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars});await promises.writeFile(n,l,"utf8"),i.succeed();}async function ft(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 o=[$s(t)];n.cleanupDefaultNextStyles&&o.push(ho()),n.tailwindVersion==="v4"&&(o=[],o.push(Ts({params:"dark (&:is(.dark *))"})),n.cleanupDefaultNextStyles&&o.push(ho()),o.push(Es(t,{overwriteCssVars:n.overwriteCssVars})),o.push(Fs(t)),n.tailwindConfig&&(o.push(As(n.tailwindConfig)),o.push(Os(n.tailwindConfig)),o.push(Ns(n.tailwindConfig))));let s=(await P$1(o).process(e,{from:void 0})).css;return s=s.replace(/\/\* ---break--- \*\//g,""),n.tailwindVersion==="v4"&&(s=s.replace(/(\n\s*\n)+/g,`
|
|
10
|
+
|
|
11
|
+
`)),s}function $s(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 Ps||(r=P$1.atRule({name:"layer",params:"base",nodes:[],raws:{semicolon:true,before:`
|
|
12
|
+
`,between:" "}}),t.append(r),t.insertBefore(r,P$1.comment({text:"---break---"}))),r!==void 0&&Object.entries(e).forEach(([n,o])=>{let i=n==="light"?":root":`.${n}`;js(r,i,o);});}}}function go(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 ho(){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()),go(e);let r=e.nodes.find(n=>n.type==="atrule"&&n.params==="(prefers-color-scheme: dark)");r&&(go(r),r.nodes.length===0&&r.remove());}}}function js(e,t,r){let n=e.nodes?.find(o=>o.type==="rule"&&o.selector===t);n||Object.keys(r).length>0&&(n=P$1.rule({selector:t,raws:{between:" ",before:`
|
|
13
|
+
`}}),e.append(n)),Object.entries(r).forEach(([o,i])=>{let s=`--${o.replace(/^--/,"")}`,l=P$1.decl({prop:s,value:i,raws:{semicolon:true}}),a=n?.nodes.find(f=>f.type==="decl"&&f.prop===s);a?a.replaceWith(l):n?.append(l);});}function Es(e,t){return {postcssPlugin:"update-css-vars-v4",Once(r){Object.entries(e).forEach(([n,o])=>{let i=n==="light"?":root":`.${n}`;if(n==="theme"){i="@theme";let l=Gt(r);Object.entries(o).forEach(([a,f])=>{let m=`--${a.replace(/^--/,"")}`,p=P$1.decl({prop:m,value:f,raws:{semicolon:true}}),u=l?.nodes?.find(h=>h.type==="decl"&&h.prop===m);t.overwriteCssVars?u?u.replaceWith(p):l?.append(p):u||l?.append(p);});return}let s=r.nodes?.find(l=>l.type==="rule"&&l.selector===i);!s&&Object.keys(o).length>0&&(s=P$1.rule({selector:i,nodes:[],raws:{semicolon:true,between:" ",before:`
|
|
14
|
+
`}}),r.append(s),r.insertBefore(s,P$1.comment({text:"---break---"}))),Object.entries(o).forEach(([l,a])=>{let f=`--${l.replace(/^--/,"")}`;f==="--sidebar-background"&&(f="--sidebar"),yo(a)&&(a=`hsl(${a})`);let m=P$1.decl({prop:f,value:a,raws:{semicolon:true}}),p=s?.nodes.find(u=>u.type==="decl"&&u.prop===f);t.overwriteCssVars?p?p.replaceWith(m):s?.append(m):p||s?.append(m);});});}}}function Fs(e){return {postcssPlugin:"update-theme",Once(t){let r=Array.from(new Set(Object.keys(e).flatMap(i=>Object.keys(e[i]||{}))));if(!r.length)return;let n=Gt(t),o=n.nodes?.filter(i=>i.type==="decl"&&i.prop.startsWith("--"));for(let i of r){let s=Object.values(e).find(p=>p[i])?.[i];if(!s)continue;if(i==="radius"){let p={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[u,h]of Object.entries(p)){let g=P$1.decl({prop:`--radius-${u}`,value:h,raws:{semicolon:true}});n?.nodes?.find(y=>y.type==="decl"&&y.prop===g.prop)||n?.append(g);}continue}let l=yo(s)||Ds(s)?`--color-${i.replace(/^--/,"")}`:`--${i.replace(/^--/,"")}`;l==="--color-sidebar-background"&&(l="--color-sidebar");let a=`var(--${i})`;l==="--color-sidebar"&&(a="var(--sidebar)");let f=P$1.decl({prop:l,value:a,raws:{semicolon:true}});n?.nodes?.find(p=>p.type==="decl"&&p.prop===f.prop)||(o?.length?n?.insertAfter(o[o.length-1],f):n?.append(f));}}}}function Gt(e){let t=e.nodes.find(r=>r.type==="atrule"&&r.name==="theme"&&r.params==="inline");return t||(t=P$1.atRule({name:"theme",params:"inline",nodes:[],raws:{semicolon:true,between:" ",before:`
|
|
15
|
+
`}}),e.append(t),e.insertBefore(t,P$1.comment({text:"---break---"}))),t}function Ts({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(i=>i.type==="atrule"&&i.name==="import"),o=P$1.atRule({name:"custom-variant",params:e,raws:{semicolon:true,before:`
|
|
16
|
+
`}});if(n.length>0){let i=n[n.length-1];t.insertAfter(i,o);}else t.insertAfter(t.nodes[0],o);t.insertBefore(o,P$1.comment({text:"---break---"}));}}}}function As(e){return {postcssPlugin:"update-tailwind-config",Once(t){if(!e?.plugins)return;let n=Vs(t)==="single"?"'":'"',o=t.nodes.filter(s=>s.type==="atrule"&&s.name==="plugin"),i=o[o.length-1]||t.nodes[0];for(let s of e.plugins){let l=s.replace(/^require\(["']|["']\)$/g,"");if(o.some(f=>f.params.replace(/["']/g,"")===l))continue;let a=P$1.atRule({name:"plugin",params:`${n}${l}${n}`,raws:{semicolon:true,before:`
|
|
17
|
+
`}});t.insertAfter(i,a),t.insertBefore(a,P$1.comment({text:"---break---"}));}}}}function Ns(e){return {postcssPlugin:"update-tailwind-config-keyframes",Once(t){if(!e?.theme?.extend?.keyframes)return;let r=Gt(t),n=r.nodes?.filter(i=>i.type==="atrule"&&i.name==="keyframes"),o=z.record(z.string(),z.record(z.string(),z.string()));for(let[i,s]of Object.entries(e.theme.extend.keyframes)){if(typeof i!="string")continue;let l=o.safeParse(s);if(!l.success||n?.find(f=>f.type==="atrule"&&f.name==="keyframes"&&f.params===i))continue;let a=P$1.atRule({name:"keyframes",params:i,nodes:[],raws:{semicolon:true,between:" ",before:`
|
|
18
18
|
`}});for(let[f,m]of Object.entries(l.data)){let p=P$1.rule({selector:f,nodes:Object.entries(m).map(([u,h])=>P$1.decl({prop:u,value:h,raws:{semicolon:true,before:`
|
|
19
19
|
`,between:": "}})),raws:{semicolon:true,between:" ",before:`
|
|
20
|
-
`}});a.append(p);}r.append(a),r.insertBefore(a,P$1.comment({text:"---break---"}));}}}}function
|
|
21
|
-
`}});r.append(a);}}}}function
|
|
20
|
+
`}});a.append(p);}r.append(a),r.insertBefore(a,P$1.comment({text:"---break---"}));}}}}function Os(e){return {postcssPlugin:"update-tailwind-config-animation",Once(t){if(!e?.theme?.extend?.animation)return;let r=Gt(t),n=r.nodes?.filter(i=>i.type==="decl"&&i.prop.startsWith("--animate-")),o=z.record(z.string(),z.string()).safeParse(e.theme.extend.animation);if(o.success)for(let[i,s]of Object.entries(o.data)){let l=`--animate-${i}`;if(n?.find(f=>f.prop===l))continue;let a=P$1.decl({prop:l,value:s,raws:{semicolon:true,between:": ",before:`
|
|
21
|
+
`}});r.append(a);}}}}function Vs(e){return e.nodes[0].toString().includes("'")?"single":"double"}function yo(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 Ds(e){return e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch")||e.includes("--color-")}async function mt(e,t,r){let n=e&&Object.keys(e).length>0,o=Object.keys(r.cssVars??{}).length>0;if(!t.resolvedPaths.tailwindCss||!n&&!o)return;r={silent:false,...r};let i=t.resolvedPaths.tailwindCss,s=A__default.relative(t.resolvedPaths.cwd,i),l=E(`Updating ${d.info(s)}`,{silent:r.silent}).start(),a=await promises.readFile(i,"utf8");o&&(a=await ft(a,r.cssVars,t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars})),n&&(a=await Fr(a,e)),await promises.writeFile(i,a,"utf8"),l.succeed();}async function Fr(e,t){let r=[Us(t)],n=await P$1(r).process(e,{from:void 0}),o=n.css,i=n.root;if(i.nodes&&i.nodes.length>0){let s=i.nodes[i.nodes.length-1];s.type==="atrule"&&!s.nodes&&!o.trimEnd().endsWith(";")&&(o=o.trimEnd()+";");}return o=o.replace(/\/\* ---break--- \*\//g,""),o=o.replace(/(\n\s*\n)+/g,`
|
|
22
22
|
|
|
23
|
-
`),o=o.trimEnd(),o}function
|
|
23
|
+
`),o=o.trimEnd(),o}function Us(e){return {postcssPlugin:"update-css",Once(t){for(let[r,n]of Object.entries(e))if(r.startsWith("@")){let o=r.match(/@([a-zA-Z-]+)\s*(.*)/);if(!o)continue;let[,i,s]=o;if(i==="import"){if(!t.nodes?.find(a=>a.type==="atrule"&&a.name==="import"&&a.params===s)){let a=P$1.atRule({name:"import",params:s,raws:{semicolon:true}}),f=t.nodes?.filter(m=>m.type==="atrule"&&m.name==="import");if(f&&f.length>0){let m=f[f.length-1];a.raws.before=`
|
|
24
24
|
`,t.insertAfter(m,a);}else !t.nodes||t.nodes.length,a.raws.before="",t.prepend(a);}}else if(i==="plugin"){let l=s;s&&!s.startsWith('"')&&!s.startsWith("'")&&(l=`"${s}"`);let a=m=>m.startsWith('"')&&m.endsWith('"')||m.startsWith("'")&&m.endsWith("'")?m.slice(1,-1):m;if(!t.nodes?.find(m=>m.type!=="atrule"||m.name!=="plugin"?false:a(m.params)===a(s))){let m=P$1.atRule({name:"plugin",params:l,raws:{semicolon:true,before:`
|
|
25
25
|
`}}),p=t.nodes?.filter(h=>h.type==="atrule"&&h.name==="import"),u=t.nodes?.filter(h=>h.type==="atrule"&&h.name==="plugin");if(u&&u.length>0){let h=u[u.length-1];t.insertAfter(h,m);}else if(p&&p.length>0){let h=p[p.length-1];t.insertAfter(h,m),t.insertBefore(m,P$1.comment({text:"---break---"})),t.insertAfter(m,P$1.comment({text:"---break---"}));}else t.prepend(m),t.insertBefore(m,P$1.comment({text:"---break---"})),t.insertAfter(m,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===i&&a.params===s)){let a=P$1.atRule({name:i,params:s,raws:{semicolon:true}});t.append(a),t.insertBefore(a,P$1.comment({text:"---break---"}));}}else if(i==="keyframes"){let l=t.nodes?.find(m=>m.type==="atrule"&&m.name==="theme"&&m.params==="inline");l||(l=P$1.atRule({name:"theme",params:"inline",raws:{semicolon:true,between:" ",before:`
|
|
26
26
|
`}}),t.append(l),t.insertBefore(l,P$1.comment({text:"---break---"})));let a=l.nodes?.find(m=>m.type==="atrule"&&m.name==="keyframes"&&m.params===s),f;if(a?(f=P$1.atRule({name:"keyframes",params:s,raws:{semicolon:true,between:" ",before:`
|
|
27
27
|
`}}),a.replaceWith(f)):(f=P$1.atRule({name:"keyframes",params:s,raws:{semicolon:true,between:" ",before:`
|
|
28
|
-
`}}),l.append(f)),typeof n=="object")for(let[m,p]of Object.entries(n))
|
|
28
|
+
`}}),l.append(f)),typeof n=="object")for(let[m,p]of Object.entries(n))Ve(f,m,p);}else if(i==="utility"){let l=t.nodes?.find(a=>a.type==="atrule"&&a.name===i&&a.params===s);if(l){if(typeof n=="object")for(let[a,f]of Object.entries(n))if(typeof f=="string"){let m=l.nodes?.find(u=>u.type==="decl"&&u.prop===a),p=P$1.decl({prop:a,value:f,raws:{semicolon:true,before:`
|
|
29
29
|
`}});m?m.replaceWith(p):l.append(p);}else if(a.startsWith("@")&&typeof f=="object"&&f!==null&&Object.keys(f).length===0){let m=a.match(/@([a-zA-Z-]+)\s*(.*)/);if(m){let[,p,u]=m;if(!l.nodes?.find(g=>g.type==="atrule"&&g.name===p&&g.params===u)){let g=P$1.atRule({name:p,params:u,raws:{semicolon:true,before:`
|
|
30
|
-
`}});l.append(g);}}}else typeof f=="object"&&
|
|
30
|
+
`}});l.append(g);}}}else typeof f=="object"&&Ve(l,a,f);}else {let a=P$1.atRule({name:i,params:s,raws:{semicolon:true,between:" ",before:`
|
|
31
31
|
`}});if(t.append(a),t.insertBefore(a,P$1.comment({text:"---break---"})),typeof n=="object")for(let[f,m]of Object.entries(n))if(typeof m=="string"){let p=P$1.decl({prop:f,value:m,raws:{semicolon:true,before:`
|
|
32
32
|
`}});a.append(p);}else if(f.startsWith("@")&&typeof m=="object"&&m!==null&&Object.keys(m).length===0){let p=f.match(/@([a-zA-Z-]+)\s*(.*)/);if(p){let[,u,h]=p;if(!a.nodes?.find(y=>y.type==="atrule"&&y.name===u&&y.params===h)){let y=P$1.atRule({name:u,params:h,raws:{semicolon:true,before:`
|
|
33
|
-
`}});a.append(y);}}}else typeof m=="object"&&
|
|
34
|
-
`}}),e.append(o),e.insertBefore(o,P$1.comment({text:"---break---"}))),typeof n=="object")for(let[i,s]of Object.entries(n))if(i.startsWith("@")){let l=i.match(/@([a-zA-Z-]+)\s*(.*)/);if(l){let[,a,f]=l;
|
|
33
|
+
`}});a.append(y);}}}else typeof m=="object"&&Ve(a,f,m);}}else i==="property"?Ve(t,r,n):bo(t,i,s,n);}else Ve(t,r,n);}}}function bo(e,t,r,n){let o=e.nodes?.find(i=>i.type==="atrule"&&i.name===t&&i.params===r);if(o||(o=P$1.atRule({name:t,params:r,raws:{semicolon:true,between:" ",before:`
|
|
34
|
+
`}}),e.append(o),e.insertBefore(o,P$1.comment({text:"---break---"}))),typeof n=="object")for(let[i,s]of Object.entries(n))if(i.startsWith("@")){let l=i.match(/@([a-zA-Z-]+)\s*(.*)/);if(l){let[,a,f]=l;bo(o,a,f,s);}}else Ve(o,i,s);else if(typeof n=="string")try{let s=P$1.parse(`.temp{${n}}`).first;if(s&&s.nodes){let l=P$1.rule({selector:"temp",raws:{semicolon:!0,between:" ",before:`
|
|
35
35
|
`}});s.nodes.forEach(a=>{if(a.type==="decl"){let f=a.clone();f.raws.before=`
|
|
36
|
-
`,l.append(f);}}),l.nodes?.length&&o.append(l);}}catch(i){throw console.error("Error parsing at-rule content:",n,i),i}}function
|
|
36
|
+
`,l.append(f);}}),l.nodes?.length&&o.append(l);}}catch(i){throw console.error("Error parsing at-rule content:",n,i),i}}function Ve(e,t,r){let n=e.nodes?.find(o=>o.type==="rule"&&o.selector===t);if(n||(n=P$1.rule({selector:t,raws:{semicolon:true,between:" ",before:`
|
|
37
37
|
`}}),e.append(n)),typeof r=="object"){for(let[o,i]of Object.entries(r))if(o.startsWith("@")&&typeof i=="object"&&i!==null&&Object.keys(i).length===0){let s=o.match(/@([a-zA-Z-]+)\s*(.*)/);if(s){let[,l,a]=s;if(!n.nodes?.find(m=>m.type==="atrule"&&m.name===l&&m.params===a)){if(l==="apply"){let p=n.nodes?.find(u=>u.type==="atrule"&&u.name==="apply");if(p){p.params=twMerge(p.params,a);continue}}let m=P$1.atRule({name:l,params:a,raws:{semicolon:true,before:`
|
|
38
38
|
`}});n.append(m);}}}else if(typeof i=="string"){let s=P$1.decl({prop:o,value:i,raws:{semicolon:true,before:`
|
|
39
|
-
`}}),l=n.nodes?.find(a=>a.type==="decl"&&a.prop===o);l?l.replaceWith(s):n.append(s);}else if(typeof i=="object"){let s=o.startsWith("&")?t.replace(/^([^:]+)/,`$1${o.substring(1)}`):o;
|
|
40
|
-
`,n?.append(l);}});}catch(o){throw console.error("Error parsing rule content:",t,r,o),o}}async function _(e$1,t,r,n){if(e$1=Array.from(new Set(e$1)),t=Array.from(new Set(t)),!e$1?.length&&!t?.length)return;n={silent:false,...n};let o=E("Installing dependencies.",{silent:n.silent})?.start(),i=await
|
|
39
|
+
`}}),l=n.nodes?.find(a=>a.type==="decl"&&a.prop===o);l?l.replaceWith(s):n.append(s);}else if(typeof i=="object"){let s=o.startsWith("&")?t.replace(/^([^:]+)/,`$1${o.substring(1)}`):o;Ve(e,s,i);}}else if(typeof r=="string")try{let i=P$1.parse(`.temp{${r}}`).first;i&&i.nodes&&i.nodes.forEach(s=>{if(s.type==="decl"){let l=s.clone();l.raws.before=`
|
|
40
|
+
`,n?.append(l);}});}catch(o){throw console.error("Error parsing rule content:",t,r,o),o}}async function _(e$1,t,r,n){if(e$1=Array.from(new Set(e$1)),t=Array.from(new Set(t)),!e$1?.length&&!t?.length)return;n={silent:false,...n};let o=E("Installing dependencies.",{silent:n.silent})?.start(),i=await Bs(r),s="";if(Ws(r)&&i==="npm")if(n.silent)s="force";else {o.stopAndPersist(),e.warn(`
|
|
41
41
|
It looks like you are using React 19.
|
|
42
42
|
Some packages may fail to install due to peer dependency issues in npm (see ${a}/react-19).
|
|
43
|
-
`);let l=await
|
|
43
|
+
`);let l=await ve([{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"}]}]);l&&(s=l.flag);}o?.start(),await zs(i,e$1,t,r.resolvedPaths.cwd,s),o?.succeed();}function Ws(e){let t=y(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 Bs(e){return y(e.resolvedPaths.cwd,false)?.dependencies?.expo?"expo":la$1(e.resolvedPaths.cwd)}async function zs(e,t,r,n,o){if(e==="npm")return Hs(t,r,n,o);if(e==="deno")return Js(t,r,n);if(e==="expo")return Gs(t,r,n);t?.length&&await execa(e,["add",...t],{cwd:n}),r?.length&&await execa(e,["add","-D",...r],{cwd:n});}async function Hs(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 Js(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 Gs(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 Ar(e$1,t,r){if(!e$1||Object.keys(e$1).length===0)return {envVarsAdded:[],envFileUpdated:null,envFileCreated:null};r={silent:false,...r};let n=E("Adding environment variables.",{silent:r.silent})?.start(),o=t.resolvedPaths.cwd,i=A__default.join(o,".env.local"),s=B(o);s&&(i=s);let l=existsSync(i),a=A__default.basename(i),f=Object.entries(e$1).map(([h,g])=>`${h}=${g}`).join(`
|
|
44
44
|
`),m=[],p=null,u=null;if(l){let h=await promises.readFile(i,"utf-8"),g=D(h,f);if(m=C(h,f),m.length>0){if(await promises.writeFile(i,g,"utf-8"),p=A__default.relative(o,i),n?.succeed(`Added the following variables to ${d.info(a)}:`),!r.silent)for(let y of m)e.log(` ${d.success("+")} ${y}`);}else n?.stop();}else if(await promises.writeFile(i,f+`
|
|
45
|
-
`,"utf-8"),u=A__default.relative(o,i),m=Object.keys(e$1),n?.succeed(`Added the following variables to ${d.info(a)}:`),!r.silent)for(let h of m)e.log(` ${d.success("+")} ${h}`);return !r.silent&&m.length>0&&e.break(),{envVarsAdded:m,envFileUpdated:p,envFileCreated:u}}var
|
|
46
|
-
`);}s.push(I),na(p)&&l.push(p.font.variable.replace("--",""));}}let a=new Set(["font-sans","font-serif","font-mono"]),f=[...l].reverse().find(p=>a.has(p)),m=l.filter(p=>!a.has(p));return f&&m.unshift(f),s.length>0&&fa(o,s,m,r),o.getFullText()}function ta(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 Yt(e){return Zs.has(e)}function ra(e){return Yt(e)?"html":null}function na(e){return !e.font.selector&&Yt(e.font.variable)}function oa(e,t){let r=ia(e);return Yt(t)?r:`${r}${sa(t.replace(/^--font-/,""))}`}function ia(e){return e.split("_").map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function sa(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function aa(e,t){let r=e.getVariableStatements();for(let n of r)for(let o of n.getDeclarations()){let i=o.getInitializer();if(!i||i.getKind()!==SyntaxKind.CallExpression)continue;let l=i.getArguments();if(l.length===0)continue;let a=l[0].getText();if(a.includes("variable:")&&a.includes(t))return o}return null}function ca(e,t){let r=e.getVariableStatements();for(let n of r)for(let o of n.getDeclarations()){let i=o.getInitializer();if(!i||i.getKind()!==SyntaxKind.CallExpression)continue;let s=i;if(s.getExpression().getText()!==t)continue;let l=s.getArguments();if(!l.length)continue;let a=l[0].getText();if(a.includes("variable:")&&a.includes("--font-heading"))return true}return false}function la(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function fa(e,t,r,n){let o=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement);for(let i of o){if(i.getTagNameNode().getText()!=="html")continue;let l=r.map(h=>`"${h}"`),a=t.map(h=>`${h}.variable`),f=[...l,...a],m=i.getAttribute("className");if(!m){pt(e,n),i.addAttribute({name:"className",initializer:`{cn(${f.join(", ")})}`});return}if(m.getKind()!==SyntaxKind.JsxAttribute)return;let p=m.asKindOrThrow(SyntaxKind.JsxAttribute),u=p.getInitializer();if(!u)return;if(u.getKind()===SyntaxKind.StringLiteral){let h=u.getText().slice(1,-1);pt(e,n),p.setInitializer(`{cn("${h}", ${f.join(", ")})}`);}else if(u.getKind()===SyntaxKind.JsxExpression){let h=u.asKindOrThrow(SyntaxKind.JsxExpression),g=h.getExpression();if(!g)return;let y=g.getText();if(y.startsWith("cn(")){let k=a.every($=>y.includes($)),C=r.every($=>y.includes(`"${$}"`)),I=["font-sans","font-serif","font-mono"].filter($=>!r.includes($)).some($=>y.includes(`"${$}"`));if(k&&C&&!I)continue;let x=pa(y,a);x=ua(x);let R=da(x,f);h.replaceWithText(`{${R}}`);}else if(/^\w+\.variable$/.test(y)){if(a.includes(y)&&r.length===0)continue;pt(e,n);let C=(y.split(".")[0]??"").toLowerCase().includes("heading")||r.length===0;h.replaceWithText(C?`{cn(${y}, ${f.join(", ")})}`:`{cn(${f.join(", ")})}`);}else if(y.startsWith("`")&&y.endsWith("`")){let k=ma(y);pt(e,n);let C=new Set(f),I=new Set(["font-sans","font-serif","font-mono"].map(R=>`"${R}"`)),x=k.filter(R=>!C.has(R)&&!I.has(R));h.replaceWithText(`{cn(${[...x,...f].join(", ")})}`);}else pt(e,n),h.replaceWithText(`{cn(${y}, ${f.join(", ")})}`);}}}function pt(e,t){if(!e.getImportDeclaration(n=>n.getNamedImports().some(i=>i.getName()==="cn"))){let n=e.getImportDeclaration(o=>o.getModuleSpecifierValue().includes("/lib/utils"));n?n.getNamedImports().some(i=>i.getName()==="cn")||n.addNamedImport("cn"):e.addImportDeclaration({moduleSpecifier:t.aliases.utils,namedImports:["cn"]});}}function ma(e){let t=[],r=[],o=e.slice(1,-1).split(/(\$\{[^}]+\})/);for(let i of o)if(i)if(i.startsWith("${")&&i.endsWith("}")){let s=i.slice(2,-1).trim();s&&r.push(s);}else {let s=i.trim().split(/\s+/).filter(Boolean);for(let l of s)t.push(`"${l}"`);}return [...t,...r]}function pa(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 ua(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 da(e,t){let r=t.join(", ");return e.replace(/\)$/,`, ${r})`)}async function pe(e,t,r){r={overwrite:false,silent:false,isNewProject:false,...r};let n=await Z$1(t);return n&&n.ui&&n.ui.resolvedPaths.cwd!==t.resolvedPaths.cwd?await ya(e,t,n,{...r,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await ha(e,t,{...r,skipFonts:r.skipFonts})}async function ha(e$1,t,r){if(!e$1.length)return;let n=E("Checking registry.",{silent:r.silent})?.start(),o=await ia$1(e$1,ca$1(t));if(!o)return n?.fail(),ma$1(new Error("Failed to fetch components from registry."));try{ko(o.files??[],t.resolvedPaths.cwd);}catch(a){return n?.fail(),ma$1(a)}n?.succeed();let i=await Fa$1(t);r.skipFonts||(o=await ut(o,t));let s=Oe([o]);await _(o.dependencies,o.devDependencies,t,{silent:r.silent}),await ga(o.tailwind?.config,t,{silent:r.silent,tailwindVersion:i}),await Ar(o.envVars,t,{silent:r.silent}),r.skipFonts||await dt(o.fonts,t,{silent:r.silent}),await L$1(o.files,t,{overwrite:r.overwrite,silent:r.silent,path:r.path,supportedFontMarkers:s});let l=o.cssVars?r.overwriteCssVars??await bo(e$1,t):void 0;await mt(o.css,t,{silent:r.silent,cssVars:o.cssVars,cleanupDefaultNextStyles:r.isNewProject,overwriteCssVars:l,tailwindVersion:i,tailwindConfig:o.tailwind?.config}),o.docs&&e.info(o.docs);}async function ya(e$1,t,r,n){if(!e$1.length)return;let o=E("Checking registry.",{silent:n.silent})?.start(),i=await ia$1(e$1,ca$1(t));if(!i)return o?.fail(),ma$1(new Error("Failed to fetch components from registry."));try{ko(i.files??[],t.resolvedPaths.cwd);}catch(j){return o?.fail(),ma$1(j)}o?.succeed();let s=[],l=[],a=[],f=E("Installing components.")?.start(),m=r.ui,p=await Fa$1(m),u=$(t.resolvedPaths.cwd,m.resolvedPaths.ui);i=await ut(i,t);let h=Oe([i]);await _(i.dependencies,i.devDependencies,m,{silent:true}),i.tailwind?.config&&(await ga(i.tailwind?.config,m,{silent:true,tailwindVersion:p}),l.push(A__default.relative(u,m.resolvedPaths.tailwindConfig))),i.envVars&&await Ar(i.envVars,m,{silent:true}),await dt(i.fonts,t,{silent:true});let g=["components","ui","lib","hooks"],y=new Map,k={"registry:ui":"ui","registry:hook":"hooks","registry:lib":"lib"},C=j=>g.includes(j),I=j=>{let se=j?.match(/^@([^/]+)\//);return se&&C(se[1])?se[1]:null},x=j=>I(j.target)??k[j.type||"registry:ui"]??"components",R=j=>j&&r[j]?r[j]:t;for(let j of i.files??[]){let se=x(j);y.has(se)||y.set(se,[]),y.get(se).push(j);}for(let j of Array.from(y.keys())){let se=y.get(j),We=R(j),fs=(i.files??[]).filter(je=>R(x(je)).resolvedPaths.cwd===We.resolvedPaths.cwd),jt=$(t.resolvedPaths.cwd,We.resolvedPaths.ui||We.resolvedPaths.cwd),br=await _$1(jt,We.resolvedPaths.cwd)??We.resolvedPaths.cwd,kr=await L$1(se,We,{overwrite:n.overwrite,silent:true,rootSpinner:f,isRemote:n.isRemote,isWorkspace:true,path:n.path,plannedFiles:fs,supportedFontMarkers:h});s.push(...kr.filesCreated.map(je=>A__default.relative(jt,A__default.join(br,je)))),l.push(...kr.filesUpdated.map(je=>A__default.relative(jt,A__default.join(br,je)))),a.push(...kr.filesSkipped.map(je=>A__default.relative(jt,A__default.join(br,je))));}let $$1=i.cssVars?n.overwriteCssVars??await bo(e$1,t):void 0;await mt(i.css,m,{silent:true,cssVars:i.cssVars,overwriteCssVars:$$1,tailwindVersion:p,tailwindConfig:i.tailwind?.config}),(i.cssVars||i.css)&&l.push(A__default.relative(u,m.resolvedPaths.tailwindCss)),f?.succeed();let U=Array.from(new Set(s)).sort(),Y=Array.from(new Set(l.filter(j=>!s.includes(j)))).sort(),$e=Array.from(new Set(a)).sort();if(!(U.length||Y.length)&&!$e.length&&E("No files updated.",{silent:n.silent})?.info(),U.length){E(`Created ${U.length} ${U.length===1?"file":"files"}:`,{silent:n.silent})?.succeed();for(let j of U)e.log(` - ${j}`);}if(Y.length){E(`Updated ${Y.length} ${Y.length===1?"file":"files"}:`,{silent:n.silent})?.info();for(let j of Y)e.log(` - ${j}`);}if($e.length){E(`Skipped ${$e.length} ${$e.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:n.silent})?.info();for(let j of $e)e.log(` - ${j}`);}i.docs&&e.info(i.docs);}async function bo(e,t){let r=await oa$1(e,{config:t});return z.array(n).parse(r).some(o=>o.type==="registry:theme"||o.type==="registry:style"||o.type==="registry:font"||o.type==="registry:base")}function ko(e,t){for(let r of e)if(r?.target&&!fo(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}async function Ce(e){let t=A__default.resolve(e.projectPath,"packages/ui"),r=A__default.resolve(e.projectPath,"apps/web"),n=A__default.resolve(t,"components.json"),o=await L.readJson(n);e.registryBaseConfig&&(o=Co(o,e.registryBaseConfig)),o.tailwind.baseColor="neutral",e.rtl&&(o.rtl=true),e.menuColor&&(o.menuColor=e.menuColor),e.menuAccent&&(o.menuAccent=e.menuAccent),e.iconLibrary&&(o.iconLibrary=e.iconLibrary),await L.writeJson(n,o,{spaces:2});let i=A__default.resolve(r,"components.json"),s=await L.readJson(i);e.registryBaseConfig&&(s=Co(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 L.writeJson(i,s,{spaces:2});let l=await Y(t,c.parse(o)),{config:a}=await H(e.components,l,{silent:true});await pe(e.components,a,{overwrite:true,silent:e.silent,isNewProject:true,skipFonts:true});let f=await Y(r,c.parse(s)),m=await ia$1(e.components,ca$1(a));if(m?.fonts?.length){let u={},h=new Set;for(let g of m.fonts){let y=g.name.replace(/^font-heading-/,"").replace("font-",""),k=g.font.dependency??`@fontsource-variable/${y}`;u[g.font.variable]=g.font.family,h.add(k);}await _(Array.from(h),[],l,{silent:true}),await Ht({theme:u},l,{silent:e.silent,overwriteCssVars:false,tailwindVersion:"v4"}),await mt(Object.fromEntries(Array.from(h).map(g=>[`@import "${g}"`,{}])),l,{silent:e.silent});}let p=l.iconLibrary;if(p&&p in a$3){let u=[...a$3[p].packages];await _(u,[],l,{silent:true}),await _(u,[],f,{silent:true});}return f}var vo=X({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:Ro`---
|
|
45
|
+
`,"utf-8"),u=A__default.relative(o,i),m=Object.keys(e$1),n?.succeed(`Added the following variables to ${d.info(a)}:`),!r.silent)for(let h of m)e.log(` ${d.success("+")} ${h}`);return !r.silent&&m.length>0&&e.break(),{envVarsAdded:m,envFileUpdated:p,envFileCreated:u}}var ea=new Set(["--font-sans","--font-serif","--font-mono"]);async function ut(e,t){if(!e.fonts?.length)return e;let r=await Fa$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 o of e.fonts)if(n)e.cssVars.theme[o.font.variable]=`var(${o.font.variable})`;else {let i=o.name.replace("font-",""),s=o.font.dependency??`@fontsource-variable/${i}`;e.dependencies??=[],e.dependencies.push(s),e.css??={},e.css[`@import "${s}"`]={},e.cssVars.theme[o.font.variable]=o.font.family;}if(e.fonts.length>0){let o=new Map;for(let i of e.fonts){let s=i.font.selector??ia(i.font.variable);if(!s)continue;let l=i.font.variable.replace("--","");o.has(s)||o.set(s,[]),o.get(s).push(l);}e.css??={},e.css["@layer base"]??={};for(let[i,s]of Array.from(o.entries())){let l=s.join(" ");e.css["@layer base"][i]??={};let a=Object.keys(e.css["@layer base"][i]).find(f=>f.startsWith("@apply "));a?(delete e.css["@layer base"][i][a],e.css["@layer base"][i][`${a} ${l}`]={}):e.css["@layer base"][i][`@apply ${l}`]={};}}return e}async function dt(e,t,r){if(!e?.length)return;let n=await Fa$1(t.resolvedPaths.cwd);if(!n||n.framework.name!=="next-app"&&n.framework.name!=="next-pages")return;let o=E("Updating fonts.",{silent:r.silent})?.start();try{await ta(e,t,n),o?.succeed("Updating fonts.");}catch(i){throw o?.fail("Failed to update fonts."),i}}async function ta(e,t,r){let n=await ra(t,r);if(!n)return;let o=await promises.readFile(n,"utf-8"),i=await na(o,e,t);i!==o&&await promises.writeFile(n,i,"utf-8");}async function ra(e,t){let r=e.resolvedPaths.cwd,n=t.isSrcDir,i=t.isTsx?"tsx":"jsx",s=n?[`src/app/layout.${i}`,`app/layout.${i}`]:[`app/layout.${i}`];for(let l of s){let a=A__default.join(r,l);if(existsSync(a))return a}return null}async function na(e,t,r){let o=new Project({compilerOptions:{}}).createSourceFile("layout.tsx",e,{scriptKind:ScriptKind.TSX}),i=t.filter(p=>p.font.provider==="google"),s=[],l=[];for(let p of i){let u=p.font.import;if(!u)continue;let h=o.getImportDeclaration(x=>x.getModuleSpecifierValue()==="next/font/google"),g=false;h?(g=h.getNamedImports().some(R=>R.getName()===u),g||h.addNamedImport(u)):o.addImportDeclaration({moduleSpecifier:"next/font/google",namedImports:[u]});let y=aa(u,p.font.variable),k=oa(p),C=fa(o,p.font.variable),I=y;if(!(g&&!C&&Yt(p.font.variable)&&!ma(o,u))){if(C)C.setInitializer(`${u}(${k})`),C.getName()!==y&&C.rename(y),I=y;else {let x=pa(o);o.insertVariableStatement(x,{declarationKind:VariableDeclarationKind.Const,declarations:[{name:y,initializer:`${u}(${k})`}]}).appendWhitespace(`
|
|
46
|
+
`);}s.push(I),sa(p)&&l.push(p.font.variable.replace("--",""));}}let a=new Set(["font-sans","font-serif","font-mono"]),f=[...l].reverse().find(p=>a.has(p)),m=l.filter(p=>!a.has(p));return f&&m.unshift(f),s.length>0&&ua(o,s,m,r),o.getFullText()}function oa(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 Yt(e){return ea.has(e)}function ia(e){return Yt(e)?"html":null}function sa(e){return !e.font.selector&&Yt(e.font.variable)}function aa(e,t){let r=ca(e);return Yt(t)?r:`${r}${la(t.replace(/^--font-/,""))}`}function ca(e){return e.split("_").map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function la(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function fa(e,t){let r=e.getVariableStatements();for(let n of r)for(let o of n.getDeclarations()){let i=o.getInitializer();if(!i||i.getKind()!==SyntaxKind.CallExpression)continue;let l=i.getArguments();if(l.length===0)continue;let a=l[0].getText();if(a.includes("variable:")&&a.includes(t))return o}return null}function ma(e,t){let r=e.getVariableStatements();for(let n of r)for(let o of n.getDeclarations()){let i=o.getInitializer();if(!i||i.getKind()!==SyntaxKind.CallExpression)continue;let s=i;if(s.getExpression().getText()!==t)continue;let l=s.getArguments();if(!l.length)continue;let a=l[0].getText();if(a.includes("variable:")&&a.includes("--font-heading"))return true}return false}function pa(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function ua(e,t,r,n){let o=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement);for(let i of o){if(i.getTagNameNode().getText()!=="html")continue;let l=r.map(h=>`"${h}"`),a=t.map(h=>`${h}.variable`),f=[...l,...a],m=i.getAttribute("className");if(!m){pt(e,n),i.addAttribute({name:"className",initializer:`{cn(${f.join(", ")})}`});return}if(m.getKind()!==SyntaxKind.JsxAttribute)return;let p=m.asKindOrThrow(SyntaxKind.JsxAttribute),u=p.getInitializer();if(!u)return;if(u.getKind()===SyntaxKind.StringLiteral){let h=u.getText().slice(1,-1);pt(e,n),p.setInitializer(`{cn("${h}", ${f.join(", ")})}`);}else if(u.getKind()===SyntaxKind.JsxExpression){let h=u.asKindOrThrow(SyntaxKind.JsxExpression),g=h.getExpression();if(!g)return;let y=g.getText();if(y.startsWith("cn(")){let k=a.every($=>y.includes($)),C=r.every($=>y.includes(`"${$}"`)),I=["font-sans","font-serif","font-mono"].filter($=>!r.includes($)).some($=>y.includes(`"${$}"`));if(k&&C&&!I)continue;let x=ga(y,a);x=ha(x);let R=ya(x,f);h.replaceWithText(`{${R}}`);}else if(/^\w+\.variable$/.test(y)){if(a.includes(y)&&r.length===0)continue;pt(e,n);let C=(y.split(".")[0]??"").toLowerCase().includes("heading")||r.length===0;h.replaceWithText(C?`{cn(${y}, ${f.join(", ")})}`:`{cn(${f.join(", ")})}`);}else if(y.startsWith("`")&&y.endsWith("`")){let k=da(y);pt(e,n);let C=new Set(f),I=new Set(["font-sans","font-serif","font-mono"].map(R=>`"${R}"`)),x=k.filter(R=>!C.has(R)&&!I.has(R));h.replaceWithText(`{cn(${[...x,...f].join(", ")})}`);}else pt(e,n),h.replaceWithText(`{cn(${y}, ${f.join(", ")})}`);}}}function pt(e,t){if(!e.getImportDeclaration(n=>n.getNamedImports().some(i=>i.getName()==="cn"))){let n=e.getImportDeclaration(o=>o.getModuleSpecifierValue().includes("/lib/utils"));n?n.getNamedImports().some(i=>i.getName()==="cn")||n.addNamedImport("cn"):e.addImportDeclaration({moduleSpecifier:t.aliases.utils,namedImports:["cn"]});}}function da(e){let t=[],r=[],o=e.slice(1,-1).split(/(\$\{[^}]+\})/);for(let i of o)if(i)if(i.startsWith("${")&&i.endsWith("}")){let s=i.slice(2,-1).trim();s&&r.push(s);}else {let s=i.trim().split(/\s+/).filter(Boolean);for(let l of s)t.push(`"${l}"`);}return [...t,...r]}function ga(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 ha(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 ya(e,t){let r=t.join(", ");return e.replace(/\)$/,`, ${r})`)}async function ue(e,t,r){r={overwrite:false,silent:false,isNewProject:false,...r};let n=await _$1(t);return n&&n.ui&&n.ui.resolvedPaths.cwd!==t.resolvedPaths.cwd?await ka(e,t,n,{...r,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await ba(e,t,{...r,skipFonts:r.skipFonts})}async function ba(e$1,t,r){if(!e$1.length)return;let n=E("Checking registry.",{silent:r.silent})?.start(),o=await ka$1(e$1,da$1(t));if(!o)return n?.fail(),oa$1(new Error("Failed to fetch components from registry."));try{Ro(o.files??[],t.resolvedPaths.cwd);}catch(a){return n?.fail(),oa$1(a)}n?.succeed();let i=await Ha$1(t);r.skipFonts||(o=await ut(o,t));let s=Oe([o]);await _(o.dependencies,o.devDependencies,t,{silent:r.silent}),await ia$1(o.tailwind?.config,t,{silent:r.silent,tailwindVersion:i}),await Ar(o.envVars,t,{silent:r.silent}),r.skipFonts||await dt(o.fonts,t,{silent:r.silent}),await L$1(o.files,t,{overwrite:r.overwrite,silent:r.silent,path:r.path,supportedFontMarkers:s});let l=o.cssVars?r.overwriteCssVars??await Co(e$1,t):void 0;await mt(o.css,t,{silent:r.silent,cssVars:o.cssVars,cleanupDefaultNextStyles:r.isNewProject,overwriteCssVars:l,tailwindVersion:i,tailwindConfig:o.tailwind?.config}),o.docs&&e.info(o.docs);}async function ka(e$1,t,r,n){if(!e$1.length)return;let o=E("Checking registry.",{silent:n.silent})?.start(),i=await ka$1(e$1,da$1(t));if(!i)return o?.fail(),oa$1(new Error("Failed to fetch components from registry."));try{Ro(i.files??[],t.resolvedPaths.cwd);}catch(j){return o?.fail(),oa$1(j)}o?.succeed();let s=[],l=[],a=[],f=E("Installing components.")?.start(),m=r.ui,p=await Ha$1(m),u=aa$1(t.resolvedPaths.cwd,m.resolvedPaths.ui);i=await ut(i,t);let h=Oe([i]);await _(i.dependencies,i.devDependencies,m,{silent:true}),i.tailwind?.config&&(await ia$1(i.tailwind?.config,m,{silent:true,tailwindVersion:p}),l.push(A__default.relative(u,m.resolvedPaths.tailwindConfig))),i.envVars&&await Ar(i.envVars,m,{silent:true}),await dt(i.fonts,t,{silent:true});let g=["components","ui","lib","hooks"],y=new Map,k={"registry:ui":"ui","registry:hook":"hooks","registry:lib":"lib"},C=j=>g.includes(j),I=j=>{let ae=j?.match(/^@([^/]+)\//);return ae&&C(ae[1])?ae[1]:null},x=j=>I(j.target)??k[j.type||"registry:ui"]??"components",R=j=>j&&r[j]?r[j]:t;for(let j of i.files??[]){let ae=x(j);y.has(ae)||y.set(ae,[]),y.get(ae).push(j);}for(let j of Array.from(y.keys())){let ae=y.get(j),We=R(j),us=(i.files??[]).filter(je=>R(x(je)).resolvedPaths.cwd===We.resolvedPaths.cwd),jt=aa$1(t.resolvedPaths.cwd,We.resolvedPaths.ui||We.resolvedPaths.cwd),br=await $(jt,We.resolvedPaths.cwd)??We.resolvedPaths.cwd,kr=await L$1(ae,We,{overwrite:n.overwrite,silent:true,rootSpinner:f,isRemote:n.isRemote,isWorkspace:true,path:n.path,plannedFiles:us,supportedFontMarkers:h});s.push(...kr.filesCreated.map(je=>A__default.relative(jt,A__default.join(br,je)))),l.push(...kr.filesUpdated.map(je=>A__default.relative(jt,A__default.join(br,je)))),a.push(...kr.filesSkipped.map(je=>A__default.relative(jt,A__default.join(br,je))));}let $$1=i.cssVars?n.overwriteCssVars??await Co(e$1,t):void 0;await mt(i.css,m,{silent:true,cssVars:i.cssVars,overwriteCssVars:$$1,tailwindVersion:p,tailwindConfig:i.tailwind?.config}),(i.cssVars||i.css)&&l.push(A__default.relative(u,m.resolvedPaths.tailwindCss)),f?.succeed();let U=Array.from(new Set(s)).sort(),Y=Array.from(new Set(l.filter(j=>!s.includes(j)))).sort(),$e=Array.from(new Set(a)).sort();if(!(U.length||Y.length)&&!$e.length&&E("No files updated.",{silent:n.silent})?.info(),U.length){E(`Created ${U.length} ${U.length===1?"file":"files"}:`,{silent:n.silent})?.succeed();for(let j of U)e.log(` - ${j}`);}if(Y.length){E(`Updated ${Y.length} ${Y.length===1?"file":"files"}:`,{silent:n.silent})?.info();for(let j of Y)e.log(` - ${j}`);}if($e.length){E(`Skipped ${$e.length} ${$e.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:n.silent})?.info();for(let j of $e)e.log(` - ${j}`);}i.docs&&e.info(i.docs);}async function Co(e,t){let r=await qa$1(e,{config:t});return z.array(n).parse(r).some(o=>o.type==="registry:theme"||o.type==="registry:style"||o.type==="registry:font"||o.type==="registry:base")}function Ro(e,t){for(let r of e)if(r?.target&&!po(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}async function Re(e){let t=A__default.resolve(e.projectPath,"packages/ui"),r=A__default.resolve(e.projectPath,"apps/web"),n=A__default.resolve(t,"components.json"),o=await L.readJson(n);e.registryBaseConfig&&(o=vo(o,e.registryBaseConfig)),o.tailwind.baseColor="neutral",e.rtl&&(o.rtl=true),e.menuColor&&(o.menuColor=e.menuColor),e.menuAccent&&(o.menuAccent=e.menuAccent),e.iconLibrary&&(o.iconLibrary=e.iconLibrary),await L.writeJson(n,o,{spaces:2});let i=A__default.resolve(r,"components.json"),s=await L.readJson(i);e.registryBaseConfig&&(s=vo(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 L.writeJson(i,s,{spaces:2});let l=await Z$1(t,c.parse(o)),{config:a}=await J(e.components,l,{silent:true});await ue(e.components,a,{overwrite:true,silent:e.silent,isNewProject:true,skipFonts:true});let f=await Z$1(r,c.parse(s)),m=await ka$1(e.components,da$1(a));if(m?.fonts?.length){let u={},h=new Set;for(let g of m.fonts){let y=g.name.replace(/^font-heading-/,"").replace("font-",""),k=g.font.dependency??`@fontsource-variable/${y}`;u[g.font.variable]=g.font.family,h.add(k);}await _(Array.from(h),[],l,{silent:true}),await Jt({theme:u},l,{silent:e.silent,overwriteCssVars:false,tailwindVersion:"v4"}),await mt(Object.fromEntries(Array.from(h).map(g=>[`@import "${g}"`,{}])),l,{silent:e.silent});}let p=l.iconLibrary;if(p&&p in a$3){let u=[...a$3[p].packages];await _(u,[],l,{silent:true}),await _(u,[],f,{silent:true});}return f}var So=X({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:xo`---
|
|
47
47
|
import Layout from "@/layouts/main.astro"
|
|
48
48
|
import { ComponentExample } from "@/components/component-example"
|
|
49
49
|
---
|
|
@@ -51,7 +51,7 @@ import { ComponentExample } from "@/components/component-example"
|
|
|
51
51
|
<Layout>
|
|
52
52
|
<ComponentExample client:load />
|
|
53
53
|
</Layout>
|
|
54
|
-
`}],monorepo:{templateDir:"astro-monorepo",init:
|
|
54
|
+
`}],monorepo:{templateDir:"astro-monorepo",init:Re,files:[{type:"registry:page",path:"src/pages/index.astro",target:"src/pages/index.astro",content:xo`---
|
|
55
55
|
import "@workspace/ui/globals.css"
|
|
56
56
|
import { ComponentExample } from "@/components/component-example"
|
|
57
57
|
---
|
|
@@ -66,27 +66,27 @@ import { ComponentExample } from "@/components/component-example"
|
|
|
66
66
|
<ComponentExample client:load />
|
|
67
67
|
</body>
|
|
68
68
|
</html>
|
|
69
|
-
`}]}});var
|
|
69
|
+
`}]}});var Io=X({name:"laravel",title:"Laravel",description:"Requires `laravel new`",defaultProjectName:"laravel-app",templateDir:"laravel-app",frameworks:["laravel"],scaffold:async()=>{e.break(),e.log(` Please create a new app with ${d.info("laravel new --react")} first then run ${d.info("shadcn init")}.`),e.log(` See ${d.info(`${a}/docs/installation/laravel`)} for more information.`),e.break(),process.exit(0);},create:async()=>{}});var jo=X({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:xo`import { ComponentExample } from "@/components/component-example";
|
|
70
70
|
|
|
71
71
|
export default function Page() {
|
|
72
72
|
return <ComponentExample />;
|
|
73
73
|
}
|
|
74
|
-
`}],monorepo:{templateDir:"next-monorepo",init:async e=>{let t=A__default.resolve(e.projectPath,"packages/ui"),r=A__default.resolve(e.projectPath,"apps/web"),n=A__default.resolve(t,"components.json"),o=await L.readJson(n);e.registryBaseConfig&&(o=
|
|
74
|
+
`}],monorepo:{templateDir:"next-monorepo",init:async e=>{let t=A__default.resolve(e.projectPath,"packages/ui"),r=A__default.resolve(e.projectPath,"apps/web"),n=A__default.resolve(t,"components.json"),o=await L.readJson(n);e.registryBaseConfig&&(o=vo(o,e.registryBaseConfig)),o.tailwind.baseColor="neutral",e.rtl&&(o.rtl=true),await L.writeJson(n,o,{spaces:2});let i=A__default.resolve(r,"components.json"),s=await L.readJson(i);e.registryBaseConfig&&(s=vo(s,e.registryBaseConfig)),s.tailwind.baseColor="neutral",e.rtl&&(s.rtl=true),await L.writeJson(i,s,{spaces:2});let l=await Z$1(t,c.parse(o)),{config:a}=await J(e.components,l,{silent:true});await ue(e.components,a,{overwrite:true,silent:e.silent,isNewProject:true,skipFonts:true});let f=await Z$1(r,c.parse(s)),m=await ka$1(e.components,da$1(a));if(m?.fonts?.length){let u={};for(let h of m.fonts)u[h.font.variable]=`var(${h.font.variable})`;await Jt({theme:u},l,{silent:e.silent,overwriteCssVars:false,tailwindVersion:"v4"}),await dt(m.fonts,f,{silent:e.silent});}let p=l.iconLibrary;if(p&&p in a$3){let u=[...a$3[p].packages];await _(u,[],l,{silent:true}),await _(u,[],f,{silent:true});}return f},files:[{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:xo`import { ComponentExample } from "@/components/component-example";
|
|
75
75
|
|
|
76
76
|
export default function Page() {
|
|
77
77
|
return <ComponentExample />;
|
|
78
78
|
}
|
|
79
|
-
`}]}});var
|
|
79
|
+
`}]}});var Fo=X({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:xo`import { ComponentExample } from "@/components/component-example";
|
|
80
80
|
|
|
81
81
|
export default function Home() {
|
|
82
82
|
return <ComponentExample />;
|
|
83
83
|
}
|
|
84
|
-
`}],monorepo:{templateDir:"react-router-monorepo",init:
|
|
84
|
+
`}],monorepo:{templateDir:"react-router-monorepo",init:Re,files:[{type:"registry:file",path:"app/routes/home.tsx",target:"app/routes/home.tsx",content:xo`import { ComponentExample } from "@/components/component-example";
|
|
85
85
|
|
|
86
86
|
export default function Home() {
|
|
87
87
|
return <ComponentExample />;
|
|
88
88
|
}
|
|
89
|
-
`}]}});var
|
|
89
|
+
`}]}});var Ao=X({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:xo`import { createFileRoute } from "@tanstack/react-router";
|
|
90
90
|
import { ComponentExample } from "@/components/component-example";
|
|
91
91
|
|
|
92
92
|
export const Route = createFileRoute("/")({ component: App });
|
|
@@ -96,7 +96,7 @@ function App() {
|
|
|
96
96
|
<ComponentExample />
|
|
97
97
|
);
|
|
98
98
|
}
|
|
99
|
-
`}],monorepo:{templateDir:"start-monorepo",init:
|
|
99
|
+
`}],monorepo:{templateDir:"start-monorepo",init:Re,files:[{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:xo`import { createFileRoute } from "@tanstack/react-router";
|
|
100
100
|
import { ComponentExample } from "@/components/component-example";
|
|
101
101
|
|
|
102
102
|
export const Route = createFileRoute("/")({ component: App });
|
|
@@ -106,66 +106,66 @@ function App() {
|
|
|
106
106
|
<ComponentExample />
|
|
107
107
|
);
|
|
108
108
|
}
|
|
109
|
-
`}]}});var
|
|
109
|
+
`}]}});var Oo=X({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:xo`import { ComponentExample } from "@/components/component-example";
|
|
110
110
|
|
|
111
111
|
export function App() {
|
|
112
112
|
return <ComponentExample />;
|
|
113
113
|
}
|
|
114
114
|
|
|
115
115
|
export default App;
|
|
116
|
-
`}],monorepo:{templateDir:"vite-monorepo",init:
|
|
116
|
+
`}],monorepo:{templateDir:"vite-monorepo",init:Re,files:[{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:xo`import { ComponentExample } from "@/components/component-example";
|
|
117
117
|
|
|
118
118
|
export function App() {
|
|
119
119
|
return <ComponentExample />;
|
|
120
120
|
}
|
|
121
121
|
|
|
122
122
|
export default App;
|
|
123
|
-
`}]}});var Q={next:
|
|
124
|
-
Would you like to start a new project?`,choices:Object.entries(Q).map(([m,p])=>({title:p.title,value:m,description:p.description})),initial:0},{type:e$1.name?null:"text",name:"name",message:"What is your project named?",initial:n,format:m=>m.trim(),validate:m=>m.length>128?"Name should be less than 128 characters.":true}]);t=a??t,n=f??n;}let i=Ne(Q[t],{monorepo:e$1.monorepo}),s=await
|
|
125
|
-
You may now add components.`),process.removeListener("exit",o),ht(A__default.resolve(a$1,"components.json")),e.break();}catch(i){process.removeListener("exit",o),o(),e.break(),
|
|
126
|
-
`,"utf8"),g.succeed();let I=await
|
|
127
|
-
Before you can add components, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),e.error(`Learn more at ${d.info(`${a}/docs/components-json`)}.`),e.break(),process.exit(1);}}async function
|
|
128
|
-
`)}function
|
|
129
|
-
`),s=>green(`+${s}`));else {let s=
|
|
130
|
-
`)}function
|
|
131
|
-
`)}function
|
|
132
|
-
`);r.push(`${dim("\u251C")} ${bold(s.path)} ${dim("(")}${yt(s.action)}${dim(")")} ${dim(`${l.length} lines`)}`),Le(r,l),r.push(dim("\u2502"));}e.files.length>
|
|
133
|
-
`)}function
|
|
134
|
-
`),r=>green(`+${r}`));else {let r=
|
|
123
|
+
`}]}});var Q={next:jo,vite:Oo,start:Ao,"react-router":Fo,astro:So,laravel:Io};function Xe(e){if(e){for(let[t,r]of Object.entries(Q))if(r.frameworks.includes(e))return t}}function Do(e,t){let r=t?.lib??er(e,"lib");return {ui:t?.ui??er(e,"ui"),lib:r,hooks:t?.hooks??er(e,"hooks"),utils:t?.utils??er(e,"utils",r)}}function er(e,t,r){let n=e||T;if(t==="ui")return `${n}/ui`;if(t==="utils"){let o=r||Vo(n,"lib");return o?`${o}/utils`:U}return Vo(n,t)}function Vo(e,t){return e==="components"?t:e.endsWith("/components")?`${e.slice(0,-11)}/${t}`:e.endsWith("components")&&!e.includes("/")?`${e.slice(0,-10)}${t}`:""}async function tr(e$1){let t=e$1.template&&e$1.template in Q?e$1.template:"next",r=Ne(Q[t],{monorepo:e$1.monorepo}),n=e$1.name??r.defaultProjectName,o=e$1.components?.length===1&&!!e$1.components[0].match(/\/chat\/b\//);if(o&&(t="next"),!e$1.force){let{type:a,name:f}=await ve([{type:e$1.template||o?null:"select",name:"type",message:`The path ${d.info(e$1.cwd)} does not contain a package.json file.
|
|
124
|
+
Would you like to start a new project?`,choices:Object.entries(Q).map(([m,p])=>({title:p.title,value:m,description:p.description})),initial:0},{type:e$1.name?null:"text",name:"name",message:"What is your project named?",initial:n,format:m=>m.trim(),validate:m=>m.length>128?"Name should be less than 128 characters.":true}]);t=a??t,n=f??n;}let i=Ne(Q[t],{monorepo:e$1.monorepo}),s=await la$1(e$1.cwd,{withFallback:true}),l=A__default.join(e$1.cwd,n);try{await L.access(e$1.cwd,L.constants.W_OK);}catch{e.break(),e.error(`The path ${d.info(e$1.cwd)} is not writable.`),e.error(`It is likely you do not have write permissions for this folder or the path ${d.info(e$1.cwd)} does not exist.`),e.break(),process.exit(1);}return L.existsSync(A__default.resolve(e$1.cwd,n,"package.json"))&&(e.break(),e.error(`A project with the name ${d.info(n)} already exists.`),e.error("Please choose a different name and try again."),e.break(),process.exit(1)),await i.scaffold({projectPath:l,packageManager:s,cwd:e$1.cwd}),{projectPath:l,projectName:n,template:t}}async function ee(e$1=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 o=join(e$1,n);existsSync(o)&&t({path:o,overload:!1,quiet:!0});}}catch(t){e.warn("Failed to load env files:",t);}}var tt=".bak",Qe=class extends Error{filePath;constructor(t){super(`Could not back up ${t}.`),this.name="FileBackupError",this.filePath=t;}};function gt(e){if(!L.existsSync(e))return null;let t=`${e}${tt}`;try{return L.renameSync(e,t),t}catch{return null}}function et(e){let t=`${e}${tt}`;if(!L.existsSync(t))return false;try{return L.renameSync(t,e),!0}catch(r){return console.error(`Warning: Could not restore backup file ${t}: ${r}`),false}}function ht(e){let t=`${e}${tt}`;if(!L.existsSync(t))return false;try{return L.unlinkSync(t),!0}catch{return false}}async function _o(e,t){if(!L.existsSync(e))return t();if(!gt(e))throw new Qe(e);let n=()=>et(e);process.on("exit",n);try{let o=await t();return process.removeListener("exit",n),ht(e),o}catch(o){throw process.removeListener("exit",n),et(e),o}}var Pa=z.object({cwd:z.string(),name:z.string().optional(),preset:z.union([z.boolean(),z.string()]).optional(),components:z.array(z.string()).optional(),yes:z.boolean(),defaults:z.boolean(),force:z.boolean(),reinstall:z.boolean().optional(),silent:z.boolean(),isNewProject:z.boolean().default(false),cssVariables:z.boolean().default(true),rtl:z.boolean().optional(),pointer:z.boolean().optional(),base:z.enum(["radix","base"]).optional(),template:z.string().optional(),monorepo:z.boolean().optional(),existingConfig:z.record(z.unknown()).optional(),installStyleIndex:z.boolean().default(true),registryBaseConfig:c.deepPartial().optional(),menuColor:z.enum(["default","inverted","default-translucent","inverted-translucent"]).optional(),menuAccent:z.enum(["subtle","bold"]).optional(),iconLibrary:z.string().optional()});function $a(e,t){return t.rtl?e.searchParams.set("rtl","true"):t.rtl===false&&e.searchParams.delete("rtl"),t.pointer?e.searchParams.set("pointer","true"):t.pointer===false&&e.searchParams.delete("pointer"),e}var Uo=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("--pointer","enable pointer cursor for buttons.").option("--no-pointer","disable pointer cursor for buttons.").option("--reinstall","re-install existing UI components.").option("--no-reinstall","do not re-install existing UI components.").action(async(e$1,t)=>{let r$1,n=[],o=()=>{r$1&&et(r$1.replace(tt,""));};process.on("exit",o);try{let i=Pa.parse({...t,reinstall:t.reinstall,cwd:A__default.resolve(t.cwd)}),s=new Map(Object.entries(Z)),l;if(i.defaults&&(i.template=i.template||"next",i.base=i.base||"base",i.reinstall=i.reinstall??!1),i.template&&!(i.template in Q)&&(e.error(`Invalid template: ${d.info(i.template)}. Available templates: ${Object.keys(Q).map(u=>d.info(u)).join(", ")}.`),e.break(),process.exit(1)),typeof i.preset=="string"&&!Q$1(i.preset)&&!r(i.preset)){let u=Array.from(s.keys());s.has(i.preset)||(e.error(`Invalid preset: ${d.info(i.preset)}. Available presets: ${u.join(", ")}`),e.break(),process.exit(1));}let a$1=i.cwd,f$1=L.existsSync(A__default.resolve(a$1,"components.json"));if(!i.monorepo&&!f$1&&await f(a$1)){let u=await Fa$1(a$1);if(!u||u.framework.name==="manual"){let h$1=await g(a$1);h$1.length>0&&(h("init",h$1),process.exit(1));}}if(f$1&&!i.force){let{overwrite:u}=await ve({type:"confirm",name:"overwrite",message:`A ${d.info("components.json")} file already exists. Would you like to overwrite it?`,initial:!1});u||(e.info(` To start over, remove the ${d.info("components.json")} file and run ${d.info("init")} again.`),e.break(),process.exit(1)),i.force=!0;}let m;if(f$1){try{m=await L.readJson(A__default.resolve(a$1,"components.json"));}catch{}m&&(i.existingConfig=m);let u=i.reinstall;if(u===void 0){let{reinstall:h}=await ve({type:"confirm",name:"reinstall",message:"Would you like to re-install existing UI components?",initial:!1});u=h;}if(u&&(n=await Ia(a$1),n.length)){e.break(),e.log(" The following components will be re-installed and overwritten:");for(let h=0;h<n.length;h+=8)e.log(` - ${n.slice(h,h+8).join(", ")}`);e.break();}}if(i.preset===void 0&&e$1.length===0&&!i.defaults){let u=L.existsSync(A__default.resolve(a$1,"package.json"));if(!i.template&&!u){let{template:h}=await ve({type:"select",name:"template",message:"Select a template",choices:Object.entries(Q).map(([g,y])=>({title:y.title,value:g,description:y.description,disabled:i.monorepo&&g==="laravel"}))});h||process.exit(1),i.template=h;}if(!i.template&&u){let h=await Fa$1(a$1),g=Xe(h?.framework.name);g&&(i.template=g);}if(i.template==="laravel"&&!u&&(e.break(),e.log(` Please create a new app with ${d.info("laravel new --react")} first then run ${d.info("shadcn init")}.`),e.log(` See ${d.info(`${a}/docs/installation/laravel`)} for more information.`),e.break(),process.exit(0)),i.monorepo===void 0&&!u&&i.template&&Q[i.template]?.monorepo){let{monorepo:h}=await ve({type:"confirm",name:"monorepo",message:"Would you like to set up a monorepo?",initial:!1});i.monorepo=h;}i.base||(i.base=await qe()),i.preset=!0;}if(i.preset!==void 0){let u=i.preset===!0?!0:i.preset;if(u===!0){let h=await lt({rtl:i.rtl??!1,template:i.template,base:i.base,pointer:i.pointer});e$1=[h.url,...e$1],l=h.base;}if(typeof u=="string"){let h;if(Q$1(u)){let g=new URL(u);$a(g,i),g.pathname==="/init"&&u.startsWith(a)&&g.searchParams.set("track","1"),h=g.toString(),l=g.searchParams.get("base")??void 0;}else if(r(u)){let g=q(u);g||(e.error(`Invalid preset code: ${d.info(u)}`),e.break(),process.exit(1)),h=ye({...g,base:"radix",rtl:i.rtl??!1},{template:i.template,preset:u,pointer:i.pointer}),l=void 0;}else {let g=s.get(u);if(!g)throw new Error(`Unknown preset: ${u}`);h=ye({...g,base:i.base??"radix",rtl:i.rtl??g.rtl},{template:i.template,pointer:i.pointer}),l=void 0;}e$1=[h,...e$1];}}let p=i.base??l??(m?.style?m.style.startsWith("base-")?"base":"radix":"");if(!p)if(e$1.length>0)p="radix";else {let u=await qe();p=u,i.base=u;}if(i.defaults&&!e$1.some(Q$1)&&(e$1=[ye({...Z.nova,base:p,rtl:i.rtl??!1},{template:i.template,pointer:i.pointer}),...e$1]),e$1.length>0&&Q$1(e$1[0])){let u=new URL(e$1[0]);u.searchParams.set("base",p),e$1[0]=u.toString();}if(m?.style){let u=await Fa(m.style,p);if(u!==p&&(p=u,e$1.length>0&&Q$1(e$1[0]))){let h=new URL(e$1[0]);h.searchParams.set("base",u),e$1[0]=h.toString();}}if(n.length&&(e$1=[...e$1,...n]),i.components=e$1,await ee(i.cwd),e$1.length>0){let u=A__default.resolve(a$1,"components.json");f$1&&(r$1=gt(u)??void 0,r$1||e.warn(`Could not back up ${d.info("components.json")}.`));let{registryBaseConfig:h,installStyleIndex:g,url:y}=await Te(e$1[0],a$1,{registries:m?.registries});e$1[0]=y,g||(i.installStyleIndex=!1),h&&(i.registryBaseConfig=h);}await rt(i),e.break(),e.log(`Project initialization completed.
|
|
125
|
+
You may now add components.`),process.removeListener("exit",o),ht(A__default.resolve(a$1,"components.json")),e.break();}catch(i){process.removeListener("exit",o),o(),e.break(),oa$1(i);}finally{ea$1();}});async function rt(e){let t,r,n,o=e.template,i=o?Ne(Q[o],{monorepo:e.monorepo}):void 0;if(e.monorepo&&i?.init&&L.existsSync(A__default.resolve(e.cwd,"package.json")))t=await Fa$1(e.cwd);else if(e.skipPreflight)t=await Fa$1(e.cwd);else {let R=await ao(e);if(R.errors["1"]){let{projectPath:$,template:U}=await tr(e);$||process.exit(1),e.cwd=$,e.isNewProject=true,n=U,t=await Fa$1(e.cwd);}else t=R.projectInfo;}r=await Ga$1(e.cwd,t);let l=n??o,a=l?Ne(Q[l],{monorepo:e.monorepo}):void 0,f=[...e.installStyleIndex?["index"]:[],...e.components??[],...a?["button"]:[]],m=n?a?.postInit:void 0;if(a?.init){let R=await a.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 m&&await m({projectPath:e.cwd}),R}let p=r?await Ea(r,e):await ja(await Y(e.cwd));if(!e.yes){let{proceed:R}=await ve({type:"confirm",name:"proceed",message:`Write configuration to ${d.info("components.json")}. Proceed?`,initial:true});R||process.exit(1);}let u=await Z$1(e.cwd,p),{config:h}=await J(f,u,{silent:true});h.registries&&(p.registries=h.registries);let g=E("Writing components.json.").start(),y=A__default.resolve(e.cwd,"components.json"),k=`${y}${tt}`,C=(R,$)=>{let{registries:U,...Y}=vo(R,$);return {...Y,registries:U}};if(L.existsSync(k)){let R=await L.readJson(k);e.force?R.registries&&(p.registries={...R.registries,...p.registries||{}}):p=C(R,p);}e.registryBaseConfig&&(p=C(p,e.registryBaseConfig)),e.rtl!==void 0&&(p.rtl=e.rtl),p.registries=Object.fromEntries(Object.entries(p.registries||{}).filter(([R])=>!Object.keys(b).includes(R))),await promises.writeFile(y,`${JSON.stringify(p,null,2)}
|
|
126
|
+
`,"utf8"),g.succeed();let I=await Z$1(e.cwd,p),x=await _$1(I);if(x){let R={};if(p.menuColor&&(R.menuColor=p.menuColor),p.menuAccent&&(R.menuAccent=p.menuAccent),p.rtl!==void 0&&(R.rtl=p.rtl),p.iconLibrary&&(R.iconLibrary=p.iconLibrary),Object.keys(R).length>0)for(let $ of Object.keys(x)){let U=x[$];if(U.resolvedPaths.cwd===I.resolvedPaths.cwd)continue;let Y=A__default.resolve(U.resolvedPaths.cwd,"components.json");if(L.existsSync(Y)){let $e=await L.readJson(Y);await L.writeJson(Y,{...$e,...R},{spaces:2});}}}return X$1.clearCaches(),await ue(f,I,{overwrite:true,overwriteCssVars:e.reinstall||void 0,silent:e.silent,isNewProject:e.isNewProject||t?.framework.name==="next-app"}),m&&await m({projectPath:e.cwd}),I}async function ja(e$1=null){let[t,r]=await Promise.all([ua$1(),wa()]);e.info("");let n=await ve([{type:"toggle",name:"typescript",message:`Would you like to use ${d.info("TypeScript")} (recommended)?`,initial:e$1?.tsx??true,active:"yes",inactive:"no"},{type:"select",name:"style",message:`Which ${d.info("style")} would you like to use?`,choices:t.map(s=>({title:s.label,value:s.name}))},{type:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${d.info("base color")}?`,choices:r.map(s=>({title:s.label,value:s.name}))},{type:"text",name:"tailwindCss",message:`Where is your ${d.info("global CSS")} file?`,initial:e$1?.tailwind.css??V},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${d.info("CSS variables")} for theming?`,initial:e$1?.tailwind.cssVariables??true,active:"yes",inactive:"no"},{type:"text",name:"tailwindPrefix",message:`Are you using a custom ${d.info("tailwind prefix eg. tw-")}? (Leave blank if not)`,initial:""},{type:"text",name:"tailwindConfig",message:`Where is your ${d.info("tailwind.config.js")} located?`,initial:e$1?.tailwind.config??W},{type:"text",name:"components",message:`Configure the import alias for ${d.info("components")}:`,initial:e$1?.aliases.components??T},{type:"toggle",name:"rsc",message:`Are you using ${d.info("React Server Components")}?`,initial:e$1?.rsc??true,active:"yes",inactive:"no"}]);n.style||process.exit(1);let o=e$1&&e$1.aliases.components===n.components?e$1.aliases:void 0,i=Do(n.components,o);return 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:{components:n.components,ui:i.ui,lib:i.lib,hooks:i.hooks,utils:i.utils}})}async function Ea(e,t){let r=e.style,n="neutral",o=e.tailwind.cssVariables,i=e.iconLibrary??"lucide";if(!t.defaults){let[s,l]=await Promise.all([ua$1(),Ha$1(e)]);r=(await ve([{type:l==="v4"||r?null:"select",name:"style",message:`Which ${d.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 o=t.cssVariables,c.parse({$schema:e?.$schema,style:r,tailwind:{...e?.tailwind,baseColor:n,cssVariables:o},rsc:e?.rsc,tsx:e?.tsx,iconLibrary:i,rtl:t.rtl??e?.rtl??false,aliases:e?.aliases})}async function Fa(e$1,t){let r=e$1.startsWith("base-")?"base":"radix";if(t===r)return t;e.warn(` You are switching from ${d.info(r)} to ${d.info(t)}.`),e.warn(` Components outside the ${d.info("ui")} directory that depend on ${d.info(r)} primitives may need manual updates.`),e.break();let{proceed:n}=await ve({type:"confirm",name:"proceed",message:"Would you like to continue?",initial:false});return n?t:r}async function Wo(e$1){let t={};if(!L.existsSync(e$1.cwd)||!L.existsSync(A__default.resolve(e$1.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!L.existsSync(A__default.resolve(e$1.cwd,"components.json"))){if(await f(e$1.cwd)){let r=await g(e$1.cwd);r.length>0&&(h("add [component]",r),process.exit(1));}return t["3"]=true,{errors:t,config:null}}try{let r=await Y(e$1.cwd);return {errors:t,config:r}}catch{e.break(),e.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e$1.cwd)}.
|
|
127
|
+
Before you can add components, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),e.error(`Learn more at ${d.info(`${a}/docs/components-json`)}.`),e.break(),process.exit(1);}}async function zo(e,t,r={}){let n={files:[],dependencies:[],devDependencies:[],css:null,envVars:null,fonts:[],docs:null};if(!e.length)return n;let o=await ka$1(e,da$1(t));if(!o)throw new Error("Failed to fetch components from registry.");r.skipFonts||(o=await ut(o,t));let i=Oe([o]);return n.dependencies=Array.from(new Set(o.dependencies??[])),n.devDependencies=Array.from(new Set(o.devDependencies??[])),n.docs=o.docs??null,await Na(o,t,n,r,i),await Oa(o,t,n,r),Va(o,t,n),r.skipFonts||Da(o,n),n}async function Na(e,t,r,n,o){let i=e.files;if(!i?.length)return;let[s,l]=await Promise.all([Fa$1(t.resolvedPaths.cwd),t.tailwind.baseColor?xa(t.tailwind.baseColor):Promise.resolve(void 0)]),a;try{a=loadConfig(t.resolvedPaths.cwd);}catch{a={resultType:"failed"};}let f=new Project({compilerOptions:{}}),m=O(i,t,{isSrcDir:s?.isSrcDir,framework:s?.framework.name});for(let p=0;p<i.length;p++){let u=i[p];if(!u.content)continue;let h=M(u,t,{isSrcDir:s?.isSrcDir,framework:s?.framework.name,commonRoot:N$1(i.map($=>$.path),u.path),fileIndex:p});if(!h)continue;t.tsx||(h=h.replace(/\.tsx?$/,$=>$===".tsx"?".jsx":".js"));let g=existsSync(h),y=A__default.relative(t.resolvedPaths.cwd,h),k=u.type==="registry:file"||u.type==="registry:item",C=A$1(h)||k?u.content:await J$1({filename:u.path,raw:u.content,config:t,baseColor:l,transformJsx:!t.tsx,isRemote:false,supportedFontMarkers:o},[F,G,a$1,I,c$2,g$1,K,d$1,f$1,H]),I$1=A$1(h)||k?C:await P({config:t,content:C,filePaths:m,project:f,projectInfo:s,resolvedPath:h,tsConfig:a}),x="create",R;g&&(R=await promises.readFile(h,"utf-8"),z$1(R,I$1)?x="skip":x="overwrite"),r.files.push({path:y,action:x,content:I$1,...x==="overwrite"&&{existingContent:R},type:u.type??"registry:ui"});}}async function Oa(e,t,r,n){let o=e.css&&Object.keys(e.css).length>0,i=Object.keys(e.cssVars??{}).length>0;if(!t.resolvedPaths.tailwindCss||!o&&!i)return;let s=t.resolvedPaths.tailwindCss,l=existsSync(s),a=A__default.relative(t.resolvedPaths.cwd,s),f=l?await promises.readFile(s,"utf8"):"",m=f;i&&(m=await ft(m,e.cssVars,t,{overwriteCssVars:n.overwriteCssVars})),o&&(m=await Fr(m,e.css));let p=0;if(e.cssVars)for(let u of Object.values(e.cssVars))u&&(p+=Object.keys(u).length);r.css={path:a,content:m,...l&&{existingContent:f},action:l?"update":"create",cssVarsCount:p};}function Va(e,t,r){if(!e.envVars||Object.keys(e.envVars).length===0)return;let n=A__default.join(t.resolvedPaths.cwd,".env.local"),o=existsSync(n),i=A__default.relative(t.resolvedPaths.cwd,n);r.envVars={path:i,variables:e.envVars,action:o?"update":"create"};}function Da(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 xe=5,Ua=dim("\u250C"+"\u2500".repeat(46)),Ma=dim("\u2514"+"\u2500".repeat(46)),Wa={create:"+",overwrite:"~",skip:"="},Ba={create:"create",overwrite:"overwrite",skip:"skip (identical)"};function yt(e){return e==="create"?green(e):e==="overwrite"||e==="update"?yellow(e):dim(e)}function wt(e){return `${bold("\u250C")} ${bold(`shadcn add ${e.join(", ")}`)} ${dim("(dry run)")}`}function Go(e,t){return e===t||e.includes(t)||e.endsWith(t)}function Le(e,t,r=n=>n){e.push(`${dim("\u2502")} ${Ua}`);for(let n of t)e.push(`${dim("\u2502")} ${dim("\u2502")} ${r(n)}`);e.push(`${dim("\u2502")} ${Ma}`);}function Ko(e,t,r={}){return r.diff?typeof r.diff=="string"?Ha(e,t,r.diff):Ja(e,t):r.view?typeof r.view=="string"?Ka(e,t,r.view):Ga(e,t):za(e,t)}function za(e,t){let r=[];r.push(wt(t)),r.push(dim("\u2502")),Ya(e,r),Ho("Dependencies",e.dependencies,r),Ho("Dev Dependencies",e.devDependencies,r),qa(e,r),Za(e,r),Xa(e,r);let n=e.files.filter(i=>i.action==="overwrite").length;n>0&&(r.push(yellow(`\u26A0 ${n} ${n===1?"file":"files"} will be overwritten.`)),r.push(dim("\u2502")));let o=[];return e.files.length>0&&o.push(`${e.files.length} ${e.files.length===1?"file":"files"}`),e.dependencies.length>0&&o.push(`${e.dependencies.length} ${e.dependencies.length===1?"dep":"deps"}`),e.css?.cssVarsCount&&o.push(`${e.css.cssVarsCount} CSS vars`),o.length>0&&(r.push(`${dim("\u2502")} ${dim(o.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(`
|
|
128
|
+
`)}function Ha(e,t,r){let n=[];n.push(wt(t)),n.push(dim("\u2502"));let o=qo(e.files,r),i=e.css&&Go(e.css.path,r);if(o.length===0&&!i)n.push(`${dim("\u2502")} ${yellow(`No file matching "${r}" found.`)}`),n.push(dim("\u2502"));else {for(let s of o)Yo(s,n);if(i&&e.css){if(n.push(`${dim("\u251C")} ${bold(e.css.path)} ${dim("(")}${yt(e.css.action)}${dim(")")}`),e.css.action==="create"||!e.css.existingContent)Le(n,e.css.content.split(`
|
|
129
|
+
`),s=>green(`+${s}`));else {let s=Zo(e.css.existingContent,e.css.content,e.css.path,{fullContext:true});Le(n,s);}n.push(dim("\u2502"));}}return n.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),n.join(`
|
|
130
|
+
`)}function Ja(e,t){let r=[];r.push(wt(t)),r.push(dim("\u2502"));let n=e.files.slice(0,xe);if(n.length===0&&!e.css)r.push(`${dim("\u2502")} ${dim("No changes.")}`),r.push(dim("\u2502"));else {for(let s of n)Yo(s,r);e.files.length>xe&&r.push(dim("\u2502"));}let o=e.files.length;return o>xe&&r.push(` ${dim(`Showing ${xe} of ${o} files. Use --diff <path> to view a specific file.`)}`),r.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),r.join(`
|
|
131
|
+
`)}function Ga(e,t){let r=[];r.push(wt(t)),r.push(dim("\u2502"));let n=e.files.slice(0,xe);if(n.length===0&&!e.css)r.push(`${dim("\u2502")} ${dim("No files.")}`),r.push(dim("\u2502"));else {for(let s of n){let l=s.content.split(`
|
|
132
|
+
`);r.push(`${dim("\u251C")} ${bold(s.path)} ${dim("(")}${yt(s.action)}${dim(")")} ${dim(`${l.length} lines`)}`),Le(r,l),r.push(dim("\u2502"));}e.files.length>xe&&r.push(dim("\u2502"));}let o=e.files.length;return o>xe&&r.push(` ${dim(`Showing ${xe} of ${o} files. Use --view <path> to view a specific file.`)}`),r.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),r.join(`
|
|
133
|
+
`)}function Yo(e,t){if(t.push(`${dim("\u251C")} ${bold(e.path)} ${dim("(")}${yt(e.action)}${dim(")")}`),e.action==="skip")t.push(`${dim("\u2502")} ${dim("No changes.")}`);else if(e.action==="create")Le(t,e.content.split(`
|
|
134
|
+
`),r=>green(`+${r}`));else {let r=Zo(e.existingContent,e.content,e.path);Le(t,r);}t.push(dim("\u2502"));}function Ka(e,t,r){let n=[];n.push(wt(t)),n.push(dim("\u2502"));let o=qo(e.files,r),i=e.css&&Go(e.css.path,r);if(o.length===0&&!i)n.push(`${dim("\u2502")} ${yellow(`No file matching "${r}" found.`)}`),n.push(dim("\u2502"));else {for(let s of o){let l=s.content.split(`
|
|
135
135
|
`);n.push(`${dim("\u251C")} ${bold(s.path)} ${dim("(")}${yt(s.action)}${dim(")")} ${dim(`${l.length} lines`)}`),Le(n,l),n.push(dim("\u2502"));}if(i&&e.css){let s=e.css.content.split(`
|
|
136
136
|
`);n.push(`${dim("\u251C")} ${bold(e.css.path)} ${dim("(")}${yt(e.css.action)}${dim(")")} ${dim(`${s.length} lines`)}`),Le(n,s),n.push(dim("\u2502"));}}return n.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),n.join(`
|
|
137
|
-
`)}function
|
|
137
|
+
`)}function Ya(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 o=n.length>0?` ${n.join(dim(", "))}`:"";t.push(`${dim("\u251C")} ${bold("Files")} ${dim(`(${e.files.length})`)}${o}`);let i=Math.max(...e.files.map(s=>s.path.length));for(let s of e.files){let l=Wa[s.action],a=Ba[s.action],f=" ".repeat(Math.max(1,i-s.path.length+2)),m=s.action==="create"?green:s.action==="overwrite"?yellow:dim,p=s.action==="skip"?dim(s.path):s.path;t.push(`${dim("\u2502")} ${m(l)} ${p}${f}${m(a)}`);}t.push(dim("\u2502"));}function Ho(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 qa(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 Za(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 Xa(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 qo(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 Zo(e,t,r,n={}){if(nc(e,t))return [dim(" Formatting-only changes (spacing, quotes, semicolons).")];let o=Jo(e),i=Jo(t),s=n.fullContext?Math.max(o.split(`
|
|
138
138
|
`).length,i.split(`
|
|
139
139
|
`).length):3,l=structuredPatch(`a/${r}`,`b/${r}`,o,i,"","",{context:s});if(!l.hunks.length)return [dim(" No changes.")];let a=[dim(`--- a/${r}`),dim(`+++ b/${r}`)],f=t.split(`
|
|
140
|
-
`);for(let m of l.hunks){let{entries:p}=
|
|
140
|
+
`);for(let m of l.hunks){let{entries:p}=Qa(m,f);if(!p.some(k=>k.kind!=="context"))continue;let h=p.filter(k=>k.kind==="context").length,g=p.filter(k=>k.kind==="removed").length,y=p.filter(k=>k.kind==="added").length;a.push(cyan(`@@ -${m.oldStart},${h+g} +${m.newStart},${h+y} @@`));for(let k of p)a.push(k.formatted);}return a}function Qa(e,t){let r=[],n=e.newStart-1,o=0;for(;o<e.lines.length;){let i=e.lines[o];if(i.startsWith("-")){let s=[];for(;o<e.lines.length&&e.lines[o].startsWith("-");)s.push(e.lines[o].slice(1)),o++;for(;o<e.lines.length&&e.lines[o].startsWith("\\");)o++;let l=[];for(;o<e.lines.length&&e.lines[o].startsWith("+");)l.push(e.lines[o].slice(1)),o++;for(;o<e.lines.length&&e.lines[o].startsWith("\\");)o++;n=ec(s,l,t,n,r);}else if(i.startsWith("+")){let s=t[n]??i.slice(1);r.push({kind:"added",formatted:green(`+${s}`)}),n++,o++;}else if(i.startsWith("\\"))o++;else {let s=t[n]??i.slice(1);r.push({kind:"context",formatted:dim(` ${s}`)}),n++,o++;}}return {entries:r,newLineIndex:n}}function ec(e,t,r,n,o){if(oc(e,t)){for(let a=0;a<t.length;a++){let f=r[n]??t[a];o.push({kind:"context",formatted:dim(` ${f}`)}),n++;}return n}let i=tc(e),s=i.map(nr),l=new Set;for(let a=0;a<t.length;a++){let f=r[n]??t[a],m=nr(t[a]),p=s.findIndex((u,h)=>!l.has(h)&&u===m);if(p!==-1)l.add(p),o.push({kind:"context",formatted:dim(` ${f}`)});else {let u=s.findIndex((h,g)=>!l.has(g));if(u!==-1){l.add(u);let{oldHighlighted:h,newHighlighted:g}=rc(i[u],f);o.push({kind:"removed",formatted:h}),o.push({kind:"added",formatted:g});}else o.push({kind:"added",formatted:green(`+${f}`)});}n++;}for(let a=0;a<i.length;a++)l.has(a)||o.push({kind:"removed",formatted:red(`-${i[a]}`)});return n}function Jo(e){return e.split(`
|
|
141
141
|
`).map(t=>{let r=t.match(/^(\s*)/)?.[1]??"",n=t.slice(r.length);return r+n.replace(/['"]/g,'"').replace(/;$/g,"")}).join(`
|
|
142
|
-
`)}function
|
|
143
|
-
`).map(nr).filter(o=>o.length>0).join(" ");return r(e)===r(t)}function
|
|
142
|
+
`)}function tc(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 rc(e,t){let r=diffWords(e,t),n="-",o="+";for(let i of r)i.added?o+=bold(green(i.value)):i.removed?n+=bold(red(i.value)):(n+=red(i.value),o+=green(i.value));return {oldHighlighted:n,newHighlighted:o}}function nr(e){return e.replace(/\s+/g," ").trim().replace(/['"]/g,"'").replace(/;/g,"").replace(/,$/,"")}function nc(e,t){let r=n=>n.split(`
|
|
143
|
+
`).map(nr).filter(o=>o.length>0).join(" ");return r(e)===r(t)}function oc(e,t){let r=n=>n.map(nr).filter(o=>o.length>0).join(" ");return r(e)===r(t)}async function Qo(e,t){let r=A__default.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await bt__default.stat(r)).isFile())return;let[n]=await qa$1([e],{config:t});if(!n?.meta?.importSpecifier||!n?.meta?.moduleSpecifier)return;let o=`import { ${n?.meta?.importSpecifier} } from "${n.meta.moduleSpecifier}"
|
|
144
144
|
|
|
145
145
|
export default function Page() {
|
|
146
146
|
return <${n?.meta?.importSpecifier} />
|
|
147
|
-
}`;await bt__default.writeFile(r,o,"utf8");}var
|
|
148
|
-
Existing CSS variables and components will be overwritten. Continue?`)});y||(e.break(),e.log("Installation cancelled."),e.break(),process.exit(1));}}r.components?.length||(r.components=await
|
|
149
|
-
Before you can apply a preset, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),e.error(`Learn more at ${d.info(`${a}/docs/components-json`)}.`),e.break(),process.exit(1);}}var
|
|
150
|
-
`))e.error(n);e.break(),process.exit(1);}r instanceof Qe&&(e.error(`Could not back up ${d.info("components.json")}. Aborting.`),e.break(),process.exit(1)),r instanceof or&&(e.error(r.message),e.break(),process.exit(1)),e.break(),
|
|
151
|
-
`));return
|
|
152
|
-
`));return Array.from(new Set(r.map(o=>t[o])))}function
|
|
153
|
-
`))}function
|
|
147
|
+
}`;await bt__default.writeFile(r,o,"utf8");}var cc=z.object({components:z.array(z.string()).optional(),yes:z.boolean(),overwrite:z.boolean(),cwd:z.string(),all:z.boolean(),path:z.string().optional(),silent:z.boolean(),dryRun:z.boolean(),diff:z.union([z.string(),z.literal(true)]).optional(),view:z.union([z.string(),z.literal(true)]).optional()}),ei=new Command().name("add").description("add a component to your project").argument("[components...]","item addresses to add").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=cc.parse({components:e$1,...t,cwd:A__default.resolve(t.cwd)});await ee(r.cwd);let n=r.dryRun||r.diff||r.view,o=await Y(r.cwd);o||(o=ca$1({style:"new-york",resolvedPaths:{cwd:r.cwd}}));let i=!1;if(e$1.length>0){let{config:g,newRegistries:y}=await J(e$1,o,{silent:r.silent,writeFile:!1});o=g,i=y.length>0;}let s,l=!0;if(e$1.length>0){let[g]=await qa$1([e$1[0]],{config:o});if(s=g?.type,l=s!=="registry:theme"&&s!=="registry:style"&&s!=="registry:base",R(g)&&!n){await ue(e$1,o,r);return}if(!r.yes&&!n&&(s==="registry:style"||s==="registry:theme")){e.break();let{confirm:y}=await ve({type:"confirm",name:"confirm",message:d.warn(`You are about to install a new ${s.replace("registry:","")}.
|
|
148
|
+
Existing CSS variables and components will be overwritten. Continue?`)});y||(e.break(),e.log("Installation cancelled."),e.break(),process.exit(1));}}r.components?.length||(r.components=await lc(r));let a=await Fa$1(r.cwd);if(a?.tailwindVersion==="v4"){let g=c$1.filter(y=>r.components?.includes(y.name));g?.length&&(e.break(),g.forEach(y=>{e.warn(d.warn(y.message));}),e.break(),process.exit(1));}let{errors:f,config:m}=await Wo(r),p=!1;if(f["3"]){let{proceed:g}=await ve({type:"confirm",name:"proceed",message:`You need to create a ${d.info("components.json")} file to add components. Proceed?`,initial:!0});g||(e.break(),process.exit(1));let y=Xe(a?.framework.name),k=await qe(),{url:C}=await lt({rtl:!1,base:k,template:y}),{registryBaseConfig:I,installStyleIndex:x,url:R}=await Te(C,r.cwd);m=await rt({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:r.silent&&!i,isNewProject:!1,cssVariables:!0,rtl:!1,installStyleIndex:x,components:[R,...r.components??[]],registryBaseConfig:I}),p=!0;}let u=!1;if(f["1"]){let{projectPath:g,template:y}=await tr({cwd:r.cwd,force:r.overwrite,components:r.components});g||(e.break(),process.exit(1)),r.cwd=g;let k=await qe(),{url:C}=await lt({rtl:!1,base:k,template:y}),{registryBaseConfig:I,installStyleIndex:x,url:R}=await Te(C,r.cwd);m=await rt({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!i&&r.silent,isNewProject:!0,cssVariables:!0,rtl:!1,installStyleIndex:x,components:[R,...r.components??[]],registryBaseConfig:I}),p=!0,u=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//);}if(!m)throw new Error(`Failed to read config at ${d.info(r.cwd)}.`);let{config:h}=await J(r.components,m,{silent:r.silent||i,writeFile:!n});if(m=h,n){let g=E("Resolving items.",{silent:r.silent}).start(),y=await zo(r.components,m,{overwrite:r.overwrite});g.stop(),e.log(Ko(y,r.components,{diff:r.diff,view:r.view}));return}p||await ue(r.components,m,r),u&&await Qo(r.components[0],m);}catch(r){e.break(),oa$1(r);}finally{ea$1();}});async function lc(e$1){let t=await ta$1();if(!t)return e.break(),oa$1(new Error("Failed to fetch registry index.")),[];if(e$1.all)return t.map(o=>o.name).filter(o=>!c$1.some(i=>i.name===o));if(e$1.components?.length)return e$1.components;let{components:r}=await ve({type:"multiselect",name:"components",message:"Which components would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:false,choices:t.filter(o=>o.type==="registry:ui"&&!c$1.some(i=>i.name===o.name)).map(o=>({title:o.name,value:o.name,selected:e$1.all?true:e$1.components?.includes(o.name)}))});r?.length||(e.warn("No components selected. Exiting."),e.info(""),process.exit(1));let n=z.array(z.string()).safeParse(r);return n.success?n.data:(e.error(""),oa$1(new Error("Something went wrong. Please try again.")),[])}async function ti(e$1){let t={};if(!L.existsSync(e$1.cwd)||!L.existsSync(A__default.resolve(e$1.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!L.existsSync(A__default.resolve(e$1.cwd,"components.json"))){if(await f(e$1.cwd)){let r=await g(e$1.cwd),n=[];for(let o of r){let i=await Fa$1(A__default.resolve(e$1.cwd,o.name));i?.framework&&i.framework.name!=="manual"&&n.push(o);}n.length>0&&(h("apply --preset <preset>",n,{cwdFlag:"-c"}),process.exit(1));}return t["3"]=true,{errors:t,config:null}}try{let r=await Y(e$1.cwd);return {errors:t,config:r}}catch{e.break(),e.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e$1.cwd)}.
|
|
149
|
+
Before you can apply a preset, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),e.error(`Learn more at ${d.info(`${a}/docs/components-json`)}.`),e.break(),process.exit(1);}}var pc=z.object({cwd:z.string(),positionalPreset:z.string().optional(),preset:z.string().optional(),only:z.union([z.boolean(),z.string()]).optional(),yes:z.boolean(),silent:z.boolean()}),oi=["theme","font"],ot=class extends Error{constructor(t){super(t),this.name="ApplyOnlyError";}},or=class extends Error{constructor(t){super(t),this.name="ApplyWorkspaceSyncError";}},ii=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$1,t)=>{try{let r=pc.parse({...t,cwd:A__default.resolve(t.cwd),positionalPreset:e$1}),n=uc(r),o=ri(r.only);hc({preset:n,only:o});let i=await ti(r);i.errors["1"]&&(e.break(),e.error(`The ${d.info("apply")} command only works in an existing project.`),e.error(`Run ${d.info(ni(n))} first.`),e.break(),process.exit(1)),i.errors["3"]&&(e.break(),e.error(`No ${d.info("components.json")} found at ${d.info(r.cwd)}.`),e.error(`Run ${d.info(ni(n))} first.`),e.break(),process.exit(1));let s=i.config;s||process.exit(1);let l=s.rtl??!1,a=await bc(r.cwd);if(!n){let y=jr({command:"init",template:a,base:ba$1(s.style),rtl:l});await Er({createUrl:y,followUp:`Then run ${d.info("shadcn apply --preset <preset>")} with the preset code or preset URL from ui.shadcn.com.`,prompt:!r.yes}),process.exit(0);}wc(n);let f=o??ri(dc(n)),m=!f,p=m?await Ia(r.cwd):[];if(!r.yes){if(e.break(),f?e.warn(d.warn("Applying the selected preset parts will update your project configuration and styles.")):e.warn(d.warn("Applying a new preset will overwrite existing UI components, fonts, and CSS variables.")),e.warn("Commit or stash your changes before continuing so you can easily go back."),m)if(e.break(),e.log(" The following components will be re-installed:"),p.length)for(let k=0;k<p.length;k+=8)e.log(` - ${p.slice(k,k+8).join(", ")}`);else e.log(" - No installed UI components were detected.");e.break();let{proceed:y}=await ve({type:"confirm",name:"proceed",message:"Would you like to continue?",initial:!1});y||(e.break(),process.exit(1));}await ee(r.cwd);let u=ba$1(s.style),h=Rc(n,u,{template:a,rtl:l,only:f?.join(",")}),g=await _o(A__default.resolve(r.cwd,"components.json"),async()=>{let{registryBaseConfig:y,installStyleIndex:k,url:C}=await Te(h,r.cwd,{registries:s.registries}),I=yc({registryBaseConfig:y,existingConfig:s,only:f});return await rt({cwd:r.cwd,yes:!0,force:!1,reinstall:m,defaults:!1,silent:r.silent,isNewProject:!1,cssVariables:!0,installStyleIndex:k,registryBaseConfig:I,existingConfig:s,components:[C,...p]})});await kc(g,{only:f}),e.break(),e.log("Preset applied successfully."),e.break();}catch(r){if(r instanceof ot){for(let n of r.message.split(`
|
|
150
|
+
`))e.error(n);e.break(),process.exit(1);}r instanceof Qe&&(e.error(`Could not back up ${d.info("components.json")}. Aborting.`),e.break(),process.exit(1)),r instanceof or&&(e.error(r.message),e.break(),process.exit(1)),e.break(),oa$1(r);}finally{ea$1();}});function uc(e$1){let t=e$1.positionalPreset?.trim(),r=e$1.preset?.trim();return t&&r&&t!==r&&(e.error(`Received two different preset values. Use either the positional preset or ${d.info("--preset")}, or pass the same value to both.`),e.break(),process.exit(1)),r??t}function dc(e){if(!Q$1(e))return;let t=new URL(e);if(t.pathname==="/init")return t.searchParams.get("only")??void 0}function ri(e){if(!(e===void 0||e===false)){if(e===true)throw new ot(["Missing value for --only.",`Use one or more of: ${oi.join(", ")}.`,"Example: shadcn apply <preset> --only theme,font."].join(`
|
|
151
|
+
`));return gc(e)}}function gc(e){let t={theme:"theme",font:"font",fonts:"font"},r=e.split(",").map(o=>o.trim().toLowerCase()).filter(Boolean),n=r.filter(o=>!t[o]);if(!r.length||n.length)throw new ot([`Invalid value for --only: ${e}.`,`Use one or more of: ${oi.join(", ")}.`,"Example: shadcn apply <preset> --only theme,font."].join(`
|
|
152
|
+
`));return Array.from(new Set(r.map(o=>t[o])))}function hc(e){if(!(!e.only||e.preset))throw new ot(["Missing preset for --only.","Use: shadcn apply <preset> --only theme,font."].join(`
|
|
153
|
+
`))}function yc(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 wc(e$1){if(Q$1(e$1)||r(e$1))return;let t=Object.keys(Z);t.includes(e$1)||(e.error(`Invalid preset: ${d.info(e$1)}.
|
|
154
154
|
Use one of the available presets: ${t.join(", ")}
|
|
155
|
-
or build your own at ${d.info(`${a}/create`)}`),e.break(),process.exit(1));}async function
|
|
155
|
+
or build your own at ${d.info(`${a}/create`)}`),e.break(),process.exit(1));}async function bc(e){let t=await Fa$1(e);return Xe(t?.framework.name)}async function kc(e,t){if(t?.only&&!t.only.includes("theme"))return;let r=await Cc(e);if(!r.length)return;let n={style:e.style,tailwind:{baseColor:e.tailwind.baseColor,cssVariables:e.tailwind.cssVariables},...e.iconLibrary?{iconLibrary:e.iconLibrary}:{},...e.rtl!==void 0?{rtl:e.rtl}:{},...e.menuColor?{menuColor:e.menuColor}:{},...e.menuAccent?{menuAccent:e.menuAccent}:{}},o=[];for(let i of r){let s=A__default.resolve(i.resolvedPaths.cwd,"components.json");await L.pathExists(s)&&o.push({configPath:s,existingConfig:await L.readJson(s)});}try{for(let i of o)if(!gt(i.configPath))throw new Qe(i.configPath);for(let i of o)await L.writeJson(i.configPath,{...i.existingConfig,...n,tailwind:{...i.existingConfig.tailwind,...n.tailwind}},{spaces:2});for(let i of o)ht(i.configPath);}catch(i){for(let s of [...o].reverse())et(s.configPath);throw new or(`Failed to sync linked workspace configs.${i instanceof Error?` ${i.message}`:""}`)}}async function Cc(e){let t=await _$1(e);if(!t)return [];let r=new Map;for(let n of Object.values(t))n.resolvedPaths.cwd!==e.resolvedPaths.cwd&&r.set(n.resolvedPaths.cwd,n);return Array.from(r.values()).sort((n,o)=>n.resolvedPaths.cwd.localeCompare(o.resolvedPaths.cwd))}function Rc(e$1,t,r$1={}){if(Q$1(e$1)){let o=new URL(e$1);return o.pathname==="/init"&&e$1.startsWith(a)&&o.searchParams.set("track","1"),o.searchParams.set("base",t),o.searchParams.set("rtl",String(r$1.rtl??false)),r$1.only&&o.searchParams.set("only",r$1.only),o.toString()}if(r(e$1)){let o=q(e$1);return o||(e.error(`Invalid preset code: ${d.info(e$1)}`),e.break(),process.exit(1)),ye({...o,base:t,rtl:r$1.rtl??false},{preset:e$1,template:r$1.template,only:r$1.only})}let n=Z[e$1];return ye({...n,base:t,rtl:r$1.rtl??n.rtl},{template:r$1.template,only:r$1.only})}function vc(e){return /[^A-Za-z0-9_./:-]/.test(e)?JSON.stringify(e):e}function ni(e){return e?`shadcn init --preset ${vc(e)}`:"shadcn init"}async function li(e$1){let t={},r={cwd:e$1.cwd,registryFile:A__default.resolve(e$1.cwd,e$1.registryFile),outputDir:A__default.resolve(e$1.cwd,e$1.outputDir)};return L.existsSync(r.registryFile)||(t["13"]=true),await L.mkdir(r.outputDir,{recursive:true}),Object.keys(t).length>0&&(t["13"]&&(e.break(),e.error(`The path ${d.info(r.registryFile)} does not exist.`)),e.break(),process.exit(1)),{errors:t,resolvePaths:r}}var Sc=z.object({cwd:z.string(),registryFile:z.string(),outputDir:z.string()}),fi=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$1,t)=>{try{let r=Sc.parse({cwd:A.resolve(t.cwd),registryFile:e$1,outputDir:t.output}),{resolvePaths:n}=await li(r),o=await La(n.registryFile,{cwd:n.cwd}),i=o.registry,s=o.usesInclude?A.dirname(n.registryFile):n.cwd,l=Ma$1(o,s,n.cwd),a=E("Building registry...");for(let f of i.items){a.start(`Building ${f.name}...`);let m=await Na$1(f,o,s,n.cwd);await bt.writeFile(A.resolve(n.outputDir,`${m.name}.json`),JSON.stringify(m,null,2));}o.usesInclude?await bt.writeFile(A.resolve(n.outputDir,"registry.json"),JSON.stringify(l,null,2)):await bt.copyFile(n.registryFile,A.resolve(n.outputDir,"registry.json")),a.succeed("Building registry.");}catch(r){e.break(),oa$1(r);}});var jc=z.object({component:z.string().optional(),yes:z.boolean(),cwd:z.string(),path:z.string().optional()}),pi=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$1,t)=>{try{let r=jc.parse({component:e$1,...t}),n=A__default.resolve(r.cwd);existsSync(n)||(e.error(`The path ${n} does not exist. Please try again.`),process.exit(1));let o=await Y(n);if(!o){if(await f(n)){let a=await g(n);a.length>0&&(h("diff [component]",a),process.exit(1));}e.warn(`Configuration is missing. Please run ${d.success("init")} to create a components.json file.`),process.exit(1);}let i=await ta$1();if(i||(oa$1(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let a=o.resolvedPaths.components,f=i.filter(p=>{for(let u of p.files??[]){let h=A__default.resolve(a,typeof u=="string"?u:u.path);if(existsSync(h))return !0}return !1}),m=[];for(let p of f){let u=await mi(p,o);u.length&&m.push({name:p.name,changes:u});}m.length||(e.info("No updates found."),process.exit(0)),e.info("The following components have updates available:");for(let p of m){e.info(`- ${p.name}`);for(let u of p.changes)e.info(` - ${u.filePath}`);}e.break(),e.info(`Run ${d.success("diff <component>")} to see the changes.`),process.exit(0);}let s=i.find(a=>a.name===r.component);s||(e.error(`The component ${d.success(r.component)} does not exist.`),process.exit(1));let l=await mi(s,o);l.length||(e.info(`No updates found for ${r.component}.`),process.exit(0));for(let a of l)e.info(`- ${a.filePath}`),await Ec(a.patch),e.info("");}catch(r){oa$1(r);}});async function mi(e,t){let r=await za$1(t.style,[e]),n=await xa(t.tailwind.baseColor),o=Oe(r);if(!r)return [];let i=[];for(let s of r){let l=await Aa(t,s);if(l)for(let a of s.files??[]){let f=A__default.resolve(l,typeof a=="string"?a:a.path);if(!existsSync(f))continue;let m=await promises.readFile(f,"utf8");if(typeof a=="string"||!a.content)continue;let p=await J$1({filename:a.path,raw:a.content,config:t,baseColor:n,supportedFontMarkers:o},[F,G,a$1,I,c$2,g$1,d$1,f$1,H]),u=diffLines(p,m);u.length>1&&i.push({filePath:f,patch:u});}}return i}async function Ec(e){e.forEach(t=>{if(t)return t.added?process.stdout.write(d.success(t.value)):t.removed?process.stdout.write(d.error(t.value)):process.stdout.write(t.value)});}var ui="https://ui.shadcn.com",di=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$1,t)=>{try{let r=A__default.resolve(t.cwd),n=await Y(r),o=t.base??ba$1(n?.style),i=await ta$1();i||(e.error("Failed to fetch the registry index."),process.exit(1));let s=[];for(let a of e$1){let f=i.find(p=>p.name===a);f||(e.error(`Component ${d.info(a)} not found in the shadcn registry.`),process.exit(1));let m=f.meta?.links?.[o];if(!m||Object.keys(m).length===0){e.warn(`No documentation links available for ${d.info(a)}.`);continue}s.push({component:a,base:o,links:Ac(m)});}if(t.json){console.log(JSON.stringify({base:o,results:s},null,2));return}let l=Math.max(...s.flatMap(a=>Object.keys(a.links).map(f=>f.length)));for(let{component:a,links:f}of s){e.log(d.info(a));for(let[m,p]of Object.entries(f))e.log(` - ${m.padEnd(l+2)}${p}`);e.break();}}catch(r){oa$1(r);}});function Ac(e){return Object.fromEntries(Object.entries(e).map(([t,r])=>[t,r.startsWith(ui)?`${a}${r.slice(ui.length)}`:r]))}var gi=/@import\s+["']shadcn\/tailwind\.css["'];?\s*\n?/,Vc=z.object({cwd:z.string(),yes:z.boolean(),silent:z.boolean()}),hi=new Command().name("eject").description("inline shadcn/tailwind.css and remove the shadcn dependency").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-y, --yes","skip confirmation prompt.",false).option("-s, --silent","mute output.",false).action(async e=>{try{let t=Vc.parse({cwd:A__default.resolve(e.cwd),yes:e.yes,silent:e.silent});await Dc(t);}catch(t){oa$1(t);}});async function Dc(e$1){if(!L.existsSync(A__default.resolve(e$1.cwd,"components.json"))){if(await f(e$1.cwd)){let m=await g(e$1.cwd);m.length>0&&(h("eject",m),process.exit(1));}e.break(),e.error(`No ${d.info("components.json")} found. Run ${d.info("shadcn init")} first.`),e.error(`Learn more at ${d.info(`${a}/docs/components-json`)}.`),e.break(),process.exit(1);}let t=await Y(e$1.cwd);t?.resolvedPaths.tailwindCss||(e.break(),e.error("Could not resolve the Tailwind CSS file from components.json."),e.break(),process.exit(1));let r=t.resolvedPaths.tailwindCss,n=A__default.relative(e$1.cwd,r),o=await promises.readFile(r,"utf8");gi.test(o)||(e.break(),e.error(`Could not find ${d.info('@import "shadcn/tailwind.css"')} in ${d.info(n)}.`),e.error("Nothing to eject."),e.break(),process.exit(1));let i=y(e$1.cwd,false),s=Lc(i),l=Uc(e$1.cwd),a$1=await promises.readFile(l,"utf8");if(e$1.silent||(e.break(),e.warn("This action is not reversible. Future shadcn CLI updates to tailwind.css will not apply automatically."),e.break()),!e$1.yes){e.log("This will:"),e.log(` - Inline ${d.info("shadcn/tailwind.css")} into ${d.info(n)}`),e.log(` - Remove the ${d.info("shadcn")} dependency`),e.break();let{proceed:m}=await ve({type:"confirm",name:"proceed",message:"Proceed?",initial:false});m||process.exit(0);}let f$1=E(`Inlining ${d.info("shadcn/tailwind.css")}.`,{silent:e$1.silent})?.start();if(o=o.replace(gi,()=>`/* ejected from shadcn@${s} */
|
|
156
156
|
${a$1.trim()}
|
|
157
157
|
|
|
158
|
-
`),await promises.writeFile(r,o,"utf8"),f$1?.succeed(),Dc(i)){let m=E(`Removing ${d.info("shadcn")}.`,{silent:e$1.silent})?.start();await Lc(e$1.cwd),m?.succeed();}else e$1.silent||e.warn(`The ${d.info("shadcn")} package was not found in package.json. Skipped removal.`);e.break(),e.log(`Ejected ${d.info("shadcn/tailwind.css")} into ${d.info(n)}.`),e.break();}function Oc(e){return e?(e.dependencies?.shadcn??e.devDependencies?.shadcn??"unknown").replace(/^[\^~]/,"").trim():"unknown"}function Dc(e){return e?!!(e.dependencies?.shadcn||e.devDependencies?.shadcn):false}function Vc(e){let t=A__default.join(e,"node_modules/shadcn/dist/tailwind.css");if(L.existsSync(t))return t;let r=process.argv[1]?A__default.dirname(A__default.resolve(process.argv[1])):e;for(let n of [A__default.join(r,"tailwind.css"),A__default.join(r,"dist","tailwind.css"),A__default.join(r,"src","tailwind.css"),A__default.join(process.cwd(),"src/tailwind.css"),A__default.join(process.cwd(),"dist/tailwind.css")])if(L.existsSync(n))return n;throw new Error("Could not resolve shadcn/tailwind.css.")}async function Lc(e){switch(await ja(e)){case "npm":await execa("npm",["uninstall","shadcn"],{cwd:e});break;case "pnpm":await execa("pnpm",["remove","shadcn"],{cwd:e});break;case "yarn":await execa("yarn",["remove","shadcn"],{cwd:e});break;case "bun":await execa("bun",["remove","shadcn"],{cwd:e});break;case "deno":{let r=A__default.join(e,"package.json"),n=await L.readJson(r);for(let o of ["dependencies","devDependencies"])n[o]?.shadcn&&delete n[o].shadcn;await L.writeJson(r,n,{spaces:2});break}}}var _c=["50","100","200","300","400","500","600","700","800","900","950"],Uc=["red","orange","amber","yellow","lime","green","emerald","teal","cyan","sky","blue","indigo","violet","purple","fuchsia","pink","rose","slate","gray","zinc","neutral","stone","mauve","olive","mist","taupe"],Mc={red:{50:"oklch(97.1% 0.013 17.38)",100:"oklch(93.6% 0.032 17.717)",200:"oklch(88.5% 0.062 18.334)",300:"oklch(80.8% 0.114 19.571)",400:"oklch(70.4% 0.191 22.216)",500:"oklch(63.7% 0.237 25.331)",600:"oklch(57.7% 0.245 27.325)",700:"oklch(50.5% 0.213 27.518)",800:"oklch(44.4% 0.177 26.899)",900:"oklch(39.6% 0.141 25.723)",950:"oklch(25.8% 0.092 26.042)"},orange:{50:"oklch(98% 0.016 73.684)",100:"oklch(95.4% 0.038 75.164)",200:"oklch(90.1% 0.076 70.697)",300:"oklch(83.7% 0.128 66.29)",400:"oklch(75% 0.183 55.934)",500:"oklch(70.5% 0.213 47.604)",600:"oklch(64.6% 0.222 41.116)",700:"oklch(55.3% 0.195 38.402)",800:"oklch(47% 0.157 37.304)",900:"oklch(40.8% 0.123 38.172)",950:"oklch(26.6% 0.079 36.259)"},amber:{50:"oklch(98.7% 0.022 95.277)",100:"oklch(96.2% 0.059 95.617)",200:"oklch(92.4% 0.12 95.746)",300:"oklch(87.9% 0.169 91.605)",400:"oklch(82.8% 0.189 84.429)",500:"oklch(76.9% 0.188 70.08)",600:"oklch(66.6% 0.179 58.318)",700:"oklch(55.5% 0.163 48.998)",800:"oklch(47.3% 0.137 46.201)",900:"oklch(41.4% 0.112 45.904)",950:"oklch(27.9% 0.077 45.635)"},yellow:{50:"oklch(98.7% 0.026 102.212)",100:"oklch(97.3% 0.071 103.193)",200:"oklch(94.5% 0.129 101.54)",300:"oklch(90.5% 0.182 98.111)",400:"oklch(85.2% 0.199 91.936)",500:"oklch(79.5% 0.184 86.047)",600:"oklch(68.1% 0.162 75.834)",700:"oklch(55.4% 0.135 66.442)",800:"oklch(47.6% 0.114 61.907)",900:"oklch(42.1% 0.095 57.708)",950:"oklch(28.6% 0.066 53.813)"},lime:{50:"oklch(98.6% 0.031 120.757)",100:"oklch(96.7% 0.067 122.328)",200:"oklch(93.8% 0.127 124.321)",300:"oklch(89.7% 0.196 126.665)",400:"oklch(84.1% 0.238 128.85)",500:"oklch(76.8% 0.233 130.85)",600:"oklch(64.8% 0.2 131.684)",700:"oklch(53.2% 0.157 131.589)",800:"oklch(45.3% 0.124 130.933)",900:"oklch(40.5% 0.101 131.063)",950:"oklch(27.4% 0.072 132.109)"},green:{50:"oklch(98.2% 0.018 155.826)",100:"oklch(96.2% 0.044 156.743)",200:"oklch(92.5% 0.084 155.995)",300:"oklch(87.1% 0.15 154.449)",400:"oklch(79.2% 0.209 151.711)",500:"oklch(72.3% 0.219 149.579)",600:"oklch(62.7% 0.194 149.214)",700:"oklch(52.7% 0.154 150.069)",800:"oklch(44.8% 0.119 151.328)",900:"oklch(39.3% 0.095 152.535)",950:"oklch(26.6% 0.065 152.934)"},emerald:{50:"oklch(97.9% 0.021 166.113)",100:"oklch(95% 0.052 163.051)",200:"oklch(90.5% 0.093 164.15)",300:"oklch(84.5% 0.143 164.978)",400:"oklch(76.5% 0.177 163.223)",500:"oklch(69.6% 0.17 162.48)",600:"oklch(59.6% 0.145 163.225)",700:"oklch(50.8% 0.118 165.612)",800:"oklch(43.2% 0.095 166.913)",900:"oklch(37.8% 0.077 168.94)",950:"oklch(26.2% 0.051 172.552)"},teal:{50:"oklch(98.4% 0.014 180.72)",100:"oklch(95.3% 0.051 180.801)",200:"oklch(91% 0.096 180.426)",300:"oklch(85.5% 0.138 181.071)",400:"oklch(77.7% 0.152 181.912)",500:"oklch(70.4% 0.14 182.503)",600:"oklch(60% 0.118 184.704)",700:"oklch(51.1% 0.096 186.391)",800:"oklch(43.7% 0.078 188.216)",900:"oklch(38.6% 0.063 188.416)",950:"oklch(27.7% 0.046 192.524)"},cyan:{50:"oklch(98.4% 0.019 200.873)",100:"oklch(95.6% 0.045 203.388)",200:"oklch(91.7% 0.08 205.041)",300:"oklch(86.5% 0.127 207.078)",400:"oklch(78.9% 0.154 211.53)",500:"oklch(71.5% 0.143 215.221)",600:"oklch(60.9% 0.126 221.723)",700:"oklch(52% 0.105 223.128)",800:"oklch(45% 0.085 224.283)",900:"oklch(39.8% 0.07 227.392)",950:"oklch(30.2% 0.056 229.695)"},sky:{50:"oklch(97.7% 0.013 236.62)",100:"oklch(95.1% 0.026 236.824)",200:"oklch(90.1% 0.058 230.902)",300:"oklch(82.8% 0.111 230.318)",400:"oklch(74.6% 0.16 232.661)",500:"oklch(68.5% 0.169 237.323)",600:"oklch(58.8% 0.158 241.966)",700:"oklch(50% 0.134 242.749)",800:"oklch(44.3% 0.11 240.79)",900:"oklch(39.1% 0.09 240.876)",950:"oklch(29.3% 0.066 243.157)"},blue:{50:"oklch(97% 0.014 254.604)",100:"oklch(93.2% 0.032 255.585)",200:"oklch(88.2% 0.059 254.128)",300:"oklch(80.9% 0.105 251.813)",400:"oklch(70.7% 0.165 254.624)",500:"oklch(62.3% 0.214 259.815)",600:"oklch(54.6% 0.245 262.881)",700:"oklch(48.8% 0.243 264.376)",800:"oklch(42.4% 0.199 265.638)",900:"oklch(37.9% 0.146 265.522)",950:"oklch(28.2% 0.091 267.935)"},indigo:{50:"oklch(96.2% 0.018 272.314)",100:"oklch(93% 0.034 272.788)",200:"oklch(87% 0.065 274.039)",300:"oklch(78.5% 0.115 274.713)",400:"oklch(67.3% 0.182 276.935)",500:"oklch(58.5% 0.233 277.117)",600:"oklch(51.1% 0.262 276.966)",700:"oklch(45.7% 0.24 277.023)",800:"oklch(39.8% 0.195 277.366)",900:"oklch(35.9% 0.144 278.697)",950:"oklch(25.7% 0.09 281.288)"},violet:{50:"oklch(96.9% 0.016 293.756)",100:"oklch(94.3% 0.029 294.588)",200:"oklch(89.4% 0.057 293.283)",300:"oklch(81.1% 0.111 293.571)",400:"oklch(70.2% 0.183 293.541)",500:"oklch(60.6% 0.25 292.717)",600:"oklch(54.1% 0.281 293.009)",700:"oklch(49.1% 0.27 292.581)",800:"oklch(43.2% 0.232 292.759)",900:"oklch(38% 0.189 293.745)",950:"oklch(28.3% 0.141 291.089)"},purple:{50:"oklch(97.7% 0.014 308.299)",100:"oklch(94.6% 0.033 307.174)",200:"oklch(90.2% 0.063 306.703)",300:"oklch(82.7% 0.119 306.383)",400:"oklch(71.4% 0.203 305.504)",500:"oklch(62.7% 0.265 303.9)",600:"oklch(55.8% 0.288 302.321)",700:"oklch(49.6% 0.265 301.924)",800:"oklch(43.8% 0.218 303.724)",900:"oklch(38.1% 0.176 304.987)",950:"oklch(29.1% 0.149 302.717)"},fuchsia:{50:"oklch(97.7% 0.017 320.058)",100:"oklch(95.2% 0.037 318.852)",200:"oklch(90.3% 0.076 319.62)",300:"oklch(83.3% 0.145 321.434)",400:"oklch(74% 0.238 322.16)",500:"oklch(66.7% 0.295 322.15)",600:"oklch(59.1% 0.293 322.896)",700:"oklch(51.8% 0.253 323.949)",800:"oklch(45.2% 0.211 324.591)",900:"oklch(40.1% 0.17 325.612)",950:"oklch(29.3% 0.136 325.661)"},pink:{50:"oklch(97.1% 0.014 343.198)",100:"oklch(94.8% 0.028 342.258)",200:"oklch(89.9% 0.061 343.231)",300:"oklch(82.3% 0.12 346.018)",400:"oklch(71.8% 0.202 349.761)",500:"oklch(65.6% 0.241 354.308)",600:"oklch(59.2% 0.249 0.584)",700:"oklch(52.5% 0.223 3.958)",800:"oklch(45.9% 0.187 3.815)",900:"oklch(40.8% 0.153 2.432)",950:"oklch(28.4% 0.109 3.907)"},rose:{50:"oklch(96.9% 0.015 12.422)",100:"oklch(94.1% 0.03 12.58)",200:"oklch(89.2% 0.058 10.001)",300:"oklch(81% 0.117 11.638)",400:"oklch(71.2% 0.194 13.428)",500:"oklch(64.5% 0.246 16.439)",600:"oklch(58.6% 0.253 17.585)",700:"oklch(51.4% 0.222 16.935)",800:"oklch(45.5% 0.188 13.697)",900:"oklch(41% 0.159 10.272)",950:"oklch(27.1% 0.105 12.094)"},slate:{50:"oklch(98.4% 0.003 247.858)",100:"oklch(96.8% 0.007 247.896)",200:"oklch(92.9% 0.013 255.508)",300:"oklch(86.9% 0.022 252.894)",400:"oklch(70.4% 0.04 256.788)",500:"oklch(55.4% 0.046 257.417)",600:"oklch(44.6% 0.043 257.281)",700:"oklch(37.2% 0.044 257.287)",800:"oklch(27.9% 0.041 260.031)",900:"oklch(20.8% 0.042 265.755)",950:"oklch(12.9% 0.042 264.695)"},gray:{50:"oklch(98.5% 0.002 247.839)",100:"oklch(96.7% 0.003 264.542)",200:"oklch(92.8% 0.006 264.531)",300:"oklch(87.2% 0.01 258.338)",400:"oklch(70.7% 0.022 261.325)",500:"oklch(55.1% 0.027 264.364)",600:"oklch(44.6% 0.03 256.802)",700:"oklch(37.3% 0.034 259.733)",800:"oklch(27.8% 0.033 256.848)",900:"oklch(21% 0.034 264.665)",950:"oklch(13% 0.028 261.692)"},zinc:{50:"oklch(98.5% 0 0)",100:"oklch(96.7% 0.001 286.375)",200:"oklch(92% 0.004 286.32)",300:"oklch(87.1% 0.006 286.286)",400:"oklch(70.5% 0.015 286.067)",500:"oklch(55.2% 0.016 285.938)",600:"oklch(44.2% 0.017 285.786)",700:"oklch(37% 0.013 285.805)",800:"oklch(27.4% 0.006 286.033)",900:"oklch(21% 0.006 285.885)",950:"oklch(14.1% 0.005 285.823)"},neutral:{50:"oklch(98.5% 0 0)",100:"oklch(97% 0 0)",200:"oklch(92.2% 0 0)",300:"oklch(87% 0 0)",400:"oklch(70.8% 0 0)",500:"oklch(55.6% 0 0)",600:"oklch(43.9% 0 0)",700:"oklch(37.1% 0 0)",800:"oklch(26.9% 0 0)",900:"oklch(20.5% 0 0)",950:"oklch(14.5% 0 0)"},stone:{50:"oklch(98.5% 0.001 106.423)",100:"oklch(97% 0.001 106.424)",200:"oklch(92.3% 0.003 48.717)",300:"oklch(86.9% 0.005 56.366)",400:"oklch(70.9% 0.01 56.259)",500:"oklch(55.3% 0.013 58.071)",600:"oklch(44.4% 0.011 73.639)",700:"oklch(37.4% 0.01 67.558)",800:"oklch(26.8% 0.007 34.298)",900:"oklch(21.6% 0.006 56.043)",950:"oklch(14.7% 0.004 49.25)"},mauve:{50:"oklch(98.5% 0 0)",100:"oklch(96% 0.003 325.6)",200:"oklch(92.2% 0.005 325.62)",300:"oklch(86.5% 0.012 325.68)",400:"oklch(71.1% 0.019 323.02)",500:"oklch(54.2% 0.034 322.5)",600:"oklch(43.5% 0.029 321.78)",700:"oklch(36.4% 0.029 323.89)",800:"oklch(26.3% 0.024 320.12)",900:"oklch(21.2% 0.019 322.12)",950:"oklch(14.5% 0.008 326)"},olive:{50:"oklch(98.8% 0.003 106.5)",100:"oklch(96.6% 0.005 106.5)",200:"oklch(93% 0.007 106.5)",300:"oklch(88% 0.011 106.6)",400:"oklch(73.7% 0.021 106.9)",500:"oklch(58% 0.031 107.3)",600:"oklch(46.6% 0.025 107.3)",700:"oklch(39.4% 0.023 107.4)",800:"oklch(28.6% 0.016 107.4)",900:"oklch(22.8% 0.013 107.4)",950:"oklch(15.3% 0.006 107.1)"},mist:{50:"oklch(98.7% 0.002 197.1)",100:"oklch(96.3% 0.002 197.1)",200:"oklch(92.5% 0.005 214.3)",300:"oklch(87.2% 0.007 219.6)",400:"oklch(72.3% 0.014 214.4)",500:"oklch(56% 0.021 213.5)",600:"oklch(45% 0.017 213.2)",700:"oklch(37.8% 0.015 216)",800:"oklch(27.5% 0.011 216.9)",900:"oklch(21.8% 0.008 223.9)",950:"oklch(14.8% 0.004 228.8)"},taupe:{50:"oklch(98.6% 0.002 67.8)",100:"oklch(96% 0.002 17.2)",200:"oklch(92.2% 0.005 34.3)",300:"oklch(86.8% 0.007 39.5)",400:"oklch(71.4% 0.014 41.2)",500:"oklch(54.7% 0.021 43.1)",600:"oklch(43.8% 0.017 39.3)",700:"oklch(36.7% 0.016 35.7)",800:"oklch(26.8% 0.011 36.5)",900:"oklch(21.4% 0.009 43.1)",950:"oklch(14.7% 0.004 49.3)"}},Wc={"220.9 39.3% 11%":"gray","210 20% 98%":"gray","12 76% 61%":"gray","220 70% 50%":"gray"},hi=new Map;for(let e of Uc)for(let t of _c)hi.set(wi(Mc[e][t]),e);function yi(e){let t=wi(e);return t?hi.get(t)??Wc[t]??null:null}function wi(e){if(!e)return "";let t=e.trim().replace(/\s+/g," ").toLowerCase();if(!t.startsWith("oklch(")||!t.endsWith(")"))return t;let r=t.slice(6,-1).trim(),[n]=r.split(/\s*\/\s*/),o=n.split(/\s+/);if(o.length<3)return t;let i=Gr(o[0],{percentage:true}),s=Gr(o[1]),l=Gr(o[2]);return `oklch(${i} ${s} ${l})`}function Gr(e,t={}){return t.percentage&&e.endsWith("%")?gi(Number.parseFloat(e)/100):gi(Number.parseFloat(e))}function gi(e){return Number.isNaN(e)?"":Number(e.toFixed(12)).toString()}var Kc=new Set(c$3),Yc=new Set(g$2),qc=new Set(k),Zc=new Set(l),Xc=new Set(h$1),Qc=new Set(i),el=new Set(d$2),tl=new Set(["eb-garamond","instrument-serif","lora","merriweather","playfair-display","noto-serif","roboto-slab"]),rl=new Set(["jetbrains-mono","geist-mono"]),vt=["--font-sans","--font-serif","--font-mono"],vi=new Set(vt),nl=[...vt,"--font-heading"],xi=new Set(nl),bi={appliedBodyVariable:null,variables:{}},ol={0:"none","0rem":"none","0.45rem":"small","0.625rem":"default","0.875rem":"large"};async function fr(e,t){let r=sl(e.style);if(!r)return {code:null,fallbacks:[],values:null};let n=Z[r],o=await il(e.resolvedPaths.tailwindCss),i=cr(Kc,e.tailwind.baseColor),s=ll(o),l=fl(o),a=cr(Yc,e.iconLibrary),f=ki(o,bi),m=f??n.font,p$1=Ci(o,m,bi);if(!f||!p$1){let I=t;if(t===void 0)try{I=await Da(e.resolvedPaths.cwd,{configCssFile:e.tailwind.css});}catch{I=null;}let x=await gl(e,I);f??=ki(o,x),m=f??n.font,p$1??=Ci(o,m,x);}let u=pl(p$1??n.fontHeading,m,n.fontHeading),h=ml(o.rootVars["--radius"]),g=cr(qc,e.menuAccent),y=cr(Zc,e.menuColor),k={style:r,baseColor:i??n.baseColor,theme:s??n.theme,chartColor:l??n.chartColor,iconLibrary:a??n.iconLibrary,font:m,fontHeading:u,radius:h??n.radius,menuAccent:g??n.menuAccent,menuColor:y??n.menuColor},C=[!i&&"baseColor",!s&&"theme",!l&&"chartColor",!a&&"iconLibrary",!f&&"font",!p$1&&"fontHeading",!h&&"radius",!g&&"menuAccent",!y&&"menuColor"].filter(Boolean);return {code:p(k),fallbacks:C,values:k}}async function il(e){let t={darkVars:{},imports:[],rootVars:{},themeVars:{}};if(!e)return t;try{let r=await promises.readFile(e,"utf8");return al(r)}catch{return t}}function sl(e){if(!e)return null;let t=e.replace(/^(base|radix)-/,"");return t in Z?t:null}function al(e){let t=P$1.parse(e),r={darkVars:{},imports:[],rootVars:{},themeVars:{}};return t.walkAtRules("import",n=>{let o=cl(n.params);o&&r.imports.push(o);}),t.walkRules(n=>{let o=n.selector.split(",").map(i=>i.trim()).filter(Boolean);o.includes(":root")&&Kr(n,r.rootVars),o.includes(".dark")&&Kr(n,r.darkVars);}),t.walkAtRules("theme",n=>{n.params.trim()==="inline"&&Kr(n,r.themeVars);}),r}function Kr(e,t){for(let r of e.nodes??[])r.type!=="decl"||!r.prop.startsWith("--")||(t[r.prop]=r.value.trim());}function cl(e){let t=e.trim();return (t.match(/^url\((['"]?)(.+?)\1\)$/)??t.match(/^(['"])(.+?)\1$/))?.[2]??null}function ll(e){let t=lr(e.rootVars["--primary"]);if(!t)return null;let r=e.darkVars["--primary"];return r?lr(r)===t?t:null:t}function fl(e){let t=lr(e.rootVars["--chart-1"]);if(!t)return null;let r=e.darkVars["--chart-1"];return r?lr(r)===t?t:null:t}function lr(e){let t=yi(e);return !t||!el.has(t)?null:t}function ml(e){if(!e)return null;let t=mr(e);return ol[t]??null}function ki(e,t){for(let r of vt){let n=Ii(e,r);if(n)return n}for(let r of vt){let n=ul(e.imports,r);if(n)return n}return dl(t)}function Ci(e,t,r){let n=Yr(e,"--font-heading"),o=n?$i(n):null;if(o)return o===t?"inherit":o;let i=r.variables["--font-heading"],s=Si(e,"--font-heading");if(!s)return i&&i!==t?i:null;let l=qr(s);if(l&&vi.has(l)){let a=Ii(e,l),f=r.variables[l],m=a??f??null;return !m||m===t?"inherit":m}return l==="--font-heading"?i?i===t?"inherit":i:null:i&&i!==t?i:null}function pl(e,t,r){let n=e===t?"inherit":e;return Qc.has(n)?n:r}function Yr(e,t,r=new Set){if(r.has(t))return null;r.add(t);let n=Si(e,t);if(!n)return null;let o=qr(n);return o?xi.has(o)?Yr(e,o,r):null:n}function Si(e,t){let r=e.themeVars[t];return r&&qr(r)!==t?r:e.rootVars[t]??r??null}function qr(e){return mr(e).match(/^var\((--[a-z0-9-]+)\)$/)?.[1]??null}function Ii(e,t){let r=Yr(e,t),n=r?$i(r):null;return n||null}function ul(e,t){let r=e.flatMap(n=>{let o=vl(n);return o&&Sl(o)===t?[o]:[]});return r.length===1?r[0]:null}function dl(e){if(e.appliedBodyVariable&&e.variables[e.appliedBodyVariable])return e.variables[e.appliedBodyVariable]??null;let t=vt.map(r=>e.variables[r]).filter(Boolean).filter((r,n,o)=>o.indexOf(r)===n);return t.length===1?t[0]:null}async function gl(e,t){let r={appliedBodyVariable:null,variables:{}};if(!t||t.framework.name!=="next-app"&&t.framework.name!=="next-pages")return r;let n=hl(e,t);if(!n)return r;try{let o=await promises.readFile(n,"utf8");return yl(o,t.framework.name)}catch{return r}}function hl(e,t){let r=t.isTsx?"tsx":"jsx",n=t.framework.name==="next-app"?t.isSrcDir?[`src/app/layout.${r}`,`app/layout.${r}`]:[`app/layout.${r}`]:t.isSrcDir?[`src/pages/_app.${r}`,`pages/_app.${r}`]:[`pages/_app.${r}`];for(let o of n){let i=A__default.join(e.resolvedPaths.cwd,o);if(existsSync(i))return i}return null}function yl(e,t){let n=new Project({compilerOptions:{}}).createSourceFile("font-source.tsx",e,{overwrite:true,scriptKind:ScriptKind.TSX}),o=new Map;for(let l of n.getImportDeclarations())if(l.getModuleSpecifierValue()==="next/font/google")for(let a of l.getNamedImports()){let f=a.getName(),m=a.getAliasNode()?.getText()??f,p=xl(f);p&&o.set(m,p);}let i={},s=new Map;for(let l of n.getVariableStatements())for(let a of l.getDeclarations()){let f=a.getInitializer();if(!f?.isKind(SyntaxKind.CallExpression))continue;let m=o.get(f.getExpression().getText());if(!m)continue;let p=wl(f);p&&(s.set(a.getName(),p),i[p]=m);}return {appliedBodyVariable:bl(n,s,t),variables:i}}function wl(e){let t=e.getArguments()[0];if(!t||!Node.isObjectLiteralExpression(t))return null;let r=t.getProperty("variable");if(!r||!Node.isPropertyAssignment(r))return null;let n=r.getInitializer();if(!n)return null;let o=Pi(n.getText());return xi.has(o)?o:null}function bl(e,t,r){let n=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement).filter(i=>r==="next-app"?i.getTagNameNode().getText()==="html":true),o=new Set;for(let i of n){let s=i.getAttribute("className");if(!s||!Node.isJsxAttribute(s))continue;let l=s.getInitializer();if(!l)continue;let a=kl(l,t),f=Cl(l);if(f&&a.includes(f))return f;a.length===1&&o.add(a[0]);}return o.size===1?Array.from(o)[0]:null}function kl(e,t){let r=Node.isJsxExpression(e)?[e.getExpression(),...e.getDescendantsOfKind(SyntaxKind.PropertyAccessExpression)].filter(Boolean):[],n=new Set;for(let o of r){if(!o||!Node.isPropertyAccessExpression(o)||o.getName()!=="variable")continue;let i=o.getExpression().getText(),s=t.get(i);s&&vi.has(s)&&n.add(s);}return Array.from(n)}function Cl(e){let t=Rl(e);return /\bfont-sans\b/.test(t)?"--font-sans":/\bfont-serif\b/.test(t)?"--font-serif":/\bfont-mono\b/.test(t)?"--font-mono":null}function Rl(e){let t=[];(Node.isStringLiteral(e)||Node.isNoSubstitutionTemplateLiteral(e))&&t.push(e.getLiteralValue());for(let r of e.getDescendantsOfKind(SyntaxKind.StringLiteral))t.push(r.getLiteralValue());for(let r of e.getDescendantsOfKind(SyntaxKind.NoSubstitutionTemplateLiteral))t.push(r.getLiteralValue());return t.length>0?t.join(" "):e.getText()}function Pi(e){return e.replace(/^['"]|['"]$/g,"")}function $i(e){if(!e)return null;let t=Pi(e.split(",")[0]?.trim()??"").replace(/\s+variable$/i,"").trim();return t?Zr(t.replace(/\s+/g,"-")):null}function vl(e){if(!e)return null;let t=mr(e),r="@fontsource-variable/";return t.startsWith(r)?Zr(t.slice(r.length)):null}function xl(e){return e?Zr(e.replace(/_/g,"-")):null}function Zr(e){let t=mr(e);return Xc.has(t)?t:null}function Sl(e){return rl.has(e)?"--font-mono":tl.has(e)?"--font-serif":"--font-sans"}function mr(e){return e?e.trim().replace(/\s+/g," ").replace(/\s*,\s*/g,", ").replace(/"/g,"'").toLowerCase():""}function cr(e,t){return t&&e.has(t)?t:null}var Ei=`${a}/code/apps/v4/registry/bases`,Fi=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=A__default.resolve(e.cwd);if(!existsSync(A__default.resolve(t,"components.json"))&&await f(t)){let l=await g(t);l.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:l.map(a=>a.name)},null,2)):h("info",l),process.exit(1));}let r=await Da(t),n=await X$1(t),o=await Ga$1(t),i=aa$1(n?.style),s=await jl(r,n,o,i);if(e.json){console.log(JSON.stringify(s,null,2));return}El(s);}catch(t){ma$1(t);}});function $l(e){if(!e)return {};let t={};for(let[r,n]of Object.entries(e))t[r]=typeof n=="string"?n:n.url;return t}async function jl(e,t,r,n){let o=t?await fr(t,e):null;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:$l(t.registries)}:null,preset:o,components:r,links:{docs:`${a}/docs`,components:`${a}/docs/components/${n}/[component].md`,ui:`${Ei}/${n}/ui/[component].tsx`,examples:`${Ei}/${n}/examples/[component]-example.tsx`,schema:`${a}/schema.json`}}}function El(e$1){e.log(d.info("Project")),e$1.project?xe({framework:`${e$1.project.framework} (${e$1.project.frameworkName})`,frameworkVersion:e$1.project.frameworkVersion??"-",srcDirectory:e$1.project.srcDirectory?"Yes":"No",rsc:e$1.project.rsc?"Yes":"No",typescript:e$1.project.typescript?"Yes":"No",tailwindVersion:e$1.project.tailwindVersion??"-",tailwindConfig:e$1.project.tailwindConfig??"-",tailwindCss:e$1.project.tailwindCss??"-",importAlias:e$1.project.importAlias??"-"}):e.log(" No project info detected."),e.break(),e.log(d.info("Configuration")),e$1.config?(xe({style:e$1.config.style,base:e$1.config.base,rsc:e$1.config.rsc?"Yes":"No",typescript:e$1.config.typescript?"Yes":"No",iconLibrary:e$1.config.iconLibrary??"-",rtl:e$1.config.rtl?"Yes":"No",menuColor:e$1.config.menuColor??"-",menuAccent:e$1.config.menuAccent??"-"}),e.break(),pr(e$1.preset),e.break(),e.log(d.info("Aliases")),xe({components:e$1.config.aliases.components,utils:e$1.config.aliases.utils,ui:e$1.config.aliases.ui??"-",lib:e$1.config.aliases.lib??"-",hooks:e$1.config.aliases.hooks??"-"}),e.break(),e.log(d.info("Resolved Paths")),xe({cwd:e$1.config.resolvedPaths.cwd,tailwindConfig:e$1.config.resolvedPaths.tailwindConfig??"-",tailwindCss:e$1.config.resolvedPaths.tailwindCss??"-",utils:e$1.config.resolvedPaths.utils,components:e$1.config.resolvedPaths.components,lib:e$1.config.resolvedPaths.lib,hooks:e$1.config.resolvedPaths.hooks,ui:e$1.config.resolvedPaths.ui}),Object.keys(e$1.config.registries).length>0&&(e.break(),e.log("registries:"),xe(e$1.config.registries))):e.log(" No components.json found."),e.break(),e.log(d.info("Installed Components")),e$1.components.length>0?e.log(` ${e$1.components.join(", ")}`):e.log(" No components installed."),e.break(),e.log(d.info("Links")),xe(e$1.links),e.break();}function pr(e$1,t={}){if(e.log(d.info("Preset")),!e$1?.code)xe({code:"-"});else {let r=e$1.fallbacks??[],n=(o,i)=>{let s=r.includes(o)?"*":"";return `${i??"-"}${s}`};xe({code:e$1.code,version:e$1.code[0],style:e$1.values?.style??"-",baseColor:n("baseColor",e$1.values?.baseColor),theme:n("theme",e$1.values?.theme),chartColor:n("chartColor",e$1.values?.chartColor),iconLibrary:n("iconLibrary",e$1.values?.iconLibrary),font:n("font",e$1.values?.font),fontHeading:n("fontHeading",e$1.values?.fontHeading),radius:n("radius",e$1.values?.radius),menuAccent:n("menuAccent",e$1.values?.menuAccent),menuColor:n("menuColor",e$1.values?.menuColor),url:`${a}/create?preset=${e$1.code}`}),r.length>0&&(e.log(""),e.log(t.fallbackNote??" * Uses preset defaults for values not available as options on shadcn/create."));}}function xe(e$1){let t=Math.max(...Object.keys(e$1).map(r=>r.length));for(let[r,n]of Object.entries(e$1))e.log(` ${r.padEnd(t+2)}${n}`);}var Me="latest",dr=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${Me}`,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${Me}`,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{shadcn:{command:"npx",args:[`shadcn@${Me}`,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.shadcn]
|
|
158
|
+
`),await promises.writeFile(r,o,"utf8"),f$1?.succeed(),_c(i)){let m=E(`Removing ${d.info("shadcn")}.`,{silent:e$1.silent})?.start();await Mc(e$1.cwd),m?.succeed();}else e$1.silent||e.warn(`The ${d.info("shadcn")} package was not found in package.json. Skipped removal.`);e.break(),e.log(`Ejected ${d.info("shadcn/tailwind.css")} into ${d.info(n)}.`),e.break();}function Lc(e){return e?(e.dependencies?.shadcn??e.devDependencies?.shadcn??"unknown").replace(/^[\^~]/,"").trim():"unknown"}function _c(e){return e?!!(e.dependencies?.shadcn||e.devDependencies?.shadcn):false}function Uc(e){let t=A__default.join(e,"node_modules/shadcn/dist/tailwind.css");if(L.existsSync(t))return t;let r=process.argv[1]?A__default.dirname(A__default.resolve(process.argv[1])):e;for(let n of [A__default.join(r,"tailwind.css"),A__default.join(r,"dist","tailwind.css"),A__default.join(r,"src","tailwind.css"),A__default.join(process.cwd(),"src/tailwind.css"),A__default.join(process.cwd(),"dist/tailwind.css")])if(L.existsSync(n))return n;throw new Error("Could not resolve shadcn/tailwind.css.")}async function Mc(e){switch(await la$1(e)){case "npm":await execa("npm",["uninstall","shadcn"],{cwd:e});break;case "pnpm":await execa("pnpm",["remove","shadcn"],{cwd:e});break;case "yarn":await execa("yarn",["remove","shadcn"],{cwd:e});break;case "bun":await execa("bun",["remove","shadcn"],{cwd:e});break;case "deno":{let r=A__default.join(e,"package.json"),n=await L.readJson(r);for(let o of ["dependencies","devDependencies"])n[o]?.shadcn&&delete n[o].shadcn;await L.writeJson(r,n,{spaces:2});break}}}var Wc=["50","100","200","300","400","500","600","700","800","900","950"],Bc=["red","orange","amber","yellow","lime","green","emerald","teal","cyan","sky","blue","indigo","violet","purple","fuchsia","pink","rose","slate","gray","zinc","neutral","stone","mauve","olive","mist","taupe"],zc={red:{50:"oklch(97.1% 0.013 17.38)",100:"oklch(93.6% 0.032 17.717)",200:"oklch(88.5% 0.062 18.334)",300:"oklch(80.8% 0.114 19.571)",400:"oklch(70.4% 0.191 22.216)",500:"oklch(63.7% 0.237 25.331)",600:"oklch(57.7% 0.245 27.325)",700:"oklch(50.5% 0.213 27.518)",800:"oklch(44.4% 0.177 26.899)",900:"oklch(39.6% 0.141 25.723)",950:"oklch(25.8% 0.092 26.042)"},orange:{50:"oklch(98% 0.016 73.684)",100:"oklch(95.4% 0.038 75.164)",200:"oklch(90.1% 0.076 70.697)",300:"oklch(83.7% 0.128 66.29)",400:"oklch(75% 0.183 55.934)",500:"oklch(70.5% 0.213 47.604)",600:"oklch(64.6% 0.222 41.116)",700:"oklch(55.3% 0.195 38.402)",800:"oklch(47% 0.157 37.304)",900:"oklch(40.8% 0.123 38.172)",950:"oklch(26.6% 0.079 36.259)"},amber:{50:"oklch(98.7% 0.022 95.277)",100:"oklch(96.2% 0.059 95.617)",200:"oklch(92.4% 0.12 95.746)",300:"oklch(87.9% 0.169 91.605)",400:"oklch(82.8% 0.189 84.429)",500:"oklch(76.9% 0.188 70.08)",600:"oklch(66.6% 0.179 58.318)",700:"oklch(55.5% 0.163 48.998)",800:"oklch(47.3% 0.137 46.201)",900:"oklch(41.4% 0.112 45.904)",950:"oklch(27.9% 0.077 45.635)"},yellow:{50:"oklch(98.7% 0.026 102.212)",100:"oklch(97.3% 0.071 103.193)",200:"oklch(94.5% 0.129 101.54)",300:"oklch(90.5% 0.182 98.111)",400:"oklch(85.2% 0.199 91.936)",500:"oklch(79.5% 0.184 86.047)",600:"oklch(68.1% 0.162 75.834)",700:"oklch(55.4% 0.135 66.442)",800:"oklch(47.6% 0.114 61.907)",900:"oklch(42.1% 0.095 57.708)",950:"oklch(28.6% 0.066 53.813)"},lime:{50:"oklch(98.6% 0.031 120.757)",100:"oklch(96.7% 0.067 122.328)",200:"oklch(93.8% 0.127 124.321)",300:"oklch(89.7% 0.196 126.665)",400:"oklch(84.1% 0.238 128.85)",500:"oklch(76.8% 0.233 130.85)",600:"oklch(64.8% 0.2 131.684)",700:"oklch(53.2% 0.157 131.589)",800:"oklch(45.3% 0.124 130.933)",900:"oklch(40.5% 0.101 131.063)",950:"oklch(27.4% 0.072 132.109)"},green:{50:"oklch(98.2% 0.018 155.826)",100:"oklch(96.2% 0.044 156.743)",200:"oklch(92.5% 0.084 155.995)",300:"oklch(87.1% 0.15 154.449)",400:"oklch(79.2% 0.209 151.711)",500:"oklch(72.3% 0.219 149.579)",600:"oklch(62.7% 0.194 149.214)",700:"oklch(52.7% 0.154 150.069)",800:"oklch(44.8% 0.119 151.328)",900:"oklch(39.3% 0.095 152.535)",950:"oklch(26.6% 0.065 152.934)"},emerald:{50:"oklch(97.9% 0.021 166.113)",100:"oklch(95% 0.052 163.051)",200:"oklch(90.5% 0.093 164.15)",300:"oklch(84.5% 0.143 164.978)",400:"oklch(76.5% 0.177 163.223)",500:"oklch(69.6% 0.17 162.48)",600:"oklch(59.6% 0.145 163.225)",700:"oklch(50.8% 0.118 165.612)",800:"oklch(43.2% 0.095 166.913)",900:"oklch(37.8% 0.077 168.94)",950:"oklch(26.2% 0.051 172.552)"},teal:{50:"oklch(98.4% 0.014 180.72)",100:"oklch(95.3% 0.051 180.801)",200:"oklch(91% 0.096 180.426)",300:"oklch(85.5% 0.138 181.071)",400:"oklch(77.7% 0.152 181.912)",500:"oklch(70.4% 0.14 182.503)",600:"oklch(60% 0.118 184.704)",700:"oklch(51.1% 0.096 186.391)",800:"oklch(43.7% 0.078 188.216)",900:"oklch(38.6% 0.063 188.416)",950:"oklch(27.7% 0.046 192.524)"},cyan:{50:"oklch(98.4% 0.019 200.873)",100:"oklch(95.6% 0.045 203.388)",200:"oklch(91.7% 0.08 205.041)",300:"oklch(86.5% 0.127 207.078)",400:"oklch(78.9% 0.154 211.53)",500:"oklch(71.5% 0.143 215.221)",600:"oklch(60.9% 0.126 221.723)",700:"oklch(52% 0.105 223.128)",800:"oklch(45% 0.085 224.283)",900:"oklch(39.8% 0.07 227.392)",950:"oklch(30.2% 0.056 229.695)"},sky:{50:"oklch(97.7% 0.013 236.62)",100:"oklch(95.1% 0.026 236.824)",200:"oklch(90.1% 0.058 230.902)",300:"oklch(82.8% 0.111 230.318)",400:"oklch(74.6% 0.16 232.661)",500:"oklch(68.5% 0.169 237.323)",600:"oklch(58.8% 0.158 241.966)",700:"oklch(50% 0.134 242.749)",800:"oklch(44.3% 0.11 240.79)",900:"oklch(39.1% 0.09 240.876)",950:"oklch(29.3% 0.066 243.157)"},blue:{50:"oklch(97% 0.014 254.604)",100:"oklch(93.2% 0.032 255.585)",200:"oklch(88.2% 0.059 254.128)",300:"oklch(80.9% 0.105 251.813)",400:"oklch(70.7% 0.165 254.624)",500:"oklch(62.3% 0.214 259.815)",600:"oklch(54.6% 0.245 262.881)",700:"oklch(48.8% 0.243 264.376)",800:"oklch(42.4% 0.199 265.638)",900:"oklch(37.9% 0.146 265.522)",950:"oklch(28.2% 0.091 267.935)"},indigo:{50:"oklch(96.2% 0.018 272.314)",100:"oklch(93% 0.034 272.788)",200:"oklch(87% 0.065 274.039)",300:"oklch(78.5% 0.115 274.713)",400:"oklch(67.3% 0.182 276.935)",500:"oklch(58.5% 0.233 277.117)",600:"oklch(51.1% 0.262 276.966)",700:"oklch(45.7% 0.24 277.023)",800:"oklch(39.8% 0.195 277.366)",900:"oklch(35.9% 0.144 278.697)",950:"oklch(25.7% 0.09 281.288)"},violet:{50:"oklch(96.9% 0.016 293.756)",100:"oklch(94.3% 0.029 294.588)",200:"oklch(89.4% 0.057 293.283)",300:"oklch(81.1% 0.111 293.571)",400:"oklch(70.2% 0.183 293.541)",500:"oklch(60.6% 0.25 292.717)",600:"oklch(54.1% 0.281 293.009)",700:"oklch(49.1% 0.27 292.581)",800:"oklch(43.2% 0.232 292.759)",900:"oklch(38% 0.189 293.745)",950:"oklch(28.3% 0.141 291.089)"},purple:{50:"oklch(97.7% 0.014 308.299)",100:"oklch(94.6% 0.033 307.174)",200:"oklch(90.2% 0.063 306.703)",300:"oklch(82.7% 0.119 306.383)",400:"oklch(71.4% 0.203 305.504)",500:"oklch(62.7% 0.265 303.9)",600:"oklch(55.8% 0.288 302.321)",700:"oklch(49.6% 0.265 301.924)",800:"oklch(43.8% 0.218 303.724)",900:"oklch(38.1% 0.176 304.987)",950:"oklch(29.1% 0.149 302.717)"},fuchsia:{50:"oklch(97.7% 0.017 320.058)",100:"oklch(95.2% 0.037 318.852)",200:"oklch(90.3% 0.076 319.62)",300:"oklch(83.3% 0.145 321.434)",400:"oklch(74% 0.238 322.16)",500:"oklch(66.7% 0.295 322.15)",600:"oklch(59.1% 0.293 322.896)",700:"oklch(51.8% 0.253 323.949)",800:"oklch(45.2% 0.211 324.591)",900:"oklch(40.1% 0.17 325.612)",950:"oklch(29.3% 0.136 325.661)"},pink:{50:"oklch(97.1% 0.014 343.198)",100:"oklch(94.8% 0.028 342.258)",200:"oklch(89.9% 0.061 343.231)",300:"oklch(82.3% 0.12 346.018)",400:"oklch(71.8% 0.202 349.761)",500:"oklch(65.6% 0.241 354.308)",600:"oklch(59.2% 0.249 0.584)",700:"oklch(52.5% 0.223 3.958)",800:"oklch(45.9% 0.187 3.815)",900:"oklch(40.8% 0.153 2.432)",950:"oklch(28.4% 0.109 3.907)"},rose:{50:"oklch(96.9% 0.015 12.422)",100:"oklch(94.1% 0.03 12.58)",200:"oklch(89.2% 0.058 10.001)",300:"oklch(81% 0.117 11.638)",400:"oklch(71.2% 0.194 13.428)",500:"oklch(64.5% 0.246 16.439)",600:"oklch(58.6% 0.253 17.585)",700:"oklch(51.4% 0.222 16.935)",800:"oklch(45.5% 0.188 13.697)",900:"oklch(41% 0.159 10.272)",950:"oklch(27.1% 0.105 12.094)"},slate:{50:"oklch(98.4% 0.003 247.858)",100:"oklch(96.8% 0.007 247.896)",200:"oklch(92.9% 0.013 255.508)",300:"oklch(86.9% 0.022 252.894)",400:"oklch(70.4% 0.04 256.788)",500:"oklch(55.4% 0.046 257.417)",600:"oklch(44.6% 0.043 257.281)",700:"oklch(37.2% 0.044 257.287)",800:"oklch(27.9% 0.041 260.031)",900:"oklch(20.8% 0.042 265.755)",950:"oklch(12.9% 0.042 264.695)"},gray:{50:"oklch(98.5% 0.002 247.839)",100:"oklch(96.7% 0.003 264.542)",200:"oklch(92.8% 0.006 264.531)",300:"oklch(87.2% 0.01 258.338)",400:"oklch(70.7% 0.022 261.325)",500:"oklch(55.1% 0.027 264.364)",600:"oklch(44.6% 0.03 256.802)",700:"oklch(37.3% 0.034 259.733)",800:"oklch(27.8% 0.033 256.848)",900:"oklch(21% 0.034 264.665)",950:"oklch(13% 0.028 261.692)"},zinc:{50:"oklch(98.5% 0 0)",100:"oklch(96.7% 0.001 286.375)",200:"oklch(92% 0.004 286.32)",300:"oklch(87.1% 0.006 286.286)",400:"oklch(70.5% 0.015 286.067)",500:"oklch(55.2% 0.016 285.938)",600:"oklch(44.2% 0.017 285.786)",700:"oklch(37% 0.013 285.805)",800:"oklch(27.4% 0.006 286.033)",900:"oklch(21% 0.006 285.885)",950:"oklch(14.1% 0.005 285.823)"},neutral:{50:"oklch(98.5% 0 0)",100:"oklch(97% 0 0)",200:"oklch(92.2% 0 0)",300:"oklch(87% 0 0)",400:"oklch(70.8% 0 0)",500:"oklch(55.6% 0 0)",600:"oklch(43.9% 0 0)",700:"oklch(37.1% 0 0)",800:"oklch(26.9% 0 0)",900:"oklch(20.5% 0 0)",950:"oklch(14.5% 0 0)"},stone:{50:"oklch(98.5% 0.001 106.423)",100:"oklch(97% 0.001 106.424)",200:"oklch(92.3% 0.003 48.717)",300:"oklch(86.9% 0.005 56.366)",400:"oklch(70.9% 0.01 56.259)",500:"oklch(55.3% 0.013 58.071)",600:"oklch(44.4% 0.011 73.639)",700:"oklch(37.4% 0.01 67.558)",800:"oklch(26.8% 0.007 34.298)",900:"oklch(21.6% 0.006 56.043)",950:"oklch(14.7% 0.004 49.25)"},mauve:{50:"oklch(98.5% 0 0)",100:"oklch(96% 0.003 325.6)",200:"oklch(92.2% 0.005 325.62)",300:"oklch(86.5% 0.012 325.68)",400:"oklch(71.1% 0.019 323.02)",500:"oklch(54.2% 0.034 322.5)",600:"oklch(43.5% 0.029 321.78)",700:"oklch(36.4% 0.029 323.89)",800:"oklch(26.3% 0.024 320.12)",900:"oklch(21.2% 0.019 322.12)",950:"oklch(14.5% 0.008 326)"},olive:{50:"oklch(98.8% 0.003 106.5)",100:"oklch(96.6% 0.005 106.5)",200:"oklch(93% 0.007 106.5)",300:"oklch(88% 0.011 106.6)",400:"oklch(73.7% 0.021 106.9)",500:"oklch(58% 0.031 107.3)",600:"oklch(46.6% 0.025 107.3)",700:"oklch(39.4% 0.023 107.4)",800:"oklch(28.6% 0.016 107.4)",900:"oklch(22.8% 0.013 107.4)",950:"oklch(15.3% 0.006 107.1)"},mist:{50:"oklch(98.7% 0.002 197.1)",100:"oklch(96.3% 0.002 197.1)",200:"oklch(92.5% 0.005 214.3)",300:"oklch(87.2% 0.007 219.6)",400:"oklch(72.3% 0.014 214.4)",500:"oklch(56% 0.021 213.5)",600:"oklch(45% 0.017 213.2)",700:"oklch(37.8% 0.015 216)",800:"oklch(27.5% 0.011 216.9)",900:"oklch(21.8% 0.008 223.9)",950:"oklch(14.8% 0.004 228.8)"},taupe:{50:"oklch(98.6% 0.002 67.8)",100:"oklch(96% 0.002 17.2)",200:"oklch(92.2% 0.005 34.3)",300:"oklch(86.8% 0.007 39.5)",400:"oklch(71.4% 0.014 41.2)",500:"oklch(54.7% 0.021 43.1)",600:"oklch(43.8% 0.017 39.3)",700:"oklch(36.7% 0.016 35.7)",800:"oklch(26.8% 0.011 36.5)",900:"oklch(21.4% 0.009 43.1)",950:"oklch(14.7% 0.004 49.3)"}},Hc={"220.9 39.3% 11%":"gray","210 20% 98%":"gray","12 76% 61%":"gray","220 70% 50%":"gray"},wi=new Map;for(let e of Bc)for(let t of Wc)wi.set(ki(zc[e][t]),e);function bi(e){let t=ki(e);return t?wi.get(t)??Hc[t]??null:null}function ki(e){if(!e)return "";let t=e.trim().replace(/\s+/g," ").toLowerCase();if(!t.startsWith("oklch(")||!t.endsWith(")"))return t;let r=t.slice(6,-1).trim(),[n]=r.split(/\s*\/\s*/),o=n.split(/\s+/);if(o.length<3)return t;let i=Gr(o[0],{percentage:true}),s=Gr(o[1]),l=Gr(o[2]);return `oklch(${i} ${s} ${l})`}function Gr(e,t={}){return t.percentage&&e.endsWith("%")?yi(Number.parseFloat(e)/100):yi(Number.parseFloat(e))}function yi(e){return Number.isNaN(e)?"":Number(e.toFixed(12)).toString()}var Zc=new Set(c$3),Xc=new Set(g$2),Qc=new Set(k),el=new Set(l),tl=new Set(h$1),rl=new Set(i),nl=new Set(d$2),ol=new Set(["eb-garamond","instrument-serif","lora","merriweather","playfair-display","noto-serif","roboto-slab"]),il=new Set(["jetbrains-mono","geist-mono"]),vt=["--font-sans","--font-serif","--font-mono"],Si=new Set(vt),sl=[...vt,"--font-heading"],Ii=new Set(sl),Ci={appliedBodyVariable:null,variables:{}},al={0:"none","0rem":"none","0.45rem":"small","0.625rem":"default","0.875rem":"large"};async function fr(e,t){let r=ll(e.style);if(!r)return {code:null,fallbacks:[],values:null};let n=Z[r],o=await cl(e.resolvedPaths.tailwindCss),i=cr(Zc,e.tailwind.baseColor),s=pl(o),l=ul(o),a=cr(Xc,e.iconLibrary),f=Ri(o,Ci),m=f??n.font,p$1=vi(o,m,Ci);if(!f||!p$1){let I=t;if(t===void 0)try{I=await Fa$1(e.resolvedPaths.cwd,{configCssFile:e.tailwind.css});}catch{I=null;}let x=await wl(e,I);f??=Ri(o,x),m=f??n.font,p$1??=vi(o,m,x);}let u=gl(p$1??n.fontHeading,m,n.fontHeading),h=dl(o.rootVars["--radius"]),g=cr(Qc,e.menuAccent),y=cr(el,e.menuColor),k={style:r,baseColor:i??n.baseColor,theme:s??n.theme,chartColor:l??n.chartColor,iconLibrary:a??n.iconLibrary,font:m,fontHeading:u,radius:h??n.radius,menuAccent:g??n.menuAccent,menuColor:y??n.menuColor},C=[!i&&"baseColor",!s&&"theme",!l&&"chartColor",!a&&"iconLibrary",!f&&"font",!p$1&&"fontHeading",!h&&"radius",!g&&"menuAccent",!y&&"menuColor"].filter(Boolean);return {code:p(k),fallbacks:C,values:k}}async function cl(e){let t={darkVars:{},imports:[],rootVars:{},themeVars:{}};if(!e)return t;try{let r=await promises.readFile(e,"utf8");return fl(r)}catch{return t}}function ll(e){if(!e)return null;let t=e.replace(/^(base|radix)-/,"");return t in Z?t:null}function fl(e){let t=P$1.parse(e),r={darkVars:{},imports:[],rootVars:{},themeVars:{}};return t.walkAtRules("import",n=>{let o=ml(n.params);o&&r.imports.push(o);}),t.walkRules(n=>{let o=n.selector.split(",").map(i=>i.trim()).filter(Boolean);o.includes(":root")&&Kr(n,r.rootVars),o.includes(".dark")&&Kr(n,r.darkVars);}),t.walkAtRules("theme",n=>{n.params.trim()==="inline"&&Kr(n,r.themeVars);}),r}function Kr(e,t){for(let r of e.nodes??[])r.type!=="decl"||!r.prop.startsWith("--")||(t[r.prop]=r.value.trim());}function ml(e){let t=e.trim();return (t.match(/^url\((['"]?)(.+?)\1\)$/)??t.match(/^(['"])(.+?)\1$/))?.[2]??null}function pl(e){let t=lr(e.rootVars["--primary"]);if(!t)return null;let r=e.darkVars["--primary"];return r?lr(r)===t?t:null:t}function ul(e){let t=lr(e.rootVars["--chart-1"]);if(!t)return null;let r=e.darkVars["--chart-1"];return r?lr(r)===t?t:null:t}function lr(e){let t=bi(e);return !t||!nl.has(t)?null:t}function dl(e){if(!e)return null;let t=mr(e);return al[t]??null}function Ri(e,t){for(let r of vt){let n=$i(e,r);if(n)return n}for(let r of vt){let n=hl(e.imports,r);if(n)return n}return yl(t)}function vi(e,t,r){let n=Yr(e,"--font-heading"),o=n?Ei(n):null;if(o)return o===t?"inherit":o;let i=r.variables["--font-heading"],s=Pi(e,"--font-heading");if(!s)return i&&i!==t?i:null;let l=qr(s);if(l&&Si.has(l)){let a=$i(e,l),f=r.variables[l],m=a??f??null;return !m||m===t?"inherit":m}return l==="--font-heading"?i?i===t?"inherit":i:null:i&&i!==t?i:null}function gl(e,t,r){let n=e===t?"inherit":e;return rl.has(n)?n:r}function Yr(e,t,r=new Set){if(r.has(t))return null;r.add(t);let n=Pi(e,t);if(!n)return null;let o=qr(n);return o?Ii.has(o)?Yr(e,o,r):null:n}function Pi(e,t){let r=e.themeVars[t];return r&&qr(r)!==t?r:e.rootVars[t]??r??null}function qr(e){return mr(e).match(/^var\((--[a-z0-9-]+)\)$/)?.[1]??null}function $i(e,t){let r=Yr(e,t),n=r?Ei(r):null;return n||null}function hl(e,t){let r=e.flatMap(n=>{let o=Il(n);return o&&$l(o)===t?[o]:[]});return r.length===1?r[0]:null}function yl(e){if(e.appliedBodyVariable&&e.variables[e.appliedBodyVariable])return e.variables[e.appliedBodyVariable]??null;let t=vt.map(r=>e.variables[r]).filter(Boolean).filter((r,n,o)=>o.indexOf(r)===n);return t.length===1?t[0]:null}async function wl(e,t){let r={appliedBodyVariable:null,variables:{}};if(!t||t.framework.name!=="next-app"&&t.framework.name!=="next-pages")return r;let n=bl(e,t);if(!n)return r;try{let o=await promises.readFile(n,"utf8");return kl(o,t.framework.name)}catch{return r}}function bl(e,t){let r=t.isTsx?"tsx":"jsx",n=t.framework.name==="next-app"?t.isSrcDir?[`src/app/layout.${r}`,`app/layout.${r}`]:[`app/layout.${r}`]:t.isSrcDir?[`src/pages/_app.${r}`,`pages/_app.${r}`]:[`pages/_app.${r}`];for(let o of n){let i=A__default.join(e.resolvedPaths.cwd,o);if(existsSync(i))return i}return null}function kl(e,t){let n=new Project({compilerOptions:{}}).createSourceFile("font-source.tsx",e,{overwrite:true,scriptKind:ScriptKind.TSX}),o=new Map;for(let l of n.getImportDeclarations())if(l.getModuleSpecifierValue()==="next/font/google")for(let a of l.getNamedImports()){let f=a.getName(),m=a.getAliasNode()?.getText()??f,p=Pl(f);p&&o.set(m,p);}let i={},s=new Map;for(let l of n.getVariableStatements())for(let a of l.getDeclarations()){let f=a.getInitializer();if(!f?.isKind(SyntaxKind.CallExpression))continue;let m=o.get(f.getExpression().getText());if(!m)continue;let p=Cl(f);p&&(s.set(a.getName(),p),i[p]=m);}return {appliedBodyVariable:Rl(n,s,t),variables:i}}function Cl(e){let t=e.getArguments()[0];if(!t||!Node.isObjectLiteralExpression(t))return null;let r=t.getProperty("variable");if(!r||!Node.isPropertyAssignment(r))return null;let n=r.getInitializer();if(!n)return null;let o=ji(n.getText());return Ii.has(o)?o:null}function Rl(e,t,r){let n=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement).filter(i=>r==="next-app"?i.getTagNameNode().getText()==="html":true),o=new Set;for(let i of n){let s=i.getAttribute("className");if(!s||!Node.isJsxAttribute(s))continue;let l=s.getInitializer();if(!l)continue;let a=vl(l,t),f=xl(l);if(f&&a.includes(f))return f;a.length===1&&o.add(a[0]);}return o.size===1?Array.from(o)[0]:null}function vl(e,t){let r=Node.isJsxExpression(e)?[e.getExpression(),...e.getDescendantsOfKind(SyntaxKind.PropertyAccessExpression)].filter(Boolean):[],n=new Set;for(let o of r){if(!o||!Node.isPropertyAccessExpression(o)||o.getName()!=="variable")continue;let i=o.getExpression().getText(),s=t.get(i);s&&Si.has(s)&&n.add(s);}return Array.from(n)}function xl(e){let t=Sl(e);return /\bfont-sans\b/.test(t)?"--font-sans":/\bfont-serif\b/.test(t)?"--font-serif":/\bfont-mono\b/.test(t)?"--font-mono":null}function Sl(e){let t=[];(Node.isStringLiteral(e)||Node.isNoSubstitutionTemplateLiteral(e))&&t.push(e.getLiteralValue());for(let r of e.getDescendantsOfKind(SyntaxKind.StringLiteral))t.push(r.getLiteralValue());for(let r of e.getDescendantsOfKind(SyntaxKind.NoSubstitutionTemplateLiteral))t.push(r.getLiteralValue());return t.length>0?t.join(" "):e.getText()}function ji(e){return e.replace(/^['"]|['"]$/g,"")}function Ei(e){if(!e)return null;let t=ji(e.split(",")[0]?.trim()??"").replace(/\s+variable$/i,"").trim();return t?Zr(t.replace(/\s+/g,"-")):null}function Il(e){if(!e)return null;let t=mr(e),r="@fontsource-variable/";return t.startsWith(r)?Zr(t.slice(r.length)):null}function Pl(e){return e?Zr(e.replace(/_/g,"-")):null}function Zr(e){let t=mr(e);return tl.has(t)?t:null}function $l(e){return il.has(e)?"--font-mono":ol.has(e)?"--font-serif":"--font-sans"}function mr(e){return e?e.trim().replace(/\s+/g," ").replace(/\s*,\s*/g,", ").replace(/"/g,"'").toLowerCase():""}function cr(e,t){return t&&e.has(t)?t:null}var Ti=`${a}/code/apps/v4/registry/bases`,Ai=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=A__default.resolve(e.cwd);if(!existsSync(A__default.resolve(t,"components.json"))&&await f(t)){let l=await g(t);l.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:l.map(a=>a.name)},null,2)):h("info",l),process.exit(1));}let r=await Fa$1(t),n=await Y(t),o=await Ia(t),i=ba$1(n?.style),s=await Tl(r,n,o,i);if(e.json){console.log(JSON.stringify(s,null,2));return}Al(s);}catch(t){oa$1(t);}});function Fl(e){if(!e)return {};let t={};for(let[r,n]of Object.entries(e))t[r]=typeof n=="string"?n:n.url;return t}async function Tl(e,t,r,n){let o=t?await fr(t,e):null;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:Fl(t.registries)}:null,preset:o,components:r,links:{docs:`${a}/docs`,components:`${a}/docs/components/${n}/[component].md`,ui:`${Ti}/${n}/ui/[component].tsx`,examples:`${Ti}/${n}/examples/[component]-example.tsx`,schema:`${a}/schema.json`}}}function Al(e$1){e.log(d.info("Project")),e$1.project?Se({framework:`${e$1.project.framework} (${e$1.project.frameworkName})`,frameworkVersion:e$1.project.frameworkVersion??"-",srcDirectory:e$1.project.srcDirectory?"Yes":"No",rsc:e$1.project.rsc?"Yes":"No",typescript:e$1.project.typescript?"Yes":"No",tailwindVersion:e$1.project.tailwindVersion??"-",tailwindConfig:e$1.project.tailwindConfig??"-",tailwindCss:e$1.project.tailwindCss??"-",importAlias:e$1.project.importAlias??"-"}):e.log(" No project info detected."),e.break(),e.log(d.info("Configuration")),e$1.config?(Se({style:e$1.config.style,base:e$1.config.base,rsc:e$1.config.rsc?"Yes":"No",typescript:e$1.config.typescript?"Yes":"No",iconLibrary:e$1.config.iconLibrary??"-",rtl:e$1.config.rtl?"Yes":"No",menuColor:e$1.config.menuColor??"-",menuAccent:e$1.config.menuAccent??"-"}),e.break(),pr(e$1.preset),e.break(),e.log(d.info("Aliases")),Se({components:e$1.config.aliases.components,utils:e$1.config.aliases.utils,ui:e$1.config.aliases.ui??"-",lib:e$1.config.aliases.lib??"-",hooks:e$1.config.aliases.hooks??"-"}),e.break(),e.log(d.info("Resolved Paths")),Se({cwd:e$1.config.resolvedPaths.cwd,tailwindConfig:e$1.config.resolvedPaths.tailwindConfig??"-",tailwindCss:e$1.config.resolvedPaths.tailwindCss??"-",utils:e$1.config.resolvedPaths.utils,components:e$1.config.resolvedPaths.components,lib:e$1.config.resolvedPaths.lib,hooks:e$1.config.resolvedPaths.hooks,ui:e$1.config.resolvedPaths.ui}),Object.keys(e$1.config.registries).length>0&&(e.break(),e.log("registries:"),Se(e$1.config.registries))):e.log(" No components.json found."),e.break(),e.log(d.info("Installed Components")),e$1.components.length>0?e.log(` ${e$1.components.join(", ")}`):e.log(" No components installed."),e.break(),e.log(d.info("Links")),Se(e$1.links),e.break();}function pr(e$1,t={}){if(e.log(d.info("Preset")),!e$1?.code)Se({code:"-"});else {let r=e$1.fallbacks??[],n=(o,i)=>{let s=r.includes(o)?"*":"";return `${i??"-"}${s}`};Se({code:e$1.code,version:e$1.code[0],style:e$1.values?.style??"-",baseColor:n("baseColor",e$1.values?.baseColor),theme:n("theme",e$1.values?.theme),chartColor:n("chartColor",e$1.values?.chartColor),iconLibrary:n("iconLibrary",e$1.values?.iconLibrary),font:n("font",e$1.values?.font),fontHeading:n("fontHeading",e$1.values?.fontHeading),radius:n("radius",e$1.values?.radius),menuAccent:n("menuAccent",e$1.values?.menuAccent),menuColor:n("menuColor",e$1.values?.menuColor),url:`${a}/create?preset=${e$1.code}`}),r.length>0&&(e.log(""),e.log(t.fallbackNote??" * Uses preset defaults for values not available as options on shadcn/create."));}}function Se(e$1){let t=Math.max(...Object.keys(e$1).map(r=>r.length));for(let[r,n]of Object.entries(e$1))e.log(` ${r.padEnd(t+2)}${n}`);}var Me="latest",dr=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${Me}`,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${Me}`,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{shadcn:{command:"npx",args:[`shadcn@${Me}`,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.shadcn]
|
|
159
159
|
command = "npx"
|
|
160
160
|
args = ["shadcn@${Me}", "mcp"]
|
|
161
|
-
`},{name:"opencode",label:"OpenCode",configPath:"opencode.json",config:{$schema:"https://opencode.ai/config.json",mcp:{shadcn:{type:"local",command:["npx",`shadcn@${Me}`,"mcp"],enabled:true}}}}],ur=[`shadcn@${Me}`],Qr=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$1=>{try{await ee(e$1.cwd);let t=new StdioServerTransport;await a$2.connect(t);}catch(t){e.break(),
|
|
161
|
+
`},{name:"opencode",label:"OpenCode",configPath:"opencode.json",config:{$schema:"https://opencode.ai/config.json",mcp:{shadcn:{type:"local",command:["npx",`shadcn@${Me}`,"mcp"],enabled:true}}}}],ur=[`shadcn@${Me}`],Qr=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$1=>{try{await ee(e$1.cwd);let t=new StdioServerTransport;await a$2.connect(t);}catch(t){e.break(),oa$1(t);}}),_l=Xr.object({client:Xr.enum(["claude","cursor","vscode","codex","opencode"]),cwd:Xr.string()});Qr.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${dr.map(e=>e.name).join(", ")})`).action(async(e$1,t)=>{try{let n=(t.parent?.opts()||{}).cwd||process.cwd(),o=e$1.client;if(!o){let f=await ve({type:"select",name:"client",message:"Which MCP client are you using?",choices:dr.map(m=>({title:m.label,value:m.name}))});f.client||(e.break(),process.exit(1)),o=f.client;}let i=_l.parse({client:o,cwd:n}),s=await Y(i.cwd);if(i.client==="codex"){if(s)await _([],ur,s,{silent:!1});else {let f=await la$1(i.cwd),m=f==="npm"?"install":"add",p=f==="npm"?"--save-dev":"-D",u=E("Installing dependencies...").start();await execa(f,[m,p,...ur],{cwd:i.cwd}),u.succeed("Installing dependencies.");}e.break(),e.log("To configure the shadcn MCP server in Codex:"),e.break(),e.log(`1. Open or create the file ${d.info("~/.codex/config.toml")}`),e.log("2. Add the following configuration:"),e.log(),e.info(`[mcp_servers.shadcn]
|
|
162
162
|
command = "npx"
|
|
163
|
-
args = ["shadcn@${Me}", "mcp"]`),e.break(),e.info("3. Restart Codex to load the MCP server"),e.break(),process.exit(0);}let l=E("Configuring MCP server...").start(),a=await
|
|
164
|
-
`,"utf-8"),n.configPath}var
|
|
165
|
-
`),s.succeed("Updated package.json."),await _(["radix-ui"],[],e$1,{silent:!1});}e.info(""),e.info("Migration complete. The following packages may be removed if no longer in use:"),e.info(d.info(a.join(", "))),e.info("Please review your codebase before removing.");}else s.succeed("No packages found in source files.");}catch{s.fail("Failed to update package.json"),e.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui");}}async function
|
|
163
|
+
args = ["shadcn@${Me}", "mcp"]`),e.break(),e.info("3. Restart Codex to load the MCP server"),e.break(),process.exit(0);}let l=E("Configuring MCP server...").start(),a=await Ml(i);if(l.succeed("Configuring MCP server."),s)await _([],ur,s,{silent:!1});else {let f=await la$1(i.cwd),m=f==="npm"?"install":"add",p=f==="npm"?"--save-dev":"-D",u=E("Installing dependencies...").start();await execa(f,[m,p,...ur],{cwd:i.cwd}),u.succeed("Installing dependencies.");}e.break(),e.success(`Configuration saved to ${a}.`),e.break();}catch(r){oa$1(r);}});var Ul=(e,t)=>t;async function Ml(e){let{client:t,cwd:r}=e,n=dr.find(a=>a.name===t);if(!n)throw new Error(`Unknown client: ${t}. Available clients: ${dr.map(a=>a.name).join(", ")}`);let o=A__default.join(r,n.configPath),i=A__default.dirname(o);await L.ensureDir(i);let s={};try{let a=await promises.readFile(o,"utf-8");s=JSON.parse(a);}catch{}let l=vo(s,n.config,{arrayMerge:Ul});return await promises.writeFile(o,JSON.stringify(l,null,2)+`
|
|
164
|
+
`,"utf-8"),n.configPath}var Ie={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 Li(e$1){if(!e$1.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$1.resolvedPaths.ui,[r,n]=await Promise.all([tn("**/*.{js,ts,jsx,tsx}",{cwd:t}),va()]);if(Object.keys(n).length===0)throw new Error("Something went wrong fetching the registry icons.");let o=Object.entries(Ie).map(([m,p])=>({title:p.name,value:m})),i=await ve([{type:"select",name:"sourceLibrary",message:`Which icon library would you like to ${d.info("migrate from")}?`,choices:o},{type:"select",name:"targetLibrary",message:`Which icon library would you like to ${d.info("migrate to")}?`,choices:o}]);if(i.sourceLibrary===i.targetLibrary)throw new Error("You cannot migrate to the same icon library. Please choose a different icon library.");if(!(i.sourceLibrary in Ie&&i.targetLibrary in Ie))throw new Error("Invalid icon library. Please choose a valid icon library.");let s=Ie[i.sourceLibrary],l=Ie[i.targetLibrary],{confirm:a}=await ve({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${d.info(r.length)} files in ${d.info(`./${A__default.relative(e$1.resolvedPaths.cwd,t)}`)} from ${d.info(s.name)} to ${d.info(l.name)}. Continue?`});a||(e.info("Migration cancelled."),process.exit(0)),l.package&&await _([l.package],[],e$1,{silent:false});let f=E("Migrating icons...")?.start();await Promise.all(r.map(async m=>{f.text=`Migrating ${m}...`;let p=A__default.join(t,m),u=await promises.readFile(p,"utf-8"),h=await Kl(u,i.sourceLibrary,i.targetLibrary,n);await promises.writeFile(p,h);})),f.succeed("Migration complete.");}async function Kl(e,t,r,n){let o=Ie[t]?.import,i=Ie[r]?.import,s=await promises.mkdtemp(A__default.join(tmpdir(),"shadcn-")),l=new Project({compilerOptions:{}}),a=A__default.join(s,`shadcn-icons-${randomBytes(4).toString("hex")}.tsx`),f=l.createSourceFile(a,e,{scriptKind:ScriptKind.TSX}),m=[];for(let p of f.getImportDeclarations()??[])if(p.getModuleSpecifier()?.getText()===`"${o}"`){for(let u of p.getNamedImports()??[]){let h=u.getName(),g=Object.values(n).find(y=>y[t]===h)?.[r];!g||m.includes(g)||(m.push(g),u.remove(),f.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).filter(y=>y.getTagNameNode()?.getText()===h).forEach(y=>y.getTagNameNode()?.replaceWithText(g)));}p.getNamedImports()?.length===0&&p.remove();}return m.length>0&&f.addImportDeclaration({moduleSpecifier:i,namedImports:m.map(p=>({name:p}))}),await f.getText()}function ql(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function Zl(e,t,r,n){let i=e.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").trim().split(",").map(s=>s.trim()).filter(Boolean);for(let s of i){let l=s.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?$/),a=s.match(/^(\w+)\s+as\s+(\w+)$/);if(l){let f=l[1],m=l[2];n==="slot"&&f==="Slot"&&!m?r.push({name:"Slot",alias:"SlotPrimitive",isType:true}):r.push({name:f,alias:m,isType:true});}else if(a){let f=a[1],m=a[2];n==="slot"&&f==="Slot"&&m==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:f,alias:m,isType:t});}else n==="slot"&&s==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:s,isType:t});}}async function _i(e$1,t={}){let r,n;if(t.path){if(n=e$1.resolvedPaths.cwd,t.path.includes("*"))r=await tn(t.path,{cwd:n,onlyFiles:true,ignore:["**/node_modules/**"]});else {let a=A__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 tn("**/*.{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$1.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$1.resolvedPaths.ui,r=await tn("**/*.{js,ts,jsx,tsx}",{cwd:n,onlyFiles:true});}if(!t.yes){let l=t.path?t.path:`./${A__default.relative(e$1.resolvedPaths.cwd,n)}`,{confirm:a}=await ve({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${d.info(r.length)} file(s) in ${d.info(l)} to ${d.info("radix-ui")}. Continue?`});a||(e.info("Migration cancelled."),process.exit(0));}let o=E("Migrating imports...")?.start(),i=new Set;await Promise.all(r.map(async l=>{o.text=`Migrating ${l}...`;let a=A__default.join(n,l),f=await promises.readFile(a,"utf-8"),{content:m,replacedPackages:p}=await Xl(f);p.forEach(u=>i.add(u)),await promises.writeFile(a,m);})),o.succeed("Migrating imports.");let s=E("Updating package.json...")?.start();try{let l=y(e$1.resolvedPaths.cwd,!1);if(!l){s.fail("Could not read package.json"),e.warn("Could not update package.json. You may need to manually replace @radix-ui/react-* packages with radix-ui");return}let a=Array.from(i);if(a.length>0){if(l.dependencies||(l.dependencies={}),l.dependencies?.["radix-ui"]||l.devDependencies?.["radix-ui"])s.succeed("radix-ui already in package.json.");else {l.dependencies["radix-ui"]="latest";let m=A__default.join(e$1.resolvedPaths.cwd,"package.json");await promises.writeFile(m,JSON.stringify(l,null,2)+`
|
|
165
|
+
`),s.succeed("Updated package.json."),await _(["radix-ui"],[],e$1,{silent:!1});}e.info(""),e.info("Migration complete. The following packages may be removed if no longer in use:"),e.info(d.info(a.join(", "))),e.info("Please review your codebase before removing.");}else s.succeed("No packages found in source files.");}catch{s.fail("Failed to update package.json"),e.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui");}}async function Xl(e){let t=/import\s+(?:(type)\s+)?(?:\*\s+as\s+(\w+)|{([^}]+)})\s+from\s+(["'])@radix-ui\/react-([^"']+)\4(;?)/g,r=[],n=[],o=[],i='"',s=false,l=e,a;for(;(a=t.exec(e))!==null;){let[g,y,k,C,I,x,R]=a;if(x==="icons"||x.startsWith("icons/"))continue;n.push(g),n.length===1&&(i=I,s=R===";"),o.push(`@radix-ui/react-${x}`);let $=!!y;if(k){let U=ql(x);r.push({name:U,alias:k,isType:$});}else C&&Zl(C,$,r,x);}if(r.length===0)return {content:e,replacedPackages:[]};let f=r.filter((g,y,k)=>y===k.findIndex(C=>C.name===g.name&&C.alias===g.alias&&C.isType===g.isType)),p=`import { ${f.map(g=>{let y=g.isType?"type ":"";return g.alias?`${y}${g.name} as ${g.alias}`:`${y}${g.name}`}).join(", ")} } from ${i}radix-ui${i}${s?";":""}`;l=n.reduce((g,y,k)=>g.replace(y,k===0?p:""),l),l=l.replace(/\n\s*\n\s*\n/g,`
|
|
166
166
|
|
|
167
167
|
`),f.some(g=>g.name==="Slot"&&g.alias==="SlotPrimitive")&&(l=l.split(`
|
|
168
168
|
`).map(k=>{if(k.trim().startsWith("import "))return k;let C=k;return C=C.replace(/\b(asChild\s*\?\s*)Slot(\s*:)/g,"$1__SLOT_PLACEHOLDER__$2"),C=C.replace(/\bReact\.ComponentProps<typeof\s+Slot>/g,"React.ComponentProps<typeof __SLOT_PLACEHOLDER__>"),C=C.replace(/\bComponentProps<typeof\s+Slot>/g,"ComponentProps<typeof __SLOT_PLACEHOLDER__>"),C=C.replace(/(<\/?)Slot(\s*\/?>)/g,"$1__SLOT_PLACEHOLDER__$2"),C=C.replace(/\bSlot\b/g,(I,x,R)=>{let $=R.substring(0,x),U=($.match(/"/g)||[]).length,Y=($.match(/'/g)||[]).length;return U%2!==0||Y%2!==0?I:"__SLOT_PLACEHOLDER__"}),C=C.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),C}).join(`
|
|
169
|
-
`));let h=Array.from(new Set(o));return {content:l,replacedPackages:h}}var
|
|
170
|
-
`),o.succeed("Updated components.json.");}catch{throw o.fail("Failed to update components.json."),new Error("Could not update components.json. Please manually set `rtl: true`.")}let i=E("Migrating files to RTL...").start(),s=0,l=[];if(await Promise.all(r.map(async a=>{i.text=`Migrating ${a}...`;let f=A__default.join(n,a),m=await promises.readFile(f,"utf-8"),p=await e$1(m,true);p!==m&&(await promises.writeFile(f,p),s++);let u=A__default.basename(a);
|
|
171
|
-
Before you can run a migration, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),e.error(`Learn more at ${d.info(`${a}/docs/components-json`)}.`),e.break(),process.exit(1);}}var Mi=[{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)."}],tf=z.object({cwd:z.string(),list:z.boolean(),yes:z.boolean(),migration:z.string().refine(e=>e&&Mi.some(t=>t.name===e),{message:"You must specify a valid migration. Run `shadcn migrate --list` to see available migrations."}).optional(),path:z.string().optional()}),Wi=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$1,t,r)=>{try{let n=tf.parse({cwd:A__default.resolve(r.cwd),migration:e$1,path:t,list:r.list,yes:r.yes});if(n.list||!n.migration){e.info("Available migrations:");for(let s of Mi)e.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:o,config:i}=await Ui(n);if(o["1"]||o["3"])throw new Error("No `components.json` file found. Ensure you are at the root of your project.");if(!i)throw new Error("Something went wrong reading your `components.json` file. Please ensure you have a valid `components.json` file.");n.migration==="icons"&&await Di(i),n.migration==="radix"&&await Vi(i,{yes:n.yes,path:n.path}),n.migration==="rtl"&&await Li(i,{yes:n.yes,path:n.path});}catch(n){e.break(),ma$1(n);}});function of(e){return `${a}/create?preset=${e}`}function on(e){let t=q(e);if(!t)throw new Error(`Invalid preset code: ${e}`);let r=[],n=t.chartColor??f$3[t.theme]??t.theme;return t.chartColor||r.push("chartColor"),{code:e,version:e[0],values:{...t,chartColor:n},derived:r,url:of(e)}}function sf(e){pr({code:e.code,fallbacks:e.derived,values:e.values},{fallbackNote:" * Compatibility value for older preset versions."});}var af=new Command().name("decode").description("decode a preset code").argument("<code>","the preset code to decode").option("--json","output as JSON.",false).action((e,t)=>{try{let r=on(e);if(t.json){console.log(JSON.stringify({code:r.code,version:r.version,values:r.values,derived:r.derived,url:r.url},null,2));return}sf(r);}catch(r){wr(r);}}),cf=new Command().name("url").description("get the create URL for a preset code").argument("<code>","the preset code").action(e$1=>{try{e.log(on(e$1).url);}catch(t){wr(t);}}),lf=new Command().name("open").description("open a preset code in the browser").argument("<code>","the preset code").action(async e$1=>{let t;try{t=on(e$1).url;}catch(r){wr(r);return}e.break(),e.log(` Opening ${t} in your browser.`),e.break();try{await ds(t);}catch(r){let n=r instanceof Error?r.message:String(r);wr(new Error(`Failed to open preset URL: ${n}`));}}),ff=new Command().name("resolve").alias("info").description("resolve a preset from 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$1=>{try{let t=A__default.resolve(e$1.cwd);if(!existsSync(A__default.resolve(t,"components.json"))&&await f(t)){let i=await g(t);i.length>0&&(e$1.json?console.log(JSON.stringify({error:"monorepo_root",message:"You are running preset resolve from a monorepo root. Use the -c flag to specify a workspace.",targets:i.map(s=>s.name)},null,2)):h("preset resolve",i),process.exit(1));}let r=await X$1(t);if(!r){if(e$1.json){console.log(JSON.stringify(null,null,2));return}e.log("No components.json found.");return}let n=await Da(t),o=await fr(r,n);if(e$1.json){console.log(JSON.stringify(o.code?o:null,null,2));return}pr(o);}catch(t){ma$1(t);}}),sn=new Command().name("preset").description("manage presets").addCommand(af).addCommand(ff).addCommand(cf).addCommand(lf).action(()=>{sn.outputHelp();});function wr(e$1){e$1 instanceof Error&&e.error(e$1.message),process.exit(1);}var uf=z.object({cwd:z.string(),silent:z.boolean()}),Ji=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$1,t)=>{try{let r=uf.parse({cwd:A__default.resolve(t.cwd),silent:t.silent}),n=e$1.length>0?e$1:await hf({silent:r.silent});await gf(n,r.cwd,{silent:r.silent});}catch(r){e.break(),ma$1(r);}});function df(e){let[t,...r]=e.split("="),n=r.length>0?r.join("="):void 0;if(!t.startsWith("@"))throw new Error(`Invalid registry namespace: ${d.info(t)}. Registry names must start with @ (e.g., @acme).`);return {namespace:t,url:n}}function ln(e,t,r){return `${e} ${e===1?t:r}`}async function gf(e$1,t,r){let n=A__default.resolve(t,"components.json");if(!L.existsSync(n))throw new Error(`No ${d.info("components.json")} found. Run ${d.info("shadcn init")} first.`);let o=e$1.map(df),i=o.filter(g=>!g.url),s=[];if(i.length>0){let g=E("Fetching registries.",{silent:r.silent}).start(),y=await za$1();if(!y)throw g.fail(),new Error("Failed to fetch registries.");g.succeed(),s=y;}let l={};for(let{namespace:g,url:y}of o){if(g in b){e.warn(`${d.info(g)} is a built-in registry and cannot be added.`);continue}if(y){if(!y.includes("{name}"))throw new Error(`Invalid registry URL for ${d.info(g)}. URL must include {name} placeholder. Example: ${d.info(`${g}=https://example.com/r/{name}.json`)}`);l[g]=y;}else {let k=s.find(C=>C.name===g);if(!k)throw new Error(`Registry ${d.info(g)} not found. Provide a URL: ${d.info(`${g}=https://.../{name}.json`)}`);l[g]=k.url;}}if(Object.keys(l).length===0)return {addedRegistries:[]};let a=await L.readJson(n),f=a.registries||{},m={},p=[];for(let[g,y]of Object.entries(l))f[g]?p.push(g):m[g]=y;if(Object.keys(m).length===0){if(p.length>0&&!r.silent){E(`Skipped ${ln(p.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let g of p)e.log(` - ${g}`);}else r.silent||e.info("No new registries to add.");return}let u={...a,registries:{...f,...m}},h=E("Updating components.json.",{silent:r.silent}).start();if(await L.writeJson(n,u,{spaces:2}),h.succeed(),!r.silent){let g=Object.keys(m);E(`Added ${ln(g.length,"registry","registries")}:`,{silent:r.silent})?.succeed();for(let y of g)e.log(` - ${y}`);if(p.length>0){E(`Skipped ${ln(p.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let y of p)e.log(` - ${y}`);}}}async function hf(e$1){let t=E("Fetching registries.",{silent:e$1.silent}).start(),r=await za$1();if(!r)throw t.fail(),new Error("Failed to fetch registries.");t.succeed();let n=[...r].sort((i,s)=>i.name.localeCompare(s.name)),{selected:o}=await Re({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(i=>({title:i.name,description:i.description,value:i.name}))});return o?.length||(e.warn("No registries selected. Exiting."),e.info(""),process.exit(1)),o}var Hi=32,yf=f$2.options.filter(e=>e!=="registry:example"&&e!=="registry:internal"),wf=z.record(z.string(),z.unknown()),bf=z.array(z.string()),kf=z.array(z.unknown());async function Ki(e){let t=A.resolve(e.cwd),r=A.resolve(t,e.registryFile),n={cwd:t,rootFile:r,usesInclude:false,diagnostics:[],registryFiles:new Set,checkedRegistryFiles:new Set,itemsChecked:0,itemSourcesByItem:new Map,firstIncludedFrom:new Map};if(A.basename(r)!=="registry.json"&&N(n,{registryFile:r,message:"Root source registry file must be named registry.json.",suggestion:"Rename the file to registry.json and pass that file to shadcn registry validate."}),!un(r,t))return N(n,{registryFile:r,message:`Root registry file must stay inside ${st(t,t)}.`,suggestion:"Run the command from the registry root or pass a registry.json file inside --cwd."}),mn(n);let o=await qi(r,n);if(!o)return mn(n);n.usesInclude=!!o.include?.length,Cf(o,r,n);let i=await Yi(r,o,n,[]);return vf(i,n),await xf(i,n),mn(n)}async function Yi(e,t,r,n){if(n.length>=Hi)return N(r,{registryFile:e,message:`Registry include tree is too deep. The maximum include depth is ${Hi}.`,suggestion:"Flatten part of the registry include tree or reduce nested include depth."}),[];if(n.includes(e))return N(r,{registryFile:e,message:`Registry include cycle detected: ${Ff([...n,e])}.`,suggestion:"Remove one include so the registry graph is acyclic."}),[];let o=n.at(-1)??e,i=r.firstIncludedFrom.get(e);if(i)return N(r,{registryFile:e,message:`Registry file included more than once. First included from ${st(i,r.cwd)}, then included from ${st(o,r.cwd)}.`,suggestion:"Remove one include or move shared items into a single included registry.json."}),[];r.registryFiles.add(e),r.firstIncludedFrom.set(e,o);let s=A.dirname(e),l=[...n,e],a=[];for(let m of t.include??[]){let p=Rf(m,e,s,r);if(!p)continue;let u=await qi(p,r);if(!u)continue;let h=await Yi(p,u,r,l);a.push(...h);}let f=!r.usesInclude&&e===r.rootFile?r.cwd:s;return t.items.forEach((m,p)=>{r.itemSourcesByItem.set(m,{registryFile:e,registryDir:f,itemIndex:p});}),[...a,...t.items]}async function qi(e,t){t.checkedRegistryFiles.add(e);let r;try{r=await bt.readFile(e,"utf-8");}catch{return N(t,{registryFile:e,message:"Registry file was not found or could not be read.",suggestion:"Check that the registry.json file exists and is readable."}),null}let n;try{n=JSON.parse(r);}catch{return N(t,{registryFile:e,message:"Registry file contains invalid JSON.",suggestion:"Fix the JSON syntax in the registry.json file."}),null}return Pf(n,e,t)}function Cf(e,t,r){!e.name&&!e.hasName&&N(r,{registryFile:t,message:'Root registry.json must define "name".',suggestion:'Add a top-level "name" field to the root registry.json.'}),!e.homepage&&!e.hasHomepage&&N(r,{registryFile:t,message:'Root registry.json must define "homepage".',suggestion:'Add a top-level "homepage" field to the root registry.json.'});}function Rf(e,t,r,n){if(Q$1(e))return N(n,{registryFile:t,includePath:e,message:`Remote include "${e}" is not supported.`,suggestion:"Use a relative path to an explicit registry.json file in the same repository."}),null;if(A.isAbsolute(e))return N(n,{registryFile:t,includePath:e,message:`Include "${e}" must be relative.`,suggestion:'Use a path like "components/ui/registry.json".'}),null;if(Zi(e))return N(n,{registryFile:t,includePath:e,message:`Include "${e}" cannot use parent-directory traversal.`,suggestion:"Registry includes must descend from the including chunk. Move shared registries into the registry root and include them from there."}),null;if(A.basename(e)!=="registry.json")return N(n,{registryFile:t,includePath:e,message:`Include "${e}" must explicitly reference a registry.json file.`,suggestion:'Use a path like "components/ui/registry.json".'}),null;let o=A.resolve(r,e);return un(o,n.cwd)?o:(N(n,{registryFile:t,includePath:e,message:`Include "${e}" must stay inside ${st(n.cwd,n.cwd)}.`,suggestion:"Keep included registry.json files inside the registry root."}),null)}function vf(e,t){let r=new Map;for(let n of e){let o=r.get(n.name);if(!o){r.set(n.name,n);continue}let i=t.itemSourcesByItem.get(o),s=t.itemSourcesByItem.get(n);N(t,{registryFile:s?.registryFile??t.rootFile,itemName:n.name,itemIndex:s?.itemIndex,message:`Duplicate registry item name "${n.name}". First defined at ${Tf(i,t.cwd)}.`,suggestion:"Rename one of these items so each name is unique across the resolved registry."});}}async function xf(e,t){let r=Ef(t);for(let n$1 of e){let o=t.itemSourcesByItem.get(n$1),i={...If(n$1,t,r),$schema:"https://ui.shadcn.com/schema/registry-item.json"};for(let l=0;l<(n$1.files?.length??0);l++){let a=n$1.files?.[l];if(!a||!o)continue;let f=Sf(n$1,a.path,o,t);if(f)try{await bt.readFile(f,"utf-8");}catch{N(t,{registryFile:o.registryFile,itemName:n$1.name,itemIndex:o.itemIndex,filePath:a.path,message:`File "${a.path}" was not found or could not be read.`,suggestion:"Make sure the file path is relative to the registry.json file that declares the item."});}}let s=n.safeParse(i);s.success||Pt(s.error,o?.registryFile??t.rootFile,t,{itemName:n$1.name,itemIndex:o?.itemIndex,suggestion:"Update the registry item so the built item matches the registry item schema."});}}function Sf(e,t,r,n){if(Q$1(t))return N(n,{registryFile:r.registryFile,itemName:e.name,itemIndex:r.itemIndex,filePath:t,message:`File path "${t}" cannot be remote.`,suggestion:"Use a local file path relative to the registry.json file that declares the item."}),null;if(A.isAbsolute(t))return N(n,{registryFile:r.registryFile,itemName:e.name,itemIndex:r.itemIndex,filePath:t,message:`File path "${t}" must be relative.`,suggestion:"Use a local file path relative to the registry.json file that declares the item."}),null;if(Zi(t))return N(n,{registryFile:r.registryFile,itemName:e.name,itemIndex:r.itemIndex,filePath:t,message:`File path "${t}" cannot use parent-directory traversal.`,suggestion:"Keep item files inside the registry chunk directory."}),null;let o=A.resolve(r.registryDir,t);return un(o,r.registryDir)?o:(N(n,{registryFile:r.registryFile,itemName:e.name,itemIndex:r.itemIndex,filePath:t,message:`File path "${t}" must stay inside the registry chunk directory.`,suggestion:"Move the file into the same registry chunk directory or update the registry item path."}),null)}function If(e,t,r){let n=t.itemSourcesByItem.get(e);return {...e,files:e.files?.map(o=>{let i=A.resolve(n?.registryDir??t.cwd,o.path);return {...o,path:A.relative(r,i).split(A.sep).join("/")}})}}function Pf(e,t,r){let n=wf.safeParse(e);if(!n.success)return Pt(n.error,t,r,{suggestion:"Update the registry.json file so it matches the schema."}),null;let o=n.data,i={$schema:fn(o,"$schema",t,r),name:fn(o,"name",t,r),homepage:fn(o,"homepage",t,r),hasName:o.name!==void 0,hasHomepage:o.homepage!==void 0,items:[]};if(o.include!==void 0){let s=bf.safeParse(o.include);s.success?i.include=s.data:Pt(s.error,t,r,{pathPrefix:["include"],suggestion:"Update include so it is an array of registry.json paths."});}if(o.items!==void 0){let s=kf.safeParse(o.items);s.success?(r.itemsChecked+=s.data.length,i.items=$f(s.data,t,r)):Pt(s.error,t,r,{pathPrefix:["items"],suggestion:"Update items so it is an array of registry items."});}return o.items===void 0&&o.include===void 0&&N(r,{registryFile:t,message:"Registry must define at least one of `items` or `include`.",suggestion:'Add an "items" array, an "include" array, or both to registry.json.'}),i}function $f(e,t,r){let n$1=[];return e.forEach((o,i)=>{let s=n.safeParse(o);if(!s.success){Pt(s.error,t,r,{itemName:jf(o),itemIndex:i,suggestion:"Update the registry item so it matches the registry item schema."});return}n$1.push(s.data);}),n$1}function fn(e,t,r,n){let o=e[t];if(o!==void 0){if(typeof o=="string")return o;N(n,{registryFile:r,message:`${t}: Expected string, received ${typeof o}.`,suggestion:`Update "${t}" so it is a string.`});}}function jf(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e.name;return typeof t=="string"?t:void 0}function Pt(e,t,r,n){for(let o of e.errors)N(r,{registryFile:t,itemName:n.itemName,itemIndex:n.itemIndex,message:Af(o,n.pathPrefix),suggestion:n.suggestion});}function N(e,t){e.diagnostics.push(t);}function mn(e,t){return {valid:e.diagnostics.length===0,cwd:e.cwd,registryFiles:e.checkedRegistryFiles.size,registryFilePaths:Array.from(e.checkedRegistryFiles),items:e.itemsChecked,diagnostics:e.diagnostics}}function Ef(e){return e.usesInclude?A.dirname(e.rootFile):e.cwd}function Zi(e){return e.split(/[\\/]+/).includes("..")}function un(e,t){let r=A.relative(t,e);return !!r&&!r.startsWith("..")&&!A.isAbsolute(r)}function Ff(e){return e.map(t=>st(t,A.dirname(e[0]))).join(" -> ")}function Tf(e,t){return e?`${st(e.registryFile,t)} items[${e.itemIndex}]`:"unknown source"}function Gi(e){return e.length?e.join("."):"(root)"}function Af(e,t=[]){let r=[...t,...e.path];return e.code===z.ZodIssueCode.invalid_union_discriminator&&e.path.at(-1)==="type"?`${Gi(r)}: Invalid registry item type. Expected ${yf.map(n=>`"${n}"`).join(" | ")}.`:`${Gi(r)}: ${e.message}`}function st(e,t){let r=A.relative(t,e);return r&&!r.startsWith("..")&&!A.isAbsolute(r)?r.split(A.sep).join("/"):r?e:"."}var Of=z.object({cwd:z.string(),registryFile:z.string()}),es=new Command().name("validate").description("validate a shadcn registry").argument("[registry]","path to registry.json file","./registry.json").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e$1,t)=>{let r;try{let n=Of.parse({cwd:A.resolve(t.cwd),registryFile:e$1});r=E("Validating registry.").start();let o=await Ki(n);Df(o,r),o.valid||(process.exitCode=1);}catch(n){r?.fail("Registry validation failed."),e.break(),ma$1(n);}});function Df(e$1,t){if(e$1.valid){t.succeed("Registry is valid."),Xi(e$1,{success:true});return}t.fail("Registry validation failed."),Xi(e$1),e.break();for(let[r,n]of Array.from(Vf(e$1))){e.log(d.info(ts(r,e$1.cwd)));for(let o of n)e.error(` - ${Lf(o)}`),o.suggestion&&e.log(` ${o.suggestion}`);e.break();}}function Xi(e$1,t={}){let r=`Checked ${Qi(e$1.registryFiles,"registry file","registry files")} and ${Qi(e$1.items,"item","items")}.`;t.success?_f(r):e.log(` ${r}`);for(let n of e$1.registryFilePaths)e.log(` - ${ts(n,e$1.cwd)}`);}function Vf(e){let t=new Map;for(let r of e.diagnostics){let n=t.get(r.registryFile)??[];n.push(r),t.set(r.registryFile,n);}return t}function Lf(e){let t=[];return e.itemIndex!==void 0&&t.push(`items[${e.itemIndex}]`),e.itemName&&t.push(`"${e.itemName}"`),e.includePath&&t.push(`include "${e.includePath}"`),e.filePath&&t.push(`file "${e.filePath}"`),t.length?`${t.join(" ")}: ${e.message}`:e.message}function ts(e,t){let r=A.relative(t,e);return r&&!r.startsWith("..")&&!A.isAbsolute(r)?r.split(A.sep).join("/"):r?e:"."}function _f(e){E(e).succeed();}function Qi(e,t,r){return `${e} ${e===1?t:r}`}var rs=new Command().name("registry").description("manage registries").addCommand(Ji).addCommand(es);var Wf=z.object({cwd:z.string(),query:z.string().optional(),limit:z.number().optional(),offset:z.number().optional()}),is=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=Wf.parse({cwd:A__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 ee(r.cwd);let n=ba({style:"new-york",resolvedPaths:{cwd:r.cwd}}),o=ca$1(n),i=A__default.resolve(r.cwd,"components.json");if(L.existsSync(i)){let m=await L.readJson(i),p=c.partial().parse(m);o=ca$1({...n,...p});}let s=o;try{let m=await X$1(r.cwd);m&&(s=ca$1(m));}catch{}let{config:l,newRegistries:a}=await H(e.map(m=>`${m}/registry`),s,{silent:!0,writeFile:!1});a.length>0&&(s.registries=l.registries),ea$1(e,s);let f=await Ma$1(e,{query:r.query,limit:r.limit,offset:r.offset,config:s});console.log(JSON.stringify(f,null,2)),process.exit(0);}catch(r){ma$1(r);}finally{da$1();}});var zf=z.object({cwd:z.string()}),ls=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=zf.parse({cwd:A__default.resolve(t.cwd)});await ee(r.cwd);let n=ca$1({}),o=A__default.resolve(r.cwd,"components.json");if(L.existsSync(o)){let f=await L.readJson(o),m=c.partial().parse(f);n=ca$1(m);}let i=n;try{let f=await X$1(r.cwd);f&&(i=ca$1(f));}catch{}let{config:s,newRegistries:l}=await H(e,i,{silent:!0,writeFile:!1});l.length>0&&(i.registries=s.registries),ea$1(e,i);let a=await oa$1(e,{config:i});console.log(JSON.stringify(a,null,2)),process.exit(0);}catch(r){ma$1(r);}finally{da$1();}});process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function Hf(){let e=new Command().name("shadcn").description("build your component library").version(la$1.version||"1.0.0","-v, --version","display the version number");e.addCommand(Lo).addCommand(ni).addCommand(Xo).addCommand(fi).addCommand(pi).addCommand(ls).addCommand(is).addCommand(Wi).addCommand(di).addCommand(Fi).addCommand(ci).addCommand(Qr).addCommand(sn).addCommand(rs),e.parse();}Hf();
|
|
169
|
+
`));let h=Array.from(new Set(o));return {content:l,replacedPackages:h}}var ef=["sidebar.tsx","pagination.tsx","calendar.tsx"],tf=`${a}/docs/rtl#manual-migration-optional`;async function Ui(e$2,t={}){let r,n;if(t.path){if(n=e$2.resolvedPaths.cwd,t.path.includes("*"))r=await tn(t.path,{cwd:n,onlyFiles:true,ignore:["**/node_modules/**"]});else {let f=A__default.resolve(n,t.path),m=await promises.stat(f).catch(()=>null);if(!m)throw new Error(`File not found: ${t.path}`);if(m.isDirectory())n=f,r=await tn("**/*.{js,ts,jsx,tsx}",{cwd:n,onlyFiles:true,ignore:["**/node_modules/**"]});else if(m.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$2.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$2.resolvedPaths.ui,r=await tn("**/*.{js,ts,jsx,tsx}",{cwd:n,onlyFiles:true});}if(!t.yes){let a=t.path?t.path:`./${A__default.relative(e$2.resolvedPaths.cwd,n)}`,{confirm:f}=await ve({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${d.info(r.length)} file(s) in ${d.info(a)} to RTL. Continue?`});f||(e.info("Migration cancelled."),process.exit(0));}let o=E("Updating components.json...").start();try{let a=A__default.resolve(e$2.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)+`
|
|
170
|
+
`),o.succeed("Updated components.json.");}catch{throw o.fail("Failed to update components.json."),new Error("Could not update components.json. Please manually set `rtl: true`.")}let i=E("Migrating files to RTL...").start(),s=0,l=[];if(await Promise.all(r.map(async a=>{i.text=`Migrating ${a}...`;let f=A__default.join(n,a),m=await promises.readFile(f,"utf-8"),p=await e$1(m,true);p!==m&&(await promises.writeFile(f,p),s++);let u=A__default.basename(a);ef.includes(u)&&l.push(a);})),i.succeed(`Migration complete. ${s} file(s) transformed.`),l.length>0){e.break(),e.warn("The following components may need manual RTL adjustments:");for(let a of l)e.info(` - ${a}`);e.break(),e.info(`See ${d.info(tf)} for more information.`);}}async function Wi(e$1){let t={};if(!L.existsSync(e$1.cwd)||!L.existsSync(A__default.resolve(e$1.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!L.existsSync(A__default.resolve(e$1.cwd,"components.json")))return t["3"]=true,{errors:t,config:null};try{let r=await Y(e$1.cwd);return {errors:t,config:r}}catch{e.break(),e.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e$1.cwd)}.
|
|
171
|
+
Before you can run a migration, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),e.error(`Learn more at ${d.info(`${a}/docs/components-json`)}.`),e.break(),process.exit(1);}}var Bi=[{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)."}],of=z.object({cwd:z.string(),list:z.boolean(),yes:z.boolean(),migration:z.string().refine(e=>e&&Bi.some(t=>t.name===e),{message:"You must specify a valid migration. Run `shadcn migrate --list` to see available migrations."}).optional(),path:z.string().optional()}),zi=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$1,t,r)=>{try{let n=of.parse({cwd:A__default.resolve(r.cwd),migration:e$1,path:t,list:r.list,yes:r.yes});if(n.list||!n.migration){e.info("Available migrations:");for(let s of Bi)e.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:o,config:i}=await Wi(n);if(o["1"]||o["3"])throw new Error("No `components.json` file found. Ensure you are at the root of your project.");if(!i)throw new Error("Something went wrong reading your `components.json` file. Please ensure you have a valid `components.json` file.");n.migration==="icons"&&await Li(i),n.migration==="radix"&&await _i(i,{yes:n.yes,path:n.path}),n.migration==="rtl"&&await Ui(i,{yes:n.yes,path:n.path});}catch(n){e.break(),oa$1(n);}});function cf(e){return `${a}/create?preset=${e}`}function on(e){let t=q(e);if(!t)throw new Error(`Invalid preset code: ${e}`);let r=[],n=t.chartColor??f$3[t.theme]??t.theme;return t.chartColor||r.push("chartColor"),{code:e,version:e[0],values:{...t,chartColor:n},derived:r,url:cf(e)}}function lf(e){pr({code:e.code,fallbacks:e.derived,values:e.values},{fallbackNote:" * Compatibility value for older preset versions."});}var ff=new Command().name("decode").description("decode a preset code").argument("<code>","the preset code to decode").option("--json","output as JSON.",false).action((e,t)=>{try{let r=on(e);if(t.json){console.log(JSON.stringify({code:r.code,version:r.version,values:r.values,derived:r.derived,url:r.url},null,2));return}lf(r);}catch(r){wr(r);}}),mf=new Command().name("url").description("get the create URL for a preset code").argument("<code>","the preset code").action(e$1=>{try{e.log(on(e$1).url);}catch(t){wr(t);}}),pf=new Command().name("open").description("open a preset code in the browser").argument("<code>","the preset code").action(async e$1=>{let t;try{t=on(e$1).url;}catch(r){wr(r);return}e.break(),e.log(` Opening ${t} in your browser.`),e.break();try{await ys(t);}catch(r){let n=r instanceof Error?r.message:String(r);wr(new Error(`Failed to open preset URL: ${n}`));}}),uf=new Command().name("resolve").alias("info").description("resolve a preset from 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$1=>{try{let t=A__default.resolve(e$1.cwd);if(!existsSync(A__default.resolve(t,"components.json"))&&await f(t)){let i=await g(t);i.length>0&&(e$1.json?console.log(JSON.stringify({error:"monorepo_root",message:"You are running preset resolve from a monorepo root. Use the -c flag to specify a workspace.",targets:i.map(s=>s.name)},null,2)):h("preset resolve",i),process.exit(1));}let r=await Y(t);if(!r){if(e$1.json){console.log(JSON.stringify(null,null,2));return}e.log("No components.json found.");return}let n=await Fa$1(t),o=await fr(r,n);if(e$1.json){console.log(JSON.stringify(o.code?o:null,null,2));return}pr(o);}catch(t){oa$1(t);}}),sn=new Command().name("preset").description("manage presets").addCommand(ff).addCommand(uf).addCommand(mf).addCommand(pf).action(()=>{sn.outputHelp();});function wr(e$1){e$1 instanceof Error&&e.error(e$1.message),process.exit(1);}var hf=z.object({cwd:z.string(),silent:z.boolean()}),Gi=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$1,t)=>{try{let r=hf.parse({cwd:A__default.resolve(t.cwd),silent:t.silent}),n=e$1.length>0?e$1:await bf({silent:r.silent});await wf(n,r.cwd,{silent:r.silent});}catch(r){e.break(),oa$1(r);}});function yf(e){let[t,...r]=e.split("="),n=r.length>0?r.join("="):void 0;if(!t.startsWith("@"))throw new Error(`Invalid registry namespace: ${d.info(t)}. Registry names must start with @ (e.g., @acme).`);return {namespace:t,url:n}}function ln(e,t,r){return `${e} ${e===1?t:r}`}async function wf(e$1,t,r){let n=A__default.resolve(t,"components.json");if(!L.existsSync(n))throw new Error(`No ${d.info("components.json")} found. Run ${d.info("shadcn init")} first.`);let o=e$1.map(yf),i=o.filter(g=>!g.url),s=[];if(i.length>0){let g=E("Fetching registries.",{silent:r.silent}).start(),y=await Ba$1();if(!y)throw g.fail(),new Error("Failed to fetch registries.");g.succeed(),s=y;}let l={};for(let{namespace:g,url:y}of o){if(g in b){e.warn(`${d.info(g)} is a built-in registry and cannot be added.`);continue}if(y){if(!y.includes("{name}"))throw new Error(`Invalid registry URL for ${d.info(g)}. URL must include {name} placeholder. Example: ${d.info(`${g}=https://example.com/r/{name}.json`)}`);l[g]=y;}else {let k=s.find(C=>C.name===g);if(!k)throw new Error(`Registry ${d.info(g)} not found. Provide a URL: ${d.info(`${g}=https://.../{name}.json`)}`);l[g]=k.url;}}if(Object.keys(l).length===0)return {addedRegistries:[]};let a=await L.readJson(n),f=a.registries||{},m={},p=[];for(let[g,y]of Object.entries(l))f[g]?p.push(g):m[g]=y;if(Object.keys(m).length===0){if(p.length>0&&!r.silent){E(`Skipped ${ln(p.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let g of p)e.log(` - ${g}`);}else r.silent||e.info("No new registries to add.");return}let u={...a,registries:{...f,...m}},h=E("Updating components.json.",{silent:r.silent}).start();if(await L.writeJson(n,u,{spaces:2}),h.succeed(),!r.silent){let g=Object.keys(m);E(`Added ${ln(g.length,"registry","registries")}:`,{silent:r.silent})?.succeed();for(let y of g)e.log(` - ${y}`);if(p.length>0){E(`Skipped ${ln(p.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let y of p)e.log(` - ${y}`);}}}async function bf(e$1){let t=E("Fetching registries.",{silent:e$1.silent}).start(),r=await Ba$1();if(!r)throw t.fail(),new Error("Failed to fetch registries.");t.succeed();let n=[...r].sort((i,s)=>i.name.localeCompare(s.name)),{selected:o}=await ve({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(i=>({title:i.name,description:i.description,value:i.name}))});return o?.length||(e.warn("No registries selected. Exiting."),e.info(""),process.exit(1)),o}var Ki=32,kf=f$2.options.filter(e=>e!=="registry:example"&&e!=="registry:internal"),Cf=z.record(z.string(),z.unknown()),Rf=z.array(z.string()),vf=z.array(z.unknown());async function qi(e){let t=A.resolve(e.cwd),r=A.resolve(t,e.registryFile),n={cwd:t,rootFile:r,usesInclude:false,diagnostics:[],registryFiles:new Set,checkedRegistryFiles:new Set,itemsChecked:0,itemSourcesByItem:new Map,firstIncludedFrom:new Map};if(A.basename(r)!=="registry.json"&&N(n,{registryFile:r,message:"Root source registry file must be named registry.json.",suggestion:"Rename the file to registry.json and pass that file to shadcn registry validate."}),!un(r,t))return N(n,{registryFile:r,message:`Root registry file must stay inside ${st(t,t)}.`,suggestion:"Run the command from the registry root or pass a registry.json file inside --cwd."}),mn(n);let o=await Xi(r,n);if(!o)return mn(n);n.usesInclude=!!o.include?.length,xf(o,r,n);let i=await Zi(r,o,n,[]);return If(i,n),await Pf(i,n),mn(n)}async function Zi(e,t,r,n){if(n.length>=Ki)return N(r,{registryFile:e,message:`Registry include tree is too deep. The maximum include depth is ${Ki}.`,suggestion:"Flatten part of the registry include tree or reduce nested include depth."}),[];if(n.includes(e))return N(r,{registryFile:e,message:`Registry include cycle detected: ${Nf([...n,e])}.`,suggestion:"Remove one include so the registry graph is acyclic."}),[];let o=n.at(-1)??e,i=r.firstIncludedFrom.get(e);if(i)return N(r,{registryFile:e,message:`Registry file included more than once. First included from ${st(i,r.cwd)}, then included from ${st(o,r.cwd)}.`,suggestion:"Remove one include or move shared items into a single included registry.json."}),[];r.registryFiles.add(e),r.firstIncludedFrom.set(e,o);let s=A.dirname(e),l=[...n,e],a=[];for(let m of t.include??[]){let p=Sf(m,e,s,r);if(!p)continue;let u=await Xi(p,r);if(!u)continue;let h=await Zi(p,u,r,l);a.push(...h);}let f=!r.usesInclude&&e===r.rootFile?r.cwd:s;return t.items.forEach((m,p)=>{r.itemSourcesByItem.set(m,{registryFile:e,registryDir:f,itemIndex:p});}),[...a,...t.items]}async function Xi(e,t){t.checkedRegistryFiles.add(e);let r;try{r=await bt.readFile(e,"utf-8");}catch{return N(t,{registryFile:e,message:"Registry file was not found or could not be read.",suggestion:"Check that the registry.json file exists and is readable."}),null}let n;try{n=JSON.parse(r);}catch{return N(t,{registryFile:e,message:"Registry file contains invalid JSON.",suggestion:"Fix the JSON syntax in the registry.json file."}),null}return Ef(n,e,t)}function xf(e,t,r){!e.name&&!e.hasName&&N(r,{registryFile:t,message:'Root registry.json must define "name".',suggestion:'Add a top-level "name" field to the root registry.json.'}),!e.homepage&&!e.hasHomepage&&N(r,{registryFile:t,message:'Root registry.json must define "homepage".',suggestion:'Add a top-level "homepage" field to the root registry.json.'});}function Sf(e,t,r,n){if(Q$1(e))return N(n,{registryFile:t,includePath:e,message:`Remote include "${e}" is not supported.`,suggestion:"Use a relative path to an explicit registry.json file in the same repository."}),null;if(A.isAbsolute(e))return N(n,{registryFile:t,includePath:e,message:`Include "${e}" must be relative.`,suggestion:'Use a path like "components/ui/registry.json".'}),null;if(Qi(e))return N(n,{registryFile:t,includePath:e,message:`Include "${e}" cannot use parent-directory traversal.`,suggestion:"Registry includes must descend from the including chunk. Move shared registries into the registry root and include them from there."}),null;if(A.basename(e)!=="registry.json")return N(n,{registryFile:t,includePath:e,message:`Include "${e}" must explicitly reference a registry.json file.`,suggestion:'Use a path like "components/ui/registry.json".'}),null;let o=A.resolve(r,e);return un(o,n.cwd)?o:(N(n,{registryFile:t,includePath:e,message:`Include "${e}" must stay inside ${st(n.cwd,n.cwd)}.`,suggestion:"Keep included registry.json files inside the registry root."}),null)}function If(e,t){let r=new Map;for(let n of e){let o=r.get(n.name);if(!o){r.set(n.name,n);continue}let i=t.itemSourcesByItem.get(o),s=t.itemSourcesByItem.get(n);N(t,{registryFile:s?.registryFile??t.rootFile,itemName:n.name,itemIndex:s?.itemIndex,message:`Duplicate registry item name "${n.name}". First defined at ${Of(i,t.cwd)}.`,suggestion:"Rename one of these items so each name is unique across the resolved registry."});}}async function Pf(e,t){let r=Af(t);for(let n$1 of e){let o=t.itemSourcesByItem.get(n$1),i={...jf(n$1,t,r),$schema:"https://ui.shadcn.com/schema/registry-item.json"};for(let l=0;l<(n$1.files?.length??0);l++){let a=n$1.files?.[l];if(!a||!o)continue;let f=$f(n$1,a.path,o,t);if(f)try{await bt.readFile(f,"utf-8");}catch{N(t,{registryFile:o.registryFile,itemName:n$1.name,itemIndex:o.itemIndex,filePath:a.path,message:`File "${a.path}" was not found or could not be read.`,suggestion:"Make sure the file path is relative to the registry.json file that declares the item."});}}let s=n.safeParse(i);s.success||Pt(s.error,o?.registryFile??t.rootFile,t,{itemName:n$1.name,itemIndex:o?.itemIndex,suggestion:"Update the registry item so the built item matches the registry item schema."});}}function $f(e,t,r,n){if(Q$1(t))return N(n,{registryFile:r.registryFile,itemName:e.name,itemIndex:r.itemIndex,filePath:t,message:`File path "${t}" cannot be remote.`,suggestion:"Use a local file path relative to the registry.json file that declares the item."}),null;if(A.isAbsolute(t))return N(n,{registryFile:r.registryFile,itemName:e.name,itemIndex:r.itemIndex,filePath:t,message:`File path "${t}" must be relative.`,suggestion:"Use a local file path relative to the registry.json file that declares the item."}),null;if(Qi(t))return N(n,{registryFile:r.registryFile,itemName:e.name,itemIndex:r.itemIndex,filePath:t,message:`File path "${t}" cannot use parent-directory traversal.`,suggestion:"Keep item files inside the registry chunk directory."}),null;let o=A.resolve(r.registryDir,t);return un(o,r.registryDir)?o:(N(n,{registryFile:r.registryFile,itemName:e.name,itemIndex:r.itemIndex,filePath:t,message:`File path "${t}" must stay inside the registry chunk directory.`,suggestion:"Move the file into the same registry chunk directory or update the registry item path."}),null)}function jf(e,t,r){let n=t.itemSourcesByItem.get(e);return {...e,files:e.files?.map(o=>{let i=A.resolve(n?.registryDir??t.cwd,o.path);return {...o,path:A.relative(r,i).split(A.sep).join("/")}})}}function Ef(e,t,r){let n=Cf.safeParse(e);if(!n.success)return Pt(n.error,t,r,{suggestion:"Update the registry.json file so it matches the schema."}),null;let o=n.data,i={$schema:fn(o,"$schema",t,r),name:fn(o,"name",t,r),homepage:fn(o,"homepage",t,r),hasName:o.name!==void 0,hasHomepage:o.homepage!==void 0,items:[]};if(o.include!==void 0){let s=Rf.safeParse(o.include);s.success?i.include=s.data:Pt(s.error,t,r,{pathPrefix:["include"],suggestion:"Update include so it is an array of registry.json paths."});}if(o.items!==void 0){let s=vf.safeParse(o.items);s.success?(r.itemsChecked+=s.data.length,i.items=Ff(s.data,t,r)):Pt(s.error,t,r,{pathPrefix:["items"],suggestion:"Update items so it is an array of registry items."});}return o.items===void 0&&o.include===void 0&&N(r,{registryFile:t,message:"Registry must define at least one of `items` or `include`.",suggestion:'Add an "items" array, an "include" array, or both to registry.json.'}),i}function Ff(e,t,r){let n$1=[];return e.forEach((o,i)=>{let s=n.safeParse(o);if(!s.success){Pt(s.error,t,r,{itemName:Tf(o),itemIndex:i,suggestion:"Update the registry item so it matches the registry item schema."});return}n$1.push(s.data);}),n$1}function fn(e,t,r,n){let o=e[t];if(o!==void 0){if(typeof o=="string")return o;N(n,{registryFile:r,message:`${t}: Expected string, received ${typeof o}.`,suggestion:`Update "${t}" so it is a string.`});}}function Tf(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e.name;return typeof t=="string"?t:void 0}function Pt(e,t,r,n){for(let o of e.errors)N(r,{registryFile:t,itemName:n.itemName,itemIndex:n.itemIndex,message:Vf(o,n.pathPrefix),suggestion:n.suggestion});}function N(e,t){e.diagnostics.push(t);}function mn(e,t){return {valid:e.diagnostics.length===0,cwd:e.cwd,registryFiles:e.checkedRegistryFiles.size,registryFilePaths:Array.from(e.checkedRegistryFiles),items:e.itemsChecked,diagnostics:e.diagnostics}}function Af(e){return e.usesInclude?A.dirname(e.rootFile):e.cwd}function Qi(e){return e.split(/[\\/]+/).includes("..")}function un(e,t){let r=A.relative(t,e);return !!r&&!r.startsWith("..")&&!A.isAbsolute(r)}function Nf(e){return e.map(t=>st(t,A.dirname(e[0]))).join(" -> ")}function Of(e,t){return e?`${st(e.registryFile,t)} items[${e.itemIndex}]`:"unknown source"}function Yi(e){return e.length?e.join("."):"(root)"}function Vf(e,t=[]){let r=[...t,...e.path];return e.code===z.ZodIssueCode.invalid_union_discriminator&&e.path.at(-1)==="type"?`${Yi(r)}: Invalid registry item type. Expected ${kf.map(n=>`"${n}"`).join(" | ")}.`:`${Yi(r)}: ${e.message}`}function st(e,t){let r=A.relative(t,e);return r&&!r.startsWith("..")&&!A.isAbsolute(r)?r.split(A.sep).join("/"):r?e:"."}var Lf=z.object({cwd:z.string(),registryFile:z.string()}),ns=new Command().name("validate").description("validate a shadcn registry").argument("[registry]","registry address to validate. Supports registry.json paths and GitHub sources.","./registry.json").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e$1,t)=>{let r;try{let n=Lf.parse({cwd:A.resolve(t.cwd),registryFile:e$1}),o=await Bf(e$1,n.cwd);r=E("Validating registry.").start();let i=o?await ha$1(o):await qi(n);_f(i,r),i.valid||(process.exitCode=1);}catch(n){r?.fail("Registry validation failed."),e.break(),oa$1(n);}});function _f(e$1,t){if(e$1.valid){t.succeed("Registry is valid."),es(e$1,{success:true});return}t.fail("Registry validation failed."),es(e$1),e.break();for(let[r,n]of Array.from(Uf(e$1))){e.log(d.info(os(r,e$1.cwd)));for(let o of n)e.error(` - ${Mf(o)}`),o.suggestion&&e.log(` ${o.suggestion}`);e.break();}}function es(e$1,t={}){let r=`Checked ${ts(e$1.registryFiles,"registry file","registry files")} and ${ts(e$1.items,"item","items")}.`;t.success?Wf(r):e.log(` ${r}`);for(let n of e$1.registryFilePaths)e.log(` - ${os(n,e$1.cwd)}`);}function Uf(e){let t=new Map;for(let r of e.diagnostics){let n=t.get(r.registryFile)??[];n.push(r),t.set(r.registryFile,n);}return t}function Mf(e){let t=[];return e.itemIndex!==void 0&&t.push(`items[${e.itemIndex}]`),e.itemName&&t.push(`"${e.itemName}"`),e.includePath&&t.push(`include "${e.includePath}"`),e.filePath&&t.push(`file "${e.filePath}"`),t.length?`${t.join(" ")}: ${e.message}`:e.message}function os(e,t){let r=A.relative(t,e);return r&&!r.startsWith("..")&&!A.isAbsolute(r)?r.split(A.sep).join("/"):r?e:"."}function Wf(e){E(e).succeed();}function ts(e,t,r){return `${e} ${e===1?t:r}`}async function Bf(e,t){return zf(e)||await Hf(A.resolve(t,e))?null:S(e)}function zf(e){return e.startsWith(".")||A.isAbsolute(e)||e.endsWith(".json")}async function Hf(e){try{return await bt.access(e),!0}catch{return false}}var is=new Command().name("registry").description("manage registries").addCommand(Gi).addCommand(ns);var Kf=z.object({cwd:z.string(),query:z.string().optional(),limit:z.number().optional(),offset:z.number().optional()}),cs=new Command().name("search").alias("list").description("search items from registries").argument("<registries...>","the registry addresses to search. Supports namespaces, GitHub sources and URLs.").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=Kf.parse({cwd:A__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 ee(r.cwd);let n=ca$1({style:"new-york",resolvedPaths:{cwd:r.cwd}}),o=da$1(n),i=A__default.resolve(r.cwd,"components.json");if(L.existsSync(i)){let m=await L.readJson(i),p=c.partial().parse(m);o=da$1({...n,...p});}let s=o;try{let m=await Y(r.cwd);m&&(s=da$1(m));}catch{}let{config:l,newRegistries:a}=await J(e.filter(m=>m.startsWith("@")).map(m=>`${m}/registry`),s,{silent:!0,writeFile:!1});a.length>0&&(s.registries=l.registries),fa$1(e,s);let f=await Oa$1(e,{query:r.query,limit:r.limit,offset:r.offset,config:s});console.log(JSON.stringify(f,null,2)),process.exit(0);}catch(r){oa$1(r);}finally{ea$1();}});var qf=z.object({cwd:z.string()}),ps=new Command().name("view").description("view items from the registry").argument("<items...>","item addresses to view").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=qf.parse({cwd:A__default.resolve(t.cwd)});await ee(r.cwd);let n=da$1({}),o=A__default.resolve(r.cwd,"components.json");if(L.existsSync(o)){let f=await L.readJson(o),m=c.partial().parse(f);n=da$1(m);}let i=n;try{let f=await Y(r.cwd);f&&(i=da$1(f));}catch{}let{config:s,newRegistries:l}=await J(e,i,{silent:!0,writeFile:!1});l.length>0&&(i.registries=s.registries),fa$1(e,i);let a=await qa$1(e,{config:i});console.log(JSON.stringify(a,null,2)),process.exit(0);}catch(r){oa$1(r);}finally{ea$1();}});process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function Xf(){let e=new Command().name("shadcn").description("build your component library").version(na$1.version||"1.0.0","-v, --version","display the version number");e.addCommand(Uo).addCommand(ii).addCommand(ei).addCommand(pi).addCommand(di).addCommand(ps).addCommand(cs).addCommand(zi).addCommand(hi).addCommand(Ai).addCommand(fi).addCommand(Qr).addCommand(sn).addCommand(is),e.parse();}Xf();
|