Skip to content

Commit 407c10d

Browse files
Fix plugin remove command for invalid plugins
When invalid plugin data is written in project's package.json, `tns plugin remove <name>` command fails. In such cases `npm uninstall --save <name>` just removes the entry from package.json, so we should do the same. By invalid data I mean invalid version (not existing version or path to non-existing file). Plugin remove command's canExecute method is trying to install all plugins in order to get information about their native code, so it will be removed from `platforms` dir. The installation fails when some plugin's data is invalid. Catch the error and check package.json's dependencies instead. Also make sure plugin variables data is removed from package.json when plugin is removed. Currently it's been removed only when platform is added and plugin has native code.
1 parent 50b6685 commit 407c10d

File tree

4 files changed

+30
-18
lines changed

4 files changed

+30
-18
lines changed

lib/commands/plugin/remove-plugin.ts

+13-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,17 @@ 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 installedPlugins: IPluginData[] = null;
21+
try {
22+
// try installing the plugins, so we can get information from node_modules about their native code, libs, etc.
23+
installedPlugins = this.$pluginsService.getAllInstalledPlugins().wait();
24+
} catch(err) {
25+
this.$logger.trace("Error while installing plugins. Error is:", err);
26+
}
27+
28+
let pluginNames = installedPlugins ? installedPlugins.map(pl => pl.name) : _.keys(this.$projectData.dependencies);
1929
let pluginName = args[0].toLowerCase();
20-
if(!_.any(installedPlugins, (plugin: IPluginData) => plugin.name.toLowerCase() === pluginName)) {
30+
if(!_.any(pluginNames, name => name.toLowerCase() === pluginName)) {
2131
this.$errors.failWithoutHelp(`Plugin "${pluginName}" is not installed.`);
2232
}
2333

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)