nodejs / node

Node.js JavaScript runtime ✨🐢🚀✨
https://nodejs.org
Other
104.27k stars 28.06k forks source link

comments in .env files are parsed as values #52759

Closed MarijnMensinga closed 2 weeks ago

MarijnMensinga commented 2 weeks ago

Version

20.12.0+, 21.0.0+, 22.0.0

Platform

Darwin XXX.local 23.4.0 Darwin Kernel Version 23.4.0: Fri Mar 15 00:10:42 PDT 2024; root:xnu-10063.101.17~1/RELEASE_ARM64_T6000 arm64

Subsystem

No response

What steps will reproduce the bug?

# .env

TEST_VAR=OK
# TEST_VAR=WRONG1
#TEST_VAR=WRONG2
# .env.local

#TEST_VAR=WRONG3
# index.js

console.log(process.env.TEST_VAR)

Run with single env file: nvm run 20.6.0 --env-file=.env index.js => OK nvm run 20.11.1 --env-file=.env index.js => OK nvm run 20.12.0 --env-file=.env index.js => WRONG2 nvm run 22.0.0 --env-file=.env index.js => WRONG2

Run with multiple env files: nvm run 20.11.1 --env-file=.env --env-file=.env.local index.js => OK nvm run 20.12.0 --env-file=.env --env-file=.env.local index.js => WRONG3 nvm run 22.0.0 --env-file=.env --env-file=.env.local index.js => WRONG3 Note: for simplicity I re-used the .env file, but using different files yields the same behaviour

How often does it reproduce? Is there a required condition?

Works as long as --env-file is present

What is the expected behavior? Why is that the expected behavior?

I expect only uncomment values in .env files to be parsed as actual values. So the output of the reproduction script should be "OK". This is in-line with every other .env parsing library. Also node v20.6.0 -> v20.11.1 behaves like that:

$ nvm run 20.6.0 --env-file=.env index.js  
Running node v20.6.0 (npm v9.8.1)
OK
$ nvm run 20.11.1 --env-file=.env index.js
Running node v20.11.1 (npm v10.2.4)
OK
$ nvm run 20.11.1 --env-file=.env --env-file=.env.local index.js
Running node v20.11.1 (npm v10.2.4)
OK

What do you see instead?

The last read commented values is outputed instead of the expected value:

$ nvm run 20.12.0 --env-file=.env index.js
Running node v20.12.0 (npm v10.5.0)
WRONG2
$ nvm run 20.12.0 --env-file=.env --env-file=.env.local index.js
Running node v20.12.0 (npm v10.5.0)
WRONG3
$ nvm run 22.0.0 --env-file=.env index.js                      
Running node v22.0.0 (npm v10.5.1)
WRONG2
$ nvm run 22.0.0 --env-file=.env --env-file=.env.local index.js
Running node v22.0.0 (npm v10.5.1)
WRONG3

Additional information

No response

climba03003 commented 2 weeks ago

It is already fixed in https://github.com/nodejs/node/pull/52406 But not yet released.

MrJithil commented 2 weeks ago

I tested the latest main with the below test case, and seems the issue is not yet fixed with the mentioned PR above.

command ./node --env-file=./.env ./index.js

.env

TEST_VAR=ORIGINAL_VALUE
# TEST_VAR=UNEXPECTED_VALUE
#TEST_VAR=UNEXPECTED_VALUE

index.js console.log(process.env.TEST_VAR)

output UNEXPECTED_VALUE

Observation While using 2 commented lines, the issue is seems exist.

Proposal Replace the lines starts with comments during parse (Dotenv::ParseContent )

lines = std::regex_replace(lines, std::regex("^\\s*#.*$"), "");

CC: @anonrig @climba03003

MrJithil commented 2 weeks ago

Please reopen if needed.