@sugarcube-org/cli 0.0.0-alpha.17 → 0.0.0-alpha.19

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 +31 -30
  2. package/package.json +2 -2
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- var Je=Object.defineProperty;var o=(e,t)=>Je(e,"name",{value:t,configurable:!0});import{Command as L}from"commander";import{relative as R,join as $,basename as x,resolve as Q,dirname as qe,normalize as ze}from"pathe";import c from"picocolors";import{existsSync as N,readFileSync as ye}from"node:fs";import Ze from"node-fetch";import{z as m}from"zod";import se,{mkdir as W,writeFile as X,readFile as Qe}from"node:fs/promises";import{execa as Xe}from"execa";import{loadAndResolveTokens as et,validateConfig as tt,configFileExists as v,loadInternalConfig as ee,loadUserConfig as nt,processAndConvertTokens as oe,generateCSSVariables as Te,writeCSSVariablesToDisk as Se,writeCSSUtilitiesToDisk as Ie,convertConfigToUnoRules as st,DEFAULT_STYLES_PATH as ot,DEFAULT_CONFIG as re,fillDefaults as rt}from"@sugarcube-org/core";import it from"is-unicode-supported";import ie,{resolve as at}from"node:path";import{select as ct,isCancel as ae,log as lt,multiselect as ut,confirm as ft,cancel as ke}from"@clack/prompts";import{getColumns as pt}from"@clack/core";import{wrapAnsi as dt}from"fast-wrap-ansi";import*as Ee from"node:readline";import be from"node:readline";import{createLogUpdate as Ce}from"log-update";import{detect as gt}from"@antfu/ni";import{getTsconfig as mt}from"get-tsconfig";import{createGenerator as ht}from"@unocss/core";import G from"fast-glob";var wt="0.0.0-alpha.17",yt={version:wt};const ce="fluid",$e="**/*.json",Re="@sugarcube-org/vite",Tt=["node_modules",".git",".next","dist","build"],St=5,A={INIT:"make-sugarcube init",COMPONENTS:"make-sugarcube components",GENERATE:"make-sugarcube generate",CUBE:"make-sugarcube cube"},It={INITIALIZATION:"https://sugarcube.sh/docs/getting-started/getting-started"},w={PROJECT_REQUIRED:`No sugarcube project detected. Please run ${c.cyan(A.INIT)} first.
2
+ var qe=Object.defineProperty;var o=(e,t)=>qe(e,"name",{value:t,configurable:!0});import{Command as L}from"commander";import{relative as R,join as $,basename as W,resolve as Q,dirname as ze,normalize as Ze}from"pathe";import c from"picocolors";import{existsSync as F,readFileSync as Te}from"node:fs";import Qe from"node-fetch";import{z as m}from"zod";import se,{mkdir as G,writeFile as X,readFile as Xe}from"node:fs/promises";import{execa as et}from"execa";import{loadAndResolveTokens as tt,validateConfig as nt,configFileExists as v,loadInternalConfig as ee,loadUserConfig as st,processAndConvertTokens as oe,generateCSSVariables as Se,writeCSSVariablesToDisk as Ie,writeCSSUtilitiesToDisk as ke,convertConfigToUnoRules as ot,DEFAULT_STYLES_PATH as rt,DEFAULT_CONFIG as re,fillDefaults as it}from"@sugarcube-org/core";import at from"is-unicode-supported";import ie,{resolve as ct}from"node:path";import{select as lt,isCancel as ae,log as ut,multiselect as ft,confirm as pt,cancel as Ee}from"@clack/prompts";import{getColumns as dt}from"@clack/core";import{wrapAnsi as gt}from"fast-wrap-ansi";import*as be from"node:readline";import Ce from"node:readline";import{createLogUpdate as $e}from"log-update";import{detect as mt}from"@antfu/ni";import{getTsconfig as ht}from"get-tsconfig";import{createGenerator as wt}from"@unocss/core";import B from"fast-glob";var yt="0.0.0-alpha.19",Tt={version:yt};const ce="fluid",Re="**/*.json",le="@sugarcube-org/vite",St=["node_modules",".git",".next","dist","build"],It=5,A={INIT:"make-sugarcube init",COMPONENTS:"make-sugarcube components",GENERATE:"make-sugarcube generate",CUBE:"make-sugarcube cube"},_e={INITIALIZATION:"https://sugarcube.sh/docs/getting-started/setup",CONFIGURATION:"https://sugarcube.sh/docs/getting-started/configuration"},w={PROJECT_REQUIRED:`No sugarcube project detected. Please run ${c.cyan(A.INIT)} first.
3
3
 
4
- For more information, visit: ${c.cyan(It.INITIALIZATION)}`,CONFIG_EXISTS:o(()=>`A sugarcube config file already exists in this projct.
4
+ For more information, visit: ${c.cyan(_e.INITIALIZATION)}`,CONFIG_EXISTS:o(()=>`A sugarcube config file already exists in this projct.
5
5
 
6
6
  To start over, remove it and run ${c.cyan(A.INIT)} again.`,"CONFIG_EXISTS"),PLUGIN_INSTALL_FAILED:o(e=>`Failed to install ${e.pluginToInstall} plugin.
7
7
 
@@ -60,8 +60,8 @@ The 'generate' command is for manual generation without plugins. Since you have
60
60
 
61
61
  npm run dev # or your framework's dev command
62
62
 
63
- The plugin will automatically generate CSS with hot module replacement.`,"PLUGIN_DETECTED")};class g extends Error{static{o(this,"CLIError")}constructor(t,n){super(t),this.name="CLIError",this.cause=n}}const le=m.enum(["react","web-components","css-only"]),_e=m.object({path:m.string(),type:m.string()}),kt=_e.extend({framework:le});m.object({themes:m.record(m.string(),m.array(m.string())).optional()}).strict();const Et=m.object({name:m.string(),type:m.string(),description:m.string().optional(),frameworks:m.array(m.string()).optional(),files:m.array(m.union([kt,_e])),tokens:m.record(m.object({type:m.string(),mapping:m.string()})).optional(),dependencies:m.record(le,m.array(m.string())).optional(),registryDependencies:m.record(le,m.array(m.string())).optional(),tokenDependencies:m.array(m.string()).optional()}),bt=m.array(Et),Ct=m.object({content:m.string()}),De=process.env.REGISTRY_URL??"https://sugarcube.sh/r";async function ve(e){try{const t=await Ze(e);if(!t.ok){if(t.status===401)throw new g(w.REGISTRY_AUTH_REQUIRED(e));if(t.status===403)throw new g(w.REGISTRY_AUTH_INVALID(e));if(t.status===404)throw new g(w.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 g(w.REGISTRY_REQUEST_FAILED(s,e))}return t.json()}catch(t){throw t instanceof g?t:new g(w.REGISTRY_NETWORK_ERROR(e))}}o(ve,"fetchRegistry");async function M(){const e=`${De}/index.json`,t=await ve(e);try{return bt.parse(t)}catch{throw new g(w.REGISTRY_INVALID_DATA(e))}}o(M,"getRegistryIndex");async function ue({type:e,name:t,framework:n}){const s=await M(),r=s.find(a=>a.type===e&&a.name===t);if(!r){const a=s.filter(l=>l.type===e).map(l=>l.name);throw new g(w.REGISTRY_ITEM_NOT_FOUND(e,t,a))}let i=r.files;e==="component"&&n&&(i=r.files.filter(a=>"framework"in a&&a.framework===n));const u=await Promise.all(i.map(async a=>{const l=`${De}/${a.path}.json`,f=await ve(l);try{const p=Ct.parse(f);return{path:a.path,type:a.type,framework:"framework"in a?a.framework:void 0,content:p.content}}catch{throw new g(w.REGISTRY_FILE_INVALID(a.path))}}));return{item:r,files:u}}o(ue,"getRegistryFiles");async function $t(e){const t=await ue({type:"tokens",name:e});if(!t.files[0])throw new g(w.STARTER_KIT_UNAVAILABLE(e));return t}o($t,"fetchStarterKit");async function fe(e,t,n){const s=[],r=new Set;async function i(u){if(r.has(u))return;r.add(u);const a=e.find(f=>f.name===u);if(!a){const f=e.filter(p=>p.type==="component").map(p=>p.name).join(", ");throw new g(`Component '${u}' not found in registry
64
- Available components: ${f}`)}const l=a.registryDependencies?.[n]||[];for(const f of l)await i(f);s.push(a)}o(i,"resolveComponent");for(const u of t)await i(u);return s}o(fe,"resolveTree");async function Rt({selectedComponents:e,componentType:t,componentsOutputDirectory:n}){const s={variableCSS:[],utilityCSS:[],componentFiles:[],componentCSS:[],cubeCSS:[],indexFiles:[]},r=await M(),u=(await fe(r,e,t)).map(p=>p.name),a=r.filter(p=>p.type==="component").filter(p=>u.includes(p.name)),l=a.flatMap(p=>p.files.filter(d=>(d.type==="tsx"||d.type==="astro"||d.type==="njk")&&"framework"in d&&d.framework===t).map(d=>R(process.cwd(),$(n,p.name,`${p.name}.${d.type}`))));s.componentFiles=l.filter(p=>N($(process.cwd(),p)));const f=a.map(p=>{const d=p.name;return R(process.cwd(),$(n,p.name,`${d}.css`))});return s.componentCSS=f.filter(p=>N($(process.cwd(),p))),s}o(Rt,"collectComponentOverwriteWarnings");async function _t({cubeDirectory:e}){const t={variableCSS:[],utilityCSS:[],componentFiles:[],componentCSS:[],cubeCSS:[],indexFiles:[]},s=(await M()).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=>N($(process.cwd(),r))),t}o(_t,"collectCubeOverwriteWarnings");function Ae(e){const t=[];if(e.variableCSS.length>0&&t.push(`CSS variables files:
63
+ The plugin will automatically generate CSS with hot module replacement.`,"PLUGIN_DETECTED")};class g extends Error{static{o(this,"CLIError")}constructor(t,n){super(t),this.name="CLIError",this.cause=n}}const ue=m.enum(["react","web-components","css-only"]),De=m.object({path:m.string(),type:m.string()}),kt=De.extend({framework:ue});m.object({themes:m.record(m.string(),m.array(m.string())).optional()}).strict();const Et=m.object({name:m.string(),type:m.string(),description:m.string().optional(),frameworks:m.array(m.string()).optional(),files:m.array(m.union([kt,De])),tokens:m.record(m.object({type:m.string(),mapping:m.string()})).optional(),dependencies:m.record(ue,m.array(m.string())).optional(),registryDependencies:m.record(ue,m.array(m.string())).optional(),tokenDependencies:m.array(m.string()).optional()}),bt=m.array(Et),Ct=m.object({content:m.string()}),ve=process.env.REGISTRY_URL??"https://sugarcube.sh/r";async function Ae(e){try{const t=await Qe(e);if(!t.ok){if(t.status===401)throw new g(w.REGISTRY_AUTH_REQUIRED(e));if(t.status===403)throw new g(w.REGISTRY_AUTH_INVALID(e));if(t.status===404)throw new g(w.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 g(w.REGISTRY_REQUEST_FAILED(s,e))}return t.json()}catch(t){throw t instanceof g?t:new g(w.REGISTRY_NETWORK_ERROR(e))}}o(Ae,"fetchRegistry");async function M(){const e=`${ve}/index.json`,t=await Ae(e);try{return bt.parse(t)}catch{throw new g(w.REGISTRY_INVALID_DATA(e))}}o(M,"getRegistryIndex");async function fe({type:e,name:t,framework:n}){const s=await M(),r=s.find(a=>a.type===e&&a.name===t);if(!r){const a=s.filter(l=>l.type===e).map(l=>l.name);throw new g(w.REGISTRY_ITEM_NOT_FOUND(e,t,a))}let i=r.files;e==="component"&&n&&(i=r.files.filter(a=>"framework"in a&&a.framework===n));const u=await Promise.all(i.map(async a=>{const l=`${ve}/${a.path}.json`,f=await Ae(l);try{const p=Ct.parse(f);return{path:a.path,type:a.type,framework:"framework"in a?a.framework:void 0,content:p.content}}catch{throw new g(w.REGISTRY_FILE_INVALID(a.path))}}));return{item:r,files:u}}o(fe,"getRegistryFiles");async function $t(e){const t=await fe({type:"tokens",name:e});if(!t.files[0])throw new g(w.STARTER_KIT_UNAVAILABLE(e));return t}o($t,"fetchStarterKit");async function pe(e,t,n){const s=[],r=new Set;async function i(u){if(r.has(u))return;r.add(u);const a=e.find(f=>f.name===u);if(!a){const f=e.filter(p=>p.type==="component").map(p=>p.name).join(", ");throw new g(`Component '${u}' not found in registry
64
+ Available components: ${f}`)}const l=a.registryDependencies?.[n]||[];for(const f of l)await i(f);s.push(a)}o(i,"resolveComponent");for(const u of t)await i(u);return s}o(pe,"resolveTree");async function Rt({selectedComponents:e,componentType:t,componentsOutputDirectory:n}){const s={variableCSS:[],utilityCSS:[],componentFiles:[],componentCSS:[],cubeCSS:[],indexFiles:[]},r=await M(),u=(await pe(r,e,t)).map(p=>p.name),a=r.filter(p=>p.type==="component").filter(p=>u.includes(p.name)),l=a.flatMap(p=>p.files.filter(d=>(d.type==="tsx"||d.type==="astro"||d.type==="njk")&&"framework"in d&&d.framework===t).map(d=>R(process.cwd(),$(n,p.name,`${p.name}.${d.type}`))));s.componentFiles=l.filter(p=>F($(process.cwd(),p)));const f=a.map(p=>{const d=p.name;return R(process.cwd(),$(n,p.name,`${d}.css`))});return s.componentCSS=f.filter(p=>F($(process.cwd(),p))),s}o(Rt,"collectComponentOverwriteWarnings");async function _t({cubeDirectory:e}){const t={variableCSS:[],utilityCSS:[],componentFiles:[],componentCSS:[],cubeCSS:[],indexFiles:[]},s=(await M()).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(_t,"collectCubeOverwriteWarnings");function Ne(e){const t=[];if(e.variableCSS.length>0&&t.push(`CSS variables files:
65
65
  ${e.variableCSS.map(s=>` - ${s}`).join(`
66
66
  `)}`),e.utilityCSS.length>0&&t.push(`CSS utility files:
67
67
  ${e.utilityCSS.map(s=>` - ${s}`).join(`
@@ -75,34 +75,34 @@ ${e.indexFiles.map(s=>` - ${s}`).join(`
75
75
 
76
76
  ${t.join(`
77
77
 
78
- `)}`}o(Ae,"formatOverwriteWarnings");async function pe(e,t,n){if(e.length===0)return;const s=n==="npm"?"install":"add";try{await Xe(n,[s,...e],{cwd:t})}catch{throw new g(w.DEPENDENCY_INSTALL_FAILED(n))}}o(pe,"installDependencies");async function Dt(e,t,n){const s=$(n,t.name);if(await W(s,{recursive:!0}),e.path.endsWith(".css")){const i=$(s,`${t.name}.css`);return await X(i,e.content),i}const r=$(s,x(e.path));return await X(r,e.content),r}o(Dt,"writeComponentFile");async function vt({registryIndex:e,selectedComponents:t,componentType:n,componentsOutputDirectory:s,packageManager:r}){const i=[],u=new Set;await W(s,{recursive:!0});const a=await fe(e,t,n);for(const l of a){const f=await ue({type:"component",name:l.name,framework:n});for(const d of f.files)if(d)try{const h=await Dt(d,l,s);h&&i.push(h)}catch(h){const E=h instanceof Error?`: ${h.message}`:"";throw new g(`Failed to write component file for "${l.name}"${E}`)}const p=l.dependencies?.[n]||[];for(const d of p)u.add(d)}if(u.size>0)try{await pe(Array.from(u),process.cwd(),r)}catch(l){const f=l instanceof Error?`: ${l.message}`:"";throw new g(`Failed to install component dependencies${f}`)}return{createdFiles:i,npmDependencies:u}}o(vt,"installComponents");async function At(e){const t=[],n=Q(process.cwd(),e);await W(n,{recursive:!0});const r=(await M()).filter(i=>i.type==="cube").map(i=>i.name);for(const i of r){const u=await ue({type:"cube",name:i});for(const a of u.files){if(!a)continue;const l=a.path.replace(/^styles\//,""),f=$(n,l),p=qe(f);try{await W(p,{recursive:!0}),await X(f,a.content),t.push(f)}catch(d){const h=d instanceof Error?`: ${d.message}`:"";throw new g(`Failed to write CUBE module "${i}"${h}`)}}}return t}o(At,"installCUBE");async function Ft(e,t){await se.mkdir(t,{recursive:!0});const n=[];for(const s of e)await se.writeFile(s.path,s.content),n.push(s.path);return n}o(Ft,"writeTokenFiles");async function B(e,t){const n={type:"files",config:e},{trees:s,resolved:r,errors:i}=await et(n);if(i.load.length>0){const u=i.load.map(a=>{const l=a.file.split("/").pop()||"unknown file";let f=`File ${l}: `;return a.message.includes("Unexpected token")?f=w.TOKEN_FILE_INVALID_JSON(l):a.message.includes("Unexpected end")?f=w.TOKEN_FILE_INCOMPLETE_JSON(l):f=w.TOKEN_FILE_GENERIC_ERROR(l,a.message),f});throw new g(w.TOKEN_LOAD_FAILED(u))}if(i.validation.length>0||i.flatten.length>0||i.resolution.length>0){const u=[...i.flatten,...i.validation,...i.resolution],a=new Map;for(const l of u)if(l.source?.sourcePath){const f=a.get(l.source.sourcePath)||[];f.push(l.message),a.set(l.source.sourcePath,f)}throw new g(w.TOKEN_VALIDATION_FAILED(a))}return{trees:s,resolved:r}}o(B,"loadAndResolveTokensForCLI");function Nt(e,t){const n={...e};return Object.keys(t).length>0&&typeof n.tokens=="object"&&!Array.isArray(n.tokens)&&"source"in n.tokens&&(n.tokens.themes=t),tt(n)}o(Nt,"integrateThemesIntoConfig");const{hidden:gs}=c,Ot=it(),k=o((e,t)=>Ot?e:t,"unicodeOr"),Pt=k("\u25C7","o"),Fe=k("\u250C","T"),O=k("\u2502","|"),de=k("\u2514","\u2014"),Lt=k("\u2510","T"),Mt=k("\u2518","\u2014"),te=k("\u2500","-"),jt=k("\u256E","+"),Ut=k("\u256F","+"),xt=k("\u2570","+"),Wt=k("\u256D","+"),Gt=k("\u25CF","\u2022"),Bt=k("\u25C6","*"),Vt=k("\u25B2","!"),Kt=k("\u25A0","x"),V=o((e,t=c.bgGreen,n=c.black)=>t(` ${n(e)} `),"label"),K=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"),Y=o((e="",t)=>{process.stdout.write(`
78
+ `)}`}o(Ne,"formatOverwriteWarnings");async function de(e,t,n){if(e.length===0)return;const s=n==="npm"?"install":"add";try{await et(n,[s,...e],{cwd:t})}catch{throw new g(w.DEPENDENCY_INSTALL_FAILED(n))}}o(de,"installDependencies");async function Dt(e,t,n){const s=$(n,t.name);if(await G(s,{recursive:!0}),e.path.endsWith(".css")){const i=$(s,`${t.name}.css`);return await X(i,e.content),i}const r=$(s,W(e.path));return await X(r,e.content),r}o(Dt,"writeComponentFile");async function vt({registryIndex:e,selectedComponents:t,componentType:n,componentsOutputDirectory:s,packageManager:r}){const i=[],u=new Set;await G(s,{recursive:!0});const a=await pe(e,t,n);for(const l of a){const f=await fe({type:"component",name:l.name,framework:n});for(const d of f.files)if(d)try{const h=await Dt(d,l,s);h&&i.push(h)}catch(h){const E=h instanceof Error?`: ${h.message}`:"";throw new g(`Failed to write component file for "${l.name}"${E}`)}const p=l.dependencies?.[n]||[];for(const d of p)u.add(d)}if(u.size>0)try{await de(Array.from(u),process.cwd(),r)}catch(l){const f=l instanceof Error?`: ${l.message}`:"";throw new g(`Failed to install component dependencies${f}`)}return{createdFiles:i,npmDependencies:u}}o(vt,"installComponents");async function At(e){const t=[],n=Q(process.cwd(),e);await G(n,{recursive:!0});const r=(await M()).filter(i=>i.type==="cube").map(i=>i.name);for(const i of r){const u=await fe({type:"cube",name:i});for(const a of u.files){if(!a)continue;const l=a.path.replace(/^styles\//,""),f=$(n,l),p=ze(f);try{await G(p,{recursive:!0}),await X(f,a.content),t.push(f)}catch(d){const h=d instanceof Error?`: ${d.message}`:"";throw new g(`Failed to write CUBE module "${i}"${h}`)}}}return t}o(At,"installCUBE");async function Nt(e,t){await se.mkdir(t,{recursive:!0});const n=[];for(const s of e)await se.writeFile(s.path,s.content),n.push(s.path);return n}o(Nt,"writeTokenFiles");async function V(e,t){const n={type:"files",config:e},{trees:s,resolved:r,errors:i}=await tt(n);if(i.load.length>0){const u=i.load.map(a=>{const l=a.file.split("/").pop()||"unknown file";let f=`File ${l}: `;return a.message.includes("Unexpected token")?f=w.TOKEN_FILE_INVALID_JSON(l):a.message.includes("Unexpected end")?f=w.TOKEN_FILE_INCOMPLETE_JSON(l):f=w.TOKEN_FILE_GENERIC_ERROR(l,a.message),f});throw new g(w.TOKEN_LOAD_FAILED(u))}if(i.validation.length>0||i.flatten.length>0||i.resolution.length>0){const u=[...i.flatten,...i.validation,...i.resolution],a=new Map;for(const l of u)if(l.source?.sourcePath){const f=a.get(l.source.sourcePath)||[];f.push(l.message),a.set(l.source.sourcePath,f)}throw new g(w.TOKEN_VALIDATION_FAILED(a))}return{trees:s,resolved:r}}o(V,"loadAndResolveTokensForCLI");function Ft(e,t){const n={...e};return Object.keys(t).length>0&&typeof n.tokens=="object"&&!Array.isArray(n.tokens)&&"source"in n.tokens&&(n.tokens.themes=t),nt(n)}o(Ft,"integrateThemesIntoConfig");const{hidden:gs}=c,Ot=at(),k=o((e,t)=>Ot?e:t,"unicodeOr"),Pt=k("\u25C7","o"),Fe=k("\u250C","T"),O=k("\u2502","|"),ge=k("\u2514","\u2014"),Lt=k("\u2510","T"),Mt=k("\u2518","\u2014"),te=k("\u2500","-"),jt=k("\u256E","+"),Ut=k("\u256F","+"),xt=k("\u2570","+"),Wt=k("\u256D","+"),Gt=k("\u25CF","\u2022"),Bt=k("\u25C6","*"),Vt=k("\u25B2","!"),Kt=k("\u25A0","x"),K=o((e,t=c.bgGreen,n=c.black)=>t(` ${n(e)} `),"label"),Y=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"),H=o((e="",t)=>{process.stdout.write(`
79
79
 
80
80
  ${c.gray(Fe)}${c.gray(te)} ${e}
81
81
  `)},"intro"),ne=o((e="",t)=>{process.stdout.write(`${c.gray(O)}
82
- ${c.gray(de)}${c.gray(te)} ${e}
82
+ ${c.gray(ge)}${c.gray(te)} ${e}
83
83
 
84
84
  `)},"outro");function Yt(...e){process.env.DEBUG==="true"&&process.stderr.write(`[sugarcube:debug] ${e.map(String).join(" ")}
85
- `)}o(Yt,"debugLog");function j(e){return new Promise(t=>setTimeout(t,e))}o(j,"sleep");function Ht(e,t){const n={};if(e.themes)for(const[s,r]of Object.entries(e.themes))n[s]=r.map(i=>{const u=t[i];if(!u)throw new g(w.KIT_INCOMPLETE());return u});return n}o(Ht,"processKitThemes");const Jt=o(async(e,t,n)=>{const s=await $t(e),r=Q(process.cwd(),t),i=s.files.find(d=>x(d.path)==="config.json");let u={};if(i)try{u=JSON.parse(i.content)}catch(d){Yt(`Could not parse config.json for starter kit '${e}':`,d)}const a=s.files.filter(d=>x(d.path)!=="config.json").map(d=>({path:$(r,x(d.path)),content:d.content})),l=Object.fromEntries(a.map(d=>[x(d.path),R(process.cwd(),d.path)])),f=Ht(u,l);return{config:Nt(n,f),tokenFiles:a,tokensDir:r,createdTokenPaths:a.map(d=>R(process.cwd(),d.path))}},"prepareStarterKitForInstall");async function qt(e){const t=await Jt(e.starterKit??"",e.tokensDir,e.config),n=await Ft(t.tokenFiles,e.tokensDir),{trees:s,resolved:r}=await B(e.config);e.setupResult={config:t.config,createdTokenPaths:t.createdTokenPaths,trees:s,resolved:r,tokenFiles:t.tokenFiles,tokensDir:t.tokensDir},e.createdFiles.push(...n)}o(qt,"installFromStarterKit");async function Ne(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 ae(n)&&process.exit(0),n==="web-components"?(lt.info(c.blue("Web components are coming soon! Please choose React or CSS Only for now.")),Ne(e)):n}o(Ne,"promptComponentFramework");async function zt(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 ae(s)&&process.exit(0),s}o(zt,"promptComponentSelectionFiltered");async function Oe(e,t=!1){const n=await ft({message:e,initialValue:t});return(!n||ae(n))&&(ke(),process.exit(0)),!0}o(Oe,"confirmOverwrite");const Zt=[Wt,jt,xt,Ut],Qt=[Fe,Lt,de,Mt];function Pe(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(Pe,"getPaddingForLine");const Xt=o(e=>e,"defaultFormatBorder"),ge=o((e="",t="",n)=>{const s=n?.output??process.stdout,r=pt(s),u=1*2,a=n?.titlePadding??1,l=n?.contentPadding??2,f=n?.width===void 0||n.width==="auto"?1:Math.min(1,n.width),p=n?.includePrefix?`${O} `:"",d=n?.formatBorder??Xt,h=(n?.rounded?Zt:Qt).map(d),E=d(te),b=d(O),T=r-p.length;let C=Math.floor(r*f)-p.length;if(n?.width==="auto"){const z=e.split(`
86
- `);let U=K(t).length+a*2;for(const He of z){const we=K(He).length+l*2;we>U&&(U=we)}const Z=U+u;Z<C&&(C=Z)}C%2!==0&&(C<T?C++:C--);const I=C-u,F=I-a*2,y=K(t).length>F?`${t.slice(0,F-3)}...`:t,[_,D]=Pe(K(y).length,I,a,n?.titleAlign),P=dt(e,I-l*2,{hard:!0,trim:!1});s.write(`${p}${h[0]}${E.repeat(_)}${y}${E.repeat(D)}${h[1]}
85
+ `)}o(Yt,"debugLog");function j(e){return new Promise(t=>setTimeout(t,e))}o(j,"sleep");function Ht(e,t){const n={};if(e.themes)for(const[s,r]of Object.entries(e.themes))n[s]=r.map(i=>{const u=t[i];if(!u)throw new g(w.KIT_INCOMPLETE());return u});return n}o(Ht,"processKitThemes");const Jt=o(async(e,t,n)=>{const s=await $t(e),r=Q(process.cwd(),t),i=s.files.find(d=>W(d.path)==="config.json");let u={};if(i)try{u=JSON.parse(i.content)}catch(d){Yt(`Could not parse config.json for starter kit '${e}':`,d)}const a=s.files.filter(d=>W(d.path)!=="config.json").map(d=>({path:$(r,W(d.path)),content:d.content})),l=Object.fromEntries(a.map(d=>[W(d.path),R(process.cwd(),d.path)])),f=Ht(u,l);return{config:Ft(n,f),tokenFiles:a,tokensDir:r,createdTokenPaths:a.map(d=>R(process.cwd(),d.path))}},"prepareStarterKitForInstall");async function qt(e){const t=await Jt(e.starterKit??"",e.tokensDir,e.config),n=await Nt(t.tokenFiles,e.tokensDir),{trees:s,resolved:r}=await V(e.config);e.setupResult={config:t.config,createdTokenPaths:t.createdTokenPaths,trees:s,resolved:r,tokenFiles:t.tokenFiles,tokensDir:t.tokensDir},e.createdFiles.push(...n)}o(qt,"installFromStarterKit");async function Oe(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 lt({message:"Build with",options:t});return ae(n)&&process.exit(0),n==="web-components"?(ut.info(c.blue("Web components are coming soon! Please choose React or CSS Only for now.")),Oe(e)):n}o(Oe,"promptComponentFramework");async function zt(e,t){const n=e.filter(r=>r.type==="component"&&r.frameworks?.includes(t)),s=await ft({message:"Select components to add",options:n.map(r=>({label:r.name,value:r.name,hint:r.description})),required:!0});return ae(s)&&process.exit(0),s}o(zt,"promptComponentSelectionFiltered");async function Pe(e,t=!1){const n=await pt({message:e,initialValue:t});return(!n||ae(n))&&(Ee(),process.exit(0)),!0}o(Pe,"confirmOverwrite");const Zt=[Wt,jt,xt,Ut],Qt=[Fe,Lt,ge,Mt];function Le(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(Le,"getPaddingForLine");const Xt=o(e=>e,"defaultFormatBorder"),me=o((e="",t="",n)=>{const s=n?.output??process.stdout,r=dt(s),u=1*2,a=n?.titlePadding??1,l=n?.contentPadding??2,f=n?.width===void 0||n.width==="auto"?1:Math.min(1,n.width),p=n?.includePrefix?`${O} `:"",d=n?.formatBorder??Xt,h=(n?.rounded?Zt:Qt).map(d),E=d(te),b=d(O),T=r-p.length;let C=Math.floor(r*f)-p.length;if(n?.width==="auto"){const z=e.split(`
86
+ `);let x=Y(t).length+a*2;for(const Je of z){const ye=Y(Je).length+l*2;ye>x&&(x=ye)}const Z=x+u;Z<C&&(C=Z)}C%2!==0&&(C<T?C++:C--);const I=C-u,N=I-a*2,y=Y(t).length>N?`${t.slice(0,N-3)}...`:t,[_,D]=Le(Y(y).length,I,a,n?.titleAlign),P=gt(e,I-l*2,{hard:!0,trim:!1});s.write(`${p}${h[0]}${E.repeat(_)}${y}${E.repeat(D)}${h[1]}
87
87
  `);const q=P.split(`
88
- `);for(const z of q){const[U,Z]=Pe(K(z).length,I,l,n?.contentAlign);s.write(`${p}${b}${" ".repeat(U)}${z}${" ".repeat(Z)}${b}
88
+ `);for(const z of q){const[x,Z]=Le(Y(z).length,I,l,n?.contentAlign);s.write(`${p}${b}${" ".repeat(x)}${z}${" ".repeat(Z)}${b}
89
89
  `)}s.write(`${p}${h[2]}${E.repeat(I)}${h[3]}
90
- `)},"box");function me(e,t={}){const n=`
91
- ${e}`;ge(n,c.black(c.bgRed(" ERROR ")),{width:"auto",titlePadding:2,formatBorder:c.red,...t})}o(me,"errorBoxWithBadge");function Le(e,t={}){const n=`
92
- ${e}`;ge(n,c.black(c.bgYellow(" WARNING ")),{width:"auto",titlePadding:2,formatBorder:c.yellow,...t})}o(Le,"warningBoxWithBadge");function en(e,t={}){const n=`
93
- ${e}`;ge(n,c.black(c.bgCyan(" INFO ")),{width:"auto",titlePadding:2,formatBorder:c.cyan,...t})}o(en,"infoBoxWithBadge");const tn=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"),nn=o(async(e,t={})=>{const{sidebarSymbol:n=c.gray("\u2502"),clear:s=!1,stdin:r=process.stdin,stdout:i=process.stdout}=t,u=be.createInterface({input:r,escapeCodeTimeout:50}),a=Ce(i,{showCursor:!1});be.emitKeypressEvents(r,u);let l=0,f=!1;const p=o(async()=>{r.off("keypress",d),r.isTTY&&r.setRawMode(!1),u.close(),f=!0,l<e.length-1||s?a.clear():a.done()},"done"),d=o((h,E)=>{r.isTTY&&r.setRawMode(!0);const b=tn(E);if(b==="abort")return p(),process.exit(0);["up","down","left","right"].includes(b)||p()},"handleKeyPress");r.isTTY&&r.setRawMode(!0),r.on("keypress",d);for(const h of e){const E=Array.isArray(h)?h:h.split(" "),b=[];for(const I of[""].concat(E)){I&&b.push(I);const F=b.join(" ").replace(/sugarcube/g,c.cyan("sugarcube")),y=`${n} ${F}`;a(y),f||await new Promise(_=>setTimeout(_,Math.floor(Math.random()*126)+75))}f||await new Promise(I=>setTimeout(I,100));const C=(await Promise.all(E).then(I=>I.join(" "))).replace(/sugarcube/g,c.cyan("sugarcube"));a(`${n} ${C}`),f||await new Promise(I=>setTimeout(I,Math.floor(Math.random()*201)+1200)),l++}r.off("keypress",d),await new Promise(h=>setTimeout(h,100)),p(),r.isTTY&&r.setRawMode(!1),r.removeAllListeners("keypress")},"sayAnimatedInSidebar");function sn(){return Math.floor(Math.random()*551)+200}o(sn,"getRandomTaskDuration");async function on(e,{sidebarSymbol:t="\u2502",spacing:n=1,stdin:s=process.stdin,stdout:r=process.stdout,initialDelayMs:i=200,minDurationMs:u,successPauseMs:a=300,successMessage:l,successAsOutro:f=!1}={}){const p=o((y,_)=>{let D="";switch(_){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"),d=Array.from({length:e.length},()=>"");e.forEach((y,_)=>{d[_]=p(y,"pending")});const h=Ce(r),E=Ee.createInterface({input:s,escapeCodeTimeout:50});Ee.emitKeypressEvents(s,E);const b=o(y=>{y===""&&(h.clear(),E.close(),s.isTTY&&s.setRawMode(!1),process.exit(0)),s.isTTY&&s.setRawMode(!0)},"keypress");s.isTTY&&s.setRawMode(!0),s.on("keypress",b);const T=Array.from({length:Math.max(n,0)},()=>`${t}`),C=o(()=>[...T,...d].join(`
94
- `),"renderContent");h(C()),await j(i);let I=0;for(const y of e){d[I]=p(y,"start"),h(C());const _=Date.now(),D=y.while();try{await D;const P=Date.now()-_,q=typeof u=="number"?u:sn();P<q&&await j(q-P),d[I]=p(y,"success"),h(C()),await j(a)}catch(P){throw d[I]=`${t} ${c.red(`\u2717 ${y.end} (failed)`)}`,h(C()),y.onError?.(P),s.removeListener("keypress",b),E.close(),s.isTTY&&s.setRawMode(!1),P}I++}const F=e.map(y=>p(y,"end"));if(l)if(f){const y=`${c.gray(de)}${c.gray(te)} ${c.green(l)}`;h([...T,...F,`${t}`,y].join(`
95
- `))}else{const y=`${t} ${c.green(l)}`;h([...T,...F,`${t}`,y].join(`
96
- `))}else h([...T,...F].join(`
90
+ `)},"box");function he(e,t={}){const n=`
91
+ ${e}`;me(n,c.black(c.bgRed(" ERROR ")),{width:"auto",titlePadding:2,formatBorder:c.red,...t})}o(he,"errorBoxWithBadge");function Me(e,t={}){const n=`
92
+ ${e}`;me(n,c.black(c.bgYellow(" WARNING ")),{width:"auto",titlePadding:2,formatBorder:c.yellow,...t})}o(Me,"warningBoxWithBadge");function en(e,t={}){const n=`
93
+ ${e}`;me(n,c.black(c.bgCyan(" INFO ")),{width:"auto",titlePadding:2,formatBorder:c.cyan,...t})}o(en,"infoBoxWithBadge");const tn=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"),nn=o(async(e,t={})=>{const{sidebarSymbol:n=c.gray("\u2502"),clear:s=!1,stdin:r=process.stdin,stdout:i=process.stdout}=t,u=Ce.createInterface({input:r,escapeCodeTimeout:50}),a=$e(i,{showCursor:!1});Ce.emitKeypressEvents(r,u);let l=0,f=!1;const p=o(async()=>{r.off("keypress",d),r.isTTY&&r.setRawMode(!1),u.close(),f=!0,l<e.length-1||s?a.clear():a.done()},"done"),d=o((h,E)=>{r.isTTY&&r.setRawMode(!0);const b=tn(E);if(b==="abort")return p(),process.exit(0);["up","down","left","right"].includes(b)||p()},"handleKeyPress");r.isTTY&&r.setRawMode(!0),r.on("keypress",d);for(const h of e){const E=Array.isArray(h)?h:h.split(" "),b=[];for(const I of[""].concat(E)){I&&b.push(I);const N=b.join(" ").replace(/sugarcube/g,c.cyan("sugarcube")),y=`${n} ${N}`;a(y),f||await new Promise(_=>setTimeout(_,Math.floor(Math.random()*126)+75))}f||await new Promise(I=>setTimeout(I,100));const C=(await Promise.all(E).then(I=>I.join(" "))).replace(/sugarcube/g,c.cyan("sugarcube"));a(`${n} ${C}`),f||await new Promise(I=>setTimeout(I,Math.floor(Math.random()*201)+1200)),l++}r.off("keypress",d),await new Promise(h=>setTimeout(h,100)),p(),r.isTTY&&r.setRawMode(!1),r.removeAllListeners("keypress")},"sayAnimatedInSidebar");function sn(){return Math.floor(Math.random()*551)+200}o(sn,"getRandomTaskDuration");async function on(e,{sidebarSymbol:t="\u2502",spacing:n=1,stdin:s=process.stdin,stdout:r=process.stdout,initialDelayMs:i=200,minDurationMs:u,successPauseMs:a=300,successMessage:l,successAsOutro:f=!1}={}){const p=o((y,_)=>{let D="";switch(_){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"),d=Array.from({length:e.length},()=>"");e.forEach((y,_)=>{d[_]=p(y,"pending")});const h=$e(r),E=be.createInterface({input:s,escapeCodeTimeout:50});be.emitKeypressEvents(s,E);const b=o(y=>{y===""&&(h.clear(),E.close(),s.isTTY&&s.setRawMode(!1),process.exit(0)),s.isTTY&&s.setRawMode(!0)},"keypress");s.isTTY&&s.setRawMode(!0),s.on("keypress",b);const T=Array.from({length:Math.max(n,0)},()=>`${t}`),C=o(()=>[...T,...d].join(`
94
+ `),"renderContent");h(C()),await j(i);let I=0;for(const y of e){d[I]=p(y,"start"),h(C());const _=Date.now(),D=y.while();try{await D;const P=Date.now()-_,q=typeof u=="number"?u:sn();P<q&&await j(q-P),d[I]=p(y,"success"),h(C()),await j(a)}catch(P){throw d[I]=`${t} ${c.red(`\u2717 ${y.end} (failed)`)}`,h(C()),y.onError?.(P),s.removeListener("keypress",b),E.close(),s.isTTY&&s.setRawMode(!1),P}I++}const N=e.map(y=>p(y,"end"));if(l)if(f){const y=`${c.gray(ge)}${c.gray(te)} ${c.green(l)}`;h([...T,...N,`${t}`,y].join(`
95
+ `))}else{const y=`${t} ${c.green(l)}`;h([...T,...N,`${t}`,y].join(`
96
+ `))}else h([...T,...N].join(`
97
97
  `));await j(1e3),s.removeListener("keypress",b),s.isTTY&&s.setRawMode(!1),E.close(),h.done()}o(on,"executeTasksInSidebar");const rn=o(e=>process.stdout.write(`${e}
98
98
  `),"rawLog"),S={message:o((e=[],{symbol:t=c.gray(O),secondarySymbol:n=c.gray(O),output:s=process.stdout,spacing:r=1}={})=>{const i=[];for(let a=0;a<r;a++)i.push(`${n}`);const u=Array.isArray(e)?e:e.split(`
99
99
  `);if(u.length>0){const[a,...l]=u;a&&a.length>0?i.push(`${t} ${a}`):i.push(t);for(const f of l)f.length>0?i.push(`${n} ${f}`):i.push(n)}s.write(`${i.join(`
100
100
  `)}
101
101
  `)},"message"),info:o((e,t)=>{S.message(e,{...t,symbol:c.blue(Gt)})},"info"),success:o((e,t)=>{S.message(e,{...t,symbol:c.green(Bt)})},"success"),step:o((e,t)=>{S.message(e,{...t,symbol:c.green(Pt)})},"step"),warn:o((e,t)=>{S.message(e,{...t,symbol:c.yellow(Vt)})},"warn"),error:o((e,t)=>{S.message(e,{...t,symbol:c.red(Kt)})},"error"),animated:o(async(e,{secondarySymbol:t=c.gray(O),output:n=process.stdout,clear:s=!1,...r}={})=>nn(e,{sidebarSymbol:t,stdout:n,clear:s,...r}),"animated"),tasks:o(async(e,{spacing:t=1,secondarySymbol:n=c.gray(O),output:s=process.stdout,...r}={})=>on(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(O)}
102
102
  `)},"space"),break:o((e=1)=>{for(let t=0;t<e;t++)process.stdout.write(`
103
- `)},"break")};function H(e){if(e instanceof g)S.space(1),me(e.message,{});else{const t=`An unexpected error occurred: ${e instanceof Error?e.message:String(e)}
103
+ `)},"break")};function J(e){if(e instanceof g)S.space(1),he(e.message,{});else{const t=`An unexpected error occurred: ${e instanceof Error?e.message:String(e)}
104
104
 
105
- If this issue persists, please report it: ${c.cyan("https://github.com/sugarcube-org/sugarcube/issues")}`;S.space(1),me(t,{})}process.exit(0)}o(H,"handleError");function Me(e){return{absolute:Q(process.cwd(),e)}}o(Me,"resolveDirectoryFromFlag");async function je(e){if(v())try{const{config:t}=await ee(),n=an(t,e);return typeof n=="string"?Q(process.cwd(),n):void 0}catch{return}}o(je,"resolveDirectoryFromConfig");function an(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(an,"getNestedValue");async function cn(e){if(e){const{absolute:t}=Me(e);return{directory:t,fromConfig:!1}}if(v())try{const t=await je("output.css");if(t)return{directory:t,fromConfig:!0}}catch{}throw new g(`A sugarcube config file was not found.
105
+ If this issue persists, please report it: ${c.cyan("https://github.com/sugarcube-org/sugarcube/issues")}`;S.space(1),he(t,{})}process.exit(0)}o(J,"handleError");function je(e){return{absolute:Q(process.cwd(),e)}}o(je,"resolveDirectoryFromFlag");async function Ue(e){if(v())try{const{config:t}=await ee(),n=an(t,e);return typeof n=="string"?Q(process.cwd(),n):void 0}catch{return}}o(Ue,"resolveDirectoryFromConfig");function an(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(an,"getNestedValue");async function cn(e){if(e){const{absolute:t}=je(e);return{directory:t,fromConfig:!1}}if(v())try{const t=await Ue("output.css");if(t)return{directory:t,fromConfig:!0}}catch{}throw new g(`A sugarcube config file was not found.
106
106
 
107
107
  Either a config file or --styles-dir is required to run this command.
108
108
 
@@ -112,7 +112,7 @@ e.g. ${c.cyan(`${A.CUBE} --styles-dir src/styles`)}
112
112
  To create a config file:
113
113
  ${c.cyan(A.INIT)}
114
114
 
115
- Stuck? ${c.cyan("https://sugarcube.sh")}`)}o(cn,"getCssDir");async function ln(e){if(e){const{absolute:t}=Me(e);return{directory:t,fromConfig:!1}}if(v())try{const t=await je("output.components");if(t)return{directory:t,fromConfig:!0}}catch{}throw new g(`A sugarcube config file was not found.
115
+ Stuck? ${c.cyan("https://sugarcube.sh")}`)}o(cn,"getCssDir");async function ln(e){if(e){const{absolute:t}=je(e);return{directory:t,fromConfig:!1}}if(v())try{const t=await Ue("output.components");if(t)return{directory:t,fromConfig:!0}}catch{}throw new g(`A sugarcube config file was not found.
116
116
 
117
117
  Either a config file or --components-dir is required to run this command.
118
118
 
@@ -122,29 +122,30 @@ e.g. ${c.cyan(`${A.COMPONENTS} --components-dir src/components/ui`)}
122
122
  To create a config file:
123
123
  ${c.cyan(A.INIT)}
124
124
 
125
- Stuck? ${c.cyan("https://sugarcube.sh")}`)}o(ln,"getComponentsDir");function J(e,t=process.cwd()){try{const n=at(t,"package.json");if(!N(n))return!1;const s=ye(n,"utf-8"),r=JSON.parse(s),i={...r.dependencies,...r.devDependencies,...r.peerDependencies};return e in i}catch{return!1}}o(J,"isPackageInstalled");async function Ue(e,{withFallback:t=!1}={}){const n=await gt({programmatic:!0,cwd:e});if(n?.startsWith("yarn@"))return"yarn";if(n?.startsWith("pnpm@"))return"pnpm";if(n==="bun")return"bun";if(!t)return n?.split("@")[0]??"npm";const s=process.env.npm_config_user_agent||"";return s.startsWith("yarn")?"yarn":s.startsWith("pnpm")?"pnpm":s.startsWith("bun")?"bun":"npm"}o(Ue,"getPackageManager");function un(e=process.cwd()){return mt(e)!==null}o(un,"isTypeScriptProject");async function xe(e=process.cwd()){return un(e)?"sugarcube.config.ts":"sugarcube.config.js"}o(xe,"getConfigFileName");function fn(e){return/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(e)}o(fn,"isValidIdentifier");function he(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?"[]":`[
126
- ${e.map(r=>`${n} ${he(r,t+1)}`).join(`,
125
+ Stuck? ${c.cyan("https://sugarcube.sh")}`)}o(ln,"getComponentsDir");function U(e,t=process.cwd()){try{const n=ct(t,"package.json");if(!F(n))return!1;const s=Te(n,"utf-8"),r=JSON.parse(s),i={...r.dependencies,...r.devDependencies,...r.peerDependencies};return e in i}catch{return!1}}o(U,"isPackageInstalled");async function xe(e,{withFallback:t=!1}={}){const n=await mt({programmatic:!0,cwd:e});if(n?.startsWith("yarn@"))return"yarn";if(n?.startsWith("pnpm@"))return"pnpm";if(n==="bun")return"bun";if(!t)return n?.split("@")[0]??"npm";const s=process.env.npm_config_user_agent||"";return s.startsWith("yarn")?"yarn":s.startsWith("pnpm")?"pnpm":s.startsWith("bun")?"bun":"npm"}o(xe,"getPackageManager");function un(e=process.cwd()){return ht(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 we(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?"[]":`[
126
+ ${e.map(r=>`${n} ${we(r,t+1)}`).join(`,
127
127
  `)}
128
128
  ${n}]`;if(typeof e=="object"){const s=Object.entries(e);return s.length===0?"{}":`{
129
- ${s.map(([i,u])=>{const a=fn(i)?i:JSON.stringify(i);return`${n} ${a}: ${he(u,t+1)}`}).join(`,
129
+ ${s.map(([i,u])=>{const a=fn(i)?i:JSON.stringify(i);return`${n} ${a}: ${we(u,t+1)}`}).join(`,
130
130
  `)}
131
- ${n}}`}return JSON.stringify(e)}o(he,"formatValue");function pn(e,t){const n=he(e,0);return`${t?`import type { UserConfig } from "@sugarcube-org/core";
131
+ ${n}}`}return JSON.stringify(e)}o(we,"formatValue");function pn(e,t,n){const s=we(e,0);let r;return n?r=t?`import type { UserConfig } from "@sugarcube-org/vite";
132
132
 
133
133
  const config: UserConfig = `:`/**
134
- * @type {import('@sugarcube-org/core').UserConfig}
134
+ * @type {import('@sugarcube-org/vite').UserConfig}
135
135
  */
136
- const config = `}${n};
136
+ const config = `:r=`// Configuration reference: ${_e.CONFIGURATION}
137
+ const config = `,`${r}${s};
137
138
 
138
139
  export default config;
139
- `}o(pn,"formatConfigAsCode");async function We(e){try{const t=await xe(),n=t.endsWith(".ts"),s=pn(e,n);await X(t,s,"utf-8")}catch(t){const n=t instanceof Error?`: ${t.message}`:"";throw new g(`Failed to write config file${n}`)}}o(We,"writeUserConfig");function dn(e,t){return{...e,...t,output:{...e.output??{},...t.output??{}},transforms:{...e.transforms??{},...t.transforms??{}}}}o(dn,"mergeUserConfig");async function Ge(e){const{config:t}=await nt(),n=dn(t,e);await We(n)}o(Ge,"mergeConfigIntoFile");const gn=new L().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||Y(V(c.bgGreen(c.black("Components"))));const{directory:n,fromConfig:s}=await ln(t.componentsDir);let r=[],i;if(e.length>0||t.framework){if(!t.framework)throw new g(w.COMPONENTS_FRAMEWORK_REQUIRED());if(!["react","css-only"].includes(t.framework))throw new g(w.COMPONENTS_INVALID_FRAMEWORK());i=t.framework,r=e}else{i=await Ne(!1);const T=await M();T||(ke("Failed to fetch component list"),process.exit(1)),r=await zt(T,i)}const u=await Ue(process.cwd(),{withFallback:!0}),a=await M(),l=await fe(a,r,i),f=await Rt({selectedComponents:r,componentType:i,componentsOutputDirectory:n}),p=Ae(f);if(p&&!t.force&&!t.silent){const T=Le(p,{});S.space(1),await Oe("Continue?",!1)}const d=[],h=[],E=new Set;for(const T of l){const C=T.dependencies?.[i]||[];for(const I of C)E.add(I)}const b=Array.from(E).filter(T=>!J(T,process.cwd()));b.length>0&&d.push({pending:`Install ${b.length} dependencies`,start:`Installing ${b.join(", ")}...`,end:`Installed ${b.join(", ")}`,while:o(async()=>{await pe(b,process.cwd(),u)},"while")});for(const T of l)d.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 C=await vt({registryIndex:a,selectedComponents:[T.name],componentType:i,componentsOutputDirectory:n,overwrite:t.overwrite||!1,packageManager:u});h.push(...C.createdFiles)},"while")});if(await S.tasks(d,{successMessage:"Components added successfully! \u{1F389} ",minDurationMs:0,successAsOutro:!0}),rn(""),!s&&v()){const T=R(process.cwd(),n);await Ge({output:{components:T}})}}catch(n){H(n)}}),mn=new L().name("cube").description("Add CUBE CSS to your project").option("-s, --silent","Suppress logs and prompts").option("-f, --force","Skip overwrite confirmation").option("--styles-dir <dir>","CSS output directory (e.g., 'src/styles')").action(async e=>{try{e.silent||Y(V("CUBE CSS"));const{directory:t,fromConfig:n}=await cn(e.stylesDir);try{await W(t,{recursive:!0})}catch(u){const a=u instanceof Error?`: ${u.message}`:"";throw new g(`Failed to create output directory${a}`)}const s=await _t({cubeDirectory:t}),r=Ae(s);if(r&&!e.force&&!e.silent){S.space(1);const u=Le(r,{});await Oe("Continue?",!1)}const i=await At(t);if(!e.silent){S.space(1);const u=i,f=[...new Set(u)].map(p=>R(process.cwd(),p)).map(p=>({pending:`Write ${p}`,start:`Writing ${p}`,end:`Wrote ${p}`,while:o(async()=>{},"while")}));await S.tasks(f,{spacing:0,minDurationMs:0,successPauseMs:100,successMessage:"\u{1F389} Files written!"}),ne(c.green("CUBE added successfully."))}if(!n&&v()){const u=R(process.cwd(),t);await Ge({output:{css:u}})}}catch(t){H(t)}});function hn(){return["**/*.{html,htm,js,ts,jsx,tsx,vue,svelte,astro,php,njk,liquid,pug,hbs,handlebars,twig,erb,ejs}","!node_modules/**","!dist/**","!build/**","!.next/**","!.nuxt/**","!.astro/**","!.git/**","!coverage/**","!*.config.{js,ts,mjs}"]}o(hn,"getDefaultScanPatterns");function wn(){return hn()}o(wn,"getScanPatterns");async function Be(e,t){const n={name:"sugarcube",rules:st(t.utilities??{},e),preflights:[]},s=await ht({presets:[n]}),r=wn(),i=await G(r,{dot:!0});if(i.length===0)return[];const a=(await Promise.all(i.map(f=>Qe(f,"utf8")))).join(`
140
- `),{css:l}=await s.generate(a,{preflights:!1});return l?.trim()?[{path:`${t.output?.css||ot}/utilities/utilities.gen.css`,css:l,collection:"default"}]:[]}o(Be,"generateSugarcubeUtilities");async function yn(e,t,n){const s=[],r=await oe(e,t,n),i=await Te(r,n);await Se(i),s.push(...i);const u=await Be(r,n);return await Ie(u),s.push(...u),s}o(yn,"generateAllCSS");const Tn=new L().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||Y(V("Generate CSS")),J("@sugarcube-org/vite"))throw new g("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(!v())throw new g(`A sugarcube config file was not found. This command requires one.
140
+ `}o(pn,"formatConfigAsCode");async function Ge(e,t){try{const n=await We(),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 g(`Failed to write config file${s}`)}}o(Ge,"writeUserConfig");function dn(e,t){return{...e,...t,output:{...e.output??{},...t.output??{}},transforms:{...e.transforms??{},...t.transforms??{}}}}o(dn,"mergeUserConfig");async function Be(e){const{config:t}=await st(),n=dn(t,e),s=U(le);await Ge(n,s)}o(Be,"mergeConfigIntoFile");const gn=new L().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||H(K(c.bgGreen(c.black("Components"))));const{directory:n,fromConfig:s}=await ln(t.componentsDir);let r=[],i;if(e.length>0||t.framework){if(!t.framework)throw new g(w.COMPONENTS_FRAMEWORK_REQUIRED());if(!["react","css-only"].includes(t.framework))throw new g(w.COMPONENTS_INVALID_FRAMEWORK());i=t.framework,r=e}else{i=await Oe(!1);const T=await M();T||(Ee("Failed to fetch component list"),process.exit(1)),r=await zt(T,i)}const u=await xe(process.cwd(),{withFallback:!0}),a=await M(),l=await pe(a,r,i),f=await Rt({selectedComponents:r,componentType:i,componentsOutputDirectory:n}),p=Ne(f);if(p&&!t.force&&!t.silent){const T=Me(p,{});S.space(1),await Pe("Continue?",!1)}const d=[],h=[],E=new Set;for(const T of l){const C=T.dependencies?.[i]||[];for(const I of C)E.add(I)}const b=Array.from(E).filter(T=>!U(T,process.cwd()));b.length>0&&d.push({pending:`Install ${b.length} dependencies`,start:`Installing ${b.join(", ")}...`,end:`Installed ${b.join(", ")}`,while:o(async()=>{await de(b,process.cwd(),u)},"while")});for(const T of l)d.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 C=await vt({registryIndex:a,selectedComponents:[T.name],componentType:i,componentsOutputDirectory:n,overwrite:t.overwrite||!1,packageManager:u});h.push(...C.createdFiles)},"while")});if(await S.tasks(d,{successMessage:"Components added successfully! \u{1F389} ",minDurationMs:0,successAsOutro:!0}),rn(""),!s&&v()){const T=R(process.cwd(),n);await Be({output:{components:T}})}}catch(n){J(n)}}),mn=new L().name("cube").description("Add CUBE CSS to your project").option("-s, --silent","Suppress logs and prompts").option("-f, --force","Skip overwrite confirmation").option("--styles-dir <dir>","CSS output directory (e.g., 'src/styles')").action(async e=>{try{e.silent||H(K("CUBE CSS"));const{directory:t,fromConfig:n}=await cn(e.stylesDir);try{await G(t,{recursive:!0})}catch(u){const a=u instanceof Error?`: ${u.message}`:"";throw new g(`Failed to create output directory${a}`)}const s=await _t({cubeDirectory:t}),r=Ne(s);if(r&&!e.force&&!e.silent){S.space(1);const u=Me(r,{});await Pe("Continue?",!1)}const i=await At(t);if(!e.silent){S.space(1);const u=i,f=[...new Set(u)].map(p=>R(process.cwd(),p)).map(p=>({pending:`Write ${p}`,start:`Writing ${p}`,end:`Wrote ${p}`,while:o(async()=>{},"while")}));await S.tasks(f,{spacing:0,minDurationMs:0,successPauseMs:100,successMessage:"\u{1F389} Files written!"}),ne(c.green("CUBE added successfully."))}if(!n&&v()){const u=R(process.cwd(),t);await Be({output:{css:u}})}}catch(t){J(t)}});function hn(){return["**/*.{html,htm,js,ts,jsx,tsx,vue,svelte,astro,php,njk,liquid,pug,hbs,handlebars,twig,erb,ejs}","!node_modules/**","!dist/**","!build/**","!.next/**","!.nuxt/**","!.astro/**","!.git/**","!coverage/**","!*.config.{js,ts,mjs}"]}o(hn,"getDefaultScanPatterns");function wn(){return hn()}o(wn,"getScanPatterns");async function Ve(e,t){const n={name:"sugarcube",rules:ot(t.utilities??{},e),preflights:[]},s=await wt({presets:[n]}),r=wn(),i=await B(r,{dot:!0});if(i.length===0)return[];const a=(await Promise.all(i.map(f=>Xe(f,"utf8")))).join(`
141
+ `),{css:l}=await s.generate(a,{preflights:!1});return l?.trim()?[{path:`${t.output?.css||rt}/utilities/utilities.gen.css`,css:l,collection:"default"}]:[]}o(Ve,"generateSugarcubeUtilities");async function yn(e,t,n){const s=[],r=await oe(e,t,n),i=await Se(r,n);await Ie(i),s.push(...i);const u=await Ve(r,n);return await ke(u),s.push(...u),s}o(yn,"generateAllCSS");const Tn=new L().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||H(K("Generate CSS")),U("@sugarcube-org/vite"))throw new g("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(!v())throw new g(`A sugarcube config file was not found. This command requires one.
141
142
 
142
143
  Please run ${c.cyan(A.INIT)} (or manually create a config file).
143
144
 
144
- Stuck? ${c.cyan("https://sugarcube.sh")}`);const{config:t}=await ee(),{trees:n,resolved:s}=await B(t),r=await yn(n,s,t);if(!e.silent){const i=r.map(f=>f.path),l=[...new Set(i)].map(f=>R(process.cwd(),f)).map(f=>({pending:`Write ${f}`,start:`Writing ${f}`,end:`Wrote ${f}`,while:o(async()=>{},"while")}));await S.tasks(l,{spacing:1,minDurationMs:0,successPauseMs:100,successMessage:"\u{1F389} Files written!"}),S.space(1),ne(c.green("CSS generated successfully."))}}catch(t){H(t)}});function Sn(e){return{source:[$(R(process.cwd(),e.actualTokensDir),$e)]}}o(Sn,"createSingleTokenCollection");async function In(e){return Sn(e)}o(In,"buildTokensConfig");async function kn(e){const t=await In({actualTokensDir:e.actualTokensDir}),n=R(process.cwd(),e.actualStylesDir),s=e.isSrcDir?re.output.components:re.output.components.replace(/^src\//,"");return{tokens:t,output:{css:n,components:s,separate:re.output.separate}}}o(kn,"buildUserConfig");function Ve(e,t=0){if(typeof e!="object"||e===null||t>St)return!1;for(const[n,s]of Object.entries(e))if(!n.startsWith("$")&&typeof s=="object"&&s!==null&&("$value"in s||Ve(s,t+1)))return!0;return!1}o(Ve,"hasAnyToken");async function En(e){try{const t=await G($e,{cwd:e,absolute:!0});for(const n of t)try{const s=await se.readFile(n,"utf-8"),r=JSON.parse(s);if(Ve(r))return!0}catch{}return!1}catch{return!1}}o(En,"detectExistingTokens");const Ke=["**/node_modules/**",".next","public","dist","build",".astro",".nuxt",".output",".svelte-kit"];function bn(e){try{const t=ie.resolve(e,"package.json");if(!N(t))return null;const n=ye(t,"utf-8");return JSON.parse(n)}catch{return null}}o(bn,"getPackageJson");async function Cn(e){const[t,n,s]=await Promise.all([G.glob("**/{next,vite,astro,nuxt,svelte,remix,eleventy}.config.*|.eleventy.js",{cwd:e,deep:3,ignore:Ke}),N(ie.resolve(e,"src")),bn(e)]),r=n?"src/design-tokens":"design-tokens",i=n?"src/styles":"styles",u=n?"src/components":"components";let a="none";return t.find(l=>l.startsWith("next.config."))?.length?a=N(ie.resolve(e,`${n?"src/":""}app`))?"next-app":"next-pages":t.find(l=>l.startsWith("astro.config."))?.length?a="astro":t.find(l=>l.startsWith("nuxt.config."))?.length?a="nuxt":t.find(l=>l.startsWith("svelte.config."))?.length?a="sveltekit":Object.keys(s?.dependencies??{}).find(l=>l.startsWith("@remix-run/"))?a="remix":t.find(l=>l.startsWith("eleventy.config.")||l.startsWith(".eleventy."))?.length?a="eleventy":t.find(l=>l.startsWith("vite.config."))?.length&&(a="vite"),{framework:a,isSrcDir:n,tokensDir:r,stylesDir:i,componentDir:u}}o(Cn,"getProjectInfo");async function $n(e,t){return!!((await G.glob("vite.config.*",{cwd:e,deep:1,ignore:Ke})).length>0||["vite","astro","nuxt","sveltekit","remix"].includes(t))}o($n,"shouldInstallVitePlugin");const Rn=o(async e=>{S.space(2),await j(200);let t="Next steps";if(e.pluginToInstall===Re)t+=`
145
+ Stuck? ${c.cyan("https://sugarcube.sh")}`);const{config:t}=await ee(),{trees:n,resolved:s}=await V(t),r=await yn(n,s,t);if(!e.silent){const i=r.map(f=>f.path),l=[...new Set(i)].map(f=>R(process.cwd(),f)).map(f=>({pending:`Write ${f}`,start:`Writing ${f}`,end:`Wrote ${f}`,while:o(async()=>{},"while")}));await S.tasks(l,{spacing:1,minDurationMs:0,successPauseMs:100,successMessage:"\u{1F389} Files written!"}),S.space(1),ne(c.green("CSS generated successfully."))}}catch(t){J(t)}});function Sn(e){return{source:[$(R(process.cwd(),e.actualTokensDir),Re)]}}o(Sn,"createSingleTokenCollection");async function In(e){return Sn(e)}o(In,"buildTokensConfig");async function kn(e){const t=await In({actualTokensDir:e.actualTokensDir}),n=R(process.cwd(),e.actualStylesDir),s=e.isSrcDir?re.output.components:re.output.components.replace(/^src\//,"");return{tokens:t,output:{css:n,components:s,separate:re.output.separate}}}o(kn,"buildUserConfig");function Ke(e,t=0){if(typeof e!="object"||e===null||t>It)return!1;for(const[n,s]of Object.entries(e))if(!n.startsWith("$")&&typeof s=="object"&&s!==null&&("$value"in s||Ke(s,t+1)))return!0;return!1}o(Ke,"hasAnyToken");async function En(e){try{const t=await B(Re,{cwd:e,absolute:!0});for(const n of t)try{const s=await se.readFile(n,"utf-8"),r=JSON.parse(s);if(Ke(r))return!0}catch{}return!1}catch{return!1}}o(En,"detectExistingTokens");const Ye=["**/node_modules/**",".next","public","dist","build",".astro",".nuxt",".output",".svelte-kit"];function bn(e){try{const t=ie.resolve(e,"package.json");if(!F(t))return null;const n=Te(t,"utf-8");return JSON.parse(n)}catch{return null}}o(bn,"getPackageJson");async function Cn(e){const[t,n,s]=await Promise.all([B.glob("**/{next,vite,astro,nuxt,svelte,remix,eleventy}.config.*|.eleventy.js",{cwd:e,deep:3,ignore:Ye}),F(ie.resolve(e,"src")),bn(e)]),r=n?"src/design-tokens":"design-tokens",i=n?"src/styles":"styles",u=n?"src/components":"components";let a="none";return t.find(l=>l.startsWith("next.config."))?.length?a=F(ie.resolve(e,`${n?"src/":""}app`))?"next-app":"next-pages":t.find(l=>l.startsWith("astro.config."))?.length?a="astro":t.find(l=>l.startsWith("nuxt.config."))?.length?a="nuxt":t.find(l=>l.startsWith("svelte.config."))?.length?a="sveltekit":Object.keys(s?.dependencies??{}).find(l=>l.startsWith("@remix-run/"))?a="remix":t.find(l=>l.startsWith("eleventy.config.")||l.startsWith(".eleventy."))?.length?a="eleventy":t.find(l=>l.startsWith("vite.config."))?.length&&(a="vite"),{framework:a,isSrcDir:n,tokensDir:r,stylesDir:i,componentDir:u}}o(Cn,"getProjectInfo");async function $n(e,t){return!!((await B.glob("vite.config.*",{cwd:e,deep:1,ignore:Ye})).length>0||["vite","astro","nuxt","sveltekit","remix"].includes(t))}o($n,"shouldInstallVitePlugin");const Rn=o(async e=>{S.space(2),await j(200);let t="Next steps";if(e.pluginToInstall===le)t+=`
145
146
 
146
147
  `,t+=`1. Import the generated CSS
147
- `,t+=` ${c.cyan("import 'virtual:uno.css'")}`;else{const n=`${e.stylesDir}/global/tokens.variables.gen.css`;t+=`
148
+ `,t+=` ${c.cyan("import 'virtual:sugarcube.css'")}`;else{const n=`${e.stylesDir}/global/tokens.variables.gen.css`;t+=`
148
149
 
149
150
  `,t+=`1. Import the generated CSS
150
151
  `,t+=` ${c.cyan(`import './${n}'`)}`}t+=`
@@ -155,4 +156,4 @@ Stuck? ${c.cyan("https://sugarcube.sh")}`);const{config:t}=await ee(),{trees:n,r
155
156
  `,t+=`3. (Optional) Add components
156
157
  `,t+=` ${c.cyan(A.COMPONENTS)}`,t+=`
157
158
 
158
- `,t+=`Docs: ${c.cyan("https://sugarcube.sh")}`,en(t,{width:.75}),await j(200),S.break(1)},"nextSteps");async function _n(e){await Rn(e)}o(_n,"next");const Dn=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 Ye(e,t){if(!e||e.trim()==="")throw new g(w.DIRECTORY_PATH_EMPTY(t));const s=ze(e).split("/")[0];if(s&&Tt.includes(s))throw new g(w.DIRECTORY_PATH_RESERVED(t,e))}o(Ye,"validateDirectoryPath");function vn(e){e.tokensDir&&Ye(e.tokensDir,"tokens-dir"),e.stylesDir&&Ye(e.stylesDir,"styles-dir")}o(vn,"validateOptions");async function An(){v()&&(me(w.CONFIG_EXISTS(),{}),process.exit(0))}o(An,"preflightInit");async function Fn(e){const t=await Cn(process.cwd()),n=e.tokensDir||t.tokensDir,s=e.stylesDir||t.stylesDir,r=await En(n);return{tokensDir:n,stylesDir:s,isSrcDir:t.isSrcDir,hasExistingTokens:r,framework:t.framework}}o(Fn,"initializeProjectContext");async function Nn(e,t,n){const s=t?null:e.kit||ce;if((e.skip||[]).includes("plugin"))return{starterKit:s,pluginToInstall:null};const i=await On(n);return{starterKit:s,pluginToInstall:i}}o(Nn,"determineInstallationTargets");async function On(e){return await $n(process.cwd(),e)?Re:null}o(On,"determinePlugin");async function Pn(e,t,n,s,r){const i=await Ue(process.cwd(),{withFallback:!0});return{options:e,...t,isSrcDir:t.isSrcDir,config:n,userConfig:s,...r,packageManager:i,createdFiles:[],createdDirectories:[],installedDependencies:[],tasks:[]}}o(Pn,"buildInitContext");async function Ln(e){const{trees:t,resolved:n}=await B(e.config);e.setupResult={config:e.config,createdTokenPaths:[],trees:t,resolved:n,tokenFiles:[],tokensDir:e.tokensDir}}o(Ln,"processExistingTokens");async function Mn(e){!e.hasExistingTokens&&e.starterKit?await qt(e):await Ln(e)}o(Mn,"setupDesignTokens");async function jn(e){if(!e.setupResult)throw new g(w.INITIALIZATION_INCOMPLETE());const{trees:t,resolved:n}=e.setupResult,s=await oe(t,n,e.config),r=await Te(s,e.config);await Se(r)}o(jn,"writeCSSVariables");async function Un(e){if(!e.setupResult)throw new g(w.INITIALIZATION_INCOMPLETE());const{trees:t,resolved:n}=e.setupResult,s=await oe(t,n,e.config),r=await Be(s,e.config);r.length&&await Ie(r)}o(Un,"writeCSSUtilities");async function xn(e){if(e.pluginToInstall&&!J(e.pluginToInstall))try{await pe([e.pluginToInstall],process.cwd(),e.packageManager),e.installedDependencies.push(e.pluginToInstall)}catch{throw new g(w.PLUGIN_INSTALL_FAILED({pluginToInstall:e.pluginToInstall,packageManager:e.packageManager}))}}o(xn,"installPlugins");async function Wn(e){try{await We(e.userConfig);const t=await xe();e.createdFiles.push(t)}catch{throw new g(w.CONFIG_WRITE_FAILED())}}o(Wn,"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} ${k("\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 ${k("\u2192","->")} adding starter kit`,while:o(async()=>{},"while")}),e.pluginToInstall){const n="Vite";J(e.pluginToInstall)?t.push({pending:`Checking for ${n} compatibility`,start:`Checking for ${n} compatibility...`,end:`${n} plugin already installed ${k("\u2192","->")} skipping plugin installation`,while:o(async()=>{},"while")}):t.push({pending:"Checking for Vite compatibility",start:"Checking for Vite compatibility...",end:`Vite detected ${k("\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 ${k("\u2192","->")} CSS will be generated as file(s)`:`No Vite detected ${k("\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 Mn(e)},"while")}),!e.pluginToInstall)e.tasks.push({pending:"Generate CSS variables",start:"Generating CSS variables...",end:"CSS variables generated",while:o(async()=>{await jn(e)},"while")}),e.tasks.push({pending:"Generate CSS utilities",start:"Generating CSS utilities...",end:"CSS utilities generated",while:o(async()=>{await Un(e)},"while")});else if(e.pluginToInstall&&!J(e.pluginToInstall)){const t="Vite";e.tasks.push({pending:`Install ${t} plugin`,start:`Installing ${t} plugin...`,end:`${t} plugin installed`,while:o(async()=>{await xn(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(Bn,"buildExecutionTasks");const Vn=new L().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{vn(e),await An();const n=await Fn(e),s=await kn({actualTokensDir:n.tokensDir,actualStylesDir:n.stylesDir,isSrcDir:n.isSrcDir}),r=rt(s),i=await Nn(e,n.hasExistingTokens,n.framework);t=await Pn(e,n,r,s,i),Y(V("sugarcube")),await Dn();const u=Gn(t);u.length>0&&(S.message("Detecting project\u2026"),await S.tasks(u,{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 _n(t)}catch(n){H(n)}}),Kn=new L().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(Y(V("Validate")),v()&&!e.length){const{config:s}=await ee();await B(s),ne(c.greenBright("All tokens valid \u2728"));return}if(!e.length)throw new g(w.VALIDATE_NO_PATH_SPECIFIED());for(const s of e)if(!N(s))throw new g(w.VALIDATE_PATH_NOT_FOUND(s));const t=await G(e.map(s=>s.endsWith(".json")?s:$(s,"**/*.json")));if(t.length===0)throw new g(w.VALIDATE_NO_TOKEN_FILES());const n=v()?(await ee()).config:{tokens:{source:[]},output:{tokens:".",css:".",separate:!1},transforms:{fluid:{min:320,max:1200},colorFallbackStrategy:"native"},build:{}};await B({...n,tokens:{source:t.map(s=>R(process.cwd(),s))}}),ne(c.greenBright("All tokens valid \u2728"))}catch(t){H(t)}});process.on("SIGINT",()=>process.exit(0)),process.on("SIGTERM",()=>process.exit(0));async function Yn(){const e=new L().name("sugarcube").description("CLI for scaffolding sugarcube projects").version(yt.version,"-v, --version","display the version number");e.addCommand(Vn).addCommand(Tn).addCommand(Kn).addCommand(gn).addCommand(mn),e.parse()}o(Yn,"main"),Yn();
159
+ `,t+=`Docs: ${c.cyan("https://sugarcube.sh")}`,en(t,{width:.75}),await j(200),S.break(1)},"nextSteps");async function _n(e){await Rn(e)}o(_n,"next");const Dn=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 He(e,t){if(!e||e.trim()==="")throw new g(w.DIRECTORY_PATH_EMPTY(t));const s=Ze(e).split("/")[0];if(s&&St.includes(s))throw new g(w.DIRECTORY_PATH_RESERVED(t,e))}o(He,"validateDirectoryPath");function vn(e){e.tokensDir&&He(e.tokensDir,"tokens-dir"),e.stylesDir&&He(e.stylesDir,"styles-dir")}o(vn,"validateOptions");async function An(){v()&&(he(w.CONFIG_EXISTS(),{}),process.exit(0))}o(An,"preflightInit");async function Nn(e){const t=await Cn(process.cwd()),n=e.tokensDir||t.tokensDir,s=e.stylesDir||t.stylesDir,r=await En(n);return{tokensDir:n,stylesDir:s,isSrcDir:t.isSrcDir,hasExistingTokens:r,framework:t.framework}}o(Nn,"initializeProjectContext");async function Fn(e,t,n){const s=t?null:e.kit||ce;if((e.skip||[]).includes("plugin"))return{starterKit:s,pluginToInstall:null};const i=await On(n);return{starterKit:s,pluginToInstall:i}}o(Fn,"determineInstallationTargets");async function On(e){return await $n(process.cwd(),e)?le:null}o(On,"determinePlugin");async function Pn(e,t,n,s,r){const i=await xe(process.cwd(),{withFallback:!0});return{options:e,...t,isSrcDir:t.isSrcDir,config:n,userConfig:s,...r,packageManager:i,createdFiles:[],createdDirectories:[],installedDependencies:[],tasks:[]}}o(Pn,"buildInitContext");async function Ln(e){const{trees:t,resolved:n}=await V(e.config);e.setupResult={config:e.config,createdTokenPaths:[],trees:t,resolved:n,tokenFiles:[],tokensDir:e.tokensDir}}o(Ln,"processExistingTokens");async function Mn(e){!e.hasExistingTokens&&e.starterKit?await qt(e):await Ln(e)}o(Mn,"setupDesignTokens");async function jn(e){if(!e.setupResult)throw new g(w.INITIALIZATION_INCOMPLETE());const{trees:t,resolved:n}=e.setupResult,s=await oe(t,n,e.config),r=await Se(s,e.config);await Ie(r)}o(jn,"writeCSSVariables");async function Un(e){if(!e.setupResult)throw new g(w.INITIALIZATION_INCOMPLETE());const{trees:t,resolved:n}=e.setupResult,s=await oe(t,n,e.config),r=await Ve(s,e.config);r.length&&await ke(r)}o(Un,"writeCSSUtilities");async function xn(e){if(e.pluginToInstall&&!U(e.pluginToInstall))try{await de([e.pluginToInstall],process.cwd(),e.packageManager),e.installedDependencies.push(e.pluginToInstall)}catch{throw new g(w.PLUGIN_INSTALL_FAILED({pluginToInstall:e.pluginToInstall,packageManager:e.packageManager}))}}o(xn,"installPlugins");async function Wn(e){try{const t=!!e.pluginToInstall;await Ge(e.userConfig,t);const n=await We();e.createdFiles.push(n)}catch{throw new g(w.CONFIG_WRITE_FAILED())}}o(Wn,"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} ${k("\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 ${k("\u2192","->")} adding starter kit`,while:o(async()=>{},"while")}),e.pluginToInstall){const n="Vite";U(e.pluginToInstall)?t.push({pending:`Checking for ${n} compatibility`,start:`Checking for ${n} compatibility...`,end:`${n} plugin already installed ${k("\u2192","->")} skipping plugin installation`,while:o(async()=>{},"while")}):t.push({pending:"Checking for Vite compatibility",start:"Checking for Vite compatibility...",end:`Vite detected ${k("\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 ${k("\u2192","->")} CSS will be generated as file(s)`:`No Vite detected ${k("\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 Mn(e)},"while")}),!e.pluginToInstall)e.tasks.push({pending:"Generate CSS variables",start:"Generating CSS variables...",end:"CSS variables generated",while:o(async()=>{await jn(e)},"while")}),e.tasks.push({pending:"Generate CSS utilities",start:"Generating CSS utilities...",end:"CSS utilities generated",while:o(async()=>{await Un(e)},"while")});else if(e.pluginToInstall&&!U(e.pluginToInstall)){const t="Vite";e.tasks.push({pending:`Install ${t} plugin`,start:`Installing ${t} plugin...`,end:`${t} plugin installed`,while:o(async()=>{await xn(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(Bn,"buildExecutionTasks");const Vn=new L().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{vn(e),await An();const n=await Nn(e),s=await kn({actualTokensDir:n.tokensDir,actualStylesDir:n.stylesDir,isSrcDir:n.isSrcDir}),r=it(s),i=await Fn(e,n.hasExistingTokens,n.framework);t=await Pn(e,n,r,s,i),H(K("sugarcube")),await Dn();const u=Gn(t);u.length>0&&(S.message("Detecting project\u2026"),await S.tasks(u,{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 _n(t)}catch(n){J(n)}}),Kn=new L().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(H(K("Validate")),v()&&!e.length){const{config:s}=await ee();await V(s),ne(c.greenBright("All tokens valid \u2728"));return}if(!e.length)throw new g(w.VALIDATE_NO_PATH_SPECIFIED());for(const s of e)if(!F(s))throw new g(w.VALIDATE_PATH_NOT_FOUND(s));const t=await B(e.map(s=>s.endsWith(".json")?s:$(s,"**/*.json")));if(t.length===0)throw new g(w.VALIDATE_NO_TOKEN_FILES());const n=v()?(await ee()).config:{tokens:{source:[]},output:{tokens:".",css:".",separate:!1},transforms:{fluid:{min:320,max:1200},colorFallbackStrategy:"native"},build:{}};await V({...n,tokens:{source:t.map(s=>R(process.cwd(),s))}}),ne(c.greenBright("All tokens valid \u2728"))}catch(t){J(t)}});process.on("SIGINT",()=>process.exit(0)),process.on("SIGTERM",()=>process.exit(0));async function Yn(){const e=new L().name("sugarcube").description("CLI for scaffolding sugarcube projects").version(Tt.version,"-v, --version","display the version number");e.addCommand(Vn).addCommand(Tn).addCommand(Kn).addCommand(gn).addCommand(mn),e.parse()}o(Yn,"main"),Yn();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sugarcube-org/cli",
3
- "version": "0.0.0-alpha.17",
3
+ "version": "0.0.0-alpha.19",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "provenance": false
@@ -40,7 +40,7 @@
40
40
  "@antfu/ni": "23.3.0",
41
41
  "@clack/core": "1.0.0-alpha.3",
42
42
  "@clack/prompts": "1.0.0-alpha.3",
43
- "@sugarcube-org/core": "0.0.1-alpha.7",
43
+ "@sugarcube-org/core": "0.0.1-alpha.8",
44
44
  "@unocss/core": "66.5.2",
45
45
  "commander": "12.1.0",
46
46
  "execa": "9.5.2",