create-cen-app
Version:
create an client-engineering-style app
128 lines (114 loc) • 3.21 kB
text/typescript
import { preflightCheck } from "./preflightCheck.js";
import * as p from "@clack/prompts";
import chalk from "chalk";
import path from "path";
import { installPackages } from "~/helpers/installPackages.js";
import { scaffoldProject } from "~/helpers/scaffoldProject.js";
import { fastApiInstaller } from "~/installers/fastApi.js";
import { fullStackInstaller } from "~/installers/full-stack-installer.js";
import {
AvailableBackends,
AvailableFlavours,
AvailableTemplates,
type PkgInstallerMap,
} from "~/installers/index.js";
// import { watsonxInstaller } from "~/installers/watsonx.js";
import { getUserPkgManager } from "~/utils/getUserPkgManager.js";
import { PythonVersion } from "~/utils/getUserPythonVersion.js";
import replaceTextInFiles from "~/utils/replaceTextInFiles.js";
interface CreateProjectOptions {
projectName: string;
displayName?: string;
packages: PkgInstallerMap;
backend: AvailableBackends;
pythonVersion: PythonVersion;
noInstall: boolean;
noVenv: boolean;
// envVars?: Record<AvailableEnvVars, string>;
proxy: boolean;
template: AvailableTemplates;
flavour: AvailableFlavours;
// importAlias: string;
}
type CreateProjectResult = {
frontendDir: string;
backendDir: string;
projectDir: string;
missingDependencies: string[];
};
export const createProject = async ({
projectName,
displayName,
packages,
backend,
pythonVersion,
noInstall,
noVenv,
// envVars,
proxy,
template,
flavour,
}: CreateProjectOptions): Promise<CreateProjectResult> => {
const pkgManager = getUserPkgManager();
const projectDir = path.resolve(process.cwd(), projectName);
let frontendDir = "";
let backendDir = "";
if (template === "create-cen-app" && (backend === "default" || backend === "trpc")) {
frontendDir = projectDir;
} else {
frontendDir = path.resolve(projectDir, `frontend`);
backendDir = path.resolve(projectDir, `backend`);
}
if (!noInstall) {
p.log.info(`\nUsing: ${chalk.cyan.bold(pkgManager)}\n`);
}
const { noInstall: shouldSetNoInstall, missingDependencies } = await preflightCheck({
projectDir,
projectName,
template,
noInstall,
flavour,
});
noInstall = shouldSetNoInstall;
if (template === "create-cen-app") {
// Bootstraps the base next.js application
await scaffoldProject({
projectDir,
projectName,
frontendDir,
backendDir,
pkgManager,
noInstall,
proxy,
packages,
backend,
template,
});
// Install the selected packages for create-cen-app
installPackages({
frontendDir,
pkgManager,
packages,
noInstall,
});
// install backend
if (backend === "fastapi") {
await fastApiInstaller({ backendDir, noVenv, pythonVersion });
}
// update displayName in files
if (displayName) {
replaceTextInFiles(frontendDir, "[project-name]", displayName);
}
}
if (template === "full-stack-cen-template") {
await fullStackInstaller({
backendDir,
frontendDir,
projectDir,
projectName,
noInstall,
flavour,
});
}
return { frontendDir, backendDir, projectDir, missingDependencies };
};