legendaryjs
Version:
LegendaryJS – The ultimate backend framework for speed, power, and simplicity.
128 lines (117 loc) • 4.67 kB
JavaScript
const fs = require('fs');
const path = require('path');
const inquirer = require('inquirer');
async function initProject() {
console.clear();
console.log('🌟 Welcome to LegendaryJS v4.0.0 Initializer\n');
const answers = await inquirer.prompt([
{ name: 'projectName', message: '📦 Project name:', default: 'legendary-app' },
{ name: 'author', message: '👤 Author name:', default: 'Haidar Ghanem' },
{ name: 'port', message: '🌐 App port:', default: 3000 },
{
type: 'list',
name: 'db',
message: '🧱 Choose a database:',
choices: ['MongoDB', 'PostgreSQL', 'MySQL'],
default: 'MongoDB'
},
{
type: 'checkbox',
name: 'auth',
message: '🔐 Authentication methods:',
choices: ['JWT', 'Session', 'OAuth'],
},
{
type: 'list',
name: 'protocol',
message: '🔒 Use HTTPS?',
choices: ['HTTP', 'HTTPS'],
default: 'HTTP'
},
{
type: 'list',
name: 'architecture',
message: '🏗️ App structure:',
choices: ['freestyle', 'mvc', 'modular'],
default: 'freestyle'
},
{
type: 'checkbox',
name: 'features',
message: '⚙️ Enable features:',
choices: ['studio', 'devtools', 'webhooks', 'monitoring'],
default: ['studio', 'devtools']
}
]);
const config = {
port: parseInt(answers.port),
protocol: answers.protocol.toLowerCase(),
httpsOptions: {
key: './certs/key.pem',
cert: './certs/cert.pem'
},
env: true,
cors: { enabled: true, origin: '*' },
dev: { hotReload: true },
restart: { graceful: true },
security: { helmet: true, xss: true, sanitize: true },
db: {
mongo: answers.db === 'MongoDB',
postgres: answers.db === 'PostgreSQL',
mysql: answers.db === 'MySQL',
mongoURI: process.env.MONGO_URL || 'mongodb://localhost:27017/legendary',
postgresURI: process.env.PG_URL || 'postgres://user:pass@localhost:5432/legendary',
mysqlURI: process.env.MYSQL_URL || 'mysql://user:pass@localhost:3306/legendary'
},
auth: {
jwt: answers.auth.includes('JWT'),
session: answers.auth.includes('Session'),
oauth: answers.auth.includes('OAuth')
},
features: {
compression: true,
rateLimit: { enabled: true, windowMs: 60000, max: 100 }
},
multitenant: true,
plugins: true,
graphql: true,
apiKeys: true,
payments: true,
documentation: true,
studio: answers.features.includes('studio'),
devtools: answers.features.includes('devtools'),
webhooks: answers.features.includes('webhooks'),
monitoring: answers.features.includes('monitoring'),
architecture: answers.architecture,
routes: ['./routes/api.v1.json']
};
fs.writeFileSync('legendary.config.js', 'module.exports = ' + JSON.stringify(config, null, 2));
console.log('✅ legendary.config.js created');
// Base project structure
fs.writeFileSync('app.js', `require('dotenv').config();\nconst { createApp } = require('./core/createApp');\nconst config = require('./legendary.config');\ncreateApp(config);`);
fs.mkdirSync('routes', { recursive: true });
fs.writeFileSync('routes/api.v1.json', JSON.stringify({ version: 'v1', routes: [] }, null, 2));
fs.mkdirSync('logic', { recursive: true });
fs.mkdirSync('plugins', { recursive: true });
fs.mkdirSync('__tests__', { recursive: true });
fs.mkdirSync('studio', { recursive: true });
fs.writeFileSync('logic/example.js', '// Example custom logic');
fs.writeFileSync('plugins/example.js', '// Example plugin logic');
fs.writeFileSync('studio/index.html', '<!-- Legendary Studio UI -->');
// Structure-specific folders
switch (answers.architecture) {
case 'mvc':
fs.mkdirSync('models'); fs.mkdirSync('controllers'); fs.mkdirSync('views');
break;
case 'modular':
fs.mkdirSync('modules');
break;
default:
fs.mkdirSync('api');
}
// Sample test + config
fs.writeFileSync('__tests__/sample.test.js', `const request = require('supertest');\nconst app = require('../app');\ndescribe('🚀 Sample Test', () => {\n it('GET /v1/hello should return 200', async () => {\n const res = await request(app).get('/v1/hello');\n expect(res.statusCode).toBe(200);\n });\n});`);
fs.writeFileSync('jest.config.js', `module.exports = {\n testEnvironment: 'node',\n testMatch: ['**/__tests__/**/*.test.js']\n};`);
console.log(`🎉 Project '${answers.projectName}' initialized!`);
}
module.exports = initProject;