diff --git a/lib/constants.ts b/lib/constants.ts index 804e955644..032f6986d9 100644 --- a/lib/constants.ts +++ b/lib/constants.ts @@ -6,3 +6,14 @@ export var DEFAULT_PROJECT_NAME = "HelloNativescript"; export var APP_RESOURCES_FOLDER_NAME = "App_Resources"; export var PROJECT_FRAMEWORK_FOLDER_NAME = "framework"; +export class ReleaseType { + static MAJOR = "major"; + static PREMAJOR = "premajor"; + static MINOR = "minor"; + static PREMINOR = "preminor"; + static PATCH = "patch"; + static PREPATCH = "prepatch"; + static PRERELEASE = "prerelease"; +} + + diff --git a/lib/declarations.ts b/lib/declarations.ts index 2b4bc9b0fe..0f810c9316 100644 --- a/lib/declarations.ts +++ b/lib/declarations.ts @@ -5,3 +5,4 @@ interface INodePackageManager { } interface IStaticConfig extends Config.IStaticConfig { } + diff --git a/lib/definitions/semver.d.ts b/lib/definitions/semver.d.ts index 95fa0ed93e..ae84b5cbdf 100644 --- a/lib/definitions/semver.d.ts +++ b/lib/definitions/semver.d.ts @@ -1,4 +1,14 @@ + declare module "semver" { function gt(version1: string, version2: string): boolean; function lt(version1: string, version2: string): boolean; -} \ No newline at end of file + function valid(version: string): boolean; + function inc(version: string, release: string): string; + function inc(version: string, release: "major"): string; + function inc(version: string, release: 'premajor'): string; + function inc(version: string, release: 'minor'): string; + function inc(version: string, release: 'preminor'): string; + function inc(version: string, release: 'patch'): string; + function inc(version: string, release: 'prepatch'): string; + function inc(version: string, release: 'prerelease'): string; +} diff --git a/lib/node-package-manager.ts b/lib/node-package-manager.ts index 6700730b3e..21a8d2623e 100644 --- a/lib/node-package-manager.ts +++ b/lib/node-package-manager.ts @@ -3,8 +3,10 @@ import Future = require("fibers/future"); import npm = require("npm"); import path = require("path"); +import semver = require("semver"); import shell = require("shelljs"); import helpers = require("./common/helpers"); +import constants = require("./constants"); export class NodePackageManager implements INodePackageManager { private static NPM_LOAD_FAILED = "Failed to retrieve data from npm. Please try again a little bit later."; @@ -12,7 +14,8 @@ export class NodePackageManager implements INodePackageManager { constructor(private $logger: ILogger, private $errors: IErrors, - private $httpClient: Server.IHttpClient) { } + private $httpClient: Server.IHttpClient, + private $staticConfig: IStaticConfig) { } public get cache(): string { return npm.cache; @@ -43,7 +46,6 @@ export class NodePackageManager implements INodePackageManager { } this.installCore(pathToSave, packageToInstall).wait(); - } catch(error) { this.$logger.debug(error); this.$errors.fail(NodePackageManager.NPM_LOAD_FAILED); @@ -54,9 +56,18 @@ export class NodePackageManager implements INodePackageManager { }).future()(); } - private installCore(where: string, what: string): IFuture { - var future = new Future(); - npm.commands["install"](where, what, (err, data) => { + private installCore(packageName: string, pathToSave: string): IFuture { + var currentVersion = this.$staticConfig.version; + if(!semver.valid(currentVersion)) { + this.$errors.fail("Invalid version."); + } + + var incrementedVersion = semver.inc(currentVersion, constants.ReleaseType.MINOR); + packageName = packageName + "@" + "<" + incrementedVersion; + this.$logger.trace("Installing", packageName); + + var future = new Future(); + npm.commands["install"](pathToSave, packageName, (err, data) => { if(err) { future.throw(err); } else {