hghcn 3.6.13 → 3.6.14

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,59 +1,55 @@
1
1
  #!/usr/bin/env node
2
- import {b as b$1,a as a$1}from'./chunk-IY6XVAAS.js';import {a,M,l,P,W,q,d,U,N,n,g,o,h,r,b,_,aa,e,f,p,L as L$1,c as c$1,Z,I,ga,K,ha,da,ba,ea,H as H$1,J,O,ia,fa,Q,i,$,m,D,S,x,T as T$1,k,R as R$1,j as j$1,E,G,F}from'./chunk-YAVCZ2NG.js';export{da as fetchTree,ea as getItemTargetPath,ha as getPreset,ga as getPresets,Y as getRegistriesConfig,fa as getRegistriesIndex,V as getRegistry,ba as getRegistryBaseColor,aa as getRegistryBaseColors,$ as getRegistryIcons,W as getRegistryItems,_ as getRegistryStyles,Z as getShadcnRegistryIndex,X as resolveRegistryItems,ca as resolveTree}from'./chunk-YAVCZ2NG.js';import {c,o as o$1,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 Kr from'postcss/lib/at-rule';import at,{z as z$1}from'zod';import {execa}from'execa';import Oe from'prompts';import {Project,ScriptKind,SyntaxKind,VariableDeclarationKind}from'ts-morph';import Ze,{tmpdir}from'os';import {Command}from'commander';import tr from'deepmerge';import*as Y from'fs/promises';import Y__default from'fs/promises';import ot from'dedent';import ur from'open';import {diffLines}from'diff';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {randomBytes}from'crypto';import Ro from'fast-glob';async function Mt(e){let t={};if(!R.existsSync(e.cwd)||!R.existsSync(j__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,projectInfo:null};let r$1=r("Preflight checks.",{silent:e.silent}).start();R.existsSync(j__default.resolve(e.cwd,"components.json"))&&!e.force&&(r$1?.fail(),q.break(),q.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-IY6XVAAS.js';import {a,M,l,P,W as W$1,q,d,U,N,n,g,o,h,r,b,_ as _$1,aa,e,f,p,L,c as c$1,Z,I,ga,K,ha,da,ba,ea,H as H$1,J as J$1,O,ia,fa,Q,i,$,m,D as D$1,S as S$1,x,T,k,R,j as j$1,E,G,F}from'./chunk-YAVCZ2NG.js';export{da as fetchTree,ea as getItemTargetPath,ha as getPreset,ga as getPresets,Y as getRegistriesConfig,fa as getRegistriesIndex,V as getRegistry,ba as getRegistryBaseColor,aa as getRegistryBaseColors,$ as getRegistryIcons,W as getRegistryItems,_ as getRegistryStyles,Z as getShadcnRegistryIndex,X as resolveRegistryItems,ca as resolveTree}from'./chunk-YAVCZ2NG.js';import {c,o as o$1,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 S from'fs-extra';import {existsSync,promises}from'fs';import x$1 from'postcss';import Jr from'postcss/lib/at-rule';import at,{z as z$1}from'zod';import {execa}from'execa';import Oe from'prompts';import {Project,ScriptKind,SyntaxKind,VariableDeclarationKind}from'ts-morph';import Ze,{tmpdir}from'os';import {Command}from'commander';import tr from'deepmerge';import*as J from'fs/promises';import ot from'dedent';import pr from'open';import {diffLines}from'diff';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {randomBytes}from'crypto';import xo from'fast-glob';async function Mt(e){let t={};if(!S.existsSync(e.cwd)||!S.existsSync(j__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,projectInfo:null};let r$1=r("Preflight checks.",{silent:e.silent}).start();S.existsSync(j__default.resolve(e.cwd,"components.json"))&&!e.force&&(r$1?.fail(),q.break(),q.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.`),q.break(),process.exit(1)),r$1?.succeed();let i=r("Verifying framework.",{silent:e.silent}).start(),o=await n(e.cwd);return (!o||o?.framework.name==="manual")&&(t["7"]=true,i?.fail(),q.break(),o?.framework.links.installation&&q.error(`We could not detect a supported framework at ${d.info(e.cwd)}.
4
4
  Visit ${d.info(o?.framework.links.installation)} to manually configure your project.
5
- Once configured, you can use the cli to add components.`),q.break(),process.exit(1)),i?.succeed(`Verifying framework. Found ${d.info(o.framework.label)}.`),{errors:t,projectInfo:o}}function Wt(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,"/")),o=j__default.normalize(t),n=u=>u.replace(/\[\.\.\..*?\]/g,"").includes("..");if(n(i)||n(r)||n(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(o+j__default.sep);let p=j__default.resolve(o,i);return p.startsWith(o+j__default.sep)||p===o}async function Je(e,t,r$1){if(!t.resolvedPaths.tailwindCss||!e||Object.keys(e).length===0)return;r$1={silent:false,...r$1};let i=t.resolvedPaths.tailwindCss,o=j__default.relative(t.resolvedPaths.cwd,i),n=r(`Updating ${d.info(o)}`,{silent:r$1.silent}).start(),a=await promises.readFile(i,"utf8"),s=await Gr(a,e);await promises.writeFile(i,s,"utf8"),n.succeed();}async function Gr(e,t){let r=[Jr(t)],i=await S$1(r).process(e,{from:void 0}),o=i.css,n=i.root;if(n.nodes&&n.nodes.length>0){let a=n.nodes[n.nodes.length-1];a.type==="atrule"&&!a.nodes&&!o.trimEnd().endsWith(";")&&(o=o.trimEnd()+";");}return o=o.replace(/\/\* ---break--- \*\//g,""),o=o.replace(/(\n\s*\n)+/g,`
5
+ Once configured, you can use the cli to add components.`),q.break(),process.exit(1)),i?.succeed(`Verifying framework. Found ${d.info(o.framework.label)}.`),{errors:t,projectInfo:o}}function Wt(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,"/")),o=j__default.normalize(t),n=u=>u.replace(/\[\.\.\..*?\]/g,"").includes("..");if(n(i)||n(r)||n(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(o+j__default.sep);let p=j__default.resolve(o,i);return p.startsWith(o+j__default.sep)||p===o}async function Je(e,t,r$1){if(!t.resolvedPaths.tailwindCss||!e||Object.keys(e).length===0)return;r$1={silent:false,...r$1};let i=t.resolvedPaths.tailwindCss,o=j__default.relative(t.resolvedPaths.cwd,i),n=r(`Updating ${d.info(o)}`,{silent:r$1.silent}).start(),a=await promises.readFile(i,"utf8"),s=await Br(a,e);await promises.writeFile(i,s,"utf8"),n.succeed();}async function Br(e,t){let r=[Ur(t)],i=await x$1(r).process(e,{from:void 0}),o=i.css,n=i.root;if(n.nodes&&n.nodes.length>0){let a=n.nodes[n.nodes.length-1];a.type==="atrule"&&!a.nodes&&!o.trimEnd().endsWith(";")&&(o=o.trimEnd()+";");}return o=o.replace(/\/\* ---break--- \*\//g,""),o=o.replace(/(\n\s*\n)+/g,`
6
6
 
7
- `),o=o.trimEnd(),o}function Jr(e){return {postcssPlugin:"update-css",Once(t){for(let[r,i]of Object.entries(e))if(r.startsWith("@")){let o=r.match(/@([a-zA-Z-]+)\s*(.*)/);if(!o)continue;let[,n,a]=o;if(n==="import"){if(!t.nodes?.find(c=>c.type==="atrule"&&c.name==="import"&&c.params===a)){let c=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
- `,t.insertAfter(m,c);}else !t.nodes||t.nodes.length,c.raws.before="",t.prepend(c);}}else if(n==="plugin"){let s=a;a&&!a.startsWith('"')&&!a.startsWith("'")&&(s=`"${a}"`);let c=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:`
9
- `}}),p=t.nodes?.filter(g=>g.type==="atrule"&&g.name==="import"),u=t.nodes?.filter(g=>g.type==="atrule"&&g.name==="plugin");if(u&&u.length>0){let g=u[u.length-1];t.insertAfter(g,m);}else if(p&&p.length>0){let g=p[p.length-1];t.insertAfter(g,m),t.insertBefore(m,S$1.comment({text:"---break---"})),t.insertAfter(m,S$1.comment({text:"---break---"}));}else t.prepend(m),t.insertBefore(m,S$1.comment({text:"---break---"})),t.insertAfter(m,S$1.comment({text:"---break---"}));}}else if(typeof i=="object"&&Object.keys(i).length===0){if(!t.nodes?.find(c=>c.type==="atrule"&&c.name===n&&c.params===a)){let c=S$1.atRule({name:n,params:a,raws:{semicolon:true}});t.append(c),t.insertBefore(c,S$1.comment({text:"---break---"}));}}else if(n==="keyframes"){let s=t.nodes?.find(m=>m.type==="atrule"&&m.name==="theme"&&m.params==="inline");s||(s=S$1.atRule({name:"theme",params:"inline",raws:{semicolon:true,between:" ",before:`
10
- `}}),t.append(s),t.insertBefore(s,S$1.comment({text:"---break---"})));let c=s.nodes?.find(m=>m.type==="atrule"&&m.name==="keyframes"&&m.params===a),l;if(c?(l=S$1.atRule({name:"keyframes",params:a,raws:{semicolon:true,between:" ",before:`
11
- `}}),c.replaceWith(l)):(l=S$1.atRule({name:"keyframes",params:a,raws:{semicolon:true,between:" ",before:`
12
- `}}),s.append(l)),typeof i=="object")for(let[m,p]of Object.entries(i))te(l,m,p);}else if(n==="utility"){let s=t.nodes?.find(c=>c.type==="atrule"&&c.name===n&&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
- `}});m?m.replaceWith(p):s.append(p);}else typeof l=="object"&&te(s,c,l);}else {let c=S$1.atRule({name:n,params:a,raws:{semicolon:true,between:" ",before:`
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 n==="property"?te(t,r,i):Bt(t,n,a,i);}else te(t,r,i);}}}function Bt(e,t,r,i){let o=e.nodes?.find(n=>n.type==="atrule"&&n.name===t&&n.params===r);if(o||(o=S$1.atRule({name:t,params:r,raws:{semicolon:true,between:" ",before:`
16
- `}}),e.append(o),e.insertBefore(o,S$1.comment({text:"---break---"}))),typeof i=="object")for(let[n,a]of Object.entries(i))if(n.startsWith("@")){let s=n.match(/@([a-zA-Z-]+)\s*(.*)/);if(s){let[,c,l]=s;Bt(o,c,l,a);}}else te(o,n,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:`
7
+ `),o=o.trimEnd(),o}function Ur(e){return {postcssPlugin:"update-css",Once(t){for(let[r,i]of Object.entries(e))if(r.startsWith("@")){let o=r.match(/@([a-zA-Z-]+)\s*(.*)/);if(!o)continue;let[,n,a]=o;if(n==="import"){if(!t.nodes?.find(c=>c.type==="atrule"&&c.name==="import"&&c.params===a)){let c=x$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
+ `,t.insertAfter(m,c);}else !t.nodes||t.nodes.length,c.raws.before="",t.prepend(c);}}else if(n==="plugin"){let s=a;a&&!a.startsWith('"')&&!a.startsWith("'")&&(s=`"${a}"`);let c=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=x$1.atRule({name:"plugin",params:s,raws:{semicolon:true,before:`
9
+ `}}),p=t.nodes?.filter(h=>h.type==="atrule"&&h.name==="import"),u=t.nodes?.filter(h=>h.type==="atrule"&&h.name==="plugin");if(u&&u.length>0){let h=u[u.length-1];t.insertAfter(h,m);}else if(p&&p.length>0){let h=p[p.length-1];t.insertAfter(h,m),t.insertBefore(m,x$1.comment({text:"---break---"})),t.insertAfter(m,x$1.comment({text:"---break---"}));}else t.prepend(m),t.insertBefore(m,x$1.comment({text:"---break---"})),t.insertAfter(m,x$1.comment({text:"---break---"}));}}else if(typeof i=="object"&&Object.keys(i).length===0){if(!t.nodes?.find(c=>c.type==="atrule"&&c.name===n&&c.params===a)){let c=x$1.atRule({name:n,params:a,raws:{semicolon:true}});t.append(c),t.insertBefore(c,x$1.comment({text:"---break---"}));}}else if(n==="keyframes"){let s=t.nodes?.find(m=>m.type==="atrule"&&m.name==="theme"&&m.params==="inline");s||(s=x$1.atRule({name:"theme",params:"inline",raws:{semicolon:true,between:" ",before:`
10
+ `}}),t.append(s),t.insertBefore(s,x$1.comment({text:"---break---"})));let c=s.nodes?.find(m=>m.type==="atrule"&&m.name==="keyframes"&&m.params===a),l;if(c?(l=x$1.atRule({name:"keyframes",params:a,raws:{semicolon:true,between:" ",before:`
11
+ `}}),c.replaceWith(l)):(l=x$1.atRule({name:"keyframes",params:a,raws:{semicolon:true,between:" ",before:`
12
+ `}}),s.append(l)),typeof i=="object")for(let[m,p]of Object.entries(i))te(l,m,p);}else if(n==="utility"){let s=t.nodes?.find(c=>c.type==="atrule"&&c.name===n&&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=x$1.decl({prop:c,value:l,raws:{semicolon:true,before:`
13
+ `}});m?m.replaceWith(p):s.append(p);}else typeof l=="object"&&te(s,c,l);}else {let c=x$1.atRule({name:n,params:a,raws:{semicolon:true,between:" ",before:`
14
+ `}});if(t.append(c),t.insertBefore(c,x$1.comment({text:"---break---"})),typeof i=="object")for(let[l,m]of Object.entries(i))if(typeof m=="string"){let p=x$1.decl({prop:l,value:m,raws:{semicolon:true,before:`
15
+ `}});c.append(p);}else typeof m=="object"&&te(c,l,m);}}else n==="property"?te(t,r,i):Bt(t,n,a,i);}else te(t,r,i);}}}function Bt(e,t,r,i){let o=e.nodes?.find(n=>n.type==="atrule"&&n.name===t&&n.params===r);if(o||(o=x$1.atRule({name:t,params:r,raws:{semicolon:true,between:" ",before:`
16
+ `}}),e.append(o),e.insertBefore(o,x$1.comment({text:"---break---"}))),typeof i=="object")for(let[n,a]of Object.entries(i))if(n.startsWith("@")){let s=n.match(/@([a-zA-Z-]+)\s*(.*)/);if(s){let[,c,l]=s;Bt(o,c,l,a);}}else te(o,n,a);else if(typeof i=="string")try{let a=x$1.parse(`.temp{${i}}`).first;if(a&&a.nodes){let s=x$1.rule({selector:"temp",raws:{semicolon:!0,between:" ",before:`
17
17
  `}});a.nodes.forEach(c=>{if(c.type==="decl"){let l=c.clone();l.raws.before=`
18
- `,s.append(l);}}),s.nodes?.length&&o.append(s);}}catch(n){throw console.error("Error parsing at-rule content:",i,n),n}}function te(e,t,r){let i=e.nodes?.find(o=>o.type==="rule"&&o.selector===t);if(i||(i=S$1.rule({selector:t,raws:{semicolon:true,between:" ",before:`
19
- `}}),e.append(i)),typeof r=="object"){for(let[o,n]of Object.entries(r))if(o.startsWith("@")&&typeof n=="object"&&n!==null&&Object.keys(n).length===0){let a=o.match(/@([a-zA-Z-]+)\s*(.*)/);if(a){let[,s,c]=a,l=S$1.atRule({name:s,params:c,raws:{semicolon:true,before:`
20
- `}});i.append(l);}}else if(typeof n=="string"){let a=S$1.decl({prop:o,value:n,raws:{semicolon:true,before:`
21
- `}}),s=i.nodes?.find(c=>c.type==="decl"&&c.prop===o);s?s.replaceWith(a):i.append(a);}else if(typeof n=="object"){let a=o.startsWith("&")?t.replace(/^([^:]+)/,`$1${o.substring(1)}`):o;te(e,a,n);}}else if(typeof r=="string")try{let n=S$1.parse(`.temp{${r}}`).first;n&&n.nodes&&n.nodes.forEach(a=>{if(a.type==="decl"){let s=a.clone();s.raws.before=`
22
- `,i?.append(s);}});}catch(o){throw console.error("Error parsing rule content:",t,r,o),o}}async function Ye(e,t,r$1){if(!t.resolvedPaths.tailwindCss||!Object.keys(e??{}).length)return;r$1={cleanupDefaultNextStyles:false,silent:false,tailwindVersion:"v3",overwriteCssVars:false,initIndex:true,...r$1};let i=t.resolvedPaths.tailwindCss,o=j__default.relative(t.resolvedPaths.cwd,i),n=r(`Updating CSS variables in ${d.info(o)}`,{silent:r$1.silent}).start(),a=await promises.readFile(i,"utf8"),s=await qr(a,e??{},t,{cleanupDefaultNextStyles:r$1.cleanupDefaultNextStyles,tailwindVersion:r$1.tailwindVersion,tailwindConfig:r$1.tailwindConfig,overwriteCssVars:r$1.overwriteCssVars,initIndex:r$1.initIndex});await promises.writeFile(i,s,"utf8"),n.succeed();}async function qr(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 o=[Xr(t)];if(i.cleanupDefaultNextStyles&&o.push(Jt()),i.tailwindVersion==="v4"){if(o=[],r.resolvedPaths?.cwd){let s=m(r.resolvedPaths.cwd);!s?.dependencies?.["tailwindcss-animate"]&&!s?.devDependencies?.["tailwindcss-animate"]&&i.initIndex&&o.push(ri({params:"tw-animate-css"}));}o.push(ti({params:"dark (&:is(.dark *))"})),i.cleanupDefaultNextStyles&&o.push(Jt()),o.push(Qr(t,{overwriteCssVars:i.overwriteCssVars})),o.push(ei(t)),i.tailwindConfig&&(o.push(ii(i.tailwindConfig)),o.push(ni(i.tailwindConfig)),o.push(oi(i.tailwindConfig)));}r.tailwind.cssVariables&&i.initIndex&&o.push(Hr({tailwindVersion:i.tailwindVersion}));let a=(await S$1(o).process(e,{from:void 0})).css;return a=a.replace(/\/\* ---break--- \*\//g,""),i.tailwindVersion==="v4"&&(a=a.replace(/(\n\s*\n)+/g,`
18
+ `,s.append(l);}}),s.nodes?.length&&o.append(s);}}catch(n){throw console.error("Error parsing at-rule content:",i,n),n}}function te(e,t,r){let i=e.nodes?.find(o=>o.type==="rule"&&o.selector===t);if(i||(i=x$1.rule({selector:t,raws:{semicolon:true,between:" ",before:`
19
+ `}}),e.append(i)),typeof r=="object"){for(let[o,n]of Object.entries(r))if(o.startsWith("@")&&typeof n=="object"&&n!==null&&Object.keys(n).length===0){let a=o.match(/@([a-zA-Z-]+)\s*(.*)/);if(a){let[,s,c]=a,l=x$1.atRule({name:s,params:c,raws:{semicolon:true,before:`
20
+ `}});i.append(l);}}else if(typeof n=="string"){let a=x$1.decl({prop:o,value:n,raws:{semicolon:true,before:`
21
+ `}}),s=i.nodes?.find(c=>c.type==="decl"&&c.prop===o);s?s.replaceWith(a):i.append(a);}else if(typeof n=="object"){let a=o.startsWith("&")?t.replace(/^([^:]+)/,`$1${o.substring(1)}`):o;te(e,a,n);}}else if(typeof r=="string")try{let n=x$1.parse(`.temp{${r}}`).first;n&&n.nodes&&n.nodes.forEach(a=>{if(a.type==="decl"){let s=a.clone();s.raws.before=`
22
+ `,i?.append(s);}});}catch(o){throw console.error("Error parsing rule content:",t,r,o),o}}async function Ye(e,t,r$1){if(!t.resolvedPaths.tailwindCss||!Object.keys(e??{}).length)return;r$1={cleanupDefaultNextStyles:false,silent:false,tailwindVersion:"v3",overwriteCssVars:false,initIndex:true,...r$1};let i=t.resolvedPaths.tailwindCss,o=j__default.relative(t.resolvedPaths.cwd,i),n=r(`Updating CSS variables in ${d.info(o)}`,{silent:r$1.silent}).start(),a=await promises.readFile(i,"utf8"),s=await Yr(a,e??{},t,{cleanupDefaultNextStyles:r$1.cleanupDefaultNextStyles,tailwindVersion:r$1.tailwindVersion,tailwindConfig:r$1.tailwindConfig,overwriteCssVars:r$1.overwriteCssVars,initIndex:r$1.initIndex});await promises.writeFile(i,s,"utf8"),n.succeed();}async function Yr(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 o=[qr(t)];if(i.cleanupDefaultNextStyles&&o.push(Jt()),i.tailwindVersion==="v4"){if(o=[],r.resolvedPaths?.cwd){let s=m(r.resolvedPaths.cwd);!s?.dependencies?.["tailwindcss-animate"]&&!s?.devDependencies?.["tailwindcss-animate"]&&i.initIndex&&o.push(ei({params:"tw-animate-css"}));}o.push(Qr({params:"dark (&:is(.dark *))"})),i.cleanupDefaultNextStyles&&o.push(Jt()),o.push(Xr(t,{overwriteCssVars:i.overwriteCssVars})),o.push(Zr(t)),i.tailwindConfig&&(o.push(ti(i.tailwindConfig)),o.push(ii(i.tailwindConfig)),o.push(ri(i.tailwindConfig)));}r.tailwind.cssVariables&&i.initIndex&&o.push(Kr({tailwindVersion:i.tailwindVersion}));let a=(await x$1(o).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
- `)),a}function Hr({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(o=>o.type==="atrule"&&o.name==="layer"&&o.params==="base"&&r.every(({selector:n,apply:a})=>o.nodes?.some(s=>s.type==="rule"&&s.selector===n&&s.nodes.some(c=>c.type==="atrule"&&c.name==="apply"&&c.params===a))));i||(i=S$1.atRule({name:"layer",params:"base",raws:{semicolon:true,between:" ",before:`
25
- `}}),t.append(i),t.insertBefore(i,S$1.comment({text:"---break---"}))),r.forEach(({selector:o,apply:n})=>{i?.nodes?.find(s=>s.type==="rule"&&s.selector===o)||i?.append(S$1.rule({selector:o,nodes:[S$1.atRule({name:"apply",params:n,raws:{semicolon:true,before:`
24
+ `)),a}function Kr({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(o=>o.type==="atrule"&&o.name==="layer"&&o.params==="base"&&r.every(({selector:n,apply:a})=>o.nodes?.some(s=>s.type==="rule"&&s.selector===n&&s.nodes.some(c=>c.type==="atrule"&&c.name==="apply"&&c.params===a))));i||(i=x$1.atRule({name:"layer",params:"base",raws:{semicolon:true,between:" ",before:`
25
+ `}}),t.append(i),t.insertBefore(i,x$1.comment({text:"---break---"}))),r.forEach(({selector:o,apply:n})=>{i?.nodes?.find(s=>s.type==="rule"&&s.selector===o)||i?.append(x$1.rule({selector:o,nodes:[x$1.atRule({name:"apply",params:n,raws:{semicolon:true,before:`
26
26
  `}})],raws:{semicolon:true,between:" ",before:`
27
- `}}));});}}}function Xr(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 Kr||(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,o])=>{let n=i==="light"?":root":`.${i}`;Zr(r,n,o);});}}}function Gt(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 Jt(){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()),Gt(e);let r=e.nodes.find(i=>i.type==="atrule"&&i.params==="(prefers-color-scheme: dark)");r&&(Gt(r),r.nodes.length===0&&r.remove());}}}function Zr(e,t,r){let i=e.nodes?.find(o=>o.type==="rule"&&o.selector===t);i||Object.keys(r).length>0&&(i=S$1.rule({selector:t,raws:{between:" ",before:`
29
- `}}),e.append(i)),Object.entries(r).forEach(([o,n])=>{let a=`--${o.replace(/^--/,"")}`,s=S$1.decl({prop:a,value:n,raws:{semicolon:true}}),c=i?.nodes.find(l=>l.type==="decl"&&l.prop===a);c?c.replaceWith(s):i?.append(s);});}function Qr(e,t){return {postcssPlugin:"update-css-vars-v4",Once(r){Object.entries(e).forEach(([i,o])=>{let n=i==="light"?":root":`.${i}`;if(i==="theme"){n="@theme";let s=Pe(r);Object.entries(o).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===n);!a&&Object.keys(o).length>0&&(a=S$1.rule({selector:n,nodes:[],raws:{semicolon:true,between:" ",before:`
30
- `}}),r.append(a),r.insertBefore(a,S$1.comment({text:"---break---"}))),Object.entries(o).forEach(([s,c])=>{let l=`--${s.replace(/^--/,"")}`;l==="--sidebar-background"&&(l="--sidebar"),Yt(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 ei(e){return {postcssPlugin:"update-theme",Once(t){let r=Array.from(new Set(Object.keys(e).flatMap(n=>Object.keys(e[n]||{}))));if(!r.length)return;let i=Pe(t),o=i.nodes?.filter(n=>n.type==="decl"&&n.prop.startsWith("--"));for(let n of r){let a=Object.values(e).find(p=>p[n])?.[n];if(!a)continue;if(n==="radius"){let p={sm:"calc(var(--radius) - 4px)",md:"calc(var(--radius) - 2px)",lg:"var(--radius)",xl:"calc(var(--radius) + 4px)","2xl":"calc(var(--radius) + 8px)","3xl":"calc(var(--radius) + 12px)","4xl":"calc(var(--radius) + 16px)"};for(let[u,g]of Object.entries(p)){let 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=Yt(a)||ai(a)?`--color-${n.replace(/^--/,"")}`:`--${n.replace(/^--/,"")}`;s==="--color-sidebar-background"&&(s="--color-sidebar");let c=`var(--${n})`;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)||(o?.length?i?.insertAfter(o[o.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
- `}}),e.append(t),e.insertBefore(t,S$1.comment({text:"---break---"}))),t}function ti({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(n=>n.type==="atrule"&&n.name==="import"),o=S$1.atRule({name:"custom-variant",params:e,raws:{semicolon:true,before:`
32
- `}});if(i.length>0){let n=i[i.length-1];t.insertAfter(n,o);}else t.insertAfter(t.nodes[0],o);t.insertBefore(o,S$1.comment({text:"---break---"}));}}}}function ri({params:e}){return {postcssPlugin:"add-custom-import",Once(t){let r=t.nodes.filter(n=>n.type==="atrule"&&n.name==="import"),i=t.nodes.find(n=>n.type==="atrule"&&n.name==="custom-variant");if(!r.some(n=>n.params.replace(/["']/g,"")===e)){let n=S$1.atRule({name:"import",params:`"${e}"`,raws:{semicolon:true,before:`
33
- `}});if(r.length>0){let a=r[r.length-1];t.insertAfter(a,n);}else i?(t.insertBefore(i,n),t.insertBefore(i,S$1.comment({text:"---break---"}))):(t.prepend(n),t.insertAfter(n,S$1.comment({text:"---break---"})));}}}}function ii(e){return {postcssPlugin:"update-tailwind-config",Once(t){if(!e?.plugins)return;let i=si(t)==="single"?"'":'"',o=t.nodes.filter(a=>a.type==="atrule"&&a.name==="plugin"),n=o[o.length-1]||t.nodes[0];for(let a of e.plugins){let s=a.replace(/^require\(["']|["']\)$/g,"");if(o.some(l=>l.params.replace(/["']/g,"")===s))continue;let c=S$1.atRule({name:"plugin",params:`${i}${s}${i}`,raws:{semicolon:true,before:`
34
- `}});t.insertAfter(n,c),t.insertBefore(c,S$1.comment({text:"---break---"}));}}}}function oi(e){return {postcssPlugin:"update-tailwind-config-keyframes",Once(t){if(!e?.theme?.extend?.keyframes)return;let r=Pe(t),i=r.nodes?.filter(n=>n.type==="atrule"&&n.name==="keyframes"),o=z$1.record(z$1.string(),z$1.record(z$1.string(),z$1.string()));for(let[n,a]of Object.entries(e.theme.extend.keyframes)){if(typeof n!="string")continue;let s=o.safeParse(a);if(!s.success||i?.find(l=>l.type==="atrule"&&l.name==="keyframes"&&l.params===n))continue;let c=S$1.atRule({name:"keyframes",params:n,nodes:[],raws:{semicolon:true,between:" ",before:`
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:`
27
+ `}}));});}}}function qr(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 Jr||(r=x$1.atRule({name:"layer",params:"base",nodes:[],raws:{semicolon:true,before:`
28
+ `,between:" "}}),t.append(r),t.insertBefore(r,x$1.comment({text:"---break---"}))),r!==void 0&&Object.entries(e).forEach(([i,o])=>{let n=i==="light"?":root":`.${i}`;Hr(r,n,o);});}}}function Gt(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 Jt(){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()),Gt(e);let r=e.nodes.find(i=>i.type==="atrule"&&i.params==="(prefers-color-scheme: dark)");r&&(Gt(r),r.nodes.length===0&&r.remove());}}}function Hr(e,t,r){let i=e.nodes?.find(o=>o.type==="rule"&&o.selector===t);i||Object.keys(r).length>0&&(i=x$1.rule({selector:t,raws:{between:" ",before:`
29
+ `}}),e.append(i)),Object.entries(r).forEach(([o,n])=>{let a=`--${o.replace(/^--/,"")}`,s=x$1.decl({prop:a,value:n,raws:{semicolon:true}}),c=i?.nodes.find(l=>l.type==="decl"&&l.prop===a);c?c.replaceWith(s):i?.append(s);});}function Xr(e,t){return {postcssPlugin:"update-css-vars-v4",Once(r){Object.entries(e).forEach(([i,o])=>{let n=i==="light"?":root":`.${i}`;if(i==="theme"){n="@theme";let s=Pe(r);Object.entries(o).forEach(([c,l])=>{let m=`--${c.replace(/^--/,"")}`,p=x$1.decl({prop:m,value:l,raws:{semicolon:true}}),u=s?.nodes?.find(h=>h.type==="decl"&&h.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===n);!a&&Object.keys(o).length>0&&(a=x$1.rule({selector:n,nodes:[],raws:{semicolon:true,between:" ",before:`
30
+ `}}),r.append(a),r.insertBefore(a,x$1.comment({text:"---break---"}))),Object.entries(o).forEach(([s,c])=>{let l=`--${s.replace(/^--/,"")}`;l==="--sidebar-background"&&(l="--sidebar"),Yt(c)&&(c=`hsl(${c})`);let m=x$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 Zr(e){return {postcssPlugin:"update-theme",Once(t){let r=Array.from(new Set(Object.keys(e).flatMap(n=>Object.keys(e[n]||{}))));if(!r.length)return;let i=Pe(t),o=i.nodes?.filter(n=>n.type==="decl"&&n.prop.startsWith("--"));for(let n of r){let a=Object.values(e).find(p=>p[n])?.[n];if(!a)continue;if(n==="radius"){let p={sm:"calc(var(--radius) - 4px)",md:"calc(var(--radius) - 2px)",lg:"var(--radius)",xl:"calc(var(--radius) + 4px)","2xl":"calc(var(--radius) + 8px)","3xl":"calc(var(--radius) + 12px)","4xl":"calc(var(--radius) + 16px)"};for(let[u,h]of Object.entries(p)){let g=x$1.decl({prop:`--radius-${u}`,value:h,raws:{semicolon:true}});i?.nodes?.find(w=>w.type==="decl"&&w.prop===g.prop)||i?.append(g);}continue}let s=Yt(a)||ni(a)?`--color-${n.replace(/^--/,"")}`:`--${n.replace(/^--/,"")}`;s==="--color-sidebar-background"&&(s="--color-sidebar");let c=`var(--${n})`;s==="--color-sidebar"&&(c="var(--sidebar)");let l=x$1.decl({prop:s,value:c,raws:{semicolon:true}});i?.nodes?.find(p=>p.type==="decl"&&p.prop===l.prop)||(o?.length?i?.insertAfter(o[o.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=x$1.atRule({name:"theme",params:"inline",nodes:[],raws:{semicolon:true,between:" ",before:`
31
+ `}}),e.append(t),e.insertBefore(t,x$1.comment({text:"---break---"}))),t}function Qr({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(n=>n.type==="atrule"&&n.name==="import"),o=x$1.atRule({name:"custom-variant",params:e,raws:{semicolon:true,before:`
32
+ `}});if(i.length>0){let n=i[i.length-1];t.insertAfter(n,o);}else t.insertAfter(t.nodes[0],o);t.insertBefore(o,x$1.comment({text:"---break---"}));}}}}function ei({params:e}){return {postcssPlugin:"add-custom-import",Once(t){let r=t.nodes.filter(n=>n.type==="atrule"&&n.name==="import"),i=t.nodes.find(n=>n.type==="atrule"&&n.name==="custom-variant");if(!r.some(n=>n.params.replace(/["']/g,"")===e)){let n=x$1.atRule({name:"import",params:`"${e}"`,raws:{semicolon:true,before:`
33
+ `}});if(r.length>0){let a=r[r.length-1];t.insertAfter(a,n);}else i?(t.insertBefore(i,n),t.insertBefore(i,x$1.comment({text:"---break---"}))):(t.prepend(n),t.insertAfter(n,x$1.comment({text:"---break---"})));}}}}function ti(e){return {postcssPlugin:"update-tailwind-config",Once(t){if(!e?.plugins)return;let i=oi(t)==="single"?"'":'"',o=t.nodes.filter(a=>a.type==="atrule"&&a.name==="plugin"),n=o[o.length-1]||t.nodes[0];for(let a of e.plugins){let s=a.replace(/^require\(["']|["']\)$/g,"");if(o.some(l=>l.params.replace(/["']/g,"")===s))continue;let c=x$1.atRule({name:"plugin",params:`${i}${s}${i}`,raws:{semicolon:true,before:`
34
+ `}});t.insertAfter(n,c),t.insertBefore(c,x$1.comment({text:"---break---"}));}}}}function ri(e){return {postcssPlugin:"update-tailwind-config-keyframes",Once(t){if(!e?.theme?.extend?.keyframes)return;let r=Pe(t),i=r.nodes?.filter(n=>n.type==="atrule"&&n.name==="keyframes"),o=z$1.record(z$1.string(),z$1.record(z$1.string(),z$1.string()));for(let[n,a]of Object.entries(e.theme.extend.keyframes)){if(typeof n!="string")continue;let s=o.safeParse(a);if(!s.success||i?.find(l=>l.type==="atrule"&&l.name==="keyframes"&&l.params===n))continue;let c=x$1.atRule({name:"keyframes",params:n,nodes:[],raws:{semicolon:true,between:" ",before:`
35
+ `}});for(let[l,m]of Object.entries(s.data)){let p=x$1.rule({selector:l,nodes:Object.entries(m).map(([u,h])=>x$1.decl({prop:u,value:h,raws:{semicolon:true,before:`
36
36
  `,between:": "}})),raws:{semicolon:true,between:" ",before:`
37
- `}});c.append(p);}r.append(c),r.insertBefore(c,S$1.comment({text:"---break---"}));}}}}function ni(e){return {postcssPlugin:"update-tailwind-config-animation",Once(t){if(!e?.theme?.extend?.animation)return;let r=Pe(t),i=r.nodes?.filter(n=>n.type==="decl"&&n.prop.startsWith("--animate-")),o=z$1.record(z$1.string(),z$1.string()).safeParse(e.theme.extend.animation);if(o.success)for(let[n,a]of Object.entries(o.data)){let s=`--animate-${n}`;if(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 si(e){return e.nodes[0].toString().includes("'")?"single":"double"}function Yt(e){if(e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch"))return false;let t=e.split(" ");return t.length===3&&t.slice(1,3).every(r=>r.includes("%"))}function ai(e){return e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch")||e.includes("--color-")}async function z(e,t,r$1,i){if(e=Array.from(new Set(e)),t=Array.from(new Set(t)),!e?.length&&!t?.length)return;i={silent:false,...i};let o=r("Installing dependencies.",{silent:i.silent})?.start(),n=await mi(r$1),a="";if(li(r$1)&&n==="npm")if(i.silent)a="force";else {o.stopAndPersist(),q.warn(`
37
+ `}});c.append(p);}r.append(c),r.insertBefore(c,x$1.comment({text:"---break---"}));}}}}function ii(e){return {postcssPlugin:"update-tailwind-config-animation",Once(t){if(!e?.theme?.extend?.animation)return;let r=Pe(t),i=r.nodes?.filter(n=>n.type==="decl"&&n.prop.startsWith("--animate-")),o=z$1.record(z$1.string(),z$1.string()).safeParse(e.theme.extend.animation);if(o.success)for(let[n,a]of Object.entries(o.data)){let s=`--animate-${n}`;if(i?.find(l=>l.prop===s))continue;let c=x$1.decl({prop:s,value:a,raws:{semicolon:true,between:": ",before:`
38
+ `}});r.append(c);}}}}function oi(e){return e.nodes[0].toString().includes("'")?"single":"double"}function Yt(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 ni(e){return e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch")||e.includes("--color-")}async function W(e,t,r$1,i){if(e=Array.from(new Set(e)),t=Array.from(new Set(t)),!e?.length&&!t?.length)return;i={silent:false,...i};let o=r("Installing dependencies.",{silent:i.silent})?.start(),n=await ci(r$1),a="";if(ai(r$1)&&n==="npm")if(i.silent)a="force";else {o.stopAndPersist(),q.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
- `);let s=await Oe([{type:"select",name:"flag",message:"How would you like to proceed?",choices:[{title:"Use --force",value:"force"},{title:"Use --legacy-peer-deps",value:"legacy-peer-deps"}]}]);s&&(a=s.flag);}o?.start(),await fi(n,e,t,r$1.resolvedPaths.cwd,a),o?.succeed();}function li(e){let t=m(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 mi(e){return m(e.resolvedPaths.cwd,false)?.dependencies?.expo?"expo":a$1(e.resolvedPaths.cwd)}async function fi(e,t,r,i,o){if(e==="npm")return pi(t,r,i,o);if(e==="deno")return di(t,r,i);if(e==="expo")return ui(t,r,i);t?.length&&await execa(e,["add",...t],{cwd:i}),r?.length&&await execa(e,["add","-D",...r],{cwd:i});}async function pi(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 di(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 ui(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 qe(e,t,r$1){if(!e||Object.keys(e).length===0)return {envVarsAdded:[],envFileUpdated:null,envFileCreated:null};r$1={silent:false,...r$1};let i=r("Adding environment variables.",{silent:r$1.silent})?.start(),o=t.resolvedPaths.cwd,n=j__default.join(o,".env.local"),a=E(o);a&&(n=a);let s=existsSync(n),c=j__default.basename(n),l=Object.entries(e).map(([g,w])=>`${g}=${w}`).join(`
42
- `),m=[],p=null,u=null;if(s){let g=await promises.readFile(n,"utf-8"),w=G(g,l);if(m=F(g,l),m.length>0){if(await promises.writeFile(n,w,"utf-8"),p=j__default.relative(o,n),i?.succeed(`Added the following variables to ${d.info(c)}:`),!r$1.silent)for(let h of m)q.log(` ${d.success("+")} ${h}`);}else i?.stop();}else if(await promises.writeFile(n,l+`
43
- `,"utf-8"),u=j__default.relative(o,n),m=Object.keys(e),i?.succeed(`Added the following variables to ${d.info(c)}:`),!r$1.silent)for(let g of m)q.log(` ${d.success("+")} ${g}`);return !r$1.silent&&m.length>0&&q.break(),{envVarsAdded:m,envFileUpdated:p,envFileCreated:u}}async function qt(e,t){if(!e.fonts?.length)return e;let r=await n(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 n$1=`@fontsource-variable/${i.name.replace("font-","")}`;return e.dependencies??=[],e.dependencies.push(n$1),e.css??={},e.css[`@import "${n$1}"`]={},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 He(e,t,r$1){if(!e?.length)return;let i=await n(t.resolvedPaths.cwd);if(!i||i.framework.name!=="next-app"&&i.framework.name!=="next-pages")return;let o=r("Updating fonts.",{silent:r$1.silent})?.start();try{await vi(e,t,i),o?.succeed("Updating fonts.");}catch(n){throw o?.fail("Failed to update fonts."),n}}async function vi(e,t,r){let i=await Si(t,r);if(!i)return;let o=await promises.readFile(i,"utf-8"),n=await Ri(o,e);n!==o&&await promises.writeFile(i,n,"utf-8");}async function Si(e,t){let r=e.resolvedPaths.cwd,i=t.isSrcDir,n=t.isTsx?"tsx":"jsx",a=i?[`src/app/layout.${n}`,`app/layout.${n}`]:[`app/layout.${n}`];for(let s of a){let c=j__default.join(r,s);if(existsSync(c))return c}return null}async function Ri(e,t,r){let o=new Project({compilerOptions:{}}).createSourceFile("layout.tsx",e,{scriptKind:ScriptKind.TSX}),n=t.filter(s=>s.font.provider==="google"),a=[];for(let s of n){let c=s.font.import;if(!c)continue;let l=Ii(c),m=o.getImportDeclaration(g=>g.getModuleSpecifierValue()==="next/font/google"),p=Ci(s);m?m.getNamedImports().some(h=>h.getName()===c)||m.addNamedImport(c):o.addImportDeclaration({moduleSpecifier:"next/font/google",namedImports:[c]});let u=ki(o,s.font.variable);if(u)u.setInitializer(`${c}(${p})`),u.getName()!==l&&u.rename(l);else {let g=Pi(o);o.insertVariableStatement(g,{declarationKind:VariableDeclarationKind.Const,declarations:[{name:l,initializer:`${c}(${p})`}]}).appendWhitespace(`
44
- `);}a.push(l);}return a.length>0&&ji(o,a),o.getFullText()}function Ci(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 Ii(e){return e.split("_").map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function ki(e,t){let r=e.getVariableStatements();for(let i of r)for(let o of i.getDeclarations()){let n=o.getInitializer();if(!n||n.getKind()!==SyntaxKind.CallExpression)continue;let s=n.getArguments();if(s.length===0)continue;let c=s[0].getText();if(c.includes("variable:")&&c.includes(t))return o}return null}function Pi(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function ji(e,t){let r=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement);for(let i of r){if(i.getTagNameNode().getText()!=="html")continue;let n=i.getAttribute("className");if(!n){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(n.getKind()!==SyntaxKind.JsxAttribute)return;let a=n.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=Ni(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=Ei(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(o=>o.getName()==="cn"))){let r=e.getImportDeclaration(i=>i.getModuleSpecifierValue().includes("/lib/utils"));r?r.getNamedImports().some(o=>o.getName()==="cn")||r.addNamedImport("cn"):e.addImportDeclaration({moduleSpecifier:"@/lib/utils",namedImports:["cn"]});}}function Ei(e){let t=[],r=[],o=e.slice(1,-1).split(/(\$\{[^}]+\})/);for(let n of o)if(n)if(n.startsWith("${")&&n.endsWith("}")){let a=n.slice(2,-1).trim();a&&r.push(a);}else {let a=n.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 Ni(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$1=await i(t);return i$1&&i$1.ui&&i$1.ui.resolvedPaths.cwd!==t.resolvedPaths.cwd?await Fi(e,t,i$1,{...r,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await Ti(e,t,r)}async function Ti(e,t,r$1){if(!r$1.baseStyle&&!e.length)return;let i=r("Checking registry.",{silent:r$1.silent})?.start(),o=await T$1(e,M(t));if(!o)return i?.fail(),U(new Error("Failed to fetch components from registry."));try{Xt(o.files??[],t.resolvedPaths.cwd);}catch(s){return i?.fail(),U(s)}i?.succeed();let n=await p(t);o=await qt(o,t),await R$1(o.tailwind?.config,t,{silent:r$1.silent,tailwindVersion:n});let a=await Ht(e,t);await Ye(o.cssVars,t,{cleanupDefaultNextStyles:r$1.isNewProject,silent:r$1.silent,tailwindVersion:n,tailwindConfig:o.tailwind?.config,overwriteCssVars:a,initIndex:r$1.baseStyle}),await Je(o.css,t,{silent:r$1.silent}),await qe(o.envVars,t,{silent:r$1.silent}),await z(o.dependencies,o.devDependencies,t,{silent:r$1.silent}),await He(o.fonts,t,{silent:r$1.silent}),await I(o.files,t,{overwrite:r$1.overwrite,silent:r$1.silent,path:r$1.path}),o.docs&&q.info(o.docs);}async function Fi(e,t,r$1,i){if(!i.baseStyle&&!e.length)return;let o=r("Checking registry.",{silent:i.silent})?.start(),n=await T$1(e,M(t));if(!n)return o?.fail(),U(new Error("Failed to fetch components from registry."));try{Xt(n.files??[],t.resolvedPaths.cwd);}catch(h){return o?.fail(),U(h)}o?.succeed();let a=[],s=[],c=[],l=r("Installing components.")?.start(),m=r$1.ui,p$1=await p(m),u=k(t.resolvedPaths.cwd,m.resolvedPaths.ui);if(n.tailwind?.config&&(await R$1(n.tailwind?.config,m,{silent:true,tailwindVersion:p$1}),s.push(j__default.relative(u,m.resolvedPaths.tailwindConfig))),n.cssVars){let h=await Ht(e,t);await Ye(n.cssVars,m,{silent:true,tailwindVersion:p$1,tailwindConfig:n.tailwind?.config,overwriteCssVars:h}),s.push(j__default.relative(u,m.resolvedPaths.tailwindCss));}n.css&&(await Je(n.css,m,{silent:true}),s.push(j__default.relative(u,m.resolvedPaths.tailwindCss))),n.envVars&&await qe(n.envVars,m,{silent:true}),await z(n.dependencies,n.devDependencies,m,{silent:true}),await He(n.fonts,m,{silent:true});let g=new Map;for(let h of n.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,M=k(t.resolvedPaths.cwd,v.resolvedPaths.ui||v.resolvedPaths.cwd),F=await j$1(M,v.resolvedPaths.cwd)??v.resolvedPaths.cwd,X=await I(x,v,{overwrite:i.overwrite,silent:true,rootSpinner:l,isRemote:i.isRemote,isWorkspace:true,path:i.path});a.push(...X.filesCreated.map(A=>j__default.relative(M,j__default.join(F,A)))),s.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?.succeed(),a.sort(),s.sort(),c.sort(),!(a.length||s.length)&&!c.length&&r("No files updated.",{silent:i.silent})?.info(),a.length){r(`Created ${a.length} ${a.length===1?"file":"files"}:`,{silent:i.silent})?.succeed();for(let h of a)q.log(` - ${h}`);}if(s.length){r(`Updated ${s.length} ${s.length===1?"file":"files"}:`,{silent:i.silent})?.info();for(let h of s)q.log(` - ${h}`);}if(c.length){r(`Skipped ${c.length} ${s.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:i.silent})?.info();for(let h of c)q.log(` - ${h}`);}n.docs&&q.info(n.docs);}async function Ht(e,t){let r=await W(e,{config:t});return z$1.array(n$1).parse(r).some(o=>o.type==="registry:theme"||o.type==="registry:style"||o.type==="registry:font"||o.type==="registry:base")}function Xt(e,t){for(let r of e)if(r?.target&&!Wt(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}var Qe="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",o=e.components?.length===1&&!!e.components[0].match(/\/chat\/b\//);if(e.components&&o)try{let[s]=await Q(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){q.break(),U(s);}if(!e.force){let{type:s,name:c}=await Oe([{type:e.template||o?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 n=await a$1(e.cwd,{withFallback:true}),a=`${e.cwd}/${r}`;try{await R.access(e.cwd,R.constants.W_OK);}catch{q.break(),q.error(`The path ${d.info(e.cwd)} is not writable.`),q.error(`It is likely you do not have write permissions for this folder or the path ${d.info(e.cwd)} does not exist.`),q.break(),process.exit(1);}return R.existsSync(j__default.resolve(e.cwd,r,"package.json"))&&(q.break(),q.error(`A project with the name ${d.info(r)} already exists.`),q.error("Please choose a different name and try again."),q.break(),process.exit(1)),t===L.next&&await Di(a,{version:i,cwd:e.cwd,packageManager:n,srcDir:!!e.srcDir}),t===L["next-monorepo"]&&await _i(a,{packageManager:n}),t===L.vite&&await Li(a,{packageManager:n}),t===L.start&&await Vi(a,{packageManager:n}),{projectPath:a,projectName:r,template:t}}async function Di(e,t){let r$1=r("Creating a new Next.js project. This may take a few minutes.").start(),i=["--tailwind","--eslint","--typescript","--app",t.srcDir?"--src-dir":"--no-src-dir","--no-import-alias",`--use-${t.packageManager}`];(t.version.startsWith("15")||t.version.startsWith("latest")||t.version.startsWith("canary"))&&i.push("--turbopack"),(t.version.startsWith("latest")||t.version.startsWith("canary"))&&i.push("--no-react-compiler");try{await execa("npx",[`create-next-app@${t.version}`,e,"--silent",...i],{cwd:t.cwd});}catch{q.break(),q.error("Something went wrong creating a new Next.js project. Please try again."),process.exit(1);}r$1?.succeed("Creating a new Next.js project.");}async function _i(e,t){let r$1=r("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 o=await fetch(Qe);if(!o.ok)throw new Error(`Failed to download template: ${o.statusText}`);let n=j__default.resolve(i,"template.tar.gz");await R.writeFile(n,Buffer.from(await o.arrayBuffer())),await execa("tar",["-xzf",n,"-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.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$1?.succeed("Creating a new Next.js monorepo.");}catch(i){r$1?.fail("Something went wrong creating a new Next.js monorepo."),U(i);}}async function Li(e,t){let r$1=r("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 o=await fetch(Qe);if(!o.ok)throw new Error(`Failed to download template: ${o.statusText}`);let n=j__default.resolve(i,"template.tar.gz");await R.writeFile(n,Buffer.from(await o.arrayBuffer())),await execa("tar",["-xzf",n,"-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.packageManager!=="pnpm"){let c=j__default.join(e,"pnpm-lock.yaml");R.existsSync(c)&&await R.remove(c);}await execa(t.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$1?.succeed("Creating a new Vite project.");}catch(i){r$1?.fail("Something went wrong creating a new Vite project."),U(i);}}async function Vi(e,t){let r$1=r("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 o=await fetch(Qe);if(!o.ok)throw new Error(`Failed to download template: ${o.statusText}`);let n=j__default.resolve(i,"template.tar.gz");await R.writeFile(n,Buffer.from(await o.arrayBuffer())),await execa("tar",["-xzf",n,"-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.packageManager!=="pnpm"){let c=j__default.join(e,"pnpm-lock.yaml");R.existsSync(c)&&await R.remove(c);}await execa(t.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$1?.succeed("Creating a new TanStack Start project.");}catch(i){r$1?.fail("Something went wrong creating a new TanStack Start project."),U(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 o=join(e,i);existsSync(o)&&t({path:o,overload:!1,quiet:!0});}}catch(t){q.warn("Failed to load env files:",t);}}var he=".bak";function Zt(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 Qt(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 et(e){let t=`${e}${he}`;if(!R.existsSync(t))return false;try{return R.unlinkSync(t),!0}catch{return false}}async function er(e,t){let r=new Set,i=new Set,o=[...e];for(;o.length>0;){let n=o.shift();if(i.has(n))continue;i.add(n);let{registry:a}=D(n);a&&!b[a]&&r.add(a);try{let[s]=await S([n],t,{useCache:!0});if(s?.registryDependencies)for(let c of s.registryDependencies){let{registry:l}=D(c);l&&!b[l]&&r.add(l),i.has(c)||o.push(c);}}catch(s){if(s instanceof x){let{registry:c}=D(n);c&&!b[c]&&r.add(c);continue}continue}}return Array.from(r)}async function T(e,t,r$1={}){r$1={silent:false,writeFile:true,...r$1};let o=(await er(e,t)).filter(l=>!t.registries?.[l]&&!Object.keys(b).includes(l));if(o.length===0)return {config:t,newRegistries:[]};let n=await fa({useCache:process.env.NODE_ENV!=="development"});if(!n)return {config:t,newRegistries:[]};let a={};for(let l of o)n[l]&&(a[l]=n[l]);if(Object.keys(a).length===0)return {config:t,newRegistries:[]};let s=Object.fromEntries(Object.entries(t.registries||{}).filter(([l])=>!Object.keys(b).includes(l))),c$1={...t,registries:{...s,...a}};if(r$1.writeFile){let{resolvedPaths:l,...m}=c$1,p=r("Updating components.json.",{silent:r$1.silent}).start(),u=c.parse(m);await R.writeFile(j__default.resolve(t.resolvedPaths.cwd,"components.json"),JSON.stringify(u,null,2)+`
46
- `,"utf-8"),p.succeed();}return {config:c$1,newRegistries:Object.keys(a)}}process.on("exit",e=>{let t=j__default.resolve(process.cwd(),"components.json");return e===0?et(t):Qt(t)});var rt=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()}),rr=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=rt.parse({cwd:j__default.resolve(t.cwd),isNewProject:!1,components:e,...t});if(await B(r.cwd),e.length>0){let i=M(l({resolvedPaths:{cwd:r.cwd}})),o=j__default.resolve(r.cwd,"components.json");if(R.existsSync(o)){let s=await R.readJson(o),c$1=c.partial().parse(s),l$1=l({resolvedPaths:{cwd:r.cwd}});i=M({...c$1,resolvedPaths:{...l$1.resolvedPaths,cwd:r.cwd}}),Zt(o);}let{config:n}=await T(e,i,{silent:!0,writeFile:!1});i=n,P(e[0],i);let[a]=await W([e[0]],{config:i});a?.type==="registry:base"&&(a.config&&(i=M(tr(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),q.log(`${d.success("Success!")} Project initialization completed.
47
- You may now add components.`),et(j__default.resolve(r.cwd,"components.json")),q.break();}catch(r){console.log("init error"),q.break(),U(r);}finally{N();}});async function le(e){let t,r$1;if(e.skipPreflight)t=await n(e.cwd);else {let g=await Mt(e);if(g.errors["1"]){let{projectPath:w,template:h}=await Ee(e);w||process.exit(1),e.cwd=w,e.isNewProject=true,r$1=h,t=await n(e.cwd);}else t=g.projectInfo;}if(r$1==="next-monorepo")return e.cwd=j__default.resolve(e.cwd,"apps/web"),await g(e.cwd);let i=await o(e.cwd,t),o$1=i?await Ji(i,e):await Gi(await g(e.cwd));if(!e.yes){let{proceed:g}=await Oe({type:"confirm",name:"proceed",message:`Write configuration to ${d.info("components.json")}. Proceed?`,initial:true});g||process.exit(0);}let n$1=[...e.baseStyle?["index"]:[],...e.components??[]],a=await h(e.cwd,o$1),{config:s}=await T(n$1,a,{silent:true});s.registries&&(o$1.registries=s.registries);let c=r("Writing components.json.").start(),m=`${j__default.resolve(e.cwd,"components.json")}${he}`,p=(g,w)=>{let{registries:h,...x}=tr(g,w);return {...x,registries:h}};if(!e.force&&R.existsSync(m)){let g=await R.readJson(m);o$1=p(g,o$1);}e.registryBaseConfig&&(o$1=p(o$1,e.registryBaseConfig)),o$1.registries=Object.fromEntries(Object.entries(o$1.registries||{}).filter(([g])=>!Object.keys(b).includes(g))),c.succeed();let u=await h(e.cwd,o$1);return await ie(n$1,u,{overwrite:true,silent:e.silent,baseStyle:e.baseStyle,isNewProject:e.isNewProject||t?.framework.name==="next-app"}),u}async function Gi(e$1=null){let[t,r]=await Promise.all([_(),aa()]);q.info("");let i=await Oe([{type:"toggle",name:"typescript",message:`Would you like to use ${d.info("TypeScript")} (recommended)?`,initial:e$1?.tsx??true,active:"yes",inactive:"no"},{type:"select",name:"style",message:`Which ${d.info("style")} would you like to use?`,choices:t.map(o=>({title:o.label,value:o.name}))},{type:"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 Ji(e,t){let r=e.style,i=t.baseColor,o=e.tailwind.cssVariables,n=e.iconLibrary??"lucide";if(!t.defaults){let[a,s,c]=await Promise.all([_(),aa(),p(e)]),l=await Oe([]);r=l.style??r??"new-york",i=l.tailwindBaseColor??i,o=t.cssVariables;}return c.parse({$schema:e?.$schema,style:r,tailwind:{...e?.tailwind,baseColor:i,cssVariables:o},rsc:e?.rsc,tsx:e?.tsx,iconLibrary:n,aliases:e?.aliases})}async function or(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 g(e.cwd);return {errors:t,config:r}}catch{q.break(),q.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.`),q.error(`Learn more at ${d.info("https://ui.shadcn.com/docs/components-json")}.`),q.break(),process.exit(1);}}async function sr(e,t){let r=j__default.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await Y__default.stat(r)).isFile())return;let[i]=await W([e],{config:t});if(!i?.meta?.importSpecifier||!i?.meta?.moduleSpecifier)return;let o=`import { ${i?.meta?.importSpecifier} } from "${i.meta.moduleSpecifier}"
49
-
50
- export default function Page() {
51
- return <${i?.meta?.importSpecifier} />
52
- }`;await Y__default.writeFile(r,o,"utf8");}var qi=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()}),lr=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=qi.parse({components:e,cwd:j__default.resolve(t.cwd),...t});await B(r.cwd);let i=await g(r.cwd);i||(i=l({style:"new-york",resolvedPaths:{cwd:r.cwd}}));let o=["sidebar-","login-","signup-","otp-","calendar-"],n$1=["base-","radix-"];if(e.length>0&&i?.style&&n$1.some(x=>i?.style.startsWith(x))){let x=e.filter(v=>o.some(M=>v.startsWith(M)));x.length&&(q.warn(`The ${d.info(x.map(v=>v).join(", "))} component(s) are not available for the ${d.info(i.style)} style yet. They are coming soon.`),q.warn("In the meantime, you can visit the blocks page on https://ui.shadcn.com/blocks and copy the code."),q.break(),process.exit(1));}let a=!1;if(e.length>0){let{config:h,newRegistries:x}=await T(e,i,{silent:r.silent,writeFile:!1});i=h,a=x.length>0;}let s,c=!0;if(e.length>0){let[h]=await W([e[0]],{config:i});if(s=h?.type,c=s!=="registry:theme"&&s!=="registry:style",L$1(h)){await ie(e,i,{...r,baseStyle:c});return}if(!r.yes&&(s==="registry:style"||s==="registry:theme")){q.break();let{confirm:x}=await Oe({type:"confirm",name:"confirm",message:d.warn(`You are about to install a new ${s.replace("registry:","")}.
53
- Existing CSS variables and components will be overwritten. Continue?`)});x||(q.break(),q.log("Installation cancelled."),q.break(),process.exit(1));}}if(r.components?.length||(r.components=await Hi(r)),(await n(r.cwd))?.tailwindVersion==="v4"){let h=c$1.filter(x=>r.components?.includes(x.name));h?.length&&(q.break(),h.forEach(x=>{q.warn(d.warn(x.message));}),q.break(),process.exit(1));}let{errors:m,config:p}=await or(r),u=!1;m["3"]&&(p=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=!1;if(m["1"]){let{projectPath:h,template:x}=await Ee({cwd:r.cwd,force:r.overwrite,srcDir:r.srcDir,components:r.components});h||(q.break(),process.exit(1)),r.cwd=h,x==="next-monorepo"?(r.cwd=j__default.resolve(r.cwd,"apps/web"),p=await g(r.cwd)):(p=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$1=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//));}if(!p)throw new Error(`Failed to read config at ${d.info(r.cwd)}.`);let{config:w}=await T(r.components,p,{silent:r.silent||a});p=w,u||await ie(r.components,p,{...r,baseStyle:c}),g$1&&await sr(r.components[0],p);}catch(r){console.log("add error"),q.break(),U(r);}finally{N();}});async function Hi(e){let t=await Z();if(!t)return q.break(),U(new Error("Failed to fetch registry index.")),[];if(e.all)return t.map(o=>o.name).filter(o=>!c$1.some(n=>n.name===o));if(e.components?.length)return e.components;let{components:r}=await Oe({type:"multiselect",name:"components",message:"Which components would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:false,choices:t.filter(o=>o.type==="registry:ui"&&!c$1.some(n=>n.name===o.name)).map(o=>({title:o.name,value:o.name,selected:e.all?true:e.components?.includes(o.name)}))});r?.length||(q.warn("No components selected. Exiting."),q.info(""),process.exit(1));let i=z$1.array(z$1.string()).safeParse(r);return i.success?i.data:(q.error(""),U(new Error("Something went wrong. Please try again.")),[])}async function pr(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"]&&(q.break(),q.error(`The path ${d.info(r.registryFile)} does not exist.`)),q.break(),process.exit(1)),{errors:t,resolvePaths:r}}var Zi=z$1.object({cwd:z$1.string(),registryFile:z$1.string(),outputDir:z$1.string()}),dr=new Command().name("build").description("build components for a shadcn registry").argument("[registry]","path to registry.json file","./registry.json").option("-o, --output <path>","destination directory for json files","./public/r").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r$1=Zi.parse({cwd:j.resolve(t.cwd),registryFile:e,outputDir:t.output}),{resolvePaths:i}=await pr(r$1),o=await Y.readFile(i.registryFile,"utf-8"),n=o$1.safeParse(JSON.parse(o));n.success||(q.error(`Invalid registry file found at ${d.info(i.registryFile)}.`),process.exit(1));let a=r("Building registry...");for(let s of n.data.items){a.start(`Building ${s.name}...`),s.$schema="https://ui.shadcn.com/schema/registry-item.json";for(let l of s.files??[])l.content=await Y.readFile(j.resolve(i.cwd,l.path),"utf-8");let c=n$1.safeParse(s);if(!c.success){q.error(`Invalid registry item found for ${d.info(s.name)}.`);continue}await Y.writeFile(j.resolve(i.outputDir,`${c.data.name}.json`),JSON.stringify(c.data,null,2));}await Y.copyFile(i.registryFile,j.resolve(i.outputDir,"registry.json")),a.succeed("Building registry.");}catch(r){q.break(),U(r);}});var gr="https://ui.shadcn.com",to={next:"Next.js",vite:"Vite",start:"TanStack Start"},hr=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=wr();q.log("Build your own shadcn/ui."),q.log(`You will be taken to ${d.info(w)} to build your custom design system.`),q.break();let{proceed:h}=await Oe({type:"confirm",name:"proceed",message:"Open in browser?",initial:!0});h&&await ur(w),process.exit(0);}let i=e;if(!i){let{enteredName:w}=await Oe({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 o=t.template;if(!o){let{selectedTemplate:w}=await Oe({type:"select",name:"selectedTemplate",message:`Which ${d.info("template")} would you like to use?`,choices:Object.entries(to).map(([h,x])=>({title:x,value:h}))});w||process.exit(0),o=w;}let n=await io(t.preset??!0);n||process.exit(0);let a,s;"_isUrl"in n?(a=n.url,s=new URL(n.url).searchParams.get("baseColor")??"neutral"):(a=ro(n),s=n.baseColor);let c=M({}),{config:l}=await T([a],c,{silent:!0});c=l;let[m]=await W([a],{config:c}),p;m?.type==="registry:base"&&m.config&&(p=m.config);let u=rt.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:o,baseColor:s,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=oo(o);w.length>0&&await I(w,g,{overwrite:!0,silent:!0});}q.log(`${d.success("Success!")} Project initialization completed.
54
- You may now add components.`),q.break();}catch(r){q.break(),U(r);}finally{N();}});function ro(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 `${no()}?${t.toString()}`}async function io(e){if(e===true){let t=await ga(),{selectedPreset:r}=await Oe({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=wr();return q.info(`
41
+ `);let s=await Oe([{type:"select",name:"flag",message:"How would you like to proceed?",choices:[{title:"Use --force",value:"force"},{title:"Use --legacy-peer-deps",value:"legacy-peer-deps"}]}]);s&&(a=s.flag);}o?.start(),await li(n,e,t,r$1.resolvedPaths.cwd,a),o?.succeed();}function ai(e){let t=m(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 ci(e){return m(e.resolvedPaths.cwd,false)?.dependencies?.expo?"expo":a$1(e.resolvedPaths.cwd)}async function li(e,t,r,i,o){if(e==="npm")return mi(t,r,i,o);if(e==="deno")return fi(t,r,i);if(e==="expo")return pi(t,r,i);t?.length&&await execa(e,["add",...t],{cwd:i}),r?.length&&await execa(e,["add","-D",...r],{cwd:i});}async function mi(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 fi(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 pi(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 qe(e,t,r$1){if(!e||Object.keys(e).length===0)return {envVarsAdded:[],envFileUpdated:null,envFileCreated:null};r$1={silent:false,...r$1};let i=r("Adding environment variables.",{silent:r$1.silent})?.start(),o=t.resolvedPaths.cwd,n=j__default.join(o,".env.local"),a=E(o);a&&(n=a);let s=existsSync(n),c=j__default.basename(n),l=Object.entries(e).map(([h,g])=>`${h}=${g}`).join(`
42
+ `),m=[],p=null,u=null;if(s){let h=await promises.readFile(n,"utf-8"),g=G(h,l);if(m=F(h,l),m.length>0){if(await promises.writeFile(n,g,"utf-8"),p=j__default.relative(o,n),i?.succeed(`Added the following variables to ${d.info(c)}:`),!r$1.silent)for(let w of m)q.log(` ${d.success("+")} ${w}`);}else i?.stop();}else if(await promises.writeFile(n,l+`
43
+ `,"utf-8"),u=j__default.relative(o,n),m=Object.keys(e),i?.succeed(`Added the following variables to ${d.info(c)}:`),!r$1.silent)for(let h of m)q.log(` ${d.success("+")} ${h}`);return !r$1.silent&&m.length>0&&q.break(),{envVarsAdded:m,envFileUpdated:p,envFileCreated:u}}async function qt(e,t){if(!e.fonts?.length)return e;let r=await n(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 n$1=`@fontsource-variable/${i.name.replace("font-","")}`;return e.dependencies??=[],e.dependencies.push(n$1),e.css??={},e.css[`@import "${n$1}"`]={},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 He(e,t,r$1){if(!e?.length)return;let i=await n(t.resolvedPaths.cwd);if(!i||i.framework.name!=="next-app"&&i.framework.name!=="next-pages")return;let o=r("Updating fonts.",{silent:r$1.silent})?.start();try{await bi(e,t,i),o?.succeed("Updating fonts.");}catch(n){throw o?.fail("Failed to update fonts."),n}}async function bi(e,t,r){let i=await xi(t,r);if(!i)return;let o=await promises.readFile(i,"utf-8"),n=await vi(o,e);n!==o&&await promises.writeFile(i,n,"utf-8");}async function xi(e,t){let r=e.resolvedPaths.cwd,i=t.isSrcDir,n=t.isTsx?"tsx":"jsx",a=i?[`src/app/layout.${n}`,`app/layout.${n}`]:[`app/layout.${n}`];for(let s of a){let c=j__default.join(r,s);if(existsSync(c))return c}return null}async function vi(e,t,r){let o=new Project({compilerOptions:{}}).createSourceFile("layout.tsx",e,{scriptKind:ScriptKind.TSX}),n=t.filter(s=>s.font.provider==="google"),a=[];for(let s of n){let c=s.font.import;if(!c)continue;let l=Ri(c),m=o.getImportDeclaration(h=>h.getModuleSpecifierValue()==="next/font/google"),p=Si(s);m?m.getNamedImports().some(w=>w.getName()===c)||m.addNamedImport(c):o.addImportDeclaration({moduleSpecifier:"next/font/google",namedImports:[c]});let u=Ci(o,s.font.variable);if(u)u.setInitializer(`${c}(${p})`),u.getName()!==l&&u.rename(l);else {let h=Ii(o);o.insertVariableStatement(h,{declarationKind:VariableDeclarationKind.Const,declarations:[{name:l,initializer:`${c}(${p})`}]}).appendWhitespace(`
44
+ `);}a.push(l);}return a.length>0&&ki(o,a),o.getFullText()}function Si(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 Ri(e){return e.split("_").map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function Ci(e,t){let r=e.getVariableStatements();for(let i of r)for(let o of i.getDeclarations()){let n=o.getInitializer();if(!n||n.getKind()!==SyntaxKind.CallExpression)continue;let s=n.getArguments();if(s.length===0)continue;let c=s[0].getText();if(c.includes("variable:")&&c.includes(t))return o}return null}function Ii(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function ki(e,t){let r=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement);for(let i of r){if(i.getTagNameNode().getText()!=="html")continue;let n=i.getAttribute("className");if(!n){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(n.getKind()!==SyntaxKind.JsxAttribute)return;let a=n.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(w=>p.includes(w)))continue;let h=ji(p),g=Ei(h,c);l.replaceWithText(`{${g}}`);}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=Pi(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(o=>o.getName()==="cn"))){let r=e.getImportDeclaration(i=>i.getModuleSpecifierValue().includes("/lib/utils"));r?r.getNamedImports().some(o=>o.getName()==="cn")||r.addNamedImport("cn"):e.addImportDeclaration({moduleSpecifier:"@/lib/utils",namedImports:["cn"]});}}function Pi(e){let t=[],r=[],o=e.slice(1,-1).split(/(\$\{[^}]+\})/);for(let n of o)if(n)if(n.startsWith("${")&&n.endsWith("}")){let a=n.slice(2,-1).trim();a&&r.push(a);}else {let a=n.trim().split(/\s+/).filter(Boolean);for(let s of a)t.push(`"${s}"`);}return [...t,...r]}function ji(e){return e.replace(/,?\s*\w+\.variable/g,"").replace(/cn\(\s*,/,"cn(")}function Ei(e,t){let r=t.join(", ");return e.replace(/\)$/,`, ${r})`)}async function se(e,t,r){r={overwrite:false,silent:false,isNewProject:false,baseStyle:true,...r};let i$1=await i(t);return i$1&&i$1.ui&&i$1.ui.resolvedPaths.cwd!==t.resolvedPaths.cwd?await Oi(e,t,i$1,{...r,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await Ni(e,t,r)}async function Ni(e,t,r$1){if(!r$1.baseStyle&&!e.length)return;let i=r("Checking registry.",{silent:r$1.silent})?.start(),o=await T(e,M(t));if(!o)return i?.fail(),U(new Error("Failed to fetch components from registry."));try{Xt(o.files??[],t.resolvedPaths.cwd);}catch(s){return i?.fail(),U(s)}i?.succeed();let n=await p(t);o=await qt(o,t),await R(o.tailwind?.config,t,{silent:r$1.silent,tailwindVersion:n});let a=await Ht(e,t);await Ye(o.cssVars,t,{cleanupDefaultNextStyles:r$1.isNewProject,silent:r$1.silent,tailwindVersion:n,tailwindConfig:o.tailwind?.config,overwriteCssVars:a,initIndex:r$1.baseStyle}),await Je(o.css,t,{silent:r$1.silent}),await qe(o.envVars,t,{silent:r$1.silent}),await W(o.dependencies,o.devDependencies,t,{silent:r$1.silent}),await He(o.fonts,t,{silent:r$1.silent}),await I(o.files,t,{overwrite:r$1.overwrite,silent:r$1.silent,path:r$1.path}),o.docs&&q.info(o.docs);}async function Oi(e,t,r$1,i){if(!i.baseStyle&&!e.length)return;let o=r("Checking registry.",{silent:i.silent})?.start(),n=await T(e,M(t));if(!n)return o?.fail(),U(new Error("Failed to fetch components from registry."));try{Xt(n.files??[],t.resolvedPaths.cwd);}catch(w){return o?.fail(),U(w)}o?.succeed();let a=[],s=[],c=[],l=r("Installing components.")?.start(),m=r$1.ui,p$1=await p(m),u=k(t.resolvedPaths.cwd,m.resolvedPaths.ui);if(n.tailwind?.config&&(await R(n.tailwind?.config,m,{silent:true,tailwindVersion:p$1}),s.push(j__default.relative(u,m.resolvedPaths.tailwindConfig))),n.cssVars){let w=await Ht(e,t);await Ye(n.cssVars,m,{silent:true,tailwindVersion:p$1,tailwindConfig:n.tailwind?.config,overwriteCssVars:w}),s.push(j__default.relative(u,m.resolvedPaths.tailwindCss));}n.css&&(await Je(n.css,m,{silent:true}),s.push(j__default.relative(u,m.resolvedPaths.tailwindCss))),n.envVars&&await qe(n.envVars,m,{silent:true}),await W(n.dependencies,n.devDependencies,m,{silent:true}),await He(n.fonts,m,{silent:true});let h=new Map;for(let w of n.files??[]){let C=w.type||"registry:ui";h.has(C)||h.set(C,[]),h.get(C).push(w);}for(let w of Array.from(h.keys())){let C=h.get(w),v=w==="registry:ui"?r$1.ui:t,Y=k(t.resolvedPaths.cwd,v.resolvedPaths.ui||v.resolvedPaths.cwd),O=await j$1(Y,v.resolvedPaths.cwd)??v.resolvedPaths.cwd,X=await I(C,v,{overwrite:i.overwrite,silent:true,rootSpinner:l,isRemote:i.isRemote,isWorkspace:true,path:i.path});a.push(...X.filesCreated.map(T=>j__default.relative(Y,j__default.join(O,T)))),s.push(...X.filesUpdated.map(T=>j__default.relative(Y,j__default.join(O,T)))),c.push(...X.filesSkipped.map(T=>j__default.relative(Y,j__default.join(O,T))));}if(l?.succeed(),a.sort(),s.sort(),c.sort(),!(a.length||s.length)&&!c.length&&r("No files updated.",{silent:i.silent})?.info(),a.length){r(`Created ${a.length} ${a.length===1?"file":"files"}:`,{silent:i.silent})?.succeed();for(let w of a)q.log(` - ${w}`);}if(s.length){r(`Updated ${s.length} ${s.length===1?"file":"files"}:`,{silent:i.silent})?.info();for(let w of s)q.log(` - ${w}`);}if(c.length){r(`Skipped ${c.length} ${s.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:i.silent})?.info();for(let w of c)q.log(` - ${w}`);}n.docs&&q.info(n.docs);}async function Ht(e,t){let r=await W$1(e,{config:t});return z$1.array(n$1).parse(r).some(o=>o.type==="registry:theme"||o.type==="registry:style"||o.type==="registry:font"||o.type==="registry:base")}function Xt(e,t){for(let r of e)if(r?.target&&!Wt(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}var Qe="https://codeload.github.com/shadcn-ui/ui/tar.gz/main",D={next:"next","next-monorepo":"next-monorepo",vite:"vite",start:"start"};async function Ee(e){e={srcDir:false,...e};let t=e.template&&D[e.template]?e.template:"next",r=e.name??(t===D.next||t===D.vite||t===D.start?"my-app":"my-monorepo"),i="latest",o=e.components?.length===1&&!!e.components[0].match(/\/chat\/b\//);if(e.components&&o)try{let[s]=await Q(e.components),{meta:c}=z$1.object({meta:z$1.object({nextVersion:z$1.string()})}).parse(s);i=c.nextVersion,t=D.next;}catch(s){q.break(),U(s);}if(!e.force){let{type:s,name:c}=await Oe([{type:e.template||o?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 n=await a$1(e.cwd,{withFallback:true}),a=`${e.cwd}/${r}`;try{await S.access(e.cwd,S.constants.W_OK);}catch{q.break(),q.error(`The path ${d.info(e.cwd)} is not writable.`),q.error(`It is likely you do not have write permissions for this folder or the path ${d.info(e.cwd)} does not exist.`),q.break(),process.exit(1);}return S.existsSync(j__default.resolve(e.cwd,r,"package.json"))&&(q.break(),q.error(`A project with the name ${d.info(r)} already exists.`),q.error("Please choose a different name and try again."),q.break(),process.exit(1)),t===D.next&&await Fi(a,{version:i,cwd:e.cwd,packageManager:n,srcDir:!!e.srcDir}),t===D["next-monorepo"]&&await Ai(a,{packageManager:n}),t===D.vite&&await Di(a,{packageManager:n}),t===D.start&&await _i(a,{packageManager:n}),{projectPath:a,projectName:r,template:t}}async function Fi(e,t){let r$1=r("Creating a new Next.js project. This may take a few minutes.").start(),i=["--tailwind","--eslint","--typescript","--app",t.srcDir?"--src-dir":"--no-src-dir","--no-import-alias",`--use-${t.packageManager}`];(t.version.startsWith("15")||t.version.startsWith("latest")||t.version.startsWith("canary"))&&i.push("--turbopack"),(t.version.startsWith("latest")||t.version.startsWith("canary"))&&i.push("--no-react-compiler");try{await execa("npx",[`create-next-app@${t.version}`,e,"--silent",...i],{cwd:t.cwd});}catch{q.break(),q.error("Something went wrong creating a new Next.js project. Please try again."),process.exit(1);}r$1?.succeed("Creating a new Next.js project.");}async function Ai(e,t){let r$1=r("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 S.ensureDir(i);let o=await fetch(Qe);if(!o.ok)throw new Error(`Failed to download template: ${o.statusText}`);let n=j__default.resolve(i,"template.tar.gz");await S.writeFile(n,Buffer.from(await o.arrayBuffer())),await execa("tar",["-xzf",n,"-C",i,"--strip-components=2","ui-main/templates/monorepo-next"]);let a=j__default.resolve(i,"monorepo-next");await S.move(a,e),await S.remove(i),await execa(t.packageManager,["install"],{cwd:e});let s=j__default.join(e,"package.json");if(S.existsSync(s)){let l=await S.readFile(s,"utf8"),m=JSON.parse(l);m.name=e.split("/").pop(),await S.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$1?.succeed("Creating a new Next.js monorepo.");}catch(i){r$1?.fail("Something went wrong creating a new Next.js monorepo."),U(i);}}async function Di(e,t){let r$1=r("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 S.ensureDir(i);let o=await fetch(Qe);if(!o.ok)throw new Error(`Failed to download template: ${o.statusText}`);let n=j__default.resolve(i,"template.tar.gz");await S.writeFile(n,Buffer.from(await o.arrayBuffer())),await execa("tar",["-xzf",n,"-C",i,"--strip-components=2","ui-main/templates/vite-app"]);let a=j__default.resolve(i,"vite-app");if(await S.move(a,e),await S.remove(i),t.packageManager!=="pnpm"){let c=j__default.join(e,"pnpm-lock.yaml");S.existsSync(c)&&await S.remove(c);}await execa(t.packageManager,["install"],{cwd:e});let s=j__default.join(e,"package.json");if(S.existsSync(s)){let c=await S.readFile(s,"utf8"),l=JSON.parse(c);l.name=e.split("/").pop(),await S.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$1?.succeed("Creating a new Vite project.");}catch(i){r$1?.fail("Something went wrong creating a new Vite project."),U(i);}}async function _i(e,t){let r$1=r("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 S.ensureDir(i);let o=await fetch(Qe);if(!o.ok)throw new Error(`Failed to download template: ${o.statusText}`);let n=j__default.resolve(i,"template.tar.gz");await S.writeFile(n,Buffer.from(await o.arrayBuffer())),await execa("tar",["-xzf",n,"-C",i,"--strip-components=2","ui-main/templates/start-app"]);let a=j__default.resolve(i,"start-app");if(await S.move(a,e),await S.remove(i),t.packageManager!=="pnpm"){let c=j__default.join(e,"pnpm-lock.yaml");S.existsSync(c)&&await S.remove(c);}await execa(t.packageManager,["install"],{cwd:e});let s=j__default.join(e,"package.json");if(S.existsSync(s)){let c=await S.readFile(s,"utf8"),l=JSON.parse(c);l.name=e.split("/").pop(),await S.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$1?.succeed("Creating a new TanStack Start project.");}catch(i){r$1?.fail("Something went wrong creating a new TanStack Start project."),U(i);}}async function z(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 o=join(e,i);existsSync(o)&&t({path:o,overload:!1,quiet:!0});}}catch(t){q.warn("Failed to load env files:",t);}}var he=".bak";function Zt(e){if(!S.existsSync(e))return null;let t=`${e}${he}`;try{return S.renameSync(e,t),t}catch(r){return console.error(`Failed to create backup of ${e}: ${r}`),null}}function Qt(e){let t=`${e}${he}`;if(!S.existsSync(t))return false;try{return S.renameSync(t,e),!0}catch(r){return console.error(`Warning: Could not restore backup file ${t}: ${r}`),false}}function et(e){let t=`${e}${he}`;if(!S.existsSync(t))return false;try{return S.unlinkSync(t),!0}catch{return false}}async function er(e,t){let r=new Set,i=new Set,o=[...e];for(;o.length>0;){let n=o.shift();if(i.has(n))continue;i.add(n);let{registry:a}=D$1(n);a&&!b[a]&&r.add(a);try{let[s]=await S$1([n],t,{useCache:!0});if(s?.registryDependencies)for(let c of s.registryDependencies){let{registry:l}=D$1(c);l&&!b[l]&&r.add(l),i.has(c)||o.push(c);}}catch(s){if(s instanceof x){let{registry:c}=D$1(n);c&&!b[c]&&r.add(c);continue}continue}}return Array.from(r)}async function _(e,t,r$1={}){r$1={silent:false,writeFile:true,...r$1};let o=(await er(e,t)).filter(l=>!t.registries?.[l]&&!Object.keys(b).includes(l));if(o.length===0)return {config:t,newRegistries:[]};let n=await fa({useCache:process.env.NODE_ENV!=="development"});if(!n)return {config:t,newRegistries:[]};let a={};for(let l of o)n[l]&&(a[l]=n[l]);if(Object.keys(a).length===0)return {config:t,newRegistries:[]};let s=Object.fromEntries(Object.entries(t.registries||{}).filter(([l])=>!Object.keys(b).includes(l))),c$1={...t,registries:{...s,...a}};if(r$1.writeFile){let{resolvedPaths:l,...m}=c$1,p=r("Updating components.json.",{silent:r$1.silent}).start(),u=c.parse(m);await S.writeFile(j__default.resolve(t.resolvedPaths.cwd,"components.json"),JSON.stringify(u,null,2)+`
46
+ `,"utf-8"),p.succeed();}return {config:c$1,newRegistries:Object.keys(a)}}process.on("exit",e=>{let t=j__default.resolve(process.cwd(),"components.json");return e===0?et(t):Qt(t)});var rt=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?D[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()}),rr=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=rt.parse({cwd:j__default.resolve(t.cwd),isNewProject:!1,components:e,...t});if(await z(r.cwd),e.length>0){let i=M(l({resolvedPaths:{cwd:r.cwd}})),o=j__default.resolve(r.cwd,"components.json");if(S.existsSync(o)){let s=await S.readJson(o),c$1=c.partial().parse(s),l$1=l({resolvedPaths:{cwd:r.cwd}});i=M({...c$1,resolvedPaths:{...l$1.resolvedPaths,cwd:r.cwd}}),Zt(o);}let{config:n}=await _(e,i,{silent:!0,writeFile:!1});i=n,P(e[0],i);let[a]=await W$1([e[0]],{config:i});a?.type==="registry:base"&&(a.config&&(i=M(tr(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),q.log(`${d.success("Success!")} Project initialization completed.
47
+ You may now add components.`),et(j__default.resolve(r.cwd,"components.json")),q.break();}catch(r){console.log("init error"),q.break(),U(r);}finally{N();}});async function le(e){let t,r$1;if(e.skipPreflight)t=await n(e.cwd);else {let h=await Mt(e);if(h.errors["1"]){let{projectPath:g,template:w}=await Ee(e);g||process.exit(1),e.cwd=g,e.isNewProject=true,r$1=w,t=await n(e.cwd);}else t=h.projectInfo;}if(r$1==="next-monorepo")return e.cwd=j__default.resolve(e.cwd,"apps/web"),await g(e.cwd);let i=await o(e.cwd,t),o$1=i?await Ui(i,e):await Bi(await g(e.cwd));if(!e.yes){let{proceed:h}=await Oe({type:"confirm",name:"proceed",message:`Write configuration to ${d.info("components.json")}. Proceed?`,initial:true});h||process.exit(0);}let n$1=[...e.baseStyle?["index"]:[],...e.components??[]],a=await h(e.cwd,o$1),{config:s}=await _(n$1,a,{silent:true});s.registries&&(o$1.registries=s.registries);let c=r("Writing components.json.").start(),m=`${j__default.resolve(e.cwd,"components.json")}${he}`,p=(h,g)=>{let{registries:w,...C}=tr(h,g);return {...C,registries:w}};if(!e.force&&S.existsSync(m)){let h=await S.readJson(m);o$1=p(h,o$1);}e.registryBaseConfig&&(o$1=p(o$1,e.registryBaseConfig)),o$1.registries=Object.fromEntries(Object.entries(o$1.registries||{}).filter(([h])=>!Object.keys(b).includes(h))),c.succeed();let u=await h(e.cwd,o$1);return await se(n$1,u,{overwrite:true,silent:e.silent,baseStyle:e.baseStyle,isNewProject:e.isNewProject||t?.framework.name==="next-app"}),u}async function Bi(e$1=null){let[t,r]=await Promise.all([_$1(),aa()]);q.info("");let i=await Oe([{type:"toggle",name:"typescript",message:`Would you like to use ${d.info("TypeScript")} (recommended)?`,initial:e$1?.tsx??true,active:"yes",inactive:"no"},{type:"select",name:"style",message:`Which ${d.info("style")} would you like to use?`,choices:t.map(o=>({title:o.label,value:o.name}))},{type:"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 Ui(e,t){let r=e.style,i=t.baseColor,o=e.tailwind.cssVariables,n=e.iconLibrary??"lucide";if(!t.defaults){let[a,s,c]=await Promise.all([_$1(),aa(),p(e)]),l=await Oe([]);r=l.style??r??"new-york",i=l.tailwindBaseColor??i,o=t.cssVariables;}return c.parse({$schema:e?.$schema,style:r,tailwind:{...e?.tailwind,baseColor:i,cssVariables:o},rsc:e?.rsc,tsx:e?.tsx,iconLibrary:n,aliases:e?.aliases})}async function or(e){let t={};if(!S.existsSync(e.cwd)||!S.existsSync(j__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!S.existsSync(j__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,config:null};try{let r=await g(e.cwd);return {errors:t,config:r}}catch{q.break(),q.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.`),q.error(`Learn more at ${d.info("https://ui.shadcn.com/docs/components-json")}.`),q.break(),process.exit(1);}}var Ji=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()}),ar=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=Ji.parse({components:e,cwd:j__default.resolve(t.cwd),...t});await z(r.cwd);let i=await g(r.cwd);i||(i=l({style:"new-york",resolvedPaths:{cwd:r.cwd}}));let o=["sidebar-","login-","signup-","otp-","calendar-"],n$1=["base-","radix-"];if(e.length>0&&i?.style&&n$1.some(w=>i?.style.startsWith(w))){let w=e.filter(C=>o.some(v=>C.startsWith(v)));w.length&&(q.warn(`The ${d.info(w.map(C=>C).join(", "))} component(s) are not available for the ${d.info(i.style)} style yet. They are coming soon.`),q.warn("In the meantime, you can visit the blocks page on https://ui.shadcn.com/blocks and copy the code."),q.break(),process.exit(1));}let a=!1;if(e.length>0){let{config:g,newRegistries:w}=await _(e,i,{silent:r.silent,writeFile:!1});i=g,a=w.length>0;}let s,c=!0;if(e.length>0){let[g]=await W$1([e[0]],{config:i});if(s=g?.type,c=s!=="registry:theme"&&s!=="registry:style",L(g)){await se(e,i,{...r,baseStyle:c});return}if(!r.yes&&(s==="registry:style"||s==="registry:theme")){q.break();let{confirm:w}=await Oe({type:"confirm",name:"confirm",message:d.warn(`You are about to install a new ${s.replace("registry:","")}.
49
+ Existing CSS variables and components will be overwritten. Continue?`)});w||(q.break(),q.log("Installation cancelled."),q.break(),process.exit(1));}}if(r.components?.length||(r.components=await Yi(r)),(await n(r.cwd))?.tailwindVersion==="v4"){let g=c$1.filter(w=>r.components?.includes(w.name));g?.length&&(q.break(),g.forEach(w=>{q.warn(d.warn(w.message));}),q.break(),process.exit(1));}let{errors:m,config:p}=await or(r),u=!1;m["3"]&&(p=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 h=!1;if(m["1"]){let{projectPath:g$1,template:w}=await Ee({cwd:r.cwd,force:r.overwrite,srcDir:r.srcDir,components:r.components});g$1||(q.break(),process.exit(1)),r.cwd=g$1,w==="next-monorepo"?(r.cwd=j__default.resolve(r.cwd,"apps/web"),p=await g(r.cwd)):(p=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,h=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//));}if(console.log({config:p}),!p)throw new Error(`Failed to read config at ${d.info(r.cwd)}.`)}catch(r){console.log("add error"),q.break(),U(r);}finally{N();}});async function Yi(e){let t=await Z();if(!t)return q.break(),U(new Error("Failed to fetch registry index.")),[];if(e.all)return t.map(o=>o.name).filter(o=>!c$1.some(n=>n.name===o));if(e.components?.length)return e.components;let{components:r}=await Oe({type:"multiselect",name:"components",message:"Which components would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:false,choices:t.filter(o=>o.type==="registry:ui"&&!c$1.some(n=>n.name===o.name)).map(o=>({title:o.name,value:o.name,selected:e.all?true:e.components?.includes(o.name)}))});r?.length||(q.warn("No components selected. Exiting."),q.info(""),process.exit(1));let i=z$1.array(z$1.string()).safeParse(r);return i.success?i.data:(q.error(""),U(new Error("Something went wrong. Please try again.")),[])}async function mr(e){let t={},r={cwd:e.cwd,registryFile:j__default.resolve(e.cwd,e.registryFile),outputDir:j__default.resolve(e.cwd,e.outputDir)};return S.existsSync(r.registryFile)||(t["13"]=true),await S.mkdir(r.outputDir,{recursive:true}),Object.keys(t).length>0&&(t["13"]&&(q.break(),q.error(`The path ${d.info(r.registryFile)} does not exist.`)),q.break(),process.exit(1)),{errors:t,resolvePaths:r}}var qi=z$1.object({cwd:z$1.string(),registryFile:z$1.string(),outputDir:z$1.string()}),fr=new Command().name("build").description("build components for a shadcn registry").argument("[registry]","path to registry.json file","./registry.json").option("-o, --output <path>","destination directory for json files","./public/r").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r$1=qi.parse({cwd:j.resolve(t.cwd),registryFile:e,outputDir:t.output}),{resolvePaths:i}=await mr(r$1),o=await J.readFile(i.registryFile,"utf-8"),n=o$1.safeParse(JSON.parse(o));n.success||(q.error(`Invalid registry file found at ${d.info(i.registryFile)}.`),process.exit(1));let a=r("Building registry...");for(let s of n.data.items){a.start(`Building ${s.name}...`),s.$schema="https://ui.shadcn.com/schema/registry-item.json";for(let l of s.files??[])l.content=await J.readFile(j.resolve(i.cwd,l.path),"utf-8");let c=n$1.safeParse(s);if(!c.success){q.error(`Invalid registry item found for ${d.info(s.name)}.`);continue}await J.writeFile(j.resolve(i.outputDir,`${c.data.name}.json`),JSON.stringify(c.data,null,2));}await J.copyFile(i.registryFile,j.resolve(i.outputDir,"registry.json")),a.succeed("Building registry.");}catch(r){q.break(),U(r);}});var dr="https://ui.shadcn.com",Zi={next:"Next.js",vite:"Vite",start:"TanStack Start"},ur=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 g=gr();q.log("Build your own shadcn/ui."),q.log(`You will be taken to ${d.info(g)} to build your custom design system.`),q.break();let{proceed:w}=await Oe({type:"confirm",name:"proceed",message:"Open in browser?",initial:!0});w&&await pr(g),process.exit(0);}let i=e;if(!i){let{enteredName:g}=await Oe({type:"text",name:"enteredName",message:"What is your project named?",initial:t.template?`${t.template}-app`:"my-app",format:w=>w.trim(),validate:w=>w.length>128?"Name should be less than 128 characters.":!0});g||process.exit(0),i=g;}let o=t.template;if(!o){let{selectedTemplate:g}=await Oe({type:"select",name:"selectedTemplate",message:`Which ${d.info("template")} would you like to use?`,choices:Object.entries(Zi).map(([w,C])=>({title:C,value:w}))});g||process.exit(0),o=g;}let n=await eo(t.preset??!0);n||process.exit(0);let a,s;"_isUrl"in n?(a=n.url,s=new URL(n.url).searchParams.get("baseColor")??"neutral"):(a=Qi(n),s=n.baseColor);let c=M({}),{config:l}=await _([a],c,{silent:!0});c=l;let[m]=await W$1([a],{config:c}),p;m?.type==="registry:base"&&m.config&&(p=m.config);let u=rt.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:o,baseColor:s,baseStyle:!1,registryBaseConfig:p,skipPreflight:!1}),h=await le(u);if(h){await se(["component-example"],h,{baseStyle:!1,silent:!0,overwrite:!0});let g=to(o);g.length>0&&await I(g,h,{overwrite:!0,silent:!0});}q.log(`${d.success("Success!")} Project initialization completed.
50
+ You may now add components.`),q.break();}catch(r){q.break(),U(r);}finally{N();}});function Qi(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 `${ro()}?${t.toString()}`}async function eo(e){if(e===true){let t=await ga(),{selectedPreset:r}=await Oe({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=gr();return q.info(`
55
51
  Opening ${d.info(i)} in your browser...
56
- `),await ur(i),null}return t.find(i=>i.name===r)??null}if(typeof e=="string"){if(K(e))return {_isUrl:true,url:e};let t=await ha(e);if(!t){let i=(await ga()).map(o=>o.name).join(", ");q.error(`Preset "${e}" not found. Available presets: ${i}`),process.exit(1);}return t}return null}function oo(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";
52
+ `),await pr(i),null}return t.find(i=>i.name===r)??null}if(typeof e=="string"){if(K(e))return {_isUrl:true,url:e};let t=await ha(e);if(!t){let i=(await ga()).map(o=>o.name).join(", ");q.error(`Preset "${e}" not found. Available presets: ${i}`),process.exit(1);}return t}return null}function to(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";
57
53
 
58
54
  export function App() {
59
55
  return <ComponentExample />;
@@ -75,18 +71,18 @@ function App() {
75
71
  <ComponentExample />
76
72
  );
77
73
  }
78
- `}];default:return []}}function wr(){return `${gr}/create`}function no(){return `${gr}/init`}var lo=z$1.object({component:z$1.string().optional(),yes:z$1.boolean(),cwd:z$1.string(),path:z$1.string().optional()}),br=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=lo.parse({component:e,...t}),i=j__default.resolve(r.cwd);existsSync(i)||(q.error(`The path ${i} does not exist. Please try again.`),process.exit(1));let o=await g(i);o||(q.warn(`Configuration is missing. Please run ${d.success("init")} to create a components.json file.`),process.exit(1));let n=await Z();if(n||(U(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let c=o.resolvedPaths.components,l=n.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 yr(p,o);u.length&&m.push({name:p.name,changes:u});}m.length||(q.info("No updates found."),process.exit(0)),q.info("The following components have updates available:");for(let p of m){q.info(`- ${p.name}`);for(let u of p.changes)q.info(` - ${u.filePath}`);}q.break(),q.info(`Run ${d.success("diff <component>")} to see the changes.`),process.exit(0);}let a=n.find(c=>c.name===r.component);a||(q.error(`The component ${d.success(r.component)} does not exist.`),process.exit(1));let s=await yr(a,o);s.length||(q.info(`No updates found for ${r.component}.`),process.exit(0));for(let c of s)q.info(`- ${c.filePath}`),await mo(c.patch),q.info("");}catch(r){U(r);}});async function yr(e,t){let r=await da(t.style,[e]),i=await ba(t.tailwind.baseColor);if(!r)return [];let o=[];for(let n of r){let a=await ea(t,n);if(a)for(let s of n.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 H$1({filename:s.path,raw:s.content,config:t,baseColor:i}),p=diffLines(m,l);p.length>1&&o.push({filePath:c,patch:p});}}return o}async function mo(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 xr=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{q.info("> project info"),console.log(await n(e.cwd)),q.break(),q.info("> components.json"),console.log(await g(e.cwd));}catch(t){U(t);}});var fe="latest",Fe=[{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]
74
+ `}];default:return []}}function gr(){return `${dr}/create`}function ro(){return `${dr}/init`}var so=z$1.object({component:z$1.string().optional(),yes:z$1.boolean(),cwd:z$1.string(),path:z$1.string().optional()}),wr=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=so.parse({component:e,...t}),i=j__default.resolve(r.cwd);existsSync(i)||(q.error(`The path ${i} does not exist. Please try again.`),process.exit(1));let o=await g(i);o||(q.warn(`Configuration is missing. Please run ${d.success("init")} to create a components.json file.`),process.exit(1));let n=await Z();if(n||(U(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let c=o.resolvedPaths.components,l=n.filter(p=>{for(let u of p.files??[]){let h=j__default.resolve(c,typeof u=="string"?u:u.path);if(existsSync(h))return !0}return !1}),m=[];for(let p of l){let u=await hr(p,o);u.length&&m.push({name:p.name,changes:u});}m.length||(q.info("No updates found."),process.exit(0)),q.info("The following components have updates available:");for(let p of m){q.info(`- ${p.name}`);for(let u of p.changes)q.info(` - ${u.filePath}`);}q.break(),q.info(`Run ${d.success("diff <component>")} to see the changes.`),process.exit(0);}let a=n.find(c=>c.name===r.component);a||(q.error(`The component ${d.success(r.component)} does not exist.`),process.exit(1));let s=await hr(a,o);s.length||(q.info(`No updates found for ${r.component}.`),process.exit(0));for(let c of s)q.info(`- ${c.filePath}`),await ao(c.patch),q.info("");}catch(r){U(r);}});async function hr(e,t){let r=await da(t.style,[e]),i=await ba(t.tailwind.baseColor);if(!r)return [];let o=[];for(let n of r){let a=await ea(t,n);if(a)for(let s of n.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 H$1({filename:s.path,raw:s.content,config:t,baseColor:i}),p=diffLines(m,l);p.length>1&&o.push({filePath:c,patch:p});}}return o}async function ao(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 yr=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{q.info("> project info"),console.log(await n(e.cwd)),q.break(),q.info("> components.json"),console.log(await g(e.cwd));}catch(t){U(t);}});var fe="latest",Fe=[{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]
79
75
  command = "npx"
80
76
  args = ["shadcn@${fe}", "mcp"]
81
- `}],Te=[`shadcn@${fe}`],ct=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){q.break(),U(t);}}),yo=at.object({client:at.enum(["claude","cursor","vscode","codex"]),cwd:at.string()});ct.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${Fe.map(e=>e.name).join(", ")})`).action(async(e,t)=>{try{let i=(t.parent?.opts()||{}).cwd||process.cwd(),o=e.client;if(!o){let l=await Oe({type:"select",name:"client",message:"Which MCP client are you using?",choices:Fe.map(m=>({title:m.label,value:m.name}))});l.client||(q.break(),process.exit(1)),o=l.client;}let n=yo.parse({client:o,cwd:i}),a=await g(n.cwd);if(n.client==="codex"){if(a)await z([],Te,a,{silent:!1});else {let l=await a$1(n.cwd),m=l==="npm"?"install":"add",p=l==="npm"?"--save-dev":"-D",u=r("Installing dependencies...").start();await execa(l,[m,p,...Te],{cwd:n.cwd}),u.succeed("Installing dependencies.");}q.break(),q.log("To configure the shadcn MCP server in Codex:"),q.break(),q.log(`1. Open or create the file ${d.info("~/.codex/config.toml")}`),q.log("2. Add the following configuration:"),q.log(),q.info(`[mcp_servers.shadcn]
77
+ `}],Te=[`shadcn@${fe}`],ct=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 z(e.cwd);let t=new StdioServerTransport;await b$1.connect(t);}catch(t){q.break(),U(t);}}),go=at.object({client:at.enum(["claude","cursor","vscode","codex"]),cwd:at.string()});ct.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${Fe.map(e=>e.name).join(", ")})`).action(async(e,t)=>{try{let i=(t.parent?.opts()||{}).cwd||process.cwd(),o=e.client;if(!o){let l=await Oe({type:"select",name:"client",message:"Which MCP client are you using?",choices:Fe.map(m=>({title:m.label,value:m.name}))});l.client||(q.break(),process.exit(1)),o=l.client;}let n=go.parse({client:o,cwd:i}),a=await g(n.cwd);if(n.client==="codex"){if(a)await W([],Te,a,{silent:!1});else {let l=await a$1(n.cwd),m=l==="npm"?"install":"add",p=l==="npm"?"--save-dev":"-D",u=r("Installing dependencies...").start();await execa(l,[m,p,...Te],{cwd:n.cwd}),u.succeed("Installing dependencies.");}q.break(),q.log("To configure the shadcn MCP server in Codex:"),q.break(),q.log(`1. Open or create the file ${d.info("~/.codex/config.toml")}`),q.log("2. Add the following configuration:"),q.log(),q.info(`[mcp_servers.shadcn]
82
78
  command = "npx"
83
- args = ["shadcn@${fe}", "mcp"]`),q.break(),q.info("3. Restart Codex to load the MCP server"),q.break(),process.exit(0);}let s=r("Configuring MCP server...").start(),c=await xo(n);if(s.succeed("Configuring MCP server."),a)await z([],Te,a,{silent:!1});else {let l=await a$1(n.cwd),m=l==="npm"?"install":"add",p=l==="npm"?"--save-dev":"-D",u=r("Installing dependencies...").start();await execa(l,[m,p,...Te],{cwd:n.cwd}),u.succeed("Installing dependencies.");}q.break(),q.success(`Configuration saved to ${c}.`),q.break();}catch(r){U(r);}});var bo=(e,t)=>t;async function xo(e){let{client:t,cwd:r}=e,i=Fe.find(c=>c.name===t);if(!i)throw new Error(`Unknown client: ${t}. Available clients: ${Fe.map(c=>c.name).join(", ")}`);let o=j__default.join(r,i.configPath),n=j__default.dirname(o);await R.ensureDir(n);let a={};try{let c=await promises.readFile(o,"utf-8");a=JSON.parse(c);}catch{}let s=tr(a,i.config,{arrayMerge:bo});return await promises.writeFile(o,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 Ir(e){if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let t=e.resolvedPaths.ui,[r$1,i]=await Promise.all([Ro("**/*.{js,ts,jsx,tsx}",{cwd:t}),$()]);if(Object.keys(i).length===0)throw new Error("Something went wrong fetching the registry icons.");let o=Object.entries(H).map(([m,p])=>({title:p.name,value:m})),n=await Oe([{type:"select",name:"sourceLibrary",message:`Which icon library would you like to ${d.info("migrate from")}?`,choices:o},{type:"select",name:"targetLibrary",message:`Which icon library would you like to ${d.info("migrate to")}?`,choices:o}]);if(n.sourceLibrary===n.targetLibrary)throw new Error("You cannot migrate to the same icon library. Please choose a different icon library.");if(!(n.sourceLibrary in H&&n.targetLibrary in H))throw new Error("Invalid icon library. Please choose a valid icon library.");let a=H[n.sourceLibrary],s=H[n.targetLibrary],{confirm:c}=await Oe({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${d.info(r$1.length)} files in ${d.info(`./${j__default.relative(e.resolvedPaths.cwd,t)}`)} from ${d.info(a.name)} to ${d.info(s.name)}. Continue?`});c||(q.info("Migration cancelled."),process.exit(0)),s.package&&await z([s.package],[],e,{silent:false});let l=r("Migrating icons...")?.start();await Promise.all(r$1.map(async m=>{l.text=`Migrating ${m}...`;let p=j__default.join(t,m),u=await promises.readFile(p,"utf-8"),g=await Po(u,n.sourceLibrary,n.targetLibrary,i);await promises.writeFile(p,g);})),l.succeed("Migration complete.");}async function Po(e,t,r,i){let o=H[t]?.import,n=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()===`"${o}"`){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:n,namedImports:m.map(p=>({name:p}))}),await l.getText()}function $o(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function No(e,t,r,i){let n=e.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").trim().split(",").map(a=>a.trim()).filter(Boolean);for(let a of n){let s=a.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?$/),c=a.match(/^(\w+)\s+as\s+(\w+)$/);if(s){let 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 kr(e,t={}){if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let r$1=e.resolvedPaths.ui,i=await Ro("**/*.{js,ts,jsx,tsx}",{cwd:r$1});if(!t.yes){let{confirm:s}=await Oe({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$1)}`)} to ${d.info("radix-ui")}. Continue?`});s||(q.info("Migration cancelled."),process.exit(0));}let o=r("Migrating imports...")?.start(),n=new Set;await Promise.all(i.map(async s=>{o.text=`Migrating ${s}...`;let c=j__default.join(r$1,s),l=await promises.readFile(c,"utf-8"),{content:m,replacedPackages:p}=await Oo(l);p.forEach(u=>n.add(u)),await promises.writeFile(c,m);})),o.succeed("Migrating imports.");let a=r("Updating package.json...")?.start();try{let s=m(e.resolvedPaths.cwd,!1);if(!s){a.fail("Could not read package.json"),q.warn("Could not update package.json. You may need to manually replace @radix-ui/react-* packages with radix-ui");return}let c=Array.from(n),l=["dependencies","devDependencies"];for(let m of l)if(s[m])for(let p of c)s[m][p]&&delete s[m][p];if(c.length>0){s.dependencies||(s.dependencies={}),s.dependencies["radix-ui"]="latest";let m=j__default.join(e.resolvedPaths.cwd,"package.json");await promises.writeFile(m,JSON.stringify(s,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"),q.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui");}}async function Oo(e){let t=/import\s+(?:(type)\s+)?(?:\*\s+as\s+(\w+)|{([^}]+)})\s+from\s+(["'])@radix-ui\/react-([^"']+)\4(;?)/g,r=[],i=[],o=[],n='"',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&&(n=M,a=X===";"),o.push(`@radix-ui/react-${F}`);let A=!!h;if(x){let De=$o(F);r.push({name:De,alias:x,isType:A});}else v&&No(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 ${n}radix-ui${n}${a?";":""}`;s=i.reduce((w,h,x)=>w.replace(h,x===0?p:""),s),s=s.replace(/\n\s*\n\s*\n/g,`
79
+ args = ["shadcn@${fe}", "mcp"]`),q.break(),q.info("3. Restart Codex to load the MCP server"),q.break(),process.exit(0);}let s=r("Configuring MCP server...").start(),c=await wo(n);if(s.succeed("Configuring MCP server."),a)await W([],Te,a,{silent:!1});else {let l=await a$1(n.cwd),m=l==="npm"?"install":"add",p=l==="npm"?"--save-dev":"-D",u=r("Installing dependencies...").start();await execa(l,[m,p,...Te],{cwd:n.cwd}),u.succeed("Installing dependencies.");}q.break(),q.success(`Configuration saved to ${c}.`),q.break();}catch(r){U(r);}});var ho=(e,t)=>t;async function wo(e){let{client:t,cwd:r}=e,i=Fe.find(c=>c.name===t);if(!i)throw new Error(`Unknown client: ${t}. Available clients: ${Fe.map(c=>c.name).join(", ")}`);let o=j__default.join(r,i.configPath),n=j__default.dirname(o);await S.ensureDir(n);let a={};try{let c=await promises.readFile(o,"utf-8");a=JSON.parse(c);}catch{}let s=tr(a,i.config,{arrayMerge:ho});return await promises.writeFile(o,JSON.stringify(s,null,2)+`
80
+ `,"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 Rr(e){if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let t=e.resolvedPaths.ui,[r$1,i]=await Promise.all([xo("**/*.{js,ts,jsx,tsx}",{cwd:t}),$()]);if(Object.keys(i).length===0)throw new Error("Something went wrong fetching the registry icons.");let o=Object.entries(H).map(([m,p])=>({title:p.name,value:m})),n=await Oe([{type:"select",name:"sourceLibrary",message:`Which icon library would you like to ${d.info("migrate from")}?`,choices:o},{type:"select",name:"targetLibrary",message:`Which icon library would you like to ${d.info("migrate to")}?`,choices:o}]);if(n.sourceLibrary===n.targetLibrary)throw new Error("You cannot migrate to the same icon library. Please choose a different icon library.");if(!(n.sourceLibrary in H&&n.targetLibrary in H))throw new Error("Invalid icon library. Please choose a valid icon library.");let a=H[n.sourceLibrary],s=H[n.targetLibrary],{confirm:c}=await Oe({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${d.info(r$1.length)} files in ${d.info(`./${j__default.relative(e.resolvedPaths.cwd,t)}`)} from ${d.info(a.name)} to ${d.info(s.name)}. Continue?`});c||(q.info("Migration cancelled."),process.exit(0)),s.package&&await W([s.package],[],e,{silent:false});let l=r("Migrating icons...")?.start();await Promise.all(r$1.map(async m=>{l.text=`Migrating ${m}...`;let p=j__default.join(t,m),u=await promises.readFile(p,"utf-8"),h=await Co(u,n.sourceLibrary,n.targetLibrary,i);await promises.writeFile(p,h);})),l.succeed("Migration complete.");}async function Co(e,t,r,i){let o=H[t]?.import,n=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()===`"${o}"`){for(let u of p.getNamedImports()??[]){let h=u.getName(),g=Object.values(i).find(w=>w[t]===h)?.[r];!g||m.includes(g)||(m.push(g),u.remove(),l.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).filter(w=>w.getTagNameNode()?.getText()===h).forEach(w=>w.getTagNameNode()?.replaceWithText(g)));}p.getNamedImports()?.length===0&&p.remove();}return m.length>0&&l.addImportDeclaration({moduleSpecifier:n,namedImports:m.map(p=>({name:p}))}),await l.getText()}function Po(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function jo(e,t,r,i){let n=e.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").trim().split(",").map(a=>a.trim()).filter(Boolean);for(let a of n){let s=a.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?$/),c=a.match(/^(\w+)\s+as\s+(\w+)$/);if(s){let 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 Cr(e,t={}){if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let r$1=e.resolvedPaths.ui,i=await xo("**/*.{js,ts,jsx,tsx}",{cwd:r$1});if(!t.yes){let{confirm:s}=await Oe({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$1)}`)} to ${d.info("radix-ui")}. Continue?`});s||(q.info("Migration cancelled."),process.exit(0));}let o=r("Migrating imports...")?.start(),n=new Set;await Promise.all(i.map(async s=>{o.text=`Migrating ${s}...`;let c=j__default.join(r$1,s),l=await promises.readFile(c,"utf-8"),{content:m,replacedPackages:p}=await Eo(l);p.forEach(u=>n.add(u)),await promises.writeFile(c,m);})),o.succeed("Migrating imports.");let a=r("Updating package.json...")?.start();try{let s=m(e.resolvedPaths.cwd,!1);if(!s){a.fail("Could not read package.json"),q.warn("Could not update package.json. You may need to manually replace @radix-ui/react-* packages with radix-ui");return}let c=Array.from(n),l=["dependencies","devDependencies"];for(let m of l)if(s[m])for(let p of c)s[m][p]&&delete s[m][p];if(c.length>0){s.dependencies||(s.dependencies={}),s.dependencies["radix-ui"]="latest";let m=j__default.join(e.resolvedPaths.cwd,"package.json");await promises.writeFile(m,JSON.stringify(s,null,2)+`
81
+ `),a.succeed("Updated package.json."),await W(["radix-ui"],[],e,{silent:!1});}else a.succeed("No packages found in source files.");}catch{a.fail("Failed to update package.json"),q.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui");}}async function Eo(e){let t=/import\s+(?:(type)\s+)?(?:\*\s+as\s+(\w+)|{([^}]+)})\s+from\s+(["'])@radix-ui\/react-([^"']+)\4(;?)/g,r=[],i=[],o=[],n='"',a=false,s=e,c;for(;(c=t.exec(e))!==null;){let[g,w,C,v,Y,O,X]=c;if(O==="icons"||O.startsWith("icons/"))continue;i.push(g),i.length===1&&(n=Y,a=X===";"),o.push(`@radix-ui/react-${O}`);let T=!!w;if(C){let De=Po(O);r.push({name:De,alias:C,isType:T});}else v&&jo(v,T,r,O);}if(r.length===0)return {content:e,replacedPackages:[]};let l=r.filter((g,w,C)=>w===C.findIndex(v=>v.name===g.name&&v.alias===g.alias&&v.isType===g.isType)),p=`import { ${l.map(g=>{let w=g.isType?"type ":"";return g.alias?`${w}${g.name} as ${g.alias}`:`${w}${g.name}`}).join(", ")} } from ${n}radix-ui${n}${a?";":""}`;s=i.reduce((g,w,C)=>g.replace(w,C===0?p:""),s),s=s.replace(/\n\s*\n\s*\n/g,`
86
82
 
87
- `),l.some(w=>w.name==="Slot"&&w.alias==="SlotPrimitive")&&(s=s.split(`
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),De=(A.match(/"/g)||[]).length,zr=(A.match(/'/g)||[]).length;return De%2!==0||zr%2!==0?M:"__SLOT_PLACEHOLDER__"}),v=v.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),v}).join(`
89
- `));let g=Array.from(new Set(o));return {content:s,replacedPackages:g}}async function jr(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 g(e.cwd);return {errors:t,config:r}}catch{q.break(),q.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e.cwd)}.
90
- Before you can run a migration, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),q.error(`Learn more at ${d.info("https://ui.shadcn.com/docs/components-json")}.`),q.break(),process.exit(1);}}var Er=[{name:"icons",description:"migrate your ui components to a different icon library."},{name:"radix",description:"migrate to radix-ui."}],Ao=z$1.object({cwd:z$1.string(),list:z$1.boolean(),yes:z$1.boolean(),migration:z$1.string().refine(e=>e&&Er.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=Ao.parse({cwd:j__default.resolve(t.cwd),migration:e,list:t.list,yes:t.yes});if(r.list||!r.migration){q.info("Available migrations:");for(let n of Er)q.info(`- ${n.name}: ${n.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:o}=await jr(r);if(i["1"]||i["3"])throw new Error("No `components.json` file found. Ensure you are at the root of your project.");if(!o)throw new Error("Something went wrong reading your `components.json` file. Please ensure you have a valid `components.json` file.");r.migration==="icons"&&await Ir(o),r.migration==="radix"&&await kr(o,{yes:r.yes});}catch(r){q.break(),U(r);}});async function Nr(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=await g(e.cwd);return {errors:t,config:i,resolvePaths:r}}catch{q.break(),q.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.`),q.break(),process.exit(1);}}var _o=z$1.object({cwd:z$1.string(),registryFile:z$1.string(),outputDir:z$1.string(),verbose:z$1.boolean().optional().default(false)}),Or=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 Lo({cwd:j.resolve(t.cwd),registryFile:e,outputDir:t.output,verbose:t.verbose});});async function Lo(e){try{let t=_o.parse(e),[{errors:r$1,resolvePaths:i,config:o},n$2]=await Promise.all([Nr(t),n(t.cwd)]);(r$1["3"]||!o||!n$2)&&(q.error(`A ${d.info("components.json")} file is required to build the registry. Run ${d.info("shadcn init")} to create one.`),q.break(),process.exit(1)),(r$1["13"]||!i)&&(q.error(`We could not find a registry file at ${d.info(j.resolve(t.cwd,t.registryFile))}.`),q.break(),process.exit(1));let a=await Y.readFile(i.registryFile,"utf-8"),s=o$1.safeParse(JSON.parse(a));s.success||(q.error(`Invalid registry file found at ${d.info(i.registryFile)}.`),q.break(),process.exit(1));let c=r("Building registry..."),l=await Vo(s.data,o,n$2);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 Y.stat(g)).isFile())continue;u.content=await Y.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){q.error(`Invalid registry item found for ${d.info(m.name)}.`);continue}await Y.writeFile(j.resolve(i.outputDir,`${p.data.name}.json`),JSON.stringify(p.data,null,2));}if(await Y.copyFile(i.registryFile,j.resolve(i.outputDir,"registry.json")),c.succeed("Building registry."),t.verbose){r(`The registry has ${d.info(l.items.length.toString())} items:`).succeed();for(let m of l.items){q.log(` - ${m.name} (${d.info(m.type)})`);for(let p of m.files??[])q.log(` - ${p.path}`);}}}catch(t){q.break(),U(t);}}async function Vo(e,t,r){for(let i of e.items)if(i.files?.length)for(let o of i.files){let n=await J(o.path,t,r);n.files=n.files?.filter(a=>a.path!==o.path),n.files&&i.files.push(...n.files),n.dependencies&&(i.dependencies=i.dependencies?i.dependencies.concat(n.dependencies):n.dependencies);}return e}var Tr=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()=>{q.warn(`The ${d.info("shadcn registry:mcp")} command is deprecated. Use the ${d.info("shadcn mcp")} command instead.`),q.break();});var zo=z$1.object({cwd:z$1.string(),query:z$1.string().optional(),limit:z$1.number().optional(),offset:z$1.number().optional()}),Dr=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=zo.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=l({style:"new-york",resolvedPaths:{cwd:r.cwd}}),o=M(i),n=j__default.resolve(r.cwd,"components.json");if(R.existsSync(n)){let m=await R.readJson(n),p=c.partial().parse(m);o=M({...i,...p});}let a=o;try{let m=await g(r.cwd);m&&(a=M(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),O(e,a);let l$1=await ia(e,{query:r.query,limit:r.limit,offset:r.offset,config:a});console.log(JSON.stringify(l$1,null,2)),process.exit(0);}catch(r){U(r);}finally{N();}});var Uo=z$1.object({cwd:z$1.string()}),Mr=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=Uo.parse({cwd:j__default.resolve(t.cwd)});await B(r.cwd);let i=M({}),o=j__default.resolve(r.cwd,"components.json");if(R.existsSync(o)){let l=await R.readJson(o),m=c.partial().parse(l);i=M(m);}let n=i;try{let l=await g(r.cwd);l&&(n=M(l));}catch{}let{config:a,newRegistries:s}=await T(e,n,{silent:!0,writeFile:!1});s.length>0&&(n.registries=a.registries),O(e,n);let c$1=await W(e,{config:n});console.log(JSON.stringify(c$1,null,2)),process.exit(0);}catch(r){U(r);}finally{N();}});var Wr={version:"3.6.13"};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function Yo(){let e=new Command().name("shadcn").description("add items from registries to your project").version(Wr.version,"-v, --version","display the version number");e.addCommand(rr).addCommand(hr).addCommand(lr).addCommand(br).addCommand(Mr).addCommand(Dr).addCommand($r).addCommand(xr).addCommand(dr).addCommand(ct),e.addCommand(Or).addCommand(Tr),e.parse();}Yo();//# sourceMappingURL=index.js.map
83
+ `),l.some(g=>g.name==="Slot"&&g.alias==="SlotPrimitive")&&(s=s.split(`
84
+ `).map(C=>{if(C.trim().startsWith("import "))return C;let v=C;return v=v.replace(/\b(asChild\s*\?\s*)Slot(\s*:)/g,"$1__SLOT_PLACEHOLDER__$2"),v=v.replace(/\bReact\.ComponentProps<typeof\s+Slot>/g,"React.ComponentProps<typeof __SLOT_PLACEHOLDER__>"),v=v.replace(/\bComponentProps<typeof\s+Slot>/g,"ComponentProps<typeof __SLOT_PLACEHOLDER__>"),v=v.replace(/(<\/?)Slot(\s*\/?>)/g,"$1__SLOT_PLACEHOLDER__$2"),v=v.replace(/\bSlot\b/g,(Y,O,X)=>{let T=X.substring(0,O),De=(T.match(/"/g)||[]).length,Mr=(T.match(/'/g)||[]).length;return De%2!==0||Mr%2!==0?Y:"__SLOT_PLACEHOLDER__"}),v=v.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),v}).join(`
85
+ `));let h=Array.from(new Set(o));return {content:s,replacedPackages:h}}async function kr(e){let t={};if(!S.existsSync(e.cwd)||!S.existsSync(j__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!S.existsSync(j__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,config:null};try{let r=await g(e.cwd);return {errors:t,config:r}}catch{q.break(),q.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e.cwd)}.
86
+ Before you can run a migration, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),q.error(`Learn more at ${d.info("https://ui.shadcn.com/docs/components-json")}.`),q.break(),process.exit(1);}}var Pr=[{name:"icons",description:"migrate your ui components to a different icon library."},{name:"radix",description:"migrate to radix-ui."}],Oo=z$1.object({cwd:z$1.string(),list:z$1.boolean(),yes:z$1.boolean(),migration:z$1.string().refine(e=>e&&Pr.some(t=>t.name===e),{message:"You must specify a valid migration. Run `shadcn migrate --list` to see available migrations."}).optional()}),jr=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=Oo.parse({cwd:j__default.resolve(t.cwd),migration:e,list:t.list,yes:t.yes});if(r.list||!r.migration){q.info("Available migrations:");for(let n of Pr)q.info(`- ${n.name}: ${n.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:o}=await kr(r);if(i["1"]||i["3"])throw new Error("No `components.json` file found. Ensure you are at the root of your project.");if(!o)throw new Error("Something went wrong reading your `components.json` file. Please ensure you have a valid `components.json` file.");r.migration==="icons"&&await Rr(o),r.migration==="radix"&&await Cr(o,{yes:r.yes});}catch(r){q.break(),U(r);}});async function Er(e){let t={},r={cwd:e.cwd,registryFile:j__default.resolve(e.cwd,e.registryFile),outputDir:j__default.resolve(e.cwd,e.outputDir)};if(!S.existsSync(r.registryFile))return t["13"]=true,{errors:t,resolvePaths:null,config:null};if(!S.existsSync(j__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,resolvePaths:null,config:null};await S.mkdir(r.outputDir,{recursive:true});try{let i=await g(e.cwd);return {errors:t,config:i,resolvePaths:r}}catch{q.break(),q.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e.cwd)}.
87
+ Before you can build the registry, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),q.break(),process.exit(1);}}var Fo=z$1.object({cwd:z$1.string(),registryFile:z$1.string(),outputDir:z$1.string(),verbose:z$1.boolean().optional().default(false)}),$r=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 Ao({cwd:j.resolve(t.cwd),registryFile:e,outputDir:t.output,verbose:t.verbose});});async function Ao(e){try{let t=Fo.parse(e),[{errors:r$1,resolvePaths:i,config:o},n$2]=await Promise.all([Er(t),n(t.cwd)]);(r$1["3"]||!o||!n$2)&&(q.error(`A ${d.info("components.json")} file is required to build the registry. Run ${d.info("shadcn init")} to create one.`),q.break(),process.exit(1)),(r$1["13"]||!i)&&(q.error(`We could not find a registry file at ${d.info(j.resolve(t.cwd,t.registryFile))}.`),q.break(),process.exit(1));let a=await J.readFile(i.registryFile,"utf-8"),s=o$1.safeParse(JSON.parse(a));s.success||(q.error(`Invalid registry file found at ${d.info(i.registryFile)}.`),q.break(),process.exit(1));let c=r("Building registry..."),l=await Do(s.data,o,n$2);for(let m of l.items)m.files=m.files?.filter((p,u,h)=>u===h.findIndex(g=>g.path===p.path)),m.dependencies&&(m.dependencies=m.dependencies.filter((p,u,h)=>u===h.findIndex(g=>g===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 h=j.resolve(i.cwd,u.path);try{if(!(await J.stat(h)).isFile())continue;u.content=await J.readFile(h,"utf-8");}catch(g){console.error("Error reading file in registry build:",h,g);continue}}let p=n$1.safeParse(m);if(!p.success){q.error(`Invalid registry item found for ${d.info(m.name)}.`);continue}await J.writeFile(j.resolve(i.outputDir,`${p.data.name}.json`),JSON.stringify(p.data,null,2));}if(await J.copyFile(i.registryFile,j.resolve(i.outputDir,"registry.json")),c.succeed("Building registry."),t.verbose){r(`The registry has ${d.info(l.items.length.toString())} items:`).succeed();for(let m of l.items){q.log(` - ${m.name} (${d.info(m.type)})`);for(let p of m.files??[])q.log(` - ${p.path}`);}}}catch(t){q.break(),U(t);}}async function Do(e,t,r){for(let i of e.items)if(i.files?.length)for(let o of i.files){let n=await J$1(o.path,t,r);n.files=n.files?.filter(a=>a.path!==o.path),n.files&&i.files.push(...n.files),n.dependencies&&(i.dependencies=i.dependencies?i.dependencies.concat(n.dependencies):n.dependencies);}return e}var Nr=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()=>{q.warn(`The ${d.info("shadcn registry:mcp")} command is deprecated. Use the ${d.info("shadcn mcp")} command instead.`),q.break();});var Vo=z$1.object({cwd:z$1.string(),query:z$1.string().optional(),limit:z$1.number().optional(),offset:z$1.number().optional()}),Fr=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=Vo.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 z(r.cwd);let i=l({style:"new-york",resolvedPaths:{cwd:r.cwd}}),o=M(i),n=j__default.resolve(r.cwd,"components.json");if(S.existsSync(n)){let m=await S.readJson(n),p=c.partial().parse(m);o=M({...i,...p});}let a=o;try{let m=await g(r.cwd);m&&(a=M(m));}catch{}let{config:s,newRegistries:c$1}=await _(e.map(m=>`${m}/registry`),a,{silent:!0,writeFile:!1});c$1.length>0&&(a.registries=s.registries),O(e,a);let l$1=await ia(e,{query:r.query,limit:r.limit,offset:r.offset,config:a});console.log(JSON.stringify(l$1,null,2)),process.exit(0);}catch(r){U(r);}finally{N();}});var Wo=z$1.object({cwd:z$1.string()}),Lr=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=Wo.parse({cwd:j__default.resolve(t.cwd)});await z(r.cwd);let i=M({}),o=j__default.resolve(r.cwd,"components.json");if(S.existsSync(o)){let l=await S.readJson(o),m=c.partial().parse(l);i=M(m);}let n=i;try{let l=await g(r.cwd);l&&(n=M(l));}catch{}let{config:a,newRegistries:s}=await _(e,n,{silent:!0,writeFile:!1});s.length>0&&(n.registries=a.registries),O(e,n);let c$1=await W$1(e,{config:n});console.log(JSON.stringify(c$1,null,2)),process.exit(0);}catch(r){U(r);}finally{N();}});var Vr={version:"3.6.14"};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function Uo(){let e=new Command().name("shadcn").description("add items from registries to your project").version(Vr.version,"-v, --version","display the version number");e.addCommand(rr).addCommand(ur).addCommand(ar).addCommand(wr).addCommand(Lr).addCommand(Fr).addCommand(jr).addCommand(yr).addCommand(fr).addCommand(ct),e.addCommand($r).addCommand(Nr),e.parse();}Uo();//# sourceMappingURL=index.js.map
92
88
  //# sourceMappingURL=index.js.map