fenviee — простая и типобезопасная утилита для работы с переменными окружения в Node.js.
Позволяет декларативно описывать структуру process.env, разделяя переменные на обязательные, необязательные и «уникальные» (с валидацией и приведением типов). На выходе вы получаете единый типизированный объект конфигурации.
npm install fenvieeПри работе с process.env в TypeScript часто приходится вручную проверять наличие ключей, приводить типы и обрабатывать ошибки.
fenviee берёт эти задачи на себя:
- Чёткое разделение переменных по категориям.
- Автоматическая проверка обязательных ключей.
- Возможность задать значения по умолчанию для необязательных.
- Валидация и трансформация значений с помощью пользовательских функций.
- Единый механизм сбора ошибок.
- Полная типизация выходного объекта.
Ключи, которые обязаны присутствовать в process.env. Если хотя бы одного нет — выбрасывается исключение.
Ключи, которые могут отсутствовать. Для них можно указать значение по умолчанию в поле default. Если ключ отсутствует и нет значения по умолчанию — это считается ошибкой.
Ключи, значения которых проходят пользовательскую валидацию и преобразование. Для каждого такого ключа вы задаёте функцию-валидатор, которая получает строку из process.env (или undefined) и возвращает значение нужного типа.
Важно: уникальные ключи не нужно дублировать в required или partial — они обрабатываются отдельно и их имена могут не пересекаться с другими категориями.
import { Env } from "fenviee";
// Создаём конфигурацию
const config = Env.create(process.env)({
required: ["NODE_ENV", "PORT"] as const,
partial: ["LOG_LEVEL"] as const,
default: {
LOG_LEVEL: "info",
},
unique: {
// Пример валидации числа
MAX_CONNECTIONS: (value) => {
const num = Number(value);
if (isNaN(num) || num <= 0)
throw new Error("MAX_CONNECTIONS must be a positive number");
return num;
},
},
});
console.log(config);
// {
// NODE_ENV: 'development',
// PORT: '3000',
// LOG_LEVEL: 'info',
// MAX_CONNECTIONS: 100
// }Если хотя бы одна переменная не проходит проверку, Env.create выбросит исключение с агрегированным сообщением:
Environment configuration failed:
Key NODE_ENV is not defined in env
MAX_CONNECTIONS must be a positive number
Это позволяет перехватить ошибку на старте приложения и корректно завершить работу или вывести диагностику.
Метод transform (доступен статически) позволяет гибко обрабатывать произвольные наборы ключей. Обычно он используется внутри библиотеки, но может пригодиться и для собственных целей.
const { data, errors } = Env.transform({
properties: ["API_URL", "TIMEOUT"] as const,
env: process.env,
propertyTransformer: (key) => `APP_${key}`,
valueTransformer: (value, key) => value ?? "default",
errorTransformer: ({ error }) => error,
});Библиотека предоставляет набор готовых трансформеров для наиболее частых случаев. Все они находятся в пространстве имён EnvValidators (или импортируются напрямую).
import { Env, isNumber, isBoolean, isUrl, isArray } from "fenviee";
const config = Env.create(process.env)({
required: ["APP_NAME"],
partial: ["LOG_LEVEL"],
default: { LOG_LEVEL: "info" },
unique: {
PORT: isPort, // число от 1 до 65535
DB_POOL_SIZE: isIntegerInRange(1, 100), // целое число в диапазоне
ENABLE_CACHE: isBoolean, // true/false
API_BASE_URL: isUrl, // валидный URL
CORS_ORIGINS: isArray(","), // массив строк через запятую
CONFIG_JSON: isJSON<{ key: string }>, // парсинг JSON
},
});| Функция | Описание | Возвращаемый тип |
|---|---|---|
isString |
Значение должно быть определено, возвращает строку | string |
isNumber |
Преобразует в число (целое или дробное) | number |
isInteger |
Преобразует в целое число | number |
isBoolean |
Принимает 'true'/'false'/'1'/'0' (регистр не важен) | boolean |
isUrl |
Проверяет, что строка является валидным URL | string |
isPort |
Проверяет, что число является портом (1–65535) | number |
isEmail |
Простая проверка email | string |
isJSON |
Парсит строку как JSON | T (параметризуется) |
isArray(separator?) |
Разделяет строку по разделителю, возвращает массив непустых строк | string[] |
isNumberInRange(min, max) |
Проверяет, что число в диапазоне | number |
isIntegerInRange(min, max) |
Проверяет, что целое число в диапазоне | number |
Все валидаторы выбрасывают ошибку с понятным сообщением, если значение не проходит проверку. Эти ошибки автоматически собираются и агрегируются при вызове Env.create.
Статический метод, принимающий объект окружения (обычно process.env).
Возвращает функцию, которая ожидает параметры инициализации и сразу возвращает результат execute().
const getConfig = Env.create(process.env);
const config = getConfig({ required: [...], partial: [...], default: {...}, unique: {...} });| Поле | Тип | Описание |
|---|---|---|
required |
readonly string[] |
Список обязательных ключей. |
partial |
readonly string[] |
Список необязательных ключей. |
unique |
Record<string, (value?: string) => T> |
Объект с валидаторами. Каждый валидатор получает значение из env и возвращает произвольный тип. |
default |
Record<string, string> |
Значения по умолчанию для ключей из partial. Ключи должны совпадать. |
Тип возвращаемого объекта вычисляется автоматически:
- Для
required— строки (значения изprocess.env). - Для
partial— строки (либо из env, либо изdefault). - Для
unique— типы, возвращаемые соответствующими валидаторами.
Все ключи объединяются в один объект (пересечение типов). Если один и тот же ключ указан в нескольких категориях, поведение не определено — старайтесь избегать пересечений.
Библиотека экспортирует все используемые типы для удобства:
EnvProperties—readonly string[]SomeRecord—Record<string, unknown>Validators<T>— тип валидаторов для unique-переменных.EnvInitializeData<...>— тип параметров инициализации.FormatterParameters<...>— параметры для методаtransform.UnionToIntersection<Type>— утилита для преобразования объединений в пересечения.
Пример импорта типа:
import type { EnvInitializeData } from "fenviee";MIT © FOCKUSTY