hghcn 3.6.5 → 3.6.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
- import {b as b$1,a as a$1}from'./chunk-SSXFFJQN.js';import {a,O,n,R as R$1,_,s,d,Y,P,p,i,q,j as j$1,t,b,ca,ea,g,h,e,f,r,N,c as c$1,ba,K as K$1,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 j from'path';import j__default,{join}from'path';import {promises,existsSync}from'fs';import R from'fs-extra';import S$1 from'postcss';import ti from'postcss/lib/at-rule';import lt,{z as z$1}from'zod';import {execa}from'execa';import Te from'prompts';import {SyntaxKind,Project,ScriptKind,VariableDeclarationKind}from'ts-morph';import Ze,{tmpdir}from'os';import {Command}from'commander';import lr from'deepmerge';import*as K from'fs/promises';import K__default from'fs/promises';import st from'dedent';import vr from'open';import {diffLines}from'diff';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {randomBytes}from'crypto';import Fn from'fast-glob';async function Jt(e){let t$1={};if(!R.existsSync(e.cwd)||!R.existsSync(j__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(j__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)}.
2
+ import {b as b$1,a as a$1}from'./chunk-SSXFFJQN.js';import {a,O,n,R as R$1,_,s,d,Y,P,p,i,q,j as j$1,t,b,ca,ea,g,h,e,f,r,N,c as c$1,ba,K as K$1,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 j from'path';import j__default,{join}from'path';import R from'fs-extra';import {existsSync,promises}from'fs';import S$1 from'postcss';import ti from'postcss/lib/at-rule';import ct,{z as z$1}from'zod';import {execa}from'execa';import Te from'prompts';import {SyntaxKind,Project,ScriptKind,VariableDeclarationKind}from'ts-morph';import Ze,{tmpdir}from'os';import {Command}from'commander';import cr from'deepmerge';import*as K from'fs/promises';import K__default from'fs/promises';import ot from'dedent';import vr from'open';import {diffLines}from'diff';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {randomBytes}from'crypto';import Tn from'fast-glob';async function Gt(e){let t$1={};if(!R.existsSync(e.cwd)||!R.existsSync(j__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(j__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)}.
3
3
  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);return (!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)}.
4
4
  Visit ${d.info(n?.framework.links.installation)} to manually configure your project.
5
- 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)}.`),{errors:t$1,projectInfo:n}}function Kt(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=j__default.normalize(r.replace(/\\/g,"/")),n=j__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(j__default.isAbsolute(i))return i.startsWith(n+j__default.sep);let p=j__default.resolve(n,i);return p.startsWith(n+j__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=j__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 Qr(a,e);await promises.writeFile(i,s,"utf8"),o.succeed();}async function Qr(e,t){let r=[Zr(t)],i=await S$1(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,`
5
+ 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)}.`),{errors:t$1,projectInfo:n}}function Jt(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=j__default.normalize(r.replace(/\\/g,"/")),n=j__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(j__default.isAbsolute(i))return i.startsWith(n+j__default.sep);let p=j__default.resolve(n,i);return p.startsWith(n+j__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=j__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 Qr(a,e);await promises.writeFile(i,s,"utf8"),o.succeed();}async function Qr(e,t){let r=[Zr(t)],i=await S$1(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,`
6
6
 
7
7
  `),n=n.trimEnd(),n}function Zr(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=S$1.atRule({name:"import",params:a,raws:{semicolon:true}}),l=t.nodes?.filter(m=>m.type==="atrule"&&m.name==="import");if(l&&l.length>0){let m=l[l.length-1];c.raws.before=`
8
8
  `,t.insertAfter(m,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=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:c(m.params)===c(a))){let m=S$1.atRule({name:"plugin",params:s,raws:{semicolon:true,before:`
