diff --git a/src/node_dotenv.cc b/src/node_dotenv.cc index b3275938684d6d..e1940904d1c039 100644 --- a/src/node_dotenv.cc +++ b/src/node_dotenv.cc @@ -9,8 +9,10 @@ namespace node { using v8::EscapableHandleScope; using v8::JustVoid; using v8::Local; +using v8::LocalVector; using v8::Maybe; using v8::MaybeLocal; +using v8::Name; using v8::Nothing; using v8::Object; using v8::String; @@ -86,20 +88,29 @@ Maybe Dotenv::SetEnvironment(node::Environment* env) { MaybeLocal Dotenv::ToObject(Environment* env) const { EscapableHandleScope scope(env->isolate()); - Local result = Object::New(env->isolate()); - Local name; - Local val; + LocalVector names(env->isolate(), store_.size()); + LocalVector values(env->isolate(), store_.size()); auto context = env->context(); + Local tmp; + + int n = 0; for (const auto& entry : store_) { - if (!ToV8Value(context, entry.first).ToLocal(&name) || - !ToV8Value(context, entry.second).ToLocal(&val) || - result->Set(context, name, val).IsNothing()) { + if (!ToV8Value(context, entry.first).ToLocal(&tmp)) { + return MaybeLocal(); + } + names[n] = tmp.As(); + if (!ToV8Value(context, entry.second).ToLocal(&tmp)) { return MaybeLocal(); } + values[n++] = tmp; } - + Local result = Object::New(env->isolate(), + Null(env->isolate()), + names.data(), + values.data(), + values.size()); return scope.Escape(result); } diff --git a/test/parallel/test-dotenv-edge-cases.js b/test/parallel/test-dotenv-edge-cases.js index 88b2fc6fca7cb7..084265e80a68a4 100644 --- a/test/parallel/test-dotenv-edge-cases.js +++ b/test/parallel/test-dotenv-edge-cases.js @@ -215,6 +215,7 @@ describe('.env supports edge cases', () => { ].join('\n')); assert.deepStrictEqual(result, { + __proto__: null, baz: 'whatever', VALID_AFTER_INVALID: 'test', ANOTHER_VALID: 'value', @@ -236,6 +237,7 @@ describe('.env supports edge cases', () => { ].join('\n')); assert.deepStrictEqual(result, { + __proto__: null, KEY_WITH_SPACES_BEFORE: 'value_with_spaces_before_and_after', KEY_WITH_TABS_BEFORE: 'value_with_tabs_before_and_after', KEY_WITH_SPACES_AND_TABS: 'value_with_spaces_and_tabs', @@ -255,6 +257,7 @@ describe('.env supports edge cases', () => { ].join('\n')); assert.deepStrictEqual(result, { + __proto__: null, KEY_WITH_COMMENT_IN_VALUE: 'value # this is a comment', }); }); diff --git a/test/parallel/test-util-parse-env.js b/test/parallel/test-util-parse-env.js index 80ab736dd38116..e932a31f683e28 100644 --- a/test/parallel/test-util-parse-env.js +++ b/test/parallel/test-util-parse-env.js @@ -10,7 +10,8 @@ const fs = require('node:fs'); const validEnvFilePath = fixtures.path('dotenv/valid.env'); const validContent = fs.readFileSync(validEnvFilePath, 'utf8'); - assert.deepStrictEqual(util.parseEnv(validContent), { + const checkObj = { + __proto__: null, A: 'B=C', B: 'C=D', AFTER_LINE: 'after_line', @@ -56,11 +57,14 @@ const fs = require('node:fs'); SPACED_KEY: 'parsed', SPACE_BEFORE_DOUBLE_QUOTES: 'space before double quotes', TRIM_SPACE_FROM_UNQUOTED: 'some spaced out string', - }); + }; + + assert.deepStrictEqual(util.parseEnv(validContent), checkObj); } -assert.deepStrictEqual(util.parseEnv(''), {}); -assert.deepStrictEqual(util.parseEnv('FOO=bar\nFOO=baz\n'), { FOO: 'baz' }); +assert.deepStrictEqual(util.parseEnv(''), { __proto__: null }); +assert.deepStrictEqual(util.parseEnv('FOO=bar\nFOO=baz\n'), + { __proto__: null, FOO: 'baz' }); // Test for invalid input. assert.throws(() => {