Evo — современный TypeScript-фреймворк для создания структурированных, типобезопасных HTTP-сервисов без магии и внешних зависимостей.
Evo создан, чтобы дать полный контроль над архитектурой бэкенда.
Без скрытых абстракций, без зависимостей, без магии — всё явно и предсказуемо.
- 💡 Type-safe от начала до конца — строгая типизация для роутов, DTO, сервисов и контекста.
- ⚙️ Модульная структура — чёткое разделение ответственности (core, base, middleware, modules).
- 🧠 Предсказуемость — никакой «магии» как у крупных фреймворков, только чистый и понятный код.
- 🔍 Контроль — вся маршрутизация, валидация и ответы определяются вручную.
- 🧰 Гибкость — можно использовать как основу для REST API, CLI, сервисов или собственных инструментов.
logs/ # логи приложения
src/
├── config/ # конфигурационные файлы
├── core/ # ядро: базовые классы, типы, ошибки, middleware
│ ├── app/ # главный класс приложения
│ ├── base/ # базовые модули и контроллеры
│ ├── database/ # базы данных с которыми работает приложение с коробки
│ ├── errors/ # ошибки ядра
│ ├── exceptions/ # исключения уровня API
│ ├── logger/ # логгер
│ ├── middleware/ # стандартные middleware
│ ├── types/ # общие типы и интерфейсы
│ └── utils/ # вспомогательные утилиты
├── modules/ # прикладные модули (user, todo, etc.)
└── index.ts # точка входа приложения
# Клонировать репозиторий
git clone https://github.com/chyvacheck/evo.git
cd evo
# Установить зависимости
bun install
# Запустить dev-сервер
bun run devimport { ControllerModule } from '@core/base';
import { HttpStatusCode, SuccessResponse } from '@core/http';
import { HttpContext, PathParamsOf } from '@core/types/http';
import { UserService } from '@modules/user/User.service';
import { CreateUserRequest } from '@modules/user/request/CreateUser.dto';
export class UserController extends ControllerModule {
private service = UserService.getInstance();
/** GET /user/:id */
public async getOneUserById(
ctx: HttpContextValidated<
'/user/:id', // auto generate params from path
any, // Query
ValidatedParamsState<ObjectIdParamsRequest> // state
>
) {
this.info({
message: 'Request to get one user by id',
requestId: ctx.requestId,
details: {
id: ctx.state.validated.params.id
}
});
const resp = await this.service.getOneUserById({
requestId: ctx.requestId,
id: ctx.state.validated.params.id
});
const response = SuccessResponse.ok({
message: 'User found successfully',
details: { id: resp.getData()._id },
data: resp.getData()
});
ctx.reply.status(response.getStatusCode()).json(response.toJSON());
}
}- 🌐 RESTful API с поддержкой JSON
- 🔗 Централизованная маршрутизация с поддержкой вложенных маршрутов
- 🔨 Валидация входных данных с помощью
zod - 🔄 Централизованная обработка ошибок
- 🔒 Унифицированные ответы (
SuccessResponse,ErrorResponse) - 🧾 Типизированный контекст
HttpContextиHttpContextValidated - 🧩 Middleware-пайплайн (before / after / finally)
- 📦 Простая интеграция с MongoDB через
BaseMongoRepositoryиBaseMongoService - 🚀 CLI для генерации новых модулей (в разработке)
Проект распространяется под лицензией
Evo Non-Commercial License v1.0
Свободно использовать в образовательных, исследовательских и личных целях.
Коммерческое использование запрещено.
Все права принадлежат Dmytro Shakh.
Dmytro Shakh
💻 GitHub: @chyvacheck
📧 Email: dmytro.4or.dev@gmail.com
🧠 Framework: Evo