UNPKG

legendaryjs

Version:

LegendaryJS – The ultimate backend framework for speed, power, and simplicity.

128 lines (117 loc) 4.67 kB
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;