UNPKG

express-hale

Version:

šŸš€ Interactive Express.js scaffold CLI with comprehensive error handling, TypeScript/JavaScript, database integrations, Git Flow, and development tools

599 lines (525 loc) • 30.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AppTemplates = void 0; const base_renderer_1 = require("./base-renderer"); class AppTemplates extends base_renderer_1.BaseRenderer { renderIndexFile(data) { const { config } = data; if (config.language === 'typescript') { return `import express from 'express'; import cors from 'cors'; import helmet from 'helmet'; import morgan from 'morgan'; import dotenv from 'dotenv'; import routes from './routes'; import { errorHandler, notFoundHandler } from './middleware/error-handler'; import { setupGracefulShutdown } from './utils/graceful-shutdown'; ${config.databases.includes('mysql') ? "import './config/mysql';" : ''} ${config.databases.includes('mongodb') ? "import './config/mongodb';" : ''} ${config.databases.includes('redis') ? "import './config/redis';" : ''} dotenv.config(); const app: express.Application = express(); const PORT = process.env.PORT || 3000; // Middleware app.use(helmet()); app.use(cors()); app.use(morgan('combined')); app.use(express.json({ limit: '10mb' })); app.use(express.urlencoded({ extended: true, limit: '10mb' })); // Enhanced request logging middleware with bright colors app.use( (req: express.Request, res: express.Response, next: express.NextFunction) => { const start = Date.now(); const originalSend = res.send; res.send = function (body) { const duration = Date.now() - start; const timestamp = new Date().toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai', year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false }); // Enhanced color system with bright colors const colors = { reset: '\\x1b[0m', bold: '\\x1b[1m', dim: '\\x1b[2m', bright: '\\x1b[1m', // Bright colors for better visibility brightRed: '\\x1b[91m', brightGreen: '\\x1b[92m', brightYellow: '\\x1b[93m', brightBlue: '\\x1b[94m', brightMagenta: '\\x1b[95m', brightCyan: '\\x1b[96m', brightWhite: '\\x1b[97m', // Background colors for emphasis bgRed: '\\x1b[41m', bgGreen: '\\x1b[42m', bgYellow: '\\x1b[43m', bgBlue: '\\x1b[44m', bgMagenta: '\\x1b[45m', bgCyan: '\\x1b[46m' }; // Status code color mapping with bright colors const getStatusColor = (status: number) => { if (status >= 200 && status < 300) return colors.brightGreen + colors.bold; // Bright Green + Bold if (status >= 300 && status < 400) return colors.brightYellow + colors.bold; // Bright Yellow + Bold if (status >= 400 && status < 500) return colors.brightRed + colors.bold; // Bright Red + Bold if (status >= 500) return colors.bgRed + colors.brightWhite + colors.bold; // Red background + White text return colors.brightWhite + colors.bold; // Bright White + Bold }; // Method color mapping with bright colors const getMethodColor = (method: string) => { switch (method) { case 'GET': return colors.brightGreen + colors.bold; // Bright Green + Bold case 'POST': return colors.brightBlue + colors.bold; // Bright Blue + Bold case 'PUT': return colors.brightYellow + colors.bold; // Bright Yellow + Bold case 'DELETE': return colors.brightRed + colors.bold; // Bright Red + Bold case 'PATCH': return colors.brightCyan + colors.bold; // Bright Cyan + Bold case 'OPTIONS': return colors.brightMagenta + colors.bold; // Bright Magenta + Bold default: return colors.brightWhite + colors.bold; // Bright White + Bold } }; // Duration color mapping with bright colors and backgrounds const getDurationColor = (duration: number) => { if (duration < 50) return colors.brightGreen + colors.bold; // Very fast - Bright Green if (duration < 100) return colors.brightCyan + colors.bold; // Fast - Bright Cyan if (duration < 300) return colors.brightYellow + colors.bold; // Medium - Bright Yellow if (duration < 1000) return colors.brightRed + colors.bold; // Slow - Bright Red return colors.bgRed + colors.brightWhite + colors.bold; // Very slow - Red background }; // Size color mapping const getSizeColor = (size: number) => { if (size < 1024) return colors.brightGreen + colors.bold; // < 1KB - Green if (size < 10240) return colors.brightCyan + colors.bold; // < 10KB - Cyan if (size < 102400) return colors.brightYellow + colors.bold; // < 100KB - Yellow return colors.brightRed + colors.bold; // > 100KB - Red }; const reset = colors.reset; const bold = colors.bold; const dim = colors.dim; // Get client info const userAgent = req.get('User-Agent') || 'Unknown'; const clientIP = req.ip || req.connection.remoteAddress || 'Unknown'; const contentLength = body ? Buffer.byteLength(body) : 0; console.log(\` \${colors.brightCyan}\${bold}ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€\${reset} \${colors.brightCyan}\${bold}│ 🌐 HTTP REQUEST LOG\${reset} \${colors.brightCyan}\${bold}ā”œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€\${reset} \${colors.brightWhite}\${bold}│ ā° Time:\${reset} \${colors.brightYellow}\${bold}\${timestamp}\${reset} \${colors.brightWhite}\${bold}│ šŸ”— Method:\${reset} \${getMethodColor(req.method)}\${req.method}\${reset} \${colors.brightWhite}\${bold}│ šŸ“ Path:\${reset} \${colors.brightCyan}\${bold}\${req.originalUrl || req.path}\${reset} \${colors.brightWhite}\${bold}│ šŸ“Š Status:\${reset} \${getStatusColor(res.statusCode)}\${res.statusCode}\${reset} \${colors.brightWhite}\${bold}│ ⚔ Duration:\${reset} \${getDurationColor(duration)}\${duration}ms\${reset} \${colors.brightWhite}\${bold}│ šŸ“¦ Size:\${reset} \${getSizeColor(contentLength)}\${contentLength} bytes\${reset} \${colors.brightWhite}\${bold}│ šŸŒ Client:\${reset} \${colors.brightMagenta}\${bold}\${clientIP}\${reset} \${colors.brightWhite}\${bold}│ šŸ”§ Agent:\${reset} \${colors.brightBlue}\${bold}\${userAgent.substring(0, 60)}\${userAgent.length > 60 ? '...' : ''}\${reset} \${colors.brightCyan}\${bold}└─────────────────────────────────────────────────────────────────────────────────\${reset} \`); return originalSend.call(this, body); }; next(); } ); // Routes app.use('/api', routes); // Health check endpoint app.get('/health', (req, res) => { res.status(200).json({ status: 'OK', timestamp: new Date().toISOString(), uptime: process.uptime(), memory: process.memoryUsage(), version: process.env.npm_package_version || '1.0.0', }); }); // 404 handler app.use(notFoundHandler); // Error handling middleware (must be last) app.use(errorHandler); const server = app.listen(PORT, () => { // Hale's Express Scaffold - Premium Startup Banner const colors = { reset: '\\x1b[0m', bright: '\\x1b[1m', dim: '\\x1b[2m', red: '\\x1b[31m', green: '\\x1b[32m', yellow: '\\x1b[33m', blue: '\\x1b[34m', magenta: '\\x1b[35m', cyan: '\\x1b[36m', white: '\\x1b[37m', bgBlue: '\\x1b[44m', bgMagenta: '\\x1b[45m' }; console.log(\` \${colors.bright} \${colors.red} ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•—\${colors.yellow}ā–ˆā–ˆā•— ā–ˆā–ˆā•—\${colors.green}ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•— \${colors.cyan}ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•— \${colors.blue}ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•—\${colors.magenta}ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•—\${colors.red}ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•— \${colors.cyan}šŸš€ HALE'S FRAMEWORK šŸš€ \${colors.red} ā–ˆā–ˆā•”ā•ā•ā•ā•ā•\${colors.yellow}ā•šā–ˆā–ˆā•—ā–ˆā–ˆā•”ā•\${colors.green}ā–ˆā–ˆā•”ā•ā•ā–ˆā–ˆā•—\${colors.cyan}ā–ˆā–ˆā•”ā•ā•ā–ˆā–ˆā•—\${colors.blue}ā–ˆā–ˆā•”ā•ā•ā•ā•ā•\${colors.magenta}ā–ˆā–ˆā•”ā•ā•ā•ā•ā•\${colors.red}ā–ˆā–ˆā•”ā•ā•ā•ā•ā• \${colors.dim}ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” \${colors.red} ā–ˆā–ˆā–ˆā–ˆā–ˆā•— \${colors.yellow} ā•šā–ˆā–ˆā–ˆā•”ā• \${colors.green}ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•”ā•\${colors.cyan}ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•”ā•\${colors.blue}ā–ˆā–ˆā–ˆā–ˆā–ˆā•— \${colors.magenta}ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•—\${colors.red}ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•— \${colors.dim}│ \${colors.white}Modern Express Scaffold \${colors.dim}│ \${colors.red} ā–ˆā–ˆā•”ā•ā•ā• \${colors.yellow} ā–ˆā–ˆā•”ā–ˆā–ˆā•— \${colors.green}ā–ˆā–ˆā•”ā•ā•ā•ā• \${colors.cyan}ā–ˆā–ˆā•”ā•ā•ā–ˆā–ˆā•—\${colors.blue}ā–ˆā–ˆā•”ā•ā•ā• \${colors.magenta}ā•šā•ā•ā•ā•ā–ˆā–ˆā•‘\${colors.red}ā•šā•ā•ā•ā•ā–ˆā–ˆā•‘ \${colors.dim}│ \${colors.white}High Performance CLI \${colors.dim}│ \${colors.red} ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•—\${colors.yellow}ā–ˆā–ˆā•”ā• ā–ˆā–ˆā•—\${colors.green}ā–ˆā–ˆā•‘ \${colors.cyan}ā–ˆā–ˆā•‘ ā–ˆā–ˆā•‘\${colors.blue}ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•—\${colors.magenta}ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•‘\${colors.red}ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•‘ \${colors.dim}│ \${colors.white}Built with ā¤ļø by Hale \${colors.dim}│ \${colors.red} ā•šā•ā•ā•ā•ā•ā•ā•\${colors.yellow}ā•šā•ā• ā•šā•ā•\${colors.green}ā•šā•ā• \${colors.cyan}ā•šā•ā• ā•šā•ā•\${colors.blue}ā•šā•ā•ā•ā•ā•ā•ā•\${colors.magenta}ā•šā•ā•ā•ā•ā•ā•ā•\${colors.red}ā•šā•ā•ā•ā•ā•ā•ā• \${colors.dim}ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ \${colors.reset} \${colors.magenta}\${colors.bright} ╔═══════════════════════════════════════════════════════════╗ ā•‘ šŸš€ CRAFTED BY HALE šŸš€ ā•‘ ā•‘ Modern Express.js Scaffold Framework ā•‘ ā•‘ express-hale CLI Generator ā•‘ ā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•\${colors.reset} \${colors.green}\${colors.bright}ā”Œā”€ SERVER INFORMATION ─────────────────────────────────────────┐\${colors.reset} \${colors.green}│\${colors.reset} \${colors.yellow}šŸš€ Status:\${colors.reset} \${colors.green}\${colors.bright}Application started successfully!\${colors.reset} \${colors.green}│\${colors.reset} \${colors.yellow}šŸ“… Started:\${colors.reset} \${new Date().toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' })} \${colors.green}│\${colors.reset} \${colors.yellow}🌐 Server:\${colors.reset} \${colors.cyan}http://localhost:\${PORT}\${colors.reset} \${colors.green}│\${colors.reset} \${colors.yellow}šŸŒ Environment:\${colors.reset} \${colors.magenta}\${process.env.NODE_ENV || 'development'}\${colors.reset} \${colors.green}│\${colors.reset} \${colors.yellow}šŸ” Health:\${colors.reset} \${colors.cyan}http://localhost:\${PORT}/health\${colors.reset} \${colors.green}│\${colors.reset} \${colors.yellow}šŸ†” Process ID:\${colors.reset} \${colors.blue}\${process.pid}\${colors.reset} \${colors.green}│\${colors.reset} \${colors.yellow}šŸ’¾ Memory:\${colors.reset} \${colors.red}\${Math.round(process.memoryUsage().heapUsed / 1024 / 1024)}MB\${colors.reset} \${colors.green}│\${colors.reset} \${colors.yellow}ā±ļø Startup:\${colors.reset} \${colors.green}\${process.uptime().toFixed(2)}s\${colors.reset} \${colors.green}│\${colors.reset} \${colors.yellow}šŸ“¦ Node.js:\${colors.reset} \${colors.blue}\${process.version}\${colors.reset} \${colors.green}ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜\${colors.reset} \${colors.dim}ā”Œā”€ HALE'S EXPRESS SCAFFOLD ────────────────────────────────────┐ │ šŸŽÆ High-performance Express.js application framework │ │ šŸ›”ļø Built-in security, error handling & monitoring │ │ šŸš€ Generated with express-hale CLI by Hale │ │ šŸ“š Documentation: https://github.com/GaoWenHan/Express-Hale │ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜\${colors.reset} \${colors.green}\${colors.bright}šŸŽ‰ Ready to handle requests! Happy coding! šŸŽ‰\${colors.reset} \`); }); // Setup graceful shutdown setupGracefulShutdown(server); export default app;`; } else { return `const express = require('express'); const cors = require('cors'); const helmet = require('helmet'); const morgan = require('morgan'); const dotenv = require('dotenv'); const routes = require('./routes'); const { errorHandler, notFoundHandler } = require('./middleware/error-handler'); const { setupGracefulShutdown } = require('./utils/graceful-shutdown'); ${config.databases.includes('mysql') ? "require('./config/mysql');" : ''} ${config.databases.includes('mongodb') ? "require('./config/mongodb');" : ''} ${config.databases.includes('redis') ? "require('./config/redis');" : ''} dotenv.config(); const app = express(); const PORT = process.env.PORT || 3000; // Middleware app.use(helmet()); app.use(cors()); app.use(morgan('combined')); app.use(express.json({ limit: '10mb' })); app.use(express.urlencoded({ extended: true, limit: '10mb' })); // Enhanced request logging middleware with bright colors app.use((req, res, next) => { const start = Date.now(); const originalSend = res.send; res.send = function (body) { const duration = Date.now() - start; const timestamp = new Date().toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai', year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false }); // Enhanced color system with bright colors const colors = { reset: '\\x1b[0m', bold: '\\x1b[1m', dim: '\\x1b[2m', bright: '\\x1b[1m', // Bright colors for better visibility brightRed: '\\x1b[91m', brightGreen: '\\x1b[92m', brightYellow: '\\x1b[93m', brightBlue: '\\x1b[94m', brightMagenta: '\\x1b[95m', brightCyan: '\\x1b[96m', brightWhite: '\\x1b[97m', // Background colors for emphasis bgRed: '\\x1b[41m', bgGreen: '\\x1b[42m', bgYellow: '\\x1b[43m', bgBlue: '\\x1b[44m', bgMagenta: '\\x1b[45m', bgCyan: '\\x1b[46m' }; // Status code color mapping with bright colors const getStatusColor = (status) => { if (status >= 200 && status < 300) return colors.brightGreen + colors.bold; // Bright Green + Bold if (status >= 300 && status < 400) return colors.brightYellow + colors.bold; // Bright Yellow + Bold if (status >= 400 && status < 500) return colors.brightRed + colors.bold; // Bright Red + Bold if (status >= 500) return colors.bgRed + colors.brightWhite + colors.bold; // Red background + White text return colors.brightWhite + colors.bold; // Bright White + Bold }; // Method color mapping with bright colors const getMethodColor = (method) => { switch (method) { case 'GET': return colors.brightGreen + colors.bold; // Bright Green + Bold case 'POST': return colors.brightBlue + colors.bold; // Bright Blue + Bold case 'PUT': return colors.brightYellow + colors.bold; // Bright Yellow + Bold case 'DELETE': return colors.brightRed + colors.bold; // Bright Red + Bold case 'PATCH': return colors.brightCyan + colors.bold; // Bright Cyan + Bold case 'OPTIONS': return colors.brightMagenta + colors.bold; // Bright Magenta + Bold default: return colors.brightWhite + colors.bold; // Bright White + Bold } }; // Duration color mapping with bright colors and backgrounds const getDurationColor = (duration) => { if (duration < 50) return colors.brightGreen + colors.bold; // Very fast - Bright Green if (duration < 100) return colors.brightCyan + colors.bold; // Fast - Bright Cyan if (duration < 300) return colors.brightYellow + colors.bold; // Medium - Bright Yellow if (duration < 1000) return colors.brightRed + colors.bold; // Slow - Bright Red return colors.bgRed + colors.brightWhite + colors.bold; // Very slow - Red background }; // Size color mapping const getSizeColor = (size) => { if (size < 1024) return colors.brightGreen + colors.bold; // < 1KB - Green if (size < 10240) return colors.brightCyan + colors.bold; // < 10KB - Cyan if (size < 102400) return colors.brightYellow + colors.bold; // < 100KB - Yellow return colors.brightRed + colors.bold; // > 100KB - Red }; const reset = colors.reset; const bold = colors.bold; const dim = colors.dim; // Get client info const userAgent = req.get('User-Agent') || 'Unknown'; const clientIP = req.ip || req.connection.remoteAddress || 'Unknown'; const contentLength = body ? Buffer.byteLength(body) : 0; console.log(\` \${colors.brightCyan}\${bold}ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€\${reset} \${colors.brightCyan}\${bold}│ 🌐 HTTP REQUEST LOG\${reset} \${colors.brightCyan}\${bold}ā”œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€\${reset} \${colors.brightWhite}\${bold}│ ā° Time:\${reset} \${colors.brightYellow}\${bold}\${timestamp}\${reset} \${colors.brightWhite}\${bold}│ šŸ”— Method:\${reset} \${getMethodColor(req.method)}\${req.method}\${reset} \${colors.brightWhite}\${bold}│ šŸ“ Path:\${reset} \${colors.brightCyan}\${bold}\${req.originalUrl || req.path}\${reset} \${colors.brightWhite}\${bold}│ šŸ“Š Status:\${reset} \${getStatusColor(res.statusCode)}\${res.statusCode}\${reset} \${colors.brightWhite}\${bold}│ ⚔ Duration:\${reset} \${getDurationColor(duration)}\${duration}ms\${reset} \${colors.brightWhite}\${bold}│ šŸ“¦ Size:\${reset} \${getSizeColor(contentLength)}\${contentLength} bytes\${reset} \${colors.brightWhite}\${bold}│ šŸŒ Client:\${reset} \${colors.brightMagenta}\${bold}\${clientIP}\${reset} \${colors.brightWhite}\${bold}│ šŸ”§ Agent:\${reset} \${colors.brightBlue}\${bold}\${userAgent.substring(0, 60)}\${userAgent.length > 60 ? '...' : ''}\${reset} \${colors.brightCyan}\${bold}└─────────────────────────────────────────────────────────────────────────────────\${reset} \`); return originalSend.call(this, body); }; next(); }); // Routes app.use('/api', routes); // Health check endpoint app.get('/health', (req, res) => { res.status(200).json({ status: 'OK', timestamp: new Date().toISOString(), uptime: process.uptime(), memory: process.memoryUsage(), version: process.env.npm_package_version || '1.0.0', }); }); // 404 handler app.use(notFoundHandler); // Error handling middleware (must be last) app.use(errorHandler); const server = app.listen(PORT, () => { // Hale's Express Scaffold - Premium Startup Banner const colors = { reset: '\\x1b[0m', bright: '\\x1b[1m', dim: '\\x1b[2m', red: '\\x1b[31m', green: '\\x1b[32m', yellow: '\\x1b[33m', blue: '\\x1b[34m', magenta: '\\x1b[35m', cyan: '\\x1b[36m', white: '\\x1b[37m', bgBlue: '\\x1b[44m', bgMagenta: '\\x1b[45m' }; console.log(\` \${colors.bright} \${colors.red} ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•—\${colors.yellow}ā–ˆā–ˆā•— ā–ˆā–ˆā•—\${colors.green}ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•— \${colors.cyan}ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•— \${colors.blue}ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•—\${colors.magenta}ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•—\${colors.red}ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•— \${colors.cyan}šŸš€ HALE'S FRAMEWORK šŸš€ \${colors.red} ā–ˆā–ˆā•”ā•ā•ā•ā•ā•\${colors.yellow}ā•šā–ˆā–ˆā•—ā–ˆā–ˆā•”ā•\${colors.green}ā–ˆā–ˆā•”ā•ā•ā–ˆā–ˆā•—\${colors.cyan}ā–ˆā–ˆā•”ā•ā•ā–ˆā–ˆā•—\${colors.blue}ā–ˆā–ˆā•”ā•ā•ā•ā•ā•\${colors.magenta}ā–ˆā–ˆā•”ā•ā•ā•ā•ā•\${colors.red}ā–ˆā–ˆā•”ā•ā•ā•ā•ā• \${colors.dim}ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” \${colors.red} ā–ˆā–ˆā–ˆā–ˆā–ˆā•— \${colors.yellow} ā•šā–ˆā–ˆā–ˆā•”ā• \${colors.green}ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•”ā•\${colors.cyan}ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•”ā•\${colors.blue}ā–ˆā–ˆā–ˆā–ˆā–ˆā•— \${colors.magenta}ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•—\${colors.red}ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•— \${colors.dim}│ \${colors.white}Modern Express Scaffold \${colors.dim}│ \${colors.red} ā–ˆā–ˆā•”ā•ā•ā• \${colors.yellow} ā–ˆā–ˆā•”ā–ˆā–ˆā•— \${colors.green}ā–ˆā–ˆā•”ā•ā•ā•ā• \${colors.cyan}ā–ˆā–ˆā•”ā•ā•ā–ˆā–ˆā•—\${colors.blue}ā–ˆā–ˆā•”ā•ā•ā• \${colors.magenta}ā•šā•ā•ā•ā•ā–ˆā–ˆā•‘\${colors.red}ā•šā•ā•ā•ā•ā–ˆā–ˆā•‘ \${colors.dim}│ \${colors.white}High Performance CLI \${colors.dim}│ \${colors.red} ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•—\${colors.yellow}ā–ˆā–ˆā•”ā• ā–ˆā–ˆā•—\${colors.green}ā–ˆā–ˆā•‘ \${colors.cyan}ā–ˆā–ˆā•‘ ā–ˆā–ˆā•‘\${colors.blue}ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•—\${colors.magenta}ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•‘\${colors.red}ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•‘ \${colors.dim}│ \${colors.white}Built with ā¤ļø by Hale \${colors.dim}│ \${colors.red} ā•šā•ā•ā•ā•ā•ā•ā•\${colors.yellow}ā•šā•ā• ā•šā•ā•\${colors.green}ā•šā•ā• \${colors.cyan}ā•šā•ā• ā•šā•ā•\${colors.blue}ā•šā•ā•ā•ā•ā•ā•ā•\${colors.magenta}ā•šā•ā•ā•ā•ā•ā•ā•\${colors.red}ā•šā•ā•ā•ā•ā•ā•ā• \${colors.dim}ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ \${colors.reset} \${colors.magenta}\${colors.bright} ╔═══════════════════════════════════════════════════════════╗ ā•‘ šŸš€ CRAFTED BY HALE šŸš€ ā•‘ ā•‘ Modern Express.js Scaffold Framework ā•‘ ā•‘ express-hale CLI Generator ā•‘ ā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•\${colors.reset} \${colors.green}\${colors.bright}ā”Œā”€ SERVER INFORMATION ─────────────────────────────────────────┐\${colors.reset} \${colors.green}│\${colors.reset} \${colors.yellow}šŸš€ Status:\${colors.reset} \${colors.green}\${colors.bright}Application started successfully!\${colors.reset} \${colors.green}│\${colors.reset} \${colors.yellow}šŸ“… Started:\${colors.reset} \${new Date().toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' })} \${colors.green}│\${colors.reset} \${colors.yellow}🌐 Server:\${colors.reset} \${colors.cyan}http://localhost:\${PORT}\${colors.reset} \${colors.green}│\${colors.reset} \${colors.yellow}šŸŒ Environment:\${colors.reset} \${colors.magenta}\${process.env.NODE_ENV || 'development'}\${colors.reset} \${colors.green}│\${colors.reset} \${colors.yellow}šŸ” Health:\${colors.reset} \${colors.cyan}http://localhost:\${PORT}/health\${colors.reset} \${colors.green}│\${colors.reset} \${colors.yellow}šŸ†” Process ID:\${colors.reset} \${colors.blue}\${process.pid}\${colors.reset} \${colors.green}│\${colors.reset} \${colors.yellow}šŸ’¾ Memory:\${colors.reset} \${colors.red}\${Math.round(process.memoryUsage().heapUsed / 1024 / 1024)}MB\${colors.reset} \${colors.green}│\${colors.reset} \${colors.yellow}ā±ļø Startup:\${colors.reset} \${colors.green}\${process.uptime().toFixed(2)}s\${colors.reset} \${colors.green}│\${colors.reset} \${colors.yellow}šŸ“¦ Node.js:\${colors.reset} \${colors.blue}\${process.version}\${colors.reset} \${colors.green}ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜\${colors.reset} \${colors.dim}ā”Œā”€ HALE'S EXPRESS SCAFFOLD ────────────────────────────────────┐ │ šŸŽÆ High-performance Express.js application framework │ │ šŸ›”ļø Built-in security, error handling & monitoring │ │ šŸš€ Generated with express-hale CLI by Hale │ │ šŸ“š Documentation: https://github.com/GaoWenHan/Express-Hale │ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜\${colors.reset} \${colors.green}\${colors.bright}šŸŽ‰ Ready to handle requests! Happy coding! šŸŽ‰\${colors.reset} \`); }); // Setup graceful shutdown setupGracefulShutdown(server); module.exports = app;`; } } renderRouteFile(data) { const { config } = data; if (config.language === 'typescript') { return `import { Router, Request, Response } from 'express'; import { asyncHandler } from '../middleware/error-handler'; const router: Router = Router(); // Example API routes with error handling router.get( '/users', asyncHandler(async (req: Request, res: Response) => { // Simulate async operation const users = await Promise.resolve([ { id: 1, name: 'John Doe', email: 'john@example.com' }, { id: 2, name: 'Jane Smith', email: 'jane@example.com' }, ]); res.status(200).json({ status: 'success', data: { users }, count: users.length, }); }) ); router.post( '/users', asyncHandler(async (req: Request, res: Response) => { const { name, email } = req.body; // Basic validation if (!name || !email) { res.status(400).json({ status: 'fail', message: 'Name and email are required', }); return; } // Simulate user creation const newUser = { id: Date.now(), name, email, createdAt: new Date().toISOString(), }; res.status(201).json({ status: 'success', data: { user: newUser }, message: 'User created successfully', }); }) ); // Example route with intentional error for testing router.get('/error-test', asyncHandler(async () => { // This will be caught by the error handler throw new Error('This is a test error for demonstration'); })); export default router;`; } else { return `const { Router } = require('express'); const { asyncHandler } = require('../middleware/error-handler'); const router = Router(); // Example API routes with error handling router.get('/users', asyncHandler(async (req, res) => { // Simulate async operation const users = await Promise.resolve([ { id: 1, name: 'John Doe', email: 'john@example.com' }, { id: 2, name: 'Jane Smith', email: 'jane@example.com' } ]); res.status(200).json({ status: 'success', data: { users }, count: users.length }); })); router.post('/users', asyncHandler(async (req, res) => { const { name, email } = req.body; // Basic validation if (!name || !email) { res.status(400).json({ status: 'fail', message: 'Name and email are required' }); return; } // Simulate user creation const newUser = { id: Date.now(), name, email, createdAt: new Date().toISOString() }; res.status(201).json({ status: 'success', data: { user: newUser }, message: 'User created successfully' }); })); // Example route with intentional error for testing router.get('/error-test', asyncHandler(async () => { // This will be caught by the error handler throw new Error('This is a test error for demonstration'); })); module.exports = router;`; } } renderControllerFile(data) { const { config } = data; if (config.language === 'typescript') { return `import { Request, Response } from 'express'; export const healthController = { getHealth: (req: Request, res: Response) => { res.status(200).json({ status: 'OK', message: 'Service is healthy', timestamp: new Date().toISOString(), uptime: process.uptime(), version: '1.0.0' }); } };`; } else { return `const healthController = { getHealth: (req, res) => { res.status(200).json({ status: 'OK', message: 'Service is healthy', timestamp: new Date().toISOString(), uptime: process.uptime(), version: '1.0.0' }); } }; module.exports = { healthController };`; } } } exports.AppTemplates = AppTemplates; //# sourceMappingURL=app-templates.js.map