mirror of
https://github.com/steel-dev/cli.git
synced 2026-09-14 20:47:34 +08:00
76 lines
2.0 KiB
TypeScript
76 lines
2.0 KiB
TypeScript
import fs from 'fs';
|
|
import path from 'path';
|
|
import React from 'react';
|
|
import {fileURLToPath} from 'url';
|
|
import {useEffect} from 'react';
|
|
import SelectInput from 'ink-select-input';
|
|
import {Task} from 'ink-task-list';
|
|
import {write} from '../../utils/forge.js';
|
|
import {useTask} from '../../hooks/usetask.js';
|
|
import {useForgeStep} from '../../context/forgestepcontext.js';
|
|
import spinners from 'cli-spinners';
|
|
|
|
export default function Directory() {
|
|
const [state, task, , , setTask, setLoading, setError] = useTask();
|
|
const {step, setStep, directory, template} = useForgeStep();
|
|
useEffect(() => {
|
|
if (step === 'directory' && task) {
|
|
setLoading(true);
|
|
const cwd = process.cwd();
|
|
if (!template) {
|
|
setLoading(false);
|
|
setStep('template');
|
|
return;
|
|
}
|
|
const templateDir = path.resolve(
|
|
fileURLToPath(import.meta.url),
|
|
'../../../../examples',
|
|
template?.value,
|
|
);
|
|
const files = fs.readdirSync(templateDir);
|
|
fs.mkdir(directory, err => setError(err?.message));
|
|
for (const file of files.filter(f => f !== 'package.json')) {
|
|
write(file, directory, templateDir, cwd);
|
|
}
|
|
const projectName = path.basename(path.resolve(directory));
|
|
const packageJsonPath = path.join(templateDir, `package.json`);
|
|
if (fs.existsSync(packageJsonPath)) {
|
|
const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
pkg.name = projectName;
|
|
write(
|
|
'package.json',
|
|
directory,
|
|
templateDir,
|
|
cwd,
|
|
JSON.stringify(pkg, null, 2) + '\n',
|
|
);
|
|
}
|
|
setLoading(false);
|
|
setStep('envvar');
|
|
}
|
|
}, [step, task]);
|
|
|
|
return (
|
|
<Task
|
|
label="Writing directory"
|
|
state={state}
|
|
spinner={spinners.dots}
|
|
isExpanded={step === 'directory' && !task}
|
|
>
|
|
<SelectInput
|
|
items={[
|
|
{
|
|
label: 'Remove existing files and continue',
|
|
value: 'yes',
|
|
},
|
|
{
|
|
label: 'Ignore files and continue',
|
|
value: 'ignore',
|
|
},
|
|
]}
|
|
onSelect={items => setTask(items.value)}
|
|
/>
|
|
</Task>
|
|
);
|
|
}
|