Fockeror — типобезопасная фабрика ошибок для TypeScript. Позволяет определить набор предсказуемых, типизированных ошибок с автоматическими уникальными кодами, подстановкой значений в сообщения и интеграцией с любым фреймворком.
- 🔑 Уникальные коды – каждая ошибка получает код формата
base64url(префикс):hex(ключ:индекс) - 📝 Плейсхолдеры – динамические сообщения с синтаксисом
${{ placeholder }} - 🧩 Интеграция с фреймворками – подключите свой форматтер исключений (например,
HttpExceptionиз NestJS илиApiErrorиз Express) - 📦 Статические или динамические ошибки – используйте
error.exceptionдля статической ошибки илиerror.execute({ ... })для динамической подстановки - 🪵 Поддержка логгера – опциональный логгер для отладки и предупреждений о валидации
npm install fockerorimport { FockerorFactory } from "fockeror";
// 1. Определите свой форматтер исключений (пример для NestJS)
import { HttpException } from "@nestjs/common";
// 2. Создайте фабрику
const factory = new FockerorFactory(HttpException, console);
// 3. Определите шаблоны ошибок
const errors = factory.execute("AUTH", {
INVALID_TOKEN: {
message: "Неверный токен",
description: "Предоставленный токен повреждён или истёк",
status: 401,
},
USER_NOT_FOUND: {
message: "Пользователь ${{ userId }} не найден",
description: "Пользователь с id ${{ userId }} не существует",
status: 404,
},
});
// 4. Используйте их
// Статическая ошибка (без плейсхолдеров)
throw errors.INVALID_TOKEN.exception;
// Динамическая ошибка с подстановкой значений
throw errors.USER_NOT_FOUND.execute({ userId: "123" });- Никаких «магических» строк – ошибки типизированы и поддерживают автодополнение.
- Централизованное описание ошибок – храните все бизнес-ошибки в одном месте.
- Безопасная подстановка плейсхолдеров – если значение отсутствует, ошибка логируется, а сообщение не ломается.
- Не зависит от фреймворка – работает с Express, NestJS, Fastify или любой другой библиотекой.
formatterClass– класс для преобразования внутреннего исключенияExceptionв специфичный для фреймворка тип. Должен принимать параметры(response, status, options).logger– опциональный логгер, реализующий интерфейс{ error?: (err: Error) => unknown; execute?: (msg: string) => unknown }
prefix– строка для генерации уникального кода (будет преобразована в base64url)templates– объект, где ключи — имена ошибок, значения —ErrorTemplateInput
Возвращает объект с экземплярами Fockeror с теми же ключами, что и templates.
Возвращает статическое отформатированное исключение (плейсхолдеры не заменяются).
placeholders– объект с значениями для замены плейсхолдеровcause– опциональная ошибка-причина
Возвращает отформатированное исключение.
Немедленно выбрасывает отформатированное исключение.
type ErrorTemplateInput = {
message: string; // может содержать ${{ placeholder }}
description: string; // может содержать ${{ placeholder }}
status?: number; // HTTP статус (по умолчанию 500)
cause?: Error; // опциональная причина
options?: Record<string, unknown>; // дополнительные данные для форматтера
};Плейсхолдеры должны быть записаны как ${{ key }} ровно с одним пробелом внутри фигурных скобок.
Во время выполнения регулярное выражение допускает только один пробел, также для корректного вывода типов TypeScript требуется ровно один пробел.
✅ Привет, ${{ name }}
❌ Привет, ${{name}}
❌ Привет, ${{ name }}
const logger = {
error: (err: Error) => console.error(err.message),
execute: (msg: string) => console.debug(msg),
};
const factory = new FockerorFactory(MyFormatter, logger);Если при подстановке значения плейсхолдер отсутствует, логгер получит ошибку.
Класс форматтера получает три аргумента:
class MyFormatter {
constructor(
public readonly response: string | Record<string, unknown>,
public readonly status: number,
public readonly options?: { cause?: Error; description?: string },
) {}
}Каждая ошибка получает уникальный код в формате:
base64url(префикс):hex(имяОшибки:индекс)
Код автоматически добавляется в начало поля message.
Пример: QVVUSDo=:494e56414c49445f544f4b454e3a30 : Неверный токен
MIT