Skip to content

CheckerEnvKeys ​

Проверяет совпадение нескольких списков ключей и дубликаты внутри них. Для безопасности чекер не читает файлы сам, их парсинг остается за пользователем.

Для watch-режима env-файлы должны находиться внутри rootDir. Передавайте ключи через геттер envKeys, как в примерах: массив, созданный один раз, не обновится.

ts
envKeys: Array<{ 
  name: string; 
  keys: Array<string> 
}>

Массив объектов, каждый из которых содержит:

name — имя набора ключей (чаще всего удобно использовать имя файла)

keys — массив строк с названиями переменных окружения (либо другой список ключей)

Пример: синхронизация env-файлов

Чекер сравнивает ключи в .env и .example.env и сообщает о расхождении

ts
new CheckerEnvKeys({
  get envKeys() {
    function readEnvKeys(fileName: string) {
      return {
        name: fileName,
        keys: Object.keys(parseEnv(fs.readFileSync(path.resolve(rootDir, fileName), 'utf8'))),
      };
    }

    return [readEnvKeys('.env'), readEnvKeys('.example.env')];
  },
}),
Запустить Sandbox
USER: .env создан с содержимым:
text
NODE_ENV=development
EXPRESS_PORT=3000
USER: .example.env создан с содержимым:
env
NODE_ENV=development
EXPRESS_PORT=3000
ARFA Generator выводит логи:
txt
[ARFA-GEN] finished in 0ms

Пример: env-файлы и типизированный env-объект

Ключи файлов сравниваются с ключами готового env-объекта. Так чекер находит переменные, объявленные в коде, но забытые в env-файлах

ts
new CheckerEnvKeys({
  get envKeys() {
    function readEnvKeys(fileName: string) {
      return {
        name: fileName,
        keys: Object.keys(parseEnv(fs.readFileSync(path.resolve(rootDir, fileName), 'utf8'))),
      };
    }

    class Env {
      NODE_ENV: 'development' | 'production' = 'development';
      EXPRESS_PORT = 0;
      HOT_RELOAD = false;

      constructor(source: Record<string, string | undefined>) {
        this.NODE_ENV = source.NODE_ENV === 'production' ? 'production' : 'development';
        this.EXPRESS_PORT = Number(source.EXPRESS_PORT ?? 0);
        this.HOT_RELOAD = source.HOT_RELOAD === 'true';
      }
    }

    const env = new Env(process.env);

    return [
      readEnvKeys('.env'),
      readEnvKeys('example.dev.env'),
      readEnvKeys('example.prod.env'),
      { name: 'parsed', keys: Object.keys(env) },
    ];
  },
}),
Запустить Sandbox
USER: .env создан с содержимым:
text
NODE_ENV=development
EXPRESS_PORT=3000
USER: example.dev.env создан с содержимым:
env
NODE_ENV=development
EXPRESS_PORT=3000
USER: example.prod.env создан с содержимым:
env
NODE_ENV=production
EXPRESS_PORT=8080
ARFA Generator выводит логи:
txt
[ARFA-GEN] [env-keys] Keys mismatch
[ARFA-GEN]   .env vs parsed: .env missing HOT_RELOAD
[ARFA-GEN] [env-keys] Keys mismatch
[ARFA-GEN]   example.dev.env vs parsed: example.dev.env missing HOT_RELOAD
[ARFA-GEN] [env-keys] Keys mismatch
[ARFA-GEN]   example.prod.env vs parsed: example.prod.env missing HOT_RELOAD
[ARFA-GEN] finished in 0ms

Пример: дубли ключей в env-файле

Для демонстрации дублей в данном случае используется построчное чтение

ts
new CheckerEnvKeys({
  get envKeys() {
    const content = fs.readFileSync(path.resolve(rootDir, '.env'), 'utf8');

    return [
      {
        name: '.env',
        keys: content.split(/\r?\n/).flatMap((line) => Object.keys(parseEnv(line))),
      },
    ];
  },
}),
Запустить Sandbox
USER: .env создан с содержимым:
text
NODE_ENV=development
EXPRESS_PORT=3000
ARFA Generator выводит логи:
txt
[ARFA-GEN] finished in 0ms

MIT License