Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

shadcn

Package Overview
Dependencies
Maintainers
0
Versions
39
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

shadcn - npm Package Compare versions

Comparing version 2.1.5 to 2.1.6

35

dist/index.js
#!/usr/bin/env node
import Br from"path";import{promises as Kr}from"fs";import ct from"path";import $e from"path";var k="1";var V="3";var oe="5",ae="6",Re="7";import le from"path";var v={"next-app":{name:"next-app",label:"Next.js",links:{installation:"https://ui.shadcn.com/docs/installation/next",tailwind:"https://tailwindcss.com/docs/guides/nextjs"}},"next-pages":{name:"next-pages",label:"Next.js",links:{installation:"https://ui.shadcn.com/docs/installation/next",tailwind:"https://tailwindcss.com/docs/guides/nextjs"}},remix:{name:"remix",label:"Remix",links:{installation:"https://ui.shadcn.com/docs/installation/remix",tailwind:"https://tailwindcss.com/docs/guides/remix"}},vite:{name:"vite",label:"Vite",links:{installation:"https://ui.shadcn.com/docs/installation/vite",tailwind:"https://tailwindcss.com/docs/guides/vite"}},astro:{name:"astro",label:"Astro",links:{installation:"https://ui.shadcn.com/docs/installation/astro",tailwind:"https://tailwindcss.com/docs/guides/astro"}},laravel:{name:"laravel",label:"Laravel",links:{installation:"https://ui.shadcn.com/docs/installation/laravel",tailwind:"https://tailwindcss.com/docs/guides/laravel"}},gatsby:{name:"gatsby",label:"Gatsby",links:{installation:"https://ui.shadcn.com/docs/installation/gatsby",tailwind:"https://tailwindcss.com/docs/guides/gatsby"}},manual:{name:"manual",label:"Manual",links:{installation:"https://ui.shadcn.com/docs/installation/manual",tailwind:"https://tailwindcss.com/docs/installation"}}};import A from"path";import{cyan as bt,green as St,red as Ct,yellow as Pt}from"kleur/colors";var c={error:Ct,warn:Pt,info:bt,success:St};import{createMatchPath as vt}from"tsconfig-paths";async function R(e,t){return vt(t.absoluteBaseUrl,t.paths)(e,void 0,()=>!0,[".ts",".tsx"])}import{cosmiconfig as Rt}from"cosmiconfig";import{loadConfig as kt}from"tsconfig-paths";import{z as g}from"zod";var ke="@/components",Ie="@/lib/utils",Te="app/globals.css",Ee="tailwind.config.js";var It=Rt("components",{searchPlaces:["components.json"]}),F=g.object({$schema:g.string().optional(),style:g.string(),rsc:g.coerce.boolean().default(!1),tsx:g.coerce.boolean().default(!0),tailwind:g.object({config:g.string(),css:g.string(),baseColor:g.string(),cssVariables:g.boolean().default(!0),prefix:g.string().default("").optional()}),aliases:g.object({components:g.string(),utils:g.string(),ui:g.string().optional(),lib:g.string().optional(),hooks:g.string().optional()})}).strict(),Tt=F.extend({resolvedPaths:g.object({cwd:g.string(),tailwindConfig:g.string(),tailwindCss:g.string(),utils:g.string(),components:g.string(),lib:g.string(),hooks:g.string(),ui:g.string()})});async function I(e){let t=await Et(e);return t?await D(e,t):null}async function D(e,t){let r=await kt(e);if(r.resultType==="failed")throw new Error(`Failed to load ${t.tsx?"tsconfig":"jsconfig"}.json. ${r.message??""}`.trim());return Tt.parse({...t,resolvedPaths:{cwd:e,tailwindConfig:A.resolve(e,t.tailwind.config),tailwindCss:A.resolve(e,t.tailwind.css),utils:await R(t.aliases.utils,r),components:await R(t.aliases.components,r),ui:t.aliases.ui?await R(t.aliases.ui,r):A.resolve(await R(t.aliases.components,r)??e,"ui"),lib:t.aliases.lib?await R(t.aliases.lib,r):A.resolve(await R(t.aliases.utils,r)??e,".."),hooks:t.aliases.hooks?await R(t.aliases.hooks,r):A.resolve(await R(t.aliases.components,r)??e,"..","hooks")}})}async function Et(e){try{let t=await It.search(e);return t?F.parse(t.config):null}catch{let r=`${e}/components.json`;throw new Error(`Invalid configuration found in ${c.info(r)}.`)}}import jt from"path";import $t from"fs-extra";function M(e="",t=!0){let r=jt.join(e,"package.json");return $t.readJSONSync(r,{throws:t})}import G from"fast-glob";import ce from"fs-extra";import{loadConfig as Ot}from"tsconfig-paths";var B=["**/node_modules/**",".next","public","dist","build"];async function j(e){let[t,r,i,n,s,o,l]=await Promise.all([G.glob("**/{next,vite,astro}.config.*|gatsby-config.*|composer.json",{cwd:e,deep:3,ignore:B}),ce.pathExists(le.resolve(e,"src")),Dt(e),At(e),Nt(e),Ft(e),M(e,!1)]),f=await ce.pathExists(le.resolve(e,`${r?"src/":""}app`)),d={framework:v.manual,isSrcDir:r,isRSC:!1,isTsx:i,tailwindConfigFile:n,tailwindCssFile:s,aliasPrefix:o};return t.find(m=>m.startsWith("next.config."))?.length?(d.framework=f?v["next-app"]:v["next-pages"],d.isRSC=f,d):t.find(m=>m.startsWith("astro.config."))?.length?(d.framework=v.astro,d):t.find(m=>m.startsWith("gatsby-config."))?.length?(d.framework=v.gatsby,d):t.find(m=>m.startsWith("composer.json"))?.length?(d.framework=v.laravel,d):Object.keys(l?.dependencies??{}).find(m=>m.startsWith("@remix-run/"))?(d.framework=v.remix,d):(t.find(m=>m.startsWith("vite.config."))?.length&&(d.framework=v.vite),d)}async function Nt(e){let t=await G.glob(["**/*.css","**/*.scss"],{cwd:e,deep:5,ignore:B});if(!t.length)return null;for(let r of t)if((await ce.readFile(le.resolve(e,r),"utf8")).includes("@tailwind base"))return r;return null}async function At(e){let t=await G.glob("tailwind.config.*",{cwd:e,deep:3,ignore:B});return t.length?t[0]:null}async function Ft(e){let t=await Ot(e);if(t?.resultType==="failed"||!t?.paths)return null;for(let[r,i]of Object.entries(t.paths))if(i.includes("./*")||i.includes("./src/*")||i.includes("./app/*")||i.includes("./resources/js/*"))return r.at(0)??null;return null}async function Dt(e){return(await G.glob("tsconfig.*",{cwd:e,deep:1,ignore:B})).length>0}async function je(e,t=null){let[r,i]=await Promise.all([I(e),t?Promise.resolve(t):j(e)]);if(r)return r;if(!i||!i.tailwindConfigFile||!i.tailwindCssFile)return null;let n={$schema:"https://ui.shadcn.com/schema.json",rsc:i.isRSC,tsx:i.isTsx,style:"new-york",tailwind:{config:i.tailwindConfigFile,baseColor:"zinc",css:i.tailwindCssFile,cssVariables:!0,prefix:""},aliases:{components:`${i.aliasPrefix}/components`,ui:`${i.aliasPrefix}/components/ui`,hooks:`${i.aliasPrefix}/hooks`,lib:`${i.aliasPrefix}/lib`,utils:`${i.aliasPrefix}/lib/utils`}};return await D(e,n)}var a={error(...e){console.log(c.error(e.join(" ")))},warn(...e){console.log(c.warn(e.join(" ")))},info(...e){console.log(c.info(e.join(" ")))},success(...e){console.log(c.success(e.join(" ")))},log(...e){console.log(e.join(" "))},break(){console.log("")}};import Lt from"ora";function h(e,t){return Lt({text:e,isSilent:t?.silent})}import pe from"fs-extra";async function Oe(e){let t={};if(!pe.existsSync(e.cwd)||!pe.existsSync($e.resolve(e.cwd,"package.json")))return t[k]=!0,{errors:t,projectInfo:null};let r=h("Preflight checks.",{silent:e.silent}).start();pe.existsSync($e.resolve(e.cwd,"components.json"))&&!e.force&&(r?.fail(),a.break(),a.error(`A ${c.info("components.json")} file already exists at ${c.info(e.cwd)}.
To start over, remove the ${c.info("components.json")} file and run ${c.info("init")} again.`),a.break(),process.exit(1)),r?.succeed();let i=h("Verifying framework.",{silent:e.silent}).start(),n=await j(e.cwd);(!n||n?.framework.name==="manual")&&(t[Re]=!0,i?.fail(),a.break(),n?.framework.links.installation&&a.error(`We could not detect a supported framework at ${c.info(e.cwd)}.
import pi from"path";import{promises as ni}from"fs";import xt from"path";import Ke from"path";var I="1";var j="3";var ge="5",ue="6",Ae="7";import he from"path";var k={"next-app":{name:"next-app",label:"Next.js",links:{installation:"https://ui.shadcn.com/docs/installation/next",tailwind:"https://tailwindcss.com/docs/guides/nextjs"}},"next-pages":{name:"next-pages",label:"Next.js",links:{installation:"https://ui.shadcn.com/docs/installation/next",tailwind:"https://tailwindcss.com/docs/guides/nextjs"}},remix:{name:"remix",label:"Remix",links:{installation:"https://ui.shadcn.com/docs/installation/remix",tailwind:"https://tailwindcss.com/docs/guides/remix"}},vite:{name:"vite",label:"Vite",links:{installation:"https://ui.shadcn.com/docs/installation/vite",tailwind:"https://tailwindcss.com/docs/guides/vite"}},astro:{name:"astro",label:"Astro",links:{installation:"https://ui.shadcn.com/docs/installation/astro",tailwind:"https://tailwindcss.com/docs/guides/astro"}},laravel:{name:"laravel",label:"Laravel",links:{installation:"https://ui.shadcn.com/docs/installation/laravel",tailwind:"https://tailwindcss.com/docs/guides/laravel"}},gatsby:{name:"gatsby",label:"Gatsby",links:{installation:"https://ui.shadcn.com/docs/installation/gatsby",tailwind:"https://tailwindcss.com/docs/guides/gatsby"}},manual:{name:"manual",label:"Manual",links:{installation:"https://ui.shadcn.com/docs/installation/manual",tailwind:"https://tailwindcss.com/docs/installation"}}};import z from"path";import{cyan as Ft,green as Dt,red as _t,yellow as zt}from"kleur/colors";var c={error:_t,warn:zt,info:Ft,success:Dt};import{createMatchPath as Kt}from"tsconfig-paths";async function T(e,t){return Kt(t.absoluteBaseUrl,t.paths)(e,void 0,()=>!0,[".ts",".tsx"])}import{cosmiconfig as Mt}from"cosmiconfig";import{loadConfig as Wt}from"tsconfig-paths";import{z as h}from"zod";var Le="@/components",Fe="@/lib/utils",De="app/globals.css",_e="tailwind.config.js";var Ut=Mt("components",{searchPlaces:["components.json"]}),K=h.object({$schema:h.string().optional(),style:h.string(),rsc:h.coerce.boolean().default(!1),tsx:h.coerce.boolean().default(!0),tailwind:h.object({config:h.string(),css:h.string(),baseColor:h.string(),cssVariables:h.boolean().default(!0),prefix:h.string().default("").optional()}),aliases:h.object({components:h.string(),utils:h.string(),ui:h.string().optional(),lib:h.string().optional(),hooks:h.string().optional()}),iconLibrary:h.string().optional()}).strict(),Vt=K.extend({resolvedPaths:h.object({cwd:h.string(),tailwindConfig:h.string(),tailwindCss:h.string(),utils:h.string(),components:h.string(),lib:h.string(),hooks:h.string(),ui:h.string()})});async function C(e){let t=await Bt(e);return t?(t.iconLibrary||(t.iconLibrary=t.style==="new-york"?"radix":"lucide"),await M(e,t)):null}async function M(e,t){let r=await Wt(e);if(r.resultType==="failed")throw new Error(`Failed to load ${t.tsx?"tsconfig":"jsconfig"}.json. ${r.message??""}`.trim());return Vt.parse({...t,resolvedPaths:{cwd:e,tailwindConfig:z.resolve(e,t.tailwind.config),tailwindCss:z.resolve(e,t.tailwind.css),utils:await T(t.aliases.utils,r),components:await T(t.aliases.components,r),ui:t.aliases.ui?await T(t.aliases.ui,r):z.resolve(await T(t.aliases.components,r)??e,"ui"),lib:t.aliases.lib?await T(t.aliases.lib,r):z.resolve(await T(t.aliases.utils,r)??e,".."),hooks:t.aliases.hooks?await T(t.aliases.hooks,r):z.resolve(await T(t.aliases.components,r)??e,"..","hooks")}})}async function Bt(e){try{let t=await Ut.search(e);return t?K.parse(t.config):null}catch{let r=`${e}/components.json`;throw new Error(`Invalid configuration found in ${c.info(r)}.`)}}import Gt from"path";import Jt from"fs-extra";function J(e="",t=!0){let r=Gt.join(e,"package.json");return Jt.readJSONSync(r,{throws:t})}import Y from"fast-glob";import ye from"fs-extra";import{loadConfig as Yt}from"tsconfig-paths";var H=["**/node_modules/**",".next","public","dist","build"];async function E(e){let[t,r,i,n,o,s,l]=await Promise.all([Y.glob("**/{next,vite,astro}.config.*|gatsby-config.*|composer.json",{cwd:e,deep:3,ignore:H}),ye.pathExists(he.resolve(e,"src")),qt(e),Qt(e),Ht(e),Xt(e),J(e,!1)]),f=await ye.pathExists(he.resolve(e,`${r?"src/":""}app`)),d={framework:k.manual,isSrcDir:r,isRSC:!1,isTsx:i,tailwindConfigFile:n,tailwindCssFile:o,aliasPrefix:s};return t.find(p=>p.startsWith("next.config."))?.length?(d.framework=f?k["next-app"]:k["next-pages"],d.isRSC=f,d):t.find(p=>p.startsWith("astro.config."))?.length?(d.framework=k.astro,d):t.find(p=>p.startsWith("gatsby-config."))?.length?(d.framework=k.gatsby,d):t.find(p=>p.startsWith("composer.json"))?.length?(d.framework=k.laravel,d):Object.keys(l?.dependencies??{}).find(p=>p.startsWith("@remix-run/"))?(d.framework=k.remix,d):(t.find(p=>p.startsWith("vite.config."))?.length&&(d.framework=k.vite),d)}async function Ht(e){let t=await Y.glob(["**/*.css","**/*.scss"],{cwd:e,deep:5,ignore:H});if(!t.length)return null;for(let r of t)if((await ye.readFile(he.resolve(e,r),"utf8")).includes("@tailwind base"))return r;return null}async function Qt(e){let t=await Y.glob("tailwind.config.*",{cwd:e,deep:3,ignore:H});return t.length?t[0]:null}async function Xt(e){let t=await Yt(e);if(t?.resultType==="failed"||!t?.paths)return null;for(let[r,i]of Object.entries(t.paths))if(i.includes("./*")||i.includes("./src/*")||i.includes("./app/*")||i.includes("./resources/js/*"))return r.at(0)??null;return null}async function qt(e){return(await Y.glob("tsconfig.*",{cwd:e,deep:1,ignore:H})).length>0}async function ze(e,t=null){let[r,i]=await Promise.all([C(e),t?Promise.resolve(t):E(e)]);if(r)return r;if(!i||!i.tailwindConfigFile||!i.tailwindCssFile)return null;let n={$schema:"https://ui.shadcn.com/schema.json",rsc:i.isRSC,tsx:i.isTsx,style:"new-york",tailwind:{config:i.tailwindConfigFile,baseColor:"zinc",css:i.tailwindCssFile,cssVariables:!0,prefix:""},iconLibrary:"lucide",aliases:{components:`${i.aliasPrefix}/components`,ui:`${i.aliasPrefix}/components/ui`,hooks:`${i.aliasPrefix}/hooks`,lib:`${i.aliasPrefix}/lib`,utils:`${i.aliasPrefix}/lib/utils`}};return await M(e,n)}var a={error(...e){console.log(c.error(e.join(" ")))},warn(...e){console.log(c.warn(e.join(" ")))},info(...e){console.log(c.info(e.join(" ")))},success(...e){console.log(c.success(e.join(" ")))},log(...e){console.log(e.join(" "))},break(){console.log("")}};import Zt from"ora";function y(e,t){return Zt({text:e,isSilent:t?.silent})}import we from"fs-extra";async function Me(e){let t={};if(!we.existsSync(e.cwd)||!we.existsSync(Ke.resolve(e.cwd,"package.json")))return t[I]=!0,{errors:t,projectInfo:null};let r=y("Preflight checks.",{silent:e.silent}).start();we.existsSync(Ke.resolve(e.cwd,"components.json"))&&!e.force&&(r?.fail(),a.break(),a.error(`A ${c.info("components.json")} file already exists at ${c.info(e.cwd)}.
To start over, remove the ${c.info("components.json")} file and run ${c.info("init")} again.`),a.break(),process.exit(1)),r?.succeed();let i=y("Verifying framework.",{silent:e.silent}).start(),n=await E(e.cwd);(!n||n?.framework.name==="manual")&&(t[Ae]=!0,i?.fail(),a.break(),n?.framework.links.installation&&a.error(`We could not detect a supported framework at ${c.info(e.cwd)}.
Visit ${c.info(n?.framework.links.installation)} to manually configure your project.
Once configured, you can use the cli to add components.`),a.break(),process.exit(1)),i?.succeed(`Verifying framework. Found ${c.info(n.framework.label)}.`);let s=h("Validating Tailwind CSS.",{silent:e.silent}).start();!n?.tailwindConfigFile||!n?.tailwindCssFile?(t[oe]=!0,s?.fail()):s?.succeed();let o=h("Validating import alias.",{silent:e.silent}).start();return n?.aliasPrefix?o?.succeed():(t[ae]=!0,o?.fail()),Object.keys(t).length>0&&(t[oe]&&(a.break(),a.error(`No Tailwind CSS configuration found at ${c.info(e.cwd)}.`),a.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),a.error("Install Tailwind CSS then try again."),n?.framework.links.tailwind&&a.error(`Visit ${c.info(n?.framework.links.tailwind)} to get started.`)),t[ae]&&(a.break(),a.error("No import alias found in your tsconfig.json file."),n?.framework.links.installation&&a.error(`Visit ${c.info(n?.framework.links.installation)} to learn how to set an import alias.`)),a.break(),process.exit(1)),{errors:t,projectInfo:n}}import{z as _t}from"zod";function x(e){if(a.error("Something went wrong. Please check the error below for more details."),a.error("If the problem persists, please open an issue on GitHub."),a.error(""),typeof e=="string"&&(a.error(e),a.break(),process.exit(1)),e instanceof _t.ZodError){a.error("Validation failed:");for(let[t,r]of Object.entries(e.flatten().fieldErrors))a.error(`- ${c.info(t)}: ${r}`);a.break(),process.exit(1)}e instanceof Error&&(a.error(e.message),a.break(),process.exit(1)),a.break(),process.exit(1)}import Xt from"path";import{z as p}from"zod";var Ne=p.enum(["registry:style","registry:lib","registry:example","registry:block","registry:component","registry:ui","registry:hook","registry:theme","registry:page"]),Ae=p.object({path:p.string(),content:p.string().optional(),type:Ne,target:p.string().optional()}),zt=p.object({config:p.object({content:p.array(p.string()).optional(),theme:p.record(p.string(),p.any()).optional(),plugins:p.array(p.string()).optional()}).optional()}),Kt=p.object({light:p.record(p.string(),p.string()).optional(),dark:p.record(p.string(),p.string()).optional()}),N=p.object({name:p.string(),type:Ne,description:p.string().optional(),dependencies:p.array(p.string()).optional(),devDependencies:p.array(p.string()).optional(),registryDependencies:p.array(p.string()).optional(),files:p.array(Ae).optional(),tailwind:zt.optional(),cssVars:Kt.optional(),meta:p.record(p.string(),p.any()).optional(),docs:p.string().optional()}),me=p.array(N.extend({files:p.array(p.union([p.string(),Ae])).optional()})),Fe=p.array(p.object({name:p.string(),label:p.string()})),De=p.object({inlineColors:p.object({light:p.record(p.string(),p.string()),dark:p.record(p.string(),p.string())}),cssVars:p.object({light:p.record(p.string(),p.string()),dark:p.record(p.string(),p.string())}),inlineColorsTemplate:p.string(),cssVarsTemplate:p.string()}),Le=N.pick({dependencies:!0,devDependencies:!0,files:!0,tailwind:!0,cssVars:!0,docs:!0});import{promises as fe}from"fs";import{tmpdir as Wt}from"os";import L from"path";import Vt from"deepmerge";import Ut from"stringify-object";import{Project as Mt,QuoteKind as Gt,ScriptKind as _e,SyntaxKind as u}from"ts-morph";async function ze(e,t,r){if(!e)return;r={silent:!1,...r};let i=L.relative(t.resolvedPaths.cwd,t.resolvedPaths.tailwindConfig),n=h(`Updating ${c.info(i)}`,{silent:r.silent}).start(),s=await fe.readFile(t.resolvedPaths.tailwindConfig,"utf8"),o=await Bt(s,e,t);await fe.writeFile(t.resolvedPaths.tailwindConfig,o,"utf8"),n?.succeed()}async function Bt(e,t,r){let i=await J(e,r),n=i.getDescendantsOfKind(u.ObjectLiteralExpression).find(o=>o.getProperties().some(l=>l.isKind(u.PropertyAssignment)&&l.getName()==="content"));if(!n)return e;let s=de(n);return Jt(n,{name:"darkMode",value:"class"},{quoteChar:s}),t.plugins?.forEach(o=>{Ht(n,o)}),t.theme&&await Yt(n,t.theme),i.getFullText()}function Jt(e,t,{quoteChar:r}){let i=e.getProperty("darkMode");if(!i){let n={name:t.name,initializer:`[${r}${t.value}${r}]`};return t.name==="darkMode"?(e.insertPropertyAssignment(0,n),e):(e.addPropertyAssignment(n),e)}if(i.isKind(u.PropertyAssignment)){let n=i.getInitializer(),s=`${r}${t.value}${r}`;if(n?.isKind(u.StringLiteral)){let o=n.getText();return n.replaceWithText(`[${o}, ${s}]`),e}if(n?.isKind(u.ArrayLiteralExpression)){if(n.getElements().map(o=>o.getText()).includes(s))return e;n.addElement(s)}return e}return e}async function Yt(e,t){e.getProperty("theme")||e.addPropertyAssignment({name:"theme",initializer:"{}"}),Ke(e);let i=(e.getPropertyOrThrow("theme")?.asKindOrThrow(u.PropertyAssignment)).getInitializer();if(i?.isKind(u.ObjectLiteralExpression)){let n=i.getText(),s=await Qt(n),o=Vt(s,t),l=Ut(o).replace(/\'\"/g,"'").replace(/\"\'/g,"'").replace(/\'\[/g,"[").replace(/\]\'/g,"]").replace(/\'\\\'/g,"'").replace(/\\\'/g,"'").replace(/\\\'\'/g,"'").replace(/\'\'/g,"'");i.replaceWithText(l)}We(e)}function Ht(e,t){let r=e.getProperty("plugins");if(!r)return e.addPropertyAssignment({name:"plugins",initializer:`[${t}]`}),e;if(r.isKind(u.PropertyAssignment)){let i=r.getInitializer();if(i?.isKind(u.ArrayLiteralExpression)){if(i.getElements().map(n=>n.getText().replace(/["']/g,"")).includes(t.replace(/["']/g,"")))return e;i.addElement(t)}return e}return e}async function J(e,t){let r=await fe.mkdtemp(L.join(Wt(),"shadcn-")),i=t?.resolvedPaths?.tailwindConfig||"tailwind.config.ts",n=L.join(r,`shadcn-${L.basename(i)}`);return new Mt({compilerOptions:{}}).createSourceFile(n,e,{scriptKind:L.extname(i)===".ts"?_e.TS:_e.JS})}function de(e){return e.getFirstDescendantByKind(u.StringLiteral)?.getQuoteKind()===Gt.Single?"'":'"'}function Ke(e){let t=e.getProperties();for(let r=0;r<t.length;r++){let i=t[r];if(i.isKind(u.SpreadAssignment)){let n=i.asKindOrThrow(u.SpreadAssignment),s=n.getExpression().getText();e.insertPropertyAssignment(r,{name:`___${s.replace(/^\.\.\./,"")}`,initializer:`"...${s.replace(/^\.\.\./,"")}"`}),n.remove()}else if(i.isKind(u.PropertyAssignment)){let s=i.asKindOrThrow(u.PropertyAssignment).getInitializer();s&&s.isKind(u.ObjectLiteralExpression)&&Ke(s.asKindOrThrow(u.ObjectLiteralExpression))}}}function We(e){let t=e.getProperties();for(let r=0;r<t.length;r++){let i=t[r];if(i.isKind(u.PropertyAssignment)){let n=i,s=n.getInitializer();if(s?.isKind(u.StringLiteral)){let o=s.getLiteralValue();o.startsWith("...")&&(e.insertSpreadAssignment(r,{expression:o.slice(3)}),n.remove())}else s?.isKind(u.ObjectLiteralExpression)&&We(s)}}}async function Qt(e){let r=(await J(`const theme = ${e}`,null)).getStatements()[0];if(r?.getKind()===u.VariableStatement){let n=(r.getDeclarationList()?.getDeclarations()[0]).getInitializer();if(n?.isKind(u.ObjectLiteralExpression))return await Ve(n)}throw new Error("Invalid input: not an object literal")}function Ve(e){let t={};for(let r of e.getProperties())if(r.isKind(u.PropertyAssignment)){let i=r.getName().replace(/\'/g,"");r.getInitializer()?.isKind(u.ObjectLiteralExpression)?t[i]=Ve(r.getInitializer()):t[i]=Ue(r.getInitializer())}return t}function Ue(e){switch(e.kind){case u.StringLiteral:return e.text;case u.NumericLiteral:return Number(e.text);case u.TrueKeyword:return!0;case u.FalseKeyword:return!1;case u.NullKeyword:return null;case u.ArrayLiteralExpression:return e.elements.map(Ue);default:return e.getText()}}function Me(e){let t={};for(let r of Object.keys(e)){let i=r.split("-"),n=i[0],s=i.slice(1).join("-");s===""?typeof t[n]=="object"?t[n].DEFAULT=`hsl(var(--${r}))`:t[n]=`hsl(var(--${r}))`:(typeof t[n]!="object"&&(t[n]={DEFAULT:`hsl(var(--${n}))`}),t[n][s]=`hsl(var(--${r}))`)}for(let[r,i]of Object.entries(t))typeof i=="object"&&i.DEFAULT===`hsl(var(--${r}))`&&!(r in e)&&delete i.DEFAULT;return t}import _ from"deepmerge";import{HttpsProxyAgent as qt}from"https-proxy-agent";import Zt from"node-fetch";import{z as er}from"zod";var tr=process.env.REGISTRY_URL??"https://ui.shadcn.com/r",rr=process.env.https_proxy?new qt(process.env.https_proxy):void 0;async function z(){try{let[e]=await $(["index.json"]);return me.parse(e)}catch(e){a.error(`
`),x(e)}}async function ue(){try{let[e]=await $(["styles/index.json"]);return Fe.parse(e)}catch(e){return a.error(`
`),x(e),[]}}async function Ge(e,t){try{let[r]=await $([he(e)?e:`styles/${t}/${e}.json`]);return N.parse(r)}catch(r){return a.break(),x(r),null}}async function ge(){return[{name:"neutral",label:"Neutral"},{name:"gray",label:"Gray"},{name:"zinc",label:"Zinc"},{name:"stone",label:"Stone"},{name:"slate",label:"Slate"}]}async function K(e){try{let[t]=await $([`colors/${e}.json`]);return De.parse(t)}catch(t){x(t)}}async function Be(e,t){try{let r=t.map(n=>`styles/${e}/${n.name}.json`),i=await $(r);return me.parse(i)}catch(r){x(r)}}async function Je(e,t,r){if(r)return r;if(t.type==="registry:ui")return e.resolvedPaths.ui??e.resolvedPaths.components;let[i,n]=t.type?.split(":")??[];return i in e.resolvedPaths?Xt.join(e.resolvedPaths[i],n):null}async function $(e){try{return await Promise.all(e.map(async r=>{let i=Qe(r),n=await Zt(i,{agent:rr});if(!n.ok){let s={400:"Bad request",401:"Unauthorized",403:"Forbidden",404:"Not found",500:"Internal server error"};if(n.status===401)throw new Error(`You are not authorized to access the component at ${c.info(i)}.
Once configured, you can use the cli to add components.`),a.break(),process.exit(1)),i?.succeed(`Verifying framework. Found ${c.info(n.framework.label)}.`);let o=y("Validating Tailwind CSS.",{silent:e.silent}).start();!n?.tailwindConfigFile||!n?.tailwindCssFile?(t[ge]=!0,o?.fail()):o?.succeed();let s=y("Validating import alias.",{silent:e.silent}).start();return n?.aliasPrefix?s?.succeed():(t[ue]=!0,s?.fail()),Object.keys(t).length>0&&(t[ge]&&(a.break(),a.error(`No Tailwind CSS configuration found at ${c.info(e.cwd)}.`),a.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),a.error("Install Tailwind CSS then try again."),n?.framework.links.tailwind&&a.error(`Visit ${c.info(n?.framework.links.tailwind)} to get started.`)),t[ue]&&(a.break(),a.error("No import alias found in your tsconfig.json file."),n?.framework.links.installation&&a.error(`Visit ${c.info(n?.framework.links.installation)} to learn how to set an import alias.`)),a.break(),process.exit(1)),{errors:t,projectInfo:n}}import{z as er}from"zod";function x(e){if(a.error("Something went wrong. Please check the error below for more details."),a.error("If the problem persists, please open an issue on GitHub."),a.error(""),typeof e=="string"&&(a.error(e),a.break(),process.exit(1)),e instanceof er.ZodError){a.error("Validation failed:");for(let[t,r]of Object.entries(e.flatten().fieldErrors))a.error(`- ${c.info(t)}: ${r}`);a.break(),process.exit(1)}e instanceof Error&&(a.error(e.message),a.break(),process.exit(1)),a.break(),process.exit(1)}import dr from"path";import{z as m}from"zod";var We=m.enum(["registry:style","registry:lib","registry:example","registry:block","registry:component","registry:ui","registry:hook","registry:theme","registry:page"]),Ue=m.object({path:m.string(),content:m.string().optional(),type:We,target:m.string().optional()}),tr=m.object({config:m.object({content:m.array(m.string()).optional(),theme:m.record(m.string(),m.any()).optional(),plugins:m.array(m.string()).optional()}).optional()}),rr=m.object({light:m.record(m.string(),m.string()).optional(),dark:m.record(m.string(),m.string()).optional()}),_=m.object({name:m.string(),type:We,description:m.string().optional(),dependencies:m.array(m.string()).optional(),devDependencies:m.array(m.string()).optional(),registryDependencies:m.array(m.string()).optional(),files:m.array(Ue).optional(),tailwind:tr.optional(),cssVars:rr.optional(),meta:m.record(m.string(),m.any()).optional(),docs:m.string().optional()}),xe=m.array(_.extend({files:m.array(m.union([m.string(),Ue])).optional()})),Ve=m.array(m.object({name:m.string(),label:m.string()})),Be=m.record(m.string(),m.record(m.string(),m.string())),Ge=m.object({inlineColors:m.object({light:m.record(m.string(),m.string()),dark:m.record(m.string(),m.string())}),cssVars:m.object({light:m.record(m.string(),m.string()),dark:m.record(m.string(),m.string())}),inlineColorsTemplate:m.string(),cssVarsTemplate:m.string()}),Je=_.pick({dependencies:!0,devDependencies:!0,files:!0,tailwind:!0,cssVars:!0,docs:!0});import{promises as be}from"fs";import{tmpdir as ir}from"os";import W from"path";import nr from"deepmerge";import or from"stringify-object";import{Project as sr,QuoteKind as ar,ScriptKind as Ye,SyntaxKind as u}from"ts-morph";async function He(e,t,r){if(!e)return;r={silent:!1,...r};let i=W.relative(t.resolvedPaths.cwd,t.resolvedPaths.tailwindConfig),n=y(`Updating ${c.info(i)}`,{silent:r.silent}).start(),o=await be.readFile(t.resolvedPaths.tailwindConfig,"utf8"),s=await cr(o,e,t);await be.writeFile(t.resolvedPaths.tailwindConfig,s,"utf8"),n?.succeed()}async function cr(e,t,r){let i=await Q(e,r),n=i.getDescendantsOfKind(u.ObjectLiteralExpression).find(s=>s.getProperties().some(l=>l.isKind(u.PropertyAssignment)&&l.getName()==="content"));if(!n)return e;let o=Se(n);return lr(n,{name:"darkMode",value:"class"},{quoteChar:o}),t.plugins?.forEach(s=>{mr(n,s)}),t.theme&&await pr(n,t.theme),i.getFullText()}function lr(e,t,{quoteChar:r}){let i=e.getProperty("darkMode");if(!i){let n={name:t.name,initializer:`[${r}${t.value}${r}]`};return t.name==="darkMode"?(e.insertPropertyAssignment(0,n),e):(e.addPropertyAssignment(n),e)}if(i.isKind(u.PropertyAssignment)){let n=i.getInitializer(),o=`${r}${t.value}${r}`;if(n?.isKind(u.StringLiteral)){let s=n.getText();return n.replaceWithText(`[${s}, ${o}]`),e}if(n?.isKind(u.ArrayLiteralExpression)){if(n.getElements().map(s=>s.getText()).includes(o))return e;n.addElement(o)}return e}return e}async function pr(e,t){e.getProperty("theme")||e.addPropertyAssignment({name:"theme",initializer:"{}"}),Qe(e);let i=(e.getPropertyOrThrow("theme")?.asKindOrThrow(u.PropertyAssignment)).getInitializer();if(i?.isKind(u.ObjectLiteralExpression)){let n=i.getText(),o=await fr(n),s=nr(o,t),l=or(s).replace(/\'\"/g,"'").replace(/\"\'/g,"'").replace(/\'\[/g,"[").replace(/\]\'/g,"]").replace(/\'\\\'/g,"'").replace(/\\\'/g,"'").replace(/\\\'\'/g,"'").replace(/\'\'/g,"'");i.replaceWithText(l)}Xe(e)}function mr(e,t){let r=e.getProperty("plugins");if(!r)return e.addPropertyAssignment({name:"plugins",initializer:`[${t}]`}),e;if(r.isKind(u.PropertyAssignment)){let i=r.getInitializer();if(i?.isKind(u.ArrayLiteralExpression)){if(i.getElements().map(n=>n.getText().replace(/["']/g,"")).includes(t.replace(/["']/g,"")))return e;i.addElement(t)}return e}return e}async function Q(e,t){let r=await be.mkdtemp(W.join(ir(),"shadcn-")),i=t?.resolvedPaths?.tailwindConfig||"tailwind.config.ts",n=W.join(r,`shadcn-${W.basename(i)}`);return new sr({compilerOptions:{}}).createSourceFile(n,e,{scriptKind:W.extname(i)===".ts"?Ye.TS:Ye.JS})}function Se(e){return e.getFirstDescendantByKind(u.StringLiteral)?.getQuoteKind()===ar.Single?"'":'"'}function Qe(e){let t=e.getProperties();for(let r=0;r<t.length;r++){let i=t[r];if(i.isKind(u.SpreadAssignment)){let n=i.asKindOrThrow(u.SpreadAssignment),o=n.getExpression().getText();e.insertPropertyAssignment(r,{name:`___${o.replace(/^\.\.\./,"")}`,initializer:`"...${o.replace(/^\.\.\./,"")}"`}),n.remove()}else if(i.isKind(u.PropertyAssignment)){let o=i.asKindOrThrow(u.PropertyAssignment).getInitializer();o&&o.isKind(u.ObjectLiteralExpression)&&Qe(o.asKindOrThrow(u.ObjectLiteralExpression))}}}function Xe(e){let t=e.getProperties();for(let r=0;r<t.length;r++){let i=t[r];if(i.isKind(u.PropertyAssignment)){let n=i,o=n.getInitializer();if(o?.isKind(u.StringLiteral)){let s=o.getLiteralValue();s.startsWith("...")&&(e.insertSpreadAssignment(r,{expression:s.slice(3)}),n.remove())}else o?.isKind(u.ObjectLiteralExpression)&&Xe(o)}}}async function fr(e){let r=(await Q(`const theme = ${e}`,null)).getStatements()[0];if(r?.getKind()===u.VariableStatement){let n=(r.getDeclarationList()?.getDeclarations()[0]).getInitializer();if(n?.isKind(u.ObjectLiteralExpression))return await qe(n)}throw new Error("Invalid input: not an object literal")}function qe(e){let t={};for(let r of e.getProperties())if(r.isKind(u.PropertyAssignment)){let i=r.getName().replace(/\'/g,"");r.getInitializer()?.isKind(u.ObjectLiteralExpression)?t[i]=qe(r.getInitializer()):t[i]=Ze(r.getInitializer())}return t}function Ze(e){switch(e.kind){case u.StringLiteral:return e.text;case u.NumericLiteral:return Number(e.text);case u.TrueKeyword:return!0;case u.FalseKeyword:return!1;case u.NullKeyword:return null;case u.ArrayLiteralExpression:return e.elements.map(Ze);default:return e.getText()}}function et(e){let t={};for(let r of Object.keys(e)){let i=r.split("-"),n=i[0],o=i.slice(1).join("-");o===""?typeof t[n]=="object"?t[n].DEFAULT=`hsl(var(--${r}))`:t[n]=`hsl(var(--${r}))`:(typeof t[n]!="object"&&(t[n]={DEFAULT:`hsl(var(--${n}))`}),t[n][o]=`hsl(var(--${r}))`)}for(let[r,i]of Object.entries(t))typeof i=="object"&&i.DEFAULT===`hsl(var(--${r}))`&&!(r in e)&&delete i.DEFAULT;return t}import U from"deepmerge";import{HttpsProxyAgent as gr}from"https-proxy-agent";import ur from"node-fetch";import{z as hr}from"zod";var yr=process.env.REGISTRY_URL??"https://ui.shadcn.com/r",wr=process.env.https_proxy?new gr(process.env.https_proxy):void 0;async function V(){try{let[e]=await $(["index.json"]);return xe.parse(e)}catch(e){a.error(`
`),x(e)}}async function Ie(){try{let[e]=await $(["styles/index.json"]);return Ve.parse(e)}catch(e){return a.error(`
`),x(e),[]}}async function X(){try{let[e]=await $(["icons/index.json"]);return Be.parse(e)}catch(e){return x(e),{}}}async function tt(e,t){try{let[r]=await $([Re(e)?e:`styles/${t}/${e}.json`]);return _.parse(r)}catch(r){return a.break(),x(r),null}}async function Ce(){return[{name:"neutral",label:"Neutral"},{name:"gray",label:"Gray"},{name:"zinc",label:"Zinc"},{name:"stone",label:"Stone"},{name:"slate",label:"Slate"}]}async function B(e){try{let[t]=await $([`colors/${e}.json`]);return Ge.parse(t)}catch(t){x(t)}}async function rt(e,t){try{let r=t.map(n=>`styles/${e}/${n.name}.json`),i=await $(r);return xe.parse(i)}catch(r){x(r)}}async function it(e,t,r){if(r)return r;if(t.type==="registry:ui")return e.resolvedPaths.ui??e.resolvedPaths.components;let[i,n]=t.type?.split(":")??[];return i in e.resolvedPaths?dr.join(e.resolvedPaths[i],n):null}async function $(e){try{return await Promise.all(e.map(async r=>{let i=st(r),n=await ur(i,{agent:wr});if(!n.ok){let o={400:"Bad request",401:"Unauthorized",403:"Forbidden",404:"Not found",500:"Internal server error"};if(n.status===401)throw new Error(`You are not authorized to access the component at ${c.info(i)}.
If this is a remote registry, you may need to authenticate.`);if(n.status===404)throw new Error(`The component at ${c.info(i)} was not found.
It may not exist at the registry. Please make sure it is a valid component.`);if(n.status===403)throw new Error(`You do not have access to the component at ${c.info(i)}.
If this is a remote registry, you may need to authenticate or a token.`);let o=await n.json(),l=o&&typeof o=="object"&&"error"in o?o.error:n.statusText||s[n.status];throw new Error(`Failed to fetch from ${c.info(i)}.
If this is a remote registry, you may need to authenticate or a token.`);let s=await n.json(),l=s&&typeof s=="object"&&"error"in s?s.error:n.statusText||o[n.status];throw new Error(`Failed to fetch from ${c.info(i)}.
${l}`)}return n.json()}))}catch(t){return a.error(`
`),x(t),[]}}function Ye(e,t,r){return r||(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:(e.type==="registry:page",t.resolvedPaths.components))}async function He(e,t){try{if(!await z())return null;e.includes("index")&&e.unshift("index");let i=[];for(let m of e){let w=await ir(m,t);i.push(...w)}let n=Array.from(new Set(i)),s=await $(n),o=er.array(N).parse(s);if(!o)return null;if(e.includes("index")&&t.tailwind.baseColor){let m=await nr(t.tailwind.baseColor,t);m&&o.unshift(m)}let l={};o.forEach(m=>{l=_(l,m.tailwind??{})});let f={};o.forEach(m=>{f=_(f,m.cssVars??{})});let d="";return o.forEach(m=>{m.docs&&(d+=`${m.docs}
`)}),Le.parse({dependencies:_.all(o.map(m=>m.dependencies??[])),devDependencies:_.all(o.map(m=>m.devDependencies??[])),files:_.all(o.map(m=>m.files??[])),tailwind:l,cssVars:f,docs:d})}catch(r){return x(r),null}}async function ir(e,t){let r=new Set,i=[];async function n(s){let o=Qe(he(s)?s:`styles/${t.style}/${s}.json`);if(!r.has(o)){r.add(o);try{let[l]=await $([o]),f=N.parse(l);if(i.push(o),f.registryDependencies)for(let d of f.registryDependencies)await n(d)}catch(l){console.error(`Error fetching or parsing registry item at ${s}:`,l)}}}return await n(e),Array.from(new Set(i))}async function nr(e,t){let r=await K(e);if(!r)return null;let i={name:e,type:"registry:theme",tailwind:{config:{theme:{extend:{borderRadius:{lg:"var(--radius)",md:"calc(var(--radius) - 2px)",sm:"calc(var(--radius) - 4px)"},colors:{}}}}},cssVars:{light:{radius:"0.5rem"},dark:{}}};return t.tailwind.cssVariables&&(i.tailwind.config.theme.extend.colors={...i.tailwind.config.theme.extend.colors,...Me(r.cssVars.dark)},i.cssVars={light:{...r.cssVars.light,...i.cssVars.light},dark:{...r.cssVars.dark,...i.cssVars.dark}}),i}function Qe(e){if(he(e)){let t=new URL(e);return t.pathname.match(/\/chat\/b\//)&&!t.pathname.endsWith("/json")&&(t.pathname=`${t.pathname}/json`),t.toString()}return`${tr}/${e}`}function he(e){try{return new URL(e),!0}catch{return!1}}import{promises as Xe}from"fs";import sr from"path";import O from"postcss";import or from"postcss/lib/at-rule";async function Ze(e,t,r){if(!e||!Object.keys(e).length||!t.resolvedPaths.tailwindCss)return;r={cleanupDefaultNextStyles:!1,silent:!1,...r};let i=t.resolvedPaths.tailwindCss,n=sr.relative(t.resolvedPaths.cwd,i),s=h(`Updating ${c.info(n)}`,{silent:r.silent}).start(),o=await Xe.readFile(i,"utf8"),l=await ar(o,e,t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles});await Xe.writeFile(i,l,"utf8"),s.succeed()}async function ar(e,t,r,i){i={cleanupDefaultNextStyles:!1,...i};let n=[cr(t)];return i.cleanupDefaultNextStyles&&n.push(pr()),r.tailwind.cssVariables&&n.push(lr()),(await O(n).process(e,{from:void 0})).css}function lr(){return{postcssPlugin:"update-base-layer",Once(e){let t=[{selector:"*",apply:"border-border"},{selector:"body",apply:"bg-background text-foreground"}],r=e.nodes.find(i=>i.type==="atrule"&&i.name==="layer"&&i.params==="base"&&t.every(({selector:n,apply:s})=>i.nodes?.some(o=>o.type==="rule"&&o.selector===n&&o.nodes.some(l=>l.type==="atrule"&&l.name==="apply"&&l.params===s))));r||(r=O.atRule({name:"layer",params:"base",raws:{semicolon:!0,between:" ",before:`
`}}),e.append(r)),t.forEach(({selector:i,apply:n})=>{r?.nodes?.find(o=>o.type==="rule"&&o.selector===i)||r?.append(O.rule({selector:i,nodes:[O.atRule({name:"apply",params:n,raws:{semicolon:!0,before:`
`),x(t),[]}}function nt(e,t,r){return r||(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:(e.type==="registry:page",t.resolvedPaths.components))}async function ot(e,t){try{if(!await V())return null;e.includes("index")&&e.unshift("index");let i=[];for(let p of e){let g=await xr(p,t);i.push(...g)}let n=Array.from(new Set(i)),o=await $(n),s=hr.array(_).parse(o);if(!s)return null;if(e.includes("index")&&t.tailwind.baseColor){let p=await br(t.tailwind.baseColor,t);p&&s.unshift(p)}let l={};s.forEach(p=>{l=U(l,p.tailwind??{})});let f={};s.forEach(p=>{f=U(f,p.cssVars??{})});let d="";return s.forEach(p=>{p.docs&&(d+=`${p.docs}
`)}),Je.parse({dependencies:U.all(s.map(p=>p.dependencies??[])),devDependencies:U.all(s.map(p=>p.devDependencies??[])),files:U.all(s.map(p=>p.files??[])),tailwind:l,cssVars:f,docs:d})}catch(r){return x(r),null}}async function xr(e,t){let r=new Set,i=[];async function n(o){let s=st(Re(o)?o:`styles/${t.style}/${o}.json`);if(!r.has(s)){r.add(s);try{let[l]=await $([s]),f=_.parse(l);if(i.push(s),f.registryDependencies)for(let d of f.registryDependencies)await n(d)}catch(l){console.error(`Error fetching or parsing registry item at ${o}:`,l)}}}return await n(e),Array.from(new Set(i))}async function br(e,t){let r=await B(e);if(!r)return null;let i={name:e,type:"registry:theme",tailwind:{config:{theme:{extend:{borderRadius:{lg:"var(--radius)",md:"calc(var(--radius) - 2px)",sm:"calc(var(--radius) - 4px)"},colors:{}}}}},cssVars:{light:{radius:"0.5rem"},dark:{}}};return t.tailwind.cssVariables&&(i.tailwind.config.theme.extend.colors={...i.tailwind.config.theme.extend.colors,...et(r.cssVars.dark)},i.cssVars={light:{...r.cssVars.light,...i.cssVars.light},dark:{...r.cssVars.dark,...i.cssVars.dark}}),i}function st(e){if(Re(e)){let t=new URL(e);return t.pathname.match(/\/chat\/b\//)&&!t.pathname.endsWith("/json")&&(t.pathname=`${t.pathname}/json`),t.toString()}return`${yr}/${e}`}function Re(e){try{return new URL(e),!0}catch{return!1}}import{promises as at}from"fs";import Sr from"path";import F from"postcss";import Ir from"postcss/lib/at-rule";async function lt(e,t,r){if(!e||!Object.keys(e).length||!t.resolvedPaths.tailwindCss)return;r={cleanupDefaultNextStyles:!1,silent:!1,...r};let i=t.resolvedPaths.tailwindCss,n=Sr.relative(t.resolvedPaths.cwd,i),o=y(`Updating ${c.info(n)}`,{silent:r.silent}).start(),s=await at.readFile(i,"utf8"),l=await Cr(s,e,t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles});await at.writeFile(i,l,"utf8"),o.succeed()}async function Cr(e,t,r,i){i={cleanupDefaultNextStyles:!1,...i};let n=[Pr(t)];return i.cleanupDefaultNextStyles&&n.push(vr()),r.tailwind.cssVariables&&n.push(Rr()),(await F(n).process(e,{from:void 0})).css}function Rr(){return{postcssPlugin:"update-base-layer",Once(e){let t=[{selector:"*",apply:"border-border"},{selector:"body",apply:"bg-background text-foreground"}],r=e.nodes.find(i=>i.type==="atrule"&&i.name==="layer"&&i.params==="base"&&t.every(({selector:n,apply:o})=>i.nodes?.some(s=>s.type==="rule"&&s.selector===n&&s.nodes.some(l=>l.type==="atrule"&&l.name==="apply"&&l.params===o))));r||(r=F.atRule({name:"layer",params:"base",raws:{semicolon:!0,between:" ",before:`
`}}),e.append(r)),t.forEach(({selector:i,apply:n})=>{r?.nodes?.find(s=>s.type==="rule"&&s.selector===i)||r?.append(F.rule({selector:i,nodes:[F.atRule({name:"apply",params:n,raws:{semicolon:!0,before:`
`}})],raws:{semicolon:!0,between:" ",before:`
`}}))})}}}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 or||(r=O.atRule({name:"layer",params:"base",nodes:[],raws:{semicolon:!0,before:`
`,between:" "}}),t.append(r)),r!==void 0&&Object.entries(e).forEach(([i,n])=>{let s=i==="light"?":root":`.${i}`;mr(r,s,n)})}}}function qe(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 pr(){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.length===0&&t.remove()),qe(e);let r=e.nodes.find(i=>i.type==="atrule"&&i.params==="(prefers-color-scheme: dark)");r&&(qe(r),r.nodes.length===0&&r.remove())}}}function mr(e,t,r){let i=e.nodes?.find(n=>n.type==="rule"&&n.selector===t);i||Object.keys(r).length>0&&(i=O.rule({selector:t,raws:{between:" ",before:`
`}}),e.append(i)),Object.entries(r).forEach(([n,s])=>{let o=`--${n.replace(/^--/,"")}`,l=O.decl({prop:o,value:s,raws:{semicolon:!0}}),f=i?.nodes.find(d=>d.type==="decl"&&d.prop===o);f?f.replaceWith(l):i?.append(l)})}import{detect as fr}from"@antfu/ni";async function Y(e,{withFallback:t}={withFallback:!1}){let r=await fr({programmatic:!0,cwd:e});if(r==="yarn@berry")return"yarn";if(r==="pnpm@6")return"pnpm";if(r==="bun")return"bun";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"}import{execa as dr}from"execa";import ur from"prompts";async function et(e,t,r){if(e=Array.from(new Set(e)),!e?.length)return;r={silent:!1,...r};let i=h("Installing dependencies.",{silent:r.silent})?.start(),n=await Y(t.resolvedPaths.cwd),s="";if(gr(t)&&n==="npm"){i.stopAndPersist(),a.warn(`
`}}))})}}}function Pr(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 Ir||(r=F.atRule({name:"layer",params:"base",nodes:[],raws:{semicolon:!0,before:`
`,between:" "}}),t.append(r)),r!==void 0&&Object.entries(e).forEach(([i,n])=>{let o=i==="light"?":root":`.${i}`;kr(r,o,n)})}}}function ct(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 vr(){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.length===0&&t.remove()),ct(e);let r=e.nodes.find(i=>i.type==="atrule"&&i.params==="(prefers-color-scheme: dark)");r&&(ct(r),r.nodes.length===0&&r.remove())}}}function kr(e,t,r){let i=e.nodes?.find(n=>n.type==="rule"&&n.selector===t);i||Object.keys(r).length>0&&(i=F.rule({selector:t,raws:{between:" ",before:`
`}}),e.append(i)),Object.entries(r).forEach(([n,o])=>{let s=`--${n.replace(/^--/,"")}`,l=F.decl({prop:s,value:o,raws:{semicolon:!0}}),f=i?.nodes.find(d=>d.type==="decl"&&d.prop===s);f?f.replaceWith(l):i?.append(l)})}import{detect as Tr}from"@antfu/ni";async function q(e,{withFallback:t}={withFallback:!1}){let r=await Tr({programmatic:!0,cwd:e});if(r==="yarn@berry")return"yarn";if(r==="pnpm@6")return"pnpm";if(r==="bun")return"bun";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"}import{execa as Er}from"execa";import jr from"prompts";async function Z(e,t,r){if(e=Array.from(new Set(e)),!e?.length)return;r={silent:!1,...r};let i=y("Installing dependencies.",{silent:r.silent})?.start(),n=await q(t.resolvedPaths.cwd),o="";if($r(t)&&n==="npm"){i.stopAndPersist(),a.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 o=await ur([{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"}]}]);o&&(s=o.flag)}i?.start(),await dr(n,[n==="npm"?"install":"add",...n==="npm"&&s?[`--${s}`]:[],...e],{cwd:t.resolvedPaths.cwd}),i?.succeed()}function gr(e){let t=M(e.resolvedPaths.cwd);return t?.dependencies?.react?/^(?:\^|~)?19(?:\.\d+)*(?:-.*)?$/.test(t.dependencies.react):!1}import{existsSync as it,promises as nt}from"fs";import E,{basename as Or}from"path";import{promises as kr}from"fs";import{tmpdir as Ir}from"os";import rt from"path";import{SyntaxKind as hr}from"ts-morph";var H=async({sourceFile:e,config:t,baseColor:r})=>(t.tailwind?.cssVariables||!r?.inlineColors||e.getDescendantsOfKind(hr.StringLiteral).forEach(i=>{let n=i.getText();if(n){let s=wr(n.replace(/"/g,""),r.inlineColors);i.replaceWithText(`"${s.trim()}"`)}}),e);function ye(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(":"),s=n.pop(),o=n.join(":");return t.push(o??null,s??null,i??null),t}var yr=["bg-","text-","border-","ring-offset-","ring-"];function wr(e,t){e.includes(" border ")&&(e=e.replace(" border "," border border-border "));let r=e.split(" "),i=new Set,n=new Set;for(let s of r){let[o,l,f]=ye(s),d=yr.find(w=>l?.startsWith(w));if(!d){i.has(s)||i.add(s);continue}let m=l?.replace(d,"");if(m&&m in t.light){i.add([o,`${d}${t.light[m]}`].filter(Boolean).join(":")+(f?`/${f}`:"")),n.add(["dark",o,`${d}${t.dark[m]}`].filter(Boolean).join(":")+(f?`/${f}`:""));continue}i.has(s)||i.add(s)}return[...Array.from(i),...Array.from(n)].join(" ").trim()}var Q=async({sourceFile:e,config:t})=>{let r=e.getImportDeclarations();for(let i of r){let n=xr(i.getModuleSpecifierValue(),t);i.setModuleSpecifier(n),n=="@/lib/utils"&&i.getNamedImports().find(l=>l.getName()==="cn")&&i.setModuleSpecifier(n.replace(/^@\/lib\/utils/,t.aliases.utils))}return e};function xr(e,t){if(!e.startsWith("@/"))return e;if(!e.startsWith("@/registry/")){let r=t.aliases.components.charAt(0);return e.replace(/^@\//,`${r}/`)}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)}import{transformFromAstSync as br}from"@babel/core";import{parse as Sr}from"@babel/parser";import Cr from"@babel/plugin-transform-typescript";import*as X from"recast";var Pr={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"]},tt=async({sourceFile:e,config:t})=>{let r=e.getFullText();if(t.tsx)return r;let i=X.parse(r,{parser:{parse:s=>Sr(s,Pr)}}),n=br(i,r,{cloneInputAst:!1,code:!1,ast:!0,plugins:[Cr],configFile:!1});if(!n||!n.ast)throw new Error("Failed to transform JSX");return X.print(n.ast).code};import{SyntaxKind as vr}from"ts-morph";var Rr=/^["']use client["']$/g,q=async({sourceFile:e,config:t})=>{if(t.rsc)return e;let r=e.getFirstChildByKind(vr.ExpressionStatement);return r&&Rr.test(r.getText())&&r.remove(),e};import{Project as Tr,ScriptKind as Er}from"ts-morph";import{SyntaxKind as y}from"ts-morph";var Z=async({sourceFile:e,config:t})=>(t.tailwind?.prefix&&(e.getDescendantsOfKind(y.CallExpression).filter(r=>r.getExpression().getText()==="cva").forEach(r=>{if(r.getArguments()[0]?.isKind(y.StringLiteral)){let i=r.getArguments()[0];i&&i.replaceWithText(`"${T(i.getText()?.replace(/"|'/g,""),t.tailwind.prefix)}"`)}r.getArguments()[1]?.isKind(y.ObjectLiteralExpression)&&r.getArguments()[1]?.getDescendantsOfKind(y.PropertyAssignment).find(i=>i.getName()==="variants")?.getDescendantsOfKind(y.PropertyAssignment).forEach(i=>{i.getDescendantsOfKind(y.PropertyAssignment).forEach(n=>{let s=n.getInitializerIfKind(y.StringLiteral);s&&s?.replaceWithText(`"${T(s.getText()?.replace(/"|'/g,""),t.tailwind.prefix)}"`)})})}),e.getDescendantsOfKind(y.JsxAttribute).forEach(r=>{if(r.getName()==="className"){if(r.getInitializer()?.isKind(y.StringLiteral)){let i=r.getInitializer();i&&i.replaceWithText(`"${T(i.getText()?.replace(/"|'/g,""),t.tailwind.prefix)}"`)}if(r.getInitializer()?.isKind(y.JsxExpression)){let i=r.getInitializer()?.getDescendantsOfKind(y.CallExpression).find(n=>n.getExpression().getText()==="cn");i&&i.getArguments().forEach(n=>{(n.isKind(y.ConditionalExpression)||n.isKind(y.BinaryExpression))&&n.getChildrenOfKind(y.StringLiteral).forEach(s=>{s.replaceWithText(`"${T(s.getText()?.replace(/"|'/g,""),t.tailwind.prefix)}"`)}),n.isKind(y.StringLiteral)&&n.replaceWithText(`"${T(n.getText()?.replace(/"|'/g,""),t.tailwind.prefix)}"`)})}}r.getName()==="classNames"&&r.getInitializer()?.isKind(y.JsxExpression)&&r.getDescendantsOfKind(y.PropertyAssignment).forEach(i=>{if(i.getInitializer()?.isKind(y.CallExpression)){let n=i.getInitializerIfKind(y.CallExpression);n&&n.getArguments().forEach(s=>{s.isKind(y.ConditionalExpression)&&s.getChildrenOfKind(y.StringLiteral).forEach(o=>{o.replaceWithText(`"${T(o.getText()?.replace(/"|'/g,""),t.tailwind.prefix)}"`)}),s.isKind(y.StringLiteral)&&s.replaceWithText(`"${T(s.getText()?.replace(/"|'/g,""),t.tailwind.prefix)}"`)})}if(i.getInitializer()?.isKind(y.StringLiteral)&&i.getName()!=="variant"){let n=i.getInitializer();n&&n.replaceWithText(`"${T(n.getText()?.replace(/"|'/g,""),t.tailwind.prefix)}"`)}})})),e);function T(e,t=""){let r=e.split(" "),i=[];for(let n of r){let[s,o,l]=ye(n);s?l?i.push(`${s}:${t}${o}/${l}`):i.push(`${s}:${t}${o}`):l?i.push(`${t}${o}/${l}`):i.push(`${t}${o}`)}return i.join(" ")}var jr=new Tr({compilerOptions:{}});async function $r(e){let t=await kr.mkdtemp(rt.join(Ir(),"shadcn-"));return rt.join(t,e)}async function ee(e,t=[Q,q,H,Z]){let r=await $r(e.filename),i=jr.createSourceFile(r,e.raw,{scriptKind:Er.TSX});for(let n of t)n({sourceFile:i,...e});return e.transformJsx?await tt({sourceFile:i,...e}):i.getText()}import Nr from"prompts";function Ar(e,t,r){return r.startsWith("~/")?E.join(t.resolvedPaths.cwd,r.replace("~/","")):e?.isSrcDir?E.join(t.resolvedPaths.cwd,"src",r):E.join(t.resolvedPaths.cwd,r)}async function st(e,t,r){if(!e?.length)return;r={overwrite:!1,force:!1,silent:!1,...r};let i=h("Updating files.",{silent:r.silent})?.start(),[n,s]=await Promise.all([j(t.resolvedPaths.cwd),K(t.tailwind.baseColor)]),o=[],l=[],f=[];for(let m of e){if(!m.content)continue;let w=Ye(m,t),S=Or(m.path),C=E.join(w,S);m.target&&(C=Ar(n,t,m.target),w=E.dirname(C)),t.tsx||(C=C.replace(/\.tsx?$/,se=>se===".tsx"?".jsx":".js"));let ve=it(C);if(ve&&!r.overwrite){i.stop();let{overwrite:se}=await Nr({type:"confirm",name:"overwrite",message:`The file ${c.info(S)} already exists. Would you like to overwrite?`,initial:!1});if(!se){f.push(E.relative(t.resolvedPaths.cwd,C));continue}i?.start()}it(w)||await nt.mkdir(w,{recursive:!0});let xt=await ee({filename:m.path,raw:m.content,config:t,baseColor:s,transformJsx:!t.tsx},[Q,q,H,Z]);await nt.writeFile(C,xt,"utf-8"),ve?l.push(E.relative(t.resolvedPaths.cwd,C)):o.push(E.relative(t.resolvedPaths.cwd,C))}if(!(o.length||l.length)&&!f.length&&i?.info("No files updated."),o.length){if(i?.succeed(`Created ${o.length} ${o.length===1?"file":"files"}:`),!r.silent)for(let m of o)a.log(` - ${m}`)}else i?.stop();if(l.length&&(h(`Updated ${l.length} ${l.length===1?"file":"files"}:`,{silent:r.silent})?.info(),!r.silent))for(let m of l)a.log(` - ${m}`);if(f.length&&(h(`Skipped ${f.length} ${l.length===1?"file":"files"}:`,{silent:r.silent})?.info(),!r.silent))for(let m of f)a.log(` - ${m}`);r.silent||a.break()}async function te(e,t,r){r={overwrite:!1,silent:!1,isNewProject:!1,...r};let i=h("Checking registry.",{silent:r.silent})?.start(),n=await He(e,t);if(!n)return i?.fail(),x(new Error("Failed to fetch components from registry."));i?.succeed(),await ze(n.tailwind?.config,t,{silent:r.silent}),await Ze(n.cssVars,t,{cleanupDefaultNextStyles:r.isNewProject,silent:r.silent}),await et(n.dependencies,t,{silent:r.silent}),await st(n.files,t,{overwrite:r.overwrite,silent:r.silent}),n.docs&&a.info(n.docs)}import Fr from"path";import{execa as Dr}from"execa";import we from"fs-extra";import ot from"prompts";async function re(e){if(e={srcDir:!1,...e},!e.force){let{proceed:o}=await ot({type:"confirm",name:"proceed",message:`The path ${c.info(e.cwd)} does not contain a package.json file. Would you like to start a new ${c.info("Next.js")} project?`,initial:!0});if(!o)return{projectPath:null,projectName:null}}let t=await Y(e.cwd,{withFallback:!0}),{name:r}=await ot({type:"text",name:"name",message:"What is your project named?",initial:"my-app",format:o=>o.trim(),validate:o=>o.length>128?"Name should be less than 128 characters.":!0}),i=`${e.cwd}/${r}`;try{await we.access(e.cwd,we.constants.W_OK)}catch{a.break(),a.error(`The path ${c.info(e.cwd)} is not writable.`),a.error(`It is likely you do not have write permissions for this folder or the path ${c.info(e.cwd)} does not exist.`),a.break(),process.exit(1)}we.existsSync(Fr.resolve(e.cwd,r,"package.json"))&&(a.break(),a.error(`A project with the name ${c.info(r)} already exists.`),a.error("Please choose a different name and try again."),a.break(),process.exit(1));let n=h("Creating a new Next.js project. This may take a few minutes.").start(),s=["--tailwind","--eslint","--typescript","--app",e.srcDir?"--src-dir":"--no-src-dir","--no-import-alias",`--use-${t}`];try{await Dr("npx",["create-next-app@14.2.16",i,"--silent",...s],{cwd:e.cwd})}catch{a.break(),a.error("Something went wrong creating a new Next.js project. Please try again."),process.exit(1)}return n?.succeed("Creating a new Next.js project."),{projectPath:i,projectName:r}}import{promises as at}from"fs";import Lr from"path";import{SyntaxKind as ie}from"ts-morph";async function lt(e,t,r){if(!e)return;r={silent:!1,...r};let i=Lr.relative(t.resolvedPaths.cwd,t.resolvedPaths.tailwindConfig),n=h(`Updating ${c.info(i)}`,{silent:r.silent}).start(),s=await at.readFile(t.resolvedPaths.tailwindConfig,"utf8"),o=await _r(s,e,t);await at.writeFile(t.resolvedPaths.tailwindConfig,o,"utf8"),n?.succeed()}async function _r(e,t,r){let i=await J(e,r),n=i.getDescendantsOfKind(ie.ObjectLiteralExpression).find(s=>s.getProperties().some(o=>o.isKind(ie.PropertyAssignment)&&o.getName()==="content"));return n?(zr(n,t),i.getFullText()):e}async function zr(e,t){let r=de(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(ie.PropertyAssignment)){let n=i.getInitializer();if(n?.isKind(ie.ArrayLiteralExpression))for(let s of t){let o=`${r}${s}${r}`;n.getElements().map(l=>l.getText()).includes(o)||n.addElement(o)}return e}return e}import{Command as Wr}from"commander";import xe from"prompts";import{z as P}from"zod";var Vr=P.object({cwd:P.string(),components:P.array(P.string()).optional(),yes:P.boolean(),defaults:P.boolean(),force:P.boolean(),silent:P.boolean(),isNewProject:P.boolean(),srcDir:P.boolean().optional()}),pt=new Wr().name("init").description("initialize your project and install dependencies").argument("[components...]","the components to add or a url to the component.").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).action(async(e,t)=>{try{let r=Vr.parse({cwd:ct.resolve(t.cwd),isNewProject:!1,components:e,...t});await ne(r),a.log(`${c.success("Success!")} Project initialization completed.
You may now add components.`),a.break()}catch(r){a.break(),x(r)}});async function ne(e){let t;if(e.skipPreflight)t=await j(e.cwd);else{let f=await Oe(e);if(f.errors[k]){let{projectPath:d}=await re(e);d||process.exit(1),e.cwd=d,e.isNewProject=!0}t=f.projectInfo}let r=await je(e.cwd,t),i=r?await Mr(r,e):await Ur(await I(e.cwd));if(!e.yes){let{proceed:f}=await xe({type:"confirm",name:"proceed",message:`Write configuration to ${c.info("components.json")}. Proceed?`,initial:!0});f||process.exit(0)}let n=h("Writing components.json.").start(),s=ct.resolve(e.cwd,"components.json");await Kr.writeFile(s,JSON.stringify(i,null,2),"utf8"),n.succeed();let o=await D(e.cwd,i),l=["index",...e.components||[]];return await te(l,o,{overwrite:!0,silent:e.silent,isNewProject:e.isNewProject||t?.framework.name==="next-app"}),e.isNewProject&&e.srcDir&&await lt(["./src/**/*.{js,ts,jsx,tsx,mdx}"],o,{silent:e.silent}),o}async function Ur(e=null){let[t,r]=await Promise.all([ue(),ge()]);a.info("");let i=await xe([{type:"toggle",name:"typescript",message:`Would you like to use ${c.info("TypeScript")} (recommended)?`,initial:e?.tsx??!0,active:"yes",inactive:"no"},{type:"select",name:"style",message:`Which ${c.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 ${c.info("base color")}?`,choices:r.map(n=>({title:n.label,value:n.name}))},{type:"text",name:"tailwindCss",message:`Where is your ${c.info("global CSS")} file?`,initial:e?.tailwind.css??Te},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${c.info("CSS variables")} for theming?`,initial:e?.tailwind.cssVariables??!0,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?.tailwind.config??Ee},{type:"text",name:"components",message:`Configure the import alias for ${c.info("components")}:`,initial:e?.aliases.components??ke},{type:"text",name:"utils",message:`Configure the import alias for ${c.info("utils")}:`,initial:e?.aliases.utils??Ie},{type:"toggle",name:"rsc",message:`Are you using ${c.info("React Server Components")}?`,initial:e?.rsc??!0,active:"yes",inactive:"no"}]);return F.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 Mr(e,t){let r=e.style,i=e.tailwind.baseColor,n=e.tailwind.cssVariables;if(!t.defaults){let[s,o]=await Promise.all([ue(),ge()]),l=await xe([{type:"select",name:"style",message:`Which ${c.info("style")} would you like to use?`,choices:s.map(f=>({title:f.label,value:f.name})),initial:s.findIndex(f=>f.name===r)},{type:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${c.info("base color")}?`,choices:o.map(f=>({title:f.label,value:f.name}))},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${c.info("CSS variables")} for theming?`,initial:e?.tailwind.cssVariables,active:"yes",inactive:"no"}]);r=l.style,i=l.tailwindBaseColor,n=l.tailwindCssVariables}return F.parse({$schema:e?.$schema,style:r,tailwind:{...e?.tailwind,baseColor:i,cssVariables:n},rsc:e?.rsc,tsx:e?.tsx,aliases:e?.aliases})}import mt from"path";import be from"fs-extra";async function ft(e){let t={};if(!be.existsSync(e.cwd)||!be.existsSync(mt.resolve(e.cwd,"package.json")))return t[k]=!0,{errors:t,config:null};if(!be.existsSync(mt.resolve(e.cwd,"components.json")))return t[V]=!0,{errors:t,config:null};try{let r=await I(e.cwd);return{errors:t,config:r}}catch{a.break(),a.error(`An invalid ${c.info("components.json")} file was found at ${c.info(e.cwd)}.
Before you can add components, you must create a valid ${c.info("components.json")} file by running the ${c.info("init")} command.`),a.error(`Learn more at ${c.info("https://ui.shadcn.com/docs/components-json")}.`),a.break(),process.exit(1)}}import dt from"fs/promises";import Gr from"path";async function ut(e,t){let r=Gr.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await dt.stat(r)).isFile())return;let i=await Ge(e,t.style);if(!i?.meta?.importSpecifier||!i?.meta?.moduleSpecifier)return;let n=`import { ${i?.meta?.importSpecifier} } from "${i.meta.moduleSpecifier}"
`);let s=await jr([{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&&(o=s.flag)}i?.start(),await Er(n,[n==="npm"?"install":"add",...n==="npm"&&o?[`--${o}`]:[],...e],{cwd:t.resolvedPaths.cwd}),i?.succeed()}function $r(e){let t=J(e.resolvedPaths.cwd);return t?.dependencies?.react?/^(?:\^|~)?19(?:\.\d+)*(?:-.*)?$/.test(t.dependencies.react):!1}import{existsSync as dt,promises as gt}from"fs";import N,{basename as Qr}from"path";import{promises as Vr}from"fs";import{tmpdir as Br}from"os";import ft from"path";import{SyntaxKind as Or}from"ts-morph";var ee=async({sourceFile:e,config:t,baseColor:r})=>(t.tailwind?.cssVariables||!r?.inlineColors||e.getDescendantsOfKind(Or.StringLiteral).forEach(i=>{let n=i.getText();if(n){let o=Ar(n.replace(/"/g,""),r.inlineColors);i.replaceWithText(`"${o.trim()}"`)}}),e);function Pe(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(),s=n.join(":");return t.push(s??null,o??null,i??null),t}var Nr=["bg-","text-","border-","ring-offset-","ring-"];function Ar(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[s,l,f]=Pe(o),d=Nr.find(g=>l?.startsWith(g));if(!d){i.has(o)||i.add(o);continue}let p=l?.replace(d,"");if(p&&p in t.light){i.add([s,`${d}${t.light[p]}`].filter(Boolean).join(":")+(f?`/${f}`:"")),n.add(["dark",s,`${d}${t.dark[p]}`].filter(Boolean).join(":")+(f?`/${f}`:""));continue}i.has(o)||i.add(o)}return[...Array.from(i),...Array.from(n)].join(" ").trim()}var R={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"}};import{SyntaxKind as Lr}from"ts-morph";var pt="lucide",te=async({sourceFile:e,config:t})=>{if(!t.iconLibrary||!(t.iconLibrary in R))return e;let r=await X(),i=pt,n=t.iconLibrary;if(i===n)return e;let o=[];for(let s of e.getImportDeclarations()??[])if(s.getModuleSpecifier()?.getText()===`"${R[pt].import}"`){for(let l of s.getNamedImports()??[]){let f=l.getName(),d=r[f]?.[n];!d||o.includes(d)||(o.push(d),l.remove(),e.getDescendantsOfKind(Lr.JsxSelfClosingElement).filter(p=>p.getTagNameNode()?.getText()===f).forEach(p=>p.getTagNameNode()?.replaceWithText(d)))}s.getNamedImports()?.length===0&&s.remove()}if(o.length>0){let s=e.addImportDeclaration({moduleSpecifier:R[n]?.import,namedImports:o.map(l=>({name:l}))});Fr(e)||s.replaceWithText(s.getText().replace(";",""))}return e};function Fr(e){return e.getImportDeclarations()?.[0]?.getText().endsWith(";")??!1}var re=async({sourceFile:e,config:t})=>{let r=e.getImportDeclarations();for(let i of r){let n=Dr(i.getModuleSpecifierValue(),t);i.setModuleSpecifier(n),n=="@/lib/utils"&&i.getNamedImports().find(l=>l.getName()==="cn")&&i.setModuleSpecifier(n.replace(/^@\/lib\/utils/,t.aliases.utils))}return e};function Dr(e,t){if(!e.startsWith("@/"))return e;if(!e.startsWith("@/registry/")){let r=t.aliases.components.charAt(0);return e.replace(/^@\//,`${r}/`)}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)}import{transformFromAstSync as _r}from"@babel/core";import{parse as zr}from"@babel/parser";import Kr from"@babel/plugin-transform-typescript";import*as ie from"recast";var Mr={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"]},mt=async({sourceFile:e,config:t})=>{let r=e.getFullText();if(t.tsx)return r;let i=ie.parse(r,{parser:{parse:o=>zr(o,Mr)}}),n=_r(i,r,{cloneInputAst:!1,code:!1,ast:!0,plugins:[Kr],configFile:!1});if(!n||!n.ast)throw new Error("Failed to transform JSX");return ie.print(n.ast).code};import{SyntaxKind as Wr}from"ts-morph";var Ur=/^["']use client["']$/g,ne=async({sourceFile:e,config:t})=>{if(t.rsc)return e;let r=e.getFirstChildByKind(Wr.ExpressionStatement);return r&&Ur.test(r.getText())&&r.remove(),e};import{Project as Gr,ScriptKind as Jr}from"ts-morph";import{SyntaxKind as w}from"ts-morph";var oe=async({sourceFile:e,config:t})=>(t.tailwind?.prefix&&(e.getDescendantsOfKind(w.CallExpression).filter(r=>r.getExpression().getText()==="cva").forEach(r=>{if(r.getArguments()[0]?.isKind(w.StringLiteral)){let i=r.getArguments()[0];i&&i.replaceWithText(`"${O(i.getText()?.replace(/"|'/g,""),t.tailwind.prefix)}"`)}r.getArguments()[1]?.isKind(w.ObjectLiteralExpression)&&r.getArguments()[1]?.getDescendantsOfKind(w.PropertyAssignment).find(i=>i.getName()==="variants")?.getDescendantsOfKind(w.PropertyAssignment).forEach(i=>{i.getDescendantsOfKind(w.PropertyAssignment).forEach(n=>{let o=n.getInitializerIfKind(w.StringLiteral);o&&o?.replaceWithText(`"${O(o.getText()?.replace(/"|'/g,""),t.tailwind.prefix)}"`)})})}),e.getDescendantsOfKind(w.JsxAttribute).forEach(r=>{if(r.getName()==="className"){if(r.getInitializer()?.isKind(w.StringLiteral)){let i=r.getInitializer();i&&i.replaceWithText(`"${O(i.getText()?.replace(/"|'/g,""),t.tailwind.prefix)}"`)}if(r.getInitializer()?.isKind(w.JsxExpression)){let i=r.getInitializer()?.getDescendantsOfKind(w.CallExpression).find(n=>n.getExpression().getText()==="cn");i&&i.getArguments().forEach(n=>{(n.isKind(w.ConditionalExpression)||n.isKind(w.BinaryExpression))&&n.getChildrenOfKind(w.StringLiteral).forEach(o=>{o.replaceWithText(`"${O(o.getText()?.replace(/"|'/g,""),t.tailwind.prefix)}"`)}),n.isKind(w.StringLiteral)&&n.replaceWithText(`"${O(n.getText()?.replace(/"|'/g,""),t.tailwind.prefix)}"`)})}}r.getName()==="classNames"&&r.getInitializer()?.isKind(w.JsxExpression)&&r.getDescendantsOfKind(w.PropertyAssignment).forEach(i=>{if(i.getInitializer()?.isKind(w.CallExpression)){let n=i.getInitializerIfKind(w.CallExpression);n&&n.getArguments().forEach(o=>{o.isKind(w.ConditionalExpression)&&o.getChildrenOfKind(w.StringLiteral).forEach(s=>{s.replaceWithText(`"${O(s.getText()?.replace(/"|'/g,""),t.tailwind.prefix)}"`)}),o.isKind(w.StringLiteral)&&o.replaceWithText(`"${O(o.getText()?.replace(/"|'/g,""),t.tailwind.prefix)}"`)})}if(i.getInitializer()?.isKind(w.StringLiteral)&&i.getName()!=="variant"){let n=i.getInitializer();n&&n.replaceWithText(`"${O(n.getText()?.replace(/"|'/g,""),t.tailwind.prefix)}"`)}})})),e);function O(e,t=""){let r=e.split(" "),i=[];for(let n of r){let[o,s,l]=Pe(n);o?l?i.push(`${o}:${t}${s}/${l}`):i.push(`${o}:${t}${s}`):l?i.push(`${t}${s}/${l}`):i.push(`${t}${s}`)}return i.join(" ")}var Yr=new Gr({compilerOptions:{}});async function Hr(e){let t=await Vr.mkdtemp(ft.join(Br(),"shadcn-"));return ft.join(t,e)}async function se(e,t=[re,ne,ee,oe,te]){let r=await Hr(e.filename),i=Yr.createSourceFile(r,e.raw,{scriptKind:Jr.TSX});for(let n of t)await n({sourceFile:i,...e});return e.transformJsx?await mt({sourceFile:i,...e}):i.getText()}import Xr from"prompts";function qr(e,t,r){return r.startsWith("~/")?N.join(t.resolvedPaths.cwd,r.replace("~/","")):e?.isSrcDir?N.join(t.resolvedPaths.cwd,"src",r):N.join(t.resolvedPaths.cwd,r)}async function ut(e,t,r){if(!e?.length)return;r={overwrite:!1,force:!1,silent:!1,...r};let i=y("Updating files.",{silent:r.silent})?.start(),[n,o]=await Promise.all([E(t.resolvedPaths.cwd),B(t.tailwind.baseColor)]),s=[],l=[],f=[];for(let p of e){if(!p.content)continue;let g=nt(p,t),b=Qr(p.path),S=N.join(g,b);p.target&&(S=qr(n,t,p.target),g=N.dirname(S)),t.tsx||(S=S.replace(/\.tsx?$/,de=>de===".tsx"?".jsx":".js"));let A=dt(S);if(A&&!r.overwrite){i.stop();let{overwrite:de}=await Xr({type:"confirm",name:"overwrite",message:`The file ${c.info(b)} already exists. Would you like to overwrite?`,initial:!1});if(!de){f.push(N.relative(t.resolvedPaths.cwd,S));continue}i?.start()}dt(g)||await gt.mkdir(g,{recursive:!0});let L=await se({filename:p.path,raw:p.content,config:t,baseColor:o,transformJsx:!t.tsx},[re,ne,ee,oe,te]);await gt.writeFile(S,L,"utf-8"),A?l.push(N.relative(t.resolvedPaths.cwd,S)):s.push(N.relative(t.resolvedPaths.cwd,S))}if(!(s.length||l.length)&&!f.length&&i?.info("No files updated."),s.length){if(i?.succeed(`Created ${s.length} ${s.length===1?"file":"files"}:`),!r.silent)for(let p of s)a.log(` - ${p}`)}else i?.stop();if(l.length&&(y(`Updated ${l.length} ${l.length===1?"file":"files"}:`,{silent:r.silent})?.info(),!r.silent))for(let p of l)a.log(` - ${p}`);if(f.length&&(y(`Skipped ${f.length} ${l.length===1?"file":"files"}:`,{silent:r.silent})?.info(),!r.silent))for(let p of f)a.log(` - ${p}`);r.silent||a.break()}async function ae(e,t,r){r={overwrite:!1,silent:!1,isNewProject:!1,...r};let i=y("Checking registry.",{silent:r.silent})?.start(),n=await ot(e,t);if(!n)return i?.fail(),x(new Error("Failed to fetch components from registry."));i?.succeed(),await He(n.tailwind?.config,t,{silent:r.silent}),await lt(n.cssVars,t,{cleanupDefaultNextStyles:r.isNewProject,silent:r.silent}),await Z(n.dependencies,t,{silent:r.silent}),await ut(n.files,t,{overwrite:r.overwrite,silent:r.silent}),n.docs&&a.info(n.docs)}import Zr from"path";import{execa as ei}from"execa";import ve from"fs-extra";import ht from"prompts";async function ce(e){if(e={srcDir:!1,...e},!e.force){let{proceed:s}=await ht({type:"confirm",name:"proceed",message:`The path ${c.info(e.cwd)} does not contain a package.json file. Would you like to start a new ${c.info("Next.js")} project?`,initial:!0});if(!s)return{projectPath:null,projectName:null}}let t=await q(e.cwd,{withFallback:!0}),{name:r}=await ht({type:"text",name:"name",message:"What is your project named?",initial:"my-app",format:s=>s.trim(),validate:s=>s.length>128?"Name should be less than 128 characters.":!0}),i=`${e.cwd}/${r}`;try{await ve.access(e.cwd,ve.constants.W_OK)}catch{a.break(),a.error(`The path ${c.info(e.cwd)} is not writable.`),a.error(`It is likely you do not have write permissions for this folder or the path ${c.info(e.cwd)} does not exist.`),a.break(),process.exit(1)}ve.existsSync(Zr.resolve(e.cwd,r,"package.json"))&&(a.break(),a.error(`A project with the name ${c.info(r)} already exists.`),a.error("Please choose a different name and try again."),a.break(),process.exit(1));let n=y("Creating a new Next.js project. This may take a few minutes.").start(),o=["--tailwind","--eslint","--typescript","--app",e.srcDir?"--src-dir":"--no-src-dir","--no-import-alias",`--use-${t}`];try{await ei("npx",["create-next-app@14.2.16",i,"--silent",...o],{cwd:e.cwd})}catch{a.break(),a.error("Something went wrong creating a new Next.js project. Please try again."),process.exit(1)}return n?.succeed("Creating a new Next.js project."),{projectPath:i,projectName:r}}import{promises as yt}from"fs";import ti from"path";import{SyntaxKind as le}from"ts-morph";async function wt(e,t,r){if(!e)return;r={silent:!1,...r};let i=ti.relative(t.resolvedPaths.cwd,t.resolvedPaths.tailwindConfig),n=y(`Updating ${c.info(i)}`,{silent:r.silent}).start(),o=await yt.readFile(t.resolvedPaths.tailwindConfig,"utf8"),s=await ri(o,e,t);await yt.writeFile(t.resolvedPaths.tailwindConfig,s,"utf8"),n?.succeed()}async function ri(e,t,r){let i=await Q(e,r),n=i.getDescendantsOfKind(le.ObjectLiteralExpression).find(o=>o.getProperties().some(s=>s.isKind(le.PropertyAssignment)&&s.getName()==="content"));return n?(ii(n,t),i.getFullText()):e}async function ii(e,t){let r=Se(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(le.PropertyAssignment)){let n=i.getInitializer();if(n?.isKind(le.ArrayLiteralExpression))for(let o of t){let s=`${r}${o}${r}`;n.getElements().map(l=>l.getText()).includes(s)||n.addElement(s)}return e}return e}import{Command as oi}from"commander";import ke from"prompts";import{z as v}from"zod";var si=v.object({cwd:v.string(),components:v.array(v.string()).optional(),yes:v.boolean(),defaults:v.boolean(),force:v.boolean(),silent:v.boolean(),isNewProject:v.boolean(),srcDir:v.boolean().optional()}),bt=new oi().name("init").description("initialize your project and install dependencies").argument("[components...]","the components to add or a url to the component.").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).action(async(e,t)=>{try{let r=si.parse({cwd:xt.resolve(t.cwd),isNewProject:!1,components:e,...t});await pe(r),a.log(`${c.success("Success!")} Project initialization completed.
You may now add components.`),a.break()}catch(r){a.break(),x(r)}});async function pe(e){let t;if(e.skipPreflight)t=await E(e.cwd);else{let f=await Me(e);if(f.errors[I]){let{projectPath:d}=await ce(e);d||process.exit(1),e.cwd=d,e.isNewProject=!0}t=f.projectInfo}let r=await ze(e.cwd,t),i=r?await ci(r,e):await ai(await C(e.cwd));if(!e.yes){let{proceed:f}=await ke({type:"confirm",name:"proceed",message:`Write configuration to ${c.info("components.json")}. Proceed?`,initial:!0});f||process.exit(0)}let n=y("Writing components.json.").start(),o=xt.resolve(e.cwd,"components.json");await ni.writeFile(o,JSON.stringify(i,null,2),"utf8"),n.succeed();let s=await M(e.cwd,i),l=["index",...e.components||[]];return await ae(l,s,{overwrite:!0,silent:e.silent,isNewProject:e.isNewProject||t?.framework.name==="next-app"}),e.isNewProject&&e.srcDir&&await wt(["./src/**/*.{js,ts,jsx,tsx,mdx}"],s,{silent:e.silent}),s}async function ai(e=null){let[t,r]=await Promise.all([Ie(),Ce()]);a.info("");let i=await ke([{type:"toggle",name:"typescript",message:`Would you like to use ${c.info("TypeScript")} (recommended)?`,initial:e?.tsx??!0,active:"yes",inactive:"no"},{type:"select",name:"style",message:`Which ${c.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 ${c.info("base color")}?`,choices:r.map(n=>({title:n.label,value:n.name}))},{type:"text",name:"tailwindCss",message:`Where is your ${c.info("global CSS")} file?`,initial:e?.tailwind.css??De},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${c.info("CSS variables")} for theming?`,initial:e?.tailwind.cssVariables??!0,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?.tailwind.config??_e},{type:"text",name:"components",message:`Configure the import alias for ${c.info("components")}:`,initial:e?.aliases.components??Le},{type:"text",name:"utils",message:`Configure the import alias for ${c.info("utils")}:`,initial:e?.aliases.utils??Fe},{type:"toggle",name:"rsc",message:`Are you using ${c.info("React Server Components")}?`,initial:e?.rsc??!0,active:"yes",inactive:"no"}]);return K.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 ci(e,t){let r=e.style,i=e.tailwind.baseColor,n=e.tailwind.cssVariables;if(!t.defaults){let[o,s]=await Promise.all([Ie(),Ce()]),l=await ke([{type:"select",name:"style",message:`Which ${c.info("style")} would you like to use?`,choices:o.map(f=>({title:f.label,value:f.name})),initial:o.findIndex(f=>f.name===r)},{type:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${c.info("base color")}?`,choices:s.map(f=>({title:f.label,value:f.name}))},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${c.info("CSS variables")} for theming?`,initial:e?.tailwind.cssVariables,active:"yes",inactive:"no"}]);r=l.style,i=l.tailwindBaseColor,n=l.tailwindCssVariables}return K.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})}import St from"path";import Te from"fs-extra";async function It(e){let t={};if(!Te.existsSync(e.cwd)||!Te.existsSync(St.resolve(e.cwd,"package.json")))return t[I]=!0,{errors:t,config:null};if(!Te.existsSync(St.resolve(e.cwd,"components.json")))return t[j]=!0,{errors:t,config:null};try{let r=await C(e.cwd);return{errors:t,config:r}}catch{a.break(),a.error(`An invalid ${c.info("components.json")} file was found at ${c.info(e.cwd)}.
Before you can add components, you must create a valid ${c.info("components.json")} file by running the ${c.info("init")} command.`),a.error(`Learn more at ${c.info("https://ui.shadcn.com/docs/components-json")}.`),a.break(),process.exit(1)}}import Ct from"fs/promises";import li from"path";async function Rt(e,t){let r=li.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await Ct.stat(r)).isFile())return;let i=await tt(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 dt.writeFile(r,n,"utf8")}import{Command as Jr}from"commander";import Se from"prompts";import{z as b}from"zod";var Yr=b.object({components:b.array(b.string()).optional(),yes:b.boolean(),overwrite:b.boolean(),cwd:b.string(),all:b.boolean(),path:b.string().optional(),silent:b.boolean(),srcDir:b.boolean().optional()}),gt=new Jr().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).action(async(e,t)=>{try{let r=Yr.parse({components:e,cwd:Br.resolve(t.cwd),...t}),i=r.components?.some(l=>l.includes("theme-"));if(!r.yes&&i){a.break();let{confirm:l}=await Se({type:"confirm",name:"confirm",message:c.warn(`You are about to install a new theme.
Existing CSS variables will be overwritten. Continue?`)});l||(a.break(),a.log("Theme installation cancelled."),a.break(),process.exit(1))}r.components?.length||(r.components=await Hr(r));let{errors:n,config:s}=await ft(r);if(n[V]){let{proceed:l}=await Se({type:"confirm",name:"proceed",message:`You need to create a ${c.info("components.json")} file to add components. Proceed?`,initial:!0});l||(a.break(),process.exit(1)),s=await ne({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:!0,isNewProject:!1,srcDir:r.srcDir})}let o=!1;if(n[k]){let{projectPath:l}=await re({cwd:r.cwd,force:r.overwrite,srcDir:r.srcDir});l||(a.break(),process.exit(1)),r.cwd=l,s=await ne({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!0,isNewProject:!0,srcDir:r.srcDir}),o=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//)}if(!s)throw new Error(`Failed to read config at ${c.info(r.cwd)}.`);await te(r.components,s,r),o&&await ut(r.components[0],s)}catch(r){a.break(),x(r)}});async function Hr(e){let t=await z();if(!t)return a.break(),x(new Error("Failed to fetch registry index.")),[];if(e.all)return t.map(n=>n.name);if(e.components?.length)return e.components;let{components:r}=await Se({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(n=>n.type==="registry:ui").map(n=>({title:n.name,value:n.name,selected:e.all?!0:e.components?.includes(n.name)}))});r?.length||(a.warn("No components selected. Exiting."),a.info(""),process.exit(1));let i=b.array(b.string()).safeParse(r);return i.success?i.data:(a.error(""),x(new Error("Something went wrong. Please try again.")),[])}import{existsSync as Ce,promises as Qr}from"fs";import Pe from"path";import{Command as Xr}from"commander";import{diffLines as qr}from"diff";import{z as W}from"zod";var Zr=W.object({component:W.string().optional(),yes:W.boolean(),cwd:W.string(),path:W.string().optional()}),yt=new Xr().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=Zr.parse({component:e,...t}),i=Pe.resolve(r.cwd);Ce(i)||(a.error(`The path ${i} does not exist. Please try again.`),process.exit(1));let n=await I(i);n||(a.warn(`Configuration is missing. Please run ${c.success("init")} to create a components.json file.`),process.exit(1));let s=await z();if(s||(x(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let f=n.resolvedPaths.components,d=s.filter(w=>{for(let S of w.files??[]){let C=Pe.resolve(f,typeof S=="string"?S:S.path);if(Ce(C))return!0}return!1}),m=[];for(let w of d){let S=await ht(w,n);S.length&&m.push({name:w.name,changes:S})}m.length||(a.info("No updates found."),process.exit(0)),a.info("The following components have updates available:");for(let w of m){a.info(`- ${w.name}`);for(let S of w.changes)a.info(` - ${S.filePath}`)}a.break(),a.info(`Run ${c.success("diff <component>")} to see the changes.`),process.exit(0)}let o=s.find(f=>f.name===r.component);o||(a.error(`The component ${c.success(r.component)} does not exist.`),process.exit(1));let l=await ht(o,n);l.length||(a.info(`No updates found for ${r.component}.`),process.exit(0));for(let f of l)a.info(`- ${f.filePath}`),await ei(f.patch),a.info("")}catch(r){x(r)}});async function ht(e,t){let r=await Be(t.style,[e]),i=await K(t.tailwind.baseColor);if(!r)return[];let n=[];for(let s of r){let o=await Je(t,s);if(o)for(let l of s.files??[]){let f=Pe.resolve(o,typeof l=="string"?l:l.path);if(!Ce(f))continue;let d=await Qr.readFile(f,"utf8");if(typeof l=="string"||!l.content)continue;let m=await ee({filename:l.path,raw:l.content,config:t,baseColor:i}),w=qr(m,d);w.length>1&&n.push({filePath:f,patch:w})}}return n}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)})}import{Command as ri}from"commander";var wt={name:"shadcn",version:"2.1.5",description:"Add components to your apps.",publishConfig:{access:"public"},license:"MIT",author:{name:"shadcn",url:"https://twitter.com/shadcn"},repository:{type:"git",url:"https://github.com/shadcn/ui.git",directory:"packages/shadcn"},files:["dist"],keywords:["components","ui","tailwind","radix-ui","shadcn"],type:"module",exports:"./dist/index.js",bin:"./dist/index.js",scripts:{dev:"tsup --watch",build:"tsup",typecheck:"tsc --noEmit",clean:"rimraf dist && rimraf components","start:dev":"cross-env REGISTRY_URL=http://localhost:3333/r node dist/index.js",start:"node dist/index.js","format:write":'prettier --write "**/*.{ts,tsx,mdx}" --cache',"format:check":'prettier --check "**/*.{ts,tsx,mdx}" --cache',release:"changeset version","pub:beta":"pnpm build && pnpm publish --no-git-checks --access public --tag beta","pub:next":"pnpm build && pnpm publish --no-git-checks --access public --tag next","pub:release":"pnpm build && pnpm publish --access public",test:"vitest run","test:dev":"REGISTRY_URL=http://localhost:3333/r vitest run"},dependencies:{"@antfu/ni":"^0.21.4","@babel/core":"^7.22.1","@babel/parser":"^7.22.6","@babel/plugin-transform-typescript":"^7.22.5",commander:"^10.0.0",cosmiconfig:"^8.1.3",deepmerge:"^4.3.1",diff:"^5.1.0",execa:"^7.0.0","fast-glob":"^3.3.2","fs-extra":"^11.1.0","https-proxy-agent":"^6.2.0",kleur:"^4.1.5","lodash.template":"^4.5.0","node-fetch":"^3.3.0",ora:"^6.1.2",postcss:"^8.4.24",prompts:"^2.4.2",recast:"^0.23.2","stringify-object":"^5.0.0","ts-morph":"^18.0.0","tsconfig-paths":"^4.2.0",zod:"^3.20.2"},devDependencies:{"@types/babel__core":"^7.20.1","@types/diff":"^5.0.3","@types/fs-extra":"^11.0.1","@types/lodash.template":"^4.5.1","@types/prompts":"^2.4.2","@types/stringify-object":"^4.0.5",rimraf:"^6.0.1",tsup:"^6.6.3","type-fest":"^3.8.0",typescript:"^4.9.3"}};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function ii(){let e=new ri().name("shadcn").description("add components and dependencies to your project").version(wt.version||"1.0.0","-v, --version","display the version number");e.addCommand(pt).addCommand(gt).addCommand(yt),e.parse()}ii();
}`;await Ct.writeFile(r,n,"utf8")}import{Command as mi}from"commander";import Ee from"prompts";import{z as P}from"zod";var fi=P.object({components:P.array(P.string()).optional(),yes:P.boolean(),overwrite:P.boolean(),cwd:P.string(),all:P.boolean(),path:P.string().optional(),silent:P.boolean(),srcDir:P.boolean().optional()}),Pt=new mi().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).action(async(e,t)=>{try{let r=fi.parse({components:e,cwd:pi.resolve(t.cwd),...t}),i=r.components?.some(l=>l.includes("theme-"));if(!r.yes&&i){a.break();let{confirm:l}=await Ee({type:"confirm",name:"confirm",message:c.warn(`You are about to install a new theme.
Existing CSS variables will be overwritten. Continue?`)});l||(a.break(),a.log("Theme installation cancelled."),a.break(),process.exit(1))}r.components?.length||(r.components=await di(r));let{errors:n,config:o}=await It(r);if(n[j]){let{proceed:l}=await Ee({type:"confirm",name:"proceed",message:`You need to create a ${c.info("components.json")} file to add components. Proceed?`,initial:!0});l||(a.break(),process.exit(1)),o=await pe({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:!0,isNewProject:!1,srcDir:r.srcDir})}let s=!1;if(n[I]){let{projectPath:l}=await ce({cwd:r.cwd,force:r.overwrite,srcDir:r.srcDir});l||(a.break(),process.exit(1)),r.cwd=l,o=await pe({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!0,isNewProject:!0,srcDir:r.srcDir}),s=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//)}if(!o)throw new Error(`Failed to read config at ${c.info(r.cwd)}.`);await ae(r.components,o,r),s&&await Rt(r.components[0],o)}catch(r){a.break(),x(r)}});async function di(e){let t=await V();if(!t)return a.break(),x(new Error("Failed to fetch registry index.")),[];if(e.all)return t.map(n=>n.name);if(e.components?.length)return e.components;let{components:r}=await Ee({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(n=>n.type==="registry:ui").map(n=>({title:n.name,value:n.name,selected:e.all?!0:e.components?.includes(n.name)}))});r?.length||(a.warn("No components selected. Exiting."),a.info(""),process.exit(1));let i=P.array(P.string()).safeParse(r);return i.success?i.data:(a.error(""),x(new Error("Something went wrong. Please try again.")),[])}import{existsSync as je,promises as gi}from"fs";import $e from"path";import{Command as ui}from"commander";import{diffLines as hi}from"diff";import{z as G}from"zod";var yi=G.object({component:G.string().optional(),yes:G.boolean(),cwd:G.string(),path:G.string().optional()}),kt=new ui().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=yi.parse({component:e,...t}),i=$e.resolve(r.cwd);je(i)||(a.error(`The path ${i} does not exist. Please try again.`),process.exit(1));let n=await C(i);n||(a.warn(`Configuration is missing. Please run ${c.success("init")} to create a components.json file.`),process.exit(1));let o=await V();if(o||(x(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let f=n.resolvedPaths.components,d=o.filter(g=>{for(let b of g.files??[]){let S=$e.resolve(f,typeof b=="string"?b:b.path);if(je(S))return!0}return!1}),p=[];for(let g of d){let b=await vt(g,n);b.length&&p.push({name:g.name,changes:b})}p.length||(a.info("No updates found."),process.exit(0)),a.info("The following components have updates available:");for(let g of p){a.info(`- ${g.name}`);for(let b of g.changes)a.info(` - ${b.filePath}`)}a.break(),a.info(`Run ${c.success("diff <component>")} to see the changes.`),process.exit(0)}let s=o.find(f=>f.name===r.component);s||(a.error(`The component ${c.success(r.component)} does not exist.`),process.exit(1));let l=await vt(s,n);l.length||(a.info(`No updates found for ${r.component}.`),process.exit(0));for(let f of l)a.info(`- ${f.filePath}`),await wi(f.patch),a.info("")}catch(r){x(r)}});async function vt(e,t){let r=await rt(t.style,[e]),i=await B(t.tailwind.baseColor);if(!r)return[];let n=[];for(let o of r){let s=await it(t,o);if(s)for(let l of o.files??[]){let f=$e.resolve(s,typeof l=="string"?l:l.path);if(!je(f))continue;let d=await gi.readFile(f,"utf8");if(typeof l=="string"||!l.content)continue;let p=await se({filename:l.path,raw:l.content,config:t,baseColor:i}),g=hi(p,d);g.length>1&&n.push({filePath:f,patch:g})}}return n}async function wi(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)})}import{Command as xi}from"commander";var Tt=new xi().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=>{a.info("> project info"),console.log(await E(e.cwd)),a.break(),a.info("> components.json"),console.log(await C(e.cwd))});import ki from"path";import{randomBytes as bi}from"crypto";import{promises as Oe}from"fs";import{tmpdir as Si}from"os";import me from"path";import Ii from"fast-glob";import Et from"prompts";import{Project as Ci,ScriptKind as Ri,SyntaxKind as Pi}from"ts-morph";async function jt(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,i]=await Promise.all([Ii("**/*.{js,ts,jsx,tsx}",{cwd:t}),X()]);if(Object.keys(i).length===0)throw new Error("Something went wrong fetching the registry icons.");let n=Object.entries(R).map(([p,g])=>({title:g.name,value:p})),o=await Et([{type:"select",name:"sourceLibrary",message:`Which icon library would you like to ${c.info("migrate from")}?`,choices:n},{type:"select",name:"targetLibrary",message:`Which icon library would you like to ${c.info("migrate to")}?`,choices:n}]);if(o.sourceLibrary===o.targetLibrary)throw new Error("You cannot migrate to the same icon library. Please choose a different icon library.");if(!(o.sourceLibrary in R&&o.targetLibrary in R))throw new Error("Invalid icon library. Please choose a valid icon library.");let s=R[o.sourceLibrary],l=R[o.targetLibrary],{confirm:f}=await Et({type:"confirm",name:"confirm",initial:!0,message:`We will migrate ${c.info(r.length)} files in ${c.info(`./${me.relative(e.resolvedPaths.cwd,t)}`)} from ${c.info(s.name)} to ${c.info(l.name)}. Continue?`});f||(a.info("Migration cancelled."),process.exit(0)),l.package&&await Z([l.package],e,{silent:!1});let d=y("Migrating icons...")?.start();await Promise.all(r.map(async p=>{d.text=`Migrating ${p}...`;let g=me.join(t,p),b=await Oe.readFile(g,"utf-8"),S=await vi(b,o.sourceLibrary,o.targetLibrary,i);await Oe.writeFile(g,S)})),d.succeed("Migration complete.")}async function vi(e,t,r,i){let n=R[t]?.import,o=R[r]?.import,s=await Oe.mkdtemp(me.join(Si(),"shadcn-")),l=new Ci({compilerOptions:{}}),f=me.join(s,`shadcn-icons-${bi(4).toString("hex")}.tsx`),d=l.createSourceFile(f,e,{scriptKind:Ri.TSX}),p=[];for(let g of d.getImportDeclarations()??[])if(g.getModuleSpecifier()?.getText()===`"${n}"`){for(let b of g.getNamedImports()??[]){let S=b.getName(),A=Object.values(i).find(L=>L[t]===S)?.[r];!A||p.includes(A)||(p.push(A),b.remove(),d.getDescendantsOfKind(Pi.JsxSelfClosingElement).filter(L=>L.getTagNameNode()?.getText()===S).forEach(L=>L.getTagNameNode()?.replaceWithText(A)))}g.getNamedImports()?.length===0&&g.remove()}return p.length>0&&d.addImportDeclaration({moduleSpecifier:o,namedImports:p.map(g=>({name:g}))}),await d.getText()}import $t from"path";import Ne from"fs-extra";async function Ot(e){let t={};if(!Ne.existsSync(e.cwd)||!Ne.existsSync($t.resolve(e.cwd,"package.json")))return t[I]=!0,{errors:t,config:null};if(!Ne.existsSync($t.resolve(e.cwd,"components.json")))return t[j]=!0,{errors:t,config:null};try{let r=await C(e.cwd);return{errors:t,config:r}}catch{a.break(),a.error(`An invalid ${c.info("components.json")} file was found at ${c.info(e.cwd)}.
Before you can run a migration, you must create a valid ${c.info("components.json")} file by running the ${c.info("init")} command.`),a.error(`Learn more at ${c.info("https://ui.shadcn.com/docs/components-json")}.`),a.break(),process.exit(1)}}import{Command as Ti}from"commander";import{z as fe}from"zod";var Nt=[{name:"icons",description:"migrate your ui components to a different icon library."}],Ei=fe.object({cwd:fe.string(),list:fe.boolean(),migration:fe.string().refine(e=>e&&Nt.some(t=>t.name===e),{message:"You must specify a valid migration. Run `shadcn migrate --list` to see available migrations."}).optional()}),At=new Ti().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.",!1).action(async(e,t)=>{try{let r=Ei.parse({cwd:ki.resolve(t.cwd),migration:e,list:t.list});if(r.list||!r.migration){a.info("Available migrations:");for(let o of Nt)a.info(`- ${o.name}: ${o.description}`);return}if(!r.migration)throw new Error("You must specify a migration. Run `shadcn migrate --list` to see available migrations.");let{errors:i,config:n}=await Ot(r);if(i[I]||i[j])throw new Error("No `components.json` file found. Ensure you are at the root of your project.");if(!n)throw new Error("Something went wrong reading your `components.json` file. Please ensure you have a valid `components.json` file.");r.migration==="icons"&&await jt(n)}catch(r){a.break(),x(r)}});import{Command as $i}from"commander";var Lt={name:"shadcn",version:"2.1.6",description:"Add components to your apps.",publishConfig:{access:"public"},license:"MIT",author:{name:"shadcn",url:"https://twitter.com/shadcn"},repository:{type:"git",url:"https://github.com/shadcn/ui.git",directory:"packages/shadcn"},files:["dist"],keywords:["components","ui","tailwind","radix-ui","shadcn"],type:"module",exports:"./dist/index.js",bin:"./dist/index.js",scripts:{dev:"tsup --watch",build:"tsup",typecheck:"tsc --noEmit",clean:"rimraf dist && rimraf components","start:dev":"cross-env REGISTRY_URL=http://localhost:3333/r node dist/index.js","start:prod":"cross-env REGISTRY_URL=https://ui.shadcn.com/r node dist/index.js",start:"node dist/index.js","format:write":'prettier --write "**/*.{ts,tsx,mdx}" --cache',"format:check":'prettier --check "**/*.{ts,tsx,mdx}" --cache',release:"changeset version","pub:beta":"pnpm build && pnpm publish --no-git-checks --access public --tag beta","pub:next":"pnpm build && pnpm publish --no-git-checks --access public --tag next","pub:release":"pnpm build && pnpm publish --access public",test:"vitest run","test:dev":"REGISTRY_URL=http://localhost:3333/r vitest run"},dependencies:{"@antfu/ni":"^0.21.4","@babel/core":"^7.22.1","@babel/parser":"^7.22.6","@babel/plugin-transform-typescript":"^7.22.5",commander:"^10.0.0",cosmiconfig:"^8.1.3",deepmerge:"^4.3.1",diff:"^5.1.0",execa:"^7.0.0","fast-glob":"^3.3.2","fs-extra":"^11.1.0","https-proxy-agent":"^6.2.0",kleur:"^4.1.5","lodash.template":"^4.5.0","node-fetch":"^3.3.0",ora:"^6.1.2",postcss:"^8.4.24",prompts:"^2.4.2",recast:"^0.23.2","stringify-object":"^5.0.0","ts-morph":"^18.0.0","tsconfig-paths":"^4.2.0",zod:"^3.20.2"},devDependencies:{"@types/babel__core":"^7.20.1","@types/diff":"^5.0.3","@types/fs-extra":"^11.0.1","@types/lodash.template":"^4.5.1","@types/prompts":"^2.4.2","@types/stringify-object":"^4.0.5",rimraf:"^6.0.1",tsup:"^6.6.3","type-fest":"^3.8.0",typescript:"^4.9.3"}};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function Oi(){let e=new $i().name("shadcn").description("add components and dependencies to your project").version(Lt.version||"1.0.0","-v, --version","display the version number");e.addCommand(bt).addCommand(Pt).addCommand(kt).addCommand(At).addCommand(Tt),e.parse()}Oi();
//# sourceMappingURL=index.js.map
{
"name": "shadcn",
"version": "2.1.5",
"version": "2.1.6",
"description": "Add components to your apps.",

@@ -74,2 +74,3 @@ "publishConfig": {

"start:dev": "cross-env REGISTRY_URL=http://localhost:3333/r node dist/index.js",
"start:prod": "cross-env REGISTRY_URL=https://ui.shadcn.com/r node dist/index.js",
"start": "node dist/index.js",

@@ -76,0 +77,0 @@ "format:write": "prettier --write \"**/*.{ts,tsx,mdx}\" --cache",

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc