shadcn 2.0.0 → 2.0.1
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.d.ts +0 -0
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +18 -18
- package/LICENSE.md +0 -21
package/dist/index.d.ts
CHANGED
|
File without changes
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,7 @@ To start over, remove the ${l.info("components.json")} file and run ${l.info("in
|
|
|
4
4
|
Visit ${l.info(n?.framework.links.installation)} to manually configure your project.
|
|
5
5
|
Once configured, you can use the cli to add components.`),o.break(),process.exit(1)),i?.succeed(`Verifying framework. Found ${l.info(n.framework.label)}.`);let s=w("Validating Tailwind CSS.",{silent:e.silent}).start();!n?.tailwindConfigFile||!n?.tailwindCssFile?(t[ne]=!0,s?.fail()):s?.succeed();let a=w("Validating import alias.",{silent:e.silent}).start();return n?.aliasPrefix?a?.succeed():(t[se]=!0,a?.fail()),Object.keys(t).length>0&&(t[ne]&&(o.break(),o.error(`No Tailwind CSS configuration found at ${l.info(e.cwd)}.`),o.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),o.error("Install Tailwind CSS then try again."),n?.framework.links.tailwind&&o.error(`Visit ${l.info(n?.framework.links.tailwind)} to get started.`)),t[se]&&(o.break(),o.error("No import alias found in your tsconfig.json file."),n?.framework.links.installation&&o.error(`Visit ${l.info(n?.framework.links.installation)} to learn how to set an import alias.`)),o.break(),process.exit(1)),{errors:t,projectInfo:n}}import{z as Et}from"zod";function b(e){if(o.error("Something went wrong. Please check the error below for more details."),o.error("If the problem persists, please open an issue on GitHub."),o.error(""),typeof e=="string"&&(o.error(e),o.break(),process.exit(1)),e instanceof Et.ZodError){o.error("Validation failed:");for(let[t,r]of Object.entries(e.flatten().fieldErrors))o.error(`- ${l.info(t)}: ${r}`);o.break(),process.exit(1)}e instanceof Error&&(o.error(e.message),o.break(),process.exit(1)),o.break(),process.exit(1)}import Mt from"path";import{z as p}from"zod";var Ee=p.enum(["registry:style","registry:lib","registry:example","registry:block","registry:component","registry:ui","registry:hook","registry:theme","registry:page"]),je=p.object({path:p.string(),content:p.string().optional(),type:Ee,target:p.string().optional()}),jt=p.object({config:p.object({content:p.array(p.string()).optional(),theme:p.record(p.string(),p.any()).optional(),plugins:p.array(p.string()).optional()}).optional()}),$t=p.object({light:p.record(p.string(),p.string()).optional(),dark:p.record(p.string(),p.string()).optional()}),F=p.object({name:p.string(),type:Ee,description:p.string().optional(),dependencies:p.array(p.string()).optional(),devDependencies:p.array(p.string()).optional(),registryDependencies:p.array(p.string()).optional(),files:p.array(je).optional(),tailwind:jt.optional(),cssVars:$t.optional(),meta:p.record(p.string(),p.any()).optional()}),ce=p.array(F.extend({files:p.array(p.union([p.string(),je])).optional()})),$e=p.array(p.object({name:p.string(),label:p.string()})),Oe=p.object({inlineColors:p.object({light:p.record(p.string(),p.string()),dark:p.record(p.string(),p.string())}),cssVars:p.object({light:p.record(p.string(),p.string()),dark:p.record(p.string(),p.string())}),inlineColorsTemplate:p.string(),cssVarsTemplate:p.string()}),Ne=F.pick({dependencies:!0,devDependencies:!0,files:!0,tailwind:!0,cssVars:!0});import{promises as pe}from"fs";import{tmpdir as Ot}from"os";import L from"path";import Nt from"deepmerge";import At from"stringify-object";import{Project as Ft,QuoteKind as Lt,ScriptKind as Ae,SyntaxKind as u}from"ts-morph";async function Fe(e,t,r){if(!e)return;r={silent:!1,...r};let i=L.relative(t.resolvedPaths.cwd,t.resolvedPaths.tailwindConfig),n=w(`Updating ${l.info(i)}`,{silent:r.silent}).start(),s=await pe.readFile(t.resolvedPaths.tailwindConfig,"utf8"),a=await _t(s,e,t);await pe.writeFile(t.resolvedPaths.tailwindConfig,a,"utf8"),n?.succeed()}async function _t(e,t,r){let i=await Le(e,r),n=i.getDescendantsOfKind(u.ObjectLiteralExpression).find(a=>a.getProperties().some(c=>c.isKind(u.PropertyAssignment)&&c.getName()==="content"));if(!n)return e;let s=Wt(n);return Dt(n,{name:"darkMode",value:"class"},{quoteChar:s}),t.plugins?.forEach(a=>{Kt(n,a)}),t.theme&&await zt(n,t.theme),i.getFullText()}function Dt(e,t,{quoteChar:r}){let i=e.getProperty("darkMode");if(!i){let n={name:t.name,initializer:`[${r}${t.value}${r}]`};return t.name==="darkMode"?(e.insertPropertyAssignment(0,n),e):(e.addPropertyAssignment(n),e)}if(i.isKind(u.PropertyAssignment)){let n=i.getInitializer(),s=`${r}${t.value}${r}`;if(n?.isKind(u.StringLiteral)){let a=n.getText();return n.replaceWithText(`[${a}, ${s}]`),e}if(n?.isKind(u.ArrayLiteralExpression)){if(n.getElements().map(a=>a.getText()).includes(s))return e;n.addElement(s)}return e}return e}async function zt(e,t){e.getProperty("theme")||e.addPropertyAssignment({name:"theme",initializer:"{}"}),_e(e);let i=(e.getPropertyOrThrow("theme")?.asKindOrThrow(u.PropertyAssignment)).getInitializer();if(i?.isKind(u.ObjectLiteralExpression)){let n=i.getText(),s=await Vt(n),a=Nt(s,t),c=At(a).replace(/\'\"/g,"'").replace(/\"\'/g,"'").replace(/\'\[/g,"[").replace(/\]\'/g,"]").replace(/\\\'/g,"").replace(/\\\'/g,"");i.replaceWithText(c)}De(e)}function Kt(e,t){let r=e.getProperty("plugins");if(!r)return e.addPropertyAssignment({name:"plugins",initializer:`[${t}]`}),e;if(r.isKind(u.PropertyAssignment)){let i=r.getInitializer();if(i?.isKind(u.ArrayLiteralExpression)){if(i.getElements().map(n=>n.getText().replace(/["']/g,"")).includes(t.replace(/["']/g,"")))return e;i.addElement(t)}return e}return e}async function Le(e,t){let r=await pe.mkdtemp(L.join(Ot(),"shadcn-")),i=t?.resolvedPaths?.tailwindConfig||"tailwind.config.ts",n=L.join(r,`shadcn-${L.basename(i)}`);return new Ft({compilerOptions:{}}).createSourceFile(n,e,{scriptKind:L.extname(i)===".ts"?Ae.TS:Ae.JS})}function Wt(e){return e.getFirstDescendantByKind(u.StringLiteral)?.getQuoteKind()===Lt.Single?"'":'"'}function _e(e){let t=e.getProperties();for(let r=0;r<t.length;r++){let i=t[r];if(i.isKind(u.SpreadAssignment)){let n=i.asKindOrThrow(u.SpreadAssignment),s=n.getExpression().getText();e.insertPropertyAssignment(r,{name:`___${s.replace(/^\.\.\./,"")}`,initializer:`"...${s.replace(/^\.\.\./,"")}"`}),n.remove()}else if(i.isKind(u.PropertyAssignment)){let s=i.asKindOrThrow(u.PropertyAssignment).getInitializer();s&&s.isKind(u.ObjectLiteralExpression)&&_e(s.asKindOrThrow(u.ObjectLiteralExpression))}}}function De(e){let t=e.getProperties();for(let r=0;r<t.length;r++){let i=t[r];if(i.isKind(u.PropertyAssignment)){let n=i,s=n.getInitializer();if(s?.isKind(u.StringLiteral)){let a=s.getLiteralValue();a.startsWith("...")&&(e.insertSpreadAssignment(r,{expression:a.slice(3)}),n.remove())}else s?.isKind(u.ObjectLiteralExpression)&&De(s)}}}async function Vt(e){let r=(await Le(`const theme = ${e}`,null)).getStatements()[0];if(r?.getKind()===u.VariableStatement){let n=(r.getDeclarationList()?.getDeclarations()[0]).getInitializer();if(n?.isKind(u.ObjectLiteralExpression))return await ze(n)}throw new Error("Invalid input: not an object literal")}function ze(e){let t={};for(let r of e.getProperties())if(r.isKind(u.PropertyAssignment)){let i=r.getName().replace(/\'/g,"");r.getInitializer()?.isKind(u.ObjectLiteralExpression)?t[i]=ze(r.getInitializer()):t[i]=Ke(r.getInitializer())}return t}function Ke(e){switch(e.kind){case u.StringLiteral:return e.text;case u.NumericLiteral:return Number(e.text);case u.TrueKeyword:return!0;case u.FalseKeyword:return!1;case u.NullKeyword:return null;case u.ArrayLiteralExpression:return e.elements.map(Ke);default:return e.getText()}}function We(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 Ut}from"https-proxy-agent";import Gt from"node-fetch";import{z as Bt}from"zod";var Jt=process.env.REGISTRY_URL??"https://ui.shadcn.com/r",Yt=process.env.https_proxy?new Ut(process.env.https_proxy):void 0;async function D(){try{let[e]=await E(["index.json"]);return ce.parse(e)}catch(e){o.error(`
|
|
6
6
|
`),b(e)}}async function me(){try{let[e]=await E(["styles/index.json"]);return $e.parse(e)}catch(e){return o.error(`
|
|
7
|
-
`),b(e),[]}}async function B(e,t){try{let[r]=await E([de(e)?e:`styles/${t}/${e}.json`]);return F.parse(r)}catch(r){return o.break(),b(r),null}}async function fe(){return[{name:"neutral",label:"Neutral"},{name:"gray",label:"Gray"},{name:"zinc",label:"Zinc"},{name:"stone",label:"Stone"},{name:"slate",label:"Slate"}]}async function z(e){try{let[t]=await E([`colors/${e}.json`]);return Oe.parse(t)}catch(t){b(t)}}async function Ve(e,t){try{let r=t.map(n=>`styles/${e}/${n.name}.json`),i=await E(r);return ce.parse(i)}catch(r){b(r)}}async function Me(e,t,r){if(r)return r;if(t.type==="registry:ui")return e.resolvedPaths.ui??e.resolvedPaths.components;let[i,n]=t.type?.split(":")??[];return i in e.resolvedPaths?Mt.join(e.resolvedPaths[i],n):null}async function E(e){try{return await Promise.all(e.map(async r=>{let i=Be(r)
|
|
7
|
+
`),b(e),[]}}async function B(e,t){try{let[r]=await E([de(e)?e:`styles/${t}/${e}.json`]);return F.parse(r)}catch(r){return o.break(),b(r),null}}async function fe(){return[{name:"neutral",label:"Neutral"},{name:"gray",label:"Gray"},{name:"zinc",label:"Zinc"},{name:"stone",label:"Stone"},{name:"slate",label:"Slate"}]}async function z(e){try{let[t]=await E([`colors/${e}.json`]);return Oe.parse(t)}catch(t){b(t)}}async function Ve(e,t){try{let r=t.map(n=>`styles/${e}/${n.name}.json`),i=await E(r);return ce.parse(i)}catch(r){b(r)}}async function Me(e,t,r){if(r)return r;if(t.type==="registry:ui")return e.resolvedPaths.ui??e.resolvedPaths.components;let[i,n]=t.type?.split(":")??[];return i in e.resolvedPaths?Mt.join(e.resolvedPaths[i],n):null}async function E(e){try{return await Promise.all(e.map(async r=>{let i=Be(r),n=await Gt(i,{agent:Yt});if(!n.ok){let s={400:"Bad request",401:"Unauthorized",403:"Forbidden",404:"Not found",500:"Internal server error"},a=await n.json(),c=a&&typeof a=="object"&&"error"in a?a.error:n.statusText||s[n.status];throw new Error(`Failed to fetch from ${l.info(i)}.
|
|
8
8
|
${c}`)}return n.json()}))}catch(t){return o.error(`
|
|
9
9
|
`),b(t),[]}}function Ue(e,t,r){return r||(e.type==="registry:ui"?t.resolvedPaths.ui:e.type==="registry:lib"?t.resolvedPaths.lib:e.type==="registry:block"||e.type==="registry:component"?t.resolvedPaths.components:e.type==="registry:hook"?t.resolvedPaths.hooks:(e.type==="registry:page",t.resolvedPaths.components))}async function Ge(e,t){try{if(!await D())return null;let i=(await Promise.all(e.map(async d=>await B(d,t.style)))).filter(d=>d!==null);if(!i.length)return null;let n=i.map(d=>d.registryDependencies??[]).flat(),s=Array.from(new Set(n)),a=Array.from([...e,...s]).map(d=>Be(de(d)?d:`styles/${t.style}/${d}.json`)),c=await E(a),m=Bt.array(F).parse(c);if(!m)return null;if(e.includes("index")){let d=await B("index",t.style);if(d&&m.unshift(d),t.tailwind.baseColor){let y=await Ht(t.tailwind.baseColor,t);y&&m.unshift(y)}}let f={};m.forEach(d=>{f=_(f,d.tailwind??{})});let x={};return m.forEach(d=>{x=_(x,d.cssVars??{})}),Ne.parse({dependencies:_.all(m.map(d=>d.dependencies??[])),devDependencies:_.all(m.map(d=>d.devDependencies??[])),files:_.all(m.map(d=>d.files??[])),tailwind:f,cssVars:x})}catch(r){return b(r),null}}async function Ht(e,t){let r=await z(e);if(!r)return null;let i={name:e,type:"registry:theme",tailwind:{config:{theme:{extend:{borderRadius:{lg:"var(--radius)",md:"calc(var(--radius) - 2px)",sm:"calc(var(--radius) - 4px)"},colors:{}}}}},cssVars:{light:{radius:"0.5rem"},dark:{}}};return t.tailwind.cssVariables&&(i.tailwind.config.theme.extend.colors={...i.tailwind.config.theme.extend.colors,...We(r.cssVars.dark)},i.cssVars={light:{...r.cssVars.light,...i.cssVars.light},dark:{...r.cssVars.dark,...i.cssVars.dark}}),i}function Be(e){if(de(e)){let t=new URL(e);return t.pathname.match(/\/chat\/b\//)&&!t.pathname.endsWith("/json")&&(t.pathname=`${t.pathname}/json`),t.toString()}return`${Jt}/${e}`}function de(e){try{return new URL(e),!0}catch{return!1}}import{promises as Je}from"fs";import Qt from"path";import k from"postcss";import Xt from"postcss/lib/at-rule";async function Ye(e,t,r){if(!e||!Object.keys(e).length||!t.resolvedPaths.tailwindCss)return;r={cleanupDefaultNextStyles:!1,silent:!1,...r};let i=t.resolvedPaths.tailwindCss,n=Qt.relative(t.resolvedPaths.cwd,i),s=w(`Updating ${l.info(n)}`,{silent:r.silent}).start(),a=await Je.readFile(i,"utf8"),c=await Zt(a,e,t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles});await Je.writeFile(i,c,"utf8"),s.succeed()}async function Zt(e,t,r,i){i={cleanupDefaultNextStyles:!1,...i};let n=[er(t)];return i.cleanupDefaultNextStyles&&n.push(tr()),r.tailwind.cssVariables&&n.push(qt()),(await k(n).process(e,{from:void 0})).css}function qt(){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(a=>a.type==="rule"&&a.selector===n&&a.nodes.some(c=>c.type==="atrule"&&c.name==="apply"&&c.params===s))));r||(r=k.atRule({name:"layer",params:"base",raws:{semicolon:!0,between:" ",before:`
|
|
10
10
|
`}}),e.append(r)),t.forEach(({selector:i,apply:n})=>{r?.nodes?.find(a=>a.type==="rule"&&a.selector===i)||r?.append(k.rule({selector:i,nodes:[k.atRule({name:"apply",params:n,raws:{semicolon:!0,before:`
|
|
@@ -18,5 +18,5 @@ Before you can add components, you must create a valid ${l.info("components.json
|
|
|
18
18
|
export default function Page() {
|
|
19
19
|
return <${i?.meta?.importSpecifier} />
|
|
20
20
|
}`;await ot.writeFile(r,n,"utf8")}import{Command as $r}from"commander";import we from"prompts";import{z as S}from"zod";var Or=S.object({components:S.array(S.string()).optional(),yes:S.boolean(),overwrite:S.boolean(),cwd:S.string(),all:S.boolean(),path:S.string().optional(),silent:S.boolean()}),lt=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).action(async(e,t)=>{try{let r=Or.parse({components:e,cwd:jr.resolve(t.cwd),...t}),i=r.components?.some(c=>c.includes("theme-"));if(!r.yes&&i){o.break();let{confirm:c}=await we({type:"confirm",name:"confirm",message:l.warn(`You are about to install a new theme.
|
|
21
|
-
Existing CSS variables will be overwritten. Continue?`)});c||(o.break(),o.log("Theme installation cancelled."),o.break(),process.exit(1))}r.components?.length||(r.components=await Nr(r));let{errors:n,config:s}=await st(r);if(n[V]){let{proceed:c}=await we({type:"confirm",name:"proceed",message:`You need to create a ${l.info("component.json")} file to add components. Proceed?`,initial:!0});c||(o.break(),process.exit(1)),s=await re({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:!0,isNewProject:!1})}let a=!1;if(n[R]){let{projectPath:c}=await te({cwd:r.cwd,force:r.overwrite});c||(o.break(),process.exit(1)),r.cwd=c,s=await re({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!0,isNewProject:!0}),a=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 ee(r.components,s,r),a&&await at(r.components[0],s)}catch(r){o.break(),b(r)}});async function Nr(e){let t=await D();if(!t)return o.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 we({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||(o.warn("No components selected. Exiting."),o.info(""),process.exit(1));let i=S.array(S.string()).safeParse(r);return i.success?i.data:(o.error(""),b(new Error("Something went wrong. Please try again.")),[])}import{existsSync as xe,promises as Ar}from"fs";import be from"path";import{Command as Fr}from"commander";import{diffLines as Lr}from"diff";import{z as K}from"zod";var _r=K.object({component:K.string().optional(),yes:K.boolean(),cwd:K.string(),path:K.string().optional()}),pt=new Fr().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=_r.parse({component:e,...t}),i=be.resolve(r.cwd);xe(i)||(o.error(`The path ${i} does not exist. Please try again.`),process.exit(1));let n=await T(i);n||(o.warn(`Configuration is missing. Please run ${l.success("init")} to create a components.json file.`),process.exit(1));let s=await D();if(s||(b(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let m=n.resolvedPaths.components,f=s.filter(d=>{for(let y of d.files??[]){let W=be.resolve(m,typeof y=="string"?y:y.path);if(xe(W))return!0}return!1}),x=[];for(let d of f){let y=await ct(d,n);y.length&&x.push({name:d.name,changes:y})}x.length||(o.info("No updates found."),process.exit(0)),o.info("The following components have updates available:");for(let d of x){o.info(`- ${d.name}`);for(let y of d.changes)o.info(` - ${y.filePath}`)}o.break(),o.info(`Run ${l.success("diff <component>")} to see the changes.`),process.exit(0)}let a=s.find(m=>m.name===r.component);a||(o.error(`The component ${l.success(r.component)} does not exist.`),process.exit(1));let c=await ct(a,n);c.length||(o.info(`No updates found for ${r.component}.`),process.exit(0));for(let m of c)o.info(`- ${m.filePath}`),await Dr(m.patch),o.info("")}catch(r){b(r)}});async function ct(e,t){let r=await Ve(t.style,[e]),i=await z(t.tailwind.baseColor);if(!r)return[];let n=[];for(let s of r){let a=await Me(t,s);if(a)for(let c of s.files??[]){let m=be.resolve(a,typeof c=="string"?c:c.path);if(!xe(m))continue;let f=await Ar.readFile(m,"utf8");if(typeof c=="string"||!c.content)continue;let x=await q({filename:c.path,raw:c.content,config:t,baseColor:i}),d=Lr(x,f);d.length>1&&n.push({filePath:m,patch:d})}}return n}async function Dr(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 Kr}from"commander";var mt={name:"shadcn",version:"2.0.
|
|
21
|
+
Existing CSS variables will be overwritten. Continue?`)});c||(o.break(),o.log("Theme installation cancelled."),o.break(),process.exit(1))}r.components?.length||(r.components=await Nr(r));let{errors:n,config:s}=await st(r);if(n[V]){let{proceed:c}=await we({type:"confirm",name:"proceed",message:`You need to create a ${l.info("component.json")} file to add components. Proceed?`,initial:!0});c||(o.break(),process.exit(1)),s=await re({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:!0,isNewProject:!1})}let a=!1;if(n[R]){let{projectPath:c}=await te({cwd:r.cwd,force:r.overwrite});c||(o.break(),process.exit(1)),r.cwd=c,s=await re({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!0,isNewProject:!0}),a=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 ee(r.components,s,r),a&&await at(r.components[0],s)}catch(r){o.break(),b(r)}});async function Nr(e){let t=await D();if(!t)return o.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 we({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||(o.warn("No components selected. Exiting."),o.info(""),process.exit(1));let i=S.array(S.string()).safeParse(r);return i.success?i.data:(o.error(""),b(new Error("Something went wrong. Please try again.")),[])}import{existsSync as xe,promises as Ar}from"fs";import be from"path";import{Command as Fr}from"commander";import{diffLines as Lr}from"diff";import{z as K}from"zod";var _r=K.object({component:K.string().optional(),yes:K.boolean(),cwd:K.string(),path:K.string().optional()}),pt=new Fr().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=_r.parse({component:e,...t}),i=be.resolve(r.cwd);xe(i)||(o.error(`The path ${i} does not exist. Please try again.`),process.exit(1));let n=await T(i);n||(o.warn(`Configuration is missing. Please run ${l.success("init")} to create a components.json file.`),process.exit(1));let s=await D();if(s||(b(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let m=n.resolvedPaths.components,f=s.filter(d=>{for(let y of d.files??[]){let W=be.resolve(m,typeof y=="string"?y:y.path);if(xe(W))return!0}return!1}),x=[];for(let d of f){let y=await ct(d,n);y.length&&x.push({name:d.name,changes:y})}x.length||(o.info("No updates found."),process.exit(0)),o.info("The following components have updates available:");for(let d of x){o.info(`- ${d.name}`);for(let y of d.changes)o.info(` - ${y.filePath}`)}o.break(),o.info(`Run ${l.success("diff <component>")} to see the changes.`),process.exit(0)}let a=s.find(m=>m.name===r.component);a||(o.error(`The component ${l.success(r.component)} does not exist.`),process.exit(1));let c=await ct(a,n);c.length||(o.info(`No updates found for ${r.component}.`),process.exit(0));for(let m of c)o.info(`- ${m.filePath}`),await Dr(m.patch),o.info("")}catch(r){b(r)}});async function ct(e,t){let r=await Ve(t.style,[e]),i=await z(t.tailwind.baseColor);if(!r)return[];let n=[];for(let s of r){let a=await Me(t,s);if(a)for(let c of s.files??[]){let m=be.resolve(a,typeof c=="string"?c:c.path);if(!xe(m))continue;let f=await Ar.readFile(m,"utf8");if(typeof c=="string"||!c.content)continue;let x=await q({filename:c.path,raw:c.content,config:t,baseColor:i}),d=Lr(x,f);d.length>1&&n.push({filePath:m,patch:d})}}return n}async function Dr(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 Kr}from"commander";var mt={name:"shadcn",version:"2.0.1",description:"Add components to your apps.",publishConfig:{access:"public"},license:"MIT",author:{name:"shadcn",url:"https://twitter.com/shadcn"},repository:{type:"git",url:"https://github.com/shadcn/ui.git",directory:"packages/cli"},files:["dist"],keywords:["components","ui","tailwind","radix-ui","shadcn"],type:"module",exports:"./dist/index.js",bin:"./dist/index.js",scripts:{dev:"tsup --watch",build:"tsup",typecheck:"tsc --noEmit",clean:"rimraf dist && rimraf components","start:dev":"cross-env REGISTRY_URL=http://localhost:3333/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 Wr(){let e=new Kr().name("shadcn").description("add components and dependencies to your project").version(mt.version||"1.0.0","-v, --version","display the version number");e.addCommand(it).addCommand(lt).addCommand(pt),e.parse()}Wr();
|
|
22
22
|
//# 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/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})\n\nexport const add = new Command()\n .name(\"add\")\n .description(\"add a component to your project\")\n .argument(\n \"[components...]\",\n \"the components to add or a url to the component.\"\n )\n .option(\"-y, --yes\", \"skip confirmation prompt.\", false)\n .option(\"-o, --overwrite\", \"overwrite existing files.\", false)\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd()\n )\n .option(\"-a, --all\", \"add all available components\", false)\n .option(\"-p, --path <path>\", \"the path to add the component to.\")\n .option(\"-s, --silent\", \"mute output.\", false)\n .action(async (components, opts) => {\n try {\n const options = addOptionsSchema.parse({\n components,\n cwd: path.resolve(opts.cwd),\n ...opts,\n })\n\n // Confirm if user is installing themes.\n // For now, we assume a theme is prefixed with \"theme-\".\n const isTheme = options.components?.some((component) =>\n component.includes(\"theme-\")\n )\n if (!options.yes && isTheme) {\n logger.break()\n const { confirm } = await prompts({\n type: \"confirm\",\n name: \"confirm\",\n message: highlighter.warn(\n \"You are about to install a new theme. \\nExisting CSS variables will be overwritten. Continue?\"\n ),\n })\n if (!confirm) {\n logger.break()\n logger.log(\"Theme installation cancelled.\")\n logger.break()\n process.exit(1)\n }\n }\n\n if (!options.components?.length) {\n options.components = await promptForRegistryComponents(options)\n }\n\n let { errors, config } = await preFlightAdd(options)\n\n // No component.json file. Prompt the user to run init.\n if (errors[ERRORS.MISSING_CONFIG]) {\n const { proceed } = await prompts({\n type: \"confirm\",\n name: \"proceed\",\n message: `You need to create a ${highlighter.info(\n \"component.json\"\n )} file to add components. Proceed?`,\n initial: true,\n })\n\n if (!proceed) {\n logger.break()\n process.exit(1)\n }\n\n config = await runInit({\n cwd: options.cwd,\n yes: true,\n force: true,\n defaults: false,\n skipPreflight: false,\n silent: true,\n isNewProject: false,\n })\n }\n\n 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 })\n if (!projectPath) {\n logger.break()\n process.exit(1)\n }\n options.cwd = projectPath\n\n config = await runInit({\n cwd: options.cwd,\n yes: true,\n force: true,\n defaults: false,\n skipPreflight: true,\n silent: true,\n isNewProject: true,\n })\n\n 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 { 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})\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 .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 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 console.log(\"👉\", url)\n const response = await fetch(url, { agent })\n\n if (!response.ok) {\n const errorMessages: { [key: number]: string } = {\n 400: \"Bad request\",\n 401: \"Unauthorized\",\n 403: \"Forbidden\",\n 404: \"Not found\",\n 500: \"Internal server error\",\n }\n const 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, \"'\")\n .replace(/\\\"\\'/g, \"'\")\n .replace(/\\'\\[/g, \"[\")\n .replace(/\\]\\'/g, \"]\")\n .replace(/\\\\\\'/g, \"\")\n .replace(/\\\\\\'/g, \"\")\n themeInitializer.replaceWithText(resultString)\n }\n\n // Unnest all spread properties.\n unnestSpreadProperties(configObject)\n}\n\nfunction addTailwindConfigPlugin(\n configObject: ObjectLiteralExpression,\n plugin: string\n) {\n const existingPlugins = configObject.getProperty(\"plugins\")\n\n if (!existingPlugins) {\n configObject.addPropertyAssignment({\n name: \"plugins\",\n initializer: `[${plugin}]`,\n })\n\n return configObject\n }\n\n if (existingPlugins.isKind(SyntaxKind.PropertyAssignment)) {\n const initializer = existingPlugins.getInitializer()\n\n if (initializer?.isKind(SyntaxKind.ArrayLiteralExpression)) {\n if (\n initializer\n .getElements()\n .map((element) => {\n return element.getText().replace(/[\"']/g, \"\")\n })\n .includes(plugin.replace(/[\"']/g, \"\"))\n ) {\n return configObject\n }\n initializer.addElement(plugin)\n }\n\n return configObject\n }\n\n return configObject\n}\n\nasync function _createSourceFile(input: string, config: Config | null) {\n const dir = await fs.mkdtemp(path.join(tmpdir(), \"shadcn-\"))\n const resolvedPath =\n config?.resolvedPaths?.tailwindConfig || \"tailwind.config.ts\"\n const tempFile = path.join(dir, `shadcn-${path.basename(resolvedPath)}`)\n\n const project = new Project({\n compilerOptions: {},\n })\n const sourceFile = project.createSourceFile(tempFile, input, {\n // Note: .js and .mjs can still be valid for TS projects.\n // We can't infer TypeScript from config.tsx.\n scriptKind:\n path.extname(resolvedPath) === \".ts\" ? ScriptKind.TS : ScriptKind.JS,\n })\n\n return sourceFile\n}\n\nfunction _getQuoteChar(configObject: ObjectLiteralExpression) {\n return configObject\n .getFirstDescendantByKind(SyntaxKind.StringLiteral)\n ?.getQuoteKind() === QuoteKind.Single\n ? \"'\"\n : '\"'\n}\n\nexport function nestSpreadProperties(obj: ObjectLiteralExpression) {\n const properties = obj.getProperties()\n\n for (let i = 0; i < properties.length; i++) {\n const prop = properties[i]\n if (prop.isKind(SyntaxKind.SpreadAssignment)) {\n const spreadAssignment = prop.asKindOrThrow(SyntaxKind.SpreadAssignment)\n const spreadText = spreadAssignment.getExpression().getText()\n\n // Replace spread with a property assignment\n obj.insertPropertyAssignment(i, {\n name: `___${spreadText.replace(/^\\.\\.\\./, \"\")}`,\n initializer: `\"...${spreadText.replace(/^\\.\\.\\./, \"\")}\"`,\n })\n\n // Remove the original spread assignment\n spreadAssignment.remove()\n } else if (prop.isKind(SyntaxKind.PropertyAssignment)) {\n const propAssignment = prop.asKindOrThrow(SyntaxKind.PropertyAssignment)\n const initializer = propAssignment.getInitializer()\n\n if (\n initializer &&\n initializer.isKind(SyntaxKind.ObjectLiteralExpression)\n ) {\n // Recursively process nested object literals\n nestSpreadProperties(\n initializer.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n )\n }\n }\n }\n}\n\nexport function unnestSpreadProperties(obj: ObjectLiteralExpression) {\n const properties = obj.getProperties()\n\n for (let i = 0; i < properties.length; i++) {\n const prop = properties[i]\n if (prop.isKind(SyntaxKind.PropertyAssignment)) {\n const propAssignment = prop as PropertyAssignment\n const initializer = propAssignment.getInitializer()\n\n if (initializer?.isKind(SyntaxKind.StringLiteral)) {\n const value = initializer.getLiteralValue()\n if (value.startsWith(\"...\")) {\n obj.insertSpreadAssignment(i, { expression: value.slice(3) })\n propAssignment.remove()\n }\n } else if (initializer?.isKind(SyntaxKind.ObjectLiteralExpression)) {\n unnestSpreadProperties(initializer as ObjectLiteralExpression)\n }\n }\n }\n}\n\nasync function parseObjectLiteral(objectLiteralString: string): Promise<any> {\n const sourceFile = await _createSourceFile(\n `const theme = ${objectLiteralString}`,\n null\n )\n\n const statement = sourceFile.getStatements()[0]\n if (statement?.getKind() === SyntaxKind.VariableStatement) {\n const declaration = (statement as VariableStatement)\n .getDeclarationList()\n ?.getDeclarations()[0]\n const initializer = declaration.getInitializer()\n if (initializer?.isKind(SyntaxKind.ObjectLiteralExpression)) {\n return await parseObjectLiteralExpression(initializer)\n }\n }\n\n throw new Error(\"Invalid input: not an object literal\")\n}\n\nfunction parseObjectLiteralExpression(node: ObjectLiteralExpression): any {\n const result: any = {}\n for (const property of node.getProperties()) {\n if (property.isKind(SyntaxKind.PropertyAssignment)) {\n const name = property.getName().replace(/\\'/g, \"\")\n if (\n property.getInitializer()?.isKind(SyntaxKind.ObjectLiteralExpression)\n ) {\n result[name] = parseObjectLiteralExpression(\n property.getInitializer() as ObjectLiteralExpression\n )\n } else {\n result[name] = parseValue(property.getInitializer())\n }\n }\n }\n return result\n}\n\nfunction parseValue(node: any): any {\n switch (node.kind) {\n case SyntaxKind.StringLiteral:\n return node.text\n case SyntaxKind.NumericLiteral:\n return Number(node.text)\n case SyntaxKind.TrueKeyword:\n return true\n case SyntaxKind.FalseKeyword:\n return false\n case SyntaxKind.NullKeyword:\n return null\n case SyntaxKind.ArrayLiteralExpression:\n return node.elements.map(parseValue)\n default:\n return node.getText()\n }\n}\n\nexport function buildTailwindThemeColorsFromCssVars(\n cssVars: Record<string, string>\n) {\n const result: Record<string, any> = {}\n\n for (const key of Object.keys(cssVars)) {\n const parts = key.split(\"-\")\n const colorName = parts[0]\n const subType = parts.slice(1).join(\"-\")\n\n if (subType === \"\") {\n if (typeof result[colorName] === \"object\") {\n result[colorName].DEFAULT = `hsl(var(--${key}))`\n } else {\n result[colorName] = `hsl(var(--${key}))`\n }\n } else {\n if (typeof result[colorName] !== \"object\") {\n result[colorName] = { DEFAULT: `hsl(var(--${colorName}))` }\n }\n result[colorName][subType] = `hsl(var(--${key}))`\n }\n }\n\n // Remove DEFAULT if it's not in the original cssVars\n for (const [colorName, value] of Object.entries(result)) {\n if (\n typeof value === \"object\" &&\n value.DEFAULT === `hsl(var(--${colorName}))` &&\n !(colorName in cssVars)\n ) {\n delete value.DEFAULT\n }\n }\n\n return result\n}\n","import { promises as fs } from \"fs\"\nimport path from \"path\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { registryItemCssVarsSchema } from \"@/src/utils/registry/schema\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport postcss from \"postcss\"\nimport AtRule from \"postcss/lib/at-rule\"\nimport Root from \"postcss/lib/root\"\nimport Rule from \"postcss/lib/rule\"\nimport { z } from \"zod\"\n\nexport async function updateCssVars(\n cssVars: z.infer<typeof registryItemCssVarsSchema> | undefined,\n config: Config,\n options: {\n cleanupDefaultNextStyles?: boolean\n silent?: boolean\n }\n) {\n if (\n !cssVars ||\n !Object.keys(cssVars).length ||\n !config.resolvedPaths.tailwindCss\n ) {\n return\n }\n\n options = {\n cleanupDefaultNextStyles: false,\n silent: false,\n ...options,\n }\n const cssFilepath = config.resolvedPaths.tailwindCss\n const cssFilepathRelative = path.relative(\n config.resolvedPaths.cwd,\n cssFilepath\n )\n const cssVarsSpinner = spinner(\n `Updating ${highlighter.info(cssFilepathRelative)}`,\n {\n silent: options.silent,\n }\n ).start()\n const raw = await fs.readFile(cssFilepath, \"utf8\")\n let output = await transformCssVars(raw, cssVars, config, {\n cleanupDefaultNextStyles: options.cleanupDefaultNextStyles,\n })\n await fs.writeFile(cssFilepath, output, \"utf8\")\n cssVarsSpinner.succeed()\n}\n\nexport async function transformCssVars(\n input: string,\n cssVars: z.infer<typeof registryItemCssVarsSchema>,\n config: Config,\n options: {\n cleanupDefaultNextStyles?: boolean\n }\n) {\n options = {\n cleanupDefaultNextStyles: false,\n ...options,\n }\n\n const plugins = [updateCssVarsPlugin(cssVars)]\n if (options.cleanupDefaultNextStyles) {\n plugins.push(cleanupDefaultNextStylesPlugin())\n }\n\n // Only add the base layer plugin if we're using css variables.\n if (config.tailwind.cssVariables) {\n plugins.push(updateBaseLayerPlugin())\n }\n\n const result = await postcss(plugins).process(input, {\n from: undefined,\n })\n\n return result.css\n}\n\nfunction updateBaseLayerPlugin() {\n return {\n postcssPlugin: \"update-base-layer\",\n Once(root: Root) {\n const requiredRules = [\n { selector: \"*\", apply: \"border-border\" },\n { selector: \"body\", apply: \"bg-background text-foreground\" },\n ]\n\n let baseLayer = root.nodes.find(\n (node): node is AtRule =>\n node.type === \"atrule\" &&\n node.name === \"layer\" &&\n node.params === \"base\" &&\n requiredRules.every(({ selector, apply }) =>\n node.nodes?.some(\n (rule): rule is Rule =>\n rule.type === \"rule\" &&\n rule.selector === selector &&\n rule.nodes.some(\n (applyRule): applyRule is AtRule =>\n applyRule.type === \"atrule\" &&\n applyRule.name === \"apply\" &&\n applyRule.params === apply\n )\n )\n )\n ) as AtRule | undefined\n\n if (!baseLayer) {\n baseLayer = postcss.atRule({\n name: \"layer\",\n params: \"base\",\n raws: { semicolon: true, between: \" \", before: \"\\n\" },\n })\n root.append(baseLayer)\n }\n\n requiredRules.forEach(({ selector, apply }) => {\n const existingRule = baseLayer?.nodes?.find(\n (node): node is Rule =>\n node.type === \"rule\" && node.selector === selector\n )\n\n if (!existingRule) {\n baseLayer?.append(\n postcss.rule({\n selector,\n nodes: [\n postcss.atRule({\n name: \"apply\",\n params: apply,\n raws: { semicolon: true, before: \"\\n \" },\n }),\n ],\n raws: { semicolon: true, between: \" \", before: \"\\n \" },\n })\n )\n }\n })\n },\n }\n}\n\nfunction updateCssVarsPlugin(\n cssVars: z.infer<typeof registryItemCssVarsSchema>\n) {\n return {\n postcssPlugin: \"update-css-vars\",\n Once(root: Root) {\n let baseLayer = root.nodes.find(\n (node) =>\n node.type === \"atrule\" &&\n node.name === \"layer\" &&\n node.params === \"base\"\n ) as AtRule | undefined\n\n if (!(baseLayer instanceof AtRule)) {\n baseLayer = postcss.atRule({\n name: \"layer\",\n params: \"base\",\n nodes: [],\n raws: {\n semicolon: true,\n before: \"\\n\",\n between: \" \",\n },\n })\n root.append(baseLayer)\n }\n\n if (baseLayer !== undefined) {\n // Add variables for each key in cssVars\n Object.entries(cssVars).forEach(([key, vars]) => {\n const selector = key === \"light\" ? \":root\" : `.${key}`\n // TODO: Fix typecheck.\n addOrUpdateVars(baseLayer as AtRule, selector, vars)\n })\n }\n },\n }\n}\n\nfunction cleanupDefaultNextStylesPlugin() {\n return {\n postcssPlugin: \"cleanup-default-next-styles\",\n Once(root: Root) {\n const bodyRule = root.nodes.find(\n (node): node is Rule => node.type === \"rule\" && node.selector === \"body\"\n )\n if (bodyRule) {\n // Remove color from the body node.\n bodyRule.nodes\n .find(\n (node): node is postcss.Declaration =>\n node.type === \"decl\" &&\n node.prop === \"color\" &&\n node.value === \"rgb(var(--foreground-rgb))\"\n )\n ?.remove()\n\n // Remove background: linear-gradient.\n bodyRule.nodes\n .find((node): node is postcss.Declaration => {\n return (\n node.type === \"decl\" &&\n node.prop === \"background\" &&\n // This is only going to run on create project, so all good.\n node.value.startsWith(\"linear-gradient\")\n )\n })\n ?.remove()\n\n // If the body rule is empty, remove it.\n if (bodyRule.nodes.length === 0) {\n bodyRule.remove()\n }\n }\n },\n }\n}\n\nfunction addOrUpdateVars(\n baseLayer: AtRule,\n selector: string,\n vars: Record<string, string>\n) {\n let ruleNode = baseLayer.nodes?.find(\n (node): node is Rule => node.type === \"rule\" && node.selector === selector\n )\n\n if (!ruleNode) {\n if (Object.keys(vars).length > 0) {\n ruleNode = postcss.rule({\n selector,\n raws: { between: \" \", before: \"\\n \" },\n })\n baseLayer.append(ruleNode)\n }\n }\n\n Object.entries(vars).forEach(([key, value]) => {\n const prop = `--${key.replace(/^--/, \"\")}`\n const newDecl = postcss.decl({\n prop,\n value,\n raws: { semicolon: true },\n })\n\n const existingDecl = ruleNode?.nodes.find(\n (node): node is postcss.Declaration =>\n node.type === \"decl\" && node.prop === prop\n )\n\n existingDecl ? existingDecl.replaceWith(newDecl) : ruleNode?.append(newDecl)\n })\n}\n","import { detect } from \"@antfu/ni\"\n\nexport async function getPackageManager(\n targetDir: string,\n { withFallback }: { withFallback?: boolean } = {\n withFallback: false,\n }\n): Promise<\"yarn\" | \"pnpm\" | \"bun\" | \"npm\"> {\n const packageManager = await detect({ programmatic: true, cwd: targetDir })\n\n if (packageManager === \"yarn@berry\") return \"yarn\"\n if (packageManager === \"pnpm@6\") return \"pnpm\"\n if (packageManager === \"bun\") return \"bun\"\n\n if (!withFallback) {\n return packageManager ?? \"npm\"\n }\n\n // Fallback to user agent if not detected.\n const userAgent = process.env.npm_config_user_agent || \"\"\n\n if (userAgent.startsWith(\"yarn\")) {\n return \"yarn\"\n }\n\n if (userAgent.startsWith(\"pnpm\")) {\n return \"pnpm\"\n }\n\n if (userAgent.startsWith(\"bun\")) {\n return \"bun\"\n }\n\n return \"npm\"\n}\n\nexport async function getPackageRunner(cwd: string) {\n const packageManager = await getPackageManager(cwd)\n\n if (packageManager === \"pnpm\") return \"pnpm dlx\"\n\n if (packageManager === \"bun\") return \"bunx\"\n\n return \"npx\"\n}\n","import { Config } from \"@/src/utils/get-config\"\nimport { getPackageManager } from \"@/src/utils/get-package-manager\"\nimport { RegistryItem } from \"@/src/utils/registry/schema\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport { execa } from \"execa\"\n\nexport async function updateDependencies(\n dependencies: RegistryItem[\"dependencies\"],\n config: Config,\n options: {\n silent?: boolean\n }\n) {\n dependencies = Array.from(new Set(dependencies))\n if (!dependencies?.length) {\n return\n }\n\n options = {\n silent: false,\n ...options,\n }\n\n const dependenciesSpinner = spinner(`Installing dependencies.`, {\n silent: options.silent,\n })?.start()\n const packageManager = await getPackageManager(config.resolvedPaths.cwd)\n await execa(\n packageManager,\n [packageManager === \"npm\" ? \"install\" : \"add\", ...dependencies],\n {\n cwd: config.resolvedPaths.cwd,\n }\n )\n dependenciesSpinner?.succeed()\n}\n","import { existsSync, promises as fs } from \"fs\"\nimport path, { basename } from \"path\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport {\n getRegistryBaseColor,\n getRegistryItemFileTargetPath,\n} from \"@/src/utils/registry\"\nimport { RegistryItem } from \"@/src/utils/registry/schema\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport { transform } from \"@/src/utils/transformers\"\nimport { transformCssVars } from \"@/src/utils/transformers/transform-css-vars\"\nimport { transformImport } from \"@/src/utils/transformers/transform-import\"\nimport { transformRsc } from \"@/src/utils/transformers/transform-rsc\"\nimport { transformTwPrefixes } from \"@/src/utils/transformers/transform-tw-prefix\"\nimport prompts from \"prompts\"\n\nexport async function updateFiles(\n files: RegistryItem[\"files\"],\n config: Config,\n options: {\n overwrite?: boolean\n force?: boolean\n silent?: boolean\n }\n) {\n if (!files?.length) {\n return\n }\n options = {\n overwrite: false,\n force: false,\n silent: false,\n ...options,\n }\n const filesCreatedSpinner = spinner(`Updating files.`, {\n silent: options.silent,\n })?.start()\n const baseColor = await getRegistryBaseColor(config.tailwind.baseColor)\n const filesCreated = []\n const filesUpdated = []\n const filesSkipped = []\n\n for (const file of files) {\n if (!file.content) {\n continue\n }\n\n let targetDir = getRegistryItemFileTargetPath(file, config)\n const fileName = basename(file.path)\n let filePath = path.join(targetDir, fileName)\n\n if (file.target) {\n filePath = path.join(config.resolvedPaths.cwd, file.target)\n targetDir = path.dirname(filePath)\n }\n\n if (!config.tsx) {\n filePath = filePath.replace(/\\.tsx?$/, (match) =>\n match === \".tsx\" ? \".jsx\" : \".js\"\n )\n }\n\n const existingFile = existsSync(filePath)\n if (existingFile && !options.overwrite) {\n filesCreatedSpinner.stop()\n const { overwrite } = await prompts({\n type: \"confirm\",\n name: \"overwrite\",\n message: `The file ${highlighter.info(\n fileName\n )} already exists. Would you like to overwrite?`,\n initial: false,\n })\n\n if (!overwrite) {\n filesSkipped.push(path.relative(config.resolvedPaths.cwd, filePath))\n continue\n }\n filesCreatedSpinner?.start()\n }\n\n // Create the target directory if it doesn't exist.\n if (!existsSync(targetDir)) {\n await fs.mkdir(targetDir, { recursive: true })\n }\n\n // Run our transformers.\n const content = await transform(\n {\n filename: file.path,\n raw: file.content,\n config,\n baseColor,\n transformJsx: !config.tsx,\n },\n [transformImport, transformRsc, transformCssVars, transformTwPrefixes]\n )\n\n await fs.writeFile(filePath, content, \"utf-8\")\n existingFile\n ? filesUpdated.push(path.relative(config.resolvedPaths.cwd, filePath))\n : filesCreated.push(path.relative(config.resolvedPaths.cwd, filePath))\n }\n\n const hasUpdatedFiles = filesCreated.length || filesUpdated.length\n if (!hasUpdatedFiles && !filesSkipped.length) {\n filesCreatedSpinner?.info(\"No files updated.\")\n }\n\n if (filesCreated.length) {\n filesCreatedSpinner?.succeed(\n `Created ${filesCreated.length} ${\n filesCreated.length === 1 ? \"file\" : \"files\"\n }:`\n )\n if (!options.silent) {\n for (const file of filesCreated) {\n logger.log(` - ${file}`)\n }\n }\n } else {\n filesCreatedSpinner?.stop()\n }\n\n if (filesUpdated.length) {\n spinner(\n `Updated ${filesUpdated.length} ${\n filesUpdated.length === 1 ? \"file\" : \"files\"\n }:`,\n {\n silent: options.silent,\n }\n )?.info()\n if (!options.silent) {\n for (const file of filesUpdated) {\n logger.log(` - ${file}`)\n }\n }\n }\n\n if (filesSkipped.length) {\n spinner(\n `Skipped ${filesSkipped.length} ${\n filesUpdated.length === 1 ? \"file\" : \"files\"\n }:`,\n {\n silent: options.silent,\n }\n )?.info()\n if (!options.silent) {\n for (const file of filesSkipped) {\n logger.log(` - ${file}`)\n }\n }\n }\n\n if (!options.silent) {\n logger.break()\n }\n}\n","import { promises as fs } from \"fs\"\nimport { tmpdir } from \"os\"\nimport path from \"path\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { registryBaseColorSchema } from \"@/src/utils/registry/schema\"\nimport { transformCssVars } from \"@/src/utils/transformers/transform-css-vars\"\nimport { transformImport } from \"@/src/utils/transformers/transform-import\"\nimport { transformJsx } from \"@/src/utils/transformers/transform-jsx\"\nimport { transformRsc } from \"@/src/utils/transformers/transform-rsc\"\nimport { Project, ScriptKind, type SourceFile } from \"ts-morph\"\nimport { z } from \"zod\"\n\nimport { transformTwPrefixes } from \"./transform-tw-prefix\"\n\nexport type TransformOpts = {\n filename: string\n raw: string\n config: Config\n baseColor?: z.infer<typeof registryBaseColorSchema>\n transformJsx?: boolean\n}\n\nexport type Transformer<Output = SourceFile> = (\n opts: TransformOpts & {\n sourceFile: SourceFile\n }\n) => Promise<Output>\n\nconst project = new Project({\n compilerOptions: {},\n})\n\nasync function createTempSourceFile(filename: string) {\n const dir = await fs.mkdtemp(path.join(tmpdir(), \"shadcn-\"))\n return path.join(dir, filename)\n}\n\nexport async function transform(\n opts: TransformOpts,\n transformers: Transformer[] = [\n transformImport,\n transformRsc,\n transformCssVars,\n transformTwPrefixes,\n ]\n) {\n const tempFile = await createTempSourceFile(opts.filename)\n const sourceFile = project.createSourceFile(tempFile, opts.raw, {\n scriptKind: ScriptKind.TSX,\n })\n\n for (const transformer of transformers) {\n transformer({ sourceFile, ...opts })\n }\n\n if (opts.transformJsx) {\n return await transformJsx({\n sourceFile,\n ...opts,\n })\n }\n\n return sourceFile.getText()\n}\n","import { registryBaseColorSchema } from \"@/src/utils/registry/schema\"\nimport { Transformer } from \"@/src/utils/transformers\"\nimport { ScriptKind, SyntaxKind } from \"ts-morph\"\nimport { z } from \"zod\"\n\nexport const transformCssVars: Transformer = async ({\n sourceFile,\n config,\n baseColor,\n}) => {\n // No transform if using css variables.\n if (config.tailwind?.cssVariables || !baseColor?.inlineColors) {\n return sourceFile\n }\n\n // Find jsx attributes with the name className.\n // const openingElements = sourceFile.getDescendantsOfKind(SyntaxKind.JsxElement)\n // console.log(openingElements)\n // const jsxAttributes = sourceFile\n // .getDescendantsOfKind(SyntaxKind.JsxAttribute)\n // .filter((node) => node.getName() === \"className\")\n\n // for (const jsxAttribute of jsxAttributes) {\n // const value = jsxAttribute.getInitializer()?.getText()\n // if (value) {\n // const valueWithColorMapping = applyColorMapping(\n // value.replace(/\"/g, \"\"),\n // baseColor.inlineColors\n // )\n // jsxAttribute.setInitializer(`\"${valueWithColorMapping}\"`)\n // }\n // }\n sourceFile.getDescendantsOfKind(SyntaxKind.StringLiteral).forEach((node) => {\n const value = node.getText()\n if (value) {\n const valueWithColorMapping = applyColorMapping(\n value.replace(/\"/g, \"\"),\n baseColor.inlineColors\n )\n node.replaceWithText(`\"${valueWithColorMapping.trim()}\"`)\n }\n })\n\n return sourceFile\n}\n\n// export default function transformer(file: FileInfo, api: API) {\n// const j = api.jscodeshift.withParser(\"tsx\")\n\n// // Replace bg-background with \"bg-white dark:bg-slate-950\"\n// const $j = j(file.source)\n// return $j\n// .find(j.JSXAttribute, {\n// name: {\n// name: \"className\",\n// },\n// })\n// .forEach((path) => {\n// const { node } = path\n// if (node?.value?.type) {\n// if (node.value.type === \"StringLiteral\") {\n// node.value.value = applyColorMapping(node.value.value)\n// console.log(node.value.value)\n// }\n\n// if (\n// node.value.type === \"JSXExpressionContainer\" &&\n// node.value.expression.type === \"CallExpression\"\n// ) {\n// const callee = node.value.expression.callee\n// if (callee.type === \"Identifier\" && callee.name === \"cn\") {\n// node.value.expression.arguments.forEach((arg) => {\n// if (arg.type === \"StringLiteral\") {\n// arg.value = applyColorMapping(arg.value)\n// }\n\n// if (\n// arg.type === \"LogicalExpression\" &&\n// arg.right.type === \"StringLiteral\"\n// ) {\n// arg.right.value = applyColorMapping(arg.right.value)\n// }\n// })\n// }\n// }\n// }\n// })\n// .toSource()\n// }\n\n// // export function splitClassName(input: string): (string | null)[] {\n// // const parts = input.split(\":\")\n// // const classNames = parts.map((part) => {\n// // const match = part.match(/^\\[?(.+)\\]$/)\n// // if (match) {\n// // return match[1]\n// // } else {\n// // return null\n// // }\n// // })\n\n// // return classNames\n// // }\n\n// Splits a className into variant-name-alpha.\n// eg. hover:bg-primary-100 -> [hover, bg-primary, 100]\nexport function splitClassName(className: string): (string | null)[] {\n if (!className.includes(\"/\") && !className.includes(\":\")) {\n return [null, className, null]\n }\n\n const parts: (string | null)[] = []\n // First we split to find the alpha.\n let [rest, alpha] = className.split(\"/\")\n\n // Check if rest has a colon.\n if (!rest.includes(\":\")) {\n return [null, rest, alpha]\n }\n\n // Next we split the rest by the colon.\n const split = rest.split(\":\")\n\n // We take the last item from the split as the name.\n const name = split.pop()\n\n // We glue back the rest of the split.\n const variant = split.join(\":\")\n\n // Finally we push the variant, name and alpha.\n parts.push(variant ?? null, name ?? null, alpha ?? null)\n\n return parts\n}\n\nconst PREFIXES = [\"bg-\", \"text-\", \"border-\", \"ring-offset-\", \"ring-\"]\n\nexport function applyColorMapping(\n input: string,\n mapping: z.infer<typeof registryBaseColorSchema>[\"inlineColors\"]\n) {\n // Handle border classes.\n if (input.includes(\" border \")) {\n input = input.replace(\" border \", \" border border-border \")\n }\n\n // Build color mappings.\n const classNames = input.split(\" \")\n const lightMode = new Set<string>()\n const darkMode = new Set<string>()\n for (let className of classNames) {\n const [variant, value, modifier] = splitClassName(className)\n const prefix = PREFIXES.find((prefix) => value?.startsWith(prefix))\n if (!prefix) {\n if (!lightMode.has(className)) {\n lightMode.add(className)\n }\n continue\n }\n\n const needle = value?.replace(prefix, \"\")\n if (needle && needle in mapping.light) {\n lightMode.add(\n [variant, `${prefix}${mapping.light[needle]}`]\n .filter(Boolean)\n .join(\":\") + (modifier ? `/${modifier}` : \"\")\n )\n\n darkMode.add(\n [\"dark\", variant, `${prefix}${mapping.dark[needle]}`]\n .filter(Boolean)\n .join(\":\") + (modifier ? `/${modifier}` : \"\")\n )\n continue\n }\n\n if (!lightMode.has(className)) {\n lightMode.add(className)\n }\n }\n\n return [...Array.from(lightMode), ...Array.from(darkMode)].join(\" \").trim()\n}\n","import { Config } from \"@/src/utils/get-config\"\nimport { Transformer } from \"@/src/utils/transformers\"\n\nexport const transformImport: Transformer = async ({ sourceFile, config }) => {\n const importDeclarations = sourceFile.getImportDeclarations()\n\n for (const importDeclaration of importDeclarations) {\n const moduleSpecifier = updateImportAliases(\n importDeclaration.getModuleSpecifierValue(),\n config\n )\n\n importDeclaration.setModuleSpecifier(moduleSpecifier)\n\n // Replace `import { cn } from \"@/lib/utils\"`\n if (moduleSpecifier == \"@/lib/utils\") {\n const namedImports = importDeclaration.getNamedImports()\n const cnImport = namedImports.find((i) => i.getName() === \"cn\")\n if (cnImport) {\n importDeclaration.setModuleSpecifier(\n moduleSpecifier.replace(/^@\\/lib\\/utils/, config.aliases.utils)\n )\n }\n }\n }\n\n return sourceFile\n}\n\nfunction updateImportAliases(moduleSpecifier: string, config: Config) {\n // 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\">\n) {\n if (!options.force) {\n const { proceed } = await prompts({\n type: \"confirm\",\n name: \"proceed\",\n message: `The path ${highlighter.info(\n options.cwd\n )} is empty. Would you like to start a new ${highlighter.info(\n \"Next.js\"\n )} project?`,\n initial: true,\n })\n\n if (!proceed) {\n return {\n projectPath: null,\n projectName: null,\n }\n }\n }\n\n const packageManager = await getPackageManager(options.cwd)\n\n const { name } = await prompts({\n type: \"text\",\n name: \"name\",\n message: `What is your project named?`,\n initial: \"my-app\",\n format: (value: string) => value.trim(),\n validate: (value: string) =>\n value.length > 128 ? `Name should be less than 128 characters.` : true,\n })\n\n const projectPath = `${options.cwd}/${name}`\n\n // Check if path is writable.\n try {\n await fs.access(options.cwd, fs.constants.W_OK)\n } catch (error) {\n logger.break()\n logger.error(`The path ${highlighter.info(options.cwd)} is not writable.`)\n logger.error(\n `It is likely you do not have write permissions for this folder or the path ${highlighter.info(\n options.cwd\n )} does not exist.`\n )\n logger.break()\n process.exit(1)\n }\n\n if (fs.existsSync(path.resolve(options.cwd, name, \"package.json\"))) {\n logger.break()\n logger.error(\n `A project with the name ${highlighter.info(name)} already exists.`\n )\n logger.error(`Please choose a different name and try again.`)\n logger.break()\n process.exit(1)\n }\n\n const createSpinner = spinner(\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 \"--no-src-dir\",\n \"--no-import-alias\",\n `--use-${packageManager}`,\n ]\n\n try {\n await execa(\n \"npx\",\n [\"create-next-app@latest\", projectPath, \"--silent\", ...args],\n {\n cwd: options.cwd,\n }\n )\n } catch (error) {\n logger.break()\n logger.error(\n `Something went wront creating a new Next.js project. Please try again.`\n )\n process.exit(1)\n }\n\n createSpinner?.succeed(\"Creating a new Next.js project.\")\n\n return {\n projectPath,\n projectName: name,\n }\n}\n","import path from \"path\"\nimport { addOptionsSchema } from \"@/src/commands/add\"\nimport * as ERRORS from \"@/src/utils/errors\"\nimport { getConfig } from \"@/src/utils/get-config\"\nimport { 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.0\",\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/cli\"\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","message","highlighter","logger","getRegistryItemFileTargetPath","file","registryResolveItemsTree","names","getRegistryIndex","items","name","getRegistryItem","registryDependencies","uniqueDependencies","urls","isUrl","payload","z","registryItemSchema","index","theme","registryGetTheme","tailwind","deepmerge","cssVars","registryResolvedItemsTreeSchema","baseColor","getRegistryBaseColor","buildTailwindThemeColorsFromCssVars","REGISTRY_URL","fs","path","postcss","AtRule","updateCssVars","cssVars","config","options","cssFilepath","cssFilepathRelative","path","cssVarsSpinner","spinner","highlighter","raw","fs","output","transformCssVars","input","plugins","updateCssVarsPlugin","cleanupDefaultNextStylesPlugin","updateBaseLayerPlugin","root","requiredRules","baseLayer","node","selector","apply","rule","applyRule","key","vars","addOrUpdateVars","bodyRule","ruleNode","value","prop","newDecl","existingDecl","detect","getPackageManager","targetDir","withFallback","packageManager","userAgent","execa","updateDependencies","dependencies","config","options","dependenciesSpinner","spinner","packageManager","getPackageManager","existsSync","fs","path","basename","fs","tmpdir","path","SyntaxKind","transformCssVars","sourceFile","config","baseColor","node","value","valueWithColorMapping","applyColorMapping","splitClassName","className","parts","rest","alpha","split","name","variant","PREFIXES","input","mapping","classNames","lightMode","darkMode","modifier","prefix","needle","transformImport","sourceFile","config","importDeclarations","importDeclaration","moduleSpecifier","updateImportAliases","i","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","baseColor","getRegistryBaseColor","filesCreated","filesUpdated","filesSkipped","file","targetDir","getRegistryItemFileTargetPath","fileName","basename","filePath","path","match","existingFile","existsSync","overwrite","highlighter","fs","content","transform","transformImport","transformRsc","transformCssVars","transformTwPrefixes","logger","addComponents","components","config","options","registrySpinner","spinner","tree","registryResolveItemsTree","handleError","updateTailwindConfig","updateCssVars","updateDependencies","updateFiles","path","execa","fs","prompts","createProject","options","proceed","highlighter","packageManager","getPackageManager","name","value","projectPath","logger","path","createSpinner","spinner","args","Command","prompts","z","initOptionsSchema","init","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","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/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})\n\nexport const add = new Command()\n .name(\"add\")\n .description(\"add a component to your project\")\n .argument(\n \"[components...]\",\n \"the components to add or a url to the component.\"\n )\n .option(\"-y, --yes\", \"skip confirmation prompt.\", false)\n .option(\"-o, --overwrite\", \"overwrite existing files.\", false)\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd()\n )\n .option(\"-a, --all\", \"add all available components\", false)\n .option(\"-p, --path <path>\", \"the path to add the component to.\")\n .option(\"-s, --silent\", \"mute output.\", false)\n .action(async (components, opts) => {\n try {\n const options = addOptionsSchema.parse({\n components,\n cwd: path.resolve(opts.cwd),\n ...opts,\n })\n\n // Confirm if user is installing themes.\n // For now, we assume a theme is prefixed with \"theme-\".\n const isTheme = options.components?.some((component) =>\n component.includes(\"theme-\")\n )\n if (!options.yes && isTheme) {\n logger.break()\n const { confirm } = await prompts({\n type: \"confirm\",\n name: \"confirm\",\n message: highlighter.warn(\n \"You are about to install a new theme. \\nExisting CSS variables will be overwritten. Continue?\"\n ),\n })\n if (!confirm) {\n logger.break()\n logger.log(\"Theme installation cancelled.\")\n logger.break()\n process.exit(1)\n }\n }\n\n if (!options.components?.length) {\n options.components = await promptForRegistryComponents(options)\n }\n\n let { errors, config } = await preFlightAdd(options)\n\n // No component.json file. Prompt the user to run init.\n if (errors[ERRORS.MISSING_CONFIG]) {\n const { proceed } = await prompts({\n type: \"confirm\",\n name: \"proceed\",\n message: `You need to create a ${highlighter.info(\n \"component.json\"\n )} file to add components. Proceed?`,\n initial: true,\n })\n\n if (!proceed) {\n logger.break()\n process.exit(1)\n }\n\n config = await runInit({\n cwd: options.cwd,\n yes: true,\n force: true,\n defaults: false,\n skipPreflight: false,\n silent: true,\n isNewProject: false,\n })\n }\n\n 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 })\n if (!projectPath) {\n logger.break()\n process.exit(1)\n }\n options.cwd = projectPath\n\n config = await runInit({\n cwd: options.cwd,\n yes: true,\n force: true,\n defaults: false,\n skipPreflight: true,\n silent: true,\n isNewProject: true,\n })\n\n 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 { 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})\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 .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 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 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, \"'\")\n .replace(/\\\"\\'/g, \"'\")\n .replace(/\\'\\[/g, \"[\")\n .replace(/\\]\\'/g, \"]\")\n .replace(/\\\\\\'/g, \"\")\n .replace(/\\\\\\'/g, \"\")\n themeInitializer.replaceWithText(resultString)\n }\n\n // Unnest all spread properties.\n unnestSpreadProperties(configObject)\n}\n\nfunction addTailwindConfigPlugin(\n configObject: ObjectLiteralExpression,\n plugin: string\n) {\n const existingPlugins = configObject.getProperty(\"plugins\")\n\n if (!existingPlugins) {\n configObject.addPropertyAssignment({\n name: \"plugins\",\n initializer: `[${plugin}]`,\n })\n\n return configObject\n }\n\n if (existingPlugins.isKind(SyntaxKind.PropertyAssignment)) {\n const initializer = existingPlugins.getInitializer()\n\n if (initializer?.isKind(SyntaxKind.ArrayLiteralExpression)) {\n if (\n initializer\n .getElements()\n .map((element) => {\n return element.getText().replace(/[\"']/g, \"\")\n })\n .includes(plugin.replace(/[\"']/g, \"\"))\n ) {\n return configObject\n }\n initializer.addElement(plugin)\n }\n\n return configObject\n }\n\n return configObject\n}\n\nasync function _createSourceFile(input: string, config: Config | null) {\n const dir = await fs.mkdtemp(path.join(tmpdir(), \"shadcn-\"))\n const resolvedPath =\n config?.resolvedPaths?.tailwindConfig || \"tailwind.config.ts\"\n const tempFile = path.join(dir, `shadcn-${path.basename(resolvedPath)}`)\n\n const project = new Project({\n compilerOptions: {},\n })\n const sourceFile = project.createSourceFile(tempFile, input, {\n // Note: .js and .mjs can still be valid for TS projects.\n // We can't infer TypeScript from config.tsx.\n scriptKind:\n path.extname(resolvedPath) === \".ts\" ? ScriptKind.TS : ScriptKind.JS,\n })\n\n return sourceFile\n}\n\nfunction _getQuoteChar(configObject: ObjectLiteralExpression) {\n return configObject\n .getFirstDescendantByKind(SyntaxKind.StringLiteral)\n ?.getQuoteKind() === QuoteKind.Single\n ? \"'\"\n : '\"'\n}\n\nexport function nestSpreadProperties(obj: ObjectLiteralExpression) {\n const properties = obj.getProperties()\n\n for (let i = 0; i < properties.length; i++) {\n const prop = properties[i]\n if (prop.isKind(SyntaxKind.SpreadAssignment)) {\n const spreadAssignment = prop.asKindOrThrow(SyntaxKind.SpreadAssignment)\n const spreadText = spreadAssignment.getExpression().getText()\n\n // Replace spread with a property assignment\n obj.insertPropertyAssignment(i, {\n name: `___${spreadText.replace(/^\\.\\.\\./, \"\")}`,\n initializer: `\"...${spreadText.replace(/^\\.\\.\\./, \"\")}\"`,\n })\n\n // Remove the original spread assignment\n spreadAssignment.remove()\n } else if (prop.isKind(SyntaxKind.PropertyAssignment)) {\n const propAssignment = prop.asKindOrThrow(SyntaxKind.PropertyAssignment)\n const initializer = propAssignment.getInitializer()\n\n if (\n initializer &&\n initializer.isKind(SyntaxKind.ObjectLiteralExpression)\n ) {\n // Recursively process nested object literals\n nestSpreadProperties(\n initializer.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n )\n }\n }\n }\n}\n\nexport function unnestSpreadProperties(obj: ObjectLiteralExpression) {\n const properties = obj.getProperties()\n\n for (let i = 0; i < properties.length; i++) {\n const prop = properties[i]\n if (prop.isKind(SyntaxKind.PropertyAssignment)) {\n const propAssignment = prop as PropertyAssignment\n const initializer = propAssignment.getInitializer()\n\n if (initializer?.isKind(SyntaxKind.StringLiteral)) {\n const value = initializer.getLiteralValue()\n if (value.startsWith(\"...\")) {\n obj.insertSpreadAssignment(i, { expression: value.slice(3) })\n propAssignment.remove()\n }\n } else if (initializer?.isKind(SyntaxKind.ObjectLiteralExpression)) {\n unnestSpreadProperties(initializer as ObjectLiteralExpression)\n }\n }\n }\n}\n\nasync function parseObjectLiteral(objectLiteralString: string): Promise<any> {\n const sourceFile = await _createSourceFile(\n `const theme = ${objectLiteralString}`,\n null\n )\n\n const statement = sourceFile.getStatements()[0]\n if (statement?.getKind() === SyntaxKind.VariableStatement) {\n const declaration = (statement as VariableStatement)\n .getDeclarationList()\n ?.getDeclarations()[0]\n const initializer = declaration.getInitializer()\n if (initializer?.isKind(SyntaxKind.ObjectLiteralExpression)) {\n return await parseObjectLiteralExpression(initializer)\n }\n }\n\n throw new Error(\"Invalid input: not an object literal\")\n}\n\nfunction parseObjectLiteralExpression(node: ObjectLiteralExpression): any {\n const result: any = {}\n for (const property of node.getProperties()) {\n if (property.isKind(SyntaxKind.PropertyAssignment)) {\n const name = property.getName().replace(/\\'/g, \"\")\n if (\n property.getInitializer()?.isKind(SyntaxKind.ObjectLiteralExpression)\n ) {\n result[name] = parseObjectLiteralExpression(\n property.getInitializer() as ObjectLiteralExpression\n )\n } else {\n result[name] = parseValue(property.getInitializer())\n }\n }\n }\n return result\n}\n\nfunction parseValue(node: any): any {\n switch (node.kind) {\n case SyntaxKind.StringLiteral:\n return node.text\n case SyntaxKind.NumericLiteral:\n return Number(node.text)\n case SyntaxKind.TrueKeyword:\n return true\n case SyntaxKind.FalseKeyword:\n return false\n case SyntaxKind.NullKeyword:\n return null\n case SyntaxKind.ArrayLiteralExpression:\n return node.elements.map(parseValue)\n default:\n return node.getText()\n }\n}\n\nexport function buildTailwindThemeColorsFromCssVars(\n cssVars: Record<string, string>\n) {\n const result: Record<string, any> = {}\n\n for (const key of Object.keys(cssVars)) {\n const parts = key.split(\"-\")\n const colorName = parts[0]\n const subType = parts.slice(1).join(\"-\")\n\n if (subType === \"\") {\n if (typeof result[colorName] === \"object\") {\n result[colorName].DEFAULT = `hsl(var(--${key}))`\n } else {\n result[colorName] = `hsl(var(--${key}))`\n }\n } else {\n if (typeof result[colorName] !== \"object\") {\n result[colorName] = { DEFAULT: `hsl(var(--${colorName}))` }\n }\n result[colorName][subType] = `hsl(var(--${key}))`\n }\n }\n\n // Remove DEFAULT if it's not in the original cssVars\n for (const [colorName, value] of Object.entries(result)) {\n if (\n typeof value === \"object\" &&\n value.DEFAULT === `hsl(var(--${colorName}))` &&\n !(colorName in cssVars)\n ) {\n delete value.DEFAULT\n }\n }\n\n return result\n}\n","import { promises as fs } from \"fs\"\nimport path from \"path\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { registryItemCssVarsSchema } from \"@/src/utils/registry/schema\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport postcss from \"postcss\"\nimport AtRule from \"postcss/lib/at-rule\"\nimport Root from \"postcss/lib/root\"\nimport Rule from \"postcss/lib/rule\"\nimport { z } from \"zod\"\n\nexport async function updateCssVars(\n cssVars: z.infer<typeof registryItemCssVarsSchema> | undefined,\n config: Config,\n options: {\n cleanupDefaultNextStyles?: boolean\n silent?: boolean\n }\n) {\n if (\n !cssVars ||\n !Object.keys(cssVars).length ||\n !config.resolvedPaths.tailwindCss\n ) {\n return\n }\n\n options = {\n cleanupDefaultNextStyles: false,\n silent: false,\n ...options,\n }\n const cssFilepath = config.resolvedPaths.tailwindCss\n const cssFilepathRelative = path.relative(\n config.resolvedPaths.cwd,\n cssFilepath\n )\n const cssVarsSpinner = spinner(\n `Updating ${highlighter.info(cssFilepathRelative)}`,\n {\n silent: options.silent,\n }\n ).start()\n const raw = await fs.readFile(cssFilepath, \"utf8\")\n let output = await transformCssVars(raw, cssVars, config, {\n cleanupDefaultNextStyles: options.cleanupDefaultNextStyles,\n })\n await fs.writeFile(cssFilepath, output, \"utf8\")\n cssVarsSpinner.succeed()\n}\n\nexport async function transformCssVars(\n input: string,\n cssVars: z.infer<typeof registryItemCssVarsSchema>,\n config: Config,\n options: {\n cleanupDefaultNextStyles?: boolean\n }\n) {\n options = {\n cleanupDefaultNextStyles: false,\n ...options,\n }\n\n const plugins = [updateCssVarsPlugin(cssVars)]\n if (options.cleanupDefaultNextStyles) {\n plugins.push(cleanupDefaultNextStylesPlugin())\n }\n\n // Only add the base layer plugin if we're using css variables.\n if (config.tailwind.cssVariables) {\n plugins.push(updateBaseLayerPlugin())\n }\n\n const result = await postcss(plugins).process(input, {\n from: undefined,\n })\n\n return result.css\n}\n\nfunction updateBaseLayerPlugin() {\n return {\n postcssPlugin: \"update-base-layer\",\n Once(root: Root) {\n const requiredRules = [\n { selector: \"*\", apply: \"border-border\" },\n { selector: \"body\", apply: \"bg-background text-foreground\" },\n ]\n\n let baseLayer = root.nodes.find(\n (node): node is AtRule =>\n node.type === \"atrule\" &&\n node.name === \"layer\" &&\n node.params === \"base\" &&\n requiredRules.every(({ selector, apply }) =>\n node.nodes?.some(\n (rule): rule is Rule =>\n rule.type === \"rule\" &&\n rule.selector === selector &&\n rule.nodes.some(\n (applyRule): applyRule is AtRule =>\n applyRule.type === \"atrule\" &&\n applyRule.name === \"apply\" &&\n applyRule.params === apply\n )\n )\n )\n ) as AtRule | undefined\n\n if (!baseLayer) {\n baseLayer = postcss.atRule({\n name: \"layer\",\n params: \"base\",\n raws: { semicolon: true, between: \" \", before: \"\\n\" },\n })\n root.append(baseLayer)\n }\n\n requiredRules.forEach(({ selector, apply }) => {\n const existingRule = baseLayer?.nodes?.find(\n (node): node is Rule =>\n node.type === \"rule\" && node.selector === selector\n )\n\n if (!existingRule) {\n baseLayer?.append(\n postcss.rule({\n selector,\n nodes: [\n postcss.atRule({\n name: \"apply\",\n params: apply,\n raws: { semicolon: true, before: \"\\n \" },\n }),\n ],\n raws: { semicolon: true, between: \" \", before: \"\\n \" },\n })\n )\n }\n })\n },\n }\n}\n\nfunction updateCssVarsPlugin(\n cssVars: z.infer<typeof registryItemCssVarsSchema>\n) {\n return {\n postcssPlugin: \"update-css-vars\",\n Once(root: Root) {\n let baseLayer = root.nodes.find(\n (node) =>\n node.type === \"atrule\" &&\n node.name === \"layer\" &&\n node.params === \"base\"\n ) as AtRule | undefined\n\n if (!(baseLayer instanceof AtRule)) {\n baseLayer = postcss.atRule({\n name: \"layer\",\n params: \"base\",\n nodes: [],\n raws: {\n semicolon: true,\n before: \"\\n\",\n between: \" \",\n },\n })\n root.append(baseLayer)\n }\n\n if (baseLayer !== undefined) {\n // Add variables for each key in cssVars\n Object.entries(cssVars).forEach(([key, vars]) => {\n const selector = key === \"light\" ? \":root\" : `.${key}`\n // TODO: Fix typecheck.\n addOrUpdateVars(baseLayer as AtRule, selector, vars)\n })\n }\n },\n }\n}\n\nfunction cleanupDefaultNextStylesPlugin() {\n return {\n postcssPlugin: \"cleanup-default-next-styles\",\n Once(root: Root) {\n const bodyRule = root.nodes.find(\n (node): node is Rule => node.type === \"rule\" && node.selector === \"body\"\n )\n if (bodyRule) {\n // Remove color from the body node.\n bodyRule.nodes\n .find(\n (node): node is postcss.Declaration =>\n node.type === \"decl\" &&\n node.prop === \"color\" &&\n node.value === \"rgb(var(--foreground-rgb))\"\n )\n ?.remove()\n\n // Remove background: linear-gradient.\n bodyRule.nodes\n .find((node): node is postcss.Declaration => {\n return (\n node.type === \"decl\" &&\n node.prop === \"background\" &&\n // This is only going to run on create project, so all good.\n node.value.startsWith(\"linear-gradient\")\n )\n })\n ?.remove()\n\n // If the body rule is empty, remove it.\n if (bodyRule.nodes.length === 0) {\n bodyRule.remove()\n }\n }\n },\n }\n}\n\nfunction addOrUpdateVars(\n baseLayer: AtRule,\n selector: string,\n vars: Record<string, string>\n) {\n let ruleNode = baseLayer.nodes?.find(\n (node): node is Rule => node.type === \"rule\" && node.selector === selector\n )\n\n if (!ruleNode) {\n if (Object.keys(vars).length > 0) {\n ruleNode = postcss.rule({\n selector,\n raws: { between: \" \", before: \"\\n \" },\n })\n baseLayer.append(ruleNode)\n }\n }\n\n Object.entries(vars).forEach(([key, value]) => {\n const prop = `--${key.replace(/^--/, \"\")}`\n const newDecl = postcss.decl({\n prop,\n value,\n raws: { semicolon: true },\n })\n\n const existingDecl = ruleNode?.nodes.find(\n (node): node is postcss.Declaration =>\n node.type === \"decl\" && node.prop === prop\n )\n\n existingDecl ? existingDecl.replaceWith(newDecl) : ruleNode?.append(newDecl)\n })\n}\n","import { detect } from \"@antfu/ni\"\n\nexport async function getPackageManager(\n targetDir: string,\n { withFallback }: { withFallback?: boolean } = {\n withFallback: false,\n }\n): Promise<\"yarn\" | \"pnpm\" | \"bun\" | \"npm\"> {\n const packageManager = await detect({ programmatic: true, cwd: targetDir })\n\n if (packageManager === \"yarn@berry\") return \"yarn\"\n if (packageManager === \"pnpm@6\") return \"pnpm\"\n if (packageManager === \"bun\") return \"bun\"\n\n if (!withFallback) {\n return packageManager ?? \"npm\"\n }\n\n // Fallback to user agent if not detected.\n const userAgent = process.env.npm_config_user_agent || \"\"\n\n if (userAgent.startsWith(\"yarn\")) {\n return \"yarn\"\n }\n\n if (userAgent.startsWith(\"pnpm\")) {\n return \"pnpm\"\n }\n\n if (userAgent.startsWith(\"bun\")) {\n return \"bun\"\n }\n\n return \"npm\"\n}\n\nexport async function getPackageRunner(cwd: string) {\n const packageManager = await getPackageManager(cwd)\n\n if (packageManager === \"pnpm\") return \"pnpm dlx\"\n\n if (packageManager === \"bun\") return \"bunx\"\n\n return \"npx\"\n}\n","import { Config } from \"@/src/utils/get-config\"\nimport { getPackageManager } from \"@/src/utils/get-package-manager\"\nimport { RegistryItem } from \"@/src/utils/registry/schema\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport { execa } from \"execa\"\n\nexport async function updateDependencies(\n dependencies: RegistryItem[\"dependencies\"],\n config: Config,\n options: {\n silent?: boolean\n }\n) {\n dependencies = Array.from(new Set(dependencies))\n if (!dependencies?.length) {\n return\n }\n\n options = {\n silent: false,\n ...options,\n }\n\n const dependenciesSpinner = spinner(`Installing dependencies.`, {\n silent: options.silent,\n })?.start()\n const packageManager = await getPackageManager(config.resolvedPaths.cwd)\n await execa(\n packageManager,\n [packageManager === \"npm\" ? \"install\" : \"add\", ...dependencies],\n {\n cwd: config.resolvedPaths.cwd,\n }\n )\n dependenciesSpinner?.succeed()\n}\n","import { existsSync, promises as fs } from \"fs\"\nimport path, { basename } from \"path\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport {\n getRegistryBaseColor,\n getRegistryItemFileTargetPath,\n} from \"@/src/utils/registry\"\nimport { RegistryItem } from \"@/src/utils/registry/schema\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport { transform } from \"@/src/utils/transformers\"\nimport { transformCssVars } from \"@/src/utils/transformers/transform-css-vars\"\nimport { transformImport } from \"@/src/utils/transformers/transform-import\"\nimport { transformRsc } from \"@/src/utils/transformers/transform-rsc\"\nimport { transformTwPrefixes } from \"@/src/utils/transformers/transform-tw-prefix\"\nimport prompts from \"prompts\"\n\nexport async function updateFiles(\n files: RegistryItem[\"files\"],\n config: Config,\n options: {\n overwrite?: boolean\n force?: boolean\n silent?: boolean\n }\n) {\n if (!files?.length) {\n return\n }\n options = {\n overwrite: false,\n force: false,\n silent: false,\n ...options,\n }\n const filesCreatedSpinner = spinner(`Updating files.`, {\n silent: options.silent,\n })?.start()\n const baseColor = await getRegistryBaseColor(config.tailwind.baseColor)\n const filesCreated = []\n const filesUpdated = []\n const filesSkipped = []\n\n for (const file of files) {\n if (!file.content) {\n continue\n }\n\n let targetDir = getRegistryItemFileTargetPath(file, config)\n const fileName = basename(file.path)\n let filePath = path.join(targetDir, fileName)\n\n if (file.target) {\n filePath = path.join(config.resolvedPaths.cwd, file.target)\n targetDir = path.dirname(filePath)\n }\n\n if (!config.tsx) {\n filePath = filePath.replace(/\\.tsx?$/, (match) =>\n match === \".tsx\" ? \".jsx\" : \".js\"\n )\n }\n\n const existingFile = existsSync(filePath)\n if (existingFile && !options.overwrite) {\n filesCreatedSpinner.stop()\n const { overwrite } = await prompts({\n type: \"confirm\",\n name: \"overwrite\",\n message: `The file ${highlighter.info(\n fileName\n )} already exists. Would you like to overwrite?`,\n initial: false,\n })\n\n if (!overwrite) {\n filesSkipped.push(path.relative(config.resolvedPaths.cwd, filePath))\n continue\n }\n filesCreatedSpinner?.start()\n }\n\n // Create the target directory if it doesn't exist.\n if (!existsSync(targetDir)) {\n await fs.mkdir(targetDir, { recursive: true })\n }\n\n // Run our transformers.\n const content = await transform(\n {\n filename: file.path,\n raw: file.content,\n config,\n baseColor,\n transformJsx: !config.tsx,\n },\n [transformImport, transformRsc, transformCssVars, transformTwPrefixes]\n )\n\n await fs.writeFile(filePath, content, \"utf-8\")\n existingFile\n ? filesUpdated.push(path.relative(config.resolvedPaths.cwd, filePath))\n : filesCreated.push(path.relative(config.resolvedPaths.cwd, filePath))\n }\n\n const hasUpdatedFiles = filesCreated.length || filesUpdated.length\n if (!hasUpdatedFiles && !filesSkipped.length) {\n filesCreatedSpinner?.info(\"No files updated.\")\n }\n\n if (filesCreated.length) {\n filesCreatedSpinner?.succeed(\n `Created ${filesCreated.length} ${\n filesCreated.length === 1 ? \"file\" : \"files\"\n }:`\n )\n if (!options.silent) {\n for (const file of filesCreated) {\n logger.log(` - ${file}`)\n }\n }\n } else {\n filesCreatedSpinner?.stop()\n }\n\n if (filesUpdated.length) {\n spinner(\n `Updated ${filesUpdated.length} ${\n filesUpdated.length === 1 ? \"file\" : \"files\"\n }:`,\n {\n silent: options.silent,\n }\n )?.info()\n if (!options.silent) {\n for (const file of filesUpdated) {\n logger.log(` - ${file}`)\n }\n }\n }\n\n if (filesSkipped.length) {\n spinner(\n `Skipped ${filesSkipped.length} ${\n filesUpdated.length === 1 ? \"file\" : \"files\"\n }:`,\n {\n silent: options.silent,\n }\n )?.info()\n if (!options.silent) {\n for (const file of filesSkipped) {\n logger.log(` - ${file}`)\n }\n }\n }\n\n if (!options.silent) {\n logger.break()\n }\n}\n","import { promises as fs } from \"fs\"\nimport { tmpdir } from \"os\"\nimport path from \"path\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { registryBaseColorSchema } from \"@/src/utils/registry/schema\"\nimport { transformCssVars } from \"@/src/utils/transformers/transform-css-vars\"\nimport { transformImport } from \"@/src/utils/transformers/transform-import\"\nimport { transformJsx } from \"@/src/utils/transformers/transform-jsx\"\nimport { transformRsc } from \"@/src/utils/transformers/transform-rsc\"\nimport { Project, ScriptKind, type SourceFile } from \"ts-morph\"\nimport { z } from \"zod\"\n\nimport { transformTwPrefixes } from \"./transform-tw-prefix\"\n\nexport type TransformOpts = {\n filename: string\n raw: string\n config: Config\n baseColor?: z.infer<typeof registryBaseColorSchema>\n transformJsx?: boolean\n}\n\nexport type Transformer<Output = SourceFile> = (\n opts: TransformOpts & {\n sourceFile: SourceFile\n }\n) => Promise<Output>\n\nconst project = new Project({\n compilerOptions: {},\n})\n\nasync function createTempSourceFile(filename: string) {\n const dir = await fs.mkdtemp(path.join(tmpdir(), \"shadcn-\"))\n return path.join(dir, filename)\n}\n\nexport async function transform(\n opts: TransformOpts,\n transformers: Transformer[] = [\n transformImport,\n transformRsc,\n transformCssVars,\n transformTwPrefixes,\n ]\n) {\n const tempFile = await createTempSourceFile(opts.filename)\n const sourceFile = project.createSourceFile(tempFile, opts.raw, {\n scriptKind: ScriptKind.TSX,\n })\n\n for (const transformer of transformers) {\n transformer({ sourceFile, ...opts })\n }\n\n if (opts.transformJsx) {\n return await transformJsx({\n sourceFile,\n ...opts,\n })\n }\n\n return sourceFile.getText()\n}\n","import { registryBaseColorSchema } from \"@/src/utils/registry/schema\"\nimport { Transformer } from \"@/src/utils/transformers\"\nimport { ScriptKind, SyntaxKind } from \"ts-morph\"\nimport { z } from \"zod\"\n\nexport const transformCssVars: Transformer = async ({\n sourceFile,\n config,\n baseColor,\n}) => {\n // No transform if using css variables.\n if (config.tailwind?.cssVariables || !baseColor?.inlineColors) {\n return sourceFile\n }\n\n // Find jsx attributes with the name className.\n // const openingElements = sourceFile.getDescendantsOfKind(SyntaxKind.JsxElement)\n // console.log(openingElements)\n // const jsxAttributes = sourceFile\n // .getDescendantsOfKind(SyntaxKind.JsxAttribute)\n // .filter((node) => node.getName() === \"className\")\n\n // for (const jsxAttribute of jsxAttributes) {\n // const value = jsxAttribute.getInitializer()?.getText()\n // if (value) {\n // const valueWithColorMapping = applyColorMapping(\n // value.replace(/\"/g, \"\"),\n // baseColor.inlineColors\n // )\n // jsxAttribute.setInitializer(`\"${valueWithColorMapping}\"`)\n // }\n // }\n sourceFile.getDescendantsOfKind(SyntaxKind.StringLiteral).forEach((node) => {\n const value = node.getText()\n if (value) {\n const valueWithColorMapping = applyColorMapping(\n value.replace(/\"/g, \"\"),\n baseColor.inlineColors\n )\n node.replaceWithText(`\"${valueWithColorMapping.trim()}\"`)\n }\n })\n\n return sourceFile\n}\n\n// export default function transformer(file: FileInfo, api: API) {\n// const j = api.jscodeshift.withParser(\"tsx\")\n\n// // Replace bg-background with \"bg-white dark:bg-slate-950\"\n// const $j = j(file.source)\n// return $j\n// .find(j.JSXAttribute, {\n// name: {\n// name: \"className\",\n// },\n// })\n// .forEach((path) => {\n// const { node } = path\n// if (node?.value?.type) {\n// if (node.value.type === \"StringLiteral\") {\n// node.value.value = applyColorMapping(node.value.value)\n// console.log(node.value.value)\n// }\n\n// if (\n// node.value.type === \"JSXExpressionContainer\" &&\n// node.value.expression.type === \"CallExpression\"\n// ) {\n// const callee = node.value.expression.callee\n// if (callee.type === \"Identifier\" && callee.name === \"cn\") {\n// node.value.expression.arguments.forEach((arg) => {\n// if (arg.type === \"StringLiteral\") {\n// arg.value = applyColorMapping(arg.value)\n// }\n\n// if (\n// arg.type === \"LogicalExpression\" &&\n// arg.right.type === \"StringLiteral\"\n// ) {\n// arg.right.value = applyColorMapping(arg.right.value)\n// }\n// })\n// }\n// }\n// }\n// })\n// .toSource()\n// }\n\n// // export function splitClassName(input: string): (string | null)[] {\n// // const parts = input.split(\":\")\n// // const classNames = parts.map((part) => {\n// // const match = part.match(/^\\[?(.+)\\]$/)\n// // if (match) {\n// // return match[1]\n// // } else {\n// // return null\n// // }\n// // })\n\n// // return classNames\n// // }\n\n// Splits a className into variant-name-alpha.\n// eg. hover:bg-primary-100 -> [hover, bg-primary, 100]\nexport function splitClassName(className: string): (string | null)[] {\n if (!className.includes(\"/\") && !className.includes(\":\")) {\n return [null, className, null]\n }\n\n const parts: (string | null)[] = []\n // First we split to find the alpha.\n let [rest, alpha] = className.split(\"/\")\n\n // Check if rest has a colon.\n if (!rest.includes(\":\")) {\n return [null, rest, alpha]\n }\n\n // Next we split the rest by the colon.\n const split = rest.split(\":\")\n\n // We take the last item from the split as the name.\n const name = split.pop()\n\n // We glue back the rest of the split.\n const variant = split.join(\":\")\n\n // Finally we push the variant, name and alpha.\n parts.push(variant ?? null, name ?? null, alpha ?? null)\n\n return parts\n}\n\nconst PREFIXES = [\"bg-\", \"text-\", \"border-\", \"ring-offset-\", \"ring-\"]\n\nexport function applyColorMapping(\n input: string,\n mapping: z.infer<typeof registryBaseColorSchema>[\"inlineColors\"]\n) {\n // Handle border classes.\n if (input.includes(\" border \")) {\n input = input.replace(\" border \", \" border border-border \")\n }\n\n // Build color mappings.\n const classNames = input.split(\" \")\n const lightMode = new Set<string>()\n const darkMode = new Set<string>()\n for (let className of classNames) {\n const [variant, value, modifier] = splitClassName(className)\n const prefix = PREFIXES.find((prefix) => value?.startsWith(prefix))\n if (!prefix) {\n if (!lightMode.has(className)) {\n lightMode.add(className)\n }\n continue\n }\n\n const needle = value?.replace(prefix, \"\")\n if (needle && needle in mapping.light) {\n lightMode.add(\n [variant, `${prefix}${mapping.light[needle]}`]\n .filter(Boolean)\n .join(\":\") + (modifier ? `/${modifier}` : \"\")\n )\n\n darkMode.add(\n [\"dark\", variant, `${prefix}${mapping.dark[needle]}`]\n .filter(Boolean)\n .join(\":\") + (modifier ? `/${modifier}` : \"\")\n )\n continue\n }\n\n if (!lightMode.has(className)) {\n lightMode.add(className)\n }\n }\n\n return [...Array.from(lightMode), ...Array.from(darkMode)].join(\" \").trim()\n}\n","import { Config } from \"@/src/utils/get-config\"\nimport { Transformer } from \"@/src/utils/transformers\"\n\nexport const transformImport: Transformer = async ({ sourceFile, config }) => {\n const importDeclarations = sourceFile.getImportDeclarations()\n\n for (const importDeclaration of importDeclarations) {\n const moduleSpecifier = updateImportAliases(\n importDeclaration.getModuleSpecifierValue(),\n config\n )\n\n importDeclaration.setModuleSpecifier(moduleSpecifier)\n\n // Replace `import { cn } from \"@/lib/utils\"`\n if (moduleSpecifier == \"@/lib/utils\") {\n const namedImports = importDeclaration.getNamedImports()\n const cnImport = namedImports.find((i) => i.getName() === \"cn\")\n if (cnImport) {\n importDeclaration.setModuleSpecifier(\n moduleSpecifier.replace(/^@\\/lib\\/utils/, config.aliases.utils)\n )\n }\n }\n }\n\n return sourceFile\n}\n\nfunction updateImportAliases(moduleSpecifier: string, config: Config) {\n // 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\">\n) {\n if (!options.force) {\n const { proceed } = await prompts({\n type: \"confirm\",\n name: \"proceed\",\n message: `The path ${highlighter.info(\n options.cwd\n )} is empty. Would you like to start a new ${highlighter.info(\n \"Next.js\"\n )} project?`,\n initial: true,\n })\n\n if (!proceed) {\n return {\n projectPath: null,\n projectName: null,\n }\n }\n }\n\n const packageManager = await getPackageManager(options.cwd)\n\n const { name } = await prompts({\n type: \"text\",\n name: \"name\",\n message: `What is your project named?`,\n initial: \"my-app\",\n format: (value: string) => value.trim(),\n validate: (value: string) =>\n value.length > 128 ? `Name should be less than 128 characters.` : true,\n })\n\n const projectPath = `${options.cwd}/${name}`\n\n // Check if path is writable.\n try {\n await fs.access(options.cwd, fs.constants.W_OK)\n } catch (error) {\n logger.break()\n logger.error(`The path ${highlighter.info(options.cwd)} is not writable.`)\n logger.error(\n `It is likely you do not have write permissions for this folder or the path ${highlighter.info(\n options.cwd\n )} does not exist.`\n )\n logger.break()\n process.exit(1)\n }\n\n if (fs.existsSync(path.resolve(options.cwd, name, \"package.json\"))) {\n logger.break()\n logger.error(\n `A project with the name ${highlighter.info(name)} already exists.`\n )\n logger.error(`Please choose a different name and try again.`)\n logger.break()\n process.exit(1)\n }\n\n const createSpinner = spinner(\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 \"--no-src-dir\",\n \"--no-import-alias\",\n `--use-${packageManager}`,\n ]\n\n try {\n await execa(\n \"npx\",\n [\"create-next-app@latest\", projectPath, \"--silent\", ...args],\n {\n cwd: options.cwd,\n }\n )\n } catch (error) {\n logger.break()\n logger.error(\n `Something went wront creating a new Next.js project. Please try again.`\n )\n process.exit(1)\n }\n\n createSpinner?.succeed(\"Creating a new Next.js project.\")\n\n return {\n projectPath,\n projectName: name,\n }\n}\n","import path from \"path\"\nimport { addOptionsSchema } from \"@/src/commands/add\"\nimport * as ERRORS from \"@/src/utils/errors\"\nimport { getConfig } from \"@/src/utils/get-config\"\nimport { 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.1\",\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/cli\"\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","message","highlighter","logger","getRegistryItemFileTargetPath","file","registryResolveItemsTree","names","getRegistryIndex","items","name","getRegistryItem","registryDependencies","uniqueDependencies","urls","isUrl","payload","z","registryItemSchema","index","theme","registryGetTheme","tailwind","deepmerge","cssVars","registryResolvedItemsTreeSchema","baseColor","getRegistryBaseColor","buildTailwindThemeColorsFromCssVars","REGISTRY_URL","fs","path","postcss","AtRule","updateCssVars","cssVars","config","options","cssFilepath","cssFilepathRelative","path","cssVarsSpinner","spinner","highlighter","raw","fs","output","transformCssVars","input","plugins","updateCssVarsPlugin","cleanupDefaultNextStylesPlugin","updateBaseLayerPlugin","root","requiredRules","baseLayer","node","selector","apply","rule","applyRule","key","vars","addOrUpdateVars","bodyRule","ruleNode","value","prop","newDecl","existingDecl","detect","getPackageManager","targetDir","withFallback","packageManager","userAgent","execa","updateDependencies","dependencies","config","options","dependenciesSpinner","spinner","packageManager","getPackageManager","existsSync","fs","path","basename","fs","tmpdir","path","SyntaxKind","transformCssVars","sourceFile","config","baseColor","node","value","valueWithColorMapping","applyColorMapping","splitClassName","className","parts","rest","alpha","split","name","variant","PREFIXES","input","mapping","classNames","lightMode","darkMode","modifier","prefix","needle","transformImport","sourceFile","config","importDeclarations","importDeclaration","moduleSpecifier","updateImportAliases","i","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","baseColor","getRegistryBaseColor","filesCreated","filesUpdated","filesSkipped","file","targetDir","getRegistryItemFileTargetPath","fileName","basename","filePath","path","match","existingFile","existsSync","overwrite","highlighter","fs","content","transform","transformImport","transformRsc","transformCssVars","transformTwPrefixes","logger","addComponents","components","config","options","registrySpinner","spinner","tree","registryResolveItemsTree","handleError","updateTailwindConfig","updateCssVars","updateDependencies","updateFiles","path","execa","fs","prompts","createProject","options","proceed","highlighter","packageManager","getPackageManager","name","value","projectPath","logger","path","createSpinner","spinner","args","Command","prompts","z","initOptionsSchema","init","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","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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "shadcn",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"description": "Add components to your apps.",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -28,6 +28,22 @@
|
|
|
28
28
|
"type": "module",
|
|
29
29
|
"exports": "./dist/index.js",
|
|
30
30
|
"bin": "./dist/index.js",
|
|
31
|
+
"scripts": {
|
|
32
|
+
"dev": "tsup --watch",
|
|
33
|
+
"build": "tsup",
|
|
34
|
+
"typecheck": "tsc --noEmit",
|
|
35
|
+
"clean": "rimraf dist && rimraf components",
|
|
36
|
+
"start:dev": "cross-env REGISTRY_URL=http://localhost:3333/r node dist/index.js",
|
|
37
|
+
"start": "node dist/index.js",
|
|
38
|
+
"format:write": "prettier --write \"**/*.{ts,tsx,mdx}\" --cache",
|
|
39
|
+
"format:check": "prettier --check \"**/*.{ts,tsx,mdx}\" --cache",
|
|
40
|
+
"release": "changeset version",
|
|
41
|
+
"pub:beta": "pnpm build && pnpm publish --no-git-checks --access public --tag beta",
|
|
42
|
+
"pub:next": "pnpm build && pnpm publish --no-git-checks --access public --tag next",
|
|
43
|
+
"pub:release": "pnpm build && pnpm publish --access public",
|
|
44
|
+
"test": "vitest run",
|
|
45
|
+
"test:dev": "REGISTRY_URL=http://localhost:3333/r vitest run"
|
|
46
|
+
},
|
|
31
47
|
"dependencies": {
|
|
32
48
|
"@antfu/ni": "^0.21.4",
|
|
33
49
|
"@babel/core": "^7.22.1",
|
|
@@ -64,21 +80,5 @@
|
|
|
64
80
|
"tsup": "^6.6.3",
|
|
65
81
|
"type-fest": "^3.8.0",
|
|
66
82
|
"typescript": "^4.9.3"
|
|
67
|
-
},
|
|
68
|
-
"scripts": {
|
|
69
|
-
"dev": "tsup --watch",
|
|
70
|
-
"build": "tsup",
|
|
71
|
-
"typecheck": "tsc --noEmit",
|
|
72
|
-
"clean": "rimraf dist && rimraf components",
|
|
73
|
-
"start:dev": "cross-env REGISTRY_URL=http://localhost:3333/r node dist/index.js",
|
|
74
|
-
"start": "node dist/index.js",
|
|
75
|
-
"format:write": "prettier --write \"**/*.{ts,tsx,mdx}\" --cache",
|
|
76
|
-
"format:check": "prettier --check \"**/*.{ts,tsx,mdx}\" --cache",
|
|
77
|
-
"release": "changeset version",
|
|
78
|
-
"pub:beta": "pnpm build && pnpm publish --no-git-checks --access public --tag beta",
|
|
79
|
-
"pub:next": "pnpm build && pnpm publish --no-git-checks --access public --tag next",
|
|
80
|
-
"pub:release": "pnpm build && pnpm publish --access public",
|
|
81
|
-
"test": "vitest run",
|
|
82
|
-
"test:dev": "REGISTRY_URL=http://localhost:3333/r vitest run"
|
|
83
83
|
}
|
|
84
|
-
}
|
|
84
|
+
}
|
package/LICENSE.md
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2023 shadcn
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|