From 6196b64da4eb2207e0ee36264b5e6fd1d82ad64e Mon Sep 17 00:00:00 2001 From: Igor Randjelovic Date: Mon, 7 Sep 2020 14:21:48 +0200 Subject: [PATCH 1/2] refactor: move package managers into a dir --- lib/bootstrap.ts | 10 +++++----- .../base-package-manager.ts | 6 +++--- .../index.ts} | 17 +++++++++++------ .../npm.ts} | 14 +++++++------- .../package-installation-manager.ts | 10 +++++----- .../pnpm.ts} | 14 +++++++------- .../yarn.ts} | 12 ++++++------ test/controllers/add-platform-controller.ts | 14 +++++++------- test/ios-project-service.ts | 10 +++++----- test/node-package-manager.ts | 8 ++++---- test/package-installation-manager.ts | 16 ++++++++-------- test/plugins-service.ts | 16 ++++++++-------- test/services/extensibility-service.ts | 14 +++++++------- 13 files changed, 83 insertions(+), 78 deletions(-) rename lib/{ => package-managers}/base-package-manager.ts (97%) rename lib/{package-manager.ts => package-managers/index.ts} (91%) rename lib/{node-package-manager.ts => package-managers/npm.ts} (94%) rename lib/{ => package-managers}/package-installation-manager.ts (97%) rename lib/{pnpm-package-manager.ts => package-managers/pnpm.ts} (92%) rename lib/{yarn-package-manager.ts => package-managers/yarn.ts} (93%) diff --git a/lib/bootstrap.ts b/lib/bootstrap.ts index 8d026034d4..3aa5da96c3 100644 --- a/lib/bootstrap.ts +++ b/lib/bootstrap.ts @@ -210,10 +210,10 @@ injector.require( injector.requireCommand("setup|*", "./commands/setup"); -injector.requirePublic("packageManager", "./package-manager"); -injector.requirePublic("npm", "./node-package-manager"); -injector.requirePublic("yarn", "./yarn-package-manager"); -injector.requirePublic("pnpm", "./pnpm-package-manager"); +injector.requirePublic("packageManager", "./package-managers/index"); +injector.requirePublic("npm", "./package-managers/npm"); +injector.requirePublic("pnpm", "./package-managers/pnpm"); +injector.requirePublic("yarn", "./package-managers/yarn"); injector.requireCommand( "package-manager|*get", "./commands/package-manager-get" @@ -225,7 +225,7 @@ injector.requireCommand( injector.require( "packageInstallationManager", - "./package-installation-manager" + "./package-managers/package-installation-manager" ); injector.require("deviceLogProvider", "./common/mobile/device-log-provider"); diff --git a/lib/base-package-manager.ts b/lib/package-managers/base-package-manager.ts similarity index 97% rename from lib/base-package-manager.ts rename to lib/package-managers/base-package-manager.ts index a534fb799d..26abcc5240 100644 --- a/lib/base-package-manager.ts +++ b/lib/package-managers/base-package-manager.ts @@ -1,17 +1,17 @@ -import { isInteractive } from "./common/helpers"; +import { isInteractive } from "../common/helpers"; import { INodePackageManager, INodePackageManagerInstallOptions, INpmInstallResultInfo, INpmsResult, INpmPackageNameParts, -} from "./declarations"; +} from "../declarations"; import { IDictionary, IChildProcess, IFileSystem, IHostInfo, -} from "./common/declarations"; +} from "../common/declarations"; export abstract class BasePackageManager implements INodePackageManager { public abstract install( diff --git a/lib/package-manager.ts b/lib/package-managers/index.ts similarity index 91% rename from lib/package-manager.ts rename to lib/package-managers/index.ts index 3ba18aaf9e..58dea040dc 100644 --- a/lib/package-manager.ts +++ b/lib/package-managers/index.ts @@ -1,6 +1,6 @@ -import { cache, exported, invokeInit } from "./common/decorators"; -import { performanceLog } from "./common/decorators"; -import { PackageManagers } from "./constants"; +import { cache, exported, invokeInit } from "../common/decorators"; +import { performanceLog } from "../common/decorators"; +import { PackageManagers } from "../constants"; import { IPackageManager, INodePackageManager, @@ -9,13 +9,14 @@ import { INpmInstallResultInfo, INpmsResult, INpmPackageNameParts, -} from "./declarations"; +} from "../declarations"; import { IErrors, IUserSettingsService, IDictionary, -} from "./common/declarations"; -import { injector } from "./common/yok"; +} from "../common/declarations"; +import { injector } from "../common/yok"; + export class PackageManager implements IPackageManager { private packageManager: INodePackageManager; private _packageManagerName: string; @@ -153,4 +154,8 @@ export class PackageManager implements IPackageManager { } } +// export { NPM } from './npm' +// export { PNPM } from './pnpm' +// export { Yarn } from './yarn' + injector.register("packageManager", PackageManager); diff --git a/lib/node-package-manager.ts b/lib/package-managers/npm.ts similarity index 94% rename from lib/node-package-manager.ts rename to lib/package-managers/npm.ts index da125893b5..9c319bd49f 100644 --- a/lib/node-package-manager.ts +++ b/lib/package-managers/npm.ts @@ -1,23 +1,23 @@ import { join, relative } from "path"; import { BasePackageManager } from "./base-package-manager"; -import { exported, cache } from "./common/decorators"; -import { CACACHE_DIRECTORY_NAME } from "./constants"; +import { exported, cache } from "../common/decorators"; +import { CACACHE_DIRECTORY_NAME } from "../constants"; import * as _ from "lodash"; import { INodePackageManagerInstallOptions, INpmInstallResultInfo, INpmsResult, -} from "./declarations"; +} from "../declarations"; import { IChildProcess, IErrors, IFileSystem, IHostInfo, Server, -} from "./common/declarations"; -import { injector } from "./common/yok"; +} from "../common/declarations"; +import { injector } from "../common/yok"; -export class NodePackageManager extends BasePackageManager { +export class NPM extends BasePackageManager { constructor( $childProcess: IChildProcess, private $errors: IErrors, @@ -167,4 +167,4 @@ export class NodePackageManager extends BasePackageManager { } } -injector.register("npm", NodePackageManager); +injector.register("npm", NPM); diff --git a/lib/package-installation-manager.ts b/lib/package-managers/package-installation-manager.ts similarity index 97% rename from lib/package-installation-manager.ts rename to lib/package-managers/package-installation-manager.ts index c8519bf02d..338000ec1f 100644 --- a/lib/package-installation-manager.ts +++ b/lib/package-managers/package-installation-manager.ts @@ -1,20 +1,20 @@ import * as path from "path"; -import * as constants from "./constants"; +import * as constants from "../constants"; import { INpmInstallOptions, INpmInstallResultInfo, IPackageInstallationManager, IPackageManager, IStaticConfig, -} from "./declarations"; -import { IProjectDataService } from "./definitions/project"; +} from "../declarations"; +import { IProjectDataService } from "../definitions/project"; import { IChildProcess, IDictionary, IFileSystem, ISettingsService, -} from "./common/declarations"; -import { injector } from "./common/yok"; +} from "../common/declarations"; +import { injector } from "../common/yok"; const semver = require("semver"); diff --git a/lib/pnpm-package-manager.ts b/lib/package-managers/pnpm.ts similarity index 92% rename from lib/pnpm-package-manager.ts rename to lib/package-managers/pnpm.ts index 285ce882d6..fdd37cd68d 100644 --- a/lib/pnpm-package-manager.ts +++ b/lib/package-managers/pnpm.ts @@ -1,13 +1,13 @@ import * as path from "path"; import * as _ from "lodash"; import { BasePackageManager } from "./base-package-manager"; -import { exported } from "./common/decorators"; -import { CACACHE_DIRECTORY_NAME } from "./constants"; +import { exported } from "../common/decorators"; +import { CACACHE_DIRECTORY_NAME } from "../constants"; import { INodePackageManagerInstallOptions, INpmInstallResultInfo, INpmsResult, -} from "./declarations"; +} from "../declarations"; import { IChildProcess, IErrors, @@ -15,10 +15,10 @@ import { IHostInfo, Server, IDictionary, -} from "./common/declarations"; -import { injector } from "./common/yok"; +} from "../common/declarations"; +import { injector } from "../common/yok"; -export class PnpmPackageManager extends BasePackageManager { +export class PNPM extends BasePackageManager { constructor( $childProcess: IChildProcess, private $errors: IErrors, @@ -145,4 +145,4 @@ export class PnpmPackageManager extends BasePackageManager { } } -injector.register("pnpm", PnpmPackageManager); +injector.register("pnpm", PNPM); diff --git a/lib/yarn-package-manager.ts b/lib/package-managers/yarn.ts similarity index 93% rename from lib/yarn-package-manager.ts rename to lib/package-managers/yarn.ts index b235efdc10..f3ed7891df 100644 --- a/lib/yarn-package-manager.ts +++ b/lib/package-managers/yarn.ts @@ -1,12 +1,12 @@ import * as path from "path"; import * as _ from "lodash"; import { BasePackageManager } from "./base-package-manager"; -import { exported } from "./common/decorators"; +import { exported } from "../common/decorators"; import { INodePackageManagerInstallOptions, INpmInstallResultInfo, INpmsResult, -} from "./declarations"; +} from "../declarations"; import { IChildProcess, IErrors, @@ -14,10 +14,10 @@ import { IHostInfo, Server, IDictionary, -} from "./common/declarations"; -import { injector } from "./common/yok"; +} from "../common/declarations"; +import { injector } from "../common/yok"; -export class YarnPackageManager extends BasePackageManager { +export class Yarn extends BasePackageManager { constructor( $childProcess: IChildProcess, private $errors: IErrors, @@ -143,4 +143,4 @@ export class YarnPackageManager extends BasePackageManager { } } -injector.register("yarn", YarnPackageManager); +injector.register("yarn", Yarn); diff --git a/test/controllers/add-platform-controller.ts b/test/controllers/add-platform-controller.ts index 815556c4b7..9cbcfd861f 100644 --- a/test/controllers/add-platform-controller.ts +++ b/test/controllers/add-platform-controller.ts @@ -5,10 +5,10 @@ import { assert } from "chai"; import { format } from "util"; import * as _ from "lodash"; import { AddPlaformErrors } from "../../lib/constants"; -import { PackageManager } from "../../lib/package-manager"; -import { NodePackageManager } from "../../lib/node-package-manager"; -import { YarnPackageManager } from "../../lib/yarn-package-manager"; -import { PnpmPackageManager } from "../../lib/pnpm-package-manager"; +import { PackageManager } from "../../lib/package-managers"; +import { NPM } from "../../lib/package-managers/npm"; +import { PNPM } from "../../lib/package-managers/pnpm"; +import { Yarn } from "../../lib/package-managers/yarn"; let actualMessage: string = null; const latestFrameworkVersion = "5.3.1"; @@ -26,9 +26,9 @@ function createInjector(data?: { latestFrameworkVersion: string }) { trackEventActionInGoogleAnalytics: () => ({}), }); injector.register("packageManager", PackageManager); - injector.register("npm", NodePackageManager); - injector.register("yarn", YarnPackageManager); - injector.register("pnpm", PnpmPackageManager); + injector.register("npm", NPM); + injector.register("yarn", Yarn); + injector.register("pnpm", PNPM); injector.register("userSettingsService", { getSettingValue: async (settingName: string): Promise => undefined, }); diff --git a/test/ios-project-service.ts b/test/ios-project-service.ts index 52589da2d9..18ae31a7c8 100644 --- a/test/ios-project-service.ts +++ b/test/ios-project-service.ts @@ -24,9 +24,9 @@ import { IOSDeviceDiscovery } from "../lib/common/mobile/mobile-core/ios-device- import { AndroidDeviceDiscovery } from "../lib/common/mobile/mobile-core/android-device-discovery"; import { Utils } from "../lib/common/utils"; import { CocoaPodsService } from "../lib/services/cocoapods-service"; -import { PackageManager } from "../lib/package-manager"; -import { NodePackageManager } from "../lib/node-package-manager"; -import { YarnPackageManager } from "../lib/yarn-package-manager"; +import { PackageManager } from "../lib/package-managers"; +import { NPM } from "../lib/package-managers/npm"; +import { Yarn } from "../lib/package-managers/yarn"; import { assert } from "chai"; import { SettingsService } from "../lib/common/test/unit-tests/stubs"; @@ -173,8 +173,8 @@ function createTestInjector( getSettingValue: async (settingName: string): Promise => undefined, }); testInjector.register("packageManager", PackageManager); - testInjector.register("npm", NodePackageManager); - testInjector.register("yarn", YarnPackageManager); + testInjector.register("npm", NPM); + testInjector.register("yarn", Yarn); testInjector.register("xcconfigService", XcconfigService); testInjector.register("settingsService", SettingsService); testInjector.register("httpClient", {}); diff --git a/test/node-package-manager.ts b/test/node-package-manager.ts index 27efb270f3..79af0c71d0 100644 --- a/test/node-package-manager.ts +++ b/test/node-package-manager.ts @@ -1,7 +1,7 @@ import { Yok } from "../lib/common/yok"; import * as stubs from "./stubs"; import { assert } from "chai"; -import { NodePackageManager } from "../lib/node-package-manager"; +import { NPM } from "../lib/package-managers/npm"; import { IInjector } from "../lib/common/definitions/yok"; function createTestInjector(configuration: {} = {}): IInjector { @@ -12,7 +12,7 @@ function createTestInjector(configuration: {} = {}): IInjector { injector.register("childProcess", stubs.ChildProcessStub); injector.register("httpClient", {}); injector.register("fs", stubs.FileSystemStub); - injector.register("npm", NodePackageManager); + injector.register("npm", NPM); injector.register("pacoteService", { manifest: () => Promise.resolve(), }); @@ -52,7 +52,7 @@ describe("node-package-manager", () => { ].forEach((testCase) => { it(testCase.name, async () => { const testInjector = createTestInjector(); - const npm = testInjector.resolve("npm"); + const npm = testInjector.resolve("npm"); const templateNameParts = await npm.getPackageNameParts( testCase.templateFullName ); @@ -87,7 +87,7 @@ describe("node-package-manager", () => { ].forEach((testCase) => { it(testCase.name, async () => { const testInjector = createTestInjector(); - const npm = testInjector.resolve("npm"); + const npm = testInjector.resolve("npm"); const templateFullName = await npm.getPackageFullName({ name: testCase.templateName, version: testCase.templateVersion, diff --git a/test/package-installation-manager.ts b/test/package-installation-manager.ts index 64878d987a..767c394316 100644 --- a/test/package-installation-manager.ts +++ b/test/package-installation-manager.ts @@ -4,11 +4,11 @@ import * as ErrorsLib from "../lib/common/errors"; import * as FsLib from "../lib/common/file-system"; import * as HostInfoLib from "../lib/common/host-info"; import * as LoggerLib from "../lib/common/logger/logger"; -import * as NpmLib from "../lib/node-package-manager"; -import * as YarnLib from "../lib/yarn-package-manager"; -import * as PnpmLib from "../lib/pnpm-package-manager"; -import * as PackageManagerLib from "../lib/package-manager"; -import * as PackageInstallationManagerLib from "../lib/package-installation-manager"; +import * as NpmLib from "../lib/package-managers/npm"; +import * as YarnLib from "../lib/package-managers/yarn"; +import * as PnpmLib from "../lib/package-managers/pnpm"; +import * as PackageManagerLib from "../lib/package-managers"; +import * as PackageInstallationManagerLib from "../lib/package-managers/package-installation-manager"; import * as OptionsLib from "../lib/options"; import * as StaticConfigLib from "../lib/config"; import * as yok from "../lib/common/yok"; @@ -44,9 +44,9 @@ function createTestInjector(): IInjector { testInjector.register("userSettingsService", { getSettingValue: async (settingName: string): Promise => undefined, }); - testInjector.register("npm", NpmLib.NodePackageManager); - testInjector.register("yarn", YarnLib.YarnPackageManager); - testInjector.register("pnpm", PnpmLib.PnpmPackageManager); + testInjector.register("npm", NpmLib.NPM); + testInjector.register("pnpm", PnpmLib.PNPM); + testInjector.register("yarn", YarnLib.Yarn); testInjector.register("packageManager", PackageManagerLib.PackageManager); testInjector.register( "packageInstallationManager", diff --git a/test/plugins-service.ts b/test/plugins-service.ts index 4a5e5a75b4..45e92d869b 100644 --- a/test/plugins-service.ts +++ b/test/plugins-service.ts @@ -1,10 +1,10 @@ import { Yok } from "../lib/common/yok"; import * as stubs from "./stubs"; -import { PackageManager } from "../lib/package-manager"; -import { PackageInstallationManager } from "../lib/package-installation-manager"; -import { NodePackageManager } from "../lib/node-package-manager"; -import { YarnPackageManager } from "../lib/yarn-package-manager"; -import { PnpmPackageManager } from "../lib/pnpm-package-manager"; +import { PackageManager } from "../lib/package-managers"; +import { PackageInstallationManager } from "../lib/package-managers/package-installation-manager"; +import { NPM } from "../lib/package-managers/npm"; +import { PNPM } from "../lib/package-managers/pnpm"; +import { Yarn } from "../lib/package-managers/yarn"; import { ProjectData } from "../lib/project-data"; import { ChildProcess } from "../lib/common/child-process"; import { Options } from "../lib/options"; @@ -68,9 +68,9 @@ function createTestInjector() { getSettingValue: async (settingName: string): Promise => undefined, }); testInjector.register("packageManager", PackageManager); - testInjector.register("npm", NodePackageManager); - testInjector.register("yarn", YarnPackageManager); - testInjector.register("pnpm", PnpmPackageManager); + testInjector.register("npm", NPM); + testInjector.register("yarn", Yarn); + testInjector.register("pnpm", PNPM); testInjector.register("fs", FileSystem); // const fileSystemStub = new stubs.FileSystemStub(); // fileSystemStub.exists = (fileName: string) => { diff --git a/test/services/extensibility-service.ts b/test/services/extensibility-service.ts index b6dbca09b5..1e9fa96862 100644 --- a/test/services/extensibility-service.ts +++ b/test/services/extensibility-service.ts @@ -2,10 +2,10 @@ import { ExtensibilityService } from "../../lib/services/extensibility-service"; import { Yok } from "../../lib/common/yok"; import * as stubs from "../stubs"; import { assert } from "chai"; -import { NodePackageManager } from "../../lib/node-package-manager"; -import { PackageManager } from "../../lib/package-manager"; -import { YarnPackageManager } from "../../lib/yarn-package-manager"; -import { PnpmPackageManager } from "../../lib/pnpm-package-manager"; +import { PackageManager } from "../../lib/package-managers"; +import { NPM } from "../../lib/package-managers/npm"; +import { PNPM } from "../../lib/package-managers/pnpm"; +import { Yarn } from "../../lib/package-managers/yarn"; import * as constants from "../../lib/constants"; import { ChildProcess } from "../../lib/common/child-process"; import { CommandsDelimiters } from "../../lib/common/constants"; @@ -69,9 +69,9 @@ describe("extensibilityService", () => { testInjector.register("userSettingsService", { getSettingValue: async (settingName: string): Promise => undefined, }); - testInjector.register("npm", NodePackageManager); - testInjector.register("yarn", YarnPackageManager); - testInjector.register("pnpm", PnpmPackageManager); + testInjector.register("npm", NPM); + testInjector.register("yarn", Yarn); + testInjector.register("pnpm", PNPM); testInjector.register("settingsService", SettingsService); testInjector.register("requireService", { require: (pathToRequire: string): any => undefined, From 030c3f020231217f7a9a49e7021050c4a463b09e Mon Sep 17 00:00:00 2001 From: Igor Randjelovic Date: Mon, 7 Sep 2020 15:15:10 +0200 Subject: [PATCH 2/2] feat: add initial interfaces for package-management --- lib/package-managers/declarations.d.ts | 75 ++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 lib/package-managers/declarations.d.ts diff --git a/lib/package-managers/declarations.d.ts b/lib/package-managers/declarations.d.ts new file mode 100644 index 0000000000..fd3ff8fdfc --- /dev/null +++ b/lib/package-managers/declarations.d.ts @@ -0,0 +1,75 @@ +// This is a WIP declaration file and it is not being used yet + +interface IPackageJSON { + name?: string; + version?: string; + dependencies?: any; + devDependencies?: any; + + [key: string]: any; +} + +interface IPackageInfo { + name: string; + version: string; +} + +/** + * A package identifier can be any of the following: + * - + * - @ + * - @ + * - @ + * - + * - + * - + * - + */ +type IPackageIdentifier = string; + +interface IPackageManagerOptions { + projectPath?: string; +} +interface IPackageManagerAddOptions extends IPackageManagerOptions { + version?: string; + exact?: boolean; + scripts?: boolean; + + // these 3 are shared with the remove options, however + // they are duplicated as they don't quite make sense + // to be added to IPackageManagerOptions as they are + // specific to add and remove operations + save?: boolean; + dev?: boolean; + optional?: boolean; +} +interface IPackageManagerRemoveOptions extends IPackageManagerOptions { + save?: boolean; + dev?: boolean; + optional?: boolean; +} + +interface IPackageManager { + add( + packageIdentifier: IPackageIdentifier, + options?: IPackageManagerAddOptions + ): Promise; + install( + packageIdentifier: IPackageIdentifier, + options?: IPackageManagerAddOptions + ): Promise; + + remove( + packageIdentifier: IPackageIdentifier, + options?: IPackageManagerRemoveOptions + ): Promise; + uninstall( + packageIdentifier: IPackageIdentifier, + options?: IPackageManagerRemoveOptions + ): Promise; + + getInstalledPackage( + packageIdentifier: IPackageIdentifier + ): Promise; + getPackageJson(packageIdentifier: IPackageIdentifier): Promise; +}