diff --git a/crates/turbo-tasks-env/src/command_line.rs b/crates/turbo-tasks-env/src/command_line.rs index 6f98b514dcd7f..51b763183ddc2 100644 --- a/crates/turbo-tasks-env/src/command_line.rs +++ b/crates/turbo-tasks-env/src/command_line.rs @@ -1,9 +1,7 @@ -use std::env; - use indexmap::IndexMap; use turbo_tasks::Vc; -use crate::{EnvMap, ProcessEnv, GLOBAL_ENV_LOCK}; +use crate::{sorted_env_vars, EnvMap, ProcessEnv, GLOBAL_ENV_LOCK}; /// Load the environment variables defined via command line. #[turbo_tasks::value] @@ -20,7 +18,7 @@ impl CommandLineProcessEnv { /// Clones the current env vars into a IndexMap. fn env_snapshot() -> IndexMap { let _lock = GLOBAL_ENV_LOCK.lock().unwrap(); - env::vars().collect::>() + sorted_env_vars() } #[turbo_tasks::value_impl] diff --git a/crates/turbo-tasks-env/src/dotenv.rs b/crates/turbo-tasks-env/src/dotenv.rs index b29d1c009fb2d..d32cde2af6004 100644 --- a/crates/turbo-tasks-env/src/dotenv.rs +++ b/crates/turbo-tasks-env/src/dotenv.rs @@ -5,7 +5,7 @@ use indexmap::IndexMap; use turbo_tasks::{ValueToString, Vc}; use turbo_tasks_fs::{FileContent, FileSystemPath}; -use crate::{EnvMap, ProcessEnv, GLOBAL_ENV_LOCK}; +use crate::{sorted_env_vars, EnvMap, ProcessEnv, GLOBAL_ENV_LOCK}; /// Load the environment variables defined via a dotenv file, with an /// optional prior state that we can lookup already defined variables @@ -47,7 +47,7 @@ impl DotenvProcessEnv { // Unfortunately, dotenvy only looks up variable references from the global env. // So we must mutate while we process. Afterwards, we can restore the initial // state. - let initial = env::vars().collect(); + let initial = sorted_env_vars(); restore_env(&initial, &prior, &lock); @@ -56,7 +56,7 @@ impl DotenvProcessEnv { // var, it'll be ignored. res = dotenv::from_read(f.read()).map(|e| e.load()); - vars = env::vars().collect(); + vars = sorted_env_vars(); restore_env(&vars, &initial, &lock); } diff --git a/crates/turbo-tasks-env/src/lib.rs b/crates/turbo-tasks-env/src/lib.rs index f793ed06436d9..ee155ed60911f 100644 --- a/crates/turbo-tasks-env/src/lib.rs +++ b/crates/turbo-tasks-env/src/lib.rs @@ -57,6 +57,12 @@ pub trait ProcessEnv { } } +pub fn sorted_env_vars() -> IndexMap { + let mut vars = env::vars().collect::>(); + vars.sort_keys(); + vars +} + #[turbo_tasks::function] pub async fn case_insensitive_read(map: Vc, name: String) -> Result>> { Ok(Vc::cell( diff --git a/crates/turbopack-tests/tests/snapshot/env/env/output/crates_turbopack-tests_tests_snapshot_env_env_input__env__env_b53fce.js b/crates/turbopack-tests/tests/snapshot/env/env/output/crates_turbopack-tests_tests_snapshot_env_env_input__env__env_b53fce.js index d91e9ca1b13a4..047fc73735682 100644 --- a/crates/turbopack-tests/tests/snapshot/env/env/output/crates_turbopack-tests_tests_snapshot_env_env_input__env__env_b53fce.js +++ b/crates/turbopack-tests/tests/snapshot/env/env/output/crates_turbopack-tests_tests_snapshot_env_env_input__env__env_b53fce.js @@ -5,10 +5,10 @@ const env = process.env = { ...process.env }; +env["ALLFOOBAR"] = foobarfoobar; +env["BARFOO"] = barfoo; env["FOO"] = foo; env["FOOBAR"] = foobar; -env["BARFOO"] = barfoo; -env["ALLFOOBAR"] = foobarfoobar; }.call(this) }), }]); diff --git a/crates/turbopack-tests/tests/snapshot/env/env/output/crates_turbopack-tests_tests_snapshot_env_env_input__env__env_b53fce.js.map b/crates/turbopack-tests/tests/snapshot/env/env/output/crates_turbopack-tests_tests_snapshot_env_env_input__env__env_b53fce.js.map index f54633d5180cd..569af54526567 100644 --- a/crates/turbopack-tests/tests/snapshot/env/env/output/crates_turbopack-tests_tests_snapshot_env_env_input__env__env_b53fce.js.map +++ b/crates/turbopack-tests/tests/snapshot/env/env/output/crates_turbopack-tests_tests_snapshot_env_env_input__env__env_b53fce.js.map @@ -1,6 +1,6 @@ { "version": 3, "sections": [ - {"offset": {"line": 4, "column": 0}, "map": {"version":3,"sources":["/turbopack/[project]/crates/turbopack-tests/tests/snapshot/env/env/input/.env/.env.js"],"sourcesContent":["const env = process.env = {...process.env};\n\nenv[\"FOO\"] = foo;\nenv[\"FOOBAR\"] = foobar;\nenv[\"BARFOO\"] = barfoo;\nenv[\"ALLFOOBAR\"] = foobarfoobar;\n"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,GAAG;IAAC,GAAG,QAAQ,GAAG;AAAA;AAEzC,GAAG,CAAC,MAAM,GAAG;AACb,GAAG,CAAC,SAAS,GAAG;AAChB,GAAG,CAAC,SAAS,GAAG;AAChB,GAAG,CAAC,YAAY,GAAG"}}, + {"offset": {"line": 4, "column": 0}, "map": {"version":3,"sources":["/turbopack/[project]/crates/turbopack-tests/tests/snapshot/env/env/input/.env/.env.js"],"sourcesContent":["const env = process.env = {...process.env};\n\nenv[\"ALLFOOBAR\"] = foobarfoobar;\nenv[\"BARFOO\"] = barfoo;\nenv[\"FOO\"] = foo;\nenv[\"FOOBAR\"] = foobar;\n"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,GAAG;IAAC,GAAG,QAAQ,GAAG;AAAA;AAEzC,GAAG,CAAC,YAAY,GAAG;AACnB,GAAG,CAAC,SAAS,GAAG;AAChB,GAAG,CAAC,MAAM,GAAG;AACb,GAAG,CAAC,SAAS,GAAG"}}, {"offset": {"line": 11, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":"A"}}] } \ No newline at end of file