Как стать автором
Обновить

Комментарии 8

В readme у Zod есть раздел "Ecosystem", там можнон найти неплохой пакет для валидации ENV - znv. Да и в целом много интересных пакетов :)

В целом — да, спасибо)
Описанное в статье решение позволяет работать с несколькими источниками сразу. Это было одним из критериев для нашего проекта. Наверное, стоило более явно указать это в статье)

Как правило, в проекте создается не только .env, но еще и example.dev.env и example.prod.env. Также нужно проверить, что в этих файлах есть все параметры, которые прописаны в ts-типах. Иначе будет частой ситуация, когда добавляется локальный ключ в .env, а в примерах не добавлен, и внезапно на компе другого разработчика проект не запустится (реальная и ооочень частая история). Вот пример, как можно это дело решить https://github.com/dkazakov8/dk-framework/tree/master/packages/compare-env

А для того, что описано в статье, обычно пишу простую утилиту. Можно и Zod прикрутить, но ни разу еще не было необходимости передавать сложные структуры.

class Env {
  constructor(params: Record<keyof Env, unknown>) {
    Object.entries(params).forEach(([envKey, envValue]) => {
      const paramType = typeof this[envKey];

      if (paramType === 'boolean') {
        this[envKey] = envValue === true || envValue === 'true';
      } else if (paramType === 'string') {
        this[envKey] = (envValue || '').replace(/"/g, '').trim();
      } else if (paramType === 'number') {
        this[envKey] = Number(envValue || 0);
      }
    });
  }

  SENTRY_URL = '';
  HOT_RELOAD = false;
  HOT_RELOAD_PORT = 0;
}

export const env = new Env(process.env as unknown as Env);

// another file
import { env } from '../env';

env.SENTRY_URL // perfectly typed

Как параметры попадают из .env в process.env - это на усмотрение разработчика, самое простое решение - импортнуть dotenv. Также в моем решении предусмотрены типобезопасные дефолтные значения на случай, если в .env не выставлено значение типа "SENTRY_URL=". Но в отличие от статьи нет жестких проверок на типы и выдачи соответствующих ошибок если значение в .env указано не того типа - в целом фича хорошая, но малополезная, пока не встречал случая, чтобы кто-то смог сделать такую ошибку.

Спасибо за статью, возможно мои решения позволят в чем-то улучшить и ваш подход)

Скажите, а зачем такие странные сложные функции в «хорошем» решении: зачем там выбрасывается Error без параметров, который тут же перехватывается и выбрасывается уже «правильный» Error с параметром? Почему сразу «правильный» не выбрасывается? Overengineering ради overengineering'а?

COMMENTED_REQUIRED_VALUE: z
    .string() // Проверяем строку
    .transform((val) => JSON.parse(val)) // Преобразуем в JSON

скорее, пробуем преобразовать в js-объект из возможной json-строки

Спасибо!

НЛО прилетело и опубликовало эту надпись здесь

Если я не ошибаюсь, это дефолтная тема в новой версии webstorm

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации