From 54adedcee5c7db9aa97e63b690d70521f26186b1 Mon Sep 17 00:00:00 2001 From: DimitarTachev Date: Fri, 5 Jul 2019 14:37:44 +0300 Subject: [PATCH] fix: make the update command behave similar to the logic before 6.0.0 --- lib/controllers/update-controller.ts | 73 ++++++++++++++++------------ lib/package-manager.ts | 3 ++ 2 files changed, 44 insertions(+), 32 deletions(-) diff --git a/lib/controllers/update-controller.ts b/lib/controllers/update-controller.ts index eefccb519f..8e662ce5b8 100644 --- a/lib/controllers/update-controller.ts +++ b/lib/controllers/update-controller.ts @@ -4,6 +4,20 @@ import * as constants from "../constants"; import { UpdateControllerBase } from "./update-controller-base"; export class UpdateController extends UpdateControllerBase implements IUpdateController { + private getTemplateManifest: Function; + static readonly updatableDependencies: string[] = [constants.TNS_CORE_MODULES_NAME, constants.TNS_CORE_MODULES_WIDGETS_NAME]; + static readonly folders: string[] = [ + constants.LIB_DIR_NAME, + constants.HOOKS_DIR_NAME, + constants.WEBPACK_CONFIG_NAME, + constants.PACKAGE_JSON_FILE_NAME, + constants.PACKAGE_LOCK_JSON_FILE_NAME + ]; + + static readonly backupFolder: string = ".update_backup"; + static readonly updateFailMessage: string = "Could not update the project!"; + static readonly backupFailMessage: string = "Could not backup project folders!"; + constructor( protected $fs: IFileSystem, protected $platformsDataService: IPlatformsDataService, @@ -16,23 +30,11 @@ export class UpdateController extends UpdateControllerBase implements IUpdateCon private $pluginsService: IPluginsService, private $pacoteService: IPacoteService, private $projectDataService: IProjectDataService) { - super($fs, $platformCommandHelper, $platformsDataService, $packageInstallationManager, $packageManager); - this.getTemplateManifest = _.memoize(this._getTemplateManifest, (...args) => { - return args.join("@"); - }); + super($fs, $platformCommandHelper, $platformsDataService, $packageInstallationManager, $packageManager); + this.getTemplateManifest = _.memoize(this._getTemplateManifest, (...args) => { + return args.join("@"); + }); } - private getTemplateManifest: Function; - static readonly folders: string[] = [ - constants.LIB_DIR_NAME, - constants.HOOKS_DIR_NAME, - constants.WEBPACK_CONFIG_NAME, - constants.PACKAGE_JSON_FILE_NAME, - constants.PACKAGE_LOCK_JSON_FILE_NAME - ]; - - static readonly backupFolder: string = ".update_backup"; - static readonly updateFailMessage: string = "Could not update the project!"; - static readonly backupFailMessage: string = "Could not backup project folders!"; public async update(updateOptions: IUpdateOptions): Promise { const projectData = this.$projectDataService.getProjectData(updateOptions.projectDir); @@ -55,16 +57,16 @@ export class UpdateController extends UpdateControllerBase implements IUpdateCon } } - public async shouldUpdate({projectDir, version}: {projectDir: string, version?: string}): Promise { + public async shouldUpdate({ projectDir, version }: { projectDir: string, version?: string }): Promise { const projectData = this.$projectDataService.getProjectData(projectDir); const templateName = this.getTemplateName(projectData); const templateManifest = await this.getTemplateManifest(templateName, version); - const dependencies = templateManifest.dependencies; - const devDependencies = templateManifest.devDependencies; + const dependencies = this.getUpdatableDependencies(templateManifest.dependencies); + const devDependencies = this.getUpdatableDependencies(templateManifest.devDependencies); if ( - await this.hasDependenciesToUpdate({dependencies, areDev: false, projectData}) || - await this.hasDependenciesToUpdate({dependencies: devDependencies, areDev: true, projectData}) + await this.hasDependenciesToUpdate({ dependencies, areDev: false, projectData }) || + await this.hasDependenciesToUpdate({ dependencies: devDependencies, areDev: true, projectData }) ) { return true; } @@ -93,12 +95,14 @@ export class UpdateController extends UpdateControllerBase implements IUpdateCon private async updateProject(projectData: IProjectData, version: string): Promise { const templateName = this.getTemplateName(projectData); const templateManifest = await this.getTemplateManifest(templateName, version); + const dependencies = this.getUpdatableDependencies(templateManifest.dependencies); + const devDependencies = this.getUpdatableDependencies(templateManifest.devDependencies); this.$logger.info("Start updating dependencies."); - await this.updateDependencies({ dependencies: templateManifest.dependencies, areDev: false, projectData}); + await this.updateDependencies({ dependencies, areDev: false, projectData }); this.$logger.info("Finished updating dependencies."); this.$logger.info("Start updating devDependencies."); - await this.updateDependencies({ dependencies: templateManifest.devDependencies, areDev: true, projectData}); + await this.updateDependencies({ dependencies: devDependencies, areDev: true, projectData }); this.$logger.info("Finished updating devDependencies."); this.$logger.info("Start updating runtimes."); @@ -114,7 +118,7 @@ export class UpdateController extends UpdateControllerBase implements IUpdateCon }); } - private async updateDependencies( {dependencies, areDev, projectData} : {dependencies: IDictionary, areDev: boolean, projectData: IProjectData}) { + private async updateDependencies({ dependencies, areDev, projectData }: { dependencies: IDictionary, areDev: boolean, projectData: IProjectData }) { for (const dependency in dependencies) { const templateVersion = dependencies[dependency]; if (!this.hasDependency({ packageName: dependency, isDev: areDev }, projectData)) { @@ -134,11 +138,10 @@ export class UpdateController extends UpdateControllerBase implements IUpdateCon const projectVersion = dependencies[dependency] || devDependencies[dependency]; const maxSatisfyingTargetVersion = await this.getMaxDependencyVersion(dependency, targetVersion); const maxSatisfyingProjectVersion = await this.getMaxDependencyVersion(dependency, projectVersion); - return maxSatisfyingProjectVersion && maxSatisfyingTargetVersion && semver.gt(maxSatisfyingTargetVersion, maxSatisfyingProjectVersion); } - private async hasDependenciesToUpdate({dependencies, areDev, projectData}: {dependencies: IDictionary, areDev: boolean, projectData:IProjectData}) { + private async hasDependenciesToUpdate({ dependencies, areDev, projectData }: { dependencies: IDictionary, areDev: boolean, projectData: IProjectData }) { for (const dependency in dependencies) { const templateVersion = dependencies[dependency]; if (!this.hasDependency({ packageName: dependency, isDev: areDev }, projectData)) { @@ -165,26 +168,32 @@ export class UpdateController extends UpdateControllerBase implements IUpdateCon } private async shouldUpdateRuntimeVersion(templateRuntimeVersion: string, frameworkPackageName: string, platform: string, projectData: IProjectData): Promise { - const hasRuntimeDependency = this.hasRuntimeDependency({platform, projectData}); + const hasRuntimeDependency = this.hasRuntimeDependency({ platform, projectData }); if (!hasRuntimeDependency) { return false; } const maxTemplateRuntimeVersion = await this.getMaxDependencyVersion(frameworkPackageName, templateRuntimeVersion); - const maxRuntimeVersion = await this.getMaxRuntimeVersion({platform, projectData}); + const maxRuntimeVersion = await this.getMaxRuntimeVersion({ platform, projectData }); return maxTemplateRuntimeVersion && maxRuntimeVersion && semver.gt(maxTemplateRuntimeVersion, maxRuntimeVersion); } - private async _getTemplateManifest(templateName: string, version: string) { - let packageVersion = version ? version : await this.$packageInstallationManager.getLatestCompatibleVersionSafe(templateName); - packageVersion = semver.valid(version) ? version : await this.$packageManager.getTagVersion(templateName, packageVersion); - packageVersion = packageVersion ? packageVersion : await this.$packageInstallationManager.getLatestCompatibleVersionSafe(templateName); + private async _getTemplateManifest(templateName: string, version?: string) { + const packageVersion = semver.valid(version) || + await this.$packageManager.getTagVersion(templateName, version) || + await this.$packageInstallationManager.getLatestCompatibleVersionSafe(templateName); return await this.$pacoteService.manifest(`${templateName}@${packageVersion}`, { fullMetadata: true }); } + private getUpdatableDependencies(dependencies: IDictionary): IDictionary { + return _.pickBy(dependencies, (value, key) => { + return UpdateController.updatableDependencies.indexOf(key) > -1; + }); + } + private getTemplateName(projectData: IProjectData) { let template; switch (projectData.projectType) { diff --git a/lib/package-manager.ts b/lib/package-manager.ts index 9359699f41..391825edaf 100644 --- a/lib/package-manager.ts +++ b/lib/package-manager.ts @@ -72,6 +72,9 @@ export class PackageManager implements IPackageManager { public async getTagVersion(packageName: string, tag: string): Promise { let version: string = null; + if (!tag) { + return null; + } try { const result = await this.view(packageName, { "dist-tags": true });