Skip to content

src: fix dotenv empty values and indented comments - #66685

Open
christianaurichzm wants to merge 1 commit into
nodejs:mainfrom
christianaurichzm:dotenv-empty-values
Open

christianaurichzm wants to merge 1 commit into
nodejs:mainfrom
christianaurichzm:dotenv-empty-values

Conversation

@christianaurichzm

Copy link
Copy Markdown
Contributor

parseEnv(), loadEnvFile() and --env-file mishandle empty values and indented comments:

const { parseEnv } = require('node:util');

parseEnv('EMPTY=   \nDATABASE_URL=postgres://localhost');
// { EMPTY: 'DATABASE_URL=postgres://localhost' }

parseEnv('export API_KEY=');      // { 'export API_KEY': '' }
parseEnv('=\nB=2');               // { '': '', B: '2' }
parseEnv('A="x"\n  # C=value');   // { A: 'x', '# C': 'value' }

The empty-value check added in #56983 runs before the key is normalized, and with spaces after = it misses and trim_spaces() eats the newline. Separately, the start of each line is only trimmed at the end of the loop body, which the branches ending in continue skip.

This normalizes the key first, skips only spaces and tabs after =, and moves the line trim into the for increment so it also runs after continue. The new test cases fail on main and pass with this change.

An empty value was stored before the key was normalized, and the
check for it ran before the spaces after `=` were skipped. Only the
path for unquoted values trimmed the start of the next line, so every
branch that ended in `continue` left it untrimmed. As a result:

- `KEY=   ` followed by a newline consumed the newline while trimming,
  so the next line was stored as the value of `KEY` and its own
  variable was lost.
- `export KEY=` was stored as `export KEY` instead of `KEY`.
- `=` followed by a newline was stored under an empty key, while
  `=value` is skipped.
- A comment indented with spaces after an empty value, a quoted value
  or another comment was stored as a variable named `# ...`.

Skip empty keys and strip the `export` prefix first, skip only spaces
and tabs after `=` before checking for an empty value, and trim the
start of each line in the loop increment, which also runs after
`continue`.

Signed-off-by: Christian Aurich Zanettini Martins <christian.aurichzm@gmail.com>
@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Review requested:

  • @nodejs/config

@nodejs-github-bot nodejs-github-bot added c++ Issues and PRs that require attention from people who are familiar with C++. config Issues and PRs related to Node.js configuration and feature settings. needs-ci PRs that need a full CI run. labels Oct 12, 2026
@codecov

codecov Bot commented Oct 12, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 90.46%. Comparing base (3b639be) to head (0434b4d).
⚠️ Report is 7 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main   #66685      +/-   ##
==========================================
- Coverage   92.82%   90.46%   -2.36%     
==========================================
  Files         422      791     +369     
  Lines      194189   277086   +82897     
  Branches    30027    53275   +23248     
==========================================
+ Hits       180249   250674   +70425     
- Misses      13614    16813    +3199     
- Partials      326     9599    +9273     
Files with missing lines Coverage Δ
src/node_dotenv.cc 86.05% <100.00%> (ø)

... and 501 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

c++ Issues and PRs that require attention from people who are familiar with C++. config Issues and PRs related to Node.js configuration and feature settings. needs-ci PRs that need a full CI run.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants