11#!/usr/bin/env node
22
3- import fs from 'fs'
4- import path from 'path'
3+ import { readdirSync , existsSync , readFileSync , writeFileSync } from 'fs'
4+ import { resolve , join } from 'path'
55
66// packages
77import chalk from 'chalk'
@@ -12,10 +12,17 @@ import { config } from './utils/config.js'
1212import { colors } from './utils/colors.js'
1313import { RGBToHSL , HSLToRGB } from './utils/convert.js'
1414import { handleSingleColor , handlePaletteRanges } from './utils/palette.js'
15+ import { getProjectRoot } from './utils/getProjectRoot.js'
16+
17+ const projectRoot = getProjectRoot ( )
1518
1619async function main ( ) {
1720 console . clear ( )
18- console . log ( '🎨 Welcome to Style-Forge Generator CLI' )
21+
22+ console . log ( `
23+ ${ chalk . hex ( '#00ffff' ) . bold ( ' ⚡ STYLE-FORGE.COLORS ⚡ ' ) }
24+ ${ chalk . hex ( '#f0f' ) . bold ( '⚛️ Atomic HSL-based generator' ) }
25+ ` )
1926
2027 const { mode } = await inquirer . prompt ( [
2128 {
@@ -38,7 +45,7 @@ async function main() {
3845 process . exit ( 0 )
3946 }
4047
41- let format = config . defaultFormat || 'HSL'
48+ let format = config . modules . colors . defaultFormat || 'HSL'
4249
4350 if ( mode === '🎨 Generate CSS file by' ) {
4451 const formatAnswer = await inquirer . prompt ( [
@@ -47,7 +54,7 @@ async function main() {
4754 name : 'format' ,
4855 message : 'Select input format:' ,
4956 choices : [ 'HSL' , 'RGB' , 'HEX' ] ,
50- default : config . defaultFormat || 'HSL' ,
57+ default : config . modules . colors . defaultFormat || 'HSL' ,
5158 } ,
5259 ] )
5360 format = formatAnswer . format
@@ -84,7 +91,7 @@ async function main() {
8491 type : 'input' ,
8592 name : 'hex' ,
8693 message : 'HEX (e.g. #ff00aa):' ,
87- validate : v => / ^ # ? [ 0 - 9 A - F a - f ] { 6 } $ / . test ( v )
94+ validate : v => / ^ # ? [ 0 - 9 A - F a - f ] { 6 } $ / . test ( v ) ,
8895 } ,
8996 ] )
9097 const hex = input . hex . replace ( '#' , '' )
@@ -101,17 +108,23 @@ async function main() {
101108 await handleSingleColor ( H , S , L )
102109 }
103110 if ( mode === '📐 Generate from paletteRanges (from config)' ) {
104- if ( config . paletteRanges && Array . isArray ( config . paletteRanges ) ) {
105- await handlePaletteRanges ( config . paletteRanges )
111+ if ( config . modules . colors . paletteRanges && Array . isArray ( config . modules . colors . paletteRanges ) ) {
112+ await handlePaletteRanges ( config . modules . colors . paletteRanges )
106113 } else {
107- console . log ( '⚠️ No paletteRanges found in config.' )
114+ console . log ( '⚠️ No paletteRanges found in config.modules.colors.paletteRanges ' )
108115 }
109116 }
110117 if ( mode === '🌈 Generate full palette for H / S range' ) {
111118 const { h, s, step } = await inquirer . prompt ( [
112119 { type : 'input' , name : 'h' , message : 'Hue (0–360):' , validate : v => ! isNaN ( v ) && v >= 0 && v <= 360 } ,
113120 { type : 'input' , name : 's' , message : 'Saturation (0–100):' , validate : v => ! isNaN ( v ) && v >= 0 && v <= 100 } ,
114- { type : 'input' , name : 'step' , message : 'Step for Lightness (1–100):' , default : 5 , validate : v => ! isNaN ( v ) && v > 0 && v <= 100 }
121+ {
122+ type : 'input' ,
123+ name : 'step' ,
124+ message : 'Step for Lightness (1–100):' ,
125+ default : 5 ,
126+ validate : v => ! isNaN ( v ) && v > 0 && v <= 100 ,
127+ } ,
115128 ] )
116129 const H = parseInt ( h )
117130 const S = parseInt ( s )
@@ -153,24 +166,23 @@ async function main() {
153166 }
154167 }
155168 if ( mode === '🧩 Combine CSS files' ) {
156- const outputDir = path . resolve ( config . outputDir )
157- const srcDir = path . resolve ( config . outputDir , config . atomicSubDir )
169+ const outputDir = resolve ( projectRoot , config . output . dir , config . modules . colors . dir )
170+ const srcDir = resolve ( outputDir , config . modules . colors . atomicSubDir )
158171
159- if ( ! fs . existsSync ( srcDir ) ) {
172+ if ( ! existsSync ( srcDir ) ) {
160173 console . log ( `❌ Folder "${ srcDir } " not found.` )
161174 return
162175 }
163176
164177 const replace = x => x . replace ( '.css' , '' ) . split ( '.' ) . map ( Number )
165178
166- const allFiles = fs
167- . readdirSync ( srcDir )
168- . filter ( name => name . endsWith ( '.css' ) && ! name . startsWith ( 'combined' ) )
169- . sort ( ( a , b ) => {
170- const [ ha , sa , la ] = replace ( a )
171- const [ hb , sb , lb ] = replace ( b )
172- return ha - hb || sa - sb || la - lb
173- } )
179+ const allFiles = readdirSync ( srcDir )
180+ . filter ( name => name . endsWith ( '.css' ) && ! name . startsWith ( 'combined' ) )
181+ . sort ( ( a , b ) => {
182+ const [ ha , sa , la ] = replace ( a )
183+ const [ hb , sb , lb ] = replace ( b )
184+ return ha - hb || sa - sb || la - lb
185+ } )
174186
175187 if ( allFiles . length === 0 ) {
176188 console . log ( `❌ No .css files found in "${ srcDir } " — nothing to combine.` )
@@ -207,11 +219,10 @@ async function main() {
207219 validate : input => {
208220 if ( ! input . trim ( ) ) return true
209221 const indexes = input . split ( ',' ) . map ( i => parseInt ( i . trim ( ) , 10 ) )
210- const isValid = indexes . length === selected . length &&
211- indexes . every ( i => i > 0 && i <= selected . length )
222+ const isValid = indexes . length === selected . length && indexes . every ( i => i > 0 && i <= selected . length )
212223 return isValid || 'Enter valid sequence using all indexes (e.g. 2,1,3)'
213- }
214- }
224+ } ,
225+ } ,
215226 ] )
216227
217228 let orderedFiles = selected
@@ -232,31 +243,26 @@ async function main() {
232243 } ,
233244 ] )
234245
235- const targetPath = path . join ( outputDir , `${ name } .css` )
246+ const targetPath = join ( outputDir , `${ name } .css` )
236247 let combined = ''
237248
238249 for ( const file of orderedFiles ) {
239- const content = fs . readFileSync ( path . join ( srcDir , file ) , 'utf-8' )
250+ const content = readFileSync ( join ( srcDir , file ) , 'utf-8' )
240251 combined += `/* ${ file } */\n` + content + '\n\n'
241252 }
242253
243- fs . writeFileSync ( targetPath , combined )
254+ writeFileSync ( targetPath , combined )
244255 console . log ( `✅ Combined ${ orderedFiles . length } files into ${ name } .css` )
245256 console . log ( `📦 Size: ${ ( Buffer . byteLength ( combined ) / 1024 ) . toFixed ( 2 ) } KB` )
246257 }
247258}
248259
249- ( async function loop ( ) {
250- while ( true ) {
251- try {
252- await main ( )
253- } catch ( err ) {
254- if ( err ?. isTtyError || err ?. message ?. includes ( 'SIGINT' ) || err . name === 'ExitPromptError' ) {
255- console . log ( '\n👋 Bye!' )
256- break
257- }
258- console . error ( '❌ Unhandled error:' , err )
259- break
260- }
260+ main ( ) . catch ( err => {
261+ if ( err ?. isTtyError || err ?. message ?. includes ( 'SIGINT' ) || err . name === 'ExitPromptError' ) {
262+ console . log ( '\n👋 Bye!\n' )
263+ process . exit ( 0 )
261264 }
262- } ) ( )
265+
266+ console . error ( '\n❌ Unhandled error:' , err )
267+ process . exit ( 1 )
268+ } )
0 commit comments