UNPKG

miryala

Version:

A production-ready TypeScript Express.js backend generator with MongoDB or PostgreSQL support

91 lines (81 loc) • 3.67 kB
#!/usr/bin/env node 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();