hghcn 3.6.25 → 3.6.28
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 +325 -325
- package/dist/index.js +49 -51
- package/dist/index.js.map +1 -1
- package/dist/registry/index.d.ts +2 -2
- package/dist/schema/index.d.ts +700 -700
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,66 +1,64 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {b,a as a$1}from'./chunk-DGLIMMUD.js';import {a,N,m,Q,X,r,d,V as V$1,O,o,i,p,$,ba,g,h,e,f,q,M,c as c$1,_,s,J as J$1,ha,L as L$1,ia,ea,ca,fa,I,K,P,ja,b as b$1,ga,R,j,aa,n as n$1,E
|
|
3
|
-
To start over, remove the ${d.info("components.json")} file and run ${d.info("init")} again.`),r.break(),process.exit(1)),i?.succeed();let r$1=
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
`,"utf-8"),p.succeed();}return {config:c$1,newRegistries:Object.keys(a)}}process.on("exit",e=>{let t=E__default.resolve(process.cwd(),"components.json");return e===0?Je(t):Lt(t)});var Ye=z$1.object({cwd:z$1.string(),name:z$1.string().optional(),components:z$1.array(z$1.string()).optional(),yes:z$1.boolean(),defaults:z$1.boolean(),force:z$1.boolean(),silent:z$1.boolean(),isNewProject:z$1.boolean(),srcDir:z$1.boolean().optional(),cssVariables:z$1.boolean(),template:z$1.string().optional().refine(e=>e?A[e]:true,{message:"Invalid template. Please use 'next', 'vite', 'start' or 'next-monorepo'."}),baseColor:z$1.string().optional().refine(e=>e?a.find(t=>t.name===e):true,{message:`Invalid base color. Please use '${a.map(e=>e.name).join("', '")}'`}),baseStyle:z$1.boolean(),registryBaseConfig:c.deepPartial().optional()}),zt=new Command().name("init").description("initialize your project and install dependencies").argument("[components...]","names, url or local path to component").option("-t, --template <template>","the template to use. (next, start, vite, next-monorepo)").option("-b, --base-color <base-color>","the base color to use. (neutral, gray, zinc, stone, slate)",void 0).option("-y, --yes","skip confirmation prompt.",true).option("-d, --defaults,","use default configuration.",false).option("-f, --force","force overwrite of existing configuration.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",false).option("--src-dir","use the src directory when creating a new project.",false).option("--no-src-dir","do not use the src directory when creating a new project.").option("--css-variables","use css variables for theming.",true).option("--no-css-variables","do not use css variables for theming.").option("--no-base-style","do not install the base shadcn style.").action(async(e,t)=>{try{t.defaults&&(t.template=t.template||"next",t.baseColor=t.baseColor||"neutral");let i=Ye.parse({cwd:E__default.resolve(t.cwd),isNewProject:!1,components:e,...t});if(await L(i.cwd),e.length>0){let r=N(m({resolvedPaths:{cwd:i.cwd}})),o=E__default.resolve(i.cwd,"components.json");if(v.existsSync(o)){let s=await v.readJson(o),c$1=c.partial().parse(s),m$1=m({resolvedPaths:{cwd:i.cwd}});r=N({...c$1,resolvedPaths:{...m$1.resolvedPaths,cwd:i.cwd}}),_t(o);}let{config:n}=await V(e,r,{silent:!0,writeFile:!1});r=n,Q(e[0],r);let[a]=await X([e[0]],{config:r});a?.type==="registry:base"&&(a.config&&(r=N(Kr(r,a.config)),i.registryBaseConfig=a.config),i.baseStyle=a.extends==="none"?!1:i.baseStyle),a?.type==="registry:style"&&(i.baseColor="neutral",i.baseStyle=a.extends==="none"?!1:i.baseStyle);}i.baseStyle||(i.baseColor="neutral"),await pe(i),r.log(`${d.success("Success!")} Project initialization completed.
|
|
8
|
-
You may now add components.`),Je(E__default.resolve(i.cwd,"components.json")),r.break();}catch(i){r.break(),V$1(i);}finally{O();}});async function pe(e){let t,i$1;if(e.skipPreflight)t=await o(e.cwd);else {let a=await At(e);if(a.errors["1"]){let{projectPath:s,template:c}=await Dt(e);s||process.exit(1),e.cwd=s,e.isNewProject=true,i$1=c,t=await o(e.cwd);}else t=a.projectInfo;}if(i$1==="next-monorepo")return e.cwd=E__default.resolve(e.cwd,"apps/web"),await i(e.cwd);let r=await p(e.cwd,t);console.log({projectConfig:r});let o$1=r?await Hr(r,e):await qr(await i(e.cwd));console.log({config:o$1,options:e});[...e.baseStyle?["index"]:[],...e.components??[]];}async function qr(e$1=null){let[t,i]=await Promise.all([$(),ba()]);r.info("");let r$1=await Ne([{type:"toggle",name:"typescript",message:`Would you like to use ${d.info("TypeScript")} (recommended)?`,initial:e$1?.tsx??true,active:"yes",inactive:"no"},{type:"select",name:"style",message:`Which ${d.info("style")} would you like to use?`,choices:t.map(o=>({title:o.label,value:o.name}))},{type:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${d.info("base color")}?`,choices:i.map(o=>({title:o.label,value:o.name}))},{type:"text",name:"tailwindCss",message:`Where is your ${d.info("global CSS")} file?`,initial:e$1?.tailwind.css??g},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${d.info("CSS variables")} for theming?`,initial:e$1?.tailwind.cssVariables??true,active:"yes",inactive:"no"},{type:"text",name:"tailwindPrefix",message:`Are you using a custom ${d.info("tailwind prefix eg. tw-")}? (Leave blank if not)`,initial:""},{type:"text",name:"tailwindConfig",message:`Where is your ${d.info("tailwind.config.js")} located?`,initial:e$1?.tailwind.config??h},{type:"text",name:"components",message:`Configure the import alias for ${d.info("components")}:`,initial:e$1?.aliases.components??e},{type:"text",name:"utils",message:`Configure the import alias for ${d.info("utils")}:`,initial:e$1?.aliases.utils??f},{type:"toggle",name:"rsc",message:`Are you using ${d.info("React Server Components")}?`,initial:e$1?.rsc??true,active:"yes",inactive:"no"}]);return c.parse({$schema:"https://ui.shadcn.com/schema.json",style:r$1.style,tailwind:{config:r$1.tailwindConfig,css:r$1.tailwindCss,baseColor:r$1.tailwindBaseColor,cssVariables:r$1.tailwindCssVariables,prefix:r$1.tailwindPrefix},rsc:r$1.rsc,tsx:r$1.typescript,aliases:{utils:r$1.utils,components:r$1.components,lib:r$1.components.replace(/\/components$/,"lib"),hooks:r$1.components.replace(/\/components$/,"hooks")}})}async function Hr(e,t){let i=e.style,r=t.baseColor,o=e.tailwind.cssVariables,n=e.iconLibrary??"lucide";if(!t.defaults){let[a,s,c]=await Promise.all([$(),ba(),q(e)]),m=await Ne([{type:c==="v4"||i?null:"select",name:"style",message:`Which ${d.info("style")} would you like to use?`,choices:a.map(l=>({title:l.name==="new-york"?"New York (Recommended)":l.label,value:l.name})),initial:0},{type:t.baseColor?null:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${d.info("base color")}?`,choices:s.map(l=>({title:l.label,value:l.name}))}]);i=m.style??i??"new-york",r=m.tailwindBaseColor??r,o=t.cssVariables;}return c.parse({$schema:e?.$schema,style:i,tailwind:{...e?.tailwind,baseColor:r,cssVariables:o},rsc:e?.rsc,tsx:e?.tsx,iconLibrary:n,aliases:e?.aliases})}function Bt(e,t){if(e.includes("\0"))return false;let i;try{i=e;let u="";for(;i!==u&&i.includes("%");)u=i,i=decodeURIComponent(i);}catch{return false}let r=E__default.normalize(i.replace(/\\/g,"/")),o=E__default.normalize(t),n=u=>u.replace(/\[\.\.\..*?\]/g,"").includes("..");if(n(r)||n(i)||n(e))return false;let a=u=>u.replace(/\[\.\.\..*?\]/g,""),s=a(e),c=a(i);if([/\.\.[\/\\]/,/[\/\\]\.\./,/\.\./,/\.\.%/,/\x00/,/[\x01-\x1f]/].some(u=>u.test(s)||u.test(c))||(e.includes("~")||i.includes("~"))&&(e.includes("../")||i.includes("../")))return false;if(/^[a-zA-Z]:[\/\\]/.test(i))return process.platform==="win32"?i.toLowerCase().startsWith(t.toLowerCase()):false;if(E__default.isAbsolute(r))return r.startsWith(o+E__default.sep);let p=E__default.resolve(o,r);return p.startsWith(o+E__default.sep)||p===o}async function Gt(e,t,i){if(!t.resolvedPaths.tailwindCss||!e||Object.keys(e).length===0)return;i={silent:false,...i};let r=t.resolvedPaths.tailwindCss,o=E__default.relative(t.resolvedPaths.cwd,r),n=s(`Updating ${d.info(o)}`,{silent:i.silent}).start(),a=await promises.readFile(r,"utf8"),s$1=await Zr(a,e);await promises.writeFile(r,s$1,"utf8"),n.succeed();}async function Zr(e,t){let i=[Qr(t)],r=await x(i).process(e,{from:void 0}),o=r.css,n=r.root;if(n.nodes&&n.nodes.length>0){let a=n.nodes[n.nodes.length-1];a.type==="atrule"&&!a.nodes&&!o.trimEnd().endsWith(";")&&(o=o.trimEnd()+";");}return o=o.replace(/\/\* ---break--- \*\//g,""),o=o.replace(/(\n\s*\n)+/g,`
|
|
2
|
+
import {b,a as a$1}from'./chunk-DGLIMMUD.js';import {a,N,m,Q,X,r,d,V as V$1,O,o,i,p,$,ba,g,h,e,f,q,M,c as c$1,_,s,J as J$1,ha,L as L$1,ia,ea,ca,fa,I,K,P,ja,b as b$1,ga,R,j as j$1,aa,n as n$1,E,T,y,U,l,S,k,F,H,G}from'./chunk-SCGCXD6H.js';export{ea as fetchTree,fa as getItemTargetPath,ia as getPreset,ha as getPresets,Z as getRegistriesConfig,ga as getRegistriesIndex,W as getRegistry,ca as getRegistryBaseColor,ba as getRegistryBaseColors,aa as getRegistryIcons,X as getRegistryItems,$ as getRegistryStyles,_ as getShadcnRegistryIndex,Y as resolveRegistryItems,da as resolveTree}from'./chunk-SCGCXD6H.js';import {c,o as o$1,n}from'./chunk-WKG3W635.js';import'./chunk-PMFK2ZSQ.js';import'./chunk-BFNVF2P5.js';import*as j from'path';import j__default,{join}from'path';import v from'fs-extra';import ze,{tmpdir}from'os';import {execa}from'execa';import Ee from'prompts';import Xe,{z as z$1}from'zod';import {existsSync,promises}from'fs';import {Command}from'commander';import Gr from'deepmerge';import x from'postcss';import Zr from'postcss/lib/at-rule';import {Project,ScriptKind,SyntaxKind,VariableDeclarationKind}from'ts-morph';import*as z from'fs/promises';import Ke from'dedent';import sr from'open';import {diffLines}from'diff';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {randomBytes}from'crypto';import ho from'fast-glob';async function Ot(e){let t={};if(!v.existsSync(e.cwd)||!v.existsSync(j__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,projectInfo:null};let i=s("Preflight checks.",{silent:e.silent}).start();v.existsSync(j__default.resolve(e.cwd,"components.json"))&&!e.force&&(i?.fail(),r.break(),r.error(`A ${d.info("components.json")} file already exists at ${d.info(e.cwd)}.
|
|
3
|
+
To start over, remove the ${d.info("components.json")} file and run ${d.info("init")} again.`),r.break(),process.exit(1)),i?.succeed();let r$1=await o(e.cwd);return {errors:t,projectInfo:r$1}}var Be="https://codeload.github.com/shadcn-ui/ui/tar.gz/main",A={next:"next","next-monorepo":"next-monorepo",vite:"vite",start:"start"};async function Ft(e){e={srcDir:false,...e};let t=e.template&&A[e.template]?e.template:"next",i=e.name??(t===A.next||t===A.vite||t===A.start?"my-app":"my-monorepo"),r$1="latest",n=e.components?.length===1&&!!e.components[0].match(/\/chat\/b\//);if(e.components&&n)try{let[s]=await R(e.components),{meta:c}=z$1.object({meta:z$1.object({nextVersion:z$1.string()})}).parse(s);r$1=c.nextVersion,t=A.next;}catch(s){r.break(),V$1(s);}if(!e.force){let{type:s,name:c}=await Ee([{type:e.template||n?null:"select",name:"type",message:`The path ${d.info(e.cwd)} does not contain a package.json file.
|
|
4
|
+
Would you like to start a new project?`,choices:[{title:"Next.js",value:"next"},{title:"Next.js (Monorepo)",value:"next-monorepo"},{title:"Vite",value:"vite"},{title:"TanStack Start",value:"start"}],initial:0},{type:e.name?null:"text",name:"name",message:"What is your project named?",initial:i,format:m=>m.trim(),validate:m=>m.length>128?"Name should be less than 128 characters.":true}]);t=s??t,i=c??i;}let o=await a$1(e.cwd,{withFallback:true}),a=`${e.cwd}/${i}`;try{await v.access(e.cwd,v.constants.W_OK);}catch{r.break(),r.error(`The path ${d.info(e.cwd)} is not writable.`),r.error(`It is likely you do not have write permissions for this folder or the path ${d.info(e.cwd)} does not exist.`),r.break(),process.exit(1);}return v.existsSync(j__default.resolve(e.cwd,i,"package.json"))&&(r.break(),r.error(`A project with the name ${d.info(i)} already exists.`),r.error("Please choose a different name and try again."),r.break(),process.exit(1)),t===A.next&&await Dr(a,{version:r$1,cwd:e.cwd,packageManager:o,srcDir:!!e.srcDir}),t===A["next-monorepo"]&&await _r(a,{packageManager:o}),t===A.vite&&await Lr(a,{packageManager:o}),t===A.start&&await Vr(a,{packageManager:o}),{projectPath:a,projectName:i,template:t}}async function Dr(e,t){let i=s("Creating a new Next.js project. This may take a few minutes.").start(),r$1=["--tailwind","--eslint","--typescript","--app",t.srcDir?"--src-dir":"--no-src-dir","--no-import-alias",`--use-${t.packageManager}`];(t.version.startsWith("15")||t.version.startsWith("latest")||t.version.startsWith("canary"))&&r$1.push("--turbopack"),(t.version.startsWith("latest")||t.version.startsWith("canary"))&&r$1.push("--no-react-compiler");try{await execa("npx",[`create-next-app@${t.version}`,e,"--silent",...r$1],{cwd:t.cwd});}catch{r.break(),r.error("Something went wrong creating a new Next.js project. Please try again."),process.exit(1);}i?.succeed("Creating a new Next.js project.");}async function _r(e,t){let i=s("Creating a new Next.js monorepo. This may take a few minutes.").start();try{let r=j__default.join(ze.tmpdir(),`shadcn-template-${Date.now()}`);await v.ensureDir(r);let n=await fetch(Be);if(!n.ok)throw new Error(`Failed to download template: ${n.statusText}`);let o=j__default.resolve(r,"template.tar.gz");await v.writeFile(o,Buffer.from(await n.arrayBuffer())),await execa("tar",["-xzf",o,"-C",r,"--strip-components=2","ui-main/templates/monorepo-next"]);let a=j__default.resolve(r,"monorepo-next");await v.move(a,e),await v.remove(r),await execa(t.packageManager,["install"],{cwd:e});let s=j__default.join(e,"package.json");if(v.existsSync(s)){let m=await v.readFile(s,"utf8"),l=JSON.parse(m);l.name=e.split("/").pop(),await v.writeFile(s,JSON.stringify(l,null,2));}let c=process.cwd();await execa("git",["--version"],{cwd:e}),await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","Initial commit"],{cwd:e}),i?.succeed("Creating a new Next.js monorepo.");}catch(r){i?.fail("Something went wrong creating a new Next.js monorepo."),V$1(r);}}async function Lr(e,t){let i=s("Creating a new Vite project. This may take a few minutes.").start();try{let r=j__default.join(ze.tmpdir(),`shadcn-template-${Date.now()}`);await v.ensureDir(r);let n=await fetch(Be);if(!n.ok)throw new Error(`Failed to download template: ${n.statusText}`);let o=j__default.resolve(r,"template.tar.gz");await v.writeFile(o,Buffer.from(await n.arrayBuffer())),await execa("tar",["-xzf",o,"-C",r,"--strip-components=2","ui-main/templates/vite-app"]);let a=j__default.resolve(r,"vite-app");if(await v.move(a,e),await v.remove(r),t.packageManager!=="pnpm"){let c=j__default.join(e,"pnpm-lock.yaml");v.existsSync(c)&&await v.remove(c);}await execa(t.packageManager,["install"],{cwd:e});let s=j__default.join(e,"package.json");if(v.existsSync(s)){let c=await v.readFile(s,"utf8"),m=JSON.parse(c);m.name=e.split("/").pop(),await v.writeFile(s,JSON.stringify(m,null,2));}await execa("git",["--version"],{cwd:e}),await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","Initial commit"],{cwd:e}),i?.succeed("Creating a new Vite project.");}catch(r){i?.fail("Something went wrong creating a new Vite project."),V$1(r);}}async function Vr(e,t){let i=s("Creating a new TanStack Start project. This may take a few minutes.").start();try{let r=j__default.join(ze.tmpdir(),`shadcn-template-${Date.now()}`);await v.ensureDir(r);let n=await fetch(Be);if(!n.ok)throw new Error(`Failed to download template: ${n.statusText}`);let o=j__default.resolve(r,"template.tar.gz");await v.writeFile(o,Buffer.from(await n.arrayBuffer())),await execa("tar",["-xzf",o,"-C",r,"--strip-components=2","ui-main/templates/start-app"]);let a=j__default.resolve(r,"start-app");if(await v.move(a,e),await v.remove(r),t.packageManager!=="pnpm"){let c=j__default.join(e,"pnpm-lock.yaml");v.existsSync(c)&&await v.remove(c);}await execa(t.packageManager,["install"],{cwd:e});let s=j__default.join(e,"package.json");if(v.existsSync(s)){let c=await v.readFile(s,"utf8"),m=JSON.parse(c);m.name=e.split("/").pop(),await v.writeFile(s,JSON.stringify(m,null,2));}await execa("git",["--version"],{cwd:e}),await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","Initial commit"],{cwd:e}),i?.succeed("Creating a new TanStack Start project.");}catch(r){i?.fail("Something went wrong creating a new TanStack Start project."),V$1(r);}}async function L(e=process.cwd()){try{let{config:t}=await import('@dotenvx/dotenvx'),i=[".env.local",".env.development.local",".env.development",".env"];for(let r of i){let n=join(e,r);existsSync(n)&&t({path:n,overload:!1,quiet:!0});}}catch(t){r.warn("Failed to load env files:",t);}}var Ue=".bak";function At(e){if(!v.existsSync(e))return null;let t=`${e}${Ue}`;try{return v.renameSync(e,t),t}catch(i){return console.error(`Failed to create backup of ${e}: ${i}`),null}}function Dt(e){let t=`${e}${Ue}`;if(!v.existsSync(t))return false;try{return v.renameSync(t,e),!0}catch(i){return console.error(`Warning: Could not restore backup file ${t}: ${i}`),false}}function Ge(e){let t=`${e}${Ue}`;if(!v.existsSync(t))return false;try{return v.unlinkSync(t),!0}catch{return false}}async function _t(e,t){let i=new Set,r=new Set,n=[...e];for(;n.length>0;){let o=n.shift();if(r.has(o))continue;r.add(o);let{registry:a}=E(o);a&&!b$1[a]&&i.add(a);try{let[s]=await T([o],t,{useCache:!0});if(s?.registryDependencies)for(let c of s.registryDependencies){let{registry:m}=E(c);m&&!b$1[m]&&i.add(m),r.has(c)||n.push(c);}}catch(s){if(s instanceof y){let{registry:c}=E(o);c&&!b$1[c]&&i.add(c);continue}continue}}return Array.from(i)}async function V(e,t,i={}){i={silent:false,writeFile:true,...i};let n=(await _t(e,t)).filter(m=>!t.registries?.[m]&&!Object.keys(b$1).includes(m));if(n.length===0)return {config:t,newRegistries:[]};let o=await ga({useCache:process.env.NODE_ENV!=="development"});if(!o)return {config:t,newRegistries:[]};let a={};for(let m of n)o[m]&&(a[m]=o[m]);if(Object.keys(a).length===0)return {config:t,newRegistries:[]};let s$1=Object.fromEntries(Object.entries(t.registries||{}).filter(([m])=>!Object.keys(b$1).includes(m))),c$1={...t,registries:{...s$1,...a}};if(i.writeFile){let{resolvedPaths:m,...l}=c$1,f=s("Updating components.json.",{silent:i.silent}).start(),u=c.parse(l);await v.writeFile(j__default.resolve(t.resolvedPaths.cwd,"components.json"),JSON.stringify(u,null,2)+`
|
|
5
|
+
`,"utf-8"),f.succeed();}return {config:c$1,newRegistries:Object.keys(a)}}process.on("exit",e=>{let t=j__default.resolve(process.cwd(),"components.json");return e===0?Ge(t):Dt(t)});var Je=z$1.object({cwd:z$1.string(),name:z$1.string().optional(),components:z$1.array(z$1.string()).optional(),yes:z$1.boolean(),defaults:z$1.boolean(),force:z$1.boolean(),silent:z$1.boolean(),isNewProject:z$1.boolean(),srcDir:z$1.boolean().optional(),cssVariables:z$1.boolean(),template:z$1.string().optional().refine(e=>e?A[e]:true,{message:"Invalid template. Please use 'next', 'vite', 'start' or 'next-monorepo'."}),baseColor:z$1.string().optional().refine(e=>e?a.find(t=>t.name===e):true,{message:`Invalid base color. Please use '${a.map(e=>e.name).join("', '")}'`}),baseStyle:z$1.boolean(),registryBaseConfig:c.deepPartial().optional()}),Wt=new Command().name("init").description("initialize your project and install dependencies").argument("[components...]","names, url or local path to component").option("-t, --template <template>","the template to use. (next, start, vite, next-monorepo)").option("-b, --base-color <base-color>","the base color to use. (neutral, gray, zinc, stone, slate)",void 0).option("-y, --yes","skip confirmation prompt.",true).option("-d, --defaults,","use default configuration.",false).option("-f, --force","force overwrite of existing configuration.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",false).option("--src-dir","use the src directory when creating a new project.",false).option("--no-src-dir","do not use the src directory when creating a new project.").option("--css-variables","use css variables for theming.",true).option("--no-css-variables","do not use css variables for theming.").option("--no-base-style","do not install the base shadcn style.").action(async(e,t)=>{try{t.defaults&&(t.template=t.template||"next",t.baseColor=t.baseColor||"neutral");let i=Je.parse({cwd:j__default.resolve(t.cwd),isNewProject:!1,components:e,...t});if(await L(i.cwd),e.length>0){let r=N(m({resolvedPaths:{cwd:i.cwd}})),n=j__default.resolve(i.cwd,"components.json");if(v.existsSync(n)){let s=await v.readJson(n),c$1=c.partial().parse(s),m$1=m({resolvedPaths:{cwd:i.cwd}});r=N({...c$1,resolvedPaths:{...m$1.resolvedPaths,cwd:i.cwd}}),At(n);}let{config:o}=await V(e,r,{silent:!0,writeFile:!1});r=o,Q(e[0],r);let[a]=await X([e[0]],{config:r});a?.type==="registry:base"&&(a.config&&(r=N(Gr(r,a.config)),i.registryBaseConfig=a.config),i.baseStyle=a.extends==="none"?!1:i.baseStyle),a?.type==="registry:style"&&(i.baseColor="neutral",i.baseStyle=a.extends==="none"?!1:i.baseStyle);}i.baseStyle||(i.baseColor="neutral"),await fe(i),r.log(`${d.success("Success!")} Project initialization completed.
|
|
6
|
+
You may now add components.`),Ge(j__default.resolve(i.cwd,"components.json")),r.break();}catch(i){r.break(),V$1(i);}finally{O();}});async function fe(e){let t,i$1;if(e.skipPreflight)t=await o(e.cwd);else {let a=await Ot(e);if(a.errors["1"]){let{projectPath:s,template:c}=await Ft(e);s||process.exit(1),e.cwd=s,e.isNewProject=true,i$1=c,t=await o(e.cwd);}else t=a.projectInfo;}if(i$1==="next-monorepo")return e.cwd=j__default.resolve(e.cwd,"apps/web"),await i(e.cwd);let r=await p(e.cwd,t);console.log({projectConfig:r,projectInfo:t});let n=r?await Yr(r,e):await Jr(await i(e.cwd));console.log({config:n});[...e.baseStyle?["index"]:[],...e.components??[]];}async function Jr(e$1=null){let[t,i]=await Promise.all([$(),ba()]);r.info("");let r$1=await Ee([{type:"toggle",name:"typescript",message:`Would you like to use ${d.info("TypeScript")} (recommended)?`,initial:e$1?.tsx??true,active:"yes",inactive:"no"},{type:"select",name:"style",message:`Which ${d.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 ${d.info("base color")}?`,choices:i.map(n=>({title:n.label,value:n.name}))},{type:"text",name:"tailwindCss",message:`Where is your ${d.info("global CSS")} file?`,initial:e$1?.tailwind.css??g},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${d.info("CSS variables")} for theming?`,initial:e$1?.tailwind.cssVariables??true,active:"yes",inactive:"no"},{type:"text",name:"tailwindPrefix",message:`Are you using a custom ${d.info("tailwind prefix eg. tw-")}? (Leave blank if not)`,initial:""},{type:"text",name:"tailwindConfig",message:`Where is your ${d.info("tailwind.config.js")} located?`,initial:e$1?.tailwind.config??h},{type:"text",name:"components",message:`Configure the import alias for ${d.info("components")}:`,initial:e$1?.aliases.components??e},{type:"text",name:"utils",message:`Configure the import alias for ${d.info("utils")}:`,initial:e$1?.aliases.utils??f},{type:"toggle",name:"rsc",message:`Are you using ${d.info("React Server Components")}?`,initial:e$1?.rsc??true,active:"yes",inactive:"no"}]);return c.parse({$schema:"https://ui.shadcn.com/schema.json",style:r$1.style,tailwind:{config:r$1.tailwindConfig,css:r$1.tailwindCss,baseColor:r$1.tailwindBaseColor,cssVariables:r$1.tailwindCssVariables,prefix:r$1.tailwindPrefix},rsc:r$1.rsc,tsx:r$1.typescript,aliases:{utils:r$1.utils,components:r$1.components,lib:r$1.components.replace(/\/components$/,"lib"),hooks:r$1.components.replace(/\/components$/,"hooks")}})}async function Yr(e,t){let i=e.style,r=t.baseColor,n=e.tailwind.cssVariables,o=e.iconLibrary??"lucide";if(!t.defaults){let[a,s,c]=await Promise.all([$(),ba(),q(e)]),m=await Ee([{type:c==="v4"||i?null:"select",name:"style",message:`Which ${d.info("style")} would you like to use?`,choices:a.map(l=>({title:l.name==="new-york"?"New York (Recommended)":l.label,value:l.name})),initial:0},{type:t.baseColor?null:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${d.info("base color")}?`,choices:s.map(l=>({title:l.label,value:l.name}))}]);i=m.style??i??"new-york",r=m.tailwindBaseColor??r,n=t.cssVariables;}return c.parse({$schema:e?.$schema,style:i,tailwind:{...e?.tailwind,baseColor:r,cssVariables:n},rsc:e?.rsc,tsx:e?.tsx,iconLibrary:o,aliases:e?.aliases})}function Mt(e,t){if(e.includes("\0"))return false;let i;try{i=e;let u="";for(;i!==u&&i.includes("%");)u=i,i=decodeURIComponent(i);}catch{return false}let r=j__default.normalize(i.replace(/\\/g,"/")),n=j__default.normalize(t),o=u=>u.replace(/\[\.\.\..*?\]/g,"").includes("..");if(o(r)||o(i)||o(e))return false;let a=u=>u.replace(/\[\.\.\..*?\]/g,""),s=a(e),c=a(i);if([/\.\.[\/\\]/,/[\/\\]\.\./,/\.\./,/\.\.%/,/\x00/,/[\x01-\x1f]/].some(u=>u.test(s)||u.test(c))||(e.includes("~")||i.includes("~"))&&(e.includes("../")||i.includes("../")))return false;if(/^[a-zA-Z]:[\/\\]/.test(i))return process.platform==="win32"?i.toLowerCase().startsWith(t.toLowerCase()):false;if(j__default.isAbsolute(r))return r.startsWith(n+j__default.sep);let f=j__default.resolve(n,r);return f.startsWith(n+j__default.sep)||f===n}async function Bt(e,t,i){if(!t.resolvedPaths.tailwindCss||!e||Object.keys(e).length===0)return;i={silent:false,...i};let r=t.resolvedPaths.tailwindCss,n=j__default.relative(t.resolvedPaths.cwd,r),o=s(`Updating ${d.info(n)}`,{silent:i.silent}).start(),a=await promises.readFile(r,"utf8"),s$1=await qr(a,e);await promises.writeFile(r,s$1,"utf8"),o.succeed();}async function qr(e,t){let i=[Hr(t)],r=await x(i).process(e,{from:void 0}),n=r.css,o=r.root;if(o.nodes&&o.nodes.length>0){let a=o.nodes[o.nodes.length-1];a.type==="atrule"&&!a.nodes&&!n.trimEnd().endsWith(";")&&(n=n.trimEnd()+";");}return n=n.replace(/\/\* ---break--- \*\//g,""),n=n.replace(/(\n\s*\n)+/g,`
|
|
9
7
|
|
|
10
|
-
`),
|
|
11
|
-
`,t.insertAfter(l,c);}else !t.nodes||t.nodes.length,c.raws.before="",t.prepend(c);}}else if(
|
|
12
|
-
`}}),
|
|
8
|
+
`),n=n.trimEnd(),n}function Hr(e){return {postcssPlugin:"update-css",Once(t){for(let[i,r]of Object.entries(e))if(i.startsWith("@")){let n=i.match(/@([a-zA-Z-]+)\s*(.*)/);if(!n)continue;let[,o,a]=n;if(o==="import"){if(!t.nodes?.find(c=>c.type==="atrule"&&c.name==="import"&&c.params===a)){let c=x.atRule({name:"import",params:a,raws:{semicolon:true}}),m=t.nodes?.filter(l=>l.type==="atrule"&&l.name==="import");if(m&&m.length>0){let l=m[m.length-1];c.raws.before=`
|
|
9
|
+
`,t.insertAfter(l,c);}else !t.nodes||t.nodes.length,c.raws.before="",t.prepend(c);}}else if(o==="plugin"){let s=a;a&&!a.startsWith('"')&&!a.startsWith("'")&&(s=`"${a}"`);let c=l=>l.startsWith('"')&&l.endsWith('"')||l.startsWith("'")&&l.endsWith("'")?l.slice(1,-1):l;if(!t.nodes?.find(l=>l.type!=="atrule"||l.name!=="plugin"?false:c(l.params)===c(a))){let l=x.atRule({name:"plugin",params:s,raws:{semicolon:true,before:`
|
|
10
|
+
`}}),f=t.nodes?.filter(g=>g.type==="atrule"&&g.name==="import"),u=t.nodes?.filter(g=>g.type==="atrule"&&g.name==="plugin");if(u&&u.length>0){let g=u[u.length-1];t.insertAfter(g,l);}else if(f&&f.length>0){let g=f[f.length-1];t.insertAfter(g,l),t.insertBefore(l,x.comment({text:"---break---"})),t.insertAfter(l,x.comment({text:"---break---"}));}else t.prepend(l),t.insertBefore(l,x.comment({text:"---break---"})),t.insertAfter(l,x.comment({text:"---break---"}));}}else if(typeof r=="object"&&Object.keys(r).length===0){if(!t.nodes?.find(c=>c.type==="atrule"&&c.name===o&&c.params===a)){let c=x.atRule({name:o,params:a,raws:{semicolon:true}});t.append(c),t.insertBefore(c,x.comment({text:"---break---"}));}}else if(o==="keyframes"){let s=t.nodes?.find(l=>l.type==="atrule"&&l.name==="theme"&&l.params==="inline");s||(s=x.atRule({name:"theme",params:"inline",raws:{semicolon:true,between:" ",before:`
|
|
13
11
|
`}}),t.append(s),t.insertBefore(s,x.comment({text:"---break---"})));let c=s.nodes?.find(l=>l.type==="atrule"&&l.name==="keyframes"&&l.params===a),m;if(c?(m=x.atRule({name:"keyframes",params:a,raws:{semicolon:true,between:" ",before:`
|
|
14
12
|
`}}),c.replaceWith(m)):(m=x.atRule({name:"keyframes",params:a,raws:{semicolon:true,between:" ",before:`
|
|
15
|
-
`}}),s.append(m)),typeof r=="object")for(let[l,
|
|
16
|
-
`}});l?l.replaceWith(
|
|
17
|
-
`}});if(t.append(c),t.insertBefore(c,x.comment({text:"---break---"})),typeof r=="object")for(let[m,l]of Object.entries(r))if(typeof l=="string"){let
|
|
18
|
-
`}});c.append(
|
|
19
|
-
`}}),e.append(
|
|
13
|
+
`}}),s.append(m)),typeof r=="object")for(let[l,f]of Object.entries(r))ee(m,l,f);}else if(o==="utility"){let s=t.nodes?.find(c=>c.type==="atrule"&&c.name===o&&c.params===a);if(s){if(typeof r=="object")for(let[c,m]of Object.entries(r))if(typeof m=="string"){let l=s.nodes?.find(u=>u.type==="decl"&&u.prop===c),f=x.decl({prop:c,value:m,raws:{semicolon:true,before:`
|
|
14
|
+
`}});l?l.replaceWith(f):s.append(f);}else typeof m=="object"&&ee(s,c,m);}else {let c=x.atRule({name:o,params:a,raws:{semicolon:true,between:" ",before:`
|
|
15
|
+
`}});if(t.append(c),t.insertBefore(c,x.comment({text:"---break---"})),typeof r=="object")for(let[m,l]of Object.entries(r))if(typeof l=="string"){let f=x.decl({prop:m,value:l,raws:{semicolon:true,before:`
|
|
16
|
+
`}});c.append(f);}else typeof l=="object"&&ee(c,m,l);}}else o==="property"?ee(t,i,r):Ut(t,o,a,r);}else ee(t,i,r);}}}function Ut(e,t,i,r){let n=e.nodes?.find(o=>o.type==="atrule"&&o.name===t&&o.params===i);if(n||(n=x.atRule({name:t,params:i,raws:{semicolon:true,between:" ",before:`
|
|
17
|
+
`}}),e.append(n),e.insertBefore(n,x.comment({text:"---break---"}))),typeof r=="object")for(let[o,a]of Object.entries(r))if(o.startsWith("@")){let s=o.match(/@([a-zA-Z-]+)\s*(.*)/);if(s){let[,c,m]=s;Ut(n,c,m,a);}}else ee(n,o,a);else if(typeof r=="string")try{let a=x.parse(`.temp{${r}}`).first;if(a&&a.nodes){let s=x.rule({selector:"temp",raws:{semicolon:!0,between:" ",before:`
|
|
20
18
|
`}});a.nodes.forEach(c=>{if(c.type==="decl"){let m=c.clone();m.raws.before=`
|
|
21
|
-
`,s.append(m);}}),s.nodes?.length&&
|
|
22
|
-
`}}),e.append(r)),typeof i=="object"){for(let[o
|
|
23
|
-
`}});r.append(m);}}else if(typeof
|
|
24
|
-
`}}),s=r.nodes?.find(c=>c.type==="decl"&&c.prop===
|
|
25
|
-
`,r?.append(s);}});}catch(
|
|
19
|
+
`,s.append(m);}}),s.nodes?.length&&n.append(s);}}catch(o){throw console.error("Error parsing at-rule content:",r,o),o}}function ee(e,t,i){let r=e.nodes?.find(n=>n.type==="rule"&&n.selector===t);if(r||(r=x.rule({selector:t,raws:{semicolon:true,between:" ",before:`
|
|
20
|
+
`}}),e.append(r)),typeof i=="object"){for(let[n,o]of Object.entries(i))if(n.startsWith("@")&&typeof o=="object"&&o!==null&&Object.keys(o).length===0){let a=n.match(/@([a-zA-Z-]+)\s*(.*)/);if(a){let[,s,c]=a,m=x.atRule({name:s,params:c,raws:{semicolon:true,before:`
|
|
21
|
+
`}});r.append(m);}}else if(typeof o=="string"){let a=x.decl({prop:n,value:o,raws:{semicolon:true,before:`
|
|
22
|
+
`}}),s=r.nodes?.find(c=>c.type==="decl"&&c.prop===n);s?s.replaceWith(a):r.append(a);}else if(typeof o=="object"){let a=n.startsWith("&")?t.replace(/^([^:]+)/,`$1${n.substring(1)}`):n;ee(e,a,o);}}else if(typeof i=="string")try{let o=x.parse(`.temp{${i}}`).first;o&&o.nodes&&o.nodes.forEach(a=>{if(a.type==="decl"){let s=a.clone();s.raws.before=`
|
|
23
|
+
`,r?.append(s);}});}catch(n){throw console.error("Error parsing rule content:",t,i,n),n}}async function Kt(e,t,i){if(!t.resolvedPaths.tailwindCss||!Object.keys(e??{}).length)return;i={cleanupDefaultNextStyles:false,silent:false,tailwindVersion:"v3",overwriteCssVars:false,initIndex:true,...i};let r=t.resolvedPaths.tailwindCss,n=j__default.relative(t.resolvedPaths.cwd,r),o=s(`Updating CSS variables in ${d.info(n)}`,{silent:i.silent}).start(),a=await promises.readFile(r,"utf8"),s$1=await Qr(a,e??{},t,{cleanupDefaultNextStyles:i.cleanupDefaultNextStyles,tailwindVersion:i.tailwindVersion,tailwindConfig:i.tailwindConfig,overwriteCssVars:i.overwriteCssVars,initIndex:i.initIndex});await promises.writeFile(r,s$1,"utf8"),o.succeed();}async function Qr(e,t,i,r={cleanupDefaultNextStyles:false,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:false,initIndex:false}){r={cleanupDefaultNextStyles:false,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:false,initIndex:false,...r};let n=[ti(t)];if(r.cleanupDefaultNextStyles&&n.push(Yt()),r.tailwindVersion==="v4"){if(n=[],i.resolvedPaths?.cwd){let s=n$1(i.resolvedPaths.cwd);!s?.dependencies?.["tailwindcss-animate"]&&!s?.devDependencies?.["tailwindcss-animate"]&&r.initIndex&&n.push(si({params:"tw-animate-css"}));}n.push(ni({params:"dark (&:is(.dark *))"})),r.cleanupDefaultNextStyles&&n.push(Yt()),n.push(ii(t,{overwriteCssVars:r.overwriteCssVars})),n.push(oi(t)),r.tailwindConfig&&(n.push(ai(r.tailwindConfig)),n.push(li(r.tailwindConfig)),n.push(ci(r.tailwindConfig)));}i.tailwind.cssVariables&&r.initIndex&&n.push(ei({tailwindVersion:r.tailwindVersion}));let a=(await x(n).process(e,{from:void 0})).css;return a=a.replace(/\/\* ---break--- \*\//g,""),r.tailwindVersion==="v4"&&(a=a.replace(/(\n\s*\n)+/g,`
|
|
26
24
|
|
|
27
|
-
`)),a}function
|
|
28
|
-
`}}),t.append(r),t.insertBefore(r,x.comment({text:"---break---"}))),i.forEach(({selector:
|
|
25
|
+
`)),a}function ei({tailwindVersion:e}){return {postcssPlugin:"update-base-layer",Once(t){let i=[{selector:"*",apply:e==="v4"?"border-border outline-ring/50":"border-border"},{selector:"body",apply:"bg-background text-foreground"}],r=t.nodes.find(n=>n.type==="atrule"&&n.name==="layer"&&n.params==="base"&&i.every(({selector:o,apply:a})=>n.nodes?.some(s=>s.type==="rule"&&s.selector===o&&s.nodes.some(c=>c.type==="atrule"&&c.name==="apply"&&c.params===a))));r||(r=x.atRule({name:"layer",params:"base",raws:{semicolon:true,between:" ",before:`
|
|
26
|
+
`}}),t.append(r),t.insertBefore(r,x.comment({text:"---break---"}))),i.forEach(({selector:n,apply:o})=>{r?.nodes?.find(s=>s.type==="rule"&&s.selector===n)||r?.append(x.rule({selector:n,nodes:[x.atRule({name:"apply",params:o,raws:{semicolon:true,before:`
|
|
29
27
|
`}})],raws:{semicolon:true,between:" ",before:`
|
|
30
|
-
`}}));});}}}function
|
|
31
|
-
`,between:" "}}),t.append(i),t.insertBefore(i,x.comment({text:"---break---"}))),i!==void 0&&Object.entries(e).forEach(([r,
|
|
32
|
-
`}}),e.append(r)),Object.entries(i).forEach(([o
|
|
33
|
-
`}}),i.append(a),i.insertBefore(a,x.comment({text:"---break---"}))),Object.entries(
|
|
34
|
-
`}}),e.append(t),e.insertBefore(t,x.comment({text:"---break---"}))),t}function
|
|
35
|
-
`}});if(r.length>0){let
|
|
36
|
-
`}});if(i.length>0){let a=i[i.length-1];t.insertAfter(a,
|
|
37
|
-
`}});t.insertAfter(
|
|
38
|
-
`}});for(let[m,l]of Object.entries(s.data)){let
|
|
28
|
+
`}}));});}}}function ti(e){return {postcssPlugin:"update-css-vars",Once(t){let i=t.nodes.find(r=>r.type==="atrule"&&r.name==="layer"&&r.params==="base");i instanceof Zr||(i=x.atRule({name:"layer",params:"base",nodes:[],raws:{semicolon:true,before:`
|
|
29
|
+
`,between:" "}}),t.append(i),t.insertBefore(i,x.comment({text:"---break---"}))),i!==void 0&&Object.entries(e).forEach(([r,n])=>{let o=r==="light"?":root":`.${r}`;ri(i,o,n);});}}}function Jt(e){let t=e.nodes.find(i=>i.type==="rule"&&i.selector===":root");if(t){let i=["--background","--foreground"];t.nodes.filter(r=>r.type==="decl"&&i.includes(r.prop)).forEach(r=>r.remove()),t.nodes.length===0&&t.remove();}}function Yt(){return {postcssPlugin:"cleanup-default-next-styles",Once(e){let t=e.nodes.find(r=>r.type==="rule"&&r.selector==="body");t&&(t.nodes.find(r=>r.type==="decl"&&r.prop==="color"&&["rgb(var(--foreground-rgb))","var(--foreground)"].includes(r.value))?.remove(),t.nodes.find(r=>r.type==="decl"&&r.prop==="background"&&(r.value.startsWith("linear-gradient")||r.value==="var(--background)"))?.remove(),t.nodes.find(r=>r.type==="decl"&&r.prop==="font-family"&&r.value==="Arial, Helvetica, sans-serif")?.remove(),t.nodes.length===0&&t.remove()),Jt(e);let i=e.nodes.find(r=>r.type==="atrule"&&r.params==="(prefers-color-scheme: dark)");i&&(Jt(i),i.nodes.length===0&&i.remove());}}}function ri(e,t,i){let r=e.nodes?.find(n=>n.type==="rule"&&n.selector===t);r||Object.keys(i).length>0&&(r=x.rule({selector:t,raws:{between:" ",before:`
|
|
30
|
+
`}}),e.append(r)),Object.entries(i).forEach(([n,o])=>{let a=`--${n.replace(/^--/,"")}`,s=x.decl({prop:a,value:o,raws:{semicolon:true}}),c=r?.nodes.find(m=>m.type==="decl"&&m.prop===a);c?c.replaceWith(s):r?.append(s);});}function ii(e,t){return {postcssPlugin:"update-css-vars-v4",Once(i){Object.entries(e).forEach(([r,n])=>{let o=r==="light"?":root":`.${r}`;if(r==="theme"){o="@theme";let s=Ie(i);Object.entries(n).forEach(([c,m])=>{let l=`--${c.replace(/^--/,"")}`,f=x.decl({prop:l,value:m,raws:{semicolon:true}}),u=s?.nodes?.find(g=>g.type==="decl"&&g.prop===l);t.overwriteCssVars?u?u.replaceWith(f):s?.append(f):u||s?.append(f);});return}let a=i.nodes?.find(s=>s.type==="rule"&&s.selector===o);!a&&Object.keys(n).length>0&&(a=x.rule({selector:o,nodes:[],raws:{semicolon:true,between:" ",before:`
|
|
31
|
+
`}}),i.append(a),i.insertBefore(a,x.comment({text:"---break---"}))),Object.entries(n).forEach(([s,c])=>{let m=`--${s.replace(/^--/,"")}`;m==="--sidebar-background"&&(m="--sidebar"),qt(c)&&(c=`hsl(${c})`);let l=x.decl({prop:m,value:c,raws:{semicolon:true}}),f=a?.nodes.find(u=>u.type==="decl"&&u.prop===m);t.overwriteCssVars?f?f.replaceWith(l):a?.append(l):f||a?.append(l);});});}}}function oi(e){return {postcssPlugin:"update-theme",Once(t){let i=Array.from(new Set(Object.keys(e).flatMap(o=>Object.keys(e[o]||{}))));if(!i.length)return;let r=Ie(t),n=r.nodes?.filter(o=>o.type==="decl"&&o.prop.startsWith("--"));for(let o of i){let a=Object.values(e).find(f=>f[o])?.[o];if(!a)continue;if(o==="radius"){let f={sm:"calc(var(--radius) - 4px)",md:"calc(var(--radius) - 2px)",lg:"var(--radius)",xl:"calc(var(--radius) + 4px)","2xl":"calc(var(--radius) + 8px)","3xl":"calc(var(--radius) + 12px)","4xl":"calc(var(--radius) + 16px)"};for(let[u,g]of Object.entries(f)){let h=x.decl({prop:`--radius-${u}`,value:g,raws:{semicolon:true}});r?.nodes?.find(y=>y.type==="decl"&&y.prop===h.prop)||r?.append(h);}continue}let s=qt(a)||pi(a)?`--color-${o.replace(/^--/,"")}`:`--${o.replace(/^--/,"")}`;s==="--color-sidebar-background"&&(s="--color-sidebar");let c=`var(--${o})`;s==="--color-sidebar"&&(c="var(--sidebar)");let m=x.decl({prop:s,value:c,raws:{semicolon:true}});r?.nodes?.find(f=>f.type==="decl"&&f.prop===m.prop)||(n?.length?r?.insertAfter(n[n.length-1],m):r?.append(m));}}}}function Ie(e){let t=e.nodes.find(i=>i.type==="atrule"&&i.name==="theme"&&i.params==="inline");return t||(t=x.atRule({name:"theme",params:"inline",nodes:[],raws:{semicolon:true,between:" ",before:`
|
|
32
|
+
`}}),e.append(t),e.insertBefore(t,x.comment({text:"---break---"}))),t}function ni({params:e}){return {postcssPlugin:"add-custom-variant",Once(t){if(!t.nodes.find(r=>r.type==="atrule"&&r.name==="custom-variant")){let r=t.nodes.filter(o=>o.type==="atrule"&&o.name==="import"),n=x.atRule({name:"custom-variant",params:e,raws:{semicolon:true,before:`
|
|
33
|
+
`}});if(r.length>0){let o=r[r.length-1];t.insertAfter(o,n);}else t.insertAfter(t.nodes[0],n);t.insertBefore(n,x.comment({text:"---break---"}));}}}}function si({params:e}){return {postcssPlugin:"add-custom-import",Once(t){let i=t.nodes.filter(o=>o.type==="atrule"&&o.name==="import"),r=t.nodes.find(o=>o.type==="atrule"&&o.name==="custom-variant");if(!i.some(o=>o.params.replace(/["']/g,"")===e)){let o=x.atRule({name:"import",params:`"${e}"`,raws:{semicolon:true,before:`
|
|
34
|
+
`}});if(i.length>0){let a=i[i.length-1];t.insertAfter(a,o);}else r?(t.insertBefore(r,o),t.insertBefore(r,x.comment({text:"---break---"}))):(t.prepend(o),t.insertAfter(o,x.comment({text:"---break---"})));}}}}function ai(e){return {postcssPlugin:"update-tailwind-config",Once(t){if(!e?.plugins)return;let r=mi(t)==="single"?"'":'"',n=t.nodes.filter(a=>a.type==="atrule"&&a.name==="plugin"),o=n[n.length-1]||t.nodes[0];for(let a of e.plugins){let s=a.replace(/^require\(["']|["']\)$/g,"");if(n.some(m=>m.params.replace(/["']/g,"")===s))continue;let c=x.atRule({name:"plugin",params:`${r}${s}${r}`,raws:{semicolon:true,before:`
|
|
35
|
+
`}});t.insertAfter(o,c),t.insertBefore(c,x.comment({text:"---break---"}));}}}}function ci(e){return {postcssPlugin:"update-tailwind-config-keyframes",Once(t){if(!e?.theme?.extend?.keyframes)return;let i=Ie(t),r=i.nodes?.filter(o=>o.type==="atrule"&&o.name==="keyframes"),n=z$1.record(z$1.string(),z$1.record(z$1.string(),z$1.string()));for(let[o,a]of Object.entries(e.theme.extend.keyframes)){if(typeof o!="string")continue;let s=n.safeParse(a);if(!s.success||r?.find(m=>m.type==="atrule"&&m.name==="keyframes"&&m.params===o))continue;let c=x.atRule({name:"keyframes",params:o,nodes:[],raws:{semicolon:true,between:" ",before:`
|
|
36
|
+
`}});for(let[m,l]of Object.entries(s.data)){let f=x.rule({selector:m,nodes:Object.entries(l).map(([u,g])=>x.decl({prop:u,value:g,raws:{semicolon:true,before:`
|
|
39
37
|
`,between:": "}})),raws:{semicolon:true,between:" ",before:`
|
|
40
|
-
`}});c.append(
|
|
41
|
-
`}});i.append(c);}}}}function
|
|
38
|
+
`}});c.append(f);}i.append(c),i.insertBefore(c,x.comment({text:"---break---"}));}}}}function li(e){return {postcssPlugin:"update-tailwind-config-animation",Once(t){if(!e?.theme?.extend?.animation)return;let i=Ie(t),r=i.nodes?.filter(o=>o.type==="decl"&&o.prop.startsWith("--animate-")),n=z$1.record(z$1.string(),z$1.string()).safeParse(e.theme.extend.animation);if(n.success)for(let[o,a]of Object.entries(n.data)){let s=`--animate-${o}`;if(r?.find(m=>m.prop===s))continue;let c=x.decl({prop:s,value:a,raws:{semicolon:true,between:": ",before:`
|
|
39
|
+
`}});i.append(c);}}}}function mi(e){return e.nodes[0].toString().includes("'")?"single":"double"}function qt(e){if(e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch"))return false;let t=e.split(" ");return t.length===3&&t.slice(1,3).every(i=>i.includes("%"))}function pi(e){return e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch")||e.includes("--color-")}async function W(e,t,i,r$1){if(e=Array.from(new Set(e)),t=Array.from(new Set(t)),!e?.length&&!t?.length)return;r$1={silent:false,...r$1};let n=s("Installing dependencies.",{silent:r$1.silent})?.start(),o=await ui(i),a="";if(di(i)&&o==="npm")if(r$1.silent)a="force";else {n.stopAndPersist(),r.warn(`
|
|
42
40
|
It looks like you are using React 19.
|
|
43
41
|
Some packages may fail to install due to peer dependency issues in npm (see https://ui.shadcn.com/react-19).
|
|
44
|
-
`);let s=await
|
|
45
|
-
`),l=[],
|
|
46
|
-
`,"utf-8"),u=
|
|
47
|
-
`);}a.push(m);}return a.length>0&&
|
|
48
|
-
Existing CSS variables and components will be overwritten. Continue?`)});
|
|
49
|
-
You may now add components.`),r.break();}catch(i){r.break(),V$1(i);}finally{O();}});function
|
|
42
|
+
`);let s=await Ee([{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&&(a=s.flag);}n?.start(),await gi(o,e,t,i.resolvedPaths.cwd,a),n?.succeed();}function di(e){let t=n$1(e.resolvedPaths.cwd,false);if(!t?.dependencies?.react)return false;let i=/^(?:\^|~)?19(?:\.\d+)*(?:-.*)?$/.test(t.dependencies.react),r=t.dependencies["react-day-picker"]?.startsWith("8");return i&&r}async function ui(e){return n$1(e.resolvedPaths.cwd,false)?.dependencies?.expo?"expo":a$1(e.resolvedPaths.cwd)}async function gi(e,t,i,r,n){if(e==="npm")return hi(t,i,r,n);if(e==="deno")return yi(t,i,r);if(e==="expo")return wi(t,i,r);t?.length&&await execa(e,["add",...t],{cwd:r}),i?.length&&await execa(e,["add","-D",...i],{cwd:r});}async function hi(e,t,i,r){e.length&&await execa("npm",["install",...r?[`--${r}`]:[],...e],{cwd:i}),t.length&&await execa("npm",["install",...r?[`--${r}`]:[],"-D",...t],{cwd:i});}async function yi(e,t,i){e?.length&&await execa("deno",["add",...e.map(r=>`npm:${r}`)],{cwd:i}),t?.length&&await execa("deno",["add","-D",...t.map(r=>`npm:${r}`)],{cwd:i});}async function wi(e,t,i){e.length&&await execa("npx",["expo","install",...e],{cwd:i}),t.length&&await execa("npx",["expo","install","-- -D",...t],{cwd:i});}async function Ht(e,t,i){if(!e||Object.keys(e).length===0)return {envVarsAdded:[],envFileUpdated:null,envFileCreated:null};i={silent:false,...i};let r$1=s("Adding environment variables.",{silent:i.silent})?.start(),n=t.resolvedPaths.cwd,o=j__default.join(n,".env.local"),a=F(n);a&&(o=a);let s$1=existsSync(o),c=j__default.basename(o),m=Object.entries(e).map(([g,h])=>`${g}=${h}`).join(`
|
|
43
|
+
`),l=[],f=null,u=null;if(s$1){let g=await promises.readFile(o,"utf-8"),h=H(g,m);if(l=G(g,m),l.length>0){if(await promises.writeFile(o,h,"utf-8"),f=j__default.relative(n,o),r$1?.succeed(`Added the following variables to ${d.info(c)}:`),!i.silent)for(let y of l)r.log(` ${d.success("+")} ${y}`);}else r$1?.stop();}else if(await promises.writeFile(o,m+`
|
|
44
|
+
`,"utf-8"),u=j__default.relative(n,o),l=Object.keys(e),r$1?.succeed(`Added the following variables to ${d.info(c)}:`),!i.silent)for(let g of l)r.log(` ${d.success("+")} ${g}`);return !i.silent&&l.length>0&&r.break(),{envVarsAdded:l,envFileUpdated:f,envFileCreated:u}}async function Zt(e,t,i){if(!e?.length)return;let r=await o(t.resolvedPaths.cwd);if(!r||r.framework.name!=="next-app"&&r.framework.name!=="next-pages")return;let n=s("Updating fonts.",{silent:i.silent})?.start();try{await Ii(e,t,r),n?.succeed("Updating fonts.");}catch(o){throw n?.fail("Failed to update fonts."),o}}async function Ii(e,t,i){let r=await ki(t,i);if(!r)return;let n=await promises.readFile(r,"utf-8"),o=await Pi(n,e);o!==n&&await promises.writeFile(r,o,"utf-8");}async function ki(e,t){let i=e.resolvedPaths.cwd,r=t.isSrcDir,o=t.isTsx?"tsx":"jsx",a=r?[`src/app/layout.${o}`,`app/layout.${o}`]:[`app/layout.${o}`];for(let s of a){let c=j__default.join(i,s);if(existsSync(c))return c}return null}async function Pi(e,t,i){let n=new Project({compilerOptions:{}}).createSourceFile("layout.tsx",e,{scriptKind:ScriptKind.TSX}),o=t.filter(s=>s.font.provider==="google"),a=[];for(let s of o){let c=s.font.import;if(!c)continue;let m=Ei(c),l=n.getImportDeclaration(g=>g.getModuleSpecifierValue()==="next/font/google"),f=ji(s);l?l.getNamedImports().some(y=>y.getName()===c)||l.addNamedImport(c):n.addImportDeclaration({moduleSpecifier:"next/font/google",namedImports:[c]});let u=$i(n,s.font.variable);if(u)u.setInitializer(`${c}(${f})`),u.getName()!==m&&u.rename(m);else {let g=Ni(n);n.insertVariableStatement(g,{declarationKind:VariableDeclarationKind.Const,declarations:[{name:m,initializer:`${c}(${f})`}]}).appendWhitespace(`
|
|
45
|
+
`);}a.push(m);}return a.length>0&&Ti(n,a),n.getFullText()}function ji(e){let t={};return e.font.subsets?.length&&(t.subsets=e.font.subsets),e.font.weight?.length&&(t.weight=e.font.weight),t.variable=e.font.variable,JSON.stringify(t).replace(/"([^"]+)":/g,"$1:").replace(/"/g,"'")}function Ei(e){return e.split("_").map((t,i)=>i===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function $i(e,t){let i=e.getVariableStatements();for(let r of i)for(let n of r.getDeclarations()){let o=n.getInitializer();if(!o||o.getKind()!==SyntaxKind.CallExpression)continue;let s=o.getArguments();if(s.length===0)continue;let c=s[0].getText();if(c.includes("variable:")&&c.includes(t))return n}return null}function Ni(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function Ti(e,t){let i=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement);for(let r of i){if(r.getTagNameNode().getText()!=="html")continue;let o=r.getAttribute("className");if(!o){let m=t.map(l=>`${l}.variable`).join(", ");t.length===1?r.addAttribute({name:"className",initializer:`{${m}}`}):(de(e),r.addAttribute({name:"className",initializer:`{cn(${m})}`}));return}if(o.getKind()!==SyntaxKind.JsxAttribute)return;let a=o.asKindOrThrow(SyntaxKind.JsxAttribute),s=a.getInitializer();if(!s)return;let c=t.map(m=>`${m}.variable`);if(s.getKind()===SyntaxKind.StringLiteral){let m=s.getText().slice(1,-1);de(e),a.setInitializer(`{cn("${m}", ${c.join(", ")})}`);}else if(s.getKind()===SyntaxKind.JsxExpression){let m=s.asKindOrThrow(SyntaxKind.JsxExpression),l=m.getExpression();if(!l)return;let f=l.getText();if(f.startsWith("cn(")){if(c.every(y=>f.includes(y)))continue;let g=Fi(f),h=Ai(g,c);m.replaceWithText(`{${h}}`);}else if(/^\w+\.variable$/.test(f)){if(c.includes(f))continue;c.length===1?m.replaceWithText(`{${c[0]}}`):(de(e),m.replaceWithText(`{cn(${c.join(", ")})}`));}else if(f.startsWith("`")&&f.endsWith("`")){let u=Oi(f);de(e),m.replaceWithText(`{cn(${[...u,...c].join(", ")})}`);}else de(e),m.replaceWithText(`{cn(${f}, ${c.join(", ")})}`);}}}function de(e){if(!e.getImportDeclaration(i=>i.getNamedImports().some(n=>n.getName()==="cn"))){let i=e.getImportDeclaration(r=>r.getModuleSpecifierValue().includes("/lib/utils"));i?i.getNamedImports().some(n=>n.getName()==="cn")||i.addNamedImport("cn"):e.addImportDeclaration({moduleSpecifier:"@/lib/utils",namedImports:["cn"]});}}function Oi(e){let t=[],i=[],n=e.slice(1,-1).split(/(\$\{[^}]+\})/);for(let o of n)if(o)if(o.startsWith("${")&&o.endsWith("}")){let a=o.slice(2,-1).trim();a&&i.push(a);}else {let a=o.trim().split(/\s+/).filter(Boolean);for(let s of a)t.push(`"${s}"`);}return [...t,...i]}function Fi(e){return e.replace(/,?\s*\w+\.variable/g,"").replace(/cn\(\s*,/,"cn(")}function Ai(e,t){let i=t.join(", ");return e.replace(/\)$/,`, ${i})`)}async function Pe(e,t,i){i={overwrite:false,silent:false,isNewProject:false,baseStyle:true,...i};let r=await j$1(t);return r&&r.ui&&r.ui.resolvedPaths.cwd!==t.resolvedPaths.cwd?await Li(e,t,r,{...i,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await _i(e,t,i)}async function _i(e,t,i){if(!i.baseStyle&&!e.length)return;let r$1=s("Checking registry.",{silent:i.silent})?.start(),n=await U(e,N(t));if(!n)return r$1?.fail(),V$1(new Error("Failed to fetch components from registry."));try{Qt(n.files??[],t.resolvedPaths.cwd);}catch(o){return r$1?.fail(),V$1(o)}r$1?.succeed(),await W(n.dependencies,n.devDependencies,t,{silent:i.silent}),await J$1(n.files,t,{overwrite:i.overwrite,silent:i.silent,path:i.path}),n.docs&&r.info(n.docs);}async function Li(e,t,i,r$1){if(!r$1.baseStyle&&!e.length)return;let n=s("Checking registry.",{silent:r$1.silent})?.start(),o=await U(e,N(t));if(!o)return n?.fail(),V$1(new Error("Failed to fetch components from registry."));try{Qt(o.files??[],t.resolvedPaths.cwd);}catch(y){return n?.fail(),V$1(y)}n?.succeed();let a=[],s$1=[],c=[],m=s("Installing components.")?.start(),l$1=i.ui,f=await q(l$1),u=l(t.resolvedPaths.cwd,l$1.resolvedPaths.ui);if(o.tailwind?.config&&(await S(o.tailwind?.config,l$1,{silent:true,tailwindVersion:f}),s$1.push(j__default.relative(u,l$1.resolvedPaths.tailwindConfig))),o.cssVars){let y=await Vi(e,t);await Kt(o.cssVars,l$1,{silent:true,tailwindVersion:f,tailwindConfig:o.tailwind?.config,overwriteCssVars:y}),s$1.push(j__default.relative(u,l$1.resolvedPaths.tailwindCss));}o.css&&(await Bt(o.css,l$1,{silent:true}),s$1.push(j__default.relative(u,l$1.resolvedPaths.tailwindCss))),o.envVars&&await Ht(o.envVars,l$1,{silent:true}),await W(o.dependencies,o.devDependencies,l$1,{silent:true}),await Zt(o.fonts,l$1,{silent:true});let g=new Map;for(let y of o.files??[]){let k=y.type||"registry:ui";g.has(k)||g.set(k,[]),g.get(k).push(y);}for(let y of Array.from(g.keys())){let k$1=g.get(y),S=y==="registry:ui"?i.ui:t,B=l(t.resolvedPaths.cwd,S.resolvedPaths.ui||S.resolvedPaths.cwd),T=await k(B,S.resolvedPaths.cwd)??S.resolvedPaths.cwd,Y=await J$1(k$1,S,{overwrite:r$1.overwrite,silent:true,rootSpinner:m,isRemote:r$1.isRemote,isWorkspace:true,path:r$1.path});a.push(...Y.filesCreated.map(O=>j__default.relative(B,j__default.join(T,O)))),s$1.push(...Y.filesUpdated.map(O=>j__default.relative(B,j__default.join(T,O)))),c.push(...Y.filesSkipped.map(O=>j__default.relative(B,j__default.join(T,O))));}if(m?.succeed(),a.sort(),s$1.sort(),c.sort(),!(a.length||s$1.length)&&!c.length&&s("No files updated.",{silent:r$1.silent})?.info(),a.length){s(`Created ${a.length} ${a.length===1?"file":"files"}:`,{silent:r$1.silent})?.succeed();for(let y of a)r.log(` - ${y}`);}if(s$1.length){s(`Updated ${s$1.length} ${s$1.length===1?"file":"files"}:`,{silent:r$1.silent})?.info();for(let y of s$1)r.log(` - ${y}`);}if(c.length){s(`Skipped ${c.length} ${s$1.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:r$1.silent})?.info();for(let y of c)r.log(` - ${y}`);}o.docs&&r.info(o.docs);}async function Vi(e,t){let i=await X(e,{config:t});return z$1.array(n).parse(i).some(n=>n.type==="registry:theme"||n.type==="registry:style"||n.type==="registry:font"||n.type==="registry:base")}function Qt(e,t){for(let i of e)if(i?.target&&!Mt(i.target,t))throw new Error(`We found an unsafe file path "${i.target} in the registry item. Installation aborted.`)}var zi=z$1.object({components:z$1.array(z$1.string()).optional(),yes:z$1.boolean(),overwrite:z$1.boolean(),cwd:z$1.string(),all:z$1.boolean(),path:z$1.string().optional(),silent:z$1.boolean(),srcDir:z$1.boolean().optional(),cssVariables:z$1.boolean()}),tr=new Command().name("add").description("add a component to your project").argument("[components...]","names, url or local path to component").option("-y, --yes","skip confirmation prompt.",false).option("-o, --overwrite","overwrite existing files.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-a, --all","add all available components",false).option("-p, --path <path>","the path to add the component to.").option("-s, --silent","mute output.",false).option("--src-dir","use the src directory when creating a new project.",false).option("--no-src-dir","do not use the src directory when creating a new project.").option("--css-variables","use css variables for theming.",true).option("--no-css-variables","do not use css variables for theming.").action(async(e,t)=>{try{let i$1=zi.parse({components:e,cwd:j__default.resolve(t.cwd),...t});await L(i$1.cwd);let r$1=await i(i$1.cwd);r$1||(r$1=m({style:"new-york",resolvedPaths:{cwd:i$1.cwd}}));let n=["sidebar-","login-","signup-","otp-","calendar-"],o$1=["base-","radix-"];if(e.length>0&&r$1?.style&&o$1.some(f=>r$1?.style.startsWith(f))){let f=e.filter(u=>n.some(g=>u.startsWith(g)));f.length&&(r.warn(`The ${d.info(f.map(u=>u).join(", "))} component(s) are not available for the ${d.info(r$1.style)} style yet. They are coming soon.`),r.warn("In the meantime, you can visit the blocks page on https://ui.shadcn.com/blocks and copy the code."),r.break(),process.exit(1));}let a=!1;if(e.length>0){let{config:l,newRegistries:f}=await V(e,r$1,{silent:i$1.silent,writeFile:!1});r$1=l,a=f.length>0;}let s,c=!0;if(e.length>0){let[l]=await X([e[0]],{config:r$1});if(s=l?.type,c=s!=="registry:theme"&&s!=="registry:style",M(l)){await Pe(e,r$1,{...i$1,baseStyle:c});return}if(!i$1.yes&&(s==="registry:style"||s==="registry:theme")){r.break();let{confirm:f}=await Ee({type:"confirm",name:"confirm",message:d.warn(`You are about to install a new ${s.replace("registry:","")}.
|
|
46
|
+
Existing CSS variables and components will be overwritten. Continue?`)});f||(r.break(),r.log("Installation cancelled."),r.break(),process.exit(1));}}if(i$1.components?.length||(i$1.components=await Bi(i$1)),(await o(i$1.cwd))?.tailwindVersion==="v4"){let l=c$1.filter(f=>i$1.components?.includes(f.name));l?.length&&(r.break(),l.forEach(f=>{r.warn(d.warn(f.message));}),r.break(),process.exit(1));}console.log({options:i$1}),await fe({cwd:i$1.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:i$1.silent&&!a,isNewProject:!1,srcDir:i$1.srcDir,cssVariables:i$1.cssVariables,baseStyle:c,baseColor:c?void 0:"neutral",components:i$1.components});}catch(i){console.log("add error"),r.break(),V$1(i);}finally{O();}});async function Bi(e){let t=await _();if(!t)return r.break(),V$1(new Error("Failed to fetch registry index.")),[];if(e.all)return t.map(n=>n.name).filter(n=>!c$1.some(o=>o.name===n));if(e.components?.length)return e.components;let{components:i}=await Ee({type:"multiselect",name:"components",message:"Which components would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:false,choices:t.filter(n=>n.type==="registry:ui"&&!c$1.some(o=>o.name===n.name)).map(n=>({title:n.name,value:n.name,selected:e.all?true:e.components?.includes(n.name)}))});i?.length||(r.warn("No components selected. Exiting."),r.info(""),process.exit(1));let r$1=z$1.array(z$1.string()).safeParse(i);return r$1.success?r$1.data:(r.error(""),V$1(new Error("Something went wrong. Please try again.")),[])}async function or(e){let t={},i={cwd:e.cwd,registryFile:j__default.resolve(e.cwd,e.registryFile),outputDir:j__default.resolve(e.cwd,e.outputDir)};return v.existsSync(i.registryFile)||(t["13"]=true),await v.mkdir(i.outputDir,{recursive:true}),Object.keys(t).length>0&&(t["13"]&&(r.break(),r.error(`The path ${d.info(i.registryFile)} does not exist.`)),r.break(),process.exit(1)),{errors:t,resolvePaths:i}}var Gi=z$1.object({cwd:z$1.string(),registryFile:z$1.string(),outputDir:z$1.string()}),nr=new Command().name("build").description("build components for a shadcn registry").argument("[registry]","path to registry.json file","./registry.json").option("-o, --output <path>","destination directory for json files","./public/r").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let i=Gi.parse({cwd:j.resolve(t.cwd),registryFile:e,outputDir:t.output}),{resolvePaths:r$1}=await or(i),n$1=await z.readFile(r$1.registryFile,"utf-8"),o=o$1.safeParse(JSON.parse(n$1));o.success||(r.error(`Invalid registry file found at ${d.info(r$1.registryFile)}.`),process.exit(1));let a=s("Building registry...");for(let s of o.data.items){a.start(`Building ${s.name}...`),s.$schema="https://ui.shadcn.com/schema/registry-item.json";for(let m of s.files??[])m.content=await z.readFile(j.resolve(r$1.cwd,m.path),"utf-8");let c=n.safeParse(s);if(!c.success){r.error(`Invalid registry item found for ${d.info(s.name)}.`);continue}await z.writeFile(j.resolve(r$1.outputDir,`${c.data.name}.json`),JSON.stringify(c.data,null,2));}await z.copyFile(r$1.registryFile,j.resolve(r$1.outputDir,"registry.json")),a.succeed("Building registry.");}catch(i){r.break(),V$1(i);}});var ar="https://ui.shadcn.com",Ki={next:"Next.js",vite:"Vite",start:"TanStack Start"},cr=new Command().name("create").description("create a new project with shadcn/ui").argument("[name]","the name of your project").option("-t, --template <template>","the template to use. e.g. next, start or vite").option("-p, --preset [name]","use a preset configuration").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("--src-dir","use the src directory when creating a new project.",false).option("--no-src-dir","do not use the src directory when creating a new project.").option("-y, --yes","skip confirmation prompt.",true).action(async(e,t)=>{try{if(!e&&!t.template&&!t.preset){let h=lr();r.log("Build your own shadcn/ui."),r.log(`You will be taken to ${d.info(h)} to build your custom design system.`),r.break();let{proceed:y}=await Ee({type:"confirm",name:"proceed",message:"Open in browser?",initial:!0});y&&await sr(h),process.exit(0);}let r$1=e;if(!r$1){let{enteredName:h}=await Ee({type:"text",name:"enteredName",message:"What is your project named?",initial:t.template?`${t.template}-app`:"my-app",format:y=>y.trim(),validate:y=>y.length>128?"Name should be less than 128 characters.":!0});h||process.exit(0),r$1=h;}let n=t.template;if(!n){let{selectedTemplate:h}=await Ee({type:"select",name:"selectedTemplate",message:`Which ${d.info("template")} would you like to use?`,choices:Object.entries(Ki).map(([y,k])=>({title:k,value:y}))});h||process.exit(0),n=h;}let o=await Hi(t.preset??!0);o||process.exit(0);let a,s;"_isUrl"in o?(a=o.url,s=new URL(o.url).searchParams.get("baseColor")??"neutral"):(a=qi(o),s=o.baseColor);let c=N({}),{config:m}=await V([a],c,{silent:!0});c=m;let[l]=await X([a],{config:c}),f;l?.type==="registry:base"&&l.config&&(f=l.config);let u=Je.parse({cwd:j__default.resolve(t.cwd),name:r$1,components:[a],yes:t.yes,defaults:!1,force:!1,silent:!1,isNewProject:!0,srcDir:t.srcDir,cssVariables:!0,template:n,baseColor:s,baseStyle:!1,registryBaseConfig:f,skipPreflight:!1}),g=await fe(u);if(g){await Pe(["component-example"],g,{baseStyle:!1,silent:!0,overwrite:!0});let h=Xi(n);h.length>0&&await J$1(h,g,{overwrite:!0,silent:!0});}r.log(`${d.success("Success!")} Project initialization completed.
|
|
47
|
+
You may now add components.`),r.break();}catch(i){r.break(),V$1(i);}finally{O();}});function qi(e){let t=new URLSearchParams({base:e.base,style:e.style,baseColor:e.baseColor,theme:e.theme,iconLibrary:e.iconLibrary,font:e.font,menuAccent:e.menuAccent,menuColor:e.menuColor,radius:e.radius});return `${Zi()}?${t.toString()}`}async function Hi(e){if(e===true){let t=await ha(),{selectedPreset:i}=await Ee({type:"select",name:"selectedPreset",message:`Which ${d.info("preset")} would you like to use?`,choices:[...t.map(r=>({title:r.title,description:r.description,value:r.name})),{title:"Custom",description:"Build your own on https://ui.shadcn.com",value:"custom"}]});if(!i)return null;if(i==="custom"){let r$1=lr();return r.info(`
|
|
50
48
|
Opening ${d.info(r$1)} in your browser...
|
|
51
|
-
`),await
|
|
49
|
+
`),await sr(r$1),null}return t.find(r=>r.name===i)??null}if(typeof e=="string"){if(L$1(e))return {_isUrl:true,url:e};let t=await ia(e);if(!t){let r$1=(await ha()).map(n=>n.name).join(", ");r.error(`Preset "${e}" not found. Available presets: ${r$1}`),process.exit(1);}return t}return null}function Xi(e){switch(e){case "vite":return [{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:Ke`import { ComponentExample } from "@/components/component-example";
|
|
52
50
|
|
|
53
51
|
export function App() {
|
|
54
52
|
return <ComponentExample />;
|
|
55
53
|
}
|
|
56
54
|
|
|
57
55
|
export default App;
|
|
58
|
-
`}];case "next":return [{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:
|
|
56
|
+
`}];case "next":return [{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:Ke`import { ComponentExample } from "@/components/component-example";
|
|
59
57
|
|
|
60
58
|
export default function Page() {
|
|
61
59
|
return <ComponentExample />;
|
|
62
60
|
}
|
|
63
|
-
`}];case "start":return [{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:
|
|
61
|
+
`}];case "start":return [{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:Ke`import { createFileRoute } from "@tanstack/react-router";
|
|
64
62
|
import { ComponentExample } from "@/components/component-example";
|
|
65
63
|
|
|
66
64
|
export const Route = createFileRoute("/")({ component: App });
|
|
@@ -70,18 +68,18 @@ function App() {
|
|
|
70
68
|
<ComponentExample />
|
|
71
69
|
);
|
|
72
70
|
}
|
|
73
|
-
`}];default:return []}}function
|
|
71
|
+
`}];default:return []}}function lr(){return `${ar}/create`}function Zi(){return `${ar}/init`}var ro=z$1.object({component:z$1.string().optional(),yes:z$1.boolean(),cwd:z$1.string(),path:z$1.string().optional()}),pr=new Command().name("diff").description("check for updates against the registry").argument("[component]","the component name").option("-y, --yes","skip confirmation prompt.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let i$1=ro.parse({component:e,...t}),r$1=j__default.resolve(i$1.cwd);existsSync(r$1)||(r.error(`The path ${r$1} does not exist. Please try again.`),process.exit(1));let n=await i(r$1);n||(r.warn(`Configuration is missing. Please run ${d.success("init")} to create a components.json file.`),process.exit(1));let o=await _();if(o||(V$1(new Error("Failed to fetch registry index.")),process.exit(1)),!i$1.component){let c=n.resolvedPaths.components,m=o.filter(f=>{for(let u of f.files??[]){let g=j__default.resolve(c,typeof u=="string"?u:u.path);if(existsSync(g))return !0}return !1}),l=[];for(let f of m){let u=await mr(f,n);u.length&&l.push({name:f.name,changes:u});}l.length||(r.info("No updates found."),process.exit(0)),r.info("The following components have updates available:");for(let f of l){r.info(`- ${f.name}`);for(let u of f.changes)r.info(` - ${u.filePath}`);}r.break(),r.info(`Run ${d.success("diff <component>")} to see the changes.`),process.exit(0);}let a=o.find(c=>c.name===i$1.component);a||(r.error(`The component ${d.success(i$1.component)} does not exist.`),process.exit(1));let s=await mr(a,n);s.length||(r.info(`No updates found for ${i$1.component}.`),process.exit(0));for(let c of s)r.info(`- ${c.filePath}`),await io(c.patch),r.info("");}catch(i){V$1(i);}});async function mr(e,t){let i=await ea(t.style,[e]),r=await ca(t.tailwind.baseColor);if(!i)return [];let n=[];for(let o of i){let a=await fa(t,o);if(a)for(let s of o.files??[]){let c=j__default.resolve(a,typeof s=="string"?s:s.path);if(!existsSync(c))continue;let m=await promises.readFile(c,"utf8");if(typeof s=="string"||!s.content)continue;let l=await I({filename:s.path,raw:s.content,config:t,baseColor:r}),f=diffLines(l,m);f.length>1&&n.push({filePath:c,patch:f});}}return n}async function io(e){e.forEach(t=>{if(t)return t.added?process.stdout.write(d.success(t.value)):t.removed?process.stdout.write(d.error(t.value)):process.stdout.write(t.value)});}var fr=new Command().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=>{try{r.info("> project info"),console.log(await o(e.cwd)),r.break(),r.info("> components.json"),console.log(await i(e.cwd));}catch(t){V$1(t);}});var ce="latest",Ne=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${ce}`,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${ce}`,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{shadcn:{command:"npx",args:[`shadcn@${ce}`,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.shadcn]
|
|
74
72
|
command = "npx"
|
|
75
73
|
args = ["shadcn@${ce}", "mcp"]
|
|
76
|
-
`}],$e=[`shadcn@${ce}`],
|
|
74
|
+
`}],$e=[`shadcn@${ce}`],Ze=new Command().name("mcp").description("MCP server and configuration commands").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{try{await L(e.cwd);let t=new StdioServerTransport;await b.connect(t);}catch(t){r.break(),V$1(t);}}),mo=Xe.object({client:Xe.enum(["claude","cursor","vscode","codex"]),cwd:Xe.string()});Ze.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${Ne.map(e=>e.name).join(", ")})`).action(async(e,t)=>{try{let r$1=(t.parent?.opts()||{}).cwd||process.cwd(),n=e.client;if(!n){let m=await Ee({type:"select",name:"client",message:"Which MCP client are you using?",choices:Ne.map(l=>({title:l.label,value:l.name}))});m.client||(r.break(),process.exit(1)),n=m.client;}let o=mo.parse({client:n,cwd:r$1}),a=await i(o.cwd);if(o.client==="codex"){if(a)await W([],$e,a,{silent:!1});else {let m=await a$1(o.cwd),l=m==="npm"?"install":"add",f=m==="npm"?"--save-dev":"-D",u=s("Installing dependencies...").start();await execa(m,[l,f,...$e],{cwd:o.cwd}),u.succeed("Installing dependencies.");}r.break(),r.log("To configure the shadcn MCP server in Codex:"),r.break(),r.log(`1. Open or create the file ${d.info("~/.codex/config.toml")}`),r.log("2. Add the following configuration:"),r.log(),r.info(`[mcp_servers.shadcn]
|
|
77
75
|
command = "npx"
|
|
78
|
-
args = ["shadcn@${ce}", "mcp"]`),r.break(),r.info("3. Restart Codex to load the MCP server"),r.break(),process.exit(0);}let s$1=s("Configuring MCP server...").start(),c=await
|
|
79
|
-
`,"utf-8"),r.configPath}var J={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"}};async function
|
|
80
|
-
`),a.succeed("Updated package.json."),await W(["radix-ui"],[],e,{silent:!1});}else a.succeed("No packages found in source files.");}catch{a.fail("Failed to update package.json"),r.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui");}}async function
|
|
76
|
+
args = ["shadcn@${ce}", "mcp"]`),r.break(),r.info("3. Restart Codex to load the MCP server"),r.break(),process.exit(0);}let s$1=s("Configuring MCP server...").start(),c=await fo(o);if(s$1.succeed("Configuring MCP server."),a)await W([],$e,a,{silent:!1});else {let m=await a$1(o.cwd),l=m==="npm"?"install":"add",f=m==="npm"?"--save-dev":"-D",u=s("Installing dependencies...").start();await execa(m,[l,f,...$e],{cwd:o.cwd}),u.succeed("Installing dependencies.");}r.break(),r.success(`Configuration saved to ${c}.`),r.break();}catch(i){V$1(i);}});var po=(e,t)=>t;async function fo(e){let{client:t,cwd:i}=e,r=Ne.find(c=>c.name===t);if(!r)throw new Error(`Unknown client: ${t}. Available clients: ${Ne.map(c=>c.name).join(", ")}`);let n=j__default.join(i,r.configPath),o=j__default.dirname(n);await v.ensureDir(o);let a={};try{let c=await promises.readFile(n,"utf-8");a=JSON.parse(c);}catch{}let s=Gr(a,r.config,{arrayMerge:po});return await promises.writeFile(n,JSON.stringify(s,null,2)+`
|
|
77
|
+
`,"utf-8"),r.configPath}var J={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"}};async function yr(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,[i,r$1]=await Promise.all([ho("**/*.{js,ts,jsx,tsx}",{cwd:t}),aa()]);if(Object.keys(r$1).length===0)throw new Error("Something went wrong fetching the registry icons.");let n=Object.entries(J).map(([l,f])=>({title:f.name,value:l})),o=await Ee([{type:"select",name:"sourceLibrary",message:`Which icon library would you like to ${d.info("migrate from")}?`,choices:n},{type:"select",name:"targetLibrary",message:`Which icon library would you like to ${d.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 J&&o.targetLibrary in J))throw new Error("Invalid icon library. Please choose a valid icon library.");let a=J[o.sourceLibrary],s$1=J[o.targetLibrary],{confirm:c}=await Ee({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${d.info(i.length)} files in ${d.info(`./${j__default.relative(e.resolvedPaths.cwd,t)}`)} from ${d.info(a.name)} to ${d.info(s$1.name)}. Continue?`});c||(r.info("Migration cancelled."),process.exit(0)),s$1.package&&await W([s$1.package],[],e,{silent:false});let m=s("Migrating icons...")?.start();await Promise.all(i.map(async l=>{m.text=`Migrating ${l}...`;let f=j__default.join(t,l),u=await promises.readFile(f,"utf-8"),g=await xo(u,o.sourceLibrary,o.targetLibrary,r$1);await promises.writeFile(f,g);})),m.succeed("Migration complete.");}async function xo(e,t,i,r){let n=J[t]?.import,o=J[i]?.import,a=await promises.mkdtemp(j__default.join(tmpdir(),"shadcn-")),s=new Project({compilerOptions:{}}),c=j__default.join(a,`shadcn-icons-${randomBytes(4).toString("hex")}.tsx`),m=s.createSourceFile(c,e,{scriptKind:ScriptKind.TSX}),l=[];for(let f of m.getImportDeclarations()??[])if(f.getModuleSpecifier()?.getText()===`"${n}"`){for(let u of f.getNamedImports()??[]){let g=u.getName(),h=Object.values(r).find(y=>y[t]===g)?.[i];!h||l.includes(h)||(l.push(h),u.remove(),m.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).filter(y=>y.getTagNameNode()?.getText()===g).forEach(y=>y.getTagNameNode()?.replaceWithText(h)));}f.getNamedImports()?.length===0&&f.remove();}return l.length>0&&m.addImportDeclaration({moduleSpecifier:o,namedImports:l.map(f=>({name:f}))}),await m.getText()}function Ro(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function Co(e,t,i,r){let o=e.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").trim().split(",").map(a=>a.trim()).filter(Boolean);for(let a of o){let s=a.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?$/),c=a.match(/^(\w+)\s+as\s+(\w+)$/);if(s){let m=s[1],l=s[2];r==="slot"&&m==="Slot"&&!l?i.push({name:"Slot",alias:"SlotPrimitive",isType:true}):i.push({name:m,alias:l,isType:true});}else if(c){let m=c[1],l=c[2];r==="slot"&&m==="Slot"&&l==="Slot"?i.push({name:"Slot",alias:"SlotPrimitive",isType:t}):i.push({name:m,alias:l,isType:t});}else r==="slot"&&a==="Slot"?i.push({name:"Slot",alias:"SlotPrimitive",isType:t}):i.push({name:a,isType:t});}}async function wr(e,t={}){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 i=e.resolvedPaths.ui,r$1=await ho("**/*.{js,ts,jsx,tsx}",{cwd:i});if(!t.yes){let{confirm:s}=await Ee({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${d.info(r$1.length)} files in ${d.info(`./${j__default.relative(e.resolvedPaths.cwd,i)}`)} to ${d.info("radix-ui")}. Continue?`});s||(r.info("Migration cancelled."),process.exit(0));}let n=s("Migrating imports...")?.start(),o=new Set;await Promise.all(r$1.map(async s=>{n.text=`Migrating ${s}...`;let c=j__default.join(i,s),m=await promises.readFile(c,"utf-8"),{content:l,replacedPackages:f}=await Io(m);f.forEach(u=>o.add(u)),await promises.writeFile(c,l);})),n.succeed("Migrating imports.");let a=s("Updating package.json...")?.start();try{let s=n$1(e.resolvedPaths.cwd,!1);if(!s){a.fail("Could not read package.json"),r.warn("Could not update package.json. You may need to manually replace @radix-ui/react-* packages with radix-ui");return}let c=Array.from(o),m=["dependencies","devDependencies"];for(let l of m)if(s[l])for(let f of c)s[l][f]&&delete s[l][f];if(c.length>0){s.dependencies||(s.dependencies={}),s.dependencies["radix-ui"]="latest";let l=j__default.join(e.resolvedPaths.cwd,"package.json");await promises.writeFile(l,JSON.stringify(s,null,2)+`
|
|
78
|
+
`),a.succeed("Updated package.json."),await W(["radix-ui"],[],e,{silent:!1});}else a.succeed("No packages found in source files.");}catch{a.fail("Failed to update package.json"),r.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui");}}async function Io(e){let t=/import\s+(?:(type)\s+)?(?:\*\s+as\s+(\w+)|{([^}]+)})\s+from\s+(["'])@radix-ui\/react-([^"']+)\4(;?)/g,i=[],r=[],n=[],o='"',a=false,s=e,c;for(;(c=t.exec(e))!==null;){let[h,y,k,S,B,T,Y]=c;if(T==="icons"||T.startsWith("icons/"))continue;r.push(h),r.length===1&&(o=B,a=Y===";"),n.push(`@radix-ui/react-${T}`);let O=!!y;if(k){let Oe=Ro(T);i.push({name:Oe,alias:k,isType:O});}else S&&Co(S,O,i,T);}if(i.length===0)return {content:e,replacedPackages:[]};let m=i.filter((h,y,k)=>y===k.findIndex(S=>S.name===h.name&&S.alias===h.alias&&S.isType===h.isType)),f=`import { ${m.map(h=>{let y=h.isType?"type ":"";return h.alias?`${y}${h.name} as ${h.alias}`:`${y}${h.name}`}).join(", ")} } from ${o}radix-ui${o}${a?";":""}`;s=r.reduce((h,y,k)=>h.replace(y,k===0?f:""),s),s=s.replace(/\n\s*\n\s*\n/g,`
|
|
81
79
|
|
|
82
80
|
`),m.some(h=>h.name==="Slot"&&h.alias==="SlotPrimitive")&&(s=s.split(`
|
|
83
|
-
`).map(k=>{if(k.trim().startsWith("import "))return k;let S=k;return S=S.replace(/\b(asChild\s*\?\s*)Slot(\s*:)/g,"$1__SLOT_PLACEHOLDER__$2"),S=S.replace(/\bReact\.ComponentProps<typeof\s+Slot>/g,"React.ComponentProps<typeof __SLOT_PLACEHOLDER__>"),S=S.replace(/\bComponentProps<typeof\s+Slot>/g,"ComponentProps<typeof __SLOT_PLACEHOLDER__>"),S=S.replace(/(<\/?)Slot(\s*\/?>)/g,"$1__SLOT_PLACEHOLDER__$2"),S=S.replace(/\bSlot\b/g,(B,T,Y)=>{let O=Y.substring(0,T),
|
|
84
|
-
`));let g=Array.from(new Set(
|
|
85
|
-
Before you can run a migration, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),r.error(`Learn more at ${d.info("https://ui.shadcn.com/docs/components-json")}.`),r.break(),process.exit(1);}}var
|
|
86
|
-
Before you can build the registry, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),r.break(),process.exit(1);}}var
|
|
81
|
+
`).map(k=>{if(k.trim().startsWith("import "))return k;let S=k;return S=S.replace(/\b(asChild\s*\?\s*)Slot(\s*:)/g,"$1__SLOT_PLACEHOLDER__$2"),S=S.replace(/\bReact\.ComponentProps<typeof\s+Slot>/g,"React.ComponentProps<typeof __SLOT_PLACEHOLDER__>"),S=S.replace(/\bComponentProps<typeof\s+Slot>/g,"ComponentProps<typeof __SLOT_PLACEHOLDER__>"),S=S.replace(/(<\/?)Slot(\s*\/?>)/g,"$1__SLOT_PLACEHOLDER__$2"),S=S.replace(/\bSlot\b/g,(B,T,Y)=>{let O=Y.substring(0,T),Oe=(O.match(/"/g)||[]).length,Fr=(O.match(/'/g)||[]).length;return Oe%2!==0||Fr%2!==0?B:"__SLOT_PLACEHOLDER__"}),S=S.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),S}).join(`
|
|
82
|
+
`));let g=Array.from(new Set(n));return {content:s,replacedPackages:g}}async function xr(e){let t={};if(!v.existsSync(e.cwd)||!v.existsSync(j__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!v.existsSync(j__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,config:null};try{let i$1=await i(e.cwd);return {errors:t,config:i$1}}catch{r.break(),r.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e.cwd)}.
|
|
83
|
+
Before you can run a migration, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),r.error(`Learn more at ${d.info("https://ui.shadcn.com/docs/components-json")}.`),r.break(),process.exit(1);}}var vr=[{name:"icons",description:"migrate your ui components to a different icon library."},{name:"radix",description:"migrate to radix-ui."}],jo=z$1.object({cwd:z$1.string(),list:z$1.boolean(),yes:z$1.boolean(),migration:z$1.string().refine(e=>e&&vr.some(t=>t.name===e),{message:"You must specify a valid migration. Run `shadcn migrate --list` to see available migrations."}).optional()}),Sr=new Command().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.",false).option("-y, --yes","skip confirmation prompt.",false).action(async(e,t)=>{try{let i=jo.parse({cwd:j__default.resolve(t.cwd),migration:e,list:t.list,yes:t.yes});if(i.list||!i.migration){r.info("Available migrations:");for(let o of vr)r.info(`- ${o.name}: ${o.description}`);return}if(!i.migration)throw new Error("You must specify a migration. Run `shadcn migrate --list` to see available migrations.");let{errors:r$1,config:n}=await xr(i);if(r$1["1"]||r$1["3"])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.");i.migration==="icons"&&await yr(n),i.migration==="radix"&&await wr(n,{yes:i.yes});}catch(i){r.break(),V$1(i);}});async function Rr(e){let t={},i$1={cwd:e.cwd,registryFile:j__default.resolve(e.cwd,e.registryFile),outputDir:j__default.resolve(e.cwd,e.outputDir)};if(!v.existsSync(i$1.registryFile))return t["13"]=true,{errors:t,resolvePaths:null,config:null};if(!v.existsSync(j__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,resolvePaths:null,config:null};await v.mkdir(i$1.outputDir,{recursive:true});try{let r=await i(e.cwd);return {errors:t,config:r,resolvePaths:i$1}}catch{r.break(),r.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e.cwd)}.
|
|
84
|
+
Before you can build the registry, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),r.break(),process.exit(1);}}var $o=z$1.object({cwd:z$1.string(),registryFile:z$1.string(),outputDir:z$1.string(),verbose:z$1.boolean().optional().default(false)}),Cr=new Command().name("registry:build").description("builds the registry [EXPERIMENTAL]").argument("[registry]","path to registry.json file","./registry.json").option("-o, --output <path>","destination directory for json files","./public/r").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-v, --verbose","verbose output").action(async(e,t)=>{await No({cwd:j.resolve(t.cwd),registryFile:e,outputDir:t.output,verbose:t.verbose});});async function No(e){try{let t=$o.parse(e),[{errors:i,resolvePaths:r$1,config:n$1},o$2]=await Promise.all([Rr(t),o(t.cwd)]);(i["3"]||!n$1||!o$2)&&(r.error(`A ${d.info("components.json")} file is required to build the registry. Run ${d.info("shadcn init")} to create one.`),r.break(),process.exit(1)),(i["13"]||!r$1)&&(r.error(`We could not find a registry file at ${d.info(j.resolve(t.cwd,t.registryFile))}.`),r.break(),process.exit(1));let a=await z.readFile(r$1.registryFile,"utf-8"),s$1=o$1.safeParse(JSON.parse(a));s$1.success||(r.error(`Invalid registry file found at ${d.info(r$1.registryFile)}.`),r.break(),process.exit(1));let c=s("Building registry..."),m=await To(s$1.data,n$1,o$2);for(let l of m.items)l.files=l.files?.filter((f,u,g)=>u===g.findIndex(h=>h.path===f.path)),l.dependencies&&(l.dependencies=l.dependencies.filter((f,u,g)=>u===g.findIndex(h=>h===f)));for(let l of m.items){if(!l.files)continue;c.start(`Building ${l.name}...`),l.$schema="https://ui.shadcn.com/schema/registry-item.json";for(let u of l.files){let g=j.resolve(r$1.cwd,u.path);try{if(!(await z.stat(g)).isFile())continue;u.content=await z.readFile(g,"utf-8");}catch(h){console.error("Error reading file in registry build:",g,h);continue}}let f=n.safeParse(l);if(!f.success){r.error(`Invalid registry item found for ${d.info(l.name)}.`);continue}await z.writeFile(j.resolve(r$1.outputDir,`${f.data.name}.json`),JSON.stringify(f.data,null,2));}if(await z.copyFile(r$1.registryFile,j.resolve(r$1.outputDir,"registry.json")),c.succeed("Building registry."),t.verbose){s(`The registry has ${d.info(m.items.length.toString())} items:`).succeed();for(let l of m.items){r.log(` - ${l.name} (${d.info(l.type)})`);for(let f of l.files??[])r.log(` - ${f.path}`);}}}catch(t){r.break(),V$1(t);}}async function To(e,t,i){for(let r of e.items)if(r.files?.length)for(let n of r.files){let o=await K(n.path,t,i);o.files=o.files?.filter(a=>a.path!==n.path),o.files&&r.files.push(...o.files),o.dependencies&&(r.dependencies=r.dependencies?r.dependencies.concat(o.dependencies):o.dependencies);}return e}var Ir=new Command().name("registry:mcp").description("starts the registry MCP server [DEPRECATED]").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async()=>{r.warn(`The ${d.info("shadcn registry:mcp")} command is deprecated. Use the ${d.info("shadcn mcp")} command instead.`),r.break();});var Ao=z$1.object({cwd:z$1.string(),query:z$1.string().optional(),limit:z$1.number().optional(),offset:z$1.number().optional()}),jr=new Command().name("search").alias("list").description("search items from registries").argument("<registries...>","the registry names or urls to search items from. Names must be prefixed with @.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-q, --query <query>","query string").option("-l, --limit <number>","maximum number of items to display per registry","100").option("-o, --offset <number>","number of items to skip","0").action(async(e,t)=>{try{let i$1=Ao.parse({cwd:j__default.resolve(t.cwd),query:t.query,limit:t.limit?parseInt(t.limit,10):void 0,offset:t.offset?parseInt(t.offset,10):void 0});await L(i$1.cwd);let r=m({style:"new-york",resolvedPaths:{cwd:i$1.cwd}}),n=N(r),o=j__default.resolve(i$1.cwd,"components.json");if(v.existsSync(o)){let l=await v.readJson(o),f=c.partial().parse(l);n=N({...r,...f});}let a=n;try{let l=await i(i$1.cwd);l&&(a=N(l));}catch{}let{config:s,newRegistries:c$1}=await V(e.map(l=>`${l}/registry`),a,{silent:!0,writeFile:!1});c$1.length>0&&(a.registries=s.registries),P(e,a);let m$1=await ja(e,{query:i$1.query,limit:i$1.limit,offset:i$1.offset,config:a});console.log(JSON.stringify(m$1,null,2)),process.exit(0);}catch(i){V$1(i);}finally{O();}});var _o=z$1.object({cwd:z$1.string()}),Tr=new Command().name("view").description("view items from the registry").argument("<items...>","the item names or URLs to view").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let i$1=_o.parse({cwd:j__default.resolve(t.cwd)});await L(i$1.cwd);let r=N({}),n=j__default.resolve(i$1.cwd,"components.json");if(v.existsSync(n)){let m=await v.readJson(n),l=c.partial().parse(m);r=N(l);}let o=r;try{let m=await i(i$1.cwd);m&&(o=N(m));}catch{}let{config:a,newRegistries:s}=await V(e,o,{silent:!0,writeFile:!1});s.length>0&&(o.registries=a.registries),P(e,o);let c$1=await X(e,{config:o});console.log(JSON.stringify(c$1,null,2)),process.exit(0);}catch(i){V$1(i);}finally{O();}});var Or={version:"3.6.27"};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function Wo(){let e=new Command().name("shadcn").description("add items from registries to your project").version(Or.version,"-v, --version","display the version number");e.addCommand(Wt).addCommand(cr).addCommand(tr).addCommand(pr).addCommand(Tr).addCommand(jr).addCommand(Sr).addCommand(fr).addCommand(nr).addCommand(Ze),e.addCommand(Cr).addCommand(Ir),e.parse();}Wo();//# sourceMappingURL=index.js.map
|
|
87
85
|
//# sourceMappingURL=index.js.map
|