dopx
Version:
Add beautiful components to your apps 🐳
31 lines (29 loc) • 27.9 kB
JavaScript
import { z } from 'zod';
import { promises } from 'fs';
import { tmpdir, homedir } from 'os';
import * as v from 'path';
import v__default from 'path';
import * as k from 'fs/promises';
import { createMatchPath, loadConfig } from 'tsconfig-paths';
import { Project, ScriptKind, SyntaxKind, QuoteKind } from 'ts-morph';
import _ from 'fs-extra';
import W from 'fast-glob';
import { red, yellow, cyan, green } from 'kleur/colors';
import { cosmiconfig } from 'cosmiconfig';
import dt from 'ora';
import $ from 'deepmerge';
import ht from 'stringify-object';
import { HttpsProxyAgent } from 'https-proxy-agent';
import jt from 'node-fetch';
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()}),Z=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()}),Oe=z.record(z.string(),z.lazy(()=>z.union([z.string(),z.record(z.string(),z.union([z.string(),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:Z.optional(),css:Oe.optional(),meta:z.record(z.string(),z.any()).optional(),docs:z.string().optional(),categories:z.array(z.string()).optional()}),Mt=z.object({name:z.string(),homepage:z.string(),items:z.array(I)}),ee=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:Z,cssVarsV4:Z.optional(),inlineColorsTemplate:z.string(),cssVarsTemplate:z.string()}),he=I.pick({dependencies:!0,devDependencies:!0,files:!0,tailwind:!0,cssVars:!0,css:!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"],Ne=[/^(react|react-dom|next)(\/.*)?$/,/^(node|jsr|npm):.*$/],_e=new Project({compilerOptions:{}});function Ue(e){if(Ne.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 We(e,t,r,i=new Set){let s=v.resolve(t.resolvedPaths.cwd,e),n=v.relative(t.resolvedPaths.cwd,s);if(we.includes(n))return {dependencies:[],files:[]};let l=v.extname(e);if(!ye.includes(l))return {dependencies:[],files:[]};if(i.has(n))return {dependencies:[],files:[]};if(i.add(n),!(await k.stat(s)).isFile())return {dependencies:[],files:[]};let u=await k.readFile(s,"utf-8"),b=await Me(v.basename(s)),p=_e.createSourceFile(b,u,{scriptKind:ScriptKind.TSX}),T=await loadConfig(t.resolvedPaths.cwd);if(T.resultType==="failed")return {dependencies:[],files:[]};let g=[],R=new Set,c=xe(e),h={path:n,type:c,target:""};g.push(h);let Q=p.getImportDeclarations();for(let A of Q){let j=A.getModuleSpecifierValue(),ce=j.startsWith(".");if(!j.startsWith(`${r.aliasPrefix}/`)&&!ce){let C=Ue(j);C&&R.add(C);continue}let F=await P(j,T);if(ce&&(F=v.resolve(v.dirname(s),j)),!F)continue;if(!v.extname(F))for(let C of ye){let fe=`${F}${C}`;try{await k.access(fe),F=fe;break}catch{continue}}let z=v.relative(t.resolvedPaths.cwd,F);if(i.has(z)||we.includes(z))continue;let X=xe(j),pe={path:z,type:X,target:""};(X==="registry:page"||X==="registry:file")&&(pe.target=j),g.push(pe);let D=await We(z,t,r,i);if(D.files)for(let C of D.files)i.has(C.path)||(i.add(C.path),g.push(C));D.dependencies&&D.dependencies.forEach(C=>R.add(C));}let q=Array.from(new Map(g.map(A=>[A.path,A])).values());return {dependencies:Array.from(R),files:q}}async function Me(e){let t=await k.mkdtemp(v.join(tmpdir(),"dopx-"));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 Be(e){try{return new URL(e),!0}catch{return !1}}function O(e){return e.endsWith(".json")&&!Be(e)}function Xt(e){return !!e?.files?.length&&e.files.every(t=>!!t.target)}var x={"next-app":{name:"next-app",label:"Next.js",links:{installation:"https://dolphin-ui.com/docs/installation/next",tailwind:"https://tailwindcss.com/docs/guides/nextjs"}},"next-pages":{name:"next-pages",label:"Next.js",links:{installation:"https://dolphin-ui.com/docs/installation/next",tailwind:"https://tailwindcss.com/docs/guides/nextjs"}},remix:{name:"remix",label:"Remix",links:{installation:"https://dolphin-ui.com/docs/installation/remix",tailwind:"https://tailwindcss.com/docs/guides/remix"}},"react-router":{name:"react-router",label:"React Router",links:{installation:"https://dolphin-ui.com/docs/installation/react-router",tailwind:"https://tailwindcss.com/docs/installation/framework-guides/react-router"}},vite:{name:"vite",label:"Vite",links:{installation:"https://dolphin-ui.com/docs/installation/vite",tailwind:"https://tailwindcss.com/docs/guides/vite"}},astro:{name:"astro",label:"Astro",links:{installation:"https://dolphin-ui.com/docs/installation/astro",tailwind:"https://tailwindcss.com/docs/guides/astro"}},laravel:{name:"laravel",label:"Laravel",links:{installation:"https://dolphin-ui.com/docs/installation/laravel",tailwind:"https://tailwindcss.com/docs/guides/laravel"}},"tanstack-start":{name:"tanstack-start",label:"TanStack Start",links:{installation:"https://dolphin-ui.com/docs/installation/tanstack",tailwind:"https://tailwindcss.com/docs/installation/using-postcss"}},gatsby:{name:"gatsby",label:"Gatsby",links:{installation:"https://dolphin-ui.com/docs/installation/gatsby",tailwind:"https://tailwindcss.com/docs/guides/gatsby"}},expo:{name:"expo",label:"Expo",links:{installation:"https://dolphin-ui.com/docs/installation/expo",tailwind:"https://www.nativewind.dev/docs/getting-started/installation"}},manual:{name:"manual",label:"Manual",links:{installation:"https://dolphin-ui.com/docs/installation/manual",tailwind:"https://tailwindcss.com/docs/installation"}}};function te(e="",t=!0){let r=v__default.join(e,"package.json");return _.readJSONSync(r,{throws:t})}var M=["**/node_modules/**",".next","public","dist","build"];z.object({compilerOptions:z.object({paths:z.record(z.string().or(z.array(z.string())))})});async function B(e){let[t,r,i,s,n,l,d,u]=await Promise.all([W.glob("**/{next,vite,astro,app}.config.*|gatsby-config.*|composer.json|react-router.config.*",{cwd:e,deep:3,ignore:M}),_.pathExists(v__default.resolve(e,"src")),Xe(e),Qe(e),He(e),be(e),qe(e),te(e,!1)]),b=await _.pathExists(v__default.resolve(e,`${r?"src/":""}app`)),p={framework:x.manual,isSrcDir:r,isRSC:!1,isTsx:i,tailwindConfigFile:s,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 _.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([te(e,!1),U(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 He(e){let[t,r]=await Promise.all([W.glob(["**/*.css","**/*.scss"],{cwd:e,deep:5,ignore:M}),be(e)]);if(!t.length)return null;for(let s of t){let n=await _.readFile(v__default.resolve(e,s),"utf8");if(n.includes('@import "tailwindcss"')||n.includes("@import 'tailwindcss'")||n.includes("@tailwind base"))return s}return null}async function Qe(e){let t=await W.glob("tailwind.config.*",{cwd:e,deep:3,ignore:M});return t.length?t[0]:null}async function qe(e){let t=await loadConfig(e);if(t?.resultType==="failed"||!Object.entries(t?.paths).length)return null;for(let[r,i]of Object.entries(t.paths))if(i.includes("./*")||i.includes("./src/*")||i.includes("./app/*")||i.includes("./resources/js/*"))return r.replace(/\/\*$/,"")??null;return Object.keys(t?.paths)?.[0].replace(/\/\*$/,"")??null}async function Xe(e){return (await W.glob("tsconfig.*",{cwd:e,deep:1,ignore:M})).length>0}async function hr(e,t=null){let[r,i]=await Promise.all([U(e),t?Promise.resolve(t):B(e)]);if(r)return r;if(!i||!i.tailwindCssFile||i.tailwindVersion==="v3"&&!i.tailwindConfigFile)return null;let s={$schema:"https://dolphin-ui/schema.json",rsc:i.isRSC,tsx:i.isTsx,style:"new-york",tailwind:{config:i.tailwindConfigFile??"",baseColor:"zinc",css:i.tailwindCssFile,cssVariables:!0,prefix:""},iconLibrary:"lucide",aliases:{components:`${i.aliasPrefix}/components`,ui:`${i.aliasPrefix}/components/ui`,hooks:`${i.aliasPrefix}/hooks`,lib:`${i.aliasPrefix}/lib`,utils:`${i.aliasPrefix}/lib/utils`}};return await re(e,s)}async function Pe(e){if(!e.resolvedPaths?.cwd)return "v3";let t=await B(e.resolvedPaths.cwd);return t?.tailwindVersion?t.tailwindVersion:null}var w={error:red,warn:yellow,info:cyan,success:green};var jr="@/components",Ir="@/lib/utils",Lr="app/globals.css",Rr="tailwind.config.js";var ot=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(),Ce=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()})}),at=z.record(Ce);async function U(e){let t=await lt(e);return t?(t.iconLibrary||(t.iconLibrary=t.style==="new-york"?"radix":"lucide"),await re(e,t)):null}async function re(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 Ce.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 lt(e){try{let t=await ot.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 Ar(e){let t={};for(let i of Object.keys(e.aliases)){if(!pt(i,e))continue;let s=e.resolvedPaths[i],n=await ct(e.resolvedPaths.cwd,s);if(!n){t[i]=e;continue}t[i]=await U(n);}let r=at.safeParse(t);return r.success?r.data:null}async function ct(e,t){let r=ft(e,t),i=v__default.relative(r,t),n=(await W.glob("**/package.json",{cwd:r,deep:3,ignore:["**/node_modules/**","**/dist/**","**/build/**","**/public/**"]})).map(l=>v__default.dirname(l)).find(l=>i.startsWith(l));return n?v__default.join(r,n):null}function pt(e,t){return Object.keys(t.resolvedPaths).filter(r=>r!=="utils").includes(e)}function ft(e,t){let r=e.split(v__default.sep),i=t.split(v__default.sep),s=[];for(let n=0;n<Math.min(r.length,i.length)&&r[n]===i[n];n++)s.push(r[n]);return s.join(v__default.sep)}async function ie(e,t){return (await B(e))?.tailwindVersion==="v4"?"new-york-v4":t}function Fr(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 S(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 Se(e,t){return dt({text:e,isSilent:t?.silent})}async function ti(e,t,r){if(!e||(r={silent:!1,tailwindVersion:"v3",...r},r.tailwindVersion==="v4"))return;let i=v__default.relative(t.resolvedPaths.cwd,t.resolvedPaths.tailwindConfig),s=Se(`Updating ${w.info(i)}`,{silent:r.silent}).start(),n=await promises.readFile(t.resolvedPaths.tailwindConfig,"utf8"),l=await xt(n,e,t);await promises.writeFile(t.resolvedPaths.tailwindConfig,l,"utf8"),s?.succeed();}async function xt(e,t,r){let i=await ke(e,r),s=i.getDescendantsOfKind(SyntaxKind.ObjectLiteralExpression).find(l=>l.getProperties().some(d=>d.isKind(SyntaxKind.PropertyAssignment)&&d.getName()==="content"));if(!s)return e;let n=Ct(s);return bt(s,{name:"darkMode",value:"class"},{quoteChar:n}),t.plugins?.forEach(l=>{vt(s,l);}),t.theme&&await Pt(s,t.theme),i.getFullText()}function bt(e,t,{quoteChar:r}){let i=e.getProperty("darkMode");if(!i){let s={name:t.name,initializer:`[${r}${t.value}${r}]`};return t.name==="darkMode"?(e.insertPropertyAssignment(0,s),e):(e.addPropertyAssignment(s),e)}if(i.isKind(SyntaxKind.PropertyAssignment)){let s=i.getInitializer(),n=`${r}${t.value}${r}`;if(s?.isKind(SyntaxKind.StringLiteral)){let l=s.getText();return s.replaceWithText(`[${l}, ${n}]`),e}if(s?.isKind(SyntaxKind.ArrayLiteralExpression)){if(s.getElements().map(l=>l.getText()).includes(n))return e;s.addElement(n);}return e}return e}async function Pt(e,t){e.getProperty("theme")||e.addPropertyAssignment({name:"theme",initializer:"{}"}),ne(e);let i=(e.getPropertyOrThrow("theme")?.asKindOrThrow(SyntaxKind.PropertyAssignment)).getInitializer();if(i?.isKind(SyntaxKind.ObjectLiteralExpression)){let s=i.getText(),n=await St(s),l=$(n,t,{arrayMerge:(u,b)=>b}),d=ht(l).replace(/\'\.\.\.(.*)\'/g,"...$1").replace(/\'\"/g,"'").replace(/\"\'/g,"'").replace(/\'\[/g,"[").replace(/\]\'/g,"]").replace(/\'\\\'/g,"'").replace(/\\\'/g,"'").replace(/\\\'\'/g,"'").replace(/\'\'/g,"'");i.replaceWithText(d);}oe(e);}function vt(e,t){let r=e.getProperty("plugins");if(!r)return e.addPropertyAssignment({name:"plugins",initializer:`[${t}]`}),e;if(r.isKind(SyntaxKind.PropertyAssignment)){let i=r.getInitializer();if(i?.isKind(SyntaxKind.ArrayLiteralExpression)){if(i.getElements().map(s=>s.getText().replace(/["']/g,"")).includes(t.replace(/["']/g,"")))return e;i.addElement(t);}return e}return e}async function ke(e,t){let r=await promises.mkdtemp(v__default.join(tmpdir(),"dopx-")),i=t?.resolvedPaths?.tailwindConfig||"tailwind.config.ts",s=v__default.join(r,`dopx-${v__default.basename(i)}`);return new Project({compilerOptions:{}}).createSourceFile(s,e,{scriptKind:v__default.extname(i)===".ts"?ScriptKind.TS:ScriptKind.JS})}function Ct(e){return e.getFirstDescendantByKind(SyntaxKind.StringLiteral)?.getQuoteKind()===QuoteKind.Single?"'":'"'}function ne(e){let t=e.getProperties();for(let r=0;r<t.length;r++){let i=t[r];if(i.isKind(SyntaxKind.SpreadAssignment)){let s=i.asKindOrThrow(SyntaxKind.SpreadAssignment),n=s.getExpression().getText();e.insertPropertyAssignment(r,{name:`"___${n.replace(/^\.\.\./,"")}"`,initializer:`"...${n.replace(/^\.\.\./,"")}"`}),s.remove();}else if(i.isKind(SyntaxKind.PropertyAssignment)){let n=i.asKindOrThrow(SyntaxKind.PropertyAssignment).getInitializer();n&&n.isKind(SyntaxKind.ObjectLiteralExpression)?ne(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 i=t[r];if(i.isKind(SyntaxKind.ObjectLiteralExpression))ne(i.asKindOrThrow(SyntaxKind.ObjectLiteralExpression));else if(i.isKind(SyntaxKind.ArrayLiteralExpression))Ee(i.asKindOrThrow(SyntaxKind.ArrayLiteralExpression));else if(i.isKind(SyntaxKind.SpreadElement)){let s=i.getText();e.removeElement(r),e.insertElement(r,`"${s}"`);}}}function oe(e){let t=e.getProperties();for(let r=0;r<t.length;r++){let i=t[r];if(i.isKind(SyntaxKind.PropertyAssignment)){let s=i,n=s.getInitializer();if(n&&n.isKind(SyntaxKind.StringLiteral)){let l=n.asKindOrThrow(SyntaxKind.StringLiteral).getLiteralValue();l.startsWith("...")&&(e.insertSpreadAssignment(r,{expression:l.slice(3)}),s.remove());}else n?.isKind(SyntaxKind.ObjectLiteralExpression)?oe(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 i=t[r];if(i.isKind(SyntaxKind.ObjectLiteralExpression))oe(i.asKindOrThrow(SyntaxKind.ObjectLiteralExpression));else if(i.isKind(SyntaxKind.ArrayLiteralExpression))je(i.asKindOrThrow(SyntaxKind.ArrayLiteralExpression));else if(i.isKind(SyntaxKind.StringLiteral)){let s=i.getText(),n=/(?:^['"])(\.\.\..*)(?:['"]$)/g;n.test(s)&&(e.removeElement(r),e.insertElement(r,s.replace(n,"$1")));}}}async function St(e){let r=(await ke(`const theme = ${e}`,null)).getStatements()[0];if(r?.getKind()===SyntaxKind.VariableStatement){let s=(r.getDeclarationList()?.getDeclarations()[0]).getInitializer();if(s?.isKind(SyntaxKind.ObjectLiteralExpression))return await J(s)}throw new Error("Invalid input: not an object literal")}function J(e){let t={};for(let r of e.getProperties())if(r.isKind(SyntaxKind.PropertyAssignment)){let i=r.getName().replace(/\'/g,"");r.getInitializer()?.isKind(SyntaxKind.ObjectLiteralExpression)?t[i]=J(r.getInitializer()):r.getInitializer()?.isKind(SyntaxKind.ArrayLiteralExpression)?t[i]=Ie(r.getInitializer()):t[i]=ae(r.getInitializer());}return t}function Ie(e){let t=[];for(let r of e.getElements())r.isKind(SyntaxKind.ObjectLiteralExpression)?t.push(J(r.asKindOrThrow(SyntaxKind.ObjectLiteralExpression))):r.isKind(SyntaxKind.ArrayLiteralExpression)?t.push(Ie(r.asKindOrThrow(SyntaxKind.ArrayLiteralExpression))):t.push(ae(r));return t}function ae(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(ae);case SyntaxKind.ObjectLiteralExpression:return J(e);default:return e.getText()}}function Le(e){let t={};for(let r of Object.keys(e)){let i=r.split("-"),s=i[0],n=i.slice(1).join("-");n===""?typeof t[s]=="object"?t[s].DEFAULT=`hsl(var(--${r}))`:t[s]=`hsl(var(--${r}))`:(typeof t[s]!="object"&&(t[s]={DEFAULT:`hsl(var(--${s}))`}),t[s][n]=`hsl(var(--${r}))`);}for(let[r,i]of Object.entries(t))typeof i=="object"&&i.DEFAULT===`hsl(var(--${r}))`&&!(r in e)&&delete i.DEFAULT;return t}var Lt=process.env.REGISTRY_URL??"https://dolphin-ui.com/r",Rt=process.env.https_proxy?new HttpsProxyAgent(process.env.https_proxy):void 0,G=new Map,At=[{name:"neutral",label:"Neutral"},{name:"gray",label:"Gray"},{name:"zinc",label:"Zinc"},{name:"stone",label:"Stone"},{name:"slate",label:"Slate"}];async function Ft(){try{let[e]=await E(["index.json"]);return ee.parse(e)}catch(e){m.error(`
`),S(e);}}async function xi(){try{let[e]=await E(["styles/index.json"]);return de.parse(e)}catch(e){return m.error(`
`),S(e),[]}}async function bi(){try{let[e]=await E(["icons/index.json"]);return me.parse(e)}catch(e){return S(e),{}}}async function Y(e,t){try{if(O(e))return await Ot(e);let[r]=await E([L(e)?e:`styles/${t}/${e}.json`]);return I.parse(r)}catch(r){return m.break(),S(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),i=await promises.readFile(r,"utf8"),s=JSON.parse(i);return I.parse(s)}catch(t){return m.error(`Failed to read local registry file: ${e}`),S(t),null}}async function Pi(){return At}async function Vt(e){try{let[t]=await E([`colors/${e}.json`]);return ue.parse(t)}catch(t){S(t);}}async function $t(e,t){let r=[];for(let i of t){let s=e.find(n=>n.name===i);if(s&&(r.push(s),s.registryDependencies)){let n=await $t(e,s.registryDependencies);r.push(...n);}}return r.filter((i,s,n)=>n.findIndex(l=>l.name===i.name)===s)}async function vi(e,t){try{let r=t.map(s=>`styles/${e}/${s.name}.json`),i=await E(r);return ee.parse(i)}catch(r){S(r);}}async function Ci(e,t,r){if(r)return r;if(t.type==="registry:ui")return e.resolvedPaths.ui??e.resolvedPaths.components;let[i,s]=t.type?.split(":")??[];return i in e.resolvedPaths?v__default.join(e.resolvedPaths[i],s):null}async function E(e,t={}){t={useCache:!0,...t};try{return await Promise.all(e.map(async i=>{let s=Re(i);if(t.useCache&&G.has(s))return G.get(s);let n=(async()=>{let l=await jt(s,{agent:Rt});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(s)}.
If this is a remote registry, you may need to authenticate.`);if(l.status===404)throw new Error(`The component at ${w.info(s)} was not found.
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(s)}.
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(s)}.
${b}`)}return l.json()})();return t.useCache&&G.set(s,n),n}))}catch(r){return m.error(`
`),S(r),[]}}function Si(){G.clear();}async function H(e,t,r=new Set){let i=[],s=[];for(let n of e)if(!r.has(n)){if(r.add(n),L(n)||O(n)){let l=await Y(n,"");if(l&&(i.push(l),l.registryDependencies)){let d=await H(l.registryDependencies,t,r);i.push(...d.items),s.push(...d.registryNames);}}else if(s.push(n),t){let l=t.resolvedPaths?.cwd?await ie(t.resolvedPaths.cwd,t.style):t.style;try{let d=await Y(n,l);if(d&&d.registryDependencies){let u=await H(d.registryDependencies,t,r);i.push(...u.items),s.push(...u.registryNames);}}catch{}}}return {items:i,registryNames:s}}async function Kt(e,t){try{let r=e.filter(c=>O(c)),i=e.filter(c=>L(c)),s=e.filter(c=>!O(c)&&!L(c)),n=[],l=[];for(let c of r){let h=await Y(c,"");h&&(n.push(h),h.registryDependencies&&l.push(...h.registryDependencies));}for(let c of i){let h=await Y(c,"");h&&(n.push(h),h.registryDependencies&&l.push(...h.registryDependencies));}let{items:d,registryNames:u}=await H(l,t);n.push(...d);let b=[...s,...u];if(b.length>0){if(await Ft()){let h=Array.from(new Set(b));h.includes("index")&&h.unshift("index");let Q=await Nt(h,t),q=await E(Q),A=z.array(I).parse(q);n.push(...A);}else if(n.length===0)return null}if(!n.length)return null;if(b.includes("index")&&t.tailwind.baseColor){let c=await Dt(t.tailwind.baseColor,t);c&&n.unshift(c);}n.sort((c,h)=>c.type==="registry:theme"?-1:1);let p={};n.forEach(c=>{p=$(p,c.tailwind??{});});let T={};n.forEach(c=>{T=$(T,c.cssVars??{});});let g={};n.forEach(c=>{g=$(g,c.css??{});});let R="";return n.forEach(c=>{c.docs&&(R+=`${c.docs}
`);}),he.parse({dependencies:$.all(n.map(c=>c.dependencies??[])),devDependencies:$.all(n.map(c=>c.devDependencies??[])),files:$.all(n.map(c=>c.files??[])),tailwind:p,cssVars:T,css:g,docs:R})}catch(r){return S(r),null}}async function zt(e,t){let{registryNames:r}=await H([e],t),i=t.resolvedPaths?.cwd?await ie(t.resolvedPaths.cwd,t.style):t.style,s=r.map(n=>Re(L(n)?n:`styles/${i}/${n}.json`));return Array.from(new Set(s))}async function Dt(e,t){let[r,i]=await Promise.all([Vt(e),Pe(t)]);if(!r)return null;let s={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&&(s.tailwind.config.theme.extend.colors={...s.tailwind.config.theme.extend.colors,...Le(r.cssVars.dark??{})},s.cssVars={theme:{...r.cssVars.theme,...s.cssVars.theme},light:{...r.cssVars.light,...s.cssVars.light},dark:{...r.cssVars.dark,...s.cssVars.dark}},i==="v4"&&r.cssVarsV4&&(s.cssVars={theme:{...r.cssVarsV4.theme,...s.cssVars.theme},light:{radius:"0.625rem",...r.cssVarsV4.light},dark:{...r.cssVarsV4.dark}})),s}function Re(e){if(L(e)){let t=new URL(e);return t.pathname.match(/\/chat\/b\//)&&!t.pathname.endsWith("/json")&&(t.pathname=`${t.pathname}/json`),t.toString()}return `${Lt}/${e}`}function L(e){try{return new URL(e),!0}catch{return !1}}async function Nt(e,t){let r=[],i=e.filter(s=>!O(s)&&!L(s));for(let s of i){let n=await zt(s,t);r.push(...n);}return Array.from(new Set(r))}function Ti(){return new Map([["registry:ui","ui"],["registry:lib","lib"],["registry:hook","hooks"],["registry:block","components"],["registry:component","components"]])}function ki(e){let t=new Map;return e.forEach(r=>{r.registryDependencies&&r.registryDependencies.forEach(i=>{t.set(i,r);});}),t}
export { L as $, Ct as A, ge as B, Ae as C, Fe as D, Z as E, Oe as F, I as G, Mt as H, ee as I, de as J, me as K, ue as L, he as M, At as N, Ft as O, xi as P, bi as Q, Y as R, Pi as S, Vt as T, $t as U, vi as V, Ci as W, E as X, Si as Y, Kt as Z, Dt as _, w as a, Nt as aa, P as b, Ti as ba, jr as c, ki as ca, Ir as d, Lr as e, Rr as f, ve as g, U as h, re as i, Ar as j, ct as k, ft as l, Fr as m, te as n, B as o, hr as p, Pe as q, m as r, Se as s, We as t, Be as u, O as v, Xt as w, S as x, ti as y, ke as z };
//# sourceMappingURL=out.js.map
//# sourceMappingURL=chunk-CAUXGYZZ.js.map