diff --git a/scopes/dependencies/dependency-resolver/dependency-resolver.main.runtime.spec.ts b/scopes/dependencies/dependency-resolver/dependency-resolver.main.runtime.spec.ts index cc277596b1ad..37b11b4e7f91 100644 --- a/scopes/dependencies/dependency-resolver/dependency-resolver.main.runtime.spec.ts +++ b/scopes/dependencies/dependency-resolver/dependency-resolver.main.runtime.spec.ts @@ -193,24 +193,28 @@ describe('DepenendencyResolverMain.getOutdatedPkgsFromPolicies()', () => { const packageManagerSlot = { // @ts-ignore get: () => ({ - resolveRemoteVersion: (spec: string) => ({ - version: { - 'root-runtime-dep1@latest': '2.0.0', - 'root-peer-dep1@latest': '2.0.0', - 'variant1-runtime-dep1@latest': '2.0.0', - 'variant1-runtime-dep3@latest': '2.0.0', - 'variant1-dev-dep1@latest': '2.0.0', - 'variant1-dev-dep3@latest': '2.0.0', - 'variant1-peer-dep1@latest': '2.0.0', - 'variant1-peer-dep3@latest': '2.0.0', - 'component1-runtime-dep1@latest': '2.0.0', - 'component1-runtime-dep3@latest': '2.0.0', - 'component1-dev-dep1@latest': '2.0.0', - 'component1-dev-dep3@latest': '2.0.0', - 'component1-peer-dep1@latest': '2.0.0', - 'component1-peer-dep3@latest': '2.0.0', - }[spec], - }), + resolveRemoteVersion: (spec: string) => { + if (spec === 'cannot-resolve@latest') throw new Error('Cannot resolve latest'); + return { + version: { + 'root-runtime-dep1@latest': '2.0.0', + 'root-peer-dep1@latest': '2.0.0', + 'variant1-runtime-dep1@latest': '2.0.0', + 'variant1-runtime-dep3@latest': '2.0.0', + 'variant1-dev-dep1@latest': '2.0.0', + 'variant1-dev-dep3@latest': '2.0.0', + 'variant1-peer-dep1@latest': '2.0.0', + 'variant1-peer-dep3@latest': '2.0.0', + 'component1-runtime-dep1@latest': '2.0.0', + 'component1-runtime-dep3@latest': '2.0.0', + 'component1-dev-dep1@latest': '2.0.0', + 'component1-dev-dep3@latest': '2.0.0', + 'component1-peer-dep1@latest': '2.0.0', + 'component1-peer-dep3@latest': '2.0.0', + 'pkg-with-old-latest@latest': '0.0.0', + }[spec], + }; + }, getNetworkConfig: () => ({}), }), }; @@ -274,6 +278,8 @@ describe('DepenendencyResolverMain.getOutdatedPkgsFromPolicies()', () => { componentPoliciesById: { component1: { dependencies: { + 'pkg-with-old-latest': '1.0.0', + 'cannot-resolve': '1.0.0', 'component1-runtime-dep1': '1.0.0', 'component1-runtime-dep2': '1.0.0', 'component1-runtime-dep3': '-', diff --git a/scopes/dependencies/dependency-resolver/dependency-resolver.main.runtime.ts b/scopes/dependencies/dependency-resolver/dependency-resolver.main.runtime.ts index 5abe59354e33..3b6624195060 100644 --- a/scopes/dependencies/dependency-resolver/dependency-resolver.main.runtime.ts +++ b/scopes/dependencies/dependency-resolver/dependency-resolver.main.runtime.ts @@ -5,7 +5,7 @@ import { getAllCoreAspectsIds } from '@teambit/bit'; import ComponentAspect, { Component, ComponentMap, ComponentMain, IComponent, ComponentID } from '@teambit/component'; import type { ConfigMain } from '@teambit/config'; import { join } from 'path'; -import { get, pick, uniq } from 'lodash'; +import { compact, get, pick, uniq } from 'lodash'; import { ConfigAspect } from '@teambit/config'; import { DependenciesEnv, EnvDefinition, EnvsAspect, EnvsMain } from '@teambit/envs'; import { Slot, SlotRegistry, ExtensionManifest, Aspect, RuntimeManifest } from '@teambit/harmony'; @@ -1308,23 +1308,34 @@ export class DependencyResolverMain { ): Promise> { this.logger.setStatusLine('checking the latest versions of dependencies'); const resolver = await this.getVersionResolver(); - const resolve = async (spec: string) => - ( - await resolver.resolveRemoteVersion(spec, { - rootDir, - }) - ).version; - const outdatedPkgs = ( + const tryResolve = async (spec: string) => { + try { + return ( + await resolver.resolveRemoteVersion(spec, { + rootDir, + }) + ).version; + } catch { + // If latest cannot be found for the package, then just ignore it + return null; + } + }; + const outdatedPkgs = compact( await Promise.all( pkgs.map(async (pkg) => { - const latestVersion = await resolve(`${pkg.name}@latest`); + const latestVersion = await tryResolve(`${pkg.name}@latest`); + if (!latestVersion) return null; + const currentVersion = semver.valid(pkg.currentRange.replace(/[\^~]/, '')); + // If the current version is newer than the latest, then no need to update the dependency + if (currentVersion && (semver.gt(currentVersion, latestVersion) || currentVersion === latestVersion)) + return null; return { ...pkg, - latestRange: latestVersion ? repeatPrefix(pkg.currentRange, latestVersion) : null, + latestRange: repeatPrefix(pkg.currentRange, latestVersion), } as any; }) ) - ).filter(({ latestRange, currentRange }) => latestRange != null && latestRange !== currentRange); + ); this.logger.consoleSuccess(); return outdatedPkgs; }