From 45b0ef6859db490b7ba10500981927805e909b53 Mon Sep 17 00:00:00 2001 From: Louis Deconinck Date: Fri, 11 Sep 2026 08:13:42 +0200 Subject: [PATCH] fix: accept UTF-8 BOM in dotenv files Signed-off-by: Louis Deconinck --- crates/cli/src/dotenv.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/crates/cli/src/dotenv.rs b/crates/cli/src/dotenv.rs index 033dca6c..712b770f 100644 --- a/crates/cli/src/dotenv.rs +++ b/crates/cli/src/dotenv.rs @@ -15,6 +15,7 @@ use crate::error::{Error, Result}; /// Parse `.env` text into `(key, value)` pairs. pub fn parse(text: &str) -> Result> { let mut out = Vec::new(); + let text = text.strip_prefix('\u{feff}').unwrap_or(text); for (number, raw) in text.lines().enumerate() { let line = raw.trim_start(); if line.is_empty() || line.starts_with('#') { @@ -156,4 +157,14 @@ export BAZ=qux assert!(matches!(parse("NOEQUALS"), Err(Error::Input(_)))); assert!(matches!(parse("1BAD=x"), Err(Error::Input(_)))); } + + #[test] + fn leading_bom_is_ignored_without_changing_values() { + let text = "\u{feff}# comment\r\n\r\nNAME=before\u{feff}after\r\n"; + assert_eq!( + parse(text).unwrap(), + vec![("NAME".to_string(), "before\u{feff}after".to_string())] + ); + assert!(parse("\u{feff}").unwrap().is_empty()); + } }