-
Notifications
You must be signed in to change notification settings - Fork 30.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
--env-file does not support inner quotes (does not behave like dotenv) #54134
Comments
Pull requests are welcome |
Hi, this is my first time contributing to Node.js, I will take this issue as my first contribution. I think this is a good starting place. |
added additional information around dotenv and the implications of the bug |
For reference, here are parsing rules from dotenv project page: What rules does the parsing engine follow?The parsing engine currently supports the following rules:
source: https://github.com/motdotla/dotenv?tab=readme-ov-file#what-rules-does-the-parsing-engine-follow |
There is one more invalid use case:
is parsed into env by Node, but dotenv skips it. |
@anonrig @macrozone How strict do we want to be with dotenv compatibility? I've got a working fix that is handling all tests of dotenv. It improves compatibility and simplifies parser, but behaves differently with multiline "" values that have unbalanced ". Covering all edge-cases of dotenv without using their regexp is pretty crazy. |
Agreed. We started following dotenv through their tests, but I think it's ok to diverge from there for extreme edge cases. I don't think we need to be 100% compliant with dotenv. |
I actually personally don't care about the compatiblitiy, but at the moment some env var values are absolutly impossible to declare. Namly one that contains: a line break, a double quote a backtick and a single quote. There is no way to declare such a env var. Allowing to escape quotes would also solve it, but that was attempted and rejected because "its not compatible with dotenv". I am also fine when it breaks with actual line breaks, since thats also bugged in dotenv. When using quotes you can encode line breaks with So if this works, it would be fine for me:
|
I agree that "a line break, a double quote, and a single quote" should be supported, and it is considered as a bug. |
don't forget the backtick 😁 (woops, i forgot also to mentione it above) |
Just tried your example: .env file:
dotenv:
my changes:
So it looks like it will handle it exactly like dotenv. I already had to make it much more complex than needed to handle all other edge cases. |
Now we are getting away from reality, lol. What's the usecase/example of an environment variable that contains all of these characters? |
@macrozone Added your case to tests and opened a PR: #54215 |
It should not be node's decision what is an allowed env var value and what not. An env var value is a string and any string should be somehow be encodeable in a .env file. In my case I am writing tooling that creates those .env files on the fly in a ci/cd pipeline from another store. Those can be any strings and Its hard to mirror arbitrary decisions what are valid strings and what not. This is how I noticed those problems in the first place. luckily fixing the inner quotes problem solves the issue. (also in bash its no problem to declare such a variable thanks to escaping
) |
thank you so much for your effort! |
Can you also bring back the inline comments?
|
Version
v20.16.0
Platform
Subsystem
No response
What steps will reproduce the bug?
inspired by this comment: #50814 (comment)
create an
.env
file:test with dotenv:
$ node envtest-dotenv.js
test with
--env-file
$ node --env-file=.env envtest.js
How often does it reproduce? Is there a required condition?
always
What is the expected behavior? Why is that the expected behavior?
outputs should be the same.
What do you see instead?
output are different, node native terminates at the first occurrence of the double quote:
compare that to dotenv:
Additional information
--env-file
#50814And
The text was updated successfully, but these errors were encountered: