-
-
Notifications
You must be signed in to change notification settings - Fork 197
/
Copy pathplugin-variables-service.ts
105 lines (88 loc) · 4.49 KB
/
plugin-variables-service.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
///<reference path="../.d.ts"/>
"use strict";
import * as helpers from "./../common/helpers";
export class PluginVariablesService implements IPluginVariablesService {
private static PLUGIN_VARIABLES_KEY = "variables";
constructor(private $errors: IErrors,
private $pluginVariablesHelper: IPluginVariablesHelper,
private $projectData: IProjectData,
private $projectDataService: IProjectDataService,
private $prompter: IPrompter) { }
public getPluginVariablePropertyName(pluginData: IPluginData): string {
return `${pluginData.name}-${PluginVariablesService.PLUGIN_VARIABLES_KEY}`;
}
public savePluginVariablesInProjectFile(pluginData: IPluginData): IFuture<void> {
return (() => {
let values = Object.create(null);
this.executeForAllPluginVariables(pluginData, (pluginVariableData: IPluginVariableData) =>
(() => {
let pluginVariableValue = this.getPluginVariableValue(pluginVariableData).wait();
this.ensurePluginVariableValue(pluginVariableValue, `Unable to find value for ${pluginVariableData.name} plugin variable from ${pluginData.name} plugin. Ensure the --var option is specified or the plugin variable has default value.`);
values[pluginVariableData.name] = pluginVariableValue;
}).future<void>()()).wait();
if(!_.isEmpty(values)) {
this.$projectDataService.initialize(this.$projectData.projectDir);
this.$projectDataService.setValue(this.getPluginVariablePropertyName(pluginData), values).wait();
}
}).future<void>()();
}
public removePluginVariablesFromProjectFile(pluginData: IPluginData): IFuture<void> {
this.$projectDataService.initialize(this.$projectData.projectDir);
return this.$projectDataService.removeProperty(this.getPluginVariablePropertyName(pluginData));
}
public interpolatePluginVariables(pluginData: IPluginData, pluginConfigurationFileContent: string): IFuture<string> {
return (() => {
this.executeForAllPluginVariables(pluginData, (pluginVariableData: IPluginVariableData) =>
(() => {
this.ensurePluginVariableValue(pluginVariableData.value, `Unable to find the value for ${pluginVariableData.name} plugin variable into project package.json file. Verify that your package.json file is correct and try again.`);
pluginConfigurationFileContent = pluginConfigurationFileContent.replace(new RegExp(`{${pluginVariableData.name}}`, "gi"), pluginVariableData.value);
}).future<void>()()).wait();
return pluginConfigurationFileContent;
}).future<string>()();
}
private ensurePluginVariableValue(pluginVariableValue: string, errorMessage: string): void {
if(!pluginVariableValue) {
this.$errors.failWithoutHelp(errorMessage);
}
}
private getPluginVariableValue(pluginVariableData: IPluginVariableData): IFuture<string> {
return (() => {
let pluginVariableName = pluginVariableData.name;
let value = this.$pluginVariablesHelper.getPluginVariableFromVarOption(pluginVariableName);
if(value) {
value = value[pluginVariableName];
} else {
value = pluginVariableData.defaultValue;
if(!value && helpers.isInteractive() ) {
let promptSchema = {
name: pluginVariableName,
type: "input",
message: `Enter value for ${pluginVariableName} variable:`,
validate: (val: string) => !!val ? true : 'Please enter a value!'
};
let promptData = this.$prompter.get([promptSchema]).wait();
value = promptData[pluginVariableName];
}
}
return value;
}).future<string>()();
}
private executeForAllPluginVariables(pluginData: IPluginData, action: (pluginVariableData: IPluginVariableData) => IFuture<void>): IFuture<void> {
return (() => {
let pluginVariables = pluginData.pluginVariables;
let pluginVariablesNames = _.keys(pluginVariables);
_.each(pluginVariablesNames, pluginVariableName => action(this.createPluginVariableData(pluginData, pluginVariableName).wait()).wait());
}).future<void>()();
}
private createPluginVariableData(pluginData: IPluginData, pluginVariableName: string): IFuture<IPluginVariableData> {
return (() => {
let variableData = pluginData.pluginVariables[pluginVariableName];
variableData.name = pluginVariableName;
this.$projectDataService.initialize(this.$projectData.projectDir);
let pluginVariableValues = this.$projectDataService.getValue(this.getPluginVariablePropertyName(pluginData)).wait();
variableData.value = pluginVariableValues ? pluginVariableValues[pluginVariableName] : undefined;
return variableData;
}).future<IPluginVariableData>()();
}
}
$injector.register("pluginVariablesService", PluginVariablesService);