@sugarcube-org/cli 0.0.0-alpha.33 → 0.0.0-alpha.34

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 (2) hide show
  1. package/dist/index.mjs +53 -47
  2. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
- var Xe=Object.defineProperty;var o=(e,t)=>Xe(e,"name",{value:t,configurable:!0});import{Command as U}from"commander";import{relative as R,join as _,basename as Se,resolve as L,dirname as et,isAbsolute as tt,normalize as nt}from"pathe";import c from"picocolors";import{existsSync as A,readFileSync as Ie}from"node:fs";import{z as w}from"zod";import oe,{mkdir as V,writeFile as X,readFile as Ee}from"node:fs/promises";import{execa as st}from"execa";import ee from"fast-glob";import{loadAndResolveTokens as ot,loadInternalConfig as W,configFileExists as O,loadSugarcubeConfig as rt,processAndConvertTokens as re,generateCSSVariables as be,writeCSSVariablesToDisk as ke,writeCSSUtilitiesToDisk as $e,convertConfigToUnoRules as it,DEFAULT_CONFIG as te,fillDefaults as at}from"@sugarcube-org/core";import{select as ct,isCancel as ie,log as lt,multiselect as ut,confirm as ft,cancel as Re}from"@clack/prompts";import{getColumns as pt}from"@clack/core";import{wrapAnsi as dt}from"fast-wrap-ansi";import gt from"is-unicode-supported";import*as _e from"node:readline";import Ce from"node:readline";import{createLogUpdate as ve}from"log-update";import ae,{resolve as mt}from"node:path";import{detect as ht}from"@antfu/ni";import{getTsconfig as wt}from"get-tsconfig";import{createGenerator as yt}from"@unocss/core";var Tt="0.0.0-alpha.33",St={version:Tt};const ce="fluid",It="**/*.json",le="@sugarcube-org/vite",Et=["node_modules",".git",".next","dist","build"],bt=5,C={INIT:"make-sugarcube init",COMPONENTS:"make-sugarcube components",GENERATE:"make-sugarcube generate",CUBE:"make-sugarcube cube"},De={INITIALIZATION:"https://sugarcube.sh/docs/setup",CONFIGURATION:"https://sugarcube.sh/docs/configuration"},m={PROJECT_REQUIRED:`No sugarcube project detected. Please run ${c.cyan(C.INIT)} first.
2
+ var et=Object.defineProperty;var o=(e,t)=>et(e,"name",{value:t,configurable:!0});import{Command as U}from"commander";import{relative as R,join as $,basename as Ie,resolve as L,dirname as tt,isAbsolute as nt,normalize as st}from"pathe";import c from"picocolors";import{existsSync as F,readFileSync as Ee}from"node:fs";import{z as w}from"zod";import oe,{mkdir as V,writeFile as X,readFile as be}from"node:fs/promises";import{execa as ot}from"execa";import ee from"fast-glob";import{loadAndResolveTokens as rt,loadInternalConfig as W,configFileExists as O,loadSugarcubeConfig as it,processAndConvertTokens as re,generateCSSVariables as ve,writeCSSVariablesToDisk as ke,writeCSSUtilitiesToDisk as Re,fillDefaults as _e,convertConfigToUnoRules as at,DEFAULT_CONFIG as te}from"@sugarcube-org/core";import{select as ct,isCancel as ie,log as lt,multiselect as ut,confirm as ft,cancel as $e}from"@clack/prompts";import{getColumns as dt}from"@clack/core";import{wrapAnsi as pt}from"fast-wrap-ansi";import mt from"is-unicode-supported";import*as Ce from"node:readline";import Ne from"node:readline";import{createLogUpdate as De}from"log-update";import ae,{resolve as gt}from"node:path";import{detect as ht}from"@antfu/ni";import{getTsconfig as wt}from"get-tsconfig";import{createGenerator as yt}from"@unocss/core";var St="0.0.0-alpha.34",Tt={version:St};const ce="fluid",It="**/*.json",le="@sugarcube-org/vite",Et=["node_modules",".git",".next","dist","build"],bt=5,_={INIT:"make-sugarcube init",COMPONENTS:"make-sugarcube components",CUBE:"make-sugarcube cube"},Fe={INITIALIZATION:"https://sugarcube.sh/docs/setup",CONFIGURATION:"https://sugarcube.sh/docs/configuration"},g={PROJECT_REQUIRED:`No sugarcube project detected. Please run ${c.cyan(_.INIT)} first.
3
3
 
4
- For more information, visit: ${c.cyan(De.INITIALIZATION)}`,CONFIG_EXISTS:o(()=>`A sugarcube config file already exists in this project.
4
+ For more information, visit: ${c.cyan(Fe.INITIALIZATION)}`,CONFIG_EXISTS:o(()=>`A sugarcube config file already exists in this project.
5
5
 
6
- To start over, remove it and run ${c.cyan(C.INIT)} again.`,"CONFIG_EXISTS"),PLUGIN_INSTALL_FAILED:o(e=>{const t=e.packageManager==="npm"?"install":"add";return`Failed to install ${e.pluginToInstall} plugin.
6
+ To start over, remove it and run ${c.cyan(_.INIT)} again.`,"CONFIG_EXISTS"),PLUGIN_INSTALL_FAILED:o(e=>{const t=e.packageManager==="npm"?"install":"add";return`Failed to install ${e.pluginToInstall} plugin.
7
7
 
8
8
  This is usually a temporary issue. Try these steps:
9
9
 
@@ -77,8 +77,18 @@ The 'generate' command is for manual generation without plugins. Since you have
77
77
 
78
78
  npm run dev # or your framework's dev command
79
79
 
80
- The plugin will automatically generate CSS with hot module replacement.`,"PLUGIN_DETECTED")};class d extends Error{static{o(this,"CLIError")}constructor(t,n){super(t),this.name="CLIError",this.cause=n}}const ue=w.enum(["react","web-components","css-only"]),Ne=w.object({path:w.string(),type:w.string()}),kt=Ne.extend({framework:ue}),$t=w.object({name:w.string(),type:w.string(),description:w.string().optional(),frameworks:w.array(w.string()).optional(),files:w.array(w.union([kt,Ne])),tokens:w.record(w.object({type:w.string(),mapping:w.string()})).optional(),dependencies:w.record(ue,w.array(w.string())).optional(),registryDependencies:w.record(ue,w.array(w.string())).optional(),tokenDependencies:w.array(w.string()).optional()}),Rt=w.array($t),_t=w.object({content:w.string()}),Ae=process.env.REGISTRY_URL??"https://sugarcube.sh/r";async function Oe(e){try{const t=await fetch(e);if(!t.ok){if(t.status===401)throw new d(m.REGISTRY_AUTH_REQUIRED(e));if(t.status===403)throw new d(m.REGISTRY_AUTH_INVALID(e));if(t.status===404)throw new d(m.REGISTRY_NOT_FOUND(e));const n=await t.json().catch(()=>null),s=n&&typeof n=="object"&&"error"in n?String(n.error):t.statusText;throw new d(m.REGISTRY_REQUEST_FAILED(s,e))}return t.json()}catch(t){throw t instanceof d?t:new d(m.REGISTRY_NETWORK_ERROR(e))}}o(Oe,"fetchRegistry");async function j(){const e=`${Ae}/index.json`,t=await Oe(e);try{return Rt.parse(t)}catch{throw new d(m.REGISTRY_INVALID_DATA(e))}}o(j,"getRegistryIndex");async function fe({type:e,name:t,framework:n}){const s=await j(),r=s.find(l=>l.type===e&&l.name===t);if(!r){const l=s.filter(f=>f.type===e).map(f=>f.name);throw new d(m.REGISTRY_ITEM_NOT_FOUND(e,t,l))}let i=r.files;e==="component"&&n&&(i=r.files.filter(l=>"framework"in l&&l.framework===n));const a=await Promise.all(i.map(async l=>{const f=`${Ae}/${l.path}.json`,p=await Oe(f);try{const u=_t.parse(p);return{path:l.path,type:l.type,framework:"framework"in l?l.framework:void 0,content:u.content}}catch{throw new d(m.REGISTRY_FILE_INVALID(l.path))}}));return{item:r,files:a}}o(fe,"getRegistryFiles");async function Ct(e){const t=await fe({type:"tokens",name:e});if(!t.files[0])throw new d(m.STARTER_KIT_UNAVAILABLE(e));return t}o(Ct,"fetchStarterKit");async function pe(e,t,n){const s=[],r=new Set;async function i(a){if(r.has(a))return;r.add(a);const l=e.find(p=>p.name===a);if(!l){const p=e.filter(u=>u.type==="component").map(u=>u.name).join(", ");throw new d(`Component '${a}' not found in registry
81
- Available components: ${p}`)}const f=l.registryDependencies?.[n]||[];for(const p of f)await i(p);s.push(l)}o(i,"resolveComponent");for(const a of t)await i(a);return s}o(pe,"resolveTree");async function vt({selectedComponents:e,componentType:t,componentsOutputDirectory:n}){const s={variableCSS:[],utilityCSS:[],componentFiles:[],componentCSS:[],cubeCSS:[],indexFiles:[]},r=await j(),a=(await pe(r,e,t)).map(u=>u.name),l=r.filter(u=>u.type==="component").filter(u=>a.includes(u.name)),f=l.flatMap(u=>u.files.filter(g=>(g.type==="tsx"||g.type==="astro"||g.type==="njk")&&"framework"in g&&g.framework===t).map(g=>R(process.cwd(),_(n,u.name,`${u.name}.${g.type}`))));s.componentFiles=f.filter(u=>A(_(process.cwd(),u)));const p=l.map(u=>{const g=u.name;return R(process.cwd(),_(n,u.name,`${g}.css`))});return s.componentCSS=p.filter(u=>A(_(process.cwd(),u))),s}o(vt,"collectComponentOverwriteWarnings");async function Dt({cubeDirectory:e}){const t={variableCSS:[],utilityCSS:[],componentFiles:[],componentCSS:[],cubeCSS:[],indexFiles:[]},s=(await j()).filter(r=>r.type==="cube").flatMap(r=>r.files).map(r=>{const i=r.path.replace(/^styles\//,"");return R(process.cwd(),_(e,i))});return t.cubeCSS=s.filter(r=>A(_(process.cwd(),r))),t}o(Dt,"collectCubeOverwriteWarnings");function Fe(e){const t=[];if(e.variableCSS.length>0&&t.push(`CSS variables files:
80
+ The plugin will automatically generate CSS with hot module replacement.`,"PLUGIN_DETECTED"),GENERATE_NO_CONFIG_OR_RESOLVER:o(()=>`A sugarcube config file was not found. This command requires one.
81
+
82
+ Please create a config file with ${c.cyan(_.INIT)} or use the --resolver flag to specify a resolver file.
83
+
84
+ Stuck? ${c.cyan("https://sugarcube.sh")}`,"GENERATE_NO_CONFIG_OR_RESOLVER"),GENERATE_MULTIPLE_RESOLVERS_NO_CONFIG:o(e=>`No config file found, but multiple resolver files detected:
85
+ ${e.map(t=>` - ${t}`).join(`
86
+ `)}
87
+
88
+ Please either:
89
+ - Create a config file with ${c.cyan(_.INIT)}
90
+ - Use --resolver flag to specify which resolver to use`,"GENERATE_MULTIPLE_RESOLVERS_NO_CONFIG")};class p extends Error{static{o(this,"CLIError")}constructor(t,n){super(t),this.name="CLIError",this.cause=n}}const ue=w.enum(["react","web-components","css-only"]),Oe=w.object({path:w.string(),type:w.string()}),vt=Oe.extend({framework:ue}),kt=w.object({name:w.string(),type:w.string(),description:w.string().optional(),frameworks:w.array(w.string()).optional(),files:w.array(w.union([vt,Oe])),tokens:w.record(w.object({type:w.string(),mapping:w.string()})).optional(),dependencies:w.record(ue,w.array(w.string())).optional(),registryDependencies:w.record(ue,w.array(w.string())).optional(),tokenDependencies:w.array(w.string()).optional()}),Rt=w.array(kt),_t=w.object({content:w.string()}),Ae=process.env.REGISTRY_URL??"https://sugarcube.sh/r";async function Pe(e){try{const t=await fetch(e);if(!t.ok){if(t.status===401)throw new p(g.REGISTRY_AUTH_REQUIRED(e));if(t.status===403)throw new p(g.REGISTRY_AUTH_INVALID(e));if(t.status===404)throw new p(g.REGISTRY_NOT_FOUND(e));const n=await t.json().catch(()=>null),s=n&&typeof n=="object"&&"error"in n?String(n.error):t.statusText;throw new p(g.REGISTRY_REQUEST_FAILED(s,e))}return t.json()}catch(t){throw t instanceof p?t:new p(g.REGISTRY_NETWORK_ERROR(e))}}o(Pe,"fetchRegistry");async function j(){const e=`${Ae}/index.json`,t=await Pe(e);try{return Rt.parse(t)}catch{throw new p(g.REGISTRY_INVALID_DATA(e))}}o(j,"getRegistryIndex");async function fe({type:e,name:t,framework:n}){const s=await j(),r=s.find(l=>l.type===e&&l.name===t);if(!r){const l=s.filter(f=>f.type===e).map(f=>f.name);throw new p(g.REGISTRY_ITEM_NOT_FOUND(e,t,l))}let i=r.files;e==="component"&&n&&(i=r.files.filter(l=>"framework"in l&&l.framework===n));const a=await Promise.all(i.map(async l=>{const f=`${Ae}/${l.path}.json`,d=await Pe(f);try{const u=_t.parse(d);return{path:l.path,type:l.type,framework:"framework"in l?l.framework:void 0,content:u.content}}catch{throw new p(g.REGISTRY_FILE_INVALID(l.path))}}));return{item:r,files:a}}o(fe,"getRegistryFiles");async function $t(e){const t=await fe({type:"tokens",name:e});if(!t.files[0])throw new p(g.STARTER_KIT_UNAVAILABLE(e));return t}o($t,"fetchStarterKit");async function de(e,t,n){const s=[],r=new Set;async function i(a){if(r.has(a))return;r.add(a);const l=e.find(d=>d.name===a);if(!l){const d=e.filter(u=>u.type==="component").map(u=>u.name).join(", ");throw new p(`Component '${a}' not found in registry
91
+ Available components: ${d}`)}const f=l.registryDependencies?.[n]||[];for(const d of f)await i(d);s.push(l)}o(i,"resolveComponent");for(const a of t)await i(a);return s}o(de,"resolveTree");async function Ct({selectedComponents:e,componentType:t,componentsOutputDirectory:n}){const s={variableCSS:[],utilityCSS:[],componentFiles:[],componentCSS:[],cubeCSS:[],indexFiles:[]},r=await j(),a=(await de(r,e,t)).map(u=>u.name),l=r.filter(u=>u.type==="component").filter(u=>a.includes(u.name)),f=l.flatMap(u=>u.files.filter(m=>(m.type==="tsx"||m.type==="astro"||m.type==="njk")&&"framework"in m&&m.framework===t).map(m=>R(process.cwd(),$(n,u.name,`${u.name}.${m.type}`))));s.componentFiles=f.filter(u=>F($(process.cwd(),u)));const d=l.map(u=>{const m=u.name;return R(process.cwd(),$(n,u.name,`${m}.css`))});return s.componentCSS=d.filter(u=>F($(process.cwd(),u))),s}o(Ct,"collectComponentOverwriteWarnings");async function Nt({cubeDirectory:e}){const t={variableCSS:[],utilityCSS:[],componentFiles:[],componentCSS:[],cubeCSS:[],indexFiles:[]},s=(await j()).filter(r=>r.type==="cube").flatMap(r=>r.files).map(r=>{const i=r.path.replace(/^styles\//,"");return R(process.cwd(),$(e,i))});return t.cubeCSS=s.filter(r=>F($(process.cwd(),r))),t}o(Nt,"collectCubeOverwriteWarnings");function Le(e){const t=[];if(e.variableCSS.length>0&&t.push(`CSS variables files:
82
92
  ${e.variableCSS.map(s=>` - ${s}`).join(`
83
93
  `)}`),e.utilityCSS.length>0&&t.push(`CSS utility files:
84
94
  ${e.utilityCSS.map(s=>` - ${s}`).join(`
@@ -92,77 +102,73 @@ ${e.indexFiles.map(s=>` - ${s}`).join(`
92
102
 
93
103
  ${t.join(`
94
104
 
95
- `)}`}o(Fe,"formatOverwriteWarnings");async function de(e,t,n,s={}){if(e.length===0)return;const{devDependency:r=!1}=s,i=n==="npm"?"install":"add",a=(()=>{if(!r)return[];switch(n){case"npm":return["--save-dev"];case"pnpm":return["-D"];case"yarn":return["-D"];case"bun":return["-d"]}})();try{await st(n,[i,...a,...e],{cwd:t})}catch{throw new d(m.DEPENDENCY_INSTALL_FAILED(n))}}o(de,"installDependencies");async function Nt(e,t,n){const s=_(n,t.name);if(await V(s,{recursive:!0}),e.path.endsWith(".css")){const i=_(s,`${t.name}.css`);return await X(i,e.content),i}const r=_(s,Se(e.path));return await X(r,e.content),r}o(Nt,"writeComponentFile");async function At({registryIndex:e,selectedComponents:t,componentType:n,componentsOutputDirectory:s,packageManager:r}){const i=[],a=new Set;await V(s,{recursive:!0});const l=await pe(e,t,n);for(const f of l){const p=await fe({type:"component",name:f.name,framework:n});for(const g of p.files)if(g)try{const h=await Nt(g,f,s);h&&i.push(h)}catch(h){const b=h instanceof Error?`: ${h.message}`:"";throw new d(`Failed to write component file for "${f.name}"${b}`)}const u=f.dependencies?.[n]||[];for(const g of u)a.add(g)}if(a.size>0)try{await de(Array.from(a),process.cwd(),r)}catch(f){const p=f instanceof Error?`: ${f.message}`:"";throw new d(`Failed to install component dependencies${p}`)}return{createdFiles:i,npmDependencies:a}}o(At,"installComponents");function Ot(e,t){const n=L(e),s=L(t),r=R(s,n);return!r.startsWith("..")&&!tt(r)}o(Ot,"isWithinDirectory");async function Ft(e){const t=[],n=L(process.cwd(),e);await V(n,{recursive:!0});const r=(await j()).filter(i=>i.type==="cube").map(i=>i.name);for(const i of r){const a=await fe({type:"cube",name:i});for(const l of a.files){if(!l)continue;const f=l.path.replace(/^styles\//,""),p=L(n,f);if(!Ot(p,n))throw new d(`Invalid file path detected in CUBE module "${i}": path escapes target directory`);const u=et(p);try{await V(u,{recursive:!0}),await X(p,l.content),t.push(p)}catch(g){const h=g instanceof Error?`: ${g.message}`:"";throw new d(`Failed to write CUBE module "${i}"${h}`)}}}return t}o(Ft,"installCUBE");async function Pe(e){const t=_(e,"*.resolver.json"),n=await ee(t,{onlyFiles:!0});if(n.length===0)return{found:"none"};const[s]=n;return n.length===1&&s?{found:"one",path:R(process.cwd(),s)}:{found:"multiple",paths:n.map(r=>R(process.cwd(),r))}}o(Pe,"findResolverDocument");async function Pt(e,t){await oe.mkdir(t,{recursive:!0});const n=[];for(const s of e)await oe.writeFile(s.path,s.content),n.push(s.path);return n}o(Pt,"writeTokenFiles");async function Y(e,t){let n;if(t)n={type:"memory",data:t,config:e};else{if(!e.resolver)throw new d(m.RESOLVER_NOT_CONFIGURED());n={type:"resolver",resolverPath:e.resolver,config:e}}const{trees:s,resolved:r,modifiers:i,errors:a}=await ot(n);if(a.load.length>0){const l=a.load.map(f=>{const p=f.file.split("/").pop()||"unknown file";let u=`File ${p}: `;return f.message.includes("Unexpected token")?u=m.TOKEN_FILE_INVALID_JSON(p):f.message.includes("Unexpected end")?u=m.TOKEN_FILE_INCOMPLETE_JSON(p):u=m.TOKEN_FILE_GENERIC_ERROR(p,f.message),u});throw new d(m.TOKEN_LOAD_FAILED(l))}if(a.validation.length>0||a.flatten.length>0||a.resolution.length>0){const l=[...a.flatten,...a.validation,...a.resolution],f=new Map;for(const p of l)if(p.source?.sourcePath){const u=f.get(p.source.sourcePath)||[];u.push(p.message),f.set(p.source.sourcePath,u)}throw new d(m.TOKEN_VALIDATION_FAILED(f))}return{trees:s,resolved:r,modifiers:i}}o(Y,"loadAndResolveTokensForCLI");const Lt=o(async(e,t,n)=>{const s=await Ct(e),r=L(process.cwd(),t),i=s.files.map(a=>({path:_(r,Se(a.path)),content:a.content}));return{config:n,tokenFiles:i,tokensDir:r,createdTokenPaths:i.map(a=>R(process.cwd(),a.path))}},"prepareStarterKitForInstall");async function Mt(e){const t=await Lt(e.starterKit??"",e.tokensDir,e.config),n=await Pt(t.tokenFiles,e.tokensDir),s=await Pe(e.tokensDir);if(s.found==="none")throw new d(m.RESOLVER_NOT_FOUND(e.tokensDir));if(s.found==="multiple")throw new d(m.RESOLVER_MULTIPLE_FOUND(s.paths));const r={...e.config,resolver:s.path},{trees:i,resolved:a}=await Y(r);e.setupResult={config:r,createdTokenPaths:t.createdTokenPaths,trees:i,resolved:a,tokenFiles:t.tokenFiles,tokensDir:t.tokensDir},e.createdFiles.push(...n),e.config=r,e.sugarcubeConfig={...e.sugarcubeConfig,resolver:s.path}}o(Mt,"installFromStarterKit");async function Le(e=!0){const t=[{label:"React",value:"react",hint:".tsx"},{label:"CSS Only",value:"css-only",hint:".css"},{label:c.dim("Web components"),value:"web-components",hint:"Coming soon!"}];e&&t.push({label:"Skip",value:"skip",hint:"continue without components"});const n=await ct({message:"Build with",options:t});return ie(n)&&process.exit(0),n==="web-components"?(lt.info(c.blue("Web components are coming soon! Please choose React or CSS Only for now.")),Le(e)):n}o(Le,"promptComponentFramework");async function Ut(e,t){const n=e.filter(r=>r.type==="component"&&r.frameworks?.includes(t)),s=await ut({message:"Select components to add",options:n.map(r=>({label:r.name,value:r.name,hint:r.description})),required:!0});return ie(s)&&process.exit(0),s}o(Ut,"promptComponentSelectionFiltered");async function Me(e,t=!1){const n=await ft({message:e,initialValue:t});return(!n||ie(n))&&(Re(),process.exit(0)),!0}o(Me,"confirmOverwrite");function Ue(e){return{absolute:L(process.cwd(),e)}}o(Ue,"resolveDirectoryFromFlag");async function ge(e){const{config:t}=await W(),n=jt(t,e);if(typeof n=="string")return L(process.cwd(),n)}o(ge,"resolveDirectoryFromConfig");function jt(e,t){const n=t.split(".");let s=e;for(const r of n){if(s==null||typeof s!="object")return;s=s[r]}return s}o(jt,"getNestedValue");async function Gt(e){if(e){const{absolute:t}=Ue(e);return{directory:t,fromConfig:!1}}if(O())try{const t=await ge("output.cube");if(t)return{directory:t,fromConfig:!0};const n=await ge("output.cssRoot");if(n)return{directory:n,fromConfig:!0}}catch(t){const n=t instanceof Error?t.message:typeof t=="string"?t:JSON.stringify(t),s=t instanceof Error&&t.stack?`
105
+ `)}`}o(Le,"formatOverwriteWarnings");async function pe(e,t,n,s={}){if(e.length===0)return;const{devDependency:r=!1}=s,i=n==="npm"?"install":"add",a=(()=>{if(!r)return[];switch(n){case"npm":return["--save-dev"];case"pnpm":return["-D"];case"yarn":return["-D"];case"bun":return["-d"]}})();try{await ot(n,[i,...a,...e],{cwd:t})}catch{throw new p(g.DEPENDENCY_INSTALL_FAILED(n))}}o(pe,"installDependencies");async function Dt(e,t,n){const s=$(n,t.name);if(await V(s,{recursive:!0}),e.path.endsWith(".css")){const i=$(s,`${t.name}.css`);return await X(i,e.content),i}const r=$(s,Ie(e.path));return await X(r,e.content),r}o(Dt,"writeComponentFile");async function Ft({registryIndex:e,selectedComponents:t,componentType:n,componentsOutputDirectory:s,packageManager:r}){const i=[],a=new Set;await V(s,{recursive:!0});const l=await de(e,t,n);for(const f of l){const d=await fe({type:"component",name:f.name,framework:n});for(const m of d.files)if(m)try{const h=await Dt(m,f,s);h&&i.push(h)}catch(h){const b=h instanceof Error?`: ${h.message}`:"";throw new p(`Failed to write component file for "${f.name}"${b}`)}const u=f.dependencies?.[n]||[];for(const m of u)a.add(m)}if(a.size>0)try{await pe(Array.from(a),process.cwd(),r)}catch(f){const d=f instanceof Error?`: ${f.message}`:"";throw new p(`Failed to install component dependencies${d}`)}return{createdFiles:i,npmDependencies:a}}o(Ft,"installComponents");function Ot(e,t){const n=L(e),s=L(t),r=R(s,n);return!r.startsWith("..")&&!nt(r)}o(Ot,"isWithinDirectory");async function At(e){const t=[],n=L(process.cwd(),e);await V(n,{recursive:!0});const r=(await j()).filter(i=>i.type==="cube").map(i=>i.name);for(const i of r){const a=await fe({type:"cube",name:i});for(const l of a.files){if(!l)continue;const f=l.path.replace(/^styles\//,""),d=L(n,f);if(!Ot(d,n))throw new p(`Invalid file path detected in CUBE module "${i}": path escapes target directory`);const u=tt(d);try{await V(u,{recursive:!0}),await X(d,l.content),t.push(d)}catch(m){const h=m instanceof Error?`: ${m.message}`:"";throw new p(`Failed to write CUBE module "${i}"${h}`)}}}return t}o(At,"installCUBE");async function me(e){const n=await ee("**/*.resolver.json",{cwd:e,onlyFiles:!0,absolute:!0,ignore:["**/node_modules/**","**/dist/**","**/build/**","**/.git/**","**/.next/**","**/.nuxt/**","**/.astro/**","**/.cache/**","**/.turbo/**","**/.vercel/**","**/.svelte-kit/**","**/out/**"]});if(n.length===0)return{found:"none"};const[s]=n;return n.length===1&&s?{found:"one",path:R(process.cwd(),s)}:{found:"multiple",paths:n.map(r=>R(process.cwd(),r))}}o(me,"findResolverDocument");async function Pt(e,t){await oe.mkdir(t,{recursive:!0});const n=[];for(const s of e)await oe.writeFile(s.path,s.content),n.push(s.path);return n}o(Pt,"writeTokenFiles");async function Y(e,t){let n;if(t)n={type:"memory",data:t,config:e};else{if(!e.resolver)throw new p(g.RESOLVER_NOT_CONFIGURED());n={type:"resolver",resolverPath:e.resolver,config:e}}const{trees:s,resolved:r,modifiers:i,errors:a}=await rt(n);if(a.load.length>0){const l=a.load.map(f=>{const d=f.file.split("/").pop()||"unknown file";let u=`File ${d}: `;return f.message.includes("Unexpected token")?u=g.TOKEN_FILE_INVALID_JSON(d):f.message.includes("Unexpected end")?u=g.TOKEN_FILE_INCOMPLETE_JSON(d):u=g.TOKEN_FILE_GENERIC_ERROR(d,f.message),u});throw new p(g.TOKEN_LOAD_FAILED(l))}if(a.validation.length>0||a.flatten.length>0||a.resolution.length>0){const l=[...a.flatten,...a.validation,...a.resolution],f=new Map;for(const d of l)if(d.source?.sourcePath){const u=f.get(d.source.sourcePath)||[];u.push(d.message),f.set(d.source.sourcePath,u)}throw new p(g.TOKEN_VALIDATION_FAILED(f))}return{trees:s,resolved:r,modifiers:i}}o(Y,"loadAndResolveTokensForCLI");const Lt=o(async(e,t,n)=>{const s=await $t(e),r=L(process.cwd(),t),i=s.files.map(a=>({path:$(r,Ie(a.path)),content:a.content}));return{config:n,tokenFiles:i,tokensDir:r,createdTokenPaths:i.map(a=>R(process.cwd(),a.path))}},"prepareStarterKitForInstall");async function Mt(e){const t=await Lt(e.starterKit??"",e.tokensDir,e.config),n=await Pt(t.tokenFiles,e.tokensDir),s=await me(e.tokensDir);if(s.found==="none")throw new p(g.RESOLVER_NOT_FOUND(e.tokensDir));if(s.found==="multiple")throw new p(g.RESOLVER_MULTIPLE_FOUND(s.paths));const r={...e.config,resolver:s.path},{trees:i,resolved:a}=await Y(r);e.setupResult={config:r,createdTokenPaths:t.createdTokenPaths,trees:i,resolved:a,tokenFiles:t.tokenFiles,tokensDir:t.tokensDir},e.createdFiles.push(...n),e.config=r,e.sugarcubeConfig={...e.sugarcubeConfig,resolver:s.path}}o(Mt,"installFromStarterKit");async function Me(e=!0){const t=[{label:"React",value:"react",hint:".tsx"},{label:"CSS Only",value:"css-only",hint:".css"},{label:c.dim("Web components"),value:"web-components",hint:"Coming soon!"}];e&&t.push({label:"Skip",value:"skip",hint:"continue without components"});const n=await ct({message:"Build with",options:t});return ie(n)&&process.exit(0),n==="web-components"?(lt.info(c.blue("Web components are coming soon! Please choose React or CSS Only for now.")),Me(e)):n}o(Me,"promptComponentFramework");async function Ut(e,t){const n=e.filter(r=>r.type==="component"&&r.frameworks?.includes(t)),s=await ut({message:"Select components to add",options:n.map(r=>({label:r.name,value:r.name,hint:r.description})),required:!0});return ie(s)&&process.exit(0),s}o(Ut,"promptComponentSelectionFiltered");async function Ue(e,t=!1){const n=await ft({message:e,initialValue:t});return(!n||ie(n))&&($e(),process.exit(0)),!0}o(Ue,"confirmOverwrite");function je(e){return{absolute:L(process.cwd(),e)}}o(je,"resolveDirectoryFromFlag");async function ge(e){const{config:t}=await W(),n=jt(t,e);if(typeof n=="string")return L(process.cwd(),n)}o(ge,"resolveDirectoryFromConfig");function jt(e,t){const n=t.split(".");let s=e;for(const r of n){if(s==null||typeof s!="object")return;s=s[r]}return s}o(jt,"getNestedValue");async function xt(e){if(e){const{absolute:t}=je(e);return{directory:t,fromConfig:!1}}if(O())try{const t=await ge("output.cube");if(t)return{directory:t,fromConfig:!0};const n=await ge("output.cssRoot");if(n)return{directory:n,fromConfig:!0}}catch(t){const n=t instanceof Error?t.message:typeof t=="string"?t:JSON.stringify(t),s=t instanceof Error&&t.stack?`
96
106
 
97
107
  Stack trace:
98
- ${t.stack}`:"";throw new d(`Found a sugarcube config file but couldn't load it: ${n}${s}`)}throw new d(`A sugarcube config file was not found.
108
+ ${t.stack}`:"";throw new p(`Found a sugarcube config file but couldn't load it: ${n}${s}`)}throw new p(`A sugarcube config file was not found.
99
109
 
100
110
  Either a config file or --cube-dir is required to run this command.
101
111
 
102
112
  To use the cube command without a config file:
103
- e.g. ${c.cyan(`${C.CUBE} --cube-dir src/styles`)}
113
+ e.g. ${c.cyan(`${_.CUBE} --cube-dir src/styles`)}
104
114
 
105
115
  To create a config file:
106
- ${c.cyan(C.INIT)}
116
+ ${c.cyan(_.INIT)}
107
117
 
108
- Stuck? ${c.cyan("https://sugarcube.sh")}`)}o(Gt,"getCubeDir");async function Bt(e){if(e){const{absolute:t}=Ue(e);return{directory:t,fromConfig:!1}}if(O())try{const t=await ge("output.components");if(t)return{directory:t,fromConfig:!0}}catch{}throw new d(`A sugarcube config file was not found.
118
+ Stuck? ${c.cyan("https://sugarcube.sh")}`)}o(xt,"getCubeDir");async function Gt(e){if(e){const{absolute:t}=je(e);return{directory:t,fromConfig:!1}}if(O())try{const t=await ge("output.components");if(t)return{directory:t,fromConfig:!0}}catch{}throw new p(`A sugarcube config file was not found.
109
119
 
110
120
  Either a config file or --components-dir is required to run this command.
111
121
 
112
122
  To use the components command without a config file:
113
- e.g. ${c.cyan(`${C.COMPONENTS} --components-dir src/components/ui`)}
123
+ e.g. ${c.cyan(`${_.COMPONENTS} --components-dir src/components/ui`)}
114
124
 
115
125
  To create a config file:
116
- ${c.cyan(C.INIT)}
126
+ ${c.cyan(_.INIT)}
117
127
 
118
- Stuck? ${c.cyan("https://sugarcube.sh")}`)}o(Bt,"getComponentsDir");const xt=gt(),E=o((e,t)=>xt?e:t,"unicodeOr"),Vt=E("\u25C7","o"),je=E("\u250C","T"),F=E("\u2502","|"),me=E("\u2514","\u2014"),Wt=E("\u2510","T"),Yt=E("\u2518","\u2014"),ne=E("\u2500","-"),Kt=E("\u256E","+"),Ht=E("\u256F","+"),zt=E("\u2570","+"),Jt=E("\u256D","+"),qt=E("\u25CF","\u2022"),Zt=E("\u25C6","*"),Qt=E("\u25B2","!"),Xt=E("\u25A0","x"),K=o((e,t=c.bgGreen,n=c.black)=>t(` ${n(e)} `),"label"),H=o(e=>{const t=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))"].join("|"),n=new RegExp(t,"g");return typeof e=="string"?e.replace(n,""):e},"strip"),z=o((e="",t)=>{process.stdout.write(`
128
+ Stuck? ${c.cyan("https://sugarcube.sh")}`)}o(Gt,"getComponentsDir");const Bt=mt(),E=o((e,t)=>Bt?e:t,"unicodeOr"),Vt=E("\u25C7","o"),xe=E("\u250C","T"),A=E("\u2502","|"),he=E("\u2514","\u2014"),Wt=E("\u2510","T"),Yt=E("\u2518","\u2014"),ne=E("\u2500","-"),Kt=E("\u256E","+"),Ht=E("\u256F","+"),zt=E("\u2570","+"),Jt=E("\u256D","+"),qt=E("\u25CF","\u2022"),Zt=E("\u25C6","*"),Qt=E("\u25B2","!"),Xt=E("\u25A0","x"),K=o((e,t=c.bgGreen,n=c.black)=>t(` ${n(e)} `),"label"),H=o(e=>{const t=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))"].join("|"),n=new RegExp(t,"g");return typeof e=="string"?e.replace(n,""):e},"strip"),z=o((e="",t)=>{process.stdout.write(`
119
129
 
120
- ${c.gray(je)}${c.gray(ne)} ${e}
121
- `)},"intro"),se=o((e="",t)=>{process.stdout.write(`${c.gray(F)}
122
- ${c.gray(me)}${c.gray(ne)} ${e}
130
+ ${c.gray(xe)}${c.gray(ne)} ${e}
131
+ `)},"intro"),se=o((e="",t)=>{process.stdout.write(`${c.gray(A)}
132
+ ${c.gray(he)}${c.gray(ne)} ${e}
123
133
 
124
- `)},"outro");function G(e){return new Promise(t=>setTimeout(t,e))}o(G,"sleep");const en=[Jt,Kt,zt,Ht],tn=[je,Wt,me,Yt];function Ge(e,t,n,s){let r=n,i=n;return s==="center"?r=Math.floor((t-e)/2):s==="right"&&(r=t-e-n),i=t-r-e,[r,i]}o(Ge,"getPaddingForLine");const nn=o(e=>e,"defaultFormatBorder"),he=o((e="",t="",n)=>{const s=n?.output??process.stdout,r=pt(s),a=1*2,l=n?.titlePadding??1,f=n?.contentPadding??2,p=n?.width===void 0||n.width==="auto"?1:Math.min(1,n.width),u=n?.includePrefix?`${F} `:"",g=n?.formatBorder??nn,h=(n?.rounded?en:tn).map(g),b=g(ne),k=g(F),T=r-u.length;let $=Math.floor(r*p)-u.length;if(n?.width==="auto"){const Z=e.split(`
125
- `);let x=H(t).length+l*2;for(const Qe of Z){const Te=H(Qe).length+f*2;Te>x&&(x=Te)}const Q=x+a;Q<$&&($=Q)}$%2!==0&&($<T?$++:$--);const I=$-a,N=I-l*2,y=H(t).length>N?`${t.slice(0,N-3)}...`:t,[v,D]=Ge(H(y).length,I,l,n?.titleAlign),P=dt(e,I-f*2,{hard:!0,trim:!1});s.write(`${u}${h[0]}${b.repeat(v)}${y}${b.repeat(D)}${h[1]}
134
+ `)},"outro");function x(e){return new Promise(t=>setTimeout(t,e))}o(x,"sleep");const en=[Jt,Kt,zt,Ht],tn=[xe,Wt,he,Yt];function Ge(e,t,n,s){let r=n,i=n;return s==="center"?r=Math.floor((t-e)/2):s==="right"&&(r=t-e-n),i=t-r-e,[r,i]}o(Ge,"getPaddingForLine");const nn=o(e=>e,"defaultFormatBorder"),we=o((e="",t="",n)=>{const s=n?.output??process.stdout,r=dt(s),a=1*2,l=n?.titlePadding??1,f=n?.contentPadding??2,d=n?.width===void 0||n.width==="auto"?1:Math.min(1,n.width),u=n?.includePrefix?`${A} `:"",m=n?.formatBorder??nn,h=(n?.rounded?en:tn).map(m),b=m(ne),v=m(A),S=r-u.length;let k=Math.floor(r*d)-u.length;if(n?.width==="auto"){const Z=e.split(`
135
+ `);let B=H(t).length+l*2;for(const Xe of Z){const Te=H(Xe).length+f*2;Te>B&&(B=Te)}const Q=B+a;Q<k&&(k=Q)}k%2!==0&&(k<S?k++:k--);const I=k-a,D=I-l*2,y=H(t).length>D?`${t.slice(0,D-3)}...`:t,[C,N]=Ge(H(y).length,I,l,n?.titleAlign),P=pt(e,I-f*2,{hard:!0,trim:!1});s.write(`${u}${h[0]}${b.repeat(C)}${y}${b.repeat(N)}${h[1]}
126
136
  `);const q=P.split(`
127
- `);for(const Z of q){const[x,Q]=Ge(H(Z).length,I,f,n?.contentAlign);s.write(`${u}${k}${" ".repeat(x)}${Z}${" ".repeat(Q)}${k}
137
+ `);for(const Z of q){const[B,Q]=Ge(H(Z).length,I,f,n?.contentAlign);s.write(`${u}${v}${" ".repeat(B)}${Z}${" ".repeat(Q)}${v}
128
138
  `)}s.write(`${u}${h[2]}${b.repeat(I)}${h[3]}
129
- `)},"box");function we(e,t={}){const n=`
130
- ${e}`;he(n,c.black(c.bgRed(" ERROR ")),{width:"auto",titlePadding:2,formatBorder:c.red,...t})}o(we,"errorBoxWithBadge");function Be(e,t={}){const n=`
131
- ${e}`;he(n,c.black(c.bgYellow(" WARNING ")),{width:"auto",titlePadding:2,formatBorder:c.yellow,...t})}o(Be,"warningBoxWithBadge");function sn(e,t={}){const n=`
132
- ${e}`;he(n,c.black(c.bgCyan(" INFO ")),{width:"auto",titlePadding:2,formatBorder:c.cyan,...t})}o(sn,"infoBoxWithBadge");const on=o((e,t)=>{if(!(e.meta&&e.name!=="escape")){if(e.ctrl){if(e.name==="a")return"first";if(e.name==="c"||e.name==="d")return"abort";if(e.name==="e")return"last";if(e.name==="g")return"reset"}return e.name==="return"||e.name==="enter"?"submit":e.name==="backspace"?"delete":e.name==="delete"?"deleteForward":e.name==="abort"?"abort":e.name==="escape"?"exit":e.name==="tab"?"next":e.name==="pagedown"?"nextPage":e.name==="pageup"?"prevPage":e.name==="home"?"home":e.name==="end"?"end":e.name==="up"?"up":e.name==="down"?"down":e.name==="right"?"right":e.name==="left"?"left":!1}},"action"),rn=o(async(e,t={})=>{const{sidebarSymbol:n=c.gray("\u2502"),clear:s=!1,stdin:r=process.stdin,stdout:i=process.stdout}=t,a=Ce.createInterface({input:r,escapeCodeTimeout:50}),l=ve(i,{showCursor:!1});Ce.emitKeypressEvents(r,a);let f=0,p=!1;const u=o(async()=>{r.off("keypress",g),r.isTTY&&r.setRawMode(!1),a.close(),p=!0,f<e.length-1||s?l.clear():l.done()},"done"),g=o((h,b)=>{r.isTTY&&r.setRawMode(!0);const k=on(b);if(k==="abort")return u(),process.exit(0);["up","down","left","right"].includes(k)||u()},"handleKeyPress");r.isTTY&&r.setRawMode(!0),r.on("keypress",g);for(const h of e){const b=Array.isArray(h)?h:h.split(" "),k=[];for(const I of[""].concat(b)){I&&k.push(I);const N=k.join(" ").replace(/sugarcube/g,c.cyan("sugarcube")),y=`${n} ${N}`;l(y),p||await new Promise(v=>setTimeout(v,Math.floor(Math.random()*126)+75))}p||await new Promise(I=>setTimeout(I,100));const $=(await Promise.all(b).then(I=>I.join(" "))).replace(/sugarcube/g,c.cyan("sugarcube"));l(`${n} ${$}`),p||await new Promise(I=>setTimeout(I,Math.floor(Math.random()*201)+1200)),f++}r.off("keypress",g),await new Promise(h=>setTimeout(h,100)),u(),r.isTTY&&r.setRawMode(!1),r.removeAllListeners("keypress")},"sayAnimatedInSidebar");function an(){return Math.floor(Math.random()*551)+200}o(an,"getRandomTaskDuration");async function cn(e,{sidebarSymbol:t="\u2502",spacing:n=1,stdin:s=process.stdin,stdout:r=process.stdout,initialDelayMs:i=200,minDurationMs:a,successPauseMs:l=300,successMessage:f,successAsOutro:p=!1}={}){const u=o((y,v)=>{let D="";switch(v){case"start":D=`${c.cyan(`\u25B6 ${y.start}`)}`;break;case"pending":D=`${c.dim(`\u25A1 ${y.pending}`)}`;break;case"success":D=`${c.green(`\u2714 ${y.end}`)}`;break;case"end":D=`${c.dim(`\u25A0 ${y.end}`)}`;break}return`${t} ${D}`},"formatWithSidebar"),g=Array.from({length:e.length},()=>"");e.forEach((y,v)=>{g[v]=u(y,"pending")});const h=ve(r),b=_e.createInterface({input:s,escapeCodeTimeout:50});_e.emitKeypressEvents(s,b);const k=o(y=>{y===""&&(h.clear(),b.close(),s.isTTY&&s.setRawMode(!1),process.exit(0)),s.isTTY&&s.setRawMode(!0)},"keypress");s.isTTY&&s.setRawMode(!0),s.on("keypress",k);const T=Array.from({length:Math.max(n,0)},()=>`${t}`),$=o(()=>[...T,...g].join(`
133
- `),"renderContent");h($()),await G(i);let I=0;for(const y of e){g[I]=u(y,"start"),h($());const v=Date.now(),D=y.while();try{await D;const P=Date.now()-v,q=typeof a=="number"?a:an();P<q&&await G(q-P),g[I]=u(y,"success"),h($()),await G(l)}catch(P){throw g[I]=`${t} ${c.red(`\u2717 ${y.end} (failed)`)}`,h($()),y.onError?.(P),s.removeListener("keypress",k),b.close(),s.isTTY&&s.setRawMode(!1),P}I++}const N=e.map(y=>u(y,"end"));if(f)if(p){const y=`${c.gray(me)}${c.gray(ne)} ${c.green(f)}`;h([...T,...N,`${t}`,y].join(`
134
- `))}else{const y=`${t} ${c.green(f)}`;h([...T,...N,`${t}`,y].join(`
135
- `))}else h([...T,...N].join(`
136
- `));await G(1e3),s.removeListener("keypress",k),s.isTTY&&s.setRawMode(!1),b.close(),h.done()}o(cn,"executeTasksInSidebar");const ln=o(e=>process.stdout.write(`${e}
137
- `),"rawLog"),S={message:o((e=[],{symbol:t=c.gray(F),secondarySymbol:n=c.gray(F),output:s=process.stdout,spacing:r=1}={})=>{const i=[];for(let l=0;l<r;l++)i.push(`${n}`);const a=Array.isArray(e)?e:e.split(`
138
- `);if(a.length>0){const[l,...f]=a;l&&l.length>0?i.push(`${t} ${l}`):i.push(t);for(const p of f)p.length>0?i.push(`${n} ${p}`):i.push(n)}s.write(`${i.join(`
139
+ `)},"box");function ye(e,t={}){const n=`
140
+ ${e}`;we(n,c.black(c.bgRed(" ERROR ")),{width:"auto",titlePadding:2,formatBorder:c.red,...t})}o(ye,"errorBoxWithBadge");function Be(e,t={}){const n=`
141
+ ${e}`;we(n,c.black(c.bgYellow(" WARNING ")),{width:"auto",titlePadding:2,formatBorder:c.yellow,...t})}o(Be,"warningBoxWithBadge");function sn(e,t={}){const n=`
142
+ ${e}`;we(n,c.black(c.bgCyan(" INFO ")),{width:"auto",titlePadding:2,formatBorder:c.cyan,...t})}o(sn,"infoBoxWithBadge");const on=o((e,t)=>{if(!(e.meta&&e.name!=="escape")){if(e.ctrl){if(e.name==="a")return"first";if(e.name==="c"||e.name==="d")return"abort";if(e.name==="e")return"last";if(e.name==="g")return"reset"}return e.name==="return"||e.name==="enter"?"submit":e.name==="backspace"?"delete":e.name==="delete"?"deleteForward":e.name==="abort"?"abort":e.name==="escape"?"exit":e.name==="tab"?"next":e.name==="pagedown"?"nextPage":e.name==="pageup"?"prevPage":e.name==="home"?"home":e.name==="end"?"end":e.name==="up"?"up":e.name==="down"?"down":e.name==="right"?"right":e.name==="left"?"left":!1}},"action"),rn=o(async(e,t={})=>{const{sidebarSymbol:n=c.gray("\u2502"),clear:s=!1,stdin:r=process.stdin,stdout:i=process.stdout}=t,a=Ne.createInterface({input:r,escapeCodeTimeout:50}),l=De(i,{showCursor:!1});Ne.emitKeypressEvents(r,a);let f=0,d=!1;const u=o(async()=>{r.off("keypress",m),r.isTTY&&r.setRawMode(!1),a.close(),d=!0,f<e.length-1||s?l.clear():l.done()},"done"),m=o((h,b)=>{r.isTTY&&r.setRawMode(!0);const v=on(b);if(v==="abort")return u(),process.exit(0);["up","down","left","right"].includes(v)||u()},"handleKeyPress");r.isTTY&&r.setRawMode(!0),r.on("keypress",m);for(const h of e){const b=Array.isArray(h)?h:h.split(" "),v=[];for(const I of[""].concat(b)){I&&v.push(I);const D=v.join(" ").replace(/sugarcube/g,c.cyan("sugarcube")),y=`${n} ${D}`;l(y),d||await new Promise(C=>setTimeout(C,Math.floor(Math.random()*126)+75))}d||await new Promise(I=>setTimeout(I,100));const k=(await Promise.all(b).then(I=>I.join(" "))).replace(/sugarcube/g,c.cyan("sugarcube"));l(`${n} ${k}`),d||await new Promise(I=>setTimeout(I,Math.floor(Math.random()*201)+1200)),f++}r.off("keypress",m),await new Promise(h=>setTimeout(h,100)),u(),r.isTTY&&r.setRawMode(!1),r.removeAllListeners("keypress")},"sayAnimatedInSidebar");function an(){return Math.floor(Math.random()*551)+200}o(an,"getRandomTaskDuration");async function cn(e,{sidebarSymbol:t="\u2502",spacing:n=1,stdin:s=process.stdin,stdout:r=process.stdout,initialDelayMs:i=200,minDurationMs:a,successPauseMs:l=300,successMessage:f,successAsOutro:d=!1}={}){const u=o((y,C)=>{let N="";switch(C){case"start":N=`${c.cyan(`\u25B6 ${y.start}`)}`;break;case"pending":N=`${c.dim(`\u25A1 ${y.pending}`)}`;break;case"success":N=`${c.green(`\u2714 ${y.end}`)}`;break;case"end":N=`${c.dim(`\u25A0 ${y.end}`)}`;break}return`${t} ${N}`},"formatWithSidebar"),m=Array.from({length:e.length},()=>"");e.forEach((y,C)=>{m[C]=u(y,"pending")});const h=De(r),b=Ce.createInterface({input:s,escapeCodeTimeout:50});Ce.emitKeypressEvents(s,b);const v=o(y=>{y===""&&(h.clear(),b.close(),s.isTTY&&s.setRawMode(!1),process.exit(0)),s.isTTY&&s.setRawMode(!0)},"keypress");s.isTTY&&s.setRawMode(!0),s.on("keypress",v);const S=Array.from({length:Math.max(n,0)},()=>`${t}`),k=o(()=>[...S,...m].join(`
143
+ `),"renderContent");h(k()),await x(i);let I=0;for(const y of e){m[I]=u(y,"start"),h(k());const C=Date.now(),N=y.while();try{await N;const P=Date.now()-C,q=typeof a=="number"?a:an();P<q&&await x(q-P),m[I]=u(y,"success"),h(k()),await x(l)}catch(P){throw m[I]=`${t} ${c.red(`\u2717 ${y.end} (failed)`)}`,h(k()),y.onError?.(P),s.removeListener("keypress",v),b.close(),s.isTTY&&s.setRawMode(!1),P}I++}const D=e.map(y=>u(y,"end"));if(f)if(d){const y=`${c.gray(he)}${c.gray(ne)} ${c.green(f)}`;h([...S,...D,`${t}`,y].join(`
144
+ `))}else{const y=`${t} ${c.green(f)}`;h([...S,...D,`${t}`,y].join(`
145
+ `))}else h([...S,...D].join(`
146
+ `));await x(1e3),s.removeListener("keypress",v),s.isTTY&&s.setRawMode(!1),b.close(),h.done()}o(cn,"executeTasksInSidebar");const ln=o(e=>process.stdout.write(`${e}
147
+ `),"rawLog"),T={message:o((e=[],{symbol:t=c.gray(A),secondarySymbol:n=c.gray(A),output:s=process.stdout,spacing:r=1}={})=>{const i=[];for(let l=0;l<r;l++)i.push(`${n}`);const a=Array.isArray(e)?e:e.split(`
148
+ `);if(a.length>0){const[l,...f]=a;l&&l.length>0?i.push(`${t} ${l}`):i.push(t);for(const d of f)d.length>0?i.push(`${n} ${d}`):i.push(n)}s.write(`${i.join(`
139
149
  `)}
140
- `)},"message"),info:o((e,t)=>{S.message(e,{...t,symbol:c.blue(qt)})},"info"),success:o((e,t)=>{S.message(e,{...t,symbol:c.green(Zt)})},"success"),step:o((e,t)=>{S.message(e,{...t,symbol:c.green(Vt)})},"step"),warn:o((e,t)=>{S.message(e,{...t,symbol:c.yellow(Qt)})},"warn"),error:o((e,t)=>{S.message(e,{...t,symbol:c.red(Xt)})},"error"),animated:o(async(e,{secondarySymbol:t=c.gray(F),output:n=process.stdout,clear:s=!1,...r}={})=>rn(e,{sidebarSymbol:t,stdout:n,clear:s,...r}),"animated"),tasks:o(async(e,{spacing:t=1,secondarySymbol:n=c.gray(F),output:s=process.stdout,...r}={})=>cn(e,{sidebarSymbol:n,spacing:t,stdout:s,...r}),"tasks"),space:o((e=1)=>{for(let t=0;t<e;t++)process.stdout.write(`${c.gray(F)}
150
+ `)},"message"),info:o((e,t)=>{T.message(e,{...t,symbol:c.blue(qt)})},"info"),success:o((e,t)=>{T.message(e,{...t,symbol:c.green(Zt)})},"success"),step:o((e,t)=>{T.message(e,{...t,symbol:c.green(Vt)})},"step"),warn:o((e,t)=>{T.message(e,{...t,symbol:c.yellow(Qt)})},"warn"),error:o((e,t)=>{T.message(e,{...t,symbol:c.red(Xt)})},"error"),animated:o(async(e,{secondarySymbol:t=c.gray(A),output:n=process.stdout,clear:s=!1,...r}={})=>rn(e,{sidebarSymbol:t,stdout:n,clear:s,...r}),"animated"),tasks:o(async(e,{spacing:t=1,secondarySymbol:n=c.gray(A),output:s=process.stdout,...r}={})=>cn(e,{sidebarSymbol:n,spacing:t,stdout:s,...r}),"tasks"),space:o((e=1)=>{for(let t=0;t<e;t++)process.stdout.write(`${c.gray(A)}
141
151
  `)},"space"),break:o((e=1)=>{for(let t=0;t<e;t++)process.stdout.write(`
142
- `)},"break")};function J(e){if(e instanceof d)S.space(1),we(e.message,{});else{const t=`An unexpected error occurred: ${e instanceof Error?e.message:String(e)}
152
+ `)},"break")};function J(e){if(e instanceof p)T.space(1),ye(e.message,{});else{const t=`An unexpected error occurred: ${e instanceof Error?e.message:String(e)}
143
153
 
144
- If this issue persists, please report it: ${c.cyan("https://github.com/sugarcube-org/sugarcube/issues")}`;S.space(1),we(t,{})}process.exit(1)}o(J,"handleError");function B(e,t=process.cwd()){try{const n=mt(t,"package.json");if(!A(n))return!1;const s=Ie(n,"utf-8"),r=JSON.parse(s),i={...r.dependencies,...r.devDependencies,...r.peerDependencies};return e in i}catch{return!1}}o(B,"isPackageInstalled");async function xe(e,{withFallback:t=!1}={}){const n=await ht({programmatic:!0,cwd:e});if(n?.includes("yarn"))return"yarn";if(n?.includes("pnpm"))return"pnpm";if(n?.includes("bun"))return"bun";if(n?.includes("npm"))return"npm";if(t){const s=process.env.npm_config_user_agent||"";if(s.includes("yarn"))return"yarn";if(s.includes("pnpm"))return"pnpm";if(s.includes("bun"))return"bun"}return"npm"}o(xe,"getPackageManager");function un(e=process.cwd()){return wt(e)!==null}o(un,"isTypeScriptProject");async function Ve(e=process.cwd()){return un(e)?"sugarcube.config.ts":"sugarcube.config.js"}o(Ve,"getConfigFileName");function fn(e){return/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(e)}o(fn,"isValidIdentifier");function ye(e,t=0){const n=" ".repeat(t);if(e===null)return"null";if(e===void 0)return"undefined";if(typeof e=="string")return JSON.stringify(e);if(typeof e=="number"||typeof e=="boolean")return String(e);if(Array.isArray(e))return e.length===0?"[]":`[
145
- ${e.map(r=>`${n} ${ye(r,t+1)}`).join(`,
154
+ If this issue persists, please report it: ${c.cyan("https://github.com/sugarcube-org/sugarcube/issues")}`;T.space(1),ye(t,{})}process.exit(1)}o(J,"handleError");function G(e,t=process.cwd()){try{const n=gt(t,"package.json");if(!F(n))return!1;const s=Ee(n,"utf-8"),r=JSON.parse(s),i={...r.dependencies,...r.devDependencies,...r.peerDependencies};return e in i}catch{return!1}}o(G,"isPackageInstalled");async function Ve(e,{withFallback:t=!1}={}){const n=await ht({programmatic:!0,cwd:e});if(n?.includes("yarn"))return"yarn";if(n?.includes("pnpm"))return"pnpm";if(n?.includes("bun"))return"bun";if(n?.includes("npm"))return"npm";if(t){const s=process.env.npm_config_user_agent||"";if(s.includes("yarn"))return"yarn";if(s.includes("pnpm"))return"pnpm";if(s.includes("bun"))return"bun"}return"npm"}o(Ve,"getPackageManager");function un(e=process.cwd()){return wt(e)!==null}o(un,"isTypeScriptProject");async function We(e=process.cwd()){return un(e)?"sugarcube.config.ts":"sugarcube.config.js"}o(We,"getConfigFileName");function fn(e){return/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(e)}o(fn,"isValidIdentifier");function Se(e,t=0){const n=" ".repeat(t);if(e===null)return"null";if(e===void 0)return"undefined";if(typeof e=="string")return JSON.stringify(e);if(typeof e=="number"||typeof e=="boolean")return String(e);if(Array.isArray(e))return e.length===0?"[]":`[
155
+ ${e.map(r=>`${n} ${Se(r,t+1)}`).join(`,
146
156
  `)}
147
157
  ${n}]`;if(typeof e=="object"){const s=Object.entries(e);return s.length===0?"{}":`{
148
- ${s.map(([i,a])=>{const l=fn(i)?i:JSON.stringify(i);return`${n} ${l}: ${ye(a,t+1)}`}).join(`,
158
+ ${s.map(([i,a])=>{const l=fn(i)?i:JSON.stringify(i);return`${n} ${l}: ${Se(a,t+1)}`}).join(`,
149
159
  `)}
150
- ${n}}`}return JSON.stringify(e)}o(ye,"formatValue");function pn(e,t,n){const s=ye(e,0);let r;return n?r=t?`import type { SugarcubeConfig } from "@sugarcube-org/vite";
160
+ ${n}}`}return JSON.stringify(e)}o(Se,"formatValue");function dn(e,t,n){const s=Se(e,0);let r;return n?r=t?`import type { SugarcubeConfig } from "@sugarcube-org/vite";
151
161
 
152
162
  const config: SugarcubeConfig = `:`// @ts-check
153
163
  /**
154
164
  * @type {import('@sugarcube-org/vite').SugarcubeConfig}
155
165
  */
156
- const config = `:r=`// Configuration reference: ${De.CONFIGURATION}
166
+ const config = `:r=`// Configuration reference: ${Fe.CONFIGURATION}
157
167
  const config = `,`${r}${s};
158
168
 
159
169
  export default config;
160
- `}o(pn,"formatConfigAsCode");async function We(e,t){try{const n=await Ve(),s=n.endsWith(".ts"),r=pn(e,s,t);await X(n,r,"utf-8")}catch(n){const s=n instanceof Error?`: ${n.message}`:"";throw new d(`Failed to write config file${s}`)}}o(We,"writeSugarcubeConfig");function dn(e,t){return{...e,...t,output:{...e.output??{},...t.output??{}},transforms:{...e.transforms??{},...t.transforms??{}}}}o(dn,"mergeSugarcubeConfig");async function Ye(e){const{config:t}=await rt(),n=dn(t,e),s=B(le);await We(n,s)}o(Ye,"mergeConfigIntoFile");const gn=new U().name("components").description("Add components to your project").argument("[components...]","Components to add (e.g., button card)").option("-f, --framework <type>","Framework to use (react, css-only)").option("--components-dir <dir>","Components output directory (e.g., 'src/components')").option("-s, --silent","Suppress logs and prompts").option("-o, --overwrite","Overwrite existing files").action(async(e,t)=>{try{t.silent||z(K(c.bgGreen(c.black("Components"))));const{directory:n,fromConfig:s}=await Bt(t.componentsDir);let r=[],i;if(e.length>0||t.framework){if(!t.framework)throw new d(m.COMPONENTS_FRAMEWORK_REQUIRED());if(!["react","css-only"].includes(t.framework))throw new d(m.COMPONENTS_INVALID_FRAMEWORK());i=t.framework,r=e}else{i=await Le(!1);const T=await j();T||(Re("Failed to fetch component list"),process.exit(1)),r=await Ut(T,i)}const a=await xe(process.cwd(),{withFallback:!0}),l=await j(),f=await pe(l,r,i),p=await vt({selectedComponents:r,componentType:i,componentsOutputDirectory:n}),u=Fe(p);if(u&&!t.force&&!t.silent){const T=Be(u,{});S.space(1),await Me("Continue?",!1)}const g=[],h=[],b=new Set;for(const T of f){const $=T.dependencies?.[i]||[];for(const I of $)b.add(I)}const k=Array.from(b).filter(T=>!B(T,process.cwd()));k.length>0&&g.push({pending:`Install ${k.length} dependencies`,start:`Installing ${k.join(", ")}...`,end:`Installed ${k.join(", ")}`,while:o(async()=>{await de(k,process.cwd(),a)},"while")});for(const T of f)g.push({pending:`Write component files for ${T.name}`,start:`Writing component files for ${T.name}...`,end:`Wrote component files for ${T.name}`,while:o(async()=>{const $=await At({registryIndex:l,selectedComponents:[T.name],componentType:i,componentsOutputDirectory:n,overwrite:t.overwrite||!1,packageManager:a});h.push(...$.createdFiles)},"while")});if(await S.tasks(g,{successMessage:"Components added successfully! \u{1F389} ",minDurationMs:0,successAsOutro:!0}),ln(""),!s&&O()){const T=R(process.cwd(),n);await Ye({output:{components:T}})}}catch(n){J(n)}}),mn=new U().name("cube").description("Add CUBE CSS to your project").option("-s, --silent","Suppress logs and prompts").option("-f, --force","Skip overwrite confirmation").option("--cube-dir <dir>","CUBE CSS output directory (defaults to cssRoot)").action(async e=>{try{e.silent||z(K("CUBE CSS"));const{directory:t,fromConfig:n}=await Gt(e.cubeDir);try{await V(t,{recursive:!0})}catch(a){const l=a instanceof Error?`: ${a.message}`:"";throw new d(`Failed to create output directory${l}`)}const s=await Dt({cubeDirectory:t}),r=Fe(s);if(r&&!e.force&&!e.silent){S.space(1);const a=Be(r,{});await Me("Continue?",!1)}const i=await Ft(t);if(!e.silent){S.space(1);const a=i,p=[...new Set(a)].map(u=>R(process.cwd(),u)).map(u=>({pending:`Write ${u}`,start:`Writing ${u}`,end:`Wrote ${u}`,while:o(async()=>{},"while")}));await S.tasks(p,{spacing:0,minDurationMs:0,successPauseMs:100,successMessage:"\u{1F389} Files written!"}),se(c.green("CUBE added successfully."))}if(!n&&O()){const a=R(process.cwd(),t),{config:l}=await W(),f=l.output.cssRoot;a!==f&&await Ye({output:{cube:a}})}}catch(t){J(t)}}),hn="**/*.{html,htm,js,ts,jsx,tsx,vue,svelte,astro,php,njk,liquid,pug,hbs,handlebars,twig,erb,ejs}",wn=["**/node_modules/**","**/dist/**","**/build/**","**/.next/**","**/.nuxt/**","**/.astro/**","**/.git/**","**/coverage/**","**/.pnpm/**","**/.pnpm-store/**","**/.npm/**","**/.cache/**","**/.turbo/**","**/.vercel/**","**/.svelte-kit/**","**/out/**","**/__snapshots__/**","**/*.config.{js,ts,mjs}","**/*.min.js","**/*.bundle.js","**/*.d.ts"],Ke=1e4,He=100;async function ze(e,t){const n={name:"sugarcube",rules:it(t.utilities??{},e),preflights:[]},s=await yt({presets:[n]}),r=await ee(hn,{ignore:wn,dot:!1,onlyFiles:!0,absolute:!1});if(r.length===0)return[];if(r.length>Ke)throw new d(`Found ${r.length} files to scan (limit: ${Ke}). Are you running this from a monorepo root or a directory containing multiple projects? Run the command from within a single project directory instead.`);const i=[];let a=0;const l=He*1024*1024;for(const u of r){const g=await Ee(u,"utf8");if(a+=g.length,a>l)throw new d(`Total source size exceeds ${He}MB. Are you running this from a monorepo root or a directory containing multiple projects? Run the command from within a single project directory instead.`);i.push(g)}const f=i.join(`
161
- `),{css:p}=await s.generate(f,{preflights:!1});return p?.trim()?[{path:`${t.output.utilities}/utilities.gen.css`,css:p}]:[]}o(ze,"generateSugarcubeUtilities");async function yn(e,t,n,s){const r=[],i=await re(e,t,n),a=await be(i,n,s);await ke(a),r.push(...a);const l=await ze(i,n);return await $e(l),r.push(...l),r}o(yn,"generateAllCSS");const Tn=new U().name("generate").description("Generate CSS from your design tokens").option("--force","Skip overwrite confirmation").option("-s, --silent","Suppress logs and prompts").action(async e=>{try{if(e.silent||z(K("Generate CSS")),B("@sugarcube-org/vite"))throw new d("Sugarcube vite plugin detected. When using the plugin, CSS is generated automatically during your build process. Remove the plugin to use CLI generation instead.");if(!O())throw new d(`A sugarcube config file was not found. This command requires one.
162
-
163
- Please run ${c.cyan(C.INIT)} (or manually create a config file).
164
-
165
- Stuck? ${c.cyan("https://sugarcube.sh")}`);const{config:t}=await W(),{trees:n,resolved:s,modifiers:r}=await Y(t),i=await yn(n,s,t,r);if(!e.silent){const a=i.map(u=>u.path),p=[...new Set(a)].map(u=>R(process.cwd(),u)).map(u=>({pending:`Write ${u}`,start:`Writing ${u}`,end:`Wrote ${u}`,while:o(async()=>{},"while")}));await S.tasks(p,{spacing:1,minDurationMs:0,successPauseMs:100,successMessage:"\u{1F389} Files written!"}),S.space(1),se(c.green("CSS generated successfully."))}}catch(t){J(t)}});async function Sn(e){const t=R(process.cwd(),e.actualStylesDir),n=e.isSrcDir?te.output.components:te.output.components.replace(/^src\//,"");return{resolver:e.resolverPath,output:{cssRoot:t,components:n}}}o(Sn,"buildSugarcubeConfig");function Je(e){try{const t=ae.resolve(e,"package.json");if(!A(t))return null;const n=Ie(t,"utf-8");return JSON.parse(n)}catch{return null}}o(Je,"getPackageJson");function M(e,t){if(!e)return!1;const n=e.dependencies,s=e.devDependencies;return!!(n?.[t]||s?.[t])}o(M,"hasDependency");function In(e,t){if(!e)return!1;const n=e.dependencies,s=e.devDependencies,r={...n,...s};return Object.keys(r).some(i=>i.startsWith(t))}o(In,"hasDependencyStartingWith");function En(e){const t=A(ae.resolve(e,"src")),n=Je(e),s=t?"src/design-tokens":"design-tokens",r=t?"src/styles":"styles",i=t?"src/components":"components";let a="none";return M(n,"next")?a=A(ae.resolve(e,`${t?"src/":""}app`))?"next-app":"next-pages":M(n,"astro")?a="astro":M(n,"nuxt")?a="nuxt":M(n,"@sveltejs/kit")?a="sveltekit":In(n,"@remix-run/")?a="remix":M(n,"@11ty/eleventy")?a="eleventy":M(n,"vite")&&(a="vite"),{framework:a,isSrcDir:t,tokensDir:s,stylesDir:r,componentDir:i}}o(En,"getProjectInfo");function bn(e,t){if(["vite","astro","nuxt","sveltekit","remix"].includes(e))return!0;if(e==="eleventy"){const s=Je(t);return M(s,"vite")}return!1}o(bn,"shouldInstallVitePlugin");function qe(e,t=0){if(typeof e!="object"||e===null||t>bt)return!1;for(const[n,s]of Object.entries(e))if(!n.startsWith("$")&&typeof s=="object"&&s!==null&&("$value"in s||qe(s,t+1)))return!0;return!1}o(qe,"hasAnyToken");async function kn(e){try{const t=await ee(It,{cwd:e,absolute:!0});for(const n of t)try{const s=await oe.readFile(n,"utf-8"),r=JSON.parse(s);if(qe(r))return!0}catch{}return!1}catch{return!1}}o(kn,"detectExistingTokens");const $n=o(async e=>{S.space(2),await G(200);let t="Next steps";if(e.pluginToInstall===le)t+=`
170
+ `}o(dn,"formatConfigAsCode");async function Ye(e,t){try{const n=await We(),s=n.endsWith(".ts"),r=dn(e,s,t);await X(n,r,"utf-8")}catch(n){const s=n instanceof Error?`: ${n.message}`:"";throw new p(`Failed to write config file${s}`)}}o(Ye,"writeSugarcubeConfig");function pn(e,t){return{...e,...t,output:{...e.output??{},...t.output??{}},transforms:{...e.transforms??{},...t.transforms??{}}}}o(pn,"mergeSugarcubeConfig");async function Ke(e){const{config:t}=await it(),n=pn(t,e),s=G(le);await Ye(n,s)}o(Ke,"mergeConfigIntoFile");const mn=new U().name("components").description("Add components to your project").argument("[components...]","Components to add (e.g., button card)").option("-f, --framework <type>","Framework to use (react, css-only)").option("--components-dir <dir>","Components output directory (e.g., 'src/components')").option("-s, --silent","Suppress logs and prompts").option("-o, --overwrite","Overwrite existing files").action(async(e,t)=>{try{t.silent||z(K(c.bgGreen(c.black("Components"))));const{directory:n,fromConfig:s}=await Gt(t.componentsDir);let r=[],i;if(e.length>0||t.framework){if(!t.framework)throw new p(g.COMPONENTS_FRAMEWORK_REQUIRED());if(!["react","css-only"].includes(t.framework))throw new p(g.COMPONENTS_INVALID_FRAMEWORK());i=t.framework,r=e}else{i=await Me(!1);const S=await j();S||($e("Failed to fetch component list"),process.exit(1)),r=await Ut(S,i)}const a=await Ve(process.cwd(),{withFallback:!0}),l=await j(),f=await de(l,r,i),d=await Ct({selectedComponents:r,componentType:i,componentsOutputDirectory:n}),u=Le(d);if(u&&!t.force&&!t.silent){const S=Be(u,{});T.space(1),await Ue("Continue?",!1)}const m=[],h=[],b=new Set;for(const S of f){const k=S.dependencies?.[i]||[];for(const I of k)b.add(I)}const v=Array.from(b).filter(S=>!G(S,process.cwd()));v.length>0&&m.push({pending:`Install ${v.length} dependencies`,start:`Installing ${v.join(", ")}...`,end:`Installed ${v.join(", ")}`,while:o(async()=>{await pe(v,process.cwd(),a)},"while")});for(const S of f)m.push({pending:`Write component files for ${S.name}`,start:`Writing component files for ${S.name}...`,end:`Wrote component files for ${S.name}`,while:o(async()=>{const k=await Ft({registryIndex:l,selectedComponents:[S.name],componentType:i,componentsOutputDirectory:n,overwrite:t.overwrite||!1,packageManager:a});h.push(...k.createdFiles)},"while")});if(await T.tasks(m,{successMessage:"Components added successfully! \u{1F389} ",minDurationMs:0,successAsOutro:!0}),ln(""),!s&&O()){const S=R(process.cwd(),n);await Ke({output:{components:S}})}}catch(n){J(n)}}),gn=new U().name("cube").description("Add CUBE CSS to your project").option("-s, --silent","Suppress logs and prompts").option("-f, --force","Skip overwrite confirmation").option("--cube-dir <dir>","CUBE CSS output directory (defaults to cssRoot)").action(async e=>{try{e.silent||z(K("CUBE CSS"));const{directory:t,fromConfig:n}=await xt(e.cubeDir);try{await V(t,{recursive:!0})}catch(a){const l=a instanceof Error?`: ${a.message}`:"";throw new p(`Failed to create output directory${l}`)}const s=await Nt({cubeDirectory:t}),r=Le(s);if(r&&!e.force&&!e.silent){T.space(1);const a=Be(r,{});await Ue("Continue?",!1)}const i=await At(t);if(!e.silent){T.space(1);const a=i,d=[...new Set(a)].map(u=>R(process.cwd(),u)).map(u=>({pending:`Write ${u}`,start:`Writing ${u}`,end:`Wrote ${u}`,while:o(async()=>{},"while")}));await T.tasks(d,{spacing:0,minDurationMs:0,successPauseMs:100,successMessage:"\u{1F389} Files written!"}),se(c.green("CUBE added successfully."))}if(!n&&O()){const a=R(process.cwd(),t),{config:l}=await W(),f=l.output.cssRoot;a!==f&&await Ke({output:{cube:a}})}}catch(t){J(t)}}),hn="**/*.{html,htm,js,ts,jsx,tsx,vue,svelte,astro,php,njk,liquid,pug,hbs,handlebars,twig,erb,ejs}",wn=["**/node_modules/**","**/dist/**","**/build/**","**/.next/**","**/.nuxt/**","**/.astro/**","**/.git/**","**/coverage/**","**/.pnpm/**","**/.pnpm-store/**","**/.npm/**","**/.cache/**","**/.turbo/**","**/.vercel/**","**/.svelte-kit/**","**/out/**","**/__snapshots__/**","**/*.config.{js,ts,mjs}","**/*.min.js","**/*.bundle.js","**/*.d.ts"],He=1e4,ze=100;async function Je(e,t){const n={name:"sugarcube",rules:at(t.utilities??{},e),preflights:[]},s=await yt({presets:[n]}),r=await ee(hn,{ignore:wn,dot:!1,onlyFiles:!0,absolute:!1});if(r.length===0)return[];if(r.length>He)throw new p(`Found ${r.length} files to scan (limit: ${He}). Are you running this from a monorepo root or a directory containing multiple projects? Run the command from within a single project directory instead.`);const i=[];let a=0;const l=ze*1024*1024;for(const u of r){const m=await be(u,"utf8");if(a+=m.length,a>l)throw new p(`Total source size exceeds ${ze}MB. Are you running this from a monorepo root or a directory containing multiple projects? Run the command from within a single project directory instead.`);i.push(m)}const f=i.join(`
171
+ `),{css:d}=await s.generate(f,{preflights:!1});return d?.trim()?[{path:`${t.output.utilities}/utilities.gen.css`,css:d}]:[]}o(Je,"generateSugarcubeUtilities");async function yn(e,t,n,s){const r=[],i=await re(e,t,n),a=await ve(i,n,s);await ke(a),r.push(...a);const l=await Je(i,n);return await Re(l),r.push(...l),r}o(yn,"generateAllCSS");function Sn(e){let t;(e.fluidMin||e.fluidMax)&&(t={min:e.fluidMin?Number.parseInt(e.fluidMin,10):320,max:e.fluidMax?Number.parseInt(e.fluidMax,10):1200});const n={resolver:e.resolver,output:{cssRoot:e.stylesDir,variables:e.variablesDir,utilities:e.utilitiesDir},transforms:{fluid:t,colorFallbackStrategy:e.colorFallback}};return _e(n)}o(Sn,"buildConfigFromFlags");function Tn(e,t){const n={min:t.fluidMin?Number.parseInt(t.fluidMin,10):e.transforms.fluid.min,max:t.fluidMax?Number.parseInt(t.fluidMax,10):e.transforms.fluid.max};return{...e,resolver:t.resolver??e.resolver,transforms:{fluid:n,colorFallbackStrategy:t.colorFallback??e.transforms.colorFallbackStrategy},output:{...e.output,cssRoot:t.stylesDir??e.output.cssRoot,variables:t.variablesDir??e.output.variables,utilities:t.utilitiesDir??e.output.utilities}}}o(Tn,"mergeConfigWithFlags");function In(e){return!!(e.resolver||e.stylesDir||e.variablesDir||e.utilitiesDir||e.fluidMin||e.fluidMax||e.colorFallback)}o(In,"hasRelevantFlags");function En(e){if(e.colorFallback&&!["native","polyfill"].includes(e.colorFallback))throw new p(`Invalid --color-fallback value: "${e.colorFallback}". Must be "native" or "polyfill".`);if(e.fluidMin){const t=Number.parseInt(e.fluidMin,10);if(Number.isNaN(t)||t<=0)throw new p(`Invalid --fluid-min value: "${e.fluidMin}". Must be a positive number.`)}if(e.fluidMax){const t=Number.parseInt(e.fluidMax,10);if(Number.isNaN(t)||t<=0)throw new p(`Invalid --fluid-max value: "${e.fluidMax}". Must be a positive number.`)}}o(En,"validateFlags");async function bn(e){if(O()){const{config:s}=await W();return Tn(s,e)}const t=await me(process.cwd());if(t.found==="multiple")throw new p(g.GENERATE_MULTIPLE_RESOLVERS_NO_CONFIG(t.paths));const n=e.resolver??(t.found==="one"?t.path:void 0);if(n||In(e))return Sn({...e,resolver:n});throw new p(g.GENERATE_NO_CONFIG_OR_RESOLVER())}o(bn,"resolveConfig");const vn=new U().name("generate").description("Generate CSS from your design tokens").option("--force","Skip overwrite confirmation").option("-s, --silent","Suppress logs and prompts").option("--resolver <path>","Path to token resolver file (.resolver.json)").option("--styles-dir <dir>","CSS output directory (default: 'src/styles')").option("--variables-dir <dir>","Token variables output directory (default: 'src/styles/global')").option("--utilities-dir <dir>","Utilities output directory (default: 'src/styles/utilities')").option("--fluid-min <number>","Minimum viewport width for fluid scaling (default: 320)").option("--fluid-max <number>","Maximum viewport width for fluid scaling (default: 1200)").option("--color-fallback <strategy>","Color fallback strategy: 'native' or 'polyfill' (default: native)").action(async e=>{try{if(e.silent||z(K("Generate CSS")),En(e),G("@sugarcube-org/vite"))throw new p("Sugarcube vite plugin detected. When using the plugin, CSS is generated automatically during your build process. Remove the plugin to use CLI generation instead.");const t=await bn(e),{trees:n,resolved:s,modifiers:r}=await Y(t),i=await yn(n,s,t,r);if(!e.silent){const a=i.map(u=>u.path),d=[...new Set(a)].map(u=>R(process.cwd(),u)).map(u=>({pending:`Write ${u}`,start:`Writing ${u}`,end:`Wrote ${u}`,while:o(async()=>{},"while")}));await T.tasks(d,{spacing:1,minDurationMs:0,successPauseMs:100,successMessage:"\u{1F389} Files written!"}),T.space(1),se(c.green("CSS generated successfully."))}}catch(t){J(t)}});async function kn(e){const t=R(process.cwd(),e.actualStylesDir),n=e.isSrcDir?te.output.components:te.output.components.replace(/^src\//,"");return{resolver:e.resolverPath,output:{cssRoot:t,components:n}}}o(kn,"buildSugarcubeConfig");function qe(e){try{const t=ae.resolve(e,"package.json");if(!F(t))return null;const n=Ee(t,"utf-8");return JSON.parse(n)}catch{return null}}o(qe,"getPackageJson");function M(e,t){if(!e)return!1;const n=e.dependencies,s=e.devDependencies;return!!(n?.[t]||s?.[t])}o(M,"hasDependency");function Rn(e,t){if(!e)return!1;const n=e.dependencies,s=e.devDependencies,r={...n,...s};return Object.keys(r).some(i=>i.startsWith(t))}o(Rn,"hasDependencyStartingWith");function _n(e){const t=F(ae.resolve(e,"src")),n=qe(e),s=t?"src/design-tokens":"design-tokens",r=t?"src/styles":"styles",i=t?"src/components":"components";let a="none";return M(n,"next")?a=F(ae.resolve(e,`${t?"src/":""}app`))?"next-app":"next-pages":M(n,"astro")?a="astro":M(n,"nuxt")?a="nuxt":M(n,"@sveltejs/kit")?a="sveltekit":Rn(n,"@remix-run/")?a="remix":M(n,"@11ty/eleventy")?a="eleventy":M(n,"vite")&&(a="vite"),{framework:a,isSrcDir:t,tokensDir:s,stylesDir:r,componentDir:i}}o(_n,"getProjectInfo");function $n(e,t){if(["vite","astro","nuxt","sveltekit","remix"].includes(e))return!0;if(e==="eleventy"){const s=qe(t);return M(s,"vite")}return!1}o($n,"shouldInstallVitePlugin");function Ze(e,t=0){if(typeof e!="object"||e===null||t>bt)return!1;for(const[n,s]of Object.entries(e))if(!n.startsWith("$")&&typeof s=="object"&&s!==null&&("$value"in s||Ze(s,t+1)))return!0;return!1}o(Ze,"hasAnyToken");async function Cn(e){try{const t=await ee(It,{cwd:e,absolute:!0});for(const n of t)try{const s=await oe.readFile(n,"utf-8"),r=JSON.parse(s);if(Ze(r))return!0}catch{}return!1}catch{return!1}}o(Cn,"detectExistingTokens");const Nn=o(async e=>{T.space(2),await x(200);let t="Next steps";if(e.pluginToInstall===le)t+=`
166
172
 
167
173
  `,t+=`1. Configure the plugin
168
174
  `,t+=` Add the plugin to your build configuration:
@@ -174,18 +180,18 @@ Stuck? ${c.cyan("https://sugarcube.sh")}`);const{config:t}=await W(),{trees:n,re
174
180
  `,t+=`
175
181
 
176
182
  `,t+=`3. (Optional) Add CUBE CSS
177
- `,t+=` ${c.cyan(C.CUBE)}`,t+=`
183
+ `,t+=` ${c.cyan(_.CUBE)}`,t+=`
178
184
 
179
185
  `,t+=`4. (Optional) Add components
180
- `,t+=` ${c.cyan(C.COMPONENTS)}`;else{const n=`${e.stylesDir}/global/tokens.variables.gen.css`;t+=`
186
+ `,t+=` ${c.cyan(_.COMPONENTS)}`;else{const n=`${e.stylesDir}/global/tokens.variables.gen.css`;t+=`
181
187
 
182
188
  `,t+=`1. Import the generated CSS
183
189
  `;const s=e.isSrcDir?`"${n}"`:`"./${n}"`;t+=` ${c.cyan(`import ${s}`)}`,t+=`
184
190
 
185
191
  `,t+=`2. (Optional) Add CUBE CSS
186
- `,t+=` ${c.cyan(C.CUBE)}`,t+=`
192
+ `,t+=` ${c.cyan(_.CUBE)}`,t+=`
187
193
 
188
194
  `,t+=`3. (Optional) Add components
189
- `,t+=` ${c.cyan(C.COMPONENTS)}`}t+=`
195
+ `,t+=` ${c.cyan(_.COMPONENTS)}`}t+=`
190
196
 
191
- `,t+=`Docs: ${c.cyan("https://sugarcube.sh")}`,sn(t,{width:.75}),await G(200),S.break(1)},"nextSteps");async function Rn(e){await $n(e)}o(Rn,"next");const _n=o(async()=>{const e=["Welcome to sugarcube \u2014 the toolkit for seriously sweet frontends!"];S.space(1),await S.animated(e,{clear:!1})},"welcome");function Ze(e,t){if(!e||e.trim()==="")throw new d(m.DIRECTORY_PATH_EMPTY(t));const s=nt(e).split("/")[0];if(s&&Et.includes(s))throw new d(m.DIRECTORY_PATH_RESERVED(t,e))}o(Ze,"validateDirectoryPath");function Cn(e){e.tokensDir&&Ze(e.tokensDir,"tokens-dir"),e.stylesDir&&Ze(e.stylesDir,"styles-dir")}o(Cn,"validateOptions");async function vn(){O()&&(we(m.CONFIG_EXISTS(),{}),process.exit(1))}o(vn,"preflightInit");async function Dn(e){const t=En(process.cwd()),n=e.tokensDir||t.tokensDir,s=e.stylesDir||t.stylesDir,r=await kn(n);let i=null;if(r){const a=await Pe(n);if(a.found==="none")throw new d(m.RESOLVER_NOT_FOUND(n));if(a.found==="multiple")throw new d(m.RESOLVER_MULTIPLE_FOUND(a.paths));i=a.path}return{tokensDir:n,stylesDir:s,isSrcDir:t.isSrcDir,hasExistingTokens:r,resolverPath:i,framework:t.framework}}o(Dn,"initializeProjectContext");function Nn(e,t,n){const s=t?null:e.kit||ce;if((e.skip||[]).includes("plugin"))return{starterKit:s,pluginToInstall:null};const i=An(n,process.cwd());return{starterKit:s,pluginToInstall:i}}o(Nn,"determineInstallationTargets");function An(e,t){return bn(e,t)?le:null}o(An,"determinePlugin");async function On(e,t,n,s,r){const i=await xe(process.cwd(),{withFallback:!0});return{options:e,...t,isSrcDir:t.isSrcDir,config:n,sugarcubeConfig:s,...r,packageManager:i,createdFiles:[],createdDirectories:[],installedDependencies:[],tasks:[]}}o(On,"buildInitContext");async function Fn(e){const{trees:t,resolved:n}=await Y(e.config);e.setupResult={config:e.config,createdTokenPaths:[],trees:t,resolved:n,tokenFiles:[],tokensDir:e.tokensDir}}o(Fn,"processExistingTokens");async function Pn(e){!e.hasExistingTokens&&e.starterKit?await Mt(e):await Fn(e)}o(Pn,"setupDesignTokens");async function Ln(e){if(!e.setupResult)throw new d(m.INITIALIZATION_INCOMPLETE());const{trees:t,resolved:n}=e.setupResult,s=await re(t,n,e.config),r=await be(s,e.config);await ke(r)}o(Ln,"writeCSSVariables");async function Mn(e){if(!e.setupResult)throw new d(m.INITIALIZATION_INCOMPLETE());const{trees:t,resolved:n}=e.setupResult,s=await re(t,n,e.config),r=await ze(s,e.config);r.length&&await $e(r)}o(Mn,"writeCSSUtilities");async function Un(e){if(e.pluginToInstall&&!B(e.pluginToInstall))try{await de([e.pluginToInstall],process.cwd(),e.packageManager,{devDependency:!0}),e.installedDependencies.push(e.pluginToInstall)}catch{throw new d(m.PLUGIN_INSTALL_FAILED({pluginToInstall:e.pluginToInstall,packageManager:e.packageManager}))}}o(Un,"installPlugins");async function jn(e){try{const t=!!e.pluginToInstall;await We(e.sugarcubeConfig,t);const n=await Ve();e.createdFiles.push(n)}catch{throw new d(m.CONFIG_WRITE_FAILED())}}o(jn,"finalize");function Gn(e){const t=[];if(e.hasExistingTokens?t.push({pending:"Looking for existing tokens",start:"Looking for existing tokens...",end:`Existing tokens found at ${e.tokensDir} ${E("\u2192","->")} using them`,while:o(async()=>{},"while")}):e.starterKit&&t.push({pending:"Looking for existing tokens",start:"Looking for existing tokens...",end:`No existing tokens detected ${E("\u2192","->")} adding starter kit`,while:o(async()=>{},"while")}),e.pluginToInstall){const n="Vite";B(e.pluginToInstall)?t.push({pending:`Checking for ${n} compatibility`,start:`Checking for ${n} compatibility...`,end:`${n} plugin already installed ${E("\u2192","->")} skipping plugin installation`,while:o(async()=>{},"while")}):t.push({pending:"Checking for Vite compatibility",start:"Checking for Vite compatibility...",end:`Vite detected ${E("\u2192","->")} plugin will be installed`,while:o(async()=>{},"while")})}else{const n=e.options.skip?.includes("plugin");t.push({pending:"Checking for Vite compatibility",start:"Checking for Vite compatibility...",end:n?`Plugin skipped ${E("\u2192","->")} CSS will be generated as file(s)`:`No Vite detected ${E("\u2192","->")} CSS will be generated as file(s)`,while:o(async()=>{},"while")})}return t}o(Gn,"buildDetectionTasks");async function Bn(e){if(e.tasks.push({pending:e.hasExistingTokens?"Process existing design tokens":"Add design tokens",start:e.hasExistingTokens?"Processing existing design tokens...":"Adding design tokens...",end:e.hasExistingTokens?"Design tokens processed":"Design tokens added",while:o(async()=>{await Pn(e)},"while")}),!e.pluginToInstall)e.tasks.push({pending:"Generate CSS variables",start:"Generating CSS variables...",end:"CSS variables generated",while:o(async()=>{await Ln(e)},"while")}),e.tasks.push({pending:"Generate CSS utilities",start:"Generating CSS utilities...",end:"CSS utilities generated",while:o(async()=>{await Mn(e)},"while")});else if(e.pluginToInstall&&!B(e.pluginToInstall)){const t="Vite";e.tasks.push({pending:`Install ${t} plugin`,start:`Installing ${t} plugin...`,end:`${t} plugin installed`,while:o(async()=>{await Un(e)},"while")})}e.tasks.push({pending:"Write configuration file",start:"Writing configuration file...",end:"Configuration file written",while:o(async()=>{await jn(e)},"while")})}o(Bn,"buildExecutionTasks");const xn=new U().name("init").description("Initialize a new sugarcube project").option("--kit <kit>",`Starter kit to use (default: ${ce})`,ce).option("--tokens-dir <dir>","Design tokens directory (e.g., 'src/design-tokens')").option("--styles-dir <dir>","Styles output directory (e.g., 'src/styles')").option("--with <items...>","Install optional items").option("--skip <items...>","Skip installation of specific items (e.g., plugin)").action(async e=>{let t;try{Cn(e),await vn();const n=await Dn(e),s=n.resolverPath??"",r=await Sn({resolverPath:s,actualStylesDir:n.stylesDir,isSrcDir:n.isSrcDir}),i=at(r),a=Nn(e,n.hasExistingTokens,n.framework);t=await On(e,n,i,r,a),z(K("sugarcube")),await _n();const l=Gn(t);l.length>0&&(S.message("Detecting project\u2026"),await S.tasks(l,{minDurationMs:1e3})),t.tasks=[],await Bn(t),t.tasks.length>0&&(S.message("Setting things up\u2026"),await S.tasks(t.tasks,{successMessage:"\u{1F389} Tasks completed successfully!"})),await Rn(t)}catch(n){J(n)}}),Vn=new U().name("validate").description("Validate design token files").argument("[paths...]","Token files or directories to validate (e.g., src/design-tokens)").action(async e=>{try{if(z(K("Validate")),O()&&!e.length){const{config:i}=await W();await Y(i),se(c.greenBright("All tokens valid \u2728"));return}if(!e.length)throw new d(m.VALIDATE_NO_PATH_SPECIFIED());for(const i of e)if(!A(i))throw new d(m.VALIDATE_PATH_NOT_FOUND(i));const n=(await ee(e.map(i=>i.endsWith(".json")?i:_(i,"**/*.json")))).filter(i=>!i.endsWith(".resolver.json"));if(n.length===0)throw new d(m.VALIDATE_NO_TOKEN_FILES());const s={};for(const i of n){const a=await Ee(i,"utf-8"),l=R(process.cwd(),i);s[l]={content:a}}const r=O()?(await W()).config:{output:te.output,transforms:te.transforms};await Y(r,s),se(c.greenBright("All tokens valid \u2728"))}catch(t){J(t)}});process.on("SIGINT",()=>process.exit(0)),process.on("SIGTERM",()=>process.exit(0));async function Wn(){const e=new U().name("sugarcube").description("CLI for sugarcube").version(St.version,"-v, --version","display the version number");e.addCommand(xn).addCommand(Tn).addCommand(Vn).addCommand(gn).addCommand(mn),e.parse()}o(Wn,"main"),Wn();
197
+ `,t+=`Docs: ${c.cyan("https://sugarcube.sh")}`,sn(t,{width:.75}),await x(200),T.break(1)},"nextSteps");async function Dn(e){await Nn(e)}o(Dn,"next");const Fn=o(async()=>{const e=["Welcome to sugarcube \u2014 the toolkit for seriously sweet frontends!"];T.space(1),await T.animated(e,{clear:!1})},"welcome");function Qe(e,t){if(!e||e.trim()==="")throw new p(g.DIRECTORY_PATH_EMPTY(t));const s=st(e).split("/")[0];if(s&&Et.includes(s))throw new p(g.DIRECTORY_PATH_RESERVED(t,e))}o(Qe,"validateDirectoryPath");function On(e){e.tokensDir&&Qe(e.tokensDir,"tokens-dir"),e.stylesDir&&Qe(e.stylesDir,"styles-dir")}o(On,"validateOptions");async function An(){O()&&(ye(g.CONFIG_EXISTS(),{}),process.exit(1))}o(An,"preflightInit");async function Pn(e){const t=_n(process.cwd()),n=e.tokensDir||t.tokensDir,s=e.stylesDir||t.stylesDir,r=await Cn(n);let i=null;if(r){const a=await me(n);if(a.found==="none")throw new p(g.RESOLVER_NOT_FOUND(n));if(a.found==="multiple")throw new p(g.RESOLVER_MULTIPLE_FOUND(a.paths));i=a.path}return{tokensDir:n,stylesDir:s,isSrcDir:t.isSrcDir,hasExistingTokens:r,resolverPath:i,framework:t.framework}}o(Pn,"initializeProjectContext");function Ln(e,t,n){const s=t?null:e.kit||ce;if((e.skip||[]).includes("plugin"))return{starterKit:s,pluginToInstall:null};const i=Mn(n,process.cwd());return{starterKit:s,pluginToInstall:i}}o(Ln,"determineInstallationTargets");function Mn(e,t){return $n(e,t)?le:null}o(Mn,"determinePlugin");async function Un(e,t,n,s,r){const i=await Ve(process.cwd(),{withFallback:!0});return{options:e,...t,isSrcDir:t.isSrcDir,config:n,sugarcubeConfig:s,...r,packageManager:i,createdFiles:[],createdDirectories:[],installedDependencies:[],tasks:[]}}o(Un,"buildInitContext");async function jn(e){const{trees:t,resolved:n}=await Y(e.config);e.setupResult={config:e.config,createdTokenPaths:[],trees:t,resolved:n,tokenFiles:[],tokensDir:e.tokensDir}}o(jn,"processExistingTokens");async function xn(e){!e.hasExistingTokens&&e.starterKit?await Mt(e):await jn(e)}o(xn,"setupDesignTokens");async function Gn(e){if(!e.setupResult)throw new p(g.INITIALIZATION_INCOMPLETE());const{trees:t,resolved:n}=e.setupResult,s=await re(t,n,e.config),r=await ve(s,e.config);await ke(r)}o(Gn,"writeCSSVariables");async function Bn(e){if(!e.setupResult)throw new p(g.INITIALIZATION_INCOMPLETE());const{trees:t,resolved:n}=e.setupResult,s=await re(t,n,e.config),r=await Je(s,e.config);r.length&&await Re(r)}o(Bn,"writeCSSUtilities");async function Vn(e){if(e.pluginToInstall&&!G(e.pluginToInstall))try{await pe([e.pluginToInstall],process.cwd(),e.packageManager,{devDependency:!0}),e.installedDependencies.push(e.pluginToInstall)}catch{throw new p(g.PLUGIN_INSTALL_FAILED({pluginToInstall:e.pluginToInstall,packageManager:e.packageManager}))}}o(Vn,"installPlugins");async function Wn(e){try{const t=!!e.pluginToInstall;await Ye(e.sugarcubeConfig,t);const n=await We();e.createdFiles.push(n)}catch{throw new p(g.CONFIG_WRITE_FAILED())}}o(Wn,"finalize");function Yn(e){const t=[];if(e.hasExistingTokens?t.push({pending:"Looking for existing tokens",start:"Looking for existing tokens...",end:`Existing tokens found at ${e.tokensDir} ${E("\u2192","->")} using them`,while:o(async()=>{},"while")}):e.starterKit&&t.push({pending:"Looking for existing tokens",start:"Looking for existing tokens...",end:`No existing tokens detected ${E("\u2192","->")} adding starter kit`,while:o(async()=>{},"while")}),e.pluginToInstall){const n="Vite";G(e.pluginToInstall)?t.push({pending:`Checking for ${n} compatibility`,start:`Checking for ${n} compatibility...`,end:`${n} plugin already installed ${E("\u2192","->")} skipping plugin installation`,while:o(async()=>{},"while")}):t.push({pending:"Checking for Vite compatibility",start:"Checking for Vite compatibility...",end:`Vite detected ${E("\u2192","->")} plugin will be installed`,while:o(async()=>{},"while")})}else{const n=e.options.skip?.includes("plugin");t.push({pending:"Checking for Vite compatibility",start:"Checking for Vite compatibility...",end:n?`Plugin skipped ${E("\u2192","->")} CSS will be generated as file(s)`:`No Vite detected ${E("\u2192","->")} CSS will be generated as file(s)`,while:o(async()=>{},"while")})}return t}o(Yn,"buildDetectionTasks");async function Kn(e){if(e.tasks.push({pending:e.hasExistingTokens?"Process existing design tokens":"Add design tokens",start:e.hasExistingTokens?"Processing existing design tokens...":"Adding design tokens...",end:e.hasExistingTokens?"Design tokens processed":"Design tokens added",while:o(async()=>{await xn(e)},"while")}),!e.pluginToInstall)e.tasks.push({pending:"Generate CSS variables",start:"Generating CSS variables...",end:"CSS variables generated",while:o(async()=>{await Gn(e)},"while")}),e.tasks.push({pending:"Generate CSS utilities",start:"Generating CSS utilities...",end:"CSS utilities generated",while:o(async()=>{await Bn(e)},"while")});else if(e.pluginToInstall&&!G(e.pluginToInstall)){const t="Vite";e.tasks.push({pending:`Install ${t} plugin`,start:`Installing ${t} plugin...`,end:`${t} plugin installed`,while:o(async()=>{await Vn(e)},"while")})}e.tasks.push({pending:"Write configuration file",start:"Writing configuration file...",end:"Configuration file written",while:o(async()=>{await Wn(e)},"while")})}o(Kn,"buildExecutionTasks");const Hn=new U().name("init").description("Initialize a new sugarcube project").option("--kit <kit>",`Starter kit to use (default: ${ce})`,ce).option("--tokens-dir <dir>","Design tokens directory (e.g., 'src/design-tokens')").option("--styles-dir <dir>","Styles output directory (e.g., 'src/styles')").option("--with <items...>","Install optional items").option("--skip <items...>","Skip installation of specific items (e.g., plugin)").action(async e=>{let t;try{On(e),await An();const n=await Pn(e),s=n.resolverPath??"",r=await kn({resolverPath:s,actualStylesDir:n.stylesDir,isSrcDir:n.isSrcDir}),i=_e(r),a=Ln(e,n.hasExistingTokens,n.framework);t=await Un(e,n,i,r,a),z(K("sugarcube")),await Fn();const l=Yn(t);l.length>0&&(T.message("Detecting project\u2026"),await T.tasks(l,{minDurationMs:1e3})),t.tasks=[],await Kn(t),t.tasks.length>0&&(T.message("Setting things up\u2026"),await T.tasks(t.tasks,{successMessage:"\u{1F389} Tasks completed successfully!"})),await Dn(t)}catch(n){J(n)}}),zn=new U().name("validate").description("Validate design token files").argument("[paths...]","Token files or directories to validate (e.g., src/design-tokens)").action(async e=>{try{if(z(K("Validate")),O()&&!e.length){const{config:i}=await W();await Y(i),se(c.greenBright("All tokens valid \u2728"));return}if(!e.length)throw new p(g.VALIDATE_NO_PATH_SPECIFIED());for(const i of e)if(!F(i))throw new p(g.VALIDATE_PATH_NOT_FOUND(i));const n=(await ee(e.map(i=>i.endsWith(".json")?i:$(i,"**/*.json")))).filter(i=>!i.endsWith(".resolver.json"));if(n.length===0)throw new p(g.VALIDATE_NO_TOKEN_FILES());const s={};for(const i of n){const a=await be(i,"utf-8"),l=R(process.cwd(),i);s[l]={content:a}}const r=O()?(await W()).config:{output:te.output,transforms:te.transforms};await Y(r,s),se(c.greenBright("All tokens valid \u2728"))}catch(t){J(t)}});process.on("SIGINT",()=>process.exit(0)),process.on("SIGTERM",()=>process.exit(0));async function Jn(){const e=new U().name("sugarcube").description("CLI for sugarcube").version(Tt.version,"-v, --version","display the version number");e.addCommand(Hn).addCommand(vn).addCommand(zn).addCommand(mn).addCommand(gn),e.parse()}o(Jn,"main"),Jn();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sugarcube-org/cli",
3
- "version": "0.0.0-alpha.33",
3
+ "version": "0.0.0-alpha.34",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "provenance": false