@create-ui/cli 0.5.8 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/dist/{chunk-RMTTHCB3.js → chunk-2ELKDGGM.js} +3 -3
  2. package/dist/{chunk-RMTTHCB3.js.map → chunk-2ELKDGGM.js.map} +1 -1
  3. package/dist/chunk-643QI2I2.js +102 -0
  4. package/dist/chunk-643QI2I2.js.map +1 -0
  5. package/dist/{chunk-NQFMXHMH.js → chunk-KQTXDVKV.js} +3 -3
  6. package/dist/chunk-KQTXDVKV.js.map +1 -0
  7. package/dist/index.d.ts +360 -360
  8. package/dist/index.js +26 -26
  9. package/dist/index.js.map +1 -1
  10. package/dist/mcp/index.js +1 -1
  11. package/dist/registry/index.d.ts +2 -2
  12. package/dist/registry/index.js +1 -1
  13. package/dist/schema/index.d.ts +715 -715
  14. package/dist/skills/createui/SKILL.md +199 -177
  15. package/dist/skills/createui/agents/openai.yml +1 -1
  16. package/dist/skills/createui/cli.md +42 -42
  17. package/dist/skills/createui/customization.md +20 -15
  18. package/dist/skills/createui/evals/evals.json +68 -5
  19. package/dist/skills/createui/mcp.md +14 -5
  20. package/dist/skills/createui/reference/accordion.md +127 -0
  21. package/dist/skills/createui/reference/app-store-badge.md +88 -0
  22. package/dist/skills/createui/reference/aspect-ratio.md +52 -0
  23. package/dist/skills/createui/reference/avatar.md +230 -0
  24. package/dist/skills/createui/reference/badge.md +110 -0
  25. package/dist/skills/createui/reference/breadcrumb.md +153 -0
  26. package/dist/skills/createui/reference/button-group.md +116 -0
  27. package/dist/skills/createui/reference/button.md +104 -0
  28. package/dist/skills/createui/reference/checkbox-group.md +118 -0
  29. package/dist/skills/createui/reference/checkbox.md +79 -0
  30. package/dist/skills/createui/reference/chip.md +115 -0
  31. package/dist/skills/createui/reference/close-button.md +83 -0
  32. package/dist/skills/createui/reference/country-flag.md +109 -0
  33. package/dist/skills/createui/reference/credit-card-input.md +76 -0
  34. package/dist/skills/createui/reference/date-input.md +71 -0
  35. package/dist/skills/createui/reference/dropdown-menu.md +164 -0
  36. package/dist/skills/createui/reference/field.md +186 -0
  37. package/dist/skills/createui/reference/info-tooltip.md +110 -0
  38. package/dist/skills/createui/reference/inline-alert.md +146 -0
  39. package/dist/skills/createui/reference/input-group.md +171 -0
  40. package/dist/skills/createui/reference/input-otp.md +130 -0
  41. package/dist/skills/createui/reference/input-stepper.md +120 -0
  42. package/dist/skills/createui/reference/input.md +118 -0
  43. package/dist/skills/createui/reference/label.md +121 -0
  44. package/dist/skills/createui/reference/pagination.md +157 -0
  45. package/dist/skills/createui/reference/phone-input.md +77 -0
  46. package/dist/skills/createui/reference/progress.md +158 -0
  47. package/dist/skills/createui/reference/radio-group.md +133 -0
  48. package/dist/skills/createui/reference/radio.md +79 -0
  49. package/dist/skills/createui/reference/scroll-area.md +212 -0
  50. package/dist/skills/createui/reference/segmented-control.md +146 -0
  51. package/dist/skills/createui/reference/select.md +204 -0
  52. package/dist/skills/createui/reference/separator.md +99 -0
  53. package/dist/skills/createui/reference/social-login-button.md +130 -0
  54. package/dist/skills/createui/reference/spinner.md +68 -0
  55. package/dist/skills/createui/reference/status-badge.md +89 -0
  56. package/dist/skills/createui/reference/switch-group.md +122 -0
  57. package/dist/skills/createui/reference/switch.md +75 -0
  58. package/dist/skills/createui/reference/tab-menu.md +165 -0
  59. package/dist/skills/createui/reference/text-link.md +84 -0
  60. package/dist/skills/createui/reference/textarea.md +50 -0
  61. package/dist/skills/createui/reference/toast.md +162 -0
  62. package/dist/skills/createui/reference/tooltip.md +63 -0
  63. package/dist/skills/createui/rules/composition.md +41 -25
  64. package/dist/skills/createui/rules/design.md +266 -0
  65. package/dist/skills/createui/rules/forms.md +44 -15
  66. package/dist/skills/createui/rules/icons.md +64 -18
  67. package/dist/skills/createui/rules/styling.md +53 -14
  68. package/dist/utils/index.js +1 -1
  69. package/package.json +1 -1
  70. package/dist/chunk-M5DYT2NE.js +0 -64
  71. package/dist/chunk-M5DYT2NE.js.map +0 -1
  72. package/dist/chunk-NQFMXHMH.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import {b as b$1,a as a$2}from'./chunk-M5DYT2NE.js';import {a as a$3}from'./chunk-RMTTHCB3.js';import {a as a$4}from'./chunk-VQCXAURP.js';import {s,u,F,k,V as V$1,o,a as a$1,T,m,f,n,t,v,p,g,da,q,r,d,e,b,c,O,E as E$1,w,X,B,ba,D,ca,$,aa,A,N,P,Q,C,R,h,Z,l,S,j,i,x as x$1,z as z$1,y}from'./chunk-NQFMXHMH.js';export{$ as fetchTree,da as getFontVariants,aa as getItemTargetPath,ca as getPreset,ba as getPresets,U as getRegistry,Z as getRegistryIcons,V as getRegistryItems,Y as getRegistryStyles,X as getcreateuiRegistryIndex,W as resolveRegistryItems,_ as resolveTree}from'./chunk-NQFMXHMH.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 St,{z}from'zod';import {execa}from'execa';import ut from'prompts';import {Project,ScriptKind,SyntaxKind,VariableDeclarationKind}from'ts-morph';import ct,{tmpdir}from'os';import {parse,applyEdits,modify}from'jsonc-parser';import {Command}from'commander';import vr from'deepmerge';import*as J from'fs/promises';import J__default from'fs/promises';import wt from'dedent';import Pi from'validate-npm-package-name';import {diffLines}from'diff';import {HttpsProxyAgent}from'https-proxy-agent';import zi from'node-fetch';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {randomBytes}from'crypto';import no from'fast-glob';import {fileURLToPath}from'url';async function sr(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)}.
2
+ import {b as b$1,a as a$2}from'./chunk-643QI2I2.js';import {a as a$3}from'./chunk-2ELKDGGM.js';import {a as a$4}from'./chunk-VQCXAURP.js';import {s,u,F,k,V as V$1,o,a as a$1,T,m,f,n,t,v,p,g,da,q,r,d,e,b,c,O,E as E$1,w,X,B,ba,D,ca,$,aa,A,N,P,Q,C,R,h,Z,l,S,j,i,x as x$1,z as z$1,y}from'./chunk-KQTXDVKV.js';export{$ as fetchTree,da as getFontVariants,aa as getItemTargetPath,ca as getPreset,ba as getPresets,U as getRegistry,Z as getRegistryIcons,V as getRegistryItems,Y as getRegistryStyles,X as getcreateuiRegistryIndex,W as resolveRegistryItems,_ as resolveTree}from'./chunk-KQTXDVKV.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 St,{z}from'zod';import {execa}from'execa';import ut from'prompts';import {Project,ScriptKind,SyntaxKind,VariableDeclarationKind}from'ts-morph';import ct,{tmpdir}from'os';import {parse,applyEdits,modify}from'jsonc-parser';import {Command}from'commander';import vr from'deepmerge';import*as J from'fs/promises';import J__default from'fs/promises';import wt from'dedent';import Pi from'validate-npm-package-name';import {diffLines}from'diff';import {HttpsProxyAgent}from'https-proxy-agent';import zi from'node-fetch';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {randomBytes}from'crypto';import io from'fast-glob';import {fileURLToPath}from'url';async function sr(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
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
4
  Visit ${a$1.info(i?.framework.links.installation)} to manually configure your project.
