@create-ui/cli 0.5.1 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,72 +1,70 @@
1
1
  #!/usr/bin/env node
2
- import {b as b$1,a as a$2}from'./chunk-UVIUVCLG.js';import {a as a$3}from'./chunk-MK3CCMH4.js';import {a as a$4}from'./chunk-VQCXAURP.js';import {s,u,G,k,S,o,a as a$1,Q,m,f,n,t,v,p,g,aa,q,r,d,e,b,c,F,w,U,C,_ as _$1,E as E$1,$,Y as Y$1,Z,A,D,O,h,W,l,P,j,i,x as x$1,z as z$1,y}from'./chunk-EWAP55CF.js';export{Y as fetchTree,aa as getFontVariants,Z as getItemTargetPath,$ as getPreset,_ as getPresets,R as getRegistry,W as getRegistryIcons,S as getRegistryItems,V as getRegistryStyles,U as getcreateuiRegistryIndex,T as resolveRegistryItems,X as resolveTree}from'./chunk-EWAP55CF.js';import {a,o as o$1,n as n$1}from'./chunk-Y7WZRQWW.js';import*as E from'path';import E__default,{join}from'path';import {promises,existsSync}from'fs';import x from'fs-extra';import v$1 from'postcss';import bt,{z}from'zod';import {execa}from'execa';import Le from'prompts';import {Project,ScriptKind,SyntaxKind,VariableDeclarationKind}from'ts-morph';import ot,{tmpdir}from'os';import {parse,applyEdits,modify}from'jsonc-parser';import {Command}from'commander';import wr from'deepmerge';import*as J from'fs/promises';import J__default from'fs/promises';import ht from'dedent';import Er from'open';import Si from'validate-npm-package-name';import {diffLines}from'diff';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {randomBytes}from'crypto';import Ui from'fast-glob';import {fileURLToPath}from'url';async function tr(e){let t={};if(!x.existsSync(e.cwd)||!x.existsSync(E__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,projectInfo:null};let r=p("Preflight checks.",{silent:e.silent}).start();x.existsSync(E__default.resolve(e.cwd,"components.json"))&&!e.force&&(r?.fail(),o.break(),o.error(`A ${a$1.info("components.json")} file already exists at ${a$1.info(e.cwd)}.
3
- To start over, remove the ${a$1.info("components.json")} file and run ${a$1.info("init")} again.`),o.break(),process.exit(1)),r?.succeed();let n=p("Verifying framework.",{silent:e.silent}).start(),i=await m(e.cwd);(!i||i?.framework.name==="manual")&&(t["7"]=true,n?.fail(),o.break(),i?.framework.links.installation&&o.error(`We could not detect a supported framework at ${a$1.info(e.cwd)}.
4
- Visit ${a$1.info(i?.framework.links.installation)} to manually configure your project.
5
- Once configured, you can use the cli to add components.`),o.break(),process.exit(1)),n?.succeed(`Verifying framework. Found ${a$1.info(i.framework.label)}.`);let o$1=i.tailwindVersion==="v4"?`Validating Tailwind CSS config. Found ${a$1.info("v4")}.`:"Validating Tailwind CSS.",s=p(o$1,{silent:e.silent}).start();i.tailwindVersion==="v4"&&!i?.tailwindCssFile||!i.tailwindVersion?(t["5"]=true,s?.fail()):s?.succeed();let c=p("Validating import alias.",{silent:e.silent}).start();return i?.aliasPrefix?c?.succeed():(t["6"]=true,c?.fail()),Object.keys(t).length>0&&(t["5"]&&(o.break(),o.error(`No Tailwind CSS configuration found at ${a$1.info(e.cwd)}.`),o.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),o.error("Install Tailwind CSS then try again."),i?.framework.links.tailwind&&o.error(`Visit ${a$1.info(i?.framework.links.tailwind)} to get started.`)),t["6"]&&(o.break(),o.error("No import alias found in your tsconfig.json file."),i?.framework.links.installation&&o.error(`Visit ${a$1.info(i?.framework.links.installation)} to learn how to set an import alias.`)),o.break(),process.exit(1)),{errors:t,projectInfo:i}}function rr(e,t){if(e.includes("\0"))return false;let r;try{r=e;let u="";for(;r!==u&&r.includes("%");)u=r,r=decodeURIComponent(r);}catch{return false}let n=E__default.normalize(r.replace(/\\/g,"/")),i=E__default.normalize(t),o=u=>u.replace(/\[\.\.\..*?\]/g,"").includes("..");if(o(n)||o(r)||o(e))return false;let s=u=>u.replace(/\[\.\.\..*?\]/g,""),c=s(e),a=s(r);if([/\.\.[\/\\]/,/[\/\\]\.\./,/\.\./,/\.\.%/,/\x00/,/[\x01-\x1f]/].some(u=>u.test(c)||u.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(E__default.isAbsolute(n))return n.startsWith(i+E__default.sep);let p=E__default.resolve(i,n);return p.startsWith(i+E__default.sep)||p===i}async function Xe(e,t,r){if(!t.resolvedPaths.tailwindCss||!e||Object.keys(e).length===0)return;r={silent:false,...r};let n=t.resolvedPaths.tailwindCss,i=E__default.relative(t.resolvedPaths.cwd,n),o=p(`Updating ${a$1.info(i)}`,{silent:r.silent}).start(),s=await promises.readFile(n,"utf8"),c=await fn(s,e);await promises.writeFile(n,c,"utf8"),o.succeed();}async function fn(e,t){let r=[pn(t)],n=await v$1(r).process(e,{from:void 0}),i=n.css,o=n.root;if(o.nodes&&o.nodes.length>0){let s=o.nodes[o.nodes.length-1];s.type==="atrule"&&!s.nodes&&!i.trimEnd().endsWith(";")&&(i=i.trimEnd()+";");}return i=i.replace(/\/\* ---break--- \*\//g,""),i=i.replace(/(\n\s*\n)+/g,`
2
+ import {b as b$1,a as a$2}from'./chunk-UVIUVCLG.js';import {a as a$3}from'./chunk-MK3CCMH4.js';import {a as a$4}from'./chunk-VQCXAURP.js';import {s,u,G,k,S,o,a as a$1,Q,m,f,n,t,v,p,g,aa,q,r,d,e,b,c,F,w,U,C,_ as _$1,E as E$1,$,Y as Y$1,Z,A,D,O,h,W,l,P,j,i,x as x$1,z as z$1,y}from'./chunk-EWAP55CF.js';export{Y as fetchTree,aa as getFontVariants,Z as getItemTargetPath,$ as getPreset,_ as getPresets,R as getRegistry,W as getRegistryIcons,S as getRegistryItems,V as getRegistryStyles,U as getcreateuiRegistryIndex,T as resolveRegistryItems,X as resolveTree}from'./chunk-EWAP55CF.js';import {a,o as o$1,n as n$1}from'./chunk-Y7WZRQWW.js';import*as E from'path';import E__default,{join}from'path';import {promises,existsSync}from'fs';import x from'fs-extra';import v$1 from'postcss';import bt,{z}from'zod';import {execa}from'execa';import pt from'prompts';import {Project,ScriptKind,SyntaxKind,VariableDeclarationKind}from'ts-morph';import st,{tmpdir}from'os';import {parse,applyEdits,modify}from'jsonc-parser';import {Command}from'commander';import wr from'deepmerge';import*as J from'fs/promises';import J__default from'fs/promises';import gt from'dedent';import yn 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';import {fileURLToPath}from'url';async function tr(e){let t={};if(!x.existsSync(e.cwd)||!x.existsSync(E__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,projectInfo:null};let r=p("Preflight checks.",{silent:e.silent}).start();x.existsSync(E__default.resolve(e.cwd,"components.json"))&&!e.force&&(r?.fail(),o.break(),o.error(`A ${a$1.info("components.json")} file already exists at ${a$1.info(e.cwd)}.
3
+ To start over, remove the ${a$1.info("components.json")} file and run ${a$1.info("init")} again.`),o.break(),process.exit(1)),r?.succeed();let i=p("Verifying framework.",{silent:e.silent}).start(),n=await m(e.cwd);(!n||n?.framework.name==="manual")&&(t["7"]=true,i?.fail(),o.break(),n?.framework.links.installation&&o.error(`We could not detect a supported framework at ${a$1.info(e.cwd)}.
4
+ Visit ${a$1.info(n?.framework.links.installation)} to manually configure your project.
5
+ Once configured, you can use the cli to add components.`),o.break(),process.exit(1)),i?.succeed(`Verifying framework. Found ${a$1.info(n.framework.label)}.`);let o$1=n.tailwindVersion==="v4"?`Validating Tailwind CSS config. Found ${a$1.info("v4")}.`:"Validating Tailwind CSS.",s=p(o$1,{silent:e.silent}).start();n.tailwindVersion==="v4"&&!n?.tailwindCssFile||!n.tailwindVersion?(t["5"]=true,s?.fail()):s?.succeed();let c=p("Validating import alias.",{silent:e.silent}).start();return n?.aliasPrefix?c?.succeed():(t["6"]=true,c?.fail()),Object.keys(t).length>0&&(t["5"]&&(o.break(),o.error(`No Tailwind CSS configuration found at ${a$1.info(e.cwd)}.`),o.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),o.error("Install Tailwind CSS then try again."),n?.framework.links.tailwind&&o.error(`Visit ${a$1.info(n?.framework.links.tailwind)} to get started.`)),t["6"]&&(o.break(),o.error("No import alias found in your tsconfig.json file."),n?.framework.links.installation&&o.error(`Visit ${a$1.info(n?.framework.links.installation)} to learn how to set an import alias.`)),o.break(),process.exit(1)),{errors:t,projectInfo:n}}function rr(e,t){if(e.includes("\0"))return false;let r;try{r=e;let u="";for(;r!==u&&r.includes("%");)u=r,r=decodeURIComponent(r);}catch{return false}let i=E__default.normalize(r.replace(/\\/g,"/")),n=E__default.normalize(t),o=u=>u.replace(/\[\.\.\..*?\]/g,"").includes("..");if(o(i)||o(r)||o(e))return false;let s=u=>u.replace(/\[\.\.\..*?\]/g,""),c=s(e),a=s(r);if([/\.\.[\/\\]/,/[\/\\]\.\./,/\.\./,/\.\.%/,/\x00/,/[\x01-\x1f]/].some(u=>u.test(c)||u.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(E__default.isAbsolute(i))return i.startsWith(n+E__default.sep);let p=E__default.resolve(n,i);return p.startsWith(n+E__default.sep)||p===n}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,n=E__default.relative(t.resolvedPaths.cwd,i),o=p(`Updating ${a$1.info(n)}`,{silent:r.silent}).start(),s=await promises.readFile(i,"utf8"),c=await ai(s,e);await promises.writeFile(i,c,"utf8"),o.succeed();}async function ai(e,t){let r=[ci(t)],i=await v$1(r).process(e,{from:void 0}),n=i.css,o=i.root;if(o.nodes&&o.nodes.length>0){let s=o.nodes[o.nodes.length-1];s.type==="atrule"&&!s.nodes&&!n.trimEnd().endsWith(";")&&(n=n.trimEnd()+";");}return n=n.replace(/\/\* ---break--- \*\//g,""),n=n.replace(/(\n\s*\n)+/g,`
6
6
 
7
- `),i=i.trimEnd(),i}function pn(e){return {postcssPlugin:"update-css",Once(t){for(let[r,n]of Object.entries(e))if(r.startsWith("@")){let i=r.match(/@([a-zA-Z-]+)\s*(.*)/);if(!i)continue;let[,o,s]=i;if(o==="import"){if(!t.nodes?.find(a=>a.type==="atrule"&&a.name==="import"&&a.params===s)){let a=v$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=`
7
+ `),n=n.trimEnd(),n}function ci(e){return {postcssPlugin:"update-css",Once(t){for(let[r,i]of Object.entries(e))if(r.startsWith("@")){let n=r.match(/@([a-zA-Z-]+)\s*(.*)/);if(!n)continue;let[,o,s]=n;if(o==="import"){if(!t.nodes?.find(a=>a.type==="atrule"&&a.name==="import"&&a.params===s)){let a=v$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
8
  `,t.insertAfter(m,a);}else !t.nodes||t.nodes.length,a.raws.before="",t.prepend(a);}}else if(o==="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=v$1.atRule({name:"plugin",params:c,raws:{semicolon:true,before:`
9
9
  `}}),p=t.nodes?.filter(h=>h.type==="atrule"&&h.name==="import"),u=t.nodes?.filter(h=>h.type==="atrule"&&h.name==="plugin");if(u&&u.length>0){let h=u[u.length-1];t.insertAfter(h,m);}else if(p&&p.length>0){let h=p[p.length-1];t.insertAfter(h,m),t.insertBefore(m,v$1.comment({text:"---break---"})),t.insertAfter(m,v$1.comment({text:"---break---"}));}else t.prepend(m),t.insertBefore(m,v$1.comment({text:"---break---"})),t.insertAfter(m,v$1.comment({text:"---break---"}));}}else if(o==="custom-variant"){if(!t.nodes?.find(a=>a.type==="atrule"&&a.name==="custom-variant"&&a.params===s)){let a=v$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,v$1.comment({text:"---break---"}));}else t.prepend(a);}}else if(typeof n=="object"&&Object.keys(n).length===0){if(!t.nodes?.find(a=>a.type==="atrule"&&a.name===o&&a.params===s)){let a=v$1.atRule({name:o,params:s,raws:{semicolon:true}});t.append(a),t.insertBefore(a,v$1.comment({text:"---break---"}));}}else if(o==="keyframes"){let c=t.nodes?.find(m=>m.type==="atrule"&&m.name==="theme"&&m.params==="inline");c||(c=v$1.atRule({name:"theme",params:"inline",raws:{semicolon:true,between:" ",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,v$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===o&&a.params===s)){let a=v$1.atRule({name:o,params:s,raws:{semicolon:true}});t.append(a),t.insertBefore(a,v$1.comment({text:"---break---"}));}}else if(o==="keyframes"){let c=t.nodes?.find(m=>m.type==="atrule"&&m.name==="theme"&&m.params==="inline");c||(c=v$1.atRule({name:"theme",params:"inline",raws:{semicolon:true,between:" ",before:`
11
11
  `}}),t.append(c),t.insertBefore(c,v$1.comment({text:"---break---"})));let a=c.nodes?.find(m=>m.type==="atrule"&&m.name==="keyframes"&&m.params===s),l;if(a?(l=v$1.atRule({name:"keyframes",params:s,raws:{semicolon:true,between:" ",before:`
12
12
  `}}),a.replaceWith(l)):(l=v$1.atRule({name:"keyframes",params:s,raws:{semicolon:true,between:" ",before:`
13
- `}}),c.append(l)),typeof n=="object")for(let[m,p]of Object.entries(n))re(l,m,p);}else if(o==="utility"){let c=t.nodes?.find(a=>a.type==="atrule"&&a.name===o&&a.params===s);if(c){if(typeof n=="object")for(let[a,l]of Object.entries(n))if(typeof l=="string"){let m=c.nodes?.find(u=>u.type==="decl"&&u.prop===a),p=v$1.decl({prop:a,value:l,raws:{semicolon:true,before:`
13
+ `}}),c.append(l)),typeof i=="object")for(let[m,p]of Object.entries(i))re(l,m,p);}else if(o==="utility"){let c=t.nodes?.find(a=>a.type==="atrule"&&a.name===o&&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(u=>u.type==="decl"&&u.prop===a),p=v$1.decl({prop:a,value:l,raws:{semicolon:true,before:`
14
14
  `}});m?m.replaceWith(p):c.append(p);}else typeof l=="object"&&re(c,a,l);}else {let a=v$1.atRule({name:o,params:s,raws:{semicolon:true,between:" ",before:`
15
- `}});if(t.append(a),t.insertBefore(a,v$1.comment({text:"---break---"})),typeof n=="object")for(let[l,m]of Object.entries(n))if(typeof m=="string"){let p=v$1.decl({prop:l,value:m,raws:{semicolon:true,before:`
16
- `}});a.append(p);}else typeof m=="object"&&re(a,l,m);}}else o==="property"?re(t,r,n):ir(t,o,s,n);}else re(t,r,n);}}}function ir(e,t,r,n){let i=e.nodes?.find(o=>o.type==="atrule"&&o.name===t&&o.params===r);if(i||(i=v$1.atRule({name:t,params:r,raws:{semicolon:true,between:" ",before:`
17
- `}}),e.append(i),e.insertBefore(i,v$1.comment({text:"---break---"}))),typeof n=="object")for(let[o,s]of Object.entries(n))if(o.startsWith("@")){let c=o.match(/@([a-zA-Z-]+)\s*(.*)/);if(c){let[,a,l]=c;ir(i,a,l,s);}}else re(i,o,s);else if(typeof n=="string")try{let s=v$1.parse(`.temp{${n}}`).first;if(s&&s.nodes){let c=v$1.rule({selector:"temp",raws:{semicolon:!0,between:" ",before:`
15
+ `}});if(t.append(a),t.insertBefore(a,v$1.comment({text:"---break---"})),typeof i=="object")for(let[l,m]of Object.entries(i))if(typeof m=="string"){let p=v$1.decl({prop:l,value:m,raws:{semicolon:true,before:`
16
+ `}});a.append(p);}else typeof m=="object"&&re(a,l,m);}}else o==="property"?re(t,r,i):nr(t,o,s,i);}else re(t,r,i);}}}function nr(e,t,r,i){let n=e.nodes?.find(o=>o.type==="atrule"&&o.name===t&&o.params===r);if(n||(n=v$1.atRule({name:t,params:r,raws:{semicolon:true,between:" ",before:`
17
+ `}}),e.append(n),e.insertBefore(n,v$1.comment({text:"---break---"}))),typeof i=="object")for(let[o,s]of Object.entries(i))if(o.startsWith("@")){let c=o.match(/@([a-zA-Z-]+)\s*(.*)/);if(c){let[,a,l]=c;nr(n,a,l,s);}}else re(n,o,s);else if(typeof i=="string")try{let s=v$1.parse(`.temp{${i}}`).first;if(s&&s.nodes){let c=v$1.rule({selector:"temp",raws:{semicolon:!0,between:" ",before:`
18
18
  `}});s.nodes.forEach(a=>{if(a.type==="decl"){let l=a.clone();l.raws.before=`
19
- `,c.append(l);}}),c.nodes?.length&&i.append(c);}}catch(o){throw console.error("Error parsing at-rule content:",n,o),o}}function re(e,t,r){let n=e.nodes?.find(i=>i.type==="rule"&&i.selector===t);if(n||(n=v$1.rule({selector:t,raws:{semicolon:true,between:" ",before:`
20
- `}}),e.append(n)),typeof r=="object"){for(let[i,o]of Object.entries(r))if(i.startsWith("@")&&typeof o=="object"&&o!==null&&Object.keys(o).length===0){let s=i.match(/@([a-zA-Z-]+)\s*(.*)/);if(s){let[,c,a]=s,l=v$1.atRule({name:c,params:a,raws:{semicolon:true,before:`
21
- `}});n.append(l);}}else if(typeof o=="string"){let s=v$1.decl({prop:i,value:o,raws:{semicolon:true,before:`
22
- `}}),c=n.nodes?.find(a=>a.type==="decl"&&a.prop===i);c?c.replaceWith(s):n.append(s);}else if(typeof o=="object"){let s=i.startsWith("&")?t.replace(/^([^:]+)/,`$1${i.substring(1)}`):i;re(e,s,o);}}else if(typeof r=="string")try{let o=v$1.parse(`.temp{${r}}`).first;o&&o.nodes&&o.nodes.forEach(s=>{if(s.type==="decl"){let c=s.clone();c.raws.before=`
23
- `,n?.append(c);}});}catch(i){throw console.error("Error parsing rule content:",t,r,i),i}}var cr=new Set(["text","spacing","radius"]);function Pe(e){let t=e.trim();return t===""||isNaN(Number(t))?t:`${t}px`}var un=["--font-weight"];function sr(e,t){let r=cr.has(t),n={},i={},o={};for(let[s,c]of Object.entries(e)){let a=r&&!un.some(l=>s.endsWith(l));if(c.includes("|")){let[l,m,p]=c.split("|").map(u=>u.trim());n[s]=a?Pe(l):l,m!==l&&(i[s]=a?Pe(m):m),p!==m&&(o[s]=a?Pe(p):p);}else n[s]=a?Pe(c):c;}return {desktop:n,tablet:i,mobile:o}}function Y(e,t){let r={};for(let[n,i]of Object.entries(t))r[n?`${e}-${n}`:e]=i;return r}async function Qe(e,t,r){if(!t.resolvedPaths.tailwindCss||!Object.keys(e??{}).length)return;r={cleanupDefaultNextStyles:false,silent:false,overwriteCssVars:false,initIndex:true,...r};let n=t.resolvedPaths.tailwindCss,i=E__default.relative(t.resolvedPaths.cwd,n),o=p(`Updating CSS variables in ${a$1.info(i)}`,{silent:r.silent}).start(),s=await promises.readFile(n,"utf8"),c=await gn(s,e??{},t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars,initIndex:r.initIndex});await promises.writeFile(n,c,"utf8"),o.succeed();}async function gn(e,t,r,n={cleanupDefaultNextStyles:false,tailwindConfig:void 0,overwriteCssVars:false,initIndex:false}){n={cleanupDefaultNextStyles:false,tailwindConfig:void 0,overwriteCssVars:false,initIndex:false,...n};let i=[];if(r.resolvedPaths?.cwd){let c=l(r.resolvedPaths.cwd);!c?.dependencies?.["tailwindcss-animate"]&&!c?.devDependencies?.["tailwindcss-animate"]&&n.initIndex&&i.push(bn({params:"tw-animate-css"}));}n.cleanupDefaultNextStyles&&i.push(hn()),i.push(wn(t,{overwriteCssVars:n.overwriteCssVars})),i.push(yn(t)),n.tailwindConfig&&(i.push(xn(n.tailwindConfig)),i.push(vn(n.tailwindConfig)),i.push(Sn(n.tailwindConfig)));let s=(await v$1(i).process(e,{from:void 0})).css;return s=s.replace(/\/\* ---break--- \*\//g,""),s=s.replace(/(\n\s*\n)+/g,`
19
+ `,c.append(l);}}),c.nodes?.length&&n.append(c);}}catch(o){throw console.error("Error parsing at-rule content:",i,o),o}}function re(e,t,r){let i=e.nodes?.find(n=>n.type==="rule"&&n.selector===t);if(i||(i=v$1.rule({selector:t,raws:{semicolon:true,between:" ",before:`
20
+ `}}),e.append(i)),typeof r=="object"){for(let[n,o]of Object.entries(r))if(n.startsWith("@")&&typeof o=="object"&&o!==null&&Object.keys(o).length===0){let s=n.match(/@([a-zA-Z-]+)\s*(.*)/);if(s){let[,c,a]=s,l=v$1.atRule({name:c,params:a,raws:{semicolon:true,before:`
21
+ `}});i.append(l);}}else if(typeof o=="string"){let s=v$1.decl({prop:n,value:o,raws:{semicolon:true,before:`
22
+ `}}),c=i.nodes?.find(a=>a.type==="decl"&&a.prop===n);c?c.replaceWith(s):i.append(s);}else if(typeof o=="object"){let s=n.startsWith("&")?t.replace(/^([^:]+)/,`$1${n.substring(1)}`):n;re(e,s,o);}}else if(typeof r=="string")try{let o=v$1.parse(`.temp{${r}}`).first;o&&o.nodes&&o.nodes.forEach(s=>{if(s.type==="decl"){let c=s.clone();c.raws.before=`
23
+ `,i?.append(c);}});}catch(n){throw console.error("Error parsing rule content:",t,r,n),n}}var cr=new Set(["text","spacing","radius"]);function Pe(e){let t=e.trim();return t===""||isNaN(Number(t))?t:`${t}px`}var mi=["--font-weight"];function sr(e,t){let r=cr.has(t),i={},n={},o={};for(let[s,c]of Object.entries(e)){let a=r&&!mi.some(l=>s.endsWith(l));if(c.includes("|")){let[l,m,p]=c.split("|").map(u=>u.trim());i[s]=a?Pe(l):l,m!==l&&(n[s]=a?Pe(m):m),p!==m&&(o[s]=a?Pe(p):p);}else i[s]=a?Pe(c):c;}return {desktop:i,tablet:n,mobile:o}}function Y(e,t){let r={};for(let[i,n]of Object.entries(t))r[i?`${e}-${i}`:e]=n;return r}async function Ze(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,n=E__default.relative(t.resolvedPaths.cwd,i),o=p(`Updating CSS variables in ${a$1.info(n)}`,{silent:r.silent}).start(),s=await promises.readFile(i,"utf8"),c=await fi(s,e??{},t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars,initIndex:r.initIndex});await promises.writeFile(i,c,"utf8"),o.succeed();}async function fi(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 n=[];if(r.resolvedPaths?.cwd){let c=l(r.resolvedPaths.cwd);!c?.dependencies?.["tailwindcss-animate"]&&!c?.devDependencies?.["tailwindcss-animate"]&&i.initIndex&&n.push(gi({params:"tw-animate-css"}));}i.cleanupDefaultNextStyles&&n.push(pi()),n.push(di(t,{overwriteCssVars:i.overwriteCssVars})),n.push(ui(t)),i.tailwindConfig&&(n.push(hi(i.tailwindConfig)),n.push(yi(i.tailwindConfig)),n.push(wi(i.tailwindConfig)));let s=(await v$1(n).process(e,{from:void 0})).css;return s=s.replace(/\/\* ---break--- \*\//g,""),s=s.replace(/(\n\s*\n)+/g,`
24
24
 
25
- `),s}function ar(e){let t=e.nodes.find(r=>r.type==="rule"&&r.selector===":root");if(t){let r=["--background","--foreground"];t.nodes.filter(n=>n.type==="decl"&&r.includes(n.prop)).forEach(n=>n.remove()),t.nodes.length===0&&t.remove();}}function hn(){return {postcssPlugin:"cleanup-default-next-styles",Once(e){let t=e.nodes.find(n=>n.type==="rule"&&n.selector==="body");t&&(t.nodes.find(n=>n.type==="decl"&&n.prop==="color"&&["rgb(var(--foreground-rgb))","var(--foreground)"].includes(n.value))?.remove(),t.nodes.find(n=>n.type==="decl"&&n.prop==="background"&&(n.value.startsWith("linear-gradient")||n.value==="var(--background)"))?.remove(),t.nodes.find(n=>n.type==="decl"&&n.prop==="font-family"&&n.value==="Arial, Helvetica, sans-serif")?.remove(),t.nodes.length===0&&t.remove()),ar(e);let r=e.nodes.find(n=>n.type==="atrule"&&n.params==="(prefers-color-scheme: dark)");r&&(ar(r),r.nodes.length===0&&r.remove());}}}function wn(e,t){return {postcssPlugin:"update-css-vars-v4",Once(r){let n=(o,s)=>{let c=r.nodes?.find(a=>a.type==="rule"&&a.selector===o);!c&&Object.keys(s).length>0&&(c=v$1.rule({selector:o,nodes:[],raws:{semicolon:true,between:" ",before:`
26
- `}}),r.append(c),r.insertBefore(c,v$1.comment({text:"---break---"}))),Object.entries(s).forEach(([a,l])=>{let m=`--${a.replace(/^--/,"")}`;In(l)&&(l=`hsl(${l})`);let p=v$1.decl({prop:m,value:l,raws:{semicolon:true}}),u=c?.nodes.find(h=>h.type==="decl"&&h.prop===m);t.overwriteCssVars?u?u.replaceWith(p):c?.append(p):u||c?.append(p);});},i=(o,s,c)=>{if(Object.keys(c).length===0)return;let a=`(max-width: ${o})`,l=r.nodes?.find(p=>p.type==="atrule"&&p.name==="media"&&p.params===a);l||(l=v$1.atRule({name:"media",params:a,nodes:[],raws:{semicolon:true,between:" ",before:`
25
+ `),s}function ar(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 pi(){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()),ar(e);let r=e.nodes.find(i=>i.type==="atrule"&&i.params==="(prefers-color-scheme: dark)");r&&(ar(r),r.nodes.length===0&&r.remove());}}}function di(e,t){return {postcssPlugin:"update-css-vars-v4",Once(r){let i=(o,s)=>{let c=r.nodes?.find(a=>a.type==="rule"&&a.selector===o);!c&&Object.keys(s).length>0&&(c=v$1.rule({selector:o,nodes:[],raws:{semicolon:true,between:" ",before:`
26
+ `}}),r.append(c),r.insertBefore(c,v$1.comment({text:"---break---"}))),Object.entries(s).forEach(([a,l])=>{let m=`--${a.replace(/^--/,"")}`;xi(l)&&(l=`hsl(${l})`);let p=v$1.decl({prop:m,value:l,raws:{semicolon:true}}),u=c?.nodes.find(h=>h.type==="decl"&&h.prop===m);t.overwriteCssVars?u?u.replaceWith(p):c?.append(p):u||c?.append(p);});},n=(o,s,c)=>{if(Object.keys(c).length===0)return;let a=`(max-width: ${o})`,l=r.nodes?.find(p=>p.type==="atrule"&&p.name==="media"&&p.params===a);l||(l=v$1.atRule({name:"media",params:a,nodes:[],raws:{semicolon:true,between:" ",before:`
27
27
  `}}),r.append(l),r.insertBefore(l,v$1.comment({text:"---break---"})));let m=l.nodes?.find(p=>p.type==="rule"&&p.selector===s);m||(m=v$1.rule({selector:s,nodes:[],raws:{semicolon:true,between:" ",before:`
28
- `}}),l.append(m)),Object.entries(c).forEach(([p,u])=>{let h=`--${p.replace(/^--/,"")}`,g=v$1.decl({prop:h,value:u,raws:{semicolon:true}}),w=m?.nodes.find(R=>R.type==="decl"&&R.prop===h);t.overwriteCssVars?w?w.replaceWith(g):m?.append(g):w||m?.append(g);});};for(let[o,s]of Object.entries(e))if(cr.has(o)){if(s.light){let{desktop:c,tablet:a,mobile:l}=sr(s.light,o);n(":root",Y(o,c)),i("1279px",":root",Y(o,a)),i("767px",":root",Y(o,l));}if(s.dark){let{desktop:c,tablet:a,mobile:l}=sr(s.dark,o);n(".dark",Y(o,c)),i("1279px",".dark",Y(o,a)),i("767px",".dark",Y(o,l));}}else s.light&&n(":root",Y(o,s.light)),s.dark&&n(".dark",Y(o,s.dark));}}}function yn(e){return {postcssPlugin:"update-theme",Once(t){if(Object.keys(e).length===0)return;let r=Ze(t);for(let[n,i]of Object.entries(e)){let o=Array.from(new Set([...Object.keys(i.light??{}),...Object.keys(i.dark??{})]));for(let s of o){let c=s?`${n}-${s}`:n,a=`--${c}`,l=`var(--${c})`;r?.nodes?.find(p=>p.type==="decl"&&p.prop===a)||r?.append(v$1.decl({prop:a,value:l,raws:{semicolon:true}}));}}}}}function Ze(e){let t=e.nodes.find(r=>r.type==="atrule"&&r.name==="theme"&&r.params==="inline");return t||(t=v$1.atRule({name:"theme",params:"inline",nodes:[],raws:{semicolon:true,between:" ",before:`
29
- `}}),e.append(t),e.insertBefore(t,v$1.comment({text:"---break---"}))),t}function bn({params:e}){return {postcssPlugin:"add-custom-import",Once(t){let r=t.nodes.filter(o=>o.type==="atrule"&&o.name==="import"),n=t.nodes.find(o=>o.type==="atrule"&&o.name==="custom-variant");if(!r.some(o=>o.params.replace(/["']/g,"")===e)){let o=v$1.atRule({name:"import",params:`"${e}"`,raws:{semicolon:true,before:`
30
- `}});if(r.length>0){let s=r[r.length-1];t.insertAfter(s,o);}else n?(t.insertBefore(n,o),t.insertBefore(n,v$1.comment({text:"---break---"}))):(t.prepend(o),t.insertAfter(o,v$1.comment({text:"---break---"})));}}}}function xn(e){return {postcssPlugin:"update-tailwind-config",Once(t){if(!e?.plugins)return;let n=Rn(t)==="single"?"'":'"',i=t.nodes.filter(s=>s.type==="atrule"&&s.name==="plugin"),o=i[i.length-1]||t.nodes[0];for(let s of e.plugins){let c=s.replace(/^require\(["']|["']\)$/g,"");if(i.some(l=>l.params.replace(/["']/g,"")===c))continue;let a=v$1.atRule({name:"plugin",params:`${n}${c}${n}`,raws:{semicolon:true,before:`
31
- `}});t.insertAfter(o,a),t.insertBefore(a,v$1.comment({text:"---break---"}));}}}}function Sn(e){return {postcssPlugin:"update-tailwind-config-keyframes",Once(t){if(!e?.theme?.extend?.keyframes)return;let r=Ze(t),n=r.nodes?.filter(o=>o.type==="atrule"&&o.name==="keyframes"),i=z.record(z.string(),z.record(z.string(),z.string()));for(let[o,s]of Object.entries(e.theme.extend.keyframes)){if(typeof o!="string")continue;let c=i.safeParse(s);if(!c.success||n?.find(l=>l.type==="atrule"&&l.name==="keyframes"&&l.params===o))continue;let a=v$1.atRule({name:"keyframes",params:o,nodes:[],raws:{semicolon:true,between:" ",before:`
28
+ `}}),l.append(m)),Object.entries(c).forEach(([p,u])=>{let h=`--${p.replace(/^--/,"")}`,g=v$1.decl({prop:h,value:u,raws:{semicolon:true}}),y=m?.nodes.find(R=>R.type==="decl"&&R.prop===h);t.overwriteCssVars?y?y.replaceWith(g):m?.append(g):y||m?.append(g);});};for(let[o,s]of Object.entries(e))if(cr.has(o)){if(s.light){let{desktop:c,tablet:a,mobile:l}=sr(s.light,o);i(":root",Y(o,c)),n("1279px",":root",Y(o,a)),n("767px",":root",Y(o,l));}if(s.dark){let{desktop:c,tablet:a,mobile:l}=sr(s.dark,o);i(".dark",Y(o,c)),n("1279px",".dark",Y(o,a)),n("767px",".dark",Y(o,l));}}else s.light&&i(":root",Y(o,s.light)),s.dark&&i(".dark",Y(o,s.dark));}}}function ui(e){return {postcssPlugin:"update-theme",Once(t){if(Object.keys(e).length===0)return;let r=et(t);for(let[i,n]of Object.entries(e)){let o=Array.from(new Set([...Object.keys(n.light??{}),...Object.keys(n.dark??{})]));for(let s of o){let c=s?`${i}-${s}`:i,a=`--${c}`,l=`var(--${c})`;r?.nodes?.find(p=>p.type==="decl"&&p.prop===a)||r?.append(v$1.decl({prop:a,value:l,raws:{semicolon:true}}));}}}}}function et(e){let t=e.nodes.find(r=>r.type==="atrule"&&r.name==="theme"&&r.params==="inline");return t||(t=v$1.atRule({name:"theme",params:"inline",nodes:[],raws:{semicolon:true,between:" ",before:`
29
+ `}}),e.append(t),e.insertBefore(t,v$1.comment({text:"---break---"}))),t}function gi({params:e}){return {postcssPlugin:"add-custom-import",Once(t){let r=t.nodes.filter(o=>o.type==="atrule"&&o.name==="import"),i=t.nodes.find(o=>o.type==="atrule"&&o.name==="custom-variant");if(!r.some(o=>o.params.replace(/["']/g,"")===e)){let o=v$1.atRule({name:"import",params:`"${e}"`,raws:{semicolon:true,before:`
30
+ `}});if(r.length>0){let s=r[r.length-1];t.insertAfter(s,o);}else i?(t.insertBefore(i,o),t.insertBefore(i,v$1.comment({text:"---break---"}))):(t.prepend(o),t.insertAfter(o,v$1.comment({text:"---break---"})));}}}}function hi(e){return {postcssPlugin:"update-tailwind-config",Once(t){if(!e?.plugins)return;let i=bi(t)==="single"?"'":'"',n=t.nodes.filter(s=>s.type==="atrule"&&s.name==="plugin"),o=n[n.length-1]||t.nodes[0];for(let s of e.plugins){let c=s.replace(/^require\(["']|["']\)$/g,"");if(n.some(l=>l.params.replace(/["']/g,"")===c))continue;let a=v$1.atRule({name:"plugin",params:`${i}${c}${i}`,raws:{semicolon:true,before:`
31
+ `}});t.insertAfter(o,a),t.insertBefore(a,v$1.comment({text:"---break---"}));}}}}function wi(e){return {postcssPlugin:"update-tailwind-config-keyframes",Once(t){if(!e?.theme?.extend?.keyframes)return;let r=et(t),i=r.nodes?.filter(o=>o.type==="atrule"&&o.name==="keyframes"),n=z.record(z.string(),z.record(z.string(),z.string()));for(let[o,s]of Object.entries(e.theme.extend.keyframes)){if(typeof o!="string")continue;let c=n.safeParse(s);if(!c.success||i?.find(l=>l.type==="atrule"&&l.name==="keyframes"&&l.params===o))continue;let a=v$1.atRule({name:"keyframes",params:o,nodes:[],raws:{semicolon:true,between:" ",before:`
32
32
  `}});for(let[l,m]of Object.entries(c.data)){let p=v$1.rule({selector:l,nodes:Object.entries(m).map(([u,h])=>v$1.decl({prop:u,value:h,raws:{semicolon:true,before:`
33
33
  `,between:": "}})),raws:{semicolon:true,between:" ",before:`
34
- `}});a.append(p);}r.append(a),r.insertBefore(a,v$1.comment({text:"---break---"}));}}}}function vn(e){return {postcssPlugin:"update-tailwind-config-animation",Once(t){if(!e?.theme?.extend?.animation)return;let r=Ze(t),n=r.nodes?.filter(o=>o.type==="decl"&&o.prop.startsWith("--animate-")),i=z.record(z.string(),z.string()).safeParse(e.theme.extend.animation);if(i.success)for(let[o,s]of Object.entries(i.data)){let c=`--animate-${o}`;if(n?.find(l=>l.prop===c))continue;let a=v$1.decl({prop:c,value:s,raws:{semicolon:true,between:": ",before:`
35
- `}});r.append(a);}}}}function Rn(e){return e.nodes[0].toString().includes("'")?"single":"double"}function In(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 V(e,t,r,n){if(e=Array.from(new Set(e)),t=Array.from(new Set(t)),!e?.length&&!t?.length)return;n={silent:false,...n};let i=p("Installing dependencies.",{silent:n.silent})?.start(),o$1=await Pn(r),s="";if(kn(r)&&o$1==="npm")if(n.silent)s="force";else {i.stopAndPersist(),o.warn(`
34
+ `}});a.append(p);}r.append(a),r.insertBefore(a,v$1.comment({text:"---break---"}));}}}}function yi(e){return {postcssPlugin:"update-tailwind-config-animation",Once(t){if(!e?.theme?.extend?.animation)return;let r=et(t),i=r.nodes?.filter(o=>o.type==="decl"&&o.prop.startsWith("--animate-")),n=z.record(z.string(),z.string()).safeParse(e.theme.extend.animation);if(n.success)for(let[o,s]of Object.entries(n.data)){let c=`--animate-${o}`;if(i?.find(l=>l.prop===c))continue;let a=v$1.decl({prop:c,value:s,raws:{semicolon:true,between:": ",before:`
35
+ `}});r.append(a);}}}}function bi(e){return e.nodes[0].toString().includes("'")?"single":"double"}function xi(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 V(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 n=p("Installing dependencies.",{silent:i.silent})?.start(),o$1=await Ri(r),s="";if(vi(r)&&o$1==="npm")if(i.silent)s="force";else {n.stopAndPersist(),o.warn(`
36
36
  It looks like you are using React 19.
37
37
  Some packages may fail to install due to peer dependency issues in npm (see https://createui.co/react-19).
38
- `);let c=await Le([{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);}i?.start(),await jn(o$1,e,t,r.resolvedPaths.cwd,s),i?.succeed();}function kn(e){let t=l(e.resolvedPaths.cwd,false);if(!t?.dependencies?.react)return false;let r=/^(?:\^|~)?19(?:\.\d+)*(?:-.*)?$/.test(t.dependencies.react),n=t.dependencies["react-day-picker"]?.startsWith("8");return r&&n}async function Pn(e){return l(e.resolvedPaths.cwd,false)?.dependencies?.expo?"expo":a$2(e.resolvedPaths.cwd)}async function jn(e,t,r,n,i){if(e==="npm")return En(t,r,n,i);if(e==="deno")return $n(t,r,n);if(e==="expo")return Nn(t,r,n);if(t?.length)try{await execa(e,["add",...t],{cwd:n});}catch{await je(e,"add",t,n);}if(r?.length)try{await execa(e,["add","-D",...r],{cwd:n});}catch{await je(e,"add -D",r,n);}}async function En(e,t,r,n){let i=n?[`--${n}`]:[];if(e.length)try{await execa("npm",["install",...i,...e],{cwd:r});}catch{await je("npm",`install${i.length?` ${i.join(" ")}`:""}`,e,r);}if(t.length)try{await execa("npm",["install",...i,"-D",...t],{cwd:r});}catch{await je("npm",`install${i.length?` ${i.join(" ")}`:""} -D`,t,r);}}async function je(e,t,r,n){let i=[];for(let o of r)try{await execa(e,[...t.split(" "),o],{cwd:n});}catch{i.push(o);}i.length>0&&o.warn(`
39
- Failed to install: ${i.join(", ")}. You may need to install them manually.
40
- `);}async function $n(e,t,r){e?.length&&await execa("deno",["add",...e.map(n=>`npm:${n}`)],{cwd:r}),t?.length&&await execa("deno",["add","-D",...t.map(n=>`npm:${n}`)],{cwd:r});}async function Nn(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 tt(e,t,r){if(!e||Object.keys(e).length===0)return {envVarsAdded:[],envFileUpdated:null,envFileCreated:null};r={silent:false,...r};let n=p("Adding environment variables.",{silent:r.silent})?.start(),i=t.resolvedPaths.cwd,o$1=E__default.join(i,".env.local"),s=x$1(i);s&&(o$1=s);let c=existsSync(o$1),a=E__default.basename(o$1),l=Object.entries(e).map(([h,g])=>`${h}=${g}`).join(`
41
- `),m=[],p$1=null,u=null;if(c){let h=await promises.readFile(o$1,"utf-8"),g=z$1(h,l);if(m=y(h,l),m.length>0){if(await promises.writeFile(o$1,g,"utf-8"),p$1=E__default.relative(i,o$1),n?.succeed(`Added the following variables to ${a$1.info(a)}:`),!r.silent)for(let w of m)o.log(` ${a$1.success("+")} ${w}`);}else n?.stop();}else if(await promises.writeFile(o$1,l+`
42
- `,"utf-8"),u=E__default.relative(i,o$1),m=Object.keys(e),n?.succeed(`Added the following variables to ${a$1.info(a)}:`),!r.silent)for(let h of m)o.log(` ${a$1.success("+")} ${h}`);return !r.silent&&m.length>0&&o.break(),{envVarsAdded:m,envFileUpdated:p$1,envFileCreated:u}}async function mr(e,t){if(!e.fonts?.length)return e;let r=await m(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 i of e.fonts)e.cssVars.font.light[i.role]=`var(${i.font.variable})`;return e}let n=new Set;for(let i of e.fonts){let o=Vn(i.font);o&&!n.has(o)&&(n.add(o),e.dependencies??=[],e.dependencies.push(o),e.css??={},e.css[`@import "${o}"`]={}),e.cssVars.font.light[i.role]=i.font.family;}return e}function Vn(e){if(e.provider!=="google"||!e.import)return null;let t=e.import.toLowerCase().replace(/_/g,"-");return /variable/i.test(e.family)?`@fontsource-variable/${t}`:`@fontsource/${t}`}async function rt(e,t,r){if(!e?.length)return;let n=await m(t.resolvedPaths.cwd);if(!n||n.framework.name!=="next-app"&&n.framework.name!=="next-pages")return;let i=p("Updating fonts.",{silent:r.silent})?.start();try{await Ln(e,t,n),i?.succeed("Updating fonts.");}catch(o){throw i?.fail("Failed to update fonts."),o}}async function Ln(e,t,r){let n=await Mn(t,r);if(!n)return;let i=await promises.readFile(n,"utf-8"),o=await Wn(i,e);o!==i&&await promises.writeFile(n,o,"utf-8");}async function Mn(e,t){let r=e.resolvedPaths.cwd,n=t.isSrcDir,o=t.isTsx?"tsx":"jsx",s=n?[`src/app/layout.${o}`,`app/layout.${o}`]:[`app/layout.${o}`];for(let c of s){let a=E__default.join(r,c);if(existsSync(a))return a}return null}async function Wn(e,t,r){let i=new Project({compilerOptions:{}}).createSourceFile("layout.tsx",e,{scriptKind:ScriptKind.TSX}),o=t.filter(a=>a.font.provider==="google"),s=[];for(let a of o){let l=a.font.import;if(!l)continue;let m=a.font.variable.replace(/^--/,"").replace(/-([a-z])/g,(g,w)=>w.toUpperCase()),p=i.getImportDeclaration(g=>g.getModuleSpecifierValue()==="next/font/google"),u=zn(a);p?p.getNamedImports().some(R=>R.getName()===l)||p.addNamedImport(l):i.addImportDeclaration({moduleSpecifier:"next/font/google",namedImports:[l]});let h=Un(i,a.font.variable);if(h)h.setInitializer(`${l}(${u})`),h.getName()!==m&&h.rename(m);else {let g=Bn(i);i.insertVariableStatement(g,{declarationKind:VariableDeclarationKind.Const,declarations:[{name:m,initializer:`${l}(${u})`}]}).appendWhitespace(`
43
- `);}s.push(m);}let c=new Set(o.map(a=>a.font.variable));return Kn(i,c),Yn(i),s.length>0&&Gn(i,s),qn(i),i.getFullText()}function zn(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 Un(e,t){let r=e.getVariableStatements();for(let n of r)for(let i of n.getDeclarations()){let o=i.getInitializer();if(!o||o.getKind()!==SyntaxKind.CallExpression)continue;let c=o.getArguments();if(c.length===0)continue;let a=c[0].getText();if(a.includes("variable:")&&a.includes(t))return i}return null}function Bn(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function Gn(e,t){let r=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement);for(let n of r){if(n.getTagNameNode().getText()!=="html")continue;let o=n.getAttribute("className");if(!o){let l=t.map(m=>`${m}.variable`).join(", ");t.length===1?n.addAttribute({name:"className",initializer:`{${l}}`}):(we(e),n.addAttribute({name:"className",initializer:`{cn(${l})}`}));return}if(o.getKind()!==SyntaxKind.JsxAttribute)return;let s=o.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);we(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(w=>p.includes(w)))continue;let h=Hn(p),g=Xn(h,a);l.replaceWithText(`{${g}}`);}else if(/^\w+\.variable$/.test(p)){if(a.includes(p))continue;a.length===1?l.replaceWithText(`{${a[0]}}`):(we(e),l.replaceWithText(`{cn(${a.join(", ")})}`));}else if(p.startsWith("`")&&p.endsWith("`")){let u=Jn(p).filter(h=>!/^\w+\.variable$/.test(h));we(e),l.replaceWithText(`{cn(${[...u,...a].join(", ")})}`);}else we(e),l.replaceWithText(`{cn(${p}, ${a.join(", ")})}`);}}}function we(e){if(!e.getImportDeclaration(r=>r.getNamedImports().some(i=>i.getName()==="cn"))){let r=e.getImportDeclaration(n=>n.getModuleSpecifierValue().includes("/lib/utils"));r?r.getNamedImports().some(i=>i.getName()==="cn")||r.addNamedImport("cn"):e.addImportDeclaration({moduleSpecifier:"@/lib/utils",namedImports:["cn"]});}}function Jn(e){let t=[],r=[],i=e.slice(1,-1).split(/(\$\{[^}]+\})/);for(let o of i)if(o)if(o.startsWith("${")&&o.endsWith("}")){let s=o.slice(2,-1).trim();s&&r.push(s);}else {let s=o.trim().split(/\s+/).filter(Boolean);for(let c of s)t.push(`"${c}"`);}return [...t,...r]}function Kn(e,t){let r=[];for(let n of e.getVariableStatements())for(let i of n.getDeclarations()){let o=i.getInitializer();if(!o||o.getKind()!==SyntaxKind.CallExpression)continue;let c=o.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(n);}for(let n of r)n.remove();}function Yn(e){let t=e.getImportDeclaration(i=>i.getModuleSpecifierValue()==="next/font/google");if(!t)return;let r=t.getNamedImports(),n=e.getFullText();for(let i of r){let o=i.getName(),s=t.getText(),c=n.replace(s,"");new RegExp(`\\b${o}\\b`).test(c)||i.remove();}t.getNamedImports().length===0&&t.remove();}function qn(e,t){let r=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement);for(let n of r){if(n.getTagNameNode().getText()!=="body")continue;let o=n.getAttribute("className");if(!o||o.getKind()!==SyntaxKind.JsxAttribute)continue;let s=o.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),u=[],h=p.split(/(\$\{[^}]+\})/);for(let g of h){if(!g||g.startsWith("${")&&g.endsWith("}"))continue;let w=g.trim().split(/\s+/).filter(Boolean);u.push(...w);}u.length>0?s.setInitializer(`"${u.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 u=p.match(/^cn\((.+)\)$/);if(u){let h=u[1].split(",").map(g=>g.trim()).filter(Boolean);h.length===0?s.remove():h.length===1&&h[0].startsWith('"')?s.setInitializer(h[0]):a.replaceWithText(`{${p}}`);}}}}}function Hn(e){return e.replace(/,?\s*\w+\.variable/g,"").replace(/cn\(\s*,/,"cn(")}function Xn(e,t){let r=t.join(", ");return e.replace(/\)$/,`, ${r})`)}async function nt(e,t,r){}async function ne(e,t,r){r={overwrite:false,silent:false,isNewProject:false,baseStyle:true,...r};let n=await h(t);return n&&n.ui&&n.ui.resolvedPaths.cwd!==t.resolvedPaths.cwd?await ei(e,t,n,{...r,isRemote:e?.length===1&&!!e[0].match(/^https?:\/\//)}):await Zn(e,t,r)}async function Zn(e,t,r){if(!r.baseStyle&&!e.length)return;let n=p("Checking registry.",{silent:r.silent})?.start(),i=await P(e,G(t));if(!i)return n?.fail(),Q(new Error("Failed to fetch components from registry."));try{pr(i.files??[],t.resolvedPaths.cwd);}catch(s){return n?.fail(),Q(s)}n?.succeed(),i=await mr(i,t),await nt(i.tailwind?.config,t,{silent:r.silent});let o$1=await fr(e,t);await Qe(i.cssVars,t,{cleanupDefaultNextStyles:r.isNewProject,silent:r.silent,tailwindConfig:i.tailwind?.config,overwriteCssVars:o$1,initIndex:r.baseStyle}),await Xe(i.css,t,{silent:r.silent}),await tt(i.envVars,t,{silent:r.silent}),await rt(i.fonts,t,{silent:r.silent}),await C(i.files,t,{overwrite:r.overwrite,silent:r.silent,path:r.path}),await V(i.dependencies,i.devDependencies,t,{silent:r.silent}),i.docs&&o.info(i.docs);}async function ei(e,t,r,n){if(!n.baseStyle&&!e.length)return;let i$1=p("Checking registry.",{silent:n.silent})?.start(),o$1=await P(e,G(t));if(!o$1)return i$1?.fail(),Q(new Error("Failed to fetch components from registry."));try{pr(o$1.files??[],t.resolvedPaths.cwd);}catch(g){return i$1?.fail(),Q(g)}i$1?.succeed();let s=[],c=[],a=[],l=p("Installing components.")?.start(),m=r.ui,p$1=j(t.resolvedPaths.cwd,m.resolvedPaths.ui);if(o$1.tailwind?.config&&(await nt(o$1.tailwind?.config),c.push(E__default.relative(p$1,m.resolvedPaths.tailwindConfig))),o$1.cssVars){let g=await fr(e,t);await Qe(o$1.cssVars,m,{silent:true,tailwindConfig:o$1.tailwind?.config,overwriteCssVars:g}),c.push(E__default.relative(p$1,m.resolvedPaths.tailwindCss));}o$1.css&&(await Xe(o$1.css,m,{silent:true}),c.push(E__default.relative(p$1,m.resolvedPaths.tailwindCss))),o$1.envVars&&await tt(o$1.envVars,m,{silent:true}),await rt(o$1.fonts,m,{silent:true}),await V(o$1.dependencies,o$1.devDependencies,m,{silent:true});let u=new Map;for(let g of o$1.files??[]){let w=g.type||"registry:ui";u.has(w)||u.set(w,[]),u.get(w).push(g);}for(let g of Array.from(u.keys())){let w=u.get(g),R=g==="registry:ui"?r.ui:t,S=j(t.resolvedPaths.cwd,R.resolvedPaths.ui||R.resolvedPaths.cwd),H=await i(S,R.resolvedPaths.cwd)??R.resolvedPaths.cwd,F=await C(w,R,{overwrite:n.overwrite,silent:true,rootSpinner:l,isRemote:n.isRemote,isWorkspace:true,path:n.path});s.push(...F.filesCreated.map(W=>E__default.relative(S,E__default.join(H,W)))),c.push(...F.filesUpdated.map(W=>E__default.relative(S,E__default.join(H,W)))),a.push(...F.filesSkipped.map(W=>E__default.relative(S,E__default.join(H,W))));}if(l?.succeed(),s.sort(),c.sort(),a.sort(),!(s.length||c.length)&&!a.length&&p("No files updated.",{silent:n.silent})?.info(),s.length){p(`Created ${s.length} ${s.length===1?"file":"files"}:`,{silent:n.silent})?.succeed();for(let g of s)o.log(` - ${g}`);}if(c.length){p(`Updated ${c.length} ${c.length===1?"file":"files"}:`,{silent:n.silent})?.info();for(let g of c)o.log(` - ${g}`);}if(a.length){p(`Skipped ${a.length} ${c.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:n.silent})?.info();for(let g of a)o.log(` - ${g}`);}o$1.docs&&o.info(o$1.docs);}async function fr(e,t){let r=await S(e,{config:t});return z.array(n$1).parse(r).some(i=>i.type==="registry:theme"||i.type==="registry:font-variant"||i.type==="registry:base")}function pr(e,t){for(let r of e)if(r?.target&&!rr(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}var st="https://codeload.github.com/createui/templates/tar.gz/main",_={next:"next","next-monorepo":"next-monorepo",vite:"vite",start:"start"};async function $e(e){e={srcDir:false,...e};let t=e.template&&_[e.template]?e.template:"next",r=e.name??(t===_.next||t===_.vite||t===_.start?"my-app":"my-monorepo"),n="latest",i=e.components?.length===1&&!!e.components[0].match(/^https?:\/\//);if(e.components&&i)try{let[c]=await O(e.components),{meta:a}=z.object({meta:z.object({nextVersion:z.string()})}).parse(c);n=a.nextVersion,t=_.next;}catch(c){o.break(),Q(c);}if(!e.force){let{type:c,name:a}=await Le([{type:e.template||i?null:"select",name:"type",message:`The path ${a$1.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 o$1=await a$2(e.cwd,{withFallback:true}),s=`${e.cwd}/${r}`;try{await x.access(e.cwd,x.constants.W_OK);}catch{o.break(),o.error(`The path ${a$1.info(e.cwd)} is not writable.`),o.error(`It is likely you do not have write permissions for this folder or the path ${a$1.info(e.cwd)} does not exist.`),o.break(),process.exit(1);}return x.existsSync(E__default.resolve(e.cwd,r,"package.json"))&&(o.break(),o.error(`A project with the name ${a$1.info(r)} already exists.`),o.error("Please choose a different name and try again."),o.break(),process.exit(1)),t===_.next&&await ri(s,{version:n,cwd:e.cwd,packageManager:o$1,srcDir:!!e.srcDir}),t===_["next-monorepo"]&&await ni(s,{packageManager:o$1}),t===_.vite&&await ii(s,{packageManager:o$1}),t===_.start&&await oi(s,{packageManager:o$1}),{projectPath:s,projectName:r,template:t}}async function ri(e,t){let r=p("Creating a new Next.js project. This may take a few minutes.").start(),n=["--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"))&&n.push("--turbopack"),(t.version.startsWith("latest")||t.version.startsWith("canary"))&&n.push("--no-react-compiler");try{await execa("npx",[`create-next-app@${t.version}`,e,"--silent",...n],{cwd:t.cwd});}catch{o.break(),o.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 ni(e,t){let r=p("Creating a new Next.js monorepo. This may take a few minutes.").start();try{let n=E__default.join(ot.tmpdir(),`createui-template-${Date.now()}`);await x.ensureDir(n);let i=await fetch(st);if(!i.ok)throw new Error(`Failed to download template: ${i.statusText}`);let o=E__default.resolve(n,"template.tar.gz");await x.writeFile(o,Buffer.from(await i.arrayBuffer())),await execa("tar",["-xzf",o,"-C",n,"--strip-components=1","templates-main/monorepo-next"]);let s=E__default.resolve(n,"monorepo-next");await x.move(s,e),await x.remove(n),await execa(t.packageManager,["install"],{cwd:e});let c=E__default.join(e,"package.json");if(x.existsSync(c)){let l=await x.readFile(c,"utf8"),m=JSON.parse(l);m.name=e.split("/").pop(),await x.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(n){r?.fail("Something went wrong creating a new Next.js monorepo."),Q(n);}}async function ii(e,t){let r=p("Creating a new Vite project. This may take a few minutes.").start();try{let n=E__default.join(ot.tmpdir(),`createui-template-${Date.now()}`);await x.ensureDir(n);let i=await fetch(st);if(!i.ok)throw new Error(`Failed to download template: ${i.statusText}`);let o=E__default.resolve(n,"template.tar.gz");await x.writeFile(o,Buffer.from(await i.arrayBuffer())),await execa("tar",["-xzf",o,"-C",n,"--strip-components=1","templates-main/vite-app"]);let s=E__default.resolve(n,"vite-app");if(await x.move(s,e),await x.remove(n),t.packageManager!=="pnpm"){let a=E__default.join(e,"pnpm-lock.yaml");x.existsSync(a)&&await x.remove(a);}await execa(t.packageManager,["install"],{cwd:e});let c=E__default.join(e,"package.json");if(x.existsSync(c)){let a=await x.readFile(c,"utf8"),l=JSON.parse(a);l.name=e.split("/").pop(),await x.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(n){r?.fail("Something went wrong creating a new Vite project."),Q(n);}}async function oi(e,t){let r=p("Creating a new TanStack Start project. This may take a few minutes.").start();try{let n=E__default.join(ot.tmpdir(),`createui-template-${Date.now()}`);await x.ensureDir(n);let i=await fetch(st);if(!i.ok)throw new Error(`Failed to download template: ${i.statusText}`);let o=E__default.resolve(n,"template.tar.gz");await x.writeFile(o,Buffer.from(await i.arrayBuffer())),await execa("tar",["-xzf",o,"-C",n,"--strip-components=1","templates-main/start-app"]);let s=E__default.resolve(n,"start-app");if(await x.move(s,e),await x.remove(n),t.packageManager!=="pnpm"){let a=E__default.join(e,"pnpm-lock.yaml");x.existsSync(a)&&await x.remove(a);}await execa(t.packageManager,["install"],{cwd:e});let c=E__default.join(e,"package.json");if(x.existsSync(c)){let a=await x.readFile(c,"utf8"),l=JSON.parse(a);l.name=e.split("/").pop(),await x.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(n){r?.fail("Something went wrong creating a new TanStack Start project."),Q(n);}}async function L(e=process.cwd()){try{let{config:t}=await import('@dotenvx/dotenvx'),r=[".env.local",".env.development.local",".env.development",".env"];for(let n of r){let i=join(e,n);existsSync(i)&&t({path:i,overload:!1,quiet:!0});}}catch(t){o.warn("Failed to load env files:",t);}}var ye=".bak";function dr(e){if(!x.existsSync(e))return null;let t=`${e}${ye}`;try{return x.renameSync(e,t),t}catch(r){return console.error(`Failed to create backup of ${e}: ${r}`),null}}function ur(e){let t=`${e}${ye}`;if(!x.existsSync(t))return false;try{return x.renameSync(t,e),!0}catch(r){return console.error(`Warning: Could not restore backup file ${t}: ${r}`),false}}function at(e){let t=`${e}${ye}`;if(!x.existsSync(t))return false;try{return x.unlinkSync(t),!0}catch{return false}}var Ae="bradlc.vscode-tailwindcss",ct="tailwindCSS.experimental.configFile",Te="tailwindCSS.classFunctions",lt=["cva","cn","cx","clsx","tv"],_e={insertSpaces:true,tabSize:2};async function hr(e,t){t={silent:false,...t};let r=e.resolvedPaths.cwd,n=e.tailwind.css;if(!r||!n)return {settingsUpdated:false,extensionsUpdated:false};let i=n.split(E__default.sep).join("/"),o$1=E__default.join(r,".vscode"),s=E__default.join(o$1,"settings.json"),c=E__default.join(o$1,"extensions.json"),a=p("Configuring VS Code IntelliSense.",{silent:t.silent}).start();await promises.mkdir(o$1,{recursive:true});let l=await ci(s,i),m=await li(c);return l||m?(a.succeed("Configured VS Code IntelliSense."),t.silent||(l&&o.log(` ${a$1.success("+")} .vscode/settings.json ${a$1.info("(Tailwind IntelliSense)")}`),m&&o.log(` ${a$1.success("+")} .vscode/extensions.json ${a$1.info(`(${Ae})`)}`),o.break())):a.stop(),{settingsUpdated:l,extensionsUpdated:m}}async function ci(e,t){if(!existsSync(e)){let o=JSON.stringify({[ct]:t,[Te]:lt},null,2);return await promises.writeFile(e,`${o}
45
- `,"utf8"),true}let r=await promises.readFile(e,"utf8"),n=false;parse(r)?.[ct]===void 0&&(r=applyEdits(r,modify(r,[ct],t,{formattingOptions:_e})),n=true);let i=parse(r)?.[Te];if(!Array.isArray(i))r=applyEdits(r,modify(r,[Te],lt,{formattingOptions:_e})),n=true;else {let o=i.length;for(let s of lt)i.includes(s)||(r=applyEdits(r,modify(r,[Te,o],s,{isArrayInsertion:true,formattingOptions:_e})),o+=1,n=true);}return n&&await promises.writeFile(e,r,"utf8"),n}async function li(e){if(!existsSync(e)){let o=JSON.stringify({recommendations:[Ae]},null,2);return await promises.writeFile(e,`${o}
46
- `,"utf8"),true}let t=await promises.readFile(e,"utf8"),r=parse(t)??{},n=Array.isArray(r.recommendations)?r.recommendations:[];if(n.includes(Ae))return false;let i=modify(t,["recommendations",n.length],Ae,{isArrayInsertion:true,formattingOptions:_e});return await promises.writeFile(e,applyEdits(t,i),"utf8"),true}process.on("exit",e=>{let t=E__default.resolve(process.cwd(),"components.json");return e===0?at(t):ur(t)});var pt=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?_[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:a.deepPartial().optional()}),yr=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. (${s.join(", ")})`,void 0).option("--font-variant <fontVariant>",`font variant. (${u.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)=>{try{t.defaults&&(t.template=t.template||"next");let r=pt.parse({cwd:E__default.resolve(t.cwd),isNewProject:!1,components:e,...t});if(await L(r.cwd),e.length>0){let n=G(k({resolvedPaths:{cwd:r.cwd}})),i=E__default.resolve(r.cwd,"components.json");if(x.existsSync(i)){let s=await x.readJson(i),c=a.partial().parse(s),a$1=k({resolvedPaths:{cwd:r.cwd}});n=G({...c,resolvedPaths:{...a$1.resolvedPaths,cwd:r.cwd}}),dr(i);}let[o]=await S([e[0]],{config:n});o?.type==="registry:base"&&(o.config&&(n=G(wr(n,o.config)),r.registryBaseConfig=o.config),r.baseStyle=o.extends==="none"?!1:r.baseStyle);}await pe(r),o.log(`${a$1.success("Success!")} Project initialization completed.
47
- You may now add components.`),at(E__default.resolve(r.cwd,"components.json")),o.break();}catch(r){o.break(),Q(r);}});async function pe(e){let t$1,r;if(e.skipPreflight)t$1=await m(e.cwd);else {let w=await tr(e);if(w.errors["1"]){let{projectPath:R,template:S}=await $e(e);R||process.exit(1),e.cwd=R,e.isNewProject=true,r=S,t$1=await m(e.cwd);}else t$1=w.projectInfo;}if(r==="next-monorepo")return e.cwd=E__default.resolve(e.cwd,"apps/web"),await f(e.cwd);let n$1=await n(e.cwd,t$1),i=n$1?await di(n$1,e):await pi(await f(e.cwd)),o=i.config;if(!e.theme&&i.theme&&(e.theme=i.theme),!e.neutral&&i.neutral&&(e.neutral=i.neutral),!e.fontVariant&&i.fontVariant&&(e.fontVariant=i.fontVariant),!e.yes){let{proceed:w}=await Le({type:"confirm",name:"proceed",message:`Write configuration to ${a$1.info("components.json")}. Proceed?`,initial:true});w||process.exit(0);}let s=e.theme??e.baseColor??"indigo",c=e.neutral??t,a=e.fontVariant??v,l=[...e.baseStyle?["index"]:[],...e.baseStyle?[`theme-${s}`]:[],...e.baseStyle?[`neutral-${c}`]:[],...e.baseStyle?[`font-variant-${a}`]:[],...e.components??[]],m$1=p("Writing components.json.").start(),p$1=E__default.resolve(e.cwd,"components.json"),u=`${p$1}${ye}`,h=(w,R)=>wr(w,R);if(!e.force&&x.existsSync(u)){let w=await x.readJson(u);o=h(w,o);}e.registryBaseConfig&&(o=h(o,e.registryBaseConfig)),await promises.writeFile(p$1,`${JSON.stringify(o,null,2)}
48
- `,"utf8"),m$1.succeed();let g$1=await g(e.cwd,o);return await ne(l,g$1,{overwrite:true,silent:e.silent,baseStyle:e.baseStyle,isNewProject:e.isNewProject||t$1?.framework.name==="next-app"}),await hr(g$1,{silent:e.silent}),g$1}async function pi(e$1=null){o.info("");let t$1=await aa(),r$1=await Le([{type:"toggle",name:"typescript",message:`Would you like to use ${a$1.info("TypeScript")} (recommended)?`,initial:e$1?.tsx??true,active:"yes",inactive:"no"},{type:"select",name:"theme",message:`Which ${a$1.info("primary")} color would you like to use?`,choices:q.map(s=>({title:s.label,value:s.name}))},{type:"select",name:"neutral",message:`Which ${a$1.info("neutral")} color would you like to use?`,choices:r.map(s=>({title:s.name===t?`${s.label} (Default)`:s.label,value:s.name}))},{type:"select",name:"fontVariant",message:`Which ${a$1.info("font variant")} would you like to use?`,choices:t$1.map(s=>({title:s.label,value:s.name})),initial:Math.max(0,t$1.findIndex(s=>s.name===v))},{type:"text",name:"tailwindCss",message:`Where is your ${a$1.info("global CSS")} file?`,initial:e$1?.tailwind.css??d},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${a$1.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 ${a$1.info("tailwind prefix eg. tw-")}? (Leave blank if not)`,initial:""},{type:"text",name:"tailwindConfig",message:`Where is your ${a$1.info("tailwind.config.js")} located?`,initial:e$1?.tailwind.config??e},{type:"text",name:"components",message:`Configure the import alias for ${a$1.info("components")}:`,initial:e$1?.aliases.components??b},{type:"text",name:"utils",message:`Configure the import alias for ${a$1.info("utils")}:`,initial:e$1?.aliases.utils??c},{type:"toggle",name:"rsc",message:`Are you using ${a$1.info("React Server Components")}?`,initial:e$1?.rsc??true,active:"yes",inactive:"no"}]),n=r$1.theme??"indigo",i=r$1.neutral??t,o$1=r$1.fontVariant??v;return {config:a.parse({$schema:"https://createui.co/schema.json",tailwind:{config:r$1.tailwindConfig,css:r$1.tailwindCss,baseColor:n,cssVariables:r$1.tailwindCssVariables,prefix:r$1.tailwindPrefix},rsc:r$1.rsc,tsx:r$1.typescript,aliases:{utils:r$1.utils,components:r$1.components,lib:r$1.components.replace(/\/components$/,"lib"),hooks:r$1.components.replace(/\/components$/,"hooks")}}),theme:n,neutral:i,fontVariant:o$1}}async function di(e,t$1){let r$1=e.tailwind.cssVariables,n=e.iconLibrary??"lucide";if(!t$1.defaults){let c=await aa(),a=await Le([{type:t$1.theme?null:"select",name:"theme",message:`Which ${a$1.info("primary")} color would you like to use?`,choices:q.map(l=>({title:l.label,value:l.name})),initial:0},{type:t$1.neutral?null:"select",name:"neutral",message:`Which ${a$1.info("neutral")} color would you like to use?`,choices:r.map(l=>({title:l.name===t?`${l.label} (Default)`:l.label,value:l.name})),initial:0},{type:t$1.fontVariant?null:"select",name:"fontVariant",message:`Which ${a$1.info("font variant")} would you like to use?`,choices:c.map(l=>({title:l.label,value:l.name})),initial:Math.max(0,c.findIndex(l=>l.name===v))}]);t$1.theme=a.theme??t$1.theme??"indigo",t$1.neutral=a.neutral??t$1.neutral??t,t$1.fontVariant=a.fontVariant??t$1.fontVariant??v,r$1=t$1.cssVariables;}let i=t$1.theme??"indigo",o=t$1.neutral??t,s=t$1.fontVariant??v;return {config:a.parse({$schema:e?.$schema,tailwind:{...e?.tailwind,baseColor:i,cssVariables:r$1},rsc:e?.rsc,tsx:e?.tsx,iconLibrary:n,aliases:e?.aliases}),theme:i,neutral:o,fontVariant:s}}async function xr(e){let t={};if(!x.existsSync(e.cwd)||!x.existsSync(E__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!x.existsSync(E__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,config:null};try{let r=await f(e.cwd);return {errors:t,config:r}}catch{o.break(),o.error(`An invalid ${a$1.info("components.json")} file was found at ${a$1.info(e.cwd)}.
49
- Before you can add components, you must create a valid ${a$1.info("components.json")} file by running the ${a$1.info("init")} command.`),o.error(`Learn more at ${a$1.info("https://createui.co/docs/components-json")}.`),o.break(),process.exit(1);}}async function vr(e,t){let r=E__default.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await J__default.stat(r)).isFile())return;let[n]=await S([e],{config:t});if(!n?.meta?.importSpecifier||!n?.meta?.moduleSpecifier)return;let i=`import { ${n?.meta?.importSpecifier} } from "${n.meta.moduleSpecifier}"
38
+ `);let c=await pt([{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);}n?.start(),await Ii(o$1,e,t,r.resolvedPaths.cwd,s),n?.succeed();}function vi(e){let t=l(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 Ri(e){return l(e.resolvedPaths.cwd,false)?.dependencies?.expo?"expo":a$2(e.resolvedPaths.cwd)}async function Ii(e,t,r,i,n){if(e==="npm")return ki(t,r,i,n);if(e==="deno")return Ci(t,r,i);if(e==="expo")return Pi(t,r,i);if(t?.length)try{await execa(e,["add",...t],{cwd:i});}catch{await je(e,"add",t,i);}if(r?.length)try{await execa(e,["add","-D",...r],{cwd:i});}catch{await je(e,"add -D",r,i);}}async function ki(e,t,r,i){let n=i?[`--${i}`]:[];if(e.length)try{await execa("npm",["install",...n,...e],{cwd:r});}catch{await je("npm",`install${n.length?` ${n.join(" ")}`:""}`,e,r);}if(t.length)try{await execa("npm",["install",...n,"-D",...t],{cwd:r});}catch{await je("npm",`install${n.length?` ${n.join(" ")}`:""} -D`,t,r);}}async function je(e,t,r,i){let n=[];for(let o of r)try{await execa(e,[...t.split(" "),o],{cwd:i});}catch{n.push(o);}n.length>0&&o.warn(`
39
+ Failed to install: ${n.join(", ")}. You may need to install them manually.
40
+ `);}async function Ci(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 Pi(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 rt(e,t,r){if(!e||Object.keys(e).length===0)return {envVarsAdded:[],envFileUpdated:null,envFileCreated:null};r={silent:false,...r};let i=p("Adding environment variables.",{silent:r.silent})?.start(),n=t.resolvedPaths.cwd,o$1=E__default.join(n,".env.local"),s=x$1(n);s&&(o$1=s);let c=existsSync(o$1),a=E__default.basename(o$1),l=Object.entries(e).map(([h,g])=>`${h}=${g}`).join(`
41
+ `),m=[],p$1=null,u=null;if(c){let h=await promises.readFile(o$1,"utf-8"),g=z$1(h,l);if(m=y(h,l),m.length>0){if(await promises.writeFile(o$1,g,"utf-8"),p$1=E__default.relative(n,o$1),i?.succeed(`Added the following variables to ${a$1.info(a)}:`),!r.silent)for(let y of m)o.log(` ${a$1.success("+")} ${y}`);}else i?.stop();}else if(await promises.writeFile(o$1,l+`
42
+ `,"utf-8"),u=E__default.relative(n,o$1),m=Object.keys(e),i?.succeed(`Added the following variables to ${a$1.info(a)}:`),!r.silent)for(let h of m)o.log(` ${a$1.success("+")} ${h}`);return !r.silent&&m.length>0&&o.break(),{envVarsAdded:m,envFileUpdated:p$1,envFileCreated:u}}async function mr(e,t){if(!e.fonts?.length)return e;let r=await m(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 n of e.fonts)e.cssVars.font.light[n.role]=`var(${n.font.variable})`;return e}let i=new Set;for(let n of e.fonts){let o=Fi(n.font);o&&!i.has(o)&&(i.add(o),e.dependencies??=[],e.dependencies.push(o),e.css??={},e.css[`@import "${o}"`]={}),e.cssVars.font.light[n.role]=n.font.family;}return e}function Fi(e){if(e.provider!=="google"||!e.import)return null;let t=e.import.toLowerCase().replace(/_/g,"-");return /variable/i.test(e.family)?`@fontsource-variable/${t}`:`@fontsource/${t}`}async function it(e,t,r){if(!e?.length)return;let i=await m(t.resolvedPaths.cwd);if(!i||i.framework.name!=="next-app"&&i.framework.name!=="next-pages")return;let n=p("Updating fonts.",{silent:r.silent})?.start();try{await Ai(e,t,i),n?.succeed("Updating fonts.");}catch(o){throw n?.fail("Failed to update fonts."),o}}async function Ai(e,t,r){let i=await _i(t,r);if(!i)return;let n=await promises.readFile(i,"utf-8"),o=await Di(n,e);o!==n&&await promises.writeFile(i,o,"utf-8");}async function _i(e,t){let r=e.resolvedPaths.cwd,i=t.isSrcDir,o=t.isTsx?"tsx":"jsx",s=i?[`src/app/layout.${o}`,`app/layout.${o}`]:[`app/layout.${o}`];for(let c of s){let a=E__default.join(r,c);if(existsSync(a))return a}return null}async function Di(e,t,r){let n=new Project({compilerOptions:{}}).createSourceFile("layout.tsx",e,{scriptKind:ScriptKind.TSX}),o=t.filter(a=>a.font.provider==="google"),s=[];for(let a of o){let l=a.font.import;if(!l)continue;let m=a.font.variable.replace(/^--/,"").replace(/-([a-z])/g,(g,y)=>y.toUpperCase()),p=n.getImportDeclaration(g=>g.getModuleSpecifierValue()==="next/font/google"),u=Vi(a);p?p.getNamedImports().some(R=>R.getName()===l)||p.addNamedImport(l):n.addImportDeclaration({moduleSpecifier:"next/font/google",namedImports:[l]});let h=Li(n,a.font.variable);if(h)h.setInitializer(`${l}(${u})`),h.getName()!==m&&h.rename(m);else {let g=Mi(n);n.insertVariableStatement(g,{declarationKind:VariableDeclarationKind.Const,declarations:[{name:m,initializer:`${l}(${u})`}]}).appendWhitespace(`
43
+ `);}s.push(m);}let c=new Set(o.map(a=>a.font.variable));return Ui(n,c),Bi(n),s.length>0&&Wi(n,s),Gi(n),n.getFullText()}function Vi(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 Li(e,t){let r=e.getVariableStatements();for(let i of r)for(let n of i.getDeclarations()){let o=n.getInitializer();if(!o||o.getKind()!==SyntaxKind.CallExpression)continue;let c=o.getArguments();if(c.length===0)continue;let a=c[0].getText();if(a.includes("variable:")&&a.includes(t))return n}return null}function Mi(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function Wi(e,t){let r=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement);for(let i of r){if(i.getTagNameNode().getText()!=="html")continue;let o=i.getAttribute("className");if(!o){let l=t.map(m=>`${m}.variable`).join(", ");t.length===1?i.addAttribute({name:"className",initializer:`{${l}}`}):(we(e),i.addAttribute({name:"className",initializer:`{cn(${l})}`}));return}if(o.getKind()!==SyntaxKind.JsxAttribute)return;let s=o.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);we(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(y=>p.includes(y)))continue;let h=Ji(p),g=Ki(h,a);l.replaceWithText(`{${g}}`);}else if(/^\w+\.variable$/.test(p)){if(a.includes(p))continue;a.length===1?l.replaceWithText(`{${a[0]}}`):(we(e),l.replaceWithText(`{cn(${a.join(", ")})}`));}else if(p.startsWith("`")&&p.endsWith("`")){let u=zi(p).filter(h=>!/^\w+\.variable$/.test(h));we(e),l.replaceWithText(`{cn(${[...u,...a].join(", ")})}`);}else we(e),l.replaceWithText(`{cn(${p}, ${a.join(", ")})}`);}}}function we(e){if(!e.getImportDeclaration(r=>r.getNamedImports().some(n=>n.getName()==="cn"))){let r=e.getImportDeclaration(i=>i.getModuleSpecifierValue().includes("/lib/utils"));r?r.getNamedImports().some(n=>n.getName()==="cn")||r.addNamedImport("cn"):e.addImportDeclaration({moduleSpecifier:"@/lib/utils",namedImports:["cn"]});}}function zi(e){let t=[],r=[],n=e.slice(1,-1).split(/(\$\{[^}]+\})/);for(let o of n)if(o)if(o.startsWith("${")&&o.endsWith("}")){let s=o.slice(2,-1).trim();s&&r.push(s);}else {let s=o.trim().split(/\s+/).filter(Boolean);for(let c of s)t.push(`"${c}"`);}return [...t,...r]}function Ui(e,t){let r=[];for(let i of e.getVariableStatements())for(let n of i.getDeclarations()){let o=n.getInitializer();if(!o||o.getKind()!==SyntaxKind.CallExpression)continue;let c=o.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 Bi(e){let t=e.getImportDeclaration(n=>n.getModuleSpecifierValue()==="next/font/google");if(!t)return;let r=t.getNamedImports(),i=e.getFullText();for(let n of r){let o=n.getName(),s=t.getText(),c=i.replace(s,"");new RegExp(`\\b${o}\\b`).test(c)||n.remove();}t.getNamedImports().length===0&&t.remove();}function Gi(e,t){let r=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement);for(let i of r){if(i.getTagNameNode().getText()!=="body")continue;let o=i.getAttribute("className");if(!o||o.getKind()!==SyntaxKind.JsxAttribute)continue;let s=o.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),u=[],h=p.split(/(\$\{[^}]+\})/);for(let g of h){if(!g||g.startsWith("${")&&g.endsWith("}"))continue;let y=g.trim().split(/\s+/).filter(Boolean);u.push(...y);}u.length>0?s.setInitializer(`"${u.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 u=p.match(/^cn\((.+)\)$/);if(u){let h=u[1].split(",").map(g=>g.trim()).filter(Boolean);h.length===0?s.remove():h.length===1&&h[0].startsWith('"')?s.setInitializer(h[0]):a.replaceWithText(`{${p}}`);}}}}}function Ji(e){return e.replace(/,?\s*\w+\.variable/g,"").replace(/cn\(\s*,/,"cn(")}function Ki(e,t){let r=t.join(", ");return e.replace(/\)$/,`, ${r})`)}async function nt(e,t,r){}async function ie(e,t,r){r={overwrite:false,silent:false,isNewProject:false,baseStyle:true,...r};let i=await h(t);return i&&i.ui&&i.ui.resolvedPaths.cwd!==t.resolvedPaths.cwd?await Hi(e,t,i,{...r,isRemote:e?.length===1&&!!e[0].match(/^https?:\/\//)}):await qi(e,t,r)}async function qi(e,t,r){if(!r.baseStyle&&!e.length)return;let i=p("Checking registry.",{silent:r.silent})?.start(),n=await P(e,G(t));if(!n)return i?.fail(),Q(new Error("Failed to fetch components from registry."));try{pr(n.files??[],t.resolvedPaths.cwd);}catch(s){return i?.fail(),Q(s)}i?.succeed(),n=await mr(n,t),await nt(n.tailwind?.config,t,{silent:r.silent});let o$1=await fr(e,t);await Ze(n.cssVars,t,{cleanupDefaultNextStyles:r.isNewProject,silent:r.silent,tailwindConfig:n.tailwind?.config,overwriteCssVars:o$1,initIndex:r.baseStyle}),await Qe(n.css,t,{silent:r.silent}),await rt(n.envVars,t,{silent:r.silent}),await it(n.fonts,t,{silent:r.silent}),await C(n.files,t,{overwrite:r.overwrite,silent:r.silent,path:r.path}),await V(n.dependencies,n.devDependencies,t,{silent:r.silent}),n.docs&&o.info(n.docs);}async function Hi(e,t,r,i$1){if(!i$1.baseStyle&&!e.length)return;let n=p("Checking registry.",{silent:i$1.silent})?.start(),o$1=await P(e,G(t));if(!o$1)return n?.fail(),Q(new Error("Failed to fetch components from registry."));try{pr(o$1.files??[],t.resolvedPaths.cwd);}catch(g){return n?.fail(),Q(g)}n?.succeed();let s=[],c=[],a=[],l=p("Installing components.")?.start(),m=r.ui,p$1=j(t.resolvedPaths.cwd,m.resolvedPaths.ui);if(o$1.tailwind?.config&&(await nt(o$1.tailwind?.config),c.push(E__default.relative(p$1,m.resolvedPaths.tailwindConfig))),o$1.cssVars){let g=await fr(e,t);await Ze(o$1.cssVars,m,{silent:true,tailwindConfig:o$1.tailwind?.config,overwriteCssVars:g}),c.push(E__default.relative(p$1,m.resolvedPaths.tailwindCss));}o$1.css&&(await Qe(o$1.css,m,{silent:true}),c.push(E__default.relative(p$1,m.resolvedPaths.tailwindCss))),o$1.envVars&&await rt(o$1.envVars,m,{silent:true}),await it(o$1.fonts,m,{silent:true}),await V(o$1.dependencies,o$1.devDependencies,m,{silent:true});let u=new Map;for(let g of o$1.files??[]){let y=g.type||"registry:ui";u.has(y)||u.set(y,[]),u.get(y).push(g);}for(let g of Array.from(u.keys())){let y=u.get(g),R=g==="registry:ui"?r.ui:t,S=j(t.resolvedPaths.cwd,R.resolvedPaths.ui||R.resolvedPaths.cwd),H=await i(S,R.resolvedPaths.cwd)??R.resolvedPaths.cwd,F=await C(y,R,{overwrite:i$1.overwrite,silent:true,rootSpinner:l,isRemote:i$1.isRemote,isWorkspace:true,path:i$1.path});s.push(...F.filesCreated.map(W=>E__default.relative(S,E__default.join(H,W)))),c.push(...F.filesUpdated.map(W=>E__default.relative(S,E__default.join(H,W)))),a.push(...F.filesSkipped.map(W=>E__default.relative(S,E__default.join(H,W))));}if(l?.succeed(),s.sort(),c.sort(),a.sort(),!(s.length||c.length)&&!a.length&&p("No files updated.",{silent:i$1.silent})?.info(),s.length){p(`Created ${s.length} ${s.length===1?"file":"files"}:`,{silent:i$1.silent})?.succeed();for(let g of s)o.log(` - ${g}`);}if(c.length){p(`Updated ${c.length} ${c.length===1?"file":"files"}:`,{silent:i$1.silent})?.info();for(let g of c)o.log(` - ${g}`);}if(a.length){p(`Skipped ${a.length} ${c.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:i$1.silent})?.info();for(let g of a)o.log(` - ${g}`);}o$1.docs&&o.info(o$1.docs);}async function fr(e,t){let r=await S(e,{config:t});return z.array(n$1).parse(r).some(n=>n.type==="registry:theme"||n.type==="registry:font-variant"||n.type==="registry:base")}function pr(e,t){for(let r of e)if(r?.target&&!rr(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}var at="https://codeload.github.com/createui/templates/tar.gz/main",_={next:"next","next-monorepo":"next-monorepo",vite:"vite",start:"start"};async function $e(e){e={srcDir:false,...e};let t=e.template&&_[e.template]?e.template:"next",r=e.name??(t===_.next||t===_.vite||t===_.start?"my-app":"my-monorepo"),i="latest",n=e.components?.length===1&&!!e.components[0].match(/^https?:\/\//);if(e.components&&n)try{let[c]=await O(e.components),{meta:a}=z.object({meta:z.object({nextVersion:z.string()})}).parse(c);i=a.nextVersion,t=_.next;}catch(c){o.break(),Q(c);}if(!e.force){let{type:c,name:a}=await pt([{type:e.template||n?null:"select",name:"type",message:`The path ${a$1.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 o$1=await a$2(e.cwd,{withFallback:true}),s=`${e.cwd}/${r}`;try{await x.access(e.cwd,x.constants.W_OK);}catch{o.break(),o.error(`The path ${a$1.info(e.cwd)} is not writable.`),o.error(`It is likely you do not have write permissions for this folder or the path ${a$1.info(e.cwd)} does not exist.`),o.break(),process.exit(1);}return x.existsSync(E__default.resolve(e.cwd,r,"package.json"))&&(o.break(),o.error(`A project with the name ${a$1.info(r)} already exists.`),o.error("Please choose a different name and try again."),o.break(),process.exit(1)),t===_.next&&await Qi(s,{version:i,cwd:e.cwd,packageManager:o$1,srcDir:!!e.srcDir}),t===_["next-monorepo"]&&await Zi(s,{packageManager:o$1}),t===_.vite&&await en(s,{packageManager:o$1}),t===_.start&&await tn(s,{packageManager:o$1}),{projectPath:s,projectName:r,template:t}}async function Qi(e,t){let r=p("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{o.break(),o.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 Zi(e,t){let r=p("Creating a new Next.js monorepo. This may take a few minutes.").start();try{let i=E__default.join(st.tmpdir(),`createui-template-${Date.now()}`);await x.ensureDir(i);let n=await fetch(at);if(!n.ok)throw new Error(`Failed to download template: ${n.statusText}`);let o=E__default.resolve(i,"template.tar.gz");await x.writeFile(o,Buffer.from(await n.arrayBuffer())),await execa("tar",["-xzf",o,"-C",i,"--strip-components=1","templates-main/monorepo-next"]);let s=E__default.resolve(i,"monorepo-next");await x.move(s,e),await x.remove(i),await execa(t.packageManager,["install"],{cwd:e});let c=E__default.join(e,"package.json");if(x.existsSync(c)){let l=await x.readFile(c,"utf8"),m=JSON.parse(l);m.name=e.split("/").pop(),await x.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."),Q(i);}}async function en(e,t){let r=p("Creating a new Vite project. This may take a few minutes.").start();try{let i=E__default.join(st.tmpdir(),`createui-template-${Date.now()}`);await x.ensureDir(i);let n=await fetch(at);if(!n.ok)throw new Error(`Failed to download template: ${n.statusText}`);let o=E__default.resolve(i,"template.tar.gz");await x.writeFile(o,Buffer.from(await n.arrayBuffer())),await execa("tar",["-xzf",o,"-C",i,"--strip-components=1","templates-main/vite-app"]);let s=E__default.resolve(i,"vite-app");if(await x.move(s,e),await x.remove(i),t.packageManager!=="pnpm"){let a=E__default.join(e,"pnpm-lock.yaml");x.existsSync(a)&&await x.remove(a);}await execa(t.packageManager,["install"],{cwd:e});let c=E__default.join(e,"package.json");if(x.existsSync(c)){let a=await x.readFile(c,"utf8"),l=JSON.parse(a);l.name=e.split("/").pop(),await x.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."),Q(i);}}async function tn(e,t){let r=p("Creating a new TanStack Start project. This may take a few minutes.").start();try{let i=E__default.join(st.tmpdir(),`createui-template-${Date.now()}`);await x.ensureDir(i);let n=await fetch(at);if(!n.ok)throw new Error(`Failed to download template: ${n.statusText}`);let o=E__default.resolve(i,"template.tar.gz");await x.writeFile(o,Buffer.from(await n.arrayBuffer())),await execa("tar",["-xzf",o,"-C",i,"--strip-components=1","templates-main/start-app"]);let s=E__default.resolve(i,"start-app");if(await x.move(s,e),await x.remove(i),t.packageManager!=="pnpm"){let a=E__default.join(e,"pnpm-lock.yaml");x.existsSync(a)&&await x.remove(a);}await execa(t.packageManager,["install"],{cwd:e});let c=E__default.join(e,"package.json");if(x.existsSync(c)){let a=await x.readFile(c,"utf8"),l=JSON.parse(a);l.name=e.split("/").pop(),await x.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."),Q(i);}}async function L(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 n=join(e,i);existsSync(n)&&t({path:n,overload:!1,quiet:!0});}}catch(t){o.warn("Failed to load env files:",t);}}var ye=".bak";function dr(e){if(!x.existsSync(e))return null;let t=`${e}${ye}`;try{return x.renameSync(e,t),t}catch(r){return console.error(`Failed to create backup of ${e}: ${r}`),null}}function ur(e){let t=`${e}${ye}`;if(!x.existsSync(t))return false;try{return x.renameSync(t,e),!0}catch(r){return console.error(`Warning: Could not restore backup file ${t}: ${r}`),false}}function ct(e){let t=`${e}${ye}`;if(!x.existsSync(t))return false;try{return x.unlinkSync(t),!0}catch{return false}}var Ae="bradlc.vscode-tailwindcss",lt="tailwindCSS.experimental.configFile",Te="tailwindCSS.classFunctions",mt=["cva","cn","cx","clsx","tv"],_e={insertSpaces:true,tabSize:2};async function hr(e,t){t={silent:false,...t};let r=e.resolvedPaths.cwd,i=e.tailwind.css;if(!r||!i)return {settingsUpdated:false,extensionsUpdated:false};let n=i.split(E__default.sep).join("/"),o$1=E__default.join(r,".vscode"),s=E__default.join(o$1,"settings.json"),c=E__default.join(o$1,"extensions.json"),a=p("Configuring VS Code IntelliSense.",{silent:t.silent}).start();await promises.mkdir(o$1,{recursive:true});let l=await on(s,n),m=await sn(c);return l||m?(a.succeed("Configured VS Code IntelliSense."),t.silent||(l&&o.log(` ${a$1.success("+")} .vscode/settings.json ${a$1.info("(Tailwind IntelliSense)")}`),m&&o.log(` ${a$1.success("+")} .vscode/extensions.json ${a$1.info(`(${Ae})`)}`),o.break())):a.stop(),{settingsUpdated:l,extensionsUpdated:m}}async function on(e,t){if(!existsSync(e)){let o=JSON.stringify({[lt]:t,[Te]:mt},null,2);return await promises.writeFile(e,`${o}
45
+ `,"utf8"),true}let r=await promises.readFile(e,"utf8"),i=false;parse(r)?.[lt]===void 0&&(r=applyEdits(r,modify(r,[lt],t,{formattingOptions:_e})),i=true);let n=parse(r)?.[Te];if(!Array.isArray(n))r=applyEdits(r,modify(r,[Te],mt,{formattingOptions:_e})),i=true;else {let o=n.length;for(let s of mt)n.includes(s)||(r=applyEdits(r,modify(r,[Te,o],s,{isArrayInsertion:true,formattingOptions:_e})),o+=1,i=true);}return i&&await promises.writeFile(e,r,"utf8"),i}async function sn(e){if(!existsSync(e)){let o=JSON.stringify({recommendations:[Ae]},null,2);return await promises.writeFile(e,`${o}
46
+ `,"utf8"),true}let t=await promises.readFile(e,"utf8"),r=parse(t)??{},i=Array.isArray(r.recommendations)?r.recommendations:[];if(i.includes(Ae))return false;let n=modify(t,["recommendations",i.length],Ae,{isArrayInsertion:true,formattingOptions:_e});return await promises.writeFile(e,applyEdits(t,n),"utf8"),true}process.on("exit",e=>{let t=E__default.resolve(process.cwd(),"components.json");return e===0?ct(t):ur(t)});var Ve=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?_[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:a.deepPartial().optional()}),yr=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. (${s.join(", ")})`,void 0).option("--font-variant <fontVariant>",`font variant. (${u.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)=>{try{t.defaults&&(t.template=t.template||"next");let r=Ve.parse({cwd:E__default.resolve(t.cwd),isNewProject:!1,components:e,...t});if(await L(r.cwd),e.length>0){let i=G(k({resolvedPaths:{cwd:r.cwd}})),n=E__default.resolve(r.cwd,"components.json");if(x.existsSync(n)){let s=await x.readJson(n),c=a.partial().parse(s),a$1=k({resolvedPaths:{cwd:r.cwd}});i=G({...c,resolvedPaths:{...a$1.resolvedPaths,cwd:r.cwd}}),dr(n);}let[o]=await S([e[0]],{config:i});o?.type==="registry:base"&&(o.config&&(i=G(wr(i,o.config)),r.registryBaseConfig=o.config),r.baseStyle=o.extends==="none"?!1:r.baseStyle);}await pe(r),o.log(`${a$1.success("Success!")} Project initialization completed.
47
+ You may now add components.`),ct(E__default.resolve(r.cwd,"components.json")),o.break();}catch(r){o.break(),Q(r);}});async function pe(e){let t$1,r;if(e.skipPreflight)t$1=await m(e.cwd);else {let y=await tr(e);if(y.errors["1"]){let{projectPath:R,template:S}=await $e(e);R||process.exit(1),e.cwd=R,e.isNewProject=true,r=S,t$1=await m(e.cwd);}else t$1=y.projectInfo;}if(r==="next-monorepo")return e.cwd=E__default.resolve(e.cwd,"apps/web"),await f(e.cwd);let i=await n(e.cwd,t$1),n$1=i?await mn(i,e):await ln(await f(e.cwd)),o=n$1.config;if(!e.theme&&n$1.theme&&(e.theme=n$1.theme),!e.neutral&&n$1.neutral&&(e.neutral=n$1.neutral),!e.fontVariant&&n$1.fontVariant&&(e.fontVariant=n$1.fontVariant),!e.yes){let{proceed:y}=await pt({type:"confirm",name:"proceed",message:`Write configuration to ${a$1.info("components.json")}. Proceed?`,initial:true});y||process.exit(0);}let s=e.theme??e.baseColor??"indigo",c=e.neutral??t,a=e.fontVariant??v,l=[...e.baseStyle?["index"]:[],...e.baseStyle?[`theme-${s}`]:[],...e.baseStyle?[`neutral-${c}`]:[],...e.baseStyle?[`font-variant-${a}`]:[],...e.components??[]],m$1=p("Writing components.json.").start(),p$1=E__default.resolve(e.cwd,"components.json"),u=`${p$1}${ye}`,h=(y,R)=>wr(y,R);if(!e.force&&x.existsSync(u)){let y=await x.readJson(u);o=h(y,o);}e.registryBaseConfig&&(o=h(o,e.registryBaseConfig)),await promises.writeFile(p$1,`${JSON.stringify(o,null,2)}
48
+ `,"utf8"),m$1.succeed();let g$1=await g(e.cwd,o);return await ie(l,g$1,{overwrite:true,silent:e.silent,baseStyle:e.baseStyle,isNewProject:e.isNewProject||t$1?.framework.name==="next-app"}),await hr(g$1,{silent:e.silent}),g$1}async function ln(e$1=null){o.info("");let t$1=await aa(),r$1=await pt([{type:"toggle",name:"typescript",message:`Would you like to use ${a$1.info("TypeScript")} (recommended)?`,initial:e$1?.tsx??true,active:"yes",inactive:"no"},{type:"select",name:"theme",message:`Which ${a$1.info("primary")} color would you like to use?`,choices:q.map(s=>({title:s.label,value:s.name}))},{type:"select",name:"neutral",message:`Which ${a$1.info("neutral")} color would you like to use?`,choices:r.map(s=>({title:s.name===t?`${s.label} (Default)`:s.label,value:s.name}))},{type:"select",name:"fontVariant",message:`Which ${a$1.info("font variant")} would you like to use?`,choices:t$1.map(s=>({title:s.label,value:s.name})),initial:Math.max(0,t$1.findIndex(s=>s.name===v))},{type:"text",name:"tailwindCss",message:`Where is your ${a$1.info("global CSS")} file?`,initial:e$1?.tailwind.css??d},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${a$1.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 ${a$1.info("tailwind prefix eg. tw-")}? (Leave blank if not)`,initial:""},{type:"text",name:"tailwindConfig",message:`Where is your ${a$1.info("tailwind.config.js")} located?`,initial:e$1?.tailwind.config??e},{type:"text",name:"components",message:`Configure the import alias for ${a$1.info("components")}:`,initial:e$1?.aliases.components??b},{type:"text",name:"utils",message:`Configure the import alias for ${a$1.info("utils")}:`,initial:e$1?.aliases.utils??c},{type:"toggle",name:"rsc",message:`Are you using ${a$1.info("React Server Components")}?`,initial:e$1?.rsc??true,active:"yes",inactive:"no"}]),i=r$1.theme??"indigo",n=r$1.neutral??t,o$1=r$1.fontVariant??v;return {config:a.parse({$schema:"https://createui.co/schema.json",tailwind:{config:r$1.tailwindConfig,css:r$1.tailwindCss,baseColor:i,cssVariables:r$1.tailwindCssVariables,prefix:r$1.tailwindPrefix},rsc:r$1.rsc,tsx:r$1.typescript,aliases:{utils:r$1.utils,components:r$1.components,lib:r$1.components.replace(/\/components$/,"lib"),hooks:r$1.components.replace(/\/components$/,"hooks")}}),theme:i,neutral:n,fontVariant:o$1}}async function mn(e,t$1){let r$1=e.tailwind.cssVariables,i=e.iconLibrary??"lucide";if(!t$1.defaults){let c=await aa(),a=await pt([{type:t$1.theme?null:"select",name:"theme",message:`Which ${a$1.info("primary")} color would you like to use?`,choices:q.map(l=>({title:l.label,value:l.name})),initial:0},{type:t$1.neutral?null:"select",name:"neutral",message:`Which ${a$1.info("neutral")} color would you like to use?`,choices:r.map(l=>({title:l.name===t?`${l.label} (Default)`:l.label,value:l.name})),initial:0},{type:t$1.fontVariant?null:"select",name:"fontVariant",message:`Which ${a$1.info("font variant")} would you like to use?`,choices:c.map(l=>({title:l.label,value:l.name})),initial:Math.max(0,c.findIndex(l=>l.name===v))}]);t$1.theme=a.theme??t$1.theme??"indigo",t$1.neutral=a.neutral??t$1.neutral??t,t$1.fontVariant=a.fontVariant??t$1.fontVariant??v,r$1=t$1.cssVariables;}let n=t$1.theme??"indigo",o=t$1.neutral??t,s=t$1.fontVariant??v;return {config:a.parse({$schema:e?.$schema,tailwind:{...e?.tailwind,baseColor:n,cssVariables:r$1},rsc:e?.rsc,tsx:e?.tsx,iconLibrary:i,aliases:e?.aliases}),theme:n,neutral:o,fontVariant:s}}async function xr(e){let t={};if(!x.existsSync(e.cwd)||!x.existsSync(E__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!x.existsSync(E__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,config:null};try{let r=await f(e.cwd);return {errors:t,config:r}}catch{o.break(),o.error(`An invalid ${a$1.info("components.json")} file was found at ${a$1.info(e.cwd)}.
49
+ Before you can add components, you must create a valid ${a$1.info("components.json")} file by running the ${a$1.info("init")} command.`),o.error(`Learn more at ${a$1.info("https://createui.co/docs/components-json")}.`),o.break(),process.exit(1);}}async function vr(e,t){let r=E__default.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await J__default.stat(r)).isFile())return;let[i]=await S([e],{config:t});if(!i?.meta?.importSpecifier||!i?.meta?.moduleSpecifier)return;let n=`import { ${i?.meta?.importSpecifier} } from "${i.meta.moduleSpecifier}"
50
50
 
51
51
  export default function Page() {
52
- return <${n?.meta?.importSpecifier} />
53
- }`;await J__default.writeFile(r,i,"utf8");}var hi=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)=>{try{let r=hi.parse({components:e,cwd:E__default.resolve(t.cwd),...t});await L(r.cwd);let n=await f(r.cwd);n||(n=k({resolvedPaths:{cwd:r.cwd}}));let i,o$1=!0;if(e.length>0){let[p]=await S([e[0]],{config:n});if(i=p?.type,o$1=i!=="registry:theme",F(p)){await ne(e,n,{...r,baseStyle:o$1});return}if(!r.yes&&i==="registry:theme"){o.break();let{confirm:u}=await Le({type:"confirm",name:"confirm",message:a$1.warn(`You are about to install a new ${i.replace("registry:","")}.
54
- Existing CSS variables and components will be overwritten. Continue?`)});u||(o.break(),o.log("Installation cancelled."),o.break(),process.exit(1));}}r.components?.length||(r.components=await wi(r));let s=w.filter(p=>r.components?.includes(p.name));s?.length&&(o.break(),s.forEach(p=>{o.warn(a$1.warn(p.message));}),o.break(),process.exit(1));let{errors:c,config:a}=await xr(r),l=!1;if(c["3"]){let{proceed:p}=await Le({type:"confirm",name:"proceed",message:`You need to create a ${a$1.info("components.json")} file to add components. Proceed?`,initial:!0});p||(o.break(),process.exit(1)),a=await pe({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:r.silent,isNewProject:!1,srcDir:r.srcDir,cssVariables:r.cssVariables,baseStyle:o$1,components:r.components}),l=!0;}let m=!1;if(c["1"]){let{projectPath:p,template:u}=await $e({cwd:r.cwd,force:r.overwrite,srcDir:r.srcDir,components:r.components});p||(o.break(),process.exit(1)),r.cwd=p,u==="next-monorepo"?(r.cwd=E__default.resolve(r.cwd,"apps/web"),a=await f(r.cwd)):(a=await pe({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:r.silent,isNewProject:!0,srcDir:r.srcDir,cssVariables:r.cssVariables,baseStyle:o$1,components:r.components}),l=!0,m=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//));}if(!a)throw new Error(`Failed to read config at ${a$1.info(r.cwd)}.`);l||await ne(r.components,a,{...r,baseStyle:o$1}),m&&await vr(r.components[0],a);}catch(r){o.break(),Q(r);}});async function wi(e){let t=await U();if(!t)return o.break(),Q(new Error("Failed to fetch registry index.")),[];if(e.all)return t.map(i=>i.name).filter(i=>!w.some(o=>o.name===i));if(e.components?.length)return e.components;let{components:r}=await Le({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(i=>i.type==="registry:ui"&&!w.some(o=>o.name===i.name)).map(i=>({title:i.name,value:i.name,selected:e.all?true:e.components?.includes(i.name)}))});r?.length||(o.warn("No components selected. Exiting."),o.info(""),process.exit(1));let n=z.array(z.string()).safeParse(r);return n.success?n.data:(o.error(""),Q(new Error("Something went wrong. Please try again.")),[])}async function Pr(e){let t={},r={cwd:e.cwd,registryFile:E__default.resolve(e.cwd,e.registryFile),outputDir:E__default.resolve(e.cwd,e.outputDir)};return x.existsSync(r.registryFile)||(t["13"]=true),await x.mkdir(r.outputDir,{recursive:true}),Object.keys(t).length>0&&(t["13"]&&(o.break(),o.error(`The path ${a$1.info(r.registryFile)} does not exist.`)),o.break(),process.exit(1)),{errors:t,resolvePaths:r}}var bi=z.object({cwd:z.string(),registryFile:z.string(),outputDir:z.string()}),jr=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=bi.parse({cwd:E.resolve(t.cwd),registryFile:e,outputDir:t.output}),{resolvePaths:n}=await Pr(r),i=await J.readFile(n.registryFile,"utf-8"),o$2=o$1.safeParse(JSON.parse(i));o$2.success||(o.error(`Invalid registry file found at ${a$1.info(n.registryFile)}.`),process.exit(1));let s=p("Building registry...");for(let c of o$2.data.items){s.start(`Building ${c.name}...`),c.$schema="https://createui.co/schema/registry-item.json";for(let l of c.files??[])l.content=await J.readFile(E.resolve(n.cwd,l.path),"utf-8");let a=n$1.safeParse(c);if(!a.success){o.error(`Invalid registry item found for ${a$1.info(c.name)}.`);continue}await J.writeFile(E.resolve(n.outputDir,`${a.data.name}.json`),JSON.stringify(a.data,null,2));}await J.copyFile(n.registryFile,E.resolve(n.outputDir,"registry.json")),s.succeed("Building registry.");}catch(r){o.break(),Q(r);}});var $r="https://createui.co",vi={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 h=Tr();o.log("Build your own createui."),o.log(`You will be taken to ${a$1.info(h)} to build your custom design system.`),o.break();let{proceed:g}=await Le({type:"confirm",name:"proceed",message:"Open in browser?",initial:!0});g&&await Er(h),process.exit(0);}let n=e;if(!n){let{enteredName:h}=await Le({type:"text",name:"enteredName",message:"What is your project named?",initial:t.template?`${t.template}-app`:"my-app",format:g=>g.trim(),validate:g=>Si(E__default.basename(E__default.resolve(g))).validForNewPackages?!0:"Invalid project name. Name should be lowercase, URL-friendly, and not start with a period or underscore."});h||process.exit(0),n=h;}let i=t.template;if(!i){let{selectedTemplate:h}=await Le({type:"select",name:"selectedTemplate",message:`Which ${a$1.info("template")} would you like to use?`,choices:Object.entries(vi).map(([g,w])=>({title:w,value:g}))});h||process.exit(0),i=h;}let o$1=await Ii(t.preset??!0);o$1||process.exit(0);let s,c;"_isUrl"in o$1?(s=o$1.url,c=new URL(o$1.url).searchParams.get("theme")??"indigo"):(s=Ri(o$1),c=o$1.theme);let a=G({}),[l]=await S([s],{config:a}),m;l?.type==="registry:base"&&l.config&&(m=l.config);let p=pt.parse({cwd:E__default.resolve(t.cwd),name:n,components:[s],yes:t.yes,defaults:!1,force:!1,silent:!1,isNewProject:!0,srcDir:t.srcDir,cssVariables:!0,template:i,baseColor:c,baseStyle:!1,registryBaseConfig:m,skipPreflight:!1}),u=await pe(p);if(u){await ne(["component-example"],u,{baseStyle:!1,silent:!0,overwrite:!0});let h=Ci(i);h.length>0&&await C(h,u,{overwrite:!0,silent:!0});}o.log(`${a$1.success("Success!")} Project initialization completed.
55
- You may now add components.`),o.break();}catch(r){o.break(),Q(r);}});function Ri(e){let t=new URLSearchParams({theme:e.theme,neutralTheme:e.neutralTheme,iconLibrary:e.iconLibrary,fontVariant:e.fontVariant,menuAccent:e.menuAccent,menuColor:e.menuColor});return `${ki()}?${t.toString()}`}async function Ii(e){if(e===true){let t=await _$1(),{selectedPreset:r}=await Le({type:"select",name:"selectedPreset",message:`Which ${a$1.info("preset")} would you like to use?`,choices:[...t.map(n=>({title:n.title,description:n.description,value:n.name})),{title:"Custom",description:"Build your own on https://createui.co",value:"custom"}]});if(!r)return null;if(r==="custom"){let n=Tr();return o.info(`
56
- Opening ${a$1.info(n)} in your browser...
57
- `),await Er(n),null}return t.find(n=>n.name===r)??null}if(typeof e=="string"){if(E$1(e))return {_isUrl:true,url:e};let t=await $(e);if(!t){let n=(await _$1()).map(i=>i.name).join(", ");o.error(`Preset "${e}" not found. Available presets: ${n}`),process.exit(1);}return t}return null}function Ci(e){switch(e){case "vite":return [{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:ht`import { ComponentExample } from "@/components/component-example";
52
+ return <${i?.meta?.importSpecifier} />
53
+ }`;await J__default.writeFile(r,n,"utf8");}var dn=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)=>{try{let r=dn.parse({components:e,cwd:E__default.resolve(t.cwd),...t});await L(r.cwd);let i=await f(r.cwd);i||(i=k({resolvedPaths:{cwd:r.cwd}}));let n,o$1=!0;if(e.length>0){let[p]=await S([e[0]],{config:i});if(n=p?.type,o$1=n!=="registry:theme",F(p)){await ie(e,i,{...r,baseStyle:o$1});return}if(!r.yes&&n==="registry:theme"){o.break();let{confirm:u}=await pt({type:"confirm",name:"confirm",message:a$1.warn(`You are about to install a new ${n.replace("registry:","")}.
54
+ Existing CSS variables and components will be overwritten. Continue?`)});u||(o.break(),o.log("Installation cancelled."),o.break(),process.exit(1));}}r.components?.length||(r.components=await un(r));let s=w.filter(p=>r.components?.includes(p.name));s?.length&&(o.break(),s.forEach(p=>{o.warn(a$1.warn(p.message));}),o.break(),process.exit(1));let{errors:c,config:a}=await xr(r),l=!1;if(c["3"]){let{proceed:p}=await pt({type:"confirm",name:"proceed",message:`You need to create a ${a$1.info("components.json")} file to add components. Proceed?`,initial:!0});p||(o.break(),process.exit(1)),a=await pe({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:r.silent,isNewProject:!1,srcDir:r.srcDir,cssVariables:r.cssVariables,baseStyle:o$1,components:r.components}),l=!0;}let m=!1;if(c["1"]){let{projectPath:p,template:u}=await $e({cwd:r.cwd,force:r.overwrite,srcDir:r.srcDir,components:r.components});p||(o.break(),process.exit(1)),r.cwd=p,u==="next-monorepo"?(r.cwd=E__default.resolve(r.cwd,"apps/web"),a=await f(r.cwd)):(a=await pe({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:r.silent,isNewProject:!0,srcDir:r.srcDir,cssVariables:r.cssVariables,baseStyle:o$1,components:r.components}),l=!0,m=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//));}if(!a)throw new Error(`Failed to read config at ${a$1.info(r.cwd)}.`);l||await ie(r.components,a,{...r,baseStyle:o$1}),m&&await vr(r.components[0],a);}catch(r){o.break(),Q(r);}});async function un(e){let t=await U();if(!t)return o.break(),Q(new Error("Failed to fetch registry index.")),[];if(e.all)return t.map(n=>n.name).filter(n=>!w.some(o=>o.name===n));if(e.components?.length)return e.components;let{components:r}=await pt({type:"multiselect",name:"components",message:"Which components would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:false,choices:t.filter(n=>n.type==="registry:ui"&&!w.some(o=>o.name===n.name)).map(n=>({title:n.name,value:n.name,selected:e.all?true:e.components?.includes(n.name)}))});r?.length||(o.warn("No components selected. Exiting."),o.info(""),process.exit(1));let i=z.array(z.string()).safeParse(r);return i.success?i.data:(o.error(""),Q(new Error("Something went wrong. Please try again.")),[])}async function Pr(e){let t={},r={cwd:e.cwd,registryFile:E__default.resolve(e.cwd,e.registryFile),outputDir:E__default.resolve(e.cwd,e.outputDir)};return x.existsSync(r.registryFile)||(t["13"]=true),await x.mkdir(r.outputDir,{recursive:true}),Object.keys(t).length>0&&(t["13"]&&(o.break(),o.error(`The path ${a$1.info(r.registryFile)} does not exist.`)),o.break(),process.exit(1)),{errors:t,resolvePaths:r}}var hn=z.object({cwd:z.string(),registryFile:z.string(),outputDir:z.string()}),jr=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=hn.parse({cwd:E.resolve(t.cwd),registryFile:e,outputDir:t.output}),{resolvePaths:i}=await Pr(r),n=await J.readFile(i.registryFile,"utf-8"),o$2=o$1.safeParse(JSON.parse(n));o$2.success||(o.error(`Invalid registry file found at ${a$1.info(i.registryFile)}.`),process.exit(1));let s=p("Building registry...");for(let c of o$2.data.items){s.start(`Building ${c.name}...`),c.$schema="https://createui.co/schema/registry-item.json";for(let l of c.files??[])l.content=await J.readFile(E.resolve(i.cwd,l.path),"utf-8");let a=n$1.safeParse(c);if(!a.success){o.error(`Invalid registry item found for ${a$1.info(c.name)}.`);continue}await J.writeFile(E.resolve(i.outputDir,`${a.data.name}.json`),JSON.stringify(a.data,null,2));}await J.copyFile(i.registryFile,E.resolve(i.outputDir,"registry.json")),s.succeed("Building registry.");}catch(r){o.break(),Q(r);}});var bn="https://createui.co",xn={next:"Next.js",vite:"Vite",start:"TanStack Start"},Er=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{let r=e;if(!r){let{enteredName:c}=await pt({type:"text",name:"enteredName",message:"What is your project named?",initial:t.template?`${t.template}-app`:"my-app",format:a=>a.trim(),validate:a=>yn(E__default.basename(E__default.resolve(a))).validForNewPackages?!0:"Invalid project name. Name should be lowercase, URL-friendly, and not start with a period or underscore."});c||process.exit(0),r=c;}let i=t.template;if(!i){let{selectedTemplate:c}=await pt({type:"select",name:"selectedTemplate",message:`Which ${a$1.info("template")} would you like to use?`,choices:Object.entries(xn).map(([a,l])=>({title:l,value:a}))});c||process.exit(0),i=c;}let n=t.preset!==void 0?await vn(t.preset):null;t.preset!==void 0&&!n&&process.exit(0);let o$1;if(n){let c,a;"_isUrl"in n?(c=n.url,a=new URL(n.url).searchParams.get("theme")??"indigo"):(c=Sn(n),a=n.theme);let l=G({}),[m]=await S([c],{config:l}),p;m?.type==="registry:base"&&m.config&&(p=m.config),o$1=Ve.parse({cwd:E__default.resolve(t.cwd),name:r,components:[c],yes:t.yes,defaults:!1,force:!1,silent:!1,isNewProject:!0,srcDir:t.srcDir,cssVariables:!0,template:i,baseColor:a,baseStyle:!1,registryBaseConfig:p,skipPreflight:!1});}else o$1=Ve.parse({cwd:E__default.resolve(t.cwd),name:r,components:[],yes:t.yes,defaults:!1,force:!1,silent:!1,isNewProject:!0,srcDir:t.srcDir,cssVariables:!0,template:i,baseStyle:!0,skipPreflight:!1});let s=await pe(o$1);if(s){await ie(["component-example"],s,{baseStyle:!1,silent:!0,overwrite:!0});let c=Rn(i);c.length>0&&await C(c,s,{overwrite:!0,silent:!0});}o.log(`${a$1.success("Success!")} Project initialization completed.
55
+ You may now add components.`),o.break();}catch(r){o.break(),Q(r);}});function Sn(e){let t=new URLSearchParams({theme:e.theme,neutralTheme:e.neutralTheme,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 _$1(),{selectedPreset:r}=await pt({type:"select",name:"selectedPreset",message:`Which ${a$1.info("preset")} would you like to use?`,choices:t.map(i=>({title:i.title,description:i.description,value:i.name}))});return r?t.find(i=>i.name===r)??null:null}if(typeof e=="string"){if(E$1(e))return {_isUrl:true,url:e};let t=await $(e);if(!t){let i=(await _$1()).map(n=>n.name).join(", ");o.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:gt`import { ComponentExample } from "@/components/component-example";
58
56
 
59
57
  export function App() {
60
58
  return <ComponentExample />;
61
59
  }
62
60
 
63
61
  export default App;
64
- `}];case "next":return [{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:ht`import { ComponentExample } from "@/components/component-example";
62
+ `}];case "next":return [{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:gt`import { ComponentExample } from "@/components/component-example";
65
63
 
66
64
  export default function Page() {
67
65
  return <ComponentExample />;
68
66
  }
69
- `}];case "start":return [{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:ht`import { createFileRoute } from "@tanstack/react-router";
67
+ `}];case "start":return [{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:gt`import { createFileRoute } from "@tanstack/react-router";
70
68
  import { ComponentExample } from "@/components/component-example";
71
69
 
72
70
  export const Route = createFileRoute("/")({ component: App });
@@ -76,18 +74,18 @@ function App() {
76
74
  <ComponentExample />
77
75
  );
78
76
  }
79
- `}];default:return []}}function Tr(){return `${$r}/create`}function ki(){return `${$r}/init`}var $i=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=$i.parse({component:e,...t}),n=E__default.resolve(r.cwd);existsSync(n)||(o.error(`The path ${n} does not exist. Please try again.`),process.exit(1));let i=await f(n);i||(o.warn(`Configuration is missing. Please run ${a$1.success("init")} to create a components.json file.`),process.exit(1));let o$1=await U();if(o$1||(Q(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let a=i.resolvedPaths.components,l=o$1.filter(p=>{for(let u of p.files??[]){let h=E__default.resolve(a,typeof u=="string"?u:u.path);if(existsSync(h))return !0}return !1}),m=[];for(let p of l){let u=await Or(p,i);u.length&&m.push({name:p.name,changes:u});}m.length||(o.info("No updates found."),process.exit(0)),o.info("The following components have updates available:");for(let p of m){o.info(`- ${p.name}`);for(let u of p.changes)o.info(` - ${u.filePath}`);}o.break(),o.info(`Run ${a$1.success("diff <component>")} to see the changes.`),process.exit(0);}let s=o$1.find(a=>a.name===r.component);s||(o.error(`The component ${a$1.success(r.component)} does not exist.`),process.exit(1));let c=await Or(s,i);c.length||(o.info(`No updates found for ${r.component}.`),process.exit(0));for(let a of c)o.info(`- ${a.filePath}`),await Ni(a.patch),o.info("");}catch(r){Q(r);}});async function Or(e,t){let r=await Y$1("",[e]);if(!r)return [];let n=[];for(let i of r){let o=await Z(t,i);if(o)for(let s of i.files??[]){let c=E__default.resolve(o,typeof s=="string"?s:s.path);if(!existsSync(c))continue;let a=await promises.readFile(c,"utf8");if(typeof s=="string"||!s.content)continue;let l=await A({filename:s.path,raw:s.content,config:t}),m=diffLines(l,a);m.length>1&&n.push({filePath:c,patch:m});}}return n}async function Ni(e){e.forEach(t=>{if(t)return t.added?process.stdout.write(a$1.success(t.value)):t.removed?process.stdout.write(a$1.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{o.info("> project info"),console.log(await m(e.cwd)),o.break(),o.info("> components.json"),console.log(await f(e.cwd));}catch(t){Q(t);}});var se="@create-ui/cli",We=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{createui:{command:"npx",args:[se,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{createui:{command:"npx",args:[se,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{createui:{command:"npx",args:[se,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.createui]
77
+ `}];default:return []}}function In(){return `${bn}/init`}var jn=z.object({component:z.string().optional(),yes:z.boolean(),cwd:z.string(),path:z.string().optional()}),Nr=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=jn.parse({component:e,...t}),i=E__default.resolve(r.cwd);existsSync(i)||(o.error(`The path ${i} does not exist. Please try again.`),process.exit(1));let n=await f(i);n||(o.warn(`Configuration is missing. Please run ${a$1.success("init")} to create a components.json file.`),process.exit(1));let o$1=await U();if(o$1||(Q(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let a=n.resolvedPaths.components,l=o$1.filter(p=>{for(let u of p.files??[]){let h=E__default.resolve(a,typeof u=="string"?u:u.path);if(existsSync(h))return !0}return !1}),m=[];for(let p of l){let u=await $r(p,n);u.length&&m.push({name:p.name,changes:u});}m.length||(o.info("No updates found."),process.exit(0)),o.info("The following components have updates available:");for(let p of m){o.info(`- ${p.name}`);for(let u of p.changes)o.info(` - ${u.filePath}`);}o.break(),o.info(`Run ${a$1.success("diff <component>")} to see the changes.`),process.exit(0);}let s=o$1.find(a=>a.name===r.component);s||(o.error(`The component ${a$1.success(r.component)} does not exist.`),process.exit(1));let c=await $r(s,n);c.length||(o.info(`No updates found for ${r.component}.`),process.exit(0));for(let a of c)o.info(`- ${a.filePath}`),await En(a.patch),o.info("");}catch(r){Q(r);}});async function $r(e,t){let r=await Y$1("",[e]);if(!r)return [];let i=[];for(let n of r){let o=await Z(t,n);if(o)for(let s of n.files??[]){let c=E__default.resolve(o,typeof s=="string"?s:s.path);if(!existsSync(c))continue;let a=await promises.readFile(c,"utf8");if(typeof s=="string"||!s.content)continue;let l=await A({filename:s.path,raw:s.content,config:t}),m=diffLines(l,a);m.length>1&&i.push({filePath:c,patch:m});}}return i}async function En(e){e.forEach(t=>{if(t)return t.added?process.stdout.write(a$1.success(t.value)):t.removed?process.stdout.write(a$1.error(t.value)):process.stdout.write(t.value)});}var Tr=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{o.info("> project info"),console.log(await m(e.cwd)),o.break(),o.info("> components.json"),console.log(await f(e.cwd));}catch(t){Q(t);}});var se="@create-ui/cli",ze=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{createui:{command:"npx",args:[se,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{createui:{command:"npx",args:[se,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{createui:{command:"npx",args:[se,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.createui]
80
78
  command = "npx"
81
79
  args = ["${se}", "mcp"]
82
- `},{name:"opencode",label:"OpenCode",configPath:"opencode.json",config:{$schema:"https://opencode.ai/config.json",mcp:{createui:{type:"local",command:["npx",se,"mcp"],enabled:true}}}}],Me=[se],xt=new Command().name("mcp").description("MCP server and configuration commands").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{try{await L(e.cwd);let t=new StdioServerTransport;await b$1.connect(t);}catch(t){o.break(),Q(t);}}),Vi=bt.object({client:bt.enum(["claude","cursor","vscode","codex","opencode"]),cwd:bt.string()});xt.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${We.map(e=>e.name).join(", ")})`).action(async(e,t)=>{try{let n=(t.parent?.opts()||{}).cwd||process.cwd(),i=e.client;if(!i){let l=await Le({type:"select",name:"client",message:"Which MCP client are you using?",choices:We.map(m=>({title:m.label,value:m.name}))});l.client||(o.break(),process.exit(1)),i=l.client;}let o$1=Vi.parse({client:i,cwd:n}),s=await f(o$1.cwd);if(o$1.client==="codex"){if(s)await V([],Me,s,{silent:!1});else {let l=await a$2(o$1.cwd),m=l==="npm"?"install":"add",p$1=l==="npm"?"--save-dev":"-D",u=p("Installing dependencies...").start();await execa(l,[m,p$1,...Me],{cwd:o$1.cwd}),u.succeed("Installing dependencies.");}o.break(),o.log("To configure the createui MCP server in Codex:"),o.break(),o.log(`1. Open or create the file ${a$1.info("~/.codex/config.toml")}`),o.log("2. Add the following configuration:"),o.log(),o.info(`[mcp_servers.createui]
80
+ `},{name:"opencode",label:"OpenCode",configPath:"opencode.json",config:{$schema:"https://opencode.ai/config.json",mcp:{createui:{type:"local",command:["npx",se,"mcp"],enabled:true}}}}],We=[se],xt=new Command().name("mcp").description("MCP server and configuration commands").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{try{await L(e.cwd);let t=new StdioServerTransport;await b$1.connect(t);}catch(t){o.break(),Q(t);}}),_n=bt.object({client:bt.enum(["claude","cursor","vscode","codex","opencode"]),cwd:bt.string()});xt.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${ze.map(e=>e.name).join(", ")})`).action(async(e,t)=>{try{let i=(t.parent?.opts()||{}).cwd||process.cwd(),n=e.client;if(!n){let l=await pt({type:"select",name:"client",message:"Which MCP client are you using?",choices:ze.map(m=>({title:m.label,value:m.name}))});l.client||(o.break(),process.exit(1)),n=l.client;}let o$1=_n.parse({client:n,cwd:i}),s=await f(o$1.cwd);if(o$1.client==="codex"){if(s)await V([],We,s,{silent:!1});else {let l=await a$2(o$1.cwd),m=l==="npm"?"install":"add",p$1=l==="npm"?"--save-dev":"-D",u=p("Installing dependencies...").start();await execa(l,[m,p$1,...We],{cwd:o$1.cwd}),u.succeed("Installing dependencies.");}o.break(),o.log("To configure the createui MCP server in Codex:"),o.break(),o.log(`1. Open or create the file ${a$1.info("~/.codex/config.toml")}`),o.log("2. Add the following configuration:"),o.log(),o.info(`[mcp_servers.createui]
83
81
  command = "npx"
84
- args = ["${se}", "mcp"]`),o.break(),o.info("3. Restart Codex to load the MCP server"),o.break(),process.exit(0);}let c=p("Configuring MCP server...").start(),a=await Mi(o$1);if(c.succeed("Configuring MCP server."),s)await V([],Me,s,{silent:!1});else {let l=await a$2(o$1.cwd),m=l==="npm"?"install":"add",p$1=l==="npm"?"--save-dev":"-D",u=p("Installing dependencies...").start();await execa(l,[m,p$1,...Me],{cwd:o$1.cwd}),u.succeed("Installing dependencies.");}o.break(),o.success(`Configuration saved to ${a}.`),o.break();}catch(r){Q(r);}});var Li=(e,t)=>t;async function Mi(e){let{client:t,cwd:r}=e,n=We.find(a=>a.name===t);if(!n)throw new Error(`Unknown client: ${t}. Available clients: ${We.map(a=>a.name).join(", ")}`);let i=E__default.join(r,n.configPath),o=E__default.dirname(i);await x.ensureDir(o);let s={};try{let a=await promises.readFile(i,"utf-8");s=JSON.parse(a);}catch{}let c=wr(s,n.config,{arrayMerge:Li});return await promises.writeFile(i,JSON.stringify(c,null,2)+`
85
- `,"utf-8"),n.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,n]=await Promise.all([Ui("**/*.{js,ts,jsx,tsx}",{cwd:t}),W()]);if(Object.keys(n).length===0)throw new Error("Something went wrong fetching the registry icons.");let i=Object.entries(a$4).map(([m,p])=>({title:p.name,value:m})),o$1=await Le([{type:"select",name:"sourceLibrary",message:`Which icon library would you like to ${a$1.info("migrate from")}?`,choices:i},{type:"select",name:"targetLibrary",message:`Which icon library would you like to ${a$1.info("migrate to")}?`,choices:i}]);if(o$1.sourceLibrary===o$1.targetLibrary)throw new Error("You cannot migrate to the same icon library. Please choose a different icon library.");if(!(o$1.sourceLibrary in a$4&&o$1.targetLibrary in a$4))throw new Error("Invalid icon library. Please choose a valid icon library.");let s=a$4[o$1.sourceLibrary],c=a$4[o$1.targetLibrary],{confirm:a}=await Le({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${a$1.info(r.length)} files in ${a$1.info(`./${E__default.relative(e.resolvedPaths.cwd,t)}`)} from ${a$1.info(s.name)} to ${a$1.info(c.name)}. Continue?`});a||(o.info("Migration cancelled."),process.exit(0)),c.package&&await V([c.package],[],e,{silent:false});let l=p("Migrating icons...")?.start();await Promise.all(r.map(async m=>{l.text=`Migrating ${m}...`;let p=E__default.join(t,m),u=await promises.readFile(p,"utf-8"),h=await Ki(u,o$1.sourceLibrary,o$1.targetLibrary,n);await promises.writeFile(p,h);})),l.succeed("Migration complete.");}async function Ki(e,t,r,n){let i=a$4[t]?.import,o=a$4[r]?.import,s=await promises.mkdtemp(E__default.join(tmpdir(),"createui-")),c=new Project({compilerOptions:{}}),a=E__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()===`"${i}"`){for(let u of p.getNamedImports()??[]){let h=u.getName(),g=Object.values(n).find(w=>w[t]===h)?.[r];!g||m.includes(g)||(m.push(g),u.remove(),l.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).filter(w=>w.getTagNameNode()?.getText()===h).forEach(w=>w.getTagNameNode()?.replaceWithText(g)));}p.getNamedImports()?.length===0&&p.remove();}return m.length>0&&l.addImportDeclaration({moduleSpecifier:o,namedImports:m.map(p=>({name:p}))}),await l.getText()}function Hi(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function Xi(e,t,r,n){let o=e.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").trim().split(",").map(s=>s.trim()).filter(Boolean);for(let s of o){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];n==="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];n==="slot"&&l==="Slot"&&m==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:l,alias:m,isType:t});}else n==="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,n=await Ui("**/*.{js,ts,jsx,tsx}",{cwd:r});if(!t.yes){let{confirm:c}=await Le({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${a$1.info(n.length)} files in ${a$1.info(`./${E__default.relative(e.resolvedPaths.cwd,r)}`)} to ${a$1.info("radix-ui")}. Continue?`});c||(o.info("Migration cancelled."),process.exit(0));}let i=p("Migrating imports...")?.start(),o$1=new Set;await Promise.all(n.map(async c=>{i.text=`Migrating ${c}...`;let a=E__default.join(r,c),l=await promises.readFile(a,"utf-8"),{content:m,replacedPackages:p}=await Qi(l);p.forEach(u=>o$1.add(u)),await promises.writeFile(a,m);})),i.succeed("Migrating imports.");let s=p("Updating package.json...")?.start();try{let c=l(e.resolvedPaths.cwd,!1);if(!c){s.fail("Could not read package.json"),o.warn("Could not update package.json. You may need to manually replace @radix-ui/react-* packages with radix-ui");return}let a=Array.from(o$1),l$1=["dependencies","devDependencies"];for(let m of l$1)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=E__default.join(e.resolvedPaths.cwd,"package.json");await promises.writeFile(m,JSON.stringify(c,null,2)+`
86
- `),s.succeed("Updated package.json."),await V(["radix-ui"],[],e,{silent:!1});}else s.succeed("No packages found in source files.");}catch{s.fail("Failed to update package.json"),o.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui");}}async function Qi(e){let t=/import\s+(?:(type)\s+)?(?:\*\s+as\s+(\w+)|{([^}]+)})\s+from\s+(["'])@radix-ui\/react-([^"']+)\4(;?)/g,r=[],n=[],i=[],o='"',s=false,c=e,a;for(;(a=t.exec(e))!==null;){let[g,w,R,S,H,F,W]=a;if(F==="icons"||F.startsWith("icons/"))continue;n.push(g),n.length===1&&(o=H,s=W===";"),i.push(`@radix-ui/react-${F}`);let ge=!!w;if(R){let Ue=Hi(F);r.push({name:Ue,alias:R,isType:ge});}else S&&Xi(S,ge,r,F);}if(r.length===0)return {content:e,replacedPackages:[]};let l=r.filter((g,w,R)=>w===R.findIndex(S=>S.name===g.name&&S.alias===g.alias&&S.isType===g.isType)),p=`import { ${l.map(g=>{let w=g.isType?"type ":"";return g.alias?`${w}${g.name} as ${g.alias}`:`${w}${g.name}`}).join(", ")} } from ${o}radix-ui${o}${s?";":""}`;c=n.reduce((g,w,R)=>g.replace(w,R===0?p:""),c),c=c.replace(/\n\s*\n\s*\n/g,`
82
+ args = ["${se}", "mcp"]`),o.break(),o.info("3. Restart Codex to load the MCP server"),o.break(),process.exit(0);}let c=p("Configuring MCP server...").start(),a=await Vn(o$1);if(c.succeed("Configuring MCP server."),s)await V([],We,s,{silent:!1});else {let l=await a$2(o$1.cwd),m=l==="npm"?"install":"add",p$1=l==="npm"?"--save-dev":"-D",u=p("Installing dependencies...").start();await execa(l,[m,p$1,...We],{cwd:o$1.cwd}),u.succeed("Installing dependencies.");}o.break(),o.success(`Configuration saved to ${a}.`),o.break();}catch(r){Q(r);}});var Dn=(e,t)=>t;async function Vn(e){let{client:t,cwd:r}=e,i=ze.find(a=>a.name===t);if(!i)throw new Error(`Unknown client: ${t}. Available clients: ${ze.map(a=>a.name).join(", ")}`);let n=E__default.join(r,i.configPath),o=E__default.dirname(n);await x.ensureDir(o);let s={};try{let a=await promises.readFile(n,"utf-8");s=JSON.parse(a);}catch{}let c=wr(s,i.config,{arrayMerge:Dn});return await promises.writeFile(n,JSON.stringify(c,null,2)+`
83
+ `,"utf-8"),i.configPath}async function Dr(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}),W()]);if(Object.keys(i).length===0)throw new Error("Something went wrong fetching the registry icons.");let n=Object.entries(a$4).map(([m,p])=>({title:p.name,value:m})),o$1=await pt([{type:"select",name:"sourceLibrary",message:`Which icon library would you like to ${a$1.info("migrate from")}?`,choices:n},{type:"select",name:"targetLibrary",message:`Which icon library would you like to ${a$1.info("migrate to")}?`,choices:n}]);if(o$1.sourceLibrary===o$1.targetLibrary)throw new Error("You cannot migrate to the same icon library. Please choose a different icon library.");if(!(o$1.sourceLibrary in a$4&&o$1.targetLibrary in a$4))throw new Error("Invalid icon library. Please choose a valid icon library.");let s=a$4[o$1.sourceLibrary],c=a$4[o$1.targetLibrary],{confirm:a}=await pt({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${a$1.info(r.length)} files in ${a$1.info(`./${E__default.relative(e.resolvedPaths.cwd,t)}`)} from ${a$1.info(s.name)} to ${a$1.info(c.name)}. Continue?`});a||(o.info("Migration cancelled."),process.exit(0)),c.package&&await V([c.package],[],e,{silent:false});let l=p("Migrating icons...")?.start();await Promise.all(r.map(async m=>{l.text=`Migrating ${m}...`;let p=E__default.join(t,m),u=await promises.readFile(p,"utf-8"),h=await Gn(u,o$1.sourceLibrary,o$1.targetLibrary,i);await promises.writeFile(p,h);})),l.succeed("Migration complete.");}async function Gn(e,t,r,i){let n=a$4[t]?.import,o=a$4[r]?.import,s=await promises.mkdtemp(E__default.join(tmpdir(),"createui-")),c=new Project({compilerOptions:{}}),a=E__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()===`"${n}"`){for(let u of p.getNamedImports()??[]){let h=u.getName(),g=Object.values(i).find(y=>y[t]===h)?.[r];!g||m.includes(g)||(m.push(g),u.remove(),l.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).filter(y=>y.getTagNameNode()?.getText()===h).forEach(y=>y.getTagNameNode()?.replaceWithText(g)));}p.getNamedImports()?.length===0&&p.remove();}return m.length>0&&l.addImportDeclaration({moduleSpecifier:o,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 o=e.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").trim().split(",").map(s=>s.trim()).filter(Boolean);for(let s of o){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 Vr(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 pt({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${a$1.info(i.length)} files in ${a$1.info(`./${E__default.relative(e.resolvedPaths.cwd,r)}`)} to ${a$1.info("radix-ui")}. Continue?`});c||(o.info("Migration cancelled."),process.exit(0));}let n=p("Migrating imports...")?.start(),o$1=new Set;await Promise.all(i.map(async c=>{n.text=`Migrating ${c}...`;let a=E__default.join(r,c),l=await promises.readFile(a,"utf-8"),{content:m,replacedPackages:p}=await Hn(l);p.forEach(u=>o$1.add(u)),await promises.writeFile(a,m);})),n.succeed("Migrating imports.");let s=p("Updating package.json...")?.start();try{let c=l(e.resolvedPaths.cwd,!1);if(!c){s.fail("Could not read package.json"),o.warn("Could not update package.json. You may need to manually replace @radix-ui/react-* packages with radix-ui");return}let a=Array.from(o$1),l$1=["dependencies","devDependencies"];for(let m of l$1)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=E__default.join(e.resolvedPaths.cwd,"package.json");await promises.writeFile(m,JSON.stringify(c,null,2)+`
84
+ `),s.succeed("Updated package.json."),await V(["radix-ui"],[],e,{silent:!1});}else s.succeed("No packages found in source files.");}catch{s.fail("Failed to update package.json"),o.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=[],n=[],o='"',s=false,c=e,a;for(;(a=t.exec(e))!==null;){let[g,y,R,S,H,F,W]=a;if(F==="icons"||F.startsWith("icons/"))continue;i.push(g),i.length===1&&(o=H,s=W===";"),n.push(`@radix-ui/react-${F}`);let ge=!!y;if(R){let Be=Yn(F);r.push({name:Be,alias:R,isType:ge});}else S&&qn(S,ge,r,F);}if(r.length===0)return {content:e,replacedPackages:[]};let l=r.filter((g,y,R)=>y===R.findIndex(S=>S.name===g.name&&S.alias===g.alias&&S.isType===g.isType)),p=`import { ${l.map(g=>{let y=g.isType?"type ":"";return g.alias?`${y}${g.name} as ${g.alias}`:`${y}${g.name}`}).join(", ")} } from ${o}radix-ui${o}${s?";":""}`;c=i.reduce((g,y,R)=>g.replace(y,R===0?p:""),c),c=c.replace(/\n\s*\n\s*\n/g,`
87
85
 
88
86
  `),l.some(g=>g.name==="Slot"&&g.alias==="SlotPrimitive")&&(c=c.split(`
89
- `).map(R=>{if(R.trim().startsWith("import "))return R;let S=R;return S=S.replace(/\b(asChild\s*\?\s*)Slot(\s*:)/g,"$1__SLOT_PLACEHOLDER__$2"),S=S.replace(/\bReact\.ComponentProps<typeof\s+Slot>/g,"React.ComponentProps<typeof __SLOT_PLACEHOLDER__>"),S=S.replace(/\bComponentProps<typeof\s+Slot>/g,"ComponentProps<typeof __SLOT_PLACEHOLDER__>"),S=S.replace(/(<\/?)Slot(\s*\/?>)/g,"$1__SLOT_PLACEHOLDER__$2"),S=S.replace(/\bSlot\b/g,(H,F,W)=>{let ge=W.substring(0,F),Ue=(ge.match(/"/g)||[]).length,cn=(ge.match(/'/g)||[]).length;return Ue%2!==0||cn%2!==0?H:"__SLOT_PLACEHOLDER__"}),S=S.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),S}).join(`
90
- `));let h=Array.from(new Set(i));return {content:c,replacedPackages:h}}async function Ur(e){let t={};if(!x.existsSync(e.cwd)||!x.existsSync(E__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!x.existsSync(E__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,config:null};try{let r=await f(e.cwd);return {errors:t,config:r}}catch{o.break(),o.error(`An invalid ${a$1.info("components.json")} file was found at ${a$1.info(e.cwd)}.
91
- Before you can run a migration, you must create a valid ${a$1.info("components.json")} file by running the ${a$1.info("init")} command.`),o.error(`Learn more at ${a$1.info("https://createui.co/docs/components-json")}.`),o.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."}],to=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=to.parse({cwd:E__default.resolve(t.cwd),migration:e,list:t.list,yes:t.yes});if(r.list||!r.migration){o.info("Available migrations:");for(let o$1 of Br)o.info(`- ${o$1.name}: ${o$1.description}`);return}if(!r.migration)throw new Error("You must specify a migration. Run `createui migrate --list` to see available migrations.");let{errors:n,config:i}=await Ur(r);if(n["1"]||n["3"])throw new Error("No `components.json` file found. Ensure you are at the root of your project.");if(!i)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(i),r.migration==="radix"&&await Wr(i,{yes:r.yes});}catch(r){o.break(),Q(r);}});async function Jr(e){let t={},r={cwd:e.cwd,registryFile:E__default.resolve(e.cwd,e.registryFile),outputDir:E__default.resolve(e.cwd,e.outputDir)};if(!x.existsSync(r.registryFile))return t["13"]=true,{errors:t,resolvePaths:null,config:null};if(!x.existsSync(E__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,resolvePaths:null,config:null};await x.mkdir(r.outputDir,{recursive:true});try{let n=await f(e.cwd);return {errors:t,config:n,resolvePaths:r}}catch{o.break(),o.error(`An invalid ${a$1.info("components.json")} file was found at ${a$1.info(e.cwd)}.
92
- Before you can build the registry, you must create a valid ${a$1.info("components.json")} file by running the ${a$1.info("init")} command.`),o.break(),process.exit(1);}}var no=z.object({cwd:z.string(),registryFile:z.string(),outputDir:z.string(),verbose:z.boolean().optional().default(false)}),Kr=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 io({cwd:E.resolve(t.cwd),registryFile:e,outputDir:t.output,verbose:t.verbose});});async function io(e){try{let t=no.parse(e),[{errors:r,resolvePaths:n,config:i},o$2]=await Promise.all([Jr(t),m(t.cwd)]);(r["3"]||!i||!o$2)&&(o.error(`A ${a$1.info("components.json")} file is required to build the registry. Run ${a$1.info("createui init")} to create one.`),o.break(),process.exit(1)),(r["13"]||!n)&&(o.error(`We could not find a registry file at ${a$1.info(E.resolve(t.cwd,t.registryFile))}.`),o.break(),process.exit(1));let s=await J.readFile(n.registryFile,"utf-8"),c=o$1.safeParse(JSON.parse(s));c.success||(o.error(`Invalid registry file found at ${a$1.info(n.registryFile)}.`),o.break(),process.exit(1));let a=p("Building registry..."),l=await oo(c.data,i,o$2);for(let m of l.items)m.files=m.files?.filter((p,u,h)=>u===h.findIndex(g=>g.path===p.path)),m.dependencies&&(m.dependencies=m.dependencies.filter((p,u,h)=>u===h.findIndex(g=>g===p)));for(let m of l.items){if(!m.files)continue;a.start(`Building ${m.name}...`),m.$schema="https://createui.co/schema/registry-item.json";for(let u of m.files){let h=E.resolve(n.cwd,u.path);try{if(!(await J.stat(h)).isFile())continue;u.content=await J.readFile(h,"utf-8");}catch(g){console.error("Error reading file in registry build:",h,g);continue}}let p=n$1.safeParse(m);if(!p.success){o.error(`Invalid registry item found for ${a$1.info(m.name)}.`);continue}await J.writeFile(E.resolve(n.outputDir,`${p.data.name}.json`),JSON.stringify(p.data,null,2));}if(await J.copyFile(n.registryFile,E.resolve(n.outputDir,"registry.json")),a.succeed("Building registry."),t.verbose){p(`The registry has ${a$1.info(l.items.length.toString())} items:`).succeed();for(let m of l.items){o.log(` - ${m.name} (${a$1.info(m.type)})`);for(let p of m.files??[])o.log(` - ${p.path}`);}}}catch(t){o.break(),Q(t);}}async function oo(e,t,r){for(let n of e.items)if(n.files?.length)for(let i of n.files){let o=await D(i.path,t,r);o.files=o.files?.filter(s=>s.path!==i.path),o.files&&n.files.push(...o.files),o.dependencies&&(n.dependencies=n.dependencies?n.dependencies.concat(o.dependencies):o.dependencies);}return e}var Yr=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()=>{o.warn(`The ${a$1.info("createui registry:mcp")} command is deprecated. Use the ${a$1.info("createui mcp")} command instead.`),o.break();});var co=z.object({cwd:z.string(),query:z.string().optional(),limit:z.number().optional(),offset:z.number().optional()}),Xr=new Command().name("search").alias("list").description("search items from registries").argument("<registries...>","the registry names or urls to search items from. Names must be prefixed with @.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-q, --query <query>","query string").option("-l, --limit <number>","maximum number of items to display per registry","100").option("-o, --offset <number>","number of items to skip","0").action(async(e,t)=>{try{let r=co.parse({cwd:E__default.resolve(t.cwd),query:t.query,limit:t.limit?parseInt(t.limit,10):void 0,offset:t.offset?parseInt(t.offset,10):void 0});await L(r.cwd);let n=k({resolvedPaths:{cwd:r.cwd}}),i=G(n),o=E__default.resolve(r.cwd,"components.json");if(x.existsSync(o)){let a$1=await x.readJson(o),l=a.partial().parse(a$1);i=G({...n,...l});}let s=i;try{let a=await f(r.cwd);a&&(s=G(a));}catch{}let c=await a$3(e,{query:r.query,limit:r.limit,offset:r.offset,config:s});console.log(JSON.stringify(c,null,2)),process.exit(0);}catch(r){Q(r);}});var en="createui",Pt={claude:{label:"Claude Code",dir:E__default.join(".claude","skills")},gemini:{label:"Gemini CLI",dir:E__default.join(".gemini","skills")},codex:{label:"OpenAI Codex",dir:E__default.join(".agents","skills")},agents:{label:"Agent Skills standard (.agents/skills)",dir:E__default.join(".agents","skills")}},uo=z.object({cwd:z.string(),client:z.enum(["claude","gemini","codex","agents"]),project:z.boolean(),path:z.string().optional(),force:z.boolean(),yes:z.boolean()});function go(){let e=E__default.dirname(fileURLToPath(import.meta.url));return E__default.join(e,"skills",en)}var tn=new Command().name("skill").description("install the Create UI agent skill for your AI coding agent").option("--client <client>",`the agent to install for (${Object.keys(Pt).join(", ")}).`,"claude").option("--project","install into the project instead of your home directory.",false).option("-p, --path <path>","install into an explicit skills directory (for other agents).").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-f, --force","overwrite an existing skill installation.",false).option("-y, --yes","skip the overwrite confirmation prompt.",false).action(async e=>{try{let t=uo.parse({...e}),r=E__default.resolve(t.cwd),n=go();existsSync(n)||(o.error(`Could not find the bundled Create UI skill at ${a$1.info(n)}.`),o.error("Please update createui to the latest version and try again."),process.exit(1));let i,o$1;if(t.path)i=E__default.resolve(r,t.path),o$1="custom path";else {let a=Pt[t.client],l=t.project?r:ot.homedir();i=E__default.join(l,a.dir),o$1=`${a.label}, ${t.project?"project":"personal"}`;}let s=E__default.join(i,en);if(existsSync(s)&&!t.force&&!t.yes){let{overwrite:a}=await Le({type:"confirm",name:"overwrite",message:`The Create UI skill already exists at ${a$1.info(s)}. Overwrite?`,initial:!1});a||(o.info("Skill installation cancelled."),process.exit(0));}let c=p(`Installing the Create UI skill (${o$1})...`).start();await x.ensureDir(i),await x.copy(n,s,{overwrite:!0,filter:a=>!a.endsWith(".DS_Store")}),c.succeed(`Installed the Create UI skill (${o$1}).`),o.break(),o.success(`Skill installed at ${a$1.info(s)}`),o.break(),t.path?(o.log("Point your AI agent at this folder (or import it from your agent's"),o.log(`rules file, e.g. ${a$1.info("AGENTS.md")} or ${a$1.info(".cursor/rules")}). Then try asking:`)):o.log(`${Pt[t.client].label} loads it automatically \u2014 no restart needed. Try asking:`),o.log(` ${a$1.info('"Add a Create UI login form"')}`),!t.path&&!t.project&&(o.break(),o.log(`Tip: run ${a$1.info(`createui skill --client ${t.client} --project`)} inside a repo to commit the skill for your whole team.`)),o.break();}catch(t){Q(t);}});var wo=z.object({cwd:z.string()}),sn=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=wo.parse({cwd:E__default.resolve(t.cwd)});await L(r.cwd);let n=G({}),i=E__default.resolve(r.cwd,"components.json");if(x.existsSync(i)){let c=await x.readJson(i),a$1=a.partial().parse(c);n=G(a$1);}let o=n;try{let c=await f(r.cwd);c&&(o=G(c));}catch{}let s=await S(e,{config:o});console.log(JSON.stringify(s,null,2)),process.exit(0);}catch(r){Q(r);}});var an={version:"0.5.1"};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function xo(){let e=new Command().name("createui").description("add items from registries to your project").version(an.version,"-v, --version","display the version number");e.addCommand(yr).addCommand(Nr).addCommand(Ir).addCommand(Fr).addCommand(sn).addCommand(Xr).addCommand(Gr).addCommand(Ar).addCommand(jr).addCommand(xt).addCommand(tn),e.addCommand(Kr).addCommand(Yr),e.parse();}xo();//# sourceMappingURL=index.js.map
87
+ `).map(R=>{if(R.trim().startsWith("import "))return R;let S=R;return S=S.replace(/\b(asChild\s*\?\s*)Slot(\s*:)/g,"$1__SLOT_PLACEHOLDER__$2"),S=S.replace(/\bReact\.ComponentProps<typeof\s+Slot>/g,"React.ComponentProps<typeof __SLOT_PLACEHOLDER__>"),S=S.replace(/\bComponentProps<typeof\s+Slot>/g,"ComponentProps<typeof __SLOT_PLACEHOLDER__>"),S=S.replace(/(<\/?)Slot(\s*\/?>)/g,"$1__SLOT_PLACEHOLDER__$2"),S=S.replace(/\bSlot\b/g,(H,F,W)=>{let ge=W.substring(0,F),Be=(ge.match(/"/g)||[]).length,ni=(ge.match(/'/g)||[]).length;return Be%2!==0||ni%2!==0?H:"__SLOT_PLACEHOLDER__"}),S=S.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),S}).join(`
88
+ `));let h=Array.from(new Set(n));return {content:c,replacedPackages:h}}async function Mr(e){let t={};if(!x.existsSync(e.cwd)||!x.existsSync(E__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!x.existsSync(E__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,config:null};try{let r=await f(e.cwd);return {errors:t,config:r}}catch{o.break(),o.error(`An invalid ${a$1.info("components.json")} file was found at ${a$1.info(e.cwd)}.
89
+ Before you can run a migration, you must create a valid ${a$1.info("components.json")} file by running the ${a$1.info("init")} command.`),o.error(`Learn more at ${a$1.info("https://createui.co/docs/components-json")}.`),o.break(),process.exit(1);}}var Wr=[{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&&Wr.some(t=>t.name===e),{message:"You must specify a valid migration. Run `createui migrate --list` to see available migrations."}).optional()}),zr=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:E__default.resolve(t.cwd),migration:e,list:t.list,yes:t.yes});if(r.list||!r.migration){o.info("Available migrations:");for(let o$1 of Wr)o.info(`- ${o$1.name}: ${o$1.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:n}=await Mr(r);if(i["1"]||i["3"])throw new Error("No `components.json` file found. Ensure you are at the root of your project.");if(!n)throw new Error("Something went wrong reading your `components.json` file. Please ensure you have a valid `components.json` file.");r.migration==="icons"&&await Dr(n),r.migration==="radix"&&await Vr(n,{yes:r.yes});}catch(r){o.break(),Q(r);}});async function Ur(e){let t={},r={cwd:e.cwd,registryFile:E__default.resolve(e.cwd,e.registryFile),outputDir:E__default.resolve(e.cwd,e.outputDir)};if(!x.existsSync(r.registryFile))return t["13"]=true,{errors:t,resolvePaths:null,config:null};if(!x.existsSync(E__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,resolvePaths:null,config:null};await x.mkdir(r.outputDir,{recursive:true});try{let i=await f(e.cwd);return {errors:t,config:i,resolvePaths:r}}catch{o.break(),o.error(`An invalid ${a$1.info("components.json")} file was found at ${a$1.info(e.cwd)}.
90
+ Before you can build the registry, you must create a valid ${a$1.info("components.json")} file by running the ${a$1.info("init")} command.`),o.break(),process.exit(1);}}var to=z.object({cwd:z.string(),registryFile:z.string(),outputDir:z.string(),verbose:z.boolean().optional().default(false)}),Br=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 ro({cwd:E.resolve(t.cwd),registryFile:e,outputDir:t.output,verbose:t.verbose});});async function ro(e){try{let t=to.parse(e),[{errors:r,resolvePaths:i,config:n},o$2]=await Promise.all([Ur(t),m(t.cwd)]);(r["3"]||!n||!o$2)&&(o.error(`A ${a$1.info("components.json")} file is required to build the registry. Run ${a$1.info("createui init")} to create one.`),o.break(),process.exit(1)),(r["13"]||!i)&&(o.error(`We could not find a registry file at ${a$1.info(E.resolve(t.cwd,t.registryFile))}.`),o.break(),process.exit(1));let s=await J.readFile(i.registryFile,"utf-8"),c=o$1.safeParse(JSON.parse(s));c.success||(o.error(`Invalid registry file found at ${a$1.info(i.registryFile)}.`),o.break(),process.exit(1));let a=p("Building registry..."),l=await io(c.data,n,o$2);for(let m of l.items)m.files=m.files?.filter((p,u,h)=>u===h.findIndex(g=>g.path===p.path)),m.dependencies&&(m.dependencies=m.dependencies.filter((p,u,h)=>u===h.findIndex(g=>g===p)));for(let m of l.items){if(!m.files)continue;a.start(`Building ${m.name}...`),m.$schema="https://createui.co/schema/registry-item.json";for(let u of m.files){let h=E.resolve(i.cwd,u.path);try{if(!(await J.stat(h)).isFile())continue;u.content=await J.readFile(h,"utf-8");}catch(g){console.error("Error reading file in registry build:",h,g);continue}}let p=n$1.safeParse(m);if(!p.success){o.error(`Invalid registry item found for ${a$1.info(m.name)}.`);continue}await J.writeFile(E.resolve(i.outputDir,`${p.data.name}.json`),JSON.stringify(p.data,null,2));}if(await J.copyFile(i.registryFile,E.resolve(i.outputDir,"registry.json")),a.succeed("Building registry."),t.verbose){p(`The registry has ${a$1.info(l.items.length.toString())} items:`).succeed();for(let m of l.items){o.log(` - ${m.name} (${a$1.info(m.type)})`);for(let p of m.files??[])o.log(` - ${p.path}`);}}}catch(t){o.break(),Q(t);}}async function io(e,t,r){for(let i of e.items)if(i.files?.length)for(let n of i.files){let o=await D(n.path,t,r);o.files=o.files?.filter(s=>s.path!==n.path),o.files&&i.files.push(...o.files),o.dependencies&&(i.dependencies=i.dependencies?i.dependencies.concat(o.dependencies):o.dependencies);}return e}var Gr=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()=>{o.warn(`The ${a$1.info("createui registry:mcp")} command is deprecated. Use the ${a$1.info("createui mcp")} command instead.`),o.break();});var so=z.object({cwd:z.string(),query:z.string().optional(),limit:z.number().optional(),offset:z.number().optional()}),Yr=new Command().name("search").alias("list").description("search items from registries").argument("<registries...>","the registry names or urls to search items from. Names must be prefixed with @.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-q, --query <query>","query string").option("-l, --limit <number>","maximum number of items to display per registry","100").option("-o, --offset <number>","number of items to skip","0").action(async(e,t)=>{try{let r=so.parse({cwd:E__default.resolve(t.cwd),query:t.query,limit:t.limit?parseInt(t.limit,10):void 0,offset:t.offset?parseInt(t.offset,10):void 0});await L(r.cwd);let i=k({resolvedPaths:{cwd:r.cwd}}),n=G(i),o=E__default.resolve(r.cwd,"components.json");if(x.existsSync(o)){let a$1=await x.readJson(o),l=a.partial().parse(a$1);n=G({...i,...l});}let s=n;try{let a=await f(r.cwd);a&&(s=G(a));}catch{}let c=await a$3(e,{query:r.query,limit:r.limit,offset:r.offset,config:s});console.log(JSON.stringify(c,null,2)),process.exit(0);}catch(r){Q(r);}});var Xr="createui",Pt={claude:{label:"Claude Code",dir:E__default.join(".claude","skills")},gemini:{label:"Gemini CLI",dir:E__default.join(".gemini","skills")},codex:{label:"OpenAI Codex",dir:E__default.join(".agents","skills")},agents:{label:"Agent Skills standard (.agents/skills)",dir:E__default.join(".agents","skills")}},fo=z.object({cwd:z.string(),client:z.enum(["claude","gemini","codex","agents"]),project:z.boolean(),path:z.string().optional(),force:z.boolean(),yes:z.boolean()});function po(){let e=E__default.dirname(fileURLToPath(import.meta.url));return E__default.join(e,"skills",Xr)}var Qr=new Command().name("skill").description("install the Create UI agent skill for your AI coding agent").option("--client <client>",`the agent to install for (${Object.keys(Pt).join(", ")}).`,"claude").option("--project","install into the project instead of your home directory.",false).option("-p, --path <path>","install into an explicit skills directory (for other agents).").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-f, --force","overwrite an existing skill installation.",false).option("-y, --yes","skip the overwrite confirmation prompt.",false).action(async e=>{try{let t=fo.parse({...e}),r=E__default.resolve(t.cwd),i=po();existsSync(i)||(o.error(`Could not find the bundled Create UI skill at ${a$1.info(i)}.`),o.error("Please update createui to the latest version and try again."),process.exit(1));let n,o$1;if(t.path)n=E__default.resolve(r,t.path),o$1="custom path";else {let a=Pt[t.client],l=t.project?r:st.homedir();n=E__default.join(l,a.dir),o$1=`${a.label}, ${t.project?"project":"personal"}`;}let s=E__default.join(n,Xr);if(existsSync(s)&&!t.force&&!t.yes){let{overwrite:a}=await pt({type:"confirm",name:"overwrite",message:`The Create UI skill already exists at ${a$1.info(s)}. Overwrite?`,initial:!1});a||(o.info("Skill installation cancelled."),process.exit(0));}let c=p(`Installing the Create UI skill (${o$1})...`).start();await x.ensureDir(n),await x.copy(i,s,{overwrite:!0,filter:a=>!a.endsWith(".DS_Store")}),c.succeed(`Installed the Create UI skill (${o$1}).`),o.break(),o.success(`Skill installed at ${a$1.info(s)}`),o.break(),t.path?(o.log("Point your AI agent at this folder (or import it from your agent's"),o.log(`rules file, e.g. ${a$1.info("AGENTS.md")} or ${a$1.info(".cursor/rules")}). Then try asking:`)):o.log(`${Pt[t.client].label} loads it automatically \u2014 no restart needed. Try asking:`),o.log(` ${a$1.info('"Add a Create UI login form"')}`),!t.path&&!t.project&&(o.break(),o.log(`Tip: run ${a$1.info(`createui skill --client ${t.client} --project`)} inside a repo to commit the skill for your whole team.`)),o.break();}catch(t){Q(t);}});var go=z.object({cwd:z.string()}),ri=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=go.parse({cwd:E__default.resolve(t.cwd)});await L(r.cwd);let i=G({}),n=E__default.resolve(r.cwd,"components.json");if(x.existsSync(n)){let c=await x.readJson(n),a$1=a.partial().parse(c);i=G(a$1);}let o=i;try{let c=await f(r.cwd);c&&(o=G(c));}catch{}let s=await S(e,{config:o});console.log(JSON.stringify(s,null,2)),process.exit(0);}catch(r){Q(r);}});var ii={version:"0.5.3"};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function yo(){let e=new Command().name("createui").description("add items from registries to your project").version(ii.version,"-v, --version","display the version number");e.addCommand(yr).addCommand(Er).addCommand(Ir).addCommand(Nr).addCommand(ri).addCommand(Yr).addCommand(zr).addCommand(Tr).addCommand(jr).addCommand(xt).addCommand(Qr),e.addCommand(Br).addCommand(Gr),e.parse();}yo();//# sourceMappingURL=index.js.map
93
91
  //# sourceMappingURL=index.js.map