@create-ui/cli 0.1.0-beta.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.
- package/LICENSE.md +21 -0
- package/README.md +62 -0
- package/dist/chunk-7MKTQPYI.js +72 -0
- package/dist/chunk-7MKTQPYI.js.map +1 -0
- package/dist/chunk-BVZRYLRW.js +32 -0
- package/dist/chunk-BVZRYLRW.js.map +1 -0
- package/dist/chunk-JWZJQI2B.js +3 -0
- package/dist/chunk-JWZJQI2B.js.map +1 -0
- package/dist/chunk-TIYHWTW7.js +2 -0
- package/dist/chunk-TIYHWTW7.js.map +1 -0
- package/dist/chunk-VQCXAURP.js +2 -0
- package/dist/chunk-VQCXAURP.js.map +1 -0
- package/dist/get-config-D6gTsP_D.d.ts +6 -0
- package/dist/icons/index.d.ts +15 -0
- package/dist/icons/index.js +2 -0
- package/dist/icons/index.js.map +1 -0
- package/dist/index.d.ts +1318 -0
- package/dist/index.js +92 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.d.ts +27 -0
- package/dist/mcp/index.js +2 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/registry/index.d.ts +112 -0
- package/dist/registry/index.js +2 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/schema/index.d.ts +5317 -0
- package/dist/schema/index.js +2 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/tailwind.css +86 -0
- package/dist/utils/index.d.ts +37 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +121 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {b as b$1,a as a$1}from'./chunk-7MKTQPYI.js';import {a as a$2}from'./chunk-JWZJQI2B.js';import {a as a$3}from'./chunk-VQCXAURP.js';import {c as c$1,f,U,t,X as X$1,ba,x,j,$ as $$1,V,v as v$1,o,w,d,g,p,y,h,a,b,e,m,n,k,l,T,i,ea,Q,oa,S,pa,ka,ia,la,O,ma,R,W as W$1,na,Y,q as q$2,ga,u,K,Z,E,_ as _$1,s,r,L,N,M}from'./chunk-BVZRYLRW.js';export{ka as fetchTree,la as getItemTargetPath,pa as getPreset,oa as getPresets,ma as getRegistries,da as getRegistriesConfig,na as getRegistriesIndex,aa as getRegistry,ia as getRegistryBaseColor,ha as getRegistryBaseColors,ga as getRegistryIcons,ba as getRegistryItems,fa as getRegistryStyles,ea as getcreateuiRegistryIndex,ca as resolveRegistryItems,ja as resolveTree}from'./chunk-BVZRYLRW.js';import {c,q as q$1,p as p$1}from'./chunk-TIYHWTW7.js';import*as $ from'path';import $__default,{join}from'path';import {promises,existsSync}from'fs';import v from'fs-extra';import R$1 from'postcss';import ut,{z}from'zod';import {execa}from'execa';import Ae from'prompts';import {Project,ScriptKind,SyntaxKind,VariableDeclarationKind}from'ts-morph';import it,{tmpdir}from'os';import {Command}from'commander';import yr from'deepmerge';import*as q from'fs/promises';import q__default from'fs/promises';import ft from'dedent';import jr from'open';import bn from'validate-npm-package-name';import {diffLines}from'diff';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {randomBytes}from'crypto';import Wn from'fast-glob';async function rr(e){let t={};if(!v.existsSync(e.cwd)||!v.existsSync($__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,projectInfo:null};let r=y("Preflight checks.",{silent:e.silent}).start();v.existsSync($__default.resolve(e.cwd,"components.json"))&&!e.force&&(r?.fail(),x.break(),x.error(`A ${j.info("components.json")} file already exists at ${j.info(e.cwd)}.
|
|
3
|
+
To start over, remove the ${j.info("components.json")} file and run ${j.info("init")} again.`),x.break(),process.exit(1)),r?.succeed();let i=y("Verifying framework.",{silent:e.silent}).start(),o=await v$1(e.cwd);(!o||o?.framework.name==="manual")&&(t["7"]=true,i?.fail(),x.break(),o?.framework.links.installation&&x.error(`We could not detect a supported framework at ${j.info(e.cwd)}.
|
|
4
|
+
Visit ${j.info(o?.framework.links.installation)} to manually configure your project.
|
|
5
|
+
Once configured, you can use the cli to add components.`),x.break(),process.exit(1)),i?.succeed(`Verifying framework. Found ${j.info(o.framework.label)}.`);let n=o.tailwindVersion==="v4"?`Validating Tailwind CSS config. Found ${j.info("v4")}.`:"Validating Tailwind CSS.",s=y(n,{silent:e.silent}).start();o.tailwindVersion==="v4"&&!o?.tailwindCssFile||!o.tailwindVersion?(t["5"]=true,s?.fail()):s?.succeed();let c=y("Validating import alias.",{silent:e.silent}).start();return o?.aliasPrefix?c?.succeed():(t["6"]=true,c?.fail()),Object.keys(t).length>0&&(t["5"]&&(x.break(),x.error(`No Tailwind CSS configuration found at ${j.info(e.cwd)}.`),x.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),x.error("Install Tailwind CSS then try again."),o?.framework.links.tailwind&&x.error(`Visit ${j.info(o?.framework.links.tailwind)} to get started.`)),t["6"]&&(x.break(),x.error("No import alias found in your tsconfig.json file."),o?.framework.links.installation&&x.error(`Visit ${j.info(o?.framework.links.installation)} to learn how to set an import alias.`)),x.break(),process.exit(1)),{errors:t,projectInfo:o}}function ir(e,t){if(e.includes("\0"))return false;let r;try{r=e;let g="";for(;r!==g&&r.includes("%");)g=r,r=decodeURIComponent(r);}catch{return false}let i=$__default.normalize(r.replace(/\\/g,"/")),o=$__default.normalize(t),n=g=>g.replace(/\[\.\.\..*?\]/g,"").includes("..");if(n(i)||n(r)||n(e))return false;let s=g=>g.replace(/\[\.\.\..*?\]/g,""),c=s(e),a=s(r);if([/\.\.[\/\\]/,/[\/\\]\.\./,/\.\./,/\.\.%/,/\x00/,/[\x01-\x1f]/].some(g=>g.test(c)||g.test(a))||(e.includes("~")||r.includes("~"))&&(e.includes("../")||r.includes("../")))return false;if(/^[a-zA-Z]:[\/\\]/.test(r))return process.platform==="win32"?r.toLowerCase().startsWith(t.toLowerCase()):false;if($__default.isAbsolute(i))return i.startsWith(o+$__default.sep);let p=$__default.resolve(o,i);return p.startsWith(o+$__default.sep)||p===o}async function qe(e,t,r){if(!t.resolvedPaths.tailwindCss||!e||Object.keys(e).length===0)return;r={silent:false,...r};let i=t.resolvedPaths.tailwindCss,o=$__default.relative(t.resolvedPaths.cwd,i),n=y(`Updating ${j.info(o)}`,{silent:r.silent}).start(),s=await promises.readFile(i,"utf8"),c=await li(s,e);await promises.writeFile(i,c,"utf8"),n.succeed();}async function li(e,t){let r=[mi(t)],i=await R$1(r).process(e,{from:void 0}),o=i.css,n=i.root;if(n.nodes&&n.nodes.length>0){let s=n.nodes[n.nodes.length-1];s.type==="atrule"&&!s.nodes&&!o.trimEnd().endsWith(";")&&(o=o.trimEnd()+";");}return o=o.replace(/\/\* ---break--- \*\//g,""),o=o.replace(/(\n\s*\n)+/g,`
|
|
6
|
+
|
|
7
|
+
`),o=o.trimEnd(),o}function mi(e){return {postcssPlugin:"update-css",Once(t){for(let[r,i]of Object.entries(e))if(r.startsWith("@")){let o=r.match(/@([a-zA-Z-]+)\s*(.*)/);if(!o)continue;let[,n,s]=o;if(n==="import"){if(!t.nodes?.find(a=>a.type==="atrule"&&a.name==="import"&&a.params===s)){let a=R$1.atRule({name:"import",params:s,raws:{semicolon:true}}),l=t.nodes?.filter(m=>m.type==="atrule"&&m.name==="import");if(l&&l.length>0){let m=l[l.length-1];a.raws.before=`
|
|
8
|
+
`,t.insertAfter(m,a);}else !t.nodes||t.nodes.length,a.raws.before="",t.prepend(a);}}else if(n==="plugin"){let c=s;s&&!s.startsWith('"')&&!s.startsWith("'")&&(c=`"${s}"`);let a=m=>m.startsWith('"')&&m.endsWith('"')||m.startsWith("'")&&m.endsWith("'")?m.slice(1,-1):m;if(!t.nodes?.find(m=>m.type!=="atrule"||m.name!=="plugin"?false:a(m.params)===a(s))){let m=R$1.atRule({name:"plugin",params:c,raws:{semicolon:true,before:`
|
|
9
|
+
`}}),p=t.nodes?.filter(y=>y.type==="atrule"&&y.name==="import"),g=t.nodes?.filter(y=>y.type==="atrule"&&y.name==="plugin");if(g&&g.length>0){let y=g[g.length-1];t.insertAfter(y,m);}else if(p&&p.length>0){let y=p[p.length-1];t.insertAfter(y,m),t.insertBefore(m,R$1.comment({text:"---break---"})),t.insertAfter(m,R$1.comment({text:"---break---"}));}else t.prepend(m),t.insertBefore(m,R$1.comment({text:"---break---"})),t.insertAfter(m,R$1.comment({text:"---break---"}));}}else if(n==="custom-variant"){if(!t.nodes?.find(a=>a.type==="atrule"&&a.name==="custom-variant"&&a.params===s)){let a=R$1.atRule({name:"custom-variant",params:s,raws:{semicolon:true,before:`
|
|
10
|
+
`}}),l=t.nodes?.filter(p=>p.type==="atrule"&&p.name==="custom-variant"),m=t.nodes?.filter(p=>p.type==="atrule"&&p.name==="import");if(l&&l.length>0){let p=l[l.length-1];t.insertAfter(p,a);}else if(m&&m.length>0){let p=m[m.length-1];t.insertAfter(p,a),t.insertBefore(a,R$1.comment({text:"---break---"}));}else t.prepend(a);}}else if(typeof i=="object"&&Object.keys(i).length===0){if(!t.nodes?.find(a=>a.type==="atrule"&&a.name===n&&a.params===s)){let a=R$1.atRule({name:n,params:s,raws:{semicolon:true}});t.append(a),t.insertBefore(a,R$1.comment({text:"---break---"}));}}else if(n==="keyframes"){let c=t.nodes?.find(m=>m.type==="atrule"&&m.name==="theme"&&m.params==="inline");c||(c=R$1.atRule({name:"theme",params:"inline",raws:{semicolon:true,between:" ",before:`
|
|
11
|
+
`}}),t.append(c),t.insertBefore(c,R$1.comment({text:"---break---"})));let a=c.nodes?.find(m=>m.type==="atrule"&&m.name==="keyframes"&&m.params===s),l;if(a?(l=R$1.atRule({name:"keyframes",params:s,raws:{semicolon:true,between:" ",before:`
|
|
12
|
+
`}}),a.replaceWith(l)):(l=R$1.atRule({name:"keyframes",params:s,raws:{semicolon:true,between:" ",before:`
|
|
13
|
+
`}}),c.append(l)),typeof i=="object")for(let[m,p]of Object.entries(i))ne(l,m,p);}else if(n==="utility"){let c=t.nodes?.find(a=>a.type==="atrule"&&a.name===n&&a.params===s);if(c){if(typeof i=="object")for(let[a,l]of Object.entries(i))if(typeof l=="string"){let m=c.nodes?.find(g=>g.type==="decl"&&g.prop===a),p=R$1.decl({prop:a,value:l,raws:{semicolon:true,before:`
|
|
14
|
+
`}});m?m.replaceWith(p):c.append(p);}else typeof l=="object"&&ne(c,a,l);}else {let a=R$1.atRule({name:n,params:s,raws:{semicolon:true,between:" ",before:`
|
|
15
|
+
`}});if(t.append(a),t.insertBefore(a,R$1.comment({text:"---break---"})),typeof i=="object")for(let[l,m]of Object.entries(i))if(typeof m=="string"){let p=R$1.decl({prop:l,value:m,raws:{semicolon:true,before:`
|
|
16
|
+
`}});a.append(p);}else typeof m=="object"&&ne(a,l,m);}}else n==="property"?ne(t,r,i):or(t,n,s,i);}else ne(t,r,i);}}}function or(e,t,r,i){let o=e.nodes?.find(n=>n.type==="atrule"&&n.name===t&&n.params===r);if(o||(o=R$1.atRule({name:t,params:r,raws:{semicolon:true,between:" ",before:`
|
|
17
|
+
`}}),e.append(o),e.insertBefore(o,R$1.comment({text:"---break---"}))),typeof i=="object")for(let[n,s]of Object.entries(i))if(n.startsWith("@")){let c=n.match(/@([a-zA-Z-]+)\s*(.*)/);if(c){let[,a,l]=c;or(o,a,l,s);}}else ne(o,n,s);else if(typeof i=="string")try{let s=R$1.parse(`.temp{${i}}`).first;if(s&&s.nodes){let c=R$1.rule({selector:"temp",raws:{semicolon:!0,between:" ",before:`
|
|
18
|
+
`}});s.nodes.forEach(a=>{if(a.type==="decl"){let l=a.clone();l.raws.before=`
|
|
19
|
+
`,c.append(l);}}),c.nodes?.length&&o.append(c);}}catch(n){throw console.error("Error parsing at-rule content:",i,n),n}}function ne(e,t,r){let i=e.nodes?.find(o=>o.type==="rule"&&o.selector===t);if(i||(i=R$1.rule({selector:t,raws:{semicolon:true,between:" ",before:`
|
|
20
|
+
`}}),e.append(i)),typeof r=="object"){for(let[o,n]of Object.entries(r))if(o.startsWith("@")&&typeof n=="object"&&n!==null&&Object.keys(n).length===0){let s=o.match(/@([a-zA-Z-]+)\s*(.*)/);if(s){let[,c,a]=s,l=R$1.atRule({name:c,params:a,raws:{semicolon:true,before:`
|
|
21
|
+
`}});i.append(l);}}else if(typeof n=="string"){let s=R$1.decl({prop:o,value:n,raws:{semicolon:true,before:`
|
|
22
|
+
`}}),c=i.nodes?.find(a=>a.type==="decl"&&a.prop===o);c?c.replaceWith(s):i.append(s);}else if(typeof n=="object"){let s=o.startsWith("&")?t.replace(/^([^:]+)/,`$1${o.substring(1)}`):o;ne(e,s,n);}}else if(typeof r=="string")try{let n=R$1.parse(`.temp{${r}}`).first;n&&n.nodes&&n.nodes.forEach(s=>{if(s.type==="decl"){let c=s.clone();c.raws.before=`
|
|
23
|
+
`,i?.append(c);}});}catch(o){throw console.error("Error parsing rule content:",t,r,o),o}}var lr=new Set(["text","spacing"]);function je(e){let t=e.trim();return t===""||isNaN(Number(t))?t:`${t}px`}var pi=["--font-weight"];function ar(e,t){let r=lr.has(t),i={},o={},n={};for(let[s,c]of Object.entries(e)){let a=r&&!pi.some(l=>s.endsWith(l));if(c.includes("|")){let[l,m,p]=c.split("|").map(g=>g.trim());i[s]=a?je(l):l,m!==l&&(o[s]=a?je(m):m),p!==m&&(n[s]=a?je(p):p);}else i[s]=a?je(c):c;}return {desktop:i,tablet:o,mobile:n}}function X(e,t){let r={};for(let[i,o]of Object.entries(t))r[i?`${e}-${i}`:e]=o;return r}async function He(e,t,r){if(!t.resolvedPaths.tailwindCss||!Object.keys(e??{}).length)return;r={cleanupDefaultNextStyles:false,silent:false,overwriteCssVars:false,initIndex:true,...r};let i=t.resolvedPaths.tailwindCss,o=$__default.relative(t.resolvedPaths.cwd,i),n=y(`Updating CSS variables in ${j.info(o)}`,{silent:r.silent}).start(),s=await promises.readFile(i,"utf8"),c=await di(s,e??{},t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars,initIndex:r.initIndex});await promises.writeFile(i,c,"utf8"),n.succeed();}async function di(e,t,r,i={cleanupDefaultNextStyles:false,tailwindConfig:void 0,overwriteCssVars:false,initIndex:false}){i={cleanupDefaultNextStyles:false,tailwindConfig:void 0,overwriteCssVars:false,initIndex:false,...i};let o=[];if(r.resolvedPaths?.cwd){let c=u(r.resolvedPaths.cwd);!c?.dependencies?.["tailwindcss-animate"]&&!c?.devDependencies?.["tailwindcss-animate"]&&i.initIndex&&o.push(yi({params:"tw-animate-css"}));}i.cleanupDefaultNextStyles&&o.push(ui()),o.push(gi(t,{overwriteCssVars:i.overwriteCssVars})),o.push(hi(t)),i.tailwindConfig&&(o.push(wi(i.tailwindConfig)),o.push(xi(i.tailwindConfig)),o.push(bi(i.tailwindConfig)));let s=(await R$1(o).process(e,{from:void 0})).css;return s=s.replace(/\/\* ---break--- \*\//g,""),s=s.replace(/(\n\s*\n)+/g,`
|
|
24
|
+
|
|
25
|
+
`),s}function cr(e){let t=e.nodes.find(r=>r.type==="rule"&&r.selector===":root");if(t){let r=["--background","--foreground"];t.nodes.filter(i=>i.type==="decl"&&r.includes(i.prop)).forEach(i=>i.remove()),t.nodes.length===0&&t.remove();}}function ui(){return {postcssPlugin:"cleanup-default-next-styles",Once(e){let t=e.nodes.find(i=>i.type==="rule"&&i.selector==="body");t&&(t.nodes.find(i=>i.type==="decl"&&i.prop==="color"&&["rgb(var(--foreground-rgb))","var(--foreground)"].includes(i.value))?.remove(),t.nodes.find(i=>i.type==="decl"&&i.prop==="background"&&(i.value.startsWith("linear-gradient")||i.value==="var(--background)"))?.remove(),t.nodes.find(i=>i.type==="decl"&&i.prop==="font-family"&&i.value==="Arial, Helvetica, sans-serif")?.remove(),t.nodes.length===0&&t.remove()),cr(e);let r=e.nodes.find(i=>i.type==="atrule"&&i.params==="(prefers-color-scheme: dark)");r&&(cr(r),r.nodes.length===0&&r.remove());}}}function gi(e,t){return {postcssPlugin:"update-css-vars-v4",Once(r){let i=(n,s)=>{let c=r.nodes?.find(a=>a.type==="rule"&&a.selector===n);!c&&Object.keys(s).length>0&&(c=R$1.rule({selector:n,nodes:[],raws:{semicolon:true,between:" ",before:`
|
|
26
|
+
`}}),r.append(c),r.insertBefore(c,R$1.comment({text:"---break---"}))),Object.entries(s).forEach(([a,l])=>{let m=`--${a.replace(/^--/,"")}`;vi(l)&&(l=`hsl(${l})`);let p=R$1.decl({prop:m,value:l,raws:{semicolon:true}}),g=c?.nodes.find(y=>y.type==="decl"&&y.prop===m);t.overwriteCssVars?g?g.replaceWith(p):c?.append(p):g||c?.append(p);});},o=(n,s,c)=>{if(Object.keys(c).length===0)return;let a=`(max-width: ${n})`,l=r.nodes?.find(p=>p.type==="atrule"&&p.name==="media"&&p.params===a);l||(l=R$1.atRule({name:"media",params:a,nodes:[],raws:{semicolon:true,between:" ",before:`
|
|
27
|
+
`}}),r.append(l),r.insertBefore(l,R$1.comment({text:"---break---"})));let m=l.nodes?.find(p=>p.type==="rule"&&p.selector===s);m||(m=R$1.rule({selector:s,nodes:[],raws:{semicolon:true,between:" ",before:`
|
|
28
|
+
`}}),l.append(m)),Object.entries(c).forEach(([p,g])=>{let y=`--${p.replace(/^--/,"")}`,u=R$1.decl({prop:y,value:g,raws:{semicolon:true}}),h=m?.nodes.find(x=>x.type==="decl"&&x.prop===y);t.overwriteCssVars?h?h.replaceWith(u):m?.append(u):h||m?.append(u);});};for(let[n,s]of Object.entries(e))if(lr.has(n)){if(s.light){let{desktop:c,tablet:a,mobile:l}=ar(s.light,n);i(":root",X(n,c)),o("1199px",":root",X(n,a)),o("699px",":root",X(n,l));}if(s.dark){let{desktop:c,tablet:a,mobile:l}=ar(s.dark,n);i(".dark",X(n,c)),o("1199px",".dark",X(n,a)),o("699px",".dark",X(n,l));}}else s.light&&i(":root",X(n,s.light)),s.dark&&i(".dark",X(n,s.dark));}}}function hi(e){return {postcssPlugin:"update-theme",Once(t){if(Object.keys(e).length===0)return;let r=Xe(t);for(let[i,o]of Object.entries(e)){let n=Array.from(new Set([...Object.keys(o.light??{}),...Object.keys(o.dark??{})]));for(let s of n){let c=s?`${i}-${s}`:i,a=`--${c}`,l=`var(--${c})`;r?.nodes?.find(p=>p.type==="decl"&&p.prop===a)||r?.append(R$1.decl({prop:a,value:l,raws:{semicolon:true}}));}}}}}function Xe(e){let t=e.nodes.find(r=>r.type==="atrule"&&r.name==="theme"&&r.params==="inline");return t||(t=R$1.atRule({name:"theme",params:"inline",nodes:[],raws:{semicolon:true,between:" ",before:`
|
|
29
|
+
`}}),e.append(t),e.insertBefore(t,R$1.comment({text:"---break---"}))),t}function yi({params:e}){return {postcssPlugin:"add-custom-import",Once(t){let r=t.nodes.filter(n=>n.type==="atrule"&&n.name==="import"),i=t.nodes.find(n=>n.type==="atrule"&&n.name==="custom-variant");if(!r.some(n=>n.params.replace(/["']/g,"")===e)){let n=R$1.atRule({name:"import",params:`"${e}"`,raws:{semicolon:true,before:`
|
|
30
|
+
`}});if(r.length>0){let s=r[r.length-1];t.insertAfter(s,n);}else i?(t.insertBefore(i,n),t.insertBefore(i,R$1.comment({text:"---break---"}))):(t.prepend(n),t.insertAfter(n,R$1.comment({text:"---break---"})));}}}}function wi(e){return {postcssPlugin:"update-tailwind-config",Once(t){if(!e?.plugins)return;let i=Si(t)==="single"?"'":'"',o=t.nodes.filter(s=>s.type==="atrule"&&s.name==="plugin"),n=o[o.length-1]||t.nodes[0];for(let s of e.plugins){let c=s.replace(/^require\(["']|["']\)$/g,"");if(o.some(l=>l.params.replace(/["']/g,"")===c))continue;let a=R$1.atRule({name:"plugin",params:`${i}${c}${i}`,raws:{semicolon:true,before:`
|
|
31
|
+
`}});t.insertAfter(n,a),t.insertBefore(a,R$1.comment({text:"---break---"}));}}}}function bi(e){return {postcssPlugin:"update-tailwind-config-keyframes",Once(t){if(!e?.theme?.extend?.keyframes)return;let r=Xe(t),i=r.nodes?.filter(n=>n.type==="atrule"&&n.name==="keyframes"),o=z.record(z.string(),z.record(z.string(),z.string()));for(let[n,s]of Object.entries(e.theme.extend.keyframes)){if(typeof n!="string")continue;let c=o.safeParse(s);if(!c.success||i?.find(l=>l.type==="atrule"&&l.name==="keyframes"&&l.params===n))continue;let a=R$1.atRule({name:"keyframes",params:n,nodes:[],raws:{semicolon:true,between:" ",before:`
|
|
32
|
+
`}});for(let[l,m]of Object.entries(c.data)){let p=R$1.rule({selector:l,nodes:Object.entries(m).map(([g,y])=>R$1.decl({prop:g,value:y,raws:{semicolon:true,before:`
|
|
33
|
+
`,between:": "}})),raws:{semicolon:true,between:" ",before:`
|
|
34
|
+
`}});a.append(p);}r.append(a),r.insertBefore(a,R$1.comment({text:"---break---"}));}}}}function xi(e){return {postcssPlugin:"update-tailwind-config-animation",Once(t){if(!e?.theme?.extend?.animation)return;let r=Xe(t),i=r.nodes?.filter(n=>n.type==="decl"&&n.prop.startsWith("--animate-")),o=z.record(z.string(),z.string()).safeParse(e.theme.extend.animation);if(o.success)for(let[n,s]of Object.entries(o.data)){let c=`--animate-${n}`;if(i?.find(l=>l.prop===c))continue;let a=R$1.decl({prop:c,value:s,raws:{semicolon:true,between:": ",before:`
|
|
35
|
+
`}});r.append(a);}}}}function Si(e){return e.nodes[0].toString().includes("'")?"single":"double"}function vi(e){if(e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch"))return false;let t=e.split(" ");return t.length===3&&t.slice(1,3).every(r=>r.includes("%"))}async function B(e,t,r,i){if(e=Array.from(new Set(e)),t=Array.from(new Set(t)),!e?.length&&!t?.length)return;i={silent:false,...i};let o=y("Installing dependencies.",{silent:i.silent})?.start(),n=await Ci(r),s="";if(Ii(r)&&n==="npm")if(i.silent)s="force";else {o.stopAndPersist(),x.warn(`
|
|
36
|
+
It looks like you are using React 19.
|
|
37
|
+
Some packages may fail to install due to peer dependency issues in npm (see https://dev.createui.co/react-19).
|
|
38
|
+
`);let c=await Ae([{type:"select",name:"flag",message:"How would you like to proceed?",choices:[{title:"Use --force",value:"force"},{title:"Use --legacy-peer-deps",value:"legacy-peer-deps"}]}]);c&&(s=c.flag);}o?.start(),await ki(n,e,t,r.resolvedPaths.cwd,s),o?.succeed();}function Ii(e){let t=u(e.resolvedPaths.cwd,false);if(!t?.dependencies?.react)return false;let r=/^(?:\^|~)?19(?:\.\d+)*(?:-.*)?$/.test(t.dependencies.react),i=t.dependencies["react-day-picker"]?.startsWith("8");return r&&i}async function Ci(e){return u(e.resolvedPaths.cwd,false)?.dependencies?.expo?"expo":a$1(e.resolvedPaths.cwd)}async function ki(e,t,r,i,o){if(e==="npm")return Pi(t,r,i,o);if(e==="deno")return Ei(t,r,i);if(e==="expo")return ji(t,r,i);if(t?.length)try{await execa(e,["add",...t],{cwd:i});}catch{await $e(e,"add",t,i);}if(r?.length)try{await execa(e,["add","-D",...r],{cwd:i});}catch{await $e(e,"add -D",r,i);}}async function Pi(e,t,r,i){let o=i?[`--${i}`]:[];if(e.length)try{await execa("npm",["install",...o,...e],{cwd:r});}catch{await $e("npm",`install${o.length?` ${o.join(" ")}`:""}`,e,r);}if(t.length)try{await execa("npm",["install",...o,"-D",...t],{cwd:r});}catch{await $e("npm",`install${o.length?` ${o.join(" ")}`:""} -D`,t,r);}}async function $e(e,t,r,i){let o=[];for(let n of r)try{await execa(e,[...t.split(" "),n],{cwd:i});}catch{o.push(n);}o.length>0&&x.warn(`
|
|
39
|
+
Failed to install: ${o.join(", ")}. You may need to install them manually.
|
|
40
|
+
`);}async function Ei(e,t,r){e?.length&&await execa("deno",["add",...e.map(i=>`npm:${i}`)],{cwd:r}),t?.length&&await execa("deno",["add","-D",...t.map(i=>`npm:${i}`)],{cwd:r});}async function ji(e,t,r){e.length&&await execa("npx",["expo","install",...e],{cwd:r}),t.length&&await execa("npx",["expo","install","-- -D",...t],{cwd:r});}async function Ze(e,t,r){if(!e||Object.keys(e).length===0)return {envVarsAdded:[],envFileUpdated:null,envFileCreated:null};r={silent:false,...r};let i=y("Adding environment variables.",{silent:r.silent})?.start(),o=t.resolvedPaths.cwd,n=$__default.join(o,".env.local"),s=L(o);s&&(n=s);let c=existsSync(n),a=$__default.basename(n),l=Object.entries(e).map(([y,u])=>`${y}=${u}`).join(`
|
|
41
|
+
`),m=[],p=null,g=null;if(c){let y=await promises.readFile(n,"utf-8"),u=N(y,l);if(m=M(y,l),m.length>0){if(await promises.writeFile(n,u,"utf-8"),p=$__default.relative(o,n),i?.succeed(`Added the following variables to ${j.info(a)}:`),!r.silent)for(let h of m)x.log(` ${j.success("+")} ${h}`);}else i?.stop();}else if(await promises.writeFile(n,l+`
|
|
42
|
+
`,"utf-8"),g=$__default.relative(o,n),m=Object.keys(e),i?.succeed(`Added the following variables to ${j.info(a)}:`),!r.silent)for(let y of m)x.log(` ${j.success("+")} ${y}`);return !r.silent&&m.length>0&&x.break(),{envVarsAdded:m,envFileUpdated:p,envFileCreated:g}}async function fr(e,t){if(!e.fonts?.length)return e;let r=await v$1(t.resolvedPaths.cwd);if(!r)return e;if(e.cssVars??={},e.cssVars.font??={light:{}},e.cssVars.font.light??={},r.framework.name==="next-app"||r.framework.name==="next-pages"){for(let o of e.fonts)e.cssVars.font.light[o.role]=`var(${o.font.variable})`;return e}let i=new Set;for(let o of e.fonts){let s=`@fontsource-variable/${o.name.replace("font-","").replace(/-display|-body|-numeric/,"")}`;i.has(s)||(i.add(s),e.dependencies??=[],e.dependencies.push(s),e.css??={},e.css[`@import "${s}"`]={}),e.cssVars.font.light[o.role]=o.font.family;}return e}async function et(e,t,r){if(!e?.length)return;let i=await v$1(t.resolvedPaths.cwd);if(!i||i.framework.name!=="next-app"&&i.framework.name!=="next-pages")return;let o=y("Updating fonts.",{silent:r.silent})?.start();try{await _i(e,t,i),o?.succeed("Updating fonts.");}catch(n){throw o?.fail("Failed to update fonts."),n}}async function _i(e,t,r){let i=await Di(t,r);if(!i)return;let o=await promises.readFile(i,"utf-8"),n=await Vi(o,e);n!==o&&await promises.writeFile(i,n,"utf-8");}async function Di(e,t){let r=e.resolvedPaths.cwd,i=t.isSrcDir,n=t.isTsx?"tsx":"jsx",s=i?[`src/app/layout.${n}`,`app/layout.${n}`]:[`app/layout.${n}`];for(let c of s){let a=$__default.join(r,c);if(existsSync(a))return a}return null}async function Vi(e,t,r){let o=new Project({compilerOptions:{}}).createSourceFile("layout.tsx",e,{scriptKind:ScriptKind.TSX}),n=t.filter(a=>a.font.provider==="google"),s=[];for(let a of n){let l=a.font.import;if(!l)continue;let m=a.font.variable.replace(/^--/,"").replace(/-([a-z])/g,(u,h)=>h.toUpperCase()),p=o.getImportDeclaration(u=>u.getModuleSpecifierValue()==="next/font/google"),g=Li(a);p?p.getNamedImports().some(x=>x.getName()===l)||p.addNamedImport(l):o.addImportDeclaration({moduleSpecifier:"next/font/google",namedImports:[l]});let y=Mi(o,a.font.variable);if(y)y.setInitializer(`${l}(${g})`),y.getName()!==m&&y.rename(m);else {let u=Wi(o);o.insertVariableStatement(u,{declarationKind:VariableDeclarationKind.Const,declarations:[{name:m,initializer:`${l}(${g})`}]}).appendWhitespace(`
|
|
43
|
+
`);}s.push(m);}let c=new Set(n.map(a=>a.font.variable));return Bi(o,c),Gi(o),s.length>0&&zi(o,s),Ji(o),o.getFullText()}function Li(e){let t={};return e.font.subsets?.length&&(t.subsets=e.font.subsets),e.font.weight?.length&&(t.weight=e.font.weight),t.variable=e.font.variable,JSON.stringify(t).replace(/"([^"]+)":/g,"$1:").replace(/"/g,"'")}function Mi(e,t){let r=e.getVariableStatements();for(let i of r)for(let o of i.getDeclarations()){let n=o.getInitializer();if(!n||n.getKind()!==SyntaxKind.CallExpression)continue;let c=n.getArguments();if(c.length===0)continue;let a=c[0].getText();if(a.includes("variable:")&&a.includes(t))return o}return null}function Wi(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function zi(e,t){let r=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement);for(let i of r){if(i.getTagNameNode().getText()!=="html")continue;let n=i.getAttribute("className");if(!n){let l=t.map(m=>`${m}.variable`).join(", ");t.length===1?i.addAttribute({name:"className",initializer:`{${l}}`}):(ye(e),i.addAttribute({name:"className",initializer:`{cn(${l})}`}));return}if(n.getKind()!==SyntaxKind.JsxAttribute)return;let s=n.asKindOrThrow(SyntaxKind.JsxAttribute),c=s.getInitializer();if(!c)return;let a=t.map(l=>`${l}.variable`);if(c.getKind()===SyntaxKind.StringLiteral){let l=c.getText().slice(1,-1);ye(e),s.setInitializer(`{cn("${l}", ${a.join(", ")})}`);}else if(c.getKind()===SyntaxKind.JsxExpression){let l=c.asKindOrThrow(SyntaxKind.JsxExpression),m=l.getExpression();if(!m)return;let p=m.getText();if(p.startsWith("cn(")){if(a.every(h=>p.includes(h)))continue;let y=Ki(p),u=Yi(y,a);l.replaceWithText(`{${u}}`);}else if(/^\w+\.variable$/.test(p)){if(a.includes(p))continue;a.length===1?l.replaceWithText(`{${a[0]}}`):(ye(e),l.replaceWithText(`{cn(${a.join(", ")})}`));}else if(p.startsWith("`")&&p.endsWith("`")){let g=Ui(p).filter(y=>!/^\w+\.variable$/.test(y));ye(e),l.replaceWithText(`{cn(${[...g,...a].join(", ")})}`);}else ye(e),l.replaceWithText(`{cn(${p}, ${a.join(", ")})}`);}}}function ye(e){if(!e.getImportDeclaration(r=>r.getNamedImports().some(o=>o.getName()==="cn"))){let r=e.getImportDeclaration(i=>i.getModuleSpecifierValue().includes("/lib/utils"));r?r.getNamedImports().some(o=>o.getName()==="cn")||r.addNamedImport("cn"):e.addImportDeclaration({moduleSpecifier:"@/lib/utils",namedImports:["cn"]});}}function Ui(e){let t=[],r=[],o=e.slice(1,-1).split(/(\$\{[^}]+\})/);for(let n of o)if(n)if(n.startsWith("${")&&n.endsWith("}")){let s=n.slice(2,-1).trim();s&&r.push(s);}else {let s=n.trim().split(/\s+/).filter(Boolean);for(let c of s)t.push(`"${c}"`);}return [...t,...r]}function Bi(e,t){let r=[];for(let i of e.getVariableStatements())for(let o of i.getDeclarations()){let n=o.getInitializer();if(!n||n.getKind()!==SyntaxKind.CallExpression)continue;let c=n.getArguments();if(c.length===0)continue;let a=c[0].getText();if(!a.includes("variable:"))continue;let l=a.match(/variable:\s*['"]([^'"]+)['"]/);if(!l)continue;let m=l[1];t.has(m)||r.push(i);}for(let i of r)i.remove();}function Gi(e){let t=e.getImportDeclaration(o=>o.getModuleSpecifierValue()==="next/font/google");if(!t)return;let r=t.getNamedImports(),i=e.getFullText();for(let o of r){let n=o.getName(),s=t.getText(),c=i.replace(s,"");new RegExp(`\\b${n}\\b`).test(c)||o.remove();}t.getNamedImports().length===0&&t.remove();}function Ji(e,t){let r=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement);for(let i of r){if(i.getTagNameNode().getText()!=="body")continue;let n=i.getAttribute("className");if(!n||n.getKind()!==SyntaxKind.JsxAttribute)continue;let s=n.asKindOrThrow(SyntaxKind.JsxAttribute),c=s.getInitializer();if(c&&c.getKind()===SyntaxKind.JsxExpression){let a=c.asKindOrThrow(SyntaxKind.JsxExpression),l=a.getExpression();if(!l)continue;let m=l.getText();if(m.startsWith("`")&&m.endsWith("`")){let p=m.slice(1,-1),g=[],y=p.split(/(\$\{[^}]+\})/);for(let u of y){if(!u||u.startsWith("${")&&u.endsWith("}"))continue;let h=u.trim().split(/\s+/).filter(Boolean);g.push(...h);}g.length>0?s.setInitializer(`"${g.join(" ")}"`):s.remove();}else if(m.startsWith("cn(")){let p=m;p=p.replace(/,?\s*\w+\.variable/g,""),p=p.replace(/cn\(\s*,/,"cn(");let g=p.match(/^cn\((.+)\)$/);if(g){let y=g[1].split(",").map(u=>u.trim()).filter(Boolean);y.length===0?s.remove():y.length===1&&y[0].startsWith('"')?s.setInitializer(y[0]):a.replaceWithText(`{${p}}`);}}}}}function Ki(e){return e.replace(/,?\s*\w+\.variable/g,"").replace(/cn\(\s*,/,"cn(")}function Yi(e,t){let r=t.join(", ");return e.replace(/\)$/,`, ${r})`)}async function tt(e,t,r){}async function oe(e,t,r){r={overwrite:false,silent:false,isNewProject:false,baseStyle:true,...r};let i=await q$2(t);return i&&i.ui&&i.ui.resolvedPaths.cwd!==t.resolvedPaths.cwd?await Xi(e,t,i,{...r,isRemote:e?.length===1&&!!e[0].match(/^https?:\/\//)}):await Hi(e,t,r)}async function Hi(e,t,r){if(!r.baseStyle&&!e.length)return;let i=y("Checking registry.",{silent:r.silent})?.start(),o=await _$1(e,U(t));if(!o)return i?.fail(),$$1(new Error("Failed to fetch components from registry."));try{dr(o.files??[],t.resolvedPaths.cwd);}catch(s){return i?.fail(),$$1(s)}i?.succeed(),o=await fr(o,t),await tt(o.tailwind?.config,t,{silent:r.silent});let n=await pr(e,t);await He(o.cssVars,t,{cleanupDefaultNextStyles:r.isNewProject,silent:r.silent,tailwindConfig:o.tailwind?.config,overwriteCssVars:n,initIndex:r.baseStyle}),await qe(o.css,t,{silent:r.silent}),await Ze(o.envVars,t,{silent:r.silent}),await et(o.fonts,t,{silent:r.silent}),await Q(o.files,t,{overwrite:r.overwrite,silent:r.silent,path:r.path}),await B(o.dependencies,o.devDependencies,t,{silent:r.silent}),o.docs&&x.info(o.docs);}async function Xi(e,t,r$1,i){if(!i.baseStyle&&!e.length)return;let o=y("Checking registry.",{silent:i.silent})?.start(),n=await _$1(e,U(t));if(!n)return o?.fail(),$$1(new Error("Failed to fetch components from registry."));try{dr(n.files??[],t.resolvedPaths.cwd);}catch(u){return o?.fail(),$$1(u)}o?.succeed();let s$1=[],c=[],a=[],l=y("Installing components.")?.start(),m=r$1.ui,p=s(t.resolvedPaths.cwd,m.resolvedPaths.ui);if(n.tailwind?.config&&(await tt(n.tailwind?.config),c.push($__default.relative(p,m.resolvedPaths.tailwindConfig))),n.cssVars){let u=await pr(e,t);await He(n.cssVars,m,{silent:true,tailwindConfig:n.tailwind?.config,overwriteCssVars:u}),c.push($__default.relative(p,m.resolvedPaths.tailwindCss));}n.css&&(await qe(n.css,m,{silent:true}),c.push($__default.relative(p,m.resolvedPaths.tailwindCss))),n.envVars&&await Ze(n.envVars,m,{silent:true}),await et(n.fonts,m,{silent:true}),await B(n.dependencies,n.devDependencies,m,{silent:true});let g=new Map;for(let u of n.files??[]){let h=u.type||"registry:ui";g.has(h)||g.set(h,[]),g.get(h).push(u);}for(let u of Array.from(g.keys())){let h=g.get(u),x=u==="registry:ui"?r$1.ui:t,b=s(t.resolvedPaths.cwd,x.resolvedPaths.ui||x.resolvedPaths.cwd),N=await r(b,x.resolvedPaths.cwd)??x.resolvedPaths.cwd,j=await Q(h,x,{overwrite:i.overwrite,silent:true,rootSpinner:l,isRemote:i.isRemote,isWorkspace:true,path:i.path});s$1.push(...j.filesCreated.map(D=>$__default.relative(b,$__default.join(N,D)))),c.push(...j.filesUpdated.map(D=>$__default.relative(b,$__default.join(N,D)))),a.push(...j.filesSkipped.map(D=>$__default.relative(b,$__default.join(N,D))));}if(l?.succeed(),s$1.sort(),c.sort(),a.sort(),!(s$1.length||c.length)&&!a.length&&y("No files updated.",{silent:i.silent})?.info(),s$1.length){y(`Created ${s$1.length} ${s$1.length===1?"file":"files"}:`,{silent:i.silent})?.succeed();for(let u of s$1)x.log(` - ${u}`);}if(c.length){y(`Updated ${c.length} ${c.length===1?"file":"files"}:`,{silent:i.silent})?.info();for(let u of c)x.log(` - ${u}`);}if(a.length){y(`Skipped ${a.length} ${c.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:i.silent})?.info();for(let u of a)x.log(` - ${u}`);}n.docs&&x.info(n.docs);}async function pr(e,t){let r=await ba(e,{config:t});return z.array(p$1).parse(r).some(o=>o.type==="registry:theme"||o.type==="registry:style"||o.type==="registry:font-variant"||o.type==="registry:base")}function dr(e,t){for(let r of e)if(r?.target&&!ir(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}var nt="https://codeload.github.com/createui-ui/ui/tar.gz/main",W={next:"next","next-monorepo":"next-monorepo",vite:"vite",start:"start"};async function Te(e){e={srcDir:false,...e};let t=e.template&&W[e.template]?e.template:"next",r=e.name??(t===W.next||t===W.vite||t===W.start?"my-app":"my-monorepo"),i="latest",o=e.components?.length===1&&!!e.components[0].match(/^https?:\/\//);if(e.components&&o)try{let[c]=await Y(e.components),{meta:a}=z.object({meta:z.object({nextVersion:z.string()})}).parse(c);i=a.nextVersion,t=W.next;}catch(c){x.break(),$$1(c);}if(!e.force){let{type:c,name:a}=await Ae([{type:e.template||o?null:"select",name:"type",message:`The path ${j.info(e.cwd)} does not contain a package.json file.
|
|
44
|
+
Would you like to start a new project?`,choices:[{title:"Next.js",value:"next"},{title:"Next.js (Monorepo)",value:"next-monorepo"},{title:"Vite",value:"vite"},{title:"TanStack Start",value:"start"}],initial:0},{type:e.name?null:"text",name:"name",message:"What is your project named?",initial:r,format:l=>l.trim(),validate:l=>l.length>128?"Name should be less than 128 characters.":true}]);t=c??t,r=a??r;}let n=await a$1(e.cwd,{withFallback:true}),s=`${e.cwd}/${r}`;try{await v.access(e.cwd,v.constants.W_OK);}catch{x.break(),x.error(`The path ${j.info(e.cwd)} is not writable.`),x.error(`It is likely you do not have write permissions for this folder or the path ${j.info(e.cwd)} does not exist.`),x.break(),process.exit(1);}return v.existsSync($__default.resolve(e.cwd,r,"package.json"))&&(x.break(),x.error(`A project with the name ${j.info(r)} already exists.`),x.error("Please choose a different name and try again."),x.break(),process.exit(1)),t===W.next&&await Zi(s,{version:i,cwd:e.cwd,packageManager:n,srcDir:!!e.srcDir}),t===W["next-monorepo"]&&await en(s,{packageManager:n}),t===W.vite&&await tn(s,{packageManager:n}),t===W.start&&await rn(s,{packageManager:n}),{projectPath:s,projectName:r,template:t}}async function Zi(e,t){let r=y("Creating a new Next.js project. This may take a few minutes.").start(),i=["--tailwind","--eslint","--typescript","--app",t.srcDir?"--src-dir":"--no-src-dir","--no-import-alias",`--use-${t.packageManager}`];(t.version.startsWith("15")||t.version.startsWith("latest")||t.version.startsWith("canary"))&&i.push("--turbopack"),(t.version.startsWith("latest")||t.version.startsWith("canary"))&&i.push("--no-react-compiler");try{await execa("npx",[`create-next-app@${t.version}`,e,"--silent",...i],{cwd:t.cwd});}catch{x.break(),x.error("Something went wrong creating a new Next.js project. Please try again."),process.exit(1);}r?.succeed("Creating a new Next.js project.");}async function en(e,t){let r=y("Creating a new Next.js monorepo. This may take a few minutes.").start();try{let i=$__default.join(it.tmpdir(),`createui-template-${Date.now()}`);await v.ensureDir(i);let o=await fetch(nt);if(!o.ok)throw new Error(`Failed to download template: ${o.statusText}`);let n=$__default.resolve(i,"template.tar.gz");await v.writeFile(n,Buffer.from(await o.arrayBuffer())),await execa("tar",["-xzf",n,"-C",i,"--strip-components=2","ui-main/templates/monorepo-next"]);let s=$__default.resolve(i,"monorepo-next");await v.move(s,e),await v.remove(i),await execa(t.packageManager,["install"],{cwd:e});let c=$__default.join(e,"package.json");if(v.existsSync(c)){let l=await v.readFile(c,"utf8"),m=JSON.parse(l);m.name=e.split("/").pop(),await v.writeFile(c,JSON.stringify(m,null,2));}let a=process.cwd();await execa("git",["--version"],{cwd:e}),await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","Initial commit"],{cwd:e}),r?.succeed("Creating a new Next.js monorepo.");}catch(i){r?.fail("Something went wrong creating a new Next.js monorepo."),$$1(i);}}async function tn(e,t){let r=y("Creating a new Vite project. This may take a few minutes.").start();try{let i=$__default.join(it.tmpdir(),`createui-template-${Date.now()}`);await v.ensureDir(i);let o=await fetch(nt);if(!o.ok)throw new Error(`Failed to download template: ${o.statusText}`);let n=$__default.resolve(i,"template.tar.gz");await v.writeFile(n,Buffer.from(await o.arrayBuffer())),await execa("tar",["-xzf",n,"-C",i,"--strip-components=2","ui-main/templates/vite-app"]);let s=$__default.resolve(i,"vite-app");if(await v.move(s,e),await v.remove(i),t.packageManager!=="pnpm"){let a=$__default.join(e,"pnpm-lock.yaml");v.existsSync(a)&&await v.remove(a);}await execa(t.packageManager,["install"],{cwd:e});let c=$__default.join(e,"package.json");if(v.existsSync(c)){let a=await v.readFile(c,"utf8"),l=JSON.parse(a);l.name=e.split("/").pop(),await v.writeFile(c,JSON.stringify(l,null,2));}await execa("git",["--version"],{cwd:e}),await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","Initial commit"],{cwd:e}),r?.succeed("Creating a new Vite project.");}catch(i){r?.fail("Something went wrong creating a new Vite project."),$$1(i);}}async function rn(e,t){let r=y("Creating a new TanStack Start project. This may take a few minutes.").start();try{let i=$__default.join(it.tmpdir(),`createui-template-${Date.now()}`);await v.ensureDir(i);let o=await fetch(nt);if(!o.ok)throw new Error(`Failed to download template: ${o.statusText}`);let n=$__default.resolve(i,"template.tar.gz");await v.writeFile(n,Buffer.from(await o.arrayBuffer())),await execa("tar",["-xzf",n,"-C",i,"--strip-components=2","ui-main/templates/start-app"]);let s=$__default.resolve(i,"start-app");if(await v.move(s,e),await v.remove(i),t.packageManager!=="pnpm"){let a=$__default.join(e,"pnpm-lock.yaml");v.existsSync(a)&&await v.remove(a);}await execa(t.packageManager,["install"],{cwd:e});let c=$__default.join(e,"package.json");if(v.existsSync(c)){let a=await v.readFile(c,"utf8"),l=JSON.parse(a);l.name=e.split("/").pop(),await v.writeFile(c,JSON.stringify(l,null,2));}await execa("git",["--version"],{cwd:e}),await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","Initial commit"],{cwd:e}),r?.succeed("Creating a new TanStack Start project.");}catch(i){r?.fail("Something went wrong creating a new TanStack Start project."),$$1(i);}}async function G(e=process.cwd()){try{let{config:t}=await import('@dotenvx/dotenvx'),r=[".env.local",".env.development.local",".env.development",".env"];for(let i of r){let o=join(e,i);existsSync(o)&&t({path:o,overload:!1,quiet:!0});}}catch(t){x.warn("Failed to load env files:",t);}}var we=".bak";function ur(e){if(!v.existsSync(e))return null;let t=`${e}${we}`;try{return v.renameSync(e,t),t}catch(r){return console.error(`Failed to create backup of ${e}: ${r}`),null}}function gr(e){let t=`${e}${we}`;if(!v.existsSync(t))return false;try{return v.renameSync(t,e),!0}catch(r){return console.error(`Warning: Could not restore backup file ${t}: ${r}`),false}}function ot(e){let t=`${e}${we}`;if(!v.existsSync(t))return false;try{return v.unlinkSync(t),!0}catch{return false}}async function hr(e,t){let r=new Set,i=new Set,o=[...e];for(;o.length>0;){let n=o.shift();if(i.has(n))continue;i.add(n);let{registry:s}=K(n);s&&!h[s]&&r.add(s);try{let[c]=await Z([n],t,{useCache:!0});if(c?.registryDependencies)for(let a of c.registryDependencies){let{registry:l}=K(a);l&&!h[l]&&r.add(l),i.has(a)||o.push(a);}}catch(c){if(c instanceof E){let{registry:a}=K(n);a&&!h[a]&&r.add(a);continue}continue}}return Array.from(r)}async function _(e,t,r={}){r={silent:false,writeFile:true,...r};let o=(await hr(e,t)).filter(l=>!t.registries?.[l]&&!Object.keys(h).includes(l));if(o.length===0)return {config:t,newRegistries:[]};let n=await na({useCache:process.env.NODE_ENV!=="development"});if(!n)return {config:t,newRegistries:[]};let s={};for(let l of o)n[l]&&(s[l]=n[l]);if(Object.keys(s).length===0)return {config:t,newRegistries:[]};let c$1=Object.fromEntries(Object.entries(t.registries||{}).filter(([l])=>!Object.keys(h).includes(l))),a={...t,registries:{...c$1,...s}};if(r.writeFile){let{resolvedPaths:l,...m}=a,p=y("Updating components.json.",{silent:r.silent}).start(),g=c.parse(m);await v.writeFile($__default.resolve(t.resolvedPaths.cwd,"components.json"),JSON.stringify(g,null,2)+`
|
|
45
|
+
`,"utf-8"),p.succeed();}return {config:a,newRegistries:Object.keys(s)}}process.on("exit",e=>{let t=$__default.resolve(process.cwd(),"components.json");return e===0?ot(t):gr(t)});var at=z.object({cwd:z.string(),name:z.string().optional(),components:z.array(z.string()).optional(),yes:z.boolean(),defaults:z.boolean(),force:z.boolean(),silent:z.boolean(),isNewProject:z.boolean(),srcDir:z.boolean().optional(),cssVariables:z.boolean(),template:z.string().optional().refine(e=>e?W[e]:true,{message:"Invalid template. Please use 'next', 'vite', 'start' or 'next-monorepo'."}),baseColor:z.string().optional(),theme:z.string().optional(),neutral:z.string().optional(),fontVariant:z.string().optional(),baseStyle:z.boolean(),registryBaseConfig:c.deepPartial().optional()}),wr=new Command().name("init").description("initialize your project and install dependencies").argument("[components...]","names, url or local path to component").option("-t, --template <template>","the template to use. (next, start, vite, next-monorepo)").option("-b, --base-color <base-color>","deprecated: use --theme instead.",void 0).option("--theme <theme>","the primary color theme. (indigo, blue, lime, rose, etc.)",void 0).option("--neutral <neutral>",`neutral color theme. (${c$1.join(", ")})`,void 0).option("--font-variant <fontVariant>",`font variant. (${f.join(", ")})`,void 0).option("-y, --yes","skip confirmation prompt.",true).option("-d, --defaults,","use default configuration.",false).option("-f, --force","force overwrite of existing configuration.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",false).option("--src-dir","use the src directory when creating a new project.",false).option("--no-src-dir","do not use the src directory when creating a new project.").option("--css-variables","use css variables for theming.",true).option("--no-css-variables","do not use css variables for theming.").option("--no-base-style","do not install the base createui style.").action(async(e,t$1)=>{try{t$1.defaults&&(t$1.template=t$1.template||"next");let r=at.parse({cwd:$__default.resolve(t$1.cwd),isNewProject:!1,components:e,...t$1});if(await G(r.cwd),e.length>0){let i=U(t({resolvedPaths:{cwd:r.cwd}})),o=$__default.resolve(r.cwd,"components.json");if(v.existsSync(o)){let c$1=await v.readJson(o),a=c.partial().parse(c$1),l=t({resolvedPaths:{cwd:r.cwd}});i=U({...a,resolvedPaths:{...l.resolvedPaths,cwd:r.cwd}}),ur(o);}let{config:n}=await _(e,i,{silent:!0,writeFile:!1});i=n,X$1(e[0],i);let[s]=await ba([e[0]],{config:i});s?.type==="registry:base"&&(s.config&&(i=U(yr(i,s.config)),r.registryBaseConfig=s.config),r.baseStyle=s.extends==="none"?!1:r.baseStyle),s?.type==="registry:style"&&(r.baseStyle=s.extends==="none"?!1:r.baseStyle);}await pe(r),x.log(`${j.success("Success!")} Project initialization completed.
|
|
46
|
+
You may now add components.`),ot($__default.resolve(r.cwd,"components.json")),x.break();}catch(r){x.break(),$$1(r);}finally{V();}});async function pe(e){let t,r;if(e.skipPreflight)t=await v$1(e.cwd);else {let b=await rr(e);if(b.errors["1"]){let{projectPath:N,template:j}=await Te(e);N||process.exit(1),e.cwd=N,e.isNewProject=true,r=j,t=await v$1(e.cwd);}else t=b.projectInfo;}if(r==="next-monorepo")return e.cwd=$__default.resolve(e.cwd,"apps/web"),await o(e.cwd);let i=await w(e.cwd,t),o$1=i?await fn(i,e):await mn(await o(e.cwd)),n=o$1.config;if(!e.theme&&o$1.theme&&(e.theme=o$1.theme),!e.neutral&&o$1.neutral&&(e.neutral=o$1.neutral),!e.fontVariant&&o$1.fontVariant&&(e.fontVariant=o$1.fontVariant),!e.yes){let{proceed:b}=await Ae({type:"confirm",name:"proceed",message:`Write configuration to ${j.info("components.json")}. Proceed?`,initial:true});b||process.exit(0);}let s=e.theme??e.baseColor??"indigo",c=e.neutral??d,a=e.fontVariant??g,l=[...e.baseStyle?["index"]:[],...e.baseStyle?[`theme-${s}`]:[],...e.baseStyle?[`neutral-${c}`]:[],...e.baseStyle?[`font-variant-${a}`]:[],...e.components??[]],m=await p(e.cwd,n),{config:p$1}=await _(l,m,{silent:true});p$1.registries&&(n.registries=p$1.registries);let g$1=y("Writing components.json.").start(),y$1=$__default.resolve(e.cwd,"components.json"),u=`${y$1}${we}`,h$1=(b,N)=>{let{registries:j,...D}=yr(b,N);return {...D,registries:j}};if(!e.force&&v.existsSync(u)){let b=await v.readJson(u);n=h$1(b,n);}e.registryBaseConfig&&(n=h$1(n,e.registryBaseConfig)),n.registries=Object.fromEntries(Object.entries(n.registries||{}).filter(([b])=>!Object.keys(h).includes(b))),await promises.writeFile(y$1,`${JSON.stringify(n,null,2)}
|
|
47
|
+
`,"utf8"),g$1.succeed();let x=await p(e.cwd,n);return await oe(l,x,{overwrite:true,silent:e.silent,baseStyle:e.baseStyle,isNewProject:e.isNewProject||t?.framework.name==="next-app"}),x}async function mn(e$1=null){x.info("");let t=await Ae([{type:"toggle",name:"typescript",message:`Would you like to use ${j.info("TypeScript")} (recommended)?`,initial:e$1?.tsx??true,active:"yes",inactive:"no"},{type:"select",name:"theme",message:`Which ${j.info("primary")} color would you like to use?`,choices:a.map(n=>({title:n.label,value:n.name}))},{type:"select",name:"neutral",message:`Which ${j.info("neutral")} color would you like to use?`,choices:b.map(n=>({title:n.name===d?`${n.label} (Default)`:n.label,value:n.name}))},{type:"select",name:"fontVariant",message:`Which ${j.info("font variant")} would you like to use?`,choices:e.map(n=>({title:n.name===g?`${n.label} (Default)`:n.label,value:n.name}))},{type:"text",name:"tailwindCss",message:`Where is your ${j.info("global CSS")} file?`,initial:e$1?.tailwind.css??m},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${j.info("CSS variables")} for theming?`,initial:e$1?.tailwind.cssVariables??true,active:"yes",inactive:"no"},{type:"text",name:"tailwindPrefix",message:`Are you using a custom ${j.info("tailwind prefix eg. tw-")}? (Leave blank if not)`,initial:""},{type:"text",name:"tailwindConfig",message:`Where is your ${j.info("tailwind.config.js")} located?`,initial:e$1?.tailwind.config??n},{type:"text",name:"components",message:`Configure the import alias for ${j.info("components")}:`,initial:e$1?.aliases.components??k},{type:"text",name:"utils",message:`Configure the import alias for ${j.info("utils")}:`,initial:e$1?.aliases.utils??l},{type:"toggle",name:"rsc",message:`Are you using ${j.info("React Server Components")}?`,initial:e$1?.rsc??true,active:"yes",inactive:"no"}]),r=t.theme??"indigo",i=t.neutral??d,o=t.fontVariant??g;return {config:c.parse({$schema:"https://dev.createui.co/schema.json",tailwind:{config:t.tailwindConfig,css:t.tailwindCss,baseColor:r,cssVariables:t.tailwindCssVariables,prefix:t.tailwindPrefix},rsc:t.rsc,tsx:t.typescript,aliases:{utils:t.utils,components:t.components,lib:t.components.replace(/\/components$/,"lib"),hooks:t.components.replace(/\/components$/,"hooks")}}),theme:r,neutral:i,fontVariant:o}}async function fn(e$1,t){let r=e$1.tailwind.cssVariables,i=e$1.iconLibrary??"lucide";if(!t.defaults){let c=await Ae([{type:t.theme?null:"select",name:"theme",message:`Which ${j.info("primary")} color would you like to use?`,choices:a.map(a=>({title:a.label,value:a.name})),initial:0},{type:t.neutral?null:"select",name:"neutral",message:`Which ${j.info("neutral")} color would you like to use?`,choices:b.map(a=>({title:a.name===d?`${a.label} (Default)`:a.label,value:a.name})),initial:0},{type:t.fontVariant?null:"select",name:"fontVariant",message:`Which ${j.info("font variant")} would you like to use?`,choices:e.map(a=>({title:a.name===g?`${a.label} (Default)`:a.label,value:a.name})),initial:0}]);t.theme=c.theme??t.theme??"indigo",t.neutral=c.neutral??t.neutral??d,t.fontVariant=c.fontVariant??t.fontVariant??g,r=t.cssVariables;}let o=t.theme??"indigo",n=t.neutral??d,s=t.fontVariant??g;return {config:c.parse({$schema:e$1?.$schema,tailwind:{...e$1?.tailwind,baseColor:o,cssVariables:r},rsc:e$1?.rsc,tsx:e$1?.tsx,iconLibrary:i,aliases:e$1?.aliases}),theme:o,neutral:n,fontVariant:s}}async function xr(e){let t={};if(!v.existsSync(e.cwd)||!v.existsSync($__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!v.existsSync($__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,config:null};try{let r=await o(e.cwd);return {errors:t,config:r}}catch{x.break(),x.error(`An invalid ${j.info("components.json")} file was found at ${j.info(e.cwd)}.
|
|
48
|
+
Before you can add components, you must create a valid ${j.info("components.json")} file by running the ${j.info("init")} command.`),x.error(`Learn more at ${j.info("https://dev.createui.co/docs/components-json")}.`),x.break(),process.exit(1);}}async function vr(e,t){let r=$__default.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await q__default.stat(r)).isFile())return;let[i]=await ba([e],{config:t});if(!i?.meta?.importSpecifier||!i?.meta?.moduleSpecifier)return;let o=`import { ${i?.meta?.importSpecifier} } from "${i.meta.moduleSpecifier}"
|
|
49
|
+
|
|
50
|
+
export default function Page() {
|
|
51
|
+
return <${i?.meta?.importSpecifier} />
|
|
52
|
+
}`;await q__default.writeFile(r,o,"utf8");}var un=z.object({components:z.array(z.string()).optional(),yes:z.boolean(),overwrite:z.boolean(),cwd:z.string(),all:z.boolean(),path:z.string().optional(),silent:z.boolean(),srcDir:z.boolean().optional(),cssVariables:z.boolean()}),Ir=new Command().name("add").description("add a component to your project").argument("[components...]","names, url or local path to component").option("-y, --yes","skip confirmation prompt.",false).option("-o, --overwrite","overwrite existing files.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-a, --all","add all available components",false).option("-p, --path <path>","the path to add the component to.").option("-s, --silent","mute output.",false).option("--src-dir","use the src directory when creating a new project.",false).option("--no-src-dir","do not use the src directory when creating a new project.").option("--css-variables","use css variables for theming.",true).option("--no-css-variables","do not use css variables for theming.").action(async(e,t$1)=>{try{let r=un.parse({components:e,cwd:$__default.resolve(t$1.cwd),...t$1});await G(r.cwd);let i$1=await o(r.cwd);i$1||(i$1=t({resolvedPaths:{cwd:r.cwd}}));let o$1=["sidebar-","login-","signup-","otp-","calendar-"],n=["base-","radix-"];if(e.length>0&&i$1?.style&&n.some(x=>i$1?.style?.startsWith(x))){let x$1=e.filter(b=>o$1.some(N=>b.startsWith(N)));x$1.length&&(x.warn(`The ${j.info(x$1.map(b=>b).join(", "))} component(s) are not available for the ${j.info(i$1.style)} style yet. They are coming soon.`),x.warn("In the meantime, you can visit the blocks page on https://dev.createui.co/blocks and copy the code."),x.break(),process.exit(1));}let s=!1;if(e.length>0){let{config:h,newRegistries:x}=await _(e,i$1,{silent:r.silent,writeFile:!1});i$1=h,s=x.length>0;}let c,a=!0;if(e.length>0){let[h]=await ba([e[0]],{config:i$1});if(c=h?.type,a=c!=="registry:theme"&&c!=="registry:style",T(h)){await oe(e,i$1,{...r,baseStyle:a});return}if(!r.yes&&(c==="registry:style"||c==="registry:theme")){x.break();let{confirm:x$1}=await Ae({type:"confirm",name:"confirm",message:j.warn(`You are about to install a new ${c.replace("registry:","")}.
|
|
53
|
+
Existing CSS variables and components will be overwritten. Continue?`)});x$1||(x.break(),x.log("Installation cancelled."),x.break(),process.exit(1));}}r.components?.length||(r.components=await gn(r));let l=i.filter(h=>r.components?.includes(h.name));l?.length&&(x.break(),l.forEach(h=>{x.warn(j.warn(h.message));}),x.break(),process.exit(1));let{errors:m,config:p}=await xr(r),g=!1;if(m["3"]){let{proceed:h}=await Ae({type:"confirm",name:"proceed",message:`You need to create a ${j.info("components.json")} file to add components. Proceed?`,initial:!0});h||(x.break(),process.exit(1)),p=await pe({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:r.silent&&!s,isNewProject:!1,srcDir:r.srcDir,cssVariables:r.cssVariables,baseStyle:a,components:r.components}),g=!0;}let y=!1;if(m["1"]){let{projectPath:h,template:x$1}=await Te({cwd:r.cwd,force:r.overwrite,srcDir:r.srcDir,components:r.components});h||(x.break(),process.exit(1)),r.cwd=h,x$1==="next-monorepo"?(r.cwd=$__default.resolve(r.cwd,"apps/web"),p=await o(r.cwd)):(p=await pe({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!s&&r.silent,isNewProject:!0,srcDir:r.srcDir,cssVariables:r.cssVariables,baseStyle:a,components:r.components}),g=!0,y=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//));}if(!p)throw new Error(`Failed to read config at ${j.info(r.cwd)}.`);let{config:u}=await _(r.components,p,{silent:r.silent||s});p=u,g||await oe(r.components,p,{...r,baseStyle:a}),y&&await vr(r.components[0],p);}catch(r){x.break(),$$1(r);}finally{V();}});async function gn(e){let t=await ea();if(!t)return x.break(),$$1(new Error("Failed to fetch registry index.")),[];if(e.all)return t.map(o=>o.name).filter(o=>!i.some(n=>n.name===o));if(e.components?.length)return e.components;let{components:r}=await Ae({type:"multiselect",name:"components",message:"Which components would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:false,choices:t.filter(o=>o.type==="registry:ui"&&!i.some(n=>n.name===o.name)).map(o=>({title:o.name,value:o.name,selected:e.all?true:e.components?.includes(o.name)}))});r?.length||(x.warn("No components selected. Exiting."),x.info(""),process.exit(1));let i$1=z.array(z.string()).safeParse(r);return i$1.success?i$1.data:(x.error(""),$$1(new Error("Something went wrong. Please try again.")),[])}async function Pr(e){let t={},r={cwd:e.cwd,registryFile:$__default.resolve(e.cwd,e.registryFile),outputDir:$__default.resolve(e.cwd,e.outputDir)};return v.existsSync(r.registryFile)||(t["13"]=true),await v.mkdir(r.outputDir,{recursive:true}),Object.keys(t).length>0&&(t["13"]&&(x.break(),x.error(`The path ${j.info(r.registryFile)} does not exist.`)),x.break(),process.exit(1)),{errors:t,resolvePaths:r}}var yn=z.object({cwd:z.string(),registryFile:z.string(),outputDir:z.string()}),Er=new Command().name("build").description("build components for a createui registry").argument("[registry]","path to registry.json file","./registry.json").option("-o, --output <path>","destination directory for json files","./public/r").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=yn.parse({cwd:$.resolve(t.cwd),registryFile:e,outputDir:t.output}),{resolvePaths:i}=await Pr(r),o=await q.readFile(i.registryFile,"utf-8"),n=q$1.safeParse(JSON.parse(o));n.success||(x.error(`Invalid registry file found at ${j.info(i.registryFile)}.`),process.exit(1));let s=y("Building registry...");for(let c of n.data.items){s.start(`Building ${c.name}...`),c.$schema="https://dev.createui.co/schema/registry-item.json";for(let l of c.files??[])l.content=await q.readFile($.resolve(i.cwd,l.path),"utf-8");let a=p$1.safeParse(c);if(!a.success){x.error(`Invalid registry item found for ${j.info(c.name)}.`);continue}await q.writeFile($.resolve(i.outputDir,`${a.data.name}.json`),JSON.stringify(a.data,null,2));}await q.copyFile(i.registryFile,$.resolve(i.outputDir,"registry.json")),s.succeed("Building registry.");}catch(r){x.break(),$$1(r);}});var $r="https://dev.createui.co",xn={next:"Next.js",vite:"Vite",start:"TanStack Start"},Nr=new Command().name("create").description("create a new project with createui").argument("[name]","the name of your project").option("-t, --template <template>","the template to use. e.g. next, start or vite").option("-p, --preset [name]","use a preset configuration").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("--src-dir","use the src directory when creating a new project.",false).option("--no-src-dir","do not use the src directory when creating a new project.").option("-y, --yes","skip confirmation prompt.",true).action(async(e,t)=>{try{if(!e&&!t.template&&!t.preset){let u=Tr();x.log("Build your own createui."),x.log(`You will be taken to ${j.info(u)} to build your custom design system.`),x.break();let{proceed:h}=await Ae({type:"confirm",name:"proceed",message:"Open in browser?",initial:!0});h&&await jr(u),process.exit(0);}let i=e;if(!i){let{enteredName:u}=await Ae({type:"text",name:"enteredName",message:"What is your project named?",initial:t.template?`${t.template}-app`:"my-app",format:h=>h.trim(),validate:h=>bn($__default.basename($__default.resolve(h))).validForNewPackages?!0:"Invalid project name. Name should be lowercase, URL-friendly, and not start with a period or underscore."});u||process.exit(0),i=u;}let o=t.template;if(!o){let{selectedTemplate:u}=await Ae({type:"select",name:"selectedTemplate",message:`Which ${j.info("template")} would you like to use?`,choices:Object.entries(xn).map(([h,x])=>({title:x,value:h}))});u||process.exit(0),o=u;}let n=await vn(t.preset??!0);n||process.exit(0);let s,c;"_isUrl"in n?(s=n.url,c=new URL(n.url).searchParams.get("baseColor")??"neutral"):(s=Sn(n),c=n.baseColor);let a=U({}),{config:l}=await _([s],a,{silent:!0});a=l;let[m]=await ba([s],{config:a}),p;m?.type==="registry:base"&&m.config&&(p=m.config);let g=at.parse({cwd:$__default.resolve(t.cwd),name:i,components:[s],yes:t.yes,defaults:!1,force:!1,silent:!1,isNewProject:!0,srcDir:t.srcDir,cssVariables:!0,template:o,baseColor:c,baseStyle:!1,registryBaseConfig:p,skipPreflight:!1}),y=await pe(g);if(y){await oe(["component-example"],y,{baseStyle:!1,silent:!0,overwrite:!0});let u=Rn(o);u.length>0&&await Q(u,y,{overwrite:!0,silent:!0});}x.log(`${j.success("Success!")} Project initialization completed.
|
|
54
|
+
You may now add components.`),x.break();}catch(r){x.break(),$$1(r);}finally{V();}});function Sn(e){let t=new URLSearchParams({base:e.base,style:e.style,baseColor:e.baseColor,theme:e.theme,iconLibrary:e.iconLibrary,fontVariant:e.fontVariant,menuAccent:e.menuAccent,menuColor:e.menuColor});return `${In()}?${t.toString()}`}async function vn(e){if(e===true){let t=await oa(),{selectedPreset:r}=await Ae({type:"select",name:"selectedPreset",message:`Which ${j.info("preset")} would you like to use?`,choices:[...t.map(i=>({title:i.title,description:i.description,value:i.name})),{title:"Custom",description:"Build your own on https://dev.createui.co",value:"custom"}]});if(!r)return null;if(r==="custom"){let i=Tr();return x.info(`
|
|
55
|
+
Opening ${j.info(i)} in your browser...
|
|
56
|
+
`),await jr(i),null}return t.find(i=>i.name===r)??null}if(typeof e=="string"){if(S(e))return {_isUrl:true,url:e};let t=await pa(e);if(!t){let i=(await oa()).map(o=>o.name).join(", ");x.error(`Preset "${e}" not found. Available presets: ${i}`),process.exit(1);}return t}return null}function Rn(e){switch(e){case "vite":return [{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:ft`import { ComponentExample } from "@/components/component-example";
|
|
57
|
+
|
|
58
|
+
export function App() {
|
|
59
|
+
return <ComponentExample />;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export default App;
|
|
63
|
+
`}];case "next":return [{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:ft`import { ComponentExample } from "@/components/component-example";
|
|
64
|
+
|
|
65
|
+
export default function Page() {
|
|
66
|
+
return <ComponentExample />;
|
|
67
|
+
}
|
|
68
|
+
`}];case "start":return [{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:ft`import { createFileRoute } from "@tanstack/react-router";
|
|
69
|
+
import { ComponentExample } from "@/components/component-example";
|
|
70
|
+
|
|
71
|
+
export const Route = createFileRoute("/")({ component: App });
|
|
72
|
+
|
|
73
|
+
function App() {
|
|
74
|
+
return (
|
|
75
|
+
<ComponentExample />
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
`}];default:return []}}function Tr(){return `${$r}/create`}function In(){return `${$r}/init`}var En=z.object({component:z.string().optional(),yes:z.boolean(),cwd:z.string(),path:z.string().optional()}),Fr=new Command().name("diff").description("check for updates against the registry").argument("[component]","the component name").option("-y, --yes","skip confirmation prompt.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=En.parse({component:e,...t}),i=$__default.resolve(r.cwd);existsSync(i)||(x.error(`The path ${i} does not exist. Please try again.`),process.exit(1));let o$1=await o(i);o$1||(x.warn(`Configuration is missing. Please run ${j.success("init")} to create a components.json file.`),process.exit(1));let n=await ea();if(n||($$1(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let a=o$1.resolvedPaths.components,l=n.filter(p=>{for(let g of p.files??[]){let y=$__default.resolve(a,typeof g=="string"?g:g.path);if(existsSync(y))return !0}return !1}),m=[];for(let p of l){let g=await Or(p,o$1);g.length&&m.push({name:p.name,changes:g});}m.length||(x.info("No updates found."),process.exit(0)),x.info("The following components have updates available:");for(let p of m){x.info(`- ${p.name}`);for(let g of p.changes)x.info(` - ${g.filePath}`);}x.break(),x.info(`Run ${j.success("diff <component>")} to see the changes.`),process.exit(0);}let s=n.find(a=>a.name===r.component);s||(x.error(`The component ${j.success(r.component)} does not exist.`),process.exit(1));let c=await Or(s,o$1);c.length||(x.info(`No updates found for ${r.component}.`),process.exit(0));for(let a of c)x.info(`- ${a.filePath}`),await jn(a.patch),x.info("");}catch(r){$$1(r);}});async function Or(e,t){let r=await ka(t.style??"",[e]),i=await ia(t.tailwind.baseColor??"");if(!r)return [];let o=[];for(let n of r){let s=await la(t,n);if(s)for(let c of n.files??[]){let a=$__default.resolve(s,typeof c=="string"?c:c.path);if(!existsSync(a))continue;let l=await promises.readFile(a,"utf8");if(typeof c=="string"||!c.content)continue;let m=await O({filename:c.path,raw:c.content,config:t,baseColor:i}),p=diffLines(m,l);p.length>1&&o.push({filePath:a,patch:p});}}return o}async function jn(e){e.forEach(t=>{if(t)return t.added?process.stdout.write(j.success(t.value)):t.removed?process.stdout.write(j.error(t.value)):process.stdout.write(t.value)});}var Ar=new Command().name("info").description("get information about your project").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{try{x.info("> project info"),console.log(await v$1(e.cwd)),x.break(),x.info("> components.json"),console.log(await o(e.cwd));}catch(t){$$1(t);}});var ae="latest",De=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{createui:{command:"npx",args:[`createui@${ae}`,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{createui:{command:"npx",args:[`createui@${ae}`,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{createui:{command:"npx",args:[`createui@${ae}`,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.createui]
|
|
79
|
+
command = "npx"
|
|
80
|
+
args = ["createui@${ae}", "mcp"]
|
|
81
|
+
`},{name:"opencode",label:"OpenCode",configPath:"opencode.json",config:{$schema:"https://opencode.ai/config.json",mcp:{createui:{type:"local",command:["npx",`createui@${ae}`,"mcp"],enabled:true}}}}],_e=[`createui@${ae}`],gt=new Command().name("mcp").description("MCP server and configuration commands").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{try{await G(e.cwd);let t=new StdioServerTransport;await b$1.connect(t);}catch(t){x.break(),$$1(t);}}),_n=ut.object({client:ut.enum(["claude","cursor","vscode","codex","opencode"]),cwd:ut.string()});gt.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${De.map(e=>e.name).join(", ")})`).action(async(e,t)=>{try{let i=(t.parent?.opts()||{}).cwd||process.cwd(),o$1=e.client;if(!o$1){let l=await Ae({type:"select",name:"client",message:"Which MCP client are you using?",choices:De.map(m=>({title:m.label,value:m.name}))});l.client||(x.break(),process.exit(1)),o$1=l.client;}let n=_n.parse({client:o$1,cwd:i}),s=await o(n.cwd);if(n.client==="codex"){if(s)await B([],_e,s,{silent:!1});else {let l=await a$1(n.cwd),m=l==="npm"?"install":"add",p=l==="npm"?"--save-dev":"-D",g=y("Installing dependencies...").start();await execa(l,[m,p,..._e],{cwd:n.cwd}),g.succeed("Installing dependencies.");}x.break(),x.log("To configure the createui MCP server in Codex:"),x.break(),x.log(`1. Open or create the file ${j.info("~/.codex/config.toml")}`),x.log("2. Add the following configuration:"),x.log(),x.info(`[mcp_servers.createui]
|
|
82
|
+
command = "npx"
|
|
83
|
+
args = ["createui@${ae}", "mcp"]`),x.break(),x.info("3. Restart Codex to load the MCP server"),x.break(),process.exit(0);}let c=y("Configuring MCP server...").start(),a=await Vn(n);if(c.succeed("Configuring MCP server."),s)await B([],_e,s,{silent:!1});else {let l=await a$1(n.cwd),m=l==="npm"?"install":"add",p=l==="npm"?"--save-dev":"-D",g=y("Installing dependencies...").start();await execa(l,[m,p,..._e],{cwd:n.cwd}),g.succeed("Installing dependencies.");}x.break(),x.success(`Configuration saved to ${a}.`),x.break();}catch(r){$$1(r);}});var Dn=(e,t)=>t;async function Vn(e){let{client:t,cwd:r}=e,i=De.find(a=>a.name===t);if(!i)throw new Error(`Unknown client: ${t}. Available clients: ${De.map(a=>a.name).join(", ")}`);let o=$__default.join(r,i.configPath),n=$__default.dirname(o);await v.ensureDir(n);let s={};try{let a=await promises.readFile(o,"utf-8");s=JSON.parse(a);}catch{}let c=yr(s,i.config,{arrayMerge:Dn});return await promises.writeFile(o,JSON.stringify(c,null,2)+`
|
|
84
|
+
`,"utf-8"),i.configPath}async function Mr(e){if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let t=e.resolvedPaths.ui,[r,i]=await Promise.all([Wn("**/*.{js,ts,jsx,tsx}",{cwd:t}),ga()]);if(Object.keys(i).length===0)throw new Error("Something went wrong fetching the registry icons.");let o=Object.entries(a$3).map(([m,p])=>({title:p.name,value:m})),n=await Ae([{type:"select",name:"sourceLibrary",message:`Which icon library would you like to ${j.info("migrate from")}?`,choices:o},{type:"select",name:"targetLibrary",message:`Which icon library would you like to ${j.info("migrate to")}?`,choices:o}]);if(n.sourceLibrary===n.targetLibrary)throw new Error("You cannot migrate to the same icon library. Please choose a different icon library.");if(!(n.sourceLibrary in a$3&&n.targetLibrary in a$3))throw new Error("Invalid icon library. Please choose a valid icon library.");let s=a$3[n.sourceLibrary],c=a$3[n.targetLibrary],{confirm:a}=await Ae({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${j.info(r.length)} files in ${j.info(`./${$__default.relative(e.resolvedPaths.cwd,t)}`)} from ${j.info(s.name)} to ${j.info(c.name)}. Continue?`});a||(x.info("Migration cancelled."),process.exit(0)),c.package&&await B([c.package],[],e,{silent:false});let l=y("Migrating icons...")?.start();await Promise.all(r.map(async m=>{l.text=`Migrating ${m}...`;let p=$__default.join(t,m),g=await promises.readFile(p,"utf-8"),y=await Gn(g,n.sourceLibrary,n.targetLibrary,i);await promises.writeFile(p,y);})),l.succeed("Migration complete.");}async function Gn(e,t,r,i){let o=a$3[t]?.import,n=a$3[r]?.import,s=await promises.mkdtemp($__default.join(tmpdir(),"createui-")),c=new Project({compilerOptions:{}}),a=$__default.join(s,`createui-icons-${randomBytes(4).toString("hex")}.tsx`),l=c.createSourceFile(a,e,{scriptKind:ScriptKind.TSX}),m=[];for(let p of l.getImportDeclarations()??[])if(p.getModuleSpecifier()?.getText()===`"${o}"`){for(let g of p.getNamedImports()??[]){let y=g.getName(),u=Object.values(i).find(h=>h[t]===y)?.[r];!u||m.includes(u)||(m.push(u),g.remove(),l.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).filter(h=>h.getTagNameNode()?.getText()===y).forEach(h=>h.getTagNameNode()?.replaceWithText(u)));}p.getNamedImports()?.length===0&&p.remove();}return m.length>0&&l.addImportDeclaration({moduleSpecifier:n,namedImports:m.map(p=>({name:p}))}),await l.getText()}function Yn(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function qn(e,t,r,i){let n=e.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").trim().split(",").map(s=>s.trim()).filter(Boolean);for(let s of n){let c=s.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?$/),a=s.match(/^(\w+)\s+as\s+(\w+)$/);if(c){let l=c[1],m=c[2];i==="slot"&&l==="Slot"&&!m?r.push({name:"Slot",alias:"SlotPrimitive",isType:true}):r.push({name:l,alias:m,isType:true});}else if(a){let l=a[1],m=a[2];i==="slot"&&l==="Slot"&&m==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:l,alias:m,isType:t});}else i==="slot"&&s==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:s,isType:t});}}async function Wr(e,t={}){if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let r=e.resolvedPaths.ui,i=await Wn("**/*.{js,ts,jsx,tsx}",{cwd:r});if(!t.yes){let{confirm:c}=await Ae({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${j.info(i.length)} files in ${j.info(`./${$__default.relative(e.resolvedPaths.cwd,r)}`)} to ${j.info("radix-ui")}. Continue?`});c||(x.info("Migration cancelled."),process.exit(0));}let o=y("Migrating imports...")?.start(),n=new Set;await Promise.all(i.map(async c=>{o.text=`Migrating ${c}...`;let a=$__default.join(r,c),l=await promises.readFile(a,"utf-8"),{content:m,replacedPackages:p}=await Hn(l);p.forEach(g=>n.add(g)),await promises.writeFile(a,m);})),o.succeed("Migrating imports.");let s=y("Updating package.json...")?.start();try{let c=u(e.resolvedPaths.cwd,!1);if(!c){s.fail("Could not read package.json"),x.warn("Could not update package.json. You may need to manually replace @radix-ui/react-* packages with radix-ui");return}let a=Array.from(n),l=["dependencies","devDependencies"];for(let m of l)if(c[m])for(let p of a)c[m][p]&&delete c[m][p];if(a.length>0){c.dependencies||(c.dependencies={}),c.dependencies["radix-ui"]="latest";let m=$__default.join(e.resolvedPaths.cwd,"package.json");await promises.writeFile(m,JSON.stringify(c,null,2)+`
|
|
85
|
+
`),s.succeed("Updated package.json."),await B(["radix-ui"],[],e,{silent:!1});}else s.succeed("No packages found in source files.");}catch{s.fail("Failed to update package.json"),x.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui");}}async function Hn(e){let t=/import\s+(?:(type)\s+)?(?:\*\s+as\s+(\w+)|{([^}]+)})\s+from\s+(["'])@radix-ui\/react-([^"']+)\4(;?)/g,r=[],i=[],o=[],n='"',s=false,c=e,a;for(;(a=t.exec(e))!==null;){let[u,h,x,b,N,j,D]=a;if(j==="icons"||j.startsWith("icons/"))continue;i.push(u),i.length===1&&(n=N,s=D===";"),o.push(`@radix-ui/react-${j}`);let ge=!!h;if(x){let Le=Yn(j);r.push({name:Le,alias:x,isType:ge});}else b&&qn(b,ge,r,j);}if(r.length===0)return {content:e,replacedPackages:[]};let l=r.filter((u,h,x)=>h===x.findIndex(b=>b.name===u.name&&b.alias===u.alias&&b.isType===u.isType)),p=`import { ${l.map(u=>{let h=u.isType?"type ":"";return u.alias?`${h}${u.name} as ${u.alias}`:`${h}${u.name}`}).join(", ")} } from ${n}radix-ui${n}${s?";":""}`;c=i.reduce((u,h,x)=>u.replace(h,x===0?p:""),c),c=c.replace(/\n\s*\n\s*\n/g,`
|
|
86
|
+
|
|
87
|
+
`),l.some(u=>u.name==="Slot"&&u.alias==="SlotPrimitive")&&(c=c.split(`
|
|
88
|
+
`).map(x=>{if(x.trim().startsWith("import "))return x;let b=x;return b=b.replace(/\b(asChild\s*\?\s*)Slot(\s*:)/g,"$1__SLOT_PLACEHOLDER__$2"),b=b.replace(/\bReact\.ComponentProps<typeof\s+Slot>/g,"React.ComponentProps<typeof __SLOT_PLACEHOLDER__>"),b=b.replace(/\bComponentProps<typeof\s+Slot>/g,"ComponentProps<typeof __SLOT_PLACEHOLDER__>"),b=b.replace(/(<\/?)Slot(\s*\/?>)/g,"$1__SLOT_PLACEHOLDER__$2"),b=b.replace(/\bSlot\b/g,(N,j,D)=>{let ge=D.substring(0,j),Le=(ge.match(/"/g)||[]).length,si=(ge.match(/'/g)||[]).length;return Le%2!==0||si%2!==0?N:"__SLOT_PLACEHOLDER__"}),b=b.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),b}).join(`
|
|
89
|
+
`));let y=Array.from(new Set(o));return {content:c,replacedPackages:y}}async function Ur(e){let t={};if(!v.existsSync(e.cwd)||!v.existsSync($__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!v.existsSync($__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,config:null};try{let r=await o(e.cwd);return {errors:t,config:r}}catch{x.break(),x.error(`An invalid ${j.info("components.json")} file was found at ${j.info(e.cwd)}.
|
|
90
|
+
Before you can run a migration, you must create a valid ${j.info("components.json")} file by running the ${j.info("init")} command.`),x.error(`Learn more at ${j.info("https://dev.createui.co/docs/components-json")}.`),x.break(),process.exit(1);}}var Br=[{name:"icons",description:"migrate your ui components to a different icon library."},{name:"radix",description:"migrate to radix-ui."}],Zn=z.object({cwd:z.string(),list:z.boolean(),yes:z.boolean(),migration:z.string().refine(e=>e&&Br.some(t=>t.name===e),{message:"You must specify a valid migration. Run `createui migrate --list` to see available migrations."}).optional()}),Gr=new Command().name("migrate").description("run a migration.").argument("[migration]","the migration to run.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-l, --list","list all migrations.",false).option("-y, --yes","skip confirmation prompt.",false).action(async(e,t)=>{try{let r=Zn.parse({cwd:$__default.resolve(t.cwd),migration:e,list:t.list,yes:t.yes});if(r.list||!r.migration){x.info("Available migrations:");for(let n of Br)x.info(`- ${n.name}: ${n.description}`);return}if(!r.migration)throw new Error("You must specify a migration. Run `createui migrate --list` to see available migrations.");let{errors:i,config:o}=await Ur(r);if(i["1"]||i["3"])throw new Error("No `components.json` file found. Ensure you are at the root of your project.");if(!o)throw new Error("Something went wrong reading your `components.json` file. Please ensure you have a valid `components.json` file.");r.migration==="icons"&&await Mr(o),r.migration==="radix"&&await Wr(o,{yes:r.yes});}catch(r){x.break(),$$1(r);}});var ro=z.object({cwd:z.string(),silent:z.boolean()}),Kr=new Command().name("add").description("add registries to your project").argument("[registries...]","registries (@namespace) or registry URLs (@namespace=url)").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",false).action(async(e,t)=>{try{let r=ro.parse({cwd:$__default.resolve(t.cwd),silent:t.silent}),i=e.length>0?e:await oo({silent:r.silent});await no(i,r.cwd,{silent:r.silent});}catch(r){x.break(),$$1(r);}});function io(e){let[t,...r]=e.split("="),i=r.length>0?r.join("="):void 0;if(!t.startsWith("@"))throw new Error(`Invalid registry namespace: ${j.info(t)}. Registry names must start with @ (e.g., @acme).`);return {namespace:t,url:i}}function vt(e,t,r){return `${e} ${e===1?t:r}`}async function no(e,t,r){let i=$__default.resolve(t,"components.json");if(!v.existsSync(i))throw new Error(`No ${j.info("components.json")} found. Run ${j.info("createui init")} first.`);let o=e.map(io),n=o.filter(u=>!u.url),s=[];if(n.length>0){let u=y("Fetching registries.",{silent:r.silent}).start(),h=await ma();if(!h)throw u.fail(),new Error("Failed to fetch registries.");u.succeed(),s=h;}let c={};for(let{namespace:u,url:h$1}of o){if(u in h){x.warn(`${j.info(u)} is a built-in registry and cannot be added.`);continue}if(h$1){if(!h$1.includes("{name}"))throw new Error(`Invalid registry URL for ${j.info(u)}. URL must include {name} placeholder. Example: ${j.info(`${u}=https://example.com/r/{name}.json`)}`);c[u]=h$1;}else {let x=s.find(b=>b.name===u);if(!x)throw new Error(`Registry ${j.info(u)} not found. Provide a URL: ${j.info(`${u}=https://.../{name}.json`)}`);c[u]=x.url;}}if(Object.keys(c).length===0)return {addedRegistries:[]};let a=await v.readJson(i),l=a.registries||{},m={},p=[];for(let[u,h]of Object.entries(c))l[u]?p.push(u):m[u]=h;if(Object.keys(m).length===0){if(p.length>0&&!r.silent){y(`Skipped ${vt(p.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let u of p)x.log(` - ${u}`);}else r.silent||x.info("No new registries to add.");return}let g={...a,registries:{...l,...m}},y$1=y("Updating components.json.",{silent:r.silent}).start();if(await v.writeJson(i,g,{spaces:2}),y$1.succeed(),!r.silent){let u=Object.keys(m);y(`Added ${vt(u.length,"registry","registries")}:`,{silent:r.silent})?.succeed();for(let h of u)x.log(` - ${h}`);if(p.length>0){y(`Skipped ${vt(p.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let h of p)x.log(` - ${h}`);}}}async function oo(e){let t=y("Fetching registries.",{silent:e.silent}).start(),r=await ma();if(!r)throw t.fail(),new Error("Failed to fetch registries.");t.succeed();let i=[...r].sort((n,s)=>n.name.localeCompare(s.name)),{selected:o}=await Ae({type:"autocompleteMultiselect",name:"selected",message:"Which registries would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:false,choices:i.map(n=>({title:n.name,description:n.description,value:n.name}))});return o?.length||(x.warn("No registries selected. Exiting."),x.info(""),process.exit(1)),o}var Yr=new Command().name("registry").description("manage registries").addCommand(Kr);async function qr(e){let t={},r={cwd:e.cwd,registryFile:$__default.resolve(e.cwd,e.registryFile),outputDir:$__default.resolve(e.cwd,e.outputDir)};if(!v.existsSync(r.registryFile))return t["13"]=true,{errors:t,resolvePaths:null,config:null};if(!v.existsSync($__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,resolvePaths:null,config:null};await v.mkdir(r.outputDir,{recursive:true});try{let i=await o(e.cwd);return {errors:t,config:i,resolvePaths:r}}catch{x.break(),x.error(`An invalid ${j.info("components.json")} file was found at ${j.info(e.cwd)}.
|
|
91
|
+
Before you can build the registry, you must create a valid ${j.info("components.json")} file by running the ${j.info("init")} command.`),x.break(),process.exit(1);}}var co=z.object({cwd:z.string(),registryFile:z.string(),outputDir:z.string(),verbose:z.boolean().optional().default(false)}),Hr=new Command().name("registry:build").description("builds the registry [EXPERIMENTAL]").argument("[registry]","path to registry.json file","./registry.json").option("-o, --output <path>","destination directory for json files","./public/r").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-v, --verbose","verbose output").action(async(e,t)=>{await lo({cwd:$.resolve(t.cwd),registryFile:e,outputDir:t.output,verbose:t.verbose});});async function lo(e){try{let t=co.parse(e),[{errors:r,resolvePaths:i,config:o},n]=await Promise.all([qr(t),v$1(t.cwd)]);(r["3"]||!o||!n)&&(x.error(`A ${j.info("components.json")} file is required to build the registry. Run ${j.info("createui init")} to create one.`),x.break(),process.exit(1)),(r["13"]||!i)&&(x.error(`We could not find a registry file at ${j.info($.resolve(t.cwd,t.registryFile))}.`),x.break(),process.exit(1));let s=await q.readFile(i.registryFile,"utf-8"),c=q$1.safeParse(JSON.parse(s));c.success||(x.error(`Invalid registry file found at ${j.info(i.registryFile)}.`),x.break(),process.exit(1));let a=y("Building registry..."),l=await mo(c.data,o,n);for(let m of l.items)m.files=m.files?.filter((p,g,y)=>g===y.findIndex(u=>u.path===p.path)),m.dependencies&&(m.dependencies=m.dependencies.filter((p,g,y)=>g===y.findIndex(u=>u===p)));for(let m of l.items){if(!m.files)continue;a.start(`Building ${m.name}...`),m.$schema="https://dev.createui.co/schema/registry-item.json";for(let g of m.files){let y=$.resolve(i.cwd,g.path);try{if(!(await q.stat(y)).isFile())continue;g.content=await q.readFile(y,"utf-8");}catch(u){console.error("Error reading file in registry build:",y,u);continue}}let p=p$1.safeParse(m);if(!p.success){x.error(`Invalid registry item found for ${j.info(m.name)}.`);continue}await q.writeFile($.resolve(i.outputDir,`${p.data.name}.json`),JSON.stringify(p.data,null,2));}if(await q.copyFile(i.registryFile,$.resolve(i.outputDir,"registry.json")),a.succeed("Building registry."),t.verbose){y(`The registry has ${j.info(l.items.length.toString())} items:`).succeed();for(let m of l.items){x.log(` - ${m.name} (${j.info(m.type)})`);for(let p of m.files??[])x.log(` - ${p.path}`);}}}catch(t){x.break(),$$1(t);}}async function mo(e,t,r){for(let i of e.items)if(i.files?.length)for(let o of i.files){let n=await R(o.path,t,r);n.files=n.files?.filter(s=>s.path!==o.path),n.files&&i.files.push(...n.files),n.dependencies&&(i.dependencies=i.dependencies?i.dependencies.concat(n.dependencies):n.dependencies);}return e}var Xr=new Command().name("registry:mcp").description("starts the registry MCP server [DEPRECATED]").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async()=>{x.warn(`The ${j.info("createui registry:mcp")} command is deprecated. Use the ${j.info("createui mcp")} command instead.`),x.break();});var uo=z.object({cwd:z.string(),query:z.string().optional(),limit:z.number().optional(),offset:z.number().optional()}),ei=new Command().name("search").alias("list").description("search items from registries").argument("<registries...>","the registry names or urls to search items from. Names must be prefixed with @.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-q, --query <query>","query string").option("-l, --limit <number>","maximum number of items to display per registry","100").option("-o, --offset <number>","number of items to skip","0").action(async(e,t$1)=>{try{let r=uo.parse({cwd:$__default.resolve(t$1.cwd),query:t$1.query,limit:t$1.limit?parseInt(t$1.limit,10):void 0,offset:t$1.offset?parseInt(t$1.offset,10):void 0});await G(r.cwd);let i=t({resolvedPaths:{cwd:r.cwd}}),o$1=U(i),n=$__default.resolve(r.cwd,"components.json");if(v.existsSync(n)){let m=await v.readJson(n),p=c.partial().parse(m);o$1=U({...i,...p});}let s=o$1;try{let m=await o(r.cwd);m&&(s=U(m));}catch{}let{config:c$1,newRegistries:a}=await _(e.map(m=>`${m}/registry`),s,{silent:!0,writeFile:!1});a.length>0&&(s.registries=c$1.registries),W$1(e,s);let l=await a$2(e,{query:r.query,limit:r.limit,offset:r.offset,config:s});console.log(JSON.stringify(l,null,2)),process.exit(0);}catch(r){$$1(r);}finally{V();}});var ho=z.object({cwd:z.string()}),ni=new Command().name("view").description("view items from the registry").argument("<items...>","the item names or URLs to view").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=ho.parse({cwd:$__default.resolve(t.cwd)});await G(r.cwd);let i=U({}),o$1=$__default.resolve(r.cwd,"components.json");if(v.existsSync(o$1)){let l=await v.readJson(o$1),m=c.partial().parse(l);i=U(m);}let n=i;try{let l=await o(r.cwd);l&&(n=U(l));}catch{}let{config:s,newRegistries:c$1}=await _(e,n,{silent:!0,writeFile:!1});c$1.length>0&&(n.registries=s.registries),W$1(e,n);let a=await ba(e,{config:n});console.log(JSON.stringify(a,null,2)),process.exit(0);}catch(r){$$1(r);}finally{V();}});var oi={version:"0.1.0-beta.0"};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function bo(){let e=new Command().name("createui").description("add items from registries to your project").version(oi.version,"-v, --version","display the version number");e.addCommand(wr).addCommand(Nr).addCommand(Ir).addCommand(Fr).addCommand(ni).addCommand(ei).addCommand(Gr).addCommand(Ar).addCommand(Er).addCommand(gt).addCommand(Yr),e.addCommand(Hr).addCommand(Xr),e.parse();}bo();//# sourceMappingURL=index.js.map
|
|
92
|
+
//# sourceMappingURL=index.js.map
|