@@ -9,7 +9,7 @@ import { parseArgs } from 'node:util'
99import { finished } from 'stream/promises'
1010import k from 'kleur'
1111
12- const TMP_FOLDER_PREFX = '.create-adex'
12+ const TMP_FOLDER_PREFIX = '.create-adex'
1313const info = k . cyan
1414const success = k . green
1515const failure = k . red
@@ -36,108 +36,119 @@ const flags = parseArgs({
3636await main ( )
3737
3838async function main ( ) {
39- const { init , help } = flags . values
39+ const { help } = flags . values
4040 const targetDir = flags . positionals [ 0 ] ?? '.'
4141
4242 if ( help ) {
43- console . log ( `
44- ${ k . gray ( '[USAGE]' ) }
45-
46- $ adex [flags] [args]
47-
48- ${ k . gray ( '[FLAGS]' ) }
49-
50- --help,-h Show this help
51- --init PATH Initialise a new adex project at PATH (${ k . gray ( 'default: ./' ) } )
52-
53- ` )
43+ showHelp ( )
5444 return
5545 }
5646
57- if ( existsSync ( targetDir ) ) {
58- const entries = await readdir ( targetDir )
59- if ( entries . filter ( d => d != '.tmp' ) . length ) {
60- console . log (
61- `${ failure ( `[FAIL]` ) } ${ k . bold ( targetDir ) } is not empty, aborting initialisation`
62- )
63- return
64- }
47+ if ( await isDirectoryNotEmpty ( targetDir ) ) {
48+ console . log (
49+ `${ failure ( `[FAIL]` ) } ${ k . bold ( targetDir ) } is not empty, aborting initialization`
50+ )
51+ return
6552 }
53+
6654 console . log ( info ( `Initializing in ${ targetDir } ` ) )
6755 const selectedTemplate = TEMPLATES . default
6856 const targetFilePath = await downloadFile (
6957 selectedTemplate . link ,
7058 'adex-template.zip'
7159 )
7260
73- const unzipStream = new StreamZip . async ( {
74- file : targetFilePath ,
75- } )
76-
61+ const unzipStream = new StreamZip . async ( { file : targetFilePath } )
7762 const entries = await unzipStream . entries ( )
7863
79- const files = (
80- await Promise . all (
81- Object . values ( entries ) . map ( async entry => {
82- const outFile = join ( TMP_FOLDER_PREFX , 'out' , entry . name )
83- await mkdir ( dirname ( outFile ) , { recursive : true } )
84- await unzipStream . extract ( entry , outFile )
85- if ( entry . isFile ) {
86- return outFile
87- }
88- } )
89- )
90- ) . filter ( Boolean )
91-
92- await Promise . allSettled (
93- files
94- . map ( d => {
95- const absolutePath = resolve ( d )
96- return {
97- source : absolutePath ,
98- dest : absolutePath . replace (
99- join (
100- process . cwd ( ) ,
101- TMP_FOLDER_PREFX ,
102- 'out' ,
103- selectedTemplate . name + '-' + selectedTemplate . branch
104- ) ,
105- resolve ( targetDir )
106- ) ,
107- }
108- } )
109- . map ( async d => {
110- try {
111- await mkdir ( dirname ( d . dest ) , { recursive : true } )
112- await copyFile ( d . source , d . dest )
113- console . log ( `${ k . gray ( '[Created]' ) } ${ k . white ( d . dest ) } ` )
114- } catch ( err ) {
115- console . log ( failure ( `[FAIL] Creation: ${ d . dest } , ${ err . message } ` ) )
116- }
117- } )
118- )
64+ const files = await extractFiles ( entries , unzipStream )
65+ await copyFiles ( files , targetDir , selectedTemplate )
11966
120- rm ( TMP_FOLDER_PREFX , { recursive : true } )
67+ await rm ( TMP_FOLDER_PREFIX , { recursive : true } )
12168
122- console . log (
123- `\nNext Steps\n
124- $ cd ${ targetDir }
125- $ npm i`
126- )
69+ console . log ( `\nNext Steps\n$ cd ${ targetDir } \n$ npm i` )
12770 console . log ( success ( '\nDone!\n' ) )
71+ }
12872
129- return
73+ function showHelp ( ) {
74+ console . log ( `
75+ ${ k . gray ( '[USAGE]' ) }
76+
77+ $ adex [flags] [args]
78+
79+ ${ k . gray ( '[FLAGS]' ) }
80+
81+ --help,-h Show this help
82+ --init PATH Initialize a new adex project at PATH (${ k . gray ( 'default: ./' ) } )
83+ ` )
84+ }
85+
86+ async function isDirectoryNotEmpty ( targetDir ) {
87+ if ( existsSync ( targetDir ) ) {
88+ const entries = await readdir ( targetDir )
89+ return entries . filter ( d => d !== '.tmp' ) . length > 0
90+ }
91+ return false
13092}
13193
13294async function downloadFile ( url , fileName ) {
133- const res = await fetch ( url )
134- if ( ! existsSync ( TMP_FOLDER_PREFX ) ) await mkdir ( TMP_FOLDER_PREFX )
135- const destination = resolve ( TMP_FOLDER_PREFX , fileName )
136- if ( existsSync ( destination ) ) {
137- await rm ( destination , { recursive : true } )
95+ try {
96+ const res = await fetch ( url )
97+ if ( ! res . ok ) throw new Error ( `Failed to fetch ${ url } : ${ res . statusText } ` )
98+
99+ if ( ! existsSync ( TMP_FOLDER_PREFIX ) ) await mkdir ( TMP_FOLDER_PREFIX )
100+ const destination = resolve ( TMP_FOLDER_PREFIX , fileName )
101+ if ( existsSync ( destination ) ) {
102+ await rm ( destination , { recursive : true } )
103+ }
104+
105+ const fileStream = createWriteStream ( destination , { flags : 'wx' } )
106+ await finished ( Readable . fromWeb ( res . body ) . pipe ( fileStream ) )
107+ return destination
108+ } catch ( err ) {
109+ console . error ( failure ( `[FAIL] Download: ${ err . message } ` ) )
110+ process . exit ( 1 )
111+ }
112+ }
113+
114+ async function extractFiles ( entries , unzipStream ) {
115+ const files = await Promise . all (
116+ Object . values ( entries ) . map ( async entry => {
117+ const outFile = join ( TMP_FOLDER_PREFIX , 'out' , entry . name )
118+ await mkdir ( dirname ( outFile ) , { recursive : true } )
119+ await unzipStream . extract ( entry , outFile )
120+ if ( entry . isFile ) {
121+ return outFile
122+ }
123+ } )
124+ )
125+ return files . filter ( Boolean )
126+ }
127+
128+ async function copyFiles ( files , targetDir , selectedTemplate ) {
129+ const copyPromises = files . map ( d => {
130+ const absolutePath = resolve ( d )
131+ const dest = absolutePath . replace (
132+ join (
133+ process . cwd ( ) ,
134+ TMP_FOLDER_PREFIX ,
135+ 'out' ,
136+ `${ selectedTemplate . name } -${ selectedTemplate . branch } `
137+ ) ,
138+ resolve ( targetDir )
139+ )
140+ return copyFileWithLogging ( absolutePath , dest )
141+ } )
142+
143+ await Promise . allSettled ( copyPromises )
144+ }
145+
146+ async function copyFileWithLogging ( source , dest ) {
147+ try {
148+ await mkdir ( dirname ( dest ) , { recursive : true } )
149+ await copyFile ( source , dest )
150+ console . log ( `${ k . gray ( '[Created]' ) } ${ k . white ( dest ) } ` )
151+ } catch ( err ) {
152+ console . log ( failure ( `[FAIL] Creation: ${ dest } , ${ err . message } ` ) )
138153 }
139- const fileStream = createWriteStream ( destination , { flags : 'wx' } )
140- // @ts -expect-error , supports the input but readable needs to be fixed for the same
141- await finished ( Readable . fromWeb ( res . body ) . pipe ( fileStream ) )
142- return destination
143154}
0 commit comments