Skip to content

fix: force a single version of harmony linked from bvm #9662

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Apr 7, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,238 changes: 716 additions & 522 deletions pnpm-lock.yaml

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion scopes/component/isolator/isolator.main.runtime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -832,7 +832,7 @@ export class IsolatorMain {
packageManagerConfigRootDir: isolateInstallOptions.packageManagerConfigRootDir,
resolveVersionsFromDependenciesOnly: true,
linkedDependencies: opts.linkedDependencies,
forceTeambitHarmonyLink: !this.dependencyResolver.hasHarmonyInRootPolicy(),
forcedHarmonyVersion: this.dependencyResolver.harmonyVersionInRootPolicy(),
excludeExtensionsDependencies: true,
dedupeInjectedDeps: true,
dependenciesGraph: opts.dependenciesGraph,
Expand Down
11 changes: 6 additions & 5 deletions scopes/dependencies/dependency-resolver/dependency-installer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ export type InstallOptions = {
packageManagerConfigRootDir?: string;
resolveVersionsFromDependenciesOnly?: boolean;
linkedDependencies?: Record<string, Record<string, string>>;
forceTeambitHarmonyLink?: boolean;
forcedHarmonyVersion?: string;
excludeExtensionsDependencies?: boolean;
dedupeInjectedDeps?: boolean;
dependenciesGraph?: DependenciesGraph;
Expand Down Expand Up @@ -164,6 +164,10 @@ export class DependencyInstaller {
JSON.stringify(options.linkedDependencies)
) as typeof options.linkedDependencies;
if (linkedDependencies[finalRootDir]) {
if (options.forcedHarmonyVersion == null && manifests[finalRootDir].dependencies?.['@teambit/harmony']) {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
delete manifests[finalRootDir].dependencies!['@teambit/harmony'];
}
const directDeps = new Set<string>();
Object.values(manifests).forEach((manifest) => {
for (const depName of Object.keys({ ...manifest.dependencies, ...manifest.devDependencies })) {
Expand All @@ -175,10 +179,6 @@ export class DependencyInstaller {
delete linkedDependencies[finalRootDir][manifest.name];
}
}
if (options.forceTeambitHarmonyLink && manifests[finalRootDir].dependencies?.['@teambit/harmony']) {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
delete manifests[finalRootDir].dependencies!['@teambit/harmony'];
}
}
Object.entries(linkedDependencies).forEach(([dir, linkedDeps]) => {
if (!manifests[dir]) {
Expand Down Expand Up @@ -210,6 +210,7 @@ export class DependencyInstaller {
preferOffline: this.preferOffline,
dedupeInjectedDeps: options.dedupeInjectedDeps,
dependenciesGraph: options.dependenciesGraph,
forcedHarmonyVersion: options.forcedHarmonyVersion,
...packageManagerOptions,
};
if (options.installTeambitBit) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -241,9 +241,9 @@ export class DependencyResolverMain {
return res;
}

hasHarmonyInRootPolicy(): boolean {
harmonyVersionInRootPolicy(): string | undefined {
const rootPolicy = this.getWorkspacePolicyFromConfig();
return rootPolicy.entries.some(({ dependencyId }) => dependencyId === '@teambit/harmony');
return rootPolicy.entries.find(({ dependencyId }) => dependencyId === '@teambit/harmony')?.value?.version;
}

nodeLinker(packageManagerName?: string): NodeLinker {
Expand Down
2 changes: 2 additions & 0 deletions scopes/dependencies/dependency-resolver/package-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,8 @@ export type PackageManagerInstallOptions = {
returnListOfDepsRequiringBuild?: boolean;

dependenciesGraph?: DependenciesGraph;

forcedHarmonyVersion?: string;
};

export type PackageManagerGetPeerDependencyIssuesOptions = PackageManagerInstallOptions;
Expand Down
40 changes: 36 additions & 4 deletions scopes/dependencies/pnpm/lynx.ts
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,7 @@ export async function install(
hoistInjectedDependencies?: boolean;
dryRun?: boolean;
dedupeInjectedDeps?: boolean;
forcedHarmonyVersion?: string;
} & Pick<
InstallOptions,
| 'autoInstallPeers'
Expand Down Expand Up @@ -221,6 +222,18 @@ export async function install(
readPackage.push(readPackageHook as ReadPackageHook);
}
readPackage.push(removeLegacyFromDeps as ReadPackageHook);
const overrides = {
...options.overrides,
};
if (options.forcedHarmonyVersion) {
// Harmony needs to be a singleton, so if a specific version was requested for the workspace,
// we force that version accross the whole dependency graph.
overrides['@teambit/harmony'] = options.forcedHarmonyVersion;
} else {
// If the workspace did not specify a harmony version in a root policy,
// then we remove harmony from any dependencies, so that the one linked from bvm is used.
readPackage.push(removeHarmonyFromDeps as ReadPackageHook);
}
if (!manifestsByPaths[rootDir].dependenciesMeta) {
manifestsByPaths = {
...manifestsByPaths,
Expand Down Expand Up @@ -291,6 +304,7 @@ export async function install(
disableRelinkLocalDirDeps: true,
hoistPattern,
virtualStoreDirMaxLength: VIRTUAL_STORE_DIR_MAX_LENGTH,
overrides,
};

let dependenciesChanged = false;
Expand Down Expand Up @@ -403,11 +417,29 @@ function readPackageHookForCapsules(pkg: PackageManifest, workspaceDir?: string)
* It is linked from bvm.
*/
function removeLegacyFromDeps(pkg: PackageManifest): PackageManifest {
if (pkg.dependencies?.['@teambit/legacy'] && !pkg.dependencies['@teambit/legacy'].startsWith('link:')) {
delete pkg.dependencies['@teambit/legacy'];
if (pkg.dependencies != null) {
if (pkg.dependencies['@teambit/legacy'] && !pkg.dependencies['@teambit/legacy'].startsWith('link:')) {
delete pkg.dependencies['@teambit/legacy'];
}
}
if (pkg.peerDependencies?.['@teambit/legacy']) {
delete pkg.peerDependencies['@teambit/legacy'];
if (pkg.peerDependencies != null) {
if (pkg.peerDependencies['@teambit/legacy']) {
delete pkg.peerDependencies['@teambit/legacy'];
}
}
return pkg;
}

function removeHarmonyFromDeps(pkg: PackageManifest): PackageManifest {
if (pkg.dependencies != null) {
if (pkg.dependencies['@teambit/harmony'] && !pkg.dependencies['@teambit/harmony'].startsWith('link:')) {
delete pkg.dependencies['@teambit/harmony'];
}
}
if (pkg.peerDependencies != null) {
if (pkg.peerDependencies['@teambit/harmony']) {
delete pkg.peerDependencies['@teambit/harmony'];
}
}
return pkg;
}
Expand Down
1 change: 1 addition & 0 deletions scopes/dependencies/pnpm/pnpm.package-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,7 @@ export class PnpmPackageManager implements PackageManager {
peerDependencyRules: installOptions.peerDependencyRules,
},
returnListOfDepsRequiringBuild: installOptions.returnListOfDepsRequiringBuild,
forcedHarmonyVersion: installOptions.forcedHarmonyVersion,
},
this.logger
);
Expand Down
4 changes: 2 additions & 2 deletions scopes/workspace/install/install.main.runtime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -350,7 +350,7 @@ export class InstallMain {
const compDirMap = await this.getComponentsDirectory([]);
let installCycle = 0;
let hasMissingLocalComponents = true;
const forceTeambitHarmonyLink = !this.dependencyResolver.hasHarmonyInRootPolicy();
const forcedHarmonyVersion = this.dependencyResolver.harmonyVersionInRootPolicy();
/* eslint-disable no-await-in-loop */
do {
// In case there are missing local components,
Expand All @@ -366,7 +366,7 @@ export class InstallMain {
{
linkedDependencies,
installTeambitBit: false,
forceTeambitHarmonyLink,
forcedHarmonyVersion,
},
pmInstallOptions
);
Expand Down