shadcn 0.0.0-beta.22e84f7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE.md ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2023 shadcn
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,43 @@
1
+ # shadcn-ui
2
+
3
+ A CLI for adding components to your project.
4
+
5
+ ## Usage
6
+
7
+ Use the `init` command to initialize dependencies for a new project.
8
+
9
+ The `init` command installs dependencies, adds the `cn` util, configures `tailwind.config.js`, and CSS variables for the project.
10
+
11
+ ```bash
12
+ npx shadcn-ui init
13
+ ```
14
+
15
+ ## add
16
+
17
+ Use the `add` command to add components to your project.
18
+
19
+ The `add` command adds a component to your project and installs all required dependencies.
20
+
21
+ ```bash
22
+ npx shadcn-ui add [component]
23
+ ```
24
+
25
+ ### Example
26
+
27
+ ```bash
28
+ npx shadcn-ui add alert-dialog
29
+ ```
30
+
31
+ You can also run the command without any arguments to view a list of all available components:
32
+
33
+ ```bash
34
+ npx shadcn-ui add
35
+ ```
36
+
37
+ ## Documentation
38
+
39
+ Visit https://ui.shadcn.com/docs/cli to view the documentation.
40
+
41
+ ## License
42
+
43
+ Licensed under the [MIT license](https://github.com/shadcn/ui/blob/main/LICENSE.md).
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ import Ir from"path";import{promises as Cr}from"fs";import rt from"path";import Te from"path";var v="1";var W="3";var ie="5",ne="6",be="7";import se from"path";var C={"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 O from"path";import{cyan as mt,green as ft,red as dt,yellow as ut}from"kleur/colors";var l={error:dt,warn:ut,info:mt,success:ft};import{createMatchPath as gt}from"tsconfig-paths";async function P(e,t){return gt(t.absoluteBaseUrl,t.paths)(e,void 0,()=>!0,[".ts",".tsx"])}import{cosmiconfig as ht}from"cosmiconfig";import{loadConfig as yt}from"tsconfig-paths";import{z as g}from"zod";var Se="@/components",Ce="@/lib/utils",Pe="app/globals.css",ve="tailwind.config.js";var wt=ht("components",{searchPlaces:["components.json"]}),$=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(),xt=$.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 R(e){let t=await bt(e);return t?await N(e,t):null}async function N(e,t){let r=await yt(e);if(r.resultType==="failed")throw new Error(`Failed to load ${t.tsx?"tsconfig":"jsconfig"}.json. ${r.message??""}`.trim());return xt.parse({...t,resolvedPaths:{cwd:e,tailwindConfig:O.resolve(e,t.tailwind.config),tailwindCss:O.resolve(e,t.tailwind.css),utils:await P(t.aliases.utils,r),components:await P(t.aliases.components,r),ui:t.aliases.ui?await P(t.aliases.ui,r):O.resolve(await P(t.aliases.components,r)??e,"ui"),lib:t.aliases.lib?await P(t.aliases.lib,r):O.resolve(await P(t.aliases.utils,r)??e,".."),hooks:t.aliases.hooks?await P(t.aliases.hooks,r):O.resolve(await P(t.aliases.components,r)??e,"..","hooks")}})}async function bt(e){try{let t=await wt.search(e);return t?$.parse(t.config):null}catch{let r=`${e}/component.json`;throw new Error(`Invalid configuration found in ${l.info(r)}.`)}}import U from"fast-glob";import oe from"fs-extra";import{loadConfig as St}from"tsconfig-paths";var G=["**/node_modules/**",".next","public","dist","build"];async function A(e){let[t,r,i,n,s,o]=await Promise.all([U.glob("**/{next,vite,astro}.config.*|gatsby-config.*|composer.json",{cwd:e,deep:3,ignore:G}),oe.pathExists(se.resolve(e,"src")),Rt(e),Pt(e),Ct(e),vt(e)]),p=await oe.pathExists(se.resolve(e,`${r?"src/":""}app`)),m={framework:C.manual,isSrcDir:r,isRSC:!1,isTsx:i,tailwindConfigFile:n,tailwindCssFile:s,aliasPrefix:o};return t.length?t.find(f=>f.startsWith("next.config."))?.length?(m.framework=p?C["next-app"]:C["next-pages"],m.isRSC=p,m):t.find(f=>f.startsWith("astro.config."))?.length?(m.framework=C.astro,m):t.find(f=>f.startsWith("gatsby-config."))?.length?(m.framework=C.gatsby,m):t.find(f=>f.startsWith("composer.json"))?.length?(m.framework=C.laravel,m):(t.find(f=>f.startsWith("vite.config."))?.length&&(m.framework=p?C.remix:C.vite),m):m}async function Ct(e){let t=await U.glob("**/*.css",{cwd:e,deep:5,ignore:G});if(!t.length)return null;for(let r of t)if((await oe.readFile(se.resolve(e,r),"utf8")).includes("@tailwind base"))return r;return null}async function Pt(e){let t=await U.glob("tailwind.config.*",{cwd:e,deep:3,ignore:G});return t.length?t[0]:null}async function vt(e){let t=await St(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 Rt(e){return(await U.glob("tsconfig.*",{cwd:e,deep:1,ignore:G})).length>0}async function Re(e,t=null){let[r,i]=await Promise.all([R(e),t?Promise.resolve(t):A(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 N(e,n)}var a={error(...e){console.log(l.error(e.join(" ")))},warn(...e){console.log(l.warn(e.join(" ")))},info(...e){console.log(l.info(e.join(" ")))},success(...e){console.log(l.success(e.join(" ")))},log(...e){console.log(e.join(" "))},break(){console.log("")}};import Tt from"ora";function h(e,t){return Tt({text:e,isSilent:t?.silent})}import ae from"fs-extra";async function Ie(e){let t={};if(!ae.existsSync(e.cwd)||!ae.existsSync(Te.resolve(e.cwd,"package.json")))return t[v]=!0,{errors:t,projectInfo:null};let r=h("Preflight checks.",{silent:e.silent}).start();ae.existsSync(Te.resolve(e.cwd,"components.json"))&&!e.force&&(r?.fail(),a.break(),a.error(`A ${l.info("components.json")} file already exists at ${l.info(e.cwd)}.
3
+ To start over, remove the ${l.info("components.json")} file and run ${l.info("init")} again.`),a.break(),process.exit(1)),r?.succeed();let i=h("Verifying framework.",{silent:e.silent}).start(),n=await A(e.cwd);(!n||n?.framework.name==="manual")&&(t[be]=!0,i?.fail(),a.break(),n?.framework.links.installation&&a.error(`We could not detect a supported framework at ${l.info(e.cwd)}.
4
+ Visit ${l.info(n?.framework.links.installation)} to manually configure your project.
5
+ Once configured, you can use the cli to add components.`),a.break(),process.exit(1)),i?.succeed(`Verifying framework. Found ${l.info(n.framework.label)}.`);let s=h("Validating Tailwind CSS.",{silent:e.silent}).start();!n?.tailwindConfigFile||!n?.tailwindCssFile?(t[ie]=!0,s?.fail()):s?.succeed();let o=h("Validating import alias.",{silent:e.silent}).start();return n?.aliasPrefix?o?.succeed():(t[ne]=!0,o?.fail()),Object.keys(t).length>0&&(t[ie]&&(a.break(),a.error(`No Tailwind CSS configuration found at ${l.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 ${l.info(n?.framework.links.tailwind)} to get started.`)),t[ne]&&(a.break(),a.error("No import alias found in your tsconfig.json file."),n?.framework.links.installation&&a.error(`Visit ${l.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 It}from"zod";function b(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 It.ZodError){a.error("Validation failed:");for(let[t,r]of Object.entries(e.flatten().fieldErrors))a.error(`- ${l.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 Vt from"path";import{z as c}from"zod";var ke=c.enum(["registry:style","registry:lib","registry:example","registry:block","registry:component","registry:ui","registry:hook","registry:theme","registry:page"]),Ee=c.object({path:c.string(),content:c.string().optional(),type:ke,target:c.string().optional()}),kt=c.object({config:c.object({content:c.array(c.string()).optional(),theme:c.record(c.string(),c.any()).optional(),plugins:c.array(c.string()).optional()}).optional()}),Et=c.object({light:c.record(c.string(),c.string()).optional(),dark:c.record(c.string(),c.string()).optional()}),F=c.object({name:c.string(),type:ke,description:c.string().optional(),dependencies:c.array(c.string()).optional(),devDependencies:c.array(c.string()).optional(),registryDependencies:c.array(c.string()).optional(),files:c.array(Ee).optional(),tailwind:kt.optional(),cssVars:Et.optional()}),le=c.array(F.extend({files:c.array(c.union([c.string(),Ee])).optional()})),je=c.array(c.object({name:c.string(),label:c.string()})),Oe=c.object({inlineColors:c.object({light:c.record(c.string(),c.string()),dark:c.record(c.string(),c.string())}),cssVars:c.object({light:c.record(c.string(),c.string()),dark:c.record(c.string(),c.string())}),inlineColorsTemplate:c.string(),cssVarsTemplate:c.string()}),$e=F.pick({dependencies:!0,devDependencies:!0,files:!0,tailwind:!0,cssVars:!0});import{promises as ce}from"fs";import{tmpdir as jt}from"os";import _ from"path";import Ot from"deepmerge";import $t from"stringify-object";import{Project as Nt,QuoteKind as At,ScriptKind as Ne,SyntaxKind as u}from"ts-morph";async function Ae(e,t,r){if(!e)return;r={silent:!1,...r};let i=_.relative(t.resolvedPaths.cwd,t.resolvedPaths.tailwindConfig),n=h(`Updating ${l.info(i)}`,{silent:r.silent}).start(),s=await ce.readFile(t.resolvedPaths.tailwindConfig,"utf8"),o=await Ft(s,e,t);await ce.writeFile(t.resolvedPaths.tailwindConfig,o,"utf8"),n?.succeed()}async function Ft(e,t,r){let i=await Fe(e,r),n=i.getDescendantsOfKind(u.ObjectLiteralExpression).find(o=>o.getProperties().some(p=>p.isKind(u.PropertyAssignment)&&p.getName()==="content"));if(!n)return e;let s=zt(n);return _t(n,{name:"darkMode",value:"class"},{quoteChar:s}),t.plugins?.forEach(o=>{Lt(n,o)}),t.theme&&await Dt(n,t.theme),i.getFullText()}function _t(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 Dt(e,t){e.getProperty("theme")||e.addPropertyAssignment({name:"theme",initializer:"{}"}),_e(e);let i=(e.getPropertyOrThrow("theme")?.asKindOrThrow(u.PropertyAssignment)).getInitializer();if(i?.isKind(u.ObjectLiteralExpression)){let n=i.getText(),s=await Kt(n),o=Ot(s,t),p=$t(o).replace(/\'\"/g,"'").replace(/\"\'/g,"'").replace(/\'\[/g,"[").replace(/\]\'/g,"]").replace(/\\\'/g,"").replace(/\\\'/g,"");i.replaceWithText(p)}De(e)}function Lt(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 Fe(e,t){let r=await ce.mkdtemp(_.join(jt(),"shadcn-")),i=t?.resolvedPaths?.tailwindConfig||"tailwind.config.ts",n=_.join(r,`shadcn-${_.basename(i)}`);return new Nt({compilerOptions:{}}).createSourceFile(n,e,{scriptKind:_.extname(i)===".ts"?Ne.TS:Ne.JS})}function zt(e){return e.getFirstDescendantByKind(u.StringLiteral)?.getQuoteKind()===At.Single?"'":'"'}function _e(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)&&_e(s.asKindOrThrow(u.ObjectLiteralExpression))}}}function De(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)&&De(s)}}}async function Kt(e){let r=(await Fe(`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 Le(n)}throw new Error("Invalid input: not an object literal")}function Le(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]=Le(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 Ke(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 D from"deepmerge";import{HttpsProxyAgent as Wt}from"https-proxy-agent";import Mt from"node-fetch";import{z as Ut}from"zod";var Gt=process.env.REGISTRY_URL??"https://ui.shadcn.com/registry",Bt=process.env.https_proxy?new Wt(process.env.https_proxy):void 0;async function L(){try{let[e]=await E(["index.json"]);return le.parse(e)}catch(e){a.error(`
6
+ `),b(e)}}async function pe(){try{let[e]=await E(["styles/index.json"]);return je.parse(e)}catch(e){return a.error(`
7
+ `),b(e),[]}}async function Ve(e,t){try{let[r]=await E([fe(e)?e:`styles/${t}/${e}.json`]);return F.parse(r)}catch(r){return a.break(),b(r),null}}async function me(){return[{name:"neutral",label:"Neutral"},{name:"gray",label:"Gray"},{name:"zinc",label:"Zinc"},{name:"stone",label:"Stone"},{name:"slate",label:"Slate"}]}async function z(e){try{let[t]=await E([`colors/${e}.json`]);return Oe.parse(t)}catch(t){b(t)}}async function We(e,t){try{let r=t.map(n=>`styles/${e}/${n.name}.json`),i=await E(r);return le.parse(i)}catch(r){b(r)}}async function Me(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?Vt.join(e.resolvedPaths[i],n):null}async function E(e){try{return await Promise.all(e.map(async r=>{let i=Be(r),n=await Mt(i,{agent:Bt});if(!n.ok){let s={400:"Bad request",401:"Unauthorized",403:"Forbidden",404:"Not found",500:"Internal server error"},o=n.statusText||s[n.status];throw new Error(`Failed to fetch from ${l.info(i)}. ${o}.`)}return n.json()}))}catch(t){return a.error(`
8
+ `),b(t),[]}}function Ue(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 Ge(e,t){try{if(!await L())return null;let i=(await Promise.all(e.map(async d=>await Ve(d,t.style)))).filter(d=>d!==null);if(!i.length)return null;let n=i.map(d=>d.registryDependencies??[]).flat(),s=Array.from(new Set(n)),o=Array.from([...e,...s]).map(d=>Be(fe(d)?d:`styles/${t.style}/${d}.json`)),p=await E(o),m=Ut.array(F).parse(p);if(!m)return null;if(e.includes("index")){let d=await Ve("index",t.style);if(d&&m.unshift(d),t.tailwind.baseColor){let w=await Jt(t.tailwind.baseColor,t);w&&m.unshift(w)}}let f={};m.forEach(d=>{f=D(f,d.tailwind??{})});let x={};return m.forEach(d=>{x=D(x,d.cssVars??{})}),$e.parse({dependencies:D.all(m.map(d=>d.dependencies??[])),devDependencies:D.all(m.map(d=>d.devDependencies??[])),files:D.all(m.map(d=>d.files??[])),tailwind:f,cssVars:x})}catch(r){return b(r),null}}async function Jt(e,t){let r=await z(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,...Ke(r.cssVars.dark)},i.cssVars={light:{...r.cssVars.light,...i.cssVars.light},dark:{...r.cssVars.dark,...i.cssVars.dark}}),i}function Be(e){return fe(e)?e:`${Gt}/${e}`}function fe(e){try{return new URL(e),!0}catch{return!1}}import{promises as Je}from"fs";import Yt from"path";import I from"postcss";import Ht from"postcss/lib/at-rule";async function Ye(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=Yt.relative(t.resolvedPaths.cwd,i),s=h(`Updating ${l.info(n)}`,{silent:r.silent}).start(),o=await Je.readFile(i,"utf8"),p=await Qt(o,e,t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles});await Je.writeFile(i,p,"utf8"),s.succeed()}async function Qt(e,t,r,i){i={cleanupDefaultNextStyles:!1,...i};let n=[Zt(t)];return i.cleanupDefaultNextStyles&&n.push(qt()),r.tailwind.cssVariables&&n.push(Xt()),(await I(n).process(e,{from:void 0})).css}function Xt(){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(p=>p.type==="atrule"&&p.name==="apply"&&p.params===s))));r||(r=I.atRule({name:"layer",params:"base",raws:{semicolon:!0,between:" ",before:`
9
+ `}}),e.append(r)),t.forEach(({selector:i,apply:n})=>{r?.nodes?.find(o=>o.type==="rule"&&o.selector===i)||r?.append(I.rule({selector:i,nodes:[I.atRule({name:"apply",params:n,raws:{semicolon:!0,before:`
10
+ `}})],raws:{semicolon:!0,between:" ",before:`
11
+ `}}))})}}}function Zt(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 Ht||(r=I.atRule({name:"layer",params:"base",nodes:[],raws:{semicolon:!0,before:`
12
+ `,between:" "}}),t.append(r)),r!==void 0&&Object.entries(e).forEach(([i,n])=>{let s=i==="light"?":root":`.${i}`;er(r,s,n)})}}}function qt(){return{postcssPlugin:"cleanup-default-next-styles",Once(e){let t=e.nodes.find(r=>r.type==="rule"&&r.selector==="body");t&&(t.nodes.find(r=>r.type==="decl"&&r.prop==="color"&&r.value==="rgb(var(--foreground-rgb))")?.remove(),t.nodes.find(r=>r.type==="decl"&&r.prop==="background"&&r.value.startsWith("linear-gradient"))?.remove(),t.nodes.length===0&&t.remove())}}}function er(e,t,r){let i=e.nodes?.find(n=>n.type==="rule"&&n.selector===t);i||Object.keys(r).length>0&&(i=I.rule({selector:t,raws:{between:" ",before:`
13
+ `}}),e.append(i)),Object.entries(r).forEach(([n,s])=>{let o=`--${n.replace(/^--/,"")}`,p=I.decl({prop:o,value:s,raws:{semicolon:!0}}),m=i?.nodes.find(f=>f.type==="decl"&&f.prop===o);m?m.replaceWith(p):i?.append(p)})}import{detect as tr}from"@antfu/ni";async function B(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 rr}from"execa";async function He(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 B(t.resolvedPaths.cwd);await rr(n,[n==="npm"?"install":"add",...e],{cwd:t.resolvedPaths.cwd}),i?.succeed()}import{existsSync as Ze,promises as qe}from"fs";import j,{basename as wr}from"path";import{promises as fr}from"fs";import{tmpdir as dr}from"os";import Xe from"path";import{SyntaxKind as ir}from"ts-morph";var J=async({sourceFile:e,config:t,baseColor:r})=>(t.tailwind?.cssVariables||!r?.inlineColors||e.getDescendantsOfKind(ir.StringLiteral).forEach(i=>{let n=i.getText();if(n){let s=sr(n.replace(/"/g,""),r.inlineColors);i.replaceWithText(`"${s.trim()}"`)}}),e);function de(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 nr=["bg-","text-","border-","ring-offset-","ring-"];function sr(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,p,m]=de(s),f=nr.find(d=>p?.startsWith(d));if(!f){i.has(s)||i.add(s);continue}let x=p?.replace(f,"");if(x&&x in t.light){i.add([o,`${f}${t.light[x]}`].filter(Boolean).join(":")+(m?`/${m}`:"")),n.add(["dark",o,`${f}${t.dark[x]}`].filter(Boolean).join(":")+(m?`/${m}`:""));continue}i.has(s)||i.add(s)}return[...Array.from(i),...Array.from(n)].join(" ").trim()}var Y=async({sourceFile:e,config:t})=>{let r=e.getImportDeclarations();for(let i of r){let n=or(i.getModuleSpecifierValue(),t);i.setModuleSpecifier(n),n=="@/lib/utils"&&i.getNamedImports().find(p=>p.getName()==="cn")&&i.setModuleSpecifier(n.replace(/^@\/lib\/utils/,t.aliases.utils))}return e};function or(e,t){return e.startsWith("@/registry/")?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):e}import{transformFromAstSync as ar}from"@babel/core";import{parse as lr}from"@babel/parser";import cr from"@babel/plugin-transform-typescript";import*as H 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"]},Qe=async({sourceFile:e,config:t})=>{let r=e.getFullText();if(t.tsx)return r;let i=H.parse(r,{parser:{parse:s=>lr(s,pr)}}),n=ar(i,r,{cloneInputAst:!1,code:!1,ast:!0,plugins:[cr],configFile:!1});if(!n||!n.ast)throw new Error("Failed to transform JSX");return H.print(n.ast).code};import{SyntaxKind as mr}from"ts-morph";var Q=async({sourceFile:e,config:t})=>{if(t.rsc)return e;let r=e.getFirstChildByKind(mr.ExpressionStatement);return r?.getText()==='"use client"'&&r.remove(),e};import{Project as ur,ScriptKind as gr}from"ts-morph";import{SyntaxKind as y}from"ts-morph";var X=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,p]=de(n);s?p?i.push(`${s}:${t}${o}/${p}`):i.push(`${s}:${t}${o}`):p?i.push(`${t}${o}/${p}`):i.push(`${t}${o}`)}return i.join(" ")}var hr=new ur({compilerOptions:{}});async function yr(e){let t=await fr.mkdtemp(Xe.join(dr(),"shadcn-"));return Xe.join(t,e)}async function Z(e,t=[Y,Q,J,X]){let r=await yr(e.filename),i=hr.createSourceFile(r,e.raw,{scriptKind:gr.TSX});for(let n of t)n({sourceFile:i,...e});return e.transformJsx?await Qe({sourceFile:i,...e}):i.getText()}import xr from"prompts";async function et(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=await z(t.tailwind.baseColor),s=[],o=[],p=[];for(let f of e){if(!f.content)continue;let x=Ue(f,t),d=wr(f.path),w=j.join(x,d);f.target&&(w=j.join(t.resolvedPaths.cwd,f.target),x=j.dirname(w)),t.tsx||(w=w.replace(/\.tsx?$/,re=>re===".tsx"?".jsx":".js"));let V=Ze(w);if(V&&!r.overwrite){i.stop();let{overwrite:re}=await xr({type:"confirm",name:"overwrite",message:`The file ${l.info(d)} already exists. Would you like to overwrite?`,initial:!1});if(!re){p.push(j.relative(t.resolvedPaths.cwd,w));continue}i?.start()}Ze(x)||await qe.mkdir(x,{recursive:!0});let pt=await Z({filename:f.path,raw:f.content,config:t,baseColor:n,transformJsx:!t.tsx},[Y,Q,J,X]);await qe.writeFile(w,pt,"utf-8"),V?o.push(j.relative(t.resolvedPaths.cwd,w)):s.push(j.relative(t.resolvedPaths.cwd,w))}if(!(s.length||o.length)&&!p.length&&i?.info("No files updated."),s.length){if(i?.succeed(`Created ${s.length} ${s.length===1?"file":"files"}:`),!r.silent)for(let f of s)a.log(` - ${f}`)}else i?.stop();if(o.length&&(h(`Updated ${o.length} ${o.length===1?"file":"files"}:`,{silent:r.silent})?.info(),!r.silent))for(let f of o)a.log(` - ${f}`);if(p.length&&(h(`Skipped ${p.length} ${o.length===1?"file":"files"}:`,{silent:r.silent})?.info(),!r.silent))for(let f of p)a.log(` - ${f}`);r.silent||a.break()}async function q(e,t,r){r={overwrite:!1,silent:!1,isNewProject:!1,...r};let i=h("Checking registry.",{silent:r.silent})?.start(),n=await Ge(e,t);if(!n)return i?.fail(),b(new Error("Failed to fetch components from registry."));i?.succeed(),await Ae(n.tailwind?.config,t,{silent:r.silent}),await Ye(n.cssVars,t,{cleanupDefaultNextStyles:r.isNewProject,silent:r.silent}),await He(n.dependencies,t,{silent:r.silent}),await et(n.files,t,{overwrite:r.overwrite,silent:r.silent})}import br from"path";import{execa as Sr}from"execa";import ue from"fs-extra";import tt from"prompts";async function ee(e){if(!e.force){let{proceed:o}=await tt({type:"confirm",name:"proceed",message:`The path ${l.info(e.cwd)} is empty. Would you like to start a new ${l.info("Next.js")} project?`,initial:!0});if(!o)return{projectPath:null,projectName:null}}let t=await B(e.cwd),{name:r}=await tt({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 ue.access(e.cwd,ue.constants.W_OK)}catch{a.break(),a.error(`The path ${l.info(e.cwd)} is not writable.`),a.error(`It is likely you do not have write permissions for this folder or the path ${l.info(e.cwd)} does not exist.`),a.break(),process.exit(1)}ue.existsSync(br.resolve(e.cwd,r,"package.json"))&&(a.break(),a.error(`A project with the name ${l.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.").start(),s=["--tailwind","--eslint","--typescript","--app","--no-src-dir","--no-import-alias",`--use-${t}`];try{await Sr("npx",["create-next-app@latest",i,"--silent",...s],{cwd:e.cwd})}catch{a.break(),a.error("Something went wront creating a new Next.js project. Please try again."),process.exit(1)}return n?.succeed(),{projectPath:i,projectName:r}}import{Command as Pr}from"commander";import ge from"prompts";import{z as k}from"zod";var vr=k.object({cwd:k.string(),yes:k.boolean(),defaults:k.boolean(),force:k.boolean(),silent:k.boolean(),isNewProject:k.boolean()}),it=new Pr().name("init").description("initialize your project and install dependencies").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).action(async e=>{try{let t=vr.parse({cwd:rt.resolve(e.cwd),isNewProject:!1,...e});await te(t),a.log(`${l.success("Success!")} Project initialization completed.
14
+ You may now add components.`),a.break()}catch(t){a.break(),b(t)}});async function te(e){let t;if(e.skipPreflight)t=await A(e.cwd);else{let p=await Ie(e);if(p.errors[v]){let{projectPath:m}=await ee(e);m||process.exit(1),e.cwd=m,e.isNewProject=!0}t=p.projectInfo}let r=await Re(e.cwd,t),i=r?await Tr(r,e):await Rr(await R(e.cwd));if(!e.yes){let{proceed:p}=await ge({type:"confirm",name:"proceed",message:`Write configuration to ${l.info("components.json")}. Proceed?`,initial:!0});p||process.exit(0)}let n=h("Writing components.json.").start(),s=rt.resolve(e.cwd,"components.json");await Cr.writeFile(s,JSON.stringify(i,null,2),"utf8"),n.succeed();let o=await N(e.cwd,i);return await q(["index"],o,{overwrite:!0,silent:e.silent,isNewProject:e.isNewProject||t?.framework.name==="next-app"}),o}async function Rr(e=null){let[t,r]=await Promise.all([pe(),me()]);a.info("");let i=await ge([{type:"toggle",name:"typescript",message:`Would you like to use ${l.info("TypeScript")} (recommended)?`,initial:e?.tsx??!0,active:"yes",inactive:"no"},{type:"select",name:"style",message:`Which ${l.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 ${l.info("base color")}?`,choices:r.map(n=>({title:n.label,value:n.name}))},{type:"text",name:"tailwindCss",message:`Where is your ${l.info("global CSS")} file?`,initial:e?.tailwind.css??Pe},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${l.info("CSS variables")} for theming?`,initial:e?.tailwind.cssVariables??!0,active:"yes",inactive:"no"},{type:"text",name:"tailwindPrefix",message:`Are you using a custom ${l.info("tailwind prefix eg. tw-")}? (Leave blank if not)`,initial:""},{type:"text",name:"tailwindConfig",message:`Where is your ${l.info("tailwind.config.js")} located?`,initial:e?.tailwind.config??ve},{type:"text",name:"components",message:`Configure the import alias for ${l.info("components")}:`,initial:e?.aliases.components??Se},{type:"text",name:"utils",message:`Configure the import alias for ${l.info("utils")}:`,initial:e?.aliases.utils??Ce},{type:"toggle",name:"rsc",message:`Are you using ${l.info("React Server Components")}?`,initial:e?.rsc??!0,active:"yes",inactive:"no"}]);return $.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 Tr(e,t){let r=e.style,i=e.tailwind.baseColor,n=e.tailwind.cssVariables;if(!t.defaults){let[s,o]=await Promise.all([pe(),me()]),p=await ge([{type:"select",name:"style",message:`Which ${l.info("style")} would you like to use?`,choices:s.map(m=>({title:m.label,value:m.name})),initial:s.findIndex(m=>m.name===r)},{type:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${l.info("base color")}?`,choices:o.map(m=>({title:m.label,value:m.name}))},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${l.info("CSS variables")} for theming?`,initial:e?.tailwind.cssVariables,active:"yes",inactive:"no"}]);r=p.style,i=p.tailwindBaseColor,n=p.tailwindCssVariables}return $.parse({$schema:e?.$schema,style:r,tailwind:{...e?.tailwind,baseColor:i,cssVariables:n},rsc:e?.rsc,tsx:e?.tsx,aliases:e?.aliases})}import nt from"path";import he from"fs-extra";async function st(e){let t={};if(!he.existsSync(e.cwd)||!he.existsSync(nt.resolve(e.cwd,"package.json")))return t[v]=!0,{errors:t,config:null};if(!he.existsSync(nt.resolve(e.cwd,"components.json")))return t[W]=!0,{errors:t,config:null};let r=h("Preflight checks.",{silent:e.silent})?.start();try{let i=await R(e.cwd);return r?.succeed(),{errors:t,config:i}}catch{r?.fail(),a.break(),a.error(`An invalid ${l.info("components.json")} file was found at ${l.info(e.cwd)}.
15
+ Before you can add components, you must create a valid ${l.info("components.json")} file by running the ${l.info("init")} command.`),a.error(`Learn more at ${l.info("https://ui.shadcn.com/docs/components-json")}.`),a.break(),process.exit(1)}}import{Command as kr}from"commander";import ye from"prompts";import{z as S}from"zod";var Er=S.object({components:S.array(S.string()).optional(),yes:S.boolean(),overwrite:S.boolean(),cwd:S.string(),all:S.boolean(),path:S.string().optional(),silent:S.boolean()}),ot=new kr().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).action(async(e,t)=>{try{let r=Er.parse({components:e,cwd:Ir.resolve(t.cwd),...t}),i=r.components?.some(o=>o.includes("theme-"));if(!r.yes&&i){a.break();let{confirm:o}=await ye({type:"confirm",name:"confirm",message:l.warn(`You are about to install a new theme.
16
+ Existing CSS variables will be overwritten. Continue?`)});o||(a.break(),a.log("Theme installation cancelled."),a.break(),process.exit(1))}r.components?.length||(r.components=await jr(r));let{errors:n,config:s}=await st(r);if(n[W]){let{proceed:o}=await ye({type:"confirm",name:"proceed",message:`You need to create a ${l.info("component.json")} file to add components. Proceed?`,initial:!0});o||(a.break(),process.exit(1)),s=await te({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:!0,isNewProject:!1})}if(n[v]){let{projectPath:o}=await ee({cwd:r.cwd,force:r.overwrite});o||(a.break(),process.exit(1)),r.cwd=o,s=await te({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!0,isNewProject:!0})}if(!s)throw new Error(`Failed to read config at ${l.info(r.cwd)}.`);await q(r.components,s,r)}catch(r){a.break(),b(r)}});async function jr(e){let t=await L();if(!t)return a.break(),b(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 ye({type:"multiselect",name:"components",message:"Which components would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:!1,choices:t.filter(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=S.array(S.string()).safeParse(r);return i.success?i.data:(a.error(""),b(new Error("Something went wrong. Please try again.")),[])}import{existsSync as we,promises as Or}from"fs";import xe from"path";import{Command as $r}from"commander";import{diffLines as Nr}from"diff";import{z as K}from"zod";var Ar=K.object({component:K.string().optional(),yes:K.boolean(),cwd:K.string(),path:K.string().optional()}),lt=new $r().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=Ar.parse({component:e,...t}),i=xe.resolve(r.cwd);we(i)||(a.error(`The path ${i} does not exist. Please try again.`),process.exit(1));let n=await R(i);n||(a.warn(`Configuration is missing. Please run ${l.success("init")} to create a components.json file.`),process.exit(1));let s=await L();if(s||(b(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let m=n.resolvedPaths.components,f=s.filter(d=>{for(let w of d.files??[]){let V=xe.resolve(m,typeof w=="string"?w:w.path);if(we(V))return!0}return!1}),x=[];for(let d of f){let w=await at(d,n);w.length&&x.push({name:d.name,changes:w})}x.length||(a.info("No updates found."),process.exit(0)),a.info("The following components have updates available:");for(let d of x){a.info(`- ${d.name}`);for(let w of d.changes)a.info(` - ${w.filePath}`)}a.break(),a.info(`Run ${l.success("diff <component>")} to see the changes.`),process.exit(0)}let o=s.find(m=>m.name===r.component);o||(a.error(`The component ${l.success(r.component)} does not exist.`),process.exit(1));let p=await at(o,n);p.length||(a.info(`No updates found for ${r.component}.`),process.exit(0));for(let m of p)a.info(`- ${m.filePath}`),await Fr(m.patch),a.info("")}catch(r){b(r)}});async function at(e,t){let r=await We(t.style,[e]),i=await z(t.tailwind.baseColor);if(!r)return[];let n=[];for(let s of r){let o=await Me(t,s);if(o)for(let p of s.files??[]){let m=xe.resolve(o,typeof p=="string"?p:p.path);if(!we(m))continue;let f=await Or.readFile(m,"utf8");if(typeof p=="string"||!p.content)continue;let x=await Z({filename:p.path,raw:p.content,config:t,baseColor:i}),d=Nr(x,f);d.length>1&&n.push({filePath:m,patch:d})}}return n}async function Fr(e){e.forEach(t=>{if(t)return t.added?process.stdout.write(l.success(t.value)):t.removed?process.stdout.write(l.error(t.value)):process.stdout.write(t.value)})}import{Command as Dr}from"commander";var ct={name:"shadcn",version:"0.0.0-beta.22e84f7",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/cli"},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/registry 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/registry 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 Lr(){let e=new Dr().name("shadcn").description("add components and dependencies to your project").version(ct.version||"1.0.0","-v, --version","display the version number");e.addCommand(it).addCommand(ot).addCommand(lt),e.parse()}Lr();
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/add.ts","../src/commands/init.ts","../src/preflights/preflight-init.ts","../src/utils/errors.ts","../src/utils/get-project-info.ts","../src/utils/frameworks.ts","../src/utils/get-config.ts","../src/utils/highlighter.ts","../src/utils/resolve-import.ts","../src/utils/logger.ts","../src/utils/spinner.ts","../src/utils/handle-error.ts","../src/utils/registry/index.ts","../src/utils/registry/schema.ts","../src/utils/updaters/update-tailwind-config.ts","../src/utils/updaters/update-css-vars.ts","../src/utils/get-package-manager.ts","../src/utils/updaters/update-dependencies.ts","../src/utils/updaters/update-files.ts","../src/utils/transformers/index.ts","../src/utils/transformers/transform-css-vars.ts","../src/utils/transformers/transform-import.ts","../src/utils/transformers/transform-jsx.ts","../src/utils/transformers/transform-rsc.ts","../src/utils/transformers/transform-tw-prefix.ts","../src/utils/add-components.ts","../src/utils/create-project.ts","../src/preflights/preflight-add.ts","../src/commands/diff.ts","../src/index.ts","../package.json"],"sourcesContent":["import path from \"path\"\nimport { runInit } from \"@/src/commands/init\"\nimport { preFlightAdd } from \"@/src/preflights/preflight-add\"\nimport { addComponents } from \"@/src/utils/add-components\"\nimport { createProject } from \"@/src/utils/create-project\"\nimport * as ERRORS from \"@/src/utils/errors\"\nimport { handleError } from \"@/src/utils/handle-error\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport { getRegistryIndex } from \"@/src/utils/registry\"\nimport { Command } from \"commander\"\nimport prompts from \"prompts\"\nimport { z } from \"zod\"\n\nexport const addOptionsSchema = z.object({\n components: z.array(z.string()).optional(),\n yes: z.boolean(),\n overwrite: z.boolean(),\n cwd: z.string(),\n all: z.boolean(),\n path: z.string().optional(),\n silent: z.boolean(),\n})\n\nexport const add = new Command()\n .name(\"add\")\n .description(\"add a component to your project\")\n .argument(\n \"[components...]\",\n \"the components to add or a url to the component.\"\n )\n .option(\"-y, --yes\", \"skip confirmation prompt.\", false)\n .option(\"-o, --overwrite\", \"overwrite existing files.\", false)\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd()\n )\n .option(\"-a, --all\", \"add all available components\", false)\n .option(\"-p, --path <path>\", \"the path to add the component to.\")\n .option(\"-s, --silent\", \"mute output.\", false)\n .action(async (components, opts) => {\n try {\n const options = addOptionsSchema.parse({\n components,\n cwd: path.resolve(opts.cwd),\n ...opts,\n })\n\n // Confirm if user is installing themes.\n // For now, we assume a theme is prefixed with \"theme-\".\n const isTheme = options.components?.some((component) =>\n component.includes(\"theme-\")\n )\n if (!options.yes && isTheme) {\n logger.break()\n const { confirm } = await prompts({\n type: \"confirm\",\n name: \"confirm\",\n message: highlighter.warn(\n \"You are about to install a new theme. \\nExisting CSS variables will be overwritten. Continue?\"\n ),\n })\n if (!confirm) {\n logger.break()\n logger.log(\"Theme installation cancelled.\")\n logger.break()\n process.exit(1)\n }\n }\n\n if (!options.components?.length) {\n options.components = await promptForRegistryComponents(options)\n }\n\n let { errors, config } = await preFlightAdd(options)\n\n // No component.json file. Prompt the user to run init.\n if (errors[ERRORS.MISSING_CONFIG]) {\n const { proceed } = await prompts({\n type: \"confirm\",\n name: \"proceed\",\n message: `You need to create a ${highlighter.info(\n \"component.json\"\n )} file to add components. Proceed?`,\n initial: true,\n })\n\n if (!proceed) {\n logger.break()\n process.exit(1)\n }\n\n config = await runInit({\n cwd: options.cwd,\n yes: true,\n force: true,\n defaults: false,\n skipPreflight: false,\n silent: true,\n isNewProject: false,\n })\n }\n\n if (errors[ERRORS.MISSING_DIR_OR_EMPTY_PROJECT]) {\n const { projectPath } = await createProject({\n cwd: options.cwd,\n force: options.overwrite,\n })\n if (!projectPath) {\n logger.break()\n process.exit(1)\n }\n options.cwd = projectPath\n\n config = await runInit({\n cwd: options.cwd,\n yes: true,\n force: true,\n defaults: false,\n skipPreflight: true,\n silent: true,\n isNewProject: true,\n })\n }\n\n if (!config) {\n throw new Error(\n `Failed to read config at ${highlighter.info(options.cwd)}.`\n )\n }\n\n await addComponents(options.components, config, options)\n } catch (error) {\n logger.break()\n handleError(error)\n }\n })\n\nasync function promptForRegistryComponents(\n options: z.infer<typeof addOptionsSchema>\n) {\n const registryIndex = await getRegistryIndex()\n if (!registryIndex) {\n logger.break()\n handleError(new Error(\"Failed to fetch registry index.\"))\n return []\n }\n\n if (options.all) {\n return registryIndex.map((entry) => entry.name)\n }\n\n if (options.components?.length) {\n return options.components\n }\n\n const { components } = await prompts({\n type: \"multiselect\",\n name: \"components\",\n message: \"Which components would you like to add?\",\n hint: \"Space to select. A to toggle all. Enter to submit.\",\n instructions: false,\n choices: registryIndex\n .filter((entry) => entry.type === \"registry:ui\")\n .map((entry) => ({\n title: entry.name,\n value: entry.name,\n selected: options.all ? true : options.components?.includes(entry.name),\n })),\n })\n\n if (!components?.length) {\n logger.warn(\"No components selected. Exiting.\")\n logger.info(\"\")\n process.exit(1)\n }\n\n const result = z.array(z.string()).safeParse(components)\n if (!result.success) {\n logger.error(\"\")\n handleError(new Error(\"Something went wrong. Please try again.\"))\n return []\n }\n return result.data\n}\n","import { promises as fs } from \"fs\"\nimport path from \"path\"\nimport { preFlightInit } from \"@/src/preflights/preflight-init\"\nimport { addComponents } from \"@/src/utils/add-components\"\nimport { createProject } from \"@/src/utils/create-project\"\nimport * as ERRORS from \"@/src/utils/errors\"\nimport {\n DEFAULT_COMPONENTS,\n DEFAULT_TAILWIND_CONFIG,\n DEFAULT_TAILWIND_CSS,\n DEFAULT_UTILS,\n getConfig,\n rawConfigSchema,\n resolveConfigPaths,\n type Config,\n} from \"@/src/utils/get-config\"\nimport { getProjectConfig, getProjectInfo } from \"@/src/utils/get-project-info\"\nimport { handleError } from \"@/src/utils/handle-error\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport { getRegistryBaseColors, getRegistryStyles } from \"@/src/utils/registry\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport { Command } from \"commander\"\nimport prompts from \"prompts\"\nimport { z } from \"zod\"\n\nexport const initOptionsSchema = z.object({\n cwd: z.string(),\n yes: z.boolean(),\n defaults: z.boolean(),\n force: z.boolean(),\n silent: z.boolean(),\n isNewProject: z.boolean(),\n})\n\nexport const init = new Command()\n .name(\"init\")\n .description(\"initialize your project and install dependencies\")\n .option(\"-y, --yes\", \"skip confirmation prompt.\", true)\n .option(\"-d, --defaults,\", \"use default configuration.\", false)\n .option(\"-f, --force\", \"force overwrite of existing configuration.\", false)\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd()\n )\n .option(\"-s, --silent\", \"mute output.\", false)\n .action(async (opts) => {\n try {\n const options = initOptionsSchema.parse({\n cwd: path.resolve(opts.cwd),\n isNewProject: false,\n ...opts,\n })\n\n await runInit(options)\n\n logger.log(\n `${highlighter.success(\n \"Success!\"\n )} Project initialization completed.\\nYou may now add components.`\n )\n logger.break()\n } catch (error) {\n logger.break()\n handleError(error)\n }\n })\n\nexport async function runInit(\n options: z.infer<typeof initOptionsSchema> & {\n skipPreflight?: boolean\n }\n) {\n let projectInfo\n if (!options.skipPreflight) {\n const preflight = await preFlightInit(options)\n if (preflight.errors[ERRORS.MISSING_DIR_OR_EMPTY_PROJECT]) {\n const { projectPath } = await createProject(options)\n if (!projectPath) {\n process.exit(1)\n }\n options.cwd = projectPath\n options.isNewProject = true\n }\n projectInfo = preflight.projectInfo\n } else {\n projectInfo = await getProjectInfo(options.cwd)\n }\n\n const projectConfig = await getProjectConfig(options.cwd, projectInfo)\n const config = projectConfig\n ? await promptForMinimalConfig(projectConfig, options)\n : await promptForConfig(await getConfig(options.cwd))\n\n if (!options.yes) {\n const { proceed } = await prompts({\n type: \"confirm\",\n name: \"proceed\",\n message: `Write configuration to ${highlighter.info(\n \"components.json\"\n )}. Proceed?`,\n initial: true,\n })\n\n if (!proceed) {\n process.exit(0)\n }\n }\n\n // Write components.json.\n const componentSpinner = spinner(`Writing components.json.`).start()\n const targetPath = path.resolve(options.cwd, \"components.json\")\n await fs.writeFile(targetPath, JSON.stringify(config, null, 2), \"utf8\")\n componentSpinner.succeed()\n\n // Add components.\n const fullConfig = await resolveConfigPaths(options.cwd, config)\n await addComponents([\"index\"], fullConfig, {\n // Init will always overwrite files.\n overwrite: true,\n silent: options.silent,\n isNewProject:\n options.isNewProject || projectInfo?.framework.name === \"next-app\",\n })\n\n return fullConfig\n}\n\nasync function promptForConfig(defaultConfig: Config | null = null) {\n const [styles, baseColors] = await Promise.all([\n getRegistryStyles(),\n getRegistryBaseColors(),\n ])\n\n logger.info(\"\")\n const options = await prompts([\n {\n type: \"toggle\",\n name: \"typescript\",\n message: `Would you like to use ${highlighter.info(\n \"TypeScript\"\n )} (recommended)?`,\n initial: defaultConfig?.tsx ?? true,\n active: \"yes\",\n inactive: \"no\",\n },\n {\n type: \"select\",\n name: \"style\",\n message: `Which ${highlighter.info(\"style\")} would you like to use?`,\n choices: styles.map((style) => ({\n title: style.label,\n value: style.name,\n })),\n },\n {\n type: \"select\",\n name: \"tailwindBaseColor\",\n message: `Which color would you like to use as the ${highlighter.info(\n \"base color\"\n )}?`,\n choices: baseColors.map((color) => ({\n title: color.label,\n value: color.name,\n })),\n },\n {\n type: \"text\",\n name: \"tailwindCss\",\n message: `Where is your ${highlighter.info(\"global CSS\")} file?`,\n initial: defaultConfig?.tailwind.css ?? DEFAULT_TAILWIND_CSS,\n },\n {\n type: \"toggle\",\n name: \"tailwindCssVariables\",\n message: `Would you like to use ${highlighter.info(\n \"CSS variables\"\n )} for theming?`,\n initial: defaultConfig?.tailwind.cssVariables ?? true,\n active: \"yes\",\n inactive: \"no\",\n },\n {\n type: \"text\",\n name: \"tailwindPrefix\",\n message: `Are you using a custom ${highlighter.info(\n \"tailwind prefix eg. tw-\"\n )}? (Leave blank if not)`,\n initial: \"\",\n },\n {\n type: \"text\",\n name: \"tailwindConfig\",\n message: `Where is your ${highlighter.info(\n \"tailwind.config.js\"\n )} located?`,\n initial: defaultConfig?.tailwind.config ?? DEFAULT_TAILWIND_CONFIG,\n },\n {\n type: \"text\",\n name: \"components\",\n message: `Configure the import alias for ${highlighter.info(\n \"components\"\n )}:`,\n initial: defaultConfig?.aliases[\"components\"] ?? DEFAULT_COMPONENTS,\n },\n {\n type: \"text\",\n name: \"utils\",\n message: `Configure the import alias for ${highlighter.info(\"utils\")}:`,\n initial: defaultConfig?.aliases[\"utils\"] ?? DEFAULT_UTILS,\n },\n {\n type: \"toggle\",\n name: \"rsc\",\n message: `Are you using ${highlighter.info(\"React Server Components\")}?`,\n initial: defaultConfig?.rsc ?? true,\n active: \"yes\",\n inactive: \"no\",\n },\n ])\n\n return rawConfigSchema.parse({\n $schema: \"https://ui.shadcn.com/schema.json\",\n style: options.style,\n tailwind: {\n config: options.tailwindConfig,\n css: options.tailwindCss,\n baseColor: options.tailwindBaseColor,\n cssVariables: options.tailwindCssVariables,\n prefix: options.tailwindPrefix,\n },\n rsc: options.rsc,\n tsx: options.typescript,\n aliases: {\n utils: options.utils,\n components: options.components,\n // TODO: fix this.\n lib: options.components.replace(/\\/components$/, \"lib\"),\n hooks: options.components.replace(/\\/components$/, \"hooks\"),\n },\n })\n}\n\nasync function promptForMinimalConfig(\n defaultConfig: Config,\n opts: z.infer<typeof initOptionsSchema>\n) {\n let style = defaultConfig.style\n let baseColor = defaultConfig.tailwind.baseColor\n let cssVariables = defaultConfig.tailwind.cssVariables\n\n if (!opts.defaults) {\n const [styles, baseColors] = await Promise.all([\n getRegistryStyles(),\n getRegistryBaseColors(),\n ])\n\n const options = await prompts([\n {\n type: \"select\",\n name: \"style\",\n message: `Which ${highlighter.info(\"style\")} would you like to use?`,\n choices: styles.map((style) => ({\n title: style.label,\n value: style.name,\n })),\n initial: styles.findIndex((s) => s.name === style),\n },\n {\n type: \"select\",\n name: \"tailwindBaseColor\",\n message: `Which color would you like to use as the ${highlighter.info(\n \"base color\"\n )}?`,\n choices: baseColors.map((color) => ({\n title: color.label,\n value: color.name,\n })),\n },\n {\n type: \"toggle\",\n name: \"tailwindCssVariables\",\n message: `Would you like to use ${highlighter.info(\n \"CSS variables\"\n )} for theming?`,\n initial: defaultConfig?.tailwind.cssVariables,\n active: \"yes\",\n inactive: \"no\",\n },\n ])\n\n style = options.style\n baseColor = options.tailwindBaseColor\n cssVariables = options.tailwindCssVariables\n }\n\n return rawConfigSchema.parse({\n $schema: defaultConfig?.$schema,\n style,\n tailwind: {\n ...defaultConfig?.tailwind,\n baseColor,\n cssVariables,\n },\n rsc: defaultConfig?.rsc,\n tsx: defaultConfig?.tsx,\n aliases: defaultConfig?.aliases,\n })\n}\n","import path from \"path\"\nimport { initOptionsSchema } from \"@/src/commands/init\"\nimport * as ERRORS from \"@/src/utils/errors\"\nimport { getProjectInfo } from \"@/src/utils/get-project-info\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport fs from \"fs-extra\"\nimport { z } from \"zod\"\n\nexport async function preFlightInit(\n options: z.infer<typeof initOptionsSchema>\n) {\n const errors: Record<string, boolean> = {}\n\n // Ensure target directory exists.\n // Check for empty project. We assume if no package.json exists, the project is empty.\n if (\n !fs.existsSync(options.cwd) ||\n !fs.existsSync(path.resolve(options.cwd, \"package.json\"))\n ) {\n errors[ERRORS.MISSING_DIR_OR_EMPTY_PROJECT] = true\n return {\n errors,\n projectInfo: null,\n }\n }\n\n const projectSpinner = spinner(`Preflight checks.`, {\n silent: options.silent,\n }).start()\n\n if (\n fs.existsSync(path.resolve(options.cwd, \"components.json\")) &&\n !options.force\n ) {\n projectSpinner?.fail()\n logger.break()\n logger.error(\n `A ${highlighter.info(\n \"components.json\"\n )} file already exists at ${highlighter.info(\n options.cwd\n )}.\\nTo start over, remove the ${highlighter.info(\n \"components.json\"\n )} file and run ${highlighter.info(\"init\")} again.`\n )\n logger.break()\n process.exit(1)\n }\n\n projectSpinner?.succeed()\n\n const frameworkSpinner = spinner(`Verifying framework.`, {\n silent: options.silent,\n }).start()\n const projectInfo = await getProjectInfo(options.cwd)\n if (!projectInfo || projectInfo?.framework.name === \"manual\") {\n errors[ERRORS.UNSUPPORTED_FRAMEWORK] = true\n frameworkSpinner?.fail()\n logger.break()\n if (projectInfo?.framework.links.installation) {\n logger.error(\n `We could not detect a supported framework at ${highlighter.info(\n options.cwd\n )}.\\n` +\n `Visit ${highlighter.info(\n projectInfo?.framework.links.installation\n )} to manually configure your project.\\nOnce configured, you can use the cli to add components.`\n )\n }\n logger.break()\n process.exit(1)\n }\n frameworkSpinner?.succeed(\n `Verifying framework. Found ${highlighter.info(\n projectInfo.framework.label\n )}.`\n )\n\n const tailwindSpinner = spinner(`Validating Tailwind CSS.`, {\n silent: options.silent,\n }).start()\n if (!projectInfo?.tailwindConfigFile || !projectInfo?.tailwindCssFile) {\n errors[ERRORS.TAILWIND_NOT_CONFIGURED] = true\n tailwindSpinner?.fail()\n } else {\n tailwindSpinner?.succeed()\n }\n\n const tsConfigSpinner = spinner(`Validating import alias.`, {\n silent: options.silent,\n }).start()\n if (!projectInfo?.aliasPrefix) {\n errors[ERRORS.IMPORT_ALIAS_MISSING] = true\n tsConfigSpinner?.fail()\n } else {\n tsConfigSpinner?.succeed()\n }\n\n if (Object.keys(errors).length > 0) {\n if (errors[ERRORS.TAILWIND_NOT_CONFIGURED]) {\n logger.break()\n logger.error(\n `No Tailwind CSS configuration found at ${highlighter.info(\n options.cwd\n )}.`\n )\n logger.error(\n `It is likely you do not have Tailwind CSS installed or have an invalid configuration.`\n )\n logger.error(`Install Tailwind CSS then try again.`)\n if (projectInfo?.framework.links.tailwind) {\n logger.error(\n `Visit ${highlighter.info(\n projectInfo?.framework.links.tailwind\n )} to get started.`\n )\n }\n }\n\n if (errors[ERRORS.IMPORT_ALIAS_MISSING]) {\n logger.break()\n logger.error(`No import alias found in your tsconfig.json file.`)\n if (projectInfo?.framework.links.installation) {\n logger.error(\n `Visit ${highlighter.info(\n projectInfo?.framework.links.installation\n )} to learn how to set an import alias.`\n )\n }\n }\n\n logger.break()\n process.exit(1)\n }\n\n return {\n errors,\n projectInfo,\n }\n}\n","export const MISSING_DIR_OR_EMPTY_PROJECT = \"1\"\nexport const EXISTING_CONFIG = \"2\"\nexport const MISSING_CONFIG = \"3\"\nexport const FAILED_CONFIG_READ = \"4\"\nexport const TAILWIND_NOT_CONFIGURED = \"5\"\nexport const IMPORT_ALIAS_MISSING = \"6\"\nexport const UNSUPPORTED_FRAMEWORK = \"7\"\nexport const COMPONENT_URL_NOT_FOUND = \"8\"\nexport const COMPONENT_URL_UNAUTHORIZED = \"9\"\nexport const COMPONENT_URL_FORBIDDEN = \"10\"\nexport const COMPONENT_URL_BAD_REQUEST = \"11\"\nexport const COMPONENT_URL_INTERNAL_SERVER_ERROR = \"12\"\n","import path from \"path\"\nimport { FRAMEWORKS, Framework } from \"@/src/utils/frameworks\"\nimport {\n Config,\n RawConfig,\n getConfig,\n resolveConfigPaths,\n} from \"@/src/utils/get-config\"\nimport fg from \"fast-glob\"\nimport fs from \"fs-extra\"\nimport { loadConfig } from \"tsconfig-paths\"\n\ntype ProjectInfo = {\n framework: Framework\n isSrcDir: boolean\n isRSC: boolean\n isTsx: boolean\n tailwindConfigFile: string | null\n tailwindCssFile: string | null\n aliasPrefix: string | null\n}\n\nconst PROJECT_SHARED_IGNORE = [\n \"**/node_modules/**\",\n \".next\",\n \"public\",\n \"dist\",\n \"build\",\n]\n\nexport async function getProjectInfo(cwd: string): Promise<ProjectInfo | null> {\n const [\n configFiles,\n isSrcDir,\n isTsx,\n tailwindConfigFile,\n tailwindCssFile,\n aliasPrefix,\n ] = await Promise.all([\n fg.glob(\"**/{next,vite,astro}.config.*|gatsby-config.*|composer.json\", {\n cwd,\n deep: 3,\n ignore: PROJECT_SHARED_IGNORE,\n }),\n fs.pathExists(path.resolve(cwd, \"src\")),\n isTypeScriptProject(cwd),\n getTailwindConfigFile(cwd),\n getTailwindCssFile(cwd),\n getTsConfigAliasPrefix(cwd),\n ])\n\n const isUsingAppDir = await fs.pathExists(\n path.resolve(cwd, `${isSrcDir ? \"src/\" : \"\"}app`)\n )\n\n const type: ProjectInfo = {\n framework: FRAMEWORKS[\"manual\"],\n isSrcDir,\n isRSC: false,\n isTsx,\n tailwindConfigFile,\n tailwindCssFile,\n aliasPrefix,\n }\n\n if (!configFiles.length) {\n return type\n }\n\n // Next.js.\n if (configFiles.find((file) => file.startsWith(\"next.config.\"))?.length) {\n type.framework = isUsingAppDir\n ? FRAMEWORKS[\"next-app\"]\n : FRAMEWORKS[\"next-pages\"]\n type.isRSC = isUsingAppDir\n return type\n }\n\n // Astro.\n if (configFiles.find((file) => file.startsWith(\"astro.config.\"))?.length) {\n type.framework = FRAMEWORKS[\"astro\"]\n return type\n }\n\n // Gatsby.\n if (configFiles.find((file) => file.startsWith(\"gatsby-config.\"))?.length) {\n type.framework = FRAMEWORKS[\"gatsby\"]\n return type\n }\n\n // Laravel.\n if (configFiles.find((file) => file.startsWith(\"composer.json\"))?.length) {\n type.framework = FRAMEWORKS[\"laravel\"]\n return type\n }\n\n // Vite and Remix.\n // They both have a vite.config.* file.\n if (configFiles.find((file) => file.startsWith(\"vite.config.\"))?.length) {\n // We'll assume that if the project has an app dir, it's a Remix project.\n // Otherwise, it's a Vite project.\n // TODO: Maybe check for `@remix-run/react` in package.json?\n type.framework = isUsingAppDir ? FRAMEWORKS[\"remix\"] : FRAMEWORKS[\"vite\"]\n return type\n }\n\n return type\n}\n\nexport async function getTailwindCssFile(cwd: string) {\n const files = await fg.glob(\"**/*.css\", {\n cwd,\n deep: 5,\n ignore: PROJECT_SHARED_IGNORE,\n })\n\n if (!files.length) {\n return null\n }\n\n for (const file of files) {\n const contents = await fs.readFile(path.resolve(cwd, file), \"utf8\")\n // Assume that if the file contains `@tailwind base` it's the main css file.\n if (contents.includes(\"@tailwind base\")) {\n return file\n }\n }\n\n return null\n}\n\nexport async function getTailwindConfigFile(cwd: string) {\n const files = await fg.glob(\"tailwind.config.*\", {\n cwd,\n deep: 3,\n ignore: PROJECT_SHARED_IGNORE,\n })\n\n if (!files.length) {\n return null\n }\n\n return files[0]\n}\n\nexport async function getTsConfigAliasPrefix(cwd: string) {\n const tsConfig = await loadConfig(cwd)\n\n if (tsConfig?.resultType === \"failed\" || !tsConfig?.paths) {\n return null\n }\n\n // This assume that the first alias is the prefix.\n for (const [alias, paths] of Object.entries(tsConfig.paths)) {\n if (\n paths.includes(\"./*\") ||\n paths.includes(\"./src/*\") ||\n paths.includes(\"./app/*\") ||\n paths.includes(\"./resources/js/*\") // Laravel.\n ) {\n return alias.at(0) ?? null\n }\n }\n\n return null\n}\n\nexport async function isTypeScriptProject(cwd: string) {\n const files = await fg.glob(\"tsconfig.*\", {\n cwd,\n deep: 1,\n ignore: PROJECT_SHARED_IGNORE,\n })\n\n return files.length > 0\n}\n\nexport async function getTsConfig() {\n try {\n const tsconfigPath = path.join(\"tsconfig.json\")\n const tsconfig = await fs.readJSON(tsconfigPath)\n\n if (!tsconfig) {\n throw new Error(\"tsconfig.json is missing\")\n }\n\n return tsconfig\n } catch (error) {\n return null\n }\n}\n\nexport async function getProjectConfig(\n cwd: string,\n defaultProjectInfo: ProjectInfo | null = null\n): Promise<Config | null> {\n // Check for existing component config.\n const [existingConfig, projectInfo] = await Promise.all([\n getConfig(cwd),\n !defaultProjectInfo\n ? getProjectInfo(cwd)\n : Promise.resolve(defaultProjectInfo),\n ])\n\n if (existingConfig) {\n return existingConfig\n }\n\n if (\n !projectInfo ||\n !projectInfo.tailwindConfigFile ||\n !projectInfo.tailwindCssFile\n ) {\n return null\n }\n\n const config: RawConfig = {\n $schema: \"https://ui.shadcn.com/schema.json\",\n rsc: projectInfo.isRSC,\n tsx: projectInfo.isTsx,\n style: \"new-york\",\n tailwind: {\n config: projectInfo.tailwindConfigFile,\n baseColor: \"zinc\",\n css: projectInfo.tailwindCssFile,\n cssVariables: true,\n prefix: \"\",\n },\n aliases: {\n components: `${projectInfo.aliasPrefix}/components`,\n ui: `${projectInfo.aliasPrefix}/components/ui`,\n hooks: `${projectInfo.aliasPrefix}/hooks`,\n lib: `${projectInfo.aliasPrefix}/lib`,\n utils: `${projectInfo.aliasPrefix}/lib/utils`,\n },\n }\n\n return await resolveConfigPaths(cwd, config)\n}\n","export const FRAMEWORKS = {\n \"next-app\": {\n name: \"next-app\",\n label: \"Next.js\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/next\",\n tailwind: \"https://tailwindcss.com/docs/guides/nextjs\",\n },\n },\n \"next-pages\": {\n name: \"next-pages\",\n label: \"Next.js\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/next\",\n tailwind: \"https://tailwindcss.com/docs/guides/nextjs\",\n },\n },\n remix: {\n name: \"remix\",\n label: \"Remix\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/remix\",\n tailwind: \"https://tailwindcss.com/docs/guides/remix\",\n },\n },\n vite: {\n name: \"vite\",\n label: \"Vite\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/vite\",\n tailwind: \"https://tailwindcss.com/docs/guides/vite\",\n },\n },\n astro: {\n name: \"astro\",\n label: \"Astro\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/astro\",\n tailwind: \"https://tailwindcss.com/docs/guides/astro\",\n },\n },\n laravel: {\n name: \"laravel\",\n label: \"Laravel\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/laravel\",\n tailwind: \"https://tailwindcss.com/docs/guides/laravel\",\n },\n },\n gatsby: {\n name: \"gatsby\",\n label: \"Gatsby\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/gatsby\",\n tailwind: \"https://tailwindcss.com/docs/guides/gatsby\",\n },\n },\n manual: {\n name: \"manual\",\n label: \"Manual\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/manual\",\n tailwind: \"https://tailwindcss.com/docs/installation\",\n },\n },\n} as const\n\nexport type Framework = (typeof FRAMEWORKS)[keyof typeof FRAMEWORKS]\n","import path from \"path\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { resolveImport } from \"@/src/utils/resolve-import\"\nimport { cosmiconfig } from \"cosmiconfig\"\nimport { loadConfig } from \"tsconfig-paths\"\nimport { z } from \"zod\"\n\nexport const DEFAULT_STYLE = \"default\"\nexport const DEFAULT_COMPONENTS = \"@/components\"\nexport const DEFAULT_UTILS = \"@/lib/utils\"\nexport const DEFAULT_TAILWIND_CSS = \"app/globals.css\"\nexport const DEFAULT_TAILWIND_CONFIG = \"tailwind.config.js\"\nexport const DEFAULT_TAILWIND_BASE_COLOR = \"slate\"\n\n// TODO: Figure out if we want to support all cosmiconfig formats.\n// A simple components.json file would be nice.\nconst explorer = cosmiconfig(\"components\", {\n searchPlaces: [\"components.json\"],\n})\n\nexport const rawConfigSchema = z\n .object({\n $schema: z.string().optional(),\n style: z.string(),\n rsc: z.coerce.boolean().default(false),\n tsx: z.coerce.boolean().default(true),\n tailwind: z.object({\n config: z.string(),\n css: z.string(),\n baseColor: z.string(),\n cssVariables: z.boolean().default(true),\n prefix: z.string().default(\"\").optional(),\n }),\n aliases: z.object({\n components: z.string(),\n utils: z.string(),\n ui: z.string().optional(),\n lib: z.string().optional(),\n hooks: z.string().optional(),\n }),\n })\n .strict()\n\nexport type RawConfig = z.infer<typeof rawConfigSchema>\n\nexport const configSchema = rawConfigSchema.extend({\n resolvedPaths: z.object({\n cwd: z.string(),\n tailwindConfig: z.string(),\n tailwindCss: z.string(),\n utils: z.string(),\n components: z.string(),\n lib: z.string(),\n hooks: z.string(),\n ui: z.string(),\n }),\n})\n\nexport type Config = z.infer<typeof configSchema>\n\nexport async function getConfig(cwd: string) {\n const config = await getRawConfig(cwd)\n\n if (!config) {\n return null\n }\n\n return await resolveConfigPaths(cwd, config)\n}\n\nexport async function resolveConfigPaths(cwd: string, config: RawConfig) {\n // Read tsconfig.json.\n const tsConfig = await loadConfig(cwd)\n\n if (tsConfig.resultType === \"failed\") {\n throw new Error(\n `Failed to load ${config.tsx ? \"tsconfig\" : \"jsconfig\"}.json. ${\n tsConfig.message ?? \"\"\n }`.trim()\n )\n }\n\n return configSchema.parse({\n ...config,\n resolvedPaths: {\n cwd,\n tailwindConfig: path.resolve(cwd, config.tailwind.config),\n tailwindCss: path.resolve(cwd, config.tailwind.css),\n utils: await resolveImport(config.aliases[\"utils\"], tsConfig),\n components: await resolveImport(config.aliases[\"components\"], tsConfig),\n ui: config.aliases[\"ui\"]\n ? await resolveImport(config.aliases[\"ui\"], tsConfig)\n : path.resolve(\n (await resolveImport(config.aliases[\"components\"], tsConfig)) ??\n cwd,\n \"ui\"\n ),\n // TODO: Make this configurable.\n // For now, we assume the lib and hooks directories are one level up from the components directory.\n lib: config.aliases[\"lib\"]\n ? await resolveImport(config.aliases[\"lib\"], tsConfig)\n : path.resolve(\n (await resolveImport(config.aliases[\"utils\"], tsConfig)) ?? cwd,\n \"..\"\n ),\n hooks: config.aliases[\"hooks\"]\n ? await resolveImport(config.aliases[\"hooks\"], tsConfig)\n : path.resolve(\n (await resolveImport(config.aliases[\"components\"], tsConfig)) ??\n cwd,\n \"..\",\n \"hooks\"\n ),\n },\n })\n}\n\nexport async function getRawConfig(cwd: string): Promise<RawConfig | null> {\n try {\n const configResult = await explorer.search(cwd)\n\n if (!configResult) {\n return null\n }\n\n return rawConfigSchema.parse(configResult.config)\n } catch (error) {\n const componentPath = `${cwd}/component.json`\n throw new Error(\n `Invalid configuration found in ${highlighter.info(componentPath)}.`\n )\n }\n}\n","import { cyan, green, red, yellow } from \"kleur/colors\"\n\nexport const highlighter = {\n error: red,\n warn: yellow,\n info: cyan,\n success: green,\n}\n","import { createMatchPath, type ConfigLoaderSuccessResult } from \"tsconfig-paths\"\n\nexport async function resolveImport(\n importPath: string,\n config: Pick<ConfigLoaderSuccessResult, \"absoluteBaseUrl\" | \"paths\">\n) {\n return createMatchPath(config.absoluteBaseUrl, config.paths)(\n importPath,\n undefined,\n () => true,\n [\".ts\", \".tsx\"]\n )\n}\n","import { highlighter } from \"@/src/utils/highlighter\"\n\nexport const logger = {\n error(...args: unknown[]) {\n console.log(highlighter.error(args.join(\" \")))\n },\n warn(...args: unknown[]) {\n console.log(highlighter.warn(args.join(\" \")))\n },\n info(...args: unknown[]) {\n console.log(highlighter.info(args.join(\" \")))\n },\n success(...args: unknown[]) {\n console.log(highlighter.success(args.join(\" \")))\n },\n log(...args: unknown[]) {\n console.log(args.join(\" \"))\n },\n break() {\n console.log(\"\")\n },\n}\n","import ora, { type Options } from \"ora\"\n\nexport function spinner(\n text: Options[\"text\"],\n options?: {\n silent?: boolean\n }\n) {\n return ora({\n text,\n isSilent: options?.silent,\n })\n}\n","import { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport { z } from \"zod\"\n\nexport function handleError(error: unknown) {\n logger.error(\n `Something went wrong. Please check the error below for more details.`\n )\n logger.error(`If the problem persists, please open an issue on GitHub.`)\n logger.error(\"\")\n if (typeof error === \"string\") {\n logger.error(error)\n logger.break()\n process.exit(1)\n }\n\n if (error instanceof z.ZodError) {\n logger.error(\"Validation failed:\")\n for (const [key, value] of Object.entries(error.flatten().fieldErrors)) {\n logger.error(`- ${highlighter.info(key)}: ${value}`)\n }\n logger.break()\n process.exit(1)\n }\n\n if (error instanceof Error) {\n logger.error(error.message)\n logger.break()\n process.exit(1)\n }\n\n logger.break()\n process.exit(1)\n}\n","import path from \"path\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { handleError } from \"@/src/utils/handle-error\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport {\n registryBaseColorSchema,\n registryIndexSchema,\n registryItemFileSchema,\n registryItemSchema,\n registryResolvedItemsTreeSchema,\n stylesSchema,\n} from \"@/src/utils/registry/schema\"\nimport { buildTailwindThemeColorsFromCssVars } from \"@/src/utils/updaters/update-tailwind-config\"\nimport deepmerge from \"deepmerge\"\nimport { HttpsProxyAgent } from \"https-proxy-agent\"\nimport fetch from \"node-fetch\"\nimport { z } from \"zod\"\n\nconst REGISTRY_URL =\n process.env.REGISTRY_URL ?? \"https://ui.shadcn.com/registry\"\n\nconst agent = process.env.https_proxy\n ? new HttpsProxyAgent(process.env.https_proxy)\n : undefined\n\nexport async function getRegistryIndex() {\n try {\n const [result] = await fetchRegistry([\"index.json\"])\n\n return registryIndexSchema.parse(result)\n } catch (error) {\n logger.error(\"\\n\")\n handleError(error)\n }\n}\n\nexport async function getRegistryStyles() {\n try {\n const [result] = await fetchRegistry([\"styles/index.json\"])\n\n return stylesSchema.parse(result)\n } catch (error) {\n logger.error(\"\\n\")\n handleError(error)\n return []\n }\n}\n\nexport async function getRegistryItem(name: string, style: string) {\n try {\n const [result] = await fetchRegistry([\n isUrl(name) ? name : `styles/${style}/${name}.json`,\n ])\n\n return registryItemSchema.parse(result)\n } catch (error) {\n logger.break()\n handleError(error)\n return null\n }\n}\n\nexport async function getRegistryBaseColors() {\n return [\n {\n name: \"neutral\",\n label: \"Neutral\",\n },\n {\n name: \"gray\",\n label: \"Gray\",\n },\n {\n name: \"zinc\",\n label: \"Zinc\",\n },\n {\n name: \"stone\",\n label: \"Stone\",\n },\n {\n name: \"slate\",\n label: \"Slate\",\n },\n ]\n}\n\nexport async function getRegistryBaseColor(baseColor: string) {\n try {\n const [result] = await fetchRegistry([`colors/${baseColor}.json`])\n\n return registryBaseColorSchema.parse(result)\n } catch (error) {\n handleError(error)\n }\n}\n\nexport async function resolveTree(\n index: z.infer<typeof registryIndexSchema>,\n names: string[]\n) {\n const tree: z.infer<typeof registryIndexSchema> = []\n\n for (const name of names) {\n const entry = index.find((entry) => entry.name === name)\n\n if (!entry) {\n continue\n }\n\n tree.push(entry)\n\n if (entry.registryDependencies) {\n const dependencies = await resolveTree(index, entry.registryDependencies)\n tree.push(...dependencies)\n }\n }\n\n return tree.filter(\n (component, index, self) =>\n self.findIndex((c) => c.name === component.name) === index\n )\n}\n\nexport async function fetchTree(\n style: string,\n tree: z.infer<typeof registryIndexSchema>\n) {\n try {\n const paths = tree.map((item) => `styles/${style}/${item.name}.json`)\n const result = await fetchRegistry(paths)\n return registryIndexSchema.parse(result)\n } catch (error) {\n handleError(error)\n }\n}\n\nexport async function getItemTargetPath(\n config: Config,\n item: Pick<z.infer<typeof registryItemSchema>, \"type\">,\n override?: string\n) {\n if (override) {\n return override\n }\n\n if (item.type === \"registry:ui\") {\n return config.resolvedPaths.ui ?? config.resolvedPaths.components\n }\n\n const [parent, type] = item.type?.split(\":\") ?? []\n if (!(parent in config.resolvedPaths)) {\n return null\n }\n\n return path.join(\n config.resolvedPaths[parent as keyof typeof config.resolvedPaths],\n type\n )\n}\n\nasync function fetchRegistry(paths: string[]) {\n try {\n const results = await Promise.all(\n paths.map(async (path) => {\n const url = getRegistryUrl(path)\n const response = await fetch(url, { agent })\n\n if (!response.ok) {\n const errorMessages: { [key: number]: string } = {\n 400: \"Bad request\",\n 401: \"Unauthorized\",\n 403: \"Forbidden\",\n 404: \"Not found\",\n 500: \"Internal server error\",\n }\n const message = response.statusText || errorMessages[response.status]\n throw new Error(\n `Failed to fetch from ${highlighter.info(url)}. ${message}.`\n )\n }\n\n return response.json()\n })\n )\n\n return results\n } catch (error) {\n logger.error(\"\\n\")\n handleError(error)\n return []\n }\n}\n\nexport function getRegistryItemFileTargetPath(\n file: z.infer<typeof registryItemFileSchema>,\n config: Config,\n override?: string\n) {\n if (override) {\n return override\n }\n\n if (file.type === \"registry:ui\") {\n return config.resolvedPaths.ui\n }\n\n if (file.type === \"registry:lib\") {\n return config.resolvedPaths.lib\n }\n\n if (file.type === \"registry:block\" || file.type === \"registry:component\") {\n return config.resolvedPaths.components\n }\n\n if (file.type === \"registry:hook\") {\n return config.resolvedPaths.hooks\n }\n\n // TODO: we put this in components for now.\n // We should move this to pages as per framework.\n if (file.type === \"registry:page\") {\n return config.resolvedPaths.components\n }\n\n return config.resolvedPaths.components\n}\n\nexport async function registryResolveItemsTree(\n names: z.infer<typeof registryItemSchema>[\"name\"][],\n config: Config\n) {\n try {\n const index = await getRegistryIndex()\n if (!index) {\n return null\n }\n\n let items = (\n await Promise.all(\n names.map(async (name) => {\n const item = await getRegistryItem(name, config.style)\n return item\n })\n )\n ).filter((item): item is NonNullable<typeof item> => item !== null)\n\n if (!items.length) {\n return null\n }\n\n const registryDependencies: string[] = items\n .map((item) => item.registryDependencies ?? [])\n .flat()\n\n const uniqueDependencies = Array.from(new Set(registryDependencies))\n const urls = Array.from([...names, ...uniqueDependencies]).map((name) =>\n getRegistryUrl(isUrl(name) ? name : `styles/${config.style}/${name}.json`)\n )\n let result = await fetchRegistry(urls)\n const payload = z.array(registryItemSchema).parse(result)\n\n if (!payload) {\n return null\n }\n\n // If we're resolving the index, we want it to go first.\n if (names.includes(\"index\")) {\n const index = await getRegistryItem(\"index\", config.style)\n if (index) {\n payload.unshift(index)\n }\n\n // Fetch the theme item if a base color is provided.\n // We do this for index only.\n // Other components will ship with their theme tokens.\n if (config.tailwind.baseColor) {\n const theme = await registryGetTheme(config.tailwind.baseColor, config)\n if (theme) {\n payload.unshift(theme)\n }\n }\n }\n\n let tailwind = {}\n payload.forEach((item) => {\n tailwind = deepmerge(tailwind, item.tailwind ?? {})\n })\n\n let cssVars = {}\n payload.forEach((item) => {\n cssVars = deepmerge(cssVars, item.cssVars ?? {})\n })\n\n return registryResolvedItemsTreeSchema.parse({\n dependencies: deepmerge.all(\n payload.map((item) => item.dependencies ?? [])\n ),\n devDependencies: deepmerge.all(\n payload.map((item) => item.devDependencies ?? [])\n ),\n files: deepmerge.all(payload.map((item) => item.files ?? [])),\n tailwind,\n cssVars,\n })\n } catch (error) {\n handleError(error)\n return null\n }\n}\n\nexport async function registryGetTheme(name: string, config: Config) {\n const baseColor = await getRegistryBaseColor(name)\n if (!baseColor) {\n return null\n }\n\n // TODO: Move this to the registry i.e registry:theme.\n const theme = {\n name,\n type: \"registry:theme\",\n tailwind: {\n config: {\n theme: {\n extend: {\n borderRadius: {\n lg: \"var(--radius)\",\n md: \"calc(var(--radius) - 2px)\",\n sm: \"calc(var(--radius) - 4px)\",\n },\n colors: {},\n },\n },\n },\n },\n cssVars: {\n light: {\n radius: \"0.5rem\",\n },\n dark: {},\n },\n } satisfies z.infer<typeof registryItemSchema>\n\n if (config.tailwind.cssVariables) {\n theme.tailwind.config.theme.extend.colors = {\n ...theme.tailwind.config.theme.extend.colors,\n ...buildTailwindThemeColorsFromCssVars(baseColor.cssVars.dark),\n }\n theme.cssVars = {\n light: {\n ...baseColor.cssVars.light,\n ...theme.cssVars.light,\n },\n dark: {\n ...baseColor.cssVars.dark,\n ...theme.cssVars.dark,\n },\n }\n }\n\n return theme\n}\n\nfunction getRegistryUrl(path: string) {\n if (isUrl(path)) {\n return path\n }\n\n return `${REGISTRY_URL}/${path}`\n}\n\nfunction isUrl(path: string) {\n try {\n new URL(path)\n return true\n } catch (error) {\n return false\n }\n}\n","import { z } from \"zod\"\n\n// TODO: Extract this to a shared package.\nexport const registryItemTypeSchema = z.enum([\n \"registry:style\",\n \"registry:lib\",\n \"registry:example\",\n \"registry:block\",\n \"registry:component\",\n \"registry:ui\",\n \"registry:hook\",\n \"registry:theme\",\n \"registry:page\",\n])\n\nexport const registryItemFileSchema = z.object({\n path: z.string(),\n content: z.string().optional(),\n type: registryItemTypeSchema,\n target: z.string().optional(),\n})\n\nexport const registryItemTailwindSchema = z.object({\n config: z\n .object({\n content: z.array(z.string()).optional(),\n theme: z.record(z.string(), z.any()).optional(),\n plugins: z.array(z.string()).optional(),\n })\n .optional(),\n})\n\nexport const registryItemCssVarsSchema = z.object({\n light: z.record(z.string(), z.string()).optional(),\n dark: z.record(z.string(), z.string()).optional(),\n})\n\nexport const registryItemSchema = z.object({\n name: z.string(),\n type: registryItemTypeSchema,\n description: z.string().optional(),\n dependencies: z.array(z.string()).optional(),\n devDependencies: z.array(z.string()).optional(),\n registryDependencies: z.array(z.string()).optional(),\n files: z.array(registryItemFileSchema).optional(),\n tailwind: registryItemTailwindSchema.optional(),\n cssVars: registryItemCssVarsSchema.optional(),\n})\n\nexport type RegistryItem = z.infer<typeof registryItemSchema>\n\nexport const registryIndexSchema = z.array(\n registryItemSchema.extend({\n files: z.array(z.union([z.string(), registryItemFileSchema])).optional(),\n })\n)\n\nexport const stylesSchema = z.array(\n z.object({\n name: z.string(),\n label: z.string(),\n })\n)\n\nexport const registryBaseColorSchema = z.object({\n inlineColors: z.object({\n light: z.record(z.string(), z.string()),\n dark: z.record(z.string(), z.string()),\n }),\n cssVars: z.object({\n light: z.record(z.string(), z.string()),\n dark: z.record(z.string(), z.string()),\n }),\n inlineColorsTemplate: z.string(),\n cssVarsTemplate: z.string(),\n})\n\nexport const registryResolvedItemsTreeSchema = registryItemSchema.pick({\n dependencies: true,\n devDependencies: true,\n files: true,\n tailwind: true,\n cssVars: true,\n})\n","import { promises as fs } from \"fs\"\nimport { tmpdir } from \"os\"\nimport path from \"path\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { registryItemTailwindSchema } from \"@/src/utils/registry/schema\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport deepmerge from \"deepmerge\"\nimport objectToString from \"stringify-object\"\nimport { type Config as TailwindConfig } from \"tailwindcss\"\nimport {\n ObjectLiteralExpression,\n Project,\n PropertyAssignment,\n QuoteKind,\n ScriptKind,\n SyntaxKind,\n VariableStatement,\n} from \"ts-morph\"\nimport { z } from \"zod\"\n\nexport type UpdaterTailwindConfig = Omit<TailwindConfig, \"plugins\"> & {\n // We only want string plugins for now.\n plugins?: string[]\n}\n\nexport async function updateTailwindConfig(\n tailwindConfig:\n | z.infer<typeof registryItemTailwindSchema>[\"config\"]\n | undefined,\n config: Config,\n options: {\n silent?: boolean\n }\n) {\n if (!tailwindConfig) {\n return\n }\n\n options = {\n silent: false,\n ...options,\n }\n\n const tailwindFileRelativePath = path.relative(\n config.resolvedPaths.cwd,\n config.resolvedPaths.tailwindConfig\n )\n const tailwindSpinner = spinner(\n `Updating ${highlighter.info(tailwindFileRelativePath)}`,\n {\n silent: options.silent,\n }\n ).start()\n const raw = await fs.readFile(config.resolvedPaths.tailwindConfig, \"utf8\")\n const output = await transformTailwindConfig(raw, tailwindConfig, config)\n await fs.writeFile(config.resolvedPaths.tailwindConfig, output, \"utf8\")\n tailwindSpinner?.succeed()\n}\n\nexport async function transformTailwindConfig(\n input: string,\n tailwindConfig: UpdaterTailwindConfig,\n config: Config\n) {\n const sourceFile = await _createSourceFile(input, config)\n // Find the object with content property.\n // This is faster than traversing the default export.\n // TODO: maybe we do need to traverse the default export?\n const configObject = sourceFile\n .getDescendantsOfKind(SyntaxKind.ObjectLiteralExpression)\n .find((node) =>\n node\n .getProperties()\n .some(\n (property) =>\n property.isKind(SyntaxKind.PropertyAssignment) &&\n property.getName() === \"content\"\n )\n )\n\n // We couldn't find the config object, so we return the input as is.\n if (!configObject) {\n return input\n }\n\n const quoteChar = _getQuoteChar(configObject)\n\n // Add darkMode.\n addTailwindConfigProperty(\n configObject,\n {\n name: \"darkMode\",\n value: \"class\",\n },\n { quoteChar }\n )\n\n // Add Tailwind config plugins.\n tailwindConfig.plugins?.forEach((plugin) => {\n addTailwindConfigPlugin(configObject, plugin)\n })\n\n // Add Tailwind config theme.\n if (tailwindConfig.theme) {\n await addTailwindConfigTheme(configObject, tailwindConfig.theme)\n }\n\n return sourceFile.getFullText()\n}\n\nfunction addTailwindConfigProperty(\n configObject: ObjectLiteralExpression,\n property: {\n name: string\n value: string\n },\n {\n quoteChar,\n }: {\n quoteChar: string\n }\n) {\n const existingProperty = configObject.getProperty(\"darkMode\")\n\n if (!existingProperty) {\n const newProperty = {\n name: property.name,\n initializer: `[${quoteChar}${property.value}${quoteChar}]`,\n }\n\n // We need to add darkMode as the first property.\n if (property.name === \"darkMode\") {\n configObject.insertPropertyAssignment(0, newProperty)\n return configObject\n }\n\n configObject.addPropertyAssignment(newProperty)\n\n return configObject\n }\n\n if (existingProperty.isKind(SyntaxKind.PropertyAssignment)) {\n const initializer = existingProperty.getInitializer()\n const newValue = `${quoteChar}${property.value}${quoteChar}`\n\n // If property is a string, change it to an array and append.\n if (initializer?.isKind(SyntaxKind.StringLiteral)) {\n const initializerText = initializer.getText()\n initializer.replaceWithText(`[${initializerText}, ${newValue}]`)\n return configObject\n }\n\n // If property is an array, append.\n if (initializer?.isKind(SyntaxKind.ArrayLiteralExpression)) {\n // Check if the array already contains the value.\n if (\n initializer\n .getElements()\n .map((element) => element.getText())\n .includes(newValue)\n ) {\n return configObject\n }\n initializer.addElement(newValue)\n }\n\n return configObject\n }\n\n return configObject\n}\n\nasync function addTailwindConfigTheme(\n configObject: ObjectLiteralExpression,\n theme: UpdaterTailwindConfig[\"theme\"]\n) {\n // Ensure there is a theme property.\n if (!configObject.getProperty(\"theme\")) {\n configObject.addPropertyAssignment({\n name: \"theme\",\n initializer: \"{}\",\n })\n }\n\n // Nest all spread properties.\n nestSpreadProperties(configObject)\n\n const themeProperty = configObject\n .getPropertyOrThrow(\"theme\")\n ?.asKindOrThrow(SyntaxKind.PropertyAssignment)\n\n const themeInitializer = themeProperty.getInitializer()\n if (themeInitializer?.isKind(SyntaxKind.ObjectLiteralExpression)) {\n const themeObjectString = themeInitializer.getText()\n const themeObject = await parseObjectLiteral(themeObjectString)\n const result = deepmerge(themeObject, theme)\n const resultString = objectToString(result)\n .replace(/\\'\\\"/g, \"'\")\n .replace(/\\\"\\'/g, \"'\")\n .replace(/\\'\\[/g, \"[\")\n .replace(/\\]\\'/g, \"]\")\n .replace(/\\\\\\'/g, \"\")\n .replace(/\\\\\\'/g, \"\")\n themeInitializer.replaceWithText(resultString)\n }\n\n // Unnest all spread properties.\n unnestSpreadProperties(configObject)\n}\n\nfunction addTailwindConfigPlugin(\n configObject: ObjectLiteralExpression,\n plugin: string\n) {\n const existingPlugins = configObject.getProperty(\"plugins\")\n\n if (!existingPlugins) {\n configObject.addPropertyAssignment({\n name: \"plugins\",\n initializer: `[${plugin}]`,\n })\n\n return configObject\n }\n\n if (existingPlugins.isKind(SyntaxKind.PropertyAssignment)) {\n const initializer = existingPlugins.getInitializer()\n\n if (initializer?.isKind(SyntaxKind.ArrayLiteralExpression)) {\n if (\n initializer\n .getElements()\n .map((element) => {\n return element.getText().replace(/[\"']/g, \"\")\n })\n .includes(plugin.replace(/[\"']/g, \"\"))\n ) {\n return configObject\n }\n initializer.addElement(plugin)\n }\n\n return configObject\n }\n\n return configObject\n}\n\nasync function _createSourceFile(input: string, config: Config | null) {\n const dir = await fs.mkdtemp(path.join(tmpdir(), \"shadcn-\"))\n const resolvedPath =\n config?.resolvedPaths?.tailwindConfig || \"tailwind.config.ts\"\n const tempFile = path.join(dir, `shadcn-${path.basename(resolvedPath)}`)\n\n const project = new Project({\n compilerOptions: {},\n })\n const sourceFile = project.createSourceFile(tempFile, input, {\n // Note: .js and .mjs can still be valid for TS projects.\n // We can't infer TypeScript from config.tsx.\n scriptKind:\n path.extname(resolvedPath) === \".ts\" ? ScriptKind.TS : ScriptKind.JS,\n })\n\n return sourceFile\n}\n\nfunction _getQuoteChar(configObject: ObjectLiteralExpression) {\n return configObject\n .getFirstDescendantByKind(SyntaxKind.StringLiteral)\n ?.getQuoteKind() === QuoteKind.Single\n ? \"'\"\n : '\"'\n}\n\nexport function nestSpreadProperties(obj: ObjectLiteralExpression) {\n const properties = obj.getProperties()\n\n for (let i = 0; i < properties.length; i++) {\n const prop = properties[i]\n if (prop.isKind(SyntaxKind.SpreadAssignment)) {\n const spreadAssignment = prop.asKindOrThrow(SyntaxKind.SpreadAssignment)\n const spreadText = spreadAssignment.getExpression().getText()\n\n // Replace spread with a property assignment\n obj.insertPropertyAssignment(i, {\n name: `___${spreadText.replace(/^\\.\\.\\./, \"\")}`,\n initializer: `\"...${spreadText.replace(/^\\.\\.\\./, \"\")}\"`,\n })\n\n // Remove the original spread assignment\n spreadAssignment.remove()\n } else if (prop.isKind(SyntaxKind.PropertyAssignment)) {\n const propAssignment = prop.asKindOrThrow(SyntaxKind.PropertyAssignment)\n const initializer = propAssignment.getInitializer()\n\n if (\n initializer &&\n initializer.isKind(SyntaxKind.ObjectLiteralExpression)\n ) {\n // Recursively process nested object literals\n nestSpreadProperties(\n initializer.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n )\n }\n }\n }\n}\n\nexport function unnestSpreadProperties(obj: ObjectLiteralExpression) {\n const properties = obj.getProperties()\n\n for (let i = 0; i < properties.length; i++) {\n const prop = properties[i]\n if (prop.isKind(SyntaxKind.PropertyAssignment)) {\n const propAssignment = prop as PropertyAssignment\n const initializer = propAssignment.getInitializer()\n\n if (initializer?.isKind(SyntaxKind.StringLiteral)) {\n const value = initializer.getLiteralValue()\n if (value.startsWith(\"...\")) {\n obj.insertSpreadAssignment(i, { expression: value.slice(3) })\n propAssignment.remove()\n }\n } else if (initializer?.isKind(SyntaxKind.ObjectLiteralExpression)) {\n unnestSpreadProperties(initializer as ObjectLiteralExpression)\n }\n }\n }\n}\n\nasync function parseObjectLiteral(objectLiteralString: string): Promise<any> {\n const sourceFile = await _createSourceFile(\n `const theme = ${objectLiteralString}`,\n null\n )\n\n const statement = sourceFile.getStatements()[0]\n if (statement?.getKind() === SyntaxKind.VariableStatement) {\n const declaration = (statement as VariableStatement)\n .getDeclarationList()\n ?.getDeclarations()[0]\n const initializer = declaration.getInitializer()\n if (initializer?.isKind(SyntaxKind.ObjectLiteralExpression)) {\n return await parseObjectLiteralExpression(initializer)\n }\n }\n\n throw new Error(\"Invalid input: not an object literal\")\n}\n\nfunction parseObjectLiteralExpression(node: ObjectLiteralExpression): any {\n const result: any = {}\n for (const property of node.getProperties()) {\n if (property.isKind(SyntaxKind.PropertyAssignment)) {\n const name = property.getName().replace(/\\'/g, \"\")\n if (\n property.getInitializer()?.isKind(SyntaxKind.ObjectLiteralExpression)\n ) {\n result[name] = parseObjectLiteralExpression(\n property.getInitializer() as ObjectLiteralExpression\n )\n } else {\n result[name] = parseValue(property.getInitializer())\n }\n }\n }\n return result\n}\n\nfunction parseValue(node: any): any {\n switch (node.kind) {\n case SyntaxKind.StringLiteral:\n return node.text\n case SyntaxKind.NumericLiteral:\n return Number(node.text)\n case SyntaxKind.TrueKeyword:\n return true\n case SyntaxKind.FalseKeyword:\n return false\n case SyntaxKind.NullKeyword:\n return null\n case SyntaxKind.ArrayLiteralExpression:\n return node.elements.map(parseValue)\n default:\n return node.getText()\n }\n}\n\nexport function buildTailwindThemeColorsFromCssVars(\n cssVars: Record<string, string>\n) {\n const result: Record<string, any> = {}\n\n for (const key of Object.keys(cssVars)) {\n const parts = key.split(\"-\")\n const colorName = parts[0]\n const subType = parts.slice(1).join(\"-\")\n\n if (subType === \"\") {\n if (typeof result[colorName] === \"object\") {\n result[colorName].DEFAULT = `hsl(var(--${key}))`\n } else {\n result[colorName] = `hsl(var(--${key}))`\n }\n } else {\n if (typeof result[colorName] !== \"object\") {\n result[colorName] = { DEFAULT: `hsl(var(--${colorName}))` }\n }\n result[colorName][subType] = `hsl(var(--${key}))`\n }\n }\n\n // Remove DEFAULT if it's not in the original cssVars\n for (const [colorName, value] of Object.entries(result)) {\n if (\n typeof value === \"object\" &&\n value.DEFAULT === `hsl(var(--${colorName}))` &&\n !(colorName in cssVars)\n ) {\n delete value.DEFAULT\n }\n }\n\n return result\n}\n","import { promises as fs } from \"fs\"\nimport path from \"path\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { registryItemCssVarsSchema } from \"@/src/utils/registry/schema\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport postcss from \"postcss\"\nimport AtRule from \"postcss/lib/at-rule\"\nimport Root from \"postcss/lib/root\"\nimport Rule from \"postcss/lib/rule\"\nimport { z } from \"zod\"\n\nexport async function updateCssVars(\n cssVars: z.infer<typeof registryItemCssVarsSchema> | undefined,\n config: Config,\n options: {\n cleanupDefaultNextStyles?: boolean\n silent?: boolean\n }\n) {\n if (\n !cssVars ||\n !Object.keys(cssVars).length ||\n !config.resolvedPaths.tailwindCss\n ) {\n return\n }\n\n options = {\n cleanupDefaultNextStyles: false,\n silent: false,\n ...options,\n }\n const cssFilepath = config.resolvedPaths.tailwindCss\n const cssFilepathRelative = path.relative(\n config.resolvedPaths.cwd,\n cssFilepath\n )\n const cssVarsSpinner = spinner(\n `Updating ${highlighter.info(cssFilepathRelative)}`,\n {\n silent: options.silent,\n }\n ).start()\n const raw = await fs.readFile(cssFilepath, \"utf8\")\n let output = await transformCssVars(raw, cssVars, config, {\n cleanupDefaultNextStyles: options.cleanupDefaultNextStyles,\n })\n await fs.writeFile(cssFilepath, output, \"utf8\")\n cssVarsSpinner.succeed()\n}\n\nexport async function transformCssVars(\n input: string,\n cssVars: z.infer<typeof registryItemCssVarsSchema>,\n config: Config,\n options: {\n cleanupDefaultNextStyles?: boolean\n }\n) {\n options = {\n cleanupDefaultNextStyles: false,\n ...options,\n }\n\n const plugins = [updateCssVarsPlugin(cssVars)]\n if (options.cleanupDefaultNextStyles) {\n plugins.push(cleanupDefaultNextStylesPlugin())\n }\n\n // Only add the base layer plugin if we're using css variables.\n if (config.tailwind.cssVariables) {\n plugins.push(updateBaseLayerPlugin())\n }\n\n const result = await postcss(plugins).process(input, {\n from: undefined,\n })\n\n return result.css\n}\n\nfunction updateBaseLayerPlugin() {\n return {\n postcssPlugin: \"update-base-layer\",\n Once(root: Root) {\n const requiredRules = [\n { selector: \"*\", apply: \"border-border\" },\n { selector: \"body\", apply: \"bg-background text-foreground\" },\n ]\n\n let baseLayer = root.nodes.find(\n (node): node is AtRule =>\n node.type === \"atrule\" &&\n node.name === \"layer\" &&\n node.params === \"base\" &&\n requiredRules.every(({ selector, apply }) =>\n node.nodes?.some(\n (rule): rule is Rule =>\n rule.type === \"rule\" &&\n rule.selector === selector &&\n rule.nodes.some(\n (applyRule): applyRule is AtRule =>\n applyRule.type === \"atrule\" &&\n applyRule.name === \"apply\" &&\n applyRule.params === apply\n )\n )\n )\n ) as AtRule | undefined\n\n if (!baseLayer) {\n baseLayer = postcss.atRule({\n name: \"layer\",\n params: \"base\",\n raws: { semicolon: true, between: \" \", before: \"\\n\" },\n })\n root.append(baseLayer)\n }\n\n requiredRules.forEach(({ selector, apply }) => {\n const existingRule = baseLayer?.nodes?.find(\n (node): node is Rule =>\n node.type === \"rule\" && node.selector === selector\n )\n\n if (!existingRule) {\n baseLayer?.append(\n postcss.rule({\n selector,\n nodes: [\n postcss.atRule({\n name: \"apply\",\n params: apply,\n raws: { semicolon: true, before: \"\\n \" },\n }),\n ],\n raws: { semicolon: true, between: \" \", before: \"\\n \" },\n })\n )\n }\n })\n },\n }\n}\n\nfunction updateCssVarsPlugin(\n cssVars: z.infer<typeof registryItemCssVarsSchema>\n) {\n return {\n postcssPlugin: \"update-css-vars\",\n Once(root: Root) {\n let baseLayer = root.nodes.find(\n (node) =>\n node.type === \"atrule\" &&\n node.name === \"layer\" &&\n node.params === \"base\"\n ) as AtRule | undefined\n\n if (!(baseLayer instanceof AtRule)) {\n baseLayer = postcss.atRule({\n name: \"layer\",\n params: \"base\",\n nodes: [],\n raws: {\n semicolon: true,\n before: \"\\n\",\n between: \" \",\n },\n })\n root.append(baseLayer)\n }\n\n if (baseLayer !== undefined) {\n // Add variables for each key in cssVars\n Object.entries(cssVars).forEach(([key, vars]) => {\n const selector = key === \"light\" ? \":root\" : `.${key}`\n // TODO: Fix typecheck.\n addOrUpdateVars(baseLayer as AtRule, selector, vars)\n })\n }\n },\n }\n}\n\nfunction cleanupDefaultNextStylesPlugin() {\n return {\n postcssPlugin: \"cleanup-default-next-styles\",\n Once(root: Root) {\n const bodyRule = root.nodes.find(\n (node): node is Rule => node.type === \"rule\" && node.selector === \"body\"\n )\n if (bodyRule) {\n // Remove color from the body node.\n bodyRule.nodes\n .find(\n (node): node is postcss.Declaration =>\n node.type === \"decl\" &&\n node.prop === \"color\" &&\n node.value === \"rgb(var(--foreground-rgb))\"\n )\n ?.remove()\n\n // Remove background: linear-gradient.\n bodyRule.nodes\n .find((node): node is postcss.Declaration => {\n return (\n node.type === \"decl\" &&\n node.prop === \"background\" &&\n // This is only going to run on create project, so all good.\n node.value.startsWith(\"linear-gradient\")\n )\n })\n ?.remove()\n\n // If the body rule is empty, remove it.\n if (bodyRule.nodes.length === 0) {\n bodyRule.remove()\n }\n }\n },\n }\n}\n\nfunction addOrUpdateVars(\n baseLayer: AtRule,\n selector: string,\n vars: Record<string, string>\n) {\n let ruleNode = baseLayer.nodes?.find(\n (node): node is Rule => node.type === \"rule\" && node.selector === selector\n )\n\n if (!ruleNode) {\n if (Object.keys(vars).length > 0) {\n ruleNode = postcss.rule({\n selector,\n raws: { between: \" \", before: \"\\n \" },\n })\n baseLayer.append(ruleNode)\n }\n }\n\n Object.entries(vars).forEach(([key, value]) => {\n const prop = `--${key.replace(/^--/, \"\")}`\n const newDecl = postcss.decl({\n prop,\n value,\n raws: { semicolon: true },\n })\n\n const existingDecl = ruleNode?.nodes.find(\n (node): node is postcss.Declaration =>\n node.type === \"decl\" && node.prop === prop\n )\n\n existingDecl ? existingDecl.replaceWith(newDecl) : ruleNode?.append(newDecl)\n })\n}\n","import { detect } from \"@antfu/ni\"\n\nexport async function getPackageManager(\n targetDir: string,\n { withFallback }: { withFallback?: boolean } = {\n withFallback: false,\n }\n): Promise<\"yarn\" | \"pnpm\" | \"bun\" | \"npm\"> {\n const packageManager = await detect({ programmatic: true, cwd: targetDir })\n\n if (packageManager === \"yarn@berry\") return \"yarn\"\n if (packageManager === \"pnpm@6\") return \"pnpm\"\n if (packageManager === \"bun\") return \"bun\"\n\n if (!withFallback) {\n return packageManager ?? \"npm\"\n }\n\n // Fallback to user agent if not detected.\n const userAgent = process.env.npm_config_user_agent || \"\"\n\n if (userAgent.startsWith(\"yarn\")) {\n return \"yarn\"\n }\n\n if (userAgent.startsWith(\"pnpm\")) {\n return \"pnpm\"\n }\n\n if (userAgent.startsWith(\"bun\")) {\n return \"bun\"\n }\n\n return \"npm\"\n}\n\nexport async function getPackageRunner(cwd: string) {\n const packageManager = await getPackageManager(cwd)\n\n if (packageManager === \"pnpm\") return \"pnpm dlx\"\n\n if (packageManager === \"bun\") return \"bunx\"\n\n return \"npx\"\n}\n","import { Config } from \"@/src/utils/get-config\"\nimport { getPackageManager } from \"@/src/utils/get-package-manager\"\nimport { RegistryItem } from \"@/src/utils/registry/schema\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport { execa } from \"execa\"\n\nexport async function updateDependencies(\n dependencies: RegistryItem[\"dependencies\"],\n config: Config,\n options: {\n silent?: boolean\n }\n) {\n dependencies = Array.from(new Set(dependencies))\n if (!dependencies?.length) {\n return\n }\n\n options = {\n silent: false,\n ...options,\n }\n\n const dependenciesSpinner = spinner(`Installing dependencies.`, {\n silent: options.silent,\n })?.start()\n const packageManager = await getPackageManager(config.resolvedPaths.cwd)\n await execa(\n packageManager,\n [packageManager === \"npm\" ? \"install\" : \"add\", ...dependencies],\n {\n cwd: config.resolvedPaths.cwd,\n }\n )\n dependenciesSpinner?.succeed()\n}\n","import { existsSync, promises as fs } from \"fs\"\nimport path, { basename } from \"path\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport {\n getRegistryBaseColor,\n getRegistryItemFileTargetPath,\n} from \"@/src/utils/registry\"\nimport { RegistryItem } from \"@/src/utils/registry/schema\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport { transform } from \"@/src/utils/transformers\"\nimport { transformCssVars } from \"@/src/utils/transformers/transform-css-vars\"\nimport { transformImport } from \"@/src/utils/transformers/transform-import\"\nimport { transformRsc } from \"@/src/utils/transformers/transform-rsc\"\nimport { transformTwPrefixes } from \"@/src/utils/transformers/transform-tw-prefix\"\nimport prompts from \"prompts\"\n\nexport async function updateFiles(\n files: RegistryItem[\"files\"],\n config: Config,\n options: {\n overwrite?: boolean\n force?: boolean\n silent?: boolean\n }\n) {\n if (!files?.length) {\n return\n }\n options = {\n overwrite: false,\n force: false,\n silent: false,\n ...options,\n }\n const filesCreatedSpinner = spinner(`Updating files.`, {\n silent: options.silent,\n })?.start()\n const baseColor = await getRegistryBaseColor(config.tailwind.baseColor)\n const filesCreated = []\n const filesUpdated = []\n const filesSkipped = []\n\n for (const file of files) {\n if (!file.content) {\n continue\n }\n\n let targetDir = getRegistryItemFileTargetPath(file, config)\n const fileName = basename(file.path)\n let filePath = path.join(targetDir, fileName)\n\n if (file.target) {\n filePath = path.join(config.resolvedPaths.cwd, file.target)\n targetDir = path.dirname(filePath)\n }\n\n if (!config.tsx) {\n filePath = filePath.replace(/\\.tsx?$/, (match) =>\n match === \".tsx\" ? \".jsx\" : \".js\"\n )\n }\n\n const existingFile = existsSync(filePath)\n if (existingFile && !options.overwrite) {\n filesCreatedSpinner.stop()\n const { overwrite } = await prompts({\n type: \"confirm\",\n name: \"overwrite\",\n message: `The file ${highlighter.info(\n fileName\n )} already exists. Would you like to overwrite?`,\n initial: false,\n })\n\n if (!overwrite) {\n filesSkipped.push(path.relative(config.resolvedPaths.cwd, filePath))\n continue\n }\n filesCreatedSpinner?.start()\n }\n\n // Create the target directory if it doesn't exist.\n if (!existsSync(targetDir)) {\n await fs.mkdir(targetDir, { recursive: true })\n }\n\n // Run our transformers.\n const content = await transform(\n {\n filename: file.path,\n raw: file.content,\n config,\n baseColor,\n transformJsx: !config.tsx,\n },\n [transformImport, transformRsc, transformCssVars, transformTwPrefixes]\n )\n\n await fs.writeFile(filePath, content, \"utf-8\")\n existingFile\n ? filesUpdated.push(path.relative(config.resolvedPaths.cwd, filePath))\n : filesCreated.push(path.relative(config.resolvedPaths.cwd, filePath))\n }\n\n const hasUpdatedFiles = filesCreated.length || filesUpdated.length\n if (!hasUpdatedFiles && !filesSkipped.length) {\n filesCreatedSpinner?.info(\"No files updated.\")\n }\n\n if (filesCreated.length) {\n filesCreatedSpinner?.succeed(\n `Created ${filesCreated.length} ${\n filesCreated.length === 1 ? \"file\" : \"files\"\n }:`\n )\n if (!options.silent) {\n for (const file of filesCreated) {\n logger.log(` - ${file}`)\n }\n }\n } else {\n filesCreatedSpinner?.stop()\n }\n\n if (filesUpdated.length) {\n spinner(\n `Updated ${filesUpdated.length} ${\n filesUpdated.length === 1 ? \"file\" : \"files\"\n }:`,\n {\n silent: options.silent,\n }\n )?.info()\n if (!options.silent) {\n for (const file of filesUpdated) {\n logger.log(` - ${file}`)\n }\n }\n }\n\n if (filesSkipped.length) {\n spinner(\n `Skipped ${filesSkipped.length} ${\n filesUpdated.length === 1 ? \"file\" : \"files\"\n }:`,\n {\n silent: options.silent,\n }\n )?.info()\n if (!options.silent) {\n for (const file of filesSkipped) {\n logger.log(` - ${file}`)\n }\n }\n }\n\n if (!options.silent) {\n logger.break()\n }\n}\n","import { promises as fs } from \"fs\"\nimport { tmpdir } from \"os\"\nimport path from \"path\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { registryBaseColorSchema } from \"@/src/utils/registry/schema\"\nimport { transformCssVars } from \"@/src/utils/transformers/transform-css-vars\"\nimport { transformImport } from \"@/src/utils/transformers/transform-import\"\nimport { transformJsx } from \"@/src/utils/transformers/transform-jsx\"\nimport { transformRsc } from \"@/src/utils/transformers/transform-rsc\"\nimport { Project, ScriptKind, type SourceFile } from \"ts-morph\"\nimport { z } from \"zod\"\n\nimport { transformTwPrefixes } from \"./transform-tw-prefix\"\n\nexport type TransformOpts = {\n filename: string\n raw: string\n config: Config\n baseColor?: z.infer<typeof registryBaseColorSchema>\n transformJsx?: boolean\n}\n\nexport type Transformer<Output = SourceFile> = (\n opts: TransformOpts & {\n sourceFile: SourceFile\n }\n) => Promise<Output>\n\nconst project = new Project({\n compilerOptions: {},\n})\n\nasync function createTempSourceFile(filename: string) {\n const dir = await fs.mkdtemp(path.join(tmpdir(), \"shadcn-\"))\n return path.join(dir, filename)\n}\n\nexport async function transform(\n opts: TransformOpts,\n transformers: Transformer[] = [\n transformImport,\n transformRsc,\n transformCssVars,\n transformTwPrefixes,\n ]\n) {\n const tempFile = await createTempSourceFile(opts.filename)\n const sourceFile = project.createSourceFile(tempFile, opts.raw, {\n scriptKind: ScriptKind.TSX,\n })\n\n for (const transformer of transformers) {\n transformer({ sourceFile, ...opts })\n }\n\n if (opts.transformJsx) {\n return await transformJsx({\n sourceFile,\n ...opts,\n })\n }\n\n return sourceFile.getText()\n}\n","import { registryBaseColorSchema } from \"@/src/utils/registry/schema\"\nimport { Transformer } from \"@/src/utils/transformers\"\nimport { ScriptKind, SyntaxKind } from \"ts-morph\"\nimport { z } from \"zod\"\n\nexport const transformCssVars: Transformer = async ({\n sourceFile,\n config,\n baseColor,\n}) => {\n // No transform if using css variables.\n if (config.tailwind?.cssVariables || !baseColor?.inlineColors) {\n return sourceFile\n }\n\n // Find jsx attributes with the name className.\n // const openingElements = sourceFile.getDescendantsOfKind(SyntaxKind.JsxElement)\n // console.log(openingElements)\n // const jsxAttributes = sourceFile\n // .getDescendantsOfKind(SyntaxKind.JsxAttribute)\n // .filter((node) => node.getName() === \"className\")\n\n // for (const jsxAttribute of jsxAttributes) {\n // const value = jsxAttribute.getInitializer()?.getText()\n // if (value) {\n // const valueWithColorMapping = applyColorMapping(\n // value.replace(/\"/g, \"\"),\n // baseColor.inlineColors\n // )\n // jsxAttribute.setInitializer(`\"${valueWithColorMapping}\"`)\n // }\n // }\n sourceFile.getDescendantsOfKind(SyntaxKind.StringLiteral).forEach((node) => {\n const value = node.getText()\n if (value) {\n const valueWithColorMapping = applyColorMapping(\n value.replace(/\"/g, \"\"),\n baseColor.inlineColors\n )\n node.replaceWithText(`\"${valueWithColorMapping.trim()}\"`)\n }\n })\n\n return sourceFile\n}\n\n// export default function transformer(file: FileInfo, api: API) {\n// const j = api.jscodeshift.withParser(\"tsx\")\n\n// // Replace bg-background with \"bg-white dark:bg-slate-950\"\n// const $j = j(file.source)\n// return $j\n// .find(j.JSXAttribute, {\n// name: {\n// name: \"className\",\n// },\n// })\n// .forEach((path) => {\n// const { node } = path\n// if (node?.value?.type) {\n// if (node.value.type === \"StringLiteral\") {\n// node.value.value = applyColorMapping(node.value.value)\n// console.log(node.value.value)\n// }\n\n// if (\n// node.value.type === \"JSXExpressionContainer\" &&\n// node.value.expression.type === \"CallExpression\"\n// ) {\n// const callee = node.value.expression.callee\n// if (callee.type === \"Identifier\" && callee.name === \"cn\") {\n// node.value.expression.arguments.forEach((arg) => {\n// if (arg.type === \"StringLiteral\") {\n// arg.value = applyColorMapping(arg.value)\n// }\n\n// if (\n// arg.type === \"LogicalExpression\" &&\n// arg.right.type === \"StringLiteral\"\n// ) {\n// arg.right.value = applyColorMapping(arg.right.value)\n// }\n// })\n// }\n// }\n// }\n// })\n// .toSource()\n// }\n\n// // export function splitClassName(input: string): (string | null)[] {\n// // const parts = input.split(\":\")\n// // const classNames = parts.map((part) => {\n// // const match = part.match(/^\\[?(.+)\\]$/)\n// // if (match) {\n// // return match[1]\n// // } else {\n// // return null\n// // }\n// // })\n\n// // return classNames\n// // }\n\n// Splits a className into variant-name-alpha.\n// eg. hover:bg-primary-100 -> [hover, bg-primary, 100]\nexport function splitClassName(className: string): (string | null)[] {\n if (!className.includes(\"/\") && !className.includes(\":\")) {\n return [null, className, null]\n }\n\n const parts: (string | null)[] = []\n // First we split to find the alpha.\n let [rest, alpha] = className.split(\"/\")\n\n // Check if rest has a colon.\n if (!rest.includes(\":\")) {\n return [null, rest, alpha]\n }\n\n // Next we split the rest by the colon.\n const split = rest.split(\":\")\n\n // We take the last item from the split as the name.\n const name = split.pop()\n\n // We glue back the rest of the split.\n const variant = split.join(\":\")\n\n // Finally we push the variant, name and alpha.\n parts.push(variant ?? null, name ?? null, alpha ?? null)\n\n return parts\n}\n\nconst PREFIXES = [\"bg-\", \"text-\", \"border-\", \"ring-offset-\", \"ring-\"]\n\nexport function applyColorMapping(\n input: string,\n mapping: z.infer<typeof registryBaseColorSchema>[\"inlineColors\"]\n) {\n // Handle border classes.\n if (input.includes(\" border \")) {\n input = input.replace(\" border \", \" border border-border \")\n }\n\n // Build color mappings.\n const classNames = input.split(\" \")\n const lightMode = new Set<string>()\n const darkMode = new Set<string>()\n for (let className of classNames) {\n const [variant, value, modifier] = splitClassName(className)\n const prefix = PREFIXES.find((prefix) => value?.startsWith(prefix))\n if (!prefix) {\n if (!lightMode.has(className)) {\n lightMode.add(className)\n }\n continue\n }\n\n const needle = value?.replace(prefix, \"\")\n if (needle && needle in mapping.light) {\n lightMode.add(\n [variant, `${prefix}${mapping.light[needle]}`]\n .filter(Boolean)\n .join(\":\") + (modifier ? `/${modifier}` : \"\")\n )\n\n darkMode.add(\n [\"dark\", variant, `${prefix}${mapping.dark[needle]}`]\n .filter(Boolean)\n .join(\":\") + (modifier ? `/${modifier}` : \"\")\n )\n continue\n }\n\n if (!lightMode.has(className)) {\n lightMode.add(className)\n }\n }\n\n return [...Array.from(lightMode), ...Array.from(darkMode)].join(\" \").trim()\n}\n","import { Config } from \"@/src/utils/get-config\"\nimport { Transformer } from \"@/src/utils/transformers\"\n\nexport const transformImport: Transformer = async ({ sourceFile, config }) => {\n const importDeclarations = sourceFile.getImportDeclarations()\n\n for (const importDeclaration of importDeclarations) {\n const moduleSpecifier = updateImportAliases(\n importDeclaration.getModuleSpecifierValue(),\n config\n )\n\n importDeclaration.setModuleSpecifier(moduleSpecifier)\n\n // Replace `import { cn } from \"@/lib/utils\"`\n if (moduleSpecifier == \"@/lib/utils\") {\n const namedImports = importDeclaration.getNamedImports()\n const cnImport = namedImports.find((i) => i.getName() === \"cn\")\n if (cnImport) {\n importDeclaration.setModuleSpecifier(\n moduleSpecifier.replace(/^@\\/lib\\/utils/, config.aliases.utils)\n )\n }\n }\n }\n\n return sourceFile\n}\n\nfunction updateImportAliases(moduleSpecifier: string, config: Config) {\n if (!moduleSpecifier.startsWith(\"@/registry/\")) {\n return moduleSpecifier\n }\n\n if (moduleSpecifier.match(/^@\\/registry\\/(.+)\\/ui/)) {\n return moduleSpecifier.replace(\n /^@\\/registry\\/(.+)\\/ui/,\n config.aliases.ui ?? `${config.aliases.components}/ui`\n )\n }\n\n if (\n config.aliases.components &&\n moduleSpecifier.match(/^@\\/registry\\/(.+)\\/components/)\n ) {\n return moduleSpecifier.replace(\n /^@\\/registry\\/(.+)\\/components/,\n config.aliases.components\n )\n }\n\n if (config.aliases.lib && moduleSpecifier.match(/^@\\/registry\\/(.+)\\/lib/)) {\n return moduleSpecifier.replace(\n /^@\\/registry\\/(.+)\\/lib/,\n config.aliases.lib\n )\n }\n\n if (\n config.aliases.hooks &&\n moduleSpecifier.match(/^@\\/registry\\/(.+)\\/hooks/)\n ) {\n return moduleSpecifier.replace(\n /^@\\/registry\\/(.+)\\/hooks/,\n config.aliases.hooks\n )\n }\n\n return moduleSpecifier.replace(\n /^@\\/registry\\/[^/]+/,\n config.aliases.components\n )\n}\n","import { type Transformer } from \"@/src/utils/transformers\"\nimport { transformFromAstSync } from \"@babel/core\"\nimport { ParserOptions, parse } from \"@babel/parser\"\n// @ts-ignore\nimport transformTypescript from \"@babel/plugin-transform-typescript\"\nimport * as recast from \"recast\"\n\n// TODO.\n// I'm using recast for the AST here.\n// Figure out if ts-morph AST is compatible with Babel.\n\n// This is a copy of the babel options from recast/parser.\n// The goal here is to tolerate as much syntax as possible.\n// We want to be able to parse any valid tsx code.\n// See https://github.com/benjamn/recast/blob/master/parsers/_babel_options.ts.\nconst PARSE_OPTIONS: ParserOptions = {\n sourceType: \"module\",\n allowImportExportEverywhere: true,\n allowReturnOutsideFunction: true,\n startLine: 1,\n tokens: true,\n plugins: [\n \"asyncGenerators\",\n \"bigInt\",\n \"classPrivateMethods\",\n \"classPrivateProperties\",\n \"classProperties\",\n \"classStaticBlock\",\n \"decimal\",\n \"decorators-legacy\",\n \"doExpressions\",\n \"dynamicImport\",\n \"exportDefaultFrom\",\n \"exportNamespaceFrom\",\n \"functionBind\",\n \"functionSent\",\n \"importAssertions\",\n \"importMeta\",\n \"nullishCoalescingOperator\",\n \"numericSeparator\",\n \"objectRestSpread\",\n \"optionalCatchBinding\",\n \"optionalChaining\",\n [\n \"pipelineOperator\",\n {\n proposal: \"minimal\",\n },\n ],\n [\n \"recordAndTuple\",\n {\n syntaxType: \"hash\",\n },\n ],\n \"throwExpressions\",\n \"topLevelAwait\",\n \"v8intrinsic\",\n \"typescript\",\n \"jsx\",\n ],\n}\n\nexport const transformJsx: Transformer<string> = async ({\n sourceFile,\n config,\n}) => {\n const output = sourceFile.getFullText()\n\n if (config.tsx) {\n return output\n }\n\n const ast = recast.parse(output, {\n parser: {\n parse: (code: string) => {\n return parse(code, PARSE_OPTIONS)\n },\n },\n })\n\n const result = transformFromAstSync(ast, output, {\n cloneInputAst: false,\n code: false,\n ast: true,\n plugins: [transformTypescript],\n configFile: false,\n })\n\n if (!result || !result.ast) {\n throw new Error(\"Failed to transform JSX\")\n }\n\n return recast.print(result.ast).code\n}\n","import { Transformer } from \"@/src/utils/transformers\"\nimport { SyntaxKind } from \"ts-morph\"\n\nexport const transformRsc: Transformer = async ({ sourceFile, config }) => {\n if (config.rsc) {\n return sourceFile\n }\n\n // Remove \"use client\" from the top of the file.\n const first = sourceFile.getFirstChildByKind(SyntaxKind.ExpressionStatement)\n if (first?.getText() === `\"use client\"`) {\n first.remove()\n }\n\n return sourceFile\n}\n","import { Transformer } from \"@/src/utils/transformers\"\nimport { SyntaxKind } from \"ts-morph\"\n\nimport { splitClassName } from \"./transform-css-vars\"\n\nexport const transformTwPrefixes: Transformer = async ({\n sourceFile,\n config,\n}) => {\n if (!config.tailwind?.prefix) {\n return sourceFile\n }\n\n // Find the cva function calls.\n sourceFile\n .getDescendantsOfKind(SyntaxKind.CallExpression)\n .filter((node) => node.getExpression().getText() === \"cva\")\n .forEach((node) => {\n // cva(base, ...)\n if (node.getArguments()[0]?.isKind(SyntaxKind.StringLiteral)) {\n const defaultClassNames = node.getArguments()[0]\n if (defaultClassNames) {\n defaultClassNames.replaceWithText(\n `\"${applyPrefix(\n defaultClassNames.getText()?.replace(/\"/g, \"\"),\n config.tailwind.prefix\n )}\"`\n )\n }\n }\n\n // cva(..., { variants: { ... } })\n if (node.getArguments()[1]?.isKind(SyntaxKind.ObjectLiteralExpression)) {\n node\n .getArguments()[1]\n ?.getDescendantsOfKind(SyntaxKind.PropertyAssignment)\n .find((node) => node.getName() === \"variants\")\n ?.getDescendantsOfKind(SyntaxKind.PropertyAssignment)\n .forEach((node) => {\n node\n .getDescendantsOfKind(SyntaxKind.PropertyAssignment)\n .forEach((node) => {\n const classNames = node.getInitializerIfKind(\n SyntaxKind.StringLiteral\n )\n if (classNames) {\n classNames?.replaceWithText(\n `\"${applyPrefix(\n classNames.getText()?.replace(/\"/g, \"\"),\n config.tailwind.prefix\n )}\"`\n )\n }\n })\n })\n }\n })\n\n // Find all jsx attributes with the name className.\n sourceFile.getDescendantsOfKind(SyntaxKind.JsxAttribute).forEach((node) => {\n if (node.getName() === \"className\") {\n // className=\"...\"\n if (node.getInitializer()?.isKind(SyntaxKind.StringLiteral)) {\n const value = node.getInitializer()\n if (value) {\n value.replaceWithText(\n `\"${applyPrefix(\n value.getText()?.replace(/\"/g, \"\"),\n config.tailwind.prefix\n )}\"`\n )\n }\n }\n\n // className={...}\n if (node.getInitializer()?.isKind(SyntaxKind.JsxExpression)) {\n // Check if it's a call to cn().\n const callExpression = node\n .getInitializer()\n ?.getDescendantsOfKind(SyntaxKind.CallExpression)\n .find((node) => node.getExpression().getText() === \"cn\")\n if (callExpression) {\n // Loop through the arguments.\n callExpression.getArguments().forEach((node) => {\n if (\n node.isKind(SyntaxKind.ConditionalExpression) ||\n node.isKind(SyntaxKind.BinaryExpression)\n ) {\n node\n .getChildrenOfKind(SyntaxKind.StringLiteral)\n .forEach((node) => {\n node.replaceWithText(\n `\"${applyPrefix(\n node.getText()?.replace(/\"/g, \"\"),\n config.tailwind.prefix\n )}\"`\n )\n })\n }\n\n if (node.isKind(SyntaxKind.StringLiteral)) {\n node.replaceWithText(\n `\"${applyPrefix(\n node.getText()?.replace(/\"/g, \"\"),\n config.tailwind.prefix\n )}\"`\n )\n }\n })\n }\n }\n }\n\n // classNames={...}\n if (node.getName() === \"classNames\") {\n if (node.getInitializer()?.isKind(SyntaxKind.JsxExpression)) {\n node\n .getDescendantsOfKind(SyntaxKind.PropertyAssignment)\n .forEach((node) => {\n if (node.getInitializer()?.isKind(SyntaxKind.CallExpression)) {\n const callExpression = node.getInitializerIfKind(\n SyntaxKind.CallExpression\n )\n if (callExpression) {\n // Loop through the arguments.\n callExpression.getArguments().forEach((arg) => {\n if (arg.isKind(SyntaxKind.ConditionalExpression)) {\n arg\n .getChildrenOfKind(SyntaxKind.StringLiteral)\n .forEach((node) => {\n node.replaceWithText(\n `\"${applyPrefix(\n node.getText()?.replace(/\"/g, \"\"),\n config.tailwind.prefix\n )}\"`\n )\n })\n }\n\n if (arg.isKind(SyntaxKind.StringLiteral)) {\n arg.replaceWithText(\n `\"${applyPrefix(\n arg.getText()?.replace(/\"/g, \"\"),\n config.tailwind.prefix\n )}\"`\n )\n }\n })\n }\n }\n\n if (node.getInitializer()?.isKind(SyntaxKind.StringLiteral)) {\n if (node.getName() !== \"variant\") {\n const classNames = node.getInitializer()\n if (classNames) {\n classNames.replaceWithText(\n `\"${applyPrefix(\n classNames.getText()?.replace(/\"/g, \"\"),\n config.tailwind.prefix\n )}\"`\n )\n }\n }\n }\n })\n }\n }\n })\n\n return sourceFile\n}\n\nexport function applyPrefix(input: string, prefix: string = \"\") {\n const classNames = input.split(\" \")\n const prefixed: string[] = []\n for (let className of classNames) {\n const [variant, value, modifier] = splitClassName(className)\n if (variant) {\n modifier\n ? prefixed.push(`${variant}:${prefix}${value}/${modifier}`)\n : prefixed.push(`${variant}:${prefix}${value}`)\n } else {\n modifier\n ? prefixed.push(`${prefix}${value}/${modifier}`)\n : prefixed.push(`${prefix}${value}`)\n }\n }\n return prefixed.join(\" \")\n}\n\nexport function applyPrefixesCss(css: string, prefix: string) {\n const lines = css.split(\"\\n\")\n for (let line of lines) {\n if (line.includes(\"@apply\")) {\n const originalTWCls = line.replace(\"@apply\", \"\").trim()\n const prefixedTwCls = applyPrefix(originalTWCls, prefix)\n css = css.replace(originalTWCls, prefixedTwCls)\n }\n }\n return css\n}\n","import { type Config } from \"@/src/utils/get-config\"\nimport { handleError } from \"@/src/utils/handle-error\"\nimport { registryResolveItemsTree } from \"@/src/utils/registry\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport { updateCssVars } from \"@/src/utils/updaters/update-css-vars\"\nimport { updateDependencies } from \"@/src/utils/updaters/update-dependencies\"\nimport { updateFiles } from \"@/src/utils/updaters/update-files\"\nimport { updateTailwindConfig } from \"@/src/utils/updaters/update-tailwind-config\"\n\nexport async function addComponents(\n components: string[],\n config: Config,\n options: {\n overwrite?: boolean\n silent?: boolean\n isNewProject?: boolean\n }\n) {\n options = {\n overwrite: false,\n silent: false,\n isNewProject: false,\n ...options,\n }\n\n const registrySpinner = spinner(`Checking registry.`, {\n silent: options.silent,\n })?.start()\n const tree = await registryResolveItemsTree(components, config)\n if (!tree) {\n registrySpinner?.fail()\n return handleError(new Error(\"Failed to fetch components from registry.\"))\n }\n registrySpinner?.succeed()\n\n await updateTailwindConfig(tree.tailwind?.config, config, {\n silent: options.silent,\n })\n await updateCssVars(tree.cssVars, config, {\n cleanupDefaultNextStyles: options.isNewProject,\n silent: options.silent,\n })\n\n await updateDependencies(tree.dependencies, config, {\n silent: options.silent,\n })\n await updateFiles(tree.files, config, {\n overwrite: options.overwrite,\n silent: options.silent,\n })\n}\n","import path from \"path\"\nimport { initOptionsSchema } from \"@/src/commands/init\"\nimport { getPackageManager } from \"@/src/utils/get-package-manager\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport { execa } from \"execa\"\nimport fs from \"fs-extra\"\nimport prompts from \"prompts\"\nimport { z } from \"zod\"\n\nexport async function createProject(\n options: Pick<z.infer<typeof initOptionsSchema>, \"cwd\" | \"force\">\n) {\n if (!options.force) {\n const { proceed } = await prompts({\n type: \"confirm\",\n name: \"proceed\",\n message: `The path ${highlighter.info(\n options.cwd\n )} is empty. Would you like to start a new ${highlighter.info(\n \"Next.js\"\n )} project?`,\n initial: true,\n })\n\n if (!proceed) {\n return {\n projectPath: null,\n projectName: null,\n }\n }\n }\n\n const packageManager = await getPackageManager(options.cwd)\n\n const { name } = await prompts({\n type: \"text\",\n name: \"name\",\n message: `What is your project named?`,\n initial: \"my-app\",\n format: (value: string) => value.trim(),\n validate: (value: string) =>\n value.length > 128 ? `Name should be less than 128 characters.` : true,\n })\n\n const projectPath = `${options.cwd}/${name}`\n\n // Check if path is writable.\n try {\n await fs.access(options.cwd, fs.constants.W_OK)\n } catch (error) {\n logger.break()\n logger.error(`The path ${highlighter.info(options.cwd)} is not writable.`)\n logger.error(\n `It is likely you do not have write permissions for this folder or the path ${highlighter.info(\n options.cwd\n )} does not exist.`\n )\n logger.break()\n process.exit(1)\n }\n\n if (fs.existsSync(path.resolve(options.cwd, name, \"package.json\"))) {\n logger.break()\n logger.error(\n `A project with the name ${highlighter.info(name)} already exists.`\n )\n logger.error(`Please choose a different name and try again.`)\n logger.break()\n process.exit(1)\n }\n\n const createSpinner = spinner(`Creating a new Next.js project.`).start()\n\n // Note: pnpm fails here. Fallback to npx with --use-PACKAGE-MANAGER.\n const args = [\n \"--tailwind\",\n \"--eslint\",\n \"--typescript\",\n \"--app\",\n \"--no-src-dir\",\n \"--no-import-alias\",\n `--use-${packageManager}`,\n ]\n\n try {\n await execa(\n \"npx\",\n [\"create-next-app@latest\", projectPath, \"--silent\", ...args],\n {\n cwd: options.cwd,\n }\n )\n } catch (error) {\n logger.break()\n logger.error(\n `Something went wront creating a new Next.js project. Please try again.`\n )\n process.exit(1)\n }\n\n createSpinner?.succeed()\n\n return {\n projectPath,\n projectName: name,\n }\n}\n","import path from \"path\"\nimport { addOptionsSchema } from \"@/src/commands/add\"\nimport * as ERRORS from \"@/src/utils/errors\"\nimport { getConfig } from \"@/src/utils/get-config\"\nimport { handleError } from \"@/src/utils/handle-error\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport fs from \"fs-extra\"\nimport { z } from \"zod\"\n\nexport async function preFlightAdd(options: z.infer<typeof addOptionsSchema>) {\n const errors: Record<string, boolean> = {}\n\n // Ensure target directory exists.\n // Check for empty project. We assume if no package.json exists, the project is empty.\n if (\n !fs.existsSync(options.cwd) ||\n !fs.existsSync(path.resolve(options.cwd, \"package.json\"))\n ) {\n errors[ERRORS.MISSING_DIR_OR_EMPTY_PROJECT] = true\n return {\n errors,\n config: null,\n }\n }\n\n // Check for existing components.json file.\n if (!fs.existsSync(path.resolve(options.cwd, \"components.json\"))) {\n errors[ERRORS.MISSING_CONFIG] = true\n return {\n errors,\n config: null,\n }\n // logger.break()\n // logger.error(\n // `A ${highlighter.info(\n // \"components.json\"\n // )} file was not found at ${highlighter.info(\n // options.cwd\n // )}.\\nBefore you can add components, you must create a ${highlighter.info(\n // \"components.json\"\n // )} file by running the ${highlighter.info(\"init\")} command.`\n // )\n // logger.error(\n // `Learn more at ${highlighter.info(\n // \"https://ui.shadcn.com/docs/components-json\"\n // )}.`\n // )\n // logger.break()\n // process.exit(1)\n }\n\n const projectSpinner = spinner(`Preflight checks.`, {\n silent: options.silent,\n })?.start()\n\n try {\n const config = await getConfig(options.cwd)\n projectSpinner?.succeed()\n\n return {\n errors,\n config: config!,\n }\n } catch (error) {\n projectSpinner?.fail()\n logger.break()\n logger.error(\n `An invalid ${highlighter.info(\n \"components.json\"\n )} file was found at ${highlighter.info(\n options.cwd\n )}.\\nBefore you can add components, you must create a valid ${highlighter.info(\n \"components.json\"\n )} file by running the ${highlighter.info(\"init\")} command.`\n )\n logger.error(\n `Learn more at ${highlighter.info(\n \"https://ui.shadcn.com/docs/components-json\"\n )}.`\n )\n logger.break()\n process.exit(1)\n }\n}\n","import { existsSync, promises as fs } from \"fs\"\nimport path from \"path\"\nimport { Config, getConfig } from \"@/src/utils/get-config\"\nimport { handleError } from \"@/src/utils/handle-error\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport {\n fetchTree,\n getItemTargetPath,\n getRegistryBaseColor,\n getRegistryIndex,\n} from \"@/src/utils/registry\"\nimport { registryIndexSchema } from \"@/src/utils/registry/schema\"\nimport { transform } from \"@/src/utils/transformers\"\nimport { Command } from \"commander\"\nimport { diffLines, type Change } from \"diff\"\nimport { z } from \"zod\"\n\nconst updateOptionsSchema = z.object({\n component: z.string().optional(),\n yes: z.boolean(),\n cwd: z.string(),\n path: z.string().optional(),\n})\n\nexport const diff = new Command()\n .name(\"diff\")\n .description(\"check for updates against the registry\")\n .argument(\"[component]\", \"the component name\")\n .option(\"-y, --yes\", \"skip confirmation prompt.\", false)\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd()\n )\n .action(async (name, opts) => {\n try {\n const options = updateOptionsSchema.parse({\n component: name,\n ...opts,\n })\n\n const cwd = path.resolve(options.cwd)\n\n if (!existsSync(cwd)) {\n logger.error(`The path ${cwd} does not exist. Please try again.`)\n process.exit(1)\n }\n\n const config = await getConfig(cwd)\n if (!config) {\n logger.warn(\n `Configuration is missing. Please run ${highlighter.success(\n `init`\n )} to create a components.json file.`\n )\n process.exit(1)\n }\n\n const registryIndex = await getRegistryIndex()\n\n if (!registryIndex) {\n handleError(new Error(\"Failed to fetch registry index.\"))\n process.exit(1)\n }\n\n if (!options.component) {\n const targetDir = config.resolvedPaths.components\n\n // Find all components that exist in the project.\n const projectComponents = registryIndex.filter((item) => {\n for (const file of item.files ?? []) {\n const filePath = path.resolve(\n targetDir,\n typeof file === \"string\" ? file : file.path\n )\n if (existsSync(filePath)) {\n return true\n }\n }\n\n return false\n })\n\n // Check for updates.\n const componentsWithUpdates = []\n for (const component of projectComponents) {\n const changes = await diffComponent(component, config)\n if (changes.length) {\n componentsWithUpdates.push({\n name: component.name,\n changes,\n })\n }\n }\n\n if (!componentsWithUpdates.length) {\n logger.info(\"No updates found.\")\n process.exit(0)\n }\n\n logger.info(\"The following components have updates available:\")\n for (const component of componentsWithUpdates) {\n logger.info(`- ${component.name}`)\n for (const change of component.changes) {\n logger.info(` - ${change.filePath}`)\n }\n }\n logger.break()\n logger.info(\n `Run ${highlighter.success(`diff <component>`)} to see the changes.`\n )\n process.exit(0)\n }\n\n // Show diff for a single component.\n const component = registryIndex.find(\n (item) => item.name === options.component\n )\n\n if (!component) {\n logger.error(\n `The component ${highlighter.success(\n options.component\n )} does not exist.`\n )\n process.exit(1)\n }\n\n const changes = await diffComponent(component, config)\n\n if (!changes.length) {\n logger.info(`No updates found for ${options.component}.`)\n process.exit(0)\n }\n\n for (const change of changes) {\n logger.info(`- ${change.filePath}`)\n await printDiff(change.patch)\n logger.info(\"\")\n }\n } catch (error) {\n handleError(error)\n }\n })\n\nasync function diffComponent(\n component: z.infer<typeof registryIndexSchema>[number],\n config: Config\n) {\n const payload = await fetchTree(config.style, [component])\n const baseColor = await getRegistryBaseColor(config.tailwind.baseColor)\n\n if (!payload) {\n return []\n }\n\n const changes = []\n\n for (const item of payload) {\n const targetDir = await getItemTargetPath(config, item)\n\n if (!targetDir) {\n continue\n }\n\n for (const file of item.files ?? []) {\n const filePath = path.resolve(\n targetDir,\n typeof file === \"string\" ? file : file.path\n )\n\n if (!existsSync(filePath)) {\n continue\n }\n\n const fileContent = await fs.readFile(filePath, \"utf8\")\n\n if (typeof file === \"string\" || !file.content) {\n continue\n }\n\n const registryContent = await transform({\n filename: file.path,\n raw: file.content,\n config,\n baseColor,\n })\n\n const patch = diffLines(registryContent as string, fileContent)\n if (patch.length > 1) {\n changes.push({\n filePath,\n patch,\n })\n }\n }\n }\n\n return changes\n}\n\nasync function printDiff(diff: Change[]) {\n diff.forEach((part) => {\n if (part) {\n if (part.added) {\n return process.stdout.write(highlighter.success(part.value))\n }\n if (part.removed) {\n return process.stdout.write(highlighter.error(part.value))\n }\n\n return process.stdout.write(part.value)\n }\n })\n}\n","#!/usr/bin/env node\nimport { add } from \"@/src/commands/add\"\nimport { diff } from \"@/src/commands/diff\"\nimport { init } from \"@/src/commands/init\"\nimport { Command } from \"commander\"\n\nimport packageJson from \"../package.json\"\n\nprocess.on(\"SIGINT\", () => process.exit(0))\nprocess.on(\"SIGTERM\", () => process.exit(0))\n\nasync function main() {\n const program = new Command()\n .name(\"shadcn\")\n .description(\"add components and dependencies to your project\")\n .version(\n packageJson.version || \"1.0.0\",\n \"-v, --version\",\n \"display the version number\"\n )\n\n program.addCommand(init).addCommand(add).addCommand(diff)\n\n program.parse()\n}\n\nmain()\n","{\n\t\"name\": \"shadcn\",\n\t\"version\": \"0.0.0-beta.22e84f7\",\n\t\"description\": \"Add components to your apps.\",\n\t\"publishConfig\": {\n\t\t\"access\": \"public\"\n\t},\n\t\"license\": \"MIT\",\n\t\"author\": {\n\t\t\"name\": \"shadcn\",\n\t\t\"url\": \"https://twitter.com/shadcn\"\n\t},\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"https://github.com/shadcn/ui.git\",\n\t\t\"directory\": \"packages/cli\"\n\t},\n\t\"files\": [\n\t\t\"dist\"\n\t],\n\t\"keywords\": [\n\t\t\"components\",\n\t\t\"ui\",\n\t\t\"tailwind\",\n\t\t\"radix-ui\",\n\t\t\"shadcn\"\n\t],\n\t\"type\": \"module\",\n\t\"exports\": \"./dist/index.js\",\n\t\"bin\": \"./dist/index.js\",\n\t\"scripts\": {\n\t\t\"dev\": \"tsup --watch\",\n\t\t\"build\": \"tsup\",\n\t\t\"typecheck\": \"tsc --noEmit\",\n\t\t\"clean\": \"rimraf dist && rimraf components\",\n\t\t\"start:dev\": \"cross-env REGISTRY_URL=http://localhost:3333/registry node dist/index.js\",\n\t\t\"start\": \"node dist/index.js\",\n\t\t\"format:write\": \"prettier --write \\\"**/*.{ts,tsx,mdx}\\\" --cache\",\n\t\t\"format:check\": \"prettier --check \\\"**/*.{ts,tsx,mdx}\\\" --cache\",\n\t\t\"release\": \"changeset version\",\n\t\t\"pub:beta\": \"pnpm build && pnpm publish --no-git-checks --access public --tag beta\",\n\t\t\"pub:next\": \"pnpm build && pnpm publish --no-git-checks --access public --tag next\",\n\t\t\"pub:release\": \"pnpm build && pnpm publish --access public\",\n\t\t\"test\": \"vitest run\",\n\t\t\"test:dev\": \"REGISTRY_URL=http://localhost:3333/registry vitest run\"\n\t},\n\t\"dependencies\": {\n\t\t\"@antfu/ni\": \"^0.21.4\",\n\t\t\"@babel/core\": \"^7.22.1\",\n\t\t\"@babel/parser\": \"^7.22.6\",\n\t\t\"@babel/plugin-transform-typescript\": \"^7.22.5\",\n\t\t\"commander\": \"^10.0.0\",\n\t\t\"cosmiconfig\": \"^8.1.3\",\n\t\t\"deepmerge\": \"^4.3.1\",\n\t\t\"diff\": \"^5.1.0\",\n\t\t\"execa\": \"^7.0.0\",\n\t\t\"fast-glob\": \"^3.3.2\",\n\t\t\"fs-extra\": \"^11.1.0\",\n\t\t\"https-proxy-agent\": \"^6.2.0\",\n\t\t\"kleur\": \"^4.1.5\",\n\t\t\"lodash.template\": \"^4.5.0\",\n\t\t\"node-fetch\": \"^3.3.0\",\n\t\t\"ora\": \"^6.1.2\",\n\t\t\"postcss\": \"^8.4.24\",\n\t\t\"prompts\": \"^2.4.2\",\n\t\t\"recast\": \"^0.23.2\",\n\t\t\"stringify-object\": \"^5.0.0\",\n\t\t\"ts-morph\": \"^18.0.0\",\n\t\t\"tsconfig-paths\": \"^4.2.0\",\n\t\t\"zod\": \"^3.20.2\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@types/babel__core\": \"^7.20.1\",\n\t\t\"@types/diff\": \"^5.0.3\",\n\t\t\"@types/fs-extra\": \"^11.0.1\",\n\t\t\"@types/lodash.template\": \"^4.5.1\",\n\t\t\"@types/prompts\": \"^2.4.2\",\n\t\t\"@types/stringify-object\": \"^4.0.5\",\n\t\t\"rimraf\": \"^6.0.1\",\n\t\t\"tsup\": \"^6.6.3\",\n\t\t\"type-fest\": \"^3.8.0\",\n\t\t\"typescript\": \"^4.9.3\"\n\t}\n}\n"],"mappings":"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","names":["path","fs","path","path","MISSING_DIR_OR_EMPTY_PROJECT","MISSING_CONFIG","TAILWIND_NOT_CONFIGURED","IMPORT_ALIAS_MISSING","UNSUPPORTED_FRAMEWORK","path","FRAMEWORKS","path","cyan","green","red","yellow","highlighter","createMatchPath","resolveImport","importPath","config","cosmiconfig","loadConfig","z","DEFAULT_COMPONENTS","DEFAULT_UTILS","DEFAULT_TAILWIND_CSS","DEFAULT_TAILWIND_CONFIG","explorer","cosmiconfig","rawConfigSchema","z","configSchema","getConfig","cwd","config","getRawConfig","resolveConfigPaths","tsConfig","loadConfig","path","resolveImport","configResult","componentPath","highlighter","fg","fs","loadConfig","PROJECT_SHARED_IGNORE","getProjectInfo","cwd","configFiles","isSrcDir","isTsx","tailwindConfigFile","tailwindCssFile","aliasPrefix","path","isTypeScriptProject","getTailwindConfigFile","getTailwindCssFile","getTsConfigAliasPrefix","isUsingAppDir","type","FRAMEWORKS","file","files","tsConfig","alias","paths","getProjectConfig","cwd","defaultProjectInfo","existingConfig","projectInfo","getConfig","getProjectInfo","config","resolveConfigPaths","logger","args","highlighter","ora","spinner","text","options","fs","preFlightInit","options","errors","path","MISSING_DIR_OR_EMPTY_PROJECT","projectSpinner","spinner","logger","highlighter","frameworkSpinner","projectInfo","getProjectInfo","UNSUPPORTED_FRAMEWORK","tailwindSpinner","TAILWIND_NOT_CONFIGURED","tsConfigSpinner","IMPORT_ALIAS_MISSING","z","handleError","error","logger","key","value","highlighter","path","z","registryItemTypeSchema","registryItemFileSchema","registryItemTailwindSchema","registryItemCssVarsSchema","registryItemSchema","registryIndexSchema","stylesSchema","registryBaseColorSchema","registryResolvedItemsTreeSchema","fs","tmpdir","path","deepmerge","objectToString","Project","QuoteKind","ScriptKind","SyntaxKind","updateTailwindConfig","tailwindConfig","config","options","tailwindFileRelativePath","path","tailwindSpinner","spinner","highlighter","raw","fs","output","transformTailwindConfig","input","sourceFile","_createSourceFile","configObject","node","property","quoteChar","_getQuoteChar","addTailwindConfigProperty","plugin","addTailwindConfigPlugin","addTailwindConfigTheme","existingProperty","newProperty","initializer","newValue","initializerText","element","theme","nestSpreadProperties","themeInitializer","themeObjectString","themeObject","parseObjectLiteral","result","resultString","unnestSpreadProperties","existingPlugins","dir","tmpdir","resolvedPath","tempFile","obj","properties","i","prop","spreadAssignment","spreadText","propAssignment","value","objectLiteralString","statement","parseObjectLiteralExpression","name","parseValue","buildTailwindThemeColorsFromCssVars","cssVars","key","parts","colorName","subType","deepmerge","HttpsProxyAgent","fetch","z","REGISTRY_URL","agent","getRegistryIndex","result","fetchRegistry","registryIndexSchema","error","logger","handleError","getRegistryStyles","stylesSchema","getRegistryItem","name","style","isUrl","registryItemSchema","getRegistryBaseColors","getRegistryBaseColor","baseColor","registryBaseColorSchema","fetchTree","style","tree","paths","item","result","fetchRegistry","registryIndexSchema","error","handleError","getItemTargetPath","config","override","parent","type","path","url","getRegistryUrl","response","fetch","agent","errorMessages","message","highlighter","logger","getRegistryItemFileTargetPath","file","registryResolveItemsTree","names","getRegistryIndex","items","name","getRegistryItem","registryDependencies","uniqueDependencies","urls","isUrl","payload","z","registryItemSchema","index","theme","registryGetTheme","tailwind","deepmerge","cssVars","registryResolvedItemsTreeSchema","baseColor","getRegistryBaseColor","buildTailwindThemeColorsFromCssVars","REGISTRY_URL","fs","path","postcss","AtRule","updateCssVars","cssVars","config","options","cssFilepath","cssFilepathRelative","path","cssVarsSpinner","spinner","highlighter","raw","fs","output","transformCssVars","input","plugins","updateCssVarsPlugin","cleanupDefaultNextStylesPlugin","updateBaseLayerPlugin","root","requiredRules","baseLayer","node","selector","apply","rule","applyRule","key","vars","addOrUpdateVars","bodyRule","ruleNode","value","prop","newDecl","existingDecl","detect","getPackageManager","targetDir","withFallback","packageManager","userAgent","execa","updateDependencies","dependencies","config","options","dependenciesSpinner","spinner","packageManager","getPackageManager","existsSync","fs","path","basename","fs","tmpdir","path","SyntaxKind","transformCssVars","sourceFile","config","baseColor","node","value","valueWithColorMapping","applyColorMapping","splitClassName","className","parts","rest","alpha","split","name","variant","PREFIXES","input","mapping","classNames","lightMode","darkMode","modifier","prefix","needle","transformImport","sourceFile","config","importDeclarations","importDeclaration","moduleSpecifier","updateImportAliases","i","transformFromAstSync","parse","transformTypescript","recast","PARSE_OPTIONS","transformJsx","sourceFile","config","output","ast","code","result","SyntaxKind","transformRsc","sourceFile","config","first","Project","ScriptKind","SyntaxKind","transformTwPrefixes","sourceFile","config","SyntaxKind","node","defaultClassNames","applyPrefix","classNames","value","callExpression","arg","input","prefix","prefixed","className","variant","modifier","splitClassName","project","Project","createTempSourceFile","filename","dir","fs","path","tmpdir","transform","opts","transformers","transformImport","transformRsc","transformCssVars","transformTwPrefixes","tempFile","sourceFile","ScriptKind","transformer","transformJsx","prompts","updateFiles","files","config","options","filesCreatedSpinner","spinner","baseColor","getRegistryBaseColor","filesCreated","filesUpdated","filesSkipped","file","targetDir","getRegistryItemFileTargetPath","fileName","basename","filePath","path","match","existingFile","existsSync","overwrite","highlighter","fs","content","transform","transformImport","transformRsc","transformCssVars","transformTwPrefixes","logger","addComponents","components","config","options","registrySpinner","spinner","tree","registryResolveItemsTree","handleError","updateTailwindConfig","updateCssVars","updateDependencies","updateFiles","path","execa","fs","prompts","createProject","options","proceed","highlighter","packageManager","getPackageManager","name","value","projectPath","logger","path","createSpinner","spinner","args","Command","prompts","z","initOptionsSchema","init","opts","options","path","runInit","logger","highlighter","error","handleError","projectInfo","getProjectInfo","preflight","preFlightInit","MISSING_DIR_OR_EMPTY_PROJECT","projectPath","createProject","projectConfig","getProjectConfig","config","promptForMinimalConfig","promptForConfig","getConfig","proceed","componentSpinner","spinner","targetPath","fs","fullConfig","resolveConfigPaths","addComponents","defaultConfig","styles","baseColors","getRegistryStyles","getRegistryBaseColors","style","color","DEFAULT_TAILWIND_CSS","DEFAULT_TAILWIND_CONFIG","DEFAULT_COMPONENTS","DEFAULT_UTILS","rawConfigSchema","baseColor","cssVariables","s","path","fs","preFlightAdd","options","errors","path","MISSING_DIR_OR_EMPTY_PROJECT","MISSING_CONFIG","projectSpinner","spinner","config","getConfig","logger","highlighter","Command","prompts","z","addOptionsSchema","add","components","opts","options","path","isTheme","component","logger","confirm","highlighter","promptForRegistryComponents","errors","config","preFlightAdd","MISSING_CONFIG","proceed","runInit","MISSING_DIR_OR_EMPTY_PROJECT","projectPath","createProject","addComponents","error","handleError","registryIndex","getRegistryIndex","entry","result","existsSync","fs","path","Command","diffLines","z","updateOptionsSchema","diff","name","opts","options","cwd","path","existsSync","logger","config","getConfig","highlighter","registryIndex","getRegistryIndex","handleError","targetDir","projectComponents","item","file","filePath","componentsWithUpdates","component","changes","diffComponent","change","printDiff","error","payload","fetchTree","baseColor","getRegistryBaseColor","getItemTargetPath","fileContent","fs","registryContent","transform","patch","part","Command","package_default","main","program","Command","package_default","init","add","diff"]}
package/package.json ADDED
@@ -0,0 +1,84 @@
1
+ {
2
+ "name": "shadcn",
3
+ "version": "0.0.0-beta.22e84f7",
4
+ "description": "Add components to your apps.",
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "license": "MIT",
9
+ "author": {
10
+ "name": "shadcn",
11
+ "url": "https://twitter.com/shadcn"
12
+ },
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "https://github.com/shadcn/ui.git",
16
+ "directory": "packages/cli"
17
+ },
18
+ "files": [
19
+ "dist"
20
+ ],
21
+ "keywords": [
22
+ "components",
23
+ "ui",
24
+ "tailwind",
25
+ "radix-ui",
26
+ "shadcn"
27
+ ],
28
+ "type": "module",
29
+ "exports": "./dist/index.js",
30
+ "bin": "./dist/index.js",
31
+ "dependencies": {
32
+ "@antfu/ni": "^0.21.4",
33
+ "@babel/core": "^7.22.1",
34
+ "@babel/parser": "^7.22.6",
35
+ "@babel/plugin-transform-typescript": "^7.22.5",
36
+ "commander": "^10.0.0",
37
+ "cosmiconfig": "^8.1.3",
38
+ "deepmerge": "^4.3.1",
39
+ "diff": "^5.1.0",
40
+ "execa": "^7.0.0",
41
+ "fast-glob": "^3.3.2",
42
+ "fs-extra": "^11.1.0",
43
+ "https-proxy-agent": "^6.2.0",
44
+ "kleur": "^4.1.5",
45
+ "lodash.template": "^4.5.0",
46
+ "node-fetch": "^3.3.0",
47
+ "ora": "^6.1.2",
48
+ "postcss": "^8.4.24",
49
+ "prompts": "^2.4.2",
50
+ "recast": "^0.23.2",
51
+ "stringify-object": "^5.0.0",
52
+ "ts-morph": "^18.0.0",
53
+ "tsconfig-paths": "^4.2.0",
54
+ "zod": "^3.20.2"
55
+ },
56
+ "devDependencies": {
57
+ "@types/babel__core": "^7.20.1",
58
+ "@types/diff": "^5.0.3",
59
+ "@types/fs-extra": "^11.0.1",
60
+ "@types/lodash.template": "^4.5.1",
61
+ "@types/prompts": "^2.4.2",
62
+ "@types/stringify-object": "^4.0.5",
63
+ "rimraf": "^6.0.1",
64
+ "tsup": "^6.6.3",
65
+ "type-fest": "^3.8.0",
66
+ "typescript": "^4.9.3"
67
+ },
68
+ "scripts": {
69
+ "dev": "tsup --watch",
70
+ "build": "tsup",
71
+ "typecheck": "tsc --noEmit",
72
+ "clean": "rimraf dist && rimraf components",
73
+ "start:dev": "cross-env REGISTRY_URL=http://localhost:3333/registry node dist/index.js",
74
+ "start": "node dist/index.js",
75
+ "format:write": "prettier --write \"**/*.{ts,tsx,mdx}\" --cache",
76
+ "format:check": "prettier --check \"**/*.{ts,tsx,mdx}\" --cache",
77
+ "release": "changeset version",
78
+ "pub:beta": "pnpm build && pnpm publish --no-git-checks --access public --tag beta",
79
+ "pub:next": "pnpm build && pnpm publish --no-git-checks --access public --tag next",
80
+ "pub:release": "pnpm build && pnpm publish --access public",
81
+ "test": "vitest run",
82
+ "test:dev": "REGISTRY_URL=http://localhost:3333/registry vitest run"
83
+ }
84
+ }