11import { DynamicModule , Module } from '@nestjs/common' ;
22import { FactoryProvider } from '@nestjs/common/interfaces' ;
33import { isObject } from '@nestjs/common/utils/shared.utils' ;
4- import * as dotenv from 'dotenv' ;
54import { DotenvExpandOptions , expand } from 'dotenv-expand' ;
65import * as fs from 'fs' ;
76import { resolve } from 'path' ;
@@ -15,10 +14,11 @@ import {
1514} from './config.constants' ;
1615import { ConfigService } from './config.service' ;
1716import { ConfigFactory , ConfigModuleOptions } from './interfaces' ;
18- import { ConfigFactoryKeyHost } from './utils' ;
17+ import { ConfigFactoryKeyHost , getDefaultParser } from './utils' ;
1918import { createConfigProvider } from './utils/create-config-factory.util' ;
2019import { getRegistrationToken } from './utils/get-registration-token.util' ;
2120import { mergeConfigObject } from './utils/merge-configs.util' ;
21+ import { Parser } from './types' ;
2222
2323/**
2424 * @publicApi
@@ -35,7 +35,7 @@ import { mergeConfigObject } from './utils/merge-configs.util';
3535} )
3636export class ConfigModule {
3737 /**
38- * This promise resolves when "dotenv" completes loading environment variables.
38+ * This promise resolves when parser completes loading environment variables.
3939 * When "ignoreEnvFile" is set to true, then it will resolve immediately after the
4040 * "ConfigModule#forRoot" method is called.
4141 */
@@ -59,11 +59,12 @@ export class ConfigModule {
5959 const envFilePaths = Array . isArray ( options . envFilePath )
6060 ? options . envFilePath
6161 : [ options . envFilePath || resolve ( process . cwd ( ) , '.env' ) ] ;
62+ const parser = options . parser ?? getDefaultParser ( ) ;
6263
6364 let validatedEnvConfig : Record < string , any > | undefined = undefined ;
6465 let config = options . ignoreEnvFile
6566 ? { }
66- : this . loadEnvFile ( envFilePaths , options ) ;
67+ : this . loadEnvFile ( envFilePaths , parser , options ) ;
6768
6869 if ( ! options . ignoreEnvVars && options . validatePredefined !== false ) {
6970 config = {
@@ -111,6 +112,7 @@ export class ConfigModule {
111112 }
112113
113114 configService . setEnvFilePaths ( envFilePaths ) ;
115+ configService . setParser ( parser ) ;
114116 return configService ;
115117 } ,
116118 inject : [ CONFIGURATION_SERVICE_TOKEN , ...configProviderTokens ] ,
@@ -190,15 +192,13 @@ export class ConfigModule {
190192
191193 private static loadEnvFile (
192194 envFilePaths : string [ ] ,
195+ parser : Parser ,
193196 options : ConfigModuleOptions ,
194197 ) : Record < string , any > {
195- let config : ReturnType < typeof dotenv . parse > = { } ;
198+ let config : Record < string , any > = { } ;
196199 for ( const envFilePath of envFilePaths ) {
197200 if ( fs . existsSync ( envFilePath ) ) {
198- config = Object . assign (
199- dotenv . parse ( fs . readFileSync ( envFilePath ) ) ,
200- config ,
201- ) ;
201+ config = Object . assign ( parser ( fs . readFileSync ( envFilePath ) ) , config ) ;
202202 if ( options . expandVariables ) {
203203 const expandOptions : DotenvExpandOptions =
204204 typeof options . expandVariables === 'object'
0 commit comments