Skip to content

Commit 4049342

Browse files
Fatme HavaluovaFatme Havaluova
Fatme Havaluova
authored and
Fatme Havaluova
committed
Plugin variables support
1 parent 6cc98fc commit 4049342

15 files changed

+746
-133
lines changed

lib/bootstrap.ts

+1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ $injector.require("broccoliBuilder", "./tools/broccoli/builder");
6060
$injector.require("nodeModulesTree", "./tools/broccoli/trees/node-modules-tree");
6161
$injector.require("broccoliPluginWrapper", "./tools/broccoli/broccoli-plugin-wrapper");
6262

63+
$injector.require("pluginVariablesService", "./services/plugin-variables-service");
6364
$injector.require("pluginsService", "./services/plugins-service");
6465
$injector.requireCommand("plugin|add", "./commands/plugin/add-plugin");
6566
$injector.requireCommand("plugin|remove", "./commands/plugin/remove-plugin");

lib/constants.ts

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export let APP_RESOURCES_FOLDER_NAME = "App_Resources";
66
export let PROJECT_FRAMEWORK_FOLDER_NAME = "framework";
77
export let NATIVESCRIPT_KEY_NAME = "nativescript";
88
export let NODE_MODULES_FOLDER_NAME = "node_modules";
9+
export let TNS_MODULES_FOLDER_NAME = "tns_modules";
910
export let TNS_CORE_MODULES_NAME = "tns-core-modules";
1011
export let PACKAGE_JSON_FILE_NAME = "package.json";
1112
export let NODE_MODULE_CACHE_PATH_KEY_NAME = "node-modules-cache-path";

lib/definitions/plugins.d.ts

