cordova-hot-code-push-plugin-renew
Version:
Cordova plugin to perform code updates on the fly
166 lines (145 loc) • 4.21 kB
JavaScript
/**
Helper module to work with config.xml file.
We will use it to inject plugin-specific options.
*/
var fs = require('fs');
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() {
//android>=7.0
let configPath = path.join(projectRoot, 'platforms', 'android','app','src','main', 'res', 'xml', 'config.xml');
fs.access(configPath, fs.constants.F_OK, err => {
if(err) {
//android<7.0
configPath = path.join(projectRoot, 'platforms', 'android', 'res', 'xml', 'config.xml');
}
return configPath;
});
}
/**
* 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