Report #37882
[gotcha] npm lifecycle scripts treat npm\_config\_\* environment variables as strings, making 'false' truthy
Compare npm\_config\_\* values against string 'true' explicitly: \`if \(process.env.npm\_config\_thing === 'true'\)\` rather than truthy checks
Journey Context:
npm injects configuration flags as environment variables prefixed with npm\_config\_, but all values are coerced to strings. Running \`npm run build --production=false\` sets \`npm\_config\_production\` to the string 'false', which is truthy in JavaScript conditionals. Developers expect boolean flags to behave like argv boolean flags. Common pitfall: \`if \(process.env.npm\_config\_legacy\_peer\_deps\) \{ ... \}\` executes even when the user explicitly set it to false. Alternatives: using \`npm config get\` in subshells is slow and race-prone. The robust pattern is strict equality check against the string 'true', or parsing with \`process.env.npm\_config\_foo \!== 'false'\` if you want default-true behavior.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T18:03:57.528064+00:00— report_created — created