+37-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ interface IPluginsService {
99

1010
interface IPluginData extends INodeModuleData {
1111
platformsData: IPluginPlatformsData;
12-
pluginPlatformsFolderPath(platform: string): string;
12+
/* Gets all plugin variables from plugin */
13+
pluginVariables: IDictionary<IPluginVariableData>;
14+
pluginPlatformsFolderPath(platform: string): string;
1315
}
1416

1517
interface INodeModuleData {
@@ -23,4 +25,38 @@ interface INodeModuleData {
2325
interface IPluginPlatformsData {
2426
ios: string;
2527
android: string;
28+
}
29+
30+
interface IPluginVariablesService {
31+
/**
32+
* Saves plugin variables in project package.json file.
33+
* @param {IPluginData} pluginData for the plugin.
34+
* @return {IFuture<void>}
35+
*/
36+
savePluginVariablesInProjectFile(pluginData: IPluginData): IFuture<void>;
37+
/**
38+
* Removes plugin variables from project package.json file.
39+
* @param {IPluginData} pluginData for the plugin.
40+
* @return {IFuture<void>}
41+
*/
42+
removePluginVariablesFromProjectFile(pluginData: IPluginData): IFuture<void>;
43+
/**
44+
* Replaces all plugin variables with their corresponding values.
45+
* @param {IPluginData} pluginData for the plugin.
46+
* @param {pluginConfigurationFileContent} pluginConfigurationFileContent for the plugin.
47+
* @return {IFuture<string>} returns the changed plugin configuration file content.
48+
*/
49+
interpolatePluginVariables(pluginData: IPluginData, pluginConfigurationFileContent: string): IFuture<string>;
50+
/**
51+
* Returns the
52+
* @param {IPluginData} pluginData for the plugin.
53+
* @return {IFuture<string>} returns the changed plugin configuration file content.
54+
*/
55+
getPluginVariablePropertyName(pluginData: IPluginData): string;
56+
}
57+
58+
interface IPluginVariableData {
59+
defaultValue?: string;
60+
name?: string;
61+
value?: string;
2662
}

lib/definitions/project.d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ interface IProjectDataService {
1616
getValue(propertyName: string): IFuture<any>;
1717
setValue(key: string, value: any): IFuture<void>;
1818
removeProperty(propertyName: string): IFuture<void>;
19+
removeDependency(dependencyName: string): IFuture<void>;
1920
}
2021

2122
interface IProjectTemplatesService {

lib/services/platform-service.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ export class PlatformService implements IPlatformService {
186186
try {
187187
this.$pluginsService.ensureAllDependenciesAreInstalled().wait();
188188
let tnsModulesDestinationPath = path.join(platformData.appDestinationDirectoryPath, constants.APP_FOLDER_NAME, PlatformService.TNS_MODULES_FOLDER_NAME);
189-
this.$broccoliBuilder.prepareNodeModules(tnsModulesDestinationPath, this.$projectData.projectDir, platform, lastModifiedTime).wait();
189+
this.$broccoliBuilder.prepareNodeModules(tnsModulesDestinationPath, platform, lastModifiedTime).wait();
190190
} catch(error) {
191191
this.$logger.debug(error);
192192
shell.rm("-rf", appResourcesDirectoryPath);
+103
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
///<reference path="../.d.ts"/>
2+
"use strict";
3+
4+
import * as helpers from "./../common/helpers";
5+
6+
export class PluginVariablesService implements IPluginVariablesService {
7+
private static PLUGIN_VARIABLES_KEY = "variables";
8+
9+
constructor(private $errors: IErrors,
10+
private $pluginVariablesHelper: IPluginVariablesHelper,
11+
private $projectData: IProjectData,
12+
private $projectDataService: IProjectDataService,
13+
private $prompter: IPrompter) { }
14+
15+
public getPluginVariablePropertyName(pluginData: IPluginData): string {
16+
return `${pluginData.name}-${PluginVariablesService.PLUGIN_VARIABLES_KEY}`;
17+
}
18+
19+
public savePluginVariablesInProjectFile(pluginData: IPluginData): IFuture<void> {
20+
return (() => {
21+
let values = Object.create(null);
22+
this.executeForAllPluginVariables(pluginData, (pluginVariableData: IPluginVariableData) =>
23+
(() => {
24+
let pluginVariableValue = this.getPluginVariableValue(pluginVariableData).wait();
25+
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.`);
26+
values[pluginVariableData.name] = pluginVariableValue;
27+
}).future<void>()()).wait();
28+
29+
this.$projectDataService.initialize(this.$projectData.projectDir);
30+
this.$projectDataService.setValue(this.getPluginVariablePropertyName(pluginData), values).wait();
31+
}).future<void>()();
32+
}
33+
34+
public removePluginVariablesFromProjectFile(pluginData: IPluginData): IFuture<void> {
35+
this.$projectDataService.initialize(this.$projectData.projectDir);
36+
return this.$projectDataService.removeProperty(this.getPluginVariablePropertyName(pluginData));
37+
}
38+
39+
public interpolatePluginVariables(pluginData: IPluginData, pluginConfigurationFileContent: string): IFuture<string> {
40+
return (() => {
41+
this.executeForAllPluginVariables(pluginData, (pluginVariableData: IPluginVariableData) =>
42+
(() => {
43+
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.`);
44+
pluginConfigurationFileContent = pluginConfigurationFileContent.replace(new RegExp(`{${pluginVariableData.name}}`, "gi"), pluginVariableData.value);
45+
}).future<void>()()).wait();
46+
return pluginConfigurationFileContent;
47+
}).future<string>()();
48+
}
49+
50+
private ensurePluginVariableValue(pluginVariableValue: string, errorMessage: string): void {
51+
if(!pluginVariableValue) {
52+
this.$errors.failWithoutHelp(errorMessage);
53+
}
54+
}
55+
56+
private getPluginVariableValue(pluginVariableData: IPluginVariableData): IFuture<string> {
57+
return (() => {
58+
let pluginVariableName = pluginVariableData.name;
59+
let value = this.$pluginVariablesHelper.getPluginVariableFromVarOption(pluginVariableName);
60+
if(value) {
61+
value = value[pluginVariableName];
62+
} else {
63+
value = pluginVariableData.defaultValue;
64+
if(!value && helpers.isInteractive() ) {
65+
let promptSchema = {
66+
name: pluginVariableName,
67+
type: "input",
68+
message: `Enter value for ${pluginVariableName} variable:`,
69+
validate: (val: string) => !!val ? true : 'Please enter a value!'
70+
};
71+
let promptData = this.$prompter.get([promptSchema]).wait();
72+
value = promptData[pluginVariableName];
73+
}
74+
}
75+
76+
return value;
77+
}).future<string>()();
78+
}
79+
80+
private executeForAllPluginVariables(pluginData: IPluginData, action: (pluginVariableData: IPluginVariableData) => IFuture<void>): IFuture<void> {
81+
return (() => {
82+
let pluginVariables = pluginData.pluginVariables;
83+
let pluginVariablesNames = _.keys(pluginVariables);
84+
_.each(pluginVariablesNames, pluginVariableName => action(this.createPluginVariableData(pluginData, pluginVariableName).wait()).wait());
85+
}).future<void>()();
86+
}
87+
88+
private createPluginVariableData(pluginData: IPluginData, pluginVariableName: string): IFuture<IPluginVariableData> {
89+
return (() => {
90+
let variableData = pluginData.pluginVariables[pluginVariableName];
91+
92+
variableData.name = pluginVariableName;
93+
94+
this.$projectDataService.initialize(this.$projectData.projectDir);
95+
let pluginVariableValues = this.$projectDataService.getValue(this.getPluginVariablePropertyName(pluginData)).wait();
96+
variableData.value = pluginVariableValues ? pluginVariableValues[pluginVariableName] : undefined;
97+
98+
return variableData;
99+
}).future<IPluginVariableData>()();
100+
}
101+
}
102+
$injector.register("pluginVariablesService", PluginVariablesService);
103+

0 commit comments

Comments
 (0)