|
| 1 | +import * as dotenv from 'dotenv'; |
| 2 | +import { plainToInstance } from 'class-transformer'; |
| 3 | +import { validateSync } from 'class-validator'; |
| 4 | +import { Logger } from '@nestjs/common'; |
| 5 | +import { ConfigEnv } from './config.env'; |
| 6 | + |
| 7 | +/** |
| 8 | + * Loads and validates environment variables into a `ConfigEnv` instance. |
| 9 | + * |
| 10 | + * This function uses `plainToInstance` to map environment variables from `process.env` |
| 11 | + * into a `ConfigEnv` class instance, enabling implicit conversion and exposing default values. |
| 12 | + * It then validates the resulting instance using `validateSync` to ensure all required |
| 13 | + * properties are present and conform to the expected constraints. |
| 14 | + * |
| 15 | + * If validation errors are found, they are logged using a `Logger` instance, and an error |
| 16 | + * is thrown to indicate invalid environment variables. |
| 17 | + * |
| 18 | + * @throws {Error} If any environment variables are invalid or missing. |
| 19 | + * @returns {ConfigEnv} A validated instance of the `ConfigEnv` class. |
| 20 | + */ |
| 21 | +function loadAndValidateEnv(): ConfigEnv { |
| 22 | + // eslint-disable-next-line no-restricted-syntax |
| 23 | + const env = plainToInstance(ConfigEnv, process.env, { |
| 24 | + enableImplicitConversion: true, |
| 25 | + exposeDefaultValues: true, |
| 26 | + }); |
| 27 | + |
| 28 | + const errors = validateSync(env, { |
| 29 | + skipMissingProperties: false, |
| 30 | + whitelist: true, |
| 31 | + }); |
| 32 | + |
| 33 | + if (errors.length > 0) { |
| 34 | + const logger = new Logger('Config'); |
| 35 | + for (const err of errors) { |
| 36 | + logger.error(JSON.stringify(err.constraints)); |
| 37 | + } |
| 38 | + throw new Error('Invalid environment variables'); |
| 39 | + } |
| 40 | + |
| 41 | + return env; |
| 42 | +} |
| 43 | + |
| 44 | +dotenv.config(); |
| 45 | +export const ENV_CONFIG = loadAndValidateEnv(); |
0 commit comments