Skip to content

Commit 70d2035

Browse files
committed
chore: simplify CLI code
1 parent 92b2ddf commit 70d2035

File tree

1 file changed

+92
-81
lines changed

1 file changed

+92
-81
lines changed

create-adex/cli.mjs

Lines changed: 92 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { parseArgs } from 'node:util'
99
import { finished } from 'stream/promises'
1010
import k from 'kleur'
1111

12-
const TMP_FOLDER_PREFX = '.create-adex'
12+
const TMP_FOLDER_PREFIX = '.create-adex'
1313
const info = k.cyan
1414
const success = k.green
1515
const failure = k.red
@@ -36,108 +36,119 @@ const flags = parseArgs({
3636
await main()
3737

3838
async 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

13294
async 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

Comments
 (0)