shadcn 3.8.1 → 3.8.2
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 +55 -55
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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-UOTHKX3D.js';import {b,P,o,S,$,t,e,Z,Q,q,j,r,k,u,c as c$1,da,fa,h,i,f,g,s,O,d,ca,a,L,ma,N,na,ia,ga,ja,K,ka,M,R as R$1,oa,la,T
|
|
2
|
+
import {b as b$1,a as a$1}from'./chunk-UOTHKX3D.js';import {b,P,o,S,$,t,e,Z,Q,q,j,r,k,u,c as c$1,da,fa,h,i,f,g,s,O,d,ca,a,L,ma,N,na,ia,ga,ja,K,ka,M,R as R$1,oa,la,T,l,ea,p,G,X,A,Y as Y$1,n as n$1,U as U$1,m,V as V$1,H as H$1,J,I,W}from'./chunk-F67Q5GTR.js';export{ia as fetchTree,ja as getItemTargetPath,na as getPreset,ma as getPresets,ka as getRegistries,ba as getRegistriesConfig,la as getRegistriesIndex,_ as getRegistry,ga as getRegistryBaseColor,fa as getRegistryBaseColors,ea as getRegistryIcons,$ as getRegistryItems,da as getRegistryStyles,ca as getShadcnRegistryIndex,aa as resolveRegistryItems,ha as resolveTree}from'./chunk-F67Q5GTR.js';import {c,o as o$1,n}from'./chunk-BZ3ASCNT.js';import {e as e$1}from'./chunk-VSDIRB3U.js';import'./chunk-RKTXGSVI.js';import*as E from'path';import E__default,{join}from'path';import {promises,existsSync}from'fs';import R from'fs-extra';import S$1 from'postcss';import yi from'postcss/lib/at-rule';import ht,{z}from'zod';import {execa}from'execa';import _e from'prompts';import {SyntaxKind,Project,ScriptKind,VariableDeclarationKind}from'ts-morph';import ot,{tmpdir}from'os';import {Command}from'commander';import Sr from'deepmerge';import*as Y from'fs/promises';import Y__default from'fs/promises';import dt from'dedent';import Tr from'open';import En from'validate-npm-package-name';import {diffLines}from'diff';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {randomBytes}from'crypto';import bt from'fast-glob';async function or(e$1){let t$1={};if(!R.existsSync(e$1.cwd)||!R.existsSync(E__default.resolve(e$1.cwd,"package.json")))return t$1["1"]=true,{errors:t$1,projectInfo:null};let r=u("Preflight checks.",{silent:e$1.silent}).start();R.existsSync(E__default.resolve(e$1.cwd,"components.json"))&&!e$1.force&&(r?.fail(),t.break(),t.error(`A ${e.info("components.json")} file already exists at ${e.info(e$1.cwd)}.
|
|
3
3
|
To start over, remove the ${e.info("components.json")} file and run ${e.info("init")} again.`),t.break(),process.exit(1)),r?.succeed();let i=u("Verifying framework.",{silent:e$1.silent}).start(),n=await q(e$1.cwd);(!n||n?.framework.name==="manual")&&(t$1["7"]=true,i?.fail(),t.break(),n?.framework.links.installation&&t.error(`We could not detect a supported framework at ${e.info(e$1.cwd)}.
|
|
4
4
|
Visit ${e.info(n?.framework.links.installation)} to manually configure your project.
|
|
5
|
-
Once configured, you can use the cli to add components.`),t.break(),process.exit(1)),i?.succeed(`Verifying framework. Found ${e.info(n.framework.label)}.`);let o="Validating Tailwind CSS.";n.tailwindVersion==="v4"&&(o=`Validating Tailwind CSS config. Found ${e.info("v4")}.`);let a=u(o,{silent:e$1.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=u("Validating import alias.",{silent:e$1.silent}).start();return n?.aliasPrefix?s?.succeed():(t$1["6"]=true,s?.fail()),Object.keys(t$1).length>0&&(t$1["5"]&&(t.break(),t.error(`No Tailwind CSS configuration found at ${e.info(e$1.cwd)}.`),t.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),t.error("Install Tailwind CSS then try again."),n?.framework.links.tailwind&&t.error(`Visit ${e.info(n?.framework.links.tailwind)} to get started.`)),t$1["6"]&&(t.break(),t.error("No import alias found in your tsconfig.json file."),n?.framework.links.installation&&t.error(`Visit ${e.info(n?.framework.links.installation)} to learn how to set an import alias.`)),t.break(),process.exit(1)),{errors:t$1,projectInfo:n}}function
|
|
5
|
+
Once configured, you can use the cli to add components.`),t.break(),process.exit(1)),i?.succeed(`Verifying framework. Found ${e.info(n.framework.label)}.`);let o="Validating Tailwind CSS.";n.tailwindVersion==="v4"&&(o=`Validating Tailwind CSS config. Found ${e.info("v4")}.`);let a=u(o,{silent:e$1.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=u("Validating import alias.",{silent:e$1.silent}).start();return n?.aliasPrefix?s?.succeed():(t$1["6"]=true,s?.fail()),Object.keys(t$1).length>0&&(t$1["5"]&&(t.break(),t.error(`No Tailwind CSS configuration found at ${e.info(e$1.cwd)}.`),t.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),t.error("Install Tailwind CSS then try again."),n?.framework.links.tailwind&&t.error(`Visit ${e.info(n?.framework.links.tailwind)} to get started.`)),t$1["6"]&&(t.break(),t.error("No import alias found in your tsconfig.json file."),n?.framework.links.installation&&t.error(`Visit ${e.info(n?.framework.links.installation)} to learn how to set an import alias.`)),t.break(),process.exit(1)),{errors:t$1,projectInfo:n}}function sr(e,t){if(e.includes("\0"))return false;let r;try{r=e;let g="";for(;r!==g&&r.includes("%");)g=r,r=decodeURIComponent(r);}catch{return false}let i=E__default.normalize(r.replace(/\\/g,"/")),n=E__default.normalize(t),o=g=>g.replace(/\[\.\.\..*?\]/g,"").includes("..");if(o(i)||o(r)||o(e))return false;let a=g=>g.replace(/\[\.\.\..*?\]/g,""),s=a(e),c=a(r);if([/\.\.[\/\\]/,/[\/\\]\.\./,/\.\./,/\.\.%/,/\x00/,/[\x01-\x1f]/].some(g=>g.test(s)||g.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 d=E__default.resolve(n,i);return d.startsWith(n+E__default.sep)||d===n}async function Ze(e$1,t,r){if(!t.resolvedPaths.tailwindCss||!e$1||Object.keys(e$1).length===0)return;r={silent:false,...r};let i=t.resolvedPaths.tailwindCss,n=E__default.relative(t.resolvedPaths.cwd,i),o=u(`Updating ${e.info(n)}`,{silent:r.silent}).start(),a=await promises.readFile(i,"utf8"),s=await gi(a,e$1);await promises.writeFile(i,s,"utf8"),o.succeed();}async function gi(e,t){let r=[hi(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
|
|
8
|
-
`,t.insertAfter(
|
|
9
|
-
`}}),
|
|
10
|
-
`}}),t.append(s),t.insertBefore(s,S$1.comment({text:"---break---"})));let c=s.nodes?.find(
|
|
11
|
-
`}}),c.replaceWith(
|
|
12
|
-
`}}),s.append(
|
|
13
|
-
`}});
|
|
14
|
-
`}});if(t.append(c),t.insertBefore(c,S$1.comment({text:"---break---"})),typeof i=="object")for(let[m
|
|
15
|
-
`}});c.append(
|
|
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,
|
|
17
|
-
`}});a.nodes.forEach(c=>{if(c.type==="decl"){let
|
|
18
|
-
`,s.append(
|
|
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,
|
|
20
|
-
`}});i.append(
|
|
7
|
+
`),n=n.trimEnd(),n}function hi(e){return {postcssPlugin:"update-css",Once(t){for(let[r,i]of Object.entries(e))if(r.startsWith("@")){let n=r.match(/@([a-zA-Z-]+)\s*(.*)/);if(!n)continue;let[,o,a]=n;if(o==="import"){if(!t.nodes?.find(c=>c.type==="atrule"&&c.name==="import"&&c.params===a)){let c=S$1.atRule({name:"import",params:a,raws:{semicolon:true}}),l=t.nodes?.filter(m=>m.type==="atrule"&&m.name==="import");if(l&&l.length>0){let m=l[l.length-1];c.raws.before=`
|
|
8
|
+
`,t.insertAfter(m,c);}else !t.nodes||t.nodes.length,c.raws.before="",t.prepend(c);}}else if(o==="plugin"){let s=a;a&&!a.startsWith('"')&&!a.startsWith("'")&&(s=`"${a}"`);let c=m=>m.startsWith('"')&&m.endsWith('"')||m.startsWith("'")&&m.endsWith("'")?m.slice(1,-1):m;if(!t.nodes?.find(m=>m.type!=="atrule"||m.name!=="plugin"?false:c(m.params)===c(a))){let m=S$1.atRule({name:"plugin",params:s,raws:{semicolon:true,before:`
|
|
9
|
+
`}}),d=t.nodes?.filter(w=>w.type==="atrule"&&w.name==="import"),g=t.nodes?.filter(w=>w.type==="atrule"&&w.name==="plugin");if(g&&g.length>0){let w=g[g.length-1];t.insertAfter(w,m);}else if(d&&d.length>0){let w=d[d.length-1];t.insertAfter(w,m),t.insertBefore(m,S$1.comment({text:"---break---"})),t.insertAfter(m,S$1.comment({text:"---break---"}));}else t.prepend(m),t.insertBefore(m,S$1.comment({text:"---break---"})),t.insertAfter(m,S$1.comment({text:"---break---"}));}}else if(typeof i=="object"&&Object.keys(i).length===0){if(!t.nodes?.find(c=>c.type==="atrule"&&c.name===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(m=>m.type==="atrule"&&m.name==="theme"&&m.params==="inline");s||(s=S$1.atRule({name:"theme",params:"inline",raws:{semicolon:true,between:" ",before:`
|
|
10
|
+
`}}),t.append(s),t.insertBefore(s,S$1.comment({text:"---break---"})));let c=s.nodes?.find(m=>m.type==="atrule"&&m.name==="keyframes"&&m.params===a),l;if(c?(l=S$1.atRule({name:"keyframes",params:a,raws:{semicolon:true,between:" ",before:`
|
|
11
|
+
`}}),c.replaceWith(l)):(l=S$1.atRule({name:"keyframes",params:a,raws:{semicolon:true,between:" ",before:`
|
|
12
|
+
`}}),s.append(l)),typeof i=="object")for(let[m,d]of Object.entries(i))te(l,m,d);}else if(o==="utility"){let s=t.nodes?.find(c=>c.type==="atrule"&&c.name===o&&c.params===a);if(s){if(typeof i=="object")for(let[c,l]of Object.entries(i))if(typeof l=="string"){let m=s.nodes?.find(g=>g.type==="decl"&&g.prop===c),d=S$1.decl({prop:c,value:l,raws:{semicolon:true,before:`
|
|
13
|
+
`}});m?m.replaceWith(d):s.append(d);}else typeof l=="object"&&te(s,c,l);}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[l,m]of Object.entries(i))if(typeof m=="string"){let d=S$1.decl({prop:l,value:m,raws:{semicolon:true,before:`
|
|
15
|
+
`}});c.append(d);}else typeof m=="object"&&te(c,l,m);}}else o==="property"?te(t,r,i):cr(t,o,a,i);}else te(t,r,i);}}}function cr(e,t,r,i){let n=e.nodes?.find(o=>o.type==="atrule"&&o.name===t&&o.params===r);if(n||(n=S$1.atRule({name:t,params:r,raws:{semicolon:true,between:" ",before:`
|
|
16
|
+
`}}),e.append(n),e.insertBefore(n,S$1.comment({text:"---break---"}))),typeof i=="object")for(let[o,a]of Object.entries(i))if(o.startsWith("@")){let s=o.match(/@([a-zA-Z-]+)\s*(.*)/);if(s){let[,c,l]=s;cr(n,c,l,a);}}else te(n,o,a);else if(typeof i=="string")try{let a=S$1.parse(`.temp{${i}}`).first;if(a&&a.nodes){let s=S$1.rule({selector:"temp",raws:{semicolon:!0,between:" ",before:`
|
|
17
|
+
`}});a.nodes.forEach(c=>{if(c.type==="decl"){let l=c.clone();l.raws.before=`
|
|
18
|
+
`,s.append(l);}}),s.nodes?.length&&n.append(s);}}catch(o){throw console.error("Error parsing at-rule content:",i,o),o}}function te(e,t,r){let i=e.nodes?.find(n=>n.type==="rule"&&n.selector===t);if(i||(i=S$1.rule({selector:t,raws:{semicolon:true,between:" ",before:`
|
|
19
|
+
`}}),e.append(i)),typeof r=="object"){for(let[n,o]of Object.entries(r))if(n.startsWith("@")&&typeof o=="object"&&o!==null&&Object.keys(o).length===0){let a=n.match(/@([a-zA-Z-]+)\s*(.*)/);if(a){let[,s,c]=a,l=S$1.atRule({name:s,params:c,raws:{semicolon:true,before:`
|
|
20
|
+
`}});i.append(l);}}else if(typeof o=="string"){let a=S$1.decl({prop:n,value:o,raws:{semicolon:true,before:`
|
|
21
21
|
`}}),s=i.nodes?.find(c=>c.type==="decl"&&c.prop===n);s?s.replaceWith(a):i.append(a);}else if(typeof o=="object"){let a=n.startsWith("&")?t.replace(/^([^:]+)/,`$1${n.substring(1)}`):n;te(e,a,o);}}else if(typeof r=="string")try{let o=S$1.parse(`.temp{${r}}`).first;o&&o.nodes&&o.nodes.forEach(a=>{if(a.type==="decl"){let s=a.clone();s.raws.before=`
|
|
22
|
-
`,i?.append(s);}});}catch(n){throw console.error("Error parsing rule content:",t,r,n),n}}async function
|
|
22
|
+
`,i?.append(s);}});}catch(n){throw console.error("Error parsing rule content:",t,r,n),n}}async function et(e$1,t,r){if(!t.resolvedPaths.tailwindCss||!Object.keys(e$1??{}).length)return;r={cleanupDefaultNextStyles:false,silent:false,tailwindVersion:"v3",overwriteCssVars:false,initIndex:true,...r};let i=t.resolvedPaths.tailwindCss,n=E__default.relative(t.resolvedPaths.cwd,i),o=u(`Updating CSS variables in ${e.info(n)}`,{silent:r.silent}).start(),a=await promises.readFile(i,"utf8"),s=await bi(a,e$1??{},t,{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 bi(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=[vi(t)];if(i.cleanupDefaultNextStyles&&n.push(fr()),i.tailwindVersion==="v4"){if(n=[],r.resolvedPaths?.cwd){let s=p(r.resolvedPaths.cwd);!s?.dependencies?.["tailwindcss-animate"]&&!s?.devDependencies?.["tailwindcss-animate"]&&i.initIndex&&n.push(ki({params:"tw-animate-css"}));}n.push(Ii({params:"dark (&:is(.dark *))"})),i.cleanupDefaultNextStyles&&n.push(fr()),n.push(Ri(t,{overwriteCssVars:i.overwriteCssVars})),n.push(Ci(t)),i.tailwindConfig&&(n.push(Pi(i.tailwindConfig)),n.push(Ei(i.tailwindConfig)),n.push(ji(i.tailwindConfig)));}r.tailwind.cssVariables&&i.initIndex&&n.push(xi({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
|
|
24
|
+
`)),a}function xi({tailwindVersion:e}){return {postcssPlugin:"update-base-layer",Once(t){let r=[{selector:"*",apply:e==="v4"?"border-border outline-ring/50":"border-border"},{selector:"body",apply:"bg-background text-foreground"}],i=t.nodes.find(n=>n.type==="atrule"&&n.name==="layer"&&n.params==="base"&&r.every(({selector:o,apply:a})=>n.nodes?.some(s=>s.type==="rule"&&s.selector===o&&s.nodes.some(c=>c.type==="atrule"&&c.name==="apply"&&c.params===a))));i||(i=S$1.atRule({name:"layer",params:"base",raws:{semicolon:true,between:" ",before:`
|
|
25
25
|
`}}),t.append(i),t.insertBefore(i,S$1.comment({text:"---break---"}))),r.forEach(({selector:n,apply:o})=>{i?.nodes?.find(s=>s.type==="rule"&&s.selector===n)||i?.append(S$1.rule({selector:n,nodes:[S$1.atRule({name:"apply",params:o,raws:{semicolon:true,before:`
|
|
26
26
|
`}})],raws:{semicolon:true,between:" ",before:`
|
|
27
|
-
`}}));});}}}function
|
|
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}`;
|
|
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(
|
|
30
|
-
`}}),r.append(a),r.insertBefore(a,S$1.comment({text:"---break---"}))),Object.entries(n).forEach(([s,c])=>{let
|
|
31
|
-
`}}),e.append(t),e.insertBefore(t,S$1.comment({text:"---break---"}))),t}function
|
|
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
|
|
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
|
|
34
|
-
`}});t.insertAfter(o,c),t.insertBefore(c,S$1.comment({text:"---break---"}));}}}}function
|
|
35
|
-
`}});for(let[m
|
|
27
|
+
`}}));});}}}function vi(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 yi||(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}`;Si(r,o,n);});}}}function mr(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 fr(){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()),mr(e);let r=e.nodes.find(i=>i.type==="atrule"&&i.params==="(prefers-color-scheme: dark)");r&&(mr(r),r.nodes.length===0&&r.remove());}}}function Si(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(l=>l.type==="decl"&&l.prop===a);c?c.replaceWith(s):i?.append(s);});}function Ri(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=$e(r);Object.entries(n).forEach(([c,l])=>{let m=`--${c.replace(/^--/,"")}`,d=S$1.decl({prop:m,value:l,raws:{semicolon:true}}),g=s?.nodes?.find(w=>w.type==="decl"&&w.prop===m);t.overwriteCssVars?g?g.replaceWith(d):s?.append(d):g||s?.append(d);});return}let a=r.nodes?.find(s=>s.type==="rule"&&s.selector===o);!a&&Object.keys(n).length>0&&(a=S$1.rule({selector:o,nodes:[],raws:{semicolon:true,between:" ",before:`
|
|
30
|
+
`}}),r.append(a),r.insertBefore(a,S$1.comment({text:"---break---"}))),Object.entries(n).forEach(([s,c])=>{let l=`--${s.replace(/^--/,"")}`;l==="--sidebar-background"&&(l="--sidebar"),pr(c)&&(c=`hsl(${c})`);let m=S$1.decl({prop:l,value:c,raws:{semicolon:true}}),d=a?.nodes.find(g=>g.type==="decl"&&g.prop===l);t.overwriteCssVars?d?d.replaceWith(m):a?.append(m):d||a?.append(m);});});}}}function Ci(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=$e(t),n=i.nodes?.filter(o=>o.type==="decl"&&o.prop.startsWith("--"));for(let o of r){let a=Object.values(e).find(d=>d[o])?.[o];if(!a)continue;if(o==="radius"){let d={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[g,w]of Object.entries(d)){let u=S$1.decl({prop:`--radius-${g}`,value:w,raws:{semicolon:true}});i?.nodes?.find(h=>h.type==="decl"&&h.prop===u.prop)||i?.append(u);}continue}let s=pr(a)||Ni(a)?`--color-${o.replace(/^--/,"")}`:`--${o.replace(/^--/,"")}`;s==="--color-sidebar-background"&&(s="--color-sidebar");let c=`var(--${o})`;s==="--color-sidebar"&&(c="var(--sidebar)");let l=S$1.decl({prop:s,value:c,raws:{semicolon:true}});i?.nodes?.find(d=>d.type==="decl"&&d.prop===l.prop)||(n?.length?i?.insertAfter(n[n.length-1],l):i?.append(l));}}}}function $e(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 Ii({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 ki({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 Pi(e){return {postcssPlugin:"update-tailwind-config",Once(t){if(!e?.plugins)return;let i=$i(t)==="single"?"'":'"',n=t.nodes.filter(a=>a.type==="atrule"&&a.name==="plugin"),o=n[n.length-1]||t.nodes[0];for(let a of e.plugins){let s=a.replace(/^require\(["']|["']\)$/g,"");if(n.some(l=>l.params.replace(/["']/g,"")===s))continue;let c=S$1.atRule({name:"plugin",params:`${i}${s}${i}`,raws:{semicolon:true,before:`
|
|
34
|
+
`}});t.insertAfter(o,c),t.insertBefore(c,S$1.comment({text:"---break---"}));}}}}function ji(e){return {postcssPlugin:"update-tailwind-config-keyframes",Once(t){if(!e?.theme?.extend?.keyframes)return;let r=$e(t),i=r.nodes?.filter(o=>o.type==="atrule"&&o.name==="keyframes"),n=z.record(z.string(),z.record(z.string(),z.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(l=>l.type==="atrule"&&l.name==="keyframes"&&l.params===o))continue;let c=S$1.atRule({name:"keyframes",params:o,nodes:[],raws:{semicolon:true,between:" ",before:`
|
|
35
|
+
`}});for(let[l,m]of Object.entries(s.data)){let d=S$1.rule({selector:l,nodes:Object.entries(m).map(([g,w])=>S$1.decl({prop:g,value:w,raws:{semicolon:true,before:`
|
|
36
36
|
`,between:": "}})),raws:{semicolon:true,between:" ",before:`
|
|
37
|
-
`}});c.append(
|
|
38
|
-
`}});r.append(c);}}}}function
|
|
37
|
+
`}});c.append(d);}r.append(c),r.insertBefore(c,S$1.comment({text:"---break---"}));}}}}function Ei(e){return {postcssPlugin:"update-tailwind-config-animation",Once(t){if(!e?.theme?.extend?.animation)return;let r=$e(t),i=r.nodes?.filter(o=>o.type==="decl"&&o.prop.startsWith("--animate-")),n=z.record(z.string(),z.string()).safeParse(e.theme.extend.animation);if(n.success)for(let[o,a]of Object.entries(n.data)){let s=`--animate-${o}`;if(i?.find(l=>l.prop===s))continue;let c=S$1.decl({prop:s,value:a,raws:{semicolon:true,between:": ",before:`
|
|
38
|
+
`}});r.append(c);}}}}function $i(e){return e.nodes[0].toString().includes("'")?"single":"double"}function pr(e){if(e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch"))return false;let t=e.split(" ");return t.length===3&&t.slice(1,3).every(r=>r.includes("%"))}function Ni(e){return e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch")||e.includes("--color-")}async function U(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=u("Installing dependencies.",{silent:i.silent})?.start(),o=await Ti(r),a="";if(Fi(r)&&o==="npm")if(i.silent)a="force";else {n.stopAndPersist(),t.warn(`
|
|
39
39
|
It looks like you are using React 19.
|
|
40
40
|
Some packages may fail to install due to peer dependency issues in npm (see https://ui.shadcn.com/react-19).
|
|
41
|
-
`);let s=await _e([{type:"select",name:"flag",message:"How would you like to proceed?",choices:[{title:"Use --force",value:"force"},{title:"Use --legacy-peer-deps",value:"legacy-peer-deps"}]}]);s&&(a=s.flag);}n?.start(),await
|
|
42
|
-
`),
|
|
43
|
-
`,"utf-8"),g=E__default.relative(n,o),
|
|
44
|
-
`);}a.push(
|
|
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$1.name?null:"text",name:"name",message:"What is your project named?",initial:r,format:
|
|
46
|
-
`,"utf-8"),
|
|
47
|
-
You may now add components.`),
|
|
48
|
-
`,"utf8"),c.succeed();let g=await k(e$1.cwd,n);return await ie(o,g,{overwrite:true,silent:e$1.silent,baseStyle:e$1.baseStyle,isNewProject:e$1.isNewProject||t?.framework.name==="next-app"}),e$1.isNewProject&&e$1.srcDir&&await
|
|
49
|
-
Before you can add components, you must create a valid ${e.info("components.json")} file by running the ${e.info("init")} command.`),t.error(`Learn more at ${e.info("https://ui.shadcn.com/docs/components-json")}.`),t.break(),process.exit(1);}}async function
|
|
41
|
+
`);let s=await _e([{type:"select",name:"flag",message:"How would you like to proceed?",choices:[{title:"Use --force",value:"force"},{title:"Use --legacy-peer-deps",value:"legacy-peer-deps"}]}]);s&&(a=s.flag);}n?.start(),await Ai(o,e,t$1,r.resolvedPaths.cwd,a),n?.succeed();}function Fi(e){let t=p(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 Ti(e){return p(e.resolvedPaths.cwd,false)?.dependencies?.expo?"expo":a$1(e.resolvedPaths.cwd)}async function Ai(e,t,r,i,n){if(e==="npm")return _i(t,r,i,n);if(e==="deno")return Di(t,r,i);if(e==="expo")return Li(t,r,i);t?.length&&await execa(e,["add",...t],{cwd:i}),r?.length&&await execa(e,["add","-D",...r],{cwd:i});}async function _i(e,t,r,i){e.length&&await execa("npm",["install",...i?[`--${i}`]:[],...e],{cwd:r}),t.length&&await execa("npm",["install",...i?[`--${i}`]:[],"-D",...t],{cwd:r});}async function Di(e,t,r){e?.length&&await execa("deno",["add",...e.map(i=>`npm:${i}`)],{cwd:r}),t?.length&&await execa("deno",["add","-D",...t.map(i=>`npm:${i}`)],{cwd:r});}async function Li(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 rt(e$1,t$1,r){if(!e$1||Object.keys(e$1).length===0)return {envVarsAdded:[],envFileUpdated:null,envFileCreated:null};r={silent:false,...r};let i=u("Adding environment variables.",{silent:r.silent})?.start(),n=t$1.resolvedPaths.cwd,o=E__default.join(n,".env.local"),a=H$1(n);a&&(o=a);let s=existsSync(o),c=E__default.basename(o),l=Object.entries(e$1).map(([w,u])=>`${w}=${u}`).join(`
|
|
42
|
+
`),m=[],d=null,g=null;if(s){let w=await promises.readFile(o,"utf-8"),u=J(w,l);if(m=I(w,l),m.length>0){if(await promises.writeFile(o,u,"utf-8"),d=E__default.relative(n,o),i?.succeed(`Added the following variables to ${e.info(c)}:`),!r.silent)for(let h of m)t.log(` ${e.success("+")} ${h}`);}else i?.stop();}else if(await promises.writeFile(o,l+`
|
|
43
|
+
`,"utf-8"),g=E__default.relative(n,o),m=Object.keys(e$1),i?.succeed(`Added the following variables to ${e.info(c)}:`),!r.silent)for(let w of m)t.log(` ${e.success("+")} ${w}`);return !r.silent&&m.length>0&&t.break(),{envVarsAdded:m,envFileUpdated:d,envFileCreated:g}}async function ur(e,t){if(!e.fonts?.length)return e;let r=await q(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 it(e,t,r){if(!e?.length)return;let i=await q(t.resolvedPaths.cwd);if(!i||i.framework.name!=="next-app"&&i.framework.name!=="next-pages")return;let n=u("Updating fonts.",{silent:r.silent})?.start();try{await Gi(e,t,i),n?.succeed("Updating fonts.");}catch(o){throw n?.fail("Failed to update fonts."),o}}async function Gi(e,t,r){let i=await Ji(t,r);if(!i)return;let n=await promises.readFile(i,"utf-8"),o=await Yi(n,e);o!==n&&await promises.writeFile(i,o,"utf-8");}async function Ji(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 Yi(e,t,r){let n=new Project({compilerOptions:{}}).createSourceFile("layout.tsx",e,{scriptKind:ScriptKind.TSX}),o=t.filter(s=>s.font.provider==="google"),a=[];for(let s of o){let c=s.font.import;if(!c)continue;let l=n.getImportDeclaration(w=>w.getModuleSpecifierValue()==="next/font/google");if(l){if(l.getNamedImports().some(h=>h.getName()===c))continue;l.addNamedImport(c);}else n.addImportDeclaration({moduleSpecifier:"next/font/google",namedImports:[c]});let m=qi(c),d=Ki(s),g=Hi(n,s.font.variable);if(g)g.setInitializer(`${c}(${d})`),g.getName()!==m&&g.rename(m);else {let w=Xi(n);n.insertVariableStatement(w,{declarationKind:VariableDeclarationKind.Const,declarations:[{name:m,initializer:`${c}(${d})`}]}).appendWhitespace(`
|
|
44
|
+
`);}a.push(m);}return a.length>0&&Qi(n,a),n.getFullText()}function Ki(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 qi(e){return e.split("_").map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function Hi(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 Xi(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function Qi(e,t){let r=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement);for(let i of r){if(i.getTagNameNode().getText()!=="html")continue;let o=i.getAttribute("className");if(!o){let l=t.map(m=>`${m}.variable`).join(", ");t.length===1?i.addAttribute({name:"className",initializer:`{${l}}`}):(he(e),i.addAttribute({name:"className",initializer:`{cn(${l})}`}));return}if(o.getKind()!==SyntaxKind.JsxAttribute)return;let a=o.asKindOrThrow(SyntaxKind.JsxAttribute),s=a.getInitializer();if(!s)return;let c=t.map(l=>`${l}.variable`);if(s.getKind()===SyntaxKind.StringLiteral){let l=s.getText().slice(1,-1);he(e),a.setInitializer(`{cn("${l}", ${c.join(", ")})}`);}else if(s.getKind()===SyntaxKind.JsxExpression){let l=s.asKindOrThrow(SyntaxKind.JsxExpression),m=l.getExpression();if(!m)return;let d=m.getText();if(d.startsWith("cn(")){if(c.every(h=>d.includes(h)))continue;let w=en(d),u=tn(w,c);l.replaceWithText(`{${u}}`);}else if(/^\w+\.variable$/.test(d)){if(c.includes(d))continue;c.length===1?l.replaceWithText(`{${c[0]}}`):(he(e),l.replaceWithText(`{cn(${c.join(", ")})}`));}else if(d.startsWith("`")&&d.endsWith("`")){let g=Zi(d);he(e),l.replaceWithText(`{cn(${[...g,...c].join(", ")})}`);}else he(e),l.replaceWithText(`{cn(${d}, ${c.join(", ")})}`);}}}function he(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 Zi(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 en(e){return e.replace(/,?\s*\w+\.variable/g,"").replace(/cn\(\s*,/,"cn(")}function tn(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 l(t);return i&&i.ui&&i.ui.resolvedPaths.cwd!==t.resolvedPaths.cwd?await on(e,t,i,{...r,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await nn(e,t,r)}async function nn(e,t$1,r){if(!r.baseStyle&&!e.length)return;let i=u("Checking registry.",{silent:r.silent})?.start(),n=await Y$1(e,P(t$1));if(!n)return i?.fail(),Z(new Error("Failed to fetch components from registry."));try{hr(n.files??[],t$1.resolvedPaths.cwd);}catch(s){return i?.fail(),Z(s)}i?.succeed();let o=await s(t$1);n=await ur(n,t$1),await U$1(n.tailwind?.config,t$1,{silent:r.silent,tailwindVersion:o});let a=await gr(e,t$1);await et(n.cssVars,t$1,{cleanupDefaultNextStyles:r.isNewProject,silent:r.silent,tailwindVersion:o,tailwindConfig:n.tailwind?.config,overwriteCssVars:a,initIndex:r.baseStyle}),await Ze(n.css,t$1,{silent:r.silent}),await rt(n.envVars,t$1,{silent:r.silent}),await U(n.dependencies,n.devDependencies,t$1,{silent:r.silent}),await it(n.fonts,t$1,{silent:r.silent}),await L(n.files,t$1,{overwrite:r.overwrite,silent:r.silent,path:r.path}),n.docs&&t.info(n.docs);}async function on(e,t$1,r,i){if(!i.baseStyle&&!e.length)return;let n=u("Checking registry.",{silent:i.silent})?.start(),o=await Y$1(e,P(t$1));if(!o)return n?.fail(),Z(new Error("Failed to fetch components from registry."));try{hr(o.files??[],t$1.resolvedPaths.cwd);}catch(h){return n?.fail(),Z(h)}n?.succeed();let a=[],s$1=[],c=[],l=u("Installing components.")?.start(),m$1=r.ui,d=await s(m$1),g=n$1(t$1.resolvedPaths.cwd,m$1.resolvedPaths.ui);if(o.tailwind?.config&&(await U$1(o.tailwind?.config,m$1,{silent:true,tailwindVersion:d}),s$1.push(E__default.relative(g,m$1.resolvedPaths.tailwindConfig))),o.cssVars){let h=await gr(e,t$1);await et(o.cssVars,m$1,{silent:true,tailwindVersion:d,tailwindConfig:o.tailwind?.config,overwriteCssVars:h}),s$1.push(E__default.relative(g,m$1.resolvedPaths.tailwindCss));}o.css&&(await Ze(o.css,m$1,{silent:true}),s$1.push(E__default.relative(g,m$1.resolvedPaths.tailwindCss))),o.envVars&&await rt(o.envVars,m$1,{silent:true}),await U(o.dependencies,o.devDependencies,m$1,{silent:true}),await it(o.fonts,m$1,{silent:true});let w=new Map;for(let h of o.files??[]){let b=h.type||"registry:ui";w.has(b)||w.set(b,[]),w.get(b).push(h);}for(let h of Array.from(w.keys())){let b=w.get(h),v=h==="registry:ui"?r.ui:t$1,W=n$1(t$1.resolvedPaths.cwd,v.resolvedPaths.ui||v.resolvedPaths.cwd),T=await m(W,v.resolvedPaths.cwd)??v.resolvedPaths.cwd,X=await L(b,v,{overwrite:i.overwrite,silent:true,rootSpinner:l,isRemote:i.isRemote,isWorkspace:true,path:i.path});a.push(...X.filesCreated.map(A=>E__default.relative(W,E__default.join(T,A)))),s$1.push(...X.filesUpdated.map(A=>E__default.relative(W,E__default.join(T,A)))),c.push(...X.filesSkipped.map(A=>E__default.relative(W,E__default.join(T,A))));}if(l?.succeed(),a.sort(),s$1.sort(),c.sort(),!(a.length||s$1.length)&&!c.length&&u("No files updated.",{silent:i.silent})?.info(),a.length){u(`Created ${a.length} ${a.length===1?"file":"files"}:`,{silent:i.silent})?.succeed();for(let h of a)t.log(` - ${h}`);}if(s$1.length){u(`Updated ${s$1.length} ${s$1.length===1?"file":"files"}:`,{silent:i.silent})?.info();for(let h of s$1)t.log(` - ${h}`);}if(c.length){u(`Skipped ${c.length} ${s$1.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:i.silent})?.info();for(let h of c)t.log(` - ${h}`);}o.docs&&t.info(o.docs);}async function gr(e,t){let r=await $(e,{config:t});return z.array(n).parse(r).some(n=>n.type==="registry:theme"||n.type==="registry:style"||n.type==="registry:font"||n.type==="registry:base")}function hr(e,t){for(let r of e)if(r?.target&&!sr(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}var st="https://codeload.github.com/shadcn-ui/ui/tar.gz/main",V={next:"next","next-monorepo":"next-monorepo",vite:"vite",start:"start"};async function Oe(e$1){e$1={srcDir:false,...e$1};let t$1=e$1.template&&V[e$1.template]?e$1.template:"next",r=e$1.name??(t$1===V.next||t$1===V.vite||t$1===V.start?"my-app":"my-monorepo"),i="latest",n=e$1.components?.length===1&&!!e$1.components[0].match(/\/chat\/b\//);if(e$1.components&&n)try{let[s]=await T(e$1.components),{meta:c}=z.object({meta:z.object({nextVersion:z.string()})}).parse(s);i=c.nextVersion,t$1=V.next;}catch(s){t.break(),Z(s);}if(!e$1.force){let{type:s,name:c}=await _e([{type:e$1.template||n?null:"select",name:"type",message:`The path ${e.info(e$1.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$1.name?null:"text",name:"name",message:"What is your project named?",initial:r,format:l=>l.trim(),validate:l=>l.length>128?"Name should be less than 128 characters.":true}]);t$1=s??t$1,r=c??r;}let o=await a$1(e$1.cwd,{withFallback:true}),a=`${e$1.cwd}/${r}`;try{await R.access(e$1.cwd,R.constants.W_OK);}catch{t.break(),t.error(`The path ${e.info(e$1.cwd)} is not writable.`),t.error(`It is likely you do not have write permissions for this folder or the path ${e.info(e$1.cwd)} does not exist.`),t.break(),process.exit(1);}return R.existsSync(E__default.resolve(e$1.cwd,r,"package.json"))&&(t.break(),t.error(`A project with the name ${e.info(r)} already exists.`),t.error("Please choose a different name and try again."),t.break(),process.exit(1)),t$1===V.next&&await an(a,{version:i,cwd:e$1.cwd,packageManager:o,srcDir:!!e$1.srcDir}),t$1===V["next-monorepo"]&&await cn(a,{packageManager:o}),t$1===V.vite&&await ln(a,{packageManager:o}),t$1===V.start&&await mn(a,{packageManager:o}),{projectPath:a,projectName:r,template:t$1}}async function an(e,t$1){let r=u("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{t.break(),t.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 cn(e,t){let r=u("Creating a new Next.js monorepo. This may take a few minutes.").start();try{let i=E__default.join(ot.tmpdir(),`shadcn-template-${Date.now()}`);await R.ensureDir(i);let n=await fetch(st);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.packageManager,["install"],{cwd:e});let s=E__default.join(e,"package.json");if(R.existsSync(s)){let l=await R.readFile(s,"utf8"),m=JSON.parse(l);m.name=e.split("/").pop(),await R.writeFile(s,JSON.stringify(m,null,2));}let c=process.cwd();await execa("git",["--version"],{cwd:e}),await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","Initial commit"],{cwd:e}),r?.succeed("Creating a new Next.js monorepo.");}catch(i){r?.fail("Something went wrong creating a new Next.js monorepo."),Z(i);}}async function ln(e,t){let r=u("Creating a new Vite project. This may take a few minutes.").start();try{let i=E__default.join(ot.tmpdir(),`shadcn-template-${Date.now()}`);await R.ensureDir(i);let n=await fetch(st);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.packageManager!=="pnpm"){let c=E__default.join(e,"pnpm-lock.yaml");R.existsSync(c)&&await R.remove(c);}await execa(t.packageManager,["install"],{cwd:e});let s=E__default.join(e,"package.json");if(R.existsSync(s)){let c=await R.readFile(s,"utf8"),l=JSON.parse(c);l.name=e.split("/").pop(),await R.writeFile(s,JSON.stringify(l,null,2));}await execa("git",["--version"],{cwd:e}),await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","Initial commit"],{cwd:e}),r?.succeed("Creating a new Vite project.");}catch(i){r?.fail("Something went wrong creating a new Vite project."),Z(i);}}async function mn(e,t){let r=u("Creating a new TanStack Start project. This may take a few minutes.").start();try{let i=E__default.join(ot.tmpdir(),`shadcn-template-${Date.now()}`);await R.ensureDir(i);let n=await fetch(st);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.packageManager!=="pnpm"){let c=E__default.join(e,"pnpm-lock.yaml");R.existsSync(c)&&await R.remove(c);}await execa(t.packageManager,["install"],{cwd:e});let s=E__default.join(e,"package.json");if(R.existsSync(s)){let c=await R.readFile(s,"utf8"),l=JSON.parse(c);l.name=e.split("/").pop(),await R.writeFile(s,JSON.stringify(l,null,2));}await execa("git",["--version"],{cwd:e}),await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","Initial commit"],{cwd:e}),r?.succeed("Creating a new TanStack Start project.");}catch(i){r?.fail("Something went wrong creating a new TanStack Start project."),Z(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$1){t.warn("Failed to load env files:",t$1);}}var we=".bak";function wr(e){if(!R.existsSync(e))return null;let t=`${e}${we}`;try{return R.renameSync(e,t),t}catch(r){return console.error(`Failed to create backup of ${e}: ${r}`),null}}function yr(e){let t=`${e}${we}`;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 at(e){let t=`${e}${we}`;if(!R.existsSync(t))return false;try{return R.unlinkSync(t),!0}catch{return false}}async function br(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}=G(o);a&&!c$1[a]&&r.add(a);try{let[s]=await X([o],t,{useCache:!0});if(s?.registryDependencies)for(let c of s.registryDependencies){let{registry:l}=G(c);l&&!c$1[l]&&r.add(l),i.has(c)||n.push(c);}}catch(s){if(s instanceof A){let{registry:c}=G(o);c&&!c$1[c]&&r.add(c);continue}continue}}return Array.from(r)}async function F(e,t,r={}){r={silent:false,writeFile:true,...r};let n=(await br(e,t)).filter(l=>!t.registries?.[l]&&!Object.keys(c$1).includes(l));if(n.length===0)return {config:t,newRegistries:[]};let o=await la({useCache:process.env.NODE_ENV!=="development"});if(!o)return {config:t,newRegistries:[]};let a={};for(let l of n)o[l]&&(a[l]=o[l]);if(Object.keys(a).length===0)return {config:t,newRegistries:[]};let s=Object.fromEntries(Object.entries(t.registries||{}).filter(([l])=>!Object.keys(c$1).includes(l))),c$2={...t,registries:{...s,...a}};if(r.writeFile){let{resolvedPaths:l,...m}=c$2,d=u("Updating components.json.",{silent:r.silent}).start(),g=c.parse(m);await R.writeFile(E__default.resolve(t.resolvedPaths.cwd,"components.json"),JSON.stringify(g,null,2)+`
|
|
46
|
+
`,"utf-8"),d.succeed();}return {config:c$2,newRegistries:Object.keys(a)}}async function vr(e$1,t,r){if(!e$1)return;r={silent:false,...r};let i=E__default.relative(t.resolvedPaths.cwd,t.resolvedPaths.tailwindConfig),n=u(`Updating ${e.info(i)}`,{silent:r.silent}).start(),o=await promises.readFile(t.resolvedPaths.tailwindConfig,"utf8"),a=await hn(o,e$1,t);await promises.writeFile(t.resolvedPaths.tailwindConfig,a,"utf8"),n?.succeed();}async function hn(e,t,r){let i=await V$1(e,r),n=i.getDescendantsOfKind(SyntaxKind.ObjectLiteralExpression).find(o=>o.getProperties().some(a=>a.isKind(SyntaxKind.PropertyAssignment)&&a.getName()==="content"));return n?(wn(n,t),i.getFullText()):e}async function wn(e,t){let r=W(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?at(t):yr(t)});var lt=z.object({cwd:z.string(),name:z.string().optional(),components:z.array(z.string()).optional(),yes:z.boolean(),defaults:z.boolean(),force:z.boolean(),silent:z.boolean(),isNewProject:z.boolean(),srcDir:z.boolean().optional(),cssVariables:z.boolean(),rtl:z.boolean().optional(),template:z.string().optional().refine(e=>e?V[e]:true,{message:"Invalid template. Please use 'next', 'vite', 'start' or 'next-monorepo'."}),baseColor:z.string().optional().refine(e=>e?b.find(t=>t.name===e):true,{message:`Invalid base color. Please use '${b.map(e=>e.name).join("', '")}'`}),baseStyle:z.boolean(),registryBaseConfig:c.deepPartial().optional()}),Rr=new Command().name("init").description("initialize your project and install dependencies").argument("[components...]","names, url or local path to component").option("-t, --template <template>","the template to use. (next, start, vite, next-monorepo)").option("-b, --base-color <base-color>","the base color to use. (neutral, gray, zinc, stone, slate)",void 0).option("-y, --yes","skip confirmation prompt.",true).option("-d, --defaults,","use default configuration.",false).option("-f, --force","force overwrite of existing configuration.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",false).option("--src-dir","use the src directory when creating a new project.",false).option("--no-src-dir","do not use the src directory when creating a new project.").option("--css-variables","use css variables for theming.",true).option("--no-css-variables","do not use css variables for theming.").option("--no-base-style","do not install the base shadcn style.").option("--rtl","enable RTL support.",false).action(async(e$1,t$1)=>{try{t$1.defaults&&(t$1.template=t$1.template||"next",t$1.baseColor=t$1.baseColor||"neutral");let r=lt.parse({cwd:E__default.resolve(t$1.cwd),isNewProject:!1,components:e$1,...t$1});if(await B(r.cwd),e$1.length>0){let i=P(o({resolvedPaths:{cwd:r.cwd}})),n=E__default.resolve(r.cwd,"components.json");if(R.existsSync(n)){let s=await R.readJson(n),c$1=c.partial().parse(s),l=o({resolvedPaths:{cwd:r.cwd}});i=P({...c$1,resolvedPaths:{...l.resolvedPaths,cwd:r.cwd}}),wr(n);}let{config:o$1}=await F(e$1,i,{silent:!0,writeFile:!1});i=o$1,S(e$1[0],i);let[a]=await $([e$1[0]],{config:i});a?.type==="registry:base"&&(a.config&&(i=P(Sr(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),t.log(`${e.success("Success!")} Project initialization completed.
|
|
47
|
+
You may now add components.`),at(E__default.resolve(r.cwd,"components.json")),t.break();}catch(r){t.break(),Z(r);}finally{Q();}});async function me(e$1){let t,r$1;if(e$1.skipPreflight)t=await q(e$1.cwd);else {let w=await or(e$1);if(w.errors["1"]){let{projectPath:u,template:h}=await Oe(e$1);u||process.exit(1),e$1.cwd=u,e$1.isNewProject=true,r$1=h,t=await q(e$1.cwd);}else t=w.projectInfo;}if(r$1==="next-monorepo")return e$1.cwd=E__default.resolve(e$1.cwd,"apps/web"),await j(e$1.cwd);let i=await r(e$1.cwd,t),n=i?await vn(i,e$1):await xn(await j(e$1.cwd));if(!e$1.yes){let{proceed:w}=await _e({type:"confirm",name:"proceed",message:`Write configuration to ${e.info("components.json")}. Proceed?`,initial:true});w||process.exit(0);}let o=[...e$1.baseStyle?["index"]:[],...e$1.components??[]],a=await k(e$1.cwd,n),{config:s}=await F(o,a,{silent:true});s.registries&&(n.registries=s.registries);let c=u("Writing components.json.").start(),l=E__default.resolve(e$1.cwd,"components.json"),m=`${l}${we}`,d=(w,u)=>{let{registries:h,...b}=Sr(w,u);return {...b,registries:h}};if(!e$1.force&&R.existsSync(m)){let w=await R.readJson(m);n=d(w,n);}e$1.registryBaseConfig&&(n=d(n,e$1.registryBaseConfig)),e$1.rtl!==void 0&&(n.rtl=e$1.rtl),n.registries=Object.fromEntries(Object.entries(n.registries||{}).filter(([w])=>!Object.keys(c$1).includes(w))),await promises.writeFile(l,`${JSON.stringify(n,null,2)}
|
|
48
|
+
`,"utf8"),c.succeed();let g=await k(e$1.cwd,n);return await ie(o,g,{overwrite:true,silent:e$1.silent,baseStyle:e$1.baseStyle,isNewProject:e$1.isNewProject||t?.framework.name==="next-app"}),e$1.isNewProject&&e$1.srcDir&&await vr(["./src/**/*.{js,ts,jsx,tsx,mdx}"],g,{silent:e$1.silent}),g}async function xn(e$1=null){let[t$1,r]=await Promise.all([da(),fa()]);t.info("");let i$1=await _e([{type:"toggle",name:"typescript",message:`Would you like to use ${e.info("TypeScript")} (recommended)?`,initial:e$1?.tsx??true,active:"yes",inactive:"no"},{type:"select",name:"style",message:`Which ${e.info("style")} would you like to use?`,choices:t$1.map(n=>({title:n.label,value:n.name}))},{type:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${e.info("base color")}?`,choices:r.map(n=>({title:n.label,value:n.name}))},{type:"text",name:"tailwindCss",message:`Where is your ${e.info("global CSS")} file?`,initial:e$1?.tailwind.css??h},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${e.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 ${e.info("tailwind prefix eg. tw-")}? (Leave blank if not)`,initial:""},{type:"text",name:"tailwindConfig",message:`Where is your ${e.info("tailwind.config.js")} located?`,initial:e$1?.tailwind.config??i},{type:"text",name:"components",message:`Configure the import alias for ${e.info("components")}:`,initial:e$1?.aliases.components??f},{type:"text",name:"utils",message:`Configure the import alias for ${e.info("utils")}:`,initial:e$1?.aliases.utils??g},{type:"toggle",name:"rsc",message:`Are you using ${e.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$1.style,tailwind:{config:i$1.tailwindConfig,css:i$1.tailwindCss,baseColor:i$1.tailwindBaseColor,cssVariables:i$1.tailwindCssVariables,prefix:i$1.tailwindPrefix},rsc:i$1.rsc,tsx:i$1.typescript,aliases:{utils:i$1.utils,components:i$1.components,lib:i$1.components.replace(/\/components$/,"lib"),hooks:i$1.components.replace(/\/components$/,"hooks")}})}async function vn(e$1,t){let r=e$1.style,i=t.baseColor,n=e$1.tailwind.cssVariables,o=e$1.iconLibrary??"lucide";if(!t.defaults){let[a,s$1,c]=await Promise.all([da(),fa(),s(e$1)]),l=await _e([{type:c==="v4"||r?null:"select",name:"style",message:`Which ${e.info("style")} would you like to use?`,choices:a.map(m=>({title:m.name==="new-york"?"New York (Recommended)":m.label,value:m.name})),initial:0},{type:t.baseColor?null:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${e.info("base color")}?`,choices:s$1.map(m=>({title:m.label,value:m.name}))}]);r=l.style??r??"new-york",i=l.tailwindBaseColor??i,n=t.cssVariables;}return c.parse({$schema:e$1?.$schema,style:r,tailwind:{...e$1?.tailwind,baseColor:i,cssVariables:n},rsc:e$1?.rsc,tsx:e$1?.tsx,iconLibrary:o,rtl:t.rtl??e$1?.rtl??false,aliases:e$1?.aliases})}async function Ir(e$1){let t$1={};if(!R.existsSync(e$1.cwd)||!R.existsSync(E__default.resolve(e$1.cwd,"package.json")))return t$1["1"]=true,{errors:t$1,config:null};if(!R.existsSync(E__default.resolve(e$1.cwd,"components.json")))return t$1["3"]=true,{errors:t$1,config:null};try{let r=await j(e$1.cwd);return {errors:t$1,config:r}}catch{t.break(),t.error(`An invalid ${e.info("components.json")} file was found at ${e.info(e$1.cwd)}.
|
|
49
|
+
Before you can add components, you must create a valid ${e.info("components.json")} file by running the ${e.info("init")} command.`),t.error(`Learn more at ${e.info("https://ui.shadcn.com/docs/components-json")}.`),t.break(),process.exit(1);}}async function Pr(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}"
|
|
50
50
|
|
|
51
51
|
export default function Page() {
|
|
52
52
|
return <${i?.meta?.importSpecifier} />
|
|
53
|
-
}`;await Y__default.writeFile(r,n,"utf8");}var
|
|
54
|
-
Existing CSS variables and components will be overwritten. Continue?`)});b||(t.break(),t.log("Installation cancelled."),t.break(),process.exit(1));}}if(r.components?.length||(r.components=await
|
|
55
|
-
You may now add components.`),t.break();}catch(r){t.break(),Z(r);}finally{Q();}});function
|
|
53
|
+
}`;await Y__default.writeFile(r,n,"utf8");}var Cn=z.object({components:z.array(z.string()).optional(),yes:z.boolean(),overwrite:z.boolean(),cwd:z.string(),all:z.boolean(),path:z.string().optional(),silent:z.boolean(),srcDir:z.boolean().optional(),cssVariables:z.boolean()}),Er=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$1,t$1)=>{try{let r=Cn.parse({components:e$1,cwd:E__default.resolve(t$1.cwd),...t$1});await B(r.cwd);let i=await j(r.cwd);i||(i=o({style:"new-york",resolvedPaths:{cwd:r.cwd}}));let n=["sidebar-","login-","signup-","otp-","calendar-"],o$1=["base-","radix-"];if(e$1.length>0&&i?.style&&o$1.some(b=>i?.style.startsWith(b))){let b=e$1.filter(v=>n.some(W=>v.startsWith(W)));b.length&&(t.warn(`The ${e.info(b.map(v=>v).join(", "))} component(s) are not available for the ${e.info(i.style)} style yet. They are coming soon.`),t.warn("In the meantime, you can visit the blocks page on https://ui.shadcn.com/blocks and copy the code."),t.break(),process.exit(1));}let a=!1;if(e$1.length>0){let{config:h,newRegistries:b}=await F(e$1,i,{silent:r.silent,writeFile:!1});i=h,a=b.length>0;}let s,c=!0;if(e$1.length>0){let[h]=await $([e$1[0]],{config:i});if(s=h?.type,c=s!=="registry:theme"&&s!=="registry:style",O(h)){await ie(e$1,i,{...r,baseStyle:c});return}if(!r.yes&&(s==="registry:style"||s==="registry:theme")){t.break();let{confirm:b}=await _e({type:"confirm",name:"confirm",message:e.warn(`You are about to install a new ${s.replace("registry:","")}.
|
|
54
|
+
Existing CSS variables and components will be overwritten. Continue?`)});b||(t.break(),t.log("Installation cancelled."),t.break(),process.exit(1));}}if(r.components?.length||(r.components=await In(r)),(await q(r.cwd))?.tailwindVersion==="v4"){let h=d.filter(b=>r.components?.includes(b.name));h?.length&&(t.break(),h.forEach(b=>{t.warn(e.warn(b.message));}),t.break(),process.exit(1));}let{errors:m,config:d$1}=await Ir(r),g=!1;if(m["3"]){let{proceed:h}=await _e({type:"confirm",name:"proceed",message:`You need to create a ${e.info("components.json")} file to add components. Proceed?`,initial:!0});h||(t.break(),process.exit(1)),d$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}),g=!0;}let w=!1;if(m["1"]){let{projectPath:h,template:b}=await Oe({cwd:r.cwd,force:r.overwrite,srcDir:r.srcDir,components:r.components});h||(t.break(),process.exit(1)),r.cwd=h,b==="next-monorepo"?(r.cwd=E__default.resolve(r.cwd,"apps/web"),d$1=await j(r.cwd)):(d$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}),g=!0,w=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//));}if(!d$1)throw new Error(`Failed to read config at ${e.info(r.cwd)}.`);let{config:u}=await F(r.components,d$1,{silent:r.silent||a});d$1=u,g||await ie(r.components,d$1,{...r,baseStyle:c}),w&&await Pr(r.components[0],d$1);}catch(r){t.break(),Z(r);}finally{Q();}});async function In(e){let t$1=await ca();if(!t$1)return t.break(),Z(new Error("Failed to fetch registry index.")),[];if(e.all)return t$1.map(n=>n.name).filter(n=>!d.some(o=>o.name===n));if(e.components?.length)return e.components;let{components:r}=await _e({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$1.filter(n=>n.type==="registry:ui"&&!d.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||(t.warn("No components selected. Exiting."),t.info(""),process.exit(1));let i=z.array(z.string()).safeParse(r);return i.success?i.data:(t.error(""),Z(new Error("Something went wrong. Please try again.")),[])}async function Or(e$1){let t$1={},r={cwd:e$1.cwd,registryFile:E__default.resolve(e$1.cwd,e$1.registryFile),outputDir:E__default.resolve(e$1.cwd,e$1.outputDir)};return R.existsSync(r.registryFile)||(t$1["13"]=true),await R.mkdir(r.outputDir,{recursive:true}),Object.keys(t$1).length>0&&(t$1["13"]&&(t.break(),t.error(`The path ${e.info(r.registryFile)} does not exist.`)),t.break(),process.exit(1)),{errors:t$1,resolvePaths:r}}var Pn=z.object({cwd:z.string(),registryFile:z.string(),outputDir:z.string()}),Fr=new Command().name("build").description("build components for a shadcn registry").argument("[registry]","path to registry.json file","./registry.json").option("-o, --output <path>","destination directory for json files","./public/r").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e$1,t$1)=>{try{let r=Pn.parse({cwd:E.resolve(t$1.cwd),registryFile:e$1,outputDir:t$1.output}),{resolvePaths:i}=await Or(r),n$1=await Y.readFile(i.registryFile,"utf-8"),o=o$1.safeParse(JSON.parse(n$1));o.success||(t.error(`Invalid registry file found at ${e.info(i.registryFile)}.`),process.exit(1));let a=u("Building registry...");for(let s of o.data.items){a.start(`Building ${s.name}...`),s.$schema="https://ui.shadcn.com/schema/registry-item.json";for(let l of s.files??[])l.content=await Y.readFile(E.resolve(i.cwd,l.path),"utf-8");let c=n.safeParse(s);if(!c.success){t.error(`Invalid registry item found for ${e.info(s.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){t.break(),Z(r);}});var Ar=a.replace(/\/r\/?$/,""),$n={next:"Next.js",vite:"Vite",start:"TanStack Start"},_r=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).option("--rtl","enable RTL support.",false).action(async(e$1,t$1)=>{try{if(!e$1&&!t$1.preset){let u={};t$1.template&&(u.template=t$1.template),t$1.rtl&&(u.rtl="true",u.base="base");let h=Dr(Object.keys(u).length>0?u:void 0);t.log("Build your own shadcn/ui."),t.log(`You will be taken to ${e.info(h)} to build your custom design system.`),t.break();let{proceed:b}=await _e({type:"confirm",name:"proceed",message:"Open in browser?",initial:!0});b&&await Tr(h),process.exit(0);}let i=e$1;if(!i){let{enteredName:u}=await _e({type:"text",name:"enteredName",message:"What is your project named?",initial:t$1.template?`${t$1.template}-app`:"my-app",format:h=>h.trim(),validate:h=>En(E__default.basename(E__default.resolve(h))).validForNewPackages?!0:"Invalid project name. Name should be lowercase, URL-friendly, and not start with a period or underscore."});u||process.exit(0),i=u;}let n=t$1.template;if(!n){let{selectedTemplate:u}=await _e({type:"select",name:"selectedTemplate",message:`Which ${e.info("template")} would you like to use?`,choices:Object.entries($n).map(([h,b])=>({title:b,value:h}))});u||process.exit(0),n=u;}let o=await On(t$1.preset??!0,t$1.rtl);o||process.exit(0);let a,s;if("_isUrl"in o){let u=new URL(o.url);t$1.rtl&&u.searchParams.set("rtl","true"),a=u.toString(),s=u.searchParams.get("baseColor")??"neutral";}else a=Nn(o,t$1.rtl),s=o.baseColor;let c=P({}),{config:l}=await F([a],c,{silent:!0});c=l;let[m]=await $([a],{config:c}),d;m?.type==="registry:base"&&m.config&&(d=m.config);let g=lt.parse({cwd:E__default.resolve(t$1.cwd),name:i,components:[a],yes:t$1.yes,defaults:!1,force:!1,silent:!1,isNewProject:!0,srcDir:t$1.srcDir,cssVariables:!0,rtl:t$1.rtl,template:n,baseColor:s,baseStyle:!1,registryBaseConfig:d,skipPreflight:!1}),w=await me(g);if(w){let u=["component-example"];t$1.rtl&&u.push("direction"),await ie(u,w,{baseStyle:!1,silent:!0,overwrite:!0});let h=Fn(n);h.length>0&&await L(h,w,{overwrite:!0,silent:!0});}t.log(`${e.success("Success!")} Project initialization completed.
|
|
55
|
+
You may now add components.`),t.break();}catch(r){t.break(),Z(r);}finally{Q();}});function Nn(e,t){let r=new URLSearchParams({base:e.base,style:e.style,baseColor:e.baseColor,theme:e.theme,iconLibrary:e.iconLibrary,font:e.font,rtl:String(t||e.rtl),menuAccent:e.menuAccent,menuColor:e.menuColor,radius:e.radius});return `${Tn()}?${r.toString()}`}async function On(e$1,t$1){if(e$1===true){let r=await ma(),{selectedPreset:i}=await _e({type:"select",name:"selectedPreset",message:`Which ${e.info("preset")} would you like to use?`,choices:[...r.map(n=>({title:n.title,description:n.description,value:n.name})),{title:"Custom",description:"Build your own on https://ui.shadcn.com",value:"custom"}]});if(!i)return null;if(i==="custom"){let n=Dr(t$1?{rtl:"true"}:void 0);return t.info(`
|
|
56
56
|
Opening ${e.info(n)} in your browser...
|
|
57
|
-
`),await Tr(n),null}return r.find(n=>n.name===i)??null}if(typeof e$1=="string"){if(N(e$1))return {_isUrl:true,url:e$1};let r=await na(e$1);if(!r){let n=(await ma()).map(o=>o.name).join(", ");t.error(`Preset "${e$1}" not found. Available presets: ${n}`),process.exit(1);}return r}return null}function
|
|
57
|
+
`),await Tr(n),null}return r.find(n=>n.name===i)??null}if(typeof e$1=="string"){if(N(e$1))return {_isUrl:true,url:e$1};let r=await na(e$1);if(!r){let n=(await ma()).map(o=>o.name).join(", ");t.error(`Preset "${e$1}" not found. Available presets: ${n}`),process.exit(1);}return r}return null}function Fn(e){switch(e){case "vite":return [{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:dt`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:
|
|
64
|
+
`}];case "next":return [{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:dt`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:
|
|
69
|
+
`}];case "start":return [{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:dt`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,19 +76,19 @@ function App() {
|
|
|
76
76
|
<ComponentExample />
|
|
77
77
|
);
|
|
78
78
|
}
|
|
79
|
-
`}];default:return []}}function
|
|
79
|
+
`}];default:return []}}function Dr(e){let t=new URL(`${Ar}/create`);if(e)for(let[r,i]of Object.entries(e))t.searchParams.set(r,i);return t.toString()}function Tn(){return `${Ar}/init`}var Ln=z.object({component:z.string().optional(),yes:z.boolean(),cwd:z.string(),path:z.string().optional()}),Vr=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$1,t$1)=>{try{let r=Ln.parse({component:e$1,...t$1}),i=E__default.resolve(r.cwd);existsSync(i)||(t.error(`The path ${i} does not exist. Please try again.`),process.exit(1));let n=await j(i);n||(t.warn(`Configuration is missing. Please run ${e.success("init")} to create a components.json file.`),process.exit(1));let o=await ca();if(o||(Z(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let c=n.resolvedPaths.components,l=o.filter(d=>{for(let g of d.files??[]){let w=E__default.resolve(c,typeof g=="string"?g:g.path);if(existsSync(w))return !0}return !1}),m=[];for(let d of l){let g=await Lr(d,n);g.length&&m.push({name:d.name,changes:g});}m.length||(t.info("No updates found."),process.exit(0)),t.info("The following components have updates available:");for(let d of m){t.info(`- ${d.name}`);for(let g of d.changes)t.info(` - ${g.filePath}`);}t.break(),t.info(`Run ${e.success("diff <component>")} to see the changes.`),process.exit(0);}let a=o.find(c=>c.name===r.component);a||(t.error(`The component ${e.success(r.component)} does not exist.`),process.exit(1));let s=await Lr(a,n);s.length||(t.info(`No updates found for ${r.component}.`),process.exit(0));for(let c of s)t.info(`- ${c.filePath}`),await Vn(c.patch),t.info("");}catch(r){Z(r);}});async function Lr(e,t){let r=await ia(t.style,[e]),i=await ga(t.tailwind.baseColor);if(!r)return [];let n=[];for(let o of r){let a=await ja(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 l=await promises.readFile(c,"utf8");if(typeof s=="string"||!s.content)continue;let m=await K({filename:s.path,raw:s.content,config:t,baseColor:i}),d=diffLines(m,l);d.length>1&&n.push({filePath:c,patch:d});}}return n}async function Vn(e$1){e$1.forEach(t=>{if(t)return t.added?process.stdout.write(e.success(t.value)):t.removed?process.stdout.write(e.error(t.value)):process.stdout.write(t.value)});}var Mr=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{t.info("> project info"),console.log(await q(e.cwd)),t.break(),t.info("> components.json"),console.log(await j(e.cwd));}catch(t){Z(t);}});var oe="latest",Le=[{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
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}}}}],De=[`shadcn@${oe}`],
|
|
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}}}}],De=[`shadcn@${oe}`],wt=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$1){t.break(),Z(t$1);}}),Jn=ht.object({client:ht.enum(["claude","cursor","vscode","codex","opencode"]),cwd:ht.string()});wt.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${Le.map(e=>e.name).join(", ")})`).action(async(e$1,t$1)=>{try{let i=(t$1.parent?.opts()||{}).cwd||process.cwd(),n=e$1.client;if(!n){let l=await _e({type:"select",name:"client",message:"Which MCP client are you using?",choices:Le.map(m=>({title:m.label,value:m.name}))});l.client||(t.break(),process.exit(1)),n=l.client;}let o=Jn.parse({client:n,cwd:i}),a=await j(o.cwd);if(o.client==="codex"){if(a)await U([],De,a,{silent:!1});else {let l=await a$1(o.cwd),m=l==="npm"?"install":"add",d=l==="npm"?"--save-dev":"-D",g=u("Installing dependencies...").start();await execa(l,[m,d,...De],{cwd:o.cwd}),g.succeed("Installing dependencies.");}t.break(),t.log("To configure the shadcn MCP server in Codex:"),t.break(),t.log(`1. Open or create the file ${e.info("~/.codex/config.toml")}`),t.log("2. Add the following configuration:"),t.log(),t.info(`[mcp_servers.shadcn]
|
|
83
83
|
command = "npx"
|
|
84
|
-
args = ["shadcn@${oe}", "mcp"]`),t.break(),t.info("3. Restart Codex to load the MCP server"),t.break(),process.exit(0);}let s=u("Configuring MCP server...").start(),c=await
|
|
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
|
|
86
|
-
`),a.succeed("Updated package.json."),await U(["radix-ui"],[],e$1,{silent:!1});}else a.succeed("No packages found in source files.");}catch{a.fail("Failed to update package.json"),t.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui");}}async function oo(e){let t=/import\s+(?:(type)\s+)?(?:\*\s+as\s+(\w+)|{([^}]+)})\s+from\s+(["'])@radix-ui\/react-([^"']+)\4(;?)/g,r=[],i=[],n=[],o='"',a=false,s=e,c;for(;(c=t.exec(e))!==null;){let[u,h,b,v,W,
|
|
84
|
+
args = ["shadcn@${oe}", "mcp"]`),t.break(),t.info("3. Restart Codex to load the MCP server"),t.break(),process.exit(0);}let s=u("Configuring MCP server...").start(),c=await Kn(o);if(s.succeed("Configuring MCP server."),a)await U([],De,a,{silent:!1});else {let l=await a$1(o.cwd),m=l==="npm"?"install":"add",d=l==="npm"?"--save-dev":"-D",g=u("Installing dependencies...").start();await execa(l,[m,d,...De],{cwd:o.cwd}),g.succeed("Installing dependencies.");}t.break(),t.success(`Configuration saved to ${c}.`),t.break();}catch(r){Z(r);}});var Yn=(e,t)=>t;async function Kn(e){let{client:t,cwd:r}=e,i=Le.find(c=>c.name===t);if(!i)throw new Error(`Unknown client: ${t}. Available clients: ${Le.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=Sr(a,i.config,{arrayMerge:Yn});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 Gr(e$1){if(!e$1.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let t$1=e$1.resolvedPaths.ui,[r,i]=await Promise.all([bt("**/*.{js,ts,jsx,tsx}",{cwd:t$1}),ea()]);if(Object.keys(i).length===0)throw new Error("Something went wrong fetching the registry icons.");let n=Object.entries(H).map(([m,d])=>({title:d.name,value:m})),o=await _e([{type:"select",name:"sourceLibrary",message:`Which icon library would you like to ${e.info("migrate from")}?`,choices:n},{type:"select",name:"targetLibrary",message:`Which icon library would you like to ${e.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=H[o.targetLibrary],{confirm:c}=await _e({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${e.info(r.length)} files in ${e.info(`./${E__default.relative(e$1.resolvedPaths.cwd,t$1)}`)} from ${e.info(a.name)} to ${e.info(s.name)}. Continue?`});c||(t.info("Migration cancelled."),process.exit(0)),s.package&&await U([s.package],[],e$1,{silent:false});let l=u("Migrating icons...")?.start();await Promise.all(r.map(async m=>{l.text=`Migrating ${m}...`;let d=E__default.join(t$1,m),g=await promises.readFile(d,"utf-8"),w=await to(g,o.sourceLibrary,o.targetLibrary,i);await promises.writeFile(d,w);})),l.succeed("Migration complete.");}async function to(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`),l=s.createSourceFile(c,e,{scriptKind:ScriptKind.TSX}),m=[];for(let d of l.getImportDeclarations()??[])if(d.getModuleSpecifier()?.getText()===`"${n}"`){for(let g of d.getNamedImports()??[]){let w=g.getName(),u=Object.values(i).find(h=>h[t]===w)?.[r];!u||m.includes(u)||(m.push(u),g.remove(),l.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).filter(h=>h.getTagNameNode()?.getText()===w).forEach(h=>h.getTagNameNode()?.replaceWithText(u)));}d.getNamedImports()?.length===0&&d.remove();}return m.length>0&&l.addImportDeclaration({moduleSpecifier:o,namedImports:m.map(d=>({name:d}))}),await l.getText()}function io(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function no(e,t,r,i){let o=e.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").trim().split(",").map(a=>a.trim()).filter(Boolean);for(let a of o){let s=a.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?$/),c=a.match(/^(\w+)\s+as\s+(\w+)$/);if(s){let l=s[1],m=s[2];i==="slot"&&l==="Slot"&&!m?r.push({name:"Slot",alias:"SlotPrimitive",isType:true}):r.push({name:l,alias:m,isType:true});}else if(c){let l=c[1],m=c[2];i==="slot"&&l==="Slot"&&m==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:l,alias:m,isType:t});}else i==="slot"&&a==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:a,isType:t});}}async function Jr(e$1,t$1={}){let r,i;if(t$1.path){if(i=e$1.resolvedPaths.cwd,t$1.path.includes("*"))r=await bt(t$1.path,{cwd:i,onlyFiles:true,ignore:["**/node_modules/**"]});else {let c=E__default.resolve(i,t$1.path),l=await promises.stat(c).catch(()=>null);if(!l)throw new Error(`File not found: ${t$1.path}`);if(l.isDirectory())i=c,r=await bt("**/*.{js,ts,jsx,tsx}",{cwd:i,onlyFiles:true,ignore:["**/node_modules/**"]});else if(l.isFile())r=[t$1.path];else throw new Error(`Unsupported path type: ${t$1.path}`)}if(r.length===0)throw new Error(`No files found matching: ${t$1.path}`)}else {if(!e$1.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");i=e$1.resolvedPaths.ui,r=await bt("**/*.{js,ts,jsx,tsx}",{cwd:i,onlyFiles:true});}if(!t$1.yes){let s=t$1.path?t$1.path:`./${E__default.relative(e$1.resolvedPaths.cwd,i)}`,{confirm:c}=await _e({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${e.info(r.length)} file(s) in ${e.info(s)} to ${e.info("radix-ui")}. Continue?`});c||(t.info("Migration cancelled."),process.exit(0));}let n=u("Migrating imports...")?.start(),o=new Set;await Promise.all(r.map(async s=>{n.text=`Migrating ${s}...`;let c=E__default.join(i,s),l=await promises.readFile(c,"utf-8"),{content:m,replacedPackages:d}=await oo(l);d.forEach(g=>o.add(g)),await promises.writeFile(c,m);})),n.succeed("Migrating imports.");let a=u("Updating package.json...")?.start();try{let s=p(e$1.resolvedPaths.cwd,!1);if(!s){a.fail("Could not read package.json"),t.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);if(c.length>0){if(s.dependencies||(s.dependencies={}),s.dependencies?.["radix-ui"]||s.devDependencies?.["radix-ui"])a.succeed("radix-ui already in package.json.");else {s.dependencies["radix-ui"]="latest";let m=E__default.join(e$1.resolvedPaths.cwd,"package.json");await promises.writeFile(m,JSON.stringify(s,null,2)+`
|
|
86
|
+
`),a.succeed("Updated package.json."),await U(["radix-ui"],[],e$1,{silent:!1});}t.info(""),t.info("Migration complete. The following packages may be removed if no longer in use:"),t.info(e.info(c.join(", "))),t.info("Please review your codebase before removing.");}else a.succeed("No packages found in source files.");}catch{a.fail("Failed to update package.json"),t.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui");}}async function oo(e){let t=/import\s+(?:(type)\s+)?(?:\*\s+as\s+(\w+)|{([^}]+)})\s+from\s+(["'])@radix-ui\/react-([^"']+)\4(;?)/g,r=[],i=[],n=[],o='"',a=false,s=e,c;for(;(c=t.exec(e))!==null;){let[u,h,b,v,W,T,X]=c;if(T==="icons"||T.startsWith("icons/"))continue;i.push(u),i.length===1&&(o=W,a=X===";"),n.push(`@radix-ui/react-${T}`);let A=!!h;if(b){let ze=io(T);r.push({name:ze,alias:b,isType:A});}else v&&no(v,A,r,T);}if(r.length===0)return {content:e,replacedPackages:[]};let l=r.filter((u,h,b)=>h===b.findIndex(v=>v.name===u.name&&v.alias===u.alias&&v.isType===u.isType)),d=`import { ${l.map(u=>{let h=u.isType?"type ":"";return u.alias?`${h}${u.name} as ${u.alias}`:`${h}${u.name}`}).join(", ")} } from ${o}radix-ui${o}${a?";":""}`;s=i.reduce((u,h,b)=>u.replace(h,b===0?d:""),s),s=s.replace(/\n\s*\n\s*\n/g,`
|
|
87
87
|
|
|
88
|
-
`),
|
|
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,(W,
|
|
90
|
-
`));let w=Array.from(new Set(n));return {content:s,replacedPackages:w}}var ao=["sidebar.tsx","pagination.tsx","calendar.tsx"],co="https://ui.shadcn.com/docs/rtl#manual-migration-optional";async function
|
|
91
|
-
`),n.succeed("Updated components.json.");}catch{throw n.fail("Failed to update components.json."),new Error("Could not update components.json. Please manually set `rtl: true`.")}let o=u("Migrating files to RTL...").start(),a=0,s=[];if(await Promise.all(r.map(async c=>{o.text=`Migrating ${c}...`;let
|
|
92
|
-
Before you can run a migration, you must create a valid ${e.info("components.json")} file by running the ${e.info("init")} command.`),t.error(`Learn more at ${e.info("https://ui.shadcn.com/docs/components-json")}.`),t.break(),process.exit(1);}}var
|
|
93
|
-
Before you can build the registry, you must create a valid ${e.info("components.json")} file by running the ${e.info("init")} command.`),t.break(),process.exit(1);}}var vo=z.object({cwd:z.string(),registryFile:z.string(),outputDir:z.string(),verbose:z.boolean().optional().default(false)}),
|
|
88
|
+
`),l.some(u=>u.name==="Slot"&&u.alias==="SlotPrimitive")&&(s=s.split(`
|
|
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,(W,T,X)=>{let A=X.substring(0,T),ze=(A.match(/"/g)||[]).length,pi=(A.match(/'/g)||[]).length;return ze%2!==0||pi%2!==0?W:"__SLOT_PLACEHOLDER__"}),v=v.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),v}).join(`
|
|
90
|
+
`));let w=Array.from(new Set(n));return {content:s,replacedPackages:w}}var ao=["sidebar.tsx","pagination.tsx","calendar.tsx"],co="https://ui.shadcn.com/docs/rtl#manual-migration-optional";async function Yr(e$2,t$1={}){let r,i;if(t$1.path){if(i=e$2.resolvedPaths.cwd,t$1.path.includes("*"))r=await bt(t$1.path,{cwd:i,onlyFiles:true,ignore:["**/node_modules/**"]});else {let l=E__default.resolve(i,t$1.path),m=await promises.stat(l).catch(()=>null);if(!m)throw new Error(`File not found: ${t$1.path}`);if(m.isDirectory())i=l,r=await bt("**/*.{js,ts,jsx,tsx}",{cwd:i,onlyFiles:true,ignore:["**/node_modules/**"]});else if(m.isFile())r=[t$1.path];else throw new Error(`Unsupported path type: ${t$1.path}`)}if(r.length===0)throw new Error(`No files found matching: ${t$1.path}`)}else {if(!e$2.resolvedPaths.ui)throw new Error("Could not find a valid `ui` path in your `components.json`. Please provide a path or glob pattern.");i=e$2.resolvedPaths.ui,r=await bt("**/*.{js,ts,jsx,tsx}",{cwd:i,onlyFiles:true});}if(!t$1.yes){let c=t$1.path?t$1.path:`./${E__default.relative(e$2.resolvedPaths.cwd,i)}`,{confirm:l}=await _e({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${e.info(r.length)} file(s) in ${e.info(c)} to RTL. Continue?`});l||(t.info("Migration cancelled."),process.exit(0));}let n=u("Updating components.json...").start();try{let c=E__default.resolve(e$2.resolvedPaths.cwd,"components.json"),l=JSON.parse(await promises.readFile(c,"utf-8"));l.rtl=!0,await promises.writeFile(c,JSON.stringify(l,null,2)+`
|
|
91
|
+
`),n.succeed("Updated components.json.");}catch{throw n.fail("Failed to update components.json."),new Error("Could not update components.json. Please manually set `rtl: true`.")}let o=u("Migrating files to RTL...").start(),a=0,s=[];if(await Promise.all(r.map(async c=>{o.text=`Migrating ${c}...`;let l=E__default.join(i,c),m=await promises.readFile(l,"utf-8"),d=await e$1(m,true);d!==m&&(await promises.writeFile(l,d),a++);let g=E__default.basename(c);ao.includes(g)&&s.push(c);})),o.succeed(`Migration complete. ${a} file(s) transformed.`),s.length>0){t.break(),t.warn("The following components may need manual RTL adjustments:");for(let c of s)t.info(` - ${c}`);t.break(),t.info(`See ${e.info(co)} for more information.`);}}async function qr(e$1){let t$1={};if(!R.existsSync(e$1.cwd)||!R.existsSync(E__default.resolve(e$1.cwd,"package.json")))return t$1["1"]=true,{errors:t$1,config:null};if(!R.existsSync(E__default.resolve(e$1.cwd,"components.json")))return t$1["3"]=true,{errors:t$1,config:null};try{let r=await j(e$1.cwd);return {errors:t$1,config:r}}catch{t.break(),t.error(`An invalid ${e.info("components.json")} file was found at ${e.info(e$1.cwd)}.
|
|
92
|
+
Before you can run a migration, you must create a valid ${e.info("components.json")} file by running the ${e.info("init")} command.`),t.error(`Learn more at ${e.info("https://ui.shadcn.com/docs/components-json")}.`),t.break(),process.exit(1);}}var Hr=[{name:"icons",description:"migrate your ui components to a different icon library."},{name:"radix",description:"migrate to radix-ui."},{name:"rtl",description:"migrate your components to support RTL (right-to-left)."}],fo=z.object({cwd:z.string(),list:z.boolean(),yes:z.boolean(),migration:z.string().refine(e=>e&&Hr.some(t=>t.name===e),{message:"You must specify a valid migration. Run `shadcn migrate --list` to see available migrations."}).optional(),path:z.string().optional()}),Xr=new Command().name("migrate").description("run a migration.").argument("[migration]","the migration to run.").argument("[path]","optional path or glob pattern to migrate.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-l, --list","list all migrations.",false).option("-y, --yes","skip confirmation prompt.",false).action(async(e,t$1,r)=>{try{let i=fo.parse({cwd:E__default.resolve(r.cwd),migration:e,path:t$1,list:r.list,yes:r.yes});if(i.list||!i.migration){t.info("Available migrations:");for(let a of Hr)t.info(`- ${a.name}: ${a.description}`);return}if(!i.migration)throw new Error("You must specify a migration. Run `shadcn migrate --list` to see available migrations.");let{errors:n,config:o}=await qr(i);if(n["1"]||n["3"])throw new Error("No `components.json` file found. Ensure you are at the root of your project.");if(!o)throw new Error("Something went wrong reading your `components.json` file. Please ensure you have a valid `components.json` file.");i.migration==="icons"&&await Gr(o),i.migration==="radix"&&await Jr(o,{yes:i.yes,path:i.path}),i.migration==="rtl"&&await Yr(o,{yes:i.yes,path:i.path});}catch(i){t.break(),Z(i);}});var go=z.object({cwd:z.string(),silent:z.boolean()}),Zr=new Command().name("add").description("add registries to your project").argument("[registries...]","registries (@namespace) or registry URLs (@namespace=url)").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",false).action(async(e,t$1)=>{try{let r=go.parse({cwd:E__default.resolve(t$1.cwd),silent:t$1.silent}),i=e.length>0?e:await yo({silent:r.silent});await wo(i,r.cwd,{silent:r.silent});}catch(r){t.break(),Z(r);}});function ho(e$1){let[t,...r]=e$1.split("="),i=r.length>0?r.join("="):void 0;if(!t.startsWith("@"))throw new Error(`Invalid registry namespace: ${e.info(t)}. Registry names must start with @ (e.g., @acme).`);return {namespace:t,url:i}}function Ct(e,t,r){return `${e} ${e===1?t:r}`}async function wo(e$1,t$1,r){let i=E__default.resolve(t$1,"components.json");if(!R.existsSync(i))throw new Error(`No ${e.info("components.json")} found. Run ${e.info("shadcn init")} first.`);let n=e$1.map(ho),o=n.filter(u=>!u.url),a=[];if(o.length>0){let u$1=u("Fetching registries.",{silent:r.silent}).start(),h=await ka();if(!h)throw u$1.fail(),new Error("Failed to fetch registries.");u$1.succeed(),a=h;}let s={};for(let{namespace:u,url:h}of n){if(u in c$1){t.warn(`${e.info(u)} is a built-in registry and cannot be added.`);continue}if(h){if(!h.includes("{name}"))throw new Error(`Invalid registry URL for ${e.info(u)}. URL must include {name} placeholder. Example: ${e.info(`${u}=https://example.com/r/{name}.json`)}`);s[u]=h;}else {let b=a.find(v=>v.name===u);if(!b)throw new Error(`Registry ${e.info(u)} not found. Provide a URL: ${e.info(`${u}=https://.../{name}.json`)}`);s[u]=b.url;}}if(Object.keys(s).length===0)return {addedRegistries:[]};let c=await R.readJson(i),l=c.registries||{},m={},d=[];for(let[u,h]of Object.entries(s))l[u]?d.push(u):m[u]=h;if(Object.keys(m).length===0){if(d.length>0&&!r.silent){u(`Skipped ${Ct(d.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let u of d)t.log(` - ${u}`);}else r.silent||t.info("No new registries to add.");return}let g={...c,registries:{...l,...m}},w=u("Updating components.json.",{silent:r.silent}).start();if(await R.writeJson(i,g,{spaces:2}),w.succeed(),!r.silent){let u$1=Object.keys(m);u(`Added ${Ct(u$1.length,"registry","registries")}:`,{silent:r.silent})?.succeed();for(let h of u$1)t.log(` - ${h}`);if(d.length>0){u(`Skipped ${Ct(d.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let h of d)t.log(` - ${h}`);}}}async function yo(e){let t$1=u("Fetching registries.",{silent:e.silent}).start(),r=await ka();if(!r)throw t$1.fail(),new Error("Failed to fetch registries.");t$1.succeed();let i=[...r].sort((o,a)=>o.name.localeCompare(a.name)),{selected:n}=await _e({type:"autocompleteMultiselect",name:"selected",message:"Which registries would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:false,choices:i.map(o=>({title:o.name,description:o.description,value:o.name}))});return n?.length||(t.warn("No registries selected. Exiting."),t.info(""),process.exit(1)),n}var ei=new Command().name("registry").description("manage registries").addCommand(Zr);async function ti(e$1){let t$1={},r={cwd:e$1.cwd,registryFile:E__default.resolve(e$1.cwd,e$1.registryFile),outputDir:E__default.resolve(e$1.cwd,e$1.outputDir)};if(!R.existsSync(r.registryFile))return t$1["13"]=true,{errors:t$1,resolvePaths:null,config:null};if(!R.existsSync(E__default.resolve(e$1.cwd,"components.json")))return t$1["3"]=true,{errors:t$1,resolvePaths:null,config:null};await R.mkdir(r.outputDir,{recursive:true});try{let i=await j(e$1.cwd);return {errors:t$1,config:i,resolvePaths:r}}catch{t.break(),t.error(`An invalid ${e.info("components.json")} file was found at ${e.info(e$1.cwd)}.
|
|
93
|
+
Before you can build the registry, you must create a valid ${e.info("components.json")} file by running the ${e.info("init")} command.`),t.break(),process.exit(1);}}var vo=z.object({cwd:z.string(),registryFile:z.string(),outputDir:z.string(),verbose:z.boolean().optional().default(false)}),ri=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 So({cwd:E.resolve(t.cwd),registryFile:e,outputDir:t.output,verbose:t.verbose});});async function So(e$1){try{let t$1=vo.parse(e$1),[{errors:r,resolvePaths:i,config:n$1},o]=await Promise.all([ti(t$1),q(t$1.cwd)]);(r["3"]||!n$1||!o)&&(t.error(`A ${e.info("components.json")} file is required to build the registry. Run ${e.info("shadcn init")} to create one.`),t.break(),process.exit(1)),(r["13"]||!i)&&(t.error(`We could not find a registry file at ${e.info(E.resolve(t$1.cwd,t$1.registryFile))}.`),t.break(),process.exit(1));let a=await Y.readFile(i.registryFile,"utf-8"),s=o$1.safeParse(JSON.parse(a));s.success||(t.error(`Invalid registry file found at ${e.info(i.registryFile)}.`),t.break(),process.exit(1));let c=u("Building registry..."),l=await Ro(s.data,n$1,o);for(let m of l.items)m.files=m.files?.filter((d,g,w)=>g===w.findIndex(u=>u.path===d.path)),m.dependencies&&(m.dependencies=m.dependencies.filter((d,g,w)=>g===w.findIndex(u=>u===d)));for(let m of l.items){if(!m.files)continue;c.start(`Building ${m.name}...`),m.$schema="https://ui.shadcn.com/schema/registry-item.json";for(let g of m.files){let w=E.resolve(i.cwd,g.path);try{if(!(await Y.stat(w)).isFile())continue;g.content=await Y.readFile(w,"utf-8");}catch(u){console.error("Error reading file in registry build:",w,u);continue}}let d=n.safeParse(m);if(!d.success){t.error(`Invalid registry item found for ${e.info(m.name)}.`);continue}await Y.writeFile(E.resolve(i.outputDir,`${d.data.name}.json`),JSON.stringify(d.data,null,2));}if(await Y.copyFile(i.registryFile,E.resolve(i.outputDir,"registry.json")),c.succeed("Building registry."),t$1.verbose){u(`The registry has ${e.info(l.items.length.toString())} items:`).succeed();for(let m of l.items){t.log(` - ${m.name} (${e.info(m.type)})`);for(let d of m.files??[])t.log(` - ${d.path}`);}}}catch(t$1){t.break(),Z(t$1);}}async function Ro(e,t,r){for(let i of e.items)if(i.files?.length)for(let n of i.files){let o=await M(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 ii=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()=>{t.warn(`The ${e.info("shadcn registry:mcp")} command is deprecated. Use the ${e.info("shadcn mcp")} command instead.`),t.break();});var ko=z.object({cwd:z.string(),query:z.string().optional(),limit:z.number().optional(),offset:z.number().optional()}),si=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=ko.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=o({style:"new-york",resolvedPaths:{cwd:r.cwd}}),n=P(i),o$1=E__default.resolve(r.cwd,"components.json");if(R.existsSync(o$1)){let m=await R.readJson(o$1),d=c.partial().parse(m);n=P({...i,...d});}let a=n;try{let m=await j(r.cwd);m&&(a=P(m));}catch{}let{config:s,newRegistries:c$1}=await F(e.map(m=>`${m}/registry`),a,{silent:!0,writeFile:!1});c$1.length>0&&(a.registries=s.registries),R$1(e,a);let l=await oa(e,{query:r.query,limit:r.limit,offset:r.offset,config:a});console.log(JSON.stringify(l,null,2)),process.exit(0);}catch(r){Z(r);}finally{Q();}});var jo=z.object({cwd:z.string()}),mi=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=jo.parse({cwd:E__default.resolve(t.cwd)});await B(r.cwd);let i=P({}),n=E__default.resolve(r.cwd,"components.json");if(R.existsSync(n)){let l=await R.readJson(n),m=c.partial().parse(l);i=P(m);}let o=i;try{let l=await j(r.cwd);l&&(o=P(l));}catch{}let{config:a,newRegistries:s}=await F(e,o,{silent:!0,writeFile:!1});s.length>0&&(o.registries=a.registries),R$1(e,o);let c$1=await $(e,{config:o});console.log(JSON.stringify(c$1,null,2)),process.exit(0);}catch(r){Z(r);}finally{Q();}});var fi={version:"3.8.2"};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function No(){let e=new Command().name("shadcn").description("add items from registries to your project").version(fi.version,"-v, --version","display the version number");e.addCommand(Rr).addCommand(_r).addCommand(Er).addCommand(Vr).addCommand(mi).addCommand(si).addCommand(Xr).addCommand(Mr).addCommand(Fr).addCommand(wt).addCommand(ei),e.addCommand(ri).addCommand(ii),e.parse();}No();//# sourceMappingURL=index.js.map
|
|
94
94
|
//# sourceMappingURL=index.js.map
|