gensx
Version:
`GenSX command line tools.
164 lines • 8.07 kB
JavaScript
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
import { Box, Text, useApp } from "ink";
import SelectInput from "ink-select-input";
import { useEffect, useState } from "react";
import { ErrorMessage } from "../../components/ErrorMessage.js";
import { LoadingSpinner } from "../../components/LoadingSpinner.js";
import { checkEnvironmentExists, createEnvironment, } from "../../models/environment.js";
import { checkProjectExists, createProject } from "../../models/projects.js";
import { getAuth } from "../../utils/config.js";
import { validateAndSelectEnvironment } from "../../utils/env-config.js";
import { readProjectConfig } from "../../utils/project-config.js";
function useCreateEnvironment(environmentName, initialProjectName) {
const { exit } = useApp();
const [step, setStep] = useState("initial");
const [error, setError] = useState(null);
const [projectName, setProjectName] = useState(null);
const [shouldCreate, setShouldCreate] = useState(null);
const [loading, setLoading] = useState(true);
const [projectCreated, setProjectCreated] = useState(false);
useEffect(() => {
let mounted = true;
let projectConfig = null;
async function initializeEnvironment() {
try {
// Check authentication first
const authConfig = await getAuth();
if (!authConfig) {
throw new Error("Not authenticated. Please run 'gensx login' first.");
}
// Resolve project name
let resolvedProjectName = initialProjectName;
if (!resolvedProjectName) {
projectConfig = await readProjectConfig(process.cwd());
if (!projectConfig?.projectName) {
throw new Error("No project name found. Either specify --project or create a gensx.yaml file with a 'projectName' field.");
}
resolvedProjectName = projectConfig.projectName;
}
// Check if project exists
const projectExists = await checkProjectExists(resolvedProjectName);
if (!mounted)
return;
if (!projectExists) {
setProjectName(resolvedProjectName);
setStep("confirming_project_creation");
setLoading(false);
}
else {
setProjectName(resolvedProjectName);
// Check if the environment already exists
const environmentExists = await checkEnvironmentExists(resolvedProjectName, environmentName);
if (environmentExists) {
throw new Error(`Environment ${environmentName} already exists for project ${resolvedProjectName}`);
}
setStep("creating_environment");
setLoading(false);
await createEnvironment(resolvedProjectName, environmentName);
const success = await validateAndSelectEnvironment(resolvedProjectName, environmentName);
if (!success) {
throw new Error("Failed to set environment as active");
}
setStep("done");
setTimeout(() => {
exit();
}, 100);
}
}
catch (err) {
if (!mounted)
return;
const thrownError = err instanceof Error ? err : new Error(String(err));
setError(thrownError);
setStep("error");
setLoading(false);
setTimeout(() => {
exit();
}, 100);
}
}
// Handle project creation when user confirms
async function handleProjectCreation() {
if (step !== "confirming_project_creation" || shouldCreate === null)
return;
try {
if (shouldCreate) {
setStep("creating_project");
if (!projectName) {
throw new Error("Project name is not defined");
}
await createProject(projectName, environmentName, projectConfig?.description);
setProjectCreated(true);
const success = await validateAndSelectEnvironment(projectName, environmentName);
if (!success) {
throw new Error("Failed to set environment as active");
}
setStep("done");
}
else {
setError(new Error("Project creation cancelled"));
setStep("error");
setTimeout(() => {
exit();
}, 100);
}
}
catch (err) {
if (!mounted)
return;
const thrownError = err instanceof Error ? err : new Error(String(err));
setError(thrownError);
setStep("error");
setTimeout(() => {
exit();
}, 100);
}
}
// Initial setup
if (step === "initial") {
void initializeEnvironment();
}
// Handle project creation confirmation
if (step === "confirming_project_creation" && shouldCreate !== null) {
void handleProjectCreation();
}
return () => {
mounted = false;
};
}, [
step,
shouldCreate,
environmentName,
initialProjectName,
projectName,
exit,
]);
return {
loading,
error,
projectName,
step,
setShouldCreate,
projectCreated,
};
}
export function CreateEnvironmentUI({ environmentName, projectName: initialProjectName, }) {
const { loading, error, projectName, step, setShouldCreate, projectCreated } = useCreateEnvironment(environmentName, initialProjectName);
if (error) {
return _jsx(ErrorMessage, { message: error.message });
}
if (loading || step === "creating_project") {
return _jsx(LoadingSpinner, {});
}
if (step === "confirming_project_creation") {
const items = [
{ label: "Yes", value: "yes" },
{ label: "No", value: "no" },
];
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { paddingBottom: 1, children: _jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: "\u2139" }), " Project", " ", _jsx(Text, { color: "cyan", children: projectName }), " does not exist."] }) }), _jsxs(Text, { children: [_jsx(Text, { color: "blue", children: "\u279C" }), " Would you like to create it?"] }), _jsx(SelectInput, { items: items, onSelect: (item) => {
setShouldCreate(item.value === "yes");
} })] }));
}
return (_jsx(Box, { flexDirection: "column", gap: 1, children: step === "done" && (_jsxs(Box, { flexDirection: "column", children: [projectCreated && (_jsxs(Text, { children: [_jsx(Text, { bold: true, color: "green", children: "\u2714" }), " ", "Project ", _jsx(Text, { color: "cyan", children: projectName }), " and environment", " ", _jsx(Text, { color: "green", children: environmentName }), " created"] })), !projectCreated && (_jsxs(Text, { children: [_jsx(Text, { bold: true, color: "green", children: "\u2714" }), " ", "Environment ", _jsx(Text, { color: "green", children: environmentName }), " created for project ", _jsx(Text, { color: "cyan", children: projectName })] })), _jsxs(Text, { children: [_jsx(Text, { bold: true, color: "green", children: "\u2714" }), " ", "Environment ", _jsx(Text, { color: "green", children: environmentName }), " is now active"] })] })) }));
}
//# sourceMappingURL=create.js.map