@@ -51,23 +51,50 @@ class DotEnv {
5151
5252 /// Loads environment variables from the env file into a map
5353 /// Merge with any entries defined in [mergeWith]
54- Future <void > load (
55- {String fileName = '.env' , Parser parser = const Parser (), Map <String , String > mergeWith = const {}}) async {
54+ /// [overrideWith] is a list of other env files whose values will override values
55+ /// read from [fileName]
56+ Future <void > load ({
57+ String fileName = '.env' ,
58+ Parser parser = const Parser (),
59+ Map <String , String > mergeWith = const {},
60+ List <String > overrideWith = const [],
61+ }) async {
5662 clean ();
5763 final linesFromFile = await _getEntriesFromFile (fileName);
58- final linesFromMergeWith = mergeWith.entries.map ((entry) => "${entry .key }=${entry .value }" ).toList ();
59- final allLines = linesFromMergeWith..addAll (linesFromFile);
64+ final linesFromOverrides = await _getLinesFromOverride (overrideWith);
65+
66+ final linesFromMergeWith = mergeWith.entries
67+ .map ((entry) => "${entry .key }=${entry .value }" )
68+ .toList ();
69+ final allLines = linesFromMergeWith
70+ ..addAll (linesFromOverrides)
71+ ..addAll (linesFromFile);
72+
6073 final envEntries = parser.parse (allLines);
6174 _envMap.addAll (envEntries);
6275 _isInitialized = true ;
6376 }
6477
65- Future <void > testLoad (
66- {String fileInput = '' , Parser parser = const Parser (), Map <String , String > mergeWith = const {}}) async {
78+ Future <void > testLoad ({
79+ String fileInput = '' ,
80+ Parser parser = const Parser (),
81+ Map <String , String > mergeWith = const {},
82+ List <String > overrideWith = const [],
83+ }) async {
6784 clean ();
6885 final linesFromFile = fileInput.split ('\n ' );
69- final linesFromMergeWith = mergeWith.entries.map ((entry) => "${entry .key }=${entry .value }" ).toList ();
70- final allLines = linesFromMergeWith..addAll (linesFromFile);
86+
87+ final linesFromOverrides = overrideWith
88+ .map ((String lines) => lines.split ("\n " ))
89+ .expand ((x) => x)
90+ .toList ();
91+
92+ final linesFromMergeWith = mergeWith.entries
93+ .map ((entry) => "${entry .key }=${entry .value }" )
94+ .toList ();
95+ final allLines = linesFromMergeWith
96+ ..addAll (linesFromOverrides)
97+ ..addAll (linesFromFile);
7198 final envEntries = parser.parse (allLines);
7299 _envMap.addAll (envEntries);
73100 _isInitialized = true ;
@@ -76,7 +103,8 @@ class DotEnv {
76103 /// True if all supplied variables have nonempty value; false otherwise.
77104 /// Differs from [containsKey] (dart:core) by excluding null values.
78105 /// Note [load] should be called first.
79- bool isEveryDefined (Iterable <String > vars) => vars.every ((k) => _envMap[k]? .isNotEmpty ?? false );
106+ bool isEveryDefined (Iterable <String > vars) =>
107+ vars.every ((k) => _envMap[k]? .isNotEmpty ?? false );
80108
81109 Future <List <String >> _getEntriesFromFile (String filename) async {
82110 try {
@@ -90,4 +118,16 @@ class DotEnv {
90118 throw FileNotFoundError ();
91119 }
92120 }
121+
122+ Future <List <String >> _getLinesFromOverride (List <String > overrideWith) async {
123+ List <String > overrideLines = [];
124+
125+ for (int i = 0 ; i < overrideWith.length; i++ ) {
126+ final overrideWithFile = overrideWith[i];
127+ final lines = await _getEntriesFromFile (overrideWithFile);
128+ overrideLines = overrideLines..addAll (lines);
129+ }
130+
131+ return overrideLines;
132+ }
93133}
0 commit comments