UNPKG

cordova-plugin-universal-links-fix

Version:

Cordova plugin to add in your application support for Universal Links (iOS 9) and Deep Links (Android). Basically, open application through the link in the browser.

146 lines (117 loc) 3.46 kB
/* Parser for config.xml file. Read plugin-specific preferences (from <universal-links> tag) as JSON object. */ var path = require('path'); var ConfigXmlHelper = require('./configXmlHelper.js'); var DEFAULT_SCHEME = 'http'; module.exports = { readPreferences: readPreferences }; // region Public API /** * Read plugin preferences from the config.xml file. * * @param {Object} cordovaContext - cordova context object * @return {Array} list of host objects */ function readPreferences(cordovaContext) { // read data from projects root config.xml file var configXml = new ConfigXmlHelper(cordovaContext).read(); if (configXml == null) { console.warn('config.xml not found! Please, check that it exist\'s in your project\'s root directory.'); return null; } // look for data from the <universal-links> tag var ulXmlPreferences = configXml.widget['universal-links']; if (ulXmlPreferences == null || ulXmlPreferences.length == 0) { console.warn('<universal-links> tag is not set in the config.xml. Universal Links plugin is not going to work.'); return null; } var xmlPreferences = ulXmlPreferences[0]; // read hosts var hosts = constructHostsList(xmlPreferences); // read ios team ID var iosTeamId = getTeamIdPreference(xmlPreferences); return { 'hosts': hosts, 'iosTeamId': iosTeamId }; } // endregion // region Private API function getTeamIdPreference(xmlPreferences) { if (xmlPreferences.hasOwnProperty('ios-team-id')) { return xmlPreferences['ios-team-id'][0]['$']['value']; } return null; } /** * Construct list of host objects, defined in xml file. * * @param {Object} xmlPreferences - plugin preferences from config.xml as JSON object * @return {Array} array of JSON objects, where each entry defines host data from config.xml. */ function constructHostsList(xmlPreferences) { var hostsList = []; // look for defined hosts var xmlHostList = xmlPreferences['host']; if (xmlHostList == null || xmlHostList.length == 0) { return []; } xmlHostList.forEach(function(xmlElement) { var host = constructHostEntry(xmlElement); if (host) { hostsList.push(host); } }); return hostsList; } /** * Construct host object from xml data. * * @param {Object} xmlElement - xml data to process. * @return {Object} host entry as JSON object */ function constructHostEntry(xmlElement) { var host = { scheme: DEFAULT_SCHEME, name: '', paths: [] }; var hostProperties = xmlElement['$']; if (hostProperties == null || hostProperties.length == 0) { return null; } // read host name host.name = hostProperties.name; // read scheme if defined if (hostProperties['scheme'] != null) { host.scheme = hostProperties.scheme; } // construct paths list, defined for the given host host.paths = constructPaths(xmlElement); return host; } /** * Construct list of path objects from the xml data. * * @param {Object} xmlElement - xml data to process * @return {Array} list of path entries, each on is a JSON object */ function constructPaths(xmlElement) { if (xmlElement['path'] == null) { return ['*']; } var paths = []; xmlElement.path.some(function(pathElement) { var url = pathElement['$']['url']; // Ignore explicit paths if '*' is defined if (url === '*') { paths = ['*']; return true; } paths.push(url); }); return paths; } // endregion