@@ -12,22 +12,22 @@ Once configured, you can use the cli to add components.`),s.break(),process.exit
12
12
  `}}),s.append(l)),typeof i=="object")for(let[m,p]of Object.entries(i))te(l,m,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,l]of Object.entries(i))if(typeof l=="string"){let m=s.nodes?.find(u=>u.type==="decl"&&u.prop===c),p=S$1.decl({prop:c,value:l,raws:{semicolon:true,before:`
13
13
  `}});m?m.replaceWith(p):s.append(p);}else typeof l=="object"&&te(s,c,l);}else {let c=S$1.atRule({name:o,params:a,raws:{semicolon:true,between:" ",before:`
14
14
  `}});if(t.append(c),t.insertBefore(c,S$1.comment({text:"---break---"})),typeof i=="object")for(let[l,m]of Object.entries(i))if(typeof m=="string"){let p=S$1.decl({prop:l,value:m,raws:{semicolon:true,before:`
15
- `}});c.append(p);}else typeof m=="object"&&te(c,l,m);}}else o==="property"?te(t,r,i):qt(t,o,a,i);}else te(t,r,i);}}}function qt(e,t,r,i){let n=e.nodes?.find(o=>o.type==="atrule"&&o.name===t&&o.params===r);if(n||(n=S$1.atRule({name:t,params:r,raws:{semicolon:true,between:" ",before:`
16
- `}}),e.append(n),e.insertBefore(n,S$1.comment({text:"---break---"}))),typeof i=="object")for(let[o,a]of Object.entries(i))if(o.startsWith("@")){let s=o.match(/@([a-zA-Z-]+)\s*(.*)/);if(s){let[,c,l]=s;qt(n,c,l,a);}}else te(n,o,a);else if(typeof i=="string")try{let a=S$1.parse(`.temp{${i}}`).first;if(a&&a.nodes){let s=S$1.rule({selector:"temp",raws:{semicolon:!0,between:" ",before:`
15
+ `}});c.append(p);}else typeof m=="object"&&te(c,l,m);}}else o==="property"?te(t,r,i):Yt(t,o,a,i);}else te(t,r,i);}}}function Yt(e,t,r,i){let n=e.nodes?.find(o=>o.type==="atrule"&&o.name===t&&o.params===r);if(n||(n=S$1.atRule({name:t,params:r,raws:{semicolon:true,between:" ",before:`
16
+ `}}),e.append(n),e.insertBefore(n,S$1.comment({text:"---break---"}))),typeof i=="object")for(let[o,a]of Object.entries(i))if(o.startsWith("@")){let s=o.match(/@([a-zA-Z-]+)\s*(.*)/);if(s){let[,c,l]=s;Yt(n,c,l,a);}}else te(n,o,a);else if(typeof i=="string")try{let a=S$1.parse(`.temp{${i}}`).first;if(a&&a.nodes){let s=S$1.rule({selector:"temp",raws:{semicolon:!0,between:" ",before:`
17
17
  `}});a.nodes.forEach(c=>{if(c.type==="decl"){let l=c.clone();l.raws.before=`
18
18
  `,s.append(l);}}),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=S$1.rule({selector:t,raws:{semicolon:true,between:" ",before:`
19
19
  `}}),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,l=S$1.atRule({name:s,params:c,raws:{semicolon:true,before:`
20
20
  `}});i.append(l);}}else if(typeof o=="string"){let a=S$1.decl({prop:n,value:o,raws:{semicolon:true,before:`
21
21
  `}}),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=S$1.parse(`.temp{${r}}`).first;o&&o.nodes&&o.nodes.forEach(a=>{if(a.type==="decl"){let s=a.clone();s.raws.before=`
22
- `,i?.append(s);}});}catch(n){throw console.error("Error parsing rule content:",t,r,n),n}}async function Ye(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=j__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 ri(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 ri(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=[ni(t)];if(i.cleanupDefaultNextStyles&&n.push(Qt()),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(li({params:"tw-animate-css"}));}n.push(ci({params:"dark (&:is(.dark *))"})),i.cleanupDefaultNextStyles&&n.push(Qt()),n.push(si(t,{overwriteCssVars:i.overwriteCssVars})),n.push(ai(t)),i.tailwindConfig&&(n.push(mi(i.tailwindConfig)),n.push(pi(i.tailwindConfig)),n.push(fi(i.tailwindConfig)));}r.tailwind.cssVariables&&i.initIndex&&n.push(ii({tailwindVersion:i.tailwindVersion}));let a=(await S$1(n).process(e,{from:void 0})).css;return a=a.replace(/\/\* ---break--- \*\//g,""),i.tailwindVersion==="v4"&&(a=a.replace(/(\n\s*\n)+/g,`
22
+ `,i?.append(s);}});}catch(n){throw console.error("Error parsing rule content:",t,r,n),n}}async function Ye(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=j__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 ri(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 ri(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=[ni(t)];if(i.cleanupDefaultNextStyles&&n.push(Xt()),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(li({params:"tw-animate-css"}));}n.push(ci({params:"dark (&:is(.dark *))"})),i.cleanupDefaultNextStyles&&n.push(Xt()),n.push(si(t,{overwriteCssVars:i.overwriteCssVars})),n.push(ai(t)),i.tailwindConfig&&(n.push(mi(i.tailwindConfig)),n.push(pi(i.tailwindConfig)),n.push(fi(i.tailwindConfig)));}r.tailwind.cssVariables&&i.initIndex&&n.push(ii({tailwindVersion:i.tailwindVersion}));let a=(await S$1(n).process(e,{from:void 0})).css;return a=a.replace(/\/\* ---break--- \*\//g,""),i.tailwindVersion==="v4"&&(a=a.replace(/(\n\s*\n)+/g,`
23
23
 
24
24
  `)),a}function ii({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=S$1.atRule({name:"layer",params:"base",raws:{semicolon:true,between:" ",before:`
25
25
  `}}),t.append(i),t.insertBefore(i,S$1.comment({text:"---break---"}))),r.forEach(({selector:n,apply:o})=>{i?.nodes?.find(s=>s.type==="rule"&&s.selector===n)||i?.append(S$1.rule({selector:n,nodes:[S$1.atRule({name:"apply",params:o,raws:{semicolon:true,before:`
26
26
  `}})],raws:{semicolon:true,between:" ",before:`
27
27
  `}}));});}}}function ni(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 ti||(r=S$1.atRule({name:"layer",params:"base",nodes:[],raws:{semicolon:true,before:`
28
- `,between:" "}}),t.append(r),t.insertBefore(r,S$1.comment({text:"---break---"}))),r!==void 0&&Object.entries(e).forEach(([i,n])=>{let o=i==="light"?":root":`.${i}`;oi(r,o,n);});}}}function Xt(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 Qt(){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()),Xt(e);let r=e.nodes.find(i=>i.type==="atrule"&&i.params==="(prefers-color-scheme: dark)");r&&(Xt(r),r.nodes.length===0&&r.remove());}}}function oi(e,t,r){let i=e.nodes?.find(n=>n.type==="rule"&&n.selector===t);i||Object.keys(r).length>0&&(i=S$1.rule({selector:t,raws:{between:" ",before:`
28
+ `,between:" "}}),t.append(r),t.insertBefore(r,S$1.comment({text:"---break---"}))),r!==void 0&&Object.entries(e).forEach(([i,n])=>{let o=i==="light"?":root":`.${i}`;oi(r,o,n);});}}}function Ht(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 Xt(){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()),Ht(e);let r=e.nodes.find(i=>i.type==="atrule"&&i.params==="(prefers-color-scheme: dark)");r&&(Ht(r),r.nodes.length===0&&r.remove());}}}function oi(e,t,r){let i=e.nodes?.find(n=>n.type==="rule"&&n.selector===t);i||Object.keys(r).length>0&&(i=S$1.rule({selector:t,raws:{between:" ",before:`
29
29
  `}}),e.append(i)),Object.entries(r).forEach(([n,o])=>{let a=`--${n.replace(/^--/,"")}`,s=S$1.decl({prop:a,value:o,raws:{semicolon:true}}),c=i?.nodes.find(l=>l.type==="decl"&&l.prop===a);c?c.replaceWith(s):i?.append(s);});}function si(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=Pe(r);Object.entries(n).forEach(([c,l])=>{let m=`--${c.replace(/^--/,"")}`,p=S$1.decl({prop:m,value:l,raws:{semicolon:true}}),u=s?.nodes?.find(g=>g.type==="decl"&&g.prop===m);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=S$1.rule({selector:o,nodes:[],raws:{semicolon:true,between:" ",before:`
30
- `}}),r.append(a),r.insertBefore(a,S$1.comment({text:"---break---"}))),Object.entries(n).forEach(([s,c])=>{let l=`--${s.replace(/^--/,"")}`;l==="--sidebar-background"&&(l="--sidebar"),Zt(c)&&(c=`hsl(${c})`);let m=S$1.decl({prop:l,value:c,raws:{semicolon:true}}),p=a?.nodes.find(u=>u.type==="decl"&&u.prop===l);t.overwriteCssVars?p?p.replaceWith(m):a?.append(m):p||a?.append(m);});});}}}function ai(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=Pe(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=S$1.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=Zt(a)||ui(a)?`--color-${o.replace(/^--/,"")}`:`--${o.replace(/^--/,"")}`;s==="--color-sidebar-background"&&(s="--color-sidebar");let c=`var(--${o})`;s==="--color-sidebar"&&(c="var(--sidebar)");let l=S$1.decl({prop:s,value:c,raws:{semicolon:true}});i?.nodes?.find(p=>p.type==="decl"&&p.prop===l.prop)||(n?.length?i?.insertAfter(n[n.length-1],l):i?.append(l));}}}}function Pe(e){let t=e.nodes.find(r=>r.type==="atrule"&&r.name==="theme"&&r.params==="inline");return t||(t=S$1.atRule({name:"theme",params:"inline",nodes:[],raws:{semicolon:true,between:" ",before:`
30
+ `}}),r.append(a),r.insertBefore(a,S$1.comment({text:"---break---"}))),Object.entries(n).forEach(([s,c])=>{let l=`--${s.replace(/^--/,"")}`;l==="--sidebar-background"&&(l="--sidebar"),Qt(c)&&(c=`hsl(${c})`);let m=S$1.decl({prop:l,value:c,raws:{semicolon:true}}),p=a?.nodes.find(u=>u.type==="decl"&&u.prop===l);t.overwriteCssVars?p?p.replaceWith(m):a?.append(m):p||a?.append(m);});});}}}function ai(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=Pe(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=S$1.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=Qt(a)||ui(a)?`--color-${o.replace(/^--/,"")}`:`--${o.replace(/^--/,"")}`;s==="--color-sidebar-background"&&(s="--color-sidebar");let c=`var(--${o})`;s==="--color-sidebar"&&(c="var(--sidebar)");let l=S$1.decl({prop:s,value:c,raws:{semicolon:true}});i?.nodes?.find(p=>p.type==="decl"&&p.prop===l.prop)||(n?.length?i?.insertAfter(n[n.length-1],l):i?.append(l));}}}}function Pe(e){let t=e.nodes.find(r=>r.type==="atrule"&&r.name==="theme"&&r.params==="inline");return t||(t=S$1.atRule({name:"theme",params:"inline",nodes:[],raws:{semicolon:true,between:" ",before:`
31
31
  `}}),e.append(t),e.insertBefore(t,S$1.comment({text:"---break---"}))),t}function ci({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=S$1.atRule({name:"custom-variant",params:e,raws:{semicolon:true,before:`
32
32
  `}});if(i.length>0){let o=i[i.length-1];t.insertAfter(o,n);}else t.insertAfter(t.nodes[0],n);t.insertBefore(n,S$1.comment({text:"---break---"}));}}}}function li({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=S$1.atRule({name:"import",params:`"${e}"`,raws:{semicolon:true,before:`
33
33
  `}});if(r.length>0){let a=r[r.length-1];t.insertAfter(a,o);}else i?(t.insertBefore(i,o),t.insertBefore(i,S$1.comment({text:"---break---"}))):(t.prepend(o),t.insertAfter(o,S$1.comment({text:"---break---"})));}}}}function mi(e){return {postcssPlugin:"update-tailwind-config",Once(t){if(!e?.plugins)return;let i=di(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(l=>l.params.replace(/["']/g,"")===s))continue;let c=S$1.atRule({name:"plugin",params:`${i}${s}${i}`,raws:{semicolon:true,before:`
@@ -35,38 +35,37 @@ Once configured, you can use the cli to add components.`),s.break(),process.exit
35
35
  `}});for(let[l,m]of Object.entries(s.data)){let p=S$1.rule({selector:l,nodes:Object.entries(m).map(([u,g])=>S$1.decl({prop:u,value:g,raws:{semicolon:true,before:`
36
36
  `,between:": "}})),raws:{semicolon:true,between:" ",before:`
37
37
  `}});c.append(p);}r.append(c),r.insertBefore(c,S$1.comment({text:"---break---"}));}}}}function pi(e){return {postcssPlugin:"update-tailwind-config-animation",Once(t){if(!e?.theme?.extend?.animation)return;let r=Pe(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(l=>l.prop===s))continue;let c=S$1.decl({prop:s,value:a,raws:{semicolon:true,between:": ",before:`
38
- `}});r.append(c);}}}}function di(e){return e.nodes[0].toString().includes("'")?"single":"double"}function Zt(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 ui(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 wi(r),a="";if(hi(r)&&o==="npm")if(i.silent)a="force";else {n.stopAndPersist(),s.warn(`
38
+ `}});r.append(c);}}}}function di(e){return e.nodes[0].toString().includes("'")?"single":"double"}function Qt(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 ui(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 wi(r),a="";if(hi(r)&&o==="npm")if(i.silent)a="force";else {n.stopAndPersist(),s.warn(`
39
39
  It looks like you are using React 19.
40
40
  Some packages may fail to install due to peer dependency issues in npm (see https://ui.shadcn.com/react-19).
41
41
  `);let s$1=await Te([{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 yi(o,e,t$1,r.resolvedPaths.cwd,a),n?.succeed();}function hi(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 wi(e){return o$1(e.resolvedPaths.cwd,false)?.dependencies?.expo?"expo":a$1(e.resolvedPaths.cwd)}async function yi(e,t,r,i,n){if(e==="npm")return bi(t,r,i,n);if(e==="deno")return xi(t,r,i);if(e==="expo")return vi(t,r,i);t?.length&&await execa(e,["add",...t],{cwd:i}),r?.length&&await execa(e,["add","-D",...r],{cwd:i});}async function bi(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 xi(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 vi(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 He(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=j__default.join(n,".env.local"),a=G(n);a&&(o=a);let s$1=existsSync(o),c=j__default.basename(o),l=Object.entries(e).map(([g,w])=>`${g}=${w}`).join(`
42
42
  `),m=[],p=null,u=null;if(s$1){let g=await promises.readFile(o,"utf-8"),w=I(g,l);if(m=H$1(g,l),m.length>0){if(await promises.writeFile(o,w,"utf-8"),p=j__default.relative(n,o),i?.succeed(`Added the following variables to ${d.info(c)}:`),!r.silent)for(let h of m)s.log(` ${d.success("+")} ${h}`);}else i?.stop();}else if(await promises.writeFile(o,l+`
43
- `,"utf-8"),u=j__default.relative(n,o),m=Object.keys(e),i?.succeed(`Added the following variables to ${d.info(c)}:`),!r.silent)for(let g of m)s.log(` ${d.success("+")} ${g}`);return !r.silent&&m.length>0&&s.break(),{envVarsAdded:m,envFileUpdated:p,envFileCreated:u}}async function tr(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 Xe(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 ji(e,t$1,i),n?.succeed("Updating fonts.");}catch(o){throw n?.fail("Failed to update fonts."),o}}async function ji(e,t,r){let i=await Ei(t,r);if(!i)return;let n=await promises.readFile(i,"utf-8"),o=await $i(n,e);o!==n&&await promises.writeFile(i,o,"utf-8");}async function Ei(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=j__default.join(r,s);if(existsSync(c))return c}return null}async function $i(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 l=Oi(c),m=n.getImportDeclaration(g=>g.getModuleSpecifierValue()==="next/font/google"),p=Ni(s);m?m.getNamedImports().some(h=>h.getName()===c)||m.addNamedImport(c):n.addImportDeclaration({moduleSpecifier:"next/font/google",namedImports:[c]});let u=Ti(n,s.font.variable);if(u)u.setInitializer(`${c}(${p})`),u.getName()!==l&&u.rename(l);else {let g=Fi(n);n.insertVariableStatement(g,{declarationKind:VariableDeclarationKind.Const,declarations:[{name:l,initializer:`${c}(${p})`}]}).appendWhitespace(`
44
- `);}a.push(l);}return a.length>0&&Ai(n,a),n.getFullText()}function Ni(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 Oi(e){return e.split("_").map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function Ti(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 Fi(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function Ai(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 l=t.map(m=>`${m}.variable`).join(", ");t.length===1?i.addAttribute({name:"className",initializer:`{${l}}`}):(ge(e),i.addAttribute({name:"className",initializer:`{cn(${l})}`}));return}if(o.getKind()!==SyntaxKind.JsxAttribute)return;let a=o.asKindOrThrow(SyntaxKind.JsxAttribute),s=a.getInitializer();if(!s)return;let c=t.map(l=>`${l}.variable`);if(s.getKind()===SyntaxKind.StringLiteral){let l=s.getText().slice(1,-1);ge(e),a.setInitializer(`{cn("${l}", ${c.join(", ")})}`);}else if(s.getKind()===SyntaxKind.JsxExpression){let l=s.asKindOrThrow(SyntaxKind.JsxExpression),m=l.getExpression();if(!m)return;let p=m.getText();if(p.startsWith("cn(")){if(c.every(h=>p.includes(h)))continue;let g=_i(p),w=Li(g,c);l.replaceWithText(`{${w}}`);}else if(/^\w+\.variable$/.test(p)){if(c.includes(p))continue;c.length===1?l.replaceWithText(`{${c[0]}}`):(ge(e),l.replaceWithText(`{cn(${c.join(", ")})}`));}else if(p.startsWith("`")&&p.endsWith("`")){let u=Di(p);ge(e),l.replaceWithText(`{cn(${[...u,...c].join(", ")})}`);}else ge(e),l.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 Di(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 _i(e){return e.replace(/,?\s*\w+\.variable/g,"").replace(/cn\(\s*,/,"cn(")}function Li(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 Wi(e,t,i,{...r,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await Mi(e,t,r)}async function Mi(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(new Error("Failed to fetch components from registry."));try{ir(n.files??[],t$1.resolvedPaths.cwd);}catch(s){return i?.fail(),Y(s)}i?.succeed();let o=await r(t$1);n=await tr(n,t$1),await T$1(n.tailwind?.config,t$1,{silent:r$1.silent,tailwindVersion:o});let a=await rr(e,t$1);await Ye(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 He(n.envVars,t$1,{silent:r$1.silent}),await z(n.dependencies,n.devDependencies,t$1,{silent:r$1.silent}),await Xe(n.fonts,t$1,{silent:r$1.silent}),await K$1(n.files,t$1,{overwrite:r$1.overwrite,silent:r$1.silent,path:r$1.path}),n.docs&&s.info(n.docs);}async function Wi(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(new Error("Failed to fetch components from registry."));try{ir(o.files??[],t$1.resolvedPaths.cwd);}catch(h){return n?.fail(),Y(h)}n?.succeed();let a=[],s$1=[],c=[],l$1=t("Installing components.")?.start(),m$1=r$1.ui,p=await r(m$1),u=m(t$1.resolvedPaths.cwd,m$1.resolvedPaths.ui);if(o.tailwind?.config&&(await T$1(o.tailwind?.config,m$1,{silent:true,tailwindVersion:p}),s$1.push(j__default.relative(u,m$1.resolvedPaths.tailwindConfig))),o.cssVars){let h=await rr(e,t$1);await Ye(o.cssVars,m$1,{silent:true,tailwindVersion:p,tailwindConfig:o.tailwind?.config,overwriteCssVars:h}),s$1.push(j__default.relative(u,m$1.resolvedPaths.tailwindCss));}o.css&&(await Ke(o.css,m$1,{silent:true}),s$1.push(j__default.relative(u,m$1.resolvedPaths.tailwindCss))),o.envVars&&await He(o.envVars,m$1,{silent:true}),await z(o.dependencies,o.devDependencies,m$1,{silent:true}),await Xe(o.fonts,m$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),v=h==="registry:ui"?r$1.ui:t$1,M=m(t$1.resolvedPaths.cwd,v.resolvedPaths.ui||v.resolvedPaths.cwd),F=await l(M,v.resolvedPaths.cwd)??v.resolvedPaths.cwd,X=await K$1(x,v,{overwrite:i.overwrite,silent:true,rootSpinner:l$1,isRemote:i.isRemote,isWorkspace:true,path:i.path});a.push(...X.filesCreated.map(A=>j__default.relative(M,j__default.join(F,A)))),s$1.push(...X.filesUpdated.map(A=>j__default.relative(M,j__default.join(F,A)))),c.push(...X.filesSkipped.map(A=>j__default.relative(M,j__default.join(F,A))));}if(l$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 rr(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 ir(e,t){for(let r of e)if(r?.target&&!Kt(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}var et="https://codeload.github.com/shadcn-ui/ui/tar.gz/main",L={next:"next","next-monorepo":"next-monorepo",vite:"vite",start:"start"};async function Ee(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(s$1);}if(!e.force){let{type:s,name:c}=await Te([{type:e.template||n?null:"select",name:"type",message:`The path ${d.info(e.cwd)} does not contain a package.json file.
45
- 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:l=>l.trim(),validate:l=>l.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(j__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 Bi(a,{version:i,cwd:e.cwd,packageManager:o,srcDir:!!e.srcDir}),t===L["next-monorepo"]&&await Ui(a,{packageManager:o}),t===L.vite&&await Gi(a,{packageManager:o}),t===L.start&&await Ji(a,{packageManager:o}),{projectPath:a,projectName:r,template:t}}async function Bi(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 Ui(e,t$1){let r=t("Creating a new Next.js monorepo. This may take a few minutes.").start();try{let i=j__default.join(Ze.tmpdir(),`shadcn-template-${Date.now()}`);await R.ensureDir(i);let n=await fetch(et);if(!n.ok)throw new Error(`Failed to download template: ${n.statusText}`);let o=j__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=j__default.resolve(i,"monorepo-next");await R.move(a,e),await R.remove(i),await execa(t$1.packageManager,["install"],{cwd:e});let s=j__default.join(e,"package.json");if(R.existsSync(s)){let l=await R.readFile(s,"utf8"),m=JSON.parse(l);m.name=e.split("/").pop(),await R.writeFile(s,JSON.stringify(m,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(i);}}async function Gi(e,t$1){let r=t("Creating a new Vite project. This may take a few minutes.").start();try{let i=j__default.join(Ze.tmpdir(),`shadcn-template-${Date.now()}`);await R.ensureDir(i);let n=await fetch(et);if(!n.ok)throw new Error(`Failed to download template: ${n.statusText}`);let o=j__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=j__default.resolve(i,"vite-app");if(await R.move(a,e),await R.remove(i),t$1.packageManager!=="pnpm"){let c=j__default.join(e,"pnpm-lock.yaml");R.existsSync(c)&&await R.remove(c);}await execa(t$1.packageManager,["install"],{cwd:e});let s=j__default.join(e,"package.json");if(R.existsSync(s)){let c=await R.readFile(s,"utf8"),l=JSON.parse(c);l.name=e.split("/").pop(),await R.writeFile(s,JSON.stringify(l,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(i);}}async function Ji(e,t$1){let r=t("Creating a new TanStack Start project. This may take a few minutes.").start();try{let i=j__default.join(Ze.tmpdir(),`shadcn-template-${Date.now()}`);await R.ensureDir(i);let n=await fetch(et);if(!n.ok)throw new Error(`Failed to download template: ${n.statusText}`);let o=j__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=j__default.resolve(i,"start-app");if(await R.move(a,e),await R.remove(i),t$1.packageManager!=="pnpm"){let c=j__default.join(e,"pnpm-lock.yaml");R.existsSync(c)&&await R.remove(c);}await execa(t$1.packageManager,["install"],{cwd:e});let s=j__default.join(e,"package.json");if(R.existsSync(s)){let c=await R.readFile(s,"utf8"),l=JSON.parse(c);l.name=e.split("/").pop(),await R.writeFile(s,JSON.stringify(l,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(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 nr(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 or(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 tt(e){let t=`${e}${he}`;if(!R.existsSync(t))return false;try{return R.unlinkSync(t),!0}catch{return false}}async function sr(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:l}=F(c);l&&!b[l]&&r.add(l),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 sr(e,t$1)).filter(l=>!t$1.registries?.[l]&&!Object.keys(b).includes(l));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 l of n)o[l]&&(a[l]=o[l]);if(Object.keys(a).length===0)return {config:t$1,newRegistries:[]};let s=Object.fromEntries(Object.entries(t$1.registries||{}).filter(([l])=>!Object.keys(b).includes(l))),c$1={...t$1,registries:{...s,...a}};if(r.writeFile){let{resolvedPaths:l,...m}=c$1,p=t("Updating components.json.",{silent:r.silent}).start(),u=c.parse(m);await R.writeFile(j__default.resolve(t$1.resolvedPaths.cwd,"components.json"),JSON.stringify(u,null,2)+`
46
- `,"utf-8"),p.succeed();}return {config:c$1,newRegistries:Object.keys(a)}}async function cr(e,t$1,r){if(!e)return;r={silent:false,...r};let i=j__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 Qi(o,e,t$1);await promises.writeFile(t$1.resolvedPaths.tailwindConfig,a,"utf8"),n?.succeed();}async function Qi(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?(Zi(n,t),i.getFullText()):e}async function Zi(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=j__default.resolve(process.cwd(),"components.json");return e===0?tt(t):or(t)});var it=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()}),mr=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=it.parse({cwd:j__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=j__default.resolve(r.cwd,"components.json");if(R.existsSync(n$1)){let s=await R.readJson(n$1),c$1=c.partial().parse(s),l=n({resolvedPaths:{cwd:r.cwd}});i=O({...c$1,resolvedPaths:{...l.resolvedPaths,cwd:r.cwd}}),nr(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(lr(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.
47
- You may now add components.`),tt(j__default.resolve(r.cwd,"components.json")),s.break();}catch(r){s.break(),Y(r);}finally{P();}});async function le(e){let t$1,r;if(e.skipPreflight)t$1=await p(e.cwd);else {let g=await Jt(e);if(g.errors["1"]){let{projectPath:w,template:h}=await Ee(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=j__default.resolve(e.cwd,"apps/web"),await i(e.cwd);let i$1=await q(e.cwd,t$1),n=i$1?await nn(i$1,e):await rn(await i(e.cwd));if(!e.yes){let{proceed:g}=await Te({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$1(e.cwd,n),{config:s}=await T(o,a,{silent:true});s.registries&&(n.registries=s.registries);let c=t("Writing components.json.").start(),l=j__default.resolve(e.cwd,"components.json"),m=`${l}${he}`,p$1=(g,w)=>{let{registries:h,...x}=lr(g,w);return {...x,registries:h}};if(!e.force&&R.existsSync(m)){let g=await R.readJson(m);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(l,`${JSON.stringify(n,null,2)}
48
- `,"utf8"),c.succeed();let u=await j$1(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 cr(["./src/**/*.{js,ts,jsx,tsx,mdx}"],u,{silent:e.silent}),u}async function rn(e$1=null){let[t,r]=await Promise.all([ca(),ea()]);s.info("");let i=await Te([{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:"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 nn(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)]),l=await Te([]);r$1=l.style??r$1??"new-york",i=l.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 pr(e){let t={};if(!R.existsSync(e.cwd)||!R.existsSync(j__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!R.existsSync(j__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)}.
49
- 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 ur(e,t){let r=j__default.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await K__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}"
43
+ `,"utf-8"),u=j__default.relative(n,o),m=Object.keys(e),i?.succeed(`Added the following variables to ${d.info(c)}:`),!r.silent)for(let g of m)s.log(` ${d.success("+")} ${g}`);return !r.silent&&m.length>0&&s.break(),{envVarsAdded:m,envFileUpdated:p,envFileCreated:u}}async function er(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 Xe(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 ji(e,t$1,i),n?.succeed("Updating fonts.");}catch(o){throw n?.fail("Failed to update fonts."),o}}async function ji(e,t,r){let i=await Ei(t,r);if(!i)return;let n=await promises.readFile(i,"utf-8"),o=await $i(n,e);o!==n&&await promises.writeFile(i,o,"utf-8");}async function Ei(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=j__default.join(r,s);if(existsSync(c))return c}return null}async function $i(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 l=Oi(c),m=n.getImportDeclaration(g=>g.getModuleSpecifierValue()==="next/font/google"),p=Ni(s);m?m.getNamedImports().some(h=>h.getName()===c)||m.addNamedImport(c):n.addImportDeclaration({moduleSpecifier:"next/font/google",namedImports:[c]});let u=Ti(n,s.font.variable);if(u)u.setInitializer(`${c}(${p})`),u.getName()!==l&&u.rename(l);else {let g=Fi(n);n.insertVariableStatement(g,{declarationKind:VariableDeclarationKind.Const,declarations:[{name:l,initializer:`${c}(${p})`}]}).appendWhitespace(`
44
+ `);}a.push(l);}return a.length>0&&Ai(n,a),n.getFullText()}function Ni(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 Oi(e){return e.split("_").map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function Ti(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 Fi(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function Ai(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 l=t.map(m=>`${m}.variable`).join(", ");t.length===1?i.addAttribute({name:"className",initializer:`{${l}}`}):(ge(e),i.addAttribute({name:"className",initializer:`{cn(${l})}`}));return}if(o.getKind()!==SyntaxKind.JsxAttribute)return;let a=o.asKindOrThrow(SyntaxKind.JsxAttribute),s=a.getInitializer();if(!s)return;let c=t.map(l=>`${l}.variable`);if(s.getKind()===SyntaxKind.StringLiteral){let l=s.getText().slice(1,-1);ge(e),a.setInitializer(`{cn("${l}", ${c.join(", ")})}`);}else if(s.getKind()===SyntaxKind.JsxExpression){let l=s.asKindOrThrow(SyntaxKind.JsxExpression),m=l.getExpression();if(!m)return;let p=m.getText();if(p.startsWith("cn(")){if(c.every(h=>p.includes(h)))continue;let g=_i(p),w=Li(g,c);l.replaceWithText(`{${w}}`);}else if(/^\w+\.variable$/.test(p)){if(c.includes(p))continue;c.length===1?l.replaceWithText(`{${c[0]}}`):(ge(e),l.replaceWithText(`{cn(${c.join(", ")})}`));}else if(p.startsWith("`")&&p.endsWith("`")){let u=Di(p);ge(e),l.replaceWithText(`{cn(${[...u,...c].join(", ")})}`);}else ge(e),l.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 Di(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 _i(e){return e.replace(/,?\s*\w+\.variable/g,"").replace(/cn\(\s*,/,"cn(")}function Li(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 Wi(e,t,i,{...r,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await Mi(e,t,r)}async function Mi(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(new Error("Failed to fetch components from registry."));try{rr(n.files??[],t$1.resolvedPaths.cwd);}catch(s){return i?.fail(),Y(s)}i?.succeed();let o=await r(t$1);n=await er(n,t$1),await T$1(n.tailwind?.config,t$1,{silent:r$1.silent,tailwindVersion:o});let a=await tr(e,t$1);await Ye(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 He(n.envVars,t$1,{silent:r$1.silent}),await z(n.dependencies,n.devDependencies,t$1,{silent:r$1.silent}),await Xe(n.fonts,t$1,{silent:r$1.silent}),await K$1(n.files,t$1,{overwrite:r$1.overwrite,silent:r$1.silent,path:r$1.path}),n.docs&&s.info(n.docs);}async function Wi(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(new Error("Failed to fetch components from registry."));try{rr(o.files??[],t$1.resolvedPaths.cwd);}catch(h){return n?.fail(),Y(h)}n?.succeed();let a=[],s$1=[],c=[],l$1=t("Installing components.")?.start(),m$1=r$1.ui,p=await r(m$1),u=m(t$1.resolvedPaths.cwd,m$1.resolvedPaths.ui);if(o.tailwind?.config&&(await T$1(o.tailwind?.config,m$1,{silent:true,tailwindVersion:p}),s$1.push(j__default.relative(u,m$1.resolvedPaths.tailwindConfig))),o.cssVars){let h=await tr(e,t$1);await Ye(o.cssVars,m$1,{silent:true,tailwindVersion:p,tailwindConfig:o.tailwind?.config,overwriteCssVars:h}),s$1.push(j__default.relative(u,m$1.resolvedPaths.tailwindCss));}o.css&&(await Ke(o.css,m$1,{silent:true}),s$1.push(j__default.relative(u,m$1.resolvedPaths.tailwindCss))),o.envVars&&await He(o.envVars,m$1,{silent:true}),await z(o.dependencies,o.devDependencies,m$1,{silent:true}),await Xe(o.fonts,m$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),v=h==="registry:ui"?r$1.ui:t$1,M=m(t$1.resolvedPaths.cwd,v.resolvedPaths.ui||v.resolvedPaths.cwd),F=await l(M,v.resolvedPaths.cwd)??v.resolvedPaths.cwd,X=await K$1(x,v,{overwrite:i.overwrite,silent:true,rootSpinner:l$1,isRemote:i.isRemote,isWorkspace:true,path:i.path});a.push(...X.filesCreated.map(A=>j__default.relative(M,j__default.join(F,A)))),s$1.push(...X.filesUpdated.map(A=>j__default.relative(M,j__default.join(F,A)))),c.push(...X.filesSkipped.map(A=>j__default.relative(M,j__default.join(F,A))));}if(l$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 tr(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 rr(e,t){for(let r of e)if(r?.target&&!Jt(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}var et="https://codeload.github.com/shadcn-ui/ui/tar.gz/main",L={next:"next","next-monorepo":"next-monorepo",vite:"vite",start:"start"};async function Ee(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(s$1);}if(!e.force){let{type:s,name:c}=await Te([{type:e.template||n?null:"select",name:"type",message:`The path ${d.info(e.cwd)} does not contain a package.json file.
45
+ 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:l=>l.trim(),validate:l=>l.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(j__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 Bi(a,{version:i,cwd:e.cwd,packageManager:o,srcDir:!!e.srcDir}),t===L["next-monorepo"]&&await Ui(a,{packageManager:o}),t===L.vite&&await Gi(a,{packageManager:o}),t===L.start&&await Ji(a,{packageManager:o}),{projectPath:a,projectName:r,template:t}}async function Bi(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 Ui(e,t$1){let r=t("Creating a new Next.js monorepo. This may take a few minutes.").start();try{let i=j__default.join(Ze.tmpdir(),`shadcn-template-${Date.now()}`);await R.ensureDir(i);let n=await fetch(et);if(!n.ok)throw new Error(`Failed to download template: ${n.statusText}`);let o=j__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=j__default.resolve(i,"monorepo-next");await R.move(a,e),await R.remove(i),await execa(t$1.packageManager,["install"],{cwd:e});let s=j__default.join(e,"package.json");if(R.existsSync(s)){let l=await R.readFile(s,"utf8"),m=JSON.parse(l);m.name=e.split("/").pop(),await R.writeFile(s,JSON.stringify(m,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(i);}}async function Gi(e,t$1){let r=t("Creating a new Vite project. This may take a few minutes.").start();try{let i=j__default.join(Ze.tmpdir(),`shadcn-template-${Date.now()}`);await R.ensureDir(i);let n=await fetch(et);if(!n.ok)throw new Error(`Failed to download template: ${n.statusText}`);let o=j__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=j__default.resolve(i,"vite-app");if(await R.move(a,e),await R.remove(i),t$1.packageManager!=="pnpm"){let c=j__default.join(e,"pnpm-lock.yaml");R.existsSync(c)&&await R.remove(c);}await execa(t$1.packageManager,["install"],{cwd:e});let s=j__default.join(e,"package.json");if(R.existsSync(s)){let c=await R.readFile(s,"utf8"),l=JSON.parse(c);l.name=e.split("/").pop(),await R.writeFile(s,JSON.stringify(l,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(i);}}async function Ji(e,t$1){let r=t("Creating a new TanStack Start project. This may take a few minutes.").start();try{let i=j__default.join(Ze.tmpdir(),`shadcn-template-${Date.now()}`);await R.ensureDir(i);let n=await fetch(et);if(!n.ok)throw new Error(`Failed to download template: ${n.statusText}`);let o=j__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=j__default.resolve(i,"start-app");if(await R.move(a,e),await R.remove(i),t$1.packageManager!=="pnpm"){let c=j__default.join(e,"pnpm-lock.yaml");R.existsSync(c)&&await R.remove(c);}await execa(t$1.packageManager,["install"],{cwd:e});let s=j__default.join(e,"package.json");if(R.existsSync(s)){let c=await R.readFile(s,"utf8"),l=JSON.parse(c);l.name=e.split("/").pop(),await R.writeFile(s,JSON.stringify(l,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(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 ir(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 nr(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 tt(e){let t=`${e}${he}`;if(!R.existsSync(t))return false;try{return R.unlinkSync(t),!0}catch{return false}}async function or(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:l}=F(c);l&&!b[l]&&r.add(l),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 or(e,t$1)).filter(l=>!t$1.registries?.[l]&&!Object.keys(b).includes(l));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 l of n)o[l]&&(a[l]=o[l]);if(Object.keys(a).length===0)return {config:t$1,newRegistries:[]};let s=Object.fromEntries(Object.entries(t$1.registries||{}).filter(([l])=>!Object.keys(b).includes(l))),c$1={...t$1,registries:{...s,...a}};if(r.writeFile){let{resolvedPaths:l,...m}=c$1,p=t("Updating components.json.",{silent:r.silent}).start(),u=c.parse(m);await R.writeFile(j__default.resolve(t$1.resolvedPaths.cwd,"components.json"),JSON.stringify(u,null,2)+`
46
+ `,"utf-8"),p.succeed();}return {config:c$1,newRegistries:Object.keys(a)}}async function ar(e,t$1,r){if(!e)return;r={silent:false,...r};let i=j__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 Qi(o,e,t$1);await promises.writeFile(t$1.resolvedPaths.tailwindConfig,a,"utf8"),n?.succeed();}async function Qi(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?(Zi(n,t),i.getFullText()):e}async function Zi(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=j__default.resolve(process.cwd(),"components.json");return e===0?tt(t):nr(t)});var it=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()}),lr=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=it.parse({cwd:j__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=j__default.resolve(r.cwd,"components.json");if(R.existsSync(n$1)){let s=await R.readJson(n$1),c$1=c.partial().parse(s),l=n({resolvedPaths:{cwd:r.cwd}});i=O({...c$1,resolvedPaths:{...l.resolvedPaths,cwd:r.cwd}}),ir(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(cr(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.
47
+ You may now add components.`),tt(j__default.resolve(r.cwd,"components.json")),s.break();}catch(r){s.break(),Y(r);}finally{P();}});async function le(e){let t$1,r;if(e.skipPreflight)t$1=await p(e.cwd);else {let g=await Gt(e);if(g.errors["1"]){let{projectPath:w,template:h}=await Ee(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=j__default.resolve(e.cwd,"apps/web"),await i(e.cwd);let i$1=await q(e.cwd,t$1),n=i$1?await rn(i$1,e):await tn(await i(e.cwd));if(!e.yes){let{proceed:g}=await Te({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$1(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=`${j__default.resolve(e.cwd,"components.json")}${he}`,p$1=(g,w)=>{let{registries:h,...x}=cr(g,w);return {...x,registries:h}};if(!e.force&&R.existsSync(m)){let g=await R.readJson(m);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))),c.succeed();let u=await j$1(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 ar(["./src/**/*.{js,ts,jsx,tsx,mdx}"],u,{silent:e.silent}),u}async function tn(e$1=null){let[t,r]=await Promise.all([ca(),ea()]);s.info("");let i=await Te([{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:"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 rn(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)]),l=await Te([]);r$1=l.style??r$1??"new-york",i=l.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 fr(e){let t={};if(!R.existsSync(e.cwd)||!R.existsSync(j__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!R.existsSync(j__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)}.
48
+ 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 dr(e,t){let r=j__default.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await K__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}"
50
49
 
51
50
  export default function Page() {
52
51
  return <${i?.meta?.importSpecifier} />
53
- }`;await K__default.writeFile(r,n,"utf8");}var an=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()}),hr=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=an.parse({components:e,cwd:j__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(v=>n$1.some(M=>v.startsWith(M)));x.length&&(s.warn(`The ${d.info(x.map(v=>v).join(", "))} component(s) are not available for the ${d.info(i$1.style)} style yet. They are coming soon.`),s.warn("In the meantime, you can visit the blocks page on https://ui.shadcn.com/blocks and copy the code."),s.break(),process.exit(1));}let a=!1;if(e.length>0){let{config:h,newRegistries:x}=await T(e,i$1,{silent:r.silent,writeFile:!1});i$1=h,a=x.length>0;}let s$1,c=!0;if(e.length>0){let[h]=await _([e[0]],{config:i$1});if(s$1=h?.type,c=s$1!=="registry:theme"&&s$1!=="registry:style",N(h)){await ie(e,i$1,{...r,baseStyle:c});return}if(!r.yes&&(s$1==="registry:style"||s$1==="registry:theme")){s.break();let{confirm:x}=await Te({type:"confirm",name:"confirm",message:d.warn(`You are about to install a new ${s$1.replace("registry:","")}.
54
- Existing CSS variables and components will be overwritten. Continue?`)});x||(s.break(),s.log("Installation cancelled."),s.break(),process.exit(1));}}if(r.components?.length||(r.components=await cn(r)),(await p(r.cwd))?.tailwindVersion==="v4"){let h=c$1.filter(x=>r.components?.includes(x.name));h?.length&&(s.break(),h.forEach(x=>{s.warn(d.warn(x.message));}),s.break(),process.exit(1));}let{errors:m,config:p$1}=await pr(r),u=!1;if(m["3"]){let{proceed:h}=await Te({type:"confirm",name:"proceed",message:`You need to create a ${d.info("components.json")} file to add components. Proceed?`,initial:!0});h||(s.break(),process.exit(1)),p$1=await le({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:r.silent&&!a,isNewProject:!1,srcDir:r.srcDir,cssVariables:r.cssVariables,baseStyle:c,baseColor:c?void 0:"neutral",components:r.components}),u=!0;}let g=!1;if(m["1"]){let{projectPath:h,template:x}=await Ee({cwd:r.cwd,force:r.overwrite,srcDir:r.srcDir,components:r.components});h||(s.break(),process.exit(1)),r.cwd=h,x==="next-monorepo"?(r.cwd=j__default.resolve(r.cwd,"apps/web"),p$1=await i(r.cwd)):(p$1=await le({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!a&&r.silent,isNewProject:!0,srcDir:r.srcDir,cssVariables:r.cssVariables,baseStyle:c,baseColor:c?void 0:"neutral",components:r.components}),u=!0,g=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//));}if(!p$1)throw new Error(`Failed to read config at ${d.info(r.cwd)}.`);let{config:w}=await T(r.components,p$1,{silent:r.silent||a});p$1=w,u||await ie(r.components,p$1,{...r,baseStyle:c}),g&&await ur(r.components[0],p$1);}catch(r){s.break(),Y(r);}finally{P();}});async function cn(e){let t=await ba();if(!t)return s.break(),Y(new Error("Failed to fetch registry index.")),[];if(e.all)return t.map(n=>n.name).filter(n=>!c$1.some(o=>o.name===n));if(e.components?.length)return e.components;let{components:r}=await Te({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(n=>n.type==="registry:ui"&&!c$1.some(o=>o.name===n.name)).map(n=>({title:n.name,value:n.name,selected:e.all?true:e.components?.includes(n.name)}))});r?.length||(s.warn("No components selected. Exiting."),s.info(""),process.exit(1));let i=z$1.array(z$1.string()).safeParse(r);return i.success?i.data:(s.error(""),Y(new Error("Something went wrong. Please try again.")),[])}async function br(e){let t={},r={cwd:e.cwd,registryFile:j__default.resolve(e.cwd,e.registryFile),outputDir:j__default.resolve(e.cwd,e.outputDir)};return R.existsSync(r.registryFile)||(t["13"]=true),await R.mkdir(r.outputDir,{recursive:true}),Object.keys(t).length>0&&(t["13"]&&(s.break(),s.error(`The path ${d.info(r.registryFile)} does not exist.`)),s.break(),process.exit(1)),{errors:t,resolvePaths:r}}var mn=z$1.object({cwd:z$1.string(),registryFile:z$1.string(),outputDir:z$1.string()}),xr=new Command().name("build").description("build components for a shadcn registry").argument("[registry]","path to registry.json file","./registry.json").option("-o, --output <path>","destination directory for json files","./public/r").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t$1)=>{try{let r=mn.parse({cwd:j.resolve(t$1.cwd),registryFile:e,outputDir:t$1.output}),{resolvePaths:i}=await br(r),n=await K.readFile(i.registryFile,"utf-8"),o$1=o.safeParse(JSON.parse(n));o$1.success||(s.error(`Invalid registry file found at ${d.info(i.registryFile)}.`),process.exit(1));let a=t("Building registry...");for(let s$1 of o$1.data.items){a.start(`Building ${s$1.name}...`),s$1.$schema="https://ui.shadcn.com/schema/registry-item.json";for(let l of s$1.files??[])l.content=await K.readFile(j.resolve(i.cwd,l.path),"utf-8");let c=n$1.safeParse(s$1);if(!c.success){s.error(`Invalid registry item found for ${d.info(s$1.name)}.`);continue}await K.writeFile(j.resolve(i.outputDir,`${c.data.name}.json`),JSON.stringify(c.data,null,2));}await K.copyFile(i.registryFile,j.resolve(i.outputDir,"registry.json")),a.succeed("Building registry.");}catch(r){s.break(),Y(r);}});var Sr="https://ui.shadcn.com",dn={next:"Next.js",vite:"Vite",start:"TanStack Start"},Rr=new Command().name("create").description("create a new project with shadcn/ui").argument("[name]","the name of your project").option("-t, --template <template>","the template to use. e.g. next, start or vite").option("-p, --preset [name]","use a preset configuration").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("--src-dir","use the src directory when creating a new project.",false).option("--no-src-dir","do not use the src directory when creating a new project.").option("-y, --yes","skip confirmation prompt.",true).action(async(e,t)=>{try{if(!e&&!t.template&&!t.preset){let w=Cr();s.log("Build your own shadcn/ui."),s.log(`You will be taken to ${d.info(w)} to build your custom design system.`),s.break();let{proceed:h}=await Te({type:"confirm",name:"proceed",message:"Open in browser?",initial:!0});h&&await vr(w),process.exit(0);}let i=e;if(!i){let{enteredName:w}=await Te({type:"text",name:"enteredName",message:"What is your project named?",initial:t.template?`${t.template}-app`:"my-app",format:h=>h.trim(),validate:h=>h.length>128?"Name should be less than 128 characters.":!0});w||process.exit(0),i=w;}let n=t.template;if(!n){let{selectedTemplate:w}=await Te({type:"select",name:"selectedTemplate",message:`Which ${d.info("template")} would you like to use?`,choices:Object.entries(dn).map(([h,x])=>({title:x,value:h}))});w||process.exit(0),n=w;}let o=await gn(t.preset??!0);o||process.exit(0);let a,s$1;"_isUrl"in o?(a=o.url,s$1=new URL(o.url).searchParams.get("baseColor")??"neutral"):(a=un(o),s$1=o.baseColor);let c=O({}),{config:l}=await T([a],c,{silent:!0});c=l;let[m]=await _([a],{config:c}),p;m?.type==="registry:base"&&m.config&&(p=m.config);let u=it.parse({cwd:j__default.resolve(t.cwd),name:i,components:[a],yes:t.yes,defaults:!1,force:!1,silent:!1,isNewProject:!0,srcDir:t.srcDir,cssVariables:!0,template:n,baseColor:s$1,baseStyle:!1,registryBaseConfig:p,skipPreflight:!1}),g=await le(u);if(g){await ie(["component-example"],g,{baseStyle:!1,silent:!0,overwrite:!0});let w=hn(n);w.length>0&&await K$1(w,g,{overwrite:!0,silent:!0});}s.log(`${d.success("Success!")} Project initialization completed.
55
- You may now add components.`),s.break();}catch(r){s.break(),Y(r);}finally{P();}});function un(e){let t=new URLSearchParams({base:e.base,style:e.style,baseColor:e.baseColor,theme:e.theme,iconLibrary:e.iconLibrary,font:e.font,menuAccent:e.menuAccent,menuColor:e.menuColor,radius:e.radius});return `${wn()}?${t.toString()}`}async function gn(e){if(e===true){let t=await ka(),{selectedPreset:r}=await Te({type:"select",name:"selectedPreset",message:`Which ${d.info("preset")} would you like to use?`,choices:[...t.map(i=>({title:i.title,description:i.description,value:i.name})),{title:"Custom",description:"Build your own on https://ui.shadcn.com",value:"custom"}]});if(!r)return null;if(r==="custom"){let i=Cr();return s.info(`
52
+ }`;await K__default.writeFile(r,n,"utf8");}var sn=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()}),hr=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=sn.parse({components:e,cwd:j__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(v=>n$1.some(M=>v.startsWith(M)));x.length&&(s.warn(`The ${d.info(x.map(v=>v).join(", "))} component(s) are not available for the ${d.info(i$1.style)} style yet. They are coming soon.`),s.warn("In the meantime, you can visit the blocks page on https://ui.shadcn.com/blocks and copy the code."),s.break(),process.exit(1));}let a=!1;if(e.length>0){let{config:h,newRegistries:x}=await T(e,i$1,{silent:r.silent,writeFile:!1});i$1=h,a=x.length>0;}let s$1,c=!0;if(e.length>0){let[h]=await _([e[0]],{config:i$1});if(s$1=h?.type,c=s$1!=="registry:theme"&&s$1!=="registry:style",N(h)){await ie(e,i$1,{...r,baseStyle:c});return}if(!r.yes&&(s$1==="registry:style"||s$1==="registry:theme")){s.break();let{confirm:x}=await Te({type:"confirm",name:"confirm",message:d.warn(`You are about to install a new ${s$1.replace("registry:","")}.
53
+ Existing CSS variables and components will be overwritten. Continue?`)});x||(s.break(),s.log("Installation cancelled."),s.break(),process.exit(1));}}if(r.components?.length||(r.components=await an(r)),(await p(r.cwd))?.tailwindVersion==="v4"){let h=c$1.filter(x=>r.components?.includes(x.name));h?.length&&(s.break(),h.forEach(x=>{s.warn(d.warn(x.message));}),s.break(),process.exit(1));}let{errors:m,config:p$1}=await fr(r),u=!1;m["3"]&&(p$1=await le({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:r.silent&&!a,isNewProject:!1,srcDir:r.srcDir,cssVariables:r.cssVariables,baseStyle:c,baseColor:c?void 0:"neutral",components:r.components}),u=!0);let g=!1;if(m["1"]){let{projectPath:h,template:x}=await Ee({cwd:r.cwd,force:r.overwrite,srcDir:r.srcDir,components:r.components});h||(s.break(),process.exit(1)),r.cwd=h,x==="next-monorepo"?(r.cwd=j__default.resolve(r.cwd,"apps/web"),p$1=await i(r.cwd)):(p$1=await le({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!a&&r.silent,isNewProject:!0,srcDir:r.srcDir,cssVariables:r.cssVariables,baseStyle:c,baseColor:c?void 0:"neutral",components:r.components}),u=!0,g=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//));}if(!p$1)throw new Error(`Failed to read config at ${d.info(r.cwd)}.`);let{config:w}=await T(r.components,p$1,{silent:r.silent||a});p$1=w,u||await ie(r.components,p$1,{...r,baseStyle:c}),g&&await dr(r.components[0],p$1);}catch(r){s.break(),Y(r);}finally{P();}});async function an(e){let t=await ba();if(!t)return s.break(),Y(new Error("Failed to fetch registry index.")),[];if(e.all)return t.map(n=>n.name).filter(n=>!c$1.some(o=>o.name===n));if(e.components?.length)return e.components;let{components:r}=await Te({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(n=>n.type==="registry:ui"&&!c$1.some(o=>o.name===n.name)).map(n=>({title:n.name,value:n.name,selected:e.all?true:e.components?.includes(n.name)}))});r?.length||(s.warn("No components selected. Exiting."),s.info(""),process.exit(1));let i=z$1.array(z$1.string()).safeParse(r);return i.success?i.data:(s.error(""),Y(new Error("Something went wrong. Please try again.")),[])}async function br(e){let t={},r={cwd:e.cwd,registryFile:j__default.resolve(e.cwd,e.registryFile),outputDir:j__default.resolve(e.cwd,e.outputDir)};return R.existsSync(r.registryFile)||(t["13"]=true),await R.mkdir(r.outputDir,{recursive:true}),Object.keys(t).length>0&&(t["13"]&&(s.break(),s.error(`The path ${d.info(r.registryFile)} does not exist.`)),s.break(),process.exit(1)),{errors:t,resolvePaths:r}}var ln=z$1.object({cwd:z$1.string(),registryFile:z$1.string(),outputDir:z$1.string()}),xr=new Command().name("build").description("build components for a shadcn registry").argument("[registry]","path to registry.json file","./registry.json").option("-o, --output <path>","destination directory for json files","./public/r").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t$1)=>{try{let r=ln.parse({cwd:j.resolve(t$1.cwd),registryFile:e,outputDir:t$1.output}),{resolvePaths:i}=await br(r),n=await K.readFile(i.registryFile,"utf-8"),o$1=o.safeParse(JSON.parse(n));o$1.success||(s.error(`Invalid registry file found at ${d.info(i.registryFile)}.`),process.exit(1));let a=t("Building registry...");for(let s$1 of o$1.data.items){a.start(`Building ${s$1.name}...`),s$1.$schema="https://ui.shadcn.com/schema/registry-item.json";for(let l of s$1.files??[])l.content=await K.readFile(j.resolve(i.cwd,l.path),"utf-8");let c=n$1.safeParse(s$1);if(!c.success){s.error(`Invalid registry item found for ${d.info(s$1.name)}.`);continue}await K.writeFile(j.resolve(i.outputDir,`${c.data.name}.json`),JSON.stringify(c.data,null,2));}await K.copyFile(i.registryFile,j.resolve(i.outputDir,"registry.json")),a.succeed("Building registry.");}catch(r){s.break(),Y(r);}});var Sr="https://ui.shadcn.com",pn={next:"Next.js",vite:"Vite",start:"TanStack Start"},Rr=new Command().name("create").description("create a new project with shadcn/ui").argument("[name]","the name of your project").option("-t, --template <template>","the template to use. e.g. next, start or vite").option("-p, --preset [name]","use a preset configuration").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("--src-dir","use the src directory when creating a new project.",false).option("--no-src-dir","do not use the src directory when creating a new project.").option("-y, --yes","skip confirmation prompt.",true).action(async(e,t)=>{try{if(!e&&!t.template&&!t.preset){let w=Cr();s.log("Build your own shadcn/ui."),s.log(`You will be taken to ${d.info(w)} to build your custom design system.`),s.break();let{proceed:h}=await Te({type:"confirm",name:"proceed",message:"Open in browser?",initial:!0});h&&await vr(w),process.exit(0);}let i=e;if(!i){let{enteredName:w}=await Te({type:"text",name:"enteredName",message:"What is your project named?",initial:t.template?`${t.template}-app`:"my-app",format:h=>h.trim(),validate:h=>h.length>128?"Name should be less than 128 characters.":!0});w||process.exit(0),i=w;}let n=t.template;if(!n){let{selectedTemplate:w}=await Te({type:"select",name:"selectedTemplate",message:`Which ${d.info("template")} would you like to use?`,choices:Object.entries(pn).map(([h,x])=>({title:x,value:h}))});w||process.exit(0),n=w;}let o=await un(t.preset??!0);o||process.exit(0);let a,s$1;"_isUrl"in o?(a=o.url,s$1=new URL(o.url).searchParams.get("baseColor")??"neutral"):(a=dn(o),s$1=o.baseColor);let c=O({}),{config:l}=await T([a],c,{silent:!0});c=l;let[m]=await _([a],{config:c}),p;m?.type==="registry:base"&&m.config&&(p=m.config);let u=it.parse({cwd:j__default.resolve(t.cwd),name:i,components:[a],yes:t.yes,defaults:!1,force:!1,silent:!1,isNewProject:!0,srcDir:t.srcDir,cssVariables:!0,template:n,baseColor:s$1,baseStyle:!1,registryBaseConfig:p,skipPreflight:!1}),g=await le(u);if(g){await ie(["component-example"],g,{baseStyle:!1,silent:!0,overwrite:!0});let w=gn(n);w.length>0&&await K$1(w,g,{overwrite:!0,silent:!0});}s.log(`${d.success("Success!")} Project initialization completed.
54
+ You may now add components.`),s.break();}catch(r){s.break(),Y(r);}finally{P();}});function dn(e){let t=new URLSearchParams({base:e.base,style:e.style,baseColor:e.baseColor,theme:e.theme,iconLibrary:e.iconLibrary,font:e.font,menuAccent:e.menuAccent,menuColor:e.menuColor,radius:e.radius});return `${hn()}?${t.toString()}`}async function un(e){if(e===true){let t=await ka(),{selectedPreset:r}=await Te({type:"select",name:"selectedPreset",message:`Which ${d.info("preset")} would you like to use?`,choices:[...t.map(i=>({title:i.title,description:i.description,value:i.name})),{title:"Custom",description:"Build your own on https://ui.shadcn.com",value:"custom"}]});if(!r)return null;if(r==="custom"){let i=Cr();return s.info(`
56
55
  Opening ${d.info(i)} in your browser...
57
- `),await vr(i),null}return t.find(i=>i.name===r)??null}if(typeof e=="string"){if(M(e))return {_isUrl:true,url:e};let t=await la(e);if(!t){let i=(await ka()).map(n=>n.name).join(", ");s.error(`Preset "${e}" not found. Available presets: ${i}`),process.exit(1);}return t}return null}function hn(e){switch(e){case "vite":return [{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:st`import { ComponentExample } from "@/components/component-example";
56
+ `),await vr(i),null}return t.find(i=>i.name===r)??null}if(typeof e=="string"){if(M(e))return {_isUrl:true,url:e};let t=await la(e);if(!t){let i=(await ka()).map(n=>n.name).join(", ");s.error(`Preset "${e}" not found. Available presets: ${i}`),process.exit(1);}return t}return null}function gn(e){switch(e){case "vite":return [{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:ot`import { ComponentExample } from "@/components/component-example";
58
57
 
59
58
  export function App() {
60
59
  return <ComponentExample />;
61
60
  }
62
61
 
63
62
  export default App;
64
- `}];case "next":return [{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:st`import { ComponentExample } from "@/components/component-example";
63
+ `}];case "next":return [{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:ot`import { ComponentExample } from "@/components/component-example";
65
64
 
66
65
  export default function Page() {
67
66
  return <ComponentExample />;
68
67
  }
69
- `}];case "start":return [{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:st`import { createFileRoute } from "@tanstack/react-router";
68
+ `}];case "start":return [{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:ot`import { createFileRoute } from "@tanstack/react-router";
70
69
  import { ComponentExample } from "@/components/component-example";
71
70
 
72
71
  export const Route = createFileRoute("/")({ component: App });
@@ -76,18 +75,18 @@ function App() {
76
75
  <ComponentExample />
77
76
  );
78
77
  }
79
- `}];default:return []}}function Cr(){return `${Sr}/create`}function wn(){return `${Sr}/init`}var vn=z$1.object({component:z$1.string().optional(),yes:z$1.boolean(),cwd:z$1.string(),path:z$1.string().optional()}),kr=new Command().name("diff").description("check for updates against the registry").argument("[component]","the component name").option("-y, --yes","skip confirmation prompt.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=vn.parse({component:e,...t}),i$1=j__default.resolve(r.cwd);existsSync(i$1)||(s.error(`The path ${i$1} does not exist. Please try again.`),process.exit(1));let n=await i(i$1);n||(s.warn(`Configuration is missing. Please run ${d.success("init")} to create a components.json file.`),process.exit(1));let o=await ba();if(o||(Y(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let c=n.resolvedPaths.components,l=o.filter(p=>{for(let u of p.files??[]){let g=j__default.resolve(c,typeof u=="string"?u:u.path);if(existsSync(g))return !0}return !1}),m=[];for(let p of l){let u=await Ir(p,n);u.length&&m.push({name:p.name,changes:u});}m.length||(s.info("No updates found."),process.exit(0)),s.info("The following components have updates available:");for(let p of m){s.info(`- ${p.name}`);for(let u of p.changes)s.info(` - ${u.filePath}`);}s.break(),s.info(`Run ${d.success("diff <component>")} to see the changes.`),process.exit(0);}let a=o.find(c=>c.name===r.component);a||(s.error(`The component ${d.success(r.component)} does not exist.`),process.exit(1));let s$1=await Ir(a,n);s$1.length||(s.info(`No updates found for ${r.component}.`),process.exit(0));for(let c of s$1)s.info(`- ${c.filePath}`),await Sn(c.patch),s.info("");}catch(r){Y(r);}});async function Ir(e,t){let r=await ha(t.style,[e]),i=await fa(t.tailwind.baseColor);if(!r)return [];let n=[];for(let o of r){let a=await ia(t,o);if(a)for(let s of o.files??[]){let c=j__default.resolve(a,typeof s=="string"?s:s.path);if(!existsSync(c))continue;let l=await promises.readFile(c,"utf8");if(typeof s=="string"||!s.content)continue;let m=await J({filename:s.path,raw:s.content,config:t,baseColor:i}),p=diffLines(m,l);p.length>1&&n.push({filePath:c,patch:p});}}return n}async function Sn(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 Pr=new Command().name("info").description("get information about your project").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{try{s.info("> project info"),console.log(await p(e.cwd)),s.break(),s.info("> components.json"),console.log(await i(e.cwd));}catch(t){Y(t);}});var fe="latest",Ae=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${fe}`,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${fe}`,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{shadcn:{command:"npx",args:[`shadcn@${fe}`,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.shadcn]
78
+ `}];default:return []}}function Cr(){return `${Sr}/create`}function hn(){return `${Sr}/init`}var xn=z$1.object({component:z$1.string().optional(),yes:z$1.boolean(),cwd:z$1.string(),path:z$1.string().optional()}),kr=new Command().name("diff").description("check for updates against the registry").argument("[component]","the component name").option("-y, --yes","skip confirmation prompt.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=xn.parse({component:e,...t}),i$1=j__default.resolve(r.cwd);existsSync(i$1)||(s.error(`The path ${i$1} does not exist. Please try again.`),process.exit(1));let n=await i(i$1);n||(s.warn(`Configuration is missing. Please run ${d.success("init")} to create a components.json file.`),process.exit(1));let o=await ba();if(o||(Y(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let c=n.resolvedPaths.components,l=o.filter(p=>{for(let u of p.files??[]){let g=j__default.resolve(c,typeof u=="string"?u:u.path);if(existsSync(g))return !0}return !1}),m=[];for(let p of l){let u=await Ir(p,n);u.length&&m.push({name:p.name,changes:u});}m.length||(s.info("No updates found."),process.exit(0)),s.info("The following components have updates available:");for(let p of m){s.info(`- ${p.name}`);for(let u of p.changes)s.info(` - ${u.filePath}`);}s.break(),s.info(`Run ${d.success("diff <component>")} to see the changes.`),process.exit(0);}let a=o.find(c=>c.name===r.component);a||(s.error(`The component ${d.success(r.component)} does not exist.`),process.exit(1));let s$1=await Ir(a,n);s$1.length||(s.info(`No updates found for ${r.component}.`),process.exit(0));for(let c of s$1)s.info(`- ${c.filePath}`),await vn(c.patch),s.info("");}catch(r){Y(r);}});async function Ir(e,t){let r=await ha(t.style,[e]),i=await fa(t.tailwind.baseColor);if(!r)return [];let n=[];for(let o of r){let a=await ia(t,o);if(a)for(let s of o.files??[]){let c=j__default.resolve(a,typeof s=="string"?s:s.path);if(!existsSync(c))continue;let l=await promises.readFile(c,"utf8");if(typeof s=="string"||!s.content)continue;let m=await J({filename:s.path,raw:s.content,config:t,baseColor:i}),p=diffLines(m,l);p.length>1&&n.push({filePath:c,patch:p});}}return n}async function vn(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 Pr=new Command().name("info").description("get information about your project").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{try{s.info("> project info"),console.log(await p(e.cwd)),s.break(),s.info("> components.json"),console.log(await i(e.cwd));}catch(t){Y(t);}});var fe="latest",Ae=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${fe}`,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${fe}`,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{shadcn:{command:"npx",args:[`shadcn@${fe}`,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.shadcn]
80
79
  command = "npx"
81
80
  args = ["shadcn@${fe}", "mcp"]
82
- `}],Fe=[`shadcn@${fe}`],mt=new Command().name("mcp").description("MCP server and configuration commands").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{try{await B(e.cwd);let t=new StdioServerTransport;await b$1.connect(t);}catch(t){s.break(),Y(t);}}),En=lt.object({client:lt.enum(["claude","cursor","vscode","codex"]),cwd:lt.string()});mt.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${Ae.map(e=>e.name).join(", ")})`).action(async(e,t$1)=>{try{let i$1=(t$1.parent?.opts()||{}).cwd||process.cwd(),n=e.client;if(!n){let l=await Te({type:"select",name:"client",message:"Which MCP client are you using?",choices:Ae.map(m=>({title:m.label,value:m.name}))});l.client||(s.break(),process.exit(1)),n=l.client;}let o=En.parse({client:n,cwd:i$1}),a=await i(o.cwd);if(o.client==="codex"){if(a)await z([],Fe,a,{silent:!1});else {let l=await a$1(o.cwd),m=l==="npm"?"install":"add",p=l==="npm"?"--save-dev":"-D",u=t("Installing dependencies...").start();await execa(l,[m,p,...Fe],{cwd:o.cwd}),u.succeed("Installing dependencies.");}s.break(),s.log("To configure the shadcn MCP server in Codex:"),s.break(),s.log(`1. Open or create the file ${d.info("~/.codex/config.toml")}`),s.log("2. Add the following configuration:"),s.log(),s.info(`[mcp_servers.shadcn]
81
+ `}],Fe=[`shadcn@${fe}`],lt=new Command().name("mcp").description("MCP server and configuration commands").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{try{await B(e.cwd);let t=new StdioServerTransport;await b$1.connect(t);}catch(t){s.break(),Y(t);}}),jn=ct.object({client:ct.enum(["claude","cursor","vscode","codex"]),cwd:ct.string()});lt.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${Ae.map(e=>e.name).join(", ")})`).action(async(e,t$1)=>{try{let i$1=(t$1.parent?.opts()||{}).cwd||process.cwd(),n=e.client;if(!n){let l=await Te({type:"select",name:"client",message:"Which MCP client are you using?",choices:Ae.map(m=>({title:m.label,value:m.name}))});l.client||(s.break(),process.exit(1)),n=l.client;}let o=jn.parse({client:n,cwd:i$1}),a=await i(o.cwd);if(o.client==="codex"){if(a)await z([],Fe,a,{silent:!1});else {let l=await a$1(o.cwd),m=l==="npm"?"install":"add",p=l==="npm"?"--save-dev":"-D",u=t("Installing dependencies...").start();await execa(l,[m,p,...Fe],{cwd:o.cwd}),u.succeed("Installing dependencies.");}s.break(),s.log("To configure the shadcn MCP server in Codex:"),s.break(),s.log(`1. Open or create the file ${d.info("~/.codex/config.toml")}`),s.log("2. Add the following configuration:"),s.log(),s.info(`[mcp_servers.shadcn]
83
82
  command = "npx"
84
- args = ["shadcn@${fe}", "mcp"]`),s.break(),s.info("3. Restart Codex to load the MCP server"),s.break(),process.exit(0);}let s$1=t("Configuring MCP server...").start(),c=await Nn(o);if(s$1.succeed("Configuring MCP server."),a)await z([],Fe,a,{silent:!1});else {let l=await a$1(o.cwd),m=l==="npm"?"install":"add",p=l==="npm"?"--save-dev":"-D",u=t("Installing dependencies...").start();await execa(l,[m,p,...Fe],{cwd:o.cwd}),u.succeed("Installing dependencies.");}s.break(),s.success(`Configuration saved to ${c}.`),s.break();}catch(r){Y(r);}});var $n=(e,t)=>t;async function Nn(e){let{client:t,cwd:r}=e,i=Ae.find(c=>c.name===t);if(!i)throw new Error(`Unknown client: ${t}. Available clients: ${Ae.map(c=>c.name).join(", ")}`);let n=j__default.join(r,i.configPath),o=j__default.dirname(n);await R.ensureDir(o);let a={};try{let c=await promises.readFile(n,"utf-8");a=JSON.parse(c);}catch{}let s=lr(a,i.config,{arrayMerge:$n});return await promises.writeFile(n,JSON.stringify(s,null,2)+`
85
- `,"utf-8"),i.configPath}var H={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 Or(e){if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let t$1=e.resolvedPaths.ui,[r,i]=await Promise.all([Fn("**/*.{js,ts,jsx,tsx}",{cwd:t$1}),da()]);if(Object.keys(i).length===0)throw new Error("Something went wrong fetching the registry icons.");let n=Object.entries(H).map(([m,p])=>({title:p.name,value:m})),o=await Te([{type:"select",name:"sourceLibrary",message:`Which icon library would you like to ${d.info("migrate from")}?`,choices:n},{type:"select",name:"targetLibrary",message:`Which icon library would you like to ${d.info("migrate to")}?`,choices:n}]);if(o.sourceLibrary===o.targetLibrary)throw new Error("You cannot migrate to the same icon library. Please choose a different icon library.");if(!(o.sourceLibrary in H&&o.targetLibrary in H))throw new Error("Invalid icon library. Please choose a valid icon library.");let a=H[o.sourceLibrary],s$1=H[o.targetLibrary],{confirm:c}=await Te({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${d.info(r.length)} files in ${d.info(`./${j__default.relative(e.resolvedPaths.cwd,t$1)}`)} from ${d.info(a.name)} to ${d.info(s$1.name)}. Continue?`});c||(s.info("Migration cancelled."),process.exit(0)),s$1.package&&await z([s$1.package],[],e,{silent:false});let l=t("Migrating icons...")?.start();await Promise.all(r.map(async m=>{l.text=`Migrating ${m}...`;let p=j__default.join(t$1,m),u=await promises.readFile(p,"utf-8"),g=await Ln(u,o.sourceLibrary,o.targetLibrary,i);await promises.writeFile(p,g);})),l.succeed("Migration complete.");}async function Ln(e,t,r,i){let n=H[t]?.import,o=H[r]?.import,a=await promises.mkdtemp(j__default.join(tmpdir(),"shadcn-")),s=new Project({compilerOptions:{}}),c=j__default.join(a,`shadcn-icons-${randomBytes(4).toString("hex")}.tsx`),l=s.createSourceFile(c,e,{scriptKind:ScriptKind.TSX}),m=[];for(let p of l.getImportDeclarations()??[])if(p.getModuleSpecifier()?.getText()===`"${n}"`){for(let u of p.getNamedImports()??[]){let g=u.getName(),w=Object.values(i).find(h=>h[t]===g)?.[r];!w||m.includes(w)||(m.push(w),u.remove(),l.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).filter(h=>h.getTagNameNode()?.getText()===g).forEach(h=>h.getTagNameNode()?.replaceWithText(w)));}p.getNamedImports()?.length===0&&p.remove();}return m.length>0&&l.addImportDeclaration({moduleSpecifier:o,namedImports:m.map(p=>({name:p}))}),await l.getText()}function Wn(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function zn(e,t,r,i){let o=e.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").trim().split(",").map(a=>a.trim()).filter(Boolean);for(let a of o){let s=a.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?$/),c=a.match(/^(\w+)\s+as\s+(\w+)$/);if(s){let l=s[1],m=s[2];i==="slot"&&l==="Slot"&&!m?r.push({name:"Slot",alias:"SlotPrimitive",isType:true}):r.push({name:l,alias:m,isType:true});}else if(c){let l=c[1],m=c[2];i==="slot"&&l==="Slot"&&m==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:l,alias:m,isType:t});}else i==="slot"&&a==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:a,isType:t});}}async function Tr(e,t$1={}){if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let r=e.resolvedPaths.ui,i=await Fn("**/*.{js,ts,jsx,tsx}",{cwd:r});if(!t$1.yes){let{confirm:s$1}=await Te({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${d.info(i.length)} files in ${d.info(`./${j__default.relative(e.resolvedPaths.cwd,r)}`)} to ${d.info("radix-ui")}. Continue?`});s$1||(s.info("Migration cancelled."),process.exit(0));}let n=t("Migrating imports...")?.start(),o=new Set;await Promise.all(i.map(async s=>{n.text=`Migrating ${s}...`;let c=j__default.join(r,s),l=await promises.readFile(c,"utf-8"),{content:m,replacedPackages:p}=await Bn(l);p.forEach(u=>o.add(u)),await promises.writeFile(c,m);})),n.succeed("Migrating imports.");let a=t("Updating package.json...")?.start();try{let s$1=o$1(e.resolvedPaths.cwd,!1);if(!s$1){a.fail("Could not read package.json"),s.warn("Could not update package.json. You may need to manually replace @radix-ui/react-* packages with radix-ui");return}let c=Array.from(o),l=["dependencies","devDependencies"];for(let m of l)if(s$1[m])for(let p of c)s$1[m][p]&&delete s$1[m][p];if(c.length>0){s$1.dependencies||(s$1.dependencies={}),s$1.dependencies["radix-ui"]="latest";let m=j__default.join(e.resolvedPaths.cwd,"package.json");await promises.writeFile(m,JSON.stringify(s$1,null,2)+`
86
- `),a.succeed("Updated package.json."),await z(["radix-ui"],[],e,{silent:!1});}else a.succeed("No packages found in source files.");}catch{a.fail("Failed to update package.json"),s.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui");}}async function Bn(e){let t=/import\s+(?:(type)\s+)?(?:\*\s+as\s+(\w+)|{([^}]+)})\s+from\s+(["'])@radix-ui\/react-([^"']+)\4(;?)/g,r=[],i=[],n=[],o='"',a=false,s=e,c;for(;(c=t.exec(e))!==null;){let[w,h,x,v,M,F,X]=c;if(F==="icons"||F.startsWith("icons/"))continue;i.push(w),i.length===1&&(o=M,a=X===";"),n.push(`@radix-ui/react-${F}`);let A=!!h;if(x){let _e=Wn(F);r.push({name:_e,alias:x,isType:A});}else v&&zn(v,A,r,F);}if(r.length===0)return {content:e,replacedPackages:[]};let l=r.filter((w,h,x)=>h===x.findIndex(v=>v.name===w.name&&v.alias===w.alias&&v.isType===w.isType)),p=`import { ${l.map(w=>{let h=w.isType?"type ":"";return w.alias?`${h}${w.name} as ${w.alias}`:`${h}${w.name}`}).join(", ")} } from ${o}radix-ui${o}${a?";":""}`;s=i.reduce((w,h,x)=>w.replace(h,x===0?p:""),s),s=s.replace(/\n\s*\n\s*\n/g,`
83
+ args = ["shadcn@${fe}", "mcp"]`),s.break(),s.info("3. Restart Codex to load the MCP server"),s.break(),process.exit(0);}let s$1=t("Configuring MCP server...").start(),c=await $n(o);if(s$1.succeed("Configuring MCP server."),a)await z([],Fe,a,{silent:!1});else {let l=await a$1(o.cwd),m=l==="npm"?"install":"add",p=l==="npm"?"--save-dev":"-D",u=t("Installing dependencies...").start();await execa(l,[m,p,...Fe],{cwd:o.cwd}),u.succeed("Installing dependencies.");}s.break(),s.success(`Configuration saved to ${c}.`),s.break();}catch(r){Y(r);}});var En=(e,t)=>t;async function $n(e){let{client:t,cwd:r}=e,i=Ae.find(c=>c.name===t);if(!i)throw new Error(`Unknown client: ${t}. Available clients: ${Ae.map(c=>c.name).join(", ")}`);let n=j__default.join(r,i.configPath),o=j__default.dirname(n);await R.ensureDir(o);let a={};try{let c=await promises.readFile(n,"utf-8");a=JSON.parse(c);}catch{}let s=cr(a,i.config,{arrayMerge:En});return await promises.writeFile(n,JSON.stringify(s,null,2)+`
84
+ `,"utf-8"),i.configPath}var H={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 Or(e){if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let t$1=e.resolvedPaths.ui,[r,i]=await Promise.all([Tn("**/*.{js,ts,jsx,tsx}",{cwd:t$1}),da()]);if(Object.keys(i).length===0)throw new Error("Something went wrong fetching the registry icons.");let n=Object.entries(H).map(([m,p])=>({title:p.name,value:m})),o=await Te([{type:"select",name:"sourceLibrary",message:`Which icon library would you like to ${d.info("migrate from")}?`,choices:n},{type:"select",name:"targetLibrary",message:`Which icon library would you like to ${d.info("migrate to")}?`,choices:n}]);if(o.sourceLibrary===o.targetLibrary)throw new Error("You cannot migrate to the same icon library. Please choose a different icon library.");if(!(o.sourceLibrary in H&&o.targetLibrary in H))throw new Error("Invalid icon library. Please choose a valid icon library.");let a=H[o.sourceLibrary],s$1=H[o.targetLibrary],{confirm:c}=await Te({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${d.info(r.length)} files in ${d.info(`./${j__default.relative(e.resolvedPaths.cwd,t$1)}`)} from ${d.info(a.name)} to ${d.info(s$1.name)}. Continue?`});c||(s.info("Migration cancelled."),process.exit(0)),s$1.package&&await z([s$1.package],[],e,{silent:false});let l=t("Migrating icons...")?.start();await Promise.all(r.map(async m=>{l.text=`Migrating ${m}...`;let p=j__default.join(t$1,m),u=await promises.readFile(p,"utf-8"),g=await _n(u,o.sourceLibrary,o.targetLibrary,i);await promises.writeFile(p,g);})),l.succeed("Migration complete.");}async function _n(e,t,r,i){let n=H[t]?.import,o=H[r]?.import,a=await promises.mkdtemp(j__default.join(tmpdir(),"shadcn-")),s=new Project({compilerOptions:{}}),c=j__default.join(a,`shadcn-icons-${randomBytes(4).toString("hex")}.tsx`),l=s.createSourceFile(c,e,{scriptKind:ScriptKind.TSX}),m=[];for(let p of l.getImportDeclarations()??[])if(p.getModuleSpecifier()?.getText()===`"${n}"`){for(let u of p.getNamedImports()??[]){let g=u.getName(),w=Object.values(i).find(h=>h[t]===g)?.[r];!w||m.includes(w)||(m.push(w),u.remove(),l.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).filter(h=>h.getTagNameNode()?.getText()===g).forEach(h=>h.getTagNameNode()?.replaceWithText(w)));}p.getNamedImports()?.length===0&&p.remove();}return m.length>0&&l.addImportDeclaration({moduleSpecifier:o,namedImports:m.map(p=>({name:p}))}),await l.getText()}function Mn(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function Wn(e,t,r,i){let o=e.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").trim().split(",").map(a=>a.trim()).filter(Boolean);for(let a of o){let s=a.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?$/),c=a.match(/^(\w+)\s+as\s+(\w+)$/);if(s){let l=s[1],m=s[2];i==="slot"&&l==="Slot"&&!m?r.push({name:"Slot",alias:"SlotPrimitive",isType:true}):r.push({name:l,alias:m,isType:true});}else if(c){let l=c[1],m=c[2];i==="slot"&&l==="Slot"&&m==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:l,alias:m,isType:t});}else i==="slot"&&a==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:a,isType:t});}}async function Tr(e,t$1={}){if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let r=e.resolvedPaths.ui,i=await Tn("**/*.{js,ts,jsx,tsx}",{cwd:r});if(!t$1.yes){let{confirm:s$1}=await Te({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${d.info(i.length)} files in ${d.info(`./${j__default.relative(e.resolvedPaths.cwd,r)}`)} to ${d.info("radix-ui")}. Continue?`});s$1||(s.info("Migration cancelled."),process.exit(0));}let n=t("Migrating imports...")?.start(),o=new Set;await Promise.all(i.map(async s=>{n.text=`Migrating ${s}...`;let c=j__default.join(r,s),l=await promises.readFile(c,"utf-8"),{content:m,replacedPackages:p}=await zn(l);p.forEach(u=>o.add(u)),await promises.writeFile(c,m);})),n.succeed("Migrating imports.");let a=t("Updating package.json...")?.start();try{let s$1=o$1(e.resolvedPaths.cwd,!1);if(!s$1){a.fail("Could not read package.json"),s.warn("Could not update package.json. You may need to manually replace @radix-ui/react-* packages with radix-ui");return}let c=Array.from(o),l=["dependencies","devDependencies"];for(let m of l)if(s$1[m])for(let p of c)s$1[m][p]&&delete s$1[m][p];if(c.length>0){s$1.dependencies||(s$1.dependencies={}),s$1.dependencies["radix-ui"]="latest";let m=j__default.join(e.resolvedPaths.cwd,"package.json");await promises.writeFile(m,JSON.stringify(s$1,null,2)+`
85
+ `),a.succeed("Updated package.json."),await z(["radix-ui"],[],e,{silent:!1});}else a.succeed("No packages found in source files.");}catch{a.fail("Failed to update package.json"),s.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui");}}async function zn(e){let t=/import\s+(?:(type)\s+)?(?:\*\s+as\s+(\w+)|{([^}]+)})\s+from\s+(["'])@radix-ui\/react-([^"']+)\4(;?)/g,r=[],i=[],n=[],o='"',a=false,s=e,c;for(;(c=t.exec(e))!==null;){let[w,h,x,v,M,F,X]=c;if(F==="icons"||F.startsWith("icons/"))continue;i.push(w),i.length===1&&(o=M,a=X===";"),n.push(`@radix-ui/react-${F}`);let A=!!h;if(x){let _e=Mn(F);r.push({name:_e,alias:x,isType:A});}else v&&Wn(v,A,r,F);}if(r.length===0)return {content:e,replacedPackages:[]};let l=r.filter((w,h,x)=>h===x.findIndex(v=>v.name===w.name&&v.alias===w.alias&&v.isType===w.isType)),p=`import { ${l.map(w=>{let h=w.isType?"type ":"";return w.alias?`${h}${w.name} as ${w.alias}`:`${h}${w.name}`}).join(", ")} } from ${o}radix-ui${o}${a?";":""}`;s=i.reduce((w,h,x)=>w.replace(h,x===0?p:""),s),s=s.replace(/\n\s*\n\s*\n/g,`
87
86
 
88
87
  `),l.some(w=>w.name==="Slot"&&w.alias==="SlotPrimitive")&&(s=s.split(`
89
88
  `).map(x=>{if(x.trim().startsWith("import "))return x;let v=x;return v=v.replace(/\b(asChild\s*\?\s*)Slot(\s*:)/g,"$1__SLOT_PLACEHOLDER__$2"),v=v.replace(/\bReact\.ComponentProps<typeof\s+Slot>/g,"React.ComponentProps<typeof __SLOT_PLACEHOLDER__>"),v=v.replace(/\bComponentProps<typeof\s+Slot>/g,"ComponentProps<typeof __SLOT_PLACEHOLDER__>"),v=v.replace(/(<\/?)Slot(\s*\/?>)/g,"$1__SLOT_PLACEHOLDER__$2"),v=v.replace(/\bSlot\b/g,(M,F,X)=>{let A=X.substring(0,F),_e=(A.match(/"/g)||[]).length,qr=(A.match(/'/g)||[]).length;return _e%2!==0||qr%2!==0?M:"__SLOT_PLACEHOLDER__"}),v=v.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),v}).join(`
90
89
  `));let g=Array.from(new Set(n));return {content:s,replacedPackages:g}}async function Ar(e){let t={};if(!R.existsSync(e.cwd)||!R.existsSync(j__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!R.existsSync(j__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)}.
91
- Before you can run a migration, 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);}}var Dr=[{name:"icons",description:"migrate your ui components to a different icon library."},{name:"radix",description:"migrate to radix-ui."}],Jn=z$1.object({cwd:z$1.string(),list:z$1.boolean(),yes:z$1.boolean(),migration:z$1.string().refine(e=>e&&Dr.some(t=>t.name===e),{message:"You must specify a valid migration. Run `shadcn migrate --list` to see available migrations."}).optional()}),_r=new Command().name("migrate").description("run a migration.").argument("[migration]","the migration to run.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-l, --list","list all migrations.",false).option("-y, --yes","skip confirmation prompt.",false).action(async(e,t)=>{try{let r=Jn.parse({cwd:j__default.resolve(t.cwd),migration:e,list:t.list,yes:t.yes});if(r.list||!r.migration){s.info("Available migrations:");for(let o of Dr)s.info(`- ${o.name}: ${o.description}`);return}if(!r.migration)throw new Error("You must specify a migration. Run `shadcn migrate --list` to see available migrations.");let{errors:i,config:n}=await Ar(r);if(i["1"]||i["3"])throw new Error("No `components.json` file found. Ensure you are at the root of your project.");if(!n)throw new Error("Something went wrong reading your `components.json` file. Please ensure you have a valid `components.json` file.");r.migration==="icons"&&await Or(n),r.migration==="radix"&&await Tr(n,{yes:r.yes});}catch(r){s.break(),Y(r);}});async function Lr(e){let t={},r={cwd:e.cwd,registryFile:j__default.resolve(e.cwd,e.registryFile),outputDir:j__default.resolve(e.cwd,e.outputDir)};if(!R.existsSync(r.registryFile))return t["13"]=true,{errors:t,resolvePaths:null,config:null};if(!R.existsSync(j__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,resolvePaths:null,config:null};await R.mkdir(r.outputDir,{recursive:true});try{let i$1=await i(e.cwd);return {errors:t,config:i$1,resolvePaths:r}}catch{s.break(),s.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e.cwd)}.
92
- Before you can build the registry, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),s.break(),process.exit(1);}}var Yn=z$1.object({cwd:z$1.string(),registryFile:z$1.string(),outputDir:z$1.string(),verbose:z$1.boolean().optional().default(false)}),Vr=new Command().name("registry:build").description("builds the registry [EXPERIMENTAL]").argument("[registry]","path to registry.json file","./registry.json").option("-o, --output <path>","destination directory for json files","./public/r").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-v, --verbose","verbose output").action(async(e,t)=>{await qn({cwd:j.resolve(t.cwd),registryFile:e,outputDir:t.output,verbose:t.verbose});});async function qn(e){try{let t$1=Yn.parse(e),[{errors:r,resolvePaths:i,config:n},o$1]=await Promise.all([Lr(t$1),p(t$1.cwd)]);(r["3"]||!n||!o$1)&&(s.error(`A ${d.info("components.json")} file is required to build the registry. Run ${d.info("shadcn init")} to create one.`),s.break(),process.exit(1)),(r["13"]||!i)&&(s.error(`We could not find a registry file at ${d.info(j.resolve(t$1.cwd,t$1.registryFile))}.`),s.break(),process.exit(1));let a=await K.readFile(i.registryFile,"utf-8"),s$1=o.safeParse(JSON.parse(a));s$1.success||(s.error(`Invalid registry file found at ${d.info(i.registryFile)}.`),s.break(),process.exit(1));let c=t("Building registry..."),l=await Hn(s$1.data,n,o$1);for(let m of l.items)m.files=m.files?.filter((p,u,g)=>u===g.findIndex(w=>w.path===p.path)),m.dependencies&&(m.dependencies=m.dependencies.filter((p,u,g)=>u===g.findIndex(w=>w===p)));for(let m of l.items){if(!m.files)continue;c.start(`Building ${m.name}...`),m.$schema="https://ui.shadcn.com/schema/registry-item.json";for(let u of m.files){let g=j.resolve(i.cwd,u.path);try{if(!(await K.stat(g)).isFile())continue;u.content=await K.readFile(g,"utf-8");}catch(w){console.error("Error reading file in registry build:",g,w);continue}}let p=n$1.safeParse(m);if(!p.success){s.error(`Invalid registry item found for ${d.info(m.name)}.`);continue}await K.writeFile(j.resolve(i.outputDir,`${p.data.name}.json`),JSON.stringify(p.data,null,2));}if(await K.copyFile(i.registryFile,j.resolve(i.outputDir,"registry.json")),c.succeed("Building registry."),t$1.verbose){t(`The registry has ${d.info(l.items.length.toString())} items:`).succeed();for(let m of l.items){s.log(` - ${m.name} (${d.info(m.type)})`);for(let p of m.files??[])s.log(` - ${p.path}`);}}}catch(t){s.break(),Y(t);}}async function Hn(e,t,r){for(let i of e.items)if(i.files?.length)for(let n of i.files){let o=await L$1(n.path,t,r);o.files=o.files?.filter(a=>a.path!==n.path),o.files&&i.files.push(...o.files),o.dependencies&&(i.dependencies=i.dependencies?i.dependencies.concat(o.dependencies):o.dependencies);}return e}var Mr=new Command().name("registry:mcp").description("starts the registry MCP server [DEPRECATED]").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async()=>{s.warn(`The ${d.info("shadcn registry:mcp")} command is deprecated. Use the ${d.info("shadcn mcp")} command instead.`),s.break();});var Zn=z$1.object({cwd:z$1.string(),query:z$1.string().optional(),limit:z$1.number().optional(),offset:z$1.number().optional()}),Br=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=Zn.parse({cwd:j__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 B(r.cwd);let i$1=n({style:"new-york",resolvedPaths:{cwd:r.cwd}}),n$1=O(i$1),o=j__default.resolve(r.cwd,"components.json");if(R.existsSync(o)){let m=await R.readJson(o),p=c.partial().parse(m);n$1=O({...i$1,...p});}let a=n$1;try{let m=await i(r.cwd);m&&(a=O(m));}catch{}let{config:s,newRegistries:c$1}=await T(e.map(m=>`${m}/registry`),a,{silent:!0,writeFile:!1});c$1.length>0&&(a.registries=s.registries),Q(e,a);let l=await ma(e,{query:r.query,limit:r.limit,offset:r.offset,config:a});console.log(JSON.stringify(l,null,2)),process.exit(0);}catch(r){Y(r);}finally{P();}});var to=z$1.object({cwd:z$1.string()}),Kr=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=to.parse({cwd:j__default.resolve(t.cwd)});await B(r.cwd);let i$1=O({}),n=j__default.resolve(r.cwd,"components.json");if(R.existsSync(n)){let l=await R.readJson(n),m=c.partial().parse(l);i$1=O(m);}let o=i$1;try{let l=await i(r.cwd);l&&(o=O(l));}catch{}let{config:a,newRegistries:s}=await T(e,o,{silent:!0,writeFile:!1});s.length>0&&(o.registries=a.registries),Q(e,o);let c$1=await _(e,{config:o});console.log(JSON.stringify(c$1,null,2)),process.exit(0);}catch(r){Y(r);}finally{P();}});var Yr={version:"3.6.5"};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function no(){let e=new Command().name("shadcn").description("add items from registries to your project").version(Yr.version,"-v, --version","display the version number");e.addCommand(mr).addCommand(Rr).addCommand(hr).addCommand(kr).addCommand(Kr).addCommand(Br).addCommand(_r).addCommand(Pr).addCommand(xr).addCommand(mt),e.addCommand(Vr).addCommand(Mr),e.parse();}no();//# sourceMappingURL=index.js.map
90
+ Before you can run a migration, 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);}}var Dr=[{name:"icons",description:"migrate your ui components to a different icon library."},{name:"radix",description:"migrate to radix-ui."}],Gn=z$1.object({cwd:z$1.string(),list:z$1.boolean(),yes:z$1.boolean(),migration:z$1.string().refine(e=>e&&Dr.some(t=>t.name===e),{message:"You must specify a valid migration. Run `shadcn migrate --list` to see available migrations."}).optional()}),_r=new Command().name("migrate").description("run a migration.").argument("[migration]","the migration to run.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-l, --list","list all migrations.",false).option("-y, --yes","skip confirmation prompt.",false).action(async(e,t)=>{try{let r=Gn.parse({cwd:j__default.resolve(t.cwd),migration:e,list:t.list,yes:t.yes});if(r.list||!r.migration){s.info("Available migrations:");for(let o of Dr)s.info(`- ${o.name}: ${o.description}`);return}if(!r.migration)throw new Error("You must specify a migration. Run `shadcn migrate --list` to see available migrations.");let{errors:i,config:n}=await Ar(r);if(i["1"]||i["3"])throw new Error("No `components.json` file found. Ensure you are at the root of your project.");if(!n)throw new Error("Something went wrong reading your `components.json` file. Please ensure you have a valid `components.json` file.");r.migration==="icons"&&await Or(n),r.migration==="radix"&&await Tr(n,{yes:r.yes});}catch(r){s.break(),Y(r);}});async function Lr(e){let t={},r={cwd:e.cwd,registryFile:j__default.resolve(e.cwd,e.registryFile),outputDir:j__default.resolve(e.cwd,e.outputDir)};if(!R.existsSync(r.registryFile))return t["13"]=true,{errors:t,resolvePaths:null,config:null};if(!R.existsSync(j__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,resolvePaths:null,config:null};await R.mkdir(r.outputDir,{recursive:true});try{let i$1=await i(e.cwd);return {errors:t,config:i$1,resolvePaths:r}}catch{s.break(),s.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e.cwd)}.
91
+ Before you can build the registry, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),s.break(),process.exit(1);}}var Kn=z$1.object({cwd:z$1.string(),registryFile:z$1.string(),outputDir:z$1.string(),verbose:z$1.boolean().optional().default(false)}),Vr=new Command().name("registry:build").description("builds the registry [EXPERIMENTAL]").argument("[registry]","path to registry.json file","./registry.json").option("-o, --output <path>","destination directory for json files","./public/r").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-v, --verbose","verbose output").action(async(e,t)=>{await Yn({cwd:j.resolve(t.cwd),registryFile:e,outputDir:t.output,verbose:t.verbose});});async function Yn(e){try{let t$1=Kn.parse(e),[{errors:r,resolvePaths:i,config:n},o$1]=await Promise.all([Lr(t$1),p(t$1.cwd)]);(r["3"]||!n||!o$1)&&(s.error(`A ${d.info("components.json")} file is required to build the registry. Run ${d.info("shadcn init")} to create one.`),s.break(),process.exit(1)),(r["13"]||!i)&&(s.error(`We could not find a registry file at ${d.info(j.resolve(t$1.cwd,t$1.registryFile))}.`),s.break(),process.exit(1));let a=await K.readFile(i.registryFile,"utf-8"),s$1=o.safeParse(JSON.parse(a));s$1.success||(s.error(`Invalid registry file found at ${d.info(i.registryFile)}.`),s.break(),process.exit(1));let c=t("Building registry..."),l=await qn(s$1.data,n,o$1);for(let m of l.items)m.files=m.files?.filter((p,u,g)=>u===g.findIndex(w=>w.path===p.path)),m.dependencies&&(m.dependencies=m.dependencies.filter((p,u,g)=>u===g.findIndex(w=>w===p)));for(let m of l.items){if(!m.files)continue;c.start(`Building ${m.name}...`),m.$schema="https://ui.shadcn.com/schema/registry-item.json";for(let u of m.files){let g=j.resolve(i.cwd,u.path);try{if(!(await K.stat(g)).isFile())continue;u.content=await K.readFile(g,"utf-8");}catch(w){console.error("Error reading file in registry build:",g,w);continue}}let p=n$1.safeParse(m);if(!p.success){s.error(`Invalid registry item found for ${d.info(m.name)}.`);continue}await K.writeFile(j.resolve(i.outputDir,`${p.data.name}.json`),JSON.stringify(p.data,null,2));}if(await K.copyFile(i.registryFile,j.resolve(i.outputDir,"registry.json")),c.succeed("Building registry."),t$1.verbose){t(`The registry has ${d.info(l.items.length.toString())} items:`).succeed();for(let m of l.items){s.log(` - ${m.name} (${d.info(m.type)})`);for(let p of m.files??[])s.log(` - ${p.path}`);}}}catch(t){s.break(),Y(t);}}async function qn(e,t,r){for(let i of e.items)if(i.files?.length)for(let n of i.files){let o=await L$1(n.path,t,r);o.files=o.files?.filter(a=>a.path!==n.path),o.files&&i.files.push(...o.files),o.dependencies&&(i.dependencies=i.dependencies?i.dependencies.concat(o.dependencies):o.dependencies);}return e}var Mr=new Command().name("registry:mcp").description("starts the registry MCP server [DEPRECATED]").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async()=>{s.warn(`The ${d.info("shadcn registry:mcp")} command is deprecated. Use the ${d.info("shadcn mcp")} command instead.`),s.break();});var Qn=z$1.object({cwd:z$1.string(),query:z$1.string().optional(),limit:z$1.number().optional(),offset:z$1.number().optional()}),Br=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=Qn.parse({cwd:j__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 B(r.cwd);let i$1=n({style:"new-york",resolvedPaths:{cwd:r.cwd}}),n$1=O(i$1),o=j__default.resolve(r.cwd,"components.json");if(R.existsSync(o)){let m=await R.readJson(o),p=c.partial().parse(m);n$1=O({...i$1,...p});}let a=n$1;try{let m=await i(r.cwd);m&&(a=O(m));}catch{}let{config:s,newRegistries:c$1}=await T(e.map(m=>`${m}/registry`),a,{silent:!0,writeFile:!1});c$1.length>0&&(a.registries=s.registries),Q(e,a);let l=await ma(e,{query:r.query,limit:r.limit,offset:r.offset,config:a});console.log(JSON.stringify(l,null,2)),process.exit(0);}catch(r){Y(r);}finally{P();}});var eo=z$1.object({cwd:z$1.string()}),Kr=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=eo.parse({cwd:j__default.resolve(t.cwd)});await B(r.cwd);let i$1=O({}),n=j__default.resolve(r.cwd,"components.json");if(R.existsSync(n)){let l=await R.readJson(n),m=c.partial().parse(l);i$1=O(m);}let o=i$1;try{let l=await i(r.cwd);l&&(o=O(l));}catch{}let{config:a,newRegistries:s}=await T(e,o,{silent:!0,writeFile:!1});s.length>0&&(o.registries=a.registries),Q(e,o);let c$1=await _(e,{config:o});console.log(JSON.stringify(c$1,null,2)),process.exit(0);}catch(r){Y(r);}finally{P();}});var Yr={version:"3.6.8"};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function io(){let e=new Command().name("shadcn").description("add items from registries to your project").version(Yr.version,"-v, --version","display the version number");e.addCommand(lr).addCommand(Rr).addCommand(hr).addCommand(kr).addCommand(Kr).addCommand(Br).addCommand(_r).addCommand(Pr).addCommand(xr).addCommand(lt),e.addCommand(Vr).addCommand(Mr),e.parse();}io();//# sourceMappingURL=index.js.map
93
92
  //# sourceMappingURL=index.js.map