123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- /**
- Helper module to work with config.xml file.
- We will use it to inject plugin-specific options.
- */
- var path = require('path');
- var xmlHelper = require('./xmlHelper.js');
- var cordovaContext;
- var projectRoot;
- var platforms;
- module.exports = {
- writeOptions: writeOptions
- };
- // region Public API
- /**
- * Inject options into config.xml files of each platform.
- *
- * @param {Object} context - cordova context instance
- * @param {Object} options - plugin options to inject
- */
- function writeOptions(context, options) {
- setup(context);
- injectOptions(options);
- }
- // endregion
- // region Private API
- /**
- * Initialize module.
- *
- * @param {Object} cordovaContext - cordova context instance
- */
- function setup(context) {
- cordovaContext = context;
- platforms = context.opts.platforms;
- projectRoot = context.opts.projectRoot;
- }
- /**
- * Get name of the current project.
- *
- * @param {Object} ctx - cordova context instance
- * @param {String} projectRoot - current root of the project
- *
- * @return {String} name of the project
- */
- function getProjectName(ctx, projectRoot) {
- var cordova_util = ctx.requireCordovaModule('cordova-lib/src/cordova/util');
- var xml = cordova_util.projectConfig(projectRoot);
- var ConfigParser;
- // If we are running Cordova 5.4 or abova - use parser from cordova-common.
- // Otherwise - from cordova-lib.
- try {
- ConfigParser = ctx.requireCordovaModule('cordova-common/src/ConfigParser/ConfigParser');
- } catch (e) {
- ConfigParser = ctx.requireCordovaModule('cordova-lib/src/configparser/ConfigParser')
- }
- return new ConfigParser(xml).name();
- }
- /**
- * Get path to config.xml inside iOS project.
- *
- * @return {String} absolute path to config.xml file
- */
- function pathToIosConfigXml() {
- var projectName = getProjectName(cordovaContext, projectRoot);
- return path.join(projectRoot, 'platforms', 'ios', projectName, 'config.xml');
- }
- /**
- * Get path to config.xml inside Android project.
- *
- * @return {String} absolute path to config.xml file
- */
- function pathToAndroidConfigXml() {
- return path.join(projectRoot, 'platforms', 'android', 'res', 'xml', 'config.xml');
- }
- /**
- * Get path to platform-specific config.xml file.
- *
- * @param {String} platform - for what platform we need config.xml
- * @return {String} absolute path to config.xml
- */
- function getPlatformSpecificConfigXml(platform) {
- var configFilePath = null;
- switch (platform) {
- case 'ios':
- {
- configFilePath = pathToIosConfigXml();
- break;
- }
- case 'android':
- {
- configFilePath = pathToAndroidConfigXml();
- break;
- }
- }
- return configFilePath;
- }
- /**
- * Write provided options into config.xml file for each platform.
- *
- * @param {Object} options - plugin options
- */
- function injectOptions(options) {
- platforms.forEach(function(platform) {
- var configXmlFilePath = getPlatformSpecificConfigXml(platform);
- if (configXmlFilePath == null) {
- return;
- }
- // read data from config.xml
- var configData = xmlHelper.readXmlAsJson(configXmlFilePath);
- if (configData == null) {
- console.warn('Configuration file ' + configXmlFilePath + ' not found');
- return;
- }
- // inject new options
- var chcpXmlConfig = {};
- for (var preferenceName in options) {
- injectPreference(chcpXmlConfig, preferenceName, options[preferenceName]);
- }
- // write them back to config.xml
- configData.widget['chcp'] = [];
- configData.widget.chcp.push(chcpXmlConfig);
- xmlHelper.writeJsonAsXml(configData, configXmlFilePath);
- });
- }
- /**
- * Inject preference into xml.
- *
- * @param {Object} xml - current xml preferences for the plugin
- * @param {String} preferenceName - preference name
- * @param {Object} preferenceAttributes - preference attributes
- */
- function injectPreference(xml, preferenceName, preferenceAttributes) {
- xml[preferenceName] = [{
- '$': preferenceAttributes
- }];
- }
- // endregion
|