UNPKG

shadcn

Version:

Add components to your apps.

53 lines (50 loc) 80.3 kB
#!/usr/bin/env node import {b as b$1,a as a$1}from'./chunk-SSXFFJQN.js';import {a,O,n,R as R$1,_,s,d,Y as Y$1,P,p,i,q,j,t,b,ca,ea,g,h,e,f,r,N,c as c$1,ba,K,ka,M,la,ha,fa,ia,J,L as L$1,Q,ma,ja,S,k,da,o as o$1,F,W,z as z$2,X,m,T as T$1,l,U,G,I,H as H$1,V}from'./chunk-I3JXSMK6.js';export{ha as fetchTree,ia as getItemTargetPath,la as getPreset,ka as getPresets,aa as getRegistriesConfig,ja as getRegistriesIndex,Z as getRegistry,fa as getRegistryBaseColor,ea as getRegistryBaseColors,da as getRegistryIcons,_ as getRegistryItems,ca as getRegistryStyles,ba as getShadcnRegistryIndex,$ as resolveRegistryItems,ga as resolveTree}from'./chunk-I3JXSMK6.js';import {c,o,n as n$1}from'./chunk-WKG3W635.js';import'./chunk-PMFK2ZSQ.js';import'./chunk-BFNVF2P5.js';import*as E from'path';import E__default,{join}from'path';import {promises,existsSync}from'fs';import R from'fs-extra';import v from'postcss';import ii from'postcss/lib/at-rule';import mt,{z as z$1}from'zod';import {execa}from'execa';import Fe from'prompts';import {SyntaxKind,Project,ScriptKind,VariableDeclarationKind}from'ts-morph';import et,{tmpdir}from'os';import {Command}from'commander';import fr from'deepmerge';import*as Y from'fs/promises';import Y__default from'fs/promises';import at from'dedent';import Rr from'open';import {diffLines}from'diff';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {randomBytes}from'crypto';import Dn from'fast-glob';async function Kt(e){let t$1={};if(!R.existsSync(e.cwd)||!R.existsSync(E__default.resolve(e.cwd,"package.json")))return t$1["1"]=true,{errors:t$1,projectInfo:null};let r=t("Preflight checks.",{silent:e.silent}).start();R.existsSync(E__default.resolve(e.cwd,"components.json"))&&!e.force&&(r?.fail(),s.break(),s.error(`A ${d.info("components.json")} file already exists at ${d.info(e.cwd)}. To start over, remove the ${d.info("components.json")} file and run ${d.info("init")} again.`),s.break(),process.exit(1)),r?.succeed();let i=t("Verifying framework.",{silent:e.silent}).start(),n=await p(e.cwd);(!n||n?.framework.name==="manual")&&(t$1["7"]=true,i?.fail(),s.break(),n?.framework.links.installation&&s.error(`We could not detect a supported framework at ${d.info(e.cwd)}. Visit ${d.info(n?.framework.links.installation)} to manually configure your project. Once configured, you can use the cli to add components.`),s.break(),process.exit(1)),i?.succeed(`Verifying framework. Found ${d.info(n.framework.label)}.`);let o="Validating Tailwind CSS.";n.tailwindVersion==="v4"&&(o=`Validating Tailwind CSS config. Found ${d.info("v4")}.`);let a=t(o,{silent:e.silent}).start();n.tailwindVersion==="v3"&&(!n?.tailwindConfigFile||!n?.tailwindCssFile)?(t$1["5"]=true,a?.fail()):n.tailwindVersion==="v4"&&!n?.tailwindCssFile?(t$1["5"]=true,a?.fail()):n.tailwindVersion?a?.succeed():(t$1["5"]=true,a?.fail());let s$1=t("Validating import alias.",{silent:e.silent}).start();return n?.aliasPrefix?s$1?.succeed():(t$1["6"]=true,s$1?.fail()),Object.keys(t$1).length>0&&(t$1["5"]&&(s.break(),s.error(`No Tailwind CSS configuration found at ${d.info(e.cwd)}.`),s.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),s.error("Install Tailwind CSS then try again."),n?.framework.links.tailwind&&s.error(`Visit ${d.info(n?.framework.links.tailwind)} to get started.`)),t$1["6"]&&(s.break(),s.error("No import alias found in your tsconfig.json file."),n?.framework.links.installation&&s.error(`Visit ${d.info(n?.framework.links.installation)} to learn how to set an import alias.`)),s.break(),process.exit(1)),{errors:t$1,projectInfo:n}}function qt(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 i=E__default.normalize(r.replace(/\\/g,"/")),n=E__default.normalize(t),o=u=>u.replace(/\[\.\.\..*?\]/g,"").includes("..");if(o(i)||o(r)||o(e))return false;let a=u=>u.replace(/\[\.\.\..*?\]/g,""),s=a(e),c=a(r);if([/\.\.[\/\\]/,/[\/\\]\.\./,/\.\./,/\.\.%/,/\x00/,/[\x01-\x1f]/].some(u=>u.test(s)||u.test(c))||(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(E__default.isAbsolute(i))return i.startsWith(n+E__default.sep);let p=E__default.resolve(n,i);return p.startsWith(n+E__default.sep)||p===n}async function Ke(e,t$1,r){if(!t$1.resolvedPaths.tailwindCss||!e||Object.keys(e).length===0)return;r={silent:false,...r};let i=t$1.resolvedPaths.tailwindCss,n=E__default.relative(t$1.resolvedPaths.cwd,i),o=t(`Updating ${d.info(n)}`,{silent:r.silent}).start(),a=await promises.readFile(i,"utf8"),s=await ei(a,e);await promises.writeFile(i,s,"utf8"),o.succeed();}async function ei(e,t){let r=[ti(t)],i=await v(r).process(e,{from:void 0}),n=i.css,o=i.root;if(o.nodes&&o.nodes.length>0){let a=o.nodes[o.nodes.length-1];a.type==="atrule"&&!a.nodes&&!n.trimEnd().endsWith(";")&&(n=n.trimEnd()+";");}return n=n.replace(/\/\* ---break--- \*\//g,""),n=n.replace(/(\n\s*\n)+/g,` `),n=n.trimEnd(),n}function ti(e){return {postcssPlugin:"update-css",Once(t){for(let[r,i]of Object.entries(e))if(r.startsWith("@")){let n=r.match(/@([a-zA-Z-]+)\s*(.*)/);if(!n)continue;let[,o,a]=n;if(o==="import"){if(!t.nodes?.find(c=>c.type==="atrule"&&c.name==="import"&&c.params===a)){let c=v.atRule({name:"import",params:a,raws:{semicolon:true}}),m=t.nodes?.filter(l=>l.type==="atrule"&&l.name==="import");if(m&&m.length>0){let l=m[m.length-1];c.raws.before=` `,t.insertAfter(l,c);}else !t.nodes||t.nodes.length,c.raws.before="",t.prepend(c);}}else if(o==="plugin"){let s=a;a&&!a.startsWith('"')&&!a.startsWith("'")&&(s=`"${a}"`);let c=l=>l.startsWith('"')&&l.endsWith('"')||l.startsWith("'")&&l.endsWith("'")?l.slice(1,-1):l;if(!t.nodes?.find(l=>l.type!=="atrule"||l.name!=="plugin"?false:c(l.params)===c(a))){let l=v.atRule({name:"plugin",params:s,raws:{semicolon:true,before:` `}}),p=t.nodes?.filter(g=>g.type==="atrule"&&g.name==="import"),u=t.nodes?.filter(g=>g.type==="atrule"&&g.name==="plugin");if(u&&u.length>0){let g=u[u.length-1];t.insertAfter(g,l);}else if(p&&p.length>0){let g=p[p.length-1];t.insertAfter(g,l),t.insertBefore(l,v.comment({text:"---break---"})),t.insertAfter(l,v.comment({text:"---break---"}));}else t.prepend(l),t.insertBefore(l,v.comment({text:"---break---"})),t.insertAfter(l,v.comment({text:"---break---"}));}}else if(typeof i=="object"&&Object.keys(i).length===0){if(!t.nodes?.find(c=>c.type==="atrule"&&c.name===o&&c.params===a)){let c=v.atRule({name:o,params:a,raws:{semicolon:true}});t.append(c),t.insertBefore(c,v.comment({text:"---break---"}));}}else if(o==="keyframes"){let s=t.nodes?.find(l=>l.type==="atrule"&&l.name==="theme"&&l.params==="inline");s||(s=v.atRule({name:"theme",params:"inline",raws:{semicolon:true,between:" ",before:` `}}),t.append(s),t.insertBefore(s,v.comment({text:"---break---"})));let c=s.nodes?.find(l=>l.type==="atrule"&&l.name==="keyframes"&&l.params===a),m;if(c?(m=v.atRule({name:"keyframes",params:a,raws:{semicolon:true,between:" ",before:` `}}),c.replaceWith(m)):(m=v.atRule({name:"keyframes",params:a,raws:{semicolon:true,between:" ",before:` `}}),s.append(m)),typeof i=="object")for(let[l,p]of Object.entries(i))te(m,l,p);}else if(o==="utility"){let s=t.nodes?.find(c=>c.type==="atrule"&&c.name===o&&c.params===a);if(s){if(typeof i=="object")for(let[c,m]of Object.entries(i))if(typeof m=="string"){let l=s.nodes?.find(u=>u.type==="decl"&&u.prop===c),p=v.decl({prop:c,value:m,raws:{semicolon:true,before:` `}});l?l.replaceWith(p):s.append(p);}else typeof m=="object"&&te(s,c,m);}else {let c=v.atRule({name:o,params:a,raws:{semicolon:true,between:" ",before:` `}});if(t.append(c),t.insertBefore(c,v.comment({text:"---break---"})),typeof i=="object")for(let[m,l]of Object.entries(i))if(typeof l=="string"){let p=v.decl({prop:m,value:l,raws:{semicolon:true,before:` `}});c.append(p);}else typeof l=="object"&&te(c,m,l);}}else o==="property"?te(t,r,i):Xt(t,o,a,i);}else te(t,r,i);}}}function Xt(e,t,r,i){let n=e.nodes?.find(o=>o.type==="atrule"&&o.name===t&&o.params===r);if(n||(n=v.atRule({name:t,params:r,raws:{semicolon:true,between:" ",before:` `}}),e.append(n),e.insertBefore(n,v.comment({text:"---break---"}))),typeof i=="object")for(let[o,a]of Object.entries(i))if(o.startsWith("@")){let s=o.match(/@([a-zA-Z-]+)\s*(.*)/);if(s){let[,c,m]=s;Xt(n,c,m,a);}}else te(n,o,a);else if(typeof i=="string")try{let a=v.parse(`.temp{${i}}`).first;if(a&&a.nodes){let s=v.rule({selector:"temp",raws:{semicolon:!0,between:" ",before:` `}});a.nodes.forEach(c=>{if(c.type==="decl"){let m=c.clone();m.raws.before=` `,s.append(m);}}),s.nodes?.length&&n.append(s);}}catch(o){throw console.error("Error parsing at-rule content:",i,o),o}}function te(e,t,r){let i=e.nodes?.find(n=>n.type==="rule"&&n.selector===t);if(i||(i=v.rule({selector:t,raws:{semicolon:true,between:" ",before:` `}}),e.append(i)),typeof r=="object"){for(let[n,o]of Object.entries(r))if(n.startsWith("@")&&typeof o=="object"&&o!==null&&Object.keys(o).length===0){let a=n.match(/@([a-zA-Z-]+)\s*(.*)/);if(a){let[,s,c]=a,m=v.atRule({name:s,params:c,raws:{semicolon:true,before:` `}});i.append(m);}}else if(typeof o=="string"){let a=v.decl({prop:n,value:o,raws:{semicolon:true,before:` `}}),s=i.nodes?.find(c=>c.type==="decl"&&c.prop===n);s?s.replaceWith(a):i.append(a);}else if(typeof o=="object"){let a=n.startsWith("&")?t.replace(/^([^:]+)/,`$1${n.substring(1)}`):n;te(e,a,o);}}else if(typeof r=="string")try{let o=v.parse(`.temp{${r}}`).first;o&&o.nodes&&o.nodes.forEach(a=>{if(a.type==="decl"){let s=a.clone();s.raws.before=` `,i?.append(s);}});}catch(n){throw console.error("Error parsing rule content:",t,r,n),n}}async function qe(e,t$1,r){if(!t$1.resolvedPaths.tailwindCss||!Object.keys(e??{}).length)return;r={cleanupDefaultNextStyles:false,silent:false,tailwindVersion:"v3",overwriteCssVars:false,initIndex:true,...r};let i=t$1.resolvedPaths.tailwindCss,n=E__default.relative(t$1.resolvedPaths.cwd,i),o=t(`Updating CSS variables in ${d.info(n)}`,{silent:r.silent}).start(),a=await promises.readFile(i,"utf8"),s=await ni(a,e??{},t$1,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars,initIndex:r.initIndex});await promises.writeFile(i,s,"utf8"),o.succeed();}async function ni(e,t,r,i={cleanupDefaultNextStyles:false,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:false,initIndex:false}){i={cleanupDefaultNextStyles:false,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:false,initIndex:false,...i};let n=[si(t)];if(i.cleanupDefaultNextStyles&&n.push(er()),i.tailwindVersion==="v4"){if(n=[],r.resolvedPaths?.cwd){let s=o$1(r.resolvedPaths.cwd);!s?.dependencies?.["tailwindcss-animate"]&&!s?.devDependencies?.["tailwindcss-animate"]&&i.initIndex&&n.push(fi({params:"tw-animate-css"}));}n.push(mi({params:"dark (&:is(.dark *))"})),i.cleanupDefaultNextStyles&&n.push(er()),n.push(ci(t,{overwriteCssVars:i.overwriteCssVars})),n.push(li(t)),i.tailwindConfig&&(n.push(pi(i.tailwindConfig)),n.push(ui(i.tailwindConfig)),n.push(di(i.tailwindConfig)));}r.tailwind.cssVariables&&i.initIndex&&n.push(oi({tailwindVersion:i.tailwindVersion}));let a=(await v(n).process(e,{from:void 0})).css;return a=a.replace(/\/\* ---break--- \*\//g,""),i.tailwindVersion==="v4"&&(a=a.replace(/(\n\s*\n)+/g,` `)),a}function oi({tailwindVersion:e}){return {postcssPlugin:"update-base-layer",Once(t){let r=[{selector:"*",apply:e==="v4"?"border-border outline-ring/50":"border-border"},{selector:"body",apply:"bg-background text-foreground"}],i=t.nodes.find(n=>n.type==="atrule"&&n.name==="layer"&&n.params==="base"&&r.every(({selector:o,apply:a})=>n.nodes?.some(s=>s.type==="rule"&&s.selector===o&&s.nodes.some(c=>c.type==="atrule"&&c.name==="apply"&&c.params===a))));i||(i=v.atRule({name:"layer",params:"base",raws:{semicolon:true,between:" ",before:` `}}),t.append(i),t.insertBefore(i,v.comment({text:"---break---"}))),r.forEach(({selector:n,apply:o})=>{i?.nodes?.find(s=>s.type==="rule"&&s.selector===n)||i?.append(v.rule({selector:n,nodes:[v.atRule({name:"apply",params:o,raws:{semicolon:true,before:` `}})],raws:{semicolon:true,between:" ",before:` `}}));});}}}function si(e){return {postcssPlugin:"update-css-vars",Once(t){let r=t.nodes.find(i=>i.type==="atrule"&&i.name==="layer"&&i.params==="base");r instanceof ii||(r=v.atRule({name:"layer",params:"base",nodes:[],raws:{semicolon:true,before:` `,between:" "}}),t.append(r),t.insertBefore(r,v.comment({text:"---break---"}))),r!==void 0&&Object.entries(e).forEach(([i,n])=>{let o=i==="light"?":root":`.${i}`;ai(r,o,n);});}}}function Zt(e){let t=e.nodes.find(r=>r.type==="rule"&&r.selector===":root");if(t){let r=["--background","--foreground"];t.nodes.filter(i=>i.type==="decl"&&r.includes(i.prop)).forEach(i=>i.remove()),t.nodes.length===0&&t.remove();}}function er(){return {postcssPlugin:"cleanup-default-next-styles",Once(e){let t=e.nodes.find(i=>i.type==="rule"&&i.selector==="body");t&&(t.nodes.find(i=>i.type==="decl"&&i.prop==="color"&&["rgb(var(--foreground-rgb))","var(--foreground)"].includes(i.value))?.remove(),t.nodes.find(i=>i.type==="decl"&&i.prop==="background"&&(i.value.startsWith("linear-gradient")||i.value==="var(--background)"))?.remove(),t.nodes.find(i=>i.type==="decl"&&i.prop==="font-family"&&i.value==="Arial, Helvetica, sans-serif")?.remove(),t.nodes.length===0&&t.remove()),Zt(e);let r=e.nodes.find(i=>i.type==="atrule"&&i.params==="(prefers-color-scheme: dark)");r&&(Zt(r),r.nodes.length===0&&r.remove());}}}function ai(e,t,r){let i=e.nodes?.find(n=>n.type==="rule"&&n.selector===t);i||Object.keys(r).length>0&&(i=v.rule({selector:t,raws:{between:" ",before:` `}}),e.append(i)),Object.entries(r).forEach(([n,o])=>{let a=`--${n.replace(/^--/,"")}`,s=v.decl({prop:a,value:o,raws:{semicolon:true}}),c=i?.nodes.find(m=>m.type==="decl"&&m.prop===a);c?c.replaceWith(s):i?.append(s);});}function ci(e,t){return {postcssPlugin:"update-css-vars-v4",Once(r){Object.entries(e).forEach(([i,n])=>{let o=i==="light"?":root":`.${i}`;if(i==="theme"){o="@theme";let s=Ee(r);Object.entries(n).forEach(([c,m])=>{let l=`--${c.replace(/^--/,"")}`,p=v.decl({prop:l,value:m,raws:{semicolon:true}}),u=s?.nodes?.find(g=>g.type==="decl"&&g.prop===l);t.overwriteCssVars?u?u.replaceWith(p):s?.append(p):u||s?.append(p);});return}let a=r.nodes?.find(s=>s.type==="rule"&&s.selector===o);!a&&Object.keys(n).length>0&&(a=v.rule({selector:o,nodes:[],raws:{semicolon:true,between:" ",before:` `}}),r.append(a),r.insertBefore(a,v.comment({text:"---break---"}))),Object.entries(n).forEach(([s,c])=>{let m=`--${s.replace(/^--/,"")}`;m==="--sidebar-background"&&(m="--sidebar"),tr(c)&&(c=`hsl(${c})`);let l=v.decl({prop:m,value:c,raws:{semicolon:true}}),p=a?.nodes.find(u=>u.type==="decl"&&u.prop===m);t.overwriteCssVars?p?p.replaceWith(l):a?.append(l):p||a?.append(l);});});}}}function li(e){return {postcssPlugin:"update-theme",Once(t){let r=Array.from(new Set(Object.keys(e).flatMap(o=>Object.keys(e[o]||{}))));if(!r.length)return;let i=Ee(t),n=i.nodes?.filter(o=>o.type==="decl"&&o.prop.startsWith("--"));for(let o of r){let a=Object.values(e).find(p=>p[o])?.[o];if(!a)continue;if(o==="radius"){let p={sm:"calc(var(--radius) - 4px)",md:"calc(var(--radius) - 2px)",lg:"var(--radius)",xl:"calc(var(--radius) + 4px)","2xl":"calc(var(--radius) + 8px)","3xl":"calc(var(--radius) + 12px)","4xl":"calc(var(--radius) + 16px)"};for(let[u,g]of Object.entries(p)){let w=v.decl({prop:`--radius-${u}`,value:g,raws:{semicolon:true}});i?.nodes?.find(h=>h.type==="decl"&&h.prop===w.prop)||i?.append(w);}continue}let s=tr(a)||hi(a)?`--color-${o.replace(/^--/,"")}`:`--${o.replace(/^--/,"")}`;s==="--color-sidebar-background"&&(s="--color-sidebar");let c=`var(--${o})`;s==="--color-sidebar"&&(c="var(--sidebar)");let m=v.decl({prop:s,value:c,raws:{semicolon:true}});i?.nodes?.find(p=>p.type==="decl"&&p.prop===m.prop)||(n?.length?i?.insertAfter(n[n.length-1],m):i?.append(m));}}}}function Ee(e){let t=e.nodes.find(r=>r.type==="atrule"&&r.name==="theme"&&r.params==="inline");return t||(t=v.atRule({name:"theme",params:"inline",nodes:[],raws:{semicolon:true,between:" ",before:` `}}),e.append(t),e.insertBefore(t,v.comment({text:"---break---"}))),t}function mi({params:e}){return {postcssPlugin:"add-custom-variant",Once(t){if(!t.nodes.find(i=>i.type==="atrule"&&i.name==="custom-variant")){let i=t.nodes.filter(o=>o.type==="atrule"&&o.name==="import"),n=v.atRule({name:"custom-variant",params:e,raws:{semicolon:true,before:` `}});if(i.length>0){let o=i[i.length-1];t.insertAfter(o,n);}else t.insertAfter(t.nodes[0],n);t.insertBefore(n,v.comment({text:"---break---"}));}}}}function fi({params:e}){return {postcssPlugin:"add-custom-import",Once(t){let r=t.nodes.filter(o=>o.type==="atrule"&&o.name==="import"),i=t.nodes.find(o=>o.type==="atrule"&&o.name==="custom-variant");if(!r.some(o=>o.params.replace(/["']/g,"")===e)){let o=v.atRule({name:"import",params:`"${e}"`,raws:{semicolon:true,before:` `}});if(r.length>0){let a=r[r.length-1];t.insertAfter(a,o);}else i?(t.insertBefore(i,o),t.insertBefore(i,v.comment({text:"---break---"}))):(t.prepend(o),t.insertAfter(o,v.comment({text:"---break---"})));}}}}function pi(e){return {postcssPlugin:"update-tailwind-config",Once(t){if(!e?.plugins)return;let i=gi(t)==="single"?"'":'"',n=t.nodes.filter(a=>a.type==="atrule"&&a.name==="plugin"),o=n[n.length-1]||t.nodes[0];for(let a of e.plugins){let s=a.replace(/^require\(["']|["']\)$/g,"");if(n.some(m=>m.params.replace(/["']/g,"")===s))continue;let c=v.atRule({name:"plugin",params:`${i}${s}${i}`,raws:{semicolon:true,before:` `}});t.insertAfter(o,c),t.insertBefore(c,v.comment({text:"---break---"}));}}}}function di(e){return {postcssPlugin:"update-tailwind-config-keyframes",Once(t){if(!e?.theme?.extend?.keyframes)return;let r=Ee(t),i=r.nodes?.filter(o=>o.type==="atrule"&&o.name==="keyframes"),n=z$1.record(z$1.string(),z$1.record(z$1.string(),z$1.string()));for(let[o,a]of Object.entries(e.theme.extend.keyframes)){if(typeof o!="string")continue;let s=n.safeParse(a);if(!s.success||i?.find(m=>m.type==="atrule"&&m.name==="keyframes"&&m.params===o))continue;let c=v.atRule({name:"keyframes",params:o,nodes:[],raws:{semicolon:true,between:" ",before:` `}});for(let[m,l]of Object.entries(s.data)){let p=v.rule({selector:m,nodes:Object.entries(l).map(([u,g])=>v.decl({prop:u,value:g,raws:{semicolon:true,before:` `,between:": "}})),raws:{semicolon:true,between:" ",before:` `}});c.append(p);}r.append(c),r.insertBefore(c,v.comment({text:"---break---"}));}}}}function ui(e){return {postcssPlugin:"update-tailwind-config-animation",Once(t){if(!e?.theme?.extend?.animation)return;let r=Ee(t),i=r.nodes?.filter(o=>o.type==="decl"&&o.prop.startsWith("--animate-")),n=z$1.record(z$1.string(),z$1.string()).safeParse(e.theme.extend.animation);if(n.success)for(let[o,a]of Object.entries(n.data)){let s=`--animate-${o}`;if(i?.find(m=>m.prop===s))continue;let c=v.decl({prop:s,value:a,raws:{semicolon:true,between:": ",before:` `}});r.append(c);}}}}function gi(e){return e.nodes[0].toString().includes("'")?"single":"double"}function tr(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 hi(e){return e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch")||e.includes("--color-")}async function z(e,t$1,r,i){if(e=Array.from(new Set(e)),t$1=Array.from(new Set(t$1)),!e?.length&&!t$1?.length)return;i={silent:false,...i};let n=t("Installing dependencies.",{silent:i.silent})?.start(),o=await bi(r),a="";if(yi(r)&&o==="npm")if(i.silent)a="force";else {n.stopAndPersist(),s.warn(` It looks like you are using React 19. Some packages may fail to install due to peer dependency issues in npm (see https://ui.shadcn.com/react-19). `);let s$1=await Fe([{type:"select",name:"flag",message:"How would you like to proceed?",choices:[{title:"Use --force",value:"force"},{title:"Use --legacy-peer-deps",value:"legacy-peer-deps"}]}]);s$1&&(a=s$1.flag);}n?.start(),await xi(o,e,t$1,r.resolvedPaths.cwd,a),n?.succeed();}function yi(e){let t=o$1(e.resolvedPaths.cwd,false);if(!t?.dependencies?.react)return false;let r=/^(?:\^|~)?19(?:\.\d+)*(?:-.*)?$/.test(t.dependencies.react),i=t.dependencies["react-day-picker"]?.startsWith("8");return r&&i}async function bi(e){return o$1(e.resolvedPaths.cwd,false)?.dependencies?.expo?"expo":a$1(e.resolvedPaths.cwd)}async function xi(e,t,r,i,n){if(e==="npm")return Si(t,r,i,n);if(e==="deno")return vi(t,r,i);if(e==="expo")return Ri(t,r,i);t?.length&&await execa(e,["add",...t],{cwd:i}),r?.length&&await execa(e,["add","-D",...r],{cwd:i});}async function Si(e,t,r,i){e.length&&await execa("npm",["install",...i?[`--${i}`]:[],...e],{cwd:r}),t.length&&await execa("npm",["install",...i?[`--${i}`]:[],"-D",...t],{cwd:r});}async function vi(e,t,r){e?.length&&await execa("deno",["add",...e.map(i=>`npm:${i}`)],{cwd:r}),t?.length&&await execa("deno",["add","-D",...t.map(i=>`npm:${i}`)],{cwd:r});}async function Ri(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 Xe(e,t$1,r){if(!e||Object.keys(e).length===0)return {envVarsAdded:[],envFileUpdated:null,envFileCreated:null};r={silent:false,...r};let i=t("Adding environment variables.",{silent:r.silent})?.start(),n=t$1.resolvedPaths.cwd,o=E__default.join(n,".env.local"),a=G(n);a&&(o=a);let s$1=existsSync(o),c=E__default.basename(o),m=Object.entries(e).map(([g,w])=>`${g}=${w}`).join(` `),l=[],p=null,u=null;if(s$1){let g=await promises.readFile(o,"utf-8"),w=I(g,m);if(l=H$1(g,m),l.length>0){if(await promises.writeFile(o,w,"utf-8"),p=E__default.relative(n,o),i?.succeed(`Added the following variables to ${d.info(c)}:`),!r.silent)for(let h of l)s.log(` ${d.success("+")} ${h}`);}else i?.stop();}else if(await promises.writeFile(o,m+` `,"utf-8"),u=E__default.relative(n,o),l=Object.keys(e),i?.succeed(`Added the following variables to ${d.info(c)}:`),!r.silent)for(let g of l)s.log(` ${d.success("+")} ${g}`);return !r.silent&&l.length>0&&s.break(),{envVarsAdded:l,envFileUpdated:p,envFileCreated:u}}async function ir(e,t){if(!e.fonts?.length)return e;let r=await p(t.resolvedPaths.cwd);if(!r)return e;let[i]=e.fonts;if(e.cssVars??={},e.cssVars.theme??={},r.framework.name==="next-app"||r.framework.name==="next-pages")return e.cssVars.theme[i.font.variable]=`var(${i.font.variable})`,e;let o=`@fontsource-variable/${i.name.replace("font-","")}`;return e.dependencies??=[],e.dependencies.push(o),e.css??={},e.css[`@import "${o}"`]={},e.css["@layer base"]??={},e.css["@layer base"].html={"@apply font-sans":{}},e.css["@layer base"].body={"@apply font-sans bg-background text-foreground":{}},e.cssVars.theme[i.font.variable]=i.font.family,e}async function Qe(e,t$1,r){if(!e?.length)return;let i=await p(t$1.resolvedPaths.cwd);if(!i||i.framework.name!=="next-app"&&i.framework.name!=="next-pages")return;let n=t("Updating fonts.",{silent:r.silent})?.start();try{await $i(e,t$1,i),n?.succeed("Updating fonts.");}catch(o){throw n?.fail("Failed to update fonts."),o}}async function $i(e,t,r){let i=await Ni(t,r);if(!i)return;let n=await promises.readFile(i,"utf-8"),o=await Oi(n,e);o!==n&&await promises.writeFile(i,o,"utf-8");}async function Ni(e,t){let r=e.resolvedPaths.cwd,i=t.isSrcDir,o=t.isTsx?"tsx":"jsx",a=i?[`src/app/layout.${o}`,`app/layout.${o}`]:[`app/layout.${o}`];for(let s of a){let c=E__default.join(r,s);if(existsSync(c))return c}return null}async function Oi(e,t,r){let n=new Project({compilerOptions:{}}).createSourceFile("layout.tsx",e,{scriptKind:ScriptKind.TSX}),o=t.filter(s=>s.font.provider==="google"),a=[];for(let s of o){let c=s.font.import;if(!c)continue;let m=Fi(c),l=n.getImportDeclaration(g=>g.getModuleSpecifierValue()==="next/font/google"),p=Ti(s);l?l.getNamedImports().some(h=>h.getName()===c)||l.addNamedImport(c):n.addImportDeclaration({moduleSpecifier:"next/font/google",namedImports:[c]});let u=Ai(n,s.font.variable);if(u)u.setInitializer(`${c}(${p})`),u.getName()!==m&&u.rename(m);else {let g=Di(n);n.insertVariableStatement(g,{declarationKind:VariableDeclarationKind.Const,declarations:[{name:m,initializer:`${c}(${p})`}]}).appendWhitespace(` `);}a.push(m);}return a.length>0&&_i(n,a),n.getFullText()}function Ti(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 Fi(e){return e.split("_").map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function Ai(e,t){let r=e.getVariableStatements();for(let i of r)for(let n of i.getDeclarations()){let o=n.getInitializer();if(!o||o.getKind()!==SyntaxKind.CallExpression)continue;let s=o.getArguments();if(s.length===0)continue;let c=s[0].getText();if(c.includes("variable:")&&c.includes(t))return n}return null}function Di(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function _i(e,t){let r=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement);for(let i of r){if(i.getTagNameNode().getText()!=="html")continue;let o=i.getAttribute("className");if(!o){let m=t.map(l=>`${l}.variable`).join(", ");t.length===1?i.addAttribute({name:"className",initializer:`{${m}}`}):(ge(e),i.addAttribute({name:"className",initializer:`{cn(${m})}`}));return}if(o.getKind()!==SyntaxKind.JsxAttribute)return;let a=o.asKindOrThrow(SyntaxKind.JsxAttribute),s=a.getInitializer();if(!s)return;let c=t.map(m=>`${m}.variable`);if(s.getKind()===SyntaxKind.StringLiteral){let m=s.getText().slice(1,-1);ge(e),a.setInitializer(`{cn("${m}", ${c.join(", ")})}`);}else if(s.getKind()===SyntaxKind.JsxExpression){let m=s.asKindOrThrow(SyntaxKind.JsxExpression),l=m.getExpression();if(!l)return;let p=l.getText();if(p.startsWith("cn(")){if(c.every(h=>p.includes(h)))continue;let g=Vi(p),w=Mi(g,c);m.replaceWithText(`{${w}}`);}else if(/^\w+\.variable$/.test(p)){if(c.includes(p))continue;c.length===1?m.replaceWithText(`{${c[0]}}`):(ge(e),m.replaceWithText(`{cn(${c.join(", ")})}`));}else if(p.startsWith("`")&&p.endsWith("`")){let u=Li(p);ge(e),m.replaceWithText(`{cn(${[...u,...c].join(", ")})}`);}else ge(e),m.replaceWithText(`{cn(${p}, ${c.join(", ")})}`);}}}function ge(e){if(!e.getImportDeclaration(r=>r.getNamedImports().some(n=>n.getName()==="cn"))){let r=e.getImportDeclaration(i=>i.getModuleSpecifierValue().includes("/lib/utils"));r?r.getNamedImports().some(n=>n.getName()==="cn")||r.addNamedImport("cn"):e.addImportDeclaration({moduleSpecifier:"@/lib/utils",namedImports:["cn"]});}}function Li(e){let t=[],r=[],n=e.slice(1,-1).split(/(\$\{[^}]+\})/);for(let o of n)if(o)if(o.startsWith("${")&&o.endsWith("}")){let a=o.slice(2,-1).trim();a&&r.push(a);}else {let a=o.trim().split(/\s+/).filter(Boolean);for(let s of a)t.push(`"${s}"`);}return [...t,...r]}function Vi(e){return e.replace(/,?\s*\w+\.variable/g,"").replace(/cn\(\s*,/,"cn(")}function Mi(e,t){let r=t.join(", ");return e.replace(/\)$/,`, ${r})`)}async function ie(e,t,r){r={overwrite:false,silent:false,isNewProject:false,baseStyle:true,...r};let i=await k(t);return i&&i.ui&&i.ui.resolvedPaths.cwd!==t.resolvedPaths.cwd?await Bi(e,t,i,{...r,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await zi(e,t,r)}async function zi(e,t$1,r$1){if(!r$1.baseStyle&&!e.length)return;let i=t("Checking registry.",{silent:r$1.silent})?.start(),n=await X(e,O(t$1));if(!n)return i?.fail(),Y$1(new Error("Failed to fetch components from registry."));try{or(n.files??[],t$1.resolvedPaths.cwd);}catch(s){return i?.fail(),Y$1(s)}i?.succeed();let o=await r(t$1);n=await ir(n,t$1),await T$1(n.tailwind?.config,t$1,{silent:r$1.silent,tailwindVersion:o});let a=await nr(e,t$1);await qe(n.cssVars,t$1,{cleanupDefaultNextStyles:r$1.isNewProject,silent:r$1.silent,tailwindVersion:o,tailwindConfig:n.tailwind?.config,overwriteCssVars:a,initIndex:r$1.baseStyle}),await Ke(n.css,t$1,{silent:r$1.silent}),await Xe(n.envVars,t$1,{silent:r$1.silent}),await z(n.dependencies,n.devDependencies,t$1,{silent:r$1.silent}),await Qe(n.fonts,t$1,{silent:r$1.silent}),await K(n.files,t$1,{overwrite:r$1.overwrite,silent:r$1.silent,path:r$1.path}),n.docs&&s.info(n.docs);}async function Bi(e,t$1,r$1,i){if(!i.baseStyle&&!e.length)return;let n=t("Checking registry.",{silent:i.silent})?.start(),o=await X(e,O(t$1));if(!o)return n?.fail(),Y$1(new Error("Failed to fetch components from registry."));try{or(o.files??[],t$1.resolvedPaths.cwd);}catch(h){return n?.fail(),Y$1(h)}n?.succeed();let a=[],s$1=[],c=[],m$1=t("Installing components.")?.start(),l$1=r$1.ui,p=await r(l$1),u=m(t$1.resolvedPaths.cwd,l$1.resolvedPaths.ui);if(o.tailwind?.config&&(await T$1(o.tailwind?.config,l$1,{silent:true,tailwindVersion:p}),s$1.push(E__default.relative(u,l$1.resolvedPaths.tailwindConfig))),o.cssVars){let h=await nr(e,t$1);await qe(o.cssVars,l$1,{silent:true,tailwindVersion:p,tailwindConfig:o.tailwind?.config,overwriteCssVars:h}),s$1.push(E__default.relative(u,l$1.resolvedPaths.tailwindCss));}o.css&&(await Ke(o.css,l$1,{silent:true}),s$1.push(E__default.relative(u,l$1.resolvedPaths.tailwindCss))),o.envVars&&await Xe(o.envVars,l$1,{silent:true}),await z(o.dependencies,o.devDependencies,l$1,{silent:true}),await Qe(o.fonts,l$1,{silent:true});let g=new Map;for(let h of o.files??[]){let x=h.type||"registry:ui";g.has(x)||g.set(x,[]),g.get(x).push(h);}for(let h of Array.from(g.keys())){let x=g.get(h),S=h==="registry:ui"?r$1.ui:t$1,M=m(t$1.resolvedPaths.cwd,S.resolvedPaths.ui||S.resolvedPaths.cwd),F=await l(M,S.resolvedPaths.cwd)??S.resolvedPaths.cwd,X=await K(x,S,{overwrite:i.overwrite,silent:true,rootSpinner:m$1,isRemote:i.isRemote,isWorkspace:true,path:i.path});a.push(...X.filesCreated.map(A=>E__default.relative(M,E__default.join(F,A)))),s$1.push(...X.filesUpdated.map(A=>E__default.relative(M,E__default.join(F,A)))),c.push(...X.filesSkipped.map(A=>E__default.relative(M,E__default.join(F,A))));}if(m$1?.succeed(),a.sort(),s$1.sort(),c.sort(),!(a.length||s$1.length)&&!c.length&&t("No files updated.",{silent:i.silent})?.info(),a.length){t(`Created ${a.length} ${a.length===1?"file":"files"}:`,{silent:i.silent})?.succeed();for(let h of a)s.log(` - ${h}`);}if(s$1.length){t(`Updated ${s$1.length} ${s$1.length===1?"file":"files"}:`,{silent:i.silent})?.info();for(let h of s$1)s.log(` - ${h}`);}if(c.length){t(`Skipped ${c.length} ${s$1.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:i.silent})?.info();for(let h of c)s.log(` - ${h}`);}o.docs&&s.info(o.docs);}async function nr(e,t){let r=await _(e,{config:t});return z$1.array(n$1).parse(r).some(n=>n.type==="registry:theme"||n.type==="registry:style"||n.type==="registry:font"||n.type==="registry:base")}function or(e,t){for(let r of e)if(r?.target&&!qt(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}var tt="https://codeload.github.com/shadcn-ui/ui/tar.gz/main",L={next:"next","next-monorepo":"next-monorepo",vite:"vite",start:"start"};async function $e(e){e={srcDir:false,...e};let t=e.template&&L[e.template]?e.template:"next",r=e.name??(t===L.next||t===L.vite||t===L.start?"my-app":"my-monorepo"),i="latest",n=e.components?.length===1&&!!e.components[0].match(/\/chat\/b\//);if(e.components&&n)try{let[s]=await S(e.components),{meta:c}=z$1.object({meta:z$1.object({nextVersion:z$1.string()})}).parse(s);i=c.nextVersion,t=L.next;}catch(s$1){s.break(),Y$1(s$1);}if(!e.force){let{type:s,name:c}=await Fe([{type:e.template||n?null:"select",name:"type",message:`The path ${d.info(e.cwd)} does not contain a package.json file. Would you like to start a new project?`,choices:[{title:"Next.js",value:"next"},{title:"Next.js (Monorepo)",value:"next-monorepo"},{title:"Vite",value:"vite"},{title:"TanStack Start",value:"start"}],initial:0},{type:e.name?null:"text",name:"name",message:"What is your project named?",initial:r,format:m=>m.trim(),validate:m=>m.length>128?"Name should be less than 128 characters.":true}]);t=s??t,r=c??r;}let o=await a$1(e.cwd,{withFallback:true}),a=`${e.cwd}/${r}`;try{await R.access(e.cwd,R.constants.W_OK);}catch{s.break(),s.error(`The path ${d.info(e.cwd)} is not writable.`),s.error(`It is likely you do not have write permissions for this folder or the path ${d.info(e.cwd)} does not exist.`),s.break(),process.exit(1);}return R.existsSync(E__default.resolve(e.cwd,r,"package.json"))&&(s.break(),s.error(`A project with the name ${d.info(r)} already exists.`),s.error("Please choose a different name and try again."),s.break(),process.exit(1)),t===L.next&&await Gi(a,{version:i,cwd:e.cwd,packageManager:o,srcDir:!!e.srcDir}),t===L["next-monorepo"]&&await Ji(a,{packageManager:o}),t===L.vite&&await Yi(a,{packageManager:o}),t===L.start&&await Ki(a,{packageManager:o}),{projectPath:a,projectName:r,template:t}}async function Gi(e,t$1){let r=t("Creating a new Next.js project. This may take a few minutes.").start(),i=["--tailwind","--eslint","--typescript","--app",t$1.srcDir?"--src-dir":"--no-src-dir","--no-import-alias",`--use-${t$1.packageManager}`];(t$1.version.startsWith("15")||t$1.version.startsWith("latest")||t$1.version.startsWith("canary"))&&i.push("--turbopack"),(t$1.version.startsWith("latest")||t$1.version.startsWith("canary"))&&i.push("--no-react-compiler");try{await execa("npx",[`create-next-app@${t$1.version}`,e,"--silent",...i],{cwd:t$1.cwd});}catch{s.break(),s.error("Something went wrong creating a new Next.js project. Please try again."),process.exit(1);}r?.succeed("Creating a new Next.js project.");}async function Ji(e,t$1){let r=t("Creating a new Next.js monorepo. This may take a few minutes.").start();try{let i=E__default.join(et.tmpdir(),`shadcn-template-${Date.now()}`);await R.ensureDir(i);let n=await fetch(tt);if(!n.ok)throw new Error(`Failed to download template: ${n.statusText}`);let o=E__default.resolve(i,"template.tar.gz");await R.writeFile(o,Buffer.from(await n.arrayBuffer())),await execa("tar",["-xzf",o,"-C",i,"--strip-components=2","ui-main/templates/monorepo-next"]);let a=E__default.resolve(i,"monorepo-next");await R.move(a,e),await R.remove(i),await execa(t$1.packageManager,["install"],{cwd:e});let s=E__default.join(e,"package.json");if(R.existsSync(s)){let m=await R.readFile(s,"utf8"),l=JSON.parse(m);l.name=e.split("/").pop(),await R.writeFile(s,JSON.stringify(l,null,2));}let c=process.cwd();await execa("git",["--version"],{cwd:e}),await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","Initial commit"],{cwd:e}),r?.succeed("Creating a new Next.js monorepo.");}catch(i){r?.fail("Something went wrong creating a new Next.js monorepo."),Y$1(i);}}async function Yi(e,t$1){let r=t("Creating a new Vite project. This may take a few minutes.").start();try{let i=E__default.join(et.tmpdir(),`shadcn-template-${Date.now()}`);await R.ensureDir(i);let n=await fetch(tt);if(!n.ok)throw new Error(`Failed to download template: ${n.statusText}`);let o=E__default.resolve(i,"template.tar.gz");await R.writeFile(o,Buffer.from(await n.arrayBuffer())),await execa("tar",["-xzf",o,"-C",i,"--strip-components=2","ui-main/templates/vite-app"]);let a=E__default.resolve(i,"vite-app");if(await R.move(a,e),await R.remove(i),t$1.packageManager!=="pnpm"){let c=E__default.join(e,"pnpm-lock.yaml");R.existsSync(c)&&await R.remove(c);}await execa(t$1.packageManager,["install"],{cwd:e});let s=E__default.join(e,"package.json");if(R.existsSync(s)){let c=await R.readFile(s,"utf8"),m=JSON.parse(c);m.name=e.split("/").pop(),await R.writeFile(s,JSON.stringify(m,null,2));}await execa("git",["--version"],{cwd:e}),await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","Initial commit"],{cwd:e}),r?.succeed("Creating a new Vite project.");}catch(i){r?.fail("Something went wrong creating a new Vite project."),Y$1(i);}}async function Ki(e,t$1){let r=t("Creating a new TanStack Start project. This may take a few minutes.").start();try{let i=E__default.join(et.tmpdir(),`shadcn-template-${Date.now()}`);await R.ensureDir(i);let n=await fetch(tt);if(!n.ok)throw new Error(`Failed to download template: ${n.statusText}`);let o=E__default.resolve(i,"template.tar.gz");await R.writeFile(o,Buffer.from(await n.arrayBuffer())),await execa("tar",["-xzf",o,"-C",i,"--strip-components=2","ui-main/templates/start-app"]);let a=E__default.resolve(i,"start-app");if(await R.move(a,e),await R.remove(i),t$1.packageManager!=="pnpm"){let c=E__default.join(e,"pnpm-lock.yaml");R.existsSync(c)&&await R.remove(c);}await execa(t$1.packageManager,["install"],{cwd:e});let s=E__default.join(e,"package.json");if(R.existsSync(s)){let c=await R.readFile(s,"utf8"),m=JSON.parse(c);m.name=e.split("/").pop(),await R.writeFile(s,JSON.stringify(m,null,2));}await execa("git",["--version"],{cwd:e}),await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","Initial commit"],{cwd:e}),r?.succeed("Creating a new TanStack Start project.");}catch(i){r?.fail("Something went wrong creating a new TanStack Start project."),Y$1(i);}}async function B(e=process.cwd()){try{let{config:t}=await import('@dotenvx/dotenvx'),r=[".env.local",".env.development.local",".env.development",".env"];for(let i of r){let n=join(e,i);existsSync(n)&&t({path:n,overload:!1,quiet:!0});}}catch(t){s.warn("Failed to load env files:",t);}}var he=".bak";function sr(e){if(!R.existsSync(e))return null;let t=`${e}${he}`;try{return R.renameSync(e,t),t}catch(r){return console.error(`Failed to create backup of ${e}: ${r}`),null}}function ar(e){let t=`${e}${he}`;if(!R.existsSync(t))return false;try{return R.renameSync(t,e),!0}catch(r){return console.error(`Warning: Could not restore backup file ${t}: ${r}`),false}}function rt(e){let t=`${e}${he}`;if(!R.existsSync(t))return false;try{return R.unlinkSync(t),!0}catch{return false}}async function cr(e,t){let r=new Set,i=new Set,n=[...e];for(;n.length>0;){let o=n.shift();if(i.has(o))continue;i.add(o);let{registry:a}=F(o);a&&!b[a]&&r.add(a);try{let[s]=await W([o],t,{useCache:!0});if(s?.registryDependencies)for(let c of s.registryDependencies){let{registry:m}=F(c);m&&!b[m]&&r.add(m),i.has(c)||n.push(c);}}catch(s){if(s instanceof z$2){let{registry:c}=F(o);c&&!b[c]&&r.add(c);continue}continue}}return Array.from(r)}async function T(e,t$1,r={}){r={silent:false,writeFile:true,...r};let n=(await cr(e,t$1)).filter(m=>!t$1.registries?.[m]&&!Object.keys(b).includes(m));if(n.length===0)return {config:t$1,newRegistries:[]};let o=await ja({useCache:process.env.NODE_ENV!=="development"});if(!o)return {config:t$1,newRegistries:[]};let a={};for(let m of n)o[m]&&(a[m]=o[m]);if(Object.keys(a).length===0)return {config:t$1,newRegistries:[]};let s=Object.fromEntries(Object.entries(t$1.registries||{}).filter(([m])=>!Object.keys(b).includes(m))),c$1={...t$1,registries:{...s,...a}};if(r.writeFile){let{resolvedPaths:m,...l}=c$1,p=t("Updating components.json.",{silent:r.silent}).start(),u=c.parse(l);await R.writeFile(E__default.resolve(t$1.resolvedPaths.cwd,"components.json"),JSON.stringify(u,null,2)+` `,"utf-8"),p.succeed();}return {config:c$1,newRegistries:Object.keys(a)}}async function mr(e,t$1,r){if(!e)return;r={silent:false,...r};let i=E__default.relative(t$1.resolvedPaths.cwd,t$1.resolvedPaths.tailwindConfig),n=t(`Updating ${d.info(i)}`,{silent:r.silent}).start(),o=await promises.readFile(t$1.resolvedPaths.tailwindConfig,"utf8"),a=await en(o,e,t$1);await promises.writeFile(t$1.resolvedPaths.tailwindConfig,a,"utf8"),n?.succeed();}async function en(e,t,r){let i=await U(e,r),n=i.getDescendantsOfKind(SyntaxKind.ObjectLiteralExpression).find(o=>o.getProperties().some(a=>a.isKind(SyntaxKind.PropertyAssignment)&&a.getName()==="content"));return n?(tn(n,t),i.getFullText()):e}async function tn(e,t){let r=V(e),i=e.getProperty("content");if(!i){let n={name:"content",initializer:`[${r}${t.join(`${r}, ${r}`)}${r}]`};return e.addPropertyAssignment(n),e}if(i.isKind(SyntaxKind.PropertyAssignment)){let n=i.getInitializer();if(n?.isKind(SyntaxKind.ArrayLiteralExpression))for(let o of t){let a=`${r}${o}${r}`;n.getElements().map(s=>s.getText()).includes(a)||n.addElement(a);}return e}return e}process.on("exit",e=>{let t=E__default.resolve(process.cwd(),"components.json");return e===0?rt(t):ar(t)});var nt=z$1.object({cwd:z$1.string(),name:z$1.string().optional(),components:z$1.array(z$1.string()).optional(),yes:z$1.boolean(),defaults:z$1.boolean(),force:z$1.boolean(),silent:z$1.boolean(),isNewProject:z$1.boolean(),srcDir:z$1.boolean().optional(),cssVariables:z$1.boolean(),template:z$1.string().optional().refine(e=>e?L[e]:true,{message:"Invalid template. Please use 'next', 'vite', 'start' or 'next-monorepo'."}),baseColor:z$1.string().optional().refine(e=>e?a.find(t=>t.name===e):true,{message:`Invalid base color. Please use '${a.map(e=>e.name).join("', '")}'`}),baseStyle:z$1.boolean(),registryBaseConfig:c.deepPartial().optional()}),pr=new Command().name("init").description("initialize your project and install dependencies").argument("[components...]","names, url or local path to component").option("-t, --template <template>","the template to use. (next, start, vite, next-monorepo)").option("-b, --base-color <base-color>","the base color to use. (neutral, gray, zinc, stone, slate)",void 0).option("-y, --yes","skip confirmation prompt.",true).option("-d, --defaults,","use default configuration.",false).option("-f, --force","force overwrite of existing configuration.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",false).option("--src-dir","use the src directory when creating a new project.",false).option("--no-src-dir","do not use the src directory when creating a new project.").option("--css-variables","use css variables for theming.",true).option("--no-css-variables","do not use css variables for theming.").option("--no-base-style","do not install the base shadcn style.").action(async(e,t)=>{try{t.defaults&&(t.template=t.template||"next",t.baseColor=t.baseColor||"neutral");let r=nt.parse({cwd:E__default.resolve(t.cwd),isNewProject:!1,components:e,...t});if(await B(r.cwd),e.length>0){let i=O(n({resolvedPaths:{cwd:r.cwd}})),n$1=E__default.resolve(r.cwd,"components.json");if(R.existsSync(n$1)){let s=await R.readJson(n$1),c$1=c.partial().parse(s),m=n({resolvedPaths:{cwd:r.cwd}});i=O({...c$1,resolvedPaths:{...m.resolvedPaths,cwd:r.cwd}}),sr(n$1);}let{config:o}=await T(e,i,{silent:!0,writeFile:!1});i=o,R$1(e[0],i);let[a]=await _([e[0]],{config:i});a?.type==="registry:base"&&(a.config&&(i=O(fr(i,a.config)),r.registryBaseConfig=a.config),r.baseStyle=a.extends==="none"?!1:r.baseStyle),a?.type==="registry:style"&&(r.baseColor="neutral",r.baseStyle=a.extends==="none"?!1:r.baseStyle);}r.baseStyle||(r.baseColor="neutral"),await le(r),s.log(`${d.success("Success!")} Project initialization completed. You may now add components.`),rt(E__default.resolve(r.cwd,"components.json")),s.break();}catch(r){s.break(),Y$1(r);}finally{P();}});async function le(e){let t$1,r;if(e.skipPreflight)t$1=await p(e.cwd);else {let g=await Kt(e);if(g.errors["1"]){let{projectPath:w,template:h}=await $e(e);w||process.exit(1),e.cwd=w,e.isNewProject=true,r=h,t$1=await p(e.cwd);}else t$1=g.projectInfo;}if(r==="next-monorepo")return e.cwd=E__default.resolve(e.cwd,"apps/web"),await i(e.cwd);let i$1=await q(e.cwd,t$1),n=i$1?await sn(i$1,e):await on(await i(e.cwd));if(!e.yes){let{proceed:g}=await Fe({type:"confirm",name:"proceed",message:`Write configuration to ${d.info("components.json")}. Proceed?`,initial:true});g||process.exit(0);}let o=[...e.baseStyle?["index"]:[],...e.components??[]],a=await j(e.cwd,n),{config:s}=await T(o,a,{silent:true});s.registries&&(n.registries=s.registries);let c=t("Writing components.json.").start(),m=E__default.resolve(e.cwd,"components.json"),l=`${m}${he}`,p$1=(g,w)=>{let{registries:h,...x}=fr(g,w);return {...x,registries:h}};if(!e.force&&R.existsSync(l)){let g=await R.readJson(l);n=p$1(g,n);}e.registryBaseConfig&&(n=p$1(n,e.registryBaseConfig)),n.registries=Object.fromEntries(Object.entries(n.registries||{}).filter(([g])=>!Object.keys(b).includes(g))),await promises.writeFile(m,`${JSON.stringify(n,null,2)} `,"utf8"),c.succeed();let u=await j(e.cwd,n);return await ie(o,u,{overwrite:true,silent:e.silent,baseStyle:e.baseStyle,isNewProject:e.isNewProject||t$1?.framework.name==="next-app"}),e.isNewProject&&e.srcDir&&await mr(["./src/**/*.{js,ts,jsx,tsx,mdx}"],u,{silent:e.silent}),u}async function on(e$1=null){let[t,r]=await Promise.all([ca(),ea()]);s.info("");let i=await Fe([{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(n=>({title:n.label,value:n.name}))},{type:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${d.info("base color")}?`,choices:r.map(n=>({title:n.label,value:n.name}))},{type:"text",name:"tailwindCss",message:`Where is your ${d.info("global CSS")} file?`,initial:e$1?.tailwind.css??g},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${d.info("CSS variables")} for theming?`,initial:e$1?.tailwind.cssVariables??true,active:"yes",inactive:"no"},{type:"text",name:"tailwindPrefix",message:`Are you using a custom ${d.info("tailwind prefix eg. tw-")}? (Leave blank if not)`,initial:""},{type:"text",name:"tailwindConfig",message:`Where is your ${d.info("tailwind.config.js")} located?`,initial:e$1?.tailwind.config??h},{type:"text",name:"components",message:`Configure the import alias for ${d.info("components")}:`,initial:e$1?.aliases.components??e},{type:"text",name:"utils",message:`Configure the import alias for ${d.info("utils")}:`,initial:e$1?.aliases.utils??f},{type:"toggle",name:"rsc",message:`Are you using ${d.info("React Server Components")}?`,initial:e$1?.rsc??true,active:"yes",inactive:"no"}]);return c.parse({$schema:"https://ui.shadcn.com/schema.json",style:i.style,tailwind:{config:i.tailwindConfig,css:i.tailwindCss,baseColor:i.tailwindBaseColor,cssVariables:i.tailwindCssVariables,prefix:i.tailwindPrefix},rsc:i.rsc,tsx:i.typescript,aliases:{utils:i.utils,components:i.components,lib:i.components.replace(/\/components$/,"lib"),hooks:i.components.replace(/\/components$/,"hooks")}})}async function sn(e,t){let r$1=e.style,i=t.baseColor,n=e.tailwind.cssVariables,o=e.iconLibrary??"lucide";if(!t.defaults){let[a,s,c]=await Promise.all([ca(),ea(),r(e)]),m=await Fe([{type:c==="v4"||r$1?null:"select",name:"style",message:`Which ${d.info("style")} would you like to use?`,choices:a.map(l=>({title:l.name==="new-york"?"New York (Recommended)":l.label,value:l.name})),initial:0},{type:t.baseColor?null:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${d.info("base color")}?`,choices:s.map(l=>({title:l.label,value:l.name}))}]);r$1=m.style??r$1??"new-york",i=m.tailwindBaseColor??i,n=t.cssVariables;}return c.parse({$schema:e?.$schema,style:r$1,tailwind:{...e?.tailwind,baseColor:i,cssVariables:n},rsc:e?.rsc,tsx:e?.tsx,iconLibrary:o,aliases:e?.aliases})}async function ur(e){let t={};if(!R.existsSync(e.cwd)||!R.existsSync(E__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!R.existsSync(E__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,config:null};try{let r=await i(e.cwd);return {errors:t,config:r}}catch{s.break(),s.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e.cwd)}. Before you can add components, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),s.error(`Learn more at ${d.info("https://ui.shadcn.com/docs/components-json")}.`),s.break(),process.exit(1);}}async function hr(e,t){let r=E__default.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await Y__default.stat(r)).isFile())return;let[i]=await _([e],{config:t});if(!i?.meta?.importSpecifier||!i?.meta?.moduleSpecifier)return;let n=`import { ${i?.meta?.importSpecifier} } from "${i.meta.moduleSpecifier}" export default function Page() { return <${i?.meta?.importSpecifier} /> }`;await Y__default.writeFile(r,n,"utf8");}var ln=z$1.object({components:z$1.array(z$1.string()).optional(),yes:z$1.boolean(),overwrite:z$1.boolean(),cwd:z$1.string(),all:z$1.boolean(),path:z$1.string().optional(),silent:z$1.boolean(),srcDir:z$1.boolean().optional(),cssVariables:z$1.boolean()}),yr=new Command().name("add").description("add a component to your project").argument("[components...]","names, url or local path to component").option("-y, --yes","skip confirmation prompt.",false).option("-o, --overwrite","overwrite existing files.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-a, --all","add all available components",false).option("-p, --path <path>","the path to add the component to.").option("-s, --silent","mute output.",false).option("--src-dir","use the src directory when creating a new project.",false).option("--no-src-dir","do not use the src directory when creating a new project.").option("--css-variables","use css variables for theming.",true).option("--no-css-variables","do not use css variables for theming.").action(async(e,t)=>{try{let r=ln.parse({components:e,cwd:E__default.resolve(t.cwd),...t});await B(r.cwd);let i$1=await i(r.cwd);i$1||(i$1=n({style:"new-york",resolvedPaths:{cwd:r.cwd}}));let n$1=["sidebar-","login-","signup-","otp-","calendar-"],o=["base-","radix-"];if(e.length>0&&i$1?.style&&o.some(x=>i$1?.style.startsWith(x))){let x=e.filter(S=>n$1.some(M=>S.startsWit