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
JavaScript
"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