Skip to content

Commit cf67724

Browse files
Merge pull request #1590 from NativeScript/vladimirov/fix-pl-remove
Fix plugin remove command for invalid plugins
2 parents e76f8ce + 82c972d commit cf67724

File tree

4 files changed

+31
-18
lines changed

4 files changed

+31
-18
lines changed

lib/commands/plugin/remove-plugin.ts

+14-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33

44
export class RemovePluginCommand implements ICommand {
55
constructor(private $pluginsService: IPluginsService,
6-
private $errors: IErrors) { }
6+
private $errors: IErrors,
7+
private $logger: ILogger,
8+
private $projectData: IProjectData) { }
79

810
execute(args: string[]): IFuture<void> {
911
return this.$pluginsService.remove(args[0]);
@@ -15,9 +17,18 @@ export class RemovePluginCommand implements ICommand {
1517
this.$errors.fail("You must specify plugin name.");
1618
}
1719

18-
let installedPlugins = this.$pluginsService.getAllInstalledPlugins().wait();
20+
let pluginNames: string[] = [];
21+
try {
22+
// try installing the plugins, so we can get information from node_modules about their native code, libs, etc.
23+
let installedPlugins = this.$pluginsService.getAllInstalledPlugins().wait();
24+
pluginNames = installedPlugins.map(pl => pl.name);
25+
} catch(err) {
26+
this.$logger.trace("Error while installing plugins. Error is:", err);
27+
pluginNames = _.keys(this.$projectData.dependencies);
28+
}
29+
1930
let pluginName = args[0].toLowerCase();
20-
if(!_.any(installedPlugins, (plugin: IPluginData) => plugin.name.toLowerCase() === pluginName)) {
31+
if(!_.any(pluginNames, name => name.toLowerCase() === pluginName)) {
2132
this.$errors.failWithoutHelp(`Plugin "${pluginName}" is not installed.`);
2233
}
2334

lib/definitions/plugins.d.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@ interface IPluginVariablesService {
3636
savePluginVariablesInProjectFile(pluginData: IPluginData): IFuture<void>;
3737
/**
3838
* Removes plugin variables from project package.json file.
39-
* @param {IPluginData} pluginData for the plugin.
39+
* @param {string} pluginName Name of the plugin.
4040
* @return {IFuture<void>}
4141
*/
42-
removePluginVariablesFromProjectFile(pluginData: IPluginData): IFuture<void>;
42+
removePluginVariablesFromProjectFile(pluginName: string): IFuture<void>;
4343
/**
4444
* Replaces all plugin variables with their corresponding values.
4545
* @param {IPluginData} pluginData for the plugin.
@@ -59,10 +59,10 @@ interface IPluginVariablesService {
5959
interpolate(pluginData: IPluginData, pluginConfigurationFilePath: string): IFuture<void>;
6060
/**
6161
* Returns the
62-
* @param {IPluginData} pluginData for the plugin.
62+
* @param {string} pluginName for the plugin.
6363
* @return {IFuture<string>} returns the changed plugin configuration file content.
6464
*/
65-
getPluginVariablePropertyName(pluginData: IPluginData): string;
65+
getPluginVariablePropertyName(pluginName: string): string;
6666

6767
}
6868

lib/services/plugin-variables-service.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ export class PluginVariablesService implements IPluginVariablesService {
1313
private $prompter: IPrompter,
1414
private $fs: IFileSystem) { }
1515

16-
public getPluginVariablePropertyName(pluginData: IPluginData): string {
17-
return `${pluginData.name}-${PluginVariablesService.PLUGIN_VARIABLES_KEY}`;
16+
public getPluginVariablePropertyName(pluginName: string): string {
17+
return `${pluginName}-${PluginVariablesService.PLUGIN_VARIABLES_KEY}`;
1818
}
1919

2020
public savePluginVariablesInProjectFile(pluginData: IPluginData): IFuture<void> {
@@ -29,14 +29,14 @@ export class PluginVariablesService implements IPluginVariablesService {
2929

3030
if(!_.isEmpty(values)) {
3131
this.$projectDataService.initialize(this.$projectData.projectDir);
32-
this.$projectDataService.setValue(this.getPluginVariablePropertyName(pluginData), values).wait();
32+
this.$projectDataService.setValue(this.getPluginVariablePropertyName(pluginData.name), values).wait();
3333
}
3434
}).future<void>()();
3535
}
3636

37-
public removePluginVariablesFromProjectFile(pluginData: IPluginData): IFuture<void> {
37+
public removePluginVariablesFromProjectFile(pluginName: string): IFuture<void> {
3838
this.$projectDataService.initialize(this.$projectData.projectDir);
39-
return this.$projectDataService.removeProperty(this.getPluginVariablePropertyName(pluginData));
39+
return this.$projectDataService.removeProperty(this.getPluginVariablePropertyName(pluginName));
4040
}
4141

4242
public interpolatePluginVariables(pluginData: IPluginData, pluginConfigurationFilePath: string): IFuture<void> {
@@ -115,7 +115,7 @@ export class PluginVariablesService implements IPluginVariablesService {
115115
variableData.name = pluginVariableName;
116116

117117
this.$projectDataService.initialize(this.$projectData.projectDir);
118-
let pluginVariableValues = this.$projectDataService.getValue(this.getPluginVariablePropertyName(pluginData)).wait();
118+
let pluginVariableValues = this.$projectDataService.getValue(this.getPluginVariablePropertyName(pluginData.name)).wait();
119119
variableData.value = pluginVariableValues ? pluginVariableValues[pluginVariableName] : undefined;
120120

121121
return variableData;

lib/services/plugins-service.ts

+7-5
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export class PluginsService implements IPluginsService {
4747
} catch(err) {
4848
// Revert package.json
4949
this.$projectDataService.initialize(this.$projectData.projectDir);
50-
this.$projectDataService.removeProperty(this.$pluginVariablesService.getPluginVariablePropertyName(pluginData)).wait();
50+
this.$projectDataService.removeProperty(this.$pluginVariablesService.getPluginVariablePropertyName(pluginData.name)).wait();
5151
this.$projectDataService.removeDependency(pluginData.name).wait();
5252

5353
throw err;
@@ -68,12 +68,10 @@ export class PluginsService implements IPluginsService {
6868
let pluginData = this.convertToPluginData(this.getNodeModuleData(pluginName).wait());
6969

7070
platformData.platformProjectService.removePluginNativeCode(pluginData).wait();
71-
72-
if(pluginData.pluginVariables) {
73-
this.$pluginVariablesService.removePluginVariablesFromProjectFile(pluginData).wait();
74-
}
7571
}).future<void>()();
7672
};
73+
74+
this.$pluginVariablesService.removePluginVariablesFromProjectFile(pluginName.toLowerCase()).wait();
7775
this.executeForAllInstalledPlatforms(removePluginNativeCodeAction).wait();
7876

7977
this.executeNpmCommand(PluginsService.UNINSTALL_COMMAND_NAME, pluginName).wait();
@@ -224,6 +222,10 @@ export class PluginsService implements IPluginsService {
224222
result = this.$npm.install(npmCommandArguments, this.$projectData.projectDir, PluginsService.NPM_CONFIG).wait();
225223
} else if(npmCommandName === PluginsService.UNINSTALL_COMMAND_NAME) {
226224
result = this.$npm.uninstall(npmCommandArguments, PluginsService.NPM_CONFIG, this.$projectData.projectDir).wait();
225+
if(!result || !result.length) {
226+
// indicates something's wrong with the data in package.json, for example version of the plugin that we are trying to remove is invalid.
227+
return npmCommandArguments.toLowerCase();
228+
}
227229
}
228230

229231
return this.parseNpmCommandResult(result);

0 commit comments

Comments
 (0)