diff --git a/scopes/dependencies/dependency-resolver/manifest/workspace-manifest-factory.ts b/scopes/dependencies/dependency-resolver/manifest/workspace-manifest-factory.ts index b80ab47e82b4..55956dd9ef97 100644 --- a/scopes/dependencies/dependency-resolver/manifest/workspace-manifest-factory.ts +++ b/scopes/dependencies/dependency-resolver/manifest/workspace-manifest-factory.ts @@ -115,6 +115,11 @@ export class WorkspaceManifestFactory { } private getEnvsSelfPeersPolicy(componentsManifestsMap: ComponentsManifestsMap) { + // When using external package manager, skip collecting env self peers. + // Users manage their own tooling dependencies. + if (this.dependencyResolver.config.externalPackageManager) { + return undefined; + } const foundEnvs: EnvPolicy[] = []; for (const component of componentsManifestsMap.values()) { foundEnvs.push(component.envPolicy); @@ -243,6 +248,12 @@ export class WorkspaceManifestFactory { component: Component, packageNamesFromWorkspace: string[] ): Promise> { + // When using external package manager, don't add env's tooling dependencies to components. + // The user manages their own tooling (eslint, vitest, webpack, etc.) and we should only + // include the component's actual source code dependencies (detected from imports). + if (this.dependencyResolver.config.externalPackageManager) { + return {}; + } const envPolicy = await this.dependencyResolver.getComponentEnvPolicy(component); const selfPolicyWithoutLocal = envPolicy.selfPolicy.filter( (dep) => !packageNamesFromWorkspace.includes(dep.dependencyId) diff --git a/scopes/workspace/install/install.main.runtime.ts b/scopes/workspace/install/install.main.runtime.ts index 17a7402f71f6..96103bfcc0b0 100644 --- a/scopes/workspace/install/install.main.runtime.ts +++ b/scopes/workspace/install/install.main.runtime.ts @@ -229,7 +229,11 @@ export class InstallMain { async writeDependenciesToPackageJson(): Promise { const installer = this.dependencyResolver.getInstaller({}); const mergedRootPolicy = await this.addConfiguredAspectsToWorkspacePolicy(); - await this.addConfiguredGeneratorEnvsToWorkspacePolicy(mergedRootPolicy); + // When using external package manager, don't add the env package itself. + // Users don't need the env installed - they manage their own tooling. + if (!this.dependencyResolver.config.externalPackageManager) { + await this.addConfiguredGeneratorEnvsToWorkspacePolicy(mergedRootPolicy); + } const componentsAndManifests = await this._getComponentsManifests(installer, mergedRootPolicy, { dedupe: true, }); diff --git a/scopes/workspace/workspace/workspace.ts b/scopes/workspace/workspace/workspace.ts index 0f27b4c21547..4129a18d26a7 100644 --- a/scopes/workspace/workspace/workspace.ts +++ b/scopes/workspace/workspace/workspace.ts @@ -2508,7 +2508,14 @@ the following envs are used in this workspace: ${uniq(availableEnvs).join(', ')} ? Object.entries(dependencies).map(([name, currentRange]) => ({ name, currentRange })) : await this.getAllDedupedDirectDependencies(); pkgJson.packageJsonObject.dependencies ??= {}; + const existingDeps = pkgJson.packageJsonObject.dependencies; + const existingDevDeps = pkgJson.packageJsonObject.devDependencies ?? {}; + const existingPeerDeps = pkgJson.packageJsonObject.peerDependencies ?? {}; for (const dep of allDeps) { + // Skip if already exists - don't override user's existing dependency versions + if (existingDeps[dep.name] || existingDevDeps[dep.name] || existingPeerDeps[dep.name]) { + continue; + } pkgJson.packageJsonObject.dependencies[dep.name] = dep.currentRange; } await pkgJson.write();