diff --git a/cli/internal/turbostate/turbostate.go b/cli/internal/turbostate/turbostate.go index 312d0e1bd13fd..770f44e57e9ab 100644 --- a/cli/internal/turbostate/turbostate.go +++ b/cli/internal/turbostate/turbostate.go @@ -5,6 +5,7 @@ package turbostate import ( "fmt" + "github.com/vercel/turbo/cli/internal/fs" "github.com/vercel/turbo/cli/internal/util" ) @@ -99,8 +100,10 @@ type ParsedArgsFromRust struct { // ExecutionState is the entire state of a turbo execution that is passed from the Rust shim. type ExecutionState struct { - RemoteConfig RemoteConfig `json:"remote_config"` - CLIArgs ParsedArgsFromRust `json:"cli_args"` + RemoteConfig RemoteConfig `json:"remote_config"` + PackageManager string `json:"package_manager"` + RootPackageJson fs.PackageJSON `json:"root_package_json"` + CLIArgs ParsedArgsFromRust `json:"cli_args"` } // RemoteConfig holds the authentication and endpoint details for the API client diff --git a/crates/turborepo-lib/src/execution_state.rs b/crates/turborepo-lib/src/execution_state.rs index 0f09cd9873161..3429160715298 100644 --- a/crates/turborepo-lib/src/execution_state.rs +++ b/crates/turborepo-lib/src/execution_state.rs @@ -1,13 +1,19 @@ use serde::Serialize; +use turbopath::RelativeSystemPathBuf; use crate::{ - cli::Args, commands::CommandBase, package_manager::PackageManager, DryRunMode, LogPrefix, - RunArgs, + cli::{Args, RunArgs}, + commands::CommandBase, + package_json::{read_package_json, PackageJson}, + package_manager::PackageManager, + DryRunMode, LogPrefix, RunArgs, }; #[derive(Debug, Serialize)] pub struct ExecutionState<'a> { pub remote_config: RemoteConfig<'a>, + package_manager: PackageManager, + root_package_json: PackageJson, pub cli_args: &'a Args, } @@ -19,10 +25,10 @@ pub struct RemoteConfig<'a> { pub api_url: &'a str, } -impl<'a> TryFrom<&'a CommandBase> for ExecutionState<'a> { +impl<'a> TryFrom<&'a mut CommandBase> for ExecutionState<'a> { type Error = anyhow::Error; - fn try_from(base: &'a CommandBase) -> Result { + fn try_from(base: &'a mut CommandBase) -> Result { let repo_config = base.repo_config()?; let user_config = base.user_config()?; @@ -32,9 +38,13 @@ impl<'a> TryFrom<&'a CommandBase> for ExecutionState<'a> { team_slug: repo_config.team_slug(), api_url: repo_config.api_url(), }; + let root_package_json = PackageJson::load(base.repo_root().join("package.json"))?; + let package_manager = PackageManager::get_package_manager(base, &root_package_json)?; Ok(ExecutionState { remote_config, + package_manager, + root_package_json, cli_args: base.args(), }) } diff --git a/crates/turborepo-lib/src/package_json.rs b/crates/turborepo-lib/src/package_json.rs index 364b39d3f5796..b37f81b43d53d 100644 --- a/crates/turborepo-lib/src/package_json.rs +++ b/crates/turborepo-lib/src/package_json.rs @@ -26,8 +26,10 @@ pub struct PackageJson { raw_json: HashMap, } -pub fn read_package_json(path: &AbsoluteSystemPathBuf) -> Result { - let contents = std::fs::read_to_string(path)?; - let mut package_json: PackageJson = serde_json::from_str(&contents)?; - Ok(package_json) +impl PackageJson { + pub fn load(path: &AbsoluteSystemPathBuf) -> Result { + let contents = std::fs::read_to_string(path)?; + let mut package_json: PackageJson = serde_json::from_str(&contents)?; + Ok(package_json) + } }