diff --git a/lib/npm-installation-manager.ts b/lib/npm-installation-manager.ts index 1fc8015910..462865fabc 100644 --- a/lib/npm-installation-manager.ts +++ b/lib/npm-installation-manager.ts @@ -20,15 +20,22 @@ export class NpmInstallationManager implements INpmInstallationManager { } public async getLatestCompatibleVersion(packageName: string): Promise { + const configVersion = this.$staticConfig.version; + const isPreReleaseVersion = (semver).prerelease(configVersion) !== null; + let cliVersionRange = `~${semver.major(configVersion)}.${(semver).minor(configVersion)}.0`; + if (isPreReleaseVersion) { + // if the user has some 0-19 pre-release version, include pre-release versions in the search query. + cliVersionRange = `~${configVersion}`; + } - let cliVersionRange = `~${this.$staticConfig.version}`; let latestVersion = await this.getLatestVersion(packageName); if (semver.satisfies(latestVersion, cliVersionRange)) { return latestVersion; } let data = await this.$npm.view(packageName, { "versions": true }); - return semver.maxSatisfying(data, cliVersionRange) || latestVersion; + let maxSatisfying = semver.maxSatisfying(data, cliVersionRange); + return maxSatisfying || latestVersion; } public async install(packageName: string, projectDir: string, opts?: INpmInstallOptions): Promise { diff --git a/test/npm-installation-manager.ts b/test/npm-installation-manager.ts index a65ca053b4..6e98828c14 100644 --- a/test/npm-installation-manager.ts +++ b/test/npm-installation-manager.ts @@ -146,6 +146,12 @@ describe("Npm installation manager tests", () => { packageLatestVersion: "1.4.0", cliVersion: "1.6.0-2016-10-01-182", expectedResult: "1.4.0" + }, + "When CLI Version has patch version larger than an existing package, should return max compliant package from the same major.minor version": { + versions: ["1.0.0", "1.0.1", "1.4.0", "2.5.0", "2.5.1", "2.5.2"], + packageLatestVersion: "3.0.0", + cliVersion: "2.5.4", + expectedResult: "2.5.2" } };