shadcn 2.0.5 → 2.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +9 -8
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -2,24 +2,25 @@
|
|
|
2
2
|
import Lr from"path";import{promises as $r}from"fs";import at from"path";import $e from"path";var I="1";var V="3";var oe="5",ae="6",Te="7";import le from"path";var v={"next-app":{name:"next-app",label:"Next.js",links:{installation:"https://ui.shadcn.com/docs/installation/next",tailwind:"https://tailwindcss.com/docs/guides/nextjs"}},"next-pages":{name:"next-pages",label:"Next.js",links:{installation:"https://ui.shadcn.com/docs/installation/next",tailwind:"https://tailwindcss.com/docs/guides/nextjs"}},remix:{name:"remix",label:"Remix",links:{installation:"https://ui.shadcn.com/docs/installation/remix",tailwind:"https://tailwindcss.com/docs/guides/remix"}},vite:{name:"vite",label:"Vite",links:{installation:"https://ui.shadcn.com/docs/installation/vite",tailwind:"https://tailwindcss.com/docs/guides/vite"}},astro:{name:"astro",label:"Astro",links:{installation:"https://ui.shadcn.com/docs/installation/astro",tailwind:"https://tailwindcss.com/docs/guides/astro"}},laravel:{name:"laravel",label:"Laravel",links:{installation:"https://ui.shadcn.com/docs/installation/laravel",tailwind:"https://tailwindcss.com/docs/guides/laravel"}},gatsby:{name:"gatsby",label:"Gatsby",links:{installation:"https://ui.shadcn.com/docs/installation/gatsby",tailwind:"https://tailwindcss.com/docs/guides/gatsby"}},manual:{name:"manual",label:"Manual",links:{installation:"https://ui.shadcn.com/docs/installation/manual",tailwind:"https://tailwindcss.com/docs/installation"}}};import N from"path";import{cyan as wt,green as xt,red as bt,yellow as St}from"kleur/colors";var l={error:bt,warn:St,info:wt,success:xt};import{createMatchPath as Ct}from"tsconfig-paths";async function T(e,t){return Ct(t.absoluteBaseUrl,t.paths)(e,void 0,()=>!0,[".ts",".tsx"])}import{cosmiconfig as Pt}from"cosmiconfig";import{loadConfig as vt}from"tsconfig-paths";import{z as h}from"zod";var Ie="@/components",Re="@/lib/utils",ke="app/globals.css",Ee="tailwind.config.js";var Tt=Pt("components",{searchPlaces:["components.json"]}),A=h.object({$schema:h.string().optional(),style:h.string(),rsc:h.coerce.boolean().default(!1),tsx:h.coerce.boolean().default(!0),tailwind:h.object({config:h.string(),css:h.string(),baseColor:h.string(),cssVariables:h.boolean().default(!0),prefix:h.string().default("").optional()}),aliases:h.object({components:h.string(),utils:h.string(),ui:h.string().optional(),lib:h.string().optional(),hooks:h.string().optional()})}).strict(),It=A.extend({resolvedPaths:h.object({cwd:h.string(),tailwindConfig:h.string(),tailwindCss:h.string(),utils:h.string(),components:h.string(),lib:h.string(),hooks:h.string(),ui:h.string()})});async function R(e){let t=await Rt(e);return t?await F(e,t):null}async function F(e,t){let r=await vt(e);if(r.resultType==="failed")throw new Error(`Failed to load ${t.tsx?"tsconfig":"jsconfig"}.json. ${r.message??""}`.trim());return It.parse({...t,resolvedPaths:{cwd:e,tailwindConfig:N.resolve(e,t.tailwind.config),tailwindCss:N.resolve(e,t.tailwind.css),utils:await T(t.aliases.utils,r),components:await T(t.aliases.components,r),ui:t.aliases.ui?await T(t.aliases.ui,r):N.resolve(await T(t.aliases.components,r)??e,"ui"),lib:t.aliases.lib?await T(t.aliases.lib,r):N.resolve(await T(t.aliases.utils,r)??e,".."),hooks:t.aliases.hooks?await T(t.aliases.hooks,r):N.resolve(await T(t.aliases.components,r)??e,"..","hooks")}})}async function Rt(e){try{let t=await Tt.search(e);return t?A.parse(t.config):null}catch{let r=`${e}/component.json`;throw new Error(`Invalid configuration found in ${l.info(r)}.`)}}import M from"fast-glob";import ce from"fs-extra";import{loadConfig as kt}from"tsconfig-paths";var G=["**/node_modules/**",".next","public","dist","build"];async function E(e){let[t,r,i,n,s,o]=await Promise.all([M.glob("**/{next,vite,astro}.config.*|gatsby-config.*|composer.json",{cwd:e,deep:3,ignore:G}),ce.pathExists(le.resolve(e,"src")),Ot(e),jt(e),Et(e),$t(e)]),c=await ce.pathExists(le.resolve(e,`${r?"src/":""}app`)),p={framework:v.manual,isSrcDir:r,isRSC:!1,isTsx:i,tailwindConfigFile:n,tailwindCssFile:s,aliasPrefix:o};return t.length?t.find(d=>d.startsWith("next.config."))?.length?(p.framework=c?v["next-app"]:v["next-pages"],p.isRSC=c,p):t.find(d=>d.startsWith("astro.config."))?.length?(p.framework=v.astro,p):t.find(d=>d.startsWith("gatsby-config."))?.length?(p.framework=v.gatsby,p):t.find(d=>d.startsWith("composer.json"))?.length?(p.framework=v.laravel,p):(t.find(d=>d.startsWith("vite.config."))?.length&&(p.framework=c?v.remix:v.vite),p):p}async function Et(e){let t=await M.glob("**/*.css",{cwd:e,deep:5,ignore:G});if(!t.length)return null;for(let r of t)if((await ce.readFile(le.resolve(e,r),"utf8")).includes("@tailwind base"))return r;return null}async function jt(e){let t=await M.glob("tailwind.config.*",{cwd:e,deep:3,ignore:G});return t.length?t[0]:null}async function $t(e){let t=await kt(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 Ot(e){return(await M.glob("tsconfig.*",{cwd:e,deep:1,ignore:G})).length>0}async function je(e,t=null){let[r,i]=await Promise.all([R(e),t?Promise.resolve(t):E(e)]);if(r)return r;if(!i||!i.tailwindConfigFile||!i.tailwindCssFile)return null;let n={$schema:"https://ui.shadcn.com/schema.json",rsc:i.isRSC,tsx:i.isTsx,style:"new-york",tailwind:{config:i.tailwindConfigFile,baseColor:"zinc",css:i.tailwindCssFile,cssVariables:!0,prefix:""},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 F(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 Nt from"ora";function y(e,t){return Nt({text:e,isSilent:t?.silent})}import pe from"fs-extra";async function Oe(e){let t={};if(!pe.existsSync(e.cwd)||!pe.existsSync($e.resolve(e.cwd,"package.json")))return t[I]=!0,{errors:t,projectInfo:null};let r=y("Preflight checks.",{silent:e.silent}).start();pe.existsSync($e.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
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=y("Verifying framework.",{silent:e.silent}).start(),n=await E(e.cwd);(!n||n?.framework.name==="manual")&&(t[Te]=!0,i?.fail(),a.break(),n?.framework.links.installation&&a.error(`We could not detect a supported framework at ${l.info(e.cwd)}.
|
|
4
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=y("Validating Tailwind CSS.",{silent:e.silent}).start();!n?.tailwindConfigFile||!n?.tailwindCssFile?(t[oe]=!0,s?.fail()):s?.succeed();let o=y("Validating import alias.",{silent:e.silent}).start();return n?.aliasPrefix?o?.succeed():(t[ae]=!0,o?.fail()),Object.keys(t).length>0&&(t[oe]&&(a.break(),a.error(`No Tailwind CSS configuration found at ${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[ae]&&(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 At}from"zod";function
|
|
6
|
-
`),
|
|
7
|
-
`),
|
|
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=y("Validating Tailwind CSS.",{silent:e.silent}).start();!n?.tailwindConfigFile||!n?.tailwindCssFile?(t[oe]=!0,s?.fail()):s?.succeed();let o=y("Validating import alias.",{silent:e.silent}).start();return n?.aliasPrefix?o?.succeed():(t[ae]=!0,o?.fail()),Object.keys(t).length>0&&(t[oe]&&(a.break(),a.error(`No Tailwind CSS configuration found at ${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[ae]&&(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 At}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 At.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 Jt from"path";import{z as m}from"zod";var Ne=m.enum(["registry:style","registry:lib","registry:example","registry:block","registry:component","registry:ui","registry:hook","registry:theme","registry:page"]),Ae=m.object({path:m.string(),content:m.string().optional(),type:Ne,target:m.string().optional()}),Ft=m.object({config:m.object({content:m.array(m.string()).optional(),theme:m.record(m.string(),m.any()).optional(),plugins:m.array(m.string()).optional()}).optional()}),Dt=m.object({light:m.record(m.string(),m.string()).optional(),dark:m.record(m.string(),m.string()).optional()}),D=m.object({name:m.string(),type:Ne,description:m.string().optional(),dependencies:m.array(m.string()).optional(),devDependencies:m.array(m.string()).optional(),registryDependencies:m.array(m.string()).optional(),files:m.array(Ae).optional(),tailwind:Ft.optional(),cssVars:Dt.optional(),meta:m.record(m.string(),m.any()).optional(),docs:m.string().optional()}),me=m.array(D.extend({files:m.array(m.union([m.string(),Ae])).optional()})),Fe=m.array(m.object({name:m.string(),label:m.string()})),De=m.object({inlineColors:m.object({light:m.record(m.string(),m.string()),dark:m.record(m.string(),m.string())}),cssVars:m.object({light:m.record(m.string(),m.string()),dark:m.record(m.string(),m.string())}),inlineColorsTemplate:m.string(),cssVarsTemplate:m.string()}),Le=D.pick({dependencies:!0,devDependencies:!0,files:!0,tailwind:!0,cssVars:!0,docs:!0});import{promises as fe}from"fs";import{tmpdir as Lt}from"os";import L from"path";import _t from"deepmerge";import zt from"stringify-object";import{Project as Kt,QuoteKind as Wt,ScriptKind as _e,SyntaxKind as g}from"ts-morph";async function ze(e,t,r){if(!e)return;r={silent:!1,...r};let i=L.relative(t.resolvedPaths.cwd,t.resolvedPaths.tailwindConfig),n=y(`Updating ${l.info(i)}`,{silent:r.silent}).start(),s=await fe.readFile(t.resolvedPaths.tailwindConfig,"utf8"),o=await Vt(s,e,t);await fe.writeFile(t.resolvedPaths.tailwindConfig,o,"utf8"),n?.succeed()}async function Vt(e,t,r){let i=await B(e,r),n=i.getDescendantsOfKind(g.ObjectLiteralExpression).find(o=>o.getProperties().some(c=>c.isKind(g.PropertyAssignment)&&c.getName()==="content"));if(!n)return e;let s=de(n);return Ut(n,{name:"darkMode",value:"class"},{quoteChar:s}),t.plugins?.forEach(o=>{Gt(n,o)}),t.theme&&await Mt(n,t.theme),i.getFullText()}function Ut(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(g.PropertyAssignment)){let n=i.getInitializer(),s=`${r}${t.value}${r}`;if(n?.isKind(g.StringLiteral)){let o=n.getText();return n.replaceWithText(`[${o}, ${s}]`),e}if(n?.isKind(g.ArrayLiteralExpression)){if(n.getElements().map(o=>o.getText()).includes(s))return e;n.addElement(s)}return e}return e}async function Mt(e,t){e.getProperty("theme")||e.addPropertyAssignment({name:"theme",initializer:"{}"}),Ke(e);let i=(e.getPropertyOrThrow("theme")?.asKindOrThrow(g.PropertyAssignment)).getInitializer();if(i?.isKind(g.ObjectLiteralExpression)){let n=i.getText(),s=await Bt(n),o=_t(s,t),c=zt(o).replace(/\'\"/g,"'").replace(/\"\'/g,"'").replace(/\'\[/g,"[").replace(/\]\'/g,"]").replace(/\'\\\'/g,"'").replace(/\\\'/g,"'").replace(/\\\'\'/g,"'").replace(/\'\'/g,"'");i.replaceWithText(c)}We(e)}function Gt(e,t){let r=e.getProperty("plugins");if(!r)return e.addPropertyAssignment({name:"plugins",initializer:`[${t}]`}),e;if(r.isKind(g.PropertyAssignment)){let i=r.getInitializer();if(i?.isKind(g.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 B(e,t){let r=await fe.mkdtemp(L.join(Lt(),"shadcn-")),i=t?.resolvedPaths?.tailwindConfig||"tailwind.config.ts",n=L.join(r,`shadcn-${L.basename(i)}`);return new Kt({compilerOptions:{}}).createSourceFile(n,e,{scriptKind:L.extname(i)===".ts"?_e.TS:_e.JS})}function de(e){return e.getFirstDescendantByKind(g.StringLiteral)?.getQuoteKind()===Wt.Single?"'":'"'}function Ke(e){let t=e.getProperties();for(let r=0;r<t.length;r++){let i=t[r];if(i.isKind(g.SpreadAssignment)){let n=i.asKindOrThrow(g.SpreadAssignment),s=n.getExpression().getText();e.insertPropertyAssignment(r,{name:`___${s.replace(/^\.\.\./,"")}`,initializer:`"...${s.replace(/^\.\.\./,"")}"`}),n.remove()}else if(i.isKind(g.PropertyAssignment)){let s=i.asKindOrThrow(g.PropertyAssignment).getInitializer();s&&s.isKind(g.ObjectLiteralExpression)&&Ke(s.asKindOrThrow(g.ObjectLiteralExpression))}}}function We(e){let t=e.getProperties();for(let r=0;r<t.length;r++){let i=t[r];if(i.isKind(g.PropertyAssignment)){let n=i,s=n.getInitializer();if(s?.isKind(g.StringLiteral)){let o=s.getLiteralValue();o.startsWith("...")&&(e.insertSpreadAssignment(r,{expression:o.slice(3)}),n.remove())}else s?.isKind(g.ObjectLiteralExpression)&&We(s)}}}async function Bt(e){let r=(await B(`const theme = ${e}`,null)).getStatements()[0];if(r?.getKind()===g.VariableStatement){let n=(r.getDeclarationList()?.getDeclarations()[0]).getInitializer();if(n?.isKind(g.ObjectLiteralExpression))return await Ve(n)}throw new Error("Invalid input: not an object literal")}function Ve(e){let t={};for(let r of e.getProperties())if(r.isKind(g.PropertyAssignment)){let i=r.getName().replace(/\'/g,"");r.getInitializer()?.isKind(g.ObjectLiteralExpression)?t[i]=Ve(r.getInitializer()):t[i]=Ue(r.getInitializer())}return t}function Ue(e){switch(e.kind){case g.StringLiteral:return e.text;case g.NumericLiteral:return Number(e.text);case g.TrueKeyword:return!0;case g.FalseKeyword:return!1;case g.NullKeyword:return null;case g.ArrayLiteralExpression:return e.elements.map(Ue);default:return e.getText()}}function Me(e){let t={};for(let r of Object.keys(e)){let i=r.split("-"),n=i[0],s=i.slice(1).join("-");s===""?typeof t[n]=="object"?t[n].DEFAULT=`hsl(var(--${r}))`:t[n]=`hsl(var(--${r}))`:(typeof t[n]!="object"&&(t[n]={DEFAULT:`hsl(var(--${n}))`}),t[n][s]=`hsl(var(--${r}))`)}for(let[r,i]of Object.entries(t))typeof i=="object"&&i.DEFAULT===`hsl(var(--${r}))`&&!(r in e)&&delete i.DEFAULT;return t}import _ from"deepmerge";import{HttpsProxyAgent as Yt}from"https-proxy-agent";import Qt from"node-fetch";import{z as Ht}from"zod";var Xt=process.env.REGISTRY_URL??"https://ui.shadcn.com/r",qt=process.env.https_proxy?new Yt(process.env.https_proxy):void 0;async function z(){try{let[e]=await O(["index.json"]);return me.parse(e)}catch(e){a.error(`
|
|
6
|
+
`),b(e)}}async function ue(){try{let[e]=await O(["styles/index.json"]);return Fe.parse(e)}catch(e){return a.error(`
|
|
7
|
+
`),b(e),[]}}async function J(e,t){try{let[r]=await O([he(e)?e:`styles/${t}/${e}.json`]);return D.parse(r)}catch(r){return a.break(),b(r),null}}async function ge(){return[{name:"neutral",label:"Neutral"},{name:"gray",label:"Gray"},{name:"zinc",label:"Zinc"},{name:"stone",label:"Stone"},{name:"slate",label:"Slate"}]}async function K(e){try{let[t]=await O([`colors/${e}.json`]);return De.parse(t)}catch(t){b(t)}}async function Ge(e,t){try{let r=t.map(n=>`styles/${e}/${n.name}.json`),i=await O(r);return me.parse(i)}catch(r){b(r)}}async function Be(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?Jt.join(e.resolvedPaths[i],n):null}async function O(e){try{return await Promise.all(e.map(async r=>{let i=Qe(r),n=await Qt(i,{agent:qt});if(!n.ok){let s={400:"Bad request",401:"Unauthorized",403:"Forbidden",404:"Not found",500:"Internal server error"};if(n.status===401)throw new Error(`You are not authorized to access the component at ${l.info(i)}.
|
|
8
8
|
If this is a remote registry, you may need to authenticate.`);if(n.status===404)throw new Error(`The component at ${l.info(i)} was not found.
|
|
9
9
|
It may not exist at the registry. Please make sure it is a valid component.`);if(n.status===403)throw new Error(`You do not have access to the component at ${l.info(i)}.
|
|
10
10
|
If this is a remote registry, you may need to authenticate or a token.`);let o=await n.json(),c=o&&typeof o=="object"&&"error"in o?o.error:n.statusText||s[n.status];throw new Error(`Failed to fetch from ${l.info(i)}.
|
|
11
11
|
${c}`)}return n.json()}))}catch(t){return a.error(`
|
|
12
|
-
`),
|
|
12
|
+
`),b(t),[]}}function Je(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 Ye(e,t){try{if(!await z())return null;let i=(await Promise.all(e.map(async f=>await J(f,t.style)))).filter(f=>f!==null);if(!i.length)return null;let n=i.map(f=>f.registryDependencies??[]).flat(),s=Array.from(new Set(n)),o=Array.from([...e,...s]).map(f=>Qe(he(f)?f:`styles/${t.style}/${f}.json`)),c=await O(o),p=Ht.array(D).parse(c);if(!p)return null;if(e.includes("index")){let f=await J("index",t.style);if(f&&p.unshift(f),t.tailwind.baseColor){let S=await Zt(t.tailwind.baseColor,t);S&&p.unshift(S)}}let d={};p.forEach(f=>{d=_(d,f.tailwind??{})});let u={};p.forEach(f=>{u=_(u,f.cssVars??{})});let x="";return p.forEach(f=>{f.docs&&(x+=`${f.docs}
|
|
13
|
+
`)}),Le.parse({dependencies:_.all(p.map(f=>f.dependencies??[])),devDependencies:_.all(p.map(f=>f.devDependencies??[])),files:_.all(p.map(f=>f.files??[])),tailwind:d,cssVars:u,docs:x})}catch(r){return b(r),null}}async function Zt(e,t){let r=await K(e);if(!r)return null;let i={name:e,type:"registry:theme",tailwind:{config:{theme:{extend:{borderRadius:{lg:"var(--radius)",md:"calc(var(--radius) - 2px)",sm:"calc(var(--radius) - 4px)"},colors:{}}}}},cssVars:{light:{radius:"0.5rem"},dark:{}}};return t.tailwind.cssVariables&&(i.tailwind.config.theme.extend.colors={...i.tailwind.config.theme.extend.colors,...Me(r.cssVars.dark)},i.cssVars={light:{...r.cssVars.light,...i.cssVars.light},dark:{...r.cssVars.dark,...i.cssVars.dark}}),i}function Qe(e){if(he(e)){let t=new URL(e);return t.pathname.match(/\/chat\/b\//)&&!t.pathname.endsWith("/json")&&(t.pathname=`${t.pathname}/json`),t.toString()}return`${Xt}/${e}`}function he(e){try{return new URL(e),!0}catch{return!1}}import{promises as He}from"fs";import er from"path";import j from"postcss";import tr from"postcss/lib/at-rule";async function Xe(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=er.relative(t.resolvedPaths.cwd,i),s=y(`Updating ${l.info(n)}`,{silent:r.silent}).start(),o=await He.readFile(i,"utf8"),c=await rr(o,e,t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles});await He.writeFile(i,c,"utf8"),s.succeed()}async function rr(e,t,r,i){i={cleanupDefaultNextStyles:!1,...i};let n=[nr(t)];return i.cleanupDefaultNextStyles&&n.push(sr()),r.tailwind.cssVariables&&n.push(ir()),(await j(n).process(e,{from:void 0})).css}function ir(){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(c=>c.type==="atrule"&&c.name==="apply"&&c.params===s))));r||(r=j.atRule({name:"layer",params:"base",raws:{semicolon:!0,between:" ",before:`
|
|
13
14
|
`}}),e.append(r)),t.forEach(({selector:i,apply:n})=>{r?.nodes?.find(o=>o.type==="rule"&&o.selector===i)||r?.append(j.rule({selector:i,nodes:[j.atRule({name:"apply",params:n,raws:{semicolon:!0,before:`
|
|
14
15
|
`}})],raws:{semicolon:!0,between:" ",before:`
|
|
15
16
|
`}}))})}}}function nr(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 tr||(r=j.atRule({name:"layer",params:"base",nodes:[],raws:{semicolon:!0,before:`
|
|
16
17
|
`,between:" "}}),t.append(r)),r!==void 0&&Object.entries(e).forEach(([i,n])=>{let s=i==="light"?":root":`.${i}`;or(r,s,n)})}}}function sr(){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 or(e,t,r){let i=e.nodes?.find(n=>n.type==="rule"&&n.selector===t);i||Object.keys(r).length>0&&(i=j.rule({selector:t,raws:{between:" ",before:`
|
|
17
|
-
`}}),e.append(i)),Object.entries(r).forEach(([n,s])=>{let o=`--${n.replace(/^--/,"")}`,c=j.decl({prop:o,value:s,raws:{semicolon:!0}}),p=i?.nodes.find(d=>d.type==="decl"&&d.prop===o);p?p.replaceWith(c):i?.append(c)})}import{detect as ar}from"@antfu/ni";async function Y(e,{withFallback:t}={withFallback:!1}){let r=await ar({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 lr}from"execa";async function qe(e,t,r){if(e=Array.from(new Set(e)),!e?.length)return;r={silent:!1,...r};let i=y("Installing dependencies.",{silent:r.silent})?.start(),n=await Y(t.resolvedPaths.cwd);await lr(n,[n==="npm"?"install":"add",...e],{cwd:t.resolvedPaths.cwd}),i?.succeed()}import{existsSync as tt,promises as rt}from"fs";import $,{basename as vr}from"path";import{promises as wr}from"fs";import{tmpdir as xr}from"os";import et from"path";import{SyntaxKind as cr}from"ts-morph";var Q=async({sourceFile:e,config:t,baseColor:r})=>(t.tailwind?.cssVariables||!r?.inlineColors||e.getDescendantsOfKind(cr.StringLiteral).forEach(i=>{let n=i.getText();if(n){let s=mr(n.replace(/"/g,""),r.inlineColors);i.replaceWithText(`"${s.trim()}"`)}}),e);function ye(e){if(!e.includes("/")&&!e.includes(":"))return[null,e,null];let t=[],[r,i]=e.split("/");if(!r.includes(":"))return[null,r,i];let n=r.split(":"),s=n.pop(),o=n.join(":");return t.push(o??null,s??null,i??null),t}var pr=["bg-","text-","border-","ring-offset-","ring-"];function mr(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,c,p]=ye(s),d=pr.find(f=>c?.startsWith(f));if(!d){i.has(s)||i.add(s);continue}let u=c?.replace(d,"");if(u&&u in t.light){i.add([o,`${d}${t.light[u]}`].filter(Boolean).join(":")+(p?`/${p}`:"")),n.add(["dark",o,`${d}${t.dark[u]}`].filter(Boolean).join(":")+(p?`/${p}`:""));continue}i.has(s)||i.add(s)}return[...Array.from(i),...Array.from(n)].join(" ").trim()}var H=async({sourceFile:e,config:t})=>{let r=e.getImportDeclarations();for(let i of r){let n=fr(i.getModuleSpecifierValue(),t);i.setModuleSpecifier(n),n=="@/lib/utils"&&i.getNamedImports().find(c=>c.getName()==="cn")&&i.setModuleSpecifier(n.replace(/^@\/lib\/utils/,t.aliases.utils))}return e};function fr(e,t){if(!e.startsWith("@/"))return e;if(!e.startsWith("@/registry/")){let r=t.aliases.components.charAt(0);return e.replace(/^@\//,`${r}/`)}return e.match(/^@\/registry\/(.+)\/ui/)?e.replace(/^@\/registry\/(.+)\/ui/,t.aliases.ui??`${t.aliases.components}/ui`):t.aliases.components&&e.match(/^@\/registry\/(.+)\/components/)?e.replace(/^@\/registry\/(.+)\/components/,t.aliases.components):t.aliases.lib&&e.match(/^@\/registry\/(.+)\/lib/)?e.replace(/^@\/registry\/(.+)\/lib/,t.aliases.lib):t.aliases.hooks&&e.match(/^@\/registry\/(.+)\/hooks/)?e.replace(/^@\/registry\/(.+)\/hooks/,t.aliases.hooks):e.replace(/^@\/registry\/[^/]+/,t.aliases.components)}import{transformFromAstSync as dr}from"@babel/core";import{parse as ur}from"@babel/parser";import gr from"@babel/plugin-transform-typescript";import*as X from"recast";var hr={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"]},Ze=async({sourceFile:e,config:t})=>{let r=e.getFullText();if(t.tsx)return r;let i=X.parse(r,{parser:{parse:s=>ur(s,hr)}}),n=dr(i,r,{cloneInputAst:!1,code:!1,ast:!0,plugins:[gr],configFile:!1});if(!n||!n.ast)throw new Error("Failed to transform JSX");return X.print(n.ast).code};import{SyntaxKind as yr}from"ts-morph";var q=async({sourceFile:e,config:t})=>{if(t.rsc)return e;let r=e.getFirstChildByKind(yr.ExpressionStatement);return r?.getText()==='"use client"'&&r.remove(),e};import{Project as br,ScriptKind as Sr}from"ts-morph";import{SyntaxKind as w}from"ts-morph";var Z=async({sourceFile:e,config:t})=>(t.tailwind?.prefix&&(e.getDescendantsOfKind(w.CallExpression).filter(r=>r.getExpression().getText()==="cva").forEach(r=>{if(r.getArguments()[0]?.isKind(w.StringLiteral)){let i=r.getArguments()[0];i&&i.replaceWithText(`"${k(i.getText()?.replace(/"/g,""),t.tailwind.prefix)}"`)}r.getArguments()[1]?.isKind(w.ObjectLiteralExpression)&&r.getArguments()[1]?.getDescendantsOfKind(w.PropertyAssignment).find(i=>i.getName()==="variants")?.getDescendantsOfKind(w.PropertyAssignment).forEach(i=>{i.getDescendantsOfKind(w.PropertyAssignment).forEach(n=>{let s=n.getInitializerIfKind(w.StringLiteral);s&&s?.replaceWithText(`"${k(s.getText()?.replace(/"/g,""),t.tailwind.prefix)}"`)})})}),e.getDescendantsOfKind(w.JsxAttribute).forEach(r=>{if(r.getName()==="className"){if(r.getInitializer()?.isKind(w.StringLiteral)){let i=r.getInitializer();i&&i.replaceWithText(`"${k(i.getText()?.replace(/"/g,""),t.tailwind.prefix)}"`)}if(r.getInitializer()?.isKind(w.JsxExpression)){let i=r.getInitializer()?.getDescendantsOfKind(w.CallExpression).find(n=>n.getExpression().getText()==="cn");i&&i.getArguments().forEach(n=>{(n.isKind(w.ConditionalExpression)||n.isKind(w.BinaryExpression))&&n.getChildrenOfKind(w.StringLiteral).forEach(s=>{s.replaceWithText(`"${k(s.getText()?.replace(/"/g,""),t.tailwind.prefix)}"`)}),n.isKind(w.StringLiteral)&&n.replaceWithText(`"${k(n.getText()?.replace(/"/g,""),t.tailwind.prefix)}"`)})}}r.getName()==="classNames"&&r.getInitializer()?.isKind(w.JsxExpression)&&r.getDescendantsOfKind(w.PropertyAssignment).forEach(i=>{if(i.getInitializer()?.isKind(w.CallExpression)){let n=i.getInitializerIfKind(w.CallExpression);n&&n.getArguments().forEach(s=>{s.isKind(w.ConditionalExpression)&&s.getChildrenOfKind(w.StringLiteral).forEach(o=>{o.replaceWithText(`"${k(o.getText()?.replace(/"/g,""),t.tailwind.prefix)}"`)}),s.isKind(w.StringLiteral)&&s.replaceWithText(`"${k(s.getText()?.replace(/"/g,""),t.tailwind.prefix)}"`)})}if(i.getInitializer()?.isKind(w.StringLiteral)&&i.getName()!=="variant"){let n=i.getInitializer();n&&n.replaceWithText(`"${k(n.getText()?.replace(/"/g,""),t.tailwind.prefix)}"`)}})})),e);function k(e,t=""){let r=e.split(" "),i=[];for(let n of r){let[s,o,c]=ye(n);s?c?i.push(`${s}:${t}${o}/${c}`):i.push(`${s}:${t}${o}`):c?i.push(`${t}${o}/${c}`):i.push(`${t}${o}`)}return i.join(" ")}var Cr=new br({compilerOptions:{}});async function Pr(e){let t=await wr.mkdtemp(et.join(xr(),"shadcn-"));return et.join(t,e)}async function ee(e,t=[H,q,Q,Z]){let r=await Pr(e.filename),i=Cr.createSourceFile(r,e.raw,{scriptKind:Sr.TSX});for(let n of t)n({sourceFile:i,...e});return e.transformJsx?await Ze({sourceFile:i,...e}):i.getText()}import Tr from"prompts";async function it(e,t,r){if(!e?.length)return;r={overwrite:!1,force:!1,silent:!1,...r};let i=y("Updating files.",{silent:r.silent})?.start(),[n,s]=await Promise.all([E(t.resolvedPaths.cwd),K(t.tailwind.baseColor)]),o=[],c=[],p=[];for(let u of e){if(!u.content)continue;let f=Je(u,t),b=vr(u.path),C=$.join(f,b);u.target&&(C=n?.isSrcDir?$.join(t.resolvedPaths.cwd,"src",u.target):$.join(t.resolvedPaths.cwd,u.target),f=$.dirname(C)),t.tsx||(C=C.replace(/\.tsx?$/,se=>se===".tsx"?".jsx":".js"));let ve=tt(C);if(ve&&!r.overwrite){i.stop();let{overwrite:se}=await Tr({type:"confirm",name:"overwrite",message:`The file ${l.info(b)} already exists. Would you like to overwrite?`,initial:!1});if(!se){p.push($.relative(t.resolvedPaths.cwd,C));continue}i?.start()}tt(f)||await rt.mkdir(f,{recursive:!0});let yt=await ee({filename:u.path,raw:u.content,config:t,baseColor:s,transformJsx:!t.tsx},[H,q,Q,Z]);await rt.writeFile(C,yt,"utf-8"),ve?c.push($.relative(t.resolvedPaths.cwd,C)):o.push($.relative(t.resolvedPaths.cwd,C))}if(!(o.length||c.length)&&!p.length&&i?.info("No files updated."),o.length){if(i?.succeed(`Created ${o.length} ${o.length===1?"file":"files"}:`),!r.silent)for(let u of o)a.log(` - ${u}`)}else i?.stop();if(c.length&&(y(`Updated ${c.length} ${c.length===1?"file":"files"}:`,{silent:r.silent})?.info(),!r.silent))for(let u of c)a.log(` - ${u}`);if(p.length&&(y(`Skipped ${p.length} ${c.length===1?"file":"files"}:`,{silent:r.silent})?.info(),!r.silent))for(let u of p)a.log(` - ${u}`);r.silent||a.break()}async function te(e,t,r){r={overwrite:!1,silent:!1,isNewProject:!1,...r};let i=y("Checking registry.",{silent:r.silent})?.start(),n=await Ye(e,t);if(!n)return i?.fail(),x(new Error("Failed to fetch components from registry."));i?.succeed(),await ze(n.tailwind?.config,t,{silent:r.silent}),await Xe(n.cssVars,t,{cleanupDefaultNextStyles:r.isNewProject,silent:r.silent}),await qe(n.dependencies,t,{silent:r.silent}),await it(n.files,t,{overwrite:r.overwrite,silent:r.silent})}import Ir from"path";import{execa as Rr}from"execa";import we from"fs-extra";import nt from"prompts";async function re(e){if(e={srcDir:!1,...e},!e.force){let{proceed:o}=await nt({type:"confirm",name:"proceed",message:`The path ${l.info(e.cwd)} is does not contain a package.json file. Would you like to start a new ${l.info("Next.js")} project?`,initial:!0});if(!o)return{projectPath:null,projectName:null}}let t=await Y(e.cwd),{name:r}=await nt({type:"text",name:"name",message:"What is your project named?",initial:"my-app",format:o=>o.trim(),validate:o=>o.length>128?"Name should be less than 128 characters.":!0}),i=`${e.cwd}/${r}`;try{await we.access(e.cwd,we.constants.W_OK)}catch{a.break(),a.error(`The path ${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)}we.existsSync(Ir.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=y("Creating a new Next.js project. This may take a few minutes.").start(),s=["--tailwind","--eslint","--typescript","--app",e.srcDir?"--src-dir":"--no-src-dir","--no-import-alias",`--use-${t}`];try{await Rr("npx",["create-next-app@latest",i,"--silent",...s],{cwd:e.cwd})}catch{a.break(),a.error("Something went wrong creating a new Next.js project. Please try again."),process.exit(1)}return n?.succeed("Creating a new Next.js project."),{projectPath:i,projectName:r}}import{promises as st}from"fs";import kr from"path";import{SyntaxKind as ie}from"ts-morph";async function ot(e,t,r){if(!e)return;r={silent:!1,...r};let i=kr.relative(t.resolvedPaths.cwd,t.resolvedPaths.tailwindConfig),n=y(`Updating ${l.info(i)}`,{silent:r.silent}).start(),s=await st.readFile(t.resolvedPaths.tailwindConfig,"utf8"),o=await Er(s,e,t);await st.writeFile(t.resolvedPaths.tailwindConfig,o,"utf8"),n?.succeed()}async function Er(e,t,r){let i=await B(e,r),n=i.getDescendantsOfKind(ie.ObjectLiteralExpression).find(s=>s.getProperties().some(o=>o.isKind(ie.PropertyAssignment)&&o.getName()==="content"));return n?(jr(n,t),i.getFullText()):e}async function jr(e,t){let r=de(e),i=e.getProperty("content");if(!i){let n={name:"content",initializer:`[${r}${t.join(`${r}, ${r}`)}${r}]`};return e.addPropertyAssignment(n),e}if(i.isKind(ie.PropertyAssignment)){let n=i.getInitializer();if(n?.isKind(ie.ArrayLiteralExpression))for(let s of t){let o=`${r}${s}${r}`;n.getElements().map(c=>c.getText()).includes(o)||n.addElement(o)}return e}return e}import{Command as Or}from"commander";import xe from"prompts";import{z as P}from"zod";var Nr=P.object({cwd:P.string(),components:P.array(P.string()).optional(),yes:P.boolean(),defaults:P.boolean(),force:P.boolean(),silent:P.boolean(),isNewProject:P.boolean(),srcDir:P.boolean().optional()}),lt=new Or().name("init").description("initialize your project and install dependencies").argument("[components...]","the components to add or a url to the component.").option("-y, --yes","skip confirmation prompt.",!0).option("-d, --defaults,","use default configuration.",!1).option("-f, --force","force overwrite of existing configuration.",!1).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",!1).option("--src-dir","use the src directory when creating a new project.",!1).action(async(e,t)=>{try{let r=Nr.parse({cwd:at.resolve(t.cwd),isNewProject:!1,components:e,...t});await ne(r),a.log(`${l.success("Success!")} Project initialization completed.
|
|
18
|
-
You may now add components.`),a.break()}catch(r){a.break(),
|
|
18
|
+
`}}),e.append(i)),Object.entries(r).forEach(([n,s])=>{let o=`--${n.replace(/^--/,"")}`,c=j.decl({prop:o,value:s,raws:{semicolon:!0}}),p=i?.nodes.find(d=>d.type==="decl"&&d.prop===o);p?p.replaceWith(c):i?.append(c)})}import{detect as ar}from"@antfu/ni";async function Y(e,{withFallback:t}={withFallback:!1}){let r=await ar({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 lr}from"execa";async function qe(e,t,r){if(e=Array.from(new Set(e)),!e?.length)return;r={silent:!1,...r};let i=y("Installing dependencies.",{silent:r.silent})?.start(),n=await Y(t.resolvedPaths.cwd);await lr(n,[n==="npm"?"install":"add",...e],{cwd:t.resolvedPaths.cwd}),i?.succeed()}import{existsSync as tt,promises as rt}from"fs";import $,{basename as vr}from"path";import{promises as wr}from"fs";import{tmpdir as xr}from"os";import et from"path";import{SyntaxKind as cr}from"ts-morph";var Q=async({sourceFile:e,config:t,baseColor:r})=>(t.tailwind?.cssVariables||!r?.inlineColors||e.getDescendantsOfKind(cr.StringLiteral).forEach(i=>{let n=i.getText();if(n){let s=mr(n.replace(/"/g,""),r.inlineColors);i.replaceWithText(`"${s.trim()}"`)}}),e);function ye(e){if(!e.includes("/")&&!e.includes(":"))return[null,e,null];let t=[],[r,i]=e.split("/");if(!r.includes(":"))return[null,r,i];let n=r.split(":"),s=n.pop(),o=n.join(":");return t.push(o??null,s??null,i??null),t}var pr=["bg-","text-","border-","ring-offset-","ring-"];function mr(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,c,p]=ye(s),d=pr.find(x=>c?.startsWith(x));if(!d){i.has(s)||i.add(s);continue}let u=c?.replace(d,"");if(u&&u in t.light){i.add([o,`${d}${t.light[u]}`].filter(Boolean).join(":")+(p?`/${p}`:"")),n.add(["dark",o,`${d}${t.dark[u]}`].filter(Boolean).join(":")+(p?`/${p}`:""));continue}i.has(s)||i.add(s)}return[...Array.from(i),...Array.from(n)].join(" ").trim()}var H=async({sourceFile:e,config:t})=>{let r=e.getImportDeclarations();for(let i of r){let n=fr(i.getModuleSpecifierValue(),t);i.setModuleSpecifier(n),n=="@/lib/utils"&&i.getNamedImports().find(c=>c.getName()==="cn")&&i.setModuleSpecifier(n.replace(/^@\/lib\/utils/,t.aliases.utils))}return e};function fr(e,t){if(!e.startsWith("@/"))return e;if(!e.startsWith("@/registry/")){let r=t.aliases.components.charAt(0);return e.replace(/^@\//,`${r}/`)}return e.match(/^@\/registry\/(.+)\/ui/)?e.replace(/^@\/registry\/(.+)\/ui/,t.aliases.ui??`${t.aliases.components}/ui`):t.aliases.components&&e.match(/^@\/registry\/(.+)\/components/)?e.replace(/^@\/registry\/(.+)\/components/,t.aliases.components):t.aliases.lib&&e.match(/^@\/registry\/(.+)\/lib/)?e.replace(/^@\/registry\/(.+)\/lib/,t.aliases.lib):t.aliases.hooks&&e.match(/^@\/registry\/(.+)\/hooks/)?e.replace(/^@\/registry\/(.+)\/hooks/,t.aliases.hooks):e.replace(/^@\/registry\/[^/]+/,t.aliases.components)}import{transformFromAstSync as dr}from"@babel/core";import{parse as ur}from"@babel/parser";import gr from"@babel/plugin-transform-typescript";import*as X from"recast";var hr={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"]},Ze=async({sourceFile:e,config:t})=>{let r=e.getFullText();if(t.tsx)return r;let i=X.parse(r,{parser:{parse:s=>ur(s,hr)}}),n=dr(i,r,{cloneInputAst:!1,code:!1,ast:!0,plugins:[gr],configFile:!1});if(!n||!n.ast)throw new Error("Failed to transform JSX");return X.print(n.ast).code};import{SyntaxKind as yr}from"ts-morph";var q=async({sourceFile:e,config:t})=>{if(t.rsc)return e;let r=e.getFirstChildByKind(yr.ExpressionStatement);return r?.getText()==='"use client"'&&r.remove(),e};import{Project as br,ScriptKind as Sr}from"ts-morph";import{SyntaxKind as w}from"ts-morph";var Z=async({sourceFile:e,config:t})=>(t.tailwind?.prefix&&(e.getDescendantsOfKind(w.CallExpression).filter(r=>r.getExpression().getText()==="cva").forEach(r=>{if(r.getArguments()[0]?.isKind(w.StringLiteral)){let i=r.getArguments()[0];i&&i.replaceWithText(`"${k(i.getText()?.replace(/"/g,""),t.tailwind.prefix)}"`)}r.getArguments()[1]?.isKind(w.ObjectLiteralExpression)&&r.getArguments()[1]?.getDescendantsOfKind(w.PropertyAssignment).find(i=>i.getName()==="variants")?.getDescendantsOfKind(w.PropertyAssignment).forEach(i=>{i.getDescendantsOfKind(w.PropertyAssignment).forEach(n=>{let s=n.getInitializerIfKind(w.StringLiteral);s&&s?.replaceWithText(`"${k(s.getText()?.replace(/"/g,""),t.tailwind.prefix)}"`)})})}),e.getDescendantsOfKind(w.JsxAttribute).forEach(r=>{if(r.getName()==="className"){if(r.getInitializer()?.isKind(w.StringLiteral)){let i=r.getInitializer();i&&i.replaceWithText(`"${k(i.getText()?.replace(/"/g,""),t.tailwind.prefix)}"`)}if(r.getInitializer()?.isKind(w.JsxExpression)){let i=r.getInitializer()?.getDescendantsOfKind(w.CallExpression).find(n=>n.getExpression().getText()==="cn");i&&i.getArguments().forEach(n=>{(n.isKind(w.ConditionalExpression)||n.isKind(w.BinaryExpression))&&n.getChildrenOfKind(w.StringLiteral).forEach(s=>{s.replaceWithText(`"${k(s.getText()?.replace(/"/g,""),t.tailwind.prefix)}"`)}),n.isKind(w.StringLiteral)&&n.replaceWithText(`"${k(n.getText()?.replace(/"/g,""),t.tailwind.prefix)}"`)})}}r.getName()==="classNames"&&r.getInitializer()?.isKind(w.JsxExpression)&&r.getDescendantsOfKind(w.PropertyAssignment).forEach(i=>{if(i.getInitializer()?.isKind(w.CallExpression)){let n=i.getInitializerIfKind(w.CallExpression);n&&n.getArguments().forEach(s=>{s.isKind(w.ConditionalExpression)&&s.getChildrenOfKind(w.StringLiteral).forEach(o=>{o.replaceWithText(`"${k(o.getText()?.replace(/"/g,""),t.tailwind.prefix)}"`)}),s.isKind(w.StringLiteral)&&s.replaceWithText(`"${k(s.getText()?.replace(/"/g,""),t.tailwind.prefix)}"`)})}if(i.getInitializer()?.isKind(w.StringLiteral)&&i.getName()!=="variant"){let n=i.getInitializer();n&&n.replaceWithText(`"${k(n.getText()?.replace(/"/g,""),t.tailwind.prefix)}"`)}})})),e);function k(e,t=""){let r=e.split(" "),i=[];for(let n of r){let[s,o,c]=ye(n);s?c?i.push(`${s}:${t}${o}/${c}`):i.push(`${s}:${t}${o}`):c?i.push(`${t}${o}/${c}`):i.push(`${t}${o}`)}return i.join(" ")}var Cr=new br({compilerOptions:{}});async function Pr(e){let t=await wr.mkdtemp(et.join(xr(),"shadcn-"));return et.join(t,e)}async function ee(e,t=[H,q,Q,Z]){let r=await Pr(e.filename),i=Cr.createSourceFile(r,e.raw,{scriptKind:Sr.TSX});for(let n of t)n({sourceFile:i,...e});return e.transformJsx?await Ze({sourceFile:i,...e}):i.getText()}import Tr from"prompts";async function it(e,t,r){if(!e?.length)return;r={overwrite:!1,force:!1,silent:!1,...r};let i=y("Updating files.",{silent:r.silent})?.start(),[n,s]=await Promise.all([E(t.resolvedPaths.cwd),K(t.tailwind.baseColor)]),o=[],c=[],p=[];for(let u of e){if(!u.content)continue;let x=Je(u,t),f=vr(u.path),S=$.join(x,f);u.target&&(S=n?.isSrcDir?$.join(t.resolvedPaths.cwd,"src",u.target):$.join(t.resolvedPaths.cwd,u.target),x=$.dirname(S)),t.tsx||(S=S.replace(/\.tsx?$/,se=>se===".tsx"?".jsx":".js"));let ve=tt(S);if(ve&&!r.overwrite){i.stop();let{overwrite:se}=await Tr({type:"confirm",name:"overwrite",message:`The file ${l.info(f)} already exists. Would you like to overwrite?`,initial:!1});if(!se){p.push($.relative(t.resolvedPaths.cwd,S));continue}i?.start()}tt(x)||await rt.mkdir(x,{recursive:!0});let yt=await ee({filename:u.path,raw:u.content,config:t,baseColor:s,transformJsx:!t.tsx},[H,q,Q,Z]);await rt.writeFile(S,yt,"utf-8"),ve?c.push($.relative(t.resolvedPaths.cwd,S)):o.push($.relative(t.resolvedPaths.cwd,S))}if(!(o.length||c.length)&&!p.length&&i?.info("No files updated."),o.length){if(i?.succeed(`Created ${o.length} ${o.length===1?"file":"files"}:`),!r.silent)for(let u of o)a.log(` - ${u}`)}else i?.stop();if(c.length&&(y(`Updated ${c.length} ${c.length===1?"file":"files"}:`,{silent:r.silent})?.info(),!r.silent))for(let u of c)a.log(` - ${u}`);if(p.length&&(y(`Skipped ${p.length} ${c.length===1?"file":"files"}:`,{silent:r.silent})?.info(),!r.silent))for(let u of p)a.log(` - ${u}`);r.silent||a.break()}async function te(e,t,r){r={overwrite:!1,silent:!1,isNewProject:!1,...r};let i=y("Checking registry.",{silent:r.silent})?.start(),n=await Ye(e,t);if(!n)return i?.fail(),b(new Error("Failed to fetch components from registry."));i?.succeed(),await ze(n.tailwind?.config,t,{silent:r.silent}),await Xe(n.cssVars,t,{cleanupDefaultNextStyles:r.isNewProject,silent:r.silent}),await qe(n.dependencies,t,{silent:r.silent}),await it(n.files,t,{overwrite:r.overwrite,silent:r.silent}),n.docs&&a.info(n.docs)}import Ir from"path";import{execa as Rr}from"execa";import we from"fs-extra";import nt from"prompts";async function re(e){if(e={srcDir:!1,...e},!e.force){let{proceed:o}=await nt({type:"confirm",name:"proceed",message:`The path ${l.info(e.cwd)} is does not contain a package.json file. Would you like to start a new ${l.info("Next.js")} project?`,initial:!0});if(!o)return{projectPath:null,projectName:null}}let t=await Y(e.cwd),{name:r}=await nt({type:"text",name:"name",message:"What is your project named?",initial:"my-app",format:o=>o.trim(),validate:o=>o.length>128?"Name should be less than 128 characters.":!0}),i=`${e.cwd}/${r}`;try{await we.access(e.cwd,we.constants.W_OK)}catch{a.break(),a.error(`The path ${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)}we.existsSync(Ir.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=y("Creating a new Next.js project. This may take a few minutes.").start(),s=["--tailwind","--eslint","--typescript","--app",e.srcDir?"--src-dir":"--no-src-dir","--no-import-alias",`--use-${t}`];try{await Rr("npx",["create-next-app@latest",i,"--silent",...s],{cwd:e.cwd})}catch{a.break(),a.error("Something went wrong creating a new Next.js project. Please try again."),process.exit(1)}return n?.succeed("Creating a new Next.js project."),{projectPath:i,projectName:r}}import{promises as st}from"fs";import kr from"path";import{SyntaxKind as ie}from"ts-morph";async function ot(e,t,r){if(!e)return;r={silent:!1,...r};let i=kr.relative(t.resolvedPaths.cwd,t.resolvedPaths.tailwindConfig),n=y(`Updating ${l.info(i)}`,{silent:r.silent}).start(),s=await st.readFile(t.resolvedPaths.tailwindConfig,"utf8"),o=await Er(s,e,t);await st.writeFile(t.resolvedPaths.tailwindConfig,o,"utf8"),n?.succeed()}async function Er(e,t,r){let i=await B(e,r),n=i.getDescendantsOfKind(ie.ObjectLiteralExpression).find(s=>s.getProperties().some(o=>o.isKind(ie.PropertyAssignment)&&o.getName()==="content"));return n?(jr(n,t),i.getFullText()):e}async function jr(e,t){let r=de(e),i=e.getProperty("content");if(!i){let n={name:"content",initializer:`[${r}${t.join(`${r}, ${r}`)}${r}]`};return e.addPropertyAssignment(n),e}if(i.isKind(ie.PropertyAssignment)){let n=i.getInitializer();if(n?.isKind(ie.ArrayLiteralExpression))for(let s of t){let o=`${r}${s}${r}`;n.getElements().map(c=>c.getText()).includes(o)||n.addElement(o)}return e}return e}import{Command as Or}from"commander";import xe from"prompts";import{z as P}from"zod";var Nr=P.object({cwd:P.string(),components:P.array(P.string()).optional(),yes:P.boolean(),defaults:P.boolean(),force:P.boolean(),silent:P.boolean(),isNewProject:P.boolean(),srcDir:P.boolean().optional()}),lt=new Or().name("init").description("initialize your project and install dependencies").argument("[components...]","the components to add or a url to the component.").option("-y, --yes","skip confirmation prompt.",!0).option("-d, --defaults,","use default configuration.",!1).option("-f, --force","force overwrite of existing configuration.",!1).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",!1).option("--src-dir","use the src directory when creating a new project.",!1).action(async(e,t)=>{try{let r=Nr.parse({cwd:at.resolve(t.cwd),isNewProject:!1,components:e,...t});await ne(r),a.log(`${l.success("Success!")} Project initialization completed.
|
|
19
|
+
You may now add components.`),a.break()}catch(r){a.break(),b(r)}});async function ne(e){let t;if(e.skipPreflight)t=await E(e.cwd);else{let p=await Oe(e);if(p.errors[I]){let{projectPath:d}=await re(e);d||process.exit(1),e.cwd=d,e.isNewProject=!0}t=p.projectInfo}let r=await je(e.cwd,t),i=r?await Fr(r,e):await Ar(await R(e.cwd));if(!e.yes){let{proceed:p}=await xe({type:"confirm",name:"proceed",message:`Write configuration to ${l.info("components.json")}. Proceed?`,initial:!0});p||process.exit(0)}let n=y("Writing components.json.").start(),s=at.resolve(e.cwd,"components.json");await $r.writeFile(s,JSON.stringify(i,null,2),"utf8"),n.succeed();let o=await F(e.cwd,i),c=["index",...e.components||[]];return await te(c,o,{overwrite:!0,silent:e.silent,isNewProject:e.isNewProject||t?.framework.name==="next-app"}),e.isNewProject&&e.srcDir&&await ot(["./src/**/*.{js,ts,jsx,tsx,mdx}"],o,{silent:e.silent}),o}async function Ar(e=null){let[t,r]=await Promise.all([ue(),ge()]);a.info("");let i=await xe([{type:"toggle",name:"typescript",message:`Would you like to use ${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??ke},{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??Ee},{type:"text",name:"components",message:`Configure the import alias for ${l.info("components")}:`,initial:e?.aliases.components??Ie},{type:"text",name:"utils",message:`Configure the import alias for ${l.info("utils")}:`,initial:e?.aliases.utils??Re},{type:"toggle",name:"rsc",message:`Are you using ${l.info("React Server Components")}?`,initial:e?.rsc??!0,active:"yes",inactive:"no"}]);return A.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 Fr(e,t){let r=e.style,i=e.tailwind.baseColor,n=e.tailwind.cssVariables;if(!t.defaults){let[s,o]=await Promise.all([ue(),ge()]),c=await xe([{type:"select",name:"style",message:`Which ${l.info("style")} would you like to use?`,choices:s.map(p=>({title:p.label,value:p.name})),initial:s.findIndex(p=>p.name===r)},{type:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${l.info("base color")}?`,choices:o.map(p=>({title:p.label,value:p.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=c.style,i=c.tailwindBaseColor,n=c.tailwindCssVariables}return A.parse({$schema:e?.$schema,style:r,tailwind:{...e?.tailwind,baseColor:i,cssVariables:n},rsc:e?.rsc,tsx:e?.tsx,aliases:e?.aliases})}import ct from"path";import be from"fs-extra";async function pt(e){let t={};if(!be.existsSync(e.cwd)||!be.existsSync(ct.resolve(e.cwd,"package.json")))return t[I]=!0,{errors:t,config:null};if(!be.existsSync(ct.resolve(e.cwd,"components.json")))return t[V]=!0,{errors:t,config:null};try{let r=await R(e.cwd);return{errors:t,config:r}}catch{a.break(),a.error(`An invalid ${l.info("components.json")} file was found at ${l.info(e.cwd)}.
|
|
19
20
|
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 mt from"fs/promises";import Dr from"path";async function ft(e,t){let r=Dr.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await mt.stat(r)).isFile())return;let i=await J(e,t.style);if(!i?.meta?.importSpecifier||!i?.meta?.moduleSpecifier)return;let n=`import { ${i?.meta?.importSpecifier} } from "${i.meta.moduleSpecifier}"
|
|
20
21
|
|
|
21
22
|
export default function Page() {
|
|
22
23
|
return <${i?.meta?.importSpecifier} />
|
|
23
|
-
}`;await mt.writeFile(r,n,"utf8")}import{Command as _r}from"commander";import Se from"prompts";import{z as
|
|
24
|
-
Existing CSS variables will be overwritten. Continue?`)});c||(a.break(),a.log("Theme installation cancelled."),a.break(),process.exit(1))}r.components?.length||(r.components=await Kr(r));let{errors:n,config:s}=await pt(r);if(n[V]){let{proceed:c}=await Se({type:"confirm",name:"proceed",message:`You need to create a ${l.info("component.json")} file to add components. Proceed?`,initial:!0});c||(a.break(),process.exit(1)),s=await ne({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:!0,isNewProject:!1,srcDir:r.srcDir})}let o=!1;if(n[I]){let{projectPath:c}=await re({cwd:r.cwd,force:r.overwrite,srcDir:r.srcDir});c||(a.break(),process.exit(1)),r.cwd=c,s=await ne({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!0,isNewProject:!0,srcDir:r.srcDir}),o=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//)}if(!s)throw new Error(`Failed to read config at ${l.info(r.cwd)}.`);await te(r.components,s,r),o&&await ft(r.components[0],s)}catch(r){a.break(),
|
|
24
|
+
}`;await mt.writeFile(r,n,"utf8")}import{Command as _r}from"commander";import Se from"prompts";import{z as C}from"zod";var zr=C.object({components:C.array(C.string()).optional(),yes:C.boolean(),overwrite:C.boolean(),cwd:C.string(),all:C.boolean(),path:C.string().optional(),silent:C.boolean(),srcDir:C.boolean().optional()}),dt=new _r().name("add").description("add a component to your project").argument("[components...]","the components to add or a url to the component.").option("-y, --yes","skip confirmation prompt.",!1).option("-o, --overwrite","overwrite existing files.",!1).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-a, --all","add all available components",!1).option("-p, --path <path>","the path to add the component to.").option("-s, --silent","mute output.",!1).option("--src-dir","use the src directory when creating a new project.",!1).action(async(e,t)=>{try{let r=zr.parse({components:e,cwd:Lr.resolve(t.cwd),...t}),i=r.components?.some(c=>c.includes("theme-"));if(!r.yes&&i){a.break();let{confirm:c}=await Se({type:"confirm",name:"confirm",message:l.warn(`You are about to install a new theme.
|
|
25
|
+
Existing CSS variables will be overwritten. Continue?`)});c||(a.break(),a.log("Theme installation cancelled."),a.break(),process.exit(1))}r.components?.length||(r.components=await Kr(r));let{errors:n,config:s}=await pt(r);if(n[V]){let{proceed:c}=await Se({type:"confirm",name:"proceed",message:`You need to create a ${l.info("component.json")} file to add components. Proceed?`,initial:!0});c||(a.break(),process.exit(1)),s=await ne({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:!0,isNewProject:!1,srcDir:r.srcDir})}let o=!1;if(n[I]){let{projectPath:c}=await re({cwd:r.cwd,force:r.overwrite,srcDir:r.srcDir});c||(a.break(),process.exit(1)),r.cwd=c,s=await ne({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!0,isNewProject:!0,srcDir:r.srcDir}),o=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//)}if(!s)throw new Error(`Failed to read config at ${l.info(r.cwd)}.`);await te(r.components,s,r),o&&await ft(r.components[0],s)}catch(r){a.break(),b(r)}});async function Kr(e){let t=await z();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 Se({type:"multiselect",name:"components",message:"Which components would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:!1,choices:t.filter(n=>n.type==="registry:ui").map(n=>({title:n.name,value:n.name,selected:e.all?!0:e.components?.includes(n.name)}))});r?.length||(a.warn("No components selected. Exiting."),a.info(""),process.exit(1));let i=C.array(C.string()).safeParse(r);return i.success?i.data:(a.error(""),b(new Error("Something went wrong. Please try again.")),[])}import{existsSync as Ce,promises as Wr}from"fs";import Pe from"path";import{Command as Vr}from"commander";import{diffLines as Ur}from"diff";import{z as W}from"zod";var Mr=W.object({component:W.string().optional(),yes:W.boolean(),cwd:W.string(),path:W.string().optional()}),gt=new Vr().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=Mr.parse({component:e,...t}),i=Pe.resolve(r.cwd);Ce(i)||(a.error(`The path ${i} does not exist. Please try again.`),process.exit(1));let n=await 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 z();if(s||(b(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let p=n.resolvedPaths.components,d=s.filter(x=>{for(let f of x.files??[]){let S=Pe.resolve(p,typeof f=="string"?f:f.path);if(Ce(S))return!0}return!1}),u=[];for(let x of d){let f=await ut(x,n);f.length&&u.push({name:x.name,changes:f})}u.length||(a.info("No updates found."),process.exit(0)),a.info("The following components have updates available:");for(let x of u){a.info(`- ${x.name}`);for(let f of x.changes)a.info(` - ${f.filePath}`)}a.break(),a.info(`Run ${l.success("diff <component>")} to see the changes.`),process.exit(0)}let o=s.find(p=>p.name===r.component);o||(a.error(`The component ${l.success(r.component)} does not exist.`),process.exit(1));let c=await ut(o,n);c.length||(a.info(`No updates found for ${r.component}.`),process.exit(0));for(let p of c)a.info(`- ${p.filePath}`),await Gr(p.patch),a.info("")}catch(r){b(r)}});async function ut(e,t){let r=await Ge(t.style,[e]),i=await K(t.tailwind.baseColor);if(!r)return[];let n=[];for(let s of r){let o=await Be(t,s);if(o)for(let c of s.files??[]){let p=Pe.resolve(o,typeof c=="string"?c:c.path);if(!Ce(p))continue;let d=await Wr.readFile(p,"utf8");if(typeof c=="string"||!c.content)continue;let u=await ee({filename:c.path,raw:c.content,config:t,baseColor:i}),x=Ur(u,d);x.length>1&&n.push({filePath:p,patch:x})}}return n}async function Gr(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 Jr}from"commander";var ht={name:"shadcn",version:"2.0.6",description:"Add components to your apps.",publishConfig:{access:"public"},license:"MIT",author:{name:"shadcn",url:"https://twitter.com/shadcn"},repository:{type:"git",url:"https://github.com/shadcn/ui.git",directory:"packages/shadcn"},files:["dist"],keywords:["components","ui","tailwind","radix-ui","shadcn"],type:"module",exports:"./dist/index.js",bin:"./dist/index.js",scripts:{dev:"tsup --watch",build:"tsup",typecheck:"tsc --noEmit",clean:"rimraf dist && rimraf components","start:dev":"cross-env REGISTRY_URL=http://localhost:3333/r node dist/index.js",start:"node dist/index.js","format:write":'prettier --write "**/*.{ts,tsx,mdx}" --cache',"format:check":'prettier --check "**/*.{ts,tsx,mdx}" --cache',release:"changeset version","pub:beta":"pnpm build && pnpm publish --no-git-checks --access public --tag beta","pub:next":"pnpm build && pnpm publish --no-git-checks --access public --tag next","pub:release":"pnpm build && pnpm publish --access public",test:"vitest run","test:dev":"REGISTRY_URL=http://localhost:3333/r vitest run"},dependencies:{"@antfu/ni":"^0.21.4","@babel/core":"^7.22.1","@babel/parser":"^7.22.6","@babel/plugin-transform-typescript":"^7.22.5",commander:"^10.0.0",cosmiconfig:"^8.1.3",deepmerge:"^4.3.1",diff:"^5.1.0",execa:"^7.0.0","fast-glob":"^3.3.2","fs-extra":"^11.1.0","https-proxy-agent":"^6.2.0",kleur:"^4.1.5","lodash.template":"^4.5.0","node-fetch":"^3.3.0",ora:"^6.1.2",postcss:"^8.4.24",prompts:"^2.4.2",recast:"^0.23.2","stringify-object":"^5.0.0","ts-morph":"^18.0.0","tsconfig-paths":"^4.2.0",zod:"^3.20.2"},devDependencies:{"@types/babel__core":"^7.20.1","@types/diff":"^5.0.3","@types/fs-extra":"^11.0.1","@types/lodash.template":"^4.5.1","@types/prompts":"^2.4.2","@types/stringify-object":"^4.0.5",rimraf:"^6.0.1",tsup:"^6.6.3","type-fest":"^3.8.0",typescript:"^4.9.3"}};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function Yr(){let e=new Jr().name("shadcn").description("add components and dependencies to your project").version(ht.version||"1.0.0","-v, --version","display the version number");e.addCommand(lt).addCommand(dt).addCommand(gt),e.parse()}Yr();
|
|
25
26
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +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/utils/updaters/update-tailwind-content.ts","../src/preflights/preflight-add.ts","../src/utils/update-app-index.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 { updateAppIndex } from \"@/src/utils/update-app-index\"\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 srcDir: z.boolean().optional(),\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 .option(\n \"--src-dir\",\n \"use the src directory when creating a new project.\",\n false\n )\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 srcDir: options.srcDir,\n })\n }\n\n let shouldUpdateAppIndex = false\n if (errors[ERRORS.MISSING_DIR_OR_EMPTY_PROJECT]) {\n const { projectPath } = await createProject({\n cwd: options.cwd,\n force: options.overwrite,\n srcDir: options.srcDir,\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 srcDir: options.srcDir,\n })\n\n shouldUpdateAppIndex =\n options.components?.length === 1 &&\n !!options.components[0].match(/\\/chat\\/b\\//)\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\n // If we're adding a single component and it's from the v0 registry,\n // let's update the app/page.tsx file to import the component.\n if (shouldUpdateAppIndex) {\n await updateAppIndex(options.components[0], config)\n }\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 { updateTailwindContent } from \"@/src/utils/updaters/update-tailwind-content\"\nimport { Command } from \"commander\"\nimport prompts from \"prompts\"\nimport { z } from \"zod\"\n\nexport const initOptionsSchema = z.object({\n cwd: z.string(),\n components: z.array(z.string()).optional(),\n yes: z.boolean(),\n defaults: z.boolean(),\n force: z.boolean(),\n silent: z.boolean(),\n isNewProject: z.boolean(),\n srcDir: z.boolean().optional(),\n})\n\nexport const init = new Command()\n .name(\"init\")\n .description(\"initialize your project and install dependencies\")\n .argument(\n \"[components...]\",\n \"the components to add or a url to the component.\"\n )\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 .option(\n \"--src-dir\",\n \"use the src directory when creating a new project.\",\n false\n )\n .action(async (components, opts) => {\n try {\n const options = initOptionsSchema.parse({\n cwd: path.resolve(opts.cwd),\n isNewProject: false,\n components,\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 const components = [\"index\", ...(options.components || [])]\n await addComponents(components, 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 // If a new project is using src dir, let's update the tailwind content config.\n // TODO: Handle this per framework.\n if (options.isNewProject && options.srcDir) {\n await updateTailwindContent(\n [\"./src/**/*.{js,ts,jsx,tsx,mdx}\"],\n fullConfig,\n {\n silent: options.silent,\n }\n )\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 = process.env.REGISTRY_URL ?? \"https://ui.shadcn.com/r\"\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\n if (response.status === 401) {\n throw new Error(\n `You are not authorized to access the component at ${highlighter.info(\n url\n )}.\\nIf this is a remote registry, you may need to authenticate.`\n )\n }\n\n if (response.status === 404) {\n throw new Error(\n `The component at ${highlighter.info(\n url\n )} was not found.\\nIt may not exist at the registry. Please make sure it is a valid component.`\n )\n }\n\n if (response.status === 403) {\n throw new Error(\n `You do not have access to the component at ${highlighter.info(\n url\n )}.\\nIf this is a remote registry, you may need to authenticate or a token.`\n )\n }\n\n const result = await response.json()\n const message =\n result && typeof result === \"object\" && \"error\" in result\n ? result.error\n : response.statusText || errorMessages[response.status]\n throw new Error(\n `Failed to fetch from ${highlighter.info(url)}.\\n${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 // If the url contains /chat/b/, we assume it's the v0 registry.\n // We need to add the /json suffix if it's missing.\n const url = new URL(path)\n if (url.pathname.match(/\\/chat\\/b\\//) && !url.pathname.endsWith(\"/json\")) {\n url.pathname = `${url.pathname}/json`\n }\n\n return url.toString()\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 meta: z.record(z.string(), z.any()).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, \"'\") // Replace `\\\" with \"\n .replace(/\\\"\\'/g, \"'\") // Replace `\\\" with \"\n .replace(/\\'\\[/g, \"[\") // Replace `[ with [\n .replace(/\\]\\'/g, \"]\") // Replace `] with ]\n .replace(/\\'\\\\\\'/g, \"'\") // Replace `\\' with '\n .replace(/\\\\\\'/g, \"'\") // Replace \\' with '\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\nexport async 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\nexport function _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 { getProjectInfo } from \"@/src/utils/get-project-info\"\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\n const [projectInfo, baseColor] = await Promise.all([\n getProjectInfo(config.resolvedPaths.cwd),\n getRegistryBaseColor(config.tailwind.baseColor),\n ])\n\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 = projectInfo?.isSrcDir\n ? path.join(config.resolvedPaths.cwd, \"src\", file.target)\n : 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 // Not a local import.\n if (!moduleSpecifier.startsWith(\"@/\")) {\n return moduleSpecifier\n }\n\n // Not a registry import.\n if (!moduleSpecifier.startsWith(\"@/registry/\")) {\n // We fix the alias an return.\n const alias = config.aliases.components.charAt(0)\n return moduleSpecifier.replace(/^@\\//, `${alias}/`)\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\" | \"srcDir\">\n) {\n options = {\n srcDir: false,\n ...options,\n }\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 does not contain a package.json file. 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(\n `Creating a new Next.js project. This may take a few minutes.`\n ).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 options.srcDir ? \"--src-dir\" : \"--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 wrong creating a new Next.js project. Please try again.`\n )\n process.exit(1)\n }\n\n createSpinner?.succeed(\"Creating a new Next.js project.\")\n\n return {\n projectPath,\n projectName: name,\n }\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 { spinner } from \"@/src/utils/spinner\"\nimport {\n _createSourceFile,\n _getQuoteChar,\n} from \"@/src/utils/updaters/update-tailwind-config\"\nimport { ObjectLiteralExpression, SyntaxKind } from \"ts-morph\"\n\nexport async function updateTailwindContent(\n content: string[],\n config: Config,\n options: {\n silent?: boolean\n }\n) {\n if (!content) {\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 transformTailwindContent(raw, content, config)\n await fs.writeFile(config.resolvedPaths.tailwindConfig, output, \"utf8\")\n tailwindSpinner?.succeed()\n}\n\nexport async function transformTailwindContent(\n input: string,\n content: string[],\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 addTailwindConfigContent(configObject, content)\n\n return sourceFile.getFullText()\n}\n\nasync function addTailwindConfigContent(\n configObject: ObjectLiteralExpression,\n content: string[]\n) {\n const quoteChar = _getQuoteChar(configObject)\n\n const existingProperty = configObject.getProperty(\"content\")\n\n if (!existingProperty) {\n const newProperty = {\n name: \"content\",\n initializer: `[${quoteChar}${content.join(\n `${quoteChar}, ${quoteChar}`\n )}${quoteChar}]`,\n }\n configObject.addPropertyAssignment(newProperty)\n\n return configObject\n }\n\n if (existingProperty.isKind(SyntaxKind.PropertyAssignment)) {\n const initializer = existingProperty.getInitializer()\n\n // If property is an array, append.\n if (initializer?.isKind(SyntaxKind.ArrayLiteralExpression)) {\n for (const contentItem of content) {\n const newValue = `${quoteChar}${contentItem}${quoteChar}`\n\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 continue\n }\n\n initializer.addElement(newValue)\n }\n }\n\n return configObject\n }\n\n return configObject\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 { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\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 }\n\n try {\n const config = await getConfig(options.cwd)\n\n return {\n errors,\n config: config!,\n }\n } catch (error) {\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 fs from \"fs/promises\"\nimport path from \"path\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { getRegistryItem } from \"@/src/utils/registry\"\n\nexport async function updateAppIndex(component: string, config: Config) {\n const indexPath = path.join(config.resolvedPaths.cwd, \"app/page.tsx\")\n\n if (!(await fs.stat(indexPath)).isFile()) {\n return\n }\n\n const registryItem = await getRegistryItem(component, config.style)\n if (\n !registryItem?.meta?.importSpecifier ||\n !registryItem?.meta?.moduleSpecifier\n ) {\n return\n }\n\n // Overwrite the index file with the new import.\n const content = `import { ${registryItem?.meta?.importSpecifier} } from \"${registryItem.meta.moduleSpecifier}\"\\n\\nexport default function Page() {\\n return <${registryItem?.meta?.importSpecifier} />\\n}`\n await fs.writeFile(indexPath, content, \"utf8\")\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 \"name\": \"shadcn\",\n \"version\": \"2.0.5\",\n \"description\": \"Add components to your apps.\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"license\": \"MIT\",\n \"author\": {\n \"name\": \"shadcn\",\n \"url\": \"https://twitter.com/shadcn\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/shadcn/ui.git\",\n \"directory\": \"packages/shadcn\"\n },\n \"files\": [\n \"dist\"\n ],\n \"keywords\": [\n \"components\",\n \"ui\",\n \"tailwind\",\n \"radix-ui\",\n \"shadcn\"\n ],\n \"type\": \"module\",\n \"exports\": \"./dist/index.js\",\n \"bin\": \"./dist/index.js\",\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"build\": \"tsup\",\n \"typecheck\": \"tsc --noEmit\",\n \"clean\": \"rimraf dist && rimraf components\",\n \"start:dev\": \"cross-env REGISTRY_URL=http://localhost:3333/r node dist/index.js\",\n \"start\": \"node dist/index.js\",\n \"format:write\": \"prettier --write \\\"**/*.{ts,tsx,mdx}\\\" --cache\",\n \"format:check\": \"prettier --check \\\"**/*.{ts,tsx,mdx}\\\" --cache\",\n \"release\": \"changeset version\",\n \"pub:beta\": \"pnpm build && pnpm publish --no-git-checks --access public --tag beta\",\n \"pub:next\": \"pnpm build && pnpm publish --no-git-checks --access public --tag next\",\n \"pub:release\": \"pnpm build && pnpm publish --access public\",\n \"test\": \"vitest run\",\n \"test:dev\": \"REGISTRY_URL=http://localhost:3333/r vitest run\"\n },\n \"dependencies\": {\n \"@antfu/ni\": \"^0.21.4\",\n \"@babel/core\": \"^7.22.1\",\n \"@babel/parser\": \"^7.22.6\",\n \"@babel/plugin-transform-typescript\": \"^7.22.5\",\n \"commander\": \"^10.0.0\",\n \"cosmiconfig\": \"^8.1.3\",\n \"deepmerge\": \"^4.3.1\",\n \"diff\": \"^5.1.0\",\n \"execa\": \"^7.0.0\",\n \"fast-glob\": \"^3.3.2\",\n \"fs-extra\": \"^11.1.0\",\n \"https-proxy-agent\": \"^6.2.0\",\n \"kleur\": \"^4.1.5\",\n \"lodash.template\": \"^4.5.0\",\n \"node-fetch\": \"^3.3.0\",\n \"ora\": \"^6.1.2\",\n \"postcss\": \"^8.4.24\",\n \"prompts\": \"^2.4.2\",\n \"recast\": \"^0.23.2\",\n \"stringify-object\": \"^5.0.0\",\n \"ts-morph\": \"^18.0.0\",\n \"tsconfig-paths\": \"^4.2.0\",\n \"zod\": \"^3.20.2\"\n },\n \"devDependencies\": {\n \"@types/babel__core\": \"^7.20.1\",\n \"@types/diff\": \"^5.0.3\",\n \"@types/fs-extra\": \"^11.0.1\",\n \"@types/lodash.template\": \"^4.5.1\",\n \"@types/prompts\": \"^2.4.2\",\n \"@types/stringify-object\": \"^4.0.5\",\n \"rimraf\": \"^6.0.1\",\n \"tsup\": \"^6.6.3\",\n \"type-fest\": \"^3.8.0\",\n \"typescript\": \"^4.9.3\"\n }\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","highlighter","message","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","alias","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","projectInfo","baseColor","getProjectInfo","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","fs","path","SyntaxKind","updateTailwindContent","content","config","options","tailwindFileRelativePath","path","tailwindSpinner","spinner","highlighter","raw","fs","output","transformTailwindContent","input","sourceFile","_createSourceFile","configObject","node","property","addTailwindConfigContent","quoteChar","_getQuoteChar","existingProperty","newProperty","initializer","contentItem","newValue","element","Command","prompts","z","initOptionsSchema","init","components","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","updateTailwindContent","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","config","getConfig","logger","highlighter","fs","path","updateAppIndex","component","config","indexPath","path","fs","registryItem","getRegistryItem","content","Command","prompts","z","addOptionsSchema","add","components","opts","options","path","isTheme","component","logger","confirm","highlighter","promptForRegistryComponents","errors","config","preFlightAdd","MISSING_CONFIG","proceed","runInit","shouldUpdateAppIndex","MISSING_DIR_OR_EMPTY_PROJECT","projectPath","createProject","addComponents","updateAppIndex","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"]}
|
|
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/utils/updaters/update-tailwind-content.ts","../src/preflights/preflight-add.ts","../src/utils/update-app-index.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 { updateAppIndex } from \"@/src/utils/update-app-index\"\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 srcDir: z.boolean().optional(),\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 .option(\n \"--src-dir\",\n \"use the src directory when creating a new project.\",\n false\n )\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 srcDir: options.srcDir,\n })\n }\n\n let shouldUpdateAppIndex = false\n if (errors[ERRORS.MISSING_DIR_OR_EMPTY_PROJECT]) {\n const { projectPath } = await createProject({\n cwd: options.cwd,\n force: options.overwrite,\n srcDir: options.srcDir,\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 srcDir: options.srcDir,\n })\n\n shouldUpdateAppIndex =\n options.components?.length === 1 &&\n !!options.components[0].match(/\\/chat\\/b\\//)\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\n // If we're adding a single component and it's from the v0 registry,\n // let's update the app/page.tsx file to import the component.\n if (shouldUpdateAppIndex) {\n await updateAppIndex(options.components[0], config)\n }\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 { updateTailwindContent } from \"@/src/utils/updaters/update-tailwind-content\"\nimport { Command } from \"commander\"\nimport prompts from \"prompts\"\nimport { z } from \"zod\"\n\nexport const initOptionsSchema = z.object({\n cwd: z.string(),\n components: z.array(z.string()).optional(),\n yes: z.boolean(),\n defaults: z.boolean(),\n force: z.boolean(),\n silent: z.boolean(),\n isNewProject: z.boolean(),\n srcDir: z.boolean().optional(),\n})\n\nexport const init = new Command()\n .name(\"init\")\n .description(\"initialize your project and install dependencies\")\n .argument(\n \"[components...]\",\n \"the components to add or a url to the component.\"\n )\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 .option(\n \"--src-dir\",\n \"use the src directory when creating a new project.\",\n false\n )\n .action(async (components, opts) => {\n try {\n const options = initOptionsSchema.parse({\n cwd: path.resolve(opts.cwd),\n isNewProject: false,\n components,\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 const components = [\"index\", ...(options.components || [])]\n await addComponents(components, 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 // If a new project is using src dir, let's update the tailwind content config.\n // TODO: Handle this per framework.\n if (options.isNewProject && options.srcDir) {\n await updateTailwindContent(\n [\"./src/**/*.{js,ts,jsx,tsx,mdx}\"],\n fullConfig,\n {\n silent: options.silent,\n }\n )\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 = process.env.REGISTRY_URL ?? \"https://ui.shadcn.com/r\"\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\n if (response.status === 401) {\n throw new Error(\n `You are not authorized to access the component at ${highlighter.info(\n url\n )}.\\nIf this is a remote registry, you may need to authenticate.`\n )\n }\n\n if (response.status === 404) {\n throw new Error(\n `The component at ${highlighter.info(\n url\n )} was not found.\\nIt may not exist at the registry. Please make sure it is a valid component.`\n )\n }\n\n if (response.status === 403) {\n throw new Error(\n `You do not have access to the component at ${highlighter.info(\n url\n )}.\\nIf this is a remote registry, you may need to authenticate or a token.`\n )\n }\n\n const result = await response.json()\n const message =\n result && typeof result === \"object\" && \"error\" in result\n ? result.error\n : response.statusText || errorMessages[response.status]\n throw new Error(\n `Failed to fetch from ${highlighter.info(url)}.\\n${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 let docs = \"\"\n payload.forEach((item) => {\n if (item.docs) {\n docs += `${item.docs}\\n`\n }\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 docs,\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 // If the url contains /chat/b/, we assume it's the v0 registry.\n // We need to add the /json suffix if it's missing.\n const url = new URL(path)\n if (url.pathname.match(/\\/chat\\/b\\//) && !url.pathname.endsWith(\"/json\")) {\n url.pathname = `${url.pathname}/json`\n }\n\n return url.toString()\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 meta: z.record(z.string(), z.any()).optional(),\n docs: z.string().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 docs: 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, \"'\") // Replace `\\\" with \"\n .replace(/\\\"\\'/g, \"'\") // Replace `\\\" with \"\n .replace(/\\'\\[/g, \"[\") // Replace `[ with [\n .replace(/\\]\\'/g, \"]\") // Replace `] with ]\n .replace(/\\'\\\\\\'/g, \"'\") // Replace `\\' with '\n .replace(/\\\\\\'/g, \"'\") // Replace \\' with '\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\nexport async 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\nexport function _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 { getProjectInfo } from \"@/src/utils/get-project-info\"\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\n const [projectInfo, baseColor] = await Promise.all([\n getProjectInfo(config.resolvedPaths.cwd),\n getRegistryBaseColor(config.tailwind.baseColor),\n ])\n\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 = projectInfo?.isSrcDir\n ? path.join(config.resolvedPaths.cwd, \"src\", file.target)\n : 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 // Not a local import.\n if (!moduleSpecifier.startsWith(\"@/\")) {\n return moduleSpecifier\n }\n\n // Not a registry import.\n if (!moduleSpecifier.startsWith(\"@/registry/\")) {\n // We fix the alias an return.\n const alias = config.aliases.components.charAt(0)\n return moduleSpecifier.replace(/^@\\//, `${alias}/`)\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 { logger } from \"@/src/utils/logger\"\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 if (tree.docs) {\n logger.info(tree.docs)\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\" | \"srcDir\">\n) {\n options = {\n srcDir: false,\n ...options,\n }\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 does not contain a package.json file. 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(\n `Creating a new Next.js project. This may take a few minutes.`\n ).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 options.srcDir ? \"--src-dir\" : \"--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 wrong creating a new Next.js project. Please try again.`\n )\n process.exit(1)\n }\n\n createSpinner?.succeed(\"Creating a new Next.js project.\")\n\n return {\n projectPath,\n projectName: name,\n }\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 { spinner } from \"@/src/utils/spinner\"\nimport {\n _createSourceFile,\n _getQuoteChar,\n} from \"@/src/utils/updaters/update-tailwind-config\"\nimport { ObjectLiteralExpression, SyntaxKind } from \"ts-morph\"\n\nexport async function updateTailwindContent(\n content: string[],\n config: Config,\n options: {\n silent?: boolean\n }\n) {\n if (!content) {\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 transformTailwindContent(raw, content, config)\n await fs.writeFile(config.resolvedPaths.tailwindConfig, output, \"utf8\")\n tailwindSpinner?.succeed()\n}\n\nexport async function transformTailwindContent(\n input: string,\n content: string[],\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 addTailwindConfigContent(configObject, content)\n\n return sourceFile.getFullText()\n}\n\nasync function addTailwindConfigContent(\n configObject: ObjectLiteralExpression,\n content: string[]\n) {\n const quoteChar = _getQuoteChar(configObject)\n\n const existingProperty = configObject.getProperty(\"content\")\n\n if (!existingProperty) {\n const newProperty = {\n name: \"content\",\n initializer: `[${quoteChar}${content.join(\n `${quoteChar}, ${quoteChar}`\n )}${quoteChar}]`,\n }\n configObject.addPropertyAssignment(newProperty)\n\n return configObject\n }\n\n if (existingProperty.isKind(SyntaxKind.PropertyAssignment)) {\n const initializer = existingProperty.getInitializer()\n\n // If property is an array, append.\n if (initializer?.isKind(SyntaxKind.ArrayLiteralExpression)) {\n for (const contentItem of content) {\n const newValue = `${quoteChar}${contentItem}${quoteChar}`\n\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 continue\n }\n\n initializer.addElement(newValue)\n }\n }\n\n return configObject\n }\n\n return configObject\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 { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\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 }\n\n try {\n const config = await getConfig(options.cwd)\n\n return {\n errors,\n config: config!,\n }\n } catch (error) {\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 fs from \"fs/promises\"\nimport path from \"path\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { getRegistryItem } from \"@/src/utils/registry\"\n\nexport async function updateAppIndex(component: string, config: Config) {\n const indexPath = path.join(config.resolvedPaths.cwd, \"app/page.tsx\")\n\n if (!(await fs.stat(indexPath)).isFile()) {\n return\n }\n\n const registryItem = await getRegistryItem(component, config.style)\n if (\n !registryItem?.meta?.importSpecifier ||\n !registryItem?.meta?.moduleSpecifier\n ) {\n return\n }\n\n // Overwrite the index file with the new import.\n const content = `import { ${registryItem?.meta?.importSpecifier} } from \"${registryItem.meta.moduleSpecifier}\"\\n\\nexport default function Page() {\\n return <${registryItem?.meta?.importSpecifier} />\\n}`\n await fs.writeFile(indexPath, content, \"utf8\")\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 \"name\": \"shadcn\",\n \"version\": \"2.0.6\",\n \"description\": \"Add components to your apps.\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"license\": \"MIT\",\n \"author\": {\n \"name\": \"shadcn\",\n \"url\": \"https://twitter.com/shadcn\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/shadcn/ui.git\",\n \"directory\": \"packages/shadcn\"\n },\n \"files\": [\n \"dist\"\n ],\n \"keywords\": [\n \"components\",\n \"ui\",\n \"tailwind\",\n \"radix-ui\",\n \"shadcn\"\n ],\n \"type\": \"module\",\n \"exports\": \"./dist/index.js\",\n \"bin\": \"./dist/index.js\",\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"build\": \"tsup\",\n \"typecheck\": \"tsc --noEmit\",\n \"clean\": \"rimraf dist && rimraf components\",\n \"start:dev\": \"cross-env REGISTRY_URL=http://localhost:3333/r node dist/index.js\",\n \"start\": \"node dist/index.js\",\n \"format:write\": \"prettier --write \\\"**/*.{ts,tsx,mdx}\\\" --cache\",\n \"format:check\": \"prettier --check \\\"**/*.{ts,tsx,mdx}\\\" --cache\",\n \"release\": \"changeset version\",\n \"pub:beta\": \"pnpm build && pnpm publish --no-git-checks --access public --tag beta\",\n \"pub:next\": \"pnpm build && pnpm publish --no-git-checks --access public --tag next\",\n \"pub:release\": \"pnpm build && pnpm publish --access public\",\n \"test\": \"vitest run\",\n \"test:dev\": \"REGISTRY_URL=http://localhost:3333/r vitest run\"\n },\n \"dependencies\": {\n \"@antfu/ni\": \"^0.21.4\",\n \"@babel/core\": \"^7.22.1\",\n \"@babel/parser\": \"^7.22.6\",\n \"@babel/plugin-transform-typescript\": \"^7.22.5\",\n \"commander\": \"^10.0.0\",\n \"cosmiconfig\": \"^8.1.3\",\n \"deepmerge\": \"^4.3.1\",\n \"diff\": \"^5.1.0\",\n \"execa\": \"^7.0.0\",\n \"fast-glob\": \"^3.3.2\",\n \"fs-extra\": \"^11.1.0\",\n \"https-proxy-agent\": \"^6.2.0\",\n \"kleur\": \"^4.1.5\",\n \"lodash.template\": \"^4.5.0\",\n \"node-fetch\": \"^3.3.0\",\n \"ora\": \"^6.1.2\",\n \"postcss\": \"^8.4.24\",\n \"prompts\": \"^2.4.2\",\n \"recast\": \"^0.23.2\",\n \"stringify-object\": \"^5.0.0\",\n \"ts-morph\": \"^18.0.0\",\n \"tsconfig-paths\": \"^4.2.0\",\n \"zod\": \"^3.20.2\"\n },\n \"devDependencies\": {\n \"@types/babel__core\": \"^7.20.1\",\n \"@types/diff\": \"^5.0.3\",\n \"@types/fs-extra\": \"^11.0.1\",\n \"@types/lodash.template\": \"^4.5.1\",\n \"@types/prompts\": \"^2.4.2\",\n \"@types/stringify-object\": \"^4.0.5\",\n \"rimraf\": \"^6.0.1\",\n \"tsup\": \"^6.6.3\",\n \"type-fest\": \"^3.8.0\",\n \"typescript\": \"^4.9.3\"\n }\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","highlighter","message","logger","getRegistryItemFileTargetPath","file","registryResolveItemsTree","names","getRegistryIndex","items","name","getRegistryItem","registryDependencies","uniqueDependencies","urls","isUrl","payload","z","registryItemSchema","index","theme","registryGetTheme","tailwind","deepmerge","cssVars","docs","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","alias","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","projectInfo","baseColor","getProjectInfo","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","logger","path","execa","fs","prompts","createProject","options","proceed","highlighter","packageManager","getPackageManager","name","value","projectPath","logger","path","createSpinner","spinner","args","fs","path","SyntaxKind","updateTailwindContent","content","config","options","tailwindFileRelativePath","path","tailwindSpinner","spinner","highlighter","raw","fs","output","transformTailwindContent","input","sourceFile","_createSourceFile","configObject","node","property","addTailwindConfigContent","quoteChar","_getQuoteChar","existingProperty","newProperty","initializer","contentItem","newValue","element","Command","prompts","z","initOptionsSchema","init","components","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","updateTailwindContent","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","config","getConfig","logger","highlighter","fs","path","updateAppIndex","component","config","indexPath","path","fs","registryItem","getRegistryItem","content","Command","prompts","z","addOptionsSchema","add","components","opts","options","path","isTheme","component","logger","confirm","highlighter","promptForRegistryComponents","errors","config","preFlightAdd","MISSING_CONFIG","proceed","runInit","shouldUpdateAppIndex","MISSING_DIR_OR_EMPTY_PROJECT","projectPath","createProject","addComponents","updateAppIndex","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"]}
|