Back to blog

Wednesday, August 6, 2025

PEST.js Framework Architecture

contain

PEST.js uses a modular architecture with focused components for project generation.

Note:

The framework is built with shell scripts for simplicity and cross-platform compatibility.

Framework Structure

pest.js/
├── core/
│   ├── cli/main.sh          # CLI interface
│   ├── generators/           # File generators
│   │   ├── package.sh       # Package.json generator
│   │   ├── config.sh        # Config files generator
│   │   └── app.sh           # App file generator
│   └── utils/helpers.sh     # Utility functions
└── pestjs                    # CLI entry point

CLI Interface

The main CLI (core/cli/main.sh) handles:

  • Environment validation
  • User input collection
  • Project structure creation
  • File generation orchestration
  • Git repository initialization
# CLI execution flow
./pestjs
├── validate_environment()
├── get_project_details()
├── create_structure()
├── generate_files()
└── init_git()

File Generators

Package Generator (core/generators/package.sh)

Creates package.json with minimal dependencies:

{
  "dependencies": {
    "express": "^4.18.2",
    "cors": "^2.8.5",
    "helmet": "^7.1.0",
    "dotenv": "^16.4.1"
  },
  "devDependencies": {
    "typescript": "^5.0.0",
    "jest": "^29.7.0",
    "eslint": "^8.56.0"
  }
}

Config Generator (core/generators/config.sh)

Generates essential configuration files:

  • tsconfig.json - TypeScript configuration
  • .eslintrc.json - ESLint rules
  • .gitignore - Git ignore patterns
  • .env - Environment variables

App Generator (core/generators/app.sh)

Creates the main Express application:

import express from 'express';
import cors from 'cors';
import helmet from 'helmet';

const app = express();

app.use(helmet());
app.use(cors());
app.use(express.json());

app.get('/', (_, res) => {
  res.json({
    message: 'Welcome to API',
    version: '1.0.0'
  });
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});

Utility Functions

The core/utils/helpers.sh provides:

  • Print functions with colors
  • Input validation
  • File and directory operations
  • Error handling

Design Decisions

Shell Scripts

  • Cross-platform: Works on Linux, macOS, Windows (WSL)
  • No dependencies: No Node.js required for framework itself
  • Fast execution: Direct file system operations
  • Simple maintenance: Easy to understand and modify

Modular Architecture

  • Separation of concerns: Each generator has a single responsibility
  • Reusability: Functions can be used across different generators
  • Maintainability: Easy to add new generators or modify existing ones

Minimal Dependencies

  • Express.js: Core web framework
  • TypeScript: Type safety
  • Jest: Testing
  • ESLint: Code quality
  • Essential packages only: No bloat or unnecessary dependencies

Generated Project Structure

your-project/
├── src/
│   ├── app.ts              # Main application
│   ├── config/             # Configuration
│   ├── features/           # Feature modules
│   ├── middleware/         # Custom middleware
│   ├── utils/              # Utilities
│   └── types/              # TypeScript types
├── tests/                  # Test files
├── package.json            # Dependencies
├── tsconfig.json           # TypeScript config
├── .eslintrc.json          # ESLint config
└── .env                    # Environment variables

Technical Specifications

  • Language: Bash shell scripts
  • Runtime: Node.js (for generated projects)
  • Framework: Express.js
  • Type Safety: TypeScript
  • Testing: Jest
  • Linting: ESLint
  • Package Manager: npm

Future Enhancements

  • Database integration options
  • Authentication templates
  • Additional testing frameworks
  • Deployment configurations
  • Custom middleware templates