From 59465f34a27acdd804add13b2306a5cc1b3f9b9f Mon Sep 17 00:00:00 2001 From: Igor Randjelovic Date: Wed, 20 Oct 2021 16:18:31 +0200 Subject: [PATCH 1/2] feat(config): cli.packageManager override --- lib/definitions/project.d.ts | 2 +- lib/package-manager.ts | 17 ++++++++++++++++- test/ios-project-service.ts | 2 ++ test/package-installation-manager.ts | 3 ++- test/plugins-service.ts | 4 ++++ test/services/extensibility-service.ts | 4 ++++ 6 files changed, 29 insertions(+), 3 deletions(-) diff --git a/lib/definitions/project.d.ts b/lib/definitions/project.d.ts index a7467b90eb..45eecd2de7 100644 --- a/lib/definitions/project.d.ts +++ b/lib/definitions/project.d.ts @@ -346,7 +346,7 @@ interface IProjectConfigService { * Get value for a given config key path * @param key the property key path */ - getValue(key: string): any; + getValue(key: string, defaultValue?: any): any; /** * Set value for a given config key path * @param key the property key path diff --git a/lib/package-manager.ts b/lib/package-manager.ts index 3ba18aaf9e..8ad92b64f8 100644 --- a/lib/package-manager.ts +++ b/lib/package-manager.ts @@ -16,6 +16,7 @@ import { IDictionary, } from "./common/declarations"; import { injector } from "./common/yok"; +import { IProjectConfigService } from "./definitions/project"; export class PackageManager implements IPackageManager { private packageManager: INodePackageManager; private _packageManagerName: string; @@ -27,7 +28,8 @@ export class PackageManager implements IPackageManager { private $yarn: INodePackageManager, private $pnpm: INodePackageManager, private $logger: ILogger, - private $userSettingsService: IUserSettingsService + private $userSettingsService: IUserSettingsService, + private $projectConfigService: IProjectConfigService ) {} @cache() @@ -134,6 +136,19 @@ export class PackageManager implements IPackageManager { let pm = null; try { pm = await this.$userSettingsService.getSettingValue("packageManager"); + + // try reading from project config - errors will be caught and the + // above will be used (if set) before falling back to the default + const configPm = this.$projectConfigService.getValue( + "cli.packageManager" + ); + + if (configPm) { + this.$logger.trace( + `Determined packageManager to use from user config is: ${configPm}` + ); + pm = configPm; + } } catch (err) { this.$errors.fail( `Unable to read package manager config from user settings ${err}` diff --git a/test/ios-project-service.ts b/test/ios-project-service.ts index 5993c6d124..6de7894a86 100644 --- a/test/ios-project-service.ts +++ b/test/ios-project-service.ts @@ -35,6 +35,7 @@ import { ProjectDataStub, TempServiceStub, ProjectDataServiceStub, + ProjectConfigServiceStub, } from "./stubs"; import { xcode } from "../lib/node/xcode"; import temp = require("temp"); @@ -172,6 +173,7 @@ function createTestInjector( getSettingValue: async (settingName: string): Promise => undefined, }); testInjector.register("packageManager", PackageManager); + testInjector.register("projectConfigService", ProjectConfigServiceStub); testInjector.register("npm", NodePackageManager); testInjector.register("yarn", YarnPackageManager); testInjector.register("xcconfigService", XcconfigService); diff --git a/test/package-installation-manager.ts b/test/package-installation-manager.ts index 64878d987a..9b9bcea58d 100644 --- a/test/package-installation-manager.ts +++ b/test/package-installation-manager.ts @@ -15,7 +15,7 @@ import * as yok from "../lib/common/yok"; import ChildProcessLib = require("../lib/common/child-process"); import { SettingsService } from "../lib/common/test/unit-tests/stubs"; import { ProjectDataService } from "../lib/services/project-data-service"; -import { ProjectDataStub } from "./stubs"; +import { ProjectConfigServiceStub, ProjectDataStub } from "./stubs"; import { IInjector } from "../lib/common/definitions/yok"; import * as _ from "lodash"; import { IDictionary } from "../lib/common/declarations"; @@ -48,6 +48,7 @@ function createTestInjector(): IInjector { testInjector.register("yarn", YarnLib.YarnPackageManager); testInjector.register("pnpm", PnpmLib.PnpmPackageManager); testInjector.register("packageManager", PackageManagerLib.PackageManager); + testInjector.register("projectConfigService", ProjectConfigServiceStub); testInjector.register( "packageInstallationManager", PackageInstallationManagerLib.PackageInstallationManager diff --git a/test/plugins-service.ts b/test/plugins-service.ts index 4a5e5a75b4..d5b74fd4ba 100644 --- a/test/plugins-service.ts +++ b/test/plugins-service.ts @@ -68,6 +68,10 @@ function createTestInjector() { getSettingValue: async (settingName: string): Promise => undefined, }); testInjector.register("packageManager", PackageManager); + testInjector.register( + "projectConfigService", + stubs.PackageInstallationManagerStub + ); testInjector.register("npm", NodePackageManager); testInjector.register("yarn", YarnPackageManager); testInjector.register("pnpm", PnpmPackageManager); diff --git a/test/services/extensibility-service.ts b/test/services/extensibility-service.ts index b6dbca09b5..672ff84db0 100644 --- a/test/services/extensibility-service.ts +++ b/test/services/extensibility-service.ts @@ -57,6 +57,10 @@ describe("extensibilityService", () => { testInjector.register("hostInfo", HostInfo); testInjector.register("httpClient", {}); testInjector.register("packageManager", PackageManager); + testInjector.register( + "projectConfigService", + stubs.ProjectConfigServiceStub + ); testInjector.register("options", {}); testInjector.register("pacoteService", { manifest: async ( From ec79f75ef96fd0c684d36a9f1e535c0a6680e07c Mon Sep 17 00:00:00 2001 From: Igor Randjelovic Date: Wed, 20 Oct 2021 16:23:25 +0200 Subject: [PATCH 2/2] fix: ignore errors when config reading fails --- lib/package-manager.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/package-manager.ts b/lib/package-manager.ts index 8ad92b64f8..8bc54a92cf 100644 --- a/lib/package-manager.ts +++ b/lib/package-manager.ts @@ -136,9 +136,13 @@ export class PackageManager implements IPackageManager { let pm = null; try { pm = await this.$userSettingsService.getSettingValue("packageManager"); + } catch (err) { + this.$errors.fail( + `Unable to read package manager config from user settings ${err}` + ); + } - // try reading from project config - errors will be caught and the - // above will be used (if set) before falling back to the default + try { const configPm = this.$projectConfigService.getValue( "cli.packageManager" ); @@ -150,8 +154,10 @@ export class PackageManager implements IPackageManager { pm = configPm; } } catch (err) { - this.$errors.fail( - `Unable to read package manager config from user settings ${err}` + // ignore error, but log info + this.$logger.trace( + "Tried to read cli.packageManager from project config and failed. Error is: ", + err ); }