diff --git a/crates/turborepo-repository/src/package_manager/pnpm.rs b/crates/turborepo-repository/src/package_manager/pnpm.rs index 6f0ed6cd5ff83..7774688848e9f 100644 --- a/crates/turborepo-repository/src/package_manager/pnpm.rs +++ b/crates/turborepo-repository/src/package_manager/pnpm.rs @@ -111,7 +111,7 @@ pub fn link_workspace_packages(pnpm_version: PnpmVersion, repo_root: &AbsoluteSy .ok() }) .flatten() - .and_then(|config| config.link_workspace_packages); + .and_then(|config| config.link_workspace_packages()); workspace_config .or(npmrc_config.link_workspace_packages) // The default for pnpm 9 is false if not explicitly set @@ -139,17 +139,32 @@ pub fn get_default_exclusions() -> &'static [&'static str] { #[serde(rename_all = "camelCase")] struct PnpmWorkspace { pub packages: Vec, - link_workspace_packages: Option, + link_workspace_packages: Option, pub patched_dependencies: Option>, } +#[derive(Debug, Deserialize)] +#[serde(untagged)] +enum LinkWorkspacePackages { + Bool(bool), + Str(String), +} + impl PnpmWorkspace { pub fn from_file(repo_root: &AbsoluteSystemPath) -> Result { let workspace_yaml_path = repo_root.join_component(WORKSPACE_CONFIGURATION_PATH); let workspace_yaml = workspace_yaml_path.read_to_string()?; Ok(serde_yaml::from_str(&workspace_yaml)?) } + + fn link_workspace_packages(&self) -> Option { + let config = self.link_workspace_packages.as_ref()?; + match config { + LinkWorkspacePackages::Bool(value) => Some(*value), + LinkWorkspacePackages::Str(value) => Some(value == "deep"), + } + } } #[derive(Debug)] @@ -290,7 +305,7 @@ mod test { let config: PnpmWorkspace = serde_yaml::from_str("linkWorkspacePackages: true\npackages:\n - \"apps/*\"\n") .unwrap(); - assert_eq!(config.link_workspace_packages, Some(true)); + assert_eq!(config.link_workspace_packages(), Some(true)); assert_eq!(config.packages, vec!["apps/*".to_string()]); } @@ -356,4 +371,16 @@ mod test { let actual = link_workspace_packages(PnpmVersion::Pnpm9, repo_root); assert!(actual); } + + #[test] + fn test_workspace_yaml_supports_deep() { + let tmpdir = tempfile::tempdir().unwrap(); + let repo_root = AbsoluteSystemPath::from_std_path(tmpdir.path()).unwrap(); + repo_root + .join_component(WORKSPACE_CONFIGURATION_PATH) + .create_with_contents("linkWorkspacePackages: deep\npackages:\n - \"apps/*\"\n") + .unwrap(); + let actual = link_workspace_packages(PnpmVersion::Pnpm9, repo_root); + assert!(actual, "deep should be treated as true"); + } }