5
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 a=p("Validating import alias.",{silent:e.silent}).start();return i?.aliasPrefix?a?.succeed():(t["6"]=true,a?.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 ar(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,""),a=s(e),c=s(r);if([/\.\.[\/\\]/,/[\/\\]\.\./,/\.\./,/\.\.%/,/\x00/,/[\x01-\x1f]/].some(u=>u.test(a)||u.test(c))||(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 et(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"),a=await wn(s,e);await promises.writeFile(n,a,"utf8"),o.succeed();}async function wn(e,t){let r=[yn(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,`
@@ -10,17 +10,17 @@ Once configured, you can use the cli to add components.`),o.break(),process.exit
10
10
  `}}),l=t.nodes?.filter(p=>p.type==="atrule"&&p.name==="custom-variant"),f=t.nodes?.filter(p=>p.type==="atrule"&&p.name==="import");if(l&&l.length>0){let p=l[l.length-1];t.insertAfter(p,c);}else if(f&&f.length>0){let p=f[f.length-1];t.insertAfter(p,c),t.insertBefore(c,v$1.comment({text:"---break---"}));}else t.prepend(c);}}else if(typeof n=="object"&&Object.keys(n).length===0){if(!t.nodes?.find(c=>c.type==="atrule"&&c.name===o&&c.params===s)){let c=v$1.atRule({name:o,params:s,raws:{semicolon:true}});t.append(c),t.insertBefore(c,v$1.comment({text:"---break---"}));}}else if(o==="keyframes"){let a=t.nodes?.find(f=>f.type==="atrule"&&f.name==="theme"&&f.params==="inline");a||(a=v$1.atRule({name:"theme",params:"inline",raws:{semicolon:true,between:" ",before:`
11
11
  `}}),t.append(a),t.insertBefore(a,v$1.comment({text:"---break---"})));let c=a.nodes?.find(f=>f.type==="atrule"&&f.name==="keyframes"&&f.params===s),l;if(c?(l=v$1.atRule({name:"keyframes",params:s,raws:{semicolon:true,between:" ",before:`
12
12
  `}}),c.replaceWith(l)):(l=v$1.atRule({name:"keyframes",params:s,raws:{semicolon:true,between:" ",before:`
13
- `}}),a.append(l)),typeof n=="object")for(let[f,p]of Object.entries(n))re(l,f,p);}else if(o==="utility"){let a=t.nodes?.find(c=>c.type==="atrule"&&c.name===o&&c.params===s);if(a){if(typeof n=="object")for(let[c,l]of Object.entries(n))if(typeof l=="string"){let f=a.nodes?.find(u=>u.type==="decl"&&u.prop===c),p=v$1.decl({prop:c,value:l,raws:{semicolon:true,before:`
14
- `}});f?f.replaceWith(p):a.append(p);}else typeof l=="object"&&re(a,c,l);}else {let c=v$1.atRule({name:o,params:s,raws:{semicolon:true,between:" ",before:`
13
+ `}}),a.append(l)),typeof n=="object")for(let[f,p]of Object.entries(n))te(l,f,p);}else if(o==="utility"){let a=t.nodes?.find(c=>c.type==="atrule"&&c.name===o&&c.params===s);if(a){if(typeof n=="object")for(let[c,l]of Object.entries(n))if(typeof l=="string"){let f=a.nodes?.find(u=>u.type==="decl"&&u.prop===c),p=v$1.decl({prop:c,value:l,raws:{semicolon:true,before:`
14
+ `}});f?f.replaceWith(p):a.append(p);}else typeof l=="object"&&te(a,c,l);}else {let c=v$1.atRule({name:o,params:s,raws:{semicolon:true,between:" ",before:`
15
15
  `}});if(t.append(c),t.insertBefore(c,v$1.comment({text:"---break---"})),typeof n=="object")for(let[l,f]of Object.entries(n))if(typeof f=="string"){let p=v$1.decl({prop:l,value:f,raws:{semicolon:true,before:`
16
- `}});c.append(p);}else typeof f=="object"&&re(c,l,f);}}else o==="property"?re(t,r,n):lr(t,o,s,n);}else re(t,r,n);}}}function lr(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 a=o.match(/@([a-zA-Z-]+)\s*(.*)/);if(a){let[,c,l]=a;lr(i,c,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 a=v$1.rule({selector:"temp",raws:{semicolon:!0,between:" ",before:`
16
+ `}});c.append(p);}else typeof f=="object"&&te(c,l,f);}}else o==="property"?te(t,r,n):lr(t,o,s,n);}else te(t,r,n);}}}function lr(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 a=o.match(/@([a-zA-Z-]+)\s*(.*)/);if(a){let[,c,l]=a;lr(i,c,l,s);}}else te(i,o,s);else if(typeof n=="string")try{let s=v$1.parse(`.temp{${n}}`).first;if(s&&s.nodes){let a=v$1.rule({selector:"temp",raws:{semicolon:!0,between:" ",before:`
18
18
  `}});s.nodes.forEach(c=>{if(c.type==="decl"){let l=c.clone();l.raws.before=`
19
- `,a.append(l);}}),a.nodes?.length&&i.append(a);}}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:`
19
+ `,a.append(l);}}),a.nodes?.length&&i.append(a);}}catch(o){throw console.error("Error parsing at-rule content:",n,o),o}}function te(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
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[,a,c]=s,l=v$1.atRule({name:a,params:c,raws:{semicolon:true,before:`
21
21
  `}});n.append(l);}}else if(typeof o=="string"){let s=v$1.decl({prop:i,value:o,raws:{semicolon:true,before:`
22
- `}}),a=n.nodes?.find(c=>c.type==="decl"&&c.prop===i);a?a.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 a=s.clone();a.raws.before=`
23
- `,n?.append(a);}});}catch(i){throw console.error("Error parsing rule content:",t,r,i),i}}var dr=new Set(["text","spacing","radius"]);function je(e){let t=e.trim();return t===""||isNaN(Number(t))?t:`${t}px`}var xn=["--font-weight"];function fr(e,t){let r=dr.has(t),n={},i={},o={};for(let[s,a]of Object.entries(e)){let c=r&&!xn.some(l=>s.endsWith(l));if(a.includes("|")){let[l,f,p]=a.split("|").map(u=>u.trim());n[s]=c?je(l):l,f!==l&&(i[s]=c?je(f):f),p!==f&&(o[s]=c?je(p):p);}else n[s]=c?je(a):a;}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 tt(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"),a=await Sn(s,e??{},t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars,initIndex:r.initIndex});await promises.writeFile(n,a,"utf8"),o.succeed();}async function Sn(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 a=l(r.resolvedPaths.cwd);!a?.dependencies?.["tailwindcss-animate"]&&!a?.devDependencies?.["tailwindcss-animate"]&&n.initIndex&&i.push(In({params:"tw-animate-css"}));}n.cleanupDefaultNextStyles&&i.push(vn()),i.push(Rn(t,{overwriteCssVars:n.overwriteCssVars})),i.push(kn(t)),n.tailwindConfig&&(i.push(Cn(n.tailwindConfig)),i.push(jn(n.tailwindConfig)),i.push(Pn(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,`
22
+ `}}),a=n.nodes?.find(c=>c.type==="decl"&&c.prop===i);a?a.replaceWith(s):n.append(s);}else if(typeof o=="object"){let s=i.startsWith("&")?t.replace(/^([^:]+)/,`$1${i.substring(1)}`):i;te(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 a=s.clone();a.raws.before=`
23
+ `,n?.append(a);}});}catch(i){throw console.error("Error parsing rule content:",t,r,i),i}}var dr=new Set(["text","spacing","radius"]);function Ee(e){let t=e.trim();return t===""||isNaN(Number(t))?t:`${t}px`}var xn=["--font-weight"];function fr(e,t){let r=dr.has(t),n={},i={},o={};for(let[s,a]of Object.entries(e)){let c=r&&!xn.some(l=>s.endsWith(l));if(a.includes("|")){let[l,f,p]=a.split("|").map(u=>u.trim());n[s]=c?Ee(l):l,f!==l&&(i[s]=c?Ee(f):f),p!==f&&(o[s]=c?Ee(p):p);}else n[s]=c?Ee(a):a;}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 tt(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"),a=await Sn(s,e??{},t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars,initIndex:r.initIndex});await promises.writeFile(n,a,"utf8"),o.succeed();}async function Sn(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 a=l(r.resolvedPaths.cwd);!a?.dependencies?.["tailwindcss-animate"]&&!a?.devDependencies?.["tailwindcss-animate"]&&n.initIndex&&i.push(In({params:"tw-animate-css"}));}n.cleanupDefaultNextStyles&&i.push(vn()),i.push(Rn(t,{overwriteCssVars:n.overwriteCssVars})),i.push(kn(t)),n.tailwindConfig&&(i.push(Cn(n.tailwindConfig)),i.push(jn(n.tailwindConfig)),i.push(Pn(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,`
24
24
 
25
25
  `),s}function pr(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 vn(){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()),pr(e);let r=e.nodes.find(n=>n.type==="atrule"&&n.params==="(prefers-color-scheme: dark)");r&&(pr(r),r.nodes.length===0&&r.remove());}}}function Rn(e,t){return {postcssPlugin:"update-css-vars-v4",Once(r){let n=(o,s)=>{let a=r.nodes?.find(c=>c.type==="rule"&&c.selector===o);!a&&Object.keys(s).length>0&&(a=v$1.rule({selector:o,nodes:[],raws:{semicolon:true,between:" ",before:`
26
26
  `}}),r.append(a),r.insertBefore(a,v$1.comment({text:"---break---"}))),Object.entries(s).forEach(([c,l])=>{let f=`--${c.replace(/^--/,"")}`;$n(l)&&(l=`hsl(${l})`);let p=v$1.decl({prop:f,value:l,raws:{semicolon:true}}),u=a?.nodes.find(h=>h.type==="decl"&&h.prop===f);t.overwriteCssVars?u?u.replaceWith(p):a?.append(p):u||a?.append(p);});},i=(o,s,a)=>{if(Object.keys(a).length===0)return;let c=`(max-width: ${o})`,l=r.nodes?.find(p=>p.type==="atrule"&&p.name==="media"&&p.params===c);l||(l=v$1.atRule({name:"media",params:c,nodes:[],raws:{semicolon:true,between:" ",before:`
@@ -32,27 +32,27 @@ Once configured, you can use the cli to add components.`),o.break(),process.exit
32
32
  `}});for(let[l,f]of Object.entries(a.data)){let p=v$1.rule({selector:l,nodes:Object.entries(f).map(([u,h])=>v$1.decl({prop:u,value:h,raws:{semicolon:true,before:`
33
33
  `,between:": "}})),raws:{semicolon:true,between:" ",before:`
34
34
  `}});c.append(p);}r.append(c),r.insertBefore(c,v$1.comment({text:"---break---"}));}}}}function jn(e){return {postcssPlugin:"update-tailwind-config-animation",Once(t){if(!e?.theme?.extend?.animation)return;let r=rt(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 a=`--animate-${o}`;if(n?.find(l=>l.prop===a))continue;let c=v$1.decl({prop:a,value:s,raws:{semicolon:true,between:": ",before:`
35
- `}});r.append(c);}}}}function En(e){return e.nodes[0].toString().includes("'")?"single":"double"}function $n(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 L(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 On(r),s="";if(Tn(r)&&o$1==="npm")if(n.silent)s="force";else {i.stopAndPersist(),o.warn(`
35
+ `}});r.append(c);}}}}function En(e){return e.nodes[0].toString().includes("'")?"single":"double"}function $n(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 L(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 On(r),s="";if(Nn(r)&&o$1==="npm")if(n.silent)s="force";else {i.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 a=await ut([{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"}]}]);a&&(s=a.flag);}i?.start(),await Fn(o$1,e,t,r.resolvedPaths.cwd,s),i?.succeed();}function Tn(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 On(e){return l(e.resolvedPaths.cwd,false)?.dependencies?.expo?"expo":a$2(e.resolvedPaths.cwd)}async function Fn(e,t,r,n,i){if(e==="npm")return An(t,r,n,i);if(e==="deno")return _n(t,r,n);if(e==="expo")return Dn(t,r,n);if(t?.length)try{await execa(e,["add",...t],{cwd:n});}catch{await Ee(e,"add",t,n);}if(r?.length)try{await execa(e,["add","-D",...r],{cwd:n});}catch{await Ee(e,"add -D",r,n);}}async function An(e,t,r,n){let i=n?[`--${n}`]:[];if(e.length)try{await execa("npm",["install",...i,...e],{cwd:r});}catch{await Ee("npm",`install${i.length?` ${i.join(" ")}`:""}`,e,r);}if(t.length)try{await execa("npm",["install",...i,"-D",...t],{cwd:r});}catch{await Ee("npm",`install${i.length?` ${i.join(" ")}`:""} -D`,t,r);}}async function Ee(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(`
38
+ `);let a=await ut([{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"}]}]);a&&(s=a.flag);}i?.start(),await Fn(o$1,e,t,r.resolvedPaths.cwd,s),i?.succeed();}function Nn(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 On(e){return l(e.resolvedPaths.cwd,false)?.dependencies?.expo?"expo":a$2(e.resolvedPaths.cwd)}async function Fn(e,t,r,n,i){if(e==="npm")return An(t,r,n,i);if(e==="deno")return _n(t,r,n);if(e==="expo")return Dn(t,r,n);if(t?.length)try{await execa(e,["add",...t],{cwd:n});}catch{await $e(e,"add",t,n);}if(r?.length)try{await execa(e,["add","-D",...r],{cwd:n});}catch{await $e(e,"add -D",r,n);}}async function An(e,t,r,n){let i=n?[`--${n}`]:[];if(e.length)try{await execa("npm",["install",...i,...e],{cwd:r});}catch{await $e("npm",`install${i.length?` ${i.join(" ")}`:""}`,e,r);}if(t.length)try{await execa("npm",["install",...i,"-D",...t],{cwd:r});}catch{await $e("npm",`install${i.length?` ${i.join(" ")}`:""} -D`,t,r);}}async function $e(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
39
  Failed to install: ${i.join(", ")}. You may need to install them manually.
40
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 Dn(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 it(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 a=existsSync(o$1),c=E__default.basename(o$1),l=Object.entries(e).map(([h,g])=>`${h}=${g}`).join(`
41
41
  `),f=[],p$1=null,u=null;if(a){let h=await promises.readFile(o$1,"utf-8"),g=z$1(h,l);if(f=y(h,l),f.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(c)}:`),!r.silent)for(let y of f)o.log(` ${a$1.success("+")} ${y}`);}else n?.stop();}else if(await promises.writeFile(o$1,l+`
42
42
  `,"utf-8"),u=E__default.relative(i,o$1),f=Object.keys(e),n?.succeed(`Added the following variables to ${a$1.info(c)}:`),!r.silent)for(let h of f)o.log(` ${a$1.success("+")} ${h}`);return !r.silent&&f.length>0&&o.break(),{envVarsAdded:f,envFileUpdated:p$1,envFileCreated:u}}async function gr(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=Bn(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 Bn(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 ot(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 Gn(e,t,n),i?.succeed("Updating fonts.");}catch(o){throw i?.fail("Failed to update fonts."),o}}async function Gn(e,t,r){let n=await Jn(t,r);if(!n)return;let i=await promises.readFile(n,"utf-8"),o=await Kn(i,e);o!==i&&await promises.writeFile(n,o,"utf-8");}async function Jn(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 a of s){let c=E__default.join(r,a);if(existsSync(c))return c}return null}async function Kn(e,t,r){let i=new Project({compilerOptions:{}}).createSourceFile("layout.tsx",e,{scriptKind:ScriptKind.TSX}),o=t.filter(c=>c.font.provider==="google"),s=[];for(let c of o){let l=c.font.import;if(!l)continue;let f=c.font.variable.replace(/^--/,"").replace(/-([a-z])/g,(g,y)=>y.toUpperCase()),p=i.getImportDeclaration(g=>g.getModuleSpecifierValue()==="next/font/google"),u=Yn(c);p?p.getNamedImports().some(R=>R.getName()===l)||p.addNamedImport(l):i.addImportDeclaration({moduleSpecifier:"next/font/google",namedImports:[l]});let h=qn(i,c.font.variable);if(h)h.setInitializer(`${l}(${u})`),h.getName()!==f&&h.rename(f);else {let g=Hn(i);i.insertVariableStatement(g,{declarationKind:VariableDeclarationKind.Const,declarations:[{name:f,initializer:`${l}(${u})`}]}).appendWhitespace(`
43
- `);}s.push(f);}let a=new Set(o.map(c=>c.font.variable));return Zn(i,a),ei(i),s.length>0&&Xn(i,s),ti(i),i.getFullText()}function Yn(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 qn(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 a=o.getArguments();if(a.length===0)continue;let c=a[0].getText();if(c.includes("variable:")&&c.includes(t))return i}return null}function Hn(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function Xn(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(f=>`${f}.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),a=s.getInitializer();if(!a)return;let c=t.map(l=>`${l}.variable`);if(a.getKind()===SyntaxKind.StringLiteral){let l=a.getText().slice(1,-1);we(e),s.setInitializer(`{cn("${l}", ${c.join(", ")})}`);}else if(a.getKind()===SyntaxKind.JsxExpression){let l=a.asKindOrThrow(SyntaxKind.JsxExpression),f=l.getExpression();if(!f)return;let p=f.getText();if(p.startsWith("cn(")){if(c.every(y=>p.includes(y)))continue;let h=ri(p),g=ni(h,c);l.replaceWithText(`{${g}}`);}else if(/^\w+\.variable$/.test(p)){if(c.includes(p))continue;c.length===1?l.replaceWithText(`{${c[0]}}`):(we(e),l.replaceWithText(`{cn(${c.join(", ")})}`));}else if(p.startsWith("`")&&p.endsWith("`")){let u=Qn(p).filter(h=>!/^\w+\.variable$/.test(h));we(e),l.replaceWithText(`{cn(${[...u,...c].join(", ")})}`);}else we(e),l.replaceWithText(`{cn(${p}, ${c.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 Qn(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 a of s)t.push(`"${a}"`);}return [...t,...r]}function Zn(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 a=o.getArguments();if(a.length===0)continue;let c=a[0].getText();if(!c.includes("variable:"))continue;let l=c.match(/variable:\s*['"]([^'"]+)['"]/);if(!l)continue;let f=l[1];t.has(f)||r.push(n);}for(let n of r)n.remove();}function ei(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(),a=n.replace(s,"");new RegExp(`\\b${o}\\b`).test(a)||i.remove();}t.getNamedImports().length===0&&t.remove();}function ti(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),a=s.getInitializer();if(a&&a.getKind()===SyntaxKind.JsxExpression){let c=a.asKindOrThrow(SyntaxKind.JsxExpression),l=c.getExpression();if(!l)continue;let f=l.getText();if(f.startsWith("`")&&f.endsWith("`")){let p=f.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(f.startsWith("cn(")){let p=f;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]):c.replaceWithText(`{${p}}`);}}}}}function ri(e){return e.replace(/,?\s*\w+\.variable/g,"").replace(/cn\(\s*,/,"cn(")}function ni(e,t){let r=t.join(", ");return e.replace(/\)$/,`, ${r})`)}async function st(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 si(e,t,n,{...r,isRemote:e?.length===1&&!!e[0].match(/^https?:\/\//)}):await oi(e,t,r)}async function oi(e,t,r){if(!r.baseStyle&&!e.length)return;let n=p("Checking registry.",{silent:r.silent})?.start(),i=await S(e,F(t));if(!i)return n?.fail(),T(new Error("Failed to fetch components from registry."));try{wr(i.files??[],t.resolvedPaths.cwd);}catch(s){return n?.fail(),T(s)}n?.succeed(),i=await gr(i,t),await st(i.tailwind?.config,t,{silent:r.silent});let o$1=await hr(e,t);await tt(i.cssVars,t,{cleanupDefaultNextStyles:r.isNewProject,silent:r.silent,tailwindConfig:i.tailwind?.config,overwriteCssVars:o$1,initIndex:r.baseStyle}),await et(i.css,t,{silent:r.silent}),await it(i.envVars,t,{silent:r.silent}),await ot(i.fonts,t,{silent:r.silent}),await B(i.files,t,{overwrite:r.overwrite,silent:r.silent,path:r.path}),await L(i.dependencies,i.devDependencies,t,{silent:r.silent}),i.docs&&o.info(i.docs);}async function si(e,t,r,n){if(!n.baseStyle&&!e.length)return;let i$1=p("Checking registry.",{silent:n.silent})?.start(),o$1=await S(e,F(t));if(!o$1)return i$1?.fail(),T(new Error("Failed to fetch components from registry."));try{wr(o$1.files??[],t.resolvedPaths.cwd);}catch(g){return i$1?.fail(),T(g)}i$1?.succeed();let s=[],a=[],c=[],l=p("Installing components.")?.start(),f=r.ui,p$1=j(t.resolvedPaths.cwd,f.resolvedPaths.ui);if(o$1.tailwind?.config&&(await st(o$1.tailwind?.config),a.push(E__default.relative(p$1,f.resolvedPaths.tailwindConfig))),o$1.cssVars){let g=await hr(e,t);await tt(o$1.cssVars,f,{silent:true,tailwindConfig:o$1.tailwind?.config,overwriteCssVars:g}),a.push(E__default.relative(p$1,f.resolvedPaths.tailwindCss));}o$1.css&&(await et(o$1.css,f,{silent:true}),a.push(E__default.relative(p$1,f.resolvedPaths.tailwindCss))),o$1.envVars&&await it(o$1.envVars,f,{silent:true}),await ot(o$1.fonts,f,{silent:true}),await L(o$1.dependencies,o$1.devDependencies,f,{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 B(y,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)))),a.push(...F.filesUpdated.map(W=>E__default.relative(S,E__default.join(H,W)))),c.push(...F.filesSkipped.map(W=>E__default.relative(S,E__default.join(H,W))));}if(l?.succeed(),s.sort(),a.sort(),c.sort(),!(s.length||a.length)&&!c.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(a.length){p(`Updated ${a.length} ${a.length===1?"file":"files"}:`,{silent:n.silent})?.info();for(let g of a)o.log(` - ${g}`);}if(c.length){p(`Skipped ${c.length} ${a.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:n.silent})?.info();for(let g of c)o.log(` - ${g}`);}o$1.docs&&o.info(o$1.docs);}async function hr(e,t){let r=await V$1(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 wr(e,t){for(let r of e)if(r?.target&&!ar(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}var lt="https://codeload.github.com/createui/templates/tar.gz/main",_={next:"next","next-monorepo":"next-monorepo",vite:"vite",start:"start"};async function Ne(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[a]=await R(e.components),{meta:c}=z.object({meta:z.object({nextVersion:z.string()})}).parse(a);n=c.nextVersion,t=_.next;}catch(a){o.break(),T(a);}if(!e.force){let{type:a,name:c}=await ut([{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=a??t,r=c??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 ci(s,{version:n,cwd:e.cwd,packageManager:o$1,srcDir:!!e.srcDir}),t===_["next-monorepo"]&&await li(s,{packageManager:o$1}),t===_.vite&&await mi(s,{packageManager:o$1}),t===_.start&&await fi(s,{packageManager:o$1}),{projectPath:s,projectName:r,template:t}}async function ci(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 li(e,t){let r=p("Creating a new Next.js monorepo. This may take a few minutes.").start();try{let n=E__default.join(ct.tmpdir(),`createui-template-${Date.now()}`);await x.ensureDir(n);let i=await fetch(lt);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 a=E__default.join(e,"package.json");if(x.existsSync(a)){let l=await x.readFile(a,"utf8"),f=JSON.parse(l);f.name=e.split("/").pop(),await x.writeFile(a,JSON.stringify(f,null,2));}let c=process.cwd();await execa("git",["--version"],{cwd:e}),await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","Initial commit"],{cwd:e}),r?.succeed("Creating a new Next.js monorepo.");}catch(n){r?.fail("Something went wrong creating a new Next.js monorepo."),T(n);}}async function mi(e,t){let r=p("Creating a new Vite project. This may take a few minutes.").start();try{let n=E__default.join(ct.tmpdir(),`createui-template-${Date.now()}`);await x.ensureDir(n);let i=await fetch(lt);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 c=E__default.join(e,"pnpm-lock.yaml");x.existsSync(c)&&await x.remove(c);}await execa(t.packageManager,["install"],{cwd:e});let a=E__default.join(e,"package.json");if(x.existsSync(a)){let c=await x.readFile(a,"utf8"),l=JSON.parse(c);l.name=e.split("/").pop(),await x.writeFile(a,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."),T(n);}}async function fi(e,t){let r=p("Creating a new TanStack Start project. This may take a few minutes.").start();try{let n=E__default.join(ct.tmpdir(),`createui-template-${Date.now()}`);await x.ensureDir(n);let i=await fetch(lt);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 c=E__default.join(e,"pnpm-lock.yaml");x.existsSync(c)&&await x.remove(c);}await execa(t.packageManager,["install"],{cwd:e});let a=E__default.join(e,"package.json");if(x.existsSync(a)){let c=await x.readFile(a,"utf8"),l=JSON.parse(c);l.name=e.split("/").pop(),await x.writeFile(a,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."),T(n);}}async function V(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 yr(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 br(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 mt(e){let t=`${e}${ye}`;if(!x.existsSync(t))return false;try{return x.unlinkSync(t),!0}catch{return false}}var _e="bradlc.vscode-tailwindcss",ft="tailwindCSS.experimental.configFile",Oe="tailwindCSS.classFunctions",pt=["cva","cn","cx","clsx","tv"],De={insertSpaces:true,tabSize:2};async function Sr(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"),a=E__default.join(o$1,"extensions.json"),c=p("Configuring VS Code IntelliSense.",{silent:t.silent}).start();await promises.mkdir(o$1,{recursive:true});let l=await ui(s,i),f=await gi(a);return l||f?(c.succeed("Configured VS Code IntelliSense."),t.silent||(l&&o.log(` ${a$1.success("+")} .vscode/settings.json ${a$1.info("(Tailwind IntelliSense)")}`),f&&o.log(` ${a$1.success("+")} .vscode/extensions.json ${a$1.info(`(${_e})`)}`),o.break())):c.stop(),{settingsUpdated:l,extensionsUpdated:f}}async function ui(e,t){if(!existsSync(e)){let o=JSON.stringify({[ft]:t,[Oe]:pt},null,2);return await promises.writeFile(e,`${o}
45
- `,"utf8"),true}let r=await promises.readFile(e,"utf8"),n=false;parse(r)?.[ft]===void 0&&(r=applyEdits(r,modify(r,[ft],t,{formattingOptions:De})),n=true);let i=parse(r)?.[Oe];if(!Array.isArray(i))r=applyEdits(r,modify(r,[Oe],pt,{formattingOptions:De})),n=true;else {let o=i.length;for(let s of pt)i.includes(s)||(r=applyEdits(r,modify(r,[Oe,o],s,{isArrayInsertion:true,formattingOptions:De})),o+=1,n=true);}return n&&await promises.writeFile(e,r,"utf8"),n}async function gi(e){if(!existsSync(e)){let o=JSON.stringify({recommendations:[_e]},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(_e))return false;let i=modify(t,["recommendations",n.length],_e,{isArrayInsertion:true,formattingOptions:De});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?mt(t):br(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()}),Rr=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 V(r.cwd),e.length>0){let n=F(k({resolvedPaths:{cwd:r.cwd}})),i=E__default.resolve(r.cwd,"components.json");if(x.existsSync(i)){let s=await x.readJson(i),a$1=a.partial().parse(s),c=k({resolvedPaths:{cwd:r.cwd}});n=F({...a$1,resolvedPaths:{...c.resolvedPaths,cwd:r.cwd}}),yr(i);}let[o]=await V$1([e[0]],{config:n});o?.type==="registry:base"&&(o.config&&(n=F(vr(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.
43
+ `);}s.push(f);}let a=new Set(o.map(c=>c.font.variable));return Zn(i,a),ei(i),s.length>0&&Xn(i,s),ti(i),i.getFullText()}function Yn(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 qn(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 a=o.getArguments();if(a.length===0)continue;let c=a[0].getText();if(c.includes("variable:")&&c.includes(t))return i}return null}function Hn(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function Xn(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(f=>`${f}.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),a=s.getInitializer();if(!a)return;let c=t.map(l=>`${l}.variable`);if(a.getKind()===SyntaxKind.StringLiteral){let l=a.getText().slice(1,-1);we(e),s.setInitializer(`{cn("${l}", ${c.join(", ")})}`);}else if(a.getKind()===SyntaxKind.JsxExpression){let l=a.asKindOrThrow(SyntaxKind.JsxExpression),f=l.getExpression();if(!f)return;let p=f.getText();if(p.startsWith("cn(")){if(c.every(y=>p.includes(y)))continue;let h=ri(p),g=ni(h,c);l.replaceWithText(`{${g}}`);}else if(/^\w+\.variable$/.test(p)){if(c.includes(p))continue;c.length===1?l.replaceWithText(`{${c[0]}}`):(we(e),l.replaceWithText(`{cn(${c.join(", ")})}`));}else if(p.startsWith("`")&&p.endsWith("`")){let u=Qn(p).filter(h=>!/^\w+\.variable$/.test(h));we(e),l.replaceWithText(`{cn(${[...u,...c].join(", ")})}`);}else we(e),l.replaceWithText(`{cn(${p}, ${c.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 Qn(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 a of s)t.push(`"${a}"`);}return [...t,...r]}function Zn(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 a=o.getArguments();if(a.length===0)continue;let c=a[0].getText();if(!c.includes("variable:"))continue;let l=c.match(/variable:\s*['"]([^'"]+)['"]/);if(!l)continue;let f=l[1];t.has(f)||r.push(n);}for(let n of r)n.remove();}function ei(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(),a=n.replace(s,"");new RegExp(`\\b${o}\\b`).test(a)||i.remove();}t.getNamedImports().length===0&&t.remove();}function ti(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),a=s.getInitializer();if(a&&a.getKind()===SyntaxKind.JsxExpression){let c=a.asKindOrThrow(SyntaxKind.JsxExpression),l=c.getExpression();if(!l)continue;let f=l.getText();if(f.startsWith("`")&&f.endsWith("`")){let p=f.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(f.startsWith("cn(")){let p=f;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]):c.replaceWithText(`{${p}}`);}}}}}function ri(e){return e.replace(/,?\s*\w+\.variable/g,"").replace(/cn\(\s*,/,"cn(")}function ni(e,t){let r=t.join(", ");return e.replace(/\)$/,`, ${r})`)}async function st(e,t,r){}async function re(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 si(e,t,n,{...r,isRemote:e?.length===1&&!!e[0].match(/^https?:\/\//)}):await oi(e,t,r)}async function oi(e,t,r){if(!r.baseStyle&&!e.length)return;let n=p("Checking registry.",{silent:r.silent})?.start(),i=await S(e,F(t));if(!i)return n?.fail(),T(new Error("Failed to fetch components from registry."));try{wr(i.files??[],t.resolvedPaths.cwd);}catch(s){return n?.fail(),T(s)}n?.succeed(),i=await gr(i,t),await st(i.tailwind?.config,t,{silent:r.silent});let o$1=await hr(e,t);await tt(i.cssVars,t,{cleanupDefaultNextStyles:r.isNewProject,silent:r.silent,tailwindConfig:i.tailwind?.config,overwriteCssVars:o$1,initIndex:r.baseStyle}),await et(i.css,t,{silent:r.silent}),await it(i.envVars,t,{silent:r.silent}),await ot(i.fonts,t,{silent:r.silent}),await B(i.files,t,{overwrite:r.overwrite,silent:r.silent,path:r.path}),await L(i.dependencies,i.devDependencies,t,{silent:r.silent}),i.docs&&o.info(i.docs);}async function si(e,t,r,n){if(!n.baseStyle&&!e.length)return;let i$1=p("Checking registry.",{silent:n.silent})?.start(),o$1=await S(e,F(t));if(!o$1)return i$1?.fail(),T(new Error("Failed to fetch components from registry."));try{wr(o$1.files??[],t.resolvedPaths.cwd);}catch(g){return i$1?.fail(),T(g)}i$1?.succeed();let s=[],a=[],c=[],l=p("Installing components.")?.start(),f=r.ui,p$1=j(t.resolvedPaths.cwd,f.resolvedPaths.ui);if(o$1.tailwind?.config&&(await st(o$1.tailwind?.config),a.push(E__default.relative(p$1,f.resolvedPaths.tailwindConfig))),o$1.cssVars){let g=await hr(e,t);await tt(o$1.cssVars,f,{silent:true,tailwindConfig:o$1.tailwind?.config,overwriteCssVars:g}),a.push(E__default.relative(p$1,f.resolvedPaths.tailwindCss));}o$1.css&&(await et(o$1.css,f,{silent:true}),a.push(E__default.relative(p$1,f.resolvedPaths.tailwindCss))),o$1.envVars&&await it(o$1.envVars,f,{silent:true}),await ot(o$1.fonts,f,{silent:true}),await L(o$1.dependencies,o$1.devDependencies,f,{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 B(y,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)))),a.push(...F.filesUpdated.map(W=>E__default.relative(S,E__default.join(H,W)))),c.push(...F.filesSkipped.map(W=>E__default.relative(S,E__default.join(H,W))));}if(l?.succeed(),s.sort(),a.sort(),c.sort(),!(s.length||a.length)&&!c.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(a.length){p(`Updated ${a.length} ${a.length===1?"file":"files"}:`,{silent:n.silent})?.info();for(let g of a)o.log(` - ${g}`);}if(c.length){p(`Skipped ${c.length} ${a.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:n.silent})?.info();for(let g of c)o.log(` - ${g}`);}o$1.docs&&o.info(o$1.docs);}async function hr(e,t){let r=await V$1(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 wr(e,t){for(let r of e)if(r?.target&&!ar(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}var lt="https://codeload.github.com/createui/templates/tar.gz/main",_={next:"next","next-monorepo":"next-monorepo",vite:"vite",start:"start"};async function Ne(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[a]=await R(e.components),{meta:c}=z.object({meta:z.object({nextVersion:z.string()})}).parse(a);n=c.nextVersion,t=_.next;}catch(a){o.break(),T(a);}if(!e.force){let{type:a,name:c}=await ut([{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=a??t,r=c??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 ci(s,{version:n,cwd:e.cwd,packageManager:o$1,srcDir:!!e.srcDir}),t===_["next-monorepo"]&&await li(s,{packageManager:o$1}),t===_.vite&&await mi(s,{packageManager:o$1}),t===_.start&&await fi(s,{packageManager:o$1}),{projectPath:s,projectName:r,template:t}}async function ci(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 li(e,t){let r=p("Creating a new Next.js monorepo. This may take a few minutes.").start();try{let n=E__default.join(ct.tmpdir(),`createui-template-${Date.now()}`);await x.ensureDir(n);let i=await fetch(lt);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 a=E__default.join(e,"package.json");if(x.existsSync(a)){let l=await x.readFile(a,"utf8"),f=JSON.parse(l);f.name=e.split("/").pop(),await x.writeFile(a,JSON.stringify(f,null,2));}let c=process.cwd();await execa("git",["--version"],{cwd:e}),await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","Initial commit"],{cwd:e}),r?.succeed("Creating a new Next.js monorepo.");}catch(n){r?.fail("Something went wrong creating a new Next.js monorepo."),T(n);}}async function mi(e,t){let r=p("Creating a new Vite project. This may take a few minutes.").start();try{let n=E__default.join(ct.tmpdir(),`createui-template-${Date.now()}`);await x.ensureDir(n);let i=await fetch(lt);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 c=E__default.join(e,"pnpm-lock.yaml");x.existsSync(c)&&await x.remove(c);}await execa(t.packageManager,["install"],{cwd:e});let a=E__default.join(e,"package.json");if(x.existsSync(a)){let c=await x.readFile(a,"utf8"),l=JSON.parse(c);l.name=e.split("/").pop(),await x.writeFile(a,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."),T(n);}}async function fi(e,t){let r=p("Creating a new TanStack Start project. This may take a few minutes.").start();try{let n=E__default.join(ct.tmpdir(),`createui-template-${Date.now()}`);await x.ensureDir(n);let i=await fetch(lt);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 c=E__default.join(e,"pnpm-lock.yaml");x.existsSync(c)&&await x.remove(c);}await execa(t.packageManager,["install"],{cwd:e});let a=E__default.join(e,"package.json");if(x.existsSync(a)){let c=await x.readFile(a,"utf8"),l=JSON.parse(c);l.name=e.split("/").pop(),await x.writeFile(a,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."),T(n);}}async function V(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 yr(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 br(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 mt(e){let t=`${e}${ye}`;if(!x.existsSync(t))return false;try{return x.unlinkSync(t),!0}catch{return false}}var De="bradlc.vscode-tailwindcss",ft="tailwindCSS.experimental.configFile",Fe="tailwindCSS.classFunctions",pt=["cva","cn","cx","clsx","tv"],Le={insertSpaces:true,tabSize:2};async function Sr(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"),a=E__default.join(o$1,"extensions.json"),c=p("Configuring VS Code IntelliSense.",{silent:t.silent}).start();await promises.mkdir(o$1,{recursive:true});let l=await ui(s,i),f=await gi(a);return l||f?(c.succeed("Configured VS Code IntelliSense."),t.silent||(l&&o.log(` ${a$1.success("+")} .vscode/settings.json ${a$1.info("(Tailwind IntelliSense)")}`),f&&o.log(` ${a$1.success("+")} .vscode/extensions.json ${a$1.info(`(${De})`)}`),o.break())):c.stop(),{settingsUpdated:l,extensionsUpdated:f}}async function ui(e,t){if(!existsSync(e)){let o=JSON.stringify({[ft]:t,[Fe]:pt},null,2);return await promises.writeFile(e,`${o}
45
+ `,"utf8"),true}let r=await promises.readFile(e,"utf8"),n=false;parse(r)?.[ft]===void 0&&(r=applyEdits(r,modify(r,[ft],t,{formattingOptions:Le})),n=true);let i=parse(r)?.[Fe];if(!Array.isArray(i))r=applyEdits(r,modify(r,[Fe],pt,{formattingOptions:Le})),n=true;else {let o=i.length;for(let s of pt)i.includes(s)||(r=applyEdits(r,modify(r,[Fe,o],s,{isArrayInsertion:true,formattingOptions:Le})),o+=1,n=true);}return n&&await promises.writeFile(e,r,"utf8"),n}async function gi(e){if(!existsSync(e)){let o=JSON.stringify({recommendations:[De]},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(De))return false;let i=modify(t,["recommendations",n.length],De,{isArrayInsertion:true,formattingOptions:Le});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?mt(t):br(t)});var Me=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()}),Rr=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=Me.parse({cwd:E__default.resolve(t.cwd),isNewProject:!1,components:e,...t});if(await V(r.cwd),e.length>0){let n=F(k({resolvedPaths:{cwd:r.cwd}})),i=E__default.resolve(r.cwd,"components.json");if(x.existsSync(i)){let s=await x.readJson(i),a$1=a.partial().parse(s),c=k({resolvedPaths:{cwd:r.cwd}});n=F({...a$1,resolvedPaths:{...c.resolvedPaths,cwd:r.cwd}}),yr(i);}let[o]=await V$1([e[0]],{config:n});o?.type==="registry:base"&&(o.config&&(n=F(vr(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
47
  You may now add components.`),mt(E__default.resolve(r.cwd,"components.json")),o.break();}catch(r){o.break(),T(r);}});async function pe(e){let t$1,r;if(e.skipPreflight)t$1=await m(e.cwd);else {let y=await sr(e);if(y.errors["1"]){let{projectPath:R,template:S}=await Ne(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 n$1=await n(e.cwd,t$1),i=n$1?await bi(n$1,e):await yi(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:y}=await ut({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",a=e.neutral??t,c=e.fontVariant??v,l=[...e.baseStyle?["index"]:[],...e.baseStyle?[`theme-${s}`]:[],...e.baseStyle?[`neutral-${a}`]:[],...e.baseStyle?[`font-variant-${c}`]:[],...e.components??[]],f$1=p("Writing components.json.").start(),p$1=E__default.resolve(e.cwd,"components.json"),u=`${p$1}${ye}`,h=(y,R)=>vr(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"),f$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 Sr(g$1,{silent:e.silent}),g$1}async function yi(e$1=null){o.info("");let t$1=await da(),r$1=await ut([{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 bi(e,t$1){let r$1=e.tailwind.cssVariables,n=e.iconLibrary??"createui";if(!t$1.defaults){let a=await da(),c=await ut([{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:a.map(l=>({title:l.label,value:l.name})),initial:Math.max(0,a.findIndex(l=>l.name===v))}]);t$1.theme=c.theme??t$1.theme??"indigo",t$1.neutral=c.neutral??t$1.neutral??t,t$1.fontVariant=c.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 Ir(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)}.
48
+ `,"utf8"),f$1.succeed();let g$1=await g(e.cwd,o);return await re(l,g$1,{overwrite:true,silent:e.silent,baseStyle:e.baseStyle,isNewProject:e.isNewProject||t$1?.framework.name==="next-app"}),await Sr(g$1,{silent:e.silent}),g$1}async function yi(e$1=null){o.info("");let t$1=await da(),r$1=await ut([{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 bi(e,t$1){let r$1=e.tailwind.cssVariables,n=e.iconLibrary??"createui";if(!t$1.defaults){let a=await da(),c=await ut([{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:a.map(l=>({title:l.label,value:l.name})),initial:Math.max(0,a.findIndex(l=>l.name===v))}]);t$1.theme=c.theme??t$1.theme??"indigo",t$1.neutral=c.neutral??t$1.neutral??t,t$1.fontVariant=c.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 Ir(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
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 Pr(e,t){let r=E__default.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await J__default.stat(r)).isFile())return;let[n]=await V$1([e],{config:t});if(!n?.meta?.importSpecifier||!n?.meta?.moduleSpecifier)return;let i=`import { ${n?.meta?.importSpecifier} } from "${n.meta.moduleSpecifier}"
50
50
 
51
51
  export default function Page() {
52
52
  return <${n?.meta?.importSpecifier} />
53
- }`;await J__default.writeFile(r,i,"utf8");}var vi=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(),free:z.boolean()}),Er=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.").option("--free","install the free tier of a component even when logged in with a pro seat.",false).action(async(e,t)=>{try{let r=vi.parse({components:e,cwd:E__default.resolve(t.cwd),...t});r.free&&O(!0),await V(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 V$1([e[0]],{config:n});if(i=p?.type,o$1=i!=="registry:theme",E$1(p)){await ne(e,n,{...r,baseStyle:o$1});return}if(!r.yes&&i==="registry:theme"){o.break();let{confirm:u}=await ut({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 Ri(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:a,config:c}=await Ir(r),l=!1;if(a["3"]){let{proceed:p}=await ut({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)),c=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 f$1=!1;if(a["1"]){let{projectPath:p,template:u}=await Ne({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"),c=await f(r.cwd)):(c=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,f$1=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//));}if(!c)throw new Error(`Failed to read config at ${a$1.info(r.cwd)}.`);l||await ne(r.components,c,{...r,baseStyle:o$1}),f$1&&await Pr(r.components[0],c);}catch(r){o.break(),T(r);}});async function Ri(e){let t=await X();if(!t)return o.break(),T(new Error("Failed to fetch registry index.")),[];if(e.all){let i=t.filter(o=>o.meta?.access==="pro");return i.length&&o.info(`Skipping ${i.length} pro item(s): ${i.map(o=>o.name).join(", ")}. Add them by name to install.`),t.filter(o=>o.meta?.access!=="pro").map(o=>o.name).filter(o=>!w.some(s=>s.name===o))}if(e.components?.length)return e.components;let{components:r}=await ut({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"&&i.meta?.access!=="pro"&&!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(""),T(new Error("Something went wrong. Please try again.")),[])}async function Tr(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 Ii=z.object({cwd:z.string(),registryFile:z.string(),outputDir:z.string()}),Or=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=Ii.parse({cwd:E.resolve(t.cwd),registryFile:e,outputDir:t.output}),{resolvePaths:n}=await Tr(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 a of o$2.data.items){s.start(`Building ${a.name}...`),a.$schema="https://createui.co/schema/registry-item.json";for(let l of a.files??[])l.content=await J.readFile(E.resolve(n.cwd,l.path),"utf-8");let c=n$1.safeParse(a);if(!c.success){o.error(`Invalid registry item found for ${a$1.info(a.name)}.`);continue}await J.writeFile(E.resolve(n.outputDir,`${c.data.name}.json`),JSON.stringify(c.data,null,2));}await J.copyFile(n.registryFile,E.resolve(n.outputDir,"registry.json")),s.succeed("Building registry.");}catch(r){o.break(),T(r);}});var ji="https://createui.co",Ei={next:"Next.js",vite:"Vite",start:"TanStack Start"},Fr=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:a}=await ut({type:"text",name:"enteredName",message:"What is your project named?",initial:t.template?`${t.template}-app`:"my-app",format:c=>c.trim(),validate:c=>Pi(E__default.basename(E__default.resolve(c))).validForNewPackages?!0:"Invalid project name. Name should be lowercase, URL-friendly, and not start with a period or underscore."});a||process.exit(0),r=a;}let n=t.template;if(!n){let{selectedTemplate:a}=await ut({type:"select",name:"selectedTemplate",message:`Which ${a$1.info("template")} would you like to use?`,choices:Object.entries(Ei).map(([c,l])=>({title:l,value:c}))});a||process.exit(0),n=a;}let i=t.preset!==void 0?await Ni(t.preset):null;t.preset!==void 0&&!i&&process.exit(0);let o$1;if(i){let a,c;"_isUrl"in i?(a=i.url,c=new URL(i.url).searchParams.get("theme")??"indigo"):(a=$i(i),c=i.theme);let l=F({}),[f]=await V$1([a],{config:l}),p;f?.type==="registry:base"&&f.config&&(p=f.config),o$1=Ve.parse({cwd:E__default.resolve(t.cwd),name:r,components:[a],yes:t.yes,defaults:!1,force:!1,silent:!1,isNewProject:!0,srcDir:t.srcDir,cssVariables:!0,template:n,baseColor:c,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:n,baseStyle:!0,skipPreflight:!1});let s=await pe(o$1);if(s){await ne(["component-example"],s,{baseStyle:!1,silent:!0,overwrite:!0});let a=Ti(n);a.length>0&&await B(a,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(),T(r);}});function $i(e){let t=new URLSearchParams({theme:e.theme,neutralTheme:e.neutralTheme,iconLibrary:e.iconLibrary,fontVariant:e.fontVariant,menuAccent:e.menuAccent,menuColor:e.menuColor});return `${Oi()}?${t.toString()}`}async function Ni(e){if(e===true){let t=await ba(),{selectedPreset:r}=await ut({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}))});return r?t.find(n=>n.name===r)??null:null}if(typeof e=="string"){if(D(e))return {_isUrl:true,url:e};let t=await ca(e);if(!t){let n=(await ba()).map(i=>i.name).join(", ");o.error(`Preset "${e}" not found. Available presets: ${n}`),process.exit(1);}return t}return null}function Ti(e){switch(e){case "vite":return [{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:wt`import { ComponentExample } from "@/components/component-example";
53
+ }`;await J__default.writeFile(r,i,"utf8");}var vi=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(),free:z.boolean()}),Er=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.").option("--free","install the free tier of a component even when logged in with a pro seat.",false).action(async(e,t)=>{try{let r=vi.parse({components:e,cwd:E__default.resolve(t.cwd),...t});r.free&&O(!0),await V(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 V$1([e[0]],{config:n});if(i=p?.type,o$1=i!=="registry:theme",E$1(p)){await re(e,n,{...r,baseStyle:o$1});return}if(!r.yes&&i==="registry:theme"){o.break();let{confirm:u}=await ut({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 Ri(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:a,config:c}=await Ir(r),l=!1;if(a["3"]){let{proceed:p}=await ut({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)),c=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 f$1=!1;if(a["1"]){let{projectPath:p,template:u}=await Ne({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"),c=await f(r.cwd)):(c=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,f$1=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//));}if(!c)throw new Error(`Failed to read config at ${a$1.info(r.cwd)}.`);l||await re(r.components,c,{...r,baseStyle:o$1}),f$1&&await Pr(r.components[0],c);}catch(r){o.break(),T(r);}});async function Ri(e){let t=await X();if(!t)return o.break(),T(new Error("Failed to fetch registry index.")),[];if(e.all){let i=t.filter(o=>o.meta?.access==="pro");return i.length&&o.info(`Skipping ${i.length} pro item(s): ${i.map(o=>o.name).join(", ")}. Add them by name to install.`),t.filter(o=>o.meta?.access!=="pro").map(o=>o.name).filter(o=>!w.some(s=>s.name===o))}if(e.components?.length)return e.components;let{components:r}=await ut({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"&&i.meta?.access!=="pro"&&!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(""),T(new Error("Something went wrong. Please try again.")),[])}async function Nr(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 Ii=z.object({cwd:z.string(),registryFile:z.string(),outputDir:z.string()}),Or=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=Ii.parse({cwd:E.resolve(t.cwd),registryFile:e,outputDir:t.output}),{resolvePaths:n}=await Nr(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 a of o$2.data.items){s.start(`Building ${a.name}...`),a.$schema="https://createui.co/schema/registry-item.json";for(let l of a.files??[])l.content=await J.readFile(E.resolve(n.cwd,l.path),"utf-8");let c=n$1.safeParse(a);if(!c.success){o.error(`Invalid registry item found for ${a$1.info(a.name)}.`);continue}await J.writeFile(E.resolve(n.outputDir,`${c.data.name}.json`),JSON.stringify(c.data,null,2));}await J.copyFile(n.registryFile,E.resolve(n.outputDir,"registry.json")),s.succeed("Building registry.");}catch(r){o.break(),T(r);}});var ji="https://createui.co",Ei={next:"Next.js",vite:"Vite",start:"TanStack Start"},Fr=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:a}=await ut({type:"text",name:"enteredName",message:"What is your project named?",initial:t.template?`${t.template}-app`:"my-app",format:c=>c.trim(),validate:c=>Pi(E__default.basename(E__default.resolve(c))).validForNewPackages?!0:"Invalid project name. Name should be lowercase, URL-friendly, and not start with a period or underscore."});a||process.exit(0),r=a;}let n=t.template;if(!n){let{selectedTemplate:a}=await ut({type:"select",name:"selectedTemplate",message:`Which ${a$1.info("template")} would you like to use?`,choices:Object.entries(Ei).map(([c,l])=>({title:l,value:c}))});a||process.exit(0),n=a;}let i=t.preset!==void 0?await Ti(t.preset):null;t.preset!==void 0&&!i&&process.exit(0);let o$1;if(i){let a,c;"_isUrl"in i?(a=i.url,c=new URL(i.url).searchParams.get("theme")??"indigo"):(a=$i(i),c=i.theme);let l=F({}),[f]=await V$1([a],{config:l}),p;f?.type==="registry:base"&&f.config&&(p=f.config),o$1=Me.parse({cwd:E__default.resolve(t.cwd),name:r,components:[a],yes:t.yes,defaults:!1,force:!1,silent:!1,isNewProject:!0,srcDir:t.srcDir,cssVariables:!0,template:n,baseColor:c,baseStyle:!1,registryBaseConfig:p,skipPreflight:!1});}else o$1=Me.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:n,baseStyle:!0,skipPreflight:!1});let s=await pe(o$1);if(s){await re(["component-example"],s,{baseStyle:!1,silent:!0,overwrite:!0});let a=Ni(n);a.length>0&&await B(a,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(),T(r);}});function $i(e){let t=new URLSearchParams({theme:e.theme,neutralTheme:e.neutralTheme,iconLibrary:e.iconLibrary,fontVariant:e.fontVariant,menuAccent:e.menuAccent,menuColor:e.menuColor});return `${Oi()}?${t.toString()}`}async function Ti(e){if(e===true){let t=await ba(),{selectedPreset:r}=await ut({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}))});return r?t.find(n=>n.name===r)??null:null}if(typeof e=="string"){if(D(e))return {_isUrl:true,url:e};let t=await ca(e);if(!t){let n=(await ba()).map(i=>i.name).join(", ");o.error(`Preset "${e}" not found. Available presets: ${n}`),process.exit(1);}return t}return null}function Ni(e){switch(e){case "vite":return [{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:wt`import { ComponentExample } from "@/components/component-example";
56
56
 
57
57
  export function App() {
58
58
  return <ComponentExample />;
@@ -74,18 +74,18 @@ function App() {
74
74
  <ComponentExample />
75
75
  );
76
76
  }
77
- `}];default:return []}}function Oi(){return `${ji}/init`}var Di=z.object({component:z.string().optional(),yes:z.boolean(),cwd:z.string(),path:z.string().optional()}),_r=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=Di.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 X();if(o$1||(T(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let c=i.resolvedPaths.components,l=o$1.filter(p=>{for(let u of p.files??[]){let h=E__default.resolve(c,typeof u=="string"?u:u.path);if(existsSync(h))return !0}return !1}),f=[];for(let p of l){let u=await Ar(p,i);u.length&&f.push({name:p.name,changes:u});}f.length||(o.info("No updates found."),process.exit(0)),o.info("The following components have updates available:");for(let p of f){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(c=>c.name===r.component);s||(o.error(`The component ${a$1.success(r.component)} does not exist.`),process.exit(1));let a=await Ar(s,i);a.length||(o.info(`No updates found for ${r.component}.`),process.exit(0));for(let c of a)o.info(`- ${c.filePath}`),await Li(c.patch),o.info("");}catch(r){T(r);}});async function Ar(e,t){let r=await $("",[e]);if(!r)return [];let n=[];for(let i of r){let o=await aa(t,i);if(o)for(let s of i.files??[]){let a=E__default.resolve(o,typeof s=="string"?s:s.path);if(!existsSync(a))continue;let c=await promises.readFile(a,"utf8");if(typeof s=="string"||!s.content)continue;let l=await A({filename:s.path,raw:s.content,config:t}),f=diffLines(l,c);f.length>1&&n.push({filePath:a,patch:f});}}return n}async function Li(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 Dr=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){T(t);}});var Ui=process.env.https_proxy?new HttpsProxyAgent(process.env.https_proxy):void 0;async function Vr(e,t){let r=await zi(e,{method:"POST",agent:Ui,headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),n;try{n=await r.json();}catch{}return {status:r.status,json:n}}async function Bi(){if(process.platform==="darwin")try{let{stdout:n}=await execa("scutil",["--get","ComputerName"]);if(n.trim())return n.trim()}catch{}let e=ct.hostname().replace(/\.local$/,""),t=/^\d{1,3}(\.\d{1,3}){3}$/.test(e)||e.includes(":");if(e&&!t)return e;let r={darwin:"macOS",win32:"Windows",linux:"Linux"}[process.platform]??process.platform;try{return `${ct.userInfo().username} (${r})`}catch{return `A device (${r})`}}async function Gi(e){try{return process.platform==="darwin"?await execa("open",[e]):process.platform==="win32"?await execa("cmd",["/c","start","",e]):await execa("xdg-open",[e]),!0}catch{return false}}var Mr=new Command().name("login").description("authenticate the CLI to access pro components").action(async()=>{try{let e=N();if(!e)throw new Error("Cannot determine the registry origin. Check REGISTRY_URL.");let t=await Vr(`${e}/api/cli/auth/device`,{name:await Bi()});if(t.status!==200||!t.json?.requestId)throw new Error(t.json?.message??"Failed to start login. Try again.");let{requestId:r,secret:n,userCode:i,verifyUrl:o$1,expiresIn:s,interval:a}=t.json;o.break(),o.log(`Confirmation code: ${a$1.info(i)}`),o.log(`Approve the request at: ${o$1}`),o.break(),await Gi(o$1)||(o.log("Could not open a browser. Open the URL above manually."),o.break());let l=p("Waiting for approval in the browser...");l.start();let f=Date.now()+(s??600)*1e3,p$1=(a??2)*1e3;for(;Date.now()<f;){await new Promise(h=>setTimeout(h,p$1));let u=await Vr(`${e}/api/cli/auth/token`,{requestId:r,secret:n});if(!(u.status===200&&u.json?.status==="pending")){if(u.status===200&&u.json?.token){P(u.json.token,e),l.succeed(`Logged in. Token saved for ${e}.`);return}l.fail(u.json?.message??"Login failed. Try again."),process.exit(1);}}l.fail("Login timed out. Run `createui login` to try again."),process.exit(1);}catch(e){o.break(),T(e);}});var Wr=new Command().name("logout").description("remove the saved CLI token").action(()=>{try{let e=N(),t=Q(e);o.break(),t?(o.success(`Logged out. The local token for ${e} was removed.`),o.log("The token itself stays valid until revoked \u2014 manage tokens in your dashboard at https://createui.co/dashboard.")):o.info("No saved token found for this registry."),o.break();}catch(e){o.break(),T(e);}});var se="@create-ui/cli",Be=[{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 Oi(){return `${ji}/init`}var Di=z.object({component:z.string().optional(),yes:z.boolean(),cwd:z.string(),path:z.string().optional()}),_r=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=Di.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 X();if(o$1||(T(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let c=i.resolvedPaths.components,l=o$1.filter(p=>{for(let u of p.files??[]){let h=E__default.resolve(c,typeof u=="string"?u:u.path);if(existsSync(h))return !0}return !1}),f=[];for(let p of l){let u=await Ar(p,i);u.length&&f.push({name:p.name,changes:u});}f.length||(o.info("No updates found."),process.exit(0)),o.info("The following components have updates available:");for(let p of f){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(c=>c.name===r.component);s||(o.error(`The component ${a$1.success(r.component)} does not exist.`),process.exit(1));let a=await Ar(s,i);a.length||(o.info(`No updates found for ${r.component}.`),process.exit(0));for(let c of a)o.info(`- ${c.filePath}`),await Li(c.patch),o.info("");}catch(r){T(r);}});async function Ar(e,t){let r=await $("",[e]);if(!r)return [];let n=[];for(let i of r){let o=await aa(t,i);if(o)for(let s of i.files??[]){let a=E__default.resolve(o,typeof s=="string"?s:s.path);if(!existsSync(a))continue;let c=await promises.readFile(a,"utf8");if(typeof s=="string"||!s.content)continue;let l=await A({filename:s.path,raw:s.content,config:t}),f=diffLines(l,c);f.length>1&&n.push({filePath:a,patch:f});}}return n}async function Li(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 Dr=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){T(t);}});var Ui=process.env.https_proxy?new HttpsProxyAgent(process.env.https_proxy):void 0;async function Vr(e,t){let r=await zi(e,{method:"POST",agent:Ui,headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),n;try{n=await r.json();}catch{}return {status:r.status,json:n}}async function Bi(){if(process.platform==="darwin")try{let{stdout:n}=await execa("scutil",["--get","ComputerName"]);if(n.trim())return n.trim()}catch{}let e=ct.hostname().replace(/\.local$/,""),t=/^\d{1,3}(\.\d{1,3}){3}$/.test(e)||e.includes(":");if(e&&!t)return e;let r={darwin:"macOS",win32:"Windows",linux:"Linux"}[process.platform]??process.platform;try{return `${ct.userInfo().username} (${r})`}catch{return `A device (${r})`}}async function Gi(e){try{return process.platform==="darwin"?await execa("open",[e]):process.platform==="win32"?await execa("cmd",["/c","start","",e]):await execa("xdg-open",[e]),!0}catch{return false}}var Mr=new Command().name("login").description("authenticate the CLI to access pro components").action(async()=>{try{let e=N();if(!e)throw new Error("Cannot determine the registry origin. Check REGISTRY_URL.");let t=await Vr(`${e}/api/cli/auth/device`,{name:await Bi()});if(t.status!==200||!t.json?.requestId)throw new Error(t.json?.message??"Failed to start login. Try again.");let{requestId:r,secret:n,userCode:i,verifyUrl:o$1,expiresIn:s,interval:a}=t.json;o.break(),o.log(`Confirmation code: ${a$1.info(i)}`),o.log(`Approve the request at: ${o$1}`),o.break(),await Gi(o$1)||(o.log("Could not open a browser. Open the URL above manually."),o.break());let l=p("Waiting for approval in the browser...");l.start();let f=Date.now()+(s??600)*1e3,p$1=(a??2)*1e3;for(;Date.now()<f;){await new Promise(h=>setTimeout(h,p$1));let u=await Vr(`${e}/api/cli/auth/token`,{requestId:r,secret:n});if(!(u.status===200&&u.json?.status==="pending")){if(u.status===200&&u.json?.token){P(u.json.token,e),l.succeed(`Logged in. Token saved for ${e}.`);return}l.fail(u.json?.message??"Login failed. Try again."),process.exit(1);}}l.fail("Login timed out. Run `createui login` to try again."),process.exit(1);}catch(e){o.break(),T(e);}});var Wr=new Command().name("logout").description("remove the saved CLI token").action(()=>{try{let e=N(),t=Q(e);o.break(),t?(o.success(`Logged out. The local token for ${e} was removed.`),o.log("The token itself stays valid until revoked \u2014 manage tokens in your dashboard at https://createui.co/dashboard.")):o.info("No saved token found for this registry."),o.break();}catch(e){o.break(),T(e);}});var oe="@create-ui/cli",Be=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{createui:{command:"npx",args:[oe,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{createui:{command:"npx",args:[oe,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{createui:{command:"npx",args:[oe,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.createui]
78
78
  command = "npx"
79
- args = ["${se}", "mcp"]
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}}}}],Ue=[se],vt=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 V(e.cwd);let t=new StdioServerTransport;await b$1.connect(t);}catch(t){o.break(),T(t);}}),Qi=St.object({client:St.enum(["claude","cursor","vscode","codex","opencode"]),cwd:St.string()});vt.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${Be.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 ut({type:"select",name:"client",message:"Which MCP client are you using?",choices:Be.map(f=>({title:f.label,value:f.name}))});l.client||(o.break(),process.exit(1)),i=l.client;}let o$1=Qi.parse({client:i,cwd:n}),s=await f(o$1.cwd);if(o$1.client==="codex"){if(s)await L([],Ue,s,{silent:!1});else {let l=await a$2(o$1.cwd),f=l==="npm"?"install":"add",p$1=l==="npm"?"--save-dev":"-D",u=p("Installing dependencies...").start();await execa(l,[f,p$1,...Ue],{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]
79
+ args = ["${oe}", "mcp"]
80
+ `},{name:"opencode",label:"OpenCode",configPath:"opencode.json",config:{$schema:"https://opencode.ai/config.json",mcp:{createui:{type:"local",command:["npx",oe,"mcp"],enabled:true}}}}],Se=[oe],vt=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 V(e.cwd);let t=new StdioServerTransport;await b$1.connect(t);}catch(t){o.break(),T(t);}}),Zi=St.object({client:St.enum(["claude","cursor","vscode","codex","opencode"]),cwd:St.string()});vt.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${Be.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 ut({type:"select",name:"client",message:"Which MCP client are you using?",choices:Be.map(f=>({title:f.label,value:f.name}))});l.client||(o.break(),process.exit(1)),i=l.client;}let o$1=Zi.parse({client:i,cwd:n}),s=await f(o$1.cwd);o$1.client==="codex"&&(s?await L([],Se,s,{silent:!1}):await Br(o$1.cwd),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]
81
81
  command = "npx"
82
- args = ["${se}", "mcp"]`),o.break(),o.info("3. Restart Codex to load the MCP server"),o.break(),process.exit(0);}let a=p("Configuring MCP server...").start(),c=await eo(o$1);if(a.succeed("Configuring MCP server."),s)await L([],Ue,s,{silent:!1});else {let l=await a$2(o$1.cwd),f=l==="npm"?"install":"add",p$1=l==="npm"?"--save-dev":"-D",u=p("Installing dependencies...").start();await execa(l,[f,p$1,...Ue],{cwd:o$1.cwd}),u.succeed("Installing dependencies.");}o.break(),o.success(`Configuration saved to ${c}.`),o.break();}catch(r){T(r);}});var Zi=(e,t)=>t;async function eo(e){let{client:t,cwd:r}=e,n=Be.find(c=>c.name===t);if(!n)throw new Error(`Unknown client: ${t}. Available clients: ${Be.map(c=>c.name).join(", ")}`);let i=E__default.join(r,n.configPath),o=E__default.dirname(i);await x.ensureDir(o);let s={};try{let c=await promises.readFile(i,"utf-8");s=JSON.parse(c);}catch{}let a=vr(s,n.config,{arrayMerge:Zi});return await promises.writeFile(i,JSON.stringify(a,null,2)+`
83
- `,"utf-8"),n.configPath}async function Jr(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([no("**/*.{js,ts,jsx,tsx}",{cwd:t}),Z()]);if(Object.keys(n).length===0)throw new Error("Something went wrong fetching the registry icons.");let i=Object.entries(a$4).map(([f,p])=>({title:p.name,value:f})),o$1=await ut([{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],a=a$4[o$1.targetLibrary],{confirm:c}=await ut({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(a.name)}. Continue?`});c||(o.info("Migration cancelled."),process.exit(0)),a.package&&await L([a.package],[],e,{silent:false});let l=p("Migrating icons...")?.start();await Promise.all(r.map(async f=>{l.text=`Migrating ${f}...`;let p=E__default.join(t,f),u=await promises.readFile(p,"utf-8"),h=await ao(u,o$1.sourceLibrary,o$1.targetLibrary,n);await promises.writeFile(p,h);})),l.succeed("Migration complete.");}async function ao(e,t,r,n){let i=a$4[t]?.import,o=a$4[r]?.import,s=await promises.mkdtemp(E__default.join(tmpdir(),"createui-")),a=new Project({compilerOptions:{}}),c=E__default.join(s,`createui-icons-${randomBytes(4).toString("hex")}.tsx`),l=a.createSourceFile(c,e,{scriptKind:ScriptKind.TSX}),f=[];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(y=>y[t]===h)?.[r];!g||f.includes(g)||(f.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 f.length>0&&l.addImportDeclaration({moduleSpecifier:o,namedImports:f.map(p=>({name:p}))}),await l.getText()}function mo(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function fo(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 a=s.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?$/),c=s.match(/^(\w+)\s+as\s+(\w+)$/);if(a){let l=a[1],f=a[2];n==="slot"&&l==="Slot"&&!f?r.push({name:"Slot",alias:"SlotPrimitive",isType:true}):r.push({name:l,alias:f,isType:true});}else if(c){let l=c[1],f=c[2];n==="slot"&&l==="Slot"&&f==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:l,alias:f,isType:t});}else n==="slot"&&s==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:s,isType:t});}}async function Kr(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 no("**/*.{js,ts,jsx,tsx}",{cwd:r});if(!t.yes){let{confirm:a}=await ut({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?`});a||(o.info("Migration cancelled."),process.exit(0));}let i=p("Migrating imports...")?.start(),o$1=new Set;await Promise.all(n.map(async a=>{i.text=`Migrating ${a}...`;let c=E__default.join(r,a),l=await promises.readFile(c,"utf-8"),{content:f,replacedPackages:p}=await po(l);p.forEach(u=>o$1.add(u)),await promises.writeFile(c,f);})),i.succeed("Migrating imports.");let s=p("Updating package.json...")?.start();try{let a=l(e.resolvedPaths.cwd,!1);if(!a){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 c=Array.from(o$1),l$1=["dependencies","devDependencies"];for(let f of l$1)if(a[f])for(let p of c)a[f][p]&&delete a[f][p];if(c.length>0){a.dependencies||(a.dependencies={}),a.dependencies["radix-ui"]="latest";let f=E__default.join(e.resolvedPaths.cwd,"package.json");await promises.writeFile(f,JSON.stringify(a,null,2)+`
84
- `),s.succeed("Updated package.json."),await L(["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 po(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,a=e,c;for(;(c=t.exec(e))!==null;){let[g,y,R,S,H,F,W]=c;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=!!y;if(R){let Je=mo(F);r.push({name:Je,alias:R,isType:ge});}else S&&fo(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?";":""}`;a=n.reduce((g,y,R)=>g.replace(y,R===0?p:""),a),a=a.replace(/\n\s*\n\s*\n/g,`
82
+ args = ["${oe}", "mcp"]`),o.break(),o.info("3. Restart Codex to load the MCP server"),o.break(),process.exit(0));let a=p("Configuring MCP server...").start(),c=await to(o$1);a.succeed("Configuring MCP server."),s?await L([],Se,s,{silent:!1}):await Br(o$1.cwd),o.break(),o.success(`Configuration saved to ${c}.`),o.break();}catch(r){T(r);}});async function Br(e){let t=await a$2(e),r=t==="npm"?"install":"add",n=t==="npm"?"--save-dev":"-D",i=p("Installing dependencies...").start();try{await execa(t,[r,n,...Se],{cwd:e}),i.succeed("Installing dependencies.");}catch{i.fail("Could not install dependencies."),o.break(),o.warn(`Skipped installing ${a$1.info(Se.join(", "))}. The MCP server still runs via ${a$1.info("npx")}, so this is optional.`),o.warn(`To pin it locally, run: ${a$1.info(`${t} ${r} ${n} ${Se.join(" ")}`)}`),o.break();}}var eo=(e,t)=>t;async function to(e){let{client:t,cwd:r}=e,n=Be.find(c=>c.name===t);if(!n)throw new Error(`Unknown client: ${t}. Available clients: ${Be.map(c=>c.name).join(", ")}`);let i=E__default.join(r,n.configPath),o=E__default.dirname(i);await x.ensureDir(o);let s={};try{let c=await promises.readFile(i,"utf-8");s=JSON.parse(c);}catch{}let a=vr(s,n.config,{arrayMerge:eo});return await promises.writeFile(i,JSON.stringify(a,null,2)+`
83
+ `,"utf-8"),n.configPath}async function Jr(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([io("**/*.{js,ts,jsx,tsx}",{cwd:t}),Z()]);if(Object.keys(n).length===0)throw new Error("Something went wrong fetching the registry icons.");let i=Object.entries(a$4).map(([f,p])=>({title:p.name,value:f})),o$1=await ut([{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],a=a$4[o$1.targetLibrary],{confirm:c}=await ut({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(a.name)}. Continue?`});c||(o.info("Migration cancelled."),process.exit(0)),a.package&&await L([a.package],[],e,{silent:false});let l=p("Migrating icons...")?.start();await Promise.all(r.map(async f=>{l.text=`Migrating ${f}...`;let p=E__default.join(t,f),u=await promises.readFile(p,"utf-8"),h=await co(u,o$1.sourceLibrary,o$1.targetLibrary,n);await promises.writeFile(p,h);})),l.succeed("Migration complete.");}async function co(e,t,r,n){let i=a$4[t]?.import,o=a$4[r]?.import,s=await promises.mkdtemp(E__default.join(tmpdir(),"createui-")),a=new Project({compilerOptions:{}}),c=E__default.join(s,`createui-icons-${randomBytes(4).toString("hex")}.tsx`),l=a.createSourceFile(c,e,{scriptKind:ScriptKind.TSX}),f=[];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(y=>y[t]===h)?.[r];!g||f.includes(g)||(f.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 f.length>0&&l.addImportDeclaration({moduleSpecifier:o,namedImports:f.map(p=>({name:p}))}),await l.getText()}function fo(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function po(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 a=s.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?$/),c=s.match(/^(\w+)\s+as\s+(\w+)$/);if(a){let l=a[1],f=a[2];n==="slot"&&l==="Slot"&&!f?r.push({name:"Slot",alias:"SlotPrimitive",isType:true}):r.push({name:l,alias:f,isType:true});}else if(c){let l=c[1],f=c[2];n==="slot"&&l==="Slot"&&f==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:l,alias:f,isType:t});}else n==="slot"&&s==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:s,isType:t});}}async function Kr(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 io("**/*.{js,ts,jsx,tsx}",{cwd:r});if(!t.yes){let{confirm:a}=await ut({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?`});a||(o.info("Migration cancelled."),process.exit(0));}let i=p("Migrating imports...")?.start(),o$1=new Set;await Promise.all(n.map(async a=>{i.text=`Migrating ${a}...`;let c=E__default.join(r,a),l=await promises.readFile(c,"utf-8"),{content:f,replacedPackages:p}=await uo(l);p.forEach(u=>o$1.add(u)),await promises.writeFile(c,f);})),i.succeed("Migrating imports.");let s=p("Updating package.json...")?.start();try{let a=l(e.resolvedPaths.cwd,!1);if(!a){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 c=Array.from(o$1),l$1=["dependencies","devDependencies"];for(let f of l$1)if(a[f])for(let p of c)a[f][p]&&delete a[f][p];if(c.length>0){a.dependencies||(a.dependencies={}),a.dependencies["radix-ui"]="latest";let f=E__default.join(e.resolvedPaths.cwd,"package.json");await promises.writeFile(f,JSON.stringify(a,null,2)+`
84
+ `),s.succeed("Updated package.json."),await L(["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 uo(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,a=e,c;for(;(c=t.exec(e))!==null;){let[g,y,R,S,H,F,W]=c;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=!!y;if(R){let Je=fo(F);r.push({name:Je,alias:R,isType:ge});}else S&&po(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?";":""}`;a=n.reduce((g,y,R)=>g.replace(y,R===0?p:""),a),a=a.replace(/\n\s*\n\s*\n/g,`
85
85
 
86
86
  `),l.some(g=>g.name==="Slot"&&g.alias==="SlotPrimitive")&&(a=a.split(`
87
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),Je=(ge.match(/"/g)||[]).length,un=(ge.match(/'/g)||[]).length;return Je%2!==0||un%2!==0?H:"__SLOT_PLACEHOLDER__"}),S=S.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),S}).join(`
88
88
  `));let h=Array.from(new Set(i));return {content:a,replacedPackages:h}}async function qr(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 Hr=[{name:"icons",description:"migrate your ui components to a different icon library."},{name:"radix",description:"migrate to radix-ui."}],ho=z.object({cwd:z.string(),list:z.boolean(),yes:z.boolean(),migration:z.string().refine(e=>e&&Hr.some(t=>t.name===e),{message:"You must specify a valid migration. Run `createui migrate --list` to see available migrations."}).optional()}),Xr=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=ho.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 Hr)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 qr(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 Jr(i),r.migration==="radix"&&await Kr(i,{yes:r.yes});}catch(r){o.break(),T(r);}});async function Qr(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)}.
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 yo=z.object({cwd:z.string(),registryFile:z.string(),outputDir:z.string(),verbose:z.boolean().optional().default(false)}),Zr=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 bo({cwd:E.resolve(t.cwd),registryFile:e,outputDir:t.output,verbose:t.verbose});});async function bo(e){try{let t=yo.parse(e),[{errors:r,resolvePaths:n,config:i},o$2]=await Promise.all([Qr(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"),a=o$1.safeParse(JSON.parse(s));a.success||(o.error(`Invalid registry file found at ${a$1.info(n.registryFile)}.`),o.break(),process.exit(1));let c=p("Building registry..."),l=await xo(a.data,i,o$2);for(let f of l.items)f.files=f.files?.filter((p,u,h)=>u===h.findIndex(g=>g.path===p.path)),f.dependencies&&(f.dependencies=f.dependencies.filter((p,u,h)=>u===h.findIndex(g=>g===p)));for(let f of l.items){if(!f.files)continue;c.start(`Building ${f.name}...`),f.$schema="https://createui.co/schema/registry-item.json";for(let u of f.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(f);if(!p.success){o.error(`Invalid registry item found for ${a$1.info(f.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")),c.succeed("Building registry."),t.verbose){p(`The registry has ${a$1.info(l.items.length.toString())} items:`).succeed();for(let f of l.items){o.log(` - ${f.name} (${a$1.info(f.type)})`);for(let p of f.files??[])o.log(` - ${p.path}`);}}}catch(t){o.break(),T(t);}}async function xo(e,t,r){for(let n of e.items)if(n.files?.length)for(let i of n.files){let o=await C(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 en=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 Ro=z.object({cwd:z.string(),query:z.string().optional(),limit:z.number().optional(),offset:z.number().optional()}),nn=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=Ro.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 V(r.cwd);let n=k({resolvedPaths:{cwd:r.cwd}}),i=F(n),o=E__default.resolve(r.cwd,"components.json");if(x.existsSync(o)){let c=await x.readJson(o),l=a.partial().parse(c);i=F({...n,...l});}let s=i;try{let c=await f(r.cwd);c&&(s=F(c));}catch{}let a$1=await a$3(e,{query:r.query,limit:r.limit,offset:r.offset,config:s});console.log(JSON.stringify(a$1,null,2)),process.exit(0);}catch(r){T(r);}});var an="createui",Et={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")}},jo=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 Eo(){let e=E__default.dirname(fileURLToPath(import.meta.url));return E__default.join(e,"skills",an)}var cn=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(Et).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=jo.parse({...e}),r=E__default.resolve(t.cwd),n=Eo();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 c=Et[t.client],l=t.project?r:ct.homedir();i=E__default.join(l,c.dir),o$1=`${c.label}, ${t.project?"project":"personal"}`;}let s=E__default.join(i,an);if(existsSync(s)&&!t.force&&!t.yes){let{overwrite:c}=await ut({type:"confirm",name:"overwrite",message:`The Create UI skill already exists at ${a$1.info(s)}. Overwrite?`,initial:!1});c||(o.info("Skill installation cancelled."),process.exit(0));}let a=p(`Installing the Create UI skill (${o$1})...`).start();await x.ensureDir(i),await x.copy(n,s,{overwrite:!0,filter:c=>!c.endsWith(".DS_Store")}),a.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(`${Et[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){T(t);}});var No=z.object({cwd:z.string()}),pn=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=No.parse({cwd:E__default.resolve(t.cwd)});await V(r.cwd);let n=F({}),i=E__default.resolve(r.cwd,"components.json");if(x.existsSync(i)){let a$1=await x.readJson(i),c=a.partial().parse(a$1);n=F(c);}let o=n;try{let a=await f(r.cwd);a&&(o=F(a));}catch{}let s=await V$1(e,{config:o});console.log(JSON.stringify(s,null,2)),process.exit(0);}catch(r){T(r);}});var dn={version:"0.5.8"};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function Fo(){let e=new Command().name("createui").description("add items from registries to your project").version(dn.version,"-v, --version","display the version number");e.addCommand(Rr).addCommand(Fr).addCommand(Er).addCommand(_r).addCommand(pn).addCommand(nn).addCommand(Xr).addCommand(Dr).addCommand(Mr).addCommand(Wr).addCommand(Or).addCommand(vt).addCommand(cn),e.addCommand(Zr).addCommand(en),e.parse();}Fo();//# sourceMappingURL=index.js.map
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 Hr=[{name:"icons",description:"migrate your ui components to a different icon library."},{name:"radix",description:"migrate to radix-ui."}],wo=z.object({cwd:z.string(),list:z.boolean(),yes:z.boolean(),migration:z.string().refine(e=>e&&Hr.some(t=>t.name===e),{message:"You must specify a valid migration. Run `createui migrate --list` to see available migrations."}).optional()}),Xr=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=wo.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 Hr)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 qr(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 Jr(i),r.migration==="radix"&&await Kr(i,{yes:r.yes});}catch(r){o.break(),T(r);}});async function Qr(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)}.
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 bo=z.object({cwd:z.string(),registryFile:z.string(),outputDir:z.string(),verbose:z.boolean().optional().default(false)}),Zr=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 xo({cwd:E.resolve(t.cwd),registryFile:e,outputDir:t.output,verbose:t.verbose});});async function xo(e){try{let t=bo.parse(e),[{errors:r,resolvePaths:n,config:i},o$2]=await Promise.all([Qr(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"),a=o$1.safeParse(JSON.parse(s));a.success||(o.error(`Invalid registry file found at ${a$1.info(n.registryFile)}.`),o.break(),process.exit(1));let c=p("Building registry..."),l=await So(a.data,i,o$2);for(let f of l.items)f.files=f.files?.filter((p,u,h)=>u===h.findIndex(g=>g.path===p.path)),f.dependencies&&(f.dependencies=f.dependencies.filter((p,u,h)=>u===h.findIndex(g=>g===p)));for(let f of l.items){if(!f.files)continue;c.start(`Building ${f.name}...`),f.$schema="https://createui.co/schema/registry-item.json";for(let u of f.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(f);if(!p.success){o.error(`Invalid registry item found for ${a$1.info(f.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")),c.succeed("Building registry."),t.verbose){p(`The registry has ${a$1.info(l.items.length.toString())} items:`).succeed();for(let f of l.items){o.log(` - ${f.name} (${a$1.info(f.type)})`);for(let p of f.files??[])o.log(` - ${p.path}`);}}}catch(t){o.break(),T(t);}}async function So(e,t,r){for(let n of e.items)if(n.files?.length)for(let i of n.files){let o=await C(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 en=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 ko=z.object({cwd:z.string(),query:z.string().optional(),limit:z.number().optional(),offset:z.number().optional()}),nn=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=ko.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 V(r.cwd);let n=k({resolvedPaths:{cwd:r.cwd}}),i=F(n),o=E__default.resolve(r.cwd,"components.json");if(x.existsSync(o)){let c=await x.readJson(o),l=a.partial().parse(c);i=F({...n,...l});}let s=i;try{let c=await f(r.cwd);c&&(s=F(c));}catch{}let a$1=await a$3(e,{query:r.query,limit:r.limit,offset:r.offset,config:s});console.log(JSON.stringify(a$1,null,2)),process.exit(0);}catch(r){T(r);}});var an="createui",Et={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")}},Eo=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 $o(){let e=E__default.dirname(fileURLToPath(import.meta.url));return E__default.join(e,"skills",an)}var cn=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(Et).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=Eo.parse({...e}),r=E__default.resolve(t.cwd),n=$o();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 c=Et[t.client],l=t.project?r:ct.homedir();i=E__default.join(l,c.dir),o$1=`${c.label}, ${t.project?"project":"personal"}`;}let s=E__default.join(i,an);if(existsSync(s)&&!t.force&&!t.yes){let{overwrite:c}=await ut({type:"confirm",name:"overwrite",message:`The Create UI skill already exists at ${a$1.info(s)}. Overwrite?`,initial:!1});c||(o.info("Skill installation cancelled."),process.exit(0));}let a=p(`Installing the Create UI skill (${o$1})...`).start();await x.ensureDir(i),await x.copy(n,s,{overwrite:!0,filter:c=>!c.endsWith(".DS_Store")}),a.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(`${Et[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){T(t);}});var No=z.object({cwd:z.string()}),pn=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=No.parse({cwd:E__default.resolve(t.cwd)});await V(r.cwd);let n=F({}),i=E__default.resolve(r.cwd,"components.json");if(x.existsSync(i)){let a$1=await x.readJson(i),c=a.partial().parse(a$1);n=F(c);}let o=n;try{let a=await f(r.cwd);a&&(o=F(a));}catch{}let s=await V$1(e,{config:o});console.log(JSON.stringify(s,null,2)),process.exit(0);}catch(r){T(r);}});var dn={version:"0.6.0"};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function Ao(){let e=new Command().name("createui").description("add items from registries to your project").version(dn.version,"-v, --version","display the version number");e.addCommand(Rr).addCommand(Fr).addCommand(Er).addCommand(_r).addCommand(pn).addCommand(nn).addCommand(Xr).addCommand(Dr).addCommand(Mr).addCommand(Wr).addCommand(Or).addCommand(vt).addCommand(cn),e.addCommand(Zr).addCommand(en),e.parse();}Ao();//# sourceMappingURL=index.js.map
91
91
  //# sourceMappingURL=index.js.map