From dcdaa00c70765d7b740fa8371131d12853df8057 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 8 Oct 2025 12:24:25 +0000 Subject: [PATCH 1/2] feat: Add support for pnpm injectWorkspacePackages setting Co-authored-by: anthony.shew --- .../fixtures/pnpm-inject-workspace.yaml | 31 +++++++++++ crates/turborepo-lockfiles/src/pnpm/data.rs | 53 +++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 crates/turborepo-lockfiles/fixtures/pnpm-inject-workspace.yaml diff --git a/crates/turborepo-lockfiles/fixtures/pnpm-inject-workspace.yaml b/crates/turborepo-lockfiles/fixtures/pnpm-inject-workspace.yaml new file mode 100644 index 0000000000000..85fcfbbe3dc9b --- /dev/null +++ b/crates/turborepo-lockfiles/fixtures/pnpm-inject-workspace.yaml @@ -0,0 +1,31 @@ +lockfileVersion: "9.0" + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + injectWorkspacePackages: true + +importers: + .: + devDependencies: + prettier: + specifier: ^3.5.3 + version: 3.5.3 + + apps/web: + dependencies: + lodash: + specifier: ^4.17.21 + version: 4.17.21 + +packages: + /lodash@4.17.21: + resolution: + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + + /prettier@3.5.3: + resolution: + integrity: sha512-e/BBvVnJaW3c/+vgULvKzeXo8LBbFhIF8MkHl1q2L6MvfjSXRIHW5xBM7U2m9GH9A+3keuLDolOgzL4u2p3Mw== + engines: {node: '>=14'} + hasBin: true + dev: true \ No newline at end of file diff --git a/crates/turborepo-lockfiles/src/pnpm/data.rs b/crates/turborepo-lockfiles/src/pnpm/data.rs index 4ad6c34636c09..1fce79cc122cf 100644 --- a/crates/turborepo-lockfiles/src/pnpm/data.rs +++ b/crates/turborepo-lockfiles/src/pnpm/data.rs @@ -174,6 +174,7 @@ pub struct PackageResolution { struct LockfileSettings { auto_install_peers: Option, exclude_links_from_lockfile: Option, + inject_workspace_packages: Option, } impl PnpmLockfile { @@ -649,6 +650,7 @@ mod tests { const PNPM6_TURBO: &[u8] = include_bytes!("../../fixtures/pnpm6turbo.yaml").as_slice(); const PNPM8_TURBO: &[u8] = include_bytes!("../../fixtures/pnpm8turbo.yaml").as_slice(); const PNPM10_PATCH: &[u8] = include_bytes!("../../fixtures/pnpm-10-patch.lock").as_slice(); + const PNPM_INJECT_WORKSPACE: &[u8] = include_bytes!("../../fixtures/pnpm-inject-workspace.yaml").as_slice(); use super::*; use crate::{Lockfile, Package}; @@ -1562,4 +1564,55 @@ c: .unwrap(); assert!(workspace_dep.is_none()); } + + #[test] + fn test_inject_workspace_packages_preservation() { + let lockfile = PnpmLockfile::from_bytes(PNPM_INJECT_WORKSPACE).unwrap(); + + // Verify the original lockfile has injectWorkspacePackages set to true + assert_eq!( + lockfile.settings.as_ref().unwrap().inject_workspace_packages, + Some(true) + ); + + // Create a subgraph to simulate turbo prune operation + let pruned_lockfile = lockfile + .subgraph( + &["apps/web".into()], + &["/lodash@4.17.21".into(), "/prettier@3.5.3".into()], + ) + .unwrap(); + + // Downcast to access the settings + let pruned_pnpm = (pruned_lockfile.as_ref() as &dyn Any) + .downcast_ref::() + .unwrap(); + + // Verify that injectWorkspacePackages is preserved in the pruned lockfile + assert_eq!( + pruned_pnpm.settings.as_ref().unwrap().inject_workspace_packages, + Some(true), + "injectWorkspacePackages setting should be preserved in pruned lockfile" + ); + + // Verify other settings are also preserved + assert_eq!( + pruned_pnpm.settings.as_ref().unwrap().auto_install_peers, + Some(true) + ); + assert_eq!( + pruned_pnpm.settings.as_ref().unwrap().exclude_links_from_lockfile, + Some(false) + ); + + // Verify that the pruned lockfile can be encoded back to YAML + let encoded = pruned_lockfile.encode().unwrap(); + let encoded_str = String::from_utf8(encoded).unwrap(); + + // Verify the encoded YAML contains the injectWorkspacePackages setting + assert!( + encoded_str.contains("injectWorkspacePackages: true"), + "Encoded lockfile should contain injectWorkspacePackages setting" + ); + } } From 8416a3a1c4d2b7700cf5e42bd1f6ff41fdcc3a2d Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 8 Oct 2025 12:38:17 +0000 Subject: [PATCH 2/2] Fix: Preserve pnpm injectWorkspacePackages setting Co-authored-by: anthony.shew --- crates/turborepo-lockfiles/src/pnpm/data.rs | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/crates/turborepo-lockfiles/src/pnpm/data.rs b/crates/turborepo-lockfiles/src/pnpm/data.rs index 1fce79cc122cf..ee6a8b310ce76 100644 --- a/crates/turborepo-lockfiles/src/pnpm/data.rs +++ b/crates/turborepo-lockfiles/src/pnpm/data.rs @@ -650,7 +650,8 @@ mod tests { const PNPM6_TURBO: &[u8] = include_bytes!("../../fixtures/pnpm6turbo.yaml").as_slice(); const PNPM8_TURBO: &[u8] = include_bytes!("../../fixtures/pnpm8turbo.yaml").as_slice(); const PNPM10_PATCH: &[u8] = include_bytes!("../../fixtures/pnpm-10-patch.lock").as_slice(); - const PNPM_INJECT_WORKSPACE: &[u8] = include_bytes!("../../fixtures/pnpm-inject-workspace.yaml").as_slice(); + const PNPM_INJECT_WORKSPACE: &[u8] = + include_bytes!("../../fixtures/pnpm-inject-workspace.yaml").as_slice(); use super::*; use crate::{Lockfile, Package}; @@ -1571,7 +1572,11 @@ c: // Verify the original lockfile has injectWorkspacePackages set to true assert_eq!( - lockfile.settings.as_ref().unwrap().inject_workspace_packages, + lockfile + .settings + .as_ref() + .unwrap() + .inject_workspace_packages, Some(true) ); @@ -1590,7 +1595,11 @@ c: // Verify that injectWorkspacePackages is preserved in the pruned lockfile assert_eq!( - pruned_pnpm.settings.as_ref().unwrap().inject_workspace_packages, + pruned_pnpm + .settings + .as_ref() + .unwrap() + .inject_workspace_packages, Some(true), "injectWorkspacePackages setting should be preserved in pruned lockfile" ); @@ -1601,7 +1610,11 @@ c: Some(true) ); assert_eq!( - pruned_pnpm.settings.as_ref().unwrap().exclude_links_from_lockfile, + pruned_pnpm + .settings + .as_ref() + .unwrap() + .exclude_links_from_lockfile, Some(false) );