shadcn 2.9.3 → 3.0.0
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/chunk-FGQE6PDN.js +72 -0
- package/dist/chunk-FGQE6PDN.js.map +1 -0
- package/dist/chunk-GJTZRXUG.js +30 -0
- package/dist/chunk-GJTZRXUG.js.map +1 -0
- package/dist/chunk-VVOKVGPU.js +2 -0
- package/dist/chunk-VVOKVGPU.js.map +1 -0
- package/dist/index-J2j472vm.d.ts +308 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +48 -74
- package/dist/index.js.map +1 -1
- package/dist/mcp/index.js +1 -3
- package/dist/mcp/index.js.map +1 -1
- package/dist/registry/index.d.ts +107 -1
- package/dist/registry/index.js +1 -2
- package/dist/registry/index.js.map +1 -1
- package/dist/{index-4a90b588.d.ts → schema/index.d.ts} +625 -527
- package/dist/schema/index.js +2 -0
- package/dist/schema/index.js.map +1 -0
- package/package.json +36 -29
- package/dist/chunk-BJAN3BBB.js +0 -31
- package/dist/chunk-BJAN3BBB.js.map +0 -1
- package/dist/chunk-UBC2EX4X.js +0 -37
- package/dist/chunk-UBC2EX4X.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,84 +1,58 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { a as a$1 } from './chunk-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
import
|
|
6
|
-
import * as x from 'path';
|
|
7
|
-
import x__default, { basename } from 'path';
|
|
8
|
-
import Z from 'fs-extra';
|
|
9
|
-
import S$1 from 'postcss';
|
|
10
|
-
import vr from 'postcss/lib/at-rule';
|
|
11
|
-
import { z } from 'zod';
|
|
12
|
-
import { detect } from '@antfu/ni';
|
|
13
|
-
import { execa } from 'execa';
|
|
14
|
-
import Ye from 'prompts';
|
|
15
|
-
import Ii, { tmpdir } from 'os';
|
|
16
|
-
import { Project, ScriptKind, SyntaxKind } from 'ts-morph';
|
|
17
|
-
import { transformFromAstSync } from '@babel/core';
|
|
18
|
-
import { parse } from '@babel/parser';
|
|
19
|
-
import Zr from '@babel/plugin-transform-typescript';
|
|
20
|
-
import * as Ie from 'recast';
|
|
21
|
-
import { loadConfig } from 'tsconfig-paths';
|
|
22
|
-
import { Command } from 'commander';
|
|
23
|
-
import * as M from 'fs/promises';
|
|
24
|
-
import M__default from 'fs/promises';
|
|
25
|
-
import { diffLines } from 'diff';
|
|
26
|
-
import { randomBytes } from 'crypto';
|
|
27
|
-
import Qi from 'fast-glob';
|
|
28
|
-
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
2
|
+
import {b as b$1,a as a$1}from'./chunk-FGQE6PDN.js';import {a,L as L$1,O,W,r,c,Q,M,o,h,p as p$1,s,i,_,aa,f,g,d,e,q as q$1,m,K as K$1,b,Z,da,ba,ea,H,J,N,fa,P,j,$,G,n,U,l,R,k,I,S,D as D$1,F as F$1,E,T}from'./chunk-GJTZRXUG.js';export{da as fetchTree,ea as getItemTargetPath,Y as getRegistriesConfig,V as getRegistry,ba as getRegistryBaseColor,aa as getRegistryBaseColors,$ as getRegistryIcons,W as getRegistryItems,_ as getRegistryStyles,Z as getShadcnRegistryIndex,X as resolveRegistryItems,ca as resolveTree}from'./chunk-GJTZRXUG.js';import {p,h as h$1,g as g$1}from'./chunk-VVOKVGPU.js';import*as A from'path';import A__default,{join}from'path';import {promises,existsSync}from'fs';import K from'fs-extra';import x from'postcss';import $r from'postcss/lib/at-rule';import He,{z}from'zod';import {execa}from'execa';import Ge from'prompts';import ri,{tmpdir}from'os';import {SyntaxKind,Project,ScriptKind}from'ts-morph';import {Command}from'commander';import ui from'deepmerge';import*as L from'fs/promises';import L__default from'fs/promises';import {diffLines}from'diff';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {randomBytes}from'crypto';import zi from'fast-glob';async function Ot(e){let t={};if(!K.existsSync(e.cwd)||!K.existsSync(A__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,projectInfo:null};let r$1=s("Preflight checks.",{silent:e.silent}).start();K.existsSync(A__default.resolve(e.cwd,"components.json"))&&!e.force&&(r$1?.fail(),r.break(),r.error(`A ${c.info("components.json")} file already exists at ${c.info(e.cwd)}.
|
|
3
|
+
To start over, remove the ${c.info("components.json")} file and run ${c.info("init")} again.`),r.break(),process.exit(1)),r$1?.succeed();let i=s("Verifying framework.",{silent:e.silent}).start(),o$1=await o(e.cwd);(!o$1||o$1?.framework.name==="manual")&&(t["7"]=true,i?.fail(),r.break(),o$1?.framework.links.installation&&r.error(`We could not detect a supported framework at ${c.info(e.cwd)}.
|
|
4
|
+
Visit ${c.info(o$1?.framework.links.installation)} to manually configure your project.
|
|
5
|
+
Once configured, you can use the cli to add components.`),r.break(),process.exit(1)),i?.succeed(`Verifying framework. Found ${c.info(o$1.framework.label)}.`);let n="Validating Tailwind CSS.";o$1.tailwindVersion==="v4"&&(n=`Validating Tailwind CSS config. Found ${c.info("v4")}.`);let a=s(n,{silent:e.silent}).start();o$1.tailwindVersion==="v3"&&(!o$1?.tailwindConfigFile||!o$1?.tailwindCssFile)?(t["5"]=true,a?.fail()):o$1.tailwindVersion==="v4"&&!o$1?.tailwindCssFile?(t["5"]=true,a?.fail()):o$1.tailwindVersion?a?.succeed():(t["5"]=true,a?.fail());let s$1=s("Validating import alias.",{silent:e.silent}).start();return o$1?.aliasPrefix?s$1?.succeed():(t["6"]=true,s$1?.fail()),Object.keys(t).length>0&&(t["5"]&&(r.break(),r.error(`No Tailwind CSS configuration found at ${c.info(e.cwd)}.`),r.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),r.error("Install Tailwind CSS then try again."),o$1?.framework.links.tailwind&&r.error(`Visit ${c.info(o$1?.framework.links.tailwind)} to get started.`)),t["6"]&&(r.break(),r.error("No import alias found in your tsconfig.json file."),o$1?.framework.links.installation&&r.error(`Visit ${c.info(o$1?.framework.links.installation)} to learn how to set an import alias.`)),r.break(),process.exit(1)),{errors:t,projectInfo:o$1}}function $t(e,t){if(e.includes("\0"))return false;let r;try{r=e;let u="";for(;r!==u&&r.includes("%");)u=r,r=decodeURIComponent(r);}catch{return false}let i=A__default.normalize(r.replace(/\\/g,"/")),o=A__default.normalize(t),n=u=>u.replace(/\[\.\.\..*?\]/g,"").includes("..");if(n(i)||n(r)||n(e))return false;let a=u=>u.replace(/\[\.\.\..*?\]/g,""),s=a(e),c=a(r);if([/\.\.[\/\\]/,/[\/\\]\.\./,/\.\./,/\.\.%/,/\x00/,/[\x01-\x1f]/].some(u=>u.test(s)||u.test(c))||(e.includes("~")||r.includes("~"))&&(e.includes("../")||r.includes("../")))return false;if(/^[a-zA-Z]:[\/\\]/.test(r))return process.platform==="win32"?r.toLowerCase().startsWith(t.toLowerCase()):false;if(A__default.isAbsolute(i))return i.startsWith(o+A__default.sep);let d=A__default.resolve(o,i);return d.startsWith(o+A__default.sep)||d===o}async function Ve(e,t,r){if(!t.resolvedPaths.tailwindCss||!e||Object.keys(e).length===0)return;r={silent:false,...r};let i=t.resolvedPaths.tailwindCss,o=A__default.relative(t.resolvedPaths.cwd,i),n=s(`Updating ${c.info(o)}`,{silent:r.silent}).start(),a=await promises.readFile(i,"utf8"),s$1=await Er(a,e);await promises.writeFile(i,s$1,"utf8"),n.succeed();}async function Er(e,t){let r=[jr(t)],o=(await x(r).process(e,{from:void 0})).css;return o=o.replace(/\/\* ---break--- \*\//g,""),o=o.replace(/(\n\s*\n)+/g,`
|
|
29
6
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
7
|
+
`),o=o.trimEnd(),o}function jr(e){return {postcssPlugin:"update-css",Once(t){for(let[r,i]of Object.entries(e))if(r.startsWith("@")){let o=r.match(/@([a-zA-Z-]+)\s*(.*)/);if(!o)continue;let[,n,a]=o;if(n==="plugin"){if(!t.nodes?.find(c=>c.type==="atrule"&&c.name==="plugin"&&c.params===a)){let c=x.atRule({name:"plugin",params:a,raws:{semicolon:true,before:`
|
|
8
|
+
`}}),m=t.nodes?.filter(d=>d.type==="atrule"&&d.name==="import"),f=t.nodes?.filter(d=>d.type==="atrule"&&d.name==="plugin");if(f&&f.length>0){let d=f[f.length-1];t.insertAfter(d,c);}else if(m&&m.length>0){let d=m[m.length-1];t.insertAfter(d,c),t.insertBefore(c,x.comment({text:"---break---"})),t.insertAfter(c,x.comment({text:"---break---"}));}else t.prepend(c),t.insertBefore(c,x.comment({text:"---break---"})),t.insertAfter(c,x.comment({text:"---break---"}));}}else if(n==="keyframes"){let s=t.nodes?.find(m=>m.type==="atrule"&&m.name==="theme"&&m.params==="inline");s||(s=x.atRule({name:"theme",params:"inline",raws:{semicolon:true,between:" ",before:`
|
|
9
|
+
`}}),t.append(s),t.insertBefore(s,x.comment({text:"---break---"})));let c=x.atRule({name:"keyframes",params:a,raws:{semicolon:true,between:" ",before:`
|
|
10
|
+
`}});if(s.append(c),typeof i=="object")for(let[m,f]of Object.entries(i))ee(c,m,f);}else if(n==="utility"){let s=t.nodes?.find(c=>c.type==="atrule"&&c.name===n&&c.params===a);if(s){if(typeof i=="object")for(let[c,m]of Object.entries(i))if(typeof m=="string"){let f=s.nodes?.find(u=>u.type==="decl"&&u.prop===c),d=x.decl({prop:c,value:m,raws:{semicolon:true,before:`
|
|
11
|
+
`}});f?f.replaceWith(d):s.append(d);}else typeof m=="object"&&ee(s,c,m);}else {let c=x.atRule({name:n,params:a,raws:{semicolon:true,between:" ",before:`
|
|
12
|
+
`}});if(t.append(c),t.insertBefore(c,x.comment({text:"---break---"})),typeof i=="object")for(let[m,f]of Object.entries(i))if(typeof f=="string"){let d=x.decl({prop:m,value:f,raws:{semicolon:true,before:`
|
|
13
|
+
`}});c.append(d);}else typeof f=="object"&&ee(c,m,f);}}else Tt(t,n,a,i);}else ee(t,r,i);}}}function Tt(e,t,r,i){let o=e.nodes?.find(n=>n.type==="atrule"&&n.name===t&&n.params===r);if(o||(o=x.atRule({name:t,params:r,raws:{semicolon:true,between:" ",before:`
|
|
14
|
+
`}}),e.append(o),e.insertBefore(o,x.comment({text:"---break---"}))),typeof i=="object")for(let[n,a]of Object.entries(i))if(n.startsWith("@")){let s=n.match(/@([a-zA-Z-]+)\s*(.*)/);if(s){let[,c,m]=s;Tt(o,c,m,a);}}else ee(o,n,a);else if(typeof i=="string")try{let a=x.parse(`.temp{${i}}`).first;if(a&&a.nodes){let s=x.rule({selector:"temp",raws:{semicolon:!0,between:" ",before:`
|
|
15
|
+
`}});a.nodes.forEach(c=>{if(c.type==="decl"){let m=c.clone();m.raws.before=`
|
|
16
|
+
`,s.append(m);}}),s.nodes?.length&&o.append(s);}}catch(n){throw console.error("Error parsing at-rule content:",i,n),n}}function ee(e,t,r){let i=e.nodes?.find(o=>o.type==="rule"&&o.selector===t);if(i||(i=x.rule({selector:t,raws:{semicolon:true,between:" ",before:`
|
|
17
|
+
`}}),e.append(i)),typeof r=="object"){for(let[o,n]of Object.entries(r))if(typeof n=="string"){let a=x.decl({prop:o,value:n,raws:{semicolon:true,before:`
|
|
18
|
+
`}}),s=i.nodes?.find(c=>c.type==="decl"&&c.prop===o);s?s.replaceWith(a):i.append(a);}else if(typeof n=="object"){let a=o.startsWith("&")?t.replace(/^([^:]+)/,`$1${o.substring(1)}`):o;ee(e,a,n);}}else if(typeof r=="string")try{let n=x.parse(`.temp{${r}}`).first;n&&n.nodes&&n.nodes.forEach(a=>{if(a.type==="decl"){let s=a.clone();s.raws.before=`
|
|
19
|
+
`,i?.append(s);}});}catch(o){throw console.error("Error parsing rule content:",t,r,o),o}}async function Me(e,t,r){if(!t.resolvedPaths.tailwindCss||!Object.keys(e??{}).length)return;r={cleanupDefaultNextStyles:false,silent:false,tailwindVersion:"v3",overwriteCssVars:false,initIndex:true,...r};let i=t.resolvedPaths.tailwindCss,o=A__default.relative(t.resolvedPaths.cwd,i),n=s(`Updating CSS variables in ${c.info(o)}`,{silent:r.silent}).start(),a=await promises.readFile(i,"utf8"),s$1=await Nr(a,e??{},t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars,initIndex:r.initIndex});await promises.writeFile(i,s$1,"utf8"),n.succeed();}async function Nr(e,t,r,i={cleanupDefaultNextStyles:false,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:false,initIndex:true}){i={cleanupDefaultNextStyles:false,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:false,initIndex:true,...i};let o=[Fr(t)];if(i.cleanupDefaultNextStyles&&o.push(Dt()),i.tailwindVersion==="v4"){if(o=[],r.resolvedPaths?.cwd){let s=n(r.resolvedPaths.cwd);!s?.dependencies?.["tailwindcss-animate"]&&!s?.devDependencies?.["tailwindcss-animate"]&&i.initIndex&&o.push(Vr({params:"tw-animate-css"}));}o.push(Lr({params:"dark (&:is(.dark *))"})),i.cleanupDefaultNextStyles&&o.push(Dt()),o.push(Dr(t,{overwriteCssVars:i.overwriteCssVars})),o.push(Ar(t)),i.tailwindConfig&&(o.push(Mr(i.tailwindConfig)),o.push(Wr(i.tailwindConfig)),o.push(zr(i.tailwindConfig)));}r.tailwind.cssVariables&&i.initIndex&&o.push(Tr({tailwindVersion:i.tailwindVersion}));let a=(await x(o).process(e,{from:void 0})).css;return a=a.replace(/\/\* ---break--- \*\//g,""),i.tailwindVersion==="v4"&&(a=a.replace(/(\n\s*\n)+/g,`
|
|
34
20
|
|
|
35
|
-
`)
|
|
36
|
-
`}}),
|
|
37
|
-
`}}),
|
|
38
|
-
`}});
|
|
39
|
-
|
|
40
|
-
`}})
|
|
41
|
-
|
|
42
|
-
`}}),e.append(
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
`))
|
|
50
|
-
`}}),t.append(i),t.insertBefore(i,S$1.comment({text:"---break---"}))),r.forEach(({selector:o,apply:n})=>{i?.nodes?.find(s=>s.type==="rule"&&s.selector===o)||i?.append(S$1.rule({selector:o,nodes:[S$1.atRule({name:"apply",params:n,raws:{semicolon:!0,before:`
|
|
51
|
-
`}})],raws:{semicolon:!0,between:" ",before:`
|
|
52
|
-
`}}));});}}}function Cr(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 vr||(r=S$1.atRule({name:"layer",params:"base",nodes:[],raws:{semicolon:!0,before:`
|
|
53
|
-
`,between:" "}}),t.append(r),t.insertBefore(r,S$1.comment({text:"---break---"}))),r!==void 0&&Object.entries(e).forEach(([i,o])=>{let n=i==="light"?":root":`.${i}`;kr(r,n,o);});}}}function Dt(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 Ft(){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()),Dt(e);let r=e.nodes.find(i=>i.type==="atrule"&&i.params==="(prefers-color-scheme: dark)");r&&(Dt(r),r.nodes.length===0&&r.remove());}}}function kr(e,t,r){let i=e.nodes?.find(o=>o.type==="rule"&&o.selector===t);i||Object.keys(r).length>0&&(i=S$1.rule({selector:t,raws:{between:" ",before:`
|
|
54
|
-
`}}),e.append(i)),Object.entries(r).forEach(([o,n])=>{let a=`--${o.replace(/^--/,"")}`,s=S$1.decl({prop:a,value:n,raws:{semicolon:!0}}),c=i?.nodes.find(l=>l.type==="decl"&&l.prop===a);c?c.replaceWith(s):i?.append(s);});}function jr(e,t){return {postcssPlugin:"update-css-vars-v4",Once(r){Object.entries(e).forEach(([i,o])=>{let n=i==="light"?":root":`.${i}`;if(i==="theme"){n="@theme";let s=xe(r);Object.entries(o).forEach(([c,l])=>{let f=`--${c.replace(/^--/,"")}`,m=S$1.decl({prop:f,value:l,raws:{semicolon:!0}}),u=s?.nodes?.find(h=>h.type==="decl"&&h.prop===f);t.overwriteCssVars?u?u.replaceWith(m):s?.append(m):u||s?.append(m);});return}let a=r.nodes?.find(s=>s.type==="rule"&&s.selector===n);!a&&Object.keys(o).length>0&&(a=S$1.rule({selector:n,nodes:[],raws:{semicolon:!0,between:" ",before:`
|
|
55
|
-
`}}),r.append(a),r.insertBefore(a,S$1.comment({text:"---break---"}))),Object.entries(o).forEach(([s,c])=>{let l=`--${s.replace(/^--/,"")}`;l==="--sidebar-background"&&(l="--sidebar"),_t(c)&&(c=`hsl(${c})`);let f=S$1.decl({prop:l,value:c,raws:{semicolon:!0}}),m=a?.nodes.find(u=>u.type==="decl"&&u.prop===l);t.overwriteCssVars?m?m.replaceWith(f):a?.append(f):m||a?.append(f);});});}}}function Tr(e){return {postcssPlugin:"update-theme",Once(t){let r=Array.from(new Set(Object.keys(e).flatMap(n=>Object.keys(e[n]||{}))));if(!r.length)return;let i=xe(t),o=i.nodes?.filter(n=>n.type==="decl"&&n.prop.startsWith("--"));for(let n of r){let a=Object.values(e).find(m=>m[n])?.[n];if(!a)continue;if(n==="radius"){let m={sm:"calc(var(--radius) - 4px)",md:"calc(var(--radius) - 2px)",lg:"var(--radius)",xl:"calc(var(--radius) + 4px)"};for(let[u,h]of Object.entries(m)){let y=S$1.decl({prop:`--radius-${u}`,value:h,raws:{semicolon:!0}});i?.nodes?.find(R=>R.type==="decl"&&R.prop===y.prop)||i?.append(y);}continue}let s=_t(a)||Fr(a)?`--color-${n.replace(/^--/,"")}`:`--${n.replace(/^--/,"")}`;s==="--color-sidebar-background"&&(s="--color-sidebar");let c=`var(--${n})`;s==="--color-sidebar"&&(c="var(--sidebar)");let l=S$1.decl({prop:s,value:c,raws:{semicolon:!0}});i?.nodes?.find(m=>m.type==="decl"&&m.prop===l.prop)||(o?.length?i?.insertAfter(o[o.length-1],l):i?.append(l));}}}}function xe(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:!0,between:" ",before:`
|
|
56
|
-
`}}),e.append(t),e.insertBefore(t,S$1.comment({text:"---break---"}))),t}function Er({params:e}){return {postcssPlugin:"add-custom-variant",Once(t){if(!t.nodes.find(i=>i.type==="atrule"&&i.name==="custom-variant")){let i=t.nodes.filter(n=>n.type==="atrule"&&n.name==="import"),o=S$1.atRule({name:"custom-variant",params:e,raws:{semicolon:!0,before:`
|
|
57
|
-
`}});if(i.length>0){let n=i[i.length-1];t.insertAfter(n,o);}else t.insertAfter(t.nodes[0],o);t.insertBefore(o,S$1.comment({text:"---break---"}));}}}}function $r({params:e}){return {postcssPlugin:"add-custom-import",Once(t){let r=t.nodes.filter(n=>n.type==="atrule"&&n.name==="import"),i=t.nodes.find(n=>n.type==="atrule"&&n.name==="custom-variant");if(!r.some(n=>n.params.replace(/["']/g,"")===e)){let n=S$1.atRule({name:"import",params:`"${e}"`,raws:{semicolon:!0,before:`
|
|
58
|
-
`}});if(r.length>0){let a=r[r.length-1];t.insertAfter(a,n);}else i?(t.insertBefore(i,n),t.insertBefore(i,S$1.comment({text:"---break---"}))):(t.prepend(n),t.insertAfter(n,S$1.comment({text:"---break---"})));}}}}function Or(e){return {postcssPlugin:"update-tailwind-config",Once(t){if(!e?.plugins)return;let i=Dr(t)==="single"?"'":'"',o=t.nodes.filter(a=>a.type==="atrule"&&a.name==="plugin"),n=o[o.length-1]||t.nodes[0];for(let a of e.plugins){let s=a.replace(/^require\(["']|["']\)$/g,"");if(o.some(l=>l.params.replace(/["']/g,"")===s))continue;let c=S$1.atRule({name:"plugin",params:`${i}${s}${i}`,raws:{semicolon:!0,before:`
|
|
59
|
-
`}});t.insertAfter(n,c),t.insertBefore(c,S$1.comment({text:"---break---"}));}}}}function Nr(e){return {postcssPlugin:"update-tailwind-config-keyframes",Once(t){if(!e?.theme?.extend?.keyframes)return;let r=xe(t),i=r.nodes?.filter(n=>n.type==="atrule"&&n.name==="keyframes"),o=z.record(z.string(),z.record(z.string(),z.string()));for(let[n,a]of Object.entries(e.theme.extend.keyframes)){if(typeof n!="string")continue;let s=o.safeParse(a);if(!s.success||i?.find(l=>l.type==="atrule"&&l.name==="keyframes"&&l.params===n))continue;let c=S$1.atRule({name:"keyframes",params:n,nodes:[],raws:{semicolon:!0,between:" ",before:`
|
|
60
|
-
`}});for(let[l,f]of Object.entries(s.data)){let m=S$1.rule({selector:l,nodes:Object.entries(f).map(([u,h])=>S$1.decl({prop:u,value:h,raws:{semicolon:!0,before:`
|
|
61
|
-
`,between:": "}})),raws:{semicolon:!0,between:" ",before:`
|
|
62
|
-
`}});c.append(m);}r.append(c),r.insertBefore(c,S$1.comment({text:"---break---"}));}}}}function Ar(e){return {postcssPlugin:"update-tailwind-config-animation",Once(t){if(!e?.theme?.extend?.animation)return;let r=xe(t),i=r.nodes?.filter(n=>n.type==="decl"&&n.prop.startsWith("--animate-")),o=z.record(z.string(),z.string()).safeParse(e.theme.extend.animation);if(o.success)for(let[n,a]of Object.entries(o.data)){let s=`--animate-${n}`;if(i?.find(l=>l.prop===s))continue;let c=S$1.decl({prop:s,value:a,raws:{semicolon:!0,between:": ",before:`
|
|
63
|
-
`}});r.append(c);}}}}function Dr(e){return e.nodes[0].toString().includes("'")?"single":"double"}function _t(e){if(e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch"))return !1;let t=e.split(" ");return t.length===3&&t.slice(1,3).every(r=>r.includes("%"))}function Fr(e){return e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch")}async function be(e,{withFallback:t}={withFallback:!1}){let r=await detect({programmatic:!0,cwd:e});if(r==="yarn@berry")return "yarn";if(r==="pnpm@6")return "pnpm";if(r==="bun")return "bun";if(r==="deno")return "deno";if(!t)return r??"npm";let i=process.env.npm_config_user_agent||"";return i.startsWith("yarn")?"yarn":i.startsWith("pnpm")?"pnpm":i.startsWith("bun")?"bun":"npm"}async function X(e,t,r$1,i){if(e=Array.from(new Set(e)),t=Array.from(new Set(t)),!e?.length&&!t?.length)return;i={silent:!1,...i};let o=s("Installing dependencies.",{silent:i.silent})?.start(),n=await Mr(r$1),a="";if(Vr(r$1)&&n==="npm")if(i.silent)a="force";else {o.stopAndPersist(),r.warn(`
|
|
21
|
+
`)),a}function Tr({tailwindVersion:e}){return {postcssPlugin:"update-base-layer",Once(t){let r=[{selector:"*",apply:e==="v4"?"border-border outline-ring/50":"border-border"},{selector:"body",apply:"bg-background text-foreground"}],i=t.nodes.find(o=>o.type==="atrule"&&o.name==="layer"&&o.params==="base"&&r.every(({selector:n,apply:a})=>o.nodes?.some(s=>s.type==="rule"&&s.selector===n&&s.nodes.some(c=>c.type==="atrule"&&c.name==="apply"&&c.params===a))));i||(i=x.atRule({name:"layer",params:"base",raws:{semicolon:true,between:" ",before:`
|
|
22
|
+
`}}),t.append(i),t.insertBefore(i,x.comment({text:"---break---"}))),r.forEach(({selector:o,apply:n})=>{i?.nodes?.find(s=>s.type==="rule"&&s.selector===o)||i?.append(x.rule({selector:o,nodes:[x.atRule({name:"apply",params:n,raws:{semicolon:true,before:`
|
|
23
|
+
`}})],raws:{semicolon:true,between:" ",before:`
|
|
24
|
+
`}}));});}}}function Fr(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 $r||(r=x.atRule({name:"layer",params:"base",nodes:[],raws:{semicolon:true,before:`
|
|
25
|
+
`,between:" "}}),t.append(r),t.insertBefore(r,x.comment({text:"---break---"}))),r!==void 0&&Object.entries(e).forEach(([i,o])=>{let n=i==="light"?":root":`.${i}`;_r(r,n,o);});}}}function _t(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 Dt(){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()),_t(e);let r=e.nodes.find(i=>i.type==="atrule"&&i.params==="(prefers-color-scheme: dark)");r&&(_t(r),r.nodes.length===0&&r.remove());}}}function _r(e,t,r){let i=e.nodes?.find(o=>o.type==="rule"&&o.selector===t);i||Object.keys(r).length>0&&(i=x.rule({selector:t,raws:{between:" ",before:`
|
|
26
|
+
`}}),e.append(i)),Object.entries(r).forEach(([o,n])=>{let a=`--${o.replace(/^--/,"")}`,s=x.decl({prop:a,value:n,raws:{semicolon:true}}),c=i?.nodes.find(m=>m.type==="decl"&&m.prop===a);c?c.replaceWith(s):i?.append(s);});}function Dr(e,t){return {postcssPlugin:"update-css-vars-v4",Once(r){Object.entries(e).forEach(([i,o])=>{let n=i==="light"?":root":`.${i}`;if(i==="theme"){n="@theme";let s=be(r);Object.entries(o).forEach(([c,m])=>{let f=`--${c.replace(/^--/,"")}`,d=x.decl({prop:f,value:m,raws:{semicolon:true}}),u=s?.nodes?.find(h=>h.type==="decl"&&h.prop===f);t.overwriteCssVars?u?u.replaceWith(d):s?.append(d):u||s?.append(d);});return}let a=r.nodes?.find(s=>s.type==="rule"&&s.selector===n);!a&&Object.keys(o).length>0&&(a=x.rule({selector:n,nodes:[],raws:{semicolon:true,between:" ",before:`
|
|
27
|
+
`}}),r.append(a),r.insertBefore(a,x.comment({text:"---break---"}))),Object.entries(o).forEach(([s,c])=>{let m=`--${s.replace(/^--/,"")}`;m==="--sidebar-background"&&(m="--sidebar"),At(c)&&(c=`hsl(${c})`);let f=x.decl({prop:m,value:c,raws:{semicolon:true}}),d=a?.nodes.find(u=>u.type==="decl"&&u.prop===m);t.overwriteCssVars?d?d.replaceWith(f):a?.append(f):d||a?.append(f);});});}}}function Ar(e){return {postcssPlugin:"update-theme",Once(t){let r=Array.from(new Set(Object.keys(e).flatMap(n=>Object.keys(e[n]||{}))));if(!r.length)return;let i=be(t),o=i.nodes?.filter(n=>n.type==="decl"&&n.prop.startsWith("--"));for(let n of r){let a=Object.values(e).find(d=>d[n])?.[n];if(!a)continue;if(n==="radius"){let d={sm:"calc(var(--radius) - 4px)",md:"calc(var(--radius) - 2px)",lg:"var(--radius)",xl:"calc(var(--radius) + 4px)"};for(let[u,h]of Object.entries(d)){let w=x.decl({prop:`--radius-${u}`,value:h,raws:{semicolon:true}});i?.nodes?.find(y=>y.type==="decl"&&y.prop===w.prop)||i?.append(w);}continue}let s=At(a)||Ur(a)?`--color-${n.replace(/^--/,"")}`:`--${n.replace(/^--/,"")}`;s==="--color-sidebar-background"&&(s="--color-sidebar");let c=`var(--${n})`;s==="--color-sidebar"&&(c="var(--sidebar)");let m=x.decl({prop:s,value:c,raws:{semicolon:true}});i?.nodes?.find(d=>d.type==="decl"&&d.prop===m.prop)||(o?.length?i?.insertAfter(o[o.length-1],m):i?.append(m));}}}}function be(e){let t=e.nodes.find(r=>r.type==="atrule"&&r.name==="theme"&&r.params==="inline");return t||(t=x.atRule({name:"theme",params:"inline",nodes:[],raws:{semicolon:true,between:" ",before:`
|
|
28
|
+
`}}),e.append(t),e.insertBefore(t,x.comment({text:"---break---"}))),t}function Lr({params:e}){return {postcssPlugin:"add-custom-variant",Once(t){if(!t.nodes.find(i=>i.type==="atrule"&&i.name==="custom-variant")){let i=t.nodes.filter(n=>n.type==="atrule"&&n.name==="import"),o=x.atRule({name:"custom-variant",params:e,raws:{semicolon:true,before:`
|
|
29
|
+
`}});if(i.length>0){let n=i[i.length-1];t.insertAfter(n,o);}else t.insertAfter(t.nodes[0],o);t.insertBefore(o,x.comment({text:"---break---"}));}}}}function Vr({params:e}){return {postcssPlugin:"add-custom-import",Once(t){let r=t.nodes.filter(n=>n.type==="atrule"&&n.name==="import"),i=t.nodes.find(n=>n.type==="atrule"&&n.name==="custom-variant");if(!r.some(n=>n.params.replace(/["']/g,"")===e)){let n=x.atRule({name:"import",params:`"${e}"`,raws:{semicolon:true,before:`
|
|
30
|
+
`}});if(r.length>0){let a=r[r.length-1];t.insertAfter(a,n);}else i?(t.insertBefore(i,n),t.insertBefore(i,x.comment({text:"---break---"}))):(t.prepend(n),t.insertAfter(n,x.comment({text:"---break---"})));}}}}function Mr(e){return {postcssPlugin:"update-tailwind-config",Once(t){if(!e?.plugins)return;let i=Br(t)==="single"?"'":'"',o=t.nodes.filter(a=>a.type==="atrule"&&a.name==="plugin"),n=o[o.length-1]||t.nodes[0];for(let a of e.plugins){let s=a.replace(/^require\(["']|["']\)$/g,"");if(o.some(m=>m.params.replace(/["']/g,"")===s))continue;let c=x.atRule({name:"plugin",params:`${i}${s}${i}`,raws:{semicolon:true,before:`
|
|
31
|
+
`}});t.insertAfter(n,c),t.insertBefore(c,x.comment({text:"---break---"}));}}}}function zr(e){return {postcssPlugin:"update-tailwind-config-keyframes",Once(t){if(!e?.theme?.extend?.keyframes)return;let r=be(t),i=r.nodes?.filter(n=>n.type==="atrule"&&n.name==="keyframes"),o=z.record(z.string(),z.record(z.string(),z.string()));for(let[n,a]of Object.entries(e.theme.extend.keyframes)){if(typeof n!="string")continue;let s=o.safeParse(a);if(!s.success||i?.find(m=>m.type==="atrule"&&m.name==="keyframes"&&m.params===n))continue;let c=x.atRule({name:"keyframes",params:n,nodes:[],raws:{semicolon:true,between:" ",before:`
|
|
32
|
+
`}});for(let[m,f]of Object.entries(s.data)){let d=x.rule({selector:m,nodes:Object.entries(f).map(([u,h])=>x.decl({prop:u,value:h,raws:{semicolon:true,before:`
|
|
33
|
+
`,between:": "}})),raws:{semicolon:true,between:" ",before:`
|
|
34
|
+
`}});c.append(d);}r.append(c),r.insertBefore(c,x.comment({text:"---break---"}));}}}}function Wr(e){return {postcssPlugin:"update-tailwind-config-animation",Once(t){if(!e?.theme?.extend?.animation)return;let r=be(t),i=r.nodes?.filter(n=>n.type==="decl"&&n.prop.startsWith("--animate-")),o=z.record(z.string(),z.string()).safeParse(e.theme.extend.animation);if(o.success)for(let[n,a]of Object.entries(o.data)){let s=`--animate-${n}`;if(i?.find(m=>m.prop===s))continue;let c=x.decl({prop:s,value:a,raws:{semicolon:true,between:": ",before:`
|
|
35
|
+
`}});r.append(c);}}}}function Br(e){return e.nodes[0].toString().includes("'")?"single":"double"}function At(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 Ur(e){return e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch")}async function D(e,t,r$1,i){if(e=Array.from(new Set(e)),t=Array.from(new Set(t)),!e?.length&&!t?.length)return;i={silent:false,...i};let o=s("Installing dependencies.",{silent:i.silent})?.start(),n=await Yr(r$1),a="";if(Jr(r$1)&&n==="npm")if(i.silent)a="force";else {o.stopAndPersist(),r.warn(`
|
|
64
36
|
It looks like you are using React 19.
|
|
65
37
|
Some packages may fail to install due to peer dependency issues in npm (see https://ui.shadcn.com/react-19).
|
|
66
|
-
`);let s=await Ye([{type:"select",name:"flag",message:"How would you like to proceed?",choices:[{title:"Use --force",value:"force"},{title:"Use --legacy-peer-deps",value:"legacy-peer-deps"}]}]);s&&(a=s.flag);}o?.start(),await zr(n,e,t,r$1.resolvedPaths.cwd,a),o?.succeed();}function Vr(e){let t=n(e.resolvedPaths.cwd,!1);if(!t?.dependencies?.react)return !1;let r=/^(?:\^|~)?19(?:\.\d+)*(?:-.*)?$/.test(t.dependencies.react),i=t.dependencies["react-day-picker"]?.startsWith("8");return r&&i}async function Mr(e){return n(e.resolvedPaths.cwd,!1)?.dependencies?.expo?"expo":be(e.resolvedPaths.cwd)}async function zr(e,t,r,i,o){if(e==="npm")return Wr(t,r,i,o);if(e==="deno")return Br(t,r,i);if(e==="expo")return Ur(t,r,i);t?.length&&await execa(e,["add",...t],{cwd:i}),r?.length&&await execa(e,["add","-D",...r],{cwd:i});}async function Wr(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 Br(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 Ur(e,t,r){e.length&&await execa("npx",["expo","install",...e],{cwd:r}),t.length&&await execa("npx",["expo","install","-- -D",...t],{cwd:r});}var Se=async({sourceFile:e,config:t,baseColor:r})=>(t.tailwind?.cssVariables||!r?.inlineColors||e.getDescendantsOfKind(SyntaxKind.StringLiteral).forEach(i=>{let o=i.getText();if(o){let n=Jr(o.replace(/"/g,""),r.inlineColors);i.replaceWithText(`"${n.trim()}"`);}}),e);function Ue(e){if(!e.includes("/")&&!e.includes(":"))return [null,e,null];let t=[],[r,i]=e.split("/");if(!r.includes(":"))return [null,r,i];let o=r.split(":"),n=o.pop(),a=o.join(":");return t.push(a??null,n??null,i??null),t}var Gr=["bg-","text-","border-","ring-offset-","ring-"];function Jr(e,t){e.includes(" border ")&&(e=e.replace(" border "," border border-border "));let r=e.split(" "),i=new Set,o=new Set;for(let n of r){let[a,s,c]=Ue(n),l=Gr.find(m=>s?.startsWith(m));if(!l){i.has(n)||i.add(n);continue}let f=s?.replace(l,"");if(f&&f in t.light){i.add([a,`${l}${t.light[f]}`].filter(Boolean).join(":")+(c?`/${c}`:"")),o.add(["dark",a,`${l}${t.dark[f]}`].filter(Boolean).join(":")+(c?`/${c}`:""));continue}i.has(n)||i.add(n);}return [...Array.from(i),...Array.from(o)].join(" ").trim()}var F={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"}};var Lt="lucide",Re=async({sourceFile:e,config:t})=>{if(!t.iconLibrary||!(t.iconLibrary in F))return e;let r=await Q$1(),i=Lt,o=t.iconLibrary;if(i===o)return e;let n=[];for(let a of e.getImportDeclarations()??[])if(a.getModuleSpecifier()?.getText()===`"${F[Lt].import}"`){for(let s of a.getNamedImports()??[]){let c=s.getName(),l=r[c]?.[o];!l||n.includes(l)||(n.push(l),s.remove(),e.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).filter(f=>f.getTagNameNode()?.getText()===c).forEach(f=>f.getTagNameNode()?.replaceWithText(l)));}a.getNamedImports()?.length===0&&a.remove();}if(n.length>0){let a=e.addImportDeclaration({moduleSpecifier:F[o]?.import,namedImports:n.map(s=>({name:s}))});qr(e)||a.replaceWithText(a.getText().replace(";",""));}return e};function qr(e){return e.getImportDeclarations()?.[0]?.getText().endsWith(";")??!1}var ve=async({sourceFile:e,config:t,isRemote:r})=>{let o=`@${t.aliases?.utils?.split("/")[0]?.slice(1)}/lib/utils`,n=e.getImportDeclarations();if(![".tsx",".ts",".jsx",".js"].includes(e.getExtension()))return e;for(let a of n){let s=Hr(a.getModuleSpecifierValue(),t,r);a.setModuleSpecifier(s),(o===s||s==="@/lib/utils")&&a.getNamedImports().find(f=>f.getName()==="cn")&&a.setModuleSpecifier(o===s?s.replace(o,t.aliases.utils):t.aliases.utils);}return e};function Hr(e,t,r=!1){if(!e.startsWith("@/")&&!r)return e;if(r&&e.startsWith("@/")&&(e=e.replace(/^@\//,"@/registry/new-york/")),!e.startsWith("@/registry/")){let i=t.aliases.components.split("/")[0];return e.replace(/^@\//,`${i}/`)}return e.match(/^@\/registry\/(.+)\/ui/)?e.replace(/^@\/registry\/(.+)\/ui/,t.aliases.ui??`${t.aliases.components}/ui`):t.aliases.components&&e.match(/^@\/registry\/(.+)\/components/)?e.replace(/^@\/registry\/(.+)\/components/,t.aliases.components):t.aliases.lib&&e.match(/^@\/registry\/(.+)\/lib/)?e.replace(/^@\/registry\/(.+)\/lib/,t.aliases.lib):t.aliases.hooks&&e.match(/^@\/registry\/(.+)\/hooks/)?e.replace(/^@\/registry\/(.+)\/hooks/,t.aliases.hooks):e.replace(/^@\/registry\/[^/]+/,t.aliases.components)}var ei={sourceType:"module",allowImportExportEverywhere:!0,allowReturnOutsideFunction:!0,startLine:1,tokens:!0,plugins:["asyncGenerators","bigInt","classPrivateMethods","classPrivateProperties","classProperties","classStaticBlock","decimal","decorators-legacy","doExpressions","dynamicImport","exportDefaultFrom","exportNamespaceFrom","functionBind","functionSent","importAssertions","importMeta","nullishCoalescingOperator","numericSeparator","objectRestSpread","optionalCatchBinding","optionalChaining",["pipelineOperator",{proposal:"minimal"}],["recordAndTuple",{syntaxType:"hash"}],"throwExpressions","topLevelAwait","v8intrinsic","typescript","jsx"]},Vt=async({sourceFile:e,config:t})=>{let r=e.getFullText();if(t.tsx)return r;let i=Ie.parse(r,{parser:{parse:n=>parse(n,ei)}}),o=transformFromAstSync(i,r,{cloneInputAst:!1,code:!1,ast:!0,plugins:[Zr],configFile:!1});if(!o||!o.ast)throw new Error("Failed to transform JSX");return Ie.print(o.ast).code};var ri=/^["']use client["']$/g,Pe=async({sourceFile:e,config:t})=>{if(t.rsc)return e;let r=e.getFirstChildByKind(SyntaxKind.ExpressionStatement);return r&&ri.test(r.getText())&&r.remove(),e};var Ce=async({sourceFile:e,config:t})=>{if(!t.tailwind?.prefix)return e;let r=await q(t);return e.getDescendantsOfKind(SyntaxKind.CallExpression).filter(i=>i.getExpression().getText()==="cva").forEach(i=>{if(i.getArguments()[0]?.isKind(SyntaxKind.StringLiteral)){let o=i.getArguments()[0];o&&o.replaceWithText(`"${U(o.getText()?.replace(/"|'/g,""),t.tailwind.prefix,r)}"`);}i.getArguments()[1]?.isKind(SyntaxKind.ObjectLiteralExpression)&&i.getArguments()[1]?.getDescendantsOfKind(SyntaxKind.PropertyAssignment).find(o=>o.getName()==="variants")?.getDescendantsOfKind(SyntaxKind.PropertyAssignment).forEach(o=>{o.getDescendantsOfKind(SyntaxKind.PropertyAssignment).forEach(n=>{let a=n.getInitializerIfKind(SyntaxKind.StringLiteral);a&&a?.replaceWithText(`"${U(a.getText()?.replace(/"|'/g,""),t.tailwind.prefix,r)}"`);});});}),e.getDescendantsOfKind(SyntaxKind.JsxAttribute).forEach(i=>{if(i.getName()==="className"){if(i.getInitializer()?.isKind(SyntaxKind.StringLiteral)){let o=i.getInitializer();o&&o.replaceWithText(`"${U(o.getText()?.replace(/"|'/g,""),t.tailwind.prefix,r)}"`);}if(i.getInitializer()?.isKind(SyntaxKind.JsxExpression)){let o=i.getInitializer()?.getDescendantsOfKind(SyntaxKind.CallExpression).find(n=>n.getExpression().getText()==="cn");o&&o.getArguments().forEach(n=>{(n.isKind(SyntaxKind.ConditionalExpression)||n.isKind(SyntaxKind.BinaryExpression))&&n.getChildrenOfKind(SyntaxKind.StringLiteral).forEach(a=>{a.replaceWithText(`"${U(a.getText()?.replace(/"|'/g,""),t.tailwind.prefix,r)}"`);}),n.isKind(SyntaxKind.StringLiteral)&&n.replaceWithText(`"${U(n.getText()?.replace(/"|'/g,""),t.tailwind.prefix,r)}"`);});}}i.getName()==="classNames"&&i.getInitializer()?.isKind(SyntaxKind.JsxExpression)&&i.getDescendantsOfKind(SyntaxKind.PropertyAssignment).forEach(o=>{if(o.getInitializer()?.isKind(SyntaxKind.CallExpression)){let n=o.getInitializerIfKind(SyntaxKind.CallExpression);n&&n.getArguments().forEach(a=>{a.isKind(SyntaxKind.ConditionalExpression)&&a.getChildrenOfKind(SyntaxKind.StringLiteral).forEach(s=>{s.replaceWithText(`"${U(s.getText()?.replace(/"|'/g,""),t.tailwind.prefix,r)}"`);}),a.isKind(SyntaxKind.StringLiteral)&&a.replaceWithText(`"${U(a.getText()?.replace(/"|'/g,""),t.tailwind.prefix,r)}"`);});}if(o.getInitializer()?.isKind(SyntaxKind.StringLiteral)&&o.getName()!=="variant"){let n=o.getInitializer();n&&n.replaceWithText(`"${U(n.getText()?.replace(/"|'/g,""),t.tailwind.prefix,r)}"`);}});}),e};function U(e,t="",r){return r==="v3"?e.split(" ").map(i=>{let[o,n,a]=Ue(i);return o?a?`${o}:${t}${n}/${a}`:`${o}:${t}${n}`:a?`${t}${n}/${a}`:`${t}${n}`}).join(" "):e.split(" ").map(i=>i.indexOf(`${t}:`)===0?i:`${t}:${i.trim()}`).join(" ")}var ai=new Project({compilerOptions:{}});async function ci(e){let t=await promises.mkdtemp(x__default.join(tmpdir(),"shadcn-"));return x__default.join(t,e)}async function ke(e,t=[ve,Pe,Se,Ce,Re]){let r=await ci(e.filename),i=ai.createSourceFile(r,e.raw,{scriptKind:ScriptKind.TSX});for(let o of t)await o({sourceFile:i,...e});return e.transformJsx?await Vt({sourceFile:i,...e}):i.getText()}async function Ke(e,t,r$1){if(!e?.length)return {filesCreated:[],filesUpdated:[],filesSkipped:[]};r$1={overwrite:!1,force:!1,silent:!1,isRemote:!1,...r$1};let i=s("Updating files.",{silent:r$1.silent})?.start(),[o$1,n]=await Promise.all([o(t.resolvedPaths.cwd),t.tailwind.baseColor?T(t.tailwind.baseColor):Promise.resolve(void 0)]),a$1=[],s$1=[],c=[];for(let u of e){if(!u.content)continue;let h=ui(u,t,{isSrcDir:o$1?.isSrcDir,framework:o$1?.framework.name,commonRoot:hi(e.map(k=>k.path),u.path)});if(!h)continue;let y=basename(u.path),R=x__default.dirname(h);t.tsx||(h=h.replace(/\.tsx?$/,k=>k===".tsx"?".jsx":".js"));let g=existsSync(h),b=await ke({filename:u.path,raw:u.content,config:t,baseColor:n,transformJsx:!t.tsx,isRemote:r$1.isRemote},[ve,Pe,Se,Ce,Re]);if(g){let k=await promises.readFile(h,"utf-8"),[v,E]=await Promise.all([zt(k),zt(b)]);if(v===E){c.push(x__default.relative(t.resolvedPaths.cwd,h));continue}}if(g&&!r$1.overwrite){i.stop(),r$1.rootSpinner&&r$1.rootSpinner.stop();let{overwrite:k}=await Ye({type:"confirm",name:"overwrite",message:`The file ${a.info(y)} already exists. Would you like to overwrite?`,initial:!1});if(!k){c.push(x__default.relative(t.resolvedPaths.cwd,h)),r$1.rootSpinner&&r$1.rootSpinner.start();continue}i?.start(),r$1.rootSpinner&&r$1.rootSpinner.start();}existsSync(R)||await promises.mkdir(R,{recursive:!0}),await promises.writeFile(h,b,"utf-8"),g?s$1.push(x__default.relative(t.resolvedPaths.cwd,h)):a$1.push(x__default.relative(t.resolvedPaths.cwd,h));}let l=[...a$1,...s$1,...c],f=await xi(l,t);if(s$1.push(...f),s$1=s$1.filter(u=>!a$1.includes(u)),!(a$1.length||s$1.length)&&!c.length&&i?.info("No files updated."),a$1=Array.from(new Set(a$1)),s$1=Array.from(new Set(s$1)),c=Array.from(new Set(c)),a$1.length){if(i?.succeed(`Created ${a$1.length} ${a$1.length===1?"file":"files"}:`),!r$1.silent)for(let u of a$1)r.log(` - ${u}`);}else i?.stop();if(s$1.length&&(s(`Updated ${s$1.length} ${s$1.length===1?"file":"files"}:`,{silent:r$1.silent})?.info(),!r$1.silent))for(let u of s$1)r.log(` - ${u}`);if(c.length&&(s(`Skipped ${c.length} ${s$1.length===1?"file":"files"}: (files might be identical, use --overwrite to overwrite)`,{silent:r$1.silent})?.info(),!r$1.silent))for(let u of c)r.log(` - ${u}`);return r$1.silent||r.break(),{filesCreated:a$1,filesUpdated:s$1,filesSkipped:c}}function ui(e,t,r){if(e.target){if(e.target.startsWith("~/"))return x__default.join(t.resolvedPaths.cwd,e.target.replace("~/",""));let n=e.target;return e.type==="registry:page"&&(n=wi(n,r.framework),!n)?"":r.isSrcDir?x__default.join(t.resolvedPaths.cwd,"src",n.replace("src/","")):x__default.join(t.resolvedPaths.cwd,n.replace("src/",""))}let i=gi(e,t),o=yi(e.path,i);return x__default.join(i,o)}function gi(e,t){return e.type==="registry:ui"?t.resolvedPaths.ui:e.type==="registry:lib"?t.resolvedPaths.lib:e.type==="registry:block"||e.type==="registry:component"?t.resolvedPaths.components:e.type==="registry:hook"?t.resolvedPaths.hooks:t.resolvedPaths.components}function hi(e,t){let r=e.map(a=>a.replace(/^\//,"")),i=t.replace(/^\//,""),o=i.split("/").slice(0,-1).join("/");if(!o)return "";let n=o.split("/");for(let a=n.length;a>0;a--){let s=n.slice(0,a).join("/");if(r.some(l=>l!==i&&l.startsWith(s+"/")))return "/"+s}return "/"+o}function yi(e,t){let r=e.replace(/^\/|\/$/g,""),i=t.replace(/^\/|\/$/g,""),o=r.split("/"),n=i.split("/"),a=n[n.length-1],s=o.findIndex(c=>c===a);return s===-1?o[o.length-1]:o.slice(s+1).join("/")}async function zt(e){return e.replace(/\r\n/g,`
|
|
67
|
-
`)
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
38
|
+
`);let s=await Ge([{type:"select",name:"flag",message:"How would you like to proceed?",choices:[{title:"Use --force",value:"force"},{title:"Use --legacy-peer-deps",value:"legacy-peer-deps"}]}]);s&&(a=s.flag);}o?.start(),await qr(n,e,t,r$1.resolvedPaths.cwd,a),o?.succeed();}function Jr(e){let t=n(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 Yr(e){return n(e.resolvedPaths.cwd,false)?.dependencies?.expo?"expo":a$1(e.resolvedPaths.cwd)}async function qr(e,t,r,i,o){if(e==="npm")return Kr(t,r,i,o);if(e==="deno")return Hr(t,r,i);if(e==="expo")return Qr(t,r,i);t?.length&&await execa(e,["add",...t],{cwd:i}),r?.length&&await execa(e,["add","-D",...r],{cwd:i});}async function Kr(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 Hr(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 Qr(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 We(e,t,r$1){if(!e||Object.keys(e).length===0)return {envVarsAdded:[],envFileUpdated:null,envFileCreated:null};r$1={silent:false,...r$1};let i=s("Adding environment variables.",{silent:r$1.silent})?.start(),o=t.resolvedPaths.cwd,n=A__default.join(o,".env.local"),a=D$1(o);a&&(n=a);let s$1=existsSync(n),c$1=A__default.basename(n),m=Object.entries(e).map(([h,w])=>`${h}=${w}`).join(`
|
|
39
|
+
`),f=[],d=null,u=null;if(s$1){let h=await promises.readFile(n,"utf-8"),w=F$1(h,m);if(f=E(h,m),f.length>0){if(await promises.writeFile(n,w,"utf-8"),d=A__default.relative(o,n),i?.succeed(`Added the following variables to ${c.info(c$1)}:`),!r$1.silent)for(let y of f)r.log(` ${c.success("+")} ${y}`);}else i?.stop();}else if(await promises.writeFile(n,m+`
|
|
40
|
+
`,"utf-8"),u=A__default.relative(o,n),f=Object.keys(e),i?.succeed(`Added the following variables to ${c.info(c$1)}:`),!r$1.silent)for(let h of f)r.log(` ${c.success("+")} ${h}`);return !r$1.silent&&f.length>0&&r.break(),{envVarsAdded:f,envFileUpdated:d,envFileCreated:u}}async function se(e,t,r){r={overwrite:false,silent:false,isNewProject:false,baseStyle:true,...r};let i=await j(t);return i&&i.ui&&i.ui.resolvedPaths.cwd!==t.resolvedPaths.cwd?await ti(e,t,i,{...r,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await ei(e,t,r)}async function ei(e,t,r$1){if(!r$1.baseStyle&&!e.length)return;let i=s("Checking registry.",{silent:r$1.silent})?.start(),o=await U(e,L$1(t));if(!o)return i?.fail(),Q(new Error("Failed to fetch components from registry."));try{Vt(o.files??[],t.resolvedPaths.cwd);}catch(s){return i?.fail(),Q(s)}i?.succeed();let n=await q$1(t);await R(o.tailwind?.config,t,{silent:r$1.silent,tailwindVersion:n});let a=await Lt(e,t);await Me(o.cssVars,t,{cleanupDefaultNextStyles:r$1.isNewProject,silent:r$1.silent,tailwindVersion:n,tailwindConfig:o.tailwind?.config,overwriteCssVars:a,initIndex:r$1.baseStyle}),await Ve(o.css,t,{silent:r$1.silent}),await We(o.envVars,t,{silent:r$1.silent}),await D(o.dependencies,o.devDependencies,t,{silent:r$1.silent}),await I(o.files,t,{overwrite:r$1.overwrite,silent:r$1.silent}),o.docs&&r.info(o.docs);}async function ti(e,t,r$1,i){if(!i.baseStyle&&!e.length)return;let o=s("Checking registry.",{silent:i.silent})?.start(),n=await U(e,L$1(t));if(!n)return o?.fail(),Q(new Error("Failed to fetch components from registry."));try{Vt(n.files??[],t.resolvedPaths.cwd);}catch(y){return o?.fail(),Q(y)}o?.succeed();let a=[],s$1=[],c=[],m=s("Installing components.")?.start(),f=r$1.ui,d=await q$1(f),u=l(t.resolvedPaths.cwd,f.resolvedPaths.ui);if(n.tailwind?.config&&(await R(n.tailwind?.config,f,{silent:true,tailwindVersion:d}),s$1.push(A__default.relative(u,f.resolvedPaths.tailwindConfig))),n.cssVars){let y=await Lt(e,t);await Me(n.cssVars,f,{silent:true,tailwindVersion:d,tailwindConfig:n.tailwind?.config,overwriteCssVars:y}),s$1.push(A__default.relative(u,f.resolvedPaths.tailwindCss));}n.css&&(await Ve(n.css,f,{silent:true}),s$1.push(A__default.relative(u,f.resolvedPaths.tailwindCss))),n.envVars&&await We(n.envVars,f,{silent:true}),await D(n.dependencies,n.devDependencies,f,{silent:true});let h=new Map;for(let y of n.files??[]){let C=y.type||"registry:ui";h.has(C)||h.set(C,[]),h.get(C).push(y);}for(let y of Array.from(h.keys())){let C=h.get(y),S=y==="registry:ui"?r$1.ui:t,V=l(t.resolvedPaths.cwd,S.resolvedPaths.ui||S.resolvedPaths.cwd),E=await k(V,S.resolvedPaths.cwd)??S.resolvedPaths.cwd,G=await I(C,S,{overwrite:i.overwrite,silent:true,rootSpinner:m,isRemote:i.isRemote,isWorkspace:true});a.push(...G.filesCreated.map(j=>A__default.relative(V,A__default.join(E,j)))),s$1.push(...G.filesUpdated.map(j=>A__default.relative(V,A__default.join(E,j)))),c.push(...G.filesSkipped.map(j=>A__default.relative(V,A__default.join(E,j))));}if(m?.succeed(),a.sort(),s$1.sort(),c.sort(),!(a.length||s$1.length)&&!c.length&&s("No files updated.",{silent:i.silent})?.info(),a.length){s(`Created ${a.length} ${a.length===1?"file":"files"}:`,{silent:i.silent})?.succeed();for(let y of a)r.log(` - ${y}`);}if(s$1.length){s(`Updated ${s$1.length} ${s$1.length===1?"file":"files"}:`,{silent:i.silent})?.info();for(let y of s$1)r.log(` - ${y}`);}if(c.length){s(`Skipped ${c.length} ${s$1.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:i.silent})?.info();for(let y of c)r.log(` - ${y}`);}n.docs&&r.info(n.docs);}async function Lt(e,t){let r=await W(e,{config:t});return z.array(g$1).parse(r).some(o=>o.type==="registry:theme"||o.type==="registry:style")}function Vt(e,t){for(let r of e)if(r?.target&&!$t(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}var oi="https://codeload.github.com/shadcn-ui/ui/tar.gz/main",q={next:"next","next-monorepo":"next-monorepo"};async function ve(e){e={srcDir:false,...e};let t=e.template&&q[e.template]?e.template:"next",r$1=t===q.next?"my-app":"my-monorepo",i="latest",o=e.components?.length===1&&!!e.components[0].match(/\/chat\/b\//);if(e.components&&o)try{let[s]=await P(e.components),{meta:c}=z.object({meta:z.object({nextVersion:z.string()})}).parse(s);i=c.nextVersion,t=q.next;}catch(s){r.break(),Q(s);}if(!e.force){let{type:s,name:c$1}=await Ge([{type:e.template||o?null:"select",name:"type",message:`The path ${c.info(e.cwd)} does not contain a package.json file.
|
|
41
|
+
Would you like to start a new project?`,choices:[{title:"Next.js",value:"next"},{title:"Next.js (Monorepo)",value:"next-monorepo"}],initial:0},{type:"text",name:"name",message:"What is your project named?",initial:r$1,format:m=>m.trim(),validate:m=>m.length>128?"Name should be less than 128 characters.":true}]);t=s??t,r$1=c$1;}let n=await a$1(e.cwd,{withFallback:true}),a=`${e.cwd}/${r$1}`;try{await K.access(e.cwd,K.constants.W_OK);}catch{r.break(),r.error(`The path ${c.info(e.cwd)} is not writable.`),r.error(`It is likely you do not have write permissions for this folder or the path ${c.info(e.cwd)} does not exist.`),r.break(),process.exit(1);}return K.existsSync(A__default.resolve(e.cwd,r$1,"package.json"))&&(r.break(),r.error(`A project with the name ${c.info(r$1)} already exists.`),r.error("Please choose a different name and try again."),r.break(),process.exit(1)),t===q.next&&await ni(a,{version:i,cwd:e.cwd,packageManager:n,srcDir:!!e.srcDir}),t===q["next-monorepo"]&&await si(a,{packageManager:n}),{projectPath:a,projectName:r$1,template:t}}async function ni(e,t){let r$1=s("Creating a new Next.js project. This may take a few minutes.").start(),i=["--tailwind","--eslint","--typescript","--app",t.srcDir?"--src-dir":"--no-src-dir","--no-import-alias",`--use-${t.packageManager}`];(t.version.startsWith("15")||t.version.startsWith("latest")||t.version.startsWith("canary"))&&i.push("--turbopack");try{await execa("npx",[`create-next-app@${t.version}`,e,"--silent",...i],{cwd:t.cwd});}catch{r.break(),r.error("Something went wrong creating a new Next.js project. Please try again."),process.exit(1);}r$1?.succeed("Creating a new Next.js project.");}async function si(e,t){let r=s("Creating a new Next.js monorepo. This may take a few minutes.").start();try{let i=A__default.join(ri.tmpdir(),`shadcn-template-${Date.now()}`);await K.ensureDir(i);let o=await fetch(oi);if(!o.ok)throw new Error(`Failed to download template: ${o.statusText}`);let n=A__default.resolve(i,"template.tar.gz");await K.writeFile(n,Buffer.from(await o.arrayBuffer())),await execa("tar",["-xzf",n,"-C",i,"--strip-components=2","ui-main/templates/monorepo-next"]);let a=A__default.resolve(i,"monorepo-next");await K.move(a,e),await K.remove(i),await execa(t.packageManager,["install"],{cwd:e});let s=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."),Q(i);}}async function F(e=process.cwd()){try{let{config:t}=await import('@dotenvx/dotenvx'),r=[".env.local",".env.development.local",".env.development",".env"];for(let i of r){let o=join(e,i);existsSync(o)&&t({path:o,overload:!1,quiet:!0});}}catch(t){r.warn("Failed to load env files:",t);}}var ae=".bak";function Mt(e){if(!K.existsSync(e))return null;let t=`${e}${ae}`;try{return K.renameSync(e,t),t}catch(r){return console.error(`Failed to create backup of ${e}: ${r}`),null}}function zt(e){let t=`${e}${ae}`;if(!K.existsSync(t))return false;try{return K.renameSync(t,e),!0}catch(r){return console.error(`Warning: Could not restore backup file ${t}: ${r}`),false}}function Ue(e){let t=`${e}${ae}`;if(!K.existsSync(t))return false;try{return K.unlinkSync(t),!0}catch{return false}}async function Bt(e,t,r){if(!e)return;r={silent:false,...r};let i=A__default.relative(t.resolvedPaths.cwd,t.resolvedPaths.tailwindConfig),o=s(`Updating ${c.info(i)}`,{silent:r.silent}).start(),n=await promises.readFile(t.resolvedPaths.tailwindConfig,"utf8"),a=await mi(n,e,t);await promises.writeFile(t.resolvedPaths.tailwindConfig,a,"utf8"),o?.succeed();}async function mi(e,t,r){let i=await S(e,r),o=i.getDescendantsOfKind(SyntaxKind.ObjectLiteralExpression).find(n=>n.getProperties().some(a=>a.isKind(SyntaxKind.PropertyAssignment)&&a.getName()==="content"));return o?(fi(o,t),i.getFullText()):e}async function fi(e,t){let r=T(e),i=e.getProperty("content");if(!i){let o={name:"content",initializer:`[${r}${t.join(`${r}, ${r}`)}${r}]`};return e.addPropertyAssignment(o),e}if(i.isKind(SyntaxKind.PropertyAssignment)){let o=i.getInitializer();if(o?.isKind(SyntaxKind.ArrayLiteralExpression))for(let n of t){let a=`${r}${n}${r}`;o.getElements().map(s=>s.getText()).includes(a)||o.addElement(a);}return e}return e}process.on("exit",e=>{let t=A__default.resolve(process.cwd(),"components.json");return e===0?Ue(t):zt(t)});var gi=z.object({cwd:z.string(),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(),template:z.string().optional().refine(e=>e?q[e]:true,{message:"Invalid template. Please use 'next' or 'next-monorepo'."}),baseColor:z.string().optional().refine(e=>e?a.find(t=>t.name===e):true,{message:`Invalid base color. Please use '${a.map(e=>e.name).join("', '")}'`}),baseStyle:z.boolean()}),Ut=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, next-monorepo)").option("-b, --base-color <base-color>","the base color to use. (neutral, gray, zinc, stone, slate)",void 0).option("-y, --yes","skip confirmation prompt.",true).option("-d, --defaults,","use default configuration.",false).option("-f, --force","force overwrite of existing configuration.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",false).option("--src-dir","use the src directory when creating a new project.",false).option("--no-src-dir","do not use the src directory when creating a new project.").option("--css-variables","use css variables for theming.",true).option("--no-css-variables","do not use css variables for theming.").option("--no-base-style","do not install the base shadcn style.").action(async(e,t)=>{try{t.defaults&&(t.template=t.template||"next",t.baseColor=t.baseColor||"neutral");let r$1=gi.parse({cwd:A__default.resolve(t.cwd),isNewProject:!1,components:e,...t});if(await F(r$1.cwd),e.length>0){let i=L$1({}),o=A__default.resolve(r$1.cwd,"components.json");if(K.existsSync(o)){let a=await K.readJson(o),s=p.partial().parse(a);i=L$1(s),Mt(o);}O(e[0],i);let[n]=await W([e[0]],{config:i});n?.type==="registry:style"&&(r$1.baseColor="neutral",r$1.baseStyle=n.extends==="none"?!1:r$1.baseStyle);}r$1.baseStyle||(r$1.baseColor="neutral"),await Ie(r$1),r.log(`${c.success("Success!")} Project initialization completed.
|
|
42
|
+
You may now add components.`),Ue(A__default.resolve(r$1.cwd,"components.json")),r.break();}catch(r$1){r.break(),Q(r$1);}finally{M();}});async function Ie(e){let t,r;if(e.skipPreflight)t=await o(e.cwd);else {let f=await Ot(e);if(f.errors["1"]){let{projectPath:d,template:u}=await ve(e);d||process.exit(1),e.cwd=d,e.isNewProject=true,r=u;}t=f.projectInfo;}if(r==="next-monorepo")return e.cwd=A__default.resolve(e.cwd,"apps/web"),await h(e.cwd);let i$1=await p$1(e.cwd,t),o$1=i$1?await wi(i$1,e):await hi(await h(e.cwd));if(!e.yes){let{proceed:f}=await Ge({type:"confirm",name:"proceed",message:`Write configuration to ${c.info("components.json")}. Proceed?`,initial:true});f||process.exit(0);}let n=s("Writing components.json.").start(),a=A__default.resolve(e.cwd,"components.json"),s$1=`${a}${ae}`;if(!e.force&&K.existsSync(s$1)){let f=await K.readJson(s$1),{registries:d,...u}=ui(f,o$1);o$1={...u,registries:d};}await promises.writeFile(a,`${JSON.stringify(o$1,null,2)}
|
|
43
|
+
`,"utf8"),n.succeed();let c$1=await i(e.cwd,o$1),m=[...e.baseStyle?["index"]:[],...e.components??[]];return await se(m,c$1,{overwrite:true,silent:e.silent,baseStyle:e.baseStyle,isNewProject:e.isNewProject||t?.framework.name==="next-app"}),e.isNewProject&&e.srcDir&&await Bt(["./src/**/*.{js,ts,jsx,tsx,mdx}"],c$1,{silent:e.silent}),c$1}async function hi(e$1=null){let[t,r$1]=await Promise.all([_(),aa()]);r.info("");let i=await Ge([{type:"toggle",name:"typescript",message:`Would you like to use ${c.info("TypeScript")} (recommended)?`,initial:e$1?.tsx??true,active:"yes",inactive:"no"},{type:"select",name:"style",message:`Which ${c.info("style")} would you like to use?`,choices:t.map(o=>({title:o.label,value:o.name}))},{type:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${c.info("base color")}?`,choices:r$1.map(o=>({title:o.label,value:o.name}))},{type:"text",name:"tailwindCss",message:`Where is your ${c.info("global CSS")} file?`,initial:e$1?.tailwind.css??f},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${c.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 ${c.info("tailwind prefix eg. tw-")}? (Leave blank if not)`,initial:""},{type:"text",name:"tailwindConfig",message:`Where is your ${c.info("tailwind.config.js")} located?`,initial:e$1?.tailwind.config??g},{type:"text",name:"components",message:`Configure the import alias for ${c.info("components")}:`,initial:e$1?.aliases.components??d},{type:"text",name:"utils",message:`Configure the import alias for ${c.info("utils")}:`,initial:e$1?.aliases.utils??e},{type:"toggle",name:"rsc",message:`Are you using ${c.info("React Server Components")}?`,initial:e$1?.rsc??true,active:"yes",inactive:"no"}]);return p.parse({$schema:"https://ui.shadcn.com/schema.json",style:i.style,tailwind:{config:i.tailwindConfig,css:i.tailwindCss,baseColor:i.tailwindBaseColor,cssVariables:i.tailwindCssVariables,prefix:i.tailwindPrefix},rsc:i.rsc,tsx:i.typescript,aliases:{utils:i.utils,components:i.components,lib:i.components.replace(/\/components$/,"lib"),hooks:i.components.replace(/\/components$/,"hooks")}})}async function wi(e,t){let r=e.style,i=t.baseColor,o=e.tailwind.cssVariables;if(!t.defaults){let[n,a,s]=await Promise.all([_(),aa(),q$1(e)]),c$1=await Ge([{type:s==="v4"?null:"select",name:"style",message:`Which ${c.info("style")} would you like to use?`,choices:n.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 ${c.info("base color")}?`,choices:a.map(m=>({title:m.label,value:m.name}))}]);r=c$1.style??"new-york",i=c$1.tailwindBaseColor??i,o=t.cssVariables;}return p.parse({$schema:e?.$schema,style:r,tailwind:{...e?.tailwind,baseColor:i,cssVariables:o},rsc:e?.rsc,tsx:e?.tsx,iconLibrary:e?.iconLibrary,aliases:e?.aliases})}async function Jt(e){let t={};if(!K.existsSync(e.cwd)||!K.existsSync(A__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!K.existsSync(A__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,config:null};try{let r=await h(e.cwd);return {errors:t,config:r}}catch{r.break(),r.error(`An invalid ${c.info("components.json")} file was found at ${c.info(e.cwd)}.
|
|
44
|
+
Before you can add components, you must create a valid ${c.info("components.json")} file by running the ${c.info("init")} command.`),r.error(`Learn more at ${c.info("https://ui.shadcn.com/docs/components-json")}.`),r.break(),process.exit(1);}}async function qt(e,t){let r=A__default.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await L__default.stat(r)).isFile())return;let[i]=await W([e],{config:t});if(!i?.meta?.importSpecifier||!i?.meta?.moduleSpecifier)return;let o=`import { ${i?.meta?.importSpecifier} } from "${i.meta.moduleSpecifier}"
|
|
71
45
|
|
|
72
46
|
export default function Page() {
|
|
73
47
|
return <${i?.meta?.importSpecifier} />
|
|
74
|
-
}`;await
|
|
75
|
-
Existing CSS variables and components will be overwritten. Continue?`)});l||(r.break(),r.log("Installation cancelled."),r.break(),process.exit(1));}if(r$1.components?.length||(r$1.components=await zi(r$1)),(await o(r$1.cwd))?.tailwindVersion==="v4"){let l=Xe.filter(f=>r$1.components?.includes(f.name));l?.length&&(r.break(),l.forEach(f=>{r.warn(a.warn(f.message));}),r.break(),process.exit(1));}if(w(o$1)){if(!Li.existsSync(r$1.cwd))throw new Error(`Directory ${r$1.cwd} does not exist`);let l=m({resolvedPaths:{cwd:r$1.cwd}});await ae(r$1.components,l,r$1);return}let{errors:a$1,config:s}=await Ht(r$1);if(a$1[D]){let{proceed:l}=await Ye({type:"confirm",name:"proceed",message:`You need to create a ${a.info("components.json")} file to add components. Proceed?`,initial:!0});l||(r.break(),process.exit(1)),s=await $e({cwd:r$1.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:!0,isNewProject:!1,srcDir:r$1.srcDir,cssVariables:r$1.cssVariables,style:"index"});}let c=!1;if(a$1[A]){let{projectPath:l,template:f}=await Te({cwd:r$1.cwd,force:r$1.overwrite,srcDir:r$1.srcDir,components:r$1.components});l||(r.break(),process.exit(1)),r$1.cwd=l,f==="next-monorepo"?(r$1.cwd=x__default.resolve(r$1.cwd,"apps/web"),s=await h(r$1.cwd)):(s=await $e({cwd:r$1.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!0,isNewProject:!0,srcDir:r$1.srcDir,cssVariables:r$1.cssVariables,style:"index"}),c=r$1.components?.length===1&&!!r$1.components[0].match(/\/chat\/b\//));}if(!s)throw new Error(`Failed to read config at ${a.info(r$1.cwd)}.`);await ae(r$1.components,s,r$1),c&&await Qt(r$1.components[0],s);}catch(r$1){r.break(),x$1(r$1);}});async function zi(e){let t=await O();if(!t)return r.break(),x$1(new Error("Failed to fetch registry index.")),[];if(e.all)return t.map(o=>o.name).filter(o=>!Xe.some(n=>n.name===o));if(e.components?.length)return e.components;let{components:r$1}=await Ye({type:"multiselect",name:"components",message:"Which components would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:!1,choices:t.filter(o=>o.type==="registry:ui"&&!Xe.some(n=>n.name===o.name)).map(o=>({title:o.name,value:o.name,selected:e.all?!0:e.components?.includes(o.name)}))});r$1?.length||(r.warn("No components selected. Exiting."),r.info(""),process.exit(1));let i=z.array(z.string()).safeParse(r$1);return i.success?i.data:(r.error(""),x$1(new Error("Something went wrong. Please try again.")),[])}async function ir(e){let t={},r$1={cwd:e.cwd,registryFile:x__default.resolve(e.cwd,e.registryFile),outputDir:x__default.resolve(e.cwd,e.outputDir)};return Z.existsSync(r$1.registryFile)||(t[H]=!0),await Z.mkdir(r$1.outputDir,{recursive:!0}),Object.keys(t).length>0&&(t[H]&&(r.break(),r.error(`The path ${a.info(r$1.registryFile)} does not exist.`)),r.break(),process.exit(1)),{errors:t,resolvePaths:r$1}}var Bi=z.object({cwd:z.string(),registryFile:z.string(),outputDir:z.string()}),or=new Command().name("build").description("build components for a shadcn registry").argument("[registry]","path to registry.json file","./registry.json").option("-o, --output <path>","destination directory for json files","./public/r").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r$1=Bi.parse({cwd:x.resolve(t.cwd),registryFile:e,outputDir:t.output}),{resolvePaths:i}=await ir(r$1),o=await M.readFile(i.registryFile,"utf-8"),n=H$1.safeParse(JSON.parse(o));n.success||(r.error(`Invalid registry file found at ${a.info(i.registryFile)}.`),process.exit(1));let a$1=s("Building registry...");for(let s of n.data.items){if(!s.files)continue;a$1.start(`Building ${s.name}...`),s.$schema="https://ui.shadcn.com/schema/registry-item.json";for(let l of s.files)l.content=await M.readFile(x.resolve(i.cwd,l.path),"utf-8");let c=G.safeParse(s);if(!c.success){r.error(`Invalid registry item found for ${a.info(s.name)}.`);continue}await M.writeFile(x.resolve(i.outputDir,`${c.data.name}.json`),JSON.stringify(c.data,null,2));}a$1.succeed("Building registry.");}catch(r$1){r.break(),x$1(r$1);}});var Ji=z.object({component:z.string().optional(),yes:z.boolean(),cwd:z.string(),path:z.string().optional()}),sr=new Command().name("diff").description("check for updates against the registry").argument("[component]","the component name").option("-y, --yes","skip confirmation prompt.",!1).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r$1=Ji.parse({component:e,...t}),i=x__default.resolve(r$1.cwd);existsSync(i)||(r.error(`The path ${i} does not exist. Please try again.`),process.exit(1));let o=await h(i);o||(r.warn(`Configuration is missing. Please run ${a.success("init")} to create a components.json file.`),process.exit(1));let n=await O();if(n||(x$1(new Error("Failed to fetch registry index.")),process.exit(1)),!r$1.component){let c=o.resolvedPaths.components,l=n.filter(m=>{for(let u of m.files??[]){let h=x__default.resolve(c,typeof u=="string"?u:u.path);if(existsSync(h))return !0}return !1}),f=[];for(let m of l){let u=await nr(m,o);u.length&&f.push({name:m.name,changes:u});}f.length||(r.info("No updates found."),process.exit(0)),r.info("The following components have updates available:");for(let m of f){r.info(`- ${m.name}`);for(let u of m.changes)r.info(` - ${u.filePath}`);}r.break(),r.info(`Run ${a.success("diff <component>")} to see the changes.`),process.exit(0);}let a$1=n.find(c=>c.name===r$1.component);a$1||(r.error(`The component ${a.success(r$1.component)} does not exist.`),process.exit(1));let s=await nr(a$1,o);s.length||(r.info(`No updates found for ${r$1.component}.`),process.exit(0));for(let c of s)r.info(`- ${c.filePath}`),await Yi(c.patch),r.info("");}catch(r){x$1(r);}});async function nr(e,t){let r=await V(t.style,[e]),i=await T(t.tailwind.baseColor);if(!r)return [];let o=[];for(let n of r){let a=await W(t,n);if(a)for(let s of n.files??[]){let c=x__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 f=await ke({filename:s.path,raw:s.content,config:t,baseColor:i}),m=diffLines(f,l);m.length>1&&o.push({filePath:c,patch:m});}}return o}async function Yi(e){e.forEach(t=>{if(t)return t.added?process.stdout.write(a.success(t.value)):t.removed?process.stdout.write(a.error(t.value)):process.stdout.write(t.value)});}var ar=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=>{r.info("> project info"),console.log(await o(e.cwd)),r.break(),r.info("> components.json"),console.log(await h(e.cwd));});async function lr(e){if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let t=e.resolvedPaths.ui,[r$1,i]=await Promise.all([Qi("**/*.{js,ts,jsx,tsx}",{cwd:t}),Q$1()]);if(Object.keys(i).length===0)throw new Error("Something went wrong fetching the registry icons.");let o=Object.entries(F).map(([f,m])=>({title:m.name,value:f})),n=await Ye([{type:"select",name:"sourceLibrary",message:`Which icon library would you like to ${a.info("migrate from")}?`,choices:o},{type:"select",name:"targetLibrary",message:`Which icon library would you like to ${a.info("migrate to")}?`,choices:o}]);if(n.sourceLibrary===n.targetLibrary)throw new Error("You cannot migrate to the same icon library. Please choose a different icon library.");if(!(n.sourceLibrary in F&&n.targetLibrary in F))throw new Error("Invalid icon library. Please choose a valid icon library.");let a$1=F[n.sourceLibrary],s$1=F[n.targetLibrary],{confirm:c}=await Ye({type:"confirm",name:"confirm",initial:!0,message:`We will migrate ${a.info(r$1.length)} files in ${a.info(`./${x__default.relative(e.resolvedPaths.cwd,t)}`)} from ${a.info(a$1.name)} to ${a.info(s$1.name)}. Continue?`});c||(r.info("Migration cancelled."),process.exit(0)),s$1.package&&await X([s$1.package],[],e,{silent:!1});let l=s("Migrating icons...")?.start();await Promise.all(r$1.map(async f=>{l.text=`Migrating ${f}...`;let m=x__default.join(t,f),u=await promises.readFile(m,"utf-8"),h=await ro(u,n.sourceLibrary,n.targetLibrary,i);await promises.writeFile(m,h);})),l.succeed("Migration complete.");}async function ro(e,t,r,i){let o=F[t]?.import,n=F[r]?.import,a=await promises.mkdtemp(x__default.join(tmpdir(),"shadcn-")),s=new Project({compilerOptions:{}}),c=x__default.join(a,`shadcn-icons-${randomBytes(4).toString("hex")}.tsx`),l=s.createSourceFile(c,e,{scriptKind:ScriptKind.TSX}),f=[];for(let m of l.getImportDeclarations()??[])if(m.getModuleSpecifier()?.getText()===`"${o}"`){for(let u of m.getNamedImports()??[]){let h=u.getName(),y=Object.values(i).find(R=>R[t]===h)?.[r];!y||f.includes(y)||(f.push(y),u.remove(),l.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).filter(R=>R.getTagNameNode()?.getText()===h).forEach(R=>R.getTagNameNode()?.replaceWithText(y)));}m.getNamedImports()?.length===0&&m.remove();}return f.length>0&&l.addImportDeclaration({moduleSpecifier:n,namedImports:f.map(m=>({name:m}))}),await l.getText()}function no(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function so(e,t,r,i){let n=e.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").trim().split(",").map(a=>a.trim()).filter(Boolean);for(let a of n){let s=a.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?$/),c=a.match(/^(\w+)\s+as\s+(\w+)$/);if(s){let l=s[1],f=s[2];i==="slot"&&l==="Slot"&&!f?r.push({name:"Slot",alias:"SlotPrimitive",isType:!0}):r.push({name:l,alias:f,isType:!0});}else if(c){let l=c[1],f=c[2];i==="slot"&&l==="Slot"&&f==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:l,alias:f,isType:t});}else i==="slot"&&a==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:a,isType:t});}}async function pr(e,t={}){if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let r$1=e.resolvedPaths.ui,i=await Qi("**/*.{js,ts,jsx,tsx}",{cwd:r$1});if(!t.yes){let{confirm:s}=await Ye({type:"confirm",name:"confirm",initial:!0,message:`We will migrate ${a.info(i.length)} files in ${a.info(`./${x__default.relative(e.resolvedPaths.cwd,r$1)}`)} to ${a.info("radix-ui")}. Continue?`});s||(r.info("Migration cancelled."),process.exit(0));}let o=s("Migrating imports...")?.start(),n$1=new Set;await Promise.all(i.map(async s=>{o.text=`Migrating ${s}...`;let c=x__default.join(r$1,s),l=await promises.readFile(c,"utf-8"),{content:f,replacedPackages:m}=await ao(l);m.forEach(u=>n$1.add(u)),await promises.writeFile(c,f);})),o.succeed("Migrating imports.");let a$1=s("Updating package.json...")?.start();try{let s=n(e.resolvedPaths.cwd,!1);if(!s){a$1.fail("Could not read package.json"),r.warn("Could not update package.json. You may need to manually replace @radix-ui/react-* packages with radix-ui");return}let c=Array.from(n$1),l=["dependencies","devDependencies"];for(let f of l)if(s[f])for(let m of c)s[f][m]&&delete s[f][m];if(c.length>0){s.dependencies||(s.dependencies={}),s.dependencies["radix-ui"]="latest";let f=x__default.join(e.resolvedPaths.cwd,"package.json");await promises.writeFile(f,JSON.stringify(s,null,2)+`
|
|
76
|
-
|
|
48
|
+
}`;await L__default.writeFile(r,o,"utf8");}var xi=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()}),Ht=new Command().name("add").description("add a component to your project").argument("[components...]","names, url or local path to component").option("-y, --yes","skip confirmation prompt.",false).option("-o, --overwrite","overwrite existing files.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-a, --all","add all available components",false).option("-p, --path <path>","the path to add the component to.").option("-s, --silent","mute output.",false).option("--src-dir","use the src directory when creating a new project.",false).option("--no-src-dir","do not use the src directory when creating a new project.").option("--css-variables","use css variables for theming.",true).option("--no-css-variables","do not use css variables for theming.").action(async(e,t)=>{try{let r$1=xi.parse({components:e,cwd:A__default.resolve(t.cwd),...t});await F(r$1.cwd);let i=await h(r$1.cwd);if(i||(i=m({style:"new-york",resolvedPaths:{cwd:r$1.cwd}})),e.length>0){let[c$1]=await W([e[0]],{config:i}),m=c$1?.type;if(K$1(c$1)){await se(e,i,r$1);return}if(!r$1.yes&&(m==="registry:style"||m==="registry:theme")){r.break();let{confirm:f}=await Ge({type:"confirm",name:"confirm",message:c.warn(`You are about to install a new ${m.replace("registry:","")}.
|
|
49
|
+
Existing CSS variables and components will be overwritten. Continue?`)});f||(r.break(),r.log("Installation cancelled."),r.break(),process.exit(1));}}if(r$1.components?.length||(r$1.components=await Si(r$1)),(await o(r$1.cwd))?.tailwindVersion==="v4"){let c$1=b.filter(m=>r$1.components?.includes(m.name));c$1?.length&&(r.break(),c$1.forEach(m=>{r.warn(c.warn(m.message));}),r.break(),process.exit(1));}let{errors:n,config:a}=await Jt(r$1);if(n["3"]){let{proceed:c$1}=await Ge({type:"confirm",name:"proceed",message:`You need to create a ${c.info("components.json")} file to add components. Proceed?`,initial:!0});c$1||(r.break(),process.exit(1)),a=await Ie({cwd:r$1.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:!0,isNewProject:!1,srcDir:r$1.srcDir,cssVariables:r$1.cssVariables,baseStyle:!0});}let s=!1;if(n["1"]){let{projectPath:c,template:m}=await ve({cwd:r$1.cwd,force:r$1.overwrite,srcDir:r$1.srcDir,components:r$1.components});c||(r.break(),process.exit(1)),r$1.cwd=c,m==="next-monorepo"?(r$1.cwd=A__default.resolve(r$1.cwd,"apps/web"),a=await h(r$1.cwd)):(a=await Ie({cwd:r$1.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!0,isNewProject:!0,srcDir:r$1.srcDir,cssVariables:r$1.cssVariables,baseStyle:!0}),s=r$1.components?.length===1&&!!r$1.components[0].match(/\/chat\/b\//));}if(!a)throw new Error(`Failed to read config at ${c.info(r$1.cwd)}.`);await se(r$1.components,a,r$1),s&&await qt(r$1.components[0],a);}catch(r$1){r.break(),Q(r$1);}finally{M();}});async function Si(e){let t=await Z();if(!t)return r.break(),Q(new Error("Failed to fetch registry index.")),[];if(e.all)return t.map(o=>o.name).filter(o=>!b.some(n=>n.name===o));if(e.components?.length)return e.components;let{components:r$1}=await Ge({type:"multiselect",name:"components",message:"Which components would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:false,choices:t.filter(o=>o.type==="registry:ui"&&!b.some(n=>n.name===o.name)).map(o=>({title:o.name,value:o.name,selected:e.all?true:e.components?.includes(o.name)}))});r$1?.length||(r.warn("No components selected. Exiting."),r.info(""),process.exit(1));let i=z.array(z.string()).safeParse(r$1);return i.success?i.data:(r.error(""),Q(new Error("Something went wrong. Please try again.")),[])}async function Zt(e){let t={},r$1={cwd:e.cwd,registryFile:A__default.resolve(e.cwd,e.registryFile),outputDir:A__default.resolve(e.cwd,e.outputDir)};return K.existsSync(r$1.registryFile)||(t["13"]=true),await K.mkdir(r$1.outputDir,{recursive:true}),Object.keys(t).length>0&&(t["13"]&&(r.break(),r.error(`The path ${c.info(r$1.registryFile)} does not exist.`)),r.break(),process.exit(1)),{errors:t,resolvePaths:r$1}}var Ri=z.object({cwd:z.string(),registryFile:z.string(),outputDir:z.string()}),er=new Command().name("build").description("build components for a shadcn registry").argument("[registry]","path to registry.json file","./registry.json").option("-o, --output <path>","destination directory for json files","./public/r").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r$1=Ri.parse({cwd:A.resolve(t.cwd),registryFile:e,outputDir:t.output}),{resolvePaths:i}=await Zt(r$1),o=await L.readFile(i.registryFile,"utf-8"),n=h$1.safeParse(JSON.parse(o));n.success||(r.error(`Invalid registry file found at ${c.info(i.registryFile)}.`),process.exit(1));let a=s("Building registry...");for(let s of n.data.items){if(!s.files)continue;a.start(`Building ${s.name}...`),s.$schema="https://ui.shadcn.com/schema/registry-item.json";for(let m of s.files)m.content=await L.readFile(A.resolve(i.cwd,m.path),"utf-8");let c$1=g$1.safeParse(s);if(!c$1.success){r.error(`Invalid registry item found for ${c.info(s.name)}.`);continue}await L.writeFile(A.resolve(i.outputDir,`${c$1.data.name}.json`),JSON.stringify(c$1.data,null,2));}await L.copyFile(i.registryFile,A.resolve(i.outputDir,"registry.json")),a.succeed("Building registry.");}catch(r$1){r.break(),Q(r$1);}});var ki=z.object({component:z.string().optional(),yes:z.boolean(),cwd:z.string(),path:z.string().optional()}),rr=new Command().name("diff").description("check for updates against the registry").argument("[component]","the component name").option("-y, --yes","skip confirmation prompt.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r$1=ki.parse({component:e,...t}),i=A__default.resolve(r$1.cwd);existsSync(i)||(r.error(`The path ${i} does not exist. Please try again.`),process.exit(1));let o=await h(i);o||(r.warn(`Configuration is missing. Please run ${c.success("init")} to create a components.json file.`),process.exit(1));let n=await Z();if(n||(Q(new Error("Failed to fetch registry index.")),process.exit(1)),!r$1.component){let c$1=o.resolvedPaths.components,m=n.filter(d=>{for(let u of d.files??[]){let h=A__default.resolve(c$1,typeof u=="string"?u:u.path);if(existsSync(h))return !0}return !1}),f=[];for(let d of m){let u=await tr(d,o);u.length&&f.push({name:d.name,changes:u});}f.length||(r.info("No updates found."),process.exit(0)),r.info("The following components have updates available:");for(let d of f){r.info(`- ${d.name}`);for(let u of d.changes)r.info(` - ${u.filePath}`);}r.break(),r.info(`Run ${c.success("diff <component>")} to see the changes.`),process.exit(0);}let a=n.find(c=>c.name===r$1.component);a||(r.error(`The component ${c.success(r$1.component)} does not exist.`),process.exit(1));let s=await tr(a,o);s.length||(r.info(`No updates found for ${r$1.component}.`),process.exit(0));for(let c of s)r.info(`- ${c.filePath}`),await Ei(c.patch),r.info("");}catch(r){Q(r);}});async function tr(e,t){let r=await da(t.style,[e]),i=await ba(t.tailwind.baseColor);if(!r)return [];let o=[];for(let n of r){let a=await ea(t,n);if(a)for(let s of n.files??[]){let c=A__default.resolve(a,typeof s=="string"?s:s.path);if(!existsSync(c))continue;let m=await promises.readFile(c,"utf8");if(typeof s=="string"||!s.content)continue;let f=await H({filename:s.path,raw:s.content,config:t,baseColor:i}),d=diffLines(f,m);d.length>1&&o.push({filePath:c,patch:d});}}return o}async function Ei(e){e.forEach(t=>{if(t)return t.added?process.stdout.write(c.success(t.value)):t.removed?process.stdout.write(c.error(t.value)):process.stdout.write(t.value)});}var ir=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{r.info("> project info"),console.log(await o(e.cwd)),r.break(),r.info("> components.json"),console.log(await h(e.cwd));}catch(t){Q(t);}});var ke="latest",Ee=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${ke}`,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${ke}`,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{shadcn:{command:"npx",args:[`shadcn@${ke}`,"mcp"]}}}}],sr=[`shadcn@${ke}`],Qe=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 F(e.cwd);let t=new StdioServerTransport;await b$1.connect(t);}catch(t){r.break(),Q(t);}}),Di=He.object({client:He.enum(["claude","cursor","vscode"]),cwd:He.string()});Qe.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${Ee.map(e=>e.name).join(", ")})`).action(async(e,t)=>{try{let i=(t.parent?.opts()||{}).cwd||process.cwd(),o=e.client;if(!o){let m=await Ge({type:"select",name:"client",message:"Which MCP client are you using?",choices:Ee.map(f=>({title:f.label,value:f.name}))});m.client||(r.break(),process.exit(1)),o=m.client;}let n=Di.parse({client:o,cwd:i}),a=s("Configuring MCP server...").start(),s$1=await Li(n);a.succeed("Configuring MCP server.");let c=await h(n.cwd);if(c)await D([],sr,c,{silent:!1});else {let m=await a$1(n.cwd),f=m==="npm"?"install":"add",d=m==="npm"?"--save-dev":"-D",u=s("Installing dependencies...").start();await execa(m,[f,d,...sr],{cwd:n.cwd}),u.succeed("Installing dependencies.");}r.break(),r.success(`Configuration saved to ${s$1}.`),r.break();}catch(r){Q(r);}});var Ai=(e,t)=>t;async function Li(e){let{client:t,cwd:r}=e,i=Ee.find(c=>c.name===t);if(!i)throw new Error(`Unknown client: ${t}. Available clients: ${Ee.map(c=>c.name).join(", ")}`);let o=A__default.join(r,i.configPath),n={};try{let c=await promises.readFile(o,"utf-8");n=JSON.parse(c);}catch{}let a=ui(n,i.config,{arrayMerge:Ai}),s=A__default.dirname(o);return await K.ensureDir(s),await promises.writeFile(o,JSON.stringify(a,null,2)+`
|
|
50
|
+
`,"utf-8"),i.configPath}async function cr(e){if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let t=e.resolvedPaths.ui,[r$1,i]=await Promise.all([zi("**/*.{js,ts,jsx,tsx}",{cwd:t}),$()]);if(Object.keys(i).length===0)throw new Error("Something went wrong fetching the registry icons.");let o=Object.entries(G).map(([f,d])=>({title:d.name,value:f})),n=await Ge([{type:"select",name:"sourceLibrary",message:`Which icon library would you like to ${c.info("migrate from")}?`,choices:o},{type:"select",name:"targetLibrary",message:`Which icon library would you like to ${c.info("migrate to")}?`,choices:o}]);if(n.sourceLibrary===n.targetLibrary)throw new Error("You cannot migrate to the same icon library. Please choose a different icon library.");if(!(n.sourceLibrary in G&&n.targetLibrary in G))throw new Error("Invalid icon library. Please choose a valid icon library.");let a=G[n.sourceLibrary],s$1=G[n.targetLibrary],{confirm:c$1}=await Ge({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${c.info(r$1.length)} files in ${c.info(`./${A__default.relative(e.resolvedPaths.cwd,t)}`)} from ${c.info(a.name)} to ${c.info(s$1.name)}. Continue?`});c$1||(r.info("Migration cancelled."),process.exit(0)),s$1.package&&await D([s$1.package],[],e,{silent:false});let m=s("Migrating icons...")?.start();await Promise.all(r$1.map(async f=>{m.text=`Migrating ${f}...`;let d=A__default.join(t,f),u=await promises.readFile(d,"utf-8"),h=await Gi(u,n.sourceLibrary,n.targetLibrary,i);await promises.writeFile(d,h);})),m.succeed("Migration complete.");}async function Gi(e,t,r,i){let o=G[t]?.import,n=G[r]?.import,a=await promises.mkdtemp(A__default.join(tmpdir(),"shadcn-")),s=new Project({compilerOptions:{}}),c=A__default.join(a,`shadcn-icons-${randomBytes(4).toString("hex")}.tsx`),m=s.createSourceFile(c,e,{scriptKind:ScriptKind.TSX}),f=[];for(let d of m.getImportDeclarations()??[])if(d.getModuleSpecifier()?.getText()===`"${o}"`){for(let u of d.getNamedImports()??[]){let h=u.getName(),w=Object.values(i).find(y=>y[t]===h)?.[r];!w||f.includes(w)||(f.push(w),u.remove(),m.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).filter(y=>y.getTagNameNode()?.getText()===h).forEach(y=>y.getTagNameNode()?.replaceWithText(w)));}d.getNamedImports()?.length===0&&d.remove();}return f.length>0&&m.addImportDeclaration({moduleSpecifier:n,namedImports:f.map(d=>({name:d}))}),await m.getText()}function qi(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function Ki(e,t,r,i){let n=e.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").trim().split(",").map(a=>a.trim()).filter(Boolean);for(let a of n){let s=a.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?$/),c=a.match(/^(\w+)\s+as\s+(\w+)$/);if(s){let m=s[1],f=s[2];i==="slot"&&m==="Slot"&&!f?r.push({name:"Slot",alias:"SlotPrimitive",isType:true}):r.push({name:m,alias:f,isType:true});}else if(c){let m=c[1],f=c[2];i==="slot"&&m==="Slot"&&f==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:m,alias:f,isType:t});}else i==="slot"&&a==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:a,isType:t});}}async function lr(e,t={}){if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let r$1=e.resolvedPaths.ui,i=await zi("**/*.{js,ts,jsx,tsx}",{cwd:r$1});if(!t.yes){let{confirm:s}=await Ge({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${c.info(i.length)} files in ${c.info(`./${A__default.relative(e.resolvedPaths.cwd,r$1)}`)} to ${c.info("radix-ui")}. Continue?`});s||(r.info("Migration cancelled."),process.exit(0));}let o=s("Migrating imports...")?.start(),n$1=new Set;await Promise.all(i.map(async s=>{o.text=`Migrating ${s}...`;let c=A__default.join(r$1,s),m=await promises.readFile(c,"utf-8"),{content:f,replacedPackages:d}=await Hi(m);d.forEach(u=>n$1.add(u)),await promises.writeFile(c,f);})),o.succeed("Migrating imports.");let a=s("Updating package.json...")?.start();try{let s=n(e.resolvedPaths.cwd,!1);if(!s){a.fail("Could not read package.json"),r.warn("Could not update package.json. You may need to manually replace @radix-ui/react-* packages with radix-ui");return}let c=Array.from(n$1),m=["dependencies","devDependencies"];for(let f of m)if(s[f])for(let d of c)s[f][d]&&delete s[f][d];if(c.length>0){s.dependencies||(s.dependencies={}),s.dependencies["radix-ui"]="latest";let f=A__default.join(e.resolvedPaths.cwd,"package.json");await promises.writeFile(f,JSON.stringify(s,null,2)+`
|
|
51
|
+
`),a.succeed("Updated package.json."),await D(["radix-ui"],[],e,{silent:!1});}else a.succeed("No packages found in source files.");}catch{a.fail("Failed to update package.json"),r.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui");}}async function Hi(e){let t=/import\s+(?:(type)\s+)?(?:\*\s+as\s+(\w+)|{([^}]+)})\s+from\s+(["'])@radix-ui\/react-([^"']+)\4(;?)/g,r=[],i=[],o=[],n='"',a=false,s=e,c;for(;(c=t.exec(e))!==null;){let[w,y,C,S,V,E,G]=c;if(E==="icons"||E.startsWith("icons/"))continue;i.push(w),i.length===1&&(n=V,a=G===";"),o.push(`@radix-ui/react-${E}`);let j=!!y;if(C){let Oe=qi(E);r.push({name:Oe,alias:C,isType:j});}else S&&Ki(S,j,r,E);}if(r.length===0)return {content:e,replacedPackages:[]};let m=r.filter((w,y,C)=>y===C.findIndex(S=>S.name===w.name&&S.alias===w.alias&&S.isType===w.isType)),d=`import { ${m.map(w=>{let y=w.isType?"type ":"";return w.alias?`${y}${w.name} as ${w.alias}`:`${y}${w.name}`}).join(", ")} } from ${n}radix-ui${n}${a?";":""}`;s=i.reduce((w,y,C)=>w.replace(y,C===0?d:""),s),s=s.replace(/\n\s*\n\s*\n/g,`
|
|
77
52
|
|
|
78
|
-
`),
|
|
79
|
-
`).map(
|
|
80
|
-
`));let h=Array.from(new Set(o));return {content:s,replacedPackages:h}}async function
|
|
81
|
-
Before you can run a migration, you must create a valid ${
|
|
82
|
-
Before you can build the registry, you must create a valid ${
|
|
83
|
-
//# sourceMappingURL=out.js.map
|
|
53
|
+
`),m.some(w=>w.name==="Slot"&&w.alias==="SlotPrimitive")&&(s=s.split(`
|
|
54
|
+
`).map(C=>{if(C.trim().startsWith("import "))return C;let S=C;return S=S.replace(/\b(asChild\s*\?\s*)Slot(\s*:)/g,"$1__SLOT_PLACEHOLDER__$2"),S=S.replace(/\bReact\.ComponentProps<typeof\s+Slot>/g,"React.ComponentProps<typeof __SLOT_PLACEHOLDER__>"),S=S.replace(/\bComponentProps<typeof\s+Slot>/g,"ComponentProps<typeof __SLOT_PLACEHOLDER__>"),S=S.replace(/(<\/?)Slot(\s*\/?>)/g,"$1__SLOT_PLACEHOLDER__$2"),S=S.replace(/\bSlot\b/g,(V,E,G)=>{let j=G.substring(0,E),Oe=(j.match(/"/g)||[]).length,Ir=(j.match(/'/g)||[]).length;return Oe%2!==0||Ir%2!==0?V:"__SLOT_PLACEHOLDER__"}),S=S.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),S}).join(`
|
|
55
|
+
`));let h=Array.from(new Set(o));return {content:s,replacedPackages:h}}async function fr(e){let t={};if(!K.existsSync(e.cwd)||!K.existsSync(A__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!K.existsSync(A__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,config:null};try{let r=await h(e.cwd);return {errors:t,config:r}}catch{r.break(),r.error(`An invalid ${c.info("components.json")} file was found at ${c.info(e.cwd)}.
|
|
56
|
+
Before you can run a migration, you must create a valid ${c.info("components.json")} file by running the ${c.info("init")} command.`),r.error(`Learn more at ${c.info("https://ui.shadcn.com/docs/components-json")}.`),r.break(),process.exit(1);}}var pr=[{name:"icons",description:"migrate your ui components to a different icon library."},{name:"radix",description:"migrate to radix-ui."}],Zi=z.object({cwd:z.string(),list:z.boolean(),yes:z.boolean(),migration:z.string().refine(e=>e&&pr.some(t=>t.name===e),{message:"You must specify a valid migration. Run `shadcn migrate --list` to see available migrations."}).optional()}),dr=new Command().name("migrate").description("run a migration.").argument("[migration]","the migration to run.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-l, --list","list all migrations.",false).option("-y, --yes","skip confirmation prompt.",false).action(async(e,t)=>{try{let r$1=Zi.parse({cwd:A__default.resolve(t.cwd),migration:e,list:t.list,yes:t.yes});if(r$1.list||!r$1.migration){r.info("Available migrations:");for(let n of pr)r.info(`- ${n.name}: ${n.description}`);return}if(!r$1.migration)throw new Error("You must specify a migration. Run `shadcn migrate --list` to see available migrations.");let{errors:i,config:o}=await fr(r$1);if(i["1"]||i["3"])throw new Error("No `components.json` file found. Ensure you are at the root of your project.");if(!o)throw new Error("Something went wrong reading your `components.json` file. Please ensure you have a valid `components.json` file.");r$1.migration==="icons"&&await cr(o),r$1.migration==="radix"&&await lr(o,{yes:r$1.yes});}catch(r$1){r.break(),Q(r$1);}});async function ur(e){let t={},r$1={cwd:e.cwd,registryFile:A__default.resolve(e.cwd,e.registryFile),outputDir:A__default.resolve(e.cwd,e.outputDir)};if(!K.existsSync(r$1.registryFile))return t["13"]=true,{errors:t,resolvePaths:null,config:null};if(!K.existsSync(A__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,resolvePaths:null,config:null};await K.mkdir(r$1.outputDir,{recursive:true});try{let i=await h(e.cwd);return {errors:t,config:i,resolvePaths:r$1}}catch{r.break(),r.error(`An invalid ${c.info("components.json")} file was found at ${c.info(e.cwd)}.
|
|
57
|
+
Before you can build the registry, you must create a valid ${c.info("components.json")} file by running the ${c.info("init")} command.`),r.break(),process.exit(1);}}var to=z.object({cwd:z.string(),registryFile:z.string(),outputDir:z.string(),verbose:z.boolean().optional().default(false)}),gr=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 ro({cwd:A.resolve(t.cwd),registryFile:e,outputDir:t.output,verbose:t.verbose});});async function ro(e){try{let t=to.parse(e),[{errors:r$1,resolvePaths:i,config:o$1},n]=await Promise.all([ur(t),o(t.cwd)]);(r$1["3"]||!o$1||!n)&&(r.error(`A ${c.info("components.json")} file is required to build the registry. Run ${c.info("shadcn init")} to create one.`),r.break(),process.exit(1)),(r$1["13"]||!i)&&(r.error(`We could not find a registry file at ${c.info(A.resolve(t.cwd,t.registryFile))}.`),r.break(),process.exit(1));let a=await L.readFile(i.registryFile,"utf-8"),s$1=h$1.safeParse(JSON.parse(a));s$1.success||(r.error(`Invalid registry file found at ${c.info(i.registryFile)}.`),r.break(),process.exit(1));let c$1=s("Building registry..."),m=await io(s$1.data,o$1,n);for(let f of m.items)f.files=f.files?.filter((d,u,h)=>u===h.findIndex(w=>w.path===d.path)),f.dependencies&&(f.dependencies=f.dependencies.filter((d,u,h)=>u===h.findIndex(w=>w===d)));for(let f of m.items){if(!f.files)continue;c$1.start(`Building ${f.name}...`),f.$schema="https://ui.shadcn.com/schema/registry-item.json";for(let u of f.files){let h=A.resolve(i.cwd,u.path);try{if(!(await L.stat(h)).isFile())continue;u.content=await L.readFile(h,"utf-8");}catch(w){console.error("Error reading file in registry build:",h,w);continue}}let d=g$1.safeParse(f);if(!d.success){r.error(`Invalid registry item found for ${c.info(f.name)}.`);continue}await L.writeFile(A.resolve(i.outputDir,`${d.data.name}.json`),JSON.stringify(d.data,null,2));}if(await L.copyFile(i.registryFile,A.resolve(i.outputDir,"registry.json")),c$1.succeed("Building registry."),t.verbose){s(`The registry has ${c.info(m.items.length.toString())} items:`).succeed();for(let f of m.items){r.log(` - ${f.name} (${c.info(f.type)})`);for(let d of f.files??[])r.log(` - ${d.path}`);}}}catch(t){r.break(),Q(t);}}async function io(e,t,r){for(let i of e.items)if(i.files?.length)for(let o of i.files){let n=await J(o.path,t,r);n.files=n.files?.filter(a=>a.path!==o.path),n.files&&i.files.push(...n.files),n.dependencies&&(i.dependencies=i.dependencies?i.dependencies.concat(n.dependencies):n.dependencies);}return e}var hr=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()=>{r.warn(`The ${c.info("shadcn registry:mcp")} command is deprecated. Use the ${c.info("shadcn mcp")} command instead.`),r.break();});var so=z.object({cwd:z.string(),query:z.string().optional(),limit:z.number().optional(),offset:z.number().optional()}),br=new Command().name("search").alias("list").description("search items from registries").argument("<registries...>","the registry names or urls to search items from. Names must be prefixed with @.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-q, --query <query>","query string").option("-l, --limit <number>","maximum number of items to display per registry","100").option("-o, --offset <number>","number of items to skip","0").action(async(e,t)=>{try{let r=so.parse({cwd:A__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 F(r.cwd);let i=m({style:"new-york",resolvedPaths:{cwd:r.cwd}}),o=L$1(i),n=A__default.resolve(r.cwd,"components.json");if(K.existsSync(n)){let c=await K.readJson(n),m=p.partial().parse(c);o=L$1({...i,...m});}let a=o;try{let c=await h(r.cwd);c&&(a=L$1(c));}catch{}N(e,a);let s=await fa(e,{query:r.query,limit:r.limit,offset:r.offset,config:a});console.log(JSON.stringify(s,null,2)),process.exit(0);}catch(r){Q(r);}finally{M();}});var co=z.object({cwd:z.string()}),Rr=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=co.parse({cwd:A__default.resolve(t.cwd)});await F(r.cwd);let i=L$1({}),o=A__default.resolve(r.cwd,"components.json");if(K.existsSync(o)){let s=await K.readJson(o),c=p.partial().parse(s);i=L$1(c);}let n=i;try{let s=await h(r.cwd);s&&(n=L$1(s));}catch{}N(e,n);let a=await W(e,{config:n});console.log(JSON.stringify(a,null,2)),process.exit(0);}catch(r){Q(r);}finally{M();}});var Cr={version:"3.0.0"};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function fo(){let e=new Command().name("shadcn").description("add items from registries to your project").version(Cr.version,"-v, --version","display the version number");e.addCommand(Ut).addCommand(Ht).addCommand(rr).addCommand(Rr).addCommand(br).addCommand(dr).addCommand(ir).addCommand(er).addCommand(Qe),e.addCommand(gr).addCommand(hr),e.parse();}fo();//# sourceMappingURL=index.js.map
|
|
84
58
|
//# sourceMappingURL=index.js.map
|