Skip to content

Commit 7f14263

Browse files
authored
Merge pull request #10 from mflor35/refactor/pkg-mgr-replace
refactor() - [Yarn Support - Part 2] - Replace npm with package manag…
2 parents 1364bec + 90d6e95 commit 7f14263

22 files changed

+100
-35
lines changed

lib/bootstrap.ts

+4
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,11 @@ $injector.require("itmsTransporterService", "./services/itmstransporter-service"
7979
$injector.requireCommand("setup|*", "./commands/setup");
8080
$injector.requireCommand(["setup|cloud", "cloud|setup"], "./commands/setup");
8181

82+
$injector.requirePublic("packageManager", "./package-manager");
8283
$injector.requirePublic("npm", "./node-package-manager");
84+
$injector.requirePublic("yarn", "./yarn-package-manager");
85+
$injector.requireCommand("package-manager|set", "./commands/package-manager-set");
86+
8387
$injector.require("npmInstallationManager", "./npm-installation-manager");
8488
$injector.require("dynamicHelpProvider", "./dynamic-help-provider");
8589
$injector.require("mobilePlatformsCapabilities", "./mobile-platforms-capabilities");

lib/commands/install.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export class InstallCommand implements ICommand {
1313
private $logger: ILogger,
1414
private $fs: IFileSystem,
1515
private $stringParameter: ICommandParameter,
16-
private $npm: INodePackageManager) {
16+
private $packageManager: INodePackageManager) {
1717
this.$projectData.initializeProjectData();
1818
}
1919

@@ -54,7 +54,7 @@ export class InstallCommand implements ICommand {
5454
moduleName = devPrefix + moduleName;
5555
}
5656

57-
await this.$npm.install(moduleName, projectDir, {
57+
await this.$packageManager.install(moduleName, projectDir, {
5858
'save-dev': true,
5959
disableNpmInstall: this.$options.disableNpmInstall,
6060
frameworkPath: this.$options.frameworkPath,

lib/commands/plugin/create-plugin.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export class CreatePluginCommand implements ICommand {
1313
private $fs: IFileSystem,
1414
private $childProcess: IChildProcess,
1515
private $prompter: IPrompter,
16-
private $npm: INodePackageManager) { }
16+
private $packageManager: INodePackageManager) { }
1717

1818
public async execute(args: string[]): Promise<void> {
1919
const pluginRepoName = args[0];
@@ -45,7 +45,7 @@ export class CreatePluginCommand implements ICommand {
4545
try {
4646
spinner.start();
4747
const npmOptions: any = { silent: true };
48-
await this.$npm.install(cwd, cwd, npmOptions);
48+
await this.$packageManager.install(cwd, cwd, npmOptions);
4949
} finally {
5050
spinner.stop();
5151
}

lib/commands/test-init.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class TestInitCommand implements ICommand {
1212
mocha: ['chai']
1313
};
1414

15-
constructor(private $npm: INodePackageManager,
15+
constructor(private $packageManager: INodePackageManager,
1616
private $projectData: IProjectData,
1717
private $errors: IErrors,
1818
private $options: IOptions,
@@ -55,7 +55,7 @@ class TestInitCommand implements ICommand {
5555
if (mod.version) {
5656
moduleToInstall += `@${mod.version}`;
5757
}
58-
await this.$npm.install(moduleToInstall, projectDir, {
58+
await this.$packageManager.install(moduleToInstall, projectDir, {
5959
'save-dev': true,
6060
'save-exact': true,
6161
optional: false,
@@ -76,7 +76,7 @@ class TestInitCommand implements ICommand {
7676
// catch errors when a peerDependency is already installed
7777
// e.g karma is installed; karma-jasmine depends on karma and will try to install it again
7878
try {
79-
await this.$npm.install(`${peerDependency}@${dependencyVersion}`, projectDir, {
79+
await this.$packageManager.install(`${peerDependency}@${dependencyVersion}`, projectDir, {
8080
'save-dev': true,
8181
'save-exact': true,
8282
disableNpmInstall: false,
+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
2+
export class PackageManagerCommand implements ICommand {
3+
4+
constructor(private $userSettingsService: IUserSettingsService,
5+
private $errors: IErrors,
6+
private $stringParameter: ICommandParameter) { }
7+
8+
public allowedParameters: ICommandParameter[] = [this.$stringParameter];
9+
10+
public execute(args: string[]): Promise<void> {
11+
if (args[0] === 'yarn' ) {
12+
return this.$userSettingsService.saveSetting("packageManager", "yarn");
13+
} else if ( args[0] === 'npm') {
14+
return this.$userSettingsService.saveSetting("packageManager", "npm");
15+
}
16+
return this.$errors.fail(`${args[0]} is not a valid package manager. Only yarn or npm are supported.`);
17+
}
18+
}
19+
20+
$injector.registerCommand("package-manager|set", PackageManagerCommand);

lib/services/android-plugin-build-service.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export class AndroidPluginBuildService implements IAndroidPluginBuildService {
2222
private $hostInfo: IHostInfo,
2323
private $androidToolsInfo: IAndroidToolsInfo,
2424
private $logger: ILogger,
25-
private $npm: INodePackageManager,
25+
private $packageManager: INodePackageManager,
2626
private $projectDataService: IProjectDataService,
2727
private $devicePlatformsConstants: Mobile.IDevicePlatformsConstants,
2828
private $errors: IErrors,
@@ -295,7 +295,7 @@ export class AndroidPluginBuildService implements IAndroidPluginBuildService {
295295
}
296296

297297
private async getRuntimeGradleVersions(projectDir: string): Promise<IRuntimeGradleVersions> {
298-
const registryData = await this.$npm.getRegistryPackageData(TNS_ANDROID_RUNTIME_NAME);
298+
const registryData = await this.$packageManager.getRegistryPackageData(TNS_ANDROID_RUNTIME_NAME);
299299
let runtimeGradleVersions: IRuntimeGradleVersions = null;
300300
if (projectDir) {
301301
const projectRuntimeVersion = this.$platformService.getCurrentPlatformVersion(

lib/services/android-project-service.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject
2727
private $injector: IInjector,
2828
private $pluginVariablesService: IPluginVariablesService,
2929
private $devicePlatformsConstants: Mobile.IDevicePlatformsConstants,
30-
private $npm: INodePackageManager,
30+
private $packageManager: INodePackageManager,
3131
private $androidPluginBuildService: IAndroidPluginBuildService,
3232
private $platformEnvironmentRequirements: IPlatformEnvironmentRequirements,
3333
private $androidResourcesMigrationService: IAndroidResourcesMigrationService,
@@ -206,7 +206,7 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject
206206
(projectPackageJson.devDependencies && projectPackageJson.devDependencies[dependency.name]);
207207

208208
if (!dependencyVersionInProject) {
209-
await this.$npm.install(`${dependency.name}@${dependency.version}`, projectData.projectDir, npmConfig);
209+
await this.$packageManager.install(`${dependency.name}@${dependency.version}`, projectData.projectDir, npmConfig);
210210
} else {
211211
const cleanedVersion = semver.clean(dependencyVersionInProject);
212212

lib/services/init-service.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export class InitService implements IInitService {
2121
private $staticConfig: IStaticConfig,
2222
private $projectHelper: IProjectHelper,
2323
private $prompter: IPrompter,
24-
private $npm: INodePackageManager,
24+
private $packageManager: INodePackageManager,
2525
private $npmInstallationManager: INpmInstallationManager) { }
2626

2727
public async initialize(): Promise<void> {
@@ -106,7 +106,7 @@ export class InitService implements IInitService {
106106
return this.buildVersionData(latestVersion);
107107
}
108108

109-
const allVersions: any = await this.$npm.view(packageName, { "versions": true });
109+
const allVersions: any = await this.$packageManager.view(packageName, { "versions": true });
110110
const versions = _.filter(allVersions, (version: string) => semver.gte(version, InitService.MIN_SUPPORTED_FRAMEWORK_VERSIONS[packageName]));
111111
if (versions.length === 1) {
112112
this.$logger.info(`Only ${versions[0]} version is available for ${packageName}.`);

lib/services/plugins-service.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export class PluginsService implements IPluginsService {
3131
}, PluginsService.NPM_CONFIG);
3232
}
3333

34-
constructor(private $npm: INodePackageManager,
34+
constructor(private $packageManager: INodePackageManager,
3535
private $fs: IFileSystem,
3636
private $options: IOptions,
3737
private $logger: ILogger,
@@ -46,7 +46,7 @@ export class PluginsService implements IPluginsService {
4646
plugin = possiblePackageName;
4747
}
4848

49-
const name = (await this.$npm.install(plugin, projectData.projectDir, this.npmInstallOptions)).name;
49+
const name = (await this.$packageManager.install(plugin, projectData.projectDir, this.npmInstallOptions)).name;
5050
const pathToRealNpmPackageJson = path.join(projectData.projectDir, "node_modules", name, "package.json");
5151
const realNpmPackageJson = this.$fs.readJson(pathToRealNpmPackageJson);
5252

@@ -65,14 +65,14 @@ export class PluginsService implements IPluginsService {
6565
} catch (err) {
6666
// Revert package.json
6767
this.$projectDataService.removeNSProperty(projectData.projectDir, this.$pluginVariablesService.getPluginVariablePropertyName(pluginData.name));
68-
await this.$npm.uninstall(plugin, PluginsService.NPM_CONFIG, projectData.projectDir);
68+
await this.$packageManager.uninstall(plugin, PluginsService.NPM_CONFIG, projectData.projectDir);
6969

7070
throw err;
7171
}
7272

7373
this.$logger.out(`Successfully installed plugin ${realNpmPackageJson.name}.`);
7474
} else {
75-
await this.$npm.uninstall(realNpmPackageJson.name, { save: true }, projectData.projectDir);
75+
await this.$packageManager.uninstall(realNpmPackageJson.name, { save: true }, projectData.projectDir);
7676
this.$errors.failWithoutHelp(`${plugin} is not a valid NativeScript plugin. Verify that the plugin package.json file contains a nativescript key and try again.`);
7777
}
7878
}
@@ -181,7 +181,7 @@ export class PluginsService implements IPluginsService {
181181
const notInstalledDependencies = _.difference(allDependencies, installedDependencies);
182182
if (this.$options.force || notInstalledDependencies.length) {
183183
this.$logger.trace("Npm install will be called from CLI. Force option is: ", this.$options.force, " Not installed dependencies are: ", notInstalledDependencies);
184-
await this.$npm.install(projectData.projectDir, projectData.projectDir, {
184+
await this.$packageManager.install(projectData.projectDir, projectData.projectDir, {
185185
disableNpmInstall: this.$options.disableNpmInstall,
186186
frameworkPath: this.$options.frameworkPath,
187187
ignoreScripts: this.$options.ignoreScripts,
@@ -282,9 +282,9 @@ export class PluginsService implements IPluginsService {
282282

283283
private async executeNpmCommand(npmCommandName: string, npmCommandArguments: string, projectData: IProjectData): Promise<string> {
284284
if (npmCommandName === PluginsService.INSTALL_COMMAND_NAME) {
285-
await this.$npm.install(npmCommandArguments, projectData.projectDir, this.npmInstallOptions);
285+
await this.$packageManager.install(npmCommandArguments, projectData.projectDir, this.npmInstallOptions);
286286
} else if (npmCommandName === PluginsService.UNINSTALL_COMMAND_NAME) {
287-
await this.$npm.uninstall(npmCommandArguments, PluginsService.NPM_CONFIG, projectData.projectDir);
287+
await this.$packageManager.uninstall(npmCommandArguments, PluginsService.NPM_CONFIG, projectData.projectDir);
288288
}
289289

290290
return this.parseNpmCommandResult(npmCommandArguments);

lib/services/prepare-platform-js-service.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export class PreparePlatformJSService extends PreparePlatformService implements
1616
private $logger: ILogger,
1717
private $projectDataService: IProjectDataService,
1818
private $nodeModulesBuilder: INodeModulesBuilder,
19-
private $npm: INodePackageManager) {
19+
private $packageManager: INodePackageManager) {
2020
super($fs, $hooksService, $xmlValidator);
2121
}
2222

@@ -77,7 +77,7 @@ export class PreparePlatformJSService extends PreparePlatformService implements
7777
const tempDir = temp.mkdirSync("platform-template");
7878
this.$fs.writeJson(path.join(tempDir, constants.PACKAGE_JSON_FILE_NAME), {});
7979
try {
80-
const npmInstallResult = await this.$npm.install(selectedTemplate, tempDir, {
80+
const npmInstallResult = await this.$packageManager.install(selectedTemplate, tempDir, {
8181
disableNpmInstall: false,
8282
frameworkPath: null,
8383
ignoreScripts: false

lib/services/project-service.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import * as temp from "temp";
99
export class ProjectService implements IProjectService {
1010

1111
constructor(private $hooksService: IHooksService,
12-
private $npm: INodePackageManager,
12+
private $packageManager: INodePackageManager,
1313
private $errors: IErrors,
1414
private $fs: IFileSystem,
1515
private $logger: ILogger,
@@ -99,11 +99,11 @@ export class ProjectService implements IProjectService {
9999
}
100100

101101
if (templateVersion === constants.TemplateVersions.v1) {
102-
await this.$npm.uninstall(templatePackageJsonContent.name, { save: true }, projectDir);
102+
await this.$packageManager.uninstall(templatePackageJsonContent.name, { save: true }, projectDir);
103103
}
104104

105105
// Install devDependencies and execute all scripts:
106-
await this.$npm.install(projectDir, projectDir, {
106+
await this.$packageManager.install(projectDir, projectDir, {
107107
disableNpmInstall: false,
108108
frameworkPath: null,
109109
ignoreScripts

lib/services/user-settings-service.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as path from "path";
22
import * as userSettingsServiceBaseLib from "../common/services/user-settings-service";
33

4-
class UserSettingsService extends userSettingsServiceBaseLib.UserSettingsServiceBase {
4+
export class UserSettingsService extends userSettingsServiceBaseLib.UserSettingsServiceBase {
55
constructor($fs: IFileSystem,
66
$settingsService: ISettingsService,
77
$lockfile: ILockFile,

test/debug.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ function createTestInjector(): IInjector {
5252
testInjector.register("projectTemplatesService", {});
5353
testInjector.register("debugService", {});
5454
testInjector.register("xmlValidator", {});
55-
testInjector.register("npm", {});
55+
testInjector.register("packageManager", {});
5656
testInjector.register("debugDataService", {
5757
createDebugData: () => ({})
5858
});

test/ios-project-service.ts

+10-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ import { PluginsService } from "../lib/services/plugins-service";
2727
import { PluginVariablesHelper } from "../lib/common/plugin-variables-helper";
2828
import { Utils } from "../lib/common/utils";
2929
import { CocoaPodsService } from "../lib/services/cocoapods-service";
30+
import { PackageManager } from "../lib/package-manager";
3031
import { NodePackageManager } from "../lib/node-package-manager";
32+
import { YarnPackageManager } from "../lib/yarn-package-manager";
3133

3234
import { assert } from "chai";
3335
import { IOSProvisionService } from "../lib/services/ios-provision-service";
@@ -115,7 +117,12 @@ function createTestInjector(projectPath: string, projectName: string, xcode?: IX
115117
pbxGroupByName() { /* */ }
116118
}
117119
});
120+
testInjector.register("userSettingsService", {
121+
getSettingValue: async (settingName: string): Promise<void> => undefined
122+
});
123+
testInjector.register("packageManager", PackageManager);
118124
testInjector.register("npm", NodePackageManager);
125+
testInjector.register("yarn", YarnPackageManager);
119126
testInjector.register("xCConfigService", XCConfigService);
120127
testInjector.register("settingsService", SettingsService);
121128
testInjector.register("httpClient", {});
@@ -130,7 +137,9 @@ function createTestInjector(projectPath: string, projectName: string, xcode?: IX
130137
hasChangesInShasums: (oldPluginNativeHashes: IStringDictionary, currentPluginNativeHashes: IStringDictionary) => true,
131138
generateHashes: async (files: string[]): Promise<IStringDictionary> => ({})
132139
});
133-
140+
testInjector.register("pacoteService", {
141+
extractPackage: async (packageName: string, destinationDirectory: string, options?: IPacoteExtractOptions): Promise<void> => undefined
142+
});
134143
return testInjector;
135144
}
136145

test/nativescript-cli-lib.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ describe("nativescript-cli-lib", () => {
2727
constants: ["CONFIG_NS_APP_RESOURCES_ENTRY", "CONFIG_NS_APP_ENTRY", "CONFIG_NS_FILE_NAME"],
2828
localBuildService: ["build"],
2929
deviceLogProvider: null,
30-
npm: ["install", "uninstall", "view", "search"],
30+
packageManager: ["install", "uninstall", "view", "search"],
3131
extensibilityService: ["loadExtensions", "loadExtension", "getInstalledExtensions", "installExtension", "uninstallExtension"],
3232
liveSyncService: ["liveSync", "stopLiveSync", "enableDebugging", "disableDebugging", "attachDebugger"],
3333
debugService: ["debug"],

test/npm-support.ts

+7
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import yok = require('../lib/common/yok');
22
import stubs = require('./stubs');
33
import ErrorsLib = require("../lib/common/errors");
44
import NpmLib = require("../lib/node-package-manager");
5+
import PackageManagerLib = require("../lib/package-manager");
6+
import YarnLib = require("../lib/yarn-package-manager");
57
import FsLib = require("../lib/common/file-system");
68
import OptionsLib = require("../lib/options");
79
import StaticConfigLib = require("../lib/config");
@@ -65,7 +67,12 @@ function createTestInjector(): IInjector {
6567
testInjector.register("hooksService", stubs.HooksServiceStub);
6668
testInjector.register("nodeModulesBuilder", NodeModulesLib.NodeModulesBuilder);
6769
testInjector.register("pluginsService", PluginsServiceLib.PluginsService);
70+
testInjector.register("userSettingsService", {
71+
getSettingValue: async (settingName: string): Promise<void> => undefined
72+
});
6873
testInjector.register("npm", NpmLib.NodePackageManager);
74+
testInjector.register("packageManager", PackageManagerLib.PackageManager);
75+
testInjector.register("yarn", YarnLib.YarnPackageManager);
6976
testInjector.register("childProcess", ChildProcessLib.ChildProcess);
7077
testInjector.register("projectFilesManager", ProjectFilesManagerLib.ProjectFilesManager);
7178
testInjector.register("commandsServiceProvider", {

test/platform-service.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ function createTestInjector() {
8484
testInjector.register("xmlValidator", XmlValidator);
8585
testInjector.register("preparePlatformNativeService", PreparePlatformNativeService);
8686
testInjector.register("preparePlatformJSService", PreparePlatformJSService);
87-
testInjector.register("npm", {
87+
testInjector.register("packageManager", {
8888
uninstall: async () => {
8989
return true;
9090
}

test/plugin-create.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ function createTestInjector() {
2424
testInjector.register("childProcess", stubs.ChildProcessStub);
2525
testInjector.register("prompter", new stubs.PrompterStub());
2626
testInjector.register("fs", stubs.FileSystemStub);
27-
testInjector.register("npm", stubs.NpmInstallationManagerStub);
27+
testInjector.register("packageManager", stubs.NpmInstallationManagerStub);
2828
testInjector.register("options", {
2929
username: undefined,
3030
pluginName: undefined,

test/plugins-service.ts

+12-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { Yok } from '../lib/common/yok';
22
import * as stubs from './stubs';
3-
import { NodePackageManager } from "../lib/node-package-manager";
3+
import { PackageManager } from "../lib/package-manager";
44
import { NpmInstallationManager } from "../lib/npm-installation-manager";
5+
import { NodePackageManager } from "../lib/node-package-manager";
6+
import { YarnPackageManager } from "../lib/yarn-package-manager";
57
import { FileSystem } from "../lib/common/file-system";
68
import { ProjectData } from "../lib/project-data";
79
import { ChildProcess } from "../lib/common/child-process";
@@ -42,7 +44,12 @@ let isErrorThrown = false;
4244
function createTestInjector() {
4345
const testInjector = new Yok();
4446
testInjector.register("messagesService", MessagesService);
47+
testInjector.register("userSettingsService", {
48+
getSettingValue: async (settingName: string): Promise<void> => undefined
49+
});
50+
testInjector.register("packageManager", PackageManager);
4551
testInjector.register("npm", NodePackageManager);
52+
testInjector.register("yarn", YarnPackageManager);
4653
testInjector.register("fs", FileSystem);
4754
testInjector.register("adb", {});
4855
testInjector.register("androidDebugBridgeResultHandler", {});
@@ -124,6 +131,9 @@ function createTestInjector() {
124131
hasChangesInShasums: (oldPluginNativeHashes: IStringDictionary, currentPluginNativeHashes: IStringDictionary) => true,
125132
generateHashes: async (files: string[]): Promise<IStringDictionary> => ({})
126133
});
134+
testInjector.register("pacoteService", {
135+
extractPackage: async (packageName: string, destinationDirectory: string, options?: IPacoteExtractOptions): Promise<void> => undefined
136+
});
127137
return testInjector;
128138
}
129139

@@ -597,7 +607,7 @@ describe("Plugins service", () => {
597607
enumerateFilesInDirectorySync: (): string[] => ["some_file"]
598608
});
599609

600-
unitTestsInjector.register("npm", {});
610+
unitTestsInjector.register("packageManager", {});
601611
unitTestsInjector.register("options", {});
602612
unitTestsInjector.register("logger", {});
603613
unitTestsInjector.register("errors", {});

0 commit comments

Comments
 (0)