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