shadcn 3.6.2 → 3.6.3

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,72 +1,72 @@
1
1
  #!/usr/bin/env node
2
- import {b as b$1,a as a$1}from'./chunk-SSXFFJQN.js';import {a,O,n,R as R$1,_,s,d,Y as Y$1,P,p,i,q,j,t,b,ca,ea,g,h,e,f,r,N,c as c$1,ba,K,ka,M,la,ha,fa,ia,J,L as L$1,Q,ma,ja,S,k,da,o as o$1,F,W,z as z$2,X,m,T as T$1,l,U,G,I,H as H$1,V}from'./chunk-I3JXSMK6.js';export{ha as fetchTree,ia as getItemTargetPath,la as getPreset,ka as getPresets,aa as getRegistriesConfig,ja as getRegistriesIndex,Z as getRegistry,fa as getRegistryBaseColor,ea as getRegistryBaseColors,da as getRegistryIcons,_ as getRegistryItems,ca as getRegistryStyles,ba as getShadcnRegistryIndex,$ as resolveRegistryItems,ga as resolveTree}from'./chunk-I3JXSMK6.js';import {c,o,n as n$1}from'./chunk-WKG3W635.js';import'./chunk-PMFK2ZSQ.js';import'./chunk-BFNVF2P5.js';import*as E from'path';import E__default,{join}from'path';import {promises,existsSync}from'fs';import R from'fs-extra';import v from'postcss';import ii from'postcss/lib/at-rule';import mt,{z as z$1}from'zod';import {execa}from'execa';import Fe from'prompts';import {SyntaxKind,Project,ScriptKind,VariableDeclarationKind}from'ts-morph';import et,{tmpdir}from'os';import {Command}from'commander';import fr from'deepmerge';import*as Y from'fs/promises';import Y__default from'fs/promises';import at from'dedent';import Rr from'open';import {diffLines}from'diff';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {randomBytes}from'crypto';import Dn from'fast-glob';async function Kt(e){let t$1={};if(!R.existsSync(e.cwd)||!R.existsSync(E__default.resolve(e.cwd,"package.json")))return t$1["1"]=true,{errors:t$1,projectInfo:null};let r=t("Preflight checks.",{silent:e.silent}).start();R.existsSync(E__default.resolve(e.cwd,"components.json"))&&!e.force&&(r?.fail(),s.break(),s.error(`A ${d.info("components.json")} file already exists at ${d.info(e.cwd)}.
2
+ import {b as b$1,a as a$1}from'./chunk-SSXFFJQN.js';import {a,O,n,R as R$1,_,s,d,Y as Y$1,P,p,i,q,j as j$1,t,b,ca,ea,g,h,e,f,r,N,c as c$1,ba,K,ka,M,la,ha,fa,ia,J,L as L$1,Q,ma,ja,S,k,da,o as o$1,F,W,z as z$2,X,m,T as T$1,l,U,G,I,H as H$1,V}from'./chunk-I3JXSMK6.js';export{ha as fetchTree,ia as getItemTargetPath,la as getPreset,ka as getPresets,aa as getRegistriesConfig,ja as getRegistriesIndex,Z as getRegistry,fa as getRegistryBaseColor,ea as getRegistryBaseColors,da as getRegistryIcons,_ as getRegistryItems,ca as getRegistryStyles,ba as getShadcnRegistryIndex,$ as resolveRegistryItems,ga as resolveTree}from'./chunk-I3JXSMK6.js';import {c,o,n as n$1}from'./chunk-WKG3W635.js';import'./chunk-PMFK2ZSQ.js';import'./chunk-BFNVF2P5.js';import*as j from'path';import j__default,{join}from'path';import {promises,existsSync}from'fs';import R from'fs-extra';import S$1 from'postcss';import ni from'postcss/lib/at-rule';import ft,{z as z$1}from'zod';import {execa}from'execa';import Fe from'prompts';import {SyntaxKind,Project,ScriptKind,VariableDeclarationKind}from'ts-morph';import et,{tmpdir}from'os';import {Command}from'commander';import pr from'deepmerge';import*as Y from'fs/promises';import Y__default from'fs/promises';import ct from'dedent';import Cr from'open';import gn from'validate-npm-package-name';import {diffLines}from'diff';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {randomBytes}from'crypto';import _n from'fast-glob';async function qt(e){let t$1={};if(!R.existsSync(e.cwd)||!R.existsSync(j__default.resolve(e.cwd,"package.json")))return t$1["1"]=true,{errors:t$1,projectInfo:null};let r=t("Preflight checks.",{silent:e.silent}).start();R.existsSync(j__default.resolve(e.cwd,"components.json"))&&!e.force&&(r?.fail(),s.break(),s.error(`A ${d.info("components.json")} file already exists at ${d.info(e.cwd)}.
3
3
  To start over, remove the ${d.info("components.json")} file and run ${d.info("init")} again.`),s.break(),process.exit(1)),r?.succeed();let i=t("Verifying framework.",{silent:e.silent}).start(),n=await p(e.cwd);(!n||n?.framework.name==="manual")&&(t$1["7"]=true,i?.fail(),s.break(),n?.framework.links.installation&&s.error(`We could not detect a supported framework at ${d.info(e.cwd)}.
4
4
  Visit ${d.info(n?.framework.links.installation)} to manually configure your project.
5
- Once configured, you can use the cli to add components.`),s.break(),process.exit(1)),i?.succeed(`Verifying framework. Found ${d.info(n.framework.label)}.`);let o="Validating Tailwind CSS.";n.tailwindVersion==="v4"&&(o=`Validating Tailwind CSS config. Found ${d.info("v4")}.`);let a=t(o,{silent:e.silent}).start();n.tailwindVersion==="v3"&&(!n?.tailwindConfigFile||!n?.tailwindCssFile)?(t$1["5"]=true,a?.fail()):n.tailwindVersion==="v4"&&!n?.tailwindCssFile?(t$1["5"]=true,a?.fail()):n.tailwindVersion?a?.succeed():(t$1["5"]=true,a?.fail());let s$1=t("Validating import alias.",{silent:e.silent}).start();return n?.aliasPrefix?s$1?.succeed():(t$1["6"]=true,s$1?.fail()),Object.keys(t$1).length>0&&(t$1["5"]&&(s.break(),s.error(`No Tailwind CSS configuration found at ${d.info(e.cwd)}.`),s.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),s.error("Install Tailwind CSS then try again."),n?.framework.links.tailwind&&s.error(`Visit ${d.info(n?.framework.links.tailwind)} to get started.`)),t$1["6"]&&(s.break(),s.error("No import alias found in your tsconfig.json file."),n?.framework.links.installation&&s.error(`Visit ${d.info(n?.framework.links.installation)} to learn how to set an import alias.`)),s.break(),process.exit(1)),{errors:t$1,projectInfo:n}}function qt(e,t){if(e.includes("\0"))return false;let r;try{r=e;let u="";for(;r!==u&&r.includes("%");)u=r,r=decodeURIComponent(r);}catch{return false}let i=E__default.normalize(r.replace(/\\/g,"/")),n=E__default.normalize(t),o=u=>u.replace(/\[\.\.\..*?\]/g,"").includes("..");if(o(i)||o(r)||o(e))return false;let a=u=>u.replace(/\[\.\.\..*?\]/g,""),s=a(e),c=a(r);if([/\.\.[\/\\]/,/[\/\\]\.\./,/\.\./,/\.\.%/,/\x00/,/[\x01-\x1f]/].some(u=>u.test(s)||u.test(c))||(e.includes("~")||r.includes("~"))&&(e.includes("../")||r.includes("../")))return false;if(/^[a-zA-Z]:[\/\\]/.test(r))return process.platform==="win32"?r.toLowerCase().startsWith(t.toLowerCase()):false;if(E__default.isAbsolute(i))return i.startsWith(n+E__default.sep);let p=E__default.resolve(n,i);return p.startsWith(n+E__default.sep)||p===n}async function Ke(e,t$1,r){if(!t$1.resolvedPaths.tailwindCss||!e||Object.keys(e).length===0)return;r={silent:false,...r};let i=t$1.resolvedPaths.tailwindCss,n=E__default.relative(t$1.resolvedPaths.cwd,i),o=t(`Updating ${d.info(n)}`,{silent:r.silent}).start(),a=await promises.readFile(i,"utf8"),s=await ei(a,e);await promises.writeFile(i,s,"utf8"),o.succeed();}async function ei(e,t){let r=[ti(t)],i=await v(r).process(e,{from:void 0}),n=i.css,o=i.root;if(o.nodes&&o.nodes.length>0){let a=o.nodes[o.nodes.length-1];a.type==="atrule"&&!a.nodes&&!n.trimEnd().endsWith(";")&&(n=n.trimEnd()+";");}return n=n.replace(/\/\* ---break--- \*\//g,""),n=n.replace(/(\n\s*\n)+/g,`
5
+ Once configured, you can use the cli to add components.`),s.break(),process.exit(1)),i?.succeed(`Verifying framework. Found ${d.info(n.framework.label)}.`);let o="Validating Tailwind CSS.";n.tailwindVersion==="v4"&&(o=`Validating Tailwind CSS config. Found ${d.info("v4")}.`);let a=t(o,{silent:e.silent}).start();n.tailwindVersion==="v3"&&(!n?.tailwindConfigFile||!n?.tailwindCssFile)?(t$1["5"]=true,a?.fail()):n.tailwindVersion==="v4"&&!n?.tailwindCssFile?(t$1["5"]=true,a?.fail()):n.tailwindVersion?a?.succeed():(t$1["5"]=true,a?.fail());let s$1=t("Validating import alias.",{silent:e.silent}).start();return n?.aliasPrefix?s$1?.succeed():(t$1["6"]=true,s$1?.fail()),Object.keys(t$1).length>0&&(t$1["5"]&&(s.break(),s.error(`No Tailwind CSS configuration found at ${d.info(e.cwd)}.`),s.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),s.error("Install Tailwind CSS then try again."),n?.framework.links.tailwind&&s.error(`Visit ${d.info(n?.framework.links.tailwind)} to get started.`)),t$1["6"]&&(s.break(),s.error("No import alias found in your tsconfig.json file."),n?.framework.links.installation&&s.error(`Visit ${d.info(n?.framework.links.installation)} to learn how to set an import alias.`)),s.break(),process.exit(1)),{errors:t$1,projectInfo:n}}function Ht(e,t){if(e.includes("\0"))return false;let r;try{r=e;let u="";for(;r!==u&&r.includes("%");)u=r,r=decodeURIComponent(r);}catch{return false}let i=j__default.normalize(r.replace(/\\/g,"/")),n=j__default.normalize(t),o=u=>u.replace(/\[\.\.\..*?\]/g,"").includes("..");if(o(i)||o(r)||o(e))return false;let a=u=>u.replace(/\[\.\.\..*?\]/g,""),s=a(e),c=a(r);if([/\.\.[\/\\]/,/[\/\\]\.\./,/\.\./,/\.\.%/,/\x00/,/[\x01-\x1f]/].some(u=>u.test(s)||u.test(c))||(e.includes("~")||r.includes("~"))&&(e.includes("../")||r.includes("../")))return false;if(/^[a-zA-Z]:[\/\\]/.test(r))return process.platform==="win32"?r.toLowerCase().startsWith(t.toLowerCase()):false;if(j__default.isAbsolute(i))return i.startsWith(n+j__default.sep);let p=j__default.resolve(n,i);return p.startsWith(n+j__default.sep)||p===n}async function Ke(e,t$1,r){if(!t$1.resolvedPaths.tailwindCss||!e||Object.keys(e).length===0)return;r={silent:false,...r};let i=t$1.resolvedPaths.tailwindCss,n=j__default.relative(t$1.resolvedPaths.cwd,i),o=t(`Updating ${d.info(n)}`,{silent:r.silent}).start(),a=await promises.readFile(i,"utf8"),s=await ti(a,e);await promises.writeFile(i,s,"utf8"),o.succeed();}async function ti(e,t){let r=[ri(t)],i=await S$1(r).process(e,{from:void 0}),n=i.css,o=i.root;if(o.nodes&&o.nodes.length>0){let a=o.nodes[o.nodes.length-1];a.type==="atrule"&&!a.nodes&&!n.trimEnd().endsWith(";")&&(n=n.trimEnd()+";");}return n=n.replace(/\/\* ---break--- \*\//g,""),n=n.replace(/(\n\s*\n)+/g,`
6
6
 
7
- `),n=n.trimEnd(),n}function ti(e){return {postcssPlugin:"update-css",Once(t){for(let[r,i]of Object.entries(e))if(r.startsWith("@")){let n=r.match(/@([a-zA-Z-]+)\s*(.*)/);if(!n)continue;let[,o,a]=n;if(o==="import"){if(!t.nodes?.find(c=>c.type==="atrule"&&c.name==="import"&&c.params===a)){let c=v.atRule({name:"import",params:a,raws:{semicolon:true}}),m=t.nodes?.filter(l=>l.type==="atrule"&&l.name==="import");if(m&&m.length>0){let l=m[m.length-1];c.raws.before=`
8
- `,t.insertAfter(l,c);}else !t.nodes||t.nodes.length,c.raws.before="",t.prepend(c);}}else if(o==="plugin"){let s=a;a&&!a.startsWith('"')&&!a.startsWith("'")&&(s=`"${a}"`);let c=l=>l.startsWith('"')&&l.endsWith('"')||l.startsWith("'")&&l.endsWith("'")?l.slice(1,-1):l;if(!t.nodes?.find(l=>l.type!=="atrule"||l.name!=="plugin"?false:c(l.params)===c(a))){let l=v.atRule({name:"plugin",params:s,raws:{semicolon:true,before:`
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,l);}else if(p&&p.length>0){let g=p[p.length-1];t.insertAfter(g,l),t.insertBefore(l,v.comment({text:"---break---"})),t.insertAfter(l,v.comment({text:"---break---"}));}else t.prepend(l),t.insertBefore(l,v.comment({text:"---break---"})),t.insertAfter(l,v.comment({text:"---break---"}));}}else if(typeof i=="object"&&Object.keys(i).length===0){if(!t.nodes?.find(c=>c.type==="atrule"&&c.name===o&&c.params===a)){let c=v.atRule({name:o,params:a,raws:{semicolon:true}});t.append(c),t.insertBefore(c,v.comment({text:"---break---"}));}}else if(o==="keyframes"){let s=t.nodes?.find(l=>l.type==="atrule"&&l.name==="theme"&&l.params==="inline");s||(s=v.atRule({name:"theme",params:"inline",raws:{semicolon:true,between:" ",before:`
10
- `}}),t.append(s),t.insertBefore(s,v.comment({text:"---break---"})));let c=s.nodes?.find(l=>l.type==="atrule"&&l.name==="keyframes"&&l.params===a),m;if(c?(m=v.atRule({name:"keyframes",params:a,raws:{semicolon:true,between:" ",before:`
11
- `}}),c.replaceWith(m)):(m=v.atRule({name:"keyframes",params:a,raws:{semicolon:true,between:" ",before:`
12
- `}}),s.append(m)),typeof i=="object")for(let[l,p]of Object.entries(i))te(m,l,p);}else if(o==="utility"){let s=t.nodes?.find(c=>c.type==="atrule"&&c.name===o&&c.params===a);if(s){if(typeof i=="object")for(let[c,m]of Object.entries(i))if(typeof m=="string"){let l=s.nodes?.find(u=>u.type==="decl"&&u.prop===c),p=v.decl({prop:c,value:m,raws:{semicolon:true,before:`
13
- `}});l?l.replaceWith(p):s.append(p);}else typeof m=="object"&&te(s,c,m);}else {let c=v.atRule({name:o,params:a,raws:{semicolon:true,between:" ",before:`
14
- `}});if(t.append(c),t.insertBefore(c,v.comment({text:"---break---"})),typeof i=="object")for(let[m,l]of Object.entries(i))if(typeof l=="string"){let p=v.decl({prop:m,value:l,raws:{semicolon:true,before:`
15
- `}});c.append(p);}else typeof l=="object"&&te(c,m,l);}}else o==="property"?te(t,r,i):Xt(t,o,a,i);}else te(t,r,i);}}}function Xt(e,t,r,i){let n=e.nodes?.find(o=>o.type==="atrule"&&o.name===t&&o.params===r);if(n||(n=v.atRule({name:t,params:r,raws:{semicolon:true,between:" ",before:`
16
- `}}),e.append(n),e.insertBefore(n,v.comment({text:"---break---"}))),typeof i=="object")for(let[o,a]of Object.entries(i))if(o.startsWith("@")){let s=o.match(/@([a-zA-Z-]+)\s*(.*)/);if(s){let[,c,m]=s;Xt(n,c,m,a);}}else te(n,o,a);else if(typeof i=="string")try{let a=v.parse(`.temp{${i}}`).first;if(a&&a.nodes){let s=v.rule({selector:"temp",raws:{semicolon:!0,between:" ",before:`
7
+ `),n=n.trimEnd(),n}function ri(e){return {postcssPlugin:"update-css",Once(t){for(let[r,i]of Object.entries(e))if(r.startsWith("@")){let n=r.match(/@([a-zA-Z-]+)\s*(.*)/);if(!n)continue;let[,o,a]=n;if(o==="import"){if(!t.nodes?.find(c=>c.type==="atrule"&&c.name==="import"&&c.params===a)){let c=S$1.atRule({name:"import",params:a,raws:{semicolon:true}}),m=t.nodes?.filter(l=>l.type==="atrule"&&l.name==="import");if(m&&m.length>0){let l=m[m.length-1];c.raws.before=`
8
+ `,t.insertAfter(l,c);}else !t.nodes||t.nodes.length,c.raws.before="",t.prepend(c);}}else if(o==="plugin"){let s=a;a&&!a.startsWith('"')&&!a.startsWith("'")&&(s=`"${a}"`);let c=l=>l.startsWith('"')&&l.endsWith('"')||l.startsWith("'")&&l.endsWith("'")?l.slice(1,-1):l;if(!t.nodes?.find(l=>l.type!=="atrule"||l.name!=="plugin"?false:c(l.params)===c(a))){let l=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,l);}else if(p&&p.length>0){let g=p[p.length-1];t.insertAfter(g,l),t.insertBefore(l,S$1.comment({text:"---break---"})),t.insertAfter(l,S$1.comment({text:"---break---"}));}else t.prepend(l),t.insertBefore(l,S$1.comment({text:"---break---"})),t.insertAfter(l,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===o&&c.params===a)){let c=S$1.atRule({name:o,params:a,raws:{semicolon:true}});t.append(c),t.insertBefore(c,S$1.comment({text:"---break---"}));}}else if(o==="keyframes"){let s=t.nodes?.find(l=>l.type==="atrule"&&l.name==="theme"&&l.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(l=>l.type==="atrule"&&l.name==="keyframes"&&l.params===a),m;if(c?(m=S$1.atRule({name:"keyframes",params:a,raws:{semicolon:true,between:" ",before:`
11
+ `}}),c.replaceWith(m)):(m=S$1.atRule({name:"keyframes",params:a,raws:{semicolon:true,between:" ",before:`
12
+ `}}),s.append(m)),typeof i=="object")for(let[l,p]of Object.entries(i))te(m,l,p);}else if(o==="utility"){let s=t.nodes?.find(c=>c.type==="atrule"&&c.name===o&&c.params===a);if(s){if(typeof i=="object")for(let[c,m]of Object.entries(i))if(typeof m=="string"){let l=s.nodes?.find(u=>u.type==="decl"&&u.prop===c),p=S$1.decl({prop:c,value:m,raws:{semicolon:true,before:`
13
+ `}});l?l.replaceWith(p):s.append(p);}else typeof m=="object"&&te(s,c,m);}else {let c=S$1.atRule({name:o,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[m,l]of Object.entries(i))if(typeof l=="string"){let p=S$1.decl({prop:m,value:l,raws:{semicolon:true,before:`
15
+ `}});c.append(p);}else typeof l=="object"&&te(c,m,l);}}else o==="property"?te(t,r,i):Qt(t,o,a,i);}else te(t,r,i);}}}function Qt(e,t,r,i){let n=e.nodes?.find(o=>o.type==="atrule"&&o.name===t&&o.params===r);if(n||(n=S$1.atRule({name:t,params:r,raws:{semicolon:true,between:" ",before:`
16
+ `}}),e.append(n),e.insertBefore(n,S$1.comment({text:"---break---"}))),typeof i=="object")for(let[o,a]of Object.entries(i))if(o.startsWith("@")){let s=o.match(/@([a-zA-Z-]+)\s*(.*)/);if(s){let[,c,m]=s;Qt(n,c,m,a);}}else te(n,o,a);else if(typeof i=="string")try{let a=S$1.parse(`.temp{${i}}`).first;if(a&&a.nodes){let s=S$1.rule({selector:"temp",raws:{semicolon:!0,between:" ",before:`
17
17
  `}});a.nodes.forEach(c=>{if(c.type==="decl"){let m=c.clone();m.raws.before=`
18
- `,s.append(m);}}),s.nodes?.length&&n.append(s);}}catch(o){throw console.error("Error parsing at-rule content:",i,o),o}}function te(e,t,r){let i=e.nodes?.find(n=>n.type==="rule"&&n.selector===t);if(i||(i=v.rule({selector:t,raws:{semicolon:true,between:" ",before:`
19
- `}}),e.append(i)),typeof r=="object"){for(let[n,o]of Object.entries(r))if(n.startsWith("@")&&typeof o=="object"&&o!==null&&Object.keys(o).length===0){let a=n.match(/@([a-zA-Z-]+)\s*(.*)/);if(a){let[,s,c]=a,m=v.atRule({name:s,params:c,raws:{semicolon:true,before:`
20
- `}});i.append(m);}}else if(typeof o=="string"){let a=v.decl({prop:n,value:o,raws:{semicolon:true,before:`
21
- `}}),s=i.nodes?.find(c=>c.type==="decl"&&c.prop===n);s?s.replaceWith(a):i.append(a);}else if(typeof o=="object"){let a=n.startsWith("&")?t.replace(/^([^:]+)/,`$1${n.substring(1)}`):n;te(e,a,o);}}else if(typeof r=="string")try{let o=v.parse(`.temp{${r}}`).first;o&&o.nodes&&o.nodes.forEach(a=>{if(a.type==="decl"){let s=a.clone();s.raws.before=`
22
- `,i?.append(s);}});}catch(n){throw console.error("Error parsing rule content:",t,r,n),n}}async function qe(e,t$1,r){if(!t$1.resolvedPaths.tailwindCss||!Object.keys(e??{}).length)return;r={cleanupDefaultNextStyles:false,silent:false,tailwindVersion:"v3",overwriteCssVars:false,initIndex:true,...r};let i=t$1.resolvedPaths.tailwindCss,n=E__default.relative(t$1.resolvedPaths.cwd,i),o=t(`Updating CSS variables in ${d.info(n)}`,{silent:r.silent}).start(),a=await promises.readFile(i,"utf8"),s=await ni(a,e??{},t$1,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars,initIndex:r.initIndex});await promises.writeFile(i,s,"utf8"),o.succeed();}async function ni(e,t,r,i={cleanupDefaultNextStyles:false,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:false,initIndex:false}){i={cleanupDefaultNextStyles:false,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:false,initIndex:false,...i};let n=[si(t)];if(i.cleanupDefaultNextStyles&&n.push(er()),i.tailwindVersion==="v4"){if(n=[],r.resolvedPaths?.cwd){let s=o$1(r.resolvedPaths.cwd);!s?.dependencies?.["tailwindcss-animate"]&&!s?.devDependencies?.["tailwindcss-animate"]&&i.initIndex&&n.push(fi({params:"tw-animate-css"}));}n.push(mi({params:"dark (&:is(.dark *))"})),i.cleanupDefaultNextStyles&&n.push(er()),n.push(ci(t,{overwriteCssVars:i.overwriteCssVars})),n.push(li(t)),i.tailwindConfig&&(n.push(pi(i.tailwindConfig)),n.push(ui(i.tailwindConfig)),n.push(di(i.tailwindConfig)));}r.tailwind.cssVariables&&i.initIndex&&n.push(oi({tailwindVersion:i.tailwindVersion}));let a=(await v(n).process(e,{from:void 0})).css;return a=a.replace(/\/\* ---break--- \*\//g,""),i.tailwindVersion==="v4"&&(a=a.replace(/(\n\s*\n)+/g,`
18
+ `,s.append(m);}}),s.nodes?.length&&n.append(s);}}catch(o){throw console.error("Error parsing at-rule content:",i,o),o}}function te(e,t,r){let i=e.nodes?.find(n=>n.type==="rule"&&n.selector===t);if(i||(i=S$1.rule({selector:t,raws:{semicolon:true,between:" ",before:`
19
+ `}}),e.append(i)),typeof r=="object"){for(let[n,o]of Object.entries(r))if(n.startsWith("@")&&typeof o=="object"&&o!==null&&Object.keys(o).length===0){let a=n.match(/@([a-zA-Z-]+)\s*(.*)/);if(a){let[,s,c]=a,m=S$1.atRule({name:s,params:c,raws:{semicolon:true,before:`
20
+ `}});i.append(m);}}else if(typeof o=="string"){let a=S$1.decl({prop:n,value:o,raws:{semicolon:true,before:`
21
+ `}}),s=i.nodes?.find(c=>c.type==="decl"&&c.prop===n);s?s.replaceWith(a):i.append(a);}else if(typeof o=="object"){let a=n.startsWith("&")?t.replace(/^([^:]+)/,`$1${n.substring(1)}`):n;te(e,a,o);}}else if(typeof r=="string")try{let o=S$1.parse(`.temp{${r}}`).first;o&&o.nodes&&o.nodes.forEach(a=>{if(a.type==="decl"){let s=a.clone();s.raws.before=`
22
+ `,i?.append(s);}});}catch(n){throw console.error("Error parsing rule content:",t,r,n),n}}async function qe(e,t$1,r){if(!t$1.resolvedPaths.tailwindCss||!Object.keys(e??{}).length)return;r={cleanupDefaultNextStyles:false,silent:false,tailwindVersion:"v3",overwriteCssVars:false,initIndex:true,...r};let i=t$1.resolvedPaths.tailwindCss,n=j__default.relative(t$1.resolvedPaths.cwd,i),o=t(`Updating CSS variables in ${d.info(n)}`,{silent:r.silent}).start(),a=await promises.readFile(i,"utf8"),s=await oi(a,e??{},t$1,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars,initIndex:r.initIndex});await promises.writeFile(i,s,"utf8"),o.succeed();}async function oi(e,t,r,i={cleanupDefaultNextStyles:false,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:false,initIndex:false}){i={cleanupDefaultNextStyles:false,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:false,initIndex:false,...i};let n=[ai(t)];if(i.cleanupDefaultNextStyles&&n.push(tr()),i.tailwindVersion==="v4"){if(n=[],r.resolvedPaths?.cwd){let s=o$1(r.resolvedPaths.cwd);!s?.dependencies?.["tailwindcss-animate"]&&!s?.devDependencies?.["tailwindcss-animate"]&&i.initIndex&&n.push(pi({params:"tw-animate-css"}));}n.push(fi({params:"dark (&:is(.dark *))"})),i.cleanupDefaultNextStyles&&n.push(tr()),n.push(li(t,{overwriteCssVars:i.overwriteCssVars})),n.push(mi(t)),i.tailwindConfig&&(n.push(di(i.tailwindConfig)),n.push(gi(i.tailwindConfig)),n.push(ui(i.tailwindConfig)));}r.tailwind.cssVariables&&i.initIndex&&n.push(si({tailwindVersion:i.tailwindVersion}));let a=(await S$1(n).process(e,{from:void 0})).css;return a=a.replace(/\/\* ---break--- \*\//g,""),i.tailwindVersion==="v4"&&(a=a.replace(/(\n\s*\n)+/g,`
23
23
 
24
- `)),a}function oi({tailwindVersion:e}){return {postcssPlugin:"update-base-layer",Once(t){let r=[{selector:"*",apply:e==="v4"?"border-border outline-ring/50":"border-border"},{selector:"body",apply:"bg-background text-foreground"}],i=t.nodes.find(n=>n.type==="atrule"&&n.name==="layer"&&n.params==="base"&&r.every(({selector:o,apply:a})=>n.nodes?.some(s=>s.type==="rule"&&s.selector===o&&s.nodes.some(c=>c.type==="atrule"&&c.name==="apply"&&c.params===a))));i||(i=v.atRule({name:"layer",params:"base",raws:{semicolon:true,between:" ",before:`
25
- `}}),t.append(i),t.insertBefore(i,v.comment({text:"---break---"}))),r.forEach(({selector:n,apply:o})=>{i?.nodes?.find(s=>s.type==="rule"&&s.selector===n)||i?.append(v.rule({selector:n,nodes:[v.atRule({name:"apply",params:o,raws:{semicolon:true,before:`
24
+ `)),a}function si({tailwindVersion:e}){return {postcssPlugin:"update-base-layer",Once(t){let r=[{selector:"*",apply:e==="v4"?"border-border outline-ring/50":"border-border"},{selector:"body",apply:"bg-background text-foreground"}],i=t.nodes.find(n=>n.type==="atrule"&&n.name==="layer"&&n.params==="base"&&r.every(({selector:o,apply:a})=>n.nodes?.some(s=>s.type==="rule"&&s.selector===o&&s.nodes.some(c=>c.type==="atrule"&&c.name==="apply"&&c.params===a))));i||(i=S$1.atRule({name:"layer",params:"base",raws:{semicolon:true,between:" ",before:`
25
+ `}}),t.append(i),t.insertBefore(i,S$1.comment({text:"---break---"}))),r.forEach(({selector:n,apply:o})=>{i?.nodes?.find(s=>s.type==="rule"&&s.selector===n)||i?.append(S$1.rule({selector:n,nodes:[S$1.atRule({name:"apply",params:o,raws:{semicolon:true,before:`
26
26
  `}})],raws:{semicolon:true,between:" ",before:`
27
- `}}));});}}}function si(e){return {postcssPlugin:"update-css-vars",Once(t){let r=t.nodes.find(i=>i.type==="atrule"&&i.name==="layer"&&i.params==="base");r instanceof ii||(r=v.atRule({name:"layer",params:"base",nodes:[],raws:{semicolon:true,before:`
28
- `,between:" "}}),t.append(r),t.insertBefore(r,v.comment({text:"---break---"}))),r!==void 0&&Object.entries(e).forEach(([i,n])=>{let o=i==="light"?":root":`.${i}`;ai(r,o,n);});}}}function Zt(e){let t=e.nodes.find(r=>r.type==="rule"&&r.selector===":root");if(t){let r=["--background","--foreground"];t.nodes.filter(i=>i.type==="decl"&&r.includes(i.prop)).forEach(i=>i.remove()),t.nodes.length===0&&t.remove();}}function er(){return {postcssPlugin:"cleanup-default-next-styles",Once(e){let t=e.nodes.find(i=>i.type==="rule"&&i.selector==="body");t&&(t.nodes.find(i=>i.type==="decl"&&i.prop==="color"&&["rgb(var(--foreground-rgb))","var(--foreground)"].includes(i.value))?.remove(),t.nodes.find(i=>i.type==="decl"&&i.prop==="background"&&(i.value.startsWith("linear-gradient")||i.value==="var(--background)"))?.remove(),t.nodes.find(i=>i.type==="decl"&&i.prop==="font-family"&&i.value==="Arial, Helvetica, sans-serif")?.remove(),t.nodes.length===0&&t.remove()),Zt(e);let r=e.nodes.find(i=>i.type==="atrule"&&i.params==="(prefers-color-scheme: dark)");r&&(Zt(r),r.nodes.length===0&&r.remove());}}}function ai(e,t,r){let i=e.nodes?.find(n=>n.type==="rule"&&n.selector===t);i||Object.keys(r).length>0&&(i=v.rule({selector:t,raws:{between:" ",before:`
29
- `}}),e.append(i)),Object.entries(r).forEach(([n,o])=>{let a=`--${n.replace(/^--/,"")}`,s=v.decl({prop:a,value:o,raws:{semicolon:true}}),c=i?.nodes.find(m=>m.type==="decl"&&m.prop===a);c?c.replaceWith(s):i?.append(s);});}function ci(e,t){return {postcssPlugin:"update-css-vars-v4",Once(r){Object.entries(e).forEach(([i,n])=>{let o=i==="light"?":root":`.${i}`;if(i==="theme"){o="@theme";let s=Ee(r);Object.entries(n).forEach(([c,m])=>{let l=`--${c.replace(/^--/,"")}`,p=v.decl({prop:l,value:m,raws:{semicolon:true}}),u=s?.nodes?.find(g=>g.type==="decl"&&g.prop===l);t.overwriteCssVars?u?u.replaceWith(p):s?.append(p):u||s?.append(p);});return}let a=r.nodes?.find(s=>s.type==="rule"&&s.selector===o);!a&&Object.keys(n).length>0&&(a=v.rule({selector:o,nodes:[],raws:{semicolon:true,between:" ",before:`
30
- `}}),r.append(a),r.insertBefore(a,v.comment({text:"---break---"}))),Object.entries(n).forEach(([s,c])=>{let m=`--${s.replace(/^--/,"")}`;m==="--sidebar-background"&&(m="--sidebar"),tr(c)&&(c=`hsl(${c})`);let l=v.decl({prop:m,value:c,raws:{semicolon:true}}),p=a?.nodes.find(u=>u.type==="decl"&&u.prop===m);t.overwriteCssVars?p?p.replaceWith(l):a?.append(l):p||a?.append(l);});});}}}function li(e){return {postcssPlugin:"update-theme",Once(t){let r=Array.from(new Set(Object.keys(e).flatMap(o=>Object.keys(e[o]||{}))));if(!r.length)return;let i=Ee(t),n=i.nodes?.filter(o=>o.type==="decl"&&o.prop.startsWith("--"));for(let o of r){let a=Object.values(e).find(p=>p[o])?.[o];if(!a)continue;if(o==="radius"){let p={sm:"calc(var(--radius) - 4px)",md:"calc(var(--radius) - 2px)",lg:"var(--radius)",xl:"calc(var(--radius) + 4px)","2xl":"calc(var(--radius) + 8px)","3xl":"calc(var(--radius) + 12px)","4xl":"calc(var(--radius) + 16px)"};for(let[u,g]of Object.entries(p)){let w=v.decl({prop:`--radius-${u}`,value:g,raws:{semicolon:true}});i?.nodes?.find(h=>h.type==="decl"&&h.prop===w.prop)||i?.append(w);}continue}let s=tr(a)||hi(a)?`--color-${o.replace(/^--/,"")}`:`--${o.replace(/^--/,"")}`;s==="--color-sidebar-background"&&(s="--color-sidebar");let c=`var(--${o})`;s==="--color-sidebar"&&(c="var(--sidebar)");let m=v.decl({prop:s,value:c,raws:{semicolon:true}});i?.nodes?.find(p=>p.type==="decl"&&p.prop===m.prop)||(n?.length?i?.insertAfter(n[n.length-1],m):i?.append(m));}}}}function Ee(e){let t=e.nodes.find(r=>r.type==="atrule"&&r.name==="theme"&&r.params==="inline");return t||(t=v.atRule({name:"theme",params:"inline",nodes:[],raws:{semicolon:true,between:" ",before:`
31
- `}}),e.append(t),e.insertBefore(t,v.comment({text:"---break---"}))),t}function mi({params:e}){return {postcssPlugin:"add-custom-variant",Once(t){if(!t.nodes.find(i=>i.type==="atrule"&&i.name==="custom-variant")){let i=t.nodes.filter(o=>o.type==="atrule"&&o.name==="import"),n=v.atRule({name:"custom-variant",params:e,raws:{semicolon:true,before:`
32
- `}});if(i.length>0){let o=i[i.length-1];t.insertAfter(o,n);}else t.insertAfter(t.nodes[0],n);t.insertBefore(n,v.comment({text:"---break---"}));}}}}function fi({params:e}){return {postcssPlugin:"add-custom-import",Once(t){let r=t.nodes.filter(o=>o.type==="atrule"&&o.name==="import"),i=t.nodes.find(o=>o.type==="atrule"&&o.name==="custom-variant");if(!r.some(o=>o.params.replace(/["']/g,"")===e)){let o=v.atRule({name:"import",params:`"${e}"`,raws:{semicolon:true,before:`
33
- `}});if(r.length>0){let a=r[r.length-1];t.insertAfter(a,o);}else i?(t.insertBefore(i,o),t.insertBefore(i,v.comment({text:"---break---"}))):(t.prepend(o),t.insertAfter(o,v.comment({text:"---break---"})));}}}}function pi(e){return {postcssPlugin:"update-tailwind-config",Once(t){if(!e?.plugins)return;let i=gi(t)==="single"?"'":'"',n=t.nodes.filter(a=>a.type==="atrule"&&a.name==="plugin"),o=n[n.length-1]||t.nodes[0];for(let a of e.plugins){let s=a.replace(/^require\(["']|["']\)$/g,"");if(n.some(m=>m.params.replace(/["']/g,"")===s))continue;let c=v.atRule({name:"plugin",params:`${i}${s}${i}`,raws:{semicolon:true,before:`
34
- `}});t.insertAfter(o,c),t.insertBefore(c,v.comment({text:"---break---"}));}}}}function di(e){return {postcssPlugin:"update-tailwind-config-keyframes",Once(t){if(!e?.theme?.extend?.keyframes)return;let r=Ee(t),i=r.nodes?.filter(o=>o.type==="atrule"&&o.name==="keyframes"),n=z$1.record(z$1.string(),z$1.record(z$1.string(),z$1.string()));for(let[o,a]of Object.entries(e.theme.extend.keyframes)){if(typeof o!="string")continue;let s=n.safeParse(a);if(!s.success||i?.find(m=>m.type==="atrule"&&m.name==="keyframes"&&m.params===o))continue;let c=v.atRule({name:"keyframes",params:o,nodes:[],raws:{semicolon:true,between:" ",before:`
35
- `}});for(let[m,l]of Object.entries(s.data)){let p=v.rule({selector:m,nodes:Object.entries(l).map(([u,g])=>v.decl({prop:u,value:g,raws:{semicolon:true,before:`
27
+ `}}));});}}}function ai(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 ni||(r=S$1.atRule({name:"layer",params:"base",nodes:[],raws:{semicolon:true,before:`
28
+ `,between:" "}}),t.append(r),t.insertBefore(r,S$1.comment({text:"---break---"}))),r!==void 0&&Object.entries(e).forEach(([i,n])=>{let o=i==="light"?":root":`.${i}`;ci(r,o,n);});}}}function er(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 tr(){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()),er(e);let r=e.nodes.find(i=>i.type==="atrule"&&i.params==="(prefers-color-scheme: dark)");r&&(er(r),r.nodes.length===0&&r.remove());}}}function ci(e,t,r){let i=e.nodes?.find(n=>n.type==="rule"&&n.selector===t);i||Object.keys(r).length>0&&(i=S$1.rule({selector:t,raws:{between:" ",before:`
29
+ `}}),e.append(i)),Object.entries(r).forEach(([n,o])=>{let a=`--${n.replace(/^--/,"")}`,s=S$1.decl({prop:a,value:o,raws:{semicolon:true}}),c=i?.nodes.find(m=>m.type==="decl"&&m.prop===a);c?c.replaceWith(s):i?.append(s);});}function li(e,t){return {postcssPlugin:"update-css-vars-v4",Once(r){Object.entries(e).forEach(([i,n])=>{let o=i==="light"?":root":`.${i}`;if(i==="theme"){o="@theme";let s=je(r);Object.entries(n).forEach(([c,m])=>{let l=`--${c.replace(/^--/,"")}`,p=S$1.decl({prop:l,value:m,raws:{semicolon:true}}),u=s?.nodes?.find(g=>g.type==="decl"&&g.prop===l);t.overwriteCssVars?u?u.replaceWith(p):s?.append(p):u||s?.append(p);});return}let a=r.nodes?.find(s=>s.type==="rule"&&s.selector===o);!a&&Object.keys(n).length>0&&(a=S$1.rule({selector:o,nodes:[],raws:{semicolon:true,between:" ",before:`
30
+ `}}),r.append(a),r.insertBefore(a,S$1.comment({text:"---break---"}))),Object.entries(n).forEach(([s,c])=>{let m=`--${s.replace(/^--/,"")}`;m==="--sidebar-background"&&(m="--sidebar"),rr(c)&&(c=`hsl(${c})`);let l=S$1.decl({prop:m,value:c,raws:{semicolon:true}}),p=a?.nodes.find(u=>u.type==="decl"&&u.prop===m);t.overwriteCssVars?p?p.replaceWith(l):a?.append(l):p||a?.append(l);});});}}}function mi(e){return {postcssPlugin:"update-theme",Once(t){let r=Array.from(new Set(Object.keys(e).flatMap(o=>Object.keys(e[o]||{}))));if(!r.length)return;let i=je(t),n=i.nodes?.filter(o=>o.type==="decl"&&o.prop.startsWith("--"));for(let o of r){let a=Object.values(e).find(p=>p[o])?.[o];if(!a)continue;if(o==="radius"){let p={sm:"calc(var(--radius) - 4px)",md:"calc(var(--radius) - 2px)",lg:"var(--radius)",xl:"calc(var(--radius) + 4px)","2xl":"calc(var(--radius) + 8px)","3xl":"calc(var(--radius) + 12px)","4xl":"calc(var(--radius) + 16px)"};for(let[u,g]of Object.entries(p)){let w=S$1.decl({prop:`--radius-${u}`,value:g,raws:{semicolon:true}});i?.nodes?.find(h=>h.type==="decl"&&h.prop===w.prop)||i?.append(w);}continue}let s=rr(a)||wi(a)?`--color-${o.replace(/^--/,"")}`:`--${o.replace(/^--/,"")}`;s==="--color-sidebar-background"&&(s="--color-sidebar");let c=`var(--${o})`;s==="--color-sidebar"&&(c="var(--sidebar)");let m=S$1.decl({prop:s,value:c,raws:{semicolon:true}});i?.nodes?.find(p=>p.type==="decl"&&p.prop===m.prop)||(n?.length?i?.insertAfter(n[n.length-1],m):i?.append(m));}}}}function je(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 fi({params:e}){return {postcssPlugin:"add-custom-variant",Once(t){if(!t.nodes.find(i=>i.type==="atrule"&&i.name==="custom-variant")){let i=t.nodes.filter(o=>o.type==="atrule"&&o.name==="import"),n=S$1.atRule({name:"custom-variant",params:e,raws:{semicolon:true,before:`
32
+ `}});if(i.length>0){let o=i[i.length-1];t.insertAfter(o,n);}else t.insertAfter(t.nodes[0],n);t.insertBefore(n,S$1.comment({text:"---break---"}));}}}}function pi({params:e}){return {postcssPlugin:"add-custom-import",Once(t){let r=t.nodes.filter(o=>o.type==="atrule"&&o.name==="import"),i=t.nodes.find(o=>o.type==="atrule"&&o.name==="custom-variant");if(!r.some(o=>o.params.replace(/["']/g,"")===e)){let o=S$1.atRule({name:"import",params:`"${e}"`,raws:{semicolon:true,before:`
33
+ `}});if(r.length>0){let a=r[r.length-1];t.insertAfter(a,o);}else i?(t.insertBefore(i,o),t.insertBefore(i,S$1.comment({text:"---break---"}))):(t.prepend(o),t.insertAfter(o,S$1.comment({text:"---break---"})));}}}}function di(e){return {postcssPlugin:"update-tailwind-config",Once(t){if(!e?.plugins)return;let i=hi(t)==="single"?"'":'"',n=t.nodes.filter(a=>a.type==="atrule"&&a.name==="plugin"),o=n[n.length-1]||t.nodes[0];for(let a of e.plugins){let s=a.replace(/^require\(["']|["']\)$/g,"");if(n.some(m=>m.params.replace(/["']/g,"")===s))continue;let c=S$1.atRule({name:"plugin",params:`${i}${s}${i}`,raws:{semicolon:true,before:`
34
+ `}});t.insertAfter(o,c),t.insertBefore(c,S$1.comment({text:"---break---"}));}}}}function ui(e){return {postcssPlugin:"update-tailwind-config-keyframes",Once(t){if(!e?.theme?.extend?.keyframes)return;let r=je(t),i=r.nodes?.filter(o=>o.type==="atrule"&&o.name==="keyframes"),n=z$1.record(z$1.string(),z$1.record(z$1.string(),z$1.string()));for(let[o,a]of Object.entries(e.theme.extend.keyframes)){if(typeof o!="string")continue;let s=n.safeParse(a);if(!s.success||i?.find(m=>m.type==="atrule"&&m.name==="keyframes"&&m.params===o))continue;let c=S$1.atRule({name:"keyframes",params:o,nodes:[],raws:{semicolon:true,between:" ",before:`
35
+ `}});for(let[m,l]of Object.entries(s.data)){let p=S$1.rule({selector:m,nodes:Object.entries(l).map(([u,g])=>S$1.decl({prop:u,value:g,raws:{semicolon:true,before:`
36
36
  `,between:": "}})),raws:{semicolon:true,between:" ",before:`
37
- `}});c.append(p);}r.append(c),r.insertBefore(c,v.comment({text:"---break---"}));}}}}function ui(e){return {postcssPlugin:"update-tailwind-config-animation",Once(t){if(!e?.theme?.extend?.animation)return;let r=Ee(t),i=r.nodes?.filter(o=>o.type==="decl"&&o.prop.startsWith("--animate-")),n=z$1.record(z$1.string(),z$1.string()).safeParse(e.theme.extend.animation);if(n.success)for(let[o,a]of Object.entries(n.data)){let s=`--animate-${o}`;if(i?.find(m=>m.prop===s))continue;let c=v.decl({prop:s,value:a,raws:{semicolon:true,between:": ",before:`
38
- `}});r.append(c);}}}}function gi(e){return e.nodes[0].toString().includes("'")?"single":"double"}function tr(e){if(e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch"))return false;let t=e.split(" ");return t.length===3&&t.slice(1,3).every(r=>r.includes("%"))}function hi(e){return e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch")||e.includes("--color-")}async function z(e,t$1,r,i){if(e=Array.from(new Set(e)),t$1=Array.from(new Set(t$1)),!e?.length&&!t$1?.length)return;i={silent:false,...i};let n=t("Installing dependencies.",{silent:i.silent})?.start(),o=await bi(r),a="";if(yi(r)&&o==="npm")if(i.silent)a="force";else {n.stopAndPersist(),s.warn(`
37
+ `}});c.append(p);}r.append(c),r.insertBefore(c,S$1.comment({text:"---break---"}));}}}}function gi(e){return {postcssPlugin:"update-tailwind-config-animation",Once(t){if(!e?.theme?.extend?.animation)return;let r=je(t),i=r.nodes?.filter(o=>o.type==="decl"&&o.prop.startsWith("--animate-")),n=z$1.record(z$1.string(),z$1.string()).safeParse(e.theme.extend.animation);if(n.success)for(let[o,a]of Object.entries(n.data)){let s=`--animate-${o}`;if(i?.find(m=>m.prop===s))continue;let c=S$1.decl({prop:s,value:a,raws:{semicolon:true,between:": ",before:`
38
+ `}});r.append(c);}}}}function hi(e){return e.nodes[0].toString().includes("'")?"single":"double"}function rr(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 wi(e){return e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch")||e.includes("--color-")}async function z(e,t$1,r,i){if(e=Array.from(new Set(e)),t$1=Array.from(new Set(t$1)),!e?.length&&!t$1?.length)return;i={silent:false,...i};let n=t("Installing dependencies.",{silent:i.silent})?.start(),o=await xi(r),a="";if(bi(r)&&o==="npm")if(i.silent)a="force";else {n.stopAndPersist(),s.warn(`
39
39
  It looks like you are using React 19.
40
40
  Some packages may fail to install due to peer dependency issues in npm (see https://ui.shadcn.com/react-19).
41
- `);let s$1=await Fe([{type:"select",name:"flag",message:"How would you like to proceed?",choices:[{title:"Use --force",value:"force"},{title:"Use --legacy-peer-deps",value:"legacy-peer-deps"}]}]);s$1&&(a=s$1.flag);}n?.start(),await xi(o,e,t$1,r.resolvedPaths.cwd,a),n?.succeed();}function yi(e){let t=o$1(e.resolvedPaths.cwd,false);if(!t?.dependencies?.react)return false;let r=/^(?:\^|~)?19(?:\.\d+)*(?:-.*)?$/.test(t.dependencies.react),i=t.dependencies["react-day-picker"]?.startsWith("8");return r&&i}async function bi(e){return o$1(e.resolvedPaths.cwd,false)?.dependencies?.expo?"expo":a$1(e.resolvedPaths.cwd)}async function xi(e,t,r,i,n){if(e==="npm")return Si(t,r,i,n);if(e==="deno")return vi(t,r,i);if(e==="expo")return Ri(t,r,i);t?.length&&await execa(e,["add",...t],{cwd:i}),r?.length&&await execa(e,["add","-D",...r],{cwd:i});}async function Si(e,t,r,i){e.length&&await execa("npm",["install",...i?[`--${i}`]:[],...e],{cwd:r}),t.length&&await execa("npm",["install",...i?[`--${i}`]:[],"-D",...t],{cwd:r});}async function vi(e,t,r){e?.length&&await execa("deno",["add",...e.map(i=>`npm:${i}`)],{cwd:r}),t?.length&&await execa("deno",["add","-D",...t.map(i=>`npm:${i}`)],{cwd:r});}async function Ri(e,t,r){e.length&&await execa("npx",["expo","install",...e],{cwd:r}),t.length&&await execa("npx",["expo","install","-- -D",...t],{cwd:r});}async function Xe(e,t$1,r){if(!e||Object.keys(e).length===0)return {envVarsAdded:[],envFileUpdated:null,envFileCreated:null};r={silent:false,...r};let i=t("Adding environment variables.",{silent:r.silent})?.start(),n=t$1.resolvedPaths.cwd,o=E__default.join(n,".env.local"),a=G(n);a&&(o=a);let s$1=existsSync(o),c=E__default.basename(o),m=Object.entries(e).map(([g,w])=>`${g}=${w}`).join(`
42
- `),l=[],p=null,u=null;if(s$1){let g=await promises.readFile(o,"utf-8"),w=I(g,m);if(l=H$1(g,m),l.length>0){if(await promises.writeFile(o,w,"utf-8"),p=E__default.relative(n,o),i?.succeed(`Added the following variables to ${d.info(c)}:`),!r.silent)for(let h of l)s.log(` ${d.success("+")} ${h}`);}else i?.stop();}else if(await promises.writeFile(o,m+`
43
- `,"utf-8"),u=E__default.relative(n,o),l=Object.keys(e),i?.succeed(`Added the following variables to ${d.info(c)}:`),!r.silent)for(let g of l)s.log(` ${d.success("+")} ${g}`);return !r.silent&&l.length>0&&s.break(),{envVarsAdded:l,envFileUpdated:p,envFileCreated:u}}async function ir(e,t){if(!e.fonts?.length)return e;let r=await p(t.resolvedPaths.cwd);if(!r)return e;let[i]=e.fonts;if(e.cssVars??={},e.cssVars.theme??={},r.framework.name==="next-app"||r.framework.name==="next-pages")return e.cssVars.theme[i.font.variable]=`var(${i.font.variable})`,e;let o=`@fontsource-variable/${i.name.replace("font-","")}`;return e.dependencies??=[],e.dependencies.push(o),e.css??={},e.css[`@import "${o}"`]={},e.css["@layer base"]??={},e.css["@layer base"].html={"@apply font-sans":{}},e.css["@layer base"].body={"@apply font-sans bg-background text-foreground":{}},e.cssVars.theme[i.font.variable]=i.font.family,e}async function Qe(e,t$1,r){if(!e?.length)return;let i=await p(t$1.resolvedPaths.cwd);if(!i||i.framework.name!=="next-app"&&i.framework.name!=="next-pages")return;let n=t("Updating fonts.",{silent:r.silent})?.start();try{await $i(e,t$1,i),n?.succeed("Updating fonts.");}catch(o){throw n?.fail("Failed to update fonts."),o}}async function $i(e,t,r){let i=await Ni(t,r);if(!i)return;let n=await promises.readFile(i,"utf-8"),o=await Oi(n,e);o!==n&&await promises.writeFile(i,o,"utf-8");}async function Ni(e,t){let r=e.resolvedPaths.cwd,i=t.isSrcDir,o=t.isTsx?"tsx":"jsx",a=i?[`src/app/layout.${o}`,`app/layout.${o}`]:[`app/layout.${o}`];for(let s of a){let c=E__default.join(r,s);if(existsSync(c))return c}return null}async function Oi(e,t,r){let n=new Project({compilerOptions:{}}).createSourceFile("layout.tsx",e,{scriptKind:ScriptKind.TSX}),o=t.filter(s=>s.font.provider==="google"),a=[];for(let s of o){let c=s.font.import;if(!c)continue;let m=Fi(c),l=n.getImportDeclaration(g=>g.getModuleSpecifierValue()==="next/font/google"),p=Ti(s);l?l.getNamedImports().some(h=>h.getName()===c)||l.addNamedImport(c):n.addImportDeclaration({moduleSpecifier:"next/font/google",namedImports:[c]});let u=Ai(n,s.font.variable);if(u)u.setInitializer(`${c}(${p})`),u.getName()!==m&&u.rename(m);else {let g=Di(n);n.insertVariableStatement(g,{declarationKind:VariableDeclarationKind.Const,declarations:[{name:m,initializer:`${c}(${p})`}]}).appendWhitespace(`
44
- `);}a.push(m);}return a.length>0&&_i(n,a),n.getFullText()}function Ti(e){let t={};return e.font.subsets?.length&&(t.subsets=e.font.subsets),e.font.weight?.length&&(t.weight=e.font.weight),t.variable=e.font.variable,JSON.stringify(t).replace(/"([^"]+)":/g,"$1:").replace(/"/g,"'")}function Fi(e){return e.split("_").map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function Ai(e,t){let r=e.getVariableStatements();for(let i of r)for(let n of i.getDeclarations()){let o=n.getInitializer();if(!o||o.getKind()!==SyntaxKind.CallExpression)continue;let s=o.getArguments();if(s.length===0)continue;let c=s[0].getText();if(c.includes("variable:")&&c.includes(t))return n}return null}function Di(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function _i(e,t){let r=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement);for(let i of r){if(i.getTagNameNode().getText()!=="html")continue;let o=i.getAttribute("className");if(!o){let m=t.map(l=>`${l}.variable`).join(", ");t.length===1?i.addAttribute({name:"className",initializer:`{${m}}`}):(ge(e),i.addAttribute({name:"className",initializer:`{cn(${m})}`}));return}if(o.getKind()!==SyntaxKind.JsxAttribute)return;let a=o.asKindOrThrow(SyntaxKind.JsxAttribute),s=a.getInitializer();if(!s)return;let c=t.map(m=>`${m}.variable`);if(s.getKind()===SyntaxKind.StringLiteral){let m=s.getText().slice(1,-1);ge(e),a.setInitializer(`{cn("${m}", ${c.join(", ")})}`);}else if(s.getKind()===SyntaxKind.JsxExpression){let m=s.asKindOrThrow(SyntaxKind.JsxExpression),l=m.getExpression();if(!l)return;let p=l.getText();if(p.startsWith("cn(")){if(c.every(h=>p.includes(h)))continue;let g=Vi(p),w=Mi(g,c);m.replaceWithText(`{${w}}`);}else if(/^\w+\.variable$/.test(p)){if(c.includes(p))continue;c.length===1?m.replaceWithText(`{${c[0]}}`):(ge(e),m.replaceWithText(`{cn(${c.join(", ")})}`));}else if(p.startsWith("`")&&p.endsWith("`")){let u=Li(p);ge(e),m.replaceWithText(`{cn(${[...u,...c].join(", ")})}`);}else ge(e),m.replaceWithText(`{cn(${p}, ${c.join(", ")})}`);}}}function ge(e){if(!e.getImportDeclaration(r=>r.getNamedImports().some(n=>n.getName()==="cn"))){let r=e.getImportDeclaration(i=>i.getModuleSpecifierValue().includes("/lib/utils"));r?r.getNamedImports().some(n=>n.getName()==="cn")||r.addNamedImport("cn"):e.addImportDeclaration({moduleSpecifier:"@/lib/utils",namedImports:["cn"]});}}function Li(e){let t=[],r=[],n=e.slice(1,-1).split(/(\$\{[^}]+\})/);for(let o of n)if(o)if(o.startsWith("${")&&o.endsWith("}")){let a=o.slice(2,-1).trim();a&&r.push(a);}else {let a=o.trim().split(/\s+/).filter(Boolean);for(let s of a)t.push(`"${s}"`);}return [...t,...r]}function Vi(e){return e.replace(/,?\s*\w+\.variable/g,"").replace(/cn\(\s*,/,"cn(")}function Mi(e,t){let r=t.join(", ");return e.replace(/\)$/,`, ${r})`)}async function ie(e,t,r){r={overwrite:false,silent:false,isNewProject:false,baseStyle:true,...r};let i=await k(t);return i&&i.ui&&i.ui.resolvedPaths.cwd!==t.resolvedPaths.cwd?await Bi(e,t,i,{...r,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await zi(e,t,r)}async function zi(e,t$1,r$1){if(!r$1.baseStyle&&!e.length)return;let i=t("Checking registry.",{silent:r$1.silent})?.start(),n=await X(e,O(t$1));if(!n)return i?.fail(),Y$1(new Error("Failed to fetch components from registry."));try{or(n.files??[],t$1.resolvedPaths.cwd);}catch(s){return i?.fail(),Y$1(s)}i?.succeed();let o=await r(t$1);n=await ir(n,t$1),await T$1(n.tailwind?.config,t$1,{silent:r$1.silent,tailwindVersion:o});let a=await nr(e,t$1);await qe(n.cssVars,t$1,{cleanupDefaultNextStyles:r$1.isNewProject,silent:r$1.silent,tailwindVersion:o,tailwindConfig:n.tailwind?.config,overwriteCssVars:a,initIndex:r$1.baseStyle}),await Ke(n.css,t$1,{silent:r$1.silent}),await Xe(n.envVars,t$1,{silent:r$1.silent}),await z(n.dependencies,n.devDependencies,t$1,{silent:r$1.silent}),await Qe(n.fonts,t$1,{silent:r$1.silent}),await K(n.files,t$1,{overwrite:r$1.overwrite,silent:r$1.silent,path:r$1.path}),n.docs&&s.info(n.docs);}async function Bi(e,t$1,r$1,i){if(!i.baseStyle&&!e.length)return;let n=t("Checking registry.",{silent:i.silent})?.start(),o=await X(e,O(t$1));if(!o)return n?.fail(),Y$1(new Error("Failed to fetch components from registry."));try{or(o.files??[],t$1.resolvedPaths.cwd);}catch(h){return n?.fail(),Y$1(h)}n?.succeed();let a=[],s$1=[],c=[],m$1=t("Installing components.")?.start(),l$1=r$1.ui,p=await r(l$1),u=m(t$1.resolvedPaths.cwd,l$1.resolvedPaths.ui);if(o.tailwind?.config&&(await T$1(o.tailwind?.config,l$1,{silent:true,tailwindVersion:p}),s$1.push(E__default.relative(u,l$1.resolvedPaths.tailwindConfig))),o.cssVars){let h=await nr(e,t$1);await qe(o.cssVars,l$1,{silent:true,tailwindVersion:p,tailwindConfig:o.tailwind?.config,overwriteCssVars:h}),s$1.push(E__default.relative(u,l$1.resolvedPaths.tailwindCss));}o.css&&(await Ke(o.css,l$1,{silent:true}),s$1.push(E__default.relative(u,l$1.resolvedPaths.tailwindCss))),o.envVars&&await Xe(o.envVars,l$1,{silent:true}),await z(o.dependencies,o.devDependencies,l$1,{silent:true}),await Qe(o.fonts,l$1,{silent:true});let g=new Map;for(let h of o.files??[]){let x=h.type||"registry:ui";g.has(x)||g.set(x,[]),g.get(x).push(h);}for(let h of Array.from(g.keys())){let x=g.get(h),S=h==="registry:ui"?r$1.ui:t$1,M=m(t$1.resolvedPaths.cwd,S.resolvedPaths.ui||S.resolvedPaths.cwd),F=await l(M,S.resolvedPaths.cwd)??S.resolvedPaths.cwd,X=await K(x,S,{overwrite:i.overwrite,silent:true,rootSpinner:m$1,isRemote:i.isRemote,isWorkspace:true,path:i.path});a.push(...X.filesCreated.map(A=>E__default.relative(M,E__default.join(F,A)))),s$1.push(...X.filesUpdated.map(A=>E__default.relative(M,E__default.join(F,A)))),c.push(...X.filesSkipped.map(A=>E__default.relative(M,E__default.join(F,A))));}if(m$1?.succeed(),a.sort(),s$1.sort(),c.sort(),!(a.length||s$1.length)&&!c.length&&t("No files updated.",{silent:i.silent})?.info(),a.length){t(`Created ${a.length} ${a.length===1?"file":"files"}:`,{silent:i.silent})?.succeed();for(let h of a)s.log(` - ${h}`);}if(s$1.length){t(`Updated ${s$1.length} ${s$1.length===1?"file":"files"}:`,{silent:i.silent})?.info();for(let h of s$1)s.log(` - ${h}`);}if(c.length){t(`Skipped ${c.length} ${s$1.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:i.silent})?.info();for(let h of c)s.log(` - ${h}`);}o.docs&&s.info(o.docs);}async function nr(e,t){let r=await _(e,{config:t});return z$1.array(n$1).parse(r).some(n=>n.type==="registry:theme"||n.type==="registry:style"||n.type==="registry:font"||n.type==="registry:base")}function or(e,t){for(let r of e)if(r?.target&&!qt(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}var tt="https://codeload.github.com/shadcn-ui/ui/tar.gz/main",L={next:"next","next-monorepo":"next-monorepo",vite:"vite",start:"start"};async function $e(e){e={srcDir:false,...e};let t=e.template&&L[e.template]?e.template:"next",r=e.name??(t===L.next||t===L.vite||t===L.start?"my-app":"my-monorepo"),i="latest",n=e.components?.length===1&&!!e.components[0].match(/\/chat\/b\//);if(e.components&&n)try{let[s]=await S(e.components),{meta:c}=z$1.object({meta:z$1.object({nextVersion:z$1.string()})}).parse(s);i=c.nextVersion,t=L.next;}catch(s$1){s.break(),Y$1(s$1);}if(!e.force){let{type:s,name:c}=await Fe([{type:e.template||n?null:"select",name:"type",message:`The path ${d.info(e.cwd)} does not contain a package.json file.
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:m=>m.trim(),validate:m=>m.length>128?"Name should be less than 128 characters.":true}]);t=s??t,r=c??r;}let o=await a$1(e.cwd,{withFallback:true}),a=`${e.cwd}/${r}`;try{await R.access(e.cwd,R.constants.W_OK);}catch{s.break(),s.error(`The path ${d.info(e.cwd)} is not writable.`),s.error(`It is likely you do not have write permissions for this folder or the path ${d.info(e.cwd)} does not exist.`),s.break(),process.exit(1);}return R.existsSync(E__default.resolve(e.cwd,r,"package.json"))&&(s.break(),s.error(`A project with the name ${d.info(r)} already exists.`),s.error("Please choose a different name and try again."),s.break(),process.exit(1)),t===L.next&&await Gi(a,{version:i,cwd:e.cwd,packageManager:o,srcDir:!!e.srcDir}),t===L["next-monorepo"]&&await Ji(a,{packageManager:o}),t===L.vite&&await Yi(a,{packageManager:o}),t===L.start&&await Ki(a,{packageManager:o}),{projectPath:a,projectName:r,template:t}}async function Gi(e,t$1){let r=t("Creating a new Next.js project. This may take a few minutes.").start(),i=["--tailwind","--eslint","--typescript","--app",t$1.srcDir?"--src-dir":"--no-src-dir","--no-import-alias",`--use-${t$1.packageManager}`];(t$1.version.startsWith("15")||t$1.version.startsWith("latest")||t$1.version.startsWith("canary"))&&i.push("--turbopack"),(t$1.version.startsWith("latest")||t$1.version.startsWith("canary"))&&i.push("--no-react-compiler");try{await execa("npx",[`create-next-app@${t$1.version}`,e,"--silent",...i],{cwd:t$1.cwd});}catch{s.break(),s.error("Something went wrong creating a new Next.js project. Please try again."),process.exit(1);}r?.succeed("Creating a new Next.js project.");}async function Ji(e,t$1){let r=t("Creating a new Next.js monorepo. This may take a few minutes.").start();try{let i=E__default.join(et.tmpdir(),`shadcn-template-${Date.now()}`);await R.ensureDir(i);let n=await fetch(tt);if(!n.ok)throw new Error(`Failed to download template: ${n.statusText}`);let o=E__default.resolve(i,"template.tar.gz");await R.writeFile(o,Buffer.from(await n.arrayBuffer())),await execa("tar",["-xzf",o,"-C",i,"--strip-components=2","ui-main/templates/monorepo-next"]);let a=E__default.resolve(i,"monorepo-next");await R.move(a,e),await R.remove(i),await execa(t$1.packageManager,["install"],{cwd:e});let s=E__default.join(e,"package.json");if(R.existsSync(s)){let m=await R.readFile(s,"utf8"),l=JSON.parse(m);l.name=e.split("/").pop(),await R.writeFile(s,JSON.stringify(l,null,2));}let c=process.cwd();await execa("git",["--version"],{cwd:e}),await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","Initial commit"],{cwd:e}),r?.succeed("Creating a new Next.js monorepo.");}catch(i){r?.fail("Something went wrong creating a new Next.js monorepo."),Y$1(i);}}async function Yi(e,t$1){let r=t("Creating a new Vite project. This may take a few minutes.").start();try{let i=E__default.join(et.tmpdir(),`shadcn-template-${Date.now()}`);await R.ensureDir(i);let n=await fetch(tt);if(!n.ok)throw new Error(`Failed to download template: ${n.statusText}`);let o=E__default.resolve(i,"template.tar.gz");await R.writeFile(o,Buffer.from(await n.arrayBuffer())),await execa("tar",["-xzf",o,"-C",i,"--strip-components=2","ui-main/templates/vite-app"]);let a=E__default.resolve(i,"vite-app");if(await R.move(a,e),await R.remove(i),t$1.packageManager!=="pnpm"){let c=E__default.join(e,"pnpm-lock.yaml");R.existsSync(c)&&await R.remove(c);}await execa(t$1.packageManager,["install"],{cwd:e});let s=E__default.join(e,"package.json");if(R.existsSync(s)){let c=await R.readFile(s,"utf8"),m=JSON.parse(c);m.name=e.split("/").pop(),await R.writeFile(s,JSON.stringify(m,null,2));}await execa("git",["--version"],{cwd:e}),await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","Initial commit"],{cwd:e}),r?.succeed("Creating a new Vite project.");}catch(i){r?.fail("Something went wrong creating a new Vite project."),Y$1(i);}}async function Ki(e,t$1){let r=t("Creating a new TanStack Start project. This may take a few minutes.").start();try{let i=E__default.join(et.tmpdir(),`shadcn-template-${Date.now()}`);await R.ensureDir(i);let n=await fetch(tt);if(!n.ok)throw new Error(`Failed to download template: ${n.statusText}`);let o=E__default.resolve(i,"template.tar.gz");await R.writeFile(o,Buffer.from(await n.arrayBuffer())),await execa("tar",["-xzf",o,"-C",i,"--strip-components=2","ui-main/templates/start-app"]);let a=E__default.resolve(i,"start-app");if(await R.move(a,e),await R.remove(i),t$1.packageManager!=="pnpm"){let c=E__default.join(e,"pnpm-lock.yaml");R.existsSync(c)&&await R.remove(c);}await execa(t$1.packageManager,["install"],{cwd:e});let s=E__default.join(e,"package.json");if(R.existsSync(s)){let c=await R.readFile(s,"utf8"),m=JSON.parse(c);m.name=e.split("/").pop(),await R.writeFile(s,JSON.stringify(m,null,2));}await execa("git",["--version"],{cwd:e}),await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","Initial commit"],{cwd:e}),r?.succeed("Creating a new TanStack Start project.");}catch(i){r?.fail("Something went wrong creating a new TanStack Start project."),Y$1(i);}}async function B(e=process.cwd()){try{let{config:t}=await import('@dotenvx/dotenvx'),r=[".env.local",".env.development.local",".env.development",".env"];for(let i of r){let n=join(e,i);existsSync(n)&&t({path:n,overload:!1,quiet:!0});}}catch(t){s.warn("Failed to load env files:",t);}}var he=".bak";function sr(e){if(!R.existsSync(e))return null;let t=`${e}${he}`;try{return R.renameSync(e,t),t}catch(r){return console.error(`Failed to create backup of ${e}: ${r}`),null}}function ar(e){let t=`${e}${he}`;if(!R.existsSync(t))return false;try{return R.renameSync(t,e),!0}catch(r){return console.error(`Warning: Could not restore backup file ${t}: ${r}`),false}}function rt(e){let t=`${e}${he}`;if(!R.existsSync(t))return false;try{return R.unlinkSync(t),!0}catch{return false}}async function cr(e,t){let r=new Set,i=new Set,n=[...e];for(;n.length>0;){let o=n.shift();if(i.has(o))continue;i.add(o);let{registry:a}=F(o);a&&!b[a]&&r.add(a);try{let[s]=await W([o],t,{useCache:!0});if(s?.registryDependencies)for(let c of s.registryDependencies){let{registry:m}=F(c);m&&!b[m]&&r.add(m),i.has(c)||n.push(c);}}catch(s){if(s instanceof z$2){let{registry:c}=F(o);c&&!b[c]&&r.add(c);continue}continue}}return Array.from(r)}async function T(e,t$1,r={}){r={silent:false,writeFile:true,...r};let n=(await cr(e,t$1)).filter(m=>!t$1.registries?.[m]&&!Object.keys(b).includes(m));if(n.length===0)return {config:t$1,newRegistries:[]};let o=await ja({useCache:process.env.NODE_ENV!=="development"});if(!o)return {config:t$1,newRegistries:[]};let a={};for(let m of n)o[m]&&(a[m]=o[m]);if(Object.keys(a).length===0)return {config:t$1,newRegistries:[]};let s=Object.fromEntries(Object.entries(t$1.registries||{}).filter(([m])=>!Object.keys(b).includes(m))),c$1={...t$1,registries:{...s,...a}};if(r.writeFile){let{resolvedPaths:m,...l}=c$1,p=t("Updating components.json.",{silent:r.silent}).start(),u=c.parse(l);await R.writeFile(E__default.resolve(t$1.resolvedPaths.cwd,"components.json"),JSON.stringify(u,null,2)+`
46
- `,"utf-8"),p.succeed();}return {config:c$1,newRegistries:Object.keys(a)}}async function mr(e,t$1,r){if(!e)return;r={silent:false,...r};let i=E__default.relative(t$1.resolvedPaths.cwd,t$1.resolvedPaths.tailwindConfig),n=t(`Updating ${d.info(i)}`,{silent:r.silent}).start(),o=await promises.readFile(t$1.resolvedPaths.tailwindConfig,"utf8"),a=await en(o,e,t$1);await promises.writeFile(t$1.resolvedPaths.tailwindConfig,a,"utf8"),n?.succeed();}async function en(e,t,r){let i=await U(e,r),n=i.getDescendantsOfKind(SyntaxKind.ObjectLiteralExpression).find(o=>o.getProperties().some(a=>a.isKind(SyntaxKind.PropertyAssignment)&&a.getName()==="content"));return n?(tn(n,t),i.getFullText()):e}async function tn(e,t){let r=V(e),i=e.getProperty("content");if(!i){let n={name:"content",initializer:`[${r}${t.join(`${r}, ${r}`)}${r}]`};return e.addPropertyAssignment(n),e}if(i.isKind(SyntaxKind.PropertyAssignment)){let n=i.getInitializer();if(n?.isKind(SyntaxKind.ArrayLiteralExpression))for(let o of t){let a=`${r}${o}${r}`;n.getElements().map(s=>s.getText()).includes(a)||n.addElement(a);}return e}return e}process.on("exit",e=>{let t=E__default.resolve(process.cwd(),"components.json");return e===0?rt(t):ar(t)});var nt=z$1.object({cwd:z$1.string(),name:z$1.string().optional(),components:z$1.array(z$1.string()).optional(),yes:z$1.boolean(),defaults:z$1.boolean(),force:z$1.boolean(),silent:z$1.boolean(),isNewProject:z$1.boolean(),srcDir:z$1.boolean().optional(),cssVariables:z$1.boolean(),template:z$1.string().optional().refine(e=>e?L[e]:true,{message:"Invalid template. Please use 'next', 'vite', 'start' or 'next-monorepo'."}),baseColor:z$1.string().optional().refine(e=>e?a.find(t=>t.name===e):true,{message:`Invalid base color. Please use '${a.map(e=>e.name).join("', '")}'`}),baseStyle:z$1.boolean(),registryBaseConfig:c.deepPartial().optional()}),pr=new Command().name("init").description("initialize your project and install dependencies").argument("[components...]","names, url or local path to component").option("-t, --template <template>","the template to use. (next, start, vite, next-monorepo)").option("-b, --base-color <base-color>","the base color to use. (neutral, gray, zinc, stone, slate)",void 0).option("-y, --yes","skip confirmation prompt.",true).option("-d, --defaults,","use default configuration.",false).option("-f, --force","force overwrite of existing configuration.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",false).option("--src-dir","use the src directory when creating a new project.",false).option("--no-src-dir","do not use the src directory when creating a new project.").option("--css-variables","use css variables for theming.",true).option("--no-css-variables","do not use css variables for theming.").option("--no-base-style","do not install the base shadcn style.").action(async(e,t)=>{try{t.defaults&&(t.template=t.template||"next",t.baseColor=t.baseColor||"neutral");let r=nt.parse({cwd:E__default.resolve(t.cwd),isNewProject:!1,components:e,...t});if(await B(r.cwd),e.length>0){let i=O(n({resolvedPaths:{cwd:r.cwd}})),n$1=E__default.resolve(r.cwd,"components.json");if(R.existsSync(n$1)){let s=await R.readJson(n$1),c$1=c.partial().parse(s),m=n({resolvedPaths:{cwd:r.cwd}});i=O({...c$1,resolvedPaths:{...m.resolvedPaths,cwd:r.cwd}}),sr(n$1);}let{config:o}=await T(e,i,{silent:!0,writeFile:!1});i=o,R$1(e[0],i);let[a]=await _([e[0]],{config:i});a?.type==="registry:base"&&(a.config&&(i=O(fr(i,a.config)),r.registryBaseConfig=a.config),r.baseStyle=a.extends==="none"?!1:r.baseStyle),a?.type==="registry:style"&&(r.baseColor="neutral",r.baseStyle=a.extends==="none"?!1:r.baseStyle);}r.baseStyle||(r.baseColor="neutral"),await le(r),s.log(`${d.success("Success!")} Project initialization completed.
47
- You may now add components.`),rt(E__default.resolve(r.cwd,"components.json")),s.break();}catch(r){s.break(),Y$1(r);}finally{P();}});async function le(e){let t$1,r;if(e.skipPreflight)t$1=await p(e.cwd);else {let g=await Kt(e);if(g.errors["1"]){let{projectPath:w,template:h}=await $e(e);w||process.exit(1),e.cwd=w,e.isNewProject=true,r=h,t$1=await p(e.cwd);}else t$1=g.projectInfo;}if(r==="next-monorepo")return e.cwd=E__default.resolve(e.cwd,"apps/web"),await i(e.cwd);let i$1=await q(e.cwd,t$1),n=i$1?await sn(i$1,e):await on(await i(e.cwd));if(!e.yes){let{proceed:g}=await Fe({type:"confirm",name:"proceed",message:`Write configuration to ${d.info("components.json")}. Proceed?`,initial:true});g||process.exit(0);}let o=[...e.baseStyle?["index"]:[],...e.components??[]],a=await j(e.cwd,n),{config:s}=await T(o,a,{silent:true});s.registries&&(n.registries=s.registries);let c=t("Writing components.json.").start(),m=E__default.resolve(e.cwd,"components.json"),l=`${m}${he}`,p$1=(g,w)=>{let{registries:h,...x}=fr(g,w);return {...x,registries:h}};if(!e.force&&R.existsSync(l)){let g=await R.readJson(l);n=p$1(g,n);}e.registryBaseConfig&&(n=p$1(n,e.registryBaseConfig)),n.registries=Object.fromEntries(Object.entries(n.registries||{}).filter(([g])=>!Object.keys(b).includes(g))),await promises.writeFile(m,`${JSON.stringify(n,null,2)}
48
- `,"utf8"),c.succeed();let u=await j(e.cwd,n);return await ie(o,u,{overwrite:true,silent:e.silent,baseStyle:e.baseStyle,isNewProject:e.isNewProject||t$1?.framework.name==="next-app"}),e.isNewProject&&e.srcDir&&await mr(["./src/**/*.{js,ts,jsx,tsx,mdx}"],u,{silent:e.silent}),u}async function on(e$1=null){let[t,r]=await Promise.all([ca(),ea()]);s.info("");let i=await Fe([{type:"toggle",name:"typescript",message:`Would you like to use ${d.info("TypeScript")} (recommended)?`,initial:e$1?.tsx??true,active:"yes",inactive:"no"},{type:"select",name:"style",message:`Which ${d.info("style")} would you like to use?`,choices:t.map(n=>({title:n.label,value:n.name}))},{type:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${d.info("base color")}?`,choices:r.map(n=>({title:n.label,value:n.name}))},{type:"text",name:"tailwindCss",message:`Where is your ${d.info("global CSS")} file?`,initial:e$1?.tailwind.css??g},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${d.info("CSS variables")} for theming?`,initial:e$1?.tailwind.cssVariables??true,active:"yes",inactive:"no"},{type:"text",name:"tailwindPrefix",message:`Are you using a custom ${d.info("tailwind prefix eg. tw-")}? (Leave blank if not)`,initial:""},{type:"text",name:"tailwindConfig",message:`Where is your ${d.info("tailwind.config.js")} located?`,initial:e$1?.tailwind.config??h},{type:"text",name:"components",message:`Configure the import alias for ${d.info("components")}:`,initial:e$1?.aliases.components??e},{type:"text",name:"utils",message:`Configure the import alias for ${d.info("utils")}:`,initial:e$1?.aliases.utils??f},{type:"toggle",name:"rsc",message:`Are you using ${d.info("React Server Components")}?`,initial:e$1?.rsc??true,active:"yes",inactive:"no"}]);return c.parse({$schema:"https://ui.shadcn.com/schema.json",style:i.style,tailwind:{config:i.tailwindConfig,css:i.tailwindCss,baseColor:i.tailwindBaseColor,cssVariables:i.tailwindCssVariables,prefix:i.tailwindPrefix},rsc:i.rsc,tsx:i.typescript,aliases:{utils:i.utils,components:i.components,lib:i.components.replace(/\/components$/,"lib"),hooks:i.components.replace(/\/components$/,"hooks")}})}async function sn(e,t){let r$1=e.style,i=t.baseColor,n=e.tailwind.cssVariables,o=e.iconLibrary??"lucide";if(!t.defaults){let[a,s,c]=await Promise.all([ca(),ea(),r(e)]),m=await Fe([{type:c==="v4"||r$1?null:"select",name:"style",message:`Which ${d.info("style")} would you like to use?`,choices:a.map(l=>({title:l.name==="new-york"?"New York (Recommended)":l.label,value:l.name})),initial:0},{type:t.baseColor?null:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${d.info("base color")}?`,choices:s.map(l=>({title:l.label,value:l.name}))}]);r$1=m.style??r$1??"new-york",i=m.tailwindBaseColor??i,n=t.cssVariables;}return c.parse({$schema:e?.$schema,style:r$1,tailwind:{...e?.tailwind,baseColor:i,cssVariables:n},rsc:e?.rsc,tsx:e?.tsx,iconLibrary:o,aliases:e?.aliases})}async function ur(e){let t={};if(!R.existsSync(e.cwd)||!R.existsSync(E__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!R.existsSync(E__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,config:null};try{let r=await i(e.cwd);return {errors:t,config:r}}catch{s.break(),s.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e.cwd)}.
49
- Before you can add components, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),s.error(`Learn more at ${d.info("https://ui.shadcn.com/docs/components-json")}.`),s.break(),process.exit(1);}}async function hr(e,t){let r=E__default.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await Y__default.stat(r)).isFile())return;let[i]=await _([e],{config:t});if(!i?.meta?.importSpecifier||!i?.meta?.moduleSpecifier)return;let n=`import { ${i?.meta?.importSpecifier} } from "${i.meta.moduleSpecifier}"
41
+ `);let s$1=await Fe([{type:"select",name:"flag",message:"How would you like to proceed?",choices:[{title:"Use --force",value:"force"},{title:"Use --legacy-peer-deps",value:"legacy-peer-deps"}]}]);s$1&&(a=s$1.flag);}n?.start(),await vi(o,e,t$1,r.resolvedPaths.cwd,a),n?.succeed();}function bi(e){let t=o$1(e.resolvedPaths.cwd,false);if(!t?.dependencies?.react)return false;let r=/^(?:\^|~)?19(?:\.\d+)*(?:-.*)?$/.test(t.dependencies.react),i=t.dependencies["react-day-picker"]?.startsWith("8");return r&&i}async function xi(e){return o$1(e.resolvedPaths.cwd,false)?.dependencies?.expo?"expo":a$1(e.resolvedPaths.cwd)}async function vi(e,t,r,i,n){if(e==="npm")return Si(t,r,i,n);if(e==="deno")return Ri(t,r,i);if(e==="expo")return Ci(t,r,i);t?.length&&await execa(e,["add",...t],{cwd:i}),r?.length&&await execa(e,["add","-D",...r],{cwd:i});}async function Si(e,t,r,i){e.length&&await execa("npm",["install",...i?[`--${i}`]:[],...e],{cwd:r}),t.length&&await execa("npm",["install",...i?[`--${i}`]:[],"-D",...t],{cwd:r});}async function Ri(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 Ci(e,t,r){e.length&&await execa("npx",["expo","install",...e],{cwd:r}),t.length&&await execa("npx",["expo","install","-- -D",...t],{cwd:r});}async function Xe(e,t$1,r){if(!e||Object.keys(e).length===0)return {envVarsAdded:[],envFileUpdated:null,envFileCreated:null};r={silent:false,...r};let i=t("Adding environment variables.",{silent:r.silent})?.start(),n=t$1.resolvedPaths.cwd,o=j__default.join(n,".env.local"),a=G(n);a&&(o=a);let s$1=existsSync(o),c=j__default.basename(o),m=Object.entries(e).map(([g,w])=>`${g}=${w}`).join(`
42
+ `),l=[],p=null,u=null;if(s$1){let g=await promises.readFile(o,"utf-8"),w=I(g,m);if(l=H$1(g,m),l.length>0){if(await promises.writeFile(o,w,"utf-8"),p=j__default.relative(n,o),i?.succeed(`Added the following variables to ${d.info(c)}:`),!r.silent)for(let h of l)s.log(` ${d.success("+")} ${h}`);}else i?.stop();}else if(await promises.writeFile(o,m+`
43
+ `,"utf-8"),u=j__default.relative(n,o),l=Object.keys(e),i?.succeed(`Added the following variables to ${d.info(c)}:`),!r.silent)for(let g of l)s.log(` ${d.success("+")} ${g}`);return !r.silent&&l.length>0&&s.break(),{envVarsAdded:l,envFileUpdated:p,envFileCreated:u}}async function nr(e,t){if(!e.fonts?.length)return e;let r=await p(t.resolvedPaths.cwd);if(!r)return e;let[i]=e.fonts;if(e.cssVars??={},e.cssVars.theme??={},r.framework.name==="next-app"||r.framework.name==="next-pages")return e.cssVars.theme[i.font.variable]=`var(${i.font.variable})`,e;let o=`@fontsource-variable/${i.name.replace("font-","")}`;return e.dependencies??=[],e.dependencies.push(o),e.css??={},e.css[`@import "${o}"`]={},e.css["@layer base"]??={},e.css["@layer base"].html={"@apply font-sans":{}},e.css["@layer base"].body={"@apply font-sans bg-background text-foreground":{}},e.cssVars.theme[i.font.variable]=i.font.family,e}async function Qe(e,t$1,r){if(!e?.length)return;let i=await p(t$1.resolvedPaths.cwd);if(!i||i.framework.name!=="next-app"&&i.framework.name!=="next-pages")return;let n=t("Updating fonts.",{silent:r.silent})?.start();try{await Ni(e,t$1,i),n?.succeed("Updating fonts.");}catch(o){throw n?.fail("Failed to update fonts."),o}}async function Ni(e,t,r){let i=await Oi(t,r);if(!i)return;let n=await promises.readFile(i,"utf-8"),o=await Ti(n,e);o!==n&&await promises.writeFile(i,o,"utf-8");}async function Oi(e,t){let r=e.resolvedPaths.cwd,i=t.isSrcDir,o=t.isTsx?"tsx":"jsx",a=i?[`src/app/layout.${o}`,`app/layout.${o}`]:[`app/layout.${o}`];for(let s of a){let c=j__default.join(r,s);if(existsSync(c))return c}return null}async function Ti(e,t,r){let n=new Project({compilerOptions:{}}).createSourceFile("layout.tsx",e,{scriptKind:ScriptKind.TSX}),o=t.filter(s=>s.font.provider==="google"),a=[];for(let s of o){let c=s.font.import;if(!c)continue;let m=Ai(c),l=n.getImportDeclaration(g=>g.getModuleSpecifierValue()==="next/font/google"),p=Fi(s);l?l.getNamedImports().some(h=>h.getName()===c)||l.addNamedImport(c):n.addImportDeclaration({moduleSpecifier:"next/font/google",namedImports:[c]});let u=Di(n,s.font.variable);if(u)u.setInitializer(`${c}(${p})`),u.getName()!==m&&u.rename(m);else {let g=_i(n);n.insertVariableStatement(g,{declarationKind:VariableDeclarationKind.Const,declarations:[{name:m,initializer:`${c}(${p})`}]}).appendWhitespace(`
44
+ `);}a.push(m);}return a.length>0&&Li(n,a),n.getFullText()}function Fi(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 Ai(e){return e.split("_").map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function Di(e,t){let r=e.getVariableStatements();for(let i of r)for(let n of i.getDeclarations()){let o=n.getInitializer();if(!o||o.getKind()!==SyntaxKind.CallExpression)continue;let s=o.getArguments();if(s.length===0)continue;let c=s[0].getText();if(c.includes("variable:")&&c.includes(t))return n}return null}function _i(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function Li(e,t){let r=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement);for(let i of r){if(i.getTagNameNode().getText()!=="html")continue;let o=i.getAttribute("className");if(!o){let m=t.map(l=>`${l}.variable`).join(", ");t.length===1?i.addAttribute({name:"className",initializer:`{${m}}`}):(ge(e),i.addAttribute({name:"className",initializer:`{cn(${m})}`}));return}if(o.getKind()!==SyntaxKind.JsxAttribute)return;let a=o.asKindOrThrow(SyntaxKind.JsxAttribute),s=a.getInitializer();if(!s)return;let c=t.map(m=>`${m}.variable`);if(s.getKind()===SyntaxKind.StringLiteral){let m=s.getText().slice(1,-1);ge(e),a.setInitializer(`{cn("${m}", ${c.join(", ")})}`);}else if(s.getKind()===SyntaxKind.JsxExpression){let m=s.asKindOrThrow(SyntaxKind.JsxExpression),l=m.getExpression();if(!l)return;let p=l.getText();if(p.startsWith("cn(")){if(c.every(h=>p.includes(h)))continue;let g=Mi(p),w=Wi(g,c);m.replaceWithText(`{${w}}`);}else if(/^\w+\.variable$/.test(p)){if(c.includes(p))continue;c.length===1?m.replaceWithText(`{${c[0]}}`):(ge(e),m.replaceWithText(`{cn(${c.join(", ")})}`));}else if(p.startsWith("`")&&p.endsWith("`")){let u=Vi(p);ge(e),m.replaceWithText(`{cn(${[...u,...c].join(", ")})}`);}else ge(e),m.replaceWithText(`{cn(${p}, ${c.join(", ")})}`);}}}function ge(e){if(!e.getImportDeclaration(r=>r.getNamedImports().some(n=>n.getName()==="cn"))){let r=e.getImportDeclaration(i=>i.getModuleSpecifierValue().includes("/lib/utils"));r?r.getNamedImports().some(n=>n.getName()==="cn")||r.addNamedImport("cn"):e.addImportDeclaration({moduleSpecifier:"@/lib/utils",namedImports:["cn"]});}}function Vi(e){let t=[],r=[],n=e.slice(1,-1).split(/(\$\{[^}]+\})/);for(let o of n)if(o)if(o.startsWith("${")&&o.endsWith("}")){let a=o.slice(2,-1).trim();a&&r.push(a);}else {let a=o.trim().split(/\s+/).filter(Boolean);for(let s of a)t.push(`"${s}"`);}return [...t,...r]}function Mi(e){return e.replace(/,?\s*\w+\.variable/g,"").replace(/cn\(\s*,/,"cn(")}function Wi(e,t){let r=t.join(", ");return e.replace(/\)$/,`, ${r})`)}async function ie(e,t,r){r={overwrite:false,silent:false,isNewProject:false,baseStyle:true,...r};let i=await k(t);return i&&i.ui&&i.ui.resolvedPaths.cwd!==t.resolvedPaths.cwd?await Ui(e,t,i,{...r,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await Bi(e,t,r)}async function Bi(e,t$1,r$1){if(!r$1.baseStyle&&!e.length)return;let i=t("Checking registry.",{silent:r$1.silent})?.start(),n=await X(e,O(t$1));if(!n)return i?.fail(),Y$1(new Error("Failed to fetch components from registry."));try{sr(n.files??[],t$1.resolvedPaths.cwd);}catch(s){return i?.fail(),Y$1(s)}i?.succeed();let o=await r(t$1);n=await nr(n,t$1),await T$1(n.tailwind?.config,t$1,{silent:r$1.silent,tailwindVersion:o});let a=await or(e,t$1);await qe(n.cssVars,t$1,{cleanupDefaultNextStyles:r$1.isNewProject,silent:r$1.silent,tailwindVersion:o,tailwindConfig:n.tailwind?.config,overwriteCssVars:a,initIndex:r$1.baseStyle}),await Ke(n.css,t$1,{silent:r$1.silent}),await Xe(n.envVars,t$1,{silent:r$1.silent}),await z(n.dependencies,n.devDependencies,t$1,{silent:r$1.silent}),await Qe(n.fonts,t$1,{silent:r$1.silent}),await K(n.files,t$1,{overwrite:r$1.overwrite,silent:r$1.silent,path:r$1.path}),n.docs&&s.info(n.docs);}async function Ui(e,t$1,r$1,i){if(!i.baseStyle&&!e.length)return;let n=t("Checking registry.",{silent:i.silent})?.start(),o=await X(e,O(t$1));if(!o)return n?.fail(),Y$1(new Error("Failed to fetch components from registry."));try{sr(o.files??[],t$1.resolvedPaths.cwd);}catch(h){return n?.fail(),Y$1(h)}n?.succeed();let a=[],s$1=[],c=[],m$1=t("Installing components.")?.start(),l$1=r$1.ui,p=await r(l$1),u=m(t$1.resolvedPaths.cwd,l$1.resolvedPaths.ui);if(o.tailwind?.config&&(await T$1(o.tailwind?.config,l$1,{silent:true,tailwindVersion:p}),s$1.push(j__default.relative(u,l$1.resolvedPaths.tailwindConfig))),o.cssVars){let h=await or(e,t$1);await qe(o.cssVars,l$1,{silent:true,tailwindVersion:p,tailwindConfig:o.tailwind?.config,overwriteCssVars:h}),s$1.push(j__default.relative(u,l$1.resolvedPaths.tailwindCss));}o.css&&(await Ke(o.css,l$1,{silent:true}),s$1.push(j__default.relative(u,l$1.resolvedPaths.tailwindCss))),o.envVars&&await Xe(o.envVars,l$1,{silent:true}),await z(o.dependencies,o.devDependencies,l$1,{silent:true}),await Qe(o.fonts,l$1,{silent:true});let g=new Map;for(let h of o.files??[]){let b=h.type||"registry:ui";g.has(b)||g.set(b,[]),g.get(b).push(h);}for(let h of Array.from(g.keys())){let b=g.get(h),v=h==="registry:ui"?r$1.ui:t$1,M=m(t$1.resolvedPaths.cwd,v.resolvedPaths.ui||v.resolvedPaths.cwd),F=await l(M,v.resolvedPaths.cwd)??v.resolvedPaths.cwd,X=await K(b,v,{overwrite:i.overwrite,silent:true,rootSpinner:m$1,isRemote:i.isRemote,isWorkspace:true,path:i.path});a.push(...X.filesCreated.map(A=>j__default.relative(M,j__default.join(F,A)))),s$1.push(...X.filesUpdated.map(A=>j__default.relative(M,j__default.join(F,A)))),c.push(...X.filesSkipped.map(A=>j__default.relative(M,j__default.join(F,A))));}if(m$1?.succeed(),a.sort(),s$1.sort(),c.sort(),!(a.length||s$1.length)&&!c.length&&t("No files updated.",{silent:i.silent})?.info(),a.length){t(`Created ${a.length} ${a.length===1?"file":"files"}:`,{silent:i.silent})?.succeed();for(let h of a)s.log(` - ${h}`);}if(s$1.length){t(`Updated ${s$1.length} ${s$1.length===1?"file":"files"}:`,{silent:i.silent})?.info();for(let h of s$1)s.log(` - ${h}`);}if(c.length){t(`Skipped ${c.length} ${s$1.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:i.silent})?.info();for(let h of c)s.log(` - ${h}`);}o.docs&&s.info(o.docs);}async function or(e,t){let r=await _(e,{config:t});return z$1.array(n$1).parse(r).some(n=>n.type==="registry:theme"||n.type==="registry:style"||n.type==="registry:font"||n.type==="registry:base")}function sr(e,t){for(let r of e)if(r?.target&&!Ht(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}var tt="https://codeload.github.com/shadcn-ui/ui/tar.gz/main",L={next:"next","next-monorepo":"next-monorepo",vite:"vite",start:"start"};async function $e(e){e={srcDir:false,...e};let t=e.template&&L[e.template]?e.template:"next",r=e.name??(t===L.next||t===L.vite||t===L.start?"my-app":"my-monorepo"),i="latest",n=e.components?.length===1&&!!e.components[0].match(/\/chat\/b\//);if(e.components&&n)try{let[s]=await S(e.components),{meta:c}=z$1.object({meta:z$1.object({nextVersion:z$1.string()})}).parse(s);i=c.nextVersion,t=L.next;}catch(s$1){s.break(),Y$1(s$1);}if(!e.force){let{type:s,name:c}=await Fe([{type:e.template||n?null:"select",name:"type",message:`The path ${d.info(e.cwd)} does not contain a package.json file.
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:m=>m.trim(),validate:m=>m.length>128?"Name should be less than 128 characters.":true}]);t=s??t,r=c??r;}let o=await a$1(e.cwd,{withFallback:true}),a=`${e.cwd}/${r}`;try{await R.access(e.cwd,R.constants.W_OK);}catch{s.break(),s.error(`The path ${d.info(e.cwd)} is not writable.`),s.error(`It is likely you do not have write permissions for this folder or the path ${d.info(e.cwd)} does not exist.`),s.break(),process.exit(1);}return R.existsSync(j__default.resolve(e.cwd,r,"package.json"))&&(s.break(),s.error(`A project with the name ${d.info(r)} already exists.`),s.error("Please choose a different name and try again."),s.break(),process.exit(1)),t===L.next&&await Ji(a,{version:i,cwd:e.cwd,packageManager:o,srcDir:!!e.srcDir}),t===L["next-monorepo"]&&await Yi(a,{packageManager:o}),t===L.vite&&await Ki(a,{packageManager:o}),t===L.start&&await qi(a,{packageManager:o}),{projectPath:a,projectName:r,template:t}}async function Ji(e,t$1){let r=t("Creating a new Next.js project. This may take a few minutes.").start(),i=["--tailwind","--eslint","--typescript","--app",t$1.srcDir?"--src-dir":"--no-src-dir","--no-import-alias",`--use-${t$1.packageManager}`];(t$1.version.startsWith("15")||t$1.version.startsWith("latest")||t$1.version.startsWith("canary"))&&i.push("--turbopack"),(t$1.version.startsWith("latest")||t$1.version.startsWith("canary"))&&i.push("--no-react-compiler");try{await execa("npx",[`create-next-app@${t$1.version}`,e,"--silent",...i],{cwd:t$1.cwd});}catch{s.break(),s.error("Something went wrong creating a new Next.js project. Please try again."),process.exit(1);}r?.succeed("Creating a new Next.js project.");}async function Yi(e,t$1){let r=t("Creating a new Next.js monorepo. This may take a few minutes.").start();try{let i=j__default.join(et.tmpdir(),`shadcn-template-${Date.now()}`);await R.ensureDir(i);let n=await fetch(tt);if(!n.ok)throw new Error(`Failed to download template: ${n.statusText}`);let o=j__default.resolve(i,"template.tar.gz");await R.writeFile(o,Buffer.from(await n.arrayBuffer())),await execa("tar",["-xzf",o,"-C",i,"--strip-components=2","ui-main/templates/monorepo-next"]);let a=j__default.resolve(i,"monorepo-next");await R.move(a,e),await R.remove(i),await execa(t$1.packageManager,["install"],{cwd:e});let s=j__default.join(e,"package.json");if(R.existsSync(s)){let m=await R.readFile(s,"utf8"),l=JSON.parse(m);l.name=e.split("/").pop(),await R.writeFile(s,JSON.stringify(l,null,2));}let c=process.cwd();await execa("git",["--version"],{cwd:e}),await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","Initial commit"],{cwd:e}),r?.succeed("Creating a new Next.js monorepo.");}catch(i){r?.fail("Something went wrong creating a new Next.js monorepo."),Y$1(i);}}async function Ki(e,t$1){let r=t("Creating a new Vite project. This may take a few minutes.").start();try{let i=j__default.join(et.tmpdir(),`shadcn-template-${Date.now()}`);await R.ensureDir(i);let n=await fetch(tt);if(!n.ok)throw new Error(`Failed to download template: ${n.statusText}`);let o=j__default.resolve(i,"template.tar.gz");await R.writeFile(o,Buffer.from(await n.arrayBuffer())),await execa("tar",["-xzf",o,"-C",i,"--strip-components=2","ui-main/templates/vite-app"]);let a=j__default.resolve(i,"vite-app");if(await R.move(a,e),await R.remove(i),t$1.packageManager!=="pnpm"){let c=j__default.join(e,"pnpm-lock.yaml");R.existsSync(c)&&await R.remove(c);}await execa(t$1.packageManager,["install"],{cwd:e});let s=j__default.join(e,"package.json");if(R.existsSync(s)){let c=await R.readFile(s,"utf8"),m=JSON.parse(c);m.name=e.split("/").pop(),await R.writeFile(s,JSON.stringify(m,null,2));}await execa("git",["--version"],{cwd:e}),await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","Initial commit"],{cwd:e}),r?.succeed("Creating a new Vite project.");}catch(i){r?.fail("Something went wrong creating a new Vite project."),Y$1(i);}}async function qi(e,t$1){let r=t("Creating a new TanStack Start project. This may take a few minutes.").start();try{let i=j__default.join(et.tmpdir(),`shadcn-template-${Date.now()}`);await R.ensureDir(i);let n=await fetch(tt);if(!n.ok)throw new Error(`Failed to download template: ${n.statusText}`);let o=j__default.resolve(i,"template.tar.gz");await R.writeFile(o,Buffer.from(await n.arrayBuffer())),await execa("tar",["-xzf",o,"-C",i,"--strip-components=2","ui-main/templates/start-app"]);let a=j__default.resolve(i,"start-app");if(await R.move(a,e),await R.remove(i),t$1.packageManager!=="pnpm"){let c=j__default.join(e,"pnpm-lock.yaml");R.existsSync(c)&&await R.remove(c);}await execa(t$1.packageManager,["install"],{cwd:e});let s=j__default.join(e,"package.json");if(R.existsSync(s)){let c=await R.readFile(s,"utf8"),m=JSON.parse(c);m.name=e.split("/").pop(),await R.writeFile(s,JSON.stringify(m,null,2));}await execa("git",["--version"],{cwd:e}),await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","Initial commit"],{cwd:e}),r?.succeed("Creating a new TanStack Start project.");}catch(i){r?.fail("Something went wrong creating a new TanStack Start project."),Y$1(i);}}async function B(e=process.cwd()){try{let{config:t}=await import('@dotenvx/dotenvx'),r=[".env.local",".env.development.local",".env.development",".env"];for(let i of r){let n=join(e,i);existsSync(n)&&t({path:n,overload:!1,quiet:!0});}}catch(t){s.warn("Failed to load env files:",t);}}var he=".bak";function ar(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 cr(e){let t=`${e}${he}`;if(!R.existsSync(t))return false;try{return R.renameSync(t,e),!0}catch(r){return console.error(`Warning: Could not restore backup file ${t}: ${r}`),false}}function rt(e){let t=`${e}${he}`;if(!R.existsSync(t))return false;try{return R.unlinkSync(t),!0}catch{return false}}async function lr(e,t){let r=new Set,i=new Set,n=[...e];for(;n.length>0;){let o=n.shift();if(i.has(o))continue;i.add(o);let{registry:a}=F(o);a&&!b[a]&&r.add(a);try{let[s]=await W([o],t,{useCache:!0});if(s?.registryDependencies)for(let c of s.registryDependencies){let{registry:m}=F(c);m&&!b[m]&&r.add(m),i.has(c)||n.push(c);}}catch(s){if(s instanceof z$2){let{registry:c}=F(o);c&&!b[c]&&r.add(c);continue}continue}}return Array.from(r)}async function T(e,t$1,r={}){r={silent:false,writeFile:true,...r};let n=(await lr(e,t$1)).filter(m=>!t$1.registries?.[m]&&!Object.keys(b).includes(m));if(n.length===0)return {config:t$1,newRegistries:[]};let o=await ja({useCache:process.env.NODE_ENV!=="development"});if(!o)return {config:t$1,newRegistries:[]};let a={};for(let m of n)o[m]&&(a[m]=o[m]);if(Object.keys(a).length===0)return {config:t$1,newRegistries:[]};let s=Object.fromEntries(Object.entries(t$1.registries||{}).filter(([m])=>!Object.keys(b).includes(m))),c$1={...t$1,registries:{...s,...a}};if(r.writeFile){let{resolvedPaths:m,...l}=c$1,p=t("Updating components.json.",{silent:r.silent}).start(),u=c.parse(l);await R.writeFile(j__default.resolve(t$1.resolvedPaths.cwd,"components.json"),JSON.stringify(u,null,2)+`
46
+ `,"utf-8"),p.succeed();}return {config:c$1,newRegistries:Object.keys(a)}}async function fr(e,t$1,r){if(!e)return;r={silent:false,...r};let i=j__default.relative(t$1.resolvedPaths.cwd,t$1.resolvedPaths.tailwindConfig),n=t(`Updating ${d.info(i)}`,{silent:r.silent}).start(),o=await promises.readFile(t$1.resolvedPaths.tailwindConfig,"utf8"),a=await tn(o,e,t$1);await promises.writeFile(t$1.resolvedPaths.tailwindConfig,a,"utf8"),n?.succeed();}async function tn(e,t,r){let i=await U(e,r),n=i.getDescendantsOfKind(SyntaxKind.ObjectLiteralExpression).find(o=>o.getProperties().some(a=>a.isKind(SyntaxKind.PropertyAssignment)&&a.getName()==="content"));return n?(rn(n,t),i.getFullText()):e}async function rn(e,t){let r=V(e),i=e.getProperty("content");if(!i){let n={name:"content",initializer:`[${r}${t.join(`${r}, ${r}`)}${r}]`};return e.addPropertyAssignment(n),e}if(i.isKind(SyntaxKind.PropertyAssignment)){let n=i.getInitializer();if(n?.isKind(SyntaxKind.ArrayLiteralExpression))for(let o of t){let a=`${r}${o}${r}`;n.getElements().map(s=>s.getText()).includes(a)||n.addElement(a);}return e}return e}process.on("exit",e=>{let t=j__default.resolve(process.cwd(),"components.json");return e===0?rt(t):cr(t)});var nt=z$1.object({cwd:z$1.string(),name:z$1.string().optional(),components:z$1.array(z$1.string()).optional(),yes:z$1.boolean(),defaults:z$1.boolean(),force:z$1.boolean(),silent:z$1.boolean(),isNewProject:z$1.boolean(),srcDir:z$1.boolean().optional(),cssVariables:z$1.boolean(),template:z$1.string().optional().refine(e=>e?L[e]:true,{message:"Invalid template. Please use 'next', 'vite', 'start' or 'next-monorepo'."}),baseColor:z$1.string().optional().refine(e=>e?a.find(t=>t.name===e):true,{message:`Invalid base color. Please use '${a.map(e=>e.name).join("', '")}'`}),baseStyle:z$1.boolean(),registryBaseConfig:c.deepPartial().optional()}),dr=new Command().name("init").description("initialize your project and install dependencies").argument("[components...]","names, url or local path to component").option("-t, --template <template>","the template to use. (next, start, vite, next-monorepo)").option("-b, --base-color <base-color>","the base color to use. (neutral, gray, zinc, stone, slate)",void 0).option("-y, --yes","skip confirmation prompt.",true).option("-d, --defaults,","use default configuration.",false).option("-f, --force","force overwrite of existing configuration.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",false).option("--src-dir","use the src directory when creating a new project.",false).option("--no-src-dir","do not use the src directory when creating a new project.").option("--css-variables","use css variables for theming.",true).option("--no-css-variables","do not use css variables for theming.").option("--no-base-style","do not install the base shadcn style.").action(async(e,t)=>{try{t.defaults&&(t.template=t.template||"next",t.baseColor=t.baseColor||"neutral");let r=nt.parse({cwd:j__default.resolve(t.cwd),isNewProject:!1,components:e,...t});if(await B(r.cwd),e.length>0){let i=O(n({resolvedPaths:{cwd:r.cwd}})),n$1=j__default.resolve(r.cwd,"components.json");if(R.existsSync(n$1)){let s=await R.readJson(n$1),c$1=c.partial().parse(s),m=n({resolvedPaths:{cwd:r.cwd}});i=O({...c$1,resolvedPaths:{...m.resolvedPaths,cwd:r.cwd}}),ar(n$1);}let{config:o}=await T(e,i,{silent:!0,writeFile:!1});i=o,R$1(e[0],i);let[a]=await _([e[0]],{config:i});a?.type==="registry:base"&&(a.config&&(i=O(pr(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 me(r),s.log(`${d.success("Success!")} Project initialization completed.
47
+ You may now add components.`),rt(j__default.resolve(r.cwd,"components.json")),s.break();}catch(r){s.break(),Y$1(r);}finally{P();}});async function me(e){let t$1,r;if(e.skipPreflight)t$1=await p(e.cwd);else {let g=await qt(e);if(g.errors["1"]){let{projectPath:w,template:h}=await $e(e);w||process.exit(1),e.cwd=w,e.isNewProject=true,r=h,t$1=await p(e.cwd);}else t$1=g.projectInfo;}if(r==="next-monorepo")return e.cwd=j__default.resolve(e.cwd,"apps/web"),await i(e.cwd);let i$1=await q(e.cwd,t$1),n=i$1?await an(i$1,e):await sn(await i(e.cwd));if(!e.yes){let{proceed:g}=await Fe({type:"confirm",name:"proceed",message:`Write configuration to ${d.info("components.json")}. Proceed?`,initial:true});g||process.exit(0);}let o=[...e.baseStyle?["index"]:[],...e.components??[]],a=await j$1(e.cwd,n),{config:s}=await T(o,a,{silent:true});s.registries&&(n.registries=s.registries);let c=t("Writing components.json.").start(),m=j__default.resolve(e.cwd,"components.json"),l=`${m}${he}`,p$1=(g,w)=>{let{registries:h,...b}=pr(g,w);return {...b,registries:h}};if(!e.force&&R.existsSync(l)){let g=await R.readJson(l);n=p$1(g,n);}e.registryBaseConfig&&(n=p$1(n,e.registryBaseConfig)),n.registries=Object.fromEntries(Object.entries(n.registries||{}).filter(([g])=>!Object.keys(b).includes(g))),await promises.writeFile(m,`${JSON.stringify(n,null,2)}
48
+ `,"utf8"),c.succeed();let u=await j$1(e.cwd,n);return await ie(o,u,{overwrite:true,silent:e.silent,baseStyle:e.baseStyle,isNewProject:e.isNewProject||t$1?.framework.name==="next-app"}),e.isNewProject&&e.srcDir&&await fr(["./src/**/*.{js,ts,jsx,tsx,mdx}"],u,{silent:e.silent}),u}async function sn(e$1=null){let[t,r]=await Promise.all([ca(),ea()]);s.info("");let i=await Fe([{type:"toggle",name:"typescript",message:`Would you like to use ${d.info("TypeScript")} (recommended)?`,initial:e$1?.tsx??true,active:"yes",inactive:"no"},{type:"select",name:"style",message:`Which ${d.info("style")} would you like to use?`,choices:t.map(n=>({title:n.label,value:n.name}))},{type:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${d.info("base color")}?`,choices:r.map(n=>({title:n.label,value:n.name}))},{type:"text",name:"tailwindCss",message:`Where is your ${d.info("global CSS")} file?`,initial:e$1?.tailwind.css??g},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${d.info("CSS variables")} for theming?`,initial:e$1?.tailwind.cssVariables??true,active:"yes",inactive:"no"},{type:"text",name:"tailwindPrefix",message:`Are you using a custom ${d.info("tailwind prefix eg. tw-")}? (Leave blank if not)`,initial:""},{type:"text",name:"tailwindConfig",message:`Where is your ${d.info("tailwind.config.js")} located?`,initial:e$1?.tailwind.config??h},{type:"text",name:"components",message:`Configure the import alias for ${d.info("components")}:`,initial:e$1?.aliases.components??e},{type:"text",name:"utils",message:`Configure the import alias for ${d.info("utils")}:`,initial:e$1?.aliases.utils??f},{type:"toggle",name:"rsc",message:`Are you using ${d.info("React Server Components")}?`,initial:e$1?.rsc??true,active:"yes",inactive:"no"}]);return c.parse({$schema:"https://ui.shadcn.com/schema.json",style:i.style,tailwind:{config:i.tailwindConfig,css:i.tailwindCss,baseColor:i.tailwindBaseColor,cssVariables:i.tailwindCssVariables,prefix:i.tailwindPrefix},rsc:i.rsc,tsx:i.typescript,aliases:{utils:i.utils,components:i.components,lib:i.components.replace(/\/components$/,"lib"),hooks:i.components.replace(/\/components$/,"hooks")}})}async function an(e,t){let r$1=e.style,i=t.baseColor,n=e.tailwind.cssVariables,o=e.iconLibrary??"lucide";if(!t.defaults){let[a,s,c]=await Promise.all([ca(),ea(),r(e)]),m=await Fe([{type:c==="v4"||r$1?null:"select",name:"style",message:`Which ${d.info("style")} would you like to use?`,choices:a.map(l=>({title:l.name==="new-york"?"New York (Recommended)":l.label,value:l.name})),initial:0},{type:t.baseColor?null:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${d.info("base color")}?`,choices:s.map(l=>({title:l.label,value:l.name}))}]);r$1=m.style??r$1??"new-york",i=m.tailwindBaseColor??i,n=t.cssVariables;}return c.parse({$schema:e?.$schema,style:r$1,tailwind:{...e?.tailwind,baseColor:i,cssVariables:n},rsc:e?.rsc,tsx:e?.tsx,iconLibrary:o,aliases:e?.aliases})}async function gr(e){let t={};if(!R.existsSync(e.cwd)||!R.existsSync(j__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!R.existsSync(j__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,config:null};try{let r=await i(e.cwd);return {errors:t,config:r}}catch{s.break(),s.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e.cwd)}.
49
+ Before you can add components, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),s.error(`Learn more at ${d.info("https://ui.shadcn.com/docs/components-json")}.`),s.break(),process.exit(1);}}async function wr(e,t){let r=j__default.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await Y__default.stat(r)).isFile())return;let[i]=await _([e],{config:t});if(!i?.meta?.importSpecifier||!i?.meta?.moduleSpecifier)return;let n=`import { ${i?.meta?.importSpecifier} } from "${i.meta.moduleSpecifier}"
50
50
 
51
51
  export default function Page() {
52
52
  return <${i?.meta?.importSpecifier} />
53
- }`;await Y__default.writeFile(r,n,"utf8");}var ln=z$1.object({components:z$1.array(z$1.string()).optional(),yes:z$1.boolean(),overwrite:z$1.boolean(),cwd:z$1.string(),all:z$1.boolean(),path:z$1.string().optional(),silent:z$1.boolean(),srcDir:z$1.boolean().optional(),cssVariables:z$1.boolean()}),yr=new Command().name("add").description("add a component to your project").argument("[components...]","names, url or local path to component").option("-y, --yes","skip confirmation prompt.",false).option("-o, --overwrite","overwrite existing files.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-a, --all","add all available components",false).option("-p, --path <path>","the path to add the component to.").option("-s, --silent","mute output.",false).option("--src-dir","use the src directory when creating a new project.",false).option("--no-src-dir","do not use the src directory when creating a new project.").option("--css-variables","use css variables for theming.",true).option("--no-css-variables","do not use css variables for theming.").action(async(e,t)=>{try{let r=ln.parse({components:e,cwd:E__default.resolve(t.cwd),...t});await B(r.cwd);let i$1=await i(r.cwd);i$1||(i$1=n({style:"new-york",resolvedPaths:{cwd:r.cwd}}));let n$1=["sidebar-","login-","signup-","otp-","calendar-"],o=["base-","radix-"];if(e.length>0&&i$1?.style&&o.some(x=>i$1?.style.startsWith(x))){let x=e.filter(S=>n$1.some(M=>S.startsWith(M)));x.length&&(s.warn(`The ${d.info(x.map(S=>S).join(", "))} component(s) are not available for the ${d.info(i$1.style)} style yet. They are coming soon.`),s.warn("In the meantime, you can visit the blocks page on https://ui.shadcn.com/blocks and copy the code."),s.break(),process.exit(1));}let a=!1;if(e.length>0){let{config:h,newRegistries:x}=await T(e,i$1,{silent:r.silent,writeFile:!1});i$1=h,a=x.length>0;}let s$1,c=!0;if(e.length>0){let[h]=await _([e[0]],{config:i$1});if(s$1=h?.type,c=s$1!=="registry:theme"&&s$1!=="registry:style",N(h)){await ie(e,i$1,{...r,baseStyle:c});return}if(!r.yes&&(s$1==="registry:style"||s$1==="registry:theme")){s.break();let{confirm:x}=await Fe({type:"confirm",name:"confirm",message:d.warn(`You are about to install a new ${s$1.replace("registry:","")}.
54
- Existing CSS variables and components will be overwritten. Continue?`)});x||(s.break(),s.log("Installation cancelled."),s.break(),process.exit(1));}}if(r.components?.length||(r.components=await mn(r)),(await p(r.cwd))?.tailwindVersion==="v4"){let h=c$1.filter(x=>r.components?.includes(x.name));h?.length&&(s.break(),h.forEach(x=>{s.warn(d.warn(x.message));}),s.break(),process.exit(1));}let{errors:l,config:p$1}=await ur(r),u=!1;if(l["3"]){let{proceed:h}=await Fe({type:"confirm",name:"proceed",message:`You need to create a ${d.info("components.json")} file to add components. Proceed?`,initial:!0});h||(s.break(),process.exit(1)),p$1=await le({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:r.silent&&!a,isNewProject:!1,srcDir:r.srcDir,cssVariables:r.cssVariables,baseStyle:c,baseColor:c?void 0:"neutral",components:r.components}),u=!0;}let g=!1;if(l["1"]){let{projectPath:h,template:x}=await $e({cwd:r.cwd,force:r.overwrite,srcDir:r.srcDir,components:r.components});h||(s.break(),process.exit(1)),r.cwd=h,x==="next-monorepo"?(r.cwd=E__default.resolve(r.cwd,"apps/web"),p$1=await i(r.cwd)):(p$1=await le({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!a&&r.silent,isNewProject:!0,srcDir:r.srcDir,cssVariables:r.cssVariables,baseStyle:c,baseColor:c?void 0:"neutral",components:r.components}),u=!0,g=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//));}if(!p$1)throw new Error(`Failed to read config at ${d.info(r.cwd)}.`);let{config:w}=await T(r.components,p$1,{silent:r.silent||a});p$1=w,u||await ie(r.components,p$1,{...r,baseStyle:c}),g&&await hr(r.components[0],p$1);}catch(r){s.break(),Y$1(r);}finally{P();}});async function mn(e){let t=await ba();if(!t)return s.break(),Y$1(new Error("Failed to fetch registry index.")),[];if(e.all)return t.map(n=>n.name).filter(n=>!c$1.some(o=>o.name===n));if(e.components?.length)return e.components;let{components:r}=await Fe({type:"multiselect",name:"components",message:"Which components would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:false,choices:t.filter(n=>n.type==="registry:ui"&&!c$1.some(o=>o.name===n.name)).map(n=>({title:n.name,value:n.name,selected:e.all?true:e.components?.includes(n.name)}))});r?.length||(s.warn("No components selected. Exiting."),s.info(""),process.exit(1));let i=z$1.array(z$1.string()).safeParse(r);return i.success?i.data:(s.error(""),Y$1(new Error("Something went wrong. Please try again.")),[])}async function Sr(e){let t={},r={cwd:e.cwd,registryFile:E__default.resolve(e.cwd,e.registryFile),outputDir:E__default.resolve(e.cwd,e.outputDir)};return R.existsSync(r.registryFile)||(t["13"]=true),await R.mkdir(r.outputDir,{recursive:true}),Object.keys(t).length>0&&(t["13"]&&(s.break(),s.error(`The path ${d.info(r.registryFile)} does not exist.`)),s.break(),process.exit(1)),{errors:t,resolvePaths:r}}var pn=z$1.object({cwd:z$1.string(),registryFile:z$1.string(),outputDir:z$1.string()}),vr=new Command().name("build").description("build components for a shadcn registry").argument("[registry]","path to registry.json file","./registry.json").option("-o, --output <path>","destination directory for json files","./public/r").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t$1)=>{try{let r=pn.parse({cwd:E.resolve(t$1.cwd),registryFile:e,outputDir:t$1.output}),{resolvePaths:i}=await Sr(r),n=await Y.readFile(i.registryFile,"utf-8"),o$1=o.safeParse(JSON.parse(n));o$1.success||(s.error(`Invalid registry file found at ${d.info(i.registryFile)}.`),process.exit(1));let a=t("Building registry...");for(let s$1 of o$1.data.items){a.start(`Building ${s$1.name}...`),s$1.$schema="https://ui.shadcn.com/schema/registry-item.json";for(let m of s$1.files??[])m.content=await Y.readFile(E.resolve(i.cwd,m.path),"utf-8");let c=n$1.safeParse(s$1);if(!c.success){s.error(`Invalid registry item found for ${d.info(s$1.name)}.`);continue}await Y.writeFile(E.resolve(i.outputDir,`${c.data.name}.json`),JSON.stringify(c.data,null,2));}await Y.copyFile(i.registryFile,E.resolve(i.outputDir,"registry.json")),a.succeed("Building registry.");}catch(r){s.break(),Y$1(r);}});var Cr="https://ui.shadcn.com",gn={next:"Next.js",vite:"Vite",start:"TanStack Start"},Ir=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=kr();s.log("Build your own shadcn/ui."),s.log(`You will be taken to ${d.info(w)} to build your custom design system.`),s.break();let{proceed:h}=await Fe({type:"confirm",name:"proceed",message:"Open in browser?",initial:!0});h&&await Rr(w),process.exit(0);}let i=e;if(!i){let{enteredName:w}=await Fe({type:"text",name:"enteredName",message:"What is your project named?",initial:t.template?`${t.template}-app`:"my-app",format:h=>h.trim(),validate:h=>h.length>128?"Name should be less than 128 characters.":!0});w||process.exit(0),i=w;}let n=t.template;if(!n){let{selectedTemplate:w}=await Fe({type:"select",name:"selectedTemplate",message:`Which ${d.info("template")} would you like to use?`,choices:Object.entries(gn).map(([h,x])=>({title:x,value:h}))});w||process.exit(0),n=w;}let o=await wn(t.preset??!0);o||process.exit(0);let a,s$1;"_isUrl"in o?(a=o.url,s$1=new URL(o.url).searchParams.get("baseColor")??"neutral"):(a=hn(o),s$1=o.baseColor);let c=O({}),{config:m}=await T([a],c,{silent:!0});c=m;let[l]=await _([a],{config:c}),p;l?.type==="registry:base"&&l.config&&(p=l.config);let u=nt.parse({cwd:E__default.resolve(t.cwd),name:i,components:[a],yes:t.yes,defaults:!1,force:!1,silent:!1,isNewProject:!0,srcDir:t.srcDir,cssVariables:!0,template:n,baseColor:s$1,baseStyle:!1,registryBaseConfig:p,skipPreflight:!1}),g=await le(u);if(g){await ie(["component-example"],g,{baseStyle:!1,silent:!0,overwrite:!0});let w=yn(n);w.length>0&&await K(w,g,{overwrite:!0,silent:!0});}s.log(`${d.success("Success!")} Project initialization completed.
55
- You may now add components.`),s.break();}catch(r){s.break(),Y$1(r);}finally{P();}});function hn(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 `${bn()}?${t.toString()}`}async function wn(e){if(e===true){let t=await ka(),{selectedPreset:r}=await Fe({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=kr();return s.info(`
53
+ }`;await Y__default.writeFile(r,n,"utf8");}var mn=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()}),br=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=mn.parse({components:e,cwd:j__default.resolve(t.cwd),...t});await B(r.cwd);let i$1=await i(r.cwd);i$1||(i$1=n({style:"new-york",resolvedPaths:{cwd:r.cwd}}));let n$1=["sidebar-","login-","signup-","otp-","calendar-"],o=["base-","radix-"];if(e.length>0&&i$1?.style&&o.some(b=>i$1?.style.startsWith(b))){let b=e.filter(v=>n$1.some(M=>v.startsWith(M)));b.length&&(s.warn(`The ${d.info(b.map(v=>v).join(", "))} component(s) are not available for the ${d.info(i$1.style)} style yet. They are coming soon.`),s.warn("In the meantime, you can visit the blocks page on https://ui.shadcn.com/blocks and copy the code."),s.break(),process.exit(1));}let a=!1;if(e.length>0){let{config:h,newRegistries:b}=await T(e,i$1,{silent:r.silent,writeFile:!1});i$1=h,a=b.length>0;}let s$1,c=!0;if(e.length>0){let[h]=await _([e[0]],{config:i$1});if(s$1=h?.type,c=s$1!=="registry:theme"&&s$1!=="registry:style",N(h)){await ie(e,i$1,{...r,baseStyle:c});return}if(!r.yes&&(s$1==="registry:style"||s$1==="registry:theme")){s.break();let{confirm:b}=await Fe({type:"confirm",name:"confirm",message:d.warn(`You are about to install a new ${s$1.replace("registry:","")}.
54
+ Existing CSS variables and components will be overwritten. Continue?`)});b||(s.break(),s.log("Installation cancelled."),s.break(),process.exit(1));}}if(r.components?.length||(r.components=await fn(r)),(await p(r.cwd))?.tailwindVersion==="v4"){let h=c$1.filter(b=>r.components?.includes(b.name));h?.length&&(s.break(),h.forEach(b=>{s.warn(d.warn(b.message));}),s.break(),process.exit(1));}let{errors:l,config:p$1}=await gr(r),u=!1;if(l["3"]){let{proceed:h}=await Fe({type:"confirm",name:"proceed",message:`You need to create a ${d.info("components.json")} file to add components. Proceed?`,initial:!0});h||(s.break(),process.exit(1)),p$1=await me({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:r.silent&&!a,isNewProject:!1,srcDir:r.srcDir,cssVariables:r.cssVariables,baseStyle:c,baseColor:c?void 0:"neutral",components:r.components}),u=!0;}let g=!1;if(l["1"]){let{projectPath:h,template:b}=await $e({cwd:r.cwd,force:r.overwrite,srcDir:r.srcDir,components:r.components});h||(s.break(),process.exit(1)),r.cwd=h,b==="next-monorepo"?(r.cwd=j__default.resolve(r.cwd,"apps/web"),p$1=await i(r.cwd)):(p$1=await me({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!a&&r.silent,isNewProject:!0,srcDir:r.srcDir,cssVariables:r.cssVariables,baseStyle:c,baseColor:c?void 0:"neutral",components:r.components}),u=!0,g=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//));}if(!p$1)throw new Error(`Failed to read config at ${d.info(r.cwd)}.`);let{config:w}=await T(r.components,p$1,{silent:r.silent||a});p$1=w,u||await ie(r.components,p$1,{...r,baseStyle:c}),g&&await wr(r.components[0],p$1);}catch(r){s.break(),Y$1(r);}finally{P();}});async function fn(e){let t=await ba();if(!t)return s.break(),Y$1(new Error("Failed to fetch registry index.")),[];if(e.all)return t.map(n=>n.name).filter(n=>!c$1.some(o=>o.name===n));if(e.components?.length)return e.components;let{components:r}=await Fe({type:"multiselect",name:"components",message:"Which components would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:false,choices:t.filter(n=>n.type==="registry:ui"&&!c$1.some(o=>o.name===n.name)).map(n=>({title:n.name,value:n.name,selected:e.all?true:e.components?.includes(n.name)}))});r?.length||(s.warn("No components selected. Exiting."),s.info(""),process.exit(1));let i=z$1.array(z$1.string()).safeParse(r);return i.success?i.data:(s.error(""),Y$1(new Error("Something went wrong. Please try again.")),[])}async function Sr(e){let t={},r={cwd:e.cwd,registryFile:j__default.resolve(e.cwd,e.registryFile),outputDir:j__default.resolve(e.cwd,e.outputDir)};return R.existsSync(r.registryFile)||(t["13"]=true),await R.mkdir(r.outputDir,{recursive:true}),Object.keys(t).length>0&&(t["13"]&&(s.break(),s.error(`The path ${d.info(r.registryFile)} does not exist.`)),s.break(),process.exit(1)),{errors:t,resolvePaths:r}}var dn=z$1.object({cwd:z$1.string(),registryFile:z$1.string(),outputDir:z$1.string()}),Rr=new Command().name("build").description("build components for a shadcn registry").argument("[registry]","path to registry.json file","./registry.json").option("-o, --output <path>","destination directory for json files","./public/r").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t$1)=>{try{let r=dn.parse({cwd:j.resolve(t$1.cwd),registryFile:e,outputDir:t$1.output}),{resolvePaths:i}=await Sr(r),n=await Y.readFile(i.registryFile,"utf-8"),o$1=o.safeParse(JSON.parse(n));o$1.success||(s.error(`Invalid registry file found at ${d.info(i.registryFile)}.`),process.exit(1));let a=t("Building registry...");for(let s$1 of o$1.data.items){a.start(`Building ${s$1.name}...`),s$1.$schema="https://ui.shadcn.com/schema/registry-item.json";for(let m of s$1.files??[])m.content=await Y.readFile(j.resolve(i.cwd,m.path),"utf-8");let c=n$1.safeParse(s$1);if(!c.success){s.error(`Invalid registry item found for ${d.info(s$1.name)}.`);continue}await 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){s.break(),Y$1(r);}});var Ir="https://ui.shadcn.com",hn={next:"Next.js",vite:"Vite",start:"TanStack Start"},kr=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=Pr();s.log("Build your own shadcn/ui."),s.log(`You will be taken to ${d.info(w)} to build your custom design system.`),s.break();let{proceed:h}=await Fe({type:"confirm",name:"proceed",message:"Open in browser?",initial:!0});h&&await Cr(w),process.exit(0);}let i=e;if(!i){let{enteredName:w}=await Fe({type:"text",name:"enteredName",message:"What is your project named?",initial:t.template?`${t.template}-app`:"my-app",format:h=>h.trim(),validate:h=>gn(j__default.basename(j__default.resolve(h))).validForNewPackages?!0:"Invalid project name. Name should be lowercase, URL-friendly, and not start with a period or underscore."});w||process.exit(0),i=w;}let n=t.template;if(!n){let{selectedTemplate:w}=await Fe({type:"select",name:"selectedTemplate",message:`Which ${d.info("template")} would you like to use?`,choices:Object.entries(hn).map(([h,b])=>({title:b,value:h}))});w||process.exit(0),n=w;}let o=await yn(t.preset??!0);o||process.exit(0);let a,s$1;"_isUrl"in o?(a=o.url,s$1=new URL(o.url).searchParams.get("baseColor")??"neutral"):(a=wn(o),s$1=o.baseColor);let c=O({}),{config:m}=await T([a],c,{silent:!0});c=m;let[l]=await _([a],{config:c}),p;l?.type==="registry:base"&&l.config&&(p=l.config);let u=nt.parse({cwd:j__default.resolve(t.cwd),name:i,components:[a],yes:t.yes,defaults:!1,force:!1,silent:!1,isNewProject:!0,srcDir:t.srcDir,cssVariables:!0,template:n,baseColor:s$1,baseStyle:!1,registryBaseConfig:p,skipPreflight:!1}),g=await me(u);if(g){await ie(["component-example"],g,{baseStyle:!1,silent:!0,overwrite:!0});let w=bn(n);w.length>0&&await K(w,g,{overwrite:!0,silent:!0});}s.log(`${d.success("Success!")} Project initialization completed.
55
+ You may now add components.`),s.break();}catch(r){s.break(),Y$1(r);}finally{P();}});function wn(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 `${xn()}?${t.toString()}`}async function yn(e){if(e===true){let t=await ka(),{selectedPreset:r}=await Fe({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=Pr();return s.info(`
56
56
  Opening ${d.info(i)} in your browser...
57
- `),await Rr(i),null}return t.find(i=>i.name===r)??null}if(typeof e=="string"){if(M(e))return {_isUrl:true,url:e};let t=await la(e);if(!t){let i=(await ka()).map(n=>n.name).join(", ");s.error(`Preset "${e}" not found. Available presets: ${i}`),process.exit(1);}return t}return null}function yn(e){switch(e){case "vite":return [{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:at`import { ComponentExample } from "@/components/component-example";
57
+ `),await Cr(i),null}return t.find(i=>i.name===r)??null}if(typeof e=="string"){if(M(e))return {_isUrl:true,url:e};let t=await la(e);if(!t){let i=(await ka()).map(n=>n.name).join(", ");s.error(`Preset "${e}" not found. Available presets: ${i}`),process.exit(1);}return t}return null}function bn(e){switch(e){case "vite":return [{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:ct`import { ComponentExample } from "@/components/component-example";
58
58
 
59
59
  export function App() {
60
60
  return <ComponentExample />;
61
61
  }
62
62
 
63
63
  export default App;
64
- `}];case "next":return [{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:at`import { ComponentExample } from "@/components/component-example";
64
+ `}];case "next":return [{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:ct`import { ComponentExample } from "@/components/component-example";
65
65
 
66
66
  export default function Page() {
67
67
  return <ComponentExample />;
68
68
  }
69
- `}];case "start":return [{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:at`import { createFileRoute } from "@tanstack/react-router";
69
+ `}];case "start":return [{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:ct`import { createFileRoute } from "@tanstack/react-router";
70
70
  import { ComponentExample } from "@/components/component-example";
71
71
 
72
72
  export const Route = createFileRoute("/")({ component: App });
@@ -76,18 +76,18 @@ function App() {
76
76
  <ComponentExample />
77
77
  );
78
78
  }
79
- `}];default:return []}}function kr(){return `${Cr}/create`}function bn(){return `${Cr}/init`}var Rn=z$1.object({component:z$1.string().optional(),yes:z$1.boolean(),cwd:z$1.string(),path:z$1.string().optional()}),Er=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=Rn.parse({component:e,...t}),i$1=E__default.resolve(r.cwd);existsSync(i$1)||(s.error(`The path ${i$1} does not exist. Please try again.`),process.exit(1));let n=await i(i$1);n||(s.warn(`Configuration is missing. Please run ${d.success("init")} to create a components.json file.`),process.exit(1));let o=await ba();if(o||(Y$1(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let c=n.resolvedPaths.components,m=o.filter(p=>{for(let u of p.files??[]){let g=E__default.resolve(c,typeof u=="string"?u:u.path);if(existsSync(g))return !0}return !1}),l=[];for(let p of m){let u=await Pr(p,n);u.length&&l.push({name:p.name,changes:u});}l.length||(s.info("No updates found."),process.exit(0)),s.info("The following components have updates available:");for(let p of l){s.info(`- ${p.name}`);for(let u of p.changes)s.info(` - ${u.filePath}`);}s.break(),s.info(`Run ${d.success("diff <component>")} to see the changes.`),process.exit(0);}let a=o.find(c=>c.name===r.component);a||(s.error(`The component ${d.success(r.component)} does not exist.`),process.exit(1));let s$1=await Pr(a,n);s$1.length||(s.info(`No updates found for ${r.component}.`),process.exit(0));for(let c of s$1)s.info(`- ${c.filePath}`),await Cn(c.patch),s.info("");}catch(r){Y$1(r);}});async function Pr(e,t){let r=await ha(t.style,[e]),i=await fa(t.tailwind.baseColor);if(!r)return [];let n=[];for(let o of r){let a=await ia(t,o);if(a)for(let s of o.files??[]){let c=E__default.resolve(a,typeof s=="string"?s:s.path);if(!existsSync(c))continue;let m=await promises.readFile(c,"utf8");if(typeof s=="string"||!s.content)continue;let l=await J({filename:s.path,raw:s.content,config:t,baseColor:i}),p=diffLines(l,m);p.length>1&&n.push({filePath:c,patch:p});}}return n}async function Cn(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 jr=new Command().name("info").description("get information about your project").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{try{s.info("> project info"),console.log(await p(e.cwd)),s.break(),s.info("> components.json"),console.log(await i(e.cwd));}catch(t){Y$1(t);}});var fe="latest",De=[{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
+ `}];default:return []}}function Pr(){return `${Ir}/create`}function xn(){return `${Ir}/init`}var Cn=z$1.object({component:z$1.string().optional(),yes:z$1.boolean(),cwd:z$1.string(),path:z$1.string().optional()}),Er=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=Cn.parse({component:e,...t}),i$1=j__default.resolve(r.cwd);existsSync(i$1)||(s.error(`The path ${i$1} does not exist. Please try again.`),process.exit(1));let n=await i(i$1);n||(s.warn(`Configuration is missing. Please run ${d.success("init")} to create a components.json file.`),process.exit(1));let o=await ba();if(o||(Y$1(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let c=n.resolvedPaths.components,m=o.filter(p=>{for(let u of p.files??[]){let g=j__default.resolve(c,typeof u=="string"?u:u.path);if(existsSync(g))return !0}return !1}),l=[];for(let p of m){let u=await jr(p,n);u.length&&l.push({name:p.name,changes:u});}l.length||(s.info("No updates found."),process.exit(0)),s.info("The following components have updates available:");for(let p of l){s.info(`- ${p.name}`);for(let u of p.changes)s.info(` - ${u.filePath}`);}s.break(),s.info(`Run ${d.success("diff <component>")} to see the changes.`),process.exit(0);}let a=o.find(c=>c.name===r.component);a||(s.error(`The component ${d.success(r.component)} does not exist.`),process.exit(1));let s$1=await jr(a,n);s$1.length||(s.info(`No updates found for ${r.component}.`),process.exit(0));for(let c of s$1)s.info(`- ${c.filePath}`),await In(c.patch),s.info("");}catch(r){Y$1(r);}});async function jr(e,t){let r=await ha(t.style,[e]),i=await fa(t.tailwind.baseColor);if(!r)return [];let n=[];for(let o of r){let a=await ia(t,o);if(a)for(let s of o.files??[]){let c=j__default.resolve(a,typeof s=="string"?s:s.path);if(!existsSync(c))continue;let m=await promises.readFile(c,"utf8");if(typeof s=="string"||!s.content)continue;let l=await J({filename:s.path,raw:s.content,config:t,baseColor:i}),p=diffLines(l,m);p.length>1&&n.push({filePath:c,patch:p});}}return n}async function In(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 $r=new Command().name("info").description("get information about your project").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{try{s.info("> project info"),console.log(await p(e.cwd)),s.break(),s.info("> components.json"),console.log(await i(e.cwd));}catch(t){Y$1(t);}});var oe="latest",De=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${oe}`,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${oe}`,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{shadcn:{command:"npx",args:[`shadcn@${oe}`,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.shadcn]
80
80
  command = "npx"
81
- args = ["shadcn@${fe}", "mcp"]
82
- `}],Ae=[`shadcn@${fe}`],ft=new Command().name("mcp").description("MCP server and configuration commands").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{try{await B(e.cwd);let t=new StdioServerTransport;await b$1.connect(t);}catch(t){s.break(),Y$1(t);}}),Nn=mt.object({client:mt.enum(["claude","cursor","vscode","codex"]),cwd:mt.string()});ft.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${De.map(e=>e.name).join(", ")})`).action(async(e,t$1)=>{try{let i$1=(t$1.parent?.opts()||{}).cwd||process.cwd(),n=e.client;if(!n){let m=await Fe({type:"select",name:"client",message:"Which MCP client are you using?",choices:De.map(l=>({title:l.label,value:l.name}))});m.client||(s.break(),process.exit(1)),n=m.client;}let o=Nn.parse({client:n,cwd:i$1}),a=await i(o.cwd);if(o.client==="codex"){if(a)await z([],Ae,a,{silent:!1});else {let m=await a$1(o.cwd),l=m==="npm"?"install":"add",p=m==="npm"?"--save-dev":"-D",u=t("Installing dependencies...").start();await execa(m,[l,p,...Ae],{cwd:o.cwd}),u.succeed("Installing dependencies.");}s.break(),s.log("To configure the shadcn MCP server in Codex:"),s.break(),s.log(`1. Open or create the file ${d.info("~/.codex/config.toml")}`),s.log("2. Add the following configuration:"),s.log(),s.info(`[mcp_servers.shadcn]
81
+ args = ["shadcn@${oe}", "mcp"]
82
+ `},{name:"opencode",label:"OpenCode",configPath:"opencode.json",config:{$schema:"https://opencode.ai/config.json",mcp:{shadcn:{type:"local",command:["npx",`shadcn@${oe}`,"mcp"],enabled:true}}}}],Ae=[`shadcn@${oe}`],pt=new Command().name("mcp").description("MCP server and configuration commands").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{try{await B(e.cwd);let t=new StdioServerTransport;await b$1.connect(t);}catch(t){s.break(),Y$1(t);}}),On=ft.object({client:ft.enum(["claude","cursor","vscode","codex","opencode"]),cwd:ft.string()});pt.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${De.map(e=>e.name).join(", ")})`).action(async(e,t$1)=>{try{let i$1=(t$1.parent?.opts()||{}).cwd||process.cwd(),n=e.client;if(!n){let m=await Fe({type:"select",name:"client",message:"Which MCP client are you using?",choices:De.map(l=>({title:l.label,value:l.name}))});m.client||(s.break(),process.exit(1)),n=m.client;}let o=On.parse({client:n,cwd:i$1}),a=await i(o.cwd);if(o.client==="codex"){if(a)await z([],Ae,a,{silent:!1});else {let m=await a$1(o.cwd),l=m==="npm"?"install":"add",p=m==="npm"?"--save-dev":"-D",u=t("Installing dependencies...").start();await execa(m,[l,p,...Ae],{cwd:o.cwd}),u.succeed("Installing dependencies.");}s.break(),s.log("To configure the shadcn MCP server in Codex:"),s.break(),s.log(`1. Open or create the file ${d.info("~/.codex/config.toml")}`),s.log("2. Add the following configuration:"),s.log(),s.info(`[mcp_servers.shadcn]
83
83
  command = "npx"
84
- args = ["shadcn@${fe}", "mcp"]`),s.break(),s.info("3. Restart Codex to load the MCP server"),s.break(),process.exit(0);}let s$1=t("Configuring MCP server...").start(),c=await Tn(o);if(s$1.succeed("Configuring MCP server."),a)await z([],Ae,a,{silent:!1});else {let m=await a$1(o.cwd),l=m==="npm"?"install":"add",p=m==="npm"?"--save-dev":"-D",u=t("Installing dependencies...").start();await execa(m,[l,p,...Ae],{cwd:o.cwd}),u.succeed("Installing dependencies.");}s.break(),s.success(`Configuration saved to ${c}.`),s.break();}catch(r){Y$1(r);}});var On=(e,t)=>t;async function Tn(e){let{client:t,cwd:r}=e,i=De.find(c=>c.name===t);if(!i)throw new Error(`Unknown client: ${t}. Available clients: ${De.map(c=>c.name).join(", ")}`);let n=E__default.join(r,i.configPath),o=E__default.dirname(n);await R.ensureDir(o);let a={};try{let c=await promises.readFile(n,"utf-8");a=JSON.parse(c);}catch{}let s=fr(a,i.config,{arrayMerge:On});return await promises.writeFile(n,JSON.stringify(s,null,2)+`
85
- `,"utf-8"),i.configPath}var H={lucide:{name:"lucide-react",package:"lucide-react",import:"lucide-react"},radix:{name:"@radix-ui/react-icons",package:"@radix-ui/react-icons",import:"@radix-ui/react-icons"}};async function Fr(e){if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let t$1=e.resolvedPaths.ui,[r,i]=await Promise.all([Dn("**/*.{js,ts,jsx,tsx}",{cwd:t$1}),da()]);if(Object.keys(i).length===0)throw new Error("Something went wrong fetching the registry icons.");let n=Object.entries(H).map(([l,p])=>({title:p.name,value:l})),o=await Fe([{type:"select",name:"sourceLibrary",message:`Which icon library would you like to ${d.info("migrate from")}?`,choices:n},{type:"select",name:"targetLibrary",message:`Which icon library would you like to ${d.info("migrate to")}?`,choices:n}]);if(o.sourceLibrary===o.targetLibrary)throw new Error("You cannot migrate to the same icon library. Please choose a different icon library.");if(!(o.sourceLibrary in H&&o.targetLibrary in H))throw new Error("Invalid icon library. Please choose a valid icon library.");let a=H[o.sourceLibrary],s$1=H[o.targetLibrary],{confirm:c}=await Fe({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${d.info(r.length)} files in ${d.info(`./${E__default.relative(e.resolvedPaths.cwd,t$1)}`)} from ${d.info(a.name)} to ${d.info(s$1.name)}. Continue?`});c||(s.info("Migration cancelled."),process.exit(0)),s$1.package&&await z([s$1.package],[],e,{silent:false});let m=t("Migrating icons...")?.start();await Promise.all(r.map(async l=>{m.text=`Migrating ${l}...`;let p=E__default.join(t$1,l),u=await promises.readFile(p,"utf-8"),g=await Mn(u,o.sourceLibrary,o.targetLibrary,i);await promises.writeFile(p,g);})),m.succeed("Migration complete.");}async function Mn(e,t,r,i){let n=H[t]?.import,o=H[r]?.import,a=await promises.mkdtemp(E__default.join(tmpdir(),"shadcn-")),s=new Project({compilerOptions:{}}),c=E__default.join(a,`shadcn-icons-${randomBytes(4).toString("hex")}.tsx`),m=s.createSourceFile(c,e,{scriptKind:ScriptKind.TSX}),l=[];for(let p of m.getImportDeclarations()??[])if(p.getModuleSpecifier()?.getText()===`"${n}"`){for(let u of p.getNamedImports()??[]){let g=u.getName(),w=Object.values(i).find(h=>h[t]===g)?.[r];!w||l.includes(w)||(l.push(w),u.remove(),m.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).filter(h=>h.getTagNameNode()?.getText()===g).forEach(h=>h.getTagNameNode()?.replaceWithText(w)));}p.getNamedImports()?.length===0&&p.remove();}return l.length>0&&m.addImportDeclaration({moduleSpecifier:o,namedImports:l.map(p=>({name:p}))}),await m.getText()}function Bn(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function Un(e,t,r,i){let o=e.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").trim().split(",").map(a=>a.trim()).filter(Boolean);for(let a of o){let s=a.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?$/),c=a.match(/^(\w+)\s+as\s+(\w+)$/);if(s){let m=s[1],l=s[2];i==="slot"&&m==="Slot"&&!l?r.push({name:"Slot",alias:"SlotPrimitive",isType:true}):r.push({name:m,alias:l,isType:true});}else if(c){let m=c[1],l=c[2];i==="slot"&&m==="Slot"&&l==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:m,alias:l,isType:t});}else i==="slot"&&a==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:a,isType:t});}}async function Ar(e,t$1={}){if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let r=e.resolvedPaths.ui,i=await Dn("**/*.{js,ts,jsx,tsx}",{cwd:r});if(!t$1.yes){let{confirm:s$1}=await Fe({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${d.info(i.length)} files in ${d.info(`./${E__default.relative(e.resolvedPaths.cwd,r)}`)} to ${d.info("radix-ui")}. Continue?`});s$1||(s.info("Migration cancelled."),process.exit(0));}let n=t("Migrating imports...")?.start(),o=new Set;await Promise.all(i.map(async s=>{n.text=`Migrating ${s}...`;let c=E__default.join(r,s),m=await promises.readFile(c,"utf-8"),{content:l,replacedPackages:p}=await Gn(m);p.forEach(u=>o.add(u)),await promises.writeFile(c,l);})),n.succeed("Migrating imports.");let a=t("Updating package.json...")?.start();try{let s$1=o$1(e.resolvedPaths.cwd,!1);if(!s$1){a.fail("Could not read package.json"),s.warn("Could not update package.json. You may need to manually replace @radix-ui/react-* packages with radix-ui");return}let c=Array.from(o),m=["dependencies","devDependencies"];for(let l of m)if(s$1[l])for(let p of c)s$1[l][p]&&delete s$1[l][p];if(c.length>0){s$1.dependencies||(s$1.dependencies={}),s$1.dependencies["radix-ui"]="latest";let l=E__default.join(e.resolvedPaths.cwd,"package.json");await promises.writeFile(l,JSON.stringify(s$1,null,2)+`
86
- `),a.succeed("Updated package.json."),await z(["radix-ui"],[],e,{silent:!1});}else a.succeed("No packages found in source files.");}catch{a.fail("Failed to update package.json"),s.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui");}}async function Gn(e){let t=/import\s+(?:(type)\s+)?(?:\*\s+as\s+(\w+)|{([^}]+)})\s+from\s+(["'])@radix-ui\/react-([^"']+)\4(;?)/g,r=[],i=[],n=[],o='"',a=false,s=e,c;for(;(c=t.exec(e))!==null;){let[w,h,x,S,M,F,X]=c;if(F==="icons"||F.startsWith("icons/"))continue;i.push(w),i.length===1&&(o=M,a=X===";"),n.push(`@radix-ui/react-${F}`);let A=!!h;if(x){let Le=Bn(F);r.push({name:Le,alias:x,isType:A});}else S&&Un(S,A,r,F);}if(r.length===0)return {content:e,replacedPackages:[]};let m=r.filter((w,h,x)=>h===x.findIndex(S=>S.name===w.name&&S.alias===w.alias&&S.isType===w.isType)),p=`import { ${m.map(w=>{let h=w.isType?"type ":"";return w.alias?`${h}${w.name} as ${w.alias}`:`${h}${w.name}`}).join(", ")} } from ${o}radix-ui${o}${a?";":""}`;s=i.reduce((w,h,x)=>w.replace(h,x===0?p:""),s),s=s.replace(/\n\s*\n\s*\n/g,`
84
+ args = ["shadcn@${oe}", "mcp"]`),s.break(),s.info("3. Restart Codex to load the MCP server"),s.break(),process.exit(0);}let s$1=t("Configuring MCP server...").start(),c=await Fn(o);if(s$1.succeed("Configuring MCP server."),a)await z([],Ae,a,{silent:!1});else {let m=await a$1(o.cwd),l=m==="npm"?"install":"add",p=m==="npm"?"--save-dev":"-D",u=t("Installing dependencies...").start();await execa(m,[l,p,...Ae],{cwd:o.cwd}),u.succeed("Installing dependencies.");}s.break(),s.success(`Configuration saved to ${c}.`),s.break();}catch(r){Y$1(r);}});var Tn=(e,t)=>t;async function Fn(e){let{client:t,cwd:r}=e,i=De.find(c=>c.name===t);if(!i)throw new Error(`Unknown client: ${t}. Available clients: ${De.map(c=>c.name).join(", ")}`);let n=j__default.join(r,i.configPath),o=j__default.dirname(n);await R.ensureDir(o);let a={};try{let c=await promises.readFile(n,"utf-8");a=JSON.parse(c);}catch{}let s=pr(a,i.config,{arrayMerge:Tn});return await promises.writeFile(n,JSON.stringify(s,null,2)+`
85
+ `,"utf-8"),i.configPath}var H={lucide:{name:"lucide-react",package:"lucide-react",import:"lucide-react"},radix:{name:"@radix-ui/react-icons",package:"@radix-ui/react-icons",import:"@radix-ui/react-icons"}};async function Ar(e){if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let t$1=e.resolvedPaths.ui,[r,i]=await Promise.all([_n("**/*.{js,ts,jsx,tsx}",{cwd:t$1}),da()]);if(Object.keys(i).length===0)throw new Error("Something went wrong fetching the registry icons.");let n=Object.entries(H).map(([l,p])=>({title:p.name,value:l})),o=await Fe([{type:"select",name:"sourceLibrary",message:`Which icon library would you like to ${d.info("migrate from")}?`,choices:n},{type:"select",name:"targetLibrary",message:`Which icon library would you like to ${d.info("migrate to")}?`,choices:n}]);if(o.sourceLibrary===o.targetLibrary)throw new Error("You cannot migrate to the same icon library. Please choose a different icon library.");if(!(o.sourceLibrary in H&&o.targetLibrary in H))throw new Error("Invalid icon library. Please choose a valid icon library.");let a=H[o.sourceLibrary],s$1=H[o.targetLibrary],{confirm:c}=await Fe({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${d.info(r.length)} files in ${d.info(`./${j__default.relative(e.resolvedPaths.cwd,t$1)}`)} from ${d.info(a.name)} to ${d.info(s$1.name)}. Continue?`});c||(s.info("Migration cancelled."),process.exit(0)),s$1.package&&await z([s$1.package],[],e,{silent:false});let m=t("Migrating icons...")?.start();await Promise.all(r.map(async l=>{m.text=`Migrating ${l}...`;let p=j__default.join(t$1,l),u=await promises.readFile(p,"utf-8"),g=await Wn(u,o.sourceLibrary,o.targetLibrary,i);await promises.writeFile(p,g);})),m.succeed("Migration complete.");}async function Wn(e,t,r,i){let n=H[t]?.import,o=H[r]?.import,a=await promises.mkdtemp(j__default.join(tmpdir(),"shadcn-")),s=new Project({compilerOptions:{}}),c=j__default.join(a,`shadcn-icons-${randomBytes(4).toString("hex")}.tsx`),m=s.createSourceFile(c,e,{scriptKind:ScriptKind.TSX}),l=[];for(let p of m.getImportDeclarations()??[])if(p.getModuleSpecifier()?.getText()===`"${n}"`){for(let u of p.getNamedImports()??[]){let g=u.getName(),w=Object.values(i).find(h=>h[t]===g)?.[r];!w||l.includes(w)||(l.push(w),u.remove(),m.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).filter(h=>h.getTagNameNode()?.getText()===g).forEach(h=>h.getTagNameNode()?.replaceWithText(w)));}p.getNamedImports()?.length===0&&p.remove();}return l.length>0&&m.addImportDeclaration({moduleSpecifier:o,namedImports:l.map(p=>({name:p}))}),await m.getText()}function Un(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function Gn(e,t,r,i){let o=e.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").trim().split(",").map(a=>a.trim()).filter(Boolean);for(let a of o){let s=a.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?$/),c=a.match(/^(\w+)\s+as\s+(\w+)$/);if(s){let m=s[1],l=s[2];i==="slot"&&m==="Slot"&&!l?r.push({name:"Slot",alias:"SlotPrimitive",isType:true}):r.push({name:m,alias:l,isType:true});}else if(c){let m=c[1],l=c[2];i==="slot"&&m==="Slot"&&l==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:m,alias:l,isType:t});}else i==="slot"&&a==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:a,isType:t});}}async function Dr(e,t$1={}){if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let r=e.resolvedPaths.ui,i=await _n("**/*.{js,ts,jsx,tsx}",{cwd:r});if(!t$1.yes){let{confirm:s$1}=await Fe({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${d.info(i.length)} files in ${d.info(`./${j__default.relative(e.resolvedPaths.cwd,r)}`)} to ${d.info("radix-ui")}. Continue?`});s$1||(s.info("Migration cancelled."),process.exit(0));}let n=t("Migrating imports...")?.start(),o=new Set;await Promise.all(i.map(async s=>{n.text=`Migrating ${s}...`;let c=j__default.join(r,s),m=await promises.readFile(c,"utf-8"),{content:l,replacedPackages:p}=await Jn(m);p.forEach(u=>o.add(u)),await promises.writeFile(c,l);})),n.succeed("Migrating imports.");let a=t("Updating package.json...")?.start();try{let s$1=o$1(e.resolvedPaths.cwd,!1);if(!s$1){a.fail("Could not read package.json"),s.warn("Could not update package.json. You may need to manually replace @radix-ui/react-* packages with radix-ui");return}let c=Array.from(o),m=["dependencies","devDependencies"];for(let l of m)if(s$1[l])for(let p of c)s$1[l][p]&&delete s$1[l][p];if(c.length>0){s$1.dependencies||(s$1.dependencies={}),s$1.dependencies["radix-ui"]="latest";let l=j__default.join(e.resolvedPaths.cwd,"package.json");await promises.writeFile(l,JSON.stringify(s$1,null,2)+`
86
+ `),a.succeed("Updated package.json."),await z(["radix-ui"],[],e,{silent:!1});}else a.succeed("No packages found in source files.");}catch{a.fail("Failed to update package.json"),s.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui");}}async function Jn(e){let t=/import\s+(?:(type)\s+)?(?:\*\s+as\s+(\w+)|{([^}]+)})\s+from\s+(["'])@radix-ui\/react-([^"']+)\4(;?)/g,r=[],i=[],n=[],o='"',a=false,s=e,c;for(;(c=t.exec(e))!==null;){let[w,h,b,v,M,F,X]=c;if(F==="icons"||F.startsWith("icons/"))continue;i.push(w),i.length===1&&(o=M,a=X===";"),n.push(`@radix-ui/react-${F}`);let A=!!h;if(b){let Le=Un(F);r.push({name:Le,alias:b,isType:A});}else v&&Gn(v,A,r,F);}if(r.length===0)return {content:e,replacedPackages:[]};let m=r.filter((w,h,b)=>h===b.findIndex(v=>v.name===w.name&&v.alias===w.alias&&v.isType===w.isType)),p=`import { ${m.map(w=>{let h=w.isType?"type ":"";return w.alias?`${h}${w.name} as ${w.alias}`:`${h}${w.name}`}).join(", ")} } from ${o}radix-ui${o}${a?";":""}`;s=i.reduce((w,h,b)=>w.replace(h,b===0?p:""),s),s=s.replace(/\n\s*\n\s*\n/g,`
87
87
 
88
88
  `),m.some(w=>w.name==="Slot"&&w.alias==="SlotPrimitive")&&(s=s.split(`
89
- `).map(x=>{if(x.trim().startsWith("import "))return x;let S=x;return S=S.replace(/\b(asChild\s*\?\s*)Slot(\s*:)/g,"$1__SLOT_PLACEHOLDER__$2"),S=S.replace(/\bReact\.ComponentProps<typeof\s+Slot>/g,"React.ComponentProps<typeof __SLOT_PLACEHOLDER__>"),S=S.replace(/\bComponentProps<typeof\s+Slot>/g,"ComponentProps<typeof __SLOT_PLACEHOLDER__>"),S=S.replace(/(<\/?)Slot(\s*\/?>)/g,"$1__SLOT_PLACEHOLDER__$2"),S=S.replace(/\bSlot\b/g,(M,F,X)=>{let A=X.substring(0,F),Le=(A.match(/"/g)||[]).length,Xr=(A.match(/'/g)||[]).length;return Le%2!==0||Xr%2!==0?M:"__SLOT_PLACEHOLDER__"}),S=S.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),S}).join(`
90
- `));let g=Array.from(new Set(n));return {content:s,replacedPackages:g}}async function _r(e){let t={};if(!R.existsSync(e.cwd)||!R.existsSync(E__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!R.existsSync(E__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,config:null};try{let r=await i(e.cwd);return {errors:t,config:r}}catch{s.break(),s.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e.cwd)}.
91
- Before you can run a migration, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),s.error(`Learn more at ${d.info("https://ui.shadcn.com/docs/components-json")}.`),s.break(),process.exit(1);}}var Lr=[{name:"icons",description:"migrate your ui components to a different icon library."},{name:"radix",description:"migrate to radix-ui."}],Kn=z$1.object({cwd:z$1.string(),list:z$1.boolean(),yes:z$1.boolean(),migration:z$1.string().refine(e=>e&&Lr.some(t=>t.name===e),{message:"You must specify a valid migration. Run `shadcn migrate --list` to see available migrations."}).optional()}),Vr=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=Kn.parse({cwd:E__default.resolve(t.cwd),migration:e,list:t.list,yes:t.yes});if(r.list||!r.migration){s.info("Available migrations:");for(let o of Lr)s.info(`- ${o.name}: ${o.description}`);return}if(!r.migration)throw new Error("You must specify a migration. Run `shadcn migrate --list` to see available migrations.");let{errors:i,config:n}=await _r(r);if(i["1"]||i["3"])throw new Error("No `components.json` file found. Ensure you are at the root of your project.");if(!n)throw new Error("Something went wrong reading your `components.json` file. Please ensure you have a valid `components.json` file.");r.migration==="icons"&&await Fr(n),r.migration==="radix"&&await Ar(n,{yes:r.yes});}catch(r){s.break(),Y$1(r);}});async function Mr(e){let t={},r={cwd:e.cwd,registryFile:E__default.resolve(e.cwd,e.registryFile),outputDir:E__default.resolve(e.cwd,e.outputDir)};if(!R.existsSync(r.registryFile))return t["13"]=true,{errors:t,resolvePaths:null,config:null};if(!R.existsSync(E__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,resolvePaths:null,config:null};await R.mkdir(r.outputDir,{recursive:true});try{let i$1=await i(e.cwd);return {errors:t,config:i$1,resolvePaths:r}}catch{s.break(),s.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e.cwd)}.
92
- Before you can build the registry, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),s.break(),process.exit(1);}}var Hn=z$1.object({cwd:z$1.string(),registryFile:z$1.string(),outputDir:z$1.string(),verbose:z$1.boolean().optional().default(false)}),Wr=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 Xn({cwd:E.resolve(t.cwd),registryFile:e,outputDir:t.output,verbose:t.verbose});});async function Xn(e){try{let t$1=Hn.parse(e),[{errors:r,resolvePaths:i,config:n},o$1]=await Promise.all([Mr(t$1),p(t$1.cwd)]);(r["3"]||!n||!o$1)&&(s.error(`A ${d.info("components.json")} file is required to build the registry. Run ${d.info("shadcn init")} to create one.`),s.break(),process.exit(1)),(r["13"]||!i)&&(s.error(`We could not find a registry file at ${d.info(E.resolve(t$1.cwd,t$1.registryFile))}.`),s.break(),process.exit(1));let a=await Y.readFile(i.registryFile,"utf-8"),s$1=o.safeParse(JSON.parse(a));s$1.success||(s.error(`Invalid registry file found at ${d.info(i.registryFile)}.`),s.break(),process.exit(1));let c=t("Building registry..."),m=await Qn(s$1.data,n,o$1);for(let l of m.items)l.files=l.files?.filter((p,u,g)=>u===g.findIndex(w=>w.path===p.path)),l.dependencies&&(l.dependencies=l.dependencies.filter((p,u,g)=>u===g.findIndex(w=>w===p)));for(let l of m.items){if(!l.files)continue;c.start(`Building ${l.name}...`),l.$schema="https://ui.shadcn.com/schema/registry-item.json";for(let u of l.files){let g=E.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(l);if(!p.success){s.error(`Invalid registry item found for ${d.info(l.name)}.`);continue}await Y.writeFile(E.resolve(i.outputDir,`${p.data.name}.json`),JSON.stringify(p.data,null,2));}if(await Y.copyFile(i.registryFile,E.resolve(i.outputDir,"registry.json")),c.succeed("Building registry."),t$1.verbose){t(`The registry has ${d.info(m.items.length.toString())} items:`).succeed();for(let l of m.items){s.log(` - ${l.name} (${d.info(l.type)})`);for(let p of l.files??[])s.log(` - ${p.path}`);}}}catch(t){s.break(),Y$1(t);}}async function Qn(e,t,r){for(let i of e.items)if(i.files?.length)for(let n of i.files){let o=await L$1(n.path,t,r);o.files=o.files?.filter(a=>a.path!==n.path),o.files&&i.files.push(...o.files),o.dependencies&&(i.dependencies=i.dependencies?i.dependencies.concat(o.dependencies):o.dependencies);}return e}var zr=new Command().name("registry:mcp").description("starts the registry MCP server [DEPRECATED]").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async()=>{s.warn(`The ${d.info("shadcn registry:mcp")} command is deprecated. Use the ${d.info("shadcn mcp")} command instead.`),s.break();});var to=z$1.object({cwd:z$1.string(),query:z$1.string().optional(),limit:z$1.number().optional(),offset:z$1.number().optional()}),Gr=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=to.parse({cwd:E__default.resolve(t.cwd),query:t.query,limit:t.limit?parseInt(t.limit,10):void 0,offset:t.offset?parseInt(t.offset,10):void 0});await B(r.cwd);let i$1=n({style:"new-york",resolvedPaths:{cwd:r.cwd}}),n$1=O(i$1),o=E__default.resolve(r.cwd,"components.json");if(R.existsSync(o)){let l=await R.readJson(o),p=c.partial().parse(l);n$1=O({...i$1,...p});}let a=n$1;try{let l=await i(r.cwd);l&&(a=O(l));}catch{}let{config:s,newRegistries:c$1}=await T(e.map(l=>`${l}/registry`),a,{silent:!0,writeFile:!1});c$1.length>0&&(a.registries=s.registries),Q(e,a);let m=await ma(e,{query:r.query,limit:r.limit,offset:r.offset,config:a});console.log(JSON.stringify(m,null,2)),process.exit(0);}catch(r){Y$1(r);}finally{P();}});var io=z$1.object({cwd:z$1.string()}),qr=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=io.parse({cwd:E__default.resolve(t.cwd)});await B(r.cwd);let i$1=O({}),n=E__default.resolve(r.cwd,"components.json");if(R.existsSync(n)){let m=await R.readJson(n),l=c.partial().parse(m);i$1=O(l);}let o=i$1;try{let m=await i(r.cwd);m&&(o=O(m));}catch{}let{config:a,newRegistries:s}=await T(e,o,{silent:!0,writeFile:!1});s.length>0&&(o.registries=a.registries),Q(e,o);let c$1=await _(e,{config:o});console.log(JSON.stringify(c$1,null,2)),process.exit(0);}catch(r){Y$1(r);}finally{P();}});var Hr={version:"3.6.2"};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function so(){let e=new Command().name("shadcn").description("add items from registries to your project").version(Hr.version,"-v, --version","display the version number");e.addCommand(pr).addCommand(Ir).addCommand(yr).addCommand(Er).addCommand(qr).addCommand(Gr).addCommand(Vr).addCommand(jr).addCommand(vr).addCommand(ft),e.addCommand(Wr).addCommand(zr),e.parse();}so();//# sourceMappingURL=index.js.map
89
+ `).map(b=>{if(b.trim().startsWith("import "))return b;let v=b;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),Le=(A.match(/"/g)||[]).length,Qr=(A.match(/'/g)||[]).length;return Le%2!==0||Qr%2!==0?M:"__SLOT_PLACEHOLDER__"}),v=v.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),v}).join(`
90
+ `));let g=Array.from(new Set(n));return {content:s,replacedPackages:g}}async function Lr(e){let t={};if(!R.existsSync(e.cwd)||!R.existsSync(j__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!R.existsSync(j__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,config:null};try{let r=await i(e.cwd);return {errors:t,config:r}}catch{s.break(),s.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e.cwd)}.
91
+ Before you can run a migration, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),s.error(`Learn more at ${d.info("https://ui.shadcn.com/docs/components-json")}.`),s.break(),process.exit(1);}}var Vr=[{name:"icons",description:"migrate your ui components to a different icon library."},{name:"radix",description:"migrate to radix-ui."}],qn=z$1.object({cwd:z$1.string(),list:z$1.boolean(),yes:z$1.boolean(),migration:z$1.string().refine(e=>e&&Vr.some(t=>t.name===e),{message:"You must specify a valid migration. Run `shadcn migrate --list` to see available migrations."}).optional()}),Mr=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=qn.parse({cwd:j__default.resolve(t.cwd),migration:e,list:t.list,yes:t.yes});if(r.list||!r.migration){s.info("Available migrations:");for(let o of Vr)s.info(`- ${o.name}: ${o.description}`);return}if(!r.migration)throw new Error("You must specify a migration. Run `shadcn migrate --list` to see available migrations.");let{errors:i,config:n}=await Lr(r);if(i["1"]||i["3"])throw new Error("No `components.json` file found. Ensure you are at the root of your project.");if(!n)throw new Error("Something went wrong reading your `components.json` file. Please ensure you have a valid `components.json` file.");r.migration==="icons"&&await Ar(n),r.migration==="radix"&&await Dr(n,{yes:r.yes});}catch(r){s.break(),Y$1(r);}});async function Wr(e){let t={},r={cwd:e.cwd,registryFile:j__default.resolve(e.cwd,e.registryFile),outputDir:j__default.resolve(e.cwd,e.outputDir)};if(!R.existsSync(r.registryFile))return t["13"]=true,{errors:t,resolvePaths:null,config:null};if(!R.existsSync(j__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,resolvePaths:null,config:null};await R.mkdir(r.outputDir,{recursive:true});try{let i$1=await i(e.cwd);return {errors:t,config:i$1,resolvePaths:r}}catch{s.break(),s.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e.cwd)}.
92
+ Before you can build the registry, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),s.break(),process.exit(1);}}var Xn=z$1.object({cwd:z$1.string(),registryFile:z$1.string(),outputDir:z$1.string(),verbose:z$1.boolean().optional().default(false)}),zr=new Command().name("registry:build").description("builds the registry [EXPERIMENTAL]").argument("[registry]","path to registry.json file","./registry.json").option("-o, --output <path>","destination directory for json files","./public/r").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-v, --verbose","verbose output").action(async(e,t)=>{await Qn({cwd:j.resolve(t.cwd),registryFile:e,outputDir:t.output,verbose:t.verbose});});async function Qn(e){try{let t$1=Xn.parse(e),[{errors:r,resolvePaths:i,config:n},o$1]=await Promise.all([Wr(t$1),p(t$1.cwd)]);(r["3"]||!n||!o$1)&&(s.error(`A ${d.info("components.json")} file is required to build the registry. Run ${d.info("shadcn init")} to create one.`),s.break(),process.exit(1)),(r["13"]||!i)&&(s.error(`We could not find a registry file at ${d.info(j.resolve(t$1.cwd,t$1.registryFile))}.`),s.break(),process.exit(1));let a=await Y.readFile(i.registryFile,"utf-8"),s$1=o.safeParse(JSON.parse(a));s$1.success||(s.error(`Invalid registry file found at ${d.info(i.registryFile)}.`),s.break(),process.exit(1));let c=t("Building registry..."),m=await Zn(s$1.data,n,o$1);for(let l of m.items)l.files=l.files?.filter((p,u,g)=>u===g.findIndex(w=>w.path===p.path)),l.dependencies&&(l.dependencies=l.dependencies.filter((p,u,g)=>u===g.findIndex(w=>w===p)));for(let l of m.items){if(!l.files)continue;c.start(`Building ${l.name}...`),l.$schema="https://ui.shadcn.com/schema/registry-item.json";for(let u of l.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(l);if(!p.success){s.error(`Invalid registry item found for ${d.info(l.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$1.verbose){t(`The registry has ${d.info(m.items.length.toString())} items:`).succeed();for(let l of m.items){s.log(` - ${l.name} (${d.info(l.type)})`);for(let p of l.files??[])s.log(` - ${p.path}`);}}}catch(t){s.break(),Y$1(t);}}async function Zn(e,t,r){for(let i of e.items)if(i.files?.length)for(let n of i.files){let o=await L$1(n.path,t,r);o.files=o.files?.filter(a=>a.path!==n.path),o.files&&i.files.push(...o.files),o.dependencies&&(i.dependencies=i.dependencies?i.dependencies.concat(o.dependencies):o.dependencies);}return e}var Br=new Command().name("registry:mcp").description("starts the registry MCP server [DEPRECATED]").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async()=>{s.warn(`The ${d.info("shadcn registry:mcp")} command is deprecated. Use the ${d.info("shadcn mcp")} command instead.`),s.break();});var ro=z$1.object({cwd:z$1.string(),query:z$1.string().optional(),limit:z$1.number().optional(),offset:z$1.number().optional()}),Jr=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=ro.parse({cwd:j__default.resolve(t.cwd),query:t.query,limit:t.limit?parseInt(t.limit,10):void 0,offset:t.offset?parseInt(t.offset,10):void 0});await B(r.cwd);let i$1=n({style:"new-york",resolvedPaths:{cwd:r.cwd}}),n$1=O(i$1),o=j__default.resolve(r.cwd,"components.json");if(R.existsSync(o)){let l=await R.readJson(o),p=c.partial().parse(l);n$1=O({...i$1,...p});}let a=n$1;try{let l=await i(r.cwd);l&&(a=O(l));}catch{}let{config:s,newRegistries:c$1}=await T(e.map(l=>`${l}/registry`),a,{silent:!0,writeFile:!1});c$1.length>0&&(a.registries=s.registries),Q(e,a);let m=await ma(e,{query:r.query,limit:r.limit,offset:r.offset,config:a});console.log(JSON.stringify(m,null,2)),process.exit(0);}catch(r){Y$1(r);}finally{P();}});var no=z$1.object({cwd:z$1.string()}),Hr=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=no.parse({cwd:j__default.resolve(t.cwd)});await B(r.cwd);let i$1=O({}),n=j__default.resolve(r.cwd,"components.json");if(R.existsSync(n)){let m=await R.readJson(n),l=c.partial().parse(m);i$1=O(l);}let o=i$1;try{let m=await i(r.cwd);m&&(o=O(m));}catch{}let{config:a,newRegistries:s}=await T(e,o,{silent:!0,writeFile:!1});s.length>0&&(o.registries=a.registries),Q(e,o);let c$1=await _(e,{config:o});console.log(JSON.stringify(c$1,null,2)),process.exit(0);}catch(r){Y$1(r);}finally{P();}});var Xr={version:"3.6.3"};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function ao(){let e=new Command().name("shadcn").description("add items from registries to your project").version(Xr.version,"-v, --version","display the version number");e.addCommand(dr).addCommand(kr).addCommand(br).addCommand(Er).addCommand(Hr).addCommand(Jr).addCommand(Mr).addCommand($r).addCommand(Rr).addCommand(pt),e.addCommand(zr).addCommand(Br),e.parse();}ao();//# sourceMappingURL=index.js.map
93
93
  //# sourceMappingURL=index.js.map