diff --git a/crates/turborepo-repository/src/discovery.rs b/crates/turborepo-repository/src/discovery.rs index f6f9c616c4aee..e09a35b3be306 100644 --- a/crates/turborepo-repository/src/discovery.rs +++ b/crates/turborepo-repository/src/discovery.rs @@ -104,6 +104,11 @@ impl LocalPackageDiscoveryBuilder { pub fn with_allow_no_package_manager(&mut self, allow_missing_package_manager: bool) { self.allow_missing_package_manager = allow_missing_package_manager; } + + pub fn with_package_manager(&mut self, package_manager: Option) -> &mut Self { + self.package_manager = package_manager; + self + } } impl PackageDiscoveryBuilder for LocalPackageDiscoveryBuilder { diff --git a/crates/turborepo-repository/src/package_graph/builder.rs b/crates/turborepo-repository/src/package_graph/builder.rs index 406d1f1e7180b..d4956fb9b6c64 100644 --- a/crates/turborepo-repository/src/package_graph/builder.rs +++ b/crates/turborepo-repository/src/package_graph/builder.rs @@ -80,6 +80,12 @@ impl<'a> PackageGraphBuilder<'a, LocalPackageDiscoveryBuilder> { .with_allow_no_package_manager(allow_no_package_manager); self } + + pub fn with_package_manager(mut self, package_manager: PackageManager) -> Self { + self.package_discovery + .with_package_manager(Some(package_manager)); + self + } } impl<'a, P> PackageGraphBuilder<'a, P> { diff --git a/packages/turbo-repository/__tests__/affected-packages.test.ts b/packages/turbo-repository/__tests__/affected-packages.test.ts index 7c4a1008fea10..9ac9cd084a3df 100644 --- a/packages/turbo-repository/__tests__/affected-packages.test.ts +++ b/packages/turbo-repository/__tests__/affected-packages.test.ts @@ -59,6 +59,22 @@ describe("affectedPackages", () => { }); } + it("does not require packageManager for npm", async () => { + const dir = path.resolve(__dirname, "./fixtures/npm-monorepo"); + const workspace = await Workspace.find(dir); + + const reduced: PackageReduced[] = ( + await workspace.affectedPackages(["apps/app/file.txt"]) + ).map((pkg) => { + return { + name: pkg.name, + relativePath: pkg.relativePath, + }; + }); + + assert.deepEqual(reduced, [{ name: "app-a", relativePath: "apps/app" }]); + }); + describe("optimizedLockfileUpdates", () => { it("errors if not provided comparison ref", async () => { const dir = path.resolve(__dirname, "./fixtures/monorepo"); diff --git a/packages/turbo-repository/__tests__/fixtures/npm-monorepo/apps/app/package.json b/packages/turbo-repository/__tests__/fixtures/npm-monorepo/apps/app/package.json new file mode 100644 index 0000000000000..18fa556034020 --- /dev/null +++ b/packages/turbo-repository/__tests__/fixtures/npm-monorepo/apps/app/package.json @@ -0,0 +1,6 @@ +{ + "name": "app-a", + "dependencies": { + "ui": "*" + } +} diff --git a/packages/turbo-repository/__tests__/fixtures/npm-monorepo/package-lock.json b/packages/turbo-repository/__tests__/fixtures/npm-monorepo/package-lock.json new file mode 100644 index 0000000000000..dbc1ef31910ee --- /dev/null +++ b/packages/turbo-repository/__tests__/fixtures/npm-monorepo/package-lock.json @@ -0,0 +1,34 @@ +{ + "name": "basic", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "basic", + "workspaces": [ + "apps/*", + "packages/*" + ] + }, + "apps/app": { + "name": "app-a", + "dependencies": { + "ui": "*" + } + }, + "node_modules/app-a": { + "resolved": "apps/app", + "link": true + }, + "node_modules/blank": { + "resolved": "packages/blank", + "link": true + }, + "node_modules/ui": { + "resolved": "packages/ui", + "link": true + }, + "packages/blank": {}, + "packages/ui": {} + } +} diff --git a/packages/turbo-repository/__tests__/fixtures/npm-monorepo/package.json b/packages/turbo-repository/__tests__/fixtures/npm-monorepo/package.json new file mode 100644 index 0000000000000..7236271b8f467 --- /dev/null +++ b/packages/turbo-repository/__tests__/fixtures/npm-monorepo/package.json @@ -0,0 +1,5 @@ +{ + "name": "basic", + "private": true, + "workspaces": ["apps/*", "packages/*"] +} diff --git a/packages/turbo-repository/__tests__/fixtures/npm-monorepo/packages/blank/package.json b/packages/turbo-repository/__tests__/fixtures/npm-monorepo/packages/blank/package.json new file mode 100644 index 0000000000000..b0de282a25e06 --- /dev/null +++ b/packages/turbo-repository/__tests__/fixtures/npm-monorepo/packages/blank/package.json @@ -0,0 +1,3 @@ +{ + "//": "missing name field in this package.json" +} diff --git a/packages/turbo-repository/__tests__/fixtures/npm-monorepo/packages/ui/package.json b/packages/turbo-repository/__tests__/fixtures/npm-monorepo/packages/ui/package.json new file mode 100644 index 0000000000000..1cd75b539ecc2 --- /dev/null +++ b/packages/turbo-repository/__tests__/fixtures/npm-monorepo/packages/ui/package.json @@ -0,0 +1,3 @@ +{ + "name": "ui" +} diff --git a/packages/turbo-repository/rust/src/internal.rs b/packages/turbo-repository/rust/src/internal.rs index 770fea1b05817..511f92c4332c0 100644 --- a/packages/turbo-repository/rust/src/internal.rs +++ b/packages/turbo-repository/rust/src/internal.rs @@ -63,19 +63,22 @@ impl Workspace { })?; let workspace_state = WorkspaceState::infer(&reference_dir)?; let is_multi_package = workspace_state.mode == WorkspaceType::MultiPackage; - let package_manager_name = workspace_state - .package_manager - .as_ref() - .map_err(|error| Error::PackageManager { - error: error.to_string(), - path: workspace_state.root.clone(), - })? - .name(); + let package_manager = + workspace_state + .package_manager + .as_ref() + .map_err(|error| Error::PackageManager { + error: error.to_string(), + path: workspace_state.root.clone(), + })?; + + let package_manager_name = package_manager.name(); let workspace_root = &workspace_state.root; let root_package_json = PackageJson::load(&workspace_root.join_component("package.json"))?; let package_graph = PackageGraphBuilder::new(workspace_root, root_package_json) .with_single_package_mode(!is_multi_package) + .with_package_manager(package_manager.clone()) .build() .await?;