create-types-backend
Version:
A CLI tool to quickly setup an Express.js backend in TypeScript, using essential configurations and user's preferences.
95 lines (94 loc) • 3.96 kB
JavaScript
import chalk from "chalk";
import { validateDirname } from "./utils/validateDirname.js";
import { questions } from "./constants/questions.js";
import { createRootDirectory } from "./services/root-directory.js";
import { createPackageJson } from "./services/package-json.js";
import { createTsConfig } from "./services/ts-config.js";
import { createGitIgnore } from "./services/git-ignore.js";
import { createDotenv } from "./services/dotenv.js";
import { createPrettierrc } from "./services/prettierrc.js";
import { createFolderStructure } from "./services/folder-structure.js";
import { createRouter } from "./services/example-router.js";
import { createController } from "./services/example-controller.js";
import { createAuth } from "./services/auth.js";
import { createErrorHandler } from "./services/error-handler.js";
import { createDB } from "./services/db.js";
import { createModel } from "./services/example-model.js";
import { createMulter } from "./services/multer.js";
import { createCloudinary } from "./services/cloudinary.js";
import { createESLint } from "./services/eslint.js";
import { createDocker } from "./services/docker.js";
import { createApp } from "./services/app.js";
import { installDependencies, installDevDependencies } from "./services/install-deps.js";
import { execSync } from "child_process";
async function main() {
console.log(chalk.bold.blue("🚀 Welcome to TypeScript-Express Backend CLI !\n"));
// Get the project name from command-line argument
let projectNameArg = process.argv[2] !== "-y" ? process.argv[2] : process.argv[3];
projectNameArg = validateDirname(projectNameArg);
// Check for -y flag (auto mode)
const autoMode = process.argv.includes("-y");
let answers;
if (autoMode) {
console.log(chalk.yellow("⚡ Running in auto mode with all preferences set to YES..."));
answers = {
projectName: projectNameArg === "" ? "backend" : projectNameArg,
portNumber: 4000,
useCors: true,
useMongo: true,
useAuth: true,
useErrorHandler: true,
useMulter: true,
useCloudinary: true,
useESLint: true,
useDocker: true,
useGit: false,
};
}
else {
// Get user input if not in auto mode
answers = await questions(projectNameArg);
}
const projectName = projectNameArg || validateDirname(answers.projectName);
createRootDirectory(projectName);
createPackageJson(projectName, answers);
createTsConfig();
createGitIgnore();
createDotenv(answers);
createPrettierrc();
createFolderStructure();
createRouter();
createController(answers);
if (answers.useAuth)
createAuth;
if (answers.useErrorHandler)
createErrorHandler();
if (answers.useMongo) {
createDB();
createModel(answers);
}
if (answers.useMulter)
createMulter();
if (answers.useCloudinary)
createCloudinary();
if (answers.useESLint)
createESLint();
if (answers.useDocker)
createDocker(projectName, answers);
createApp(answers);
installDependencies(answers);
installDevDependencies(answers);
if (answers.useGit) {
execSync("git init", { stdio: "ignore" });
execSync("git add .", { stdio: "ignore" });
execSync('git commit -m "init: create-types-backend"', { stdio: "ignore" });
console.log(chalk.green("Initialized a new git repository"));
}
console.log(chalk.green(`🎉 You are good to go ! 🚀\n`));
console.log(chalk.blue(`➡️ To start the development server, follow these steps:`));
console.log(chalk.blue(`=> cd ${projectName}`));
answers.useMongo && console.log(chalk.blue(`=> add your MONGODB_URI in .env file`));
console.log(chalk.blue(`=> npm run dev\n`));
}
main().catch((error) => console.error(chalk.red("❌ ", error)));