1"use strict"; 2 3Object.defineProperty(exports, "__esModule", { 4 value: true 5}); 6exports.addMetaDataItemToMainApplication = addMetaDataItemToMainApplication; 7exports.addUsesLibraryItemToMainApplication = addUsesLibraryItemToMainApplication; 8exports.ensureToolsAvailable = ensureToolsAvailable; 9exports.findMetaDataItem = findMetaDataItem; 10exports.findUsesLibraryItem = findUsesLibraryItem; 11exports.getMainActivity = getMainActivity; 12exports.getMainActivityOrThrow = getMainActivityOrThrow; 13exports.getMainApplication = getMainApplication; 14exports.getMainApplicationMetaDataValue = getMainApplicationMetaDataValue; 15exports.getMainApplicationOrThrow = getMainApplicationOrThrow; 16exports.getRunnableActivity = getRunnableActivity; 17exports.prefixAndroidKeys = prefixAndroidKeys; 18exports.readAndroidManifestAsync = readAndroidManifestAsync; 19exports.removeMetaDataItemFromMainApplication = removeMetaDataItemFromMainApplication; 20exports.removeUsesLibraryItemFromMainApplication = removeUsesLibraryItemFromMainApplication; 21exports.writeAndroidManifestAsync = writeAndroidManifestAsync; 22function _assert() { 23 const data = _interopRequireDefault(require("assert")); 24 _assert = function () { 25 return data; 26 }; 27 return data; 28} 29function _fs() { 30 const data = _interopRequireDefault(require("fs")); 31 _fs = function () { 32 return data; 33 }; 34 return data; 35} 36function _path() { 37 const data = _interopRequireDefault(require("path")); 38 _path = function () { 39 return data; 40 }; 41 return data; 42} 43function XML() { 44 const data = _interopRequireWildcard(require("../utils/XML")); 45 XML = function () { 46 return data; 47 }; 48 return data; 49} 50function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } 51function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } 52function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 53async function writeAndroidManifestAsync(manifestPath, androidManifest) { 54 const manifestXml = XML().format(androidManifest); 55 await _fs().default.promises.mkdir(_path().default.dirname(manifestPath), { 56 recursive: true 57 }); 58 await _fs().default.promises.writeFile(manifestPath, manifestXml); 59} 60async function readAndroidManifestAsync(manifestPath) { 61 const xml = await XML().readXMLAsync({ 62 path: manifestPath 63 }); 64 if (!isManifest(xml)) { 65 throw new Error('Invalid manifest found at: ' + manifestPath); 66 } 67 return xml; 68} 69function isManifest(xml) { 70 // TODO: Maybe more validation 71 return !!xml.manifest; 72} 73 74/** Returns the `manifest.application` tag ending in `.MainApplication` */ 75function getMainApplication(androidManifest) { 76 var _androidManifest$mani, _androidManifest$mani2, _androidManifest$mani3; 77 return (_androidManifest$mani = androidManifest === null || androidManifest === void 0 ? void 0 : (_androidManifest$mani2 = androidManifest.manifest) === null || _androidManifest$mani2 === void 0 ? void 0 : (_androidManifest$mani3 = _androidManifest$mani2.application) === null || _androidManifest$mani3 === void 0 ? void 0 : _androidManifest$mani3.filter(e => { 78 var _e$$; 79 return e === null || e === void 0 ? void 0 : (_e$$ = e.$) === null || _e$$ === void 0 ? void 0 : _e$$['android:name'].endsWith('.MainApplication'); 80 })[0]) !== null && _androidManifest$mani !== void 0 ? _androidManifest$mani : null; 81} 82function getMainApplicationOrThrow(androidManifest) { 83 const mainApplication = getMainApplication(androidManifest); 84 (0, _assert().default)(mainApplication, 'AndroidManifest.xml is missing the required MainApplication element'); 85 return mainApplication; 86} 87function getMainActivityOrThrow(androidManifest) { 88 const mainActivity = getMainActivity(androidManifest); 89 (0, _assert().default)(mainActivity, 'AndroidManifest.xml is missing the required MainActivity element'); 90 return mainActivity; 91} 92function getRunnableActivity(androidManifest) { 93 var _androidManifest$mani4, _androidManifest$mani5, _androidManifest$mani6, _androidManifest$mani7, _androidManifest$mani8; 94 // Get enabled activities 95 const enabledActivities = androidManifest === null || androidManifest === void 0 ? void 0 : (_androidManifest$mani4 = androidManifest.manifest) === null || _androidManifest$mani4 === void 0 ? void 0 : (_androidManifest$mani5 = _androidManifest$mani4.application) === null || _androidManifest$mani5 === void 0 ? void 0 : (_androidManifest$mani6 = _androidManifest$mani5[0]) === null || _androidManifest$mani6 === void 0 ? void 0 : (_androidManifest$mani7 = _androidManifest$mani6.activity) === null || _androidManifest$mani7 === void 0 ? void 0 : (_androidManifest$mani8 = _androidManifest$mani7.filter) === null || _androidManifest$mani8 === void 0 ? void 0 : _androidManifest$mani8.call(_androidManifest$mani7, e => e.$['android:enabled'] !== 'false' && e.$['android:enabled'] !== false); 96 if (!enabledActivities) { 97 return null; 98 } 99 100 // Get the activity that has a runnable intent-filter 101 for (const activity of enabledActivities) { 102 if (Array.isArray(activity['intent-filter'])) { 103 for (const intentFilter of activity['intent-filter']) { 104 var _intentFilter$action, _intentFilter$categor; 105 if ((_intentFilter$action = intentFilter.action) !== null && _intentFilter$action !== void 0 && _intentFilter$action.find(action => action.$['android:name'] === 'android.intent.action.MAIN') && (_intentFilter$categor = intentFilter.category) !== null && _intentFilter$categor !== void 0 && _intentFilter$categor.find(category => category.$['android:name'] === 'android.intent.category.LAUNCHER')) { 106 return activity; 107 } 108 } 109 } 110 } 111 return null; 112} 113function getMainActivity(androidManifest) { 114 var _androidManifest$mani9, _androidManifest$mani10, _androidManifest$mani11, _androidManifest$mani12, _androidManifest$mani13, _mainActivity$; 115 const mainActivity = androidManifest === null || androidManifest === void 0 ? void 0 : (_androidManifest$mani9 = androidManifest.manifest) === null || _androidManifest$mani9 === void 0 ? void 0 : (_androidManifest$mani10 = _androidManifest$mani9.application) === null || _androidManifest$mani10 === void 0 ? void 0 : (_androidManifest$mani11 = _androidManifest$mani10[0]) === null || _androidManifest$mani11 === void 0 ? void 0 : (_androidManifest$mani12 = _androidManifest$mani11.activity) === null || _androidManifest$mani12 === void 0 ? void 0 : (_androidManifest$mani13 = _androidManifest$mani12.filter) === null || _androidManifest$mani13 === void 0 ? void 0 : _androidManifest$mani13.call(_androidManifest$mani12, e => e.$['android:name'] === '.MainActivity'); 116 return (_mainActivity$ = mainActivity === null || mainActivity === void 0 ? void 0 : mainActivity[0]) !== null && _mainActivity$ !== void 0 ? _mainActivity$ : null; 117} 118function addMetaDataItemToMainApplication(mainApplication, itemName, itemValue, itemType = 'value') { 119 let existingMetaDataItem; 120 const newItem = { 121 $: prefixAndroidKeys({ 122 name: itemName, 123 [itemType]: itemValue 124 }) 125 }; 126 if (mainApplication['meta-data']) { 127 existingMetaDataItem = mainApplication['meta-data'].filter(e => e.$['android:name'] === itemName); 128 if (existingMetaDataItem.length) { 129 existingMetaDataItem[0].$[`android:${itemType}`] = itemValue; 130 } else { 131 mainApplication['meta-data'].push(newItem); 132 } 133 } else { 134 mainApplication['meta-data'] = [newItem]; 135 } 136 return mainApplication; 137} 138function removeMetaDataItemFromMainApplication(mainApplication, itemName) { 139 const index = findMetaDataItem(mainApplication, itemName); 140 if (mainApplication !== null && mainApplication !== void 0 && mainApplication['meta-data'] && index > -1) { 141 mainApplication['meta-data'].splice(index, 1); 142 } 143 return mainApplication; 144} 145function findApplicationSubItem(mainApplication, category, itemName) { 146 const parent = mainApplication[category]; 147 if (Array.isArray(parent)) { 148 const index = parent.findIndex(e => e.$['android:name'] === itemName); 149 return index; 150 } 151 return -1; 152} 153function findMetaDataItem(mainApplication, itemName) { 154 return findApplicationSubItem(mainApplication, 'meta-data', itemName); 155} 156function findUsesLibraryItem(mainApplication, itemName) { 157 return findApplicationSubItem(mainApplication, 'uses-library', itemName); 158} 159function getMainApplicationMetaDataValue(androidManifest, name) { 160 const mainApplication = getMainApplication(androidManifest); 161 if (mainApplication !== null && mainApplication !== void 0 && mainApplication.hasOwnProperty('meta-data')) { 162 var _mainApplication$meta, _item$$$androidValue; 163 const item = mainApplication === null || mainApplication === void 0 ? void 0 : (_mainApplication$meta = mainApplication['meta-data']) === null || _mainApplication$meta === void 0 ? void 0 : _mainApplication$meta.find(e => e.$['android:name'] === name); 164 return (_item$$$androidValue = item === null || item === void 0 ? void 0 : item.$['android:value']) !== null && _item$$$androidValue !== void 0 ? _item$$$androidValue : null; 165 } 166 return null; 167} 168function addUsesLibraryItemToMainApplication(mainApplication, item) { 169 let existingMetaDataItem; 170 const newItem = { 171 $: prefixAndroidKeys(item) 172 }; 173 if (mainApplication['uses-library']) { 174 existingMetaDataItem = mainApplication['uses-library'].filter(e => e.$['android:name'] === item.name); 175 if (existingMetaDataItem.length) { 176 existingMetaDataItem[0].$ = newItem.$; 177 } else { 178 mainApplication['uses-library'].push(newItem); 179 } 180 } else { 181 mainApplication['uses-library'] = [newItem]; 182 } 183 return mainApplication; 184} 185function removeUsesLibraryItemFromMainApplication(mainApplication, itemName) { 186 const index = findUsesLibraryItem(mainApplication, itemName); 187 if (mainApplication !== null && mainApplication !== void 0 && mainApplication['uses-library'] && index > -1) { 188 mainApplication['uses-library'].splice(index, 1); 189 } 190 return mainApplication; 191} 192function prefixAndroidKeys(head) { 193 // prefix all keys with `android:` 194 return Object.entries(head).reduce((prev, [key, curr]) => ({ 195 ...prev, 196 [`android:${key}`]: curr 197 }), {}); 198} 199 200/** 201 * Ensure the `tools:*` namespace is available in the manifest. 202 * 203 * @param manifest AndroidManifest.xml 204 * @returns manifest with the `tools:*` namespace available 205 */ 206function ensureToolsAvailable(manifest) { 207 return ensureManifestHasNamespace(manifest, { 208 namespace: 'xmlns:tools', 209 url: 'http://schemas.android.com/tools' 210 }); 211} 212 213/** 214 * Ensure a particular namespace is available in the manifest. 215 * 216 * @param manifest `AndroidManifest.xml` 217 * @returns manifest with the provided namespace available 218 */ 219function ensureManifestHasNamespace(manifest, { 220 namespace, 221 url 222}) { 223 var _manifest$manifest, _manifest$manifest$$; 224 if (manifest !== null && manifest !== void 0 && (_manifest$manifest = manifest.manifest) !== null && _manifest$manifest !== void 0 && (_manifest$manifest$$ = _manifest$manifest.$) !== null && _manifest$manifest$$ !== void 0 && _manifest$manifest$$[namespace]) { 225 return manifest; 226 } 227 manifest.manifest.$[namespace] = url; 228 return manifest; 229} 230//# sourceMappingURL=Manifest.js.map