diff --git a/lib/npm-installation-manager.ts b/lib/npm-installation-manager.ts index 7b8d91c254..3c5697c5cc 100644 --- a/lib/npm-installation-manager.ts +++ b/lib/npm-installation-manager.ts @@ -26,15 +26,22 @@ export class NpmInstallationManager implements INpmInstallationManager { public getLatestCompatibleVersion(packageName: string): IFuture { return (() => { + 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 = this.getLatestVersion(packageName).wait(); if (semver.satisfies(latestVersion, cliVersionRange)) { return latestVersion; } let data = this.$npm.view(packageName, { json: true, "versions": true }).wait(); - return semver.maxSatisfying(data, cliVersionRange) || latestVersion; + let maxSatisfying = semver.maxSatisfying(data, cliVersionRange); + return maxSatisfying || latestVersion; }).future()(); } diff --git a/lib/services/project-service.ts b/lib/services/project-service.ts index b4f537f510..f787510ccb 100644 --- a/lib/services/project-service.ts +++ b/lib/services/project-service.ts @@ -6,6 +6,7 @@ import * as shelljs from "shelljs"; export class ProjectService implements IProjectService { constructor(private $npm: INodePackageManager, + private $npmInstallationManager: INpmInstallationManager, private $errors: IErrors, private $fs: IFileSystem, private $logger: ILogger, @@ -166,7 +167,8 @@ export class ProjectService implements IProjectService { if (tnsModulesVersion) { packageName = `${packageName}@${tnsModulesVersion}`; } - this.$npm.install(packageName, projectDir, { save: true, "save-exact": true }).wait(); + + this.$npmInstallationManager.install(packageName, projectDir, { dependencyType: "save" }).wait(); }).future()(); } diff --git a/package.json b/package.json index ae688828d8..de4729f552 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "properties-parser": "0.2.3", "ref": "https://github.com/icenium/ref/tarball/v1.3.2.3", "ref-struct": "https://github.com/telerik/ref-struct/tarball/v1.0.2.5", - "semver": "5.0.1", + "semver": "5.3.0", "shelljs": "0.7.6", "source-map": "0.5.6", "tabtab": "https://github.com/Icenium/node-tabtab/tarball/master", diff --git a/test/npm-installation-manager.ts b/test/npm-installation-manager.ts index de732fa64f..334aa2b4a6 100644 --- a/test/npm-installation-manager.ts +++ b/test/npm-installation-manager.ts @@ -149,6 +149,13 @@ 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" } };