@@ -8,34 +8,34 @@ namespace node {
88using v8::NewStringType;
99using v8::String;
1010
11- std::optional <std::string> Dotenv::GetPathFromArgs (
11+ std::vector <std::string> Dotenv::GetPathFromArgs (
1212 const std::vector<std::string>& args) {
13- std::string_view flag = " --env-file" ;
14- // Match the last `--env-file`
15- // This is required to imitate the default behavior of Node.js CLI argument
16- // matching.
17- auto path =
18- std::find_if (args.rbegin (), args.rend (), [&flag](const std::string& arg) {
19- return strncmp (arg.c_str (), flag.data (), flag.size ()) == 0 ;
20- });
21-
22- if (path == args.rend ()) {
23- return std::nullopt ;
24- }
25-
26- auto equal_char = path->find (' =' );
27-
28- if (equal_char != std::string::npos) {
29- return path->substr (equal_char + 1 );
30- }
31-
32- auto next_arg = std::prev (path);
13+ const auto find_match = [](const std::string& arg) {
14+ const std::string_view flag = " --env-file" ;
15+ return strncmp (arg.c_str (), flag.data (), flag.size ()) == 0 ;
16+ };
17+ std::vector<std::string> paths;
18+ auto path = std::find_if (args.begin (), args.end (), find_match);
19+
20+ while (path != args.end ()) {
21+ auto equal_char = path->find (' =' );
22+
23+ if (equal_char != std::string::npos) {
24+ paths.push_back (path->substr (equal_char + 1 ));
25+ } else {
26+ auto next_path = std::next (path);
27+
28+ if (next_path == args.end ()) {
29+ return paths;
30+ }
31+
32+ paths.push_back (*next_path);
33+ }
3334
34- if (next_arg == args.rend ()) {
35- return std::nullopt ;
35+ path = std::find_if (++path, args.end (), find_match);
3636 }
3737
38- return *next_arg ;
38+ return paths ;
3939}
4040
4141void Dotenv::SetEnvironment (node::Environment* env) {
@@ -163,7 +163,7 @@ void Dotenv::ParseLine(const std::string_view line) {
163163 value.erase (value.size () - 1 );
164164 }
165165
166- store_.emplace ( key, value);
166+ store_.insert_or_assign ( std::string ( key) , value);
167167}
168168
169169} // namespace node
0 commit comments