miryala
Version:
A production-ready TypeScript Express.js backend generator with MongoDB or PostgreSQL support
91 lines (81 loc) ⢠3.67 kB
JavaScript
const inquirer = require('inquirer');
const fs = require('fs');
const path = require('path');
const { createAdvancedStructure } = require('../lib/filesystem');
const { createAdvancedPackageJson } = require('../lib/package');
const { installAdvancedDependencies } = require('../lib/dependencies');
const initProject = async () => {
console.log('\nš Welcome to Miryala - Advanced TypeScript Express.js Backend Generator\n');
try {
const answers = await inquirer.prompt([
{
type: 'input',
name: 'projectName',
message: 'Project folder name (. to use current directory):',
default: '.',
validate: (input) => {
const trimmed = input.trim();
if (!trimmed) return 'Folder name cannot be empty';
if (trimmed !== '.' && !/^[a-zA-Z0-9_\-]+$/.test(trimmed)) {
return 'Use only letters, numbers, hyphens, or underscores';
}
return true;
}
},
{
type: 'list',
name: 'database',
message: 'Which database would you like to use?',
choices: [
{
name: 'š MongoDB (with Mongoose)',
value: 'mongodb',
short: 'MongoDB'
},
{
name: 'š PostgreSQL (with Prisma)',
value: 'postgresql',
short: 'PostgreSQL'
}
],
default: 'mongodb'
}
]);
const projectName = answers.projectName.trim();
const dbChoice = answers.database;
// Resolve project root
const projectRoot = projectName === '.' ? process.cwd() : path.join(process.cwd(), projectName);
if (projectName !== '.') {
if (fs.existsSync(projectRoot)) {
console.error(`\nā Folder "${projectName}" already exists. Choose a different name or use "." for the current directory.`);
process.exit(1);
}
fs.mkdirSync(projectRoot, { recursive: true });
console.log(`\nš Created project folder: ${projectName}`);
}
console.log(`\n⨠Creating project structure with ${dbChoice.toUpperCase()}...\n`);
await createAdvancedStructure(dbChoice, projectRoot);
createAdvancedPackageJson(dbChoice, projectRoot);
installAdvancedDependencies(dbChoice, projectRoot);
console.log('\nā
Setup complete!\n');
console.log('š Next steps:');
if (projectName !== '.') {
console.log(` 1. cd ${projectName}`);
}
const step = projectName !== '.' ? 2 : 1;
console.log(` ${step}. Update your .env file with database credentials`);
if (dbChoice === 'postgresql') {
console.log(` ${step + 1}. Run "npx prisma migrate dev" to create your database schema`);
}
console.log(` ${dbChoice === 'postgresql' ? step + 2 : step + 1}. Run "npm run dev" to start development server\n`);
} catch (error) {
if (error.isTtyError) {
console.error('\nā Prompt couldn\'t be rendered in the current environment');
} else {
console.error('\nā An error occurred:', error.message);
}
process.exit(1);
}
};
initProject();