shadcn
Version:
Add components to your apps.
75 lines (71 loc) • 72.6 kB
JavaScript
#!/usr/bin/env node
import { a as a$1 } from './chunk-CRHL7BFC.js';
import { I, W, M, q, a, s, n, h, o, r, i, K, N, e, f, c, d, g, p, J, C, B as B$1, Q as Q$1, O, R, j, U, t, X, S as S$1, Z as Z$1, Y, l, k, u, v, L as L$1, m, b } from './chunk-JJ2VRW56.js';
export { I as BASE_COLORS, T as clearRegistryCache, S as fetchRegistry, Q as fetchTree, R as getItemTargetPath, O as getRegistryBaseColor, N as getRegistryBaseColors, L as getRegistryIcons, J as getRegistryIndex, M as getRegistryItem, Z as getRegistryParentMap, K as getRegistryStyles, Y as getRegistryTypeAliasMap, W as isUrl, V as registryGetTheme, U as registryResolveItemsTree, X as resolveRegistryItems, P as resolveTree } from './chunk-JJ2VRW56.js';
import * as S from 'path';
import S__default, { basename } from 'path';
import { promises, existsSync } from 'fs';
import te from 'fs-extra';
import v$1 from 'postcss';
import kr from 'postcss/lib/at-rule';
import { z } from 'zod';
import { detect } from '@antfu/ni';
import { execa } from 'execa';
import Ze from 'prompts';
import ji, { tmpdir } from 'os';
import { Project, ScriptKind, SyntaxKind } from 'ts-morph';
import { transformFromAstSync } from '@babel/core';
import { parse } from '@babel/parser';
import ii from '@babel/plugin-transform-typescript';
import * as Ce from 'recast';
import { loadConfig } from 'tsconfig-paths';
import { Command } from 'commander';
import * as B from 'fs/promises';
import B__default from 'fs/promises';
import { diffLines } from 'diff';
import { randomBytes } from 'crypto';
import tn from 'fast-glob';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
var F="1";var _="3";var ae="5",Ke="6",$t="7";var Q="13";async function Nt(e){let t={};if(!te.existsSync(e.cwd)||!te.existsSync(S__default.resolve(e.cwd,"package.json")))return t[F]=!0,{errors:t,projectInfo:null};let r$1=r("Preflight checks.",{silent:e.silent}).start();te.existsSync(S__default.resolve(e.cwd,"components.json"))&&!e.force&&(r$1?.fail(),q.break(),q.error(`A ${a.info("components.json")} file already exists at ${a.info(e.cwd)}.
To start over, remove the ${a.info("components.json")} file and run ${a.info("init")} again.`),q.break(),process.exit(1)),r$1?.succeed();let i=r("Verifying framework.",{silent:e.silent}).start(),n$1=await n(e.cwd);(!n$1||n$1?.framework.name==="manual")&&(t[$t]=!0,i?.fail(),q.break(),n$1?.framework.links.installation&&q.error(`We could not detect a supported framework at ${a.info(e.cwd)}.
Visit ${a.info(n$1?.framework.links.installation)} to manually configure your project.
Once configured, you can use the cli to add components.`),q.break(),process.exit(1)),i?.succeed(`Verifying framework. Found ${a.info(n$1.framework.label)}.`);let o="Validating Tailwind CSS.";n$1.tailwindVersion==="v4"&&(o=`Validating Tailwind CSS config. Found ${a.info("v4")}.`);let a$1=r(o,{silent:e.silent}).start();n$1.tailwindVersion==="v3"&&(!n$1?.tailwindConfigFile||!n$1?.tailwindCssFile)?(t[ae]=!0,a$1?.fail()):n$1.tailwindVersion==="v4"&&!n$1?.tailwindCssFile?(t[ae]=!0,a$1?.fail()):n$1.tailwindVersion?a$1?.succeed():(t[ae]=!0,a$1?.fail());let s=r("Validating import alias.",{silent:e.silent}).start();return n$1?.aliasPrefix?s?.succeed():(t[Ke]=!0,s?.fail()),Object.keys(t).length>0&&(t[ae]&&(q.break(),q.error(`No Tailwind CSS configuration found at ${a.info(e.cwd)}.`),q.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),q.error("Install Tailwind CSS then try again."),n$1?.framework.links.tailwind&&q.error(`Visit ${a.info(n$1?.framework.links.tailwind)} to get started.`)),t[Ke]&&(q.break(),q.error("No import alias found in your tsconfig.json file."),n$1?.framework.links.installation&&q.error(`Visit ${a.info(n$1?.framework.links.installation)} to learn how to set an import alias.`)),q.break(),process.exit(1)),{errors:t,projectInfo:n$1}}async function Je(e,t,r$1){if(!t.resolvedPaths.tailwindCss||!e||Object.keys(e).length===0)return;r$1={silent:!1,...r$1};let i=t.resolvedPaths.tailwindCss,n=S__default.relative(t.resolvedPaths.cwd,i),o=r(`Updating ${a.info(n)}`,{silent:r$1.silent}).start(),a$1=await promises.readFile(i,"utf8"),s=await Ir(a$1,e);await promises.writeFile(i,s,"utf8"),o.succeed();}async function Ir(e,t){let r=[Pr(t)],n=(await v$1(r).process(e,{from:void 0})).css;return n=n.replace(/\/\* ---break--- \*\//g,""),n=n.replace(/(\n\s*\n)+/g,`
`),n=n.trimEnd(),n}function Pr(e){return {postcssPlugin:"update-css",Once(t){for(let[r,i]of Object.entries(e))if(r.startsWith("@")){let n=r.match(/@([a-zA-Z-]+)\s*(.*)/);if(!n)continue;let[,o,a]=n;if(o==="plugin"){if(!t.nodes?.find(c=>c.type==="atrule"&&c.name==="plugin"&&c.params===a)){let c=v$1.atRule({name:"plugin",params:a,raws:{semicolon:!0,before:`
`}}),l=t.nodes?.filter(m=>m.type==="atrule"&&m.name==="import"),f=t.nodes?.filter(m=>m.type==="atrule"&&m.name==="plugin");if(f&&f.length>0){let m=f[f.length-1];t.insertAfter(m,c);}else if(l&&l.length>0){let m=l[l.length-1];t.insertAfter(m,c),t.insertBefore(c,v$1.comment({text:"---break---"})),t.insertAfter(c,v$1.comment({text:"---break---"}));}else t.prepend(c),t.insertBefore(c,v$1.comment({text:"---break---"})),t.insertAfter(c,v$1.comment({text:"---break---"}));}}else if(o==="keyframes"){let s=t.nodes?.find(l=>l.type==="atrule"&&l.name==="theme"&&l.params==="inline");s||(s=v$1.atRule({name:"theme",params:"inline",raws:{semicolon:!0,between:" ",before:`
`}}),t.append(s),t.insertBefore(s,v$1.comment({text:"---break---"})));let c=v$1.atRule({name:"keyframes",params:a,raws:{semicolon:!0,between:" ",before:`
`}});if(s.append(c),typeof i=="object")for(let[l,f]of Object.entries(i))ie(c,l,f);}else if(o==="utility"){let s=t.nodes?.find(c=>c.type==="atrule"&&c.name===o&&c.params===a);if(s){if(typeof i=="object")for(let[c,l]of Object.entries(i))if(typeof l=="string"){let f=s.nodes?.find(u=>u.type==="decl"&&u.prop===c),m=v$1.decl({prop:c,value:l,raws:{semicolon:!0,before:`
`}});f?f.replaceWith(m):s.append(m);}else typeof l=="object"&&ie(s,c,l);}else {let c=v$1.atRule({name:o,params:a,raws:{semicolon:!0,between:" ",before:`
`}});if(t.append(c),t.insertBefore(c,v$1.comment({text:"---break---"})),typeof i=="object")for(let[l,f]of Object.entries(i))if(typeof f=="string"){let m=v$1.decl({prop:l,value:f,raws:{semicolon:!0,before:`
`}});c.append(m);}else typeof f=="object"&&ie(c,l,f);}}else Dt(t,o,a,i);}else ie(t,r,i);}}}function Dt(e,t,r,i){let n=e.nodes?.find(o=>o.type==="atrule"&&o.name===t&&o.params===r);if(n||(n=v$1.atRule({name:t,params:r,raws:{semicolon:!0,between:" ",before:`
`}}),e.append(n),e.insertBefore(n,v$1.comment({text:"---break---"}))),typeof i=="object")for(let[o,a]of Object.entries(i))if(o.startsWith("@")){let s=o.match(/@([a-zA-Z-]+)\s*(.*)/);if(s){let[,c,l]=s;Dt(n,c,l,a);}}else ie(n,o,a);else if(typeof i=="string")try{let a=v$1.parse(`.temp{${i}}`).first;if(a&&a.nodes){let s=v$1.rule({selector:"temp",raws:{semicolon:!0,between:" ",before:`
`}});a.nodes.forEach(c=>{if(c.type==="decl"){let l=c.clone();l.raws.before=`
`,s.append(l);}}),s.nodes?.length&&n.append(s);}}catch(o){throw console.error("Error parsing at-rule content:",i,o),o}}function ie(e,t,r){let i=e.nodes?.find(n=>n.type==="rule"&&n.selector===t);if(i||(i=v$1.rule({selector:t,raws:{semicolon:!0,between:" ",before:`
`}}),e.append(i)),typeof r=="object"){for(let[n,o]of Object.entries(r))if(typeof o=="string"){let a=v$1.decl({prop:n,value:o,raws:{semicolon:!0,before:`
`}}),s=i.nodes?.find(c=>c.type==="decl"&&c.prop===n);s?s.replaceWith(a):i.append(a);}else if(typeof o=="object"){let a=n.startsWith("&")?t.replace(/^([^:]+)/,`$1${n.substring(1)}`):n;ie(e,a,o);}}else if(typeof r=="string")try{let o=v$1.parse(`.temp{${r}}`).first;o&&o.nodes&&o.nodes.forEach(a=>{if(a.type==="decl"){let s=a.clone();s.raws.before=`
`,i?.append(s);}});}catch(n){throw console.error("Error parsing rule content:",t,r,n),n}}async function Ye(e,t,r$1){if(!t.resolvedPaths.tailwindCss||!Object.keys(e??{}).length)return;r$1={cleanupDefaultNextStyles:!1,silent:!1,tailwindVersion:"v3",overwriteCssVars:!1,initIndex:!0,...r$1};let i=t.resolvedPaths.tailwindCss,n=S__default.relative(t.resolvedPaths.cwd,i),o=r(`Updating CSS variables in ${a.info(n)}`,{silent:r$1.silent}).start(),a$1=await promises.readFile(i,"utf8"),s=await jr(a$1,e??{},t,{cleanupDefaultNextStyles:r$1.cleanupDefaultNextStyles,tailwindVersion:r$1.tailwindVersion,tailwindConfig:r$1.tailwindConfig,overwriteCssVars:r$1.overwriteCssVars,initIndex:r$1.initIndex});await promises.writeFile(i,s,"utf8"),o.succeed();}async function jr(e,t,r,i={cleanupDefaultNextStyles:!1,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:!1,initIndex:!0}){i={cleanupDefaultNextStyles:!1,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:!1,initIndex:!0,...i};let n=[Tr(t)];if(i.cleanupDefaultNextStyles&&n.push(Lt()),i.tailwindVersion==="v4"){if(n=[],r.resolvedPaths?.cwd){let s=m(r.resolvedPaths.cwd);!s?.dependencies?.["tailwindcss-animate"]&&!s?.devDependencies?.["tailwindcss-animate"]&&i.initIndex&&n.push(Dr({params:"tw-animate-css"}));}n.push(Ar({params:"dark (&:is(.dark *))"})),i.cleanupDefaultNextStyles&&n.push(Lt()),n.push(Or(t,{overwriteCssVars:i.overwriteCssVars})),n.push(Nr(t)),i.tailwindConfig&&(n.push(Fr(i.tailwindConfig)),n.push(Lr(i.tailwindConfig)),n.push(_r(i.tailwindConfig)));}r.tailwind.cssVariables&&i.initIndex&&n.push(Er({tailwindVersion:i.tailwindVersion}));let a=(await v$1(n).process(e,{from:void 0})).css;return a=a.replace(/\/\* ---break--- \*\//g,""),i.tailwindVersion==="v4"&&(a=a.replace(/(\n\s*\n)+/g,`
`)),a}function Er({tailwindVersion:e}){return {postcssPlugin:"update-base-layer",Once(t){let r=[{selector:"*",apply:e==="v4"?"border-border outline-ring/50":"border-border"},{selector:"body",apply:"bg-background text-foreground"}],i=t.nodes.find(n=>n.type==="atrule"&&n.name==="layer"&&n.params==="base"&&r.every(({selector:o,apply:a})=>n.nodes?.some(s=>s.type==="rule"&&s.selector===o&&s.nodes.some(c=>c.type==="atrule"&&c.name==="apply"&&c.params===a))));i||(i=v$1.atRule({name:"layer",params:"base",raws:{semicolon:!0,between:" ",before:`
`}}),t.append(i),t.insertBefore(i,v$1.comment({text:"---break---"}))),r.forEach(({selector:n,apply:o})=>{i?.nodes?.find(s=>s.type==="rule"&&s.selector===n)||i?.append(v$1.rule({selector:n,nodes:[v$1.atRule({name:"apply",params:o,raws:{semicolon:!0,before:`
`}})],raws:{semicolon:!0,between:" ",before:`
`}}));});}}}function Tr(e){return {postcssPlugin:"update-css-vars",Once(t){let r=t.nodes.find(i=>i.type==="atrule"&&i.name==="layer"&&i.params==="base");r instanceof kr||(r=v$1.atRule({name:"layer",params:"base",nodes:[],raws:{semicolon:!0,before:`
`,between:" "}}),t.append(r),t.insertBefore(r,v$1.comment({text:"---break---"}))),r!==void 0&&Object.entries(e).forEach(([i,n])=>{let o=i==="light"?":root":`.${i}`;$r(r,o,n);});}}}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 Lt(){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(n=>n.type==="rule"&&n.selector===t);i||Object.keys(r).length>0&&(i=v$1.rule({selector:t,raws:{between:" ",before:`
`}}),e.append(i)),Object.entries(r).forEach(([n,o])=>{let a=`--${n.replace(/^--/,"")}`,s=v$1.decl({prop:a,value:o,raws:{semicolon:!0}}),c=i?.nodes.find(l=>l.type==="decl"&&l.prop===a);c?c.replaceWith(s):i?.append(s);});}function Or(e,t){return {postcssPlugin:"update-css-vars-v4",Once(r){Object.entries(e).forEach(([i,n])=>{let o=i==="light"?":root":`.${i}`;if(i==="theme"){o="@theme";let s=Se(r);Object.entries(n).forEach(([c,l])=>{let f=`--${c.replace(/^--/,"")}`,m=v$1.decl({prop:f,value:l,raws:{semicolon:!0}}),u=s?.nodes?.find(g=>g.type==="decl"&&g.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===o);!a&&Object.keys(n).length>0&&(a=v$1.rule({selector:o,nodes:[],raws:{semicolon:!0,between:" ",before:`
`}}),r.append(a),r.insertBefore(a,v$1.comment({text:"---break---"}))),Object.entries(n).forEach(([s,c])=>{let l=`--${s.replace(/^--/,"")}`;l==="--sidebar-background"&&(l="--sidebar"),Vt(c)&&(c=`hsl(${c})`);let f=v$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 Nr(e){return {postcssPlugin:"update-theme",Once(t){let r=Array.from(new Set(Object.keys(e).flatMap(o=>Object.keys(e[o]||{}))));if(!r.length)return;let i=Se(t),n=i.nodes?.filter(o=>o.type==="decl"&&o.prop.startsWith("--"));for(let o of r){let a=Object.values(e).find(m=>m[o])?.[o];if(!a)continue;if(o==="radius"){let m={sm:"calc(var(--radius) - 4px)",md:"calc(var(--radius) - 2px)",lg:"var(--radius)",xl:"calc(var(--radius) + 4px)"};for(let[u,g]of Object.entries(m)){let y=v$1.decl({prop:`--radius-${u}`,value:g,raws:{semicolon:!0}});i?.nodes?.find(h=>h.type==="decl"&&h.prop===y.prop)||i?.append(y);}continue}let s=Vt(a)||Mr(a)?`--color-${o.replace(/^--/,"")}`:`--${o.replace(/^--/,"")}`;s==="--color-sidebar-background"&&(s="--color-sidebar");let c=`var(--${o})`;s==="--color-sidebar"&&(c="var(--sidebar)");let l=v$1.decl({prop:s,value:c,raws:{semicolon:!0}});i?.nodes?.find(m=>m.type==="decl"&&m.prop===l.prop)||(n?.length?i?.insertAfter(n[n.length-1],l):i?.append(l));}}}}function Se(e){let t=e.nodes.find(r=>r.type==="atrule"&&r.name==="theme"&&r.params==="inline");return t||(t=v$1.atRule({name:"theme",params:"inline",nodes:[],raws:{semicolon:!0,between:" ",before:`
`}}),e.append(t),e.insertBefore(t,v$1.comment({text:"---break---"}))),t}function Ar({params:e}){return {postcssPlugin:"add-custom-variant",Once(t){if(!t.nodes.find(i=>i.type==="atrule"&&i.name==="custom-variant")){let i=t.nodes.filter(o=>o.type==="atrule"&&o.name==="import"),n=v$1.atRule({name:"custom-variant",params:e,raws:{semicolon:!0,before:`
`}});if(i.length>0){let o=i[i.length-1];t.insertAfter(o,n);}else t.insertAfter(t.nodes[0],n);t.insertBefore(n,v$1.comment({text:"---break---"}));}}}}function Dr({params:e}){return {postcssPlugin:"add-custom-import",Once(t){let r=t.nodes.filter(o=>o.type==="atrule"&&o.name==="import"),i=t.nodes.find(o=>o.type==="atrule"&&o.name==="custom-variant");if(!r.some(o=>o.params.replace(/["']/g,"")===e)){let o=v$1.atRule({name:"import",params:`"${e}"`,raws:{semicolon:!0,before:`
`}});if(r.length>0){let a=r[r.length-1];t.insertAfter(a,o);}else i?(t.insertBefore(i,o),t.insertBefore(i,v$1.comment({text:"---break---"}))):(t.prepend(o),t.insertAfter(o,v$1.comment({text:"---break---"})));}}}}function Fr(e){return {postcssPlugin:"update-tailwind-config",Once(t){if(!e?.plugins)return;let i=Vr(t)==="single"?"'":'"',n=t.nodes.filter(a=>a.type==="atrule"&&a.name==="plugin"),o=n[n.length-1]||t.nodes[0];for(let a of e.plugins){let s=a.replace(/^require\(["']|["']\)$/g,"");if(n.some(l=>l.params.replace(/["']/g,"")===s))continue;let c=v$1.atRule({name:"plugin",params:`${i}${s}${i}`,raws:{semicolon:!0,before:`
`}});t.insertAfter(o,c),t.insertBefore(c,v$1.comment({text:"---break---"}));}}}}function _r(e){return {postcssPlugin:"update-tailwind-config-keyframes",Once(t){if(!e?.theme?.extend?.keyframes)return;let r=Se(t),i=r.nodes?.filter(o=>o.type==="atrule"&&o.name==="keyframes"),n=z.record(z.string(),z.record(z.string(),z.string()));for(let[o,a]of Object.entries(e.theme.extend.keyframes)){if(typeof o!="string")continue;let s=n.safeParse(a);if(!s.success||i?.find(l=>l.type==="atrule"&&l.name==="keyframes"&&l.params===o))continue;let c=v$1.atRule({name:"keyframes",params:o,nodes:[],raws:{semicolon:!0,between:" ",before:`
`}});for(let[l,f]of Object.entries(s.data)){let m=v$1.rule({selector:l,nodes:Object.entries(f).map(([u,g])=>v$1.decl({prop:u,value:g,raws:{semicolon:!0,before:`
`,between:": "}})),raws:{semicolon:!0,between:" ",before:`
`}});c.append(m);}r.append(c),r.insertBefore(c,v$1.comment({text:"---break---"}));}}}}function Lr(e){return {postcssPlugin:"update-tailwind-config-animation",Once(t){if(!e?.theme?.extend?.animation)return;let r=Se(t),i=r.nodes?.filter(o=>o.type==="decl"&&o.prop.startsWith("--animate-")),n=z.record(z.string(),z.string()).safeParse(e.theme.extend.animation);if(n.success)for(let[o,a]of Object.entries(n.data)){let s=`--animate-${o}`;if(i?.find(l=>l.prop===s))continue;let c=v$1.decl({prop:s,value:a,raws:{semicolon:!0,between:": ",before:`
`}});r.append(c);}}}}function Vr(e){return e.nodes[0].toString().includes("'")?"single":"double"}function Vt(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 Mr(e){return e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch")}async function Re(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 Z(e,t,r$1,i){if(e=Array.from(new Set(e)),t=Array.from(new Set(t)),!e?.length&&!t?.length)return;i={silent:!1,...i};let n=r("Installing dependencies.",{silent:i.silent})?.start(),o=await Ur(r$1),a="";if(Br(r$1)&&o==="npm")if(i.silent)a="force";else {n.stopAndPersist(),q.warn(`
It looks like you are using React 19.
Some packages may fail to install due to peer dependency issues in npm (see https://ui.shadcn.com/react-19).
`);let s=await Ze([{type:"select",name:"flag",message:"How would you like to proceed?",choices:[{title:"Use --force",value:"force"},{title:"Use --legacy-peer-deps",value:"legacy-peer-deps"}]}]);s&&(a=s.flag);}n?.start(),await Kr(o,e,t,r$1.resolvedPaths.cwd,a),n?.succeed();}function Br(e){let t=m(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 Ur(e){return m(e.resolvedPaths.cwd,!1)?.dependencies?.expo?"expo":Re(e.resolvedPaths.cwd)}async function Kr(e,t,r,i,n){if(e==="npm")return Gr(t,r,i,n);if(e==="deno")return Jr(t,r,i);if(e==="expo")return Yr(t,r,i);t?.length&&await execa(e,["add",...t],{cwd:i}),r?.length&&await execa(e,["add","-D",...r],{cwd:i});}async function Gr(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 Jr(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 Yr(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 ve=async({sourceFile:e,config:t,baseColor:r})=>(t.tailwind?.cssVariables||!r?.inlineColors||e.getDescendantsOfKind(SyntaxKind.StringLiteral).forEach(i=>{let n=i.getText();if(n){let o=Xr(n.replace(/"/g,""),r.inlineColors);i.replaceWithText(`"${o.trim()}"`);}}),e);function qe(e){if(!e.includes("/")&&!e.includes(":"))return [null,e,null];let t=[],[r,i]=e.split("/");if(!r.includes(":"))return [null,r,i];let n=r.split(":"),o=n.pop(),a=n.join(":");return t.push(a??null,o??null,i??null),t}var Hr=["bg-","text-","border-","ring-offset-","ring-"];function Xr(e,t){e.includes(" border ")&&(e=e.replace(" border "," border border-border "));let r=e.split(" "),i=new Set,n=new Set;for(let o of r){let[a,s,c]=qe(o),l=Hr.find(m=>s?.startsWith(m));if(!l){i.has(o)||i.add(o);continue}let f=s?.replace(l,"");if(f&&f in t.light){i.add([a,`${l}${t.light[f]}`].filter(Boolean).join(":")+(c?`/${c}`:"")),n.add(["dark",a,`${l}${t.dark[f]}`].filter(Boolean).join(":")+(c?`/${c}`:""));continue}i.has(o)||i.add(o);}return [...Array.from(i),...Array.from(n)].join(" ").trim()}var L={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 Mt="lucide",Ie=async({sourceFile:e,config:t})=>{if(!t.iconLibrary||!(t.iconLibrary in L))return e;let r=await L$1(),i=Mt,n=t.iconLibrary;if(i===n)return e;let o=[];for(let a of e.getImportDeclarations()??[])if(a.getModuleSpecifier()?.getText()===`"${L[Mt].import}"`){for(let s of a.getNamedImports()??[]){let c=s.getName(),l=r[c]?.[n];!l||o.includes(l)||(o.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(o.length>0){let a=e.addImportDeclaration({moduleSpecifier:L[n]?.import,namedImports:o.map(s=>({name:s}))});Zr(e)||a.replaceWithText(a.getText().replace(";",""));}return e};function Zr(e){return e.getImportDeclarations()?.[0]?.getText().endsWith(";")??!1}var Pe=async({sourceFile:e,config:t,isRemote:r})=>{let n=`@${t.aliases?.utils?.split("/")[0]?.slice(1)}/lib/utils`,o=e.getImportDeclarations();if(![".tsx",".ts",".jsx",".js"].includes(e.getExtension()))return e;for(let a of o){let s=ei(a.getModuleSpecifierValue(),t,r);a.setModuleSpecifier(s),(n===s||s==="@/lib/utils")&&a.getNamedImports().find(f=>f.getName()==="cn")&&a.setModuleSpecifier(n===s?s.replace(n,t.aliases.utils):t.aliases.utils);}return e};function ei(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 ni={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"]},Wt=async({sourceFile:e,config:t})=>{let r=e.getFullText();if(t.tsx)return r;let i=Ce.parse(r,{parser:{parse:o=>parse(o,ni)}}),n=transformFromAstSync(i,r,{cloneInputAst:!1,code:!1,ast:!0,plugins:[ii],configFile:!1});if(!n||!n.ast)throw new Error("Failed to transform JSX");return Ce.print(n.ast).code};var si=/^["']use client["']$/g,ke=async({sourceFile:e,config:t})=>{if(t.rsc)return e;let r=e.getFirstChildByKind(SyntaxKind.ExpressionStatement);return r&&si.test(r.getText())&&r.remove(),e};var je=async({sourceFile:e,config:t})=>{if(!t.tailwind?.prefix)return e;let r=await p(t);return e.getDescendantsOfKind(SyntaxKind.CallExpression).filter(i=>i.getExpression().getText()==="cva").forEach(i=>{if(i.getArguments()[0]?.isKind(SyntaxKind.StringLiteral)){let n=i.getArguments()[0];n&&n.replaceWithText(`"${G(n.getText()?.replace(/"|'/g,""),t.tailwind.prefix,r)}"`);}i.getArguments()[1]?.isKind(SyntaxKind.ObjectLiteralExpression)&&i.getArguments()[1]?.getDescendantsOfKind(SyntaxKind.PropertyAssignment).find(n=>n.getName()==="variants")?.getDescendantsOfKind(SyntaxKind.PropertyAssignment).forEach(n=>{n.getDescendantsOfKind(SyntaxKind.PropertyAssignment).forEach(o=>{let a=o.getInitializerIfKind(SyntaxKind.StringLiteral);a&&a?.replaceWithText(`"${G(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 n=i.getInitializer();n&&n.replaceWithText(`"${G(n.getText()?.replace(/"|'/g,""),t.tailwind.prefix,r)}"`);}if(i.getInitializer()?.isKind(SyntaxKind.JsxExpression)){let n=i.getInitializer()?.getDescendantsOfKind(SyntaxKind.CallExpression).find(o=>o.getExpression().getText()==="cn");n&&n.getArguments().forEach(o=>{(o.isKind(SyntaxKind.ConditionalExpression)||o.isKind(SyntaxKind.BinaryExpression))&&o.getChildrenOfKind(SyntaxKind.StringLiteral).forEach(a=>{a.replaceWithText(`"${G(a.getText()?.replace(/"|'/g,""),t.tailwind.prefix,r)}"`);}),o.isKind(SyntaxKind.StringLiteral)&&o.replaceWithText(`"${G(o.getText()?.replace(/"|'/g,""),t.tailwind.prefix,r)}"`);});}}i.getName()==="classNames"&&i.getInitializer()?.isKind(SyntaxKind.JsxExpression)&&i.getDescendantsOfKind(SyntaxKind.PropertyAssignment).forEach(n=>{if(n.getInitializer()?.isKind(SyntaxKind.CallExpression)){let o=n.getInitializerIfKind(SyntaxKind.CallExpression);o&&o.getArguments().forEach(a=>{a.isKind(SyntaxKind.ConditionalExpression)&&a.getChildrenOfKind(SyntaxKind.StringLiteral).forEach(s=>{s.replaceWithText(`"${G(s.getText()?.replace(/"|'/g,""),t.tailwind.prefix,r)}"`);}),a.isKind(SyntaxKind.StringLiteral)&&a.replaceWithText(`"${G(a.getText()?.replace(/"|'/g,""),t.tailwind.prefix,r)}"`);});}if(n.getInitializer()?.isKind(SyntaxKind.StringLiteral)&&n.getName()!=="variant"){let o=n.getInitializer();o&&o.replaceWithText(`"${G(o.getText()?.replace(/"|'/g,""),t.tailwind.prefix,r)}"`);}});}),e};function G(e,t="",r){return r==="v3"?e.split(" ").map(i=>{let[n,o,a]=qe(i);return n?a?`${n}:${t}${o}/${a}`:`${n}:${t}${o}`:a?`${t}${o}/${a}`:`${t}${o}`}).join(" "):e.split(" ").map(i=>i.indexOf(`${t}:`)===0?i:`${t}:${i.trim()}`).join(" ")}var fi=new Project({compilerOptions:{}});async function mi(e){let t=await promises.mkdtemp(S__default.join(tmpdir(),"shadcn-"));return S__default.join(t,e)}async function Ee(e,t=[Pe,ke,ve,je,Ie]){let r=await mi(e.filename),i=fi.createSourceFile(r,e.raw,{scriptKind:ScriptKind.TSX});for(let n of t)await n({sourceFile:i,...e});return e.transformJsx?await Wt({sourceFile:i,...e}):i.getText()}async function He(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=r("Updating files.",{silent:r$1.silent})?.start(),[n$1,o]=await Promise.all([n(t.resolvedPaths.cwd),O(t.tailwind.baseColor)]),a$1=[],s=[],c=[];for(let u of e){if(!u.content)continue;let g=wi(u,t,{isSrcDir:n$1?.isSrcDir,framework:n$1?.framework.name,commonRoot:bi(e.map(b=>b.path),u.path)});if(!g)continue;let y=basename(u.path),h=S__default.dirname(g);t.tsx||(g=g.replace(/\.tsx?$/,b=>b===".tsx"?".jsx":".js"));let R=existsSync(g),x=await Ee({filename:u.path,raw:u.content,config:t,baseColor:o,transformJsx:!t.tsx,isRemote:r$1.isRemote},[Pe,ke,ve,je,Ie]);if(R){let b=await promises.readFile(g,"utf-8"),[I,k]=await Promise.all([Bt(b),Bt(x)]);if(I===k){c.push(S__default.relative(t.resolvedPaths.cwd,g));continue}}if(R&&!r$1.overwrite){i.stop(),r$1.rootSpinner&&r$1.rootSpinner.stop();let{overwrite:b}=await Ze({type:"confirm",name:"overwrite",message:`The file ${a.info(y)} already exists. Would you like to overwrite?`,initial:!1});if(!b){c.push(S__default.relative(t.resolvedPaths.cwd,g)),r$1.rootSpinner&&r$1.rootSpinner.start();continue}i?.start(),r$1.rootSpinner&&r$1.rootSpinner.start();}existsSync(h)||await promises.mkdir(h,{recursive:!0}),await promises.writeFile(g,x,"utf-8"),R?s.push(S__default.relative(t.resolvedPaths.cwd,g)):a$1.push(S__default.relative(t.resolvedPaths.cwd,g));}let l=[...a$1,...s,...c],f=await vi(l,t);if(s.push(...f),s=s.filter(u=>!a$1.includes(u)),!(a$1.length||s.length)&&!c.length&&i?.info("No files updated."),a$1=Array.from(new Set(a$1)),s=Array.from(new Set(s)),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)q.log(` - ${u}`);}else i?.stop();if(s.length&&(r(`Updated ${s.length} ${s.length===1?"file":"files"}:`,{silent:r$1.silent})?.info(),!r$1.silent))for(let u of s)q.log(` - ${u}`);if(c.length&&(r(`Skipped ${c.length} ${s.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)q.log(` - ${u}`);return r$1.silent||q.break(),{filesCreated:a$1,filesUpdated:s,filesSkipped:c}}function wi(e,t,r){if(e.target){if(e.target.startsWith("~/"))return S__default.join(t.resolvedPaths.cwd,e.target.replace("~/",""));let o=e.target;return e.type==="registry:page"&&(o=Ri(o,r.framework),!o)?"":r.isSrcDir?S__default.join(t.resolvedPaths.cwd,"src",o.replace("src/","")):S__default.join(t.resolvedPaths.cwd,o.replace("src/",""))}let i=xi(e,t),n=Si(e.path,i);return S__default.join(i,n)}function xi(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 bi(e,t){let r=e.map(a=>a.replace(/^\//,"")),i=t.replace(/^\//,""),n=i.split("/").slice(0,-1).join("/");if(!n)return "";let o=n.split("/");for(let a=o.length;a>0;a--){let s=o.slice(0,a).join("/");if(r.some(l=>l!==i&&l.startsWith(s+"/")))return "/"+s}return "/"+n}function Si(e,t){let r=e.replace(/^\/|\/$/g,""),i=t.replace(/^\/|\/$/g,""),n=r.split("/"),o=i.split("/"),a=o[o.length-1],s=n.findIndex(c=>c===a);return s===-1?n[n.length-1]:n.slice(s+1).join("/")}async function Bt(e){return e.replace(/\r\n/g,`
`).trim()}function Ri(e,t){if(!t)return "";if(t==="next-app")return e;if(t==="next-pages"){let r=e.replace(/^app\//,"pages/");return r=r.replace(/\/page(\.[jt]sx?)$/,"$1"),r}if(t==="react-router"){let r=e.replace(/^app\//,"app/routes/");return r=r.replace(/\/page(\.[jt]sx?)$/,"$1"),r}if(t==="laravel"){let r=e.replace(/^app\//,"resources/js/pages/");return r=r.replace(/\/page(\.[jt]sx?)$/,"$1"),r}return ""}async function vi(e,t){let r=new Project({compilerOptions:{}}),i=await n(t.resolvedPaths.cwd),n$1=await loadConfig(t.resolvedPaths.cwd),o=[];if(!i||n$1.resultType==="failed")return [];for(let a of e){let s=S__default.resolve(t.resolvedPaths.cwd,a);if(!existsSync(s))continue;let c=await promises.readFile(s,"utf-8"),l=await promises.mkdtemp(S__default.join(tmpdir(),"shadcn-")),f=r.createSourceFile(S__default.join(l,basename(s)),c,{scriptKind:ScriptKind.TSX});if(![".tsx",".ts",".jsx",".js"].includes(f.getExtension()))continue;let m=f.getImportDeclarations();for(let u of m){let g=u.getModuleSpecifierValue();if(i?.aliasPrefix&&!g.startsWith(`${i.aliasPrefix}/`))continue;let y=await b(g,n$1);if(!y)continue;let h=Ii(y,e,t);if(!h)continue;let R=Pi(h,t,i);!R||R===g||(u.setModuleSpecifier(R),await promises.writeFile(s,f.getFullText(),"utf-8"),o.push(a));}}return o}function Ii(e,t,r,i=[".tsx",".ts",".js",".jsx",".css"]){let n=S__default.normalize(r.resolvedPaths.cwd),o=t.map(R=>R.split(S__default.sep).join(S__default.posix.sep)),a=new Set(o),s=S__default.extname(e),c=s!=="",l=c?e.slice(0,-s.length):e,m=S__default.relative(n,l).split(S__default.sep).join(S__default.posix.sep),u=c?[s]:i,g=new Set;for(let R of u){let x=l+R,b=S__default.posix.normalize(S__default.relative(n,x));(a.has(b)||existsSync(x))&&g.add(b);let I=S__default.join(l,`index${R}`),k=S__default.posix.normalize(S__default.relative(n,I));(a.has(k)||existsSync(I))&&g.add(k);}let y=S__default.basename(l);for(let R of o)u.some(x=>R.endsWith(`/${y}${x}`))&&g.add(R);return g.size===0?null:Array.from(g).sort((R,x)=>{let b=S__default.posix.extname(R),I=S__default.posix.extname(x),k=u.indexOf(b)-u.indexOf(I);if(k!==0)return k;let D=m&&R.startsWith(m)?-1:1,E=m&&x.startsWith(m)?-1:1;return D-E})[0]}function Pi(e,t,r){let i=S__default.normalize(S__default.join(t.resolvedPaths.cwd,e)),n=Object.entries(t.resolvedPaths).filter(([,y])=>y&&i.startsWith(S__default.normalize(y+S__default.sep))).sort((y,h)=>h[1].length-y[1].length);if(n.length===0)return null;let[o,a]=n[0],s=S__default.relative(a,i);s=s.split(S__default.sep).join("/");let c=S__default.posix.extname(s),f=[".ts",".tsx",".js",".jsx"].includes(c)?"":c,m=s.slice(0,s.length-c.length);m.endsWith("/index")&&(m=m.slice(0,-6));let u=o==="cwd"?r.aliasPrefix:t.aliases[o];if(!u)return null;let g=m===""?"":`/${m}`;return g=g.replace("/src",""),`${u}${g}${f}`}async function Te(e,t,r){r={overwrite:!1,silent:!1,isNewProject:!1,style:"index",...r};let i=await j(t);return i&&i.ui&&i.ui.resolvedPaths.cwd!==t.resolvedPaths.cwd?await ki(e,t,i,{...r,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await Ci(e,t,r)}async function Ci(e,t$1,r$1){let i=r("Checking registry.",{silent:r$1.silent})?.start(),n=await U(e,t$1);if(!n)return i?.fail(),s(new Error("Failed to fetch components from registry."));i?.succeed();let o=await p(t$1);await t(n.tailwind?.config,t$1,{silent:r$1.silent,tailwindVersion:o});let a=await Gt(e,t$1);await Ye(n.cssVars,t$1,{cleanupDefaultNextStyles:r$1.isNewProject,silent:r$1.silent,tailwindVersion:o,tailwindConfig:n.tailwind?.config,overwriteCssVars:a,initIndex:r$1.style?r$1.style==="index":!1}),await Je(n.css,t$1,{silent:r$1.silent}),await Z(n.dependencies,n.devDependencies,t$1,{silent:r$1.silent}),await He(n.files,t$1,{overwrite:r$1.overwrite,silent:r$1.silent}),n.docs&&q.info(n.docs);}async function ki(e,t$1,r$1,i){let n=r("Checking registry.",{silent:i.silent})?.start(),o=await X(e,t$1),a=await S$1(o),s$1=z.array(B$1).parse(a);if(!s$1)return n?.fail(),s(new Error("Failed to fetch components from registry."));n?.succeed();let c=Z$1(s$1),l$1=Y(),f=[],m=[],u=[],g=r("Installing components.")?.start();for(let h of s$1){let R=l$1.get(h.type),x=c.get(h.name);if(!R)continue;let b=h.type==="registry:ui"||x?.type==="registry:ui"?r$1.ui:t$1,I=await p(b),k$1=l(t$1.resolvedPaths.cwd,b.resolvedPaths.ui),D=await k(k$1,b.resolvedPaths.cwd)??b.resolvedPaths.cwd;if(h.tailwind?.config&&(await t(h.tailwind?.config,b,{silent:!0,tailwindVersion:I}),m.push(S__default.relative(k$1,b.resolvedPaths.tailwindConfig))),h.cssVars){let V=await Gt(e,t$1);await Ye(h.cssVars,b,{silent:!0,tailwindVersion:I,tailwindConfig:h.tailwind?.config,overwriteCssVars:V}),m.push(S__default.relative(k$1,b.resolvedPaths.tailwindCss));}h.css&&(await Je(h.css,b,{silent:!0}),m.push(S__default.relative(k$1,b.resolvedPaths.tailwindCss))),await Z(h.dependencies,h.devDependencies,b,{silent:!0});let E=await He(h.files,b,{overwrite:i.overwrite,silent:!0,rootSpinner:g,isRemote:i.isRemote});f.push(...E.filesCreated.map(V=>S__default.relative(k$1,S__default.join(D,V)))),m.push(...E.filesUpdated.map(V=>S__default.relative(k$1,S__default.join(D,V)))),u.push(...E.filesSkipped.map(V=>S__default.relative(k$1,S__default.join(D,V))));}if(g?.succeed(),f.sort(),m.sort(),u.sort(),!(f.length||m.length)&&!u.length&&r("No files updated.",{silent:i.silent})?.info(),f.length){r(`Created ${f.length} ${f.length===1?"file":"files"}:`,{silent:i.silent})?.succeed();for(let h of f)q.log(` - ${h}`);}if(m.length){r(`Updated ${m.length} ${m.length===1?"file":"files"}:`,{silent:i.silent})?.info();for(let h of m)q.log(` - ${h}`);}if(u.length){r(`Skipped ${u.length} ${m.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:i.silent})?.info();for(let h of u)q.log(` - ${h}`);}}async function Gt(e,t){let r=await X(e,t),i=await S$1(r);return z.array(B$1).parse(i).some(o=>o.type==="registry:theme"||o.type==="registry:style")}var Ti="https://codeload.github.com/shadcn-ui/ui/tar.gz/main",ee={next:"next","next-monorepo":"next-monorepo"};async function Oe(e){e={srcDir:!1,...e};let t=e.template&&ee[e.template]?e.template:"next",r=t===ee.next?"my-app":"my-monorepo",i="latest",n=e.components?.length===1&&!!e.components[0].match(/\/chat\/b\//);if(e.components&&n)try{let[s]=await S$1(e.components),{meta:c}=z.object({meta:z.object({nextVersion:z.string()})}).parse(s);i=c.nextVersion,t=ee.next;}catch(s$1){q.break(),s(s$1);}if(!e.force){let{type:s,name:c}=await Ze([{type:e.template||n?null:"select",name:"type",message:`The path ${a.info(e.cwd)} does not contain a package.json file.
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,format:l=>l.trim(),validate:l=>l.length>128?"Name should be less than 128 characters.":!0}]);t=s??t,r=c;}let o=await Re(e.cwd,{withFallback:!0}),a$1=`${e.cwd}/${r}`;try{await te.access(e.cwd,te.constants.W_OK);}catch{q.break(),q.error(`The path ${a.info(e.cwd)} is not writable.`),q.error(`It is likely you do not have write permissions for this folder or the path ${a.info(e.cwd)} does not exist.`),q.break(),process.exit(1);}return te.existsSync(S__default.resolve(e.cwd,r,"package.json"))&&(q.break(),q.error(`A project with the name ${a.info(r)} already exists.`),q.error("Please choose a different name and try again."),q.break(),process.exit(1)),t===ee.next&&await $i(a$1,{version:i,cwd:e.cwd,packageManager:o,srcDir:!!e.srcDir}),t===ee["next-monorepo"]&&await Oi(a$1,{packageManager:o}),{projectPath:a$1,projectName:r,template:t}}async function $i(e,t){let r$1=r("Creating a new Next.js project. This may take a few minutes.").start(),i=["--tailwind","--eslint","--typescript","--app",t.srcDir?"--src-dir":"--no-src-dir","--no-import-alias",`--use-${t.packageManager}`];(t.version.startsWith("15")||t.version.startsWith("latest")||t.version.startsWith("canary"))&&i.push("--turbopack");try{await execa("npx",[`create-next-app@${t.version}`,e,"--silent",...i],{cwd:t.cwd});}catch{q.break(),q.error("Something went wrong creating a new Next.js project. Please try again."),process.exit(1);}r$1?.succeed("Creating a new Next.js project.");}async function Oi(e,t){let r$1=r("Creating a new Next.js monorepo. This may take a few minutes.").start();try{let i=S__default.join(ji.tmpdir(),`shadcn-template-${Date.now()}`);await te.ensureDir(i);let n=await fetch(Ti);if(!n.ok)throw new Error(`Failed to download template: ${n.statusText}`);let o=S__default.resolve(i,"template.tar.gz");await te.writeFile(o,Buffer.from(await n.arrayBuffer())),await execa("tar",["-xzf",o,"-C",i,"--strip-components=2","ui-main/templates/monorepo-next"]);let a=S__default.resolve(i,"monorepo-next");await te.move(a,e),await te.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}),await execa("cd",[s]),r$1?.succeed("Creating a new Next.js monorepo.");}catch(i){r$1?.fail("Something went wrong creating a new Next.js monorepo."),s(i);}}async function Yt(e,t,r$1){if(!e)return;r$1={silent:!1,...r$1};let i=S__default.relative(t.resolvedPaths.cwd,t.resolvedPaths.tailwindConfig),n=r(`Updating ${a.info(i)}`,{silent:r$1.silent}).start(),o=await promises.readFile(t.resolvedPaths.tailwindConfig,"utf8"),a$1=await Ai(o,e,t);await promises.writeFile(t.resolvedPaths.tailwindConfig,a$1,"utf8"),n?.succeed();}async function Ai(e,t,r){let i=await u(e,r),n=i.getDescendantsOfKind(SyntaxKind.ObjectLiteralExpression).find(o=>o.getProperties().some(a=>a.isKind(SyntaxKind.PropertyAssignment)&&a.getName()==="content"));return n?(Di(n,t),i.getFullText()):e}async function Di(e,t){let r=v(e),i=e.getProperty("content");if(!i){let n={name:"content",initializer:`[${r}${t.join(`${r}, ${r}`)}${r}]`};return e.addPropertyAssignment(n),e}if(i.isKind(SyntaxKind.PropertyAssignment)){let n=i.getInitializer();if(n?.isKind(SyntaxKind.ArrayLiteralExpression))for(let o of t){let a=`${r}${o}${r}`;n.getElements().map(s=>s.getText()).includes(a)||n.addElement(a);}return e}return e}var Li=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?ee[e]:!0,{message:"Invalid template. Please use 'next' or 'next-monorepo'."}),baseColor:z.string().optional().refine(e=>e?I.find(t=>t.name===e):!0,{message:`Invalid base color. Please use '${I.map(e=>e.name).join("', '")}'`}),style:z.string()}),qt=new Command().name("init").description("initialize your project and install dependencies").argument("[components...]","the components to add or a url to the 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.",!0).option("-d, --defaults,","use default configuration.",!1).option("-f, --force","force overwrite of existing configuration.",!1).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",!1).option("--src-dir","use the src directory when creating a new project.",!1).option("--no-src-dir","do not use the src directory when creating a new project.").option("--css-variables","use css variables for theming.",!0).option("--no-css-variables","do not use css variables for theming.").action(async(e,t)=>{try{let r=Li.parse({cwd:S__default.resolve(t.cwd),isNewProject:!1,components:e,style:"index",...t});if(e.length>0&&W(e[0])){let i=await M(e[0],"");i?.type==="registry:style"&&(r.baseColor="neutral",r.style=i.extends??"index");}await Ae(r),q.log(`${a.success("Success!")} Project initialization completed.
You may now add components.`),q.break();}catch(r){q.break(),s(r);}});async function Ae(e){let t,r$1;if(e.skipPreflight)t=await n(e.cwd);else {let l=await Nt(e);if(l.errors[F]){let{projectPath:f,template:m}=await Oe(e);f||process.exit(1),e.cwd=f,e.isNewProject=!0,r$1=m;}t=l.projectInfo;}if(r$1==="next-monorepo")return e.cwd=S__default.resolve(e.cwd,"apps/web"),await h(e.cwd);let i$1=await o(e.cwd,t),n$1=i$1?await Mi(i$1,e):await Vi(await h(e.cwd));if(!e.yes){let{proceed:l}=await Ze({type:"confirm",name:"proceed",message:`Write configuration to ${a.info("components.json")}. Proceed?`,initial:!0});l||process.exit(0);}let o$1=r("Writing components.json.").start(),a$1=S__default.resolve(e.cwd,"components.json");await promises.writeFile(a$1,JSON.stringify(n$1,null,2),"utf8"),o$1.succeed();let s=await i(e.cwd,n$1),c=[...e.style==="none"?[]:[e.style],...e.components??[]];return await Te(c,s,{overwrite:!0,silent:e.silent,style:e.style,isNewProject:e.isNewProject||t?.framework.name==="next-app"}),e.isNewProject&&e.srcDir&&await Yt(["./src/**/*.{js,ts,jsx,tsx,mdx}"],s,{silent:e.silent}),s}async function Vi(e$1=null){let[t,r]=await Promise.all([K(),N()]);q.info("");let i=await Ze([{type:"toggle",name:"typescript",message:`Would you like to use ${a.info("TypeScript")} (recommended)?`,initial:e$1?.tsx??!0,active:"yes",inactive:"no"},{type:"select",name:"style",message:`Which ${a.info("style")} would you like to use?`,choices:t.map(n=>({title:n.label,value:n.name}))},{type:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${a.info("base color")}?`,choices:r.map(n=>({title:n.label,value:n.name}))},{type:"text",name:"tailwindCss",message:`Where is your ${a.info("global CSS")} file?`,initial:e$1?.tailwind.css??e},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${a.info("CSS variables")} for theming?`,initial:e$1?.tailwind.cssVariables??!0,active:"yes",inactive:"no"},{type:"text",name:"tailwindPrefix",message:`Are you using a custom ${a.info("tailwind prefix eg. tw-")}? (Leave blank if not)`,initial:""},{type:"text",name:"tailwindConfig",message:`Where is your ${a.info("tailwind.config.js")} located?`,initial:e$1?.tailwind.config??f},{type:"text",name:"components",message:`Configure the import alias for ${a.info("components")}:`,initial:e$1?.aliases.components??c},{type:"text",name:"utils",message:`Configure the import alias for ${a.info("utils")}:`,initial:e$1?.aliases.utils??d},{type:"toggle",name:"rsc",message:`Are you using ${a.info("React Server Components")}?`,initial:e$1?.rsc??!0,active:"yes",inactive:"no"}]);return g.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 Mi(e,t){let r=e.style,i=t.baseColor,n=e.tailwind.cssVariables;if(!t.defaults){let[o,a$1,s]=await Promise.all([K(),N(),p(e)]),c=await Ze([{type:s==="v4"?null:"select",name:"style",message:`Which ${a.info("style")} would you like to use?`,choices:o.map(l=>({title:l.name==="new-york"?"New York (Recommended)":l.label,value:l.name})),initial:0},{type:t.baseColor?null:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${a.info("base color")}?`,choices:a$1.map(l=>({title:l.label,value:l.name}))}]);r=c.style??"new-york",i=c.tailwindBaseColor??i,n=t.cssVariables;}return g.parse({$schema:e?.$schema,style:r,tailwind:{...e?.tailwind,baseColor:i,cssVariables:n},rsc:e?.rsc,tsx:e?.tsx,aliases:e?.aliases,iconLibrary:e?.iconLibrary})}async function Xt(e){let t={};if(!te.existsSync(e.cwd)||!te.existsSync(S__default.resolve(e.cwd,"package.json")))return t[F]=!0,{errors:t,config:null};if(!te.existsSync(S__default.resolve(e.cwd,"components.json")))return t[_]=!0,{errors:t,config:null};try{let r=await h(e.cwd);return {errors:t,config:r}}catch{q.break(),q.error(`An invalid ${a.info("components.json")} file was found at ${a.info(e.cwd)}.
Before you can add components, you must create a valid ${a.info("components.json")} file by running the ${a.info("init")} command.`),q.error(`Learn more at ${a.info("https://ui.shadcn.com/docs/components-json")}.`),q.break(),process.exit(1);}}async function Zt(e,t){let r=S__default.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await B__default.stat(r)).isFile())return;let i=await M(e,t.style);if(!i?.meta?.importSpecifier||!i?.meta?.moduleSpecifier)return;let n=`import { ${i?.meta?.importSpecifier} } from "${i.meta.moduleSpecifier}"
export default function Page() {
return <${i?.meta?.importSpecifier} />
}`;await B__default.writeFile(r,n,"utf8");}var rt=[{name:"toast",deprecatedBy:"sonner",message:"The toast component is deprecated. Use the sonner component instead."},{name:"toaster",deprecatedBy:"sonner",message:"The toaster component is deprecated. Use the sonner component instead."}],Bi=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()}),tr=new Command().name("add").description("add a component to your project").argument("[components...]","the components to add or a url to the component.").option("-y, --yes","skip confirmation prompt.",!1).option("-o, --overwrite","overwrite existing files.",!1).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-a, --all","add all available components",!1).option("-p, --path <path>","the path to add the component to.").option("-s, --silent","mute output.",!1).option("--src-dir","use the src directory when creating a new project.",!1).option("--no-src-dir","do not use the src directory when creating a new project.").option("--css-variables","use css variables for theming.",!0).option("--no-css-variables","do not use css variables for theming.").action(async(e,t)=>{try{let r=Bi.parse({components:e,cwd:S__default.resolve(t.cwd),...t}),i;if(e.length>0&&W(e[0])&&(i=(await M(e[0],""))?.type),!r.yes&&(i==="registry:style"||i==="registry:theme")){q.break();let{confirm:c}=await Ze({type:"confirm",name:"confirm",message:a.warn(`You are about to install a new ${i.replace("registry:","")}.
Existing CSS variables and components will be overwritten. Continue?`)});c||(q.break(),q.log("Installation cancelled."),q.break(),process.exit(1));}if(r.components?.length||(r.components=await Ui(r)),(await n(r.cwd))?.tailwindVersion==="v4"){let c=rt.filter(l=>r.components?.includes(l.name));c?.length&&(q.break(),c.forEach(l=>{q.warn(a.warn(l.message));}),q.break(),process.exit(1));}let{errors:o,config:a$1}=await Xt(r);if(o[_]){let{proceed:c}=await Ze({type:"confirm",name:"proceed",message:`You need to create a ${a.info("components.json")} file to add components. Proceed?`,initial:!0});c||(q.break(),process.exit(1)),a$1=await Ae({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:!0,isNewProject:!1,srcDir:r.srcDir,cssVariables:r.cssVariables,style:"index"});}let s=!1;if(o[F]){let{projectPath:c,template:l}=await Oe({cwd:r.cwd,force:r.overwrite,srcDir:r.srcDir,components:r.components});c||(q.break(),process.exit(1)),r.cwd=c,l===