shadcn 2.9.3 → 2.10.0

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.
@@ -1,4 +1,4 @@
1
- import { R, X, H } from './chunk-BJAN3BBB.js';
1
+ import { S, Y, I } from './chunk-P4EM45ZN.js';
2
2
  import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
3
  import { ListToolsRequestSchema, CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js';
4
4
  import { z } from 'zod';
@@ -27,11 +27,11 @@ var p=new Server({name:"shadcn",version:"0.0.1"},{capabilities:{resources:{},too
27
27
  - Before using any item, you need to add it first.
28
28
  - Adding the items will install all dependencies for the item and format the code as per the project.
29
29
  - Example components should not be installed directly unless asked. These components should be used as a reference to build other components.
30
- `}]}:{content:[{type:"text",text:"No items found in the registry"}]}}case"get_item":{let t=z.string().parse(r.params.arguments.name);if(!t)throw new Error("Name is required");let n=s(t,e),a=await R(n,"");return {content:[{type:"text",text:JSON.stringify(a,null,2)}]}}case"add_item":{let t=z.string().parse(r.params.arguments.name);if(!t)throw new Error("Name is required");let n=s(t,e);return await R(n,"")?{content:[{type:"text",text:`To install the ${t} item, run the following command:
30
+ `}]}:{content:[{type:"text",text:"No items found in the registry"}]}}case"get_item":{let t=z.string().parse(r.params.arguments.name);if(!t)throw new Error("Name is required");let n=s(t,e),a=await S(n,"");return {content:[{type:"text",text:JSON.stringify(a,null,2)}]}}case"add_item":{let t=z.string().parse(r.params.arguments.name);if(!t)throw new Error("Name is required");let n=s(t,e);return await S(n,"")?{content:[{type:"text",text:`To install the ${t} item, run the following command:
31
31
  \`\`\`bash
32
32
  npx shadcn@canary add ${n}
33
- \`\`\``}]}:{content:[{type:"text",text:`Item ${t} not found in the registry.`}]}}default:throw new Error(`Tool ${r.params.name} not found`)}}catch(e){throw e instanceof z.ZodError?new Error(`Invalid input: ${JSON.stringify(e.errors)}`):e}});async function u(r){let[e]=await X([r],{useCache:!1});return H.parse(e)}function s(r,e){return `${e.replace(/\/registry\.json$/,"")}/${r}.json`}
33
+ \`\`\``}]}:{content:[{type:"text",text:`Item ${t} not found in the registry.`}]}}default:throw new Error(`Tool ${r.params.name} not found`)}}catch(e){throw e instanceof z.ZodError?new Error(`Invalid input: ${JSON.stringify(e.errors)}`):e}});async function u(r){let[e]=await Y([r],{useCache:!1});return I.parse(e)}function s(r,e){return `${e.replace(/\/registry\.json$/,"")}/${r}.json`}
34
34
 
35
35
  export { p as a };
36
36
  //# sourceMappingURL=out.js.map
37
- //# sourceMappingURL=chunk-UBC2EX4X.js.map
37
+ //# sourceMappingURL=chunk-MLPJ4AFS.js.map
@@ -0,0 +1,31 @@
1
+ import { z } from 'zod';
2
+ import { promises } from 'fs';
3
+ import { tmpdir, homedir } from 'os';
4
+ import * as v from 'path';
5
+ import v__default from 'path';
6
+ import * as E from 'fs/promises';
7
+ import { createMatchPath, loadConfig } from 'tsconfig-paths';
8
+ import { Project, ScriptKind, SyntaxKind, QuoteKind } from 'ts-morph';
9
+ import M from 'fs-extra';
10
+ import J from 'fast-glob';
11
+ import { red, yellow, cyan, green } from 'kleur/colors';
12
+ import { cosmiconfig } from 'cosmiconfig';
13
+ import mt from 'ora';
14
+ import L from 'deepmerge';
15
+ import yt from 'stringify-object';
16
+ import { HttpsProxyAgent } from 'https-proxy-agent';
17
+ import It from 'node-fetch';
18
+
19
+ var ge=z.enum(["registry:lib","registry:block","registry:component","registry:ui","registry:hook","registry:page","registry:file","registry:theme","registry:style","registry:item","registry:example","registry:internal"]),Ae=z.discriminatedUnion("type",[z.object({path:z.string(),content:z.string().optional(),type:z.enum(["registry:file","registry:page"]),target:z.string()}),z.object({path:z.string(),content:z.string().optional(),type:ge.exclude(["registry:file","registry:page"]),target:z.string().optional()})]),Fe=z.object({config:z.object({content:z.array(z.string()).optional(),theme:z.record(z.string(),z.any()).optional(),plugins:z.array(z.string()).optional()}).optional()}),ee=z.object({theme:z.record(z.string(),z.string()).optional(),light:z.record(z.string(),z.string()).optional(),dark:z.record(z.string(),z.string()).optional()}),Ve=z.record(z.string(),z.lazy(()=>z.union([z.string(),z.record(z.string(),z.union([z.string(),z.record(z.string(),z.string())]))]))),Oe=z.record(z.string(),z.string()),I=z.object({$schema:z.string().optional(),extends:z.string().optional(),name:z.string(),type:ge,title:z.string().optional(),author:z.string().min(2).optional(),description:z.string().optional(),dependencies:z.array(z.string()).optional(),devDependencies:z.array(z.string()).optional(),registryDependencies:z.array(z.string()).optional(),files:z.array(Ae).optional(),tailwind:Fe.optional(),cssVars:ee.optional(),css:Ve.optional(),envVars:Oe.optional(),meta:z.record(z.string(),z.any()).optional(),docs:z.string().optional(),categories:z.array(z.string()).optional()}),Bt=z.object({name:z.string(),homepage:z.string(),items:z.array(I)}),te=z.array(I),de=z.array(z.object({name:z.string(),label:z.string()})),me=z.record(z.string(),z.record(z.string(),z.string())),ue=z.object({inlineColors:z.object({light:z.record(z.string(),z.string()),dark:z.record(z.string(),z.string())}),cssVars:ee,cssVarsV4:ee.optional(),inlineColorsTemplate:z.string(),cssVarsTemplate:z.string()}),he=I.pick({dependencies:!0,devDependencies:!0,files:!0,tailwind:!0,cssVars:!0,css:!0,envVars:!0,docs:!0});async function P(e,t){return createMatchPath(t.absoluteBaseUrl,t.paths)(e,void 0,()=>!0,[".ts",".tsx",".jsx",".js",".css"])}var ye=[".tsx",".ts",".jsx",".js",".css"],we=["lib/utils.ts"],_e=[/^(react|react-dom|next)(\/.*)?$/,/^(node|jsr|npm):.*$/],Ue=new Project({compilerOptions:{}});function We(e){if(_e.some(t=>t.test(e)))return null;if(!e.startsWith("@")&&e.includes("/")&&(e=e.split("/")[0]),e.startsWith("@")){let t=e.split("/");t.length>2&&(e=t.slice(0,2).join("/"));}return e}async function Me(e,t,r,s=new Set){let i=v.resolve(t.resolvedPaths.cwd,e),n=v.relative(t.resolvedPaths.cwd,i);if(we.includes(n))return {dependencies:[],files:[]};let l=v.extname(e);if(!ye.includes(l))return {dependencies:[],files:[]};if(s.has(n))return {dependencies:[],files:[]};if(s.add(n),!(await E.stat(i)).isFile())return {dependencies:[],files:[]};let u=await E.readFile(i,"utf-8"),b=await Be(v.basename(i)),p=Ue.createSourceFile(b,u,{scriptKind:ScriptKind.TSX}),T=await loadConfig(t.resolvedPaths.cwd);if(T.resultType==="failed")return {dependencies:[],files:[]};let g=[],A=new Set,F=xe(e),D={path:n,type:F,target:""};g.push(D);let c=p.getImportDeclarations();for(let V of c){let k=V.getModuleSpecifierValue(),N=k.startsWith(".");if(!k.startsWith(`${r.aliasPrefix}/`)&&!N){let S=We(k);S&&A.add(S);continue}let O=await P(k,T);if(N&&(O=v.resolve(v.dirname(i),k)),!O)continue;if(!v.extname(O))for(let S of ye){let fe=`${O}${S}`;try{await E.access(fe),O=fe;break}catch{continue}}let _=v.relative(t.resolvedPaths.cwd,O);if(s.has(_)||we.includes(_))continue;let Z=xe(k),pe={path:_,type:Z,target:""};(Z==="registry:page"||Z==="registry:file")&&(pe.target=k),g.push(pe);let U=await Me(_,t,r,s);if(U.files)for(let S of U.files)s.has(S.path)||(s.add(S.path),g.push(S));U.dependencies&&U.dependencies.forEach(S=>A.add(S));}let h=Array.from(new Map(g.map(V=>[V.path,V])).values());return {dependencies:Array.from(A),files:h}}async function Be(e){let t=await E.mkdtemp(v.join(tmpdir(),"shadcn-"));return v.join(t,e)}function xe(e){return e.includes("/ui/")?"registry:ui":e.includes("/lib/")?"registry:lib":e.includes("/hooks/")?"registry:hook":(e.includes("/components/"),"registry:component")}function Je(e){try{return new URL(e),!0}catch{return !1}}function $(e){return e.endsWith(".json")&&!Je(e)}function Zt(e){return !!e?.files?.length&&e.files.every(t=>!!t.target&&t.type==="registry:file")}var x={"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"}},"react-router":{name:"react-router",label:"React Router",links:{installation:"https://ui.shadcn.com/docs/installation/react-router",tailwind:"https://tailwindcss.com/docs/installation/framework-guides/react-router"}},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"}},"tanstack-start":{name:"tanstack-start",label:"TanStack Start",links:{installation:"https://ui.shadcn.com/docs/installation/tanstack",tailwind:"https://tailwindcss.com/docs/installation/using-postcss"}},gatsby:{name:"gatsby",label:"Gatsby",links:{installation:"https://ui.shadcn.com/docs/installation/gatsby",tailwind:"https://tailwindcss.com/docs/guides/gatsby"}},expo:{name:"expo",label:"Expo",links:{installation:"https://ui.shadcn.com/docs/installation/expo",tailwind:"https://www.nativewind.dev/docs/getting-started/installation"}},manual:{name:"manual",label:"Manual",links:{installation:"https://ui.shadcn.com/docs/installation/manual",tailwind:"https://tailwindcss.com/docs/installation"}}};function re(e="",t=!0){let r=v__default.join(e,"package.json");return M.readJSONSync(r,{throws:t})}var G=["**/node_modules/**",".next","public","dist","build"];z.object({compilerOptions:z.object({paths:z.record(z.string().or(z.array(z.string())))})});async function Y(e){let[t,r,s,i,n,l,d,u]=await Promise.all([J.glob("**/{next,vite,astro,app}.config.*|gatsby-config.*|composer.json|react-router.config.*",{cwd:e,deep:3,ignore:G}),M.pathExists(v__default.resolve(e,"src")),Ze(e),qe(e),Qe(e),be(e),Xe(e),re(e,!1)]),b=await M.pathExists(v__default.resolve(e,`${r?"src/":""}app`)),p={framework:x.manual,isSrcDir:r,isRSC:!1,isTsx:s,tailwindConfigFile:i,tailwindCssFile:n,tailwindVersion:l,aliasPrefix:d};if(t.find(g=>g.startsWith("next.config."))?.length)return p.framework=b?x["next-app"]:x["next-pages"],p.isRSC=b,p;if(t.find(g=>g.startsWith("astro.config."))?.length)return p.framework=x.astro,p;if(t.find(g=>g.startsWith("gatsby-config."))?.length)return p.framework=x.gatsby,p;if(t.find(g=>g.startsWith("composer.json"))?.length)return p.framework=x.laravel,p;if(Object.keys(u?.dependencies??{}).find(g=>g.startsWith("@remix-run/")))return p.framework=x.remix,p;if([...Object.keys(u?.dependencies??{}),...Object.keys(u?.devDependencies??{})].find(g=>g.startsWith("@tanstack/react-start")))return p.framework=x["tanstack-start"],p;if(t.find(g=>g.startsWith("react-router.config."))?.length)return p.framework=x["react-router"],p;if(t.find(g=>g.startsWith("vite.config."))?.length)return p.framework=x.vite,p;let T=t.find(g=>g.startsWith("app.config"));return T?.length&&(await M.readFile(v__default.resolve(e,T),"utf8")).includes("defineConfig")?(p.framework=x.vite,p):(u?.dependencies?.expo&&(p.framework=x.expo),p)}async function be(e){let[t,r]=await Promise.all([re(e,!1),B(e)]);return r?.tailwind?.config===""?"v4":!t?.dependencies?.tailwindcss&&!t?.devDependencies?.tailwindcss?null:/^(?:\^|~)?3(?:\.\d+)*(?:-.*)?$/.test(t?.dependencies?.tailwindcss||t?.devDependencies?.tailwindcss||"")?"v3":"v4"}async function Qe(e){let[t,r]=await Promise.all([J.glob(["**/*.css","**/*.scss"],{cwd:e,deep:5,ignore:G}),be(e)]);if(!t.length)return null;for(let i of t){let n=await M.readFile(v__default.resolve(e,i),"utf8");if(n.includes('@import "tailwindcss"')||n.includes("@import 'tailwindcss'")||n.includes("@tailwind base"))return i}return null}async function qe(e){let t=await J.glob("tailwind.config.*",{cwd:e,deep:3,ignore:G});return t.length?t[0]:null}async function Xe(e){let t=await loadConfig(e);if(t?.resultType==="failed"||!Object.entries(t?.paths).length)return null;for(let[r,s]of Object.entries(t.paths))if(s.includes("./*")||s.includes("./src/*")||s.includes("./app/*")||s.includes("./resources/js/*"))return r.replace(/\/\*$/,"")??null;return Object.keys(t?.paths)?.[0].replace(/\/\*$/,"")??null}async function Ze(e){return (await J.glob("tsconfig.*",{cwd:e,deep:1,ignore:G})).length>0}async function yr(e,t=null){let[r,s]=await Promise.all([B(e),t?Promise.resolve(t):Y(e)]);if(r)return r;if(!s||!s.tailwindCssFile||s.tailwindVersion==="v3"&&!s.tailwindConfigFile)return null;let i={$schema:"https://ui.shadcn.com/schema.json",rsc:s.isRSC,tsx:s.isTsx,style:"new-york",tailwind:{config:s.tailwindConfigFile??"",baseColor:"zinc",css:s.tailwindCssFile,cssVariables:!0,prefix:""},iconLibrary:"lucide",aliases:{components:`${s.aliasPrefix}/components`,ui:`${s.aliasPrefix}/components/ui`,hooks:`${s.aliasPrefix}/hooks`,lib:`${s.aliasPrefix}/lib`,utils:`${s.aliasPrefix}/lib/utils`}};return await se(e,i)}async function Pe(e){if(!e.resolvedPaths?.cwd)return "v3";let t=await Y(e.resolvedPaths.cwd);return t?.tailwindVersion?t.tailwindVersion:null}var w={error:red,warn:yellow,info:cyan,success:green};var Ir="@/components",Lr="@/lib/utils",Rr="app/globals.css",Ar="tailwind.config.js";var at=cosmiconfig("components",{searchPlaces:["components.json"]}),ve=z.object({$schema:z.string().optional(),style:z.string(),rsc:z.coerce.boolean().default(!1),tsx:z.coerce.boolean().default(!0),tailwind:z.object({config:z.string().optional(),css:z.string(),baseColor:z.string(),cssVariables:z.boolean().default(!0),prefix:z.string().default("").optional()}),aliases:z.object({components:z.string(),utils:z.string(),ui:z.string().optional(),lib:z.string().optional(),hooks:z.string().optional()}),iconLibrary:z.string().optional()}).strict(),Se=ve.extend({resolvedPaths:z.object({cwd:z.string(),tailwindConfig:z.string(),tailwindCss:z.string(),utils:z.string(),components:z.string(),lib:z.string(),hooks:z.string(),ui:z.string()})}),lt=z.record(Se);async function B(e){let t=await ct(e);return t?(t.iconLibrary||(t.iconLibrary=t.style==="new-york"?"radix":"lucide"),await se(e,t)):null}async function se(e,t){let r=await loadConfig(e);if(r.resultType==="failed")throw new Error(`Failed to load ${t.tsx?"tsconfig":"jsconfig"}.json. ${r.message??""}`.trim());return Se.parse({...t,resolvedPaths:{cwd:e,tailwindConfig:t.tailwind.config?v__default.resolve(e,t.tailwind.config):"",tailwindCss:v__default.resolve(e,t.tailwind.css),utils:await P(t.aliases.utils,r),components:await P(t.aliases.components,r),ui:t.aliases.ui?await P(t.aliases.ui,r):v__default.resolve(await P(t.aliases.components,r)??e,"ui"),lib:t.aliases.lib?await P(t.aliases.lib,r):v__default.resolve(await P(t.aliases.utils,r)??e,".."),hooks:t.aliases.hooks?await P(t.aliases.hooks,r):v__default.resolve(await P(t.aliases.components,r)??e,"..","hooks")}})}async function ct(e){try{let t=await at.search(e);return t?ve.parse(t.config):null}catch{let r=`${e}/components.json`;throw new Error(`Invalid configuration found in ${w.info(r)}.`)}}async function Fr(e){let t={};for(let s of Object.keys(e.aliases)){if(!ft(s,e))continue;let i=e.resolvedPaths[s],n=await pt(e.resolvedPaths.cwd,i);if(!n){t[s]=e;continue}t[s]=await B(n);}let r=lt.safeParse(t);return r.success?r.data:null}async function pt(e,t){let r=gt(e,t),s=v__default.relative(r,t),n=(await J.glob("**/package.json",{cwd:r,deep:3,ignore:["**/node_modules/**","**/dist/**","**/build/**","**/public/**"]})).map(l=>v__default.dirname(l)).find(l=>s.startsWith(l));return n?v__default.join(r,n):null}function ft(e,t){return Object.keys(t.resolvedPaths).filter(r=>r!=="utils").includes(e)}function gt(e,t){let r=e.split(v__default.sep),s=t.split(v__default.sep),i=[];for(let n=0;n<Math.min(r.length,s.length)&&r[n]===s[n];n++)i.push(r[n]);return i.join(v__default.sep)}async function ie(e,t){return (await Y(e))?.tailwindVersion==="v4"?"new-york-v4":t}function Vr(e){let t={resolvedPaths:{cwd:process.cwd(),tailwindConfig:"",tailwindCss:"",utils:"",components:"",ui:"",lib:"",hooks:""},style:"",tailwind:{config:"",css:"",baseColor:"",cssVariables:!1},rsc:!1,tsx:!0,aliases:{components:"",utils:""}};return e?{...t,...e,resolvedPaths:{...t.resolvedPaths,...e.resolvedPaths||{}},tailwind:{...t.tailwind,...e.tailwind||{}},aliases:{...t.aliases,...e.aliases||{}}}:t}var m={error(...e){console.log(w.error(e.join(" ")));},warn(...e){console.log(w.warn(e.join(" ")));},info(...e){console.log(w.info(e.join(" ")));},success(...e){console.log(w.success(e.join(" ")));},log(...e){console.log(e.join(" "));},break(){console.log("");}};function C(e){if(m.error("Something went wrong. Please check the error below for more details."),m.error("If the problem persists, please open an issue on GitHub."),m.error(""),typeof e=="string"&&(m.error(e),m.break(),process.exit(1)),e instanceof z.ZodError){m.error("Validation failed:");for(let[t,r]of Object.entries(e.flatten().fieldErrors))m.error(`- ${w.info(t)}: ${r}`);m.break(),process.exit(1);}e instanceof Error&&(m.error(e.message),m.break(),process.exit(1)),m.break(),process.exit(1);}function Ce(e,t){return mt({text:e,isSilent:t?.silent})}async function rs(e,t,r){if(!e||(r={silent:!1,tailwindVersion:"v3",...r},r.tailwindVersion==="v4"))return;let s=v__default.relative(t.resolvedPaths.cwd,t.resolvedPaths.tailwindConfig),i=Ce(`Updating ${w.info(s)}`,{silent:r.silent}).start(),n=await promises.readFile(t.resolvedPaths.tailwindConfig,"utf8"),l=await bt(n,e,t);await promises.writeFile(t.resolvedPaths.tailwindConfig,l,"utf8"),i?.succeed();}async function bt(e,t,r){let s=await ke(e,r),i=s.getDescendantsOfKind(SyntaxKind.ObjectLiteralExpression).find(l=>l.getProperties().some(d=>d.isKind(SyntaxKind.PropertyAssignment)&&d.getName()==="content"));if(!i)return e;let n=Ct(i);return Pt(i,{name:"darkMode",value:"class"},{quoteChar:n}),t.plugins?.forEach(l=>{St(i,l);}),t.theme&&await vt(i,t.theme),s.getFullText()}function Pt(e,t,{quoteChar:r}){let s=e.getProperty("darkMode");if(!s){let i={name:t.name,initializer:`[${r}${t.value}${r}]`};return t.name==="darkMode"?(e.insertPropertyAssignment(0,i),e):(e.addPropertyAssignment(i),e)}if(s.isKind(SyntaxKind.PropertyAssignment)){let i=s.getInitializer(),n=`${r}${t.value}${r}`;if(i?.isKind(SyntaxKind.StringLiteral)){let l=i.getText();return i.replaceWithText(`[${l}, ${n}]`),e}if(i?.isKind(SyntaxKind.ArrayLiteralExpression)){if(i.getElements().map(l=>l.getText()).includes(n))return e;i.addElement(n);}return e}return e}async function vt(e,t){e.getProperty("theme")||e.addPropertyAssignment({name:"theme",initializer:"{}"}),oe(e);let s=(e.getPropertyOrThrow("theme")?.asKindOrThrow(SyntaxKind.PropertyAssignment)).getInitializer();if(s?.isKind(SyntaxKind.ObjectLiteralExpression)){let i=s.getText(),n=await Tt(i),l=L(n,t,{arrayMerge:(u,b)=>b}),d=yt(l).replace(/\'\.\.\.(.*)\'/g,"...$1").replace(/\'\"/g,"'").replace(/\"\'/g,"'").replace(/\'\[/g,"[").replace(/\]\'/g,"]").replace(/\'\\\'/g,"'").replace(/\\\'/g,"'").replace(/\\\'\'/g,"'").replace(/\'\'/g,"'");s.replaceWithText(d);}ae(e);}function St(e,t){let r=e.getProperty("plugins");if(!r)return e.addPropertyAssignment({name:"plugins",initializer:`[${t}]`}),e;if(r.isKind(SyntaxKind.PropertyAssignment)){let s=r.getInitializer();if(s?.isKind(SyntaxKind.ArrayLiteralExpression)){if(s.getElements().map(i=>i.getText().replace(/["']/g,"")).includes(t.replace(/["']/g,"")))return e;s.addElement(t);}return e}return e}async function ke(e,t){let r=await promises.mkdtemp(v__default.join(tmpdir(),"shadcn-")),s=t?.resolvedPaths?.tailwindConfig||"tailwind.config.ts",i=v__default.join(r,`shadcn-${v__default.basename(s)}`);return new Project({compilerOptions:{}}).createSourceFile(i,e,{scriptKind:v__default.extname(s)===".ts"?ScriptKind.TS:ScriptKind.JS})}function Ct(e){return e.getFirstDescendantByKind(SyntaxKind.StringLiteral)?.getQuoteKind()===QuoteKind.Single?"'":'"'}function oe(e){let t=e.getProperties();for(let r=0;r<t.length;r++){let s=t[r];if(s.isKind(SyntaxKind.SpreadAssignment)){let i=s.asKindOrThrow(SyntaxKind.SpreadAssignment),n=i.getExpression().getText();e.insertPropertyAssignment(r,{name:`"___${n.replace(/^\.\.\./,"")}"`,initializer:`"...${n.replace(/^\.\.\./,"")}"`}),i.remove();}else if(s.isKind(SyntaxKind.PropertyAssignment)){let n=s.asKindOrThrow(SyntaxKind.PropertyAssignment).getInitializer();n&&n.isKind(SyntaxKind.ObjectLiteralExpression)?oe(n.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)):n&&n.isKind(SyntaxKind.ArrayLiteralExpression)&&Ee(n.asKindOrThrow(SyntaxKind.ArrayLiteralExpression));}}}function Ee(e){let t=e.getElements();for(let r=0;r<t.length;r++){let s=t[r];if(s.isKind(SyntaxKind.ObjectLiteralExpression))oe(s.asKindOrThrow(SyntaxKind.ObjectLiteralExpression));else if(s.isKind(SyntaxKind.ArrayLiteralExpression))Ee(s.asKindOrThrow(SyntaxKind.ArrayLiteralExpression));else if(s.isKind(SyntaxKind.SpreadElement)){let i=s.getText();e.removeElement(r),e.insertElement(r,`"${i}"`);}}}function ae(e){let t=e.getProperties();for(let r=0;r<t.length;r++){let s=t[r];if(s.isKind(SyntaxKind.PropertyAssignment)){let i=s,n=i.getInitializer();if(n&&n.isKind(SyntaxKind.StringLiteral)){let l=n.asKindOrThrow(SyntaxKind.StringLiteral).getLiteralValue();l.startsWith("...")&&(e.insertSpreadAssignment(r,{expression:l.slice(3)}),i.remove());}else n?.isKind(SyntaxKind.ObjectLiteralExpression)?ae(n):n&&n.isKind(SyntaxKind.ArrayLiteralExpression)&&je(n.asKindOrThrow(SyntaxKind.ArrayLiteralExpression));}}}function je(e){let t=e.getElements();for(let r=0;r<t.length;r++){let s=t[r];if(s.isKind(SyntaxKind.ObjectLiteralExpression))ae(s.asKindOrThrow(SyntaxKind.ObjectLiteralExpression));else if(s.isKind(SyntaxKind.ArrayLiteralExpression))je(s.asKindOrThrow(SyntaxKind.ArrayLiteralExpression));else if(s.isKind(SyntaxKind.StringLiteral)){let i=s.getText(),n=/(?:^['"])(\.\.\..*)(?:['"]$)/g;n.test(i)&&(e.removeElement(r),e.insertElement(r,i.replace(n,"$1")));}}}async function Tt(e){let r=(await ke(`const theme = ${e}`,null)).getStatements()[0];if(r?.getKind()===SyntaxKind.VariableStatement){let i=(r.getDeclarationList()?.getDeclarations()[0]).getInitializer();if(i?.isKind(SyntaxKind.ObjectLiteralExpression))return await H(i)}throw new Error("Invalid input: not an object literal")}function H(e){let t={};for(let r of e.getProperties())if(r.isKind(SyntaxKind.PropertyAssignment)){let s=r.getName().replace(/\'/g,"");r.getInitializer()?.isKind(SyntaxKind.ObjectLiteralExpression)?t[s]=H(r.getInitializer()):r.getInitializer()?.isKind(SyntaxKind.ArrayLiteralExpression)?t[s]=Ie(r.getInitializer()):t[s]=le(r.getInitializer());}return t}function Ie(e){let t=[];for(let r of e.getElements())r.isKind(SyntaxKind.ObjectLiteralExpression)?t.push(H(r.asKindOrThrow(SyntaxKind.ObjectLiteralExpression))):r.isKind(SyntaxKind.ArrayLiteralExpression)?t.push(Ie(r.asKindOrThrow(SyntaxKind.ArrayLiteralExpression))):t.push(le(r));return t}function le(e){switch(e.getKind()){case SyntaxKind.StringLiteral:return e.getText();case SyntaxKind.NumericLiteral:return Number(e.getText());case SyntaxKind.TrueKeyword:return !0;case SyntaxKind.FalseKeyword:return !1;case SyntaxKind.NullKeyword:return null;case SyntaxKind.ArrayLiteralExpression:return e.getElements().map(le);case SyntaxKind.ObjectLiteralExpression:return H(e);default:return e.getText()}}function Le(e){let t={};for(let r of Object.keys(e)){let s=r.split("-"),i=s[0],n=s.slice(1).join("-");n===""?typeof t[i]=="object"?t[i].DEFAULT=`hsl(var(--${r}))`:t[i]=`hsl(var(--${r}))`:(typeof t[i]!="object"&&(t[i]={DEFAULT:`hsl(var(--${i}))`}),t[i][n]=`hsl(var(--${r}))`);}for(let[r,s]of Object.entries(t))typeof s=="object"&&s.DEFAULT===`hsl(var(--${r}))`&&!(r in e)&&delete s.DEFAULT;return t}var Rt=process.env.REGISTRY_URL??"https://ui.shadcn.com/r",At=process.env.https_proxy?new HttpsProxyAgent(process.env.https_proxy):void 0,Q=new Map,Ft=[{name:"neutral",label:"Neutral"},{name:"gray",label:"Gray"},{name:"zinc",label:"Zinc"},{name:"stone",label:"Stone"},{name:"slate",label:"Slate"}];async function Vt(){try{let[e]=await j(["index.json"]);return te.parse(e)}catch(e){m.error(`
20
+ `),C(e);}}async function bs(){try{let[e]=await j(["styles/index.json"]);return de.parse(e)}catch(e){return m.error(`
21
+ `),C(e),[]}}async function Ps(){try{let[e]=await j(["icons/index.json"]);return me.parse(e)}catch(e){return C(e),{}}}async function q(e,t){try{if($(e))return await Ot(e);let[r]=await j([R(e)?e:`styles/${t}/${e}.json`]);return I.parse(r)}catch(r){return m.break(),C(r),null}}async function Ot(e){try{let t=e;e.startsWith("~/")&&(t=v__default.join(homedir(),e.slice(2)));let r=v__default.resolve(t),s=await promises.readFile(r,"utf8"),i=JSON.parse(s);return I.parse(i)}catch(t){return m.error(`Failed to read local registry file: ${e}`),C(t),null}}async function vs(){return Ft}async function $t(e){try{let[t]=await j([`colors/${e}.json`]);return ue.parse(t)}catch(t){C(t);}}async function Kt(e,t){let r=[];for(let s of t){let i=e.find(n=>n.name===s);if(i&&(r.push(i),i.registryDependencies)){let n=await Kt(e,i.registryDependencies);r.push(...n);}}return r.filter((s,i,n)=>n.findIndex(l=>l.name===s.name)===i)}async function Ss(e,t){try{let r=t.map(i=>`styles/${e}/${i.name}.json`),s=await j(r);return te.parse(s)}catch(r){C(r);}}async function Cs(e,t,r){if(r)return r;if(t.type==="registry:ui")return e.resolvedPaths.ui??e.resolvedPaths.components;let[s,i]=t.type?.split(":")??[];return s in e.resolvedPaths?v__default.join(e.resolvedPaths[s],i):null}async function j(e,t={}){t={useCache:!0,...t};try{return await Promise.all(e.map(async s=>{let i=Re(s);if(t.useCache&&Q.has(i))return Q.get(i);let n=(async()=>{let l=await It(i,{agent:At});if(!l.ok){let d={400:"Bad request",401:"Unauthorized",403:"Forbidden",404:"Not found",500:"Internal server error"};if(l.status===401)throw new Error(`You are not authorized to access the component at ${w.info(i)}.
22
+ If this is a remote registry, you may need to authenticate.`);if(l.status===404)throw new Error(`The component at ${w.info(i)} was not found.
23
+ It may not exist at the registry. Please make sure it is a valid component.`);if(l.status===403)throw new Error(`You do not have access to the component at ${w.info(i)}.
24
+ If this is a remote registry, you may need to authenticate or a token.`);let u=await l.json(),b=u&&typeof u=="object"&&"error"in u?u.error:l.statusText||d[l.status];throw new Error(`Failed to fetch from ${w.info(i)}.
25
+ ${b}`)}return l.json()})();return t.useCache&&Q.set(i,n),n}))}catch(r){return m.error(`
26
+ `),C(r),[]}}function Ts(){Q.clear();}async function X(e,t,r=new Set){let s=[],i=[];for(let n of e)if(!r.has(n)){if(r.add(n),R(n)||$(n)){let l=await q(n,"");if(l&&(s.push(l),l.registryDependencies)){let d=await X(l.registryDependencies,t,r);s.push(...d.items),i.push(...d.registryNames);}}else if(i.push(n),t){let l=t.resolvedPaths?.cwd?await ie(t.resolvedPaths.cwd,t.style):t.style;try{let d=await q(n,l);if(d&&d.registryDependencies){let u=await X(d.registryDependencies,t,r);s.push(...u.items),i.push(...u.registryNames);}}catch{}}}return {items:s,registryNames:i}}async function zt(e,t){try{let r=e.filter(c=>$(c)),s=e.filter(c=>R(c)),i=e.filter(c=>!$(c)&&!R(c)),n=[],l=[];for(let c of r){let h=await q(c,"");h&&(n.push(h),h.registryDependencies&&l.push(...h.registryDependencies));}for(let c of s){let h=await q(c,"");h&&(n.push(h),h.registryDependencies&&l.push(...h.registryDependencies));}let{items:d,registryNames:u}=await X(l,t);n.push(...d);let b=[...i,...u];if(b.length>0){if(await Vt()){let h=Array.from(new Set(b));h.includes("index")&&h.unshift("index");let V=await _t(h,t),k=await j(V),N=z.array(I).parse(k);n.push(...N);}else if(n.length===0)return null}if(!n.length)return null;if(b.includes("index")&&t.tailwind.baseColor){let c=await Nt(t.tailwind.baseColor,t);c&&n.unshift(c);}n.sort((c,h)=>c.type==="registry:theme"?-1:1);let p={};n.forEach(c=>{p=L(p,c.tailwind??{});});let T={};n.forEach(c=>{T=L(T,c.cssVars??{});});let g={};n.forEach(c=>{g=L(g,c.css??{});});let A="";n.forEach(c=>{c.docs&&(A+=`${c.docs}
27
+ `);});let F={};n.forEach(c=>{F=L(F,c.envVars??{});});let D=he.parse({dependencies:L.all(n.map(c=>c.dependencies??[])),devDependencies:L.all(n.map(c=>c.devDependencies??[])),files:L.all(n.map(c=>c.files??[])),tailwind:p,cssVars:T,css:g,docs:A});return Object.keys(F).length>0&&(D.envVars=F),D}catch(r){return C(r),null}}async function Dt(e,t){let{registryNames:r}=await X([e],t),s=t.resolvedPaths?.cwd?await ie(t.resolvedPaths.cwd,t.style):t.style,i=r.map(n=>Re(R(n)?n:`styles/${s}/${n}.json`));return Array.from(new Set(i))}async function Nt(e,t){let[r,s]=await Promise.all([$t(e),Pe(t)]);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:{theme:{},light:{radius:"0.5rem"},dark:{}}};return t.tailwind.cssVariables&&(i.tailwind.config.theme.extend.colors={...i.tailwind.config.theme.extend.colors,...Le(r.cssVars.dark??{})},i.cssVars={theme:{...r.cssVars.theme,...i.cssVars.theme},light:{...r.cssVars.light,...i.cssVars.light},dark:{...r.cssVars.dark,...i.cssVars.dark}},s==="v4"&&r.cssVarsV4&&(i.cssVars={theme:{...r.cssVarsV4.theme,...i.cssVars.theme},light:{radius:"0.625rem",...r.cssVarsV4.light},dark:{...r.cssVarsV4.dark}})),i}function Re(e){if(R(e)){let t=new URL(e);return t.pathname.match(/\/chat\/b\//)&&!t.pathname.endsWith("/json")&&(t.pathname=`${t.pathname}/json`),t.toString()}return `${Rt}/${e}`}function R(e){try{return new URL(e),!0}catch{return !1}}async function _t(e,t){let r=[],s=e.filter(i=>!$(i)&&!R(i));for(let i of s){let n=await Dt(i,t);r.push(...n);}return Array.from(new Set(r))}function ks(){return new Map([["registry:ui","ui"],["registry:lib","lib"],["registry:hook","hooks"],["registry:block","components"],["registry:component","components"]])}function Es(e){let t=new Map;return e.forEach(r=>{r.registryDependencies&&r.registryDependencies.forEach(s=>{t.set(s,r);});}),t}
28
+
29
+ export { Nt as $, Ct as A, ge as B, Ae as C, Fe as D, ee as E, Ve as F, Oe as G, I as H, Bt as I, te as J, de as K, me as L, ue as M, he as N, Ft as O, Vt as P, bs as Q, Ps as R, q as S, vs as T, $t as U, Kt as V, Ss as W, Cs as X, j as Y, Ts as Z, zt as _, w as a, R as aa, P as b, _t as ba, Ir as c, ks as ca, Lr as d, Es as da, Rr as e, Ar as f, ve as g, B as h, se as i, Fr as j, pt as k, gt as l, Vr as m, re as n, Y as o, yr as p, Pe as q, m as r, Ce as s, Me as t, Je as u, $ as v, Zt as w, C as x, rs as y, ke as z };
30
+ //# sourceMappingURL=out.js.map
31
+ //# sourceMappingURL=chunk-P4EM45ZN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/registry/schema.ts","../src/registry/api.ts","../src/registry/utils.ts","../src/utils/resolve-import.ts","../src/utils/get-config.ts","../src/utils/get-project-info.ts","../src/utils/frameworks.ts","../src/utils/get-package-info.ts","../src/utils/highlighter.ts","../src/utils/logger.ts","../src/utils/handle-error.ts","../src/utils/updaters/update-tailwind-config.ts","../src/utils/spinner.ts"],"names":["z","registryItemTypeSchema","registryItemFileSchema","registryItemTailwindSchema","registryItemCssVarsSchema","registryItemCssSchema","registryItemEnvVarsSchema","registryItemSchema","registrySchema","registryIndexSchema","stylesSchema","iconsSchema","registryBaseColorSchema","registryResolvedItemsTreeSchema","fs","homedir","path","tmpdir","createMatchPath","resolveImport","importPath","config","Project","ScriptKind","loadConfig","FILE_EXTENSIONS_FOR_LOOKUP","FILE_PATH_SKIP_LIST","DEPENDENCY_SKIP_LIST","project","getDependencyFromModuleSpecifier","moduleSpecifier","pattern","parts","recursivelyResolveFileImports","filePath","projectInfo","processedFiles","resolvedFilePath","relativeRegistryFilePath","fileExtension","content","tempFile","createTempSourceFile","sourceFile","tsConfig","files","dependencies","fileType","determineFileType","originalFile","importStatements","importStatement","isRelativeImport","dependency","probableImportFilePath","ext","pathWithExt","nestedRelativeRegistryFilePath","file","nestedResults","dep","uniqueFiles","filename","dir","isUrl","isLocalFile","isUniversalRegistryItem","registryItem","FRAMEWORKS","getPackageInfo","cwd","shouldThrow","packageJsonPath","fg","PROJECT_SHARED_IGNORE","TS_CONFIG_SCHEMA","getProjectInfo","configFiles","isSrcDir","isTsx","tailwindConfigFile","tailwindCssFile","tailwindVersion","aliasPrefix","packageJson","isTypeScriptProject","getTailwindConfigFile","getTailwindCssFile","getTailwindVersion","getTsConfigAliasPrefix","isUsingAppDir","type","appConfig","packageInfo","getConfig","needle","contents","alias","paths","getProjectConfig","defaultProjectInfo","existingConfig","resolveConfigPaths","getProjectTailwindVersionFromConfig","cyan","green","red","yellow","highlighter","cosmiconfig","DEFAULT_COMPONENTS","DEFAULT_UTILS","DEFAULT_TAILWIND_CSS","DEFAULT_TAILWIND_CONFIG","explorer","rawConfigSchema","configSchema","workspaceConfigSchema","getRawConfig","configResult","componentPath","getWorkspaceConfig","resolvedAliases","key","isAliasKey","resolvedPath","packageRoot","findPackageRoot","result","commonRoot","findCommonRoot","relativePath","matchingPackageRoot","pkgPath","pkgDir","parts1","parts2","commonParts","i","getTargetStyleFromConfig","fallback","createConfig","partial","defaultConfig","logger","args","handleError","error","value","ora","spinner","text","options","deepmerge","objectToString","QuoteKind","SyntaxKind","updateTailwindConfig","tailwindConfig","tailwindFileRelativePath","tailwindSpinner","raw","output","transformTailwindConfig","input","_createSourceFile","configObject","node","property","quoteChar","_getQuoteChar","addTailwindConfigProperty","plugin","addTailwindConfigPlugin","addTailwindConfigTheme","existingProperty","newProperty","initializer","newValue","initializerText","element","theme","nestSpreadProperties","themeInitializer","themeObjectString","themeObject","parseObjectLiteral","dst","src","resultString","unnestSpreadProperties","existingPlugins","obj","properties","prop","spreadAssignment","spreadText","nestSpreadElements","arr","elements","j","propAssignment","unsetSpreadElements","spreadTest","objectLiteralString","statement","parseObjectLiteralExpression","name","parseArrayLiteralExpression","parseValue","buildTailwindThemeColorsFromCssVars","cssVars","colorName","subType","HttpsProxyAgent","fetch","REGISTRY_URL","agent","registryCache","BASE_COLORS","getRegistryIndex","fetchRegistry","getRegistryStyles","getRegistryIcons","getRegistryItem","style","getLocalRegistryItem","expandedPath","parsed","getRegistryBaseColors","getRegistryBaseColor","baseColor","resolveTree","index","names","tree","entry","component","self","c","fetchTree","item","getItemTargetPath","override","parent","url","getRegistryUrl","fetchPromise","response","errorMessages","message","clearRegistryCache","resolveDependenciesRecursively","visited","items","registryNames","nested","registryResolveItemsTree","localFiles","urls","payload","allDependencies","localFile","dependencyItems","dependencyRegistryNames","allRegistryNames","uniqueRegistryNames","registryItems","resolveRegistryItems","registryPayload","registryGetTheme","a","b","tailwind","css","docs","envVars","resolveRegistryDependencies","registryDependencies","itemRegistryDependencies","getRegistryTypeAliasMap","getRegistryParentMap","map"],"mappings":"AAAA,OAAS,KAAAA,MAAS,MAKX,IAAMC,GAAyBD,EAAE,KAAK,CAC3C,eACA,iBACA,qBACA,cACA,gBACA,gBACA,gBACA,iBACA,iBACA,gBAGA,mBACA,mBACF,CAAC,EAEYE,GAAyBF,EAAE,mBAAmB,OAAQ,CAEjEA,EAAE,OAAO,CACP,KAAMA,EAAE,OAAO,EACf,QAASA,EAAE,OAAO,EAAE,SAAS,EAC7B,KAAMA,EAAE,KAAK,CAAC,gBAAiB,eAAe,CAAC,EAC/C,OAAQA,EAAE,OAAO,CACnB,CAAC,EACDA,EAAE,OAAO,CACP,KAAMA,EAAE,OAAO,EACf,QAASA,EAAE,OAAO,EAAE,SAAS,EAC7B,KAAMC,GAAuB,QAAQ,CAAC,gBAAiB,eAAe,CAAC,EACvE,OAAQD,EAAE,OAAO,EAAE,SAAS,CAC9B,CAAC,CACH,CAAC,EAEYG,GAA6BH,EAAE,OAAO,CACjD,OAAQA,EACL,OAAO,CACN,QAASA,EAAE,MAAMA,EAAE,OAAO,CAAC,EAAE,SAAS,EACtC,MAAOA,EAAE,OAAOA,EAAE,OAAO,EAAGA,EAAE,IAAI,CAAC,EAAE,SAAS,EAC9C,QAASA,EAAE,MAAMA,EAAE,OAAO,CAAC,EAAE,SAAS,CACxC,CAAC,EACA,SAAS,CACd,CAAC,EAEYI,GAA4BJ,EAAE,OAAO,CAChD,MAAOA,EAAE,OAAOA,EAAE,OAAO,EAAGA,EAAE,OAAO,CAAC,EAAE,SAAS,EACjD,MAAOA,EAAE,OAAOA,EAAE,OAAO,EAAGA,EAAE,OAAO,CAAC,EAAE,SAAS,EACjD,KAAMA,EAAE,OAAOA,EAAE,OAAO,EAAGA,EAAE,OAAO,CAAC,EAAE,SAAS,CAClD,CAAC,EAEYK,GAAwBL,EAAE,OACrCA,EAAE,OAAO,EACTA,EAAE,KAAK,IACLA,EAAE,MAAM,CACNA,EAAE,OAAO,EACTA,EAAE,OACAA,EAAE,OAAO,EACTA,EAAE,MAAM,CAACA,EAAE,OAAO,EAAGA,EAAE,OAAOA,EAAE,OAAO,EAAGA,EAAE,OAAO,CAAC,CAAC,CAAC,CACxD,CACF,CAAC,CACH,CACF,EAEaM,GAA4BN,EAAE,OAAOA,EAAE,OAAO,EAAGA,EAAE,OAAO,CAAC,EAE3DO,EAAqBP,EAAE,OAAO,CACzC,QAASA,EAAE,OAAO,EAAE,SAAS,EAC7B,QAASA,EAAE,OAAO,EAAE,SAAS,EAC7B,KAAMA,EAAE,OAAO,EACf,KAAMC,GACN,MAAOD,EAAE,OAAO,EAAE,SAAS,EAC3B,OAAQA,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,EACnC,YAAaA,EAAE,OAAO,EAAE,SAAS,EACjC,aAAcA,EAAE,MAAMA,EAAE,OAAO,CAAC,EAAE,SAAS,EAC3C,gBAAiBA,EAAE,MAAMA,EAAE,OAAO,CAAC,EAAE,SAAS,EAC9C,qBAAsBA,EAAE,MAAMA,EAAE,OAAO,CAAC,EAAE,SAAS,EACnD,MAAOA,EAAE,MAAME,EAAsB,EAAE,SAAS,EAChD,SAAUC,GAA2B,SAAS,EAC9C,QAASC,GAA0B,SAAS,EAC5C,IAAKC,GAAsB,SAAS,EACpC,QAASC,GAA0B,SAAS,EAC5C,KAAMN,EAAE,OAAOA,EAAE,OAAO,EAAGA,EAAE,IAAI,CAAC,EAAE,SAAS,EAC7C,KAAMA,EAAE,OAAO,EAAE,SAAS,EAC1B,WAAYA,EAAE,MAAMA,EAAE,OAAO,CAAC,EAAE,SAAS,CAC3C,CAAC,EAIYQ,GAAiBR,EAAE,OAAO,CACrC,KAAMA,EAAE,OAAO,EACf,SAAUA,EAAE,OAAO,EACnB,MAAOA,EAAE,MAAMO,CAAkB,CACnC,CAAC,EAIYE,GAAsBT,EAAE,MAAMO,CAAkB,EAEhDG,GAAeV,EAAE,MAC5BA,EAAE,OAAO,CACP,KAAMA,EAAE,OAAO,EACf,MAAOA,EAAE,OAAO,CAClB,CAAC,CACH,EAEaW,GAAcX,EAAE,OAC3BA,EAAE,OAAO,EACTA,EAAE,OAAOA,EAAE,OAAO,EAAGA,EAAE,OAAO,CAAC,CACjC,EAEaY,GAA0BZ,EAAE,OAAO,CAC9C,aAAcA,EAAE,OAAO,CACrB,MAAOA,EAAE,OAAOA,EAAE,OAAO,EAAGA,EAAE,OAAO,CAAC,EACtC,KAAMA,EAAE,OAAOA,EAAE,OAAO,EAAGA,EAAE,OAAO,CAAC,CACvC,CAAC,EACD,QAASI,GACT,UAAWA,GAA0B,SAAS,EAC9C,qBAAsBJ,EAAE,OAAO,EAC/B,gBAAiBA,EAAE,OAAO,CAC5B,CAAC,EAEYa,GAAkCN,EAAmB,KAAK,CACrE,aAAc,GACd,gBAAiB,GACjB,MAAO,GACP,SAAU,GACV,QAAS,GACT,IAAK,GACL,QAAS,GACT,KAAM,EACR,CAAC,ECtID,OAAS,YAAYO,OAAU,KAC/B,OAAS,WAAAC,OAAe,KACxB,OAAOC,OAAU,OCFjB,UAAYF,MAAQ,cACpB,OAAS,UAAAG,OAAc,KACvB,UAAYD,MAAU,OCFtB,OAAS,mBAAAE,OAAuD,iBAEhE,eAAsBC,EACpBC,EACAC,EACA,CACA,OAAOH,GAAgBG,EAAO,gBAAiBA,EAAO,KAAK,EACzDD,EACA,OACA,IAAM,GACN,CAAC,MAAO,OAAQ,OAAQ,MAAO,MAAM,CACvC,CACF,CDLA,OAAS,WAAAE,GAAS,cAAAC,OAAkB,WACpC,OAAS,cAAAC,OAAkB,iBAG3B,IAAMC,GAA6B,CAAC,OAAQ,MAAO,OAAQ,MAAO,MAAM,EAClEC,GAAsB,CAAC,cAAc,EACrCC,GAAuB,CAC3B,kCACA,qBACF,EAEMC,GAAU,IAAIN,GAAQ,CAC1B,gBAAiB,CAAC,CACpB,CAAC,EAIM,SAASO,GACdC,EACe,CAEf,GAAIH,GAAqB,KAAMI,GAAYA,EAAQ,KAAKD,CAAe,CAAC,EACtE,OAAO,KAWT,GANI,CAACA,EAAgB,WAAW,GAAG,GAAKA,EAAgB,SAAS,GAAG,IAClEA,EAAkBA,EAAgB,MAAM,GAAG,EAAE,CAAC,GAK5CA,EAAgB,WAAW,GAAG,EAAG,CACnC,IAAME,EAAQF,EAAgB,MAAM,GAAG,EACnCE,EAAM,OAAS,IACjBF,EAAkBE,EAAM,MAAM,EAAG,CAAC,EAAE,KAAK,GAAG,GAIhD,OAAOF,CACT,CAEA,eAAsBG,GACpBC,EACAb,EACAc,EACAC,EAA8B,IAAI,IAC2C,CAC7E,IAAMC,EAAwB,UAAQhB,EAAO,cAAc,IAAKa,CAAQ,EAClEI,EAAgC,WACpCjB,EAAO,cAAc,IACrBgB,CACF,EAGA,GAAIX,GAAoB,SAASY,CAAwB,EACvD,MAAO,CAAE,aAAc,CAAC,EAAG,MAAO,CAAC,CAAE,EAIvC,IAAMC,EAAqB,UAAQL,CAAQ,EAC3C,GAAI,CAACT,GAA2B,SAASc,CAAa,EACpD,MAAO,CAAE,aAAc,CAAC,EAAG,MAAO,CAAC,CAAE,EAIvC,GAAIH,EAAe,IAAIE,CAAwB,EAC7C,MAAO,CAAE,aAAc,CAAC,EAAG,MAAO,CAAC,CAAE,EAKvC,GAHAF,EAAe,IAAIE,CAAwB,EAGvC,EADS,MAAS,OAAKD,CAAgB,GACjC,OAAO,EAEf,MAAO,CAAE,aAAc,CAAC,EAAG,MAAO,CAAC,CAAE,EAGvC,IAAMG,EAAU,MAAS,WAASH,EAAkB,OAAO,EACrDI,EAAW,MAAMC,GAA0B,WAASL,CAAgB,CAAC,EACrEM,EAAaf,GAAQ,iBAAiBa,EAAUD,EAAS,CAC7D,WAAYjB,GAAW,GACzB,CAAC,EACKqB,EAAW,MAAMpB,GAAWH,EAAO,cAAc,GAAG,EAC1D,GAAIuB,EAAS,aAAe,SAC1B,MAAO,CAAE,aAAc,CAAC,EAAG,MAAO,CAAC,CAAE,EAGvC,IAAMC,EAAqD,CAAC,EACtDC,EAAe,IAAI,IAGnBC,EAAWC,GAAkBd,CAAQ,EACrCe,EAAe,CACnB,KAAMX,EACN,KAAMS,EACN,OAAQ,EACV,EACAF,EAAM,KAAKI,CAAY,EAGvB,IAAMC,EAAmBP,EAAW,sBAAsB,EAC1D,QAAWQ,KAAmBD,EAAkB,CAC9C,IAAMpB,EAAkBqB,EAAgB,wBAAwB,EAE1DC,EAAmBtB,EAAgB,WAAW,GAAG,EAMvD,GAAI,CALkBA,EAAgB,WACpC,GAAGK,EAAY,cACjB,GAGsB,CAACiB,EAAkB,CACvC,IAAMC,EAAaxB,GAAiCC,CAAe,EAC/DuB,GACFP,EAAa,IAAIO,CAAU,EAE7B,SAGF,IAAIC,EAAyB,MAAMnC,EAAcW,EAAiBc,CAAQ,EAS1E,GAPIQ,IACFE,EAA8B,UACvB,UAAQjB,CAAgB,EAC7BP,CACF,GAGE,CAACwB,EACH,SAMF,GAAI,CADsB,UAAQA,CAAsB,EAEtD,QAAWC,KAAO9B,GAA4B,CAC5C,IAAM+B,GAAsB,GAAGF,IAAyBC,IACxD,GAAI,CACF,MAAS,SAAOC,EAAW,EAC3BF,EAAyBE,GACzB,KACF,MAAE,CACA,QACF,EAIJ,IAAMC,EAAsC,WAC1CpC,EAAO,cAAc,IACrBiC,CACF,EAGA,GACElB,EAAe,IAAIqB,CAA8B,GACjD/B,GAAoB,SAAS+B,CAA8B,EAE3D,SAGF,IAAMV,EAAWC,GAAkBlB,CAAe,EAC5C4B,GAAO,CACX,KAAMD,EACN,KAAMV,EACN,OAAQ,EACV,GAGIA,IAAa,iBAAmBA,IAAa,mBAC/CW,GAAK,OAAS5B,GAGhBe,EAAM,KAAKa,EAAI,EAGf,IAAMC,EAAgB,MAAM1B,GAC1BwB,EACApC,EACAc,EACAC,CACF,EAEA,GAAIuB,EAAc,MAEhB,QAAWD,KAAQC,EAAc,MAC1BvB,EAAe,IAAIsB,EAAK,IAAI,IAC/BtB,EAAe,IAAIsB,EAAK,IAAI,EAC5Bb,EAAM,KAAKa,CAAI,GAKjBC,EAAc,cAChBA,EAAc,aAAa,QAASC,GAAQd,EAAa,IAAIc,CAAG,CAAC,EAKrE,IAAMC,EAAc,MAAM,KACxB,IAAI,IAAIhB,EAAM,IAAKa,GAAS,CAACA,EAAK,KAAMA,CAAI,CAAC,CAAC,EAAE,OAAO,CACzD,EAEA,MAAO,CACL,aAAc,MAAM,KAAKZ,CAAY,EACrC,MAAOe,CACT,CACF,CAEA,eAAenB,GAAqBoB,EAAkB,CACpD,IAAMC,EAAM,MAAS,UAAa,OAAK9C,GAAO,EAAG,SAAS,CAAC,EAC3D,OAAY,OAAK8C,EAAKD,CAAQ,CAChC,CAIA,SAASd,GACPlB,EAC4C,CAC5C,OAAIA,EAAgB,SAAS,MAAM,EAC1B,cAGLA,EAAgB,SAAS,OAAO,EAC3B,eAGLA,EAAgB,SAAS,SAAS,EAC7B,iBAGLA,EAAgB,SAAS,cAAc,EAClC,qBAIX,CAGO,SAASkC,GAAMhD,EAAc,CAClC,GAAI,CACF,WAAI,IAAIA,CAAI,EACL,EACT,MAAE,CACA,MAAO,EACT,CACF,CAEO,SAASiD,EAAYjD,EAAc,CACxC,OAAOA,EAAK,SAAS,OAAO,GAAK,CAACgD,GAAMhD,CAAI,CAC9C,CASO,SAASkD,GACdC,EAIS,CACT,MACE,CAAC,CAACA,GAAc,OAAO,QACvBA,EAAa,MAAM,MAChBT,GAAS,CAAC,CAACA,EAAK,QAAUA,EAAK,OAAS,eAC3C,CAEJ,CEtRA,OAAO1C,MAAU,OCAjB,OAAOA,MAAU,OCAV,IAAMoD,EAAa,CACxB,WAAY,CACV,KAAM,WACN,MAAO,UACP,MAAO,CACL,aAAc,+CACd,SAAU,4CACZ,CACF,EACA,aAAc,CACZ,KAAM,aACN,MAAO,UACP,MAAO,CACL,aAAc,+CACd,SAAU,4CACZ,CACF,EACA,MAAO,CACL,KAAM,QACN,MAAO,QACP,MAAO,CACL,aAAc,gDACd,SAAU,2CACZ,CACF,EACA,eAAgB,CACd,KAAM,eACN,MAAO,eACP,MAAO,CACL,aAAc,uDACd,SACE,yEACJ,CACF,EACA,KAAM,CACJ,KAAM,OACN,MAAO,OACP,MAAO,CACL,aAAc,+CACd,SAAU,0CACZ,CACF,EACA,MAAO,CACL,KAAM,QACN,MAAO,QACP,MAAO,CACL,aAAc,gDACd,SAAU,2CACZ,CACF,EACA,QAAS,CACP,KAAM,UACN,MAAO,UACP,MAAO,CACL,aAAc,kDACd,SAAU,6CACZ,CACF,EACA,iBAAkB,CAChB,KAAM,iBACN,MAAO,iBACP,MAAO,CACL,aAAc,mDACd,SAAU,yDACZ,CACF,EACA,OAAQ,CACN,KAAM,SACN,MAAO,SACP,MAAO,CACL,aAAc,iDACd,SAAU,4CACZ,CACF,EACA,KAAM,CACJ,KAAM,OACN,MAAO,OACP,MAAO,CACL,aAAc,+CACd,SAAU,8DACZ,CACF,EACA,OAAQ,CACN,KAAM,SACN,MAAO,SACP,MAAO,CACL,aAAc,iDACd,SAAU,2CACZ,CACF,CACF,EC1FA,OAAOpD,OAAU,OACjB,OAAOF,OAAQ,WAGR,SAASuD,GACdC,EAAc,GACdC,EAAuB,GACH,CACpB,IAAMC,EAAkBxD,GAAK,KAAKsD,EAAK,cAAc,EAErD,OAAOxD,GAAG,aAAa0D,EAAiB,CACtC,OAAQD,CACV,CAAC,CACH,CFJA,OAAOE,MAAQ,YACf,OAAO3D,MAAQ,WACf,OAAS,cAAAU,OAAkB,iBAC3B,OAAS,KAAAxB,MAAS,MAelB,IAAM0E,EAAwB,CAC5B,qBACA,QACA,SACA,OACA,OACF,EAEMC,GAAmB3E,EAAE,OAAO,CAChC,gBAAiBA,EAAE,OAAO,CACxB,MAAOA,EAAE,OAAOA,EAAE,OAAO,EAAE,GAAGA,EAAE,MAAMA,EAAE,OAAO,CAAC,CAAC,CAAC,CACpD,CAAC,CACH,CAAC,EAED,eAAsB4E,EAAeN,EAA0C,CAC7E,GAAM,CACJO,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,CACF,EAAI,MAAM,QAAQ,IAAI,CACpBX,EAAG,KACD,wFACA,CACE,IAAAH,EACA,KAAM,EACN,OAAQI,CACV,CACF,EACA5D,EAAG,WAAWE,EAAK,QAAQsD,EAAK,KAAK,CAAC,EACtCe,GAAoBf,CAAG,EACvBgB,GAAsBhB,CAAG,EACzBiB,GAAmBjB,CAAG,EACtBkB,GAAmBlB,CAAG,EACtBmB,GAAuBnB,CAAG,EAC1BD,GAAeC,EAAK,EAAK,CAC3B,CAAC,EAEKoB,EAAgB,MAAM5E,EAAG,WAC7BE,EAAK,QAAQsD,EAAK,GAAGQ,EAAW,OAAS,OAAO,CAClD,EAEMa,EAAoB,CACxB,UAAWvB,EAAW,OACtB,SAAAU,EACA,MAAO,GACP,MAAAC,EACA,mBAAAC,EACA,gBAAAC,EACA,gBAAAC,EACA,YAAAC,CACF,EAGA,GAAIN,EAAY,KAAMnB,GAASA,EAAK,WAAW,cAAc,CAAC,GAAG,OAC/D,OAAAiC,EAAK,UAAYD,EACbtB,EAAW,UAAU,EACrBA,EAAW,YAAY,EAC3BuB,EAAK,MAAQD,EACNC,EAIT,GAAId,EAAY,KAAMnB,GAASA,EAAK,WAAW,eAAe,CAAC,GAAG,OAChE,OAAAiC,EAAK,UAAYvB,EAAW,MACrBuB,EAIT,GAAId,EAAY,KAAMnB,GAASA,EAAK,WAAW,gBAAgB,CAAC,GAAG,OACjE,OAAAiC,EAAK,UAAYvB,EAAW,OACrBuB,EAIT,GAAId,EAAY,KAAMnB,GAASA,EAAK,WAAW,eAAe,CAAC,GAAG,OAChE,OAAAiC,EAAK,UAAYvB,EAAW,QACrBuB,EAIT,GACE,OAAO,KAAKP,GAAa,cAAgB,CAAC,CAAC,EAAE,KAAMxB,GACjDA,EAAI,WAAW,aAAa,CAC9B,EAEA,OAAA+B,EAAK,UAAYvB,EAAW,MACrBuB,EAIT,GACE,CACE,GAAG,OAAO,KAAKP,GAAa,cAAgB,CAAC,CAAC,EAC9C,GAAG,OAAO,KAAKA,GAAa,iBAAmB,CAAC,CAAC,CACnD,EAAE,KAAMxB,GAAQA,EAAI,WAAW,uBAAuB,CAAC,EAEvD,OAAA+B,EAAK,UAAYvB,EAAW,gBAAgB,EACrCuB,EAIT,GACEd,EAAY,KAAMnB,GAASA,EAAK,WAAW,sBAAsB,CAAC,GAAG,OAErE,OAAAiC,EAAK,UAAYvB,EAAW,cAAc,EACnCuB,EAMT,GAAId,EAAY,KAAMnB,GAASA,EAAK,WAAW,cAAc,CAAC,GAAG,OAC/D,OAAAiC,EAAK,UAAYvB,EAAW,KACrBuB,EAKT,IAAMC,EAAYf,EAAY,KAAMnB,GAASA,EAAK,WAAW,YAAY,CAAC,EAC1E,OAAIkC,GAAW,SACa,MAAM9E,EAAG,SACjCE,EAAK,QAAQsD,EAAKsB,CAAS,EAC3B,MACF,GACsB,SAAS,cAAc,GAC3CD,EAAK,UAAYvB,EAAW,KACrBuB,IAKPP,GAAa,cAAc,OAC7BO,EAAK,UAAYvB,EAAW,MACrBuB,EAIX,CAEA,eAAsBH,GACpBlB,EACyC,CACzC,GAAM,CAACuB,EAAaxE,CAAM,EAAI,MAAM,QAAQ,IAAI,CAC9CgD,GAAeC,EAAK,EAAK,EACzBwB,EAAUxB,CAAG,CACf,CAAC,EAGD,OAAIjD,GAAQ,UAAU,SAAW,GACxB,KAIP,CAACwE,GAAa,cAAc,aAC5B,CAACA,GAAa,iBAAiB,YAExB,KAIP,iCAAiC,KAC/BA,GAAa,cAAc,aACzBA,GAAa,iBAAiB,aAC9B,EACJ,EAEO,KAGF,IACT,CAEA,eAAsBN,GAAmBjB,EAAa,CACpD,GAAM,CAACzB,EAAOqC,CAAe,EAAI,MAAM,QAAQ,IAAI,CACjDT,EAAG,KAAK,CAAC,WAAY,WAAW,EAAG,CACjC,IAAAH,EACA,KAAM,EACN,OAAQI,CACV,CAAC,EACDc,GAAmBlB,CAAG,CACxB,CAAC,EAED,GAAI,CAACzB,EAAM,OACT,OAAO,KAGT,IAAMkD,EACJb,IAAoB,KAAO,wBAA0B,iBACvD,QAAWxB,KAAQb,EAAO,CACxB,IAAMmD,EAAW,MAAMlF,EAAG,SAASE,EAAK,QAAQsD,EAAKZ,CAAI,EAAG,MAAM,EAClE,GACEsC,EAAS,SAAS,uBAAuB,GACzCA,EAAS,SAAS,uBAAuB,GACzCA,EAAS,SAAS,gBAAgB,EAElC,OAAOtC,EAIX,OAAO,IACT,CAEA,eAAsB4B,GAAsBhB,EAAa,CACvD,IAAMzB,EAAQ,MAAM4B,EAAG,KAAK,oBAAqB,CAC/C,IAAAH,EACA,KAAM,EACN,OAAQI,CACV,CAAC,EAED,OAAK7B,EAAM,OAIJA,EAAM,CAAC,EAHL,IAIX,CAEA,eAAsB4C,GAAuBnB,EAAa,CACxD,IAAM1B,EAAW,MAAMpB,GAAW8C,CAAG,EAErC,GACE1B,GAAU,aAAe,UACzB,CAAC,OAAO,QAAQA,GAAU,KAAK,EAAE,OAEjC,OAAO,KAIT,OAAW,CAACqD,EAAOC,CAAK,IAAK,OAAO,QAAQtD,EAAS,KAAK,EACxD,GACEsD,EAAM,SAAS,KAAK,GACpBA,EAAM,SAAS,SAAS,GACxBA,EAAM,SAAS,SAAS,GACxBA,EAAM,SAAS,kBAAkB,EAEjC,OAAOD,EAAM,QAAQ,QAAS,EAAE,GAAK,KAKzC,OAAO,OAAO,KAAKrD,GAAU,KAAK,IAAI,CAAC,EAAE,QAAQ,QAAS,EAAE,GAAK,IACnE,CAEA,eAAsByC,GAAoBf,EAAa,CAOrD,OANc,MAAMG,EAAG,KAAK,aAAc,CACxC,IAAAH,EACA,KAAM,EACN,OAAQI,CACV,CAAC,GAEY,OAAS,CACxB,CA4BA,eAAsByB,GACpB7B,EACA8B,EAAyC,KACjB,CAExB,GAAM,CAACC,EAAgBlE,CAAW,EAAI,MAAM,QAAQ,IAAI,CACtD2D,EAAUxB,CAAG,EACZ8B,EAEG,QAAQ,QAAQA,CAAkB,EADlCxB,EAAeN,CAAG,CAExB,CAAC,EAED,GAAI+B,EACF,OAAOA,EAGT,GACE,CAAClE,GACD,CAACA,EAAY,iBACZA,EAAY,kBAAoB,MAAQ,CAACA,EAAY,mBAEtD,OAAO,KAGT,IAAMd,EAAoB,CACxB,QAAS,oCACT,IAAKc,EAAY,MACjB,IAAKA,EAAY,MACjB,MAAO,WACP,SAAU,CACR,OAAQA,EAAY,oBAAsB,GAC1C,UAAW,OACX,IAAKA,EAAY,gBACjB,aAAc,GACd,OAAQ,EACV,EACA,YAAa,SACb,QAAS,CACP,WAAY,GAAGA,EAAY,yBAC3B,GAAI,GAAGA,EAAY,4BACnB,MAAO,GAAGA,EAAY,oBACtB,IAAK,GAAGA,EAAY,kBACpB,MAAO,GAAGA,EAAY,uBACxB,CACF,EAEA,OAAO,MAAMmE,GAAmBhC,EAAKjD,CAAM,CAC7C,CAEA,eAAsBkF,GACpBlF,EAC0B,CAC1B,GAAI,CAACA,EAAO,eAAe,IACzB,MAAO,KAGT,IAAMc,EAAc,MAAMyC,EAAevD,EAAO,cAAc,GAAG,EAEjE,OAAKc,GAAa,gBAIXA,EAAY,gBAHV,IAIX,CGrXA,OAAS,QAAAqE,GAAM,SAAAC,GAAO,OAAAC,GAAK,UAAAC,OAAc,eAElC,IAAMC,EAAc,CACzB,MAAOF,GACP,KAAMC,GACN,KAAMH,GACN,QAASC,EACX,EJHA,OAAS,eAAAI,OAAmB,cAC5B,OAAOpC,OAAQ,YACf,OAAS,cAAAjD,OAAkB,iBAC3B,OAAS,KAAAxB,MAAS,MAGX,IAAM8G,GAAqB,eACrBC,GAAgB,cAChBC,GAAuB,kBACvBC,GAA0B,qBAKvC,IAAMC,GAAWL,GAAY,aAAc,CACzC,aAAc,CAAC,iBAAiB,CAClC,CAAC,EAEYM,GAAkBnH,EAC5B,OAAO,CACN,QAASA,EAAE,OAAO,EAAE,SAAS,EAC7B,MAAOA,EAAE,OAAO,EAChB,IAAKA,EAAE,OAAO,QAAQ,EAAE,QAAQ,EAAK,EACrC,IAAKA,EAAE,OAAO,QAAQ,EAAE,QAAQ,EAAI,EACpC,SAAUA,EAAE,OAAO,CACjB,OAAQA,EAAE,OAAO,EAAE,SAAS,EAC5B,IAAKA,EAAE,OAAO,EACd,UAAWA,EAAE,OAAO,EACpB,aAAcA,EAAE,QAAQ,EAAE,QAAQ,EAAI,EACtC,OAAQA,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,SAAS,CAC1C,CAAC,EACD,QAASA,EAAE,OAAO,CAChB,WAAYA,EAAE,OAAO,EACrB,MAAOA,EAAE,OAAO,EAChB,GAAIA,EAAE,OAAO,EAAE,SAAS,EACxB,IAAKA,EAAE,OAAO,EAAE,SAAS,EACzB,MAAOA,EAAE,OAAO,EAAE,SAAS,CAC7B,CAAC,EACD,YAAaA,EAAE,OAAO,EAAE,SAAS,CACnC,CAAC,EACA,OAAO,EAIGoH,GAAeD,GAAgB,OAAO,CACjD,cAAenH,EAAE,OAAO,CACtB,IAAKA,EAAE,OAAO,EACd,eAAgBA,EAAE,OAAO,EACzB,YAAaA,EAAE,OAAO,EACtB,MAAOA,EAAE,OAAO,EAChB,WAAYA,EAAE,OAAO,EACrB,IAAKA,EAAE,OAAO,EACd,MAAOA,EAAE,OAAO,EAChB,GAAIA,EAAE,OAAO,CACf,CAAC,CACH,CAAC,EAMYqH,GAAwBrH,EAAE,OAAOoH,EAAY,EAE1D,eAAsBtB,EAAUxB,EAAa,CAC3C,IAAMjD,EAAS,MAAMiG,GAAahD,CAAG,EAErC,OAAKjD,GAKAA,EAAO,cACVA,EAAO,YAAcA,EAAO,QAAU,WAAa,QAAU,UAGxD,MAAMiF,GAAmBhC,EAAKjD,CAAM,GARlC,IASX,CAEA,eAAsBiF,GAAmBhC,EAAajD,EAAmB,CAEvE,IAAMuB,EAAW,MAAMpB,GAAW8C,CAAG,EAErC,GAAI1B,EAAS,aAAe,SAC1B,MAAM,IAAI,MACR,kBAAkBvB,EAAO,IAAM,WAAa,oBAC1CuB,EAAS,SAAW,KACnB,KAAK,CACV,EAGF,OAAOwE,GAAa,MAAM,CACxB,GAAG/F,EACH,cAAe,CACb,IAAAiD,EACA,eAAgBjD,EAAO,SAAS,OAC5BL,EAAK,QAAQsD,EAAKjD,EAAO,SAAS,MAAM,EACxC,GACJ,YAAaL,EAAK,QAAQsD,EAAKjD,EAAO,SAAS,GAAG,EAClD,MAAO,MAAMF,EAAcE,EAAO,QAAQ,MAAUuB,CAAQ,EAC5D,WAAY,MAAMzB,EAAcE,EAAO,QAAQ,WAAeuB,CAAQ,EACtE,GAAIvB,EAAO,QAAQ,GACf,MAAMF,EAAcE,EAAO,QAAQ,GAAOuB,CAAQ,EAClD5B,EAAK,QACF,MAAMG,EAAcE,EAAO,QAAQ,WAAeuB,CAAQ,GACzD0B,EACF,IACF,EAGJ,IAAKjD,EAAO,QAAQ,IAChB,MAAMF,EAAcE,EAAO,QAAQ,IAAQuB,CAAQ,EACnD5B,EAAK,QACF,MAAMG,EAAcE,EAAO,QAAQ,MAAUuB,CAAQ,GAAM0B,EAC5D,IACF,EACJ,MAAOjD,EAAO,QAAQ,MAClB,MAAMF,EAAcE,EAAO,QAAQ,MAAUuB,CAAQ,EACrD5B,EAAK,QACF,MAAMG,EAAcE,EAAO,QAAQ,WAAeuB,CAAQ,GACzD0B,EACF,KACA,OACF,CACN,CACF,CAAC,CACH,CAEA,eAAsBgD,GAAahD,EAAwC,CACzE,GAAI,CACF,IAAMiD,EAAe,MAAML,GAAS,OAAO5C,CAAG,EAE9C,OAAKiD,EAIEJ,GAAgB,MAAMI,EAAa,MAAM,EAHvC,IAIX,MAAE,CACA,IAAMC,EAAgB,GAAGlD,oBACzB,MAAM,IAAI,MACR,kCAAkCsC,EAAY,KAAKY,CAAa,IAClE,CACF,CACF,CAKA,eAAsBC,GAAmBpG,EAAgB,CACvD,IAAIqG,EAAuB,CAAC,EAE5B,QAAWC,KAAO,OAAO,KAAKtG,EAAO,OAAO,EAAG,CAC7C,GAAI,CAACuG,GAAWD,EAAKtG,CAAM,EACzB,SAGF,IAAMwG,EAAexG,EAAO,cAAcsG,CAAG,EACvCG,EAAc,MAAMC,GACxB1G,EAAO,cAAc,IACrBwG,CACF,EAEA,GAAI,CAACC,EAAa,CAChBJ,EAAgBC,CAAG,EAAItG,EACvB,SAGFqG,EAAgBC,CAAG,EAAI,MAAM7B,EAAUgC,CAAW,EAGpD,IAAME,EAASX,GAAsB,UAAUK,CAAe,EAC9D,OAAKM,EAAO,QAILA,EAAO,KAHL,IAIX,CAEA,eAAsBD,GAAgBzD,EAAauD,EAAsB,CACvE,IAAMI,EAAaC,GAAe5D,EAAKuD,CAAY,EAC7CM,EAAenH,EAAK,SAASiH,EAAYJ,CAAY,EAQrDO,GANe,MAAM3D,GAAG,KAAK,kBAAmB,CACpD,IAAKwD,EACL,KAAM,EACN,OAAQ,CAAC,qBAAsB,aAAc,cAAe,cAAc,CAC5E,CAAC,GAGE,IAAKI,GAAYrH,EAAK,QAAQqH,CAAO,CAAC,EACtC,KAAMC,GAAWH,EAAa,WAAWG,CAAM,CAAC,EAEnD,OAAOF,EAAsBpH,EAAK,KAAKiH,EAAYG,CAAmB,EAAI,IAC5E,CAEA,SAASR,GACPD,EACAtG,EACgC,CAChC,OAAO,OAAO,KAAKA,EAAO,aAAa,EACpC,OAAQsG,GAAQA,IAAQ,OAAO,EAC/B,SAASA,CAAG,CACjB,CAEO,SAASO,GAAe5D,EAAauD,EAAsB,CAChE,IAAMU,EAASjE,EAAI,MAAMtD,EAAK,GAAG,EAC3BwH,EAASX,EAAa,MAAM7G,EAAK,GAAG,EACpCyH,EAAc,CAAC,EAErB,QAASC,EAAI,EAAGA,EAAI,KAAK,IAAIH,EAAO,OAAQC,EAAO,MAAM,GACnDD,EAAOG,CAAC,IAAMF,EAAOE,CAAC,EADgCA,IAI1DD,EAAY,KAAKF,EAAOG,CAAC,CAAC,EAG5B,OAAOD,EAAY,KAAKzH,EAAK,GAAG,CAClC,CAGA,eAAsB2H,GAAyBrE,EAAasE,EAAkB,CAE5E,OADoB,MAAMhE,EAAeN,CAAG,IACxB,kBAAoB,KAAO,cAAgBsE,CACjE,CAaO,SAASC,GAAaC,EAAuC,CAClE,IAAMC,EAAwB,CAC5B,cAAe,CACb,IAAK,QAAQ,IAAI,EACjB,eAAgB,GAChB,YAAa,GACb,MAAO,GACP,WAAY,GACZ,GAAI,GACJ,IAAK,GACL,MAAO,EACT,EACA,MAAO,GACP,SAAU,CACR,OAAQ,GACR,IAAK,GACL,UAAW,GACX,aAAc,EAChB,EACA,IAAK,GACL,IAAK,GACL,QAAS,CACP,WAAY,GACZ,MAAO,EACT,CACF,EAGA,OAAID,EACK,CACL,GAAGC,EACH,GAAGD,EACH,cAAe,CACb,GAAGC,EAAc,cACjB,GAAID,EAAQ,eAAiB,CAAC,CAChC,EACA,SAAU,CACR,GAAGC,EAAc,SACjB,GAAID,EAAQ,UAAY,CAAC,CAC3B,EACA,QAAS,CACP,GAAGC,EAAc,QACjB,GAAID,EAAQ,SAAW,CAAC,CAC1B,CACF,EAGKC,CACT,CK7RO,IAAMC,EAAS,CACpB,SAASC,EAAiB,CACxB,QAAQ,IAAIrC,EAAY,MAAMqC,EAAK,KAAK,GAAG,CAAC,CAAC,CAC/C,EACA,QAAQA,EAAiB,CACvB,QAAQ,IAAIrC,EAAY,KAAKqC,EAAK,KAAK,GAAG,CAAC,CAAC,CAC9C,EACA,QAAQA,EAAiB,CACvB,QAAQ,IAAIrC,EAAY,KAAKqC,EAAK,KAAK,GAAG,CAAC,CAAC,CAC9C,EACA,WAAWA,EAAiB,CAC1B,QAAQ,IAAIrC,EAAY,QAAQqC,EAAK,KAAK,GAAG,CAAC,CAAC,CACjD,EACA,OAAOA,EAAiB,CACtB,QAAQ,IAAIA,EAAK,KAAK,GAAG,CAAC,CAC5B,EACA,OAAQ,CACN,QAAQ,IAAI,EAAE,CAChB,CACF,ECnBA,OAAS,KAAAjJ,OAAS,MAEX,SAASkJ,EAAYC,EAAgB,CAY1C,GAXAH,EAAO,MACL,sEACF,EACAA,EAAO,MAAM,0DAA0D,EACvEA,EAAO,MAAM,EAAE,EACX,OAAOG,GAAU,WACnBH,EAAO,MAAMG,CAAK,EAClBH,EAAO,MAAM,EACb,QAAQ,KAAK,CAAC,GAGZG,aAAiBnJ,GAAE,SAAU,CAC/BgJ,EAAO,MAAM,oBAAoB,EACjC,OAAW,CAACrB,EAAKyB,CAAK,IAAK,OAAO,QAAQD,EAAM,QAAQ,EAAE,WAAW,EACnEH,EAAO,MAAM,KAAKpC,EAAY,KAAKe,CAAG,MAAMyB,GAAO,EAErDJ,EAAO,MAAM,EACb,QAAQ,KAAK,CAAC,EAGZG,aAAiB,QACnBH,EAAO,MAAMG,EAAM,OAAO,EAC1BH,EAAO,MAAM,EACb,QAAQ,KAAK,CAAC,GAGhBA,EAAO,MAAM,EACb,QAAQ,KAAK,CAAC,CAChB,CCjCA,OAAS,YAAYlI,OAAU,KAC/B,OAAS,UAAAG,OAAc,KACvB,OAAOD,MAAU,OCFjB,OAAOqI,OAA2B,MAE3B,SAASC,GACdC,EACAC,EAGA,CACA,OAAOH,GAAI,CACT,KAAAE,EACA,SAAUC,GAAS,MACrB,CAAC,CACH,CDDA,OAAOC,OAAe,YACtB,OAAOC,OAAoB,mBAE3B,OAGE,WAAApI,GAEA,aAAAqI,GACA,cAAApI,GACA,cAAAqI,MAEK,WAQP,eAAsBC,GACpBC,EAGAzI,EACAmI,EAIA,CAYA,GAXI,CAACM,IAILN,EAAU,CACR,OAAQ,GACR,gBAAiB,KACjB,GAAGA,CACL,EAGIA,EAAQ,kBAAoB,MAC9B,OAGF,IAAMO,EAA2B/I,EAAK,SACpCK,EAAO,cAAc,IACrBA,EAAO,cAAc,cACvB,EACM2I,EAAkBV,GACtB,YAAY1C,EAAY,KAAKmD,CAAwB,IACrD,CACE,OAAQP,EAAQ,MAClB,CACF,EAAE,MAAM,EACFS,EAAM,MAAMnJ,GAAG,SAASO,EAAO,cAAc,eAAgB,MAAM,EACnE6I,EAAS,MAAMC,GAAwBF,EAAKH,EAAgBzI,CAAM,EACxE,MAAMP,GAAG,UAAUO,EAAO,cAAc,eAAgB6I,EAAQ,MAAM,EACtEF,GAAiB,QAAQ,CAC3B,CAEA,eAAsBG,GACpBC,EACAN,EACAzI,EACA,CACA,IAAMsB,EAAa,MAAM0H,GAAkBD,EAAO/I,CAAM,EAIlDiJ,EAAe3H,EAClB,qBAAqBiH,EAAW,uBAAuB,EACvD,KAAMW,GACLA,EACG,cAAc,EACd,KACEC,GACCA,EAAS,OAAOZ,EAAW,kBAAkB,GAC7CY,EAAS,QAAQ,IAAM,SAC3B,CACJ,EAGF,GAAI,CAACF,EACH,OAAOF,EAGT,IAAMK,EAAYC,GAAcJ,CAAY,EAG5C,OAAAK,GACEL,EACA,CACE,KAAM,WACN,MAAO,OACT,EACA,CAAE,UAAAG,CAAU,CACd,EAGAX,EAAe,SAAS,QAASc,GAAW,CAC1CC,GAAwBP,EAAcM,CAAM,CAC9C,CAAC,EAGGd,EAAe,OACjB,MAAMgB,GAAuBR,EAAcR,EAAe,KAAK,EAG1DnH,EAAW,YAAY,CAChC,CAEA,SAASgI,GACPL,EACAE,EAIA,CACE,UAAAC,CACF,EAGA,CACA,IAAMM,EAAmBT,EAAa,YAAY,UAAU,EAE5D,GAAI,CAACS,EAAkB,CACrB,IAAMC,EAAc,CAClB,KAAMR,EAAS,KACf,YAAa,IAAIC,IAAYD,EAAS,QAAQC,IAChD,EAGA,OAAID,EAAS,OAAS,YACpBF,EAAa,yBAAyB,EAAGU,CAAW,EAC7CV,IAGTA,EAAa,sBAAsBU,CAAW,EAEvCV,GAGT,GAAIS,EAAiB,OAAOnB,EAAW,kBAAkB,EAAG,CAC1D,IAAMqB,EAAcF,EAAiB,eAAe,EAC9CG,EAAW,GAAGT,IAAYD,EAAS,QAAQC,IAGjD,GAAIQ,GAAa,OAAOrB,EAAW,aAAa,EAAG,CACjD,IAAMuB,EAAkBF,EAAY,QAAQ,EAC5C,OAAAA,EAAY,gBAAgB,IAAIE,MAAoBD,IAAW,EACxDZ,EAIT,GAAIW,GAAa,OAAOrB,EAAW,sBAAsB,EAAG,CAE1D,GACEqB,EACG,YAAY,EACZ,IAAKG,GAAYA,EAAQ,QAAQ,CAAC,EAClC,SAASF,CAAQ,EAEpB,OAAOZ,EAETW,EAAY,WAAWC,CAAQ,EAGjC,OAAOZ,EAGT,OAAOA,CACT,CAEA,eAAeQ,GACbR,EACAe,EACA,CAEKf,EAAa,YAAY,OAAO,GACnCA,EAAa,sBAAsB,CACjC,KAAM,QACN,YAAa,IACf,CAAC,EAIHgB,GAAqBhB,CAAY,EAMjC,IAAMiB,GAJgBjB,EACnB,mBAAmB,OAAO,GACzB,cAAcV,EAAW,kBAAkB,GAER,eAAe,EACtD,GAAI2B,GAAkB,OAAO3B,EAAW,uBAAuB,EAAG,CAChE,IAAM4B,EAAoBD,EAAiB,QAAQ,EAC7CE,EAAc,MAAMC,GAAmBF,CAAiB,EACxDxD,EAASyB,GAAUgC,EAAaJ,EAAO,CAC3C,WAAY,CAACM,EAAKC,IAAQA,CAC5B,CAAC,EACKC,EAAenC,GAAe1B,CAAM,EACvC,QAAQ,kBAAmB,OAAO,EAClC,QAAQ,QAAS,GAAG,EACpB,QAAQ,QAAS,GAAG,EACpB,QAAQ,QAAS,GAAG,EACpB,QAAQ,QAAS,GAAG,EACpB,QAAQ,UAAW,GAAG,EACtB,QAAQ,QAAS,GAAG,EACpB,QAAQ,UAAW,GAAG,EACtB,QAAQ,QAAS,GAAG,EACvBuD,EAAiB,gBAAgBM,CAAY,EAI/CC,GAAuBxB,CAAY,CACrC,CAEA,SAASO,GACPP,EACAM,EACA,CACA,IAAMmB,EAAkBzB,EAAa,YAAY,SAAS,EAE1D,GAAI,CAACyB,EACH,OAAAzB,EAAa,sBAAsB,CACjC,KAAM,UACN,YAAa,IAAIM,IACnB,CAAC,EAEMN,EAGT,GAAIyB,EAAgB,OAAOnC,EAAW,kBAAkB,EAAG,CACzD,IAAMqB,EAAcc,EAAgB,eAAe,EAEnD,GAAId,GAAa,OAAOrB,EAAW,sBAAsB,EAAG,CAC1D,GACEqB,EACG,YAAY,EACZ,IAAKG,GACGA,EAAQ,QAAQ,EAAE,QAAQ,QAAS,EAAE,CAC7C,EACA,SAASR,EAAO,QAAQ,QAAS,EAAE,CAAC,EAEvC,OAAON,EAETW,EAAY,WAAWL,CAAM,EAG/B,OAAON,EAGT,OAAOA,CACT,CAEA,eAAsBD,GAAkBD,EAAe/I,EAAuB,CAC5E,IAAM0C,EAAM,MAAMjD,GAAG,QAAQE,EAAK,KAAKC,GAAO,EAAG,SAAS,CAAC,EACrD4G,EACJxG,GAAQ,eAAe,gBAAkB,qBACrCoB,EAAWzB,EAAK,KAAK+C,EAAK,UAAU/C,EAAK,SAAS6G,CAAY,GAAG,EAYvE,OAVgB,IAAIvG,GAAQ,CAC1B,gBAAiB,CAAC,CACpB,CAAC,EAC0B,iBAAiBmB,EAAU2H,EAAO,CAG3D,WACEpJ,EAAK,QAAQ6G,CAAY,IAAM,MAAQtG,GAAW,GAAKA,GAAW,EACtE,CAAC,CAGH,CAEO,SAASmJ,GAAcJ,EAAuC,CACnE,OAAOA,EACJ,yBAAyBV,EAAW,aAAa,GAChD,aAAa,IAAMD,GAAU,OAC7B,IACA,GACN,CAEO,SAAS2B,GAAqBU,EAA8B,CACjE,IAAMC,EAAaD,EAAI,cAAc,EAErC,QAAStD,EAAI,EAAGA,EAAIuD,EAAW,OAAQvD,IAAK,CAC1C,IAAMwD,EAAOD,EAAWvD,CAAC,EACzB,GAAIwD,EAAK,OAAOtC,EAAW,gBAAgB,EAAG,CAC5C,IAAMuC,EAAmBD,EAAK,cAActC,EAAW,gBAAgB,EACjEwC,EAAaD,EAAiB,cAAc,EAAE,QAAQ,EAG5DH,EAAI,yBAAyBtD,EAAG,CAE9B,KAAM,OAAO0D,EAAW,QAAQ,UAAW,EAAE,KAC7C,YAAa,OAAOA,EAAW,QAAQ,UAAW,EAAE,IACtD,CAAC,EAGDD,EAAiB,OAAO,UACfD,EAAK,OAAOtC,EAAW,kBAAkB,EAAG,CAErD,IAAMqB,EADiBiB,EAAK,cAActC,EAAW,kBAAkB,EACpC,eAAe,EAGhDqB,GACAA,EAAY,OAAOrB,EAAW,uBAAuB,EAGrD0B,GACEL,EAAY,cAAcrB,EAAW,uBAAuB,CAC9D,EAEAqB,GACAA,EAAY,OAAOrB,EAAW,sBAAsB,GAEpDyC,GACEpB,EAAY,cAAcrB,EAAW,sBAAsB,CAC7D,GAIR,CAEO,SAASyC,GAAmBC,EAA6B,CAC9D,IAAMC,EAAWD,EAAI,YAAY,EACjC,QAASE,EAAI,EAAGA,EAAID,EAAS,OAAQC,IAAK,CACxC,IAAMpB,EAAUmB,EAASC,CAAC,EAC1B,GAAIpB,EAAQ,OAAOxB,EAAW,uBAAuB,EAEnD0B,GACEF,EAAQ,cAAcxB,EAAW,uBAAuB,CAC1D,UACSwB,EAAQ,OAAOxB,EAAW,sBAAsB,EAEzDyC,GACEjB,EAAQ,cAAcxB,EAAW,sBAAsB,CACzD,UACSwB,EAAQ,OAAOxB,EAAW,aAAa,EAAG,CACnD,IAAMwC,EAAahB,EAAQ,QAAQ,EAEnCkB,EAAI,cAAcE,CAAC,EACnBF,EAAI,cAAcE,EAAG,IAAIJ,IAAa,GAG5C,CAEO,SAASN,GAAuBE,EAA8B,CACnE,IAAMC,EAAaD,EAAI,cAAc,EAErC,QAAStD,EAAI,EAAGA,EAAIuD,EAAW,OAAQvD,IAAK,CAC1C,IAAMwD,EAAOD,EAAWvD,CAAC,EACzB,GAAIwD,EAAK,OAAOtC,EAAW,kBAAkB,EAAG,CAC9C,IAAM6C,EAAiBP,EACjBjB,EAAcwB,EAAe,eAAe,EAElD,GAAIxB,GAAeA,EAAY,OAAOrB,EAAW,aAAa,EAAG,CAC/D,IAAMR,EAAQ6B,EACX,cAAcrB,EAAW,aAAa,EACtC,gBAAgB,EACfR,EAAM,WAAW,KAAK,IACxB4C,EAAI,uBAAuBtD,EAAG,CAAE,WAAYU,EAAM,MAAM,CAAC,CAAE,CAAC,EAC5DqD,EAAe,OAAO,QAEfxB,GAAa,OAAOrB,EAAW,uBAAuB,EAC/DkC,GAAuBb,CAAsC,EAE7DA,GACAA,EAAY,OAAOrB,EAAW,sBAAsB,GAEpD8C,GACEzB,EAAY,cAAcrB,EAAW,sBAAsB,CAC7D,GAIR,CAEO,SAAS8C,GAAoBJ,EAA6B,CAC/D,IAAMC,EAAWD,EAAI,YAAY,EACjC,QAASE,EAAI,EAAGA,EAAID,EAAS,OAAQC,IAAK,CACxC,IAAMpB,EAAUmB,EAASC,CAAC,EAC1B,GAAIpB,EAAQ,OAAOxB,EAAW,uBAAuB,EAEnDkC,GACEV,EAAQ,cAAcxB,EAAW,uBAAuB,CAC1D,UACSwB,EAAQ,OAAOxB,EAAW,sBAAsB,EAEzD8C,GACEtB,EAAQ,cAAcxB,EAAW,sBAAsB,CACzD,UACSwB,EAAQ,OAAOxB,EAAW,aAAa,EAAG,CACnD,IAAMwC,EAAahB,EAAQ,QAAQ,EAE7BuB,EAAa,gCACfA,EAAW,KAAKP,CAAU,IAC5BE,EAAI,cAAcE,CAAC,EACnBF,EAAI,cAAcE,EAAGJ,EAAW,QAAQO,EAAY,IAAI,CAAC,IAIjE,CAEA,eAAejB,GAAmBkB,EAA2C,CAM3E,IAAMC,GALa,MAAMxC,GACvB,iBAAiBuC,IACjB,IACF,GAE6B,cAAc,EAAE,CAAC,EAC9C,GAAIC,GAAW,QAAQ,IAAMjD,EAAW,kBAAmB,CAIzD,IAAMqB,GAHe4B,EAClB,mBAAmB,GAClB,gBAAgB,EAAE,CAAC,GACS,eAAe,EAC/C,GAAI5B,GAAa,OAAOrB,EAAW,uBAAuB,EACxD,OAAO,MAAMkD,EAA6B7B,CAAW,EAIzD,MAAM,IAAI,MAAM,sCAAsC,CACxD,CAEA,SAAS6B,EAA6BvC,EAAoC,CACxE,IAAMvC,EAAc,CAAC,EACrB,QAAWwC,KAAYD,EAAK,cAAc,EACxC,GAAIC,EAAS,OAAOZ,EAAW,kBAAkB,EAAG,CAClD,IAAMmD,EAAOvC,EAAS,QAAQ,EAAE,QAAQ,MAAO,EAAE,EAE/CA,EAAS,eAAe,GAAG,OAAOZ,EAAW,uBAAuB,EAEpE5B,EAAO+E,CAAI,EAAID,EACbtC,EAAS,eAAe,CAC1B,EAEAA,EAAS,eAAe,GAAG,OAAOZ,EAAW,sBAAsB,EAEnE5B,EAAO+E,CAAI,EAAIC,GACbxC,EAAS,eAAe,CAC1B,EAEAxC,EAAO+E,CAAI,EAAIE,GAAWzC,EAAS,eAAe,CAAC,EAIzD,OAAOxC,CACT,CAEA,SAASgF,GAA4BzC,EAAqC,CACxE,IAAMvC,EAAgB,CAAC,EACvB,QAAWoD,KAAWb,EAAK,YAAY,EACjCa,EAAQ,OAAOxB,EAAW,uBAAuB,EACnD5B,EAAO,KACL8E,EACE1B,EAAQ,cAAcxB,EAAW,uBAAuB,CAC1D,CACF,EACSwB,EAAQ,OAAOxB,EAAW,sBAAsB,EACzD5B,EAAO,KACLgF,GACE5B,EAAQ,cAAcxB,EAAW,sBAAsB,CACzD,CACF,EAEA5B,EAAO,KAAKiF,GAAW7B,CAAO,CAAC,EAGnC,OAAOpD,CACT,CAEA,SAASiF,GAAW1C,EAAgB,CAClC,OAAQA,EAAK,QAAQ,EAAG,CACtB,KAAKX,EAAW,cACd,OAAOW,EAAK,QAAQ,EACtB,KAAKX,EAAW,eACd,OAAO,OAAOW,EAAK,QAAQ,CAAC,EAC9B,KAAKX,EAAW,YACd,MAAO,GACT,KAAKA,EAAW,aACd,MAAO,GACT,KAAKA,EAAW,YACd,OAAO,KACT,KAAKA,EAAW,uBACd,OAAOW,EAAK,YAAY,EAAE,IAAI0C,EAAU,EAC1C,KAAKrD,EAAW,wBACd,OAAOkD,EAA6BvC,CAAI,EAC1C,QACE,OAAOA,EAAK,QAAQ,CACxB,CACF,CAEO,SAAS2C,GACdC,EACA,CACA,IAAMnF,EAA8B,CAAC,EAErC,QAAWL,KAAO,OAAO,KAAKwF,CAAO,EAAG,CACtC,IAAMnL,EAAQ2F,EAAI,MAAM,GAAG,EACrByF,EAAYpL,EAAM,CAAC,EACnBqL,EAAUrL,EAAM,MAAM,CAAC,EAAE,KAAK,GAAG,EAEnCqL,IAAY,GACV,OAAOrF,EAAOoF,CAAS,GAAM,SAC/BpF,EAAOoF,CAAS,EAAE,QAAU,aAAazF,MAEzCK,EAAOoF,CAAS,EAAI,aAAazF,OAG/B,OAAOK,EAAOoF,CAAS,GAAM,WAC/BpF,EAAOoF,CAAS,EAAI,CAAE,QAAS,aAAaA,KAAc,GAE5DpF,EAAOoF,CAAS,EAAEC,CAAO,EAAI,aAAa1F,OAK9C,OAAW,CAACyF,EAAWhE,CAAK,IAAK,OAAO,QAAQpB,CAAM,EAElD,OAAOoB,GAAU,UACjBA,EAAM,UAAY,aAAagE,OAC/B,EAAEA,KAAaD,IAEf,OAAO/D,EAAM,QAIjB,OAAOpB,CACT,CVjhBA,OAAOyB,MAAe,YACtB,OAAS,mBAAA6D,OAAuB,oBAChC,OAAOC,OAAW,aAClB,OAAS,KAAAvN,OAAS,MAWlB,IAAMwN,GAAe,QAAQ,IAAI,cAAgB,0BAE3CC,GAAQ,QAAQ,IAAI,YACtB,IAAIH,GAAgB,QAAQ,IAAI,WAAW,EAC3C,OAEEI,EAAgB,IAAI,IAEbC,GAAc,CACzB,CACE,KAAM,UACN,MAAO,SACT,EACA,CACE,KAAM,OACN,MAAO,MACT,EACA,CACE,KAAM,OACN,MAAO,MACT,EACA,CACE,KAAM,QACN,MAAO,OACT,EACA,CACE,KAAM,QACN,MAAO,OACT,CACF,EAEA,eAAsBC,IAAmB,CACvC,GAAI,CACF,GAAM,CAAC5F,CAAM,EAAI,MAAM6F,EAAc,CAAC,YAAY,CAAC,EAEnD,OAAOpN,GAAoB,MAAMuH,CAAM,CACzC,OAASmB,EAAP,CACAH,EAAO,MAAM;AAAA,CAAI,EACjBE,EAAYC,CAAK,CACnB,CACF,CAEA,eAAsB2E,IAAoB,CACxC,GAAI,CACF,GAAM,CAAC9F,CAAM,EAAI,MAAM6F,EAAc,CAAC,mBAAmB,CAAC,EAE1D,OAAOnN,GAAa,MAAMsH,CAAM,CAClC,OAASmB,EAAP,CACA,OAAAH,EAAO,MAAM;AAAA,CAAI,EACjBE,EAAYC,CAAK,EACV,CAAC,CACV,CACF,CAEA,eAAsB4E,IAAmB,CACvC,GAAI,CACF,GAAM,CAAC/F,CAAM,EAAI,MAAM6F,EAAc,CAAC,kBAAkB,CAAC,EACzD,OAAOlN,GAAY,MAAMqH,CAAM,CACjC,OAASmB,EAAP,CACA,OAAAD,EAAYC,CAAK,EACV,CAAC,CACV,CACF,CAEA,eAAsB6E,EAAgBjB,EAAckB,EAAe,CACjE,GAAI,CAEF,GAAIhK,EAAY8I,CAAI,EAClB,OAAO,MAAMmB,GAAqBnB,CAAI,EAIxC,GAAM,CAAC/E,CAAM,EAAI,MAAM6F,EAAc,CACnC7J,EAAM+I,CAAI,EAAIA,EAAO,UAAUkB,KAASlB,QAC1C,CAAC,EAED,OAAOxM,EAAmB,MAAMyH,CAAM,CACxC,OAASmB,EAAP,CACA,OAAAH,EAAO,MAAM,EACbE,EAAYC,CAAK,EACV,IACT,CACF,CAEA,eAAe+E,GAAqBhM,EAAkB,CACpD,GAAI,CAEF,IAAIiM,EAAejM,EACfA,EAAS,WAAW,IAAI,IAC1BiM,EAAenN,GAAK,KAAKD,GAAQ,EAAGmB,EAAS,MAAM,CAAC,CAAC,GAGvD,IAAM2F,EAAe7G,GAAK,QAAQmN,CAAY,EACxC3L,EAAU,MAAM1B,GAAG,SAAS+G,EAAc,MAAM,EAChDuG,EAAS,KAAK,MAAM5L,CAAO,EAEjC,OAAOjC,EAAmB,MAAM6N,CAAM,CACxC,OAASjF,EAAP,CACA,OAAAH,EAAO,MAAM,uCAAuC9G,GAAU,EAC9DgH,EAAYC,CAAK,EACV,IACT,CACF,CAEA,eAAsBkF,IAAwB,CAC5C,OAAOV,EACT,CAEA,eAAsBW,GAAqBC,EAAmB,CAC5D,GAAI,CACF,GAAM,CAACvG,CAAM,EAAI,MAAM6F,EAAc,CAAC,UAAUU,QAAgB,CAAC,EAEjE,OAAO3N,GAAwB,MAAMoH,CAAM,CAC7C,OAASmB,EAAP,CACAD,EAAYC,CAAK,CACnB,CACF,CAEA,eAAsBqF,GACpBC,EACAC,EACA,CACA,IAAMC,EAA4C,CAAC,EAEnD,QAAW5B,KAAQ2B,EAAO,CACxB,IAAME,EAAQH,EAAM,KAAMG,GAAUA,EAAM,OAAS7B,CAAI,EAEvD,GAAK6B,IAILD,EAAK,KAAKC,CAAK,EAEXA,EAAM,sBAAsB,CAC9B,IAAM9L,EAAe,MAAM0L,GAAYC,EAAOG,EAAM,oBAAoB,EACxED,EAAK,KAAK,GAAG7L,CAAY,GAI7B,OAAO6L,EAAK,OACV,CAACE,EAAWJ,EAAOK,IACjBA,EAAK,UAAWC,GAAMA,EAAE,OAASF,EAAU,IAAI,IAAMJ,CACzD,CACF,CAEA,eAAsBO,GACpBf,EACAU,EACA,CACA,GAAI,CACF,IAAMzI,EAAQyI,EAAK,IAAKM,GAAS,UAAUhB,KAASgB,EAAK,WAAW,EAC9DjH,EAAS,MAAM6F,EAAc3H,CAAK,EACxC,OAAOzF,GAAoB,MAAMuH,CAAM,CACzC,OAASmB,EAAP,CACAD,EAAYC,CAAK,CACnB,CACF,CAEA,eAAsB+F,GACpB7N,EACA4N,EACAE,EACA,CACA,GAAIA,EACF,OAAOA,EAGT,GAAIF,EAAK,OAAS,cAChB,OAAO5N,EAAO,cAAc,IAAMA,EAAO,cAAc,WAGzD,GAAM,CAAC+N,EAAQzJ,CAAI,EAAIsJ,EAAK,MAAM,MAAM,GAAG,GAAK,CAAC,EACjD,OAAMG,KAAU/N,EAAO,cAIhBL,GAAK,KACVK,EAAO,cAAc+N,CAA2C,EAChEzJ,CACF,EANS,IAOX,CAEA,eAAsBkI,EACpB3H,EACAsD,EAAkC,CAAC,EACnC,CACAA,EAAU,CACR,SAAU,GACV,GAAGA,CACL,EAEA,GAAI,CAmEF,OAlEgB,MAAM,QAAQ,IAC5BtD,EAAM,IAAI,MAAOlF,GAAS,CACxB,IAAMqO,EAAMC,GAAetO,CAAI,EAG/B,GAAIwI,EAAQ,UAAYkE,EAAc,IAAI2B,CAAG,EAC3C,OAAO3B,EAAc,IAAI2B,CAAG,EAI9B,IAAME,GAAgB,SAAY,CAChC,IAAMC,EAAW,MAAMjC,GAAM8B,EAAK,CAAE,MAAA5B,EAAM,CAAC,EAE3C,GAAI,CAAC+B,EAAS,GAAI,CAChB,IAAMC,EAA2C,CAC/C,IAAK,cACL,IAAK,eACL,IAAK,YACL,IAAK,YACL,IAAK,uBACP,EAEA,GAAID,EAAS,SAAW,IACtB,MAAM,IAAI,MACR,qDAAqD5I,EAAY,KAC/DyI,CACF;AAAA,4DACF,EAGF,GAAIG,EAAS,SAAW,IACtB,MAAM,IAAI,MACR,oBAAoB5I,EAAY,KAC9ByI,CACF;AAAA,4EACF,EAGF,GAAIG,EAAS,SAAW,IACtB,MAAM,IAAI,MACR,8CAA8C5I,EAAY,KACxDyI,CACF;AAAA,uEACF,EAGF,IAAMrH,EAAS,MAAMwH,EAAS,KAAK,EAC7BE,EACJ1H,GAAU,OAAOA,GAAW,UAAY,UAAWA,EAC/CA,EAAO,MACPwH,EAAS,YAAcC,EAAcD,EAAS,MAAM,EAC1D,MAAM,IAAI,MACR,wBAAwB5I,EAAY,KAAKyI,CAAG;AAAA,EAAOK,GACrD,EAGF,OAAOF,EAAS,KAAK,CACvB,GAAG,EAEH,OAAIhG,EAAQ,UACVkE,EAAc,IAAI2B,EAAKE,CAAY,EAE9BA,CACT,CAAC,CACH,CAGF,OAASpG,EAAP,CACA,OAAAH,EAAO,MAAM;AAAA,CAAI,EACjBE,EAAYC,CAAK,EACV,CAAC,CACV,CACF,CAEO,SAASwG,IAAqB,CACnCjC,EAAc,MAAM,CACtB,CAEA,eAAekC,EACb9M,EACAzB,EACAwO,EAAuB,IAAI,IAI1B,CACD,IAAMC,EAA8C,CAAC,EAC/CC,EAA0B,CAAC,EAEjC,QAAWnM,KAAOd,EAEhB,GAAI,CAAA+M,EAAQ,IAAIjM,CAAG,GAKnB,GAFAiM,EAAQ,IAAIjM,CAAG,EAEXI,EAAMJ,CAAG,GAAKK,EAAYL,CAAG,EAAG,CAClC,IAAMqL,EAAO,MAAMjB,EAAgBpK,EAAK,EAAE,EAC1C,GAAIqL,IACFa,EAAM,KAAKb,CAAI,EACXA,EAAK,sBAAsB,CAC7B,IAAMe,EAAS,MAAMJ,EACnBX,EAAK,qBACL5N,EACAwO,CACF,EACAC,EAAM,KAAK,GAAGE,EAAO,KAAK,EAC1BD,EAAc,KAAK,GAAGC,EAAO,aAAa,WAK9CD,EAAc,KAAKnM,CAAG,EAGlBvC,EAAQ,CACV,IAAM4M,EAAQ5M,EAAO,eAAe,IAChC,MAAMsH,GACJtH,EAAO,cAAc,IACrBA,EAAO,KACT,EACAA,EAAO,MAEX,GAAI,CACF,IAAM4N,EAAO,MAAMjB,EAAgBpK,EAAKqK,CAAK,EAC7C,GAAIgB,GAAQA,EAAK,qBAAsB,CACrC,IAAMe,EAAS,MAAMJ,EACnBX,EAAK,qBACL5N,EACAwO,CACF,EACAC,EAAM,KAAK,GAAGE,EAAO,KAAK,EAC1BD,EAAc,KAAK,GAAGC,EAAO,aAAa,EAE9C,MAAE,CAEF,GAKN,MAAO,CAAE,MAAAF,EAAO,cAAAC,CAAc,CAChC,CAEA,eAAsBE,GACpBvB,EACArN,EACA,CACA,GAAI,CAEF,IAAM6O,EAAaxB,EAAM,OAAQ3B,GAAS9I,EAAY8I,CAAI,CAAC,EACrDoD,EAAOzB,EAAM,OAAQ3B,GAAS/I,EAAM+I,CAAI,CAAC,EACzCgD,EAAgBrB,EAAM,OACzB3B,GAAS,CAAC9I,EAAY8I,CAAI,GAAK,CAAC/I,EAAM+I,CAAI,CAC7C,EAEMqD,EAAgD,CAAC,EAGjDC,EAA4B,CAAC,EAEnC,QAAWC,KAAaJ,EAAY,CAClC,IAAMjB,EAAO,MAAMjB,EAAgBsC,EAAW,EAAE,EAC5CrB,IACFmB,EAAQ,KAAKnB,CAAI,EACbA,EAAK,sBACPoB,EAAgB,KAAK,GAAGpB,EAAK,oBAAoB,GAKvD,QAAWI,KAAOc,EAAM,CACtB,IAAMlB,EAAO,MAAMjB,EAAgBqB,EAAK,EAAE,EACtCJ,IACFmB,EAAQ,KAAKnB,CAAI,EACbA,EAAK,sBACPoB,EAAgB,KAAK,GAAGpB,EAAK,oBAAoB,GAMvD,GAAM,CAAE,MAAOsB,EAAiB,cAAeC,CAAwB,EACrE,MAAMZ,EAA+BS,EAAiBhP,CAAM,EAE9D+O,EAAQ,KAAK,GAAGG,CAAe,EAG/B,IAAME,EAAmB,CAAC,GAAGV,EAAe,GAAGS,CAAuB,EACtE,GAAIC,EAAiB,OAAS,GAE5B,GADc,MAAM7C,GAAiB,EAM9B,CAEL,IAAM8C,EAAsB,MAAM,KAAK,IAAI,IAAID,CAAgB,CAAC,EAG5DC,EAAoB,SAAS,OAAO,GACtCA,EAAoB,QAAQ,OAAO,EAGrC,IAAIC,EAAgB,MAAMC,GACxBF,EACArP,CACF,EACI2G,EAAS,MAAM6F,EAAc8C,CAAa,EACxCE,EAAkB7Q,GAAE,MAAMO,CAAkB,EAAE,MAAMyH,CAAM,EAChEoI,EAAQ,KAAK,GAAGS,CAAe,UAlB3BT,EAAQ,SAAW,EACrB,OAAO,KAqBb,GAAI,CAACA,EAAQ,OACX,OAAO,KAOT,GAAIK,EAAiB,SAAS,OAAO,GAC/BpP,EAAO,SAAS,UAAW,CAC7B,IAAMgK,EAAQ,MAAMyF,GAAiBzP,EAAO,SAAS,UAAWA,CAAM,EAClEgK,GACF+E,EAAQ,QAAQ/E,CAAK,EAM3B+E,EAAQ,KAAK,CAACW,EAAGC,IACXD,EAAE,OAAS,iBACN,GAEF,CACR,EAED,IAAIE,EAAW,CAAC,EAChBb,EAAQ,QAASnB,GAAS,CACxBgC,EAAWxH,EAAUwH,EAAUhC,EAAK,UAAY,CAAC,CAAC,CACpD,CAAC,EAED,IAAI9B,EAAU,CAAC,EACfiD,EAAQ,QAASnB,GAAS,CACxB9B,EAAU1D,EAAU0D,EAAS8B,EAAK,SAAW,CAAC,CAAC,CACjD,CAAC,EAED,IAAIiC,EAAM,CAAC,EACXd,EAAQ,QAASnB,GAAS,CACxBiC,EAAMzH,EAAUyH,EAAKjC,EAAK,KAAO,CAAC,CAAC,CACrC,CAAC,EAED,IAAIkC,EAAO,GACXf,EAAQ,QAASnB,GAAS,CACpBA,EAAK,OACPkC,GAAQ,GAAGlC,EAAK;AAAA,EAEpB,CAAC,EAED,IAAImC,EAAU,CAAC,EACfhB,EAAQ,QAASnB,GAAS,CACxBmC,EAAU3H,EAAU2H,EAASnC,EAAK,SAAW,CAAC,CAAC,CACjD,CAAC,EAED,IAAMb,EAASvN,GAAgC,MAAM,CACnD,aAAc4I,EAAU,IACtB2G,EAAQ,IAAKnB,GAASA,EAAK,cAAgB,CAAC,CAAC,CAC/C,EACA,gBAAiBxF,EAAU,IACzB2G,EAAQ,IAAKnB,GAASA,EAAK,iBAAmB,CAAC,CAAC,CAClD,EACA,MAAOxF,EAAU,IAAI2G,EAAQ,IAAKnB,GAASA,EAAK,OAAS,CAAC,CAAC,CAAC,EAC5D,SAAAgC,EACA,QAAA9D,EACA,IAAA+D,EACA,KAAAC,CACF,CAAC,EAED,OAAI,OAAO,KAAKC,CAAO,EAAE,OAAS,IAChChD,EAAO,QAAUgD,GAGZhD,CACT,OAASjF,EAAP,CACA,OAAAD,EAAYC,CAAK,EACV,IACT,CACF,CAEA,eAAekI,GACbhC,EACAhO,EACmB,CACnB,GAAM,CAAE,cAAA0O,CAAc,EAAI,MAAMH,EAA+B,CAACP,CAAG,EAAGhO,CAAM,EAEtE4M,EAAQ5M,EAAO,eAAe,IAChC,MAAMsH,GAAyBtH,EAAO,cAAc,IAAKA,EAAO,KAAK,EACrEA,EAAO,MAEL8O,EAAOJ,EAAc,IAAKhD,GAC9BuC,GAAetL,EAAM+I,CAAI,EAAIA,EAAO,UAAUkB,KAASlB,QAAW,CACpE,EAEA,OAAO,MAAM,KAAK,IAAI,IAAIoD,CAAI,CAAC,CACjC,CAEA,eAAsBW,GAAiB/D,EAAc1L,EAAgB,CACnE,GAAM,CAACkN,EAAWrJ,CAAe,EAAI,MAAM,QAAQ,IAAI,CACrDoJ,GAAqBvB,CAAI,EACzBxG,GAAoClF,CAAM,CAC5C,CAAC,EACD,GAAI,CAACkN,EACH,OAAO,KAIT,IAAMlD,EAAQ,CACZ,KAAA0B,EACA,KAAM,iBACN,SAAU,CACR,OAAQ,CACN,MAAO,CACL,OAAQ,CACN,aAAc,CACZ,GAAI,gBACJ,GAAI,4BACJ,GAAI,2BACN,EACA,OAAQ,CAAC,CACX,CACF,CACF,CACF,EACA,QAAS,CACP,MAAO,CAAC,EACR,MAAO,CACL,OAAQ,QACV,EACA,KAAM,CAAC,CACT,CACF,EAEA,OAAI1L,EAAO,SAAS,eAClBgK,EAAM,SAAS,OAAO,MAAM,OAAO,OAAS,CAC1C,GAAGA,EAAM,SAAS,OAAO,MAAM,OAAO,OACtC,GAAG6B,GAAoCqB,EAAU,QAAQ,MAAQ,CAAC,CAAC,CACrE,EACAlD,EAAM,QAAU,CACd,MAAO,CACL,GAAGkD,EAAU,QAAQ,MACrB,GAAGlD,EAAM,QAAQ,KACnB,EACA,MAAO,CACL,GAAGkD,EAAU,QAAQ,MACrB,GAAGlD,EAAM,QAAQ,KACnB,EACA,KAAM,CACJ,GAAGkD,EAAU,QAAQ,KACrB,GAAGlD,EAAM,QAAQ,IACnB,CACF,EAEInG,IAAoB,MAAQqJ,EAAU,YACxClD,EAAM,QAAU,CACd,MAAO,CACL,GAAGkD,EAAU,UAAU,MACvB,GAAGlD,EAAM,QAAQ,KACnB,EACA,MAAO,CACL,OAAQ,WACR,GAAGkD,EAAU,UAAU,KACzB,EACA,KAAM,CACJ,GAAGA,EAAU,UAAU,IACzB,CACF,IAIGlD,CACT,CAEA,SAASiE,GAAetO,EAAc,CACpC,GAAIgD,EAAMhD,CAAI,EAAG,CAGf,IAAMqO,EAAM,IAAI,IAAIrO,CAAI,EACxB,OAAIqO,EAAI,SAAS,MAAM,aAAa,GAAK,CAACA,EAAI,SAAS,SAAS,OAAO,IACrEA,EAAI,SAAW,GAAGA,EAAI,iBAGjBA,EAAI,SAAS,EAGtB,MAAO,GAAG7B,MAAgBxM,GAC5B,CAEO,SAASgD,EAAMhD,EAAc,CAClC,GAAI,CACF,WAAI,IAAIA,CAAI,EACL,EACT,MAAE,CACA,MAAO,EACT,CACF,CAGA,eAAsB4P,GAAqBlC,EAAiBrN,EAAgB,CAC1E,IAAIiQ,EAAiC,CAAC,EAGhCvB,EAAgBrB,EAAM,OACzB3B,GAAS,CAAC9I,EAAY8I,CAAI,GAAK,CAAC/I,EAAM+I,CAAI,CAC7C,EAEA,QAAWA,KAAQgD,EAAe,CAChC,IAAMwB,EAA2B,MAAMF,GACrCtE,EACA1L,CACF,EACAiQ,EAAqB,KAAK,GAAGC,CAAwB,EAGvD,OAAO,MAAM,KAAK,IAAI,IAAID,CAAoB,CAAC,CACjD,CAEO,SAASE,IAA0B,CACxC,OAAO,IAAI,IAAoB,CAC7B,CAAC,cAAe,IAAI,EACpB,CAAC,eAAgB,KAAK,EACtB,CAAC,gBAAiB,OAAO,EACzB,CAAC,iBAAkB,YAAY,EAC/B,CAAC,qBAAsB,YAAY,CACrC,CAAC,CACH,CAGO,SAASC,GACdd,EACA,CACA,IAAMe,EAAM,IAAI,IAChB,OAAAf,EAAc,QAAS1B,GAAS,CACzBA,EAAK,sBAIVA,EAAK,qBAAqB,QAAS5L,GAAe,CAChDqO,EAAI,IAAIrO,EAAY4L,CAAI,CAC1B,CAAC,CACH,CAAC,EACMyC,CACT","sourcesContent":["import { z } from \"zod\"\n\n// Note: if you edit the schema here, you must also edit the schema in the\n// apps/www/public/schema/registry-item.json file.\n\nexport const registryItemTypeSchema = z.enum([\n \"registry:lib\",\n \"registry:block\",\n \"registry:component\",\n \"registry:ui\",\n \"registry:hook\",\n \"registry:page\",\n \"registry:file\",\n \"registry:theme\",\n \"registry:style\",\n \"registry:item\",\n\n // Internal use only\n \"registry:example\",\n \"registry:internal\",\n])\n\nexport const registryItemFileSchema = z.discriminatedUnion(\"type\", [\n // Target is required for registry:file and registry:page\n z.object({\n path: z.string(),\n content: z.string().optional(),\n type: z.enum([\"registry:file\", \"registry:page\"]),\n target: z.string(),\n }),\n z.object({\n path: z.string(),\n content: z.string().optional(),\n type: registryItemTypeSchema.exclude([\"registry:file\", \"registry:page\"]),\n target: z.string().optional(),\n }),\n])\n\nexport const registryItemTailwindSchema = z.object({\n config: z\n .object({\n content: z.array(z.string()).optional(),\n theme: z.record(z.string(), z.any()).optional(),\n plugins: z.array(z.string()).optional(),\n })\n .optional(),\n})\n\nexport const registryItemCssVarsSchema = z.object({\n theme: z.record(z.string(), z.string()).optional(),\n light: z.record(z.string(), z.string()).optional(),\n dark: z.record(z.string(), z.string()).optional(),\n})\n\nexport const registryItemCssSchema = z.record(\n z.string(),\n z.lazy(() =>\n z.union([\n z.string(),\n z.record(\n z.string(),\n z.union([z.string(), z.record(z.string(), z.string())])\n ),\n ])\n )\n)\n\nexport const registryItemEnvVarsSchema = z.record(z.string(), z.string())\n\nexport const registryItemSchema = z.object({\n $schema: z.string().optional(),\n extends: z.string().optional(),\n name: z.string(),\n type: registryItemTypeSchema,\n title: z.string().optional(),\n author: z.string().min(2).optional(),\n description: z.string().optional(),\n dependencies: z.array(z.string()).optional(),\n devDependencies: z.array(z.string()).optional(),\n registryDependencies: z.array(z.string()).optional(),\n files: z.array(registryItemFileSchema).optional(),\n tailwind: registryItemTailwindSchema.optional(),\n cssVars: registryItemCssVarsSchema.optional(),\n css: registryItemCssSchema.optional(),\n envVars: registryItemEnvVarsSchema.optional(),\n meta: z.record(z.string(), z.any()).optional(),\n docs: z.string().optional(),\n categories: z.array(z.string()).optional(),\n})\n\nexport type RegistryItem = z.infer<typeof registryItemSchema>\n\nexport const registrySchema = z.object({\n name: z.string(),\n homepage: z.string(),\n items: z.array(registryItemSchema),\n})\n\nexport type Registry = z.infer<typeof registrySchema>\n\nexport const registryIndexSchema = z.array(registryItemSchema)\n\nexport const stylesSchema = z.array(\n z.object({\n name: z.string(),\n label: z.string(),\n })\n)\n\nexport const iconsSchema = z.record(\n z.string(),\n z.record(z.string(), z.string())\n)\n\nexport const registryBaseColorSchema = z.object({\n inlineColors: z.object({\n light: z.record(z.string(), z.string()),\n dark: z.record(z.string(), z.string()),\n }),\n cssVars: registryItemCssVarsSchema,\n cssVarsV4: registryItemCssVarsSchema.optional(),\n inlineColorsTemplate: z.string(),\n cssVarsTemplate: z.string(),\n})\n\nexport const registryResolvedItemsTreeSchema = registryItemSchema.pick({\n dependencies: true,\n devDependencies: true,\n files: true,\n tailwind: true,\n cssVars: true,\n css: true,\n envVars: true,\n docs: true,\n})\n","import { promises as fs } from \"fs\"\nimport { homedir } from \"os\"\nimport path from \"path\"\nimport { isLocalFile } from \"@/src/registry/utils\"\nimport { Config, getTargetStyleFromConfig } from \"@/src/utils/get-config\"\nimport { getProjectTailwindVersionFromConfig } from \"@/src/utils/get-project-info\"\nimport { handleError } from \"@/src/utils/handle-error\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport { buildTailwindThemeColorsFromCssVars } from \"@/src/utils/updaters/update-tailwind-config\"\nimport deepmerge from \"deepmerge\"\nimport { HttpsProxyAgent } from \"https-proxy-agent\"\nimport fetch from \"node-fetch\"\nimport { z } from \"zod\"\n\nimport {\n iconsSchema,\n registryBaseColorSchema,\n registryIndexSchema,\n registryItemSchema,\n registryResolvedItemsTreeSchema,\n stylesSchema,\n} from \"./schema\"\n\nconst REGISTRY_URL = process.env.REGISTRY_URL ?? \"https://ui.shadcn.com/r\"\n\nconst agent = process.env.https_proxy\n ? new HttpsProxyAgent(process.env.https_proxy)\n : undefined\n\nconst registryCache = new Map<string, Promise<any>>()\n\nexport const BASE_COLORS = [\n {\n name: \"neutral\",\n label: \"Neutral\",\n },\n {\n name: \"gray\",\n label: \"Gray\",\n },\n {\n name: \"zinc\",\n label: \"Zinc\",\n },\n {\n name: \"stone\",\n label: \"Stone\",\n },\n {\n name: \"slate\",\n label: \"Slate\",\n },\n] as const\n\nexport async function getRegistryIndex() {\n try {\n const [result] = await fetchRegistry([\"index.json\"])\n\n return registryIndexSchema.parse(result)\n } catch (error) {\n logger.error(\"\\n\")\n handleError(error)\n }\n}\n\nexport async function getRegistryStyles() {\n try {\n const [result] = await fetchRegistry([\"styles/index.json\"])\n\n return stylesSchema.parse(result)\n } catch (error) {\n logger.error(\"\\n\")\n handleError(error)\n return []\n }\n}\n\nexport async function getRegistryIcons() {\n try {\n const [result] = await fetchRegistry([\"icons/index.json\"])\n return iconsSchema.parse(result)\n } catch (error) {\n handleError(error)\n return {}\n }\n}\n\nexport async function getRegistryItem(name: string, style: string) {\n try {\n // Handle local file paths\n if (isLocalFile(name)) {\n return await getLocalRegistryItem(name)\n }\n\n // Handle URLs and component names\n const [result] = await fetchRegistry([\n isUrl(name) ? name : `styles/${style}/${name}.json`,\n ])\n\n return registryItemSchema.parse(result)\n } catch (error) {\n logger.break()\n handleError(error)\n return null\n }\n}\n\nasync function getLocalRegistryItem(filePath: string) {\n try {\n // Handle tilde expansion for home directory\n let expandedPath = filePath\n if (filePath.startsWith(\"~/\")) {\n expandedPath = path.join(homedir(), filePath.slice(2))\n }\n\n const resolvedPath = path.resolve(expandedPath)\n const content = await fs.readFile(resolvedPath, \"utf8\")\n const parsed = JSON.parse(content)\n\n return registryItemSchema.parse(parsed)\n } catch (error) {\n logger.error(`Failed to read local registry file: ${filePath}`)\n handleError(error)\n return null\n }\n}\n\nexport async function getRegistryBaseColors() {\n return BASE_COLORS\n}\n\nexport async function getRegistryBaseColor(baseColor: string) {\n try {\n const [result] = await fetchRegistry([`colors/${baseColor}.json`])\n\n return registryBaseColorSchema.parse(result)\n } catch (error) {\n handleError(error)\n }\n}\n\nexport async function resolveTree(\n index: z.infer<typeof registryIndexSchema>,\n names: string[]\n) {\n const tree: z.infer<typeof registryIndexSchema> = []\n\n for (const name of names) {\n const entry = index.find((entry) => entry.name === name)\n\n if (!entry) {\n continue\n }\n\n tree.push(entry)\n\n if (entry.registryDependencies) {\n const dependencies = await resolveTree(index, entry.registryDependencies)\n tree.push(...dependencies)\n }\n }\n\n return tree.filter(\n (component, index, self) =>\n self.findIndex((c) => c.name === component.name) === index\n )\n}\n\nexport async function fetchTree(\n style: string,\n tree: z.infer<typeof registryIndexSchema>\n) {\n try {\n const paths = tree.map((item) => `styles/${style}/${item.name}.json`)\n const result = await fetchRegistry(paths)\n return registryIndexSchema.parse(result)\n } catch (error) {\n handleError(error)\n }\n}\n\nexport async function getItemTargetPath(\n config: Config,\n item: Pick<z.infer<typeof registryItemSchema>, \"type\">,\n override?: string\n) {\n if (override) {\n return override\n }\n\n if (item.type === \"registry:ui\") {\n return config.resolvedPaths.ui ?? config.resolvedPaths.components\n }\n\n const [parent, type] = item.type?.split(\":\") ?? []\n if (!(parent in config.resolvedPaths)) {\n return null\n }\n\n return path.join(\n config.resolvedPaths[parent as keyof typeof config.resolvedPaths],\n type\n )\n}\n\nexport async function fetchRegistry(\n paths: string[],\n options: { useCache?: boolean } = {}\n) {\n options = {\n useCache: true,\n ...options,\n }\n\n try {\n const results = await Promise.all(\n paths.map(async (path) => {\n const url = getRegistryUrl(path)\n\n // Check cache first if caching is enabled\n if (options.useCache && registryCache.has(url)) {\n return registryCache.get(url)\n }\n\n // Store the promise in the cache before awaiting if caching is enabled\n const fetchPromise = (async () => {\n const response = await fetch(url, { agent })\n\n if (!response.ok) {\n const errorMessages: { [key: number]: string } = {\n 400: \"Bad request\",\n 401: \"Unauthorized\",\n 403: \"Forbidden\",\n 404: \"Not found\",\n 500: \"Internal server error\",\n }\n\n if (response.status === 401) {\n throw new Error(\n `You are not authorized to access the component at ${highlighter.info(\n url\n )}.\\nIf this is a remote registry, you may need to authenticate.`\n )\n }\n\n if (response.status === 404) {\n throw new Error(\n `The component at ${highlighter.info(\n url\n )} was not found.\\nIt may not exist at the registry. Please make sure it is a valid component.`\n )\n }\n\n if (response.status === 403) {\n throw new Error(\n `You do not have access to the component at ${highlighter.info(\n url\n )}.\\nIf this is a remote registry, you may need to authenticate or a token.`\n )\n }\n\n const result = await response.json()\n const message =\n result && typeof result === \"object\" && \"error\" in result\n ? result.error\n : response.statusText || errorMessages[response.status]\n throw new Error(\n `Failed to fetch from ${highlighter.info(url)}.\\n${message}`\n )\n }\n\n return response.json()\n })()\n\n if (options.useCache) {\n registryCache.set(url, fetchPromise)\n }\n return fetchPromise\n })\n )\n\n return results\n } catch (error) {\n logger.error(\"\\n\")\n handleError(error)\n return []\n }\n}\n\nexport function clearRegistryCache() {\n registryCache.clear()\n}\n\nasync function resolveDependenciesRecursively(\n dependencies: string[],\n config?: Config,\n visited: Set<string> = new Set()\n): Promise<{\n items: z.infer<typeof registryItemSchema>[]\n registryNames: string[]\n}> {\n const items: z.infer<typeof registryItemSchema>[] = []\n const registryNames: string[] = []\n\n for (const dep of dependencies) {\n // Avoid infinite recursion.\n if (visited.has(dep)) {\n continue\n }\n visited.add(dep)\n\n if (isUrl(dep) || isLocalFile(dep)) {\n const item = await getRegistryItem(dep, \"\")\n if (item) {\n items.push(item)\n if (item.registryDependencies) {\n const nested = await resolveDependenciesRecursively(\n item.registryDependencies,\n config,\n visited\n )\n items.push(...nested.items)\n registryNames.push(...nested.registryNames)\n }\n }\n } else {\n // Registry name - add it to the list\n registryNames.push(dep)\n\n // If we have config, we can also fetch the item to get its dependencies\n if (config) {\n const style = config.resolvedPaths?.cwd\n ? await getTargetStyleFromConfig(\n config.resolvedPaths.cwd,\n config.style\n )\n : config.style\n\n try {\n const item = await getRegistryItem(dep, style)\n if (item && item.registryDependencies) {\n const nested = await resolveDependenciesRecursively(\n item.registryDependencies,\n config,\n visited\n )\n items.push(...nested.items)\n registryNames.push(...nested.registryNames)\n }\n } catch (error) {\n // If we can't fetch the registry item, that's okay - we'll still include the name\n }\n }\n }\n }\n\n return { items, registryNames }\n}\n\nexport async function registryResolveItemsTree(\n names: z.infer<typeof registryItemSchema>[\"name\"][],\n config: Config\n) {\n try {\n // Separate local files, URLs, and registry names.\n const localFiles = names.filter((name) => isLocalFile(name))\n const urls = names.filter((name) => isUrl(name))\n const registryNames = names.filter(\n (name) => !isLocalFile(name) && !isUrl(name)\n )\n\n const payload: z.infer<typeof registryItemSchema>[] = []\n\n // Handle local files and URLs directly, collecting their dependencies.\n const allDependencies: string[] = []\n\n for (const localFile of localFiles) {\n const item = await getRegistryItem(localFile, \"\")\n if (item) {\n payload.push(item)\n if (item.registryDependencies) {\n allDependencies.push(...item.registryDependencies)\n }\n }\n }\n\n for (const url of urls) {\n const item = await getRegistryItem(url, \"\")\n if (item) {\n payload.push(item)\n if (item.registryDependencies) {\n allDependencies.push(...item.registryDependencies)\n }\n }\n }\n\n // Recursively resolve all dependencies.\n const { items: dependencyItems, registryNames: dependencyRegistryNames } =\n await resolveDependenciesRecursively(allDependencies, config)\n\n payload.push(...dependencyItems)\n\n // Handle registry names using existing resolveRegistryItems logic.\n const allRegistryNames = [...registryNames, ...dependencyRegistryNames]\n if (allRegistryNames.length > 0) {\n const index = await getRegistryIndex()\n if (!index) {\n // If we only have local files or URLs, that's fine.\n if (payload.length === 0) {\n return null\n }\n } else {\n // Remove duplicates.\n const uniqueRegistryNames = Array.from(new Set(allRegistryNames))\n\n // If we're resolving the index, we want it to go first.\n if (uniqueRegistryNames.includes(\"index\")) {\n uniqueRegistryNames.unshift(\"index\")\n }\n\n let registryItems = await resolveRegistryItems(\n uniqueRegistryNames,\n config\n )\n let result = await fetchRegistry(registryItems)\n const registryPayload = z.array(registryItemSchema).parse(result)\n payload.push(...registryPayload)\n }\n }\n\n if (!payload.length) {\n return null\n }\n\n // If we're resolving the index, we want to fetch\n // the theme item if a base color is provided.\n // We do this for index only.\n // Other components will ship with their theme tokens.\n if (allRegistryNames.includes(\"index\")) {\n if (config.tailwind.baseColor) {\n const theme = await registryGetTheme(config.tailwind.baseColor, config)\n if (theme) {\n payload.unshift(theme)\n }\n }\n }\n\n // Sort the payload so that registry:theme is always first.\n payload.sort((a, b) => {\n if (a.type === \"registry:theme\") {\n return -1\n }\n return 1\n })\n\n let tailwind = {}\n payload.forEach((item) => {\n tailwind = deepmerge(tailwind, item.tailwind ?? {})\n })\n\n let cssVars = {}\n payload.forEach((item) => {\n cssVars = deepmerge(cssVars, item.cssVars ?? {})\n })\n\n let css = {}\n payload.forEach((item) => {\n css = deepmerge(css, item.css ?? {})\n })\n\n let docs = \"\"\n payload.forEach((item) => {\n if (item.docs) {\n docs += `${item.docs}\\n`\n }\n })\n\n let envVars = {}\n payload.forEach((item) => {\n envVars = deepmerge(envVars, item.envVars ?? {})\n })\n\n const parsed = registryResolvedItemsTreeSchema.parse({\n dependencies: deepmerge.all(\n payload.map((item) => item.dependencies ?? [])\n ),\n devDependencies: deepmerge.all(\n payload.map((item) => item.devDependencies ?? [])\n ),\n files: deepmerge.all(payload.map((item) => item.files ?? [])),\n tailwind,\n cssVars,\n css,\n docs,\n })\n\n if (Object.keys(envVars).length > 0) {\n parsed.envVars = envVars\n }\n\n return parsed\n } catch (error) {\n handleError(error)\n return null\n }\n}\n\nasync function resolveRegistryDependencies(\n url: string,\n config: Config\n): Promise<string[]> {\n const { registryNames } = await resolveDependenciesRecursively([url], config)\n\n const style = config.resolvedPaths?.cwd\n ? await getTargetStyleFromConfig(config.resolvedPaths.cwd, config.style)\n : config.style\n\n const urls = registryNames.map((name) =>\n getRegistryUrl(isUrl(name) ? name : `styles/${style}/${name}.json`)\n )\n\n return Array.from(new Set(urls))\n}\n\nexport async function registryGetTheme(name: string, config: Config) {\n const [baseColor, tailwindVersion] = await Promise.all([\n getRegistryBaseColor(name),\n getProjectTailwindVersionFromConfig(config),\n ])\n if (!baseColor) {\n return null\n }\n\n // TODO: Move this to the registry i.e registry:theme.\n const theme = {\n name,\n type: \"registry:theme\",\n tailwind: {\n config: {\n theme: {\n extend: {\n borderRadius: {\n lg: \"var(--radius)\",\n md: \"calc(var(--radius) - 2px)\",\n sm: \"calc(var(--radius) - 4px)\",\n },\n colors: {},\n },\n },\n },\n },\n cssVars: {\n theme: {},\n light: {\n radius: \"0.5rem\",\n },\n dark: {},\n },\n } satisfies z.infer<typeof registryItemSchema>\n\n if (config.tailwind.cssVariables) {\n theme.tailwind.config.theme.extend.colors = {\n ...theme.tailwind.config.theme.extend.colors,\n ...buildTailwindThemeColorsFromCssVars(baseColor.cssVars.dark ?? {}),\n }\n theme.cssVars = {\n theme: {\n ...baseColor.cssVars.theme,\n ...theme.cssVars.theme,\n },\n light: {\n ...baseColor.cssVars.light,\n ...theme.cssVars.light,\n },\n dark: {\n ...baseColor.cssVars.dark,\n ...theme.cssVars.dark,\n },\n }\n\n if (tailwindVersion === \"v4\" && baseColor.cssVarsV4) {\n theme.cssVars = {\n theme: {\n ...baseColor.cssVarsV4.theme,\n ...theme.cssVars.theme,\n },\n light: {\n radius: \"0.625rem\",\n ...baseColor.cssVarsV4.light,\n },\n dark: {\n ...baseColor.cssVarsV4.dark,\n },\n }\n }\n }\n\n return theme\n}\n\nfunction getRegistryUrl(path: string) {\n if (isUrl(path)) {\n // If the url contains /chat/b/, we assume it's the v0 registry.\n // We need to add the /json suffix if it's missing.\n const url = new URL(path)\n if (url.pathname.match(/\\/chat\\/b\\//) && !url.pathname.endsWith(\"/json\")) {\n url.pathname = `${url.pathname}/json`\n }\n\n return url.toString()\n }\n\n return `${REGISTRY_URL}/${path}`\n}\n\nexport function isUrl(path: string) {\n try {\n new URL(path)\n return true\n } catch (error) {\n return false\n }\n}\n\n// TODO: We're double-fetching here. Use a cache.\nexport async function resolveRegistryItems(names: string[], config: Config) {\n let registryDependencies: string[] = []\n\n // Filter out local files and URLs - these should be handled directly by getRegistryItem\n const registryNames = names.filter(\n (name) => !isLocalFile(name) && !isUrl(name)\n )\n\n for (const name of registryNames) {\n const itemRegistryDependencies = await resolveRegistryDependencies(\n name,\n config\n )\n registryDependencies.push(...itemRegistryDependencies)\n }\n\n return Array.from(new Set(registryDependencies))\n}\n\nexport function getRegistryTypeAliasMap() {\n return new Map<string, string>([\n [\"registry:ui\", \"ui\"],\n [\"registry:lib\", \"lib\"],\n [\"registry:hook\", \"hooks\"],\n [\"registry:block\", \"components\"],\n [\"registry:component\", \"components\"],\n ])\n}\n\n// Track a dependency and its parent.\nexport function getRegistryParentMap(\n registryItems: z.infer<typeof registryItemSchema>[]\n) {\n const map = new Map<string, z.infer<typeof registryItemSchema>>()\n registryItems.forEach((item) => {\n if (!item.registryDependencies) {\n return\n }\n\n item.registryDependencies.forEach((dependency) => {\n map.set(dependency, item)\n })\n })\n return map\n}\n","import * as fs from \"fs/promises\"\nimport { tmpdir } from \"os\"\nimport * as path from \"path\"\nimport { registryItemSchema } from \"@/src/registry\"\nimport { configSchema } from \"@/src/utils/get-config\"\nimport { ProjectInfo } from \"@/src/utils/get-project-info\"\nimport { resolveImport } from \"@/src/utils/resolve-import\"\nimport { Project, ScriptKind } from \"ts-morph\"\nimport { loadConfig } from \"tsconfig-paths\"\nimport { z } from \"zod\"\n\nconst FILE_EXTENSIONS_FOR_LOOKUP = [\".tsx\", \".ts\", \".jsx\", \".js\", \".css\"]\nconst FILE_PATH_SKIP_LIST = [\"lib/utils.ts\"]\nconst DEPENDENCY_SKIP_LIST = [\n /^(react|react-dom|next)(\\/.*)?$/, // Matches react, react-dom, next and their submodules\n /^(node|jsr|npm):.*$/, // Matches node:, jsr:, and npm: prefixed modules\n]\n\nconst project = new Project({\n compilerOptions: {},\n})\n\n// This returns the dependency from the module specifier.\n// Here dependency means an npm package.\nexport function getDependencyFromModuleSpecifier(\n moduleSpecifier: string\n): string | null {\n // Skip if the dependency matches any pattern in the skip list\n if (DEPENDENCY_SKIP_LIST.some((pattern) => pattern.test(moduleSpecifier))) {\n return null\n }\n\n // If the module specifier does not start with `@` and has a /, add the dependency first part only.\n // E.g. `foo/bar` -> `foo`\n if (!moduleSpecifier.startsWith(\"@\") && moduleSpecifier.includes(\"/\")) {\n moduleSpecifier = moduleSpecifier.split(\"/\")[0]\n }\n\n // For scoped packages, we want to keep the first two parts\n // E.g. `@types/react/dom` -> `@types/react`\n if (moduleSpecifier.startsWith(\"@\")) {\n const parts = moduleSpecifier.split(\"/\")\n if (parts.length > 2) {\n moduleSpecifier = parts.slice(0, 2).join(\"/\")\n }\n }\n\n return moduleSpecifier\n}\n\nexport async function recursivelyResolveFileImports(\n filePath: string,\n config: z.infer<typeof configSchema>,\n projectInfo: ProjectInfo,\n processedFiles: Set<string> = new Set()\n): Promise<Pick<z.infer<typeof registryItemSchema>, \"files\" | \"dependencies\">> {\n const resolvedFilePath = path.resolve(config.resolvedPaths.cwd, filePath)\n const relativeRegistryFilePath = path.relative(\n config.resolvedPaths.cwd,\n resolvedFilePath\n )\n\n // Skip if the file is in the skip list\n if (FILE_PATH_SKIP_LIST.includes(relativeRegistryFilePath)) {\n return { dependencies: [], files: [] }\n }\n\n // Skip if the file extension is not one of the supported extensions\n const fileExtension = path.extname(filePath)\n if (!FILE_EXTENSIONS_FOR_LOOKUP.includes(fileExtension)) {\n return { dependencies: [], files: [] }\n }\n\n // Prevent infinite loop: skip if already processed\n if (processedFiles.has(relativeRegistryFilePath)) {\n return { dependencies: [], files: [] }\n }\n processedFiles.add(relativeRegistryFilePath)\n\n const stat = await fs.stat(resolvedFilePath)\n if (!stat.isFile()) {\n // Optionally log or handle this case\n return { dependencies: [], files: [] }\n }\n\n const content = await fs.readFile(resolvedFilePath, \"utf-8\")\n const tempFile = await createTempSourceFile(path.basename(resolvedFilePath))\n const sourceFile = project.createSourceFile(tempFile, content, {\n scriptKind: ScriptKind.TSX,\n })\n const tsConfig = await loadConfig(config.resolvedPaths.cwd)\n if (tsConfig.resultType === \"failed\") {\n return { dependencies: [], files: [] }\n }\n\n const files: z.infer<typeof registryItemSchema>[\"files\"] = []\n const dependencies = new Set<string>()\n\n // Add the original file first\n const fileType = determineFileType(filePath)\n const originalFile = {\n path: relativeRegistryFilePath,\n type: fileType,\n target: \"\",\n }\n files.push(originalFile)\n\n // 1. Find all import statements in the file.\n const importStatements = sourceFile.getImportDeclarations()\n for (const importStatement of importStatements) {\n const moduleSpecifier = importStatement.getModuleSpecifierValue()\n\n const isRelativeImport = moduleSpecifier.startsWith(\".\")\n const isAliasImport = moduleSpecifier.startsWith(\n `${projectInfo.aliasPrefix}/`\n )\n\n // If not a local import, add to the dependencies array.\n if (!isAliasImport && !isRelativeImport) {\n const dependency = getDependencyFromModuleSpecifier(moduleSpecifier)\n if (dependency) {\n dependencies.add(dependency)\n }\n continue\n }\n\n let probableImportFilePath = await resolveImport(moduleSpecifier, tsConfig)\n\n if (isRelativeImport) {\n probableImportFilePath = path.resolve(\n path.dirname(resolvedFilePath),\n moduleSpecifier\n )\n }\n\n if (!probableImportFilePath) {\n continue\n }\n\n // Check if the probable import path has a file extension.\n // Try each extension until we find a file that exists.\n const hasExtension = path.extname(probableImportFilePath)\n if (!hasExtension) {\n for (const ext of FILE_EXTENSIONS_FOR_LOOKUP) {\n const pathWithExt: string = `${probableImportFilePath}${ext}`\n try {\n await fs.access(pathWithExt)\n probableImportFilePath = pathWithExt\n break\n } catch {\n continue\n }\n }\n }\n\n const nestedRelativeRegistryFilePath = path.relative(\n config.resolvedPaths.cwd,\n probableImportFilePath\n )\n\n // Skip if we've already processed this file or if it's in the skip list\n if (\n processedFiles.has(nestedRelativeRegistryFilePath) ||\n FILE_PATH_SKIP_LIST.includes(nestedRelativeRegistryFilePath)\n ) {\n continue\n }\n\n const fileType = determineFileType(moduleSpecifier)\n const file = {\n path: nestedRelativeRegistryFilePath,\n type: fileType,\n target: \"\",\n }\n\n // TODO (shadcn): fix this.\n if (fileType === \"registry:page\" || fileType === \"registry:file\") {\n file.target = moduleSpecifier\n }\n\n files.push(file)\n\n // Recursively process the imported file, passing the shared processedFiles set\n const nestedResults = await recursivelyResolveFileImports(\n nestedRelativeRegistryFilePath,\n config,\n projectInfo,\n processedFiles\n )\n\n if (nestedResults.files) {\n // Only add files that haven't been processed yet\n for (const file of nestedResults.files) {\n if (!processedFiles.has(file.path)) {\n processedFiles.add(file.path)\n files.push(file)\n }\n }\n }\n\n if (nestedResults.dependencies) {\n nestedResults.dependencies.forEach((dep) => dependencies.add(dep))\n }\n }\n\n // Deduplicate files by path\n const uniqueFiles = Array.from(\n new Map(files.map((file) => [file.path, file])).values()\n )\n\n return {\n dependencies: Array.from(dependencies),\n files: uniqueFiles,\n }\n}\n\nasync function createTempSourceFile(filename: string) {\n const dir = await fs.mkdtemp(path.join(tmpdir(), \"shadcn-\"))\n return path.join(dir, filename)\n}\n\n// This is a bit tricky to accurately determine.\n// For now we'll use the module specifier to determine the type.\nfunction determineFileType(\n moduleSpecifier: string\n): z.infer<typeof registryItemSchema>[\"type\"] {\n if (moduleSpecifier.includes(\"/ui/\")) {\n return \"registry:ui\"\n }\n\n if (moduleSpecifier.includes(\"/lib/\")) {\n return \"registry:lib\"\n }\n\n if (moduleSpecifier.includes(\"/hooks/\")) {\n return \"registry:hook\"\n }\n\n if (moduleSpecifier.includes(\"/components/\")) {\n return \"registry:component\"\n }\n\n return \"registry:component\"\n}\n\n// Additional utility functions for local file support\nexport function isUrl(path: string) {\n try {\n new URL(path)\n return true\n } catch (error) {\n return false\n }\n}\n\nexport function isLocalFile(path: string) {\n return path.endsWith(\".json\") && !isUrl(path)\n}\n\n/**\n * Check if a registry item is universal (framework-agnostic).\n * A universal registry item must have all files with:\n * 1. Explicit targets\n * 2. Type \"registry:file\"\n * It can be installed without framework detection or components.json.\n */\nexport function isUniversalRegistryItem(\n registryItem:\n | Pick<z.infer<typeof registryItemSchema>, \"files\">\n | null\n | undefined\n): boolean {\n return (\n !!registryItem?.files?.length &&\n registryItem.files.every(\n (file) => !!file.target && file.type === \"registry:file\"\n )\n )\n}\n","import { createMatchPath, type ConfigLoaderSuccessResult } from \"tsconfig-paths\"\n\nexport async function resolveImport(\n importPath: string,\n config: Pick<ConfigLoaderSuccessResult, \"absoluteBaseUrl\" | \"paths\">\n) {\n return createMatchPath(config.absoluteBaseUrl, config.paths)(\n importPath,\n undefined,\n () => true,\n [\".ts\", \".tsx\", \".jsx\", \".js\", \".css\"]\n )\n}\n","import path from \"path\"\nimport { getProjectInfo } from \"@/src/utils/get-project-info\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { resolveImport } from \"@/src/utils/resolve-import\"\nimport { cosmiconfig } from \"cosmiconfig\"\nimport fg from \"fast-glob\"\nimport { loadConfig } from \"tsconfig-paths\"\nimport { z } from \"zod\"\n\nexport const DEFAULT_STYLE = \"default\"\nexport const DEFAULT_COMPONENTS = \"@/components\"\nexport const DEFAULT_UTILS = \"@/lib/utils\"\nexport const DEFAULT_TAILWIND_CSS = \"app/globals.css\"\nexport const DEFAULT_TAILWIND_CONFIG = \"tailwind.config.js\"\nexport const DEFAULT_TAILWIND_BASE_COLOR = \"slate\"\n\n// TODO: Figure out if we want to support all cosmiconfig formats.\n// A simple components.json file would be nice.\nconst explorer = cosmiconfig(\"components\", {\n searchPlaces: [\"components.json\"],\n})\n\nexport const rawConfigSchema = z\n .object({\n $schema: z.string().optional(),\n style: z.string(),\n rsc: z.coerce.boolean().default(false),\n tsx: z.coerce.boolean().default(true),\n tailwind: z.object({\n config: z.string().optional(),\n css: z.string(),\n baseColor: z.string(),\n cssVariables: z.boolean().default(true),\n prefix: z.string().default(\"\").optional(),\n }),\n aliases: z.object({\n components: z.string(),\n utils: z.string(),\n ui: z.string().optional(),\n lib: z.string().optional(),\n hooks: z.string().optional(),\n }),\n iconLibrary: z.string().optional(),\n })\n .strict()\n\nexport type RawConfig = z.infer<typeof rawConfigSchema>\n\nexport const configSchema = rawConfigSchema.extend({\n resolvedPaths: z.object({\n cwd: z.string(),\n tailwindConfig: z.string(),\n tailwindCss: z.string(),\n utils: z.string(),\n components: z.string(),\n lib: z.string(),\n hooks: z.string(),\n ui: z.string(),\n }),\n})\n\nexport type Config = z.infer<typeof configSchema>\n\n// TODO: type the key.\n// Okay for now since I don't want a breaking change.\nexport const workspaceConfigSchema = z.record(configSchema)\n\nexport async function getConfig(cwd: string) {\n const config = await getRawConfig(cwd)\n\n if (!config) {\n return null\n }\n\n // Set default icon library if not provided.\n if (!config.iconLibrary) {\n config.iconLibrary = config.style === \"new-york\" ? \"radix\" : \"lucide\"\n }\n\n return await resolveConfigPaths(cwd, config)\n}\n\nexport async function resolveConfigPaths(cwd: string, config: RawConfig) {\n // Read tsconfig.json.\n const tsConfig = await loadConfig(cwd)\n\n if (tsConfig.resultType === \"failed\") {\n throw new Error(\n `Failed to load ${config.tsx ? \"tsconfig\" : \"jsconfig\"}.json. ${\n tsConfig.message ?? \"\"\n }`.trim()\n )\n }\n\n return configSchema.parse({\n ...config,\n resolvedPaths: {\n cwd,\n tailwindConfig: config.tailwind.config\n ? path.resolve(cwd, config.tailwind.config)\n : \"\",\n tailwindCss: path.resolve(cwd, config.tailwind.css),\n utils: await resolveImport(config.aliases[\"utils\"], tsConfig),\n components: await resolveImport(config.aliases[\"components\"], tsConfig),\n ui: config.aliases[\"ui\"]\n ? await resolveImport(config.aliases[\"ui\"], tsConfig)\n : path.resolve(\n (await resolveImport(config.aliases[\"components\"], tsConfig)) ??\n cwd,\n \"ui\"\n ),\n // TODO: Make this configurable.\n // For now, we assume the lib and hooks directories are one level up from the components directory.\n lib: config.aliases[\"lib\"]\n ? await resolveImport(config.aliases[\"lib\"], tsConfig)\n : path.resolve(\n (await resolveImport(config.aliases[\"utils\"], tsConfig)) ?? cwd,\n \"..\"\n ),\n hooks: config.aliases[\"hooks\"]\n ? await resolveImport(config.aliases[\"hooks\"], tsConfig)\n : path.resolve(\n (await resolveImport(config.aliases[\"components\"], tsConfig)) ??\n cwd,\n \"..\",\n \"hooks\"\n ),\n },\n })\n}\n\nexport async function getRawConfig(cwd: string): Promise<RawConfig | null> {\n try {\n const configResult = await explorer.search(cwd)\n\n if (!configResult) {\n return null\n }\n\n return rawConfigSchema.parse(configResult.config)\n } catch (error) {\n const componentPath = `${cwd}/components.json`\n throw new Error(\n `Invalid configuration found in ${highlighter.info(componentPath)}.`\n )\n }\n}\n\n// Note: we can check for -workspace.yaml or \"workspace\" in package.json.\n// Since cwd is not necessarily the root of the project.\n// We'll instead check if ui aliases resolve to a different root.\nexport async function getWorkspaceConfig(config: Config) {\n let resolvedAliases: any = {}\n\n for (const key of Object.keys(config.aliases)) {\n if (!isAliasKey(key, config)) {\n continue\n }\n\n const resolvedPath = config.resolvedPaths[key]\n const packageRoot = await findPackageRoot(\n config.resolvedPaths.cwd,\n resolvedPath\n )\n\n if (!packageRoot) {\n resolvedAliases[key] = config\n continue\n }\n\n resolvedAliases[key] = await getConfig(packageRoot)\n }\n\n const result = workspaceConfigSchema.safeParse(resolvedAliases)\n if (!result.success) {\n return null\n }\n\n return result.data\n}\n\nexport async function findPackageRoot(cwd: string, resolvedPath: string) {\n const commonRoot = findCommonRoot(cwd, resolvedPath)\n const relativePath = path.relative(commonRoot, resolvedPath)\n\n const packageRoots = await fg.glob(\"**/package.json\", {\n cwd: commonRoot,\n deep: 3,\n ignore: [\"**/node_modules/**\", \"**/dist/**\", \"**/build/**\", \"**/public/**\"],\n })\n\n const matchingPackageRoot = packageRoots\n .map((pkgPath) => path.dirname(pkgPath))\n .find((pkgDir) => relativePath.startsWith(pkgDir))\n\n return matchingPackageRoot ? path.join(commonRoot, matchingPackageRoot) : null\n}\n\nfunction isAliasKey(\n key: string,\n config: Config\n): key is keyof Config[\"aliases\"] {\n return Object.keys(config.resolvedPaths)\n .filter((key) => key !== \"utils\")\n .includes(key)\n}\n\nexport function findCommonRoot(cwd: string, resolvedPath: string) {\n const parts1 = cwd.split(path.sep)\n const parts2 = resolvedPath.split(path.sep)\n const commonParts = []\n\n for (let i = 0; i < Math.min(parts1.length, parts2.length); i++) {\n if (parts1[i] !== parts2[i]) {\n break\n }\n commonParts.push(parts1[i])\n }\n\n return commonParts.join(path.sep)\n}\n\n// TODO: Cache this call.\nexport async function getTargetStyleFromConfig(cwd: string, fallback: string) {\n const projectInfo = await getProjectInfo(cwd)\n return projectInfo?.tailwindVersion === \"v4\" ? \"new-york-v4\" : fallback\n}\n\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P]\n}\n\n/**\n * Creates a config object with sensible defaults.\n * Useful for universal registry items that bypass framework detection.\n *\n * @param partial - Partial config values to override defaults\n * @returns A complete Config object\n */\nexport function createConfig(partial?: DeepPartial<Config>): Config {\n const defaultConfig: Config = {\n resolvedPaths: {\n cwd: process.cwd(),\n tailwindConfig: \"\",\n tailwindCss: \"\",\n utils: \"\",\n components: \"\",\n ui: \"\",\n lib: \"\",\n hooks: \"\",\n },\n style: \"\",\n tailwind: {\n config: \"\",\n css: \"\",\n baseColor: \"\",\n cssVariables: false,\n },\n rsc: false,\n tsx: true,\n aliases: {\n components: \"\",\n utils: \"\",\n },\n }\n\n // Deep merge the partial config with defaults\n if (partial) {\n return {\n ...defaultConfig,\n ...partial,\n resolvedPaths: {\n ...defaultConfig.resolvedPaths,\n ...(partial.resolvedPaths || {}),\n },\n tailwind: {\n ...defaultConfig.tailwind,\n ...(partial.tailwind || {}),\n },\n aliases: {\n ...defaultConfig.aliases,\n ...(partial.aliases || {}),\n },\n }\n }\n\n return defaultConfig\n}\n","import path from \"path\"\nimport { FRAMEWORKS, Framework } from \"@/src/utils/frameworks\"\nimport {\n Config,\n RawConfig,\n getConfig,\n resolveConfigPaths,\n} from \"@/src/utils/get-config\"\nimport { getPackageInfo } from \"@/src/utils/get-package-info\"\nimport fg from \"fast-glob\"\nimport fs from \"fs-extra\"\nimport { loadConfig } from \"tsconfig-paths\"\nimport { z } from \"zod\"\n\nexport type TailwindVersion = \"v3\" | \"v4\" | null\n\nexport type ProjectInfo = {\n framework: Framework\n isSrcDir: boolean\n isRSC: boolean\n isTsx: boolean\n tailwindConfigFile: string | null\n tailwindCssFile: string | null\n tailwindVersion: TailwindVersion\n aliasPrefix: string | null\n}\n\nconst PROJECT_SHARED_IGNORE = [\n \"**/node_modules/**\",\n \".next\",\n \"public\",\n \"dist\",\n \"build\",\n]\n\nconst TS_CONFIG_SCHEMA = z.object({\n compilerOptions: z.object({\n paths: z.record(z.string().or(z.array(z.string()))),\n }),\n})\n\nexport async function getProjectInfo(cwd: string): Promise<ProjectInfo | null> {\n const [\n configFiles,\n isSrcDir,\n isTsx,\n tailwindConfigFile,\n tailwindCssFile,\n tailwindVersion,\n aliasPrefix,\n packageJson,\n ] = await Promise.all([\n fg.glob(\n \"**/{next,vite,astro,app}.config.*|gatsby-config.*|composer.json|react-router.config.*\",\n {\n cwd,\n deep: 3,\n ignore: PROJECT_SHARED_IGNORE,\n }\n ),\n fs.pathExists(path.resolve(cwd, \"src\")),\n isTypeScriptProject(cwd),\n getTailwindConfigFile(cwd),\n getTailwindCssFile(cwd),\n getTailwindVersion(cwd),\n getTsConfigAliasPrefix(cwd),\n getPackageInfo(cwd, false),\n ])\n\n const isUsingAppDir = await fs.pathExists(\n path.resolve(cwd, `${isSrcDir ? \"src/\" : \"\"}app`)\n )\n\n const type: ProjectInfo = {\n framework: FRAMEWORKS[\"manual\"],\n isSrcDir,\n isRSC: false,\n isTsx,\n tailwindConfigFile,\n tailwindCssFile,\n tailwindVersion,\n aliasPrefix,\n }\n\n // Next.js.\n if (configFiles.find((file) => file.startsWith(\"next.config.\"))?.length) {\n type.framework = isUsingAppDir\n ? FRAMEWORKS[\"next-app\"]\n : FRAMEWORKS[\"next-pages\"]\n type.isRSC = isUsingAppDir\n return type\n }\n\n // Astro.\n if (configFiles.find((file) => file.startsWith(\"astro.config.\"))?.length) {\n type.framework = FRAMEWORKS[\"astro\"]\n return type\n }\n\n // Gatsby.\n if (configFiles.find((file) => file.startsWith(\"gatsby-config.\"))?.length) {\n type.framework = FRAMEWORKS[\"gatsby\"]\n return type\n }\n\n // Laravel.\n if (configFiles.find((file) => file.startsWith(\"composer.json\"))?.length) {\n type.framework = FRAMEWORKS[\"laravel\"]\n return type\n }\n\n // Remix.\n if (\n Object.keys(packageJson?.dependencies ?? {}).find((dep) =>\n dep.startsWith(\"@remix-run/\")\n )\n ) {\n type.framework = FRAMEWORKS[\"remix\"]\n return type\n }\n\n // TanStack Start.\n if (\n [\n ...Object.keys(packageJson?.dependencies ?? {}),\n ...Object.keys(packageJson?.devDependencies ?? {}),\n ].find((dep) => dep.startsWith(\"@tanstack/react-start\"))\n ) {\n type.framework = FRAMEWORKS[\"tanstack-start\"]\n return type\n }\n\n // React Router.\n if (\n configFiles.find((file) => file.startsWith(\"react-router.config.\"))?.length\n ) {\n type.framework = FRAMEWORKS[\"react-router\"]\n return type\n }\n\n // Vite.\n // Some Remix templates also have a vite.config.* file.\n // We'll assume that it got caught by the Remix check above.\n if (configFiles.find((file) => file.startsWith(\"vite.config.\"))?.length) {\n type.framework = FRAMEWORKS[\"vite\"]\n return type\n }\n\n // Vinxi-based (such as @tanstack/start and @solidjs/solid-start)\n // They are vite-based, and the same configurations used for Vite should work flawlessly\n const appConfig = configFiles.find((file) => file.startsWith(\"app.config\"))\n if (appConfig?.length) {\n const appConfigContents = await fs.readFile(\n path.resolve(cwd, appConfig),\n \"utf8\"\n )\n if (appConfigContents.includes(\"defineConfig\")) {\n type.framework = FRAMEWORKS[\"vite\"]\n return type\n }\n }\n\n // Expo.\n if (packageJson?.dependencies?.expo) {\n type.framework = FRAMEWORKS[\"expo\"]\n return type\n }\n\n return type\n}\n\nexport async function getTailwindVersion(\n cwd: string\n): Promise<ProjectInfo[\"tailwindVersion\"]> {\n const [packageInfo, config] = await Promise.all([\n getPackageInfo(cwd, false),\n getConfig(cwd),\n ])\n\n // If the config file is empty, we can assume that it's a v4 project.\n if (config?.tailwind?.config === \"\") {\n return \"v4\"\n }\n\n if (\n !packageInfo?.dependencies?.tailwindcss &&\n !packageInfo?.devDependencies?.tailwindcss\n ) {\n return null\n }\n\n if (\n /^(?:\\^|~)?3(?:\\.\\d+)*(?:-.*)?$/.test(\n packageInfo?.dependencies?.tailwindcss ||\n packageInfo?.devDependencies?.tailwindcss ||\n \"\"\n )\n ) {\n return \"v3\"\n }\n\n return \"v4\"\n}\n\nexport async function getTailwindCssFile(cwd: string) {\n const [files, tailwindVersion] = await Promise.all([\n fg.glob([\"**/*.css\", \"**/*.scss\"], {\n cwd,\n deep: 5,\n ignore: PROJECT_SHARED_IGNORE,\n }),\n getTailwindVersion(cwd),\n ])\n\n if (!files.length) {\n return null\n }\n\n const needle =\n tailwindVersion === \"v4\" ? `@import \"tailwindcss\"` : \"@tailwind base\"\n for (const file of files) {\n const contents = await fs.readFile(path.resolve(cwd, file), \"utf8\")\n if (\n contents.includes(`@import \"tailwindcss\"`) ||\n contents.includes(`@import 'tailwindcss'`) ||\n contents.includes(`@tailwind base`)\n ) {\n return file\n }\n }\n\n return null\n}\n\nexport async function getTailwindConfigFile(cwd: string) {\n const files = await fg.glob(\"tailwind.config.*\", {\n cwd,\n deep: 3,\n ignore: PROJECT_SHARED_IGNORE,\n })\n\n if (!files.length) {\n return null\n }\n\n return files[0]\n}\n\nexport async function getTsConfigAliasPrefix(cwd: string) {\n const tsConfig = await loadConfig(cwd)\n\n if (\n tsConfig?.resultType === \"failed\" ||\n !Object.entries(tsConfig?.paths).length\n ) {\n return null\n }\n\n // This assume that the first alias is the prefix.\n for (const [alias, paths] of Object.entries(tsConfig.paths)) {\n if (\n paths.includes(\"./*\") ||\n paths.includes(\"./src/*\") ||\n paths.includes(\"./app/*\") ||\n paths.includes(\"./resources/js/*\") // Laravel.\n ) {\n return alias.replace(/\\/\\*$/, \"\") ?? null\n }\n }\n\n // Use the first alias as the prefix.\n return Object.keys(tsConfig?.paths)?.[0].replace(/\\/\\*$/, \"\") ?? null\n}\n\nexport async function isTypeScriptProject(cwd: string) {\n const files = await fg.glob(\"tsconfig.*\", {\n cwd,\n deep: 1,\n ignore: PROJECT_SHARED_IGNORE,\n })\n\n return files.length > 0\n}\n\nexport async function getTsConfig(cwd: string) {\n for (const fallback of [\n \"tsconfig.json\",\n \"tsconfig.web.json\",\n \"tsconfig.app.json\",\n ]) {\n const filePath = path.resolve(cwd, fallback)\n if (!(await fs.pathExists(filePath))) {\n continue\n }\n\n // We can't use fs.readJSON because it doesn't support comments.\n const contents = await fs.readFile(filePath, \"utf8\")\n const cleanedContents = contents.replace(/\\/\\*\\s*\\*\\//g, \"\")\n const result = TS_CONFIG_SCHEMA.safeParse(JSON.parse(cleanedContents))\n\n if (result.error) {\n continue\n }\n\n return result.data\n }\n\n return null\n}\n\nexport async function getProjectConfig(\n cwd: string,\n defaultProjectInfo: ProjectInfo | null = null\n): Promise<Config | null> {\n // Check for existing component config.\n const [existingConfig, projectInfo] = await Promise.all([\n getConfig(cwd),\n !defaultProjectInfo\n ? getProjectInfo(cwd)\n : Promise.resolve(defaultProjectInfo),\n ])\n\n if (existingConfig) {\n return existingConfig\n }\n\n if (\n !projectInfo ||\n !projectInfo.tailwindCssFile ||\n (projectInfo.tailwindVersion === \"v3\" && !projectInfo.tailwindConfigFile)\n ) {\n return null\n }\n\n const config: RawConfig = {\n $schema: \"https://ui.shadcn.com/schema.json\",\n rsc: projectInfo.isRSC,\n tsx: projectInfo.isTsx,\n style: \"new-york\",\n tailwind: {\n config: projectInfo.tailwindConfigFile ?? \"\",\n baseColor: \"zinc\",\n css: projectInfo.tailwindCssFile,\n cssVariables: true,\n prefix: \"\",\n },\n iconLibrary: \"lucide\",\n aliases: {\n components: `${projectInfo.aliasPrefix}/components`,\n ui: `${projectInfo.aliasPrefix}/components/ui`,\n hooks: `${projectInfo.aliasPrefix}/hooks`,\n lib: `${projectInfo.aliasPrefix}/lib`,\n utils: `${projectInfo.aliasPrefix}/lib/utils`,\n },\n }\n\n return await resolveConfigPaths(cwd, config)\n}\n\nexport async function getProjectTailwindVersionFromConfig(\n config: Config\n): Promise<TailwindVersion> {\n if (!config.resolvedPaths?.cwd) {\n return \"v3\"\n }\n\n const projectInfo = await getProjectInfo(config.resolvedPaths.cwd)\n\n if (!projectInfo?.tailwindVersion) {\n return null\n }\n\n return projectInfo.tailwindVersion\n}\n","export const FRAMEWORKS = {\n \"next-app\": {\n name: \"next-app\",\n label: \"Next.js\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/next\",\n tailwind: \"https://tailwindcss.com/docs/guides/nextjs\",\n },\n },\n \"next-pages\": {\n name: \"next-pages\",\n label: \"Next.js\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/next\",\n tailwind: \"https://tailwindcss.com/docs/guides/nextjs\",\n },\n },\n remix: {\n name: \"remix\",\n label: \"Remix\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/remix\",\n tailwind: \"https://tailwindcss.com/docs/guides/remix\",\n },\n },\n \"react-router\": {\n name: \"react-router\",\n label: \"React Router\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/react-router\",\n tailwind:\n \"https://tailwindcss.com/docs/installation/framework-guides/react-router\",\n },\n },\n vite: {\n name: \"vite\",\n label: \"Vite\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/vite\",\n tailwind: \"https://tailwindcss.com/docs/guides/vite\",\n },\n },\n astro: {\n name: \"astro\",\n label: \"Astro\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/astro\",\n tailwind: \"https://tailwindcss.com/docs/guides/astro\",\n },\n },\n laravel: {\n name: \"laravel\",\n label: \"Laravel\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/laravel\",\n tailwind: \"https://tailwindcss.com/docs/guides/laravel\",\n },\n },\n \"tanstack-start\": {\n name: \"tanstack-start\",\n label: \"TanStack Start\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/tanstack\",\n tailwind: \"https://tailwindcss.com/docs/installation/using-postcss\",\n },\n },\n gatsby: {\n name: \"gatsby\",\n label: \"Gatsby\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/gatsby\",\n tailwind: \"https://tailwindcss.com/docs/guides/gatsby\",\n },\n },\n expo: {\n name: \"expo\",\n label: \"Expo\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/expo\",\n tailwind: \"https://www.nativewind.dev/docs/getting-started/installation\",\n },\n },\n manual: {\n name: \"manual\",\n label: \"Manual\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/manual\",\n tailwind: \"https://tailwindcss.com/docs/installation\",\n },\n },\n} as const\n\nexport type Framework = (typeof FRAMEWORKS)[keyof typeof FRAMEWORKS]\n","import path from \"path\"\nimport fs from \"fs-extra\"\nimport { type PackageJson } from \"type-fest\"\n\nexport function getPackageInfo(\n cwd: string = \"\",\n shouldThrow: boolean = true\n): PackageJson | null {\n const packageJsonPath = path.join(cwd, \"package.json\")\n\n return fs.readJSONSync(packageJsonPath, {\n throws: shouldThrow,\n }) as PackageJson\n}\n","import { cyan, green, red, yellow } from \"kleur/colors\"\n\nexport const highlighter = {\n error: red,\n warn: yellow,\n info: cyan,\n success: green,\n}\n","import { highlighter } from \"@/src/utils/highlighter\"\n\nexport const logger = {\n error(...args: unknown[]) {\n console.log(highlighter.error(args.join(\" \")))\n },\n warn(...args: unknown[]) {\n console.log(highlighter.warn(args.join(\" \")))\n },\n info(...args: unknown[]) {\n console.log(highlighter.info(args.join(\" \")))\n },\n success(...args: unknown[]) {\n console.log(highlighter.success(args.join(\" \")))\n },\n log(...args: unknown[]) {\n console.log(args.join(\" \"))\n },\n break() {\n console.log(\"\")\n },\n}\n","import { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport { z } from \"zod\"\n\nexport function handleError(error: unknown) {\n logger.error(\n `Something went wrong. Please check the error below for more details.`\n )\n logger.error(`If the problem persists, please open an issue on GitHub.`)\n logger.error(\"\")\n if (typeof error === \"string\") {\n logger.error(error)\n logger.break()\n process.exit(1)\n }\n\n if (error instanceof z.ZodError) {\n logger.error(\"Validation failed:\")\n for (const [key, value] of Object.entries(error.flatten().fieldErrors)) {\n logger.error(`- ${highlighter.info(key)}: ${value}`)\n }\n logger.break()\n process.exit(1)\n }\n\n if (error instanceof Error) {\n logger.error(error.message)\n logger.break()\n process.exit(1)\n }\n\n logger.break()\n process.exit(1)\n}\n","import { promises as fs } from \"fs\"\nimport { tmpdir } from \"os\"\nimport path from \"path\"\nimport {\n registryItemCssVarsSchema,\n registryItemTailwindSchema,\n} from \"@/src/registry/schema\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { TailwindVersion } from \"@/src/utils/get-project-info\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport deepmerge from \"deepmerge\"\nimport objectToString from \"stringify-object\"\nimport { type Config as TailwindConfig } from \"tailwindcss\"\nimport {\n ArrayLiteralExpression,\n ObjectLiteralExpression,\n Project,\n PropertyAssignment,\n QuoteKind,\n ScriptKind,\n SyntaxKind,\n VariableStatement,\n} from \"ts-morph\"\nimport { z } from \"zod\"\n\nexport type UpdaterTailwindConfig = Omit<TailwindConfig, \"plugins\"> & {\n // We only want string plugins for now.\n plugins?: string[]\n}\n\nexport async function updateTailwindConfig(\n tailwindConfig:\n | z.infer<typeof registryItemTailwindSchema>[\"config\"]\n | undefined,\n config: Config,\n options: {\n silent?: boolean\n tailwindVersion?: TailwindVersion\n }\n) {\n if (!tailwindConfig) {\n return\n }\n\n options = {\n silent: false,\n tailwindVersion: \"v3\",\n ...options,\n }\n\n // No tailwind config in v4.\n if (options.tailwindVersion === \"v4\") {\n return\n }\n\n const tailwindFileRelativePath = path.relative(\n config.resolvedPaths.cwd,\n config.resolvedPaths.tailwindConfig\n )\n const tailwindSpinner = spinner(\n `Updating ${highlighter.info(tailwindFileRelativePath)}`,\n {\n silent: options.silent,\n }\n ).start()\n const raw = await fs.readFile(config.resolvedPaths.tailwindConfig, \"utf8\")\n const output = await transformTailwindConfig(raw, tailwindConfig, config)\n await fs.writeFile(config.resolvedPaths.tailwindConfig, output, \"utf8\")\n tailwindSpinner?.succeed()\n}\n\nexport async function transformTailwindConfig(\n input: string,\n tailwindConfig: UpdaterTailwindConfig,\n config: Config\n) {\n const sourceFile = await _createSourceFile(input, config)\n // Find the object with content property.\n // This is faster than traversing the default export.\n // TODO: maybe we do need to traverse the default export?\n const configObject = sourceFile\n .getDescendantsOfKind(SyntaxKind.ObjectLiteralExpression)\n .find((node) =>\n node\n .getProperties()\n .some(\n (property) =>\n property.isKind(SyntaxKind.PropertyAssignment) &&\n property.getName() === \"content\"\n )\n )\n\n // We couldn't find the config object, so we return the input as is.\n if (!configObject) {\n return input\n }\n\n const quoteChar = _getQuoteChar(configObject)\n\n // Add darkMode.\n addTailwindConfigProperty(\n configObject,\n {\n name: \"darkMode\",\n value: \"class\",\n },\n { quoteChar }\n )\n\n // Add Tailwind config plugins.\n tailwindConfig.plugins?.forEach((plugin) => {\n addTailwindConfigPlugin(configObject, plugin)\n })\n\n // Add Tailwind config theme.\n if (tailwindConfig.theme) {\n await addTailwindConfigTheme(configObject, tailwindConfig.theme)\n }\n\n return sourceFile.getFullText()\n}\n\nfunction addTailwindConfigProperty(\n configObject: ObjectLiteralExpression,\n property: {\n name: string\n value: string\n },\n {\n quoteChar,\n }: {\n quoteChar: string\n }\n) {\n const existingProperty = configObject.getProperty(\"darkMode\")\n\n if (!existingProperty) {\n const newProperty = {\n name: property.name,\n initializer: `[${quoteChar}${property.value}${quoteChar}]`,\n }\n\n // We need to add darkMode as the first property.\n if (property.name === \"darkMode\") {\n configObject.insertPropertyAssignment(0, newProperty)\n return configObject\n }\n\n configObject.addPropertyAssignment(newProperty)\n\n return configObject\n }\n\n if (existingProperty.isKind(SyntaxKind.PropertyAssignment)) {\n const initializer = existingProperty.getInitializer()\n const newValue = `${quoteChar}${property.value}${quoteChar}`\n\n // If property is a string, change it to an array and append.\n if (initializer?.isKind(SyntaxKind.StringLiteral)) {\n const initializerText = initializer.getText()\n initializer.replaceWithText(`[${initializerText}, ${newValue}]`)\n return configObject\n }\n\n // If property is an array, append.\n if (initializer?.isKind(SyntaxKind.ArrayLiteralExpression)) {\n // Check if the array already contains the value.\n if (\n initializer\n .getElements()\n .map((element) => element.getText())\n .includes(newValue)\n ) {\n return configObject\n }\n initializer.addElement(newValue)\n }\n\n return configObject\n }\n\n return configObject\n}\n\nasync function addTailwindConfigTheme(\n configObject: ObjectLiteralExpression,\n theme: UpdaterTailwindConfig[\"theme\"]\n) {\n // Ensure there is a theme property.\n if (!configObject.getProperty(\"theme\")) {\n configObject.addPropertyAssignment({\n name: \"theme\",\n initializer: \"{}\",\n })\n }\n\n // Nest all spread properties.\n nestSpreadProperties(configObject)\n\n const themeProperty = configObject\n .getPropertyOrThrow(\"theme\")\n ?.asKindOrThrow(SyntaxKind.PropertyAssignment)\n\n const themeInitializer = themeProperty.getInitializer()\n if (themeInitializer?.isKind(SyntaxKind.ObjectLiteralExpression)) {\n const themeObjectString = themeInitializer.getText()\n const themeObject = await parseObjectLiteral(themeObjectString)\n const result = deepmerge(themeObject, theme, {\n arrayMerge: (dst, src) => src,\n })\n const resultString = objectToString(result)\n .replace(/\\'\\.\\.\\.(.*)\\'/g, \"...$1\") // Remove quote around spread element\n .replace(/\\'\\\"/g, \"'\") // Replace `\\\" with \"\n .replace(/\\\"\\'/g, \"'\") // Replace `\\\" with \"\n .replace(/\\'\\[/g, \"[\") // Replace `[ with [\n .replace(/\\]\\'/g, \"]\") // Replace `] with ]\n .replace(/\\'\\\\\\'/g, \"'\") // Replace `\\' with '\n .replace(/\\\\\\'/g, \"'\") // Replace \\' with '\n .replace(/\\\\\\'\\'/g, \"'\")\n .replace(/\\'\\'/g, \"'\")\n themeInitializer.replaceWithText(resultString)\n }\n\n // Unnest all spread properties.\n unnestSpreadProperties(configObject)\n}\n\nfunction addTailwindConfigPlugin(\n configObject: ObjectLiteralExpression,\n plugin: string\n) {\n const existingPlugins = configObject.getProperty(\"plugins\")\n\n if (!existingPlugins) {\n configObject.addPropertyAssignment({\n name: \"plugins\",\n initializer: `[${plugin}]`,\n })\n\n return configObject\n }\n\n if (existingPlugins.isKind(SyntaxKind.PropertyAssignment)) {\n const initializer = existingPlugins.getInitializer()\n\n if (initializer?.isKind(SyntaxKind.ArrayLiteralExpression)) {\n if (\n initializer\n .getElements()\n .map((element) => {\n return element.getText().replace(/[\"']/g, \"\")\n })\n .includes(plugin.replace(/[\"']/g, \"\"))\n ) {\n return configObject\n }\n initializer.addElement(plugin)\n }\n\n return configObject\n }\n\n return configObject\n}\n\nexport async function _createSourceFile(input: string, config: Config | null) {\n const dir = await fs.mkdtemp(path.join(tmpdir(), \"shadcn-\"))\n const resolvedPath =\n config?.resolvedPaths?.tailwindConfig || \"tailwind.config.ts\"\n const tempFile = path.join(dir, `shadcn-${path.basename(resolvedPath)}`)\n\n const project = new Project({\n compilerOptions: {},\n })\n const sourceFile = project.createSourceFile(tempFile, input, {\n // Note: .js and .mjs can still be valid for TS projects.\n // We can't infer TypeScript from config.tsx.\n scriptKind:\n path.extname(resolvedPath) === \".ts\" ? ScriptKind.TS : ScriptKind.JS,\n })\n\n return sourceFile\n}\n\nexport function _getQuoteChar(configObject: ObjectLiteralExpression) {\n return configObject\n .getFirstDescendantByKind(SyntaxKind.StringLiteral)\n ?.getQuoteKind() === QuoteKind.Single\n ? \"'\"\n : '\"'\n}\n\nexport function nestSpreadProperties(obj: ObjectLiteralExpression) {\n const properties = obj.getProperties()\n\n for (let i = 0; i < properties.length; i++) {\n const prop = properties[i]\n if (prop.isKind(SyntaxKind.SpreadAssignment)) {\n const spreadAssignment = prop.asKindOrThrow(SyntaxKind.SpreadAssignment)\n const spreadText = spreadAssignment.getExpression().getText()\n\n // Replace spread with a property assignment\n obj.insertPropertyAssignment(i, {\n // Need to escape the name with \" so that deepmerge doesn't mishandle the key\n name: `\"___${spreadText.replace(/^\\.\\.\\./, \"\")}\"`,\n initializer: `\"...${spreadText.replace(/^\\.\\.\\./, \"\")}\"`,\n })\n\n // Remove the original spread assignment\n spreadAssignment.remove()\n } else if (prop.isKind(SyntaxKind.PropertyAssignment)) {\n const propAssignment = prop.asKindOrThrow(SyntaxKind.PropertyAssignment)\n const initializer = propAssignment.getInitializer()\n\n if (\n initializer &&\n initializer.isKind(SyntaxKind.ObjectLiteralExpression)\n ) {\n // Recursively process nested object literals\n nestSpreadProperties(\n initializer.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n )\n } else if (\n initializer &&\n initializer.isKind(SyntaxKind.ArrayLiteralExpression)\n ) {\n nestSpreadElements(\n initializer.asKindOrThrow(SyntaxKind.ArrayLiteralExpression)\n )\n }\n }\n }\n}\n\nexport function nestSpreadElements(arr: ArrayLiteralExpression) {\n const elements = arr.getElements()\n for (let j = 0; j < elements.length; j++) {\n const element = elements[j]\n if (element.isKind(SyntaxKind.ObjectLiteralExpression)) {\n // Recursive check on objects within arrays\n nestSpreadProperties(\n element.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n )\n } else if (element.isKind(SyntaxKind.ArrayLiteralExpression)) {\n // Recursive check on nested arrays\n nestSpreadElements(\n element.asKindOrThrow(SyntaxKind.ArrayLiteralExpression)\n )\n } else if (element.isKind(SyntaxKind.SpreadElement)) {\n const spreadText = element.getText()\n // Spread element within an array\n arr.removeElement(j)\n arr.insertElement(j, `\"${spreadText}\"`)\n }\n }\n}\n\nexport function unnestSpreadProperties(obj: ObjectLiteralExpression) {\n const properties = obj.getProperties()\n\n for (let i = 0; i < properties.length; i++) {\n const prop = properties[i]\n if (prop.isKind(SyntaxKind.PropertyAssignment)) {\n const propAssignment = prop as PropertyAssignment\n const initializer = propAssignment.getInitializer()\n\n if (initializer && initializer.isKind(SyntaxKind.StringLiteral)) {\n const value = initializer\n .asKindOrThrow(SyntaxKind.StringLiteral)\n .getLiteralValue()\n if (value.startsWith(\"...\")) {\n obj.insertSpreadAssignment(i, { expression: value.slice(3) })\n propAssignment.remove()\n }\n } else if (initializer?.isKind(SyntaxKind.ObjectLiteralExpression)) {\n unnestSpreadProperties(initializer as ObjectLiteralExpression)\n } else if (\n initializer &&\n initializer.isKind(SyntaxKind.ArrayLiteralExpression)\n ) {\n unsetSpreadElements(\n initializer.asKindOrThrow(SyntaxKind.ArrayLiteralExpression)\n )\n }\n }\n }\n}\n\nexport function unsetSpreadElements(arr: ArrayLiteralExpression) {\n const elements = arr.getElements()\n for (let j = 0; j < elements.length; j++) {\n const element = elements[j]\n if (element.isKind(SyntaxKind.ObjectLiteralExpression)) {\n // Recursive check on objects within arrays\n unnestSpreadProperties(\n element.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n )\n } else if (element.isKind(SyntaxKind.ArrayLiteralExpression)) {\n // Recursive check on nested arrays\n unsetSpreadElements(\n element.asKindOrThrow(SyntaxKind.ArrayLiteralExpression)\n )\n } else if (element.isKind(SyntaxKind.StringLiteral)) {\n const spreadText = element.getText()\n // check if spread element\n const spreadTest = /(?:^['\"])(\\.\\.\\..*)(?:['\"]$)/g\n if (spreadTest.test(spreadText)) {\n arr.removeElement(j)\n arr.insertElement(j, spreadText.replace(spreadTest, \"$1\"))\n }\n }\n }\n}\n\nasync function parseObjectLiteral(objectLiteralString: string): Promise<any> {\n const sourceFile = await _createSourceFile(\n `const theme = ${objectLiteralString}`,\n null\n )\n\n const statement = sourceFile.getStatements()[0]\n if (statement?.getKind() === SyntaxKind.VariableStatement) {\n const declaration = (statement as VariableStatement)\n .getDeclarationList()\n ?.getDeclarations()[0]\n const initializer = declaration.getInitializer()\n if (initializer?.isKind(SyntaxKind.ObjectLiteralExpression)) {\n return await parseObjectLiteralExpression(initializer)\n }\n }\n\n throw new Error(\"Invalid input: not an object literal\")\n}\n\nfunction parseObjectLiteralExpression(node: ObjectLiteralExpression): any {\n const result: any = {}\n for (const property of node.getProperties()) {\n if (property.isKind(SyntaxKind.PropertyAssignment)) {\n const name = property.getName().replace(/\\'/g, \"\")\n if (\n property.getInitializer()?.isKind(SyntaxKind.ObjectLiteralExpression)\n ) {\n result[name] = parseObjectLiteralExpression(\n property.getInitializer() as ObjectLiteralExpression\n )\n } else if (\n property.getInitializer()?.isKind(SyntaxKind.ArrayLiteralExpression)\n ) {\n result[name] = parseArrayLiteralExpression(\n property.getInitializer() as ArrayLiteralExpression\n )\n } else {\n result[name] = parseValue(property.getInitializer())\n }\n }\n }\n return result\n}\n\nfunction parseArrayLiteralExpression(node: ArrayLiteralExpression): any[] {\n const result: any[] = []\n for (const element of node.getElements()) {\n if (element.isKind(SyntaxKind.ObjectLiteralExpression)) {\n result.push(\n parseObjectLiteralExpression(\n element.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n )\n )\n } else if (element.isKind(SyntaxKind.ArrayLiteralExpression)) {\n result.push(\n parseArrayLiteralExpression(\n element.asKindOrThrow(SyntaxKind.ArrayLiteralExpression)\n )\n )\n } else {\n result.push(parseValue(element))\n }\n }\n return result\n}\n\nfunction parseValue(node: any): any {\n switch (node.getKind()) {\n case SyntaxKind.StringLiteral:\n return node.getText()\n case SyntaxKind.NumericLiteral:\n return Number(node.getText())\n case SyntaxKind.TrueKeyword:\n return true\n case SyntaxKind.FalseKeyword:\n return false\n case SyntaxKind.NullKeyword:\n return null\n case SyntaxKind.ArrayLiteralExpression:\n return node.getElements().map(parseValue)\n case SyntaxKind.ObjectLiteralExpression:\n return parseObjectLiteralExpression(node)\n default:\n return node.getText()\n }\n}\n\nexport function buildTailwindThemeColorsFromCssVars(\n cssVars: z.infer<typeof registryItemCssVarsSchema>\n) {\n const result: Record<string, any> = {}\n\n for (const key of Object.keys(cssVars)) {\n const parts = key.split(\"-\")\n const colorName = parts[0]\n const subType = parts.slice(1).join(\"-\")\n\n if (subType === \"\") {\n if (typeof result[colorName] === \"object\") {\n result[colorName].DEFAULT = `hsl(var(--${key}))`\n } else {\n result[colorName] = `hsl(var(--${key}))`\n }\n } else {\n if (typeof result[colorName] !== \"object\") {\n result[colorName] = { DEFAULT: `hsl(var(--${colorName}))` }\n }\n result[colorName][subType] = `hsl(var(--${key}))`\n }\n }\n\n // Remove DEFAULT if it's not in the original cssVars\n for (const [colorName, value] of Object.entries(result)) {\n if (\n typeof value === \"object\" &&\n value.DEFAULT === `hsl(var(--${colorName}))` &&\n !(colorName in cssVars)\n ) {\n delete value.DEFAULT\n }\n }\n\n return result\n}\n","import ora, { type Options } from \"ora\"\n\nexport function spinner(\n text: Options[\"text\"],\n options?: {\n silent?: boolean\n }\n) {\n return ora({\n text,\n isSilent: options?.silent,\n })\n}\n"]}
@@ -209,6 +209,7 @@ declare const registryItemCssVarsSchema: z.ZodObject<{
209
209
  dark?: Record<string, string> | undefined;
210
210
  }>;
211
211
  declare const registryItemCssSchema: z.ZodRecord<z.ZodString, z.ZodLazy<z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>>]>>>;
212
+ declare const registryItemEnvVarsSchema: z.ZodRecord<z.ZodString, z.ZodString>;
212
213
  declare const registryItemSchema: z.ZodObject<{
213
214
  $schema: z.ZodOptional<z.ZodString>;
214
215
  extends: z.ZodOptional<z.ZodString>;
@@ -292,6 +293,7 @@ declare const registryItemSchema: z.ZodObject<{
292
293
  dark?: Record<string, string> | undefined;
293
294
  }>>;
294
295
  css: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodLazy<z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>>]>>>>;
296
+ envVars: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
295
297
  meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
296
298
  docs: z.ZodOptional<z.ZodString>;
297
299
  categories: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
@@ -330,6 +332,7 @@ declare const registryItemSchema: z.ZodObject<{
330
332
  light?: Record<string, string> | undefined;
331
333
  dark?: Record<string, string> | undefined;
332
334
  } | undefined;
335
+ envVars?: Record<string, string> | undefined;
333
336
  meta?: Record<string, any> | undefined;
334
337
  docs?: string | undefined;
335
338
  categories?: string[] | undefined;
@@ -368,6 +371,7 @@ declare const registryItemSchema: z.ZodObject<{
368
371
  light?: Record<string, string> | undefined;
369
372
  dark?: Record<string, string> | undefined;
370
373
  } | undefined;
374
+ envVars?: Record<string, string> | undefined;
371
375
  meta?: Record<string, any> | undefined;
372
376
  docs?: string | undefined;
373
377
  categories?: string[] | undefined;
@@ -459,6 +463,7 @@ declare const registrySchema: z.ZodObject<{
459
463
  dark?: Record<string, string> | undefined;
460
464
  }>>;
461
465
  css: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodLazy<z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>>]>>>>;
466
+ envVars: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
462
467
  meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
463
468
  docs: z.ZodOptional<z.ZodString>;
464
469
  categories: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
@@ -497,6 +502,7 @@ declare const registrySchema: z.ZodObject<{
497
502
  light?: Record<string, string> | undefined;
498
503
  dark?: Record<string, string> | undefined;
499
504
  } | undefined;
505
+ envVars?: Record<string, string> | undefined;
500
506
  meta?: Record<string, any> | undefined;
501
507
  docs?: string | undefined;
502
508
  categories?: string[] | undefined;
@@ -535,6 +541,7 @@ declare const registrySchema: z.ZodObject<{
535
541
  light?: Record<string, string> | undefined;
536
542
  dark?: Record<string, string> | undefined;
537
543
  } | undefined;
544
+ envVars?: Record<string, string> | undefined;
538
545
  meta?: Record<string, any> | undefined;
539
546
  docs?: string | undefined;
540
547
  categories?: string[] | undefined;
@@ -577,6 +584,7 @@ declare const registrySchema: z.ZodObject<{
577
584
  light?: Record<string, string> | undefined;
578
585
  dark?: Record<string, string> | undefined;
579
586
  } | undefined;
587
+ envVars?: Record<string, string> | undefined;
580
588
  meta?: Record<string, any> | undefined;
581
589
  docs?: string | undefined;
582
590
  categories?: string[] | undefined;
@@ -619,6 +627,7 @@ declare const registrySchema: z.ZodObject<{
619
627
  light?: Record<string, string> | undefined;
620
628
  dark?: Record<string, string> | undefined;
621
629
  } | undefined;
630
+ envVars?: Record<string, string> | undefined;
622
631
  meta?: Record<string, any> | undefined;
623
632
  docs?: string | undefined;
624
633
  categories?: string[] | undefined;
@@ -708,6 +717,7 @@ declare const registryIndexSchema: z.ZodArray<z.ZodObject<{
708
717
  dark?: Record<string, string> | undefined;
709
718
  }>>;
710
719
  css: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodLazy<z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>>]>>>>;
720
+ envVars: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
711
721
  meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
712
722
  docs: z.ZodOptional<z.ZodString>;
713
723
  categories: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
@@ -746,6 +756,7 @@ declare const registryIndexSchema: z.ZodArray<z.ZodObject<{
746
756
  light?: Record<string, string> | undefined;
747
757
  dark?: Record<string, string> | undefined;
748
758
  } | undefined;
759
+ envVars?: Record<string, string> | undefined;
749
760
  meta?: Record<string, any> | undefined;
750
761
  docs?: string | undefined;
751
762
  categories?: string[] | undefined;
@@ -784,6 +795,7 @@ declare const registryIndexSchema: z.ZodArray<z.ZodObject<{
784
795
  light?: Record<string, string> | undefined;
785
796
  dark?: Record<string, string> | undefined;
786
797
  } | undefined;
798
+ envVars?: Record<string, string> | undefined;
787
799
  meta?: Record<string, any> | undefined;
788
800
  docs?: string | undefined;
789
801
  categories?: string[] | undefined;
@@ -956,10 +968,11 @@ declare const registryResolvedItemsTreeSchema: z.ZodObject<Pick<{
956
968
  dark?: Record<string, string> | undefined;
957
969
  }>>;
958
970
  css: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodLazy<z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>>]>>>>;
971
+ envVars: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
959
972
  meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
960
973
  docs: z.ZodOptional<z.ZodString>;
961
974
  categories: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
962
- }, "tailwind" | "css" | "dependencies" | "devDependencies" | "files" | "cssVars" | "docs">, "strip", z.ZodTypeAny, {
975
+ }, "tailwind" | "css" | "dependencies" | "devDependencies" | "files" | "cssVars" | "envVars" | "docs">, "strip", z.ZodTypeAny, {
963
976
  tailwind?: {
964
977
  config?: {
965
978
  content?: string[] | undefined;
@@ -986,6 +999,7 @@ declare const registryResolvedItemsTreeSchema: z.ZodObject<Pick<{
986
999
  light?: Record<string, string> | undefined;
987
1000
  dark?: Record<string, string> | undefined;
988
1001
  } | undefined;
1002
+ envVars?: Record<string, string> | undefined;
989
1003
  docs?: string | undefined;
990
1004
  }, {
991
1005
  tailwind?: {
@@ -1014,6 +1028,7 @@ declare const registryResolvedItemsTreeSchema: z.ZodObject<Pick<{
1014
1028
  light?: Record<string, string> | undefined;
1015
1029
  dark?: Record<string, string> | undefined;
1016
1030
  } | undefined;
1031
+ envVars?: Record<string, string> | undefined;
1017
1032
  docs?: string | undefined;
1018
1033
  }>;
1019
1034
 
@@ -1068,6 +1083,7 @@ declare function getRegistryIndex(): Promise<{
1068
1083
  light?: Record<string, string> | undefined;
1069
1084
  dark?: Record<string, string> | undefined;
1070
1085
  } | undefined;
1086
+ envVars?: Record<string, string> | undefined;
1071
1087
  meta?: Record<string, any> | undefined;
1072
1088
  docs?: string | undefined;
1073
1089
  categories?: string[] | undefined;
@@ -1112,6 +1128,7 @@ declare function getRegistryItem(name: string, style: string): Promise<{
1112
1128
  light?: Record<string, string> | undefined;
1113
1129
  dark?: Record<string, string> | undefined;
1114
1130
  } | undefined;
1131
+ envVars?: Record<string, string> | undefined;
1115
1132
  meta?: Record<string, any> | undefined;
1116
1133
  docs?: string | undefined;
1117
1134
  categories?: string[] | undefined;
@@ -1185,6 +1202,7 @@ declare function resolveTree(index: z.infer<typeof registryIndexSchema>, names:
1185
1202
  light?: Record<string, string> | undefined;
1186
1203
  dark?: Record<string, string> | undefined;
1187
1204
  } | undefined;
1205
+ envVars?: Record<string, string> | undefined;
1188
1206
  meta?: Record<string, any> | undefined;
1189
1207
  docs?: string | undefined;
1190
1208
  categories?: string[] | undefined;
@@ -1224,6 +1242,7 @@ declare function fetchTree(style: string, tree: z.infer<typeof registryIndexSche
1224
1242
  light?: Record<string, string> | undefined;
1225
1243
  dark?: Record<string, string> | undefined;
1226
1244
  } | undefined;
1245
+ envVars?: Record<string, string> | undefined;
1227
1246
  meta?: Record<string, any> | undefined;
1228
1247
  docs?: string | undefined;
1229
1248
  categories?: string[] | undefined;
@@ -1260,6 +1279,7 @@ declare function registryResolveItemsTree(names: z.infer<typeof registryItemSche
1260
1279
  light?: Record<string, string> | undefined;
1261
1280
  dark?: Record<string, string> | undefined;
1262
1281
  } | undefined;
1282
+ envVars?: Record<string, string> | undefined;
1263
1283
  docs?: string | undefined;
1264
1284
  } | null>;
1265
1285
  declare function registryGetTheme(name: string, config: Config): Promise<{
@@ -1325,9 +1345,10 @@ declare function getRegistryParentMap(registryItems: z.infer<typeof registryItem
1325
1345
  light?: Record<string, string> | undefined;
1326
1346
  dark?: Record<string, string> | undefined;
1327
1347
  } | undefined;
1348
+ envVars?: Record<string, string> | undefined;
1328
1349
  meta?: Record<string, any> | undefined;
1329
1350
  docs?: string | undefined;
1330
1351
  categories?: string[] | undefined;
1331
1352
  }>;
1332
1353
 
1333
- export { stylesSchema as A, BASE_COLORS as B, iconsSchema as C, registryBaseColorSchema as D, registryResolvedItemsTreeSchema as E, RegistryItem as R, getRegistryStyles as a, getRegistryIcons as b, getRegistryItem as c, getRegistryBaseColors as d, getRegistryBaseColor as e, fetchTree as f, getRegistryIndex as g, getItemTargetPath as h, fetchRegistry as i, clearRegistryCache as j, registryResolveItemsTree as k, registryGetTheme as l, isUrl as m, resolveRegistryItems as n, getRegistryTypeAliasMap as o, getRegistryParentMap as p, registryItemTypeSchema as q, resolveTree as r, registryItemFileSchema as s, registryItemTailwindSchema as t, registryItemCssVarsSchema as u, registryItemCssSchema as v, registryItemSchema as w, registrySchema as x, Registry as y, registryIndexSchema as z };
1354
+ export { registryIndexSchema as A, BASE_COLORS as B, stylesSchema as C, iconsSchema as D, registryBaseColorSchema as E, registryResolvedItemsTreeSchema as F, RegistryItem as R, getRegistryStyles as a, getRegistryIcons as b, getRegistryItem as c, getRegistryBaseColors as d, getRegistryBaseColor as e, fetchTree as f, getRegistryIndex as g, getItemTargetPath as h, fetchRegistry as i, clearRegistryCache as j, registryResolveItemsTree as k, registryGetTheme as l, isUrl as m, resolveRegistryItems as n, getRegistryTypeAliasMap as o, getRegistryParentMap as p, registryItemTypeSchema as q, resolveTree as r, registryItemFileSchema as s, registryItemTailwindSchema as t, registryItemCssVarsSchema as u, registryItemCssSchema as v, registryItemEnvVarsSchema as w, registryItemSchema as x, registrySchema as y, Registry as z };
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- export { B as BASE_COLORS, j as clearRegistryCache, i as fetchRegistry, f as fetchTree, h as getItemTargetPath, e as getRegistryBaseColor, d as getRegistryBaseColors, b as getRegistryIcons, g as getRegistryIndex, c as getRegistryItem, p as getRegistryParentMap, a as getRegistryStyles, o as getRegistryTypeAliasMap, m as isUrl, l as registryGetTheme, k as registryResolveItemsTree, n as resolveRegistryItems, r as resolveTree } from './index-4a90b588.js';
2
+ export { B as BASE_COLORS, j as clearRegistryCache, i as fetchRegistry, f as fetchTree, h as getItemTargetPath, e as getRegistryBaseColor, d as getRegistryBaseColors, b as getRegistryIcons, g as getRegistryIndex, c as getRegistryItem, p as getRegistryParentMap, a as getRegistryStyles, o as getRegistryTypeAliasMap, m as isUrl, l as registryGetTheme, k as registryResolveItemsTree, n as resolveRegistryItems, r as resolveTree } from './index-8c784f6a.js';
3
3
  import 'zod';