1"use strict"; 2 3Object.defineProperty(exports, "__esModule", { 4 value: true 5}); 6exports.Config = void 0; 7exports.areVersionsSynced = areVersionsSynced; 8exports.ensureBuildGradleContainsConfigurationScript = ensureBuildGradleContainsConfigurationScript; 9exports.formatApplyLineForBuildGradle = formatApplyLineForBuildGradle; 10exports.isBuildGradleConfigured = isBuildGradleConfigured; 11exports.isMainApplicationMetaDataSet = isMainApplicationMetaDataSet; 12exports.isMainApplicationMetaDataSynced = isMainApplicationMetaDataSynced; 13exports.setUpdatesConfig = setUpdatesConfig; 14exports.setVersionsConfig = setVersionsConfig; 15exports.withUpdates = void 0; 16 17function _path() { 18 const data = _interopRequireDefault(require("path")); 19 20 _path = function () { 21 return data; 22 }; 23 24 return data; 25} 26 27function _resolveFrom() { 28 const data = _interopRequireDefault(require("resolve-from")); 29 30 _resolveFrom = function () { 31 return data; 32 }; 33 34 return data; 35} 36 37function _androidPlugins() { 38 const data = require("../plugins/android-plugins"); 39 40 _androidPlugins = function () { 41 return data; 42 }; 43 44 return data; 45} 46 47function _Updates() { 48 const data = require("../utils/Updates"); 49 50 _Updates = function () { 51 return data; 52 }; 53 54 return data; 55} 56 57function _Manifest() { 58 const data = require("./Manifest"); 59 60 _Manifest = function () { 61 return data; 62 }; 63 64 return data; 65} 66 67function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 68 69const CREATE_MANIFEST_ANDROID_PATH = 'expo-updates/scripts/create-manifest-android.gradle'; 70let Config; 71exports.Config = Config; 72 73(function (Config) { 74 Config["ENABLED"] = "expo.modules.updates.ENABLED"; 75 Config["CHECK_ON_LAUNCH"] = "expo.modules.updates.EXPO_UPDATES_CHECK_ON_LAUNCH"; 76 Config["LAUNCH_WAIT_MS"] = "expo.modules.updates.EXPO_UPDATES_LAUNCH_WAIT_MS"; 77 Config["SDK_VERSION"] = "expo.modules.updates.EXPO_SDK_VERSION"; 78 Config["RUNTIME_VERSION"] = "expo.modules.updates.EXPO_RUNTIME_VERSION"; 79 Config["UPDATE_URL"] = "expo.modules.updates.EXPO_UPDATE_URL"; 80 Config["RELEASE_CHANNEL"] = "expo.modules.updates.EXPO_RELEASE_CHANNEL"; 81 Config["UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY"] = "expo.modules.updates.UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY"; 82 Config["CODE_SIGNING_CERTIFICATE"] = "expo.modules.updates.CODE_SIGNING_CERTIFICATE"; 83 Config["CODE_SIGNING_METADATA"] = "expo.modules.updates.CODE_SIGNING_METADATA"; 84})(Config || (exports.Config = Config = {})); 85 86const withUpdates = (config, { 87 expoUsername 88}) => { 89 return (0, _androidPlugins().withAndroidManifest)(config, config => { 90 const projectRoot = config.modRequest.projectRoot; 91 const expoUpdatesPackageVersion = (0, _Updates().getExpoUpdatesPackageVersion)(projectRoot); 92 config.modResults = setUpdatesConfig(projectRoot, config, config.modResults, expoUsername, expoUpdatesPackageVersion); 93 return config; 94 }); 95}; 96 97exports.withUpdates = withUpdates; 98 99function setUpdatesConfig(projectRoot, config, androidManifest, username, expoUpdatesPackageVersion) { 100 const mainApplication = (0, _Manifest().getMainApplicationOrThrow)(androidManifest); 101 (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.ENABLED, String((0, _Updates().getUpdatesEnabled)(config))); 102 (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.CHECK_ON_LAUNCH, (0, _Updates().getUpdatesCheckOnLaunch)(config, expoUpdatesPackageVersion)); 103 (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.LAUNCH_WAIT_MS, String((0, _Updates().getUpdatesTimeout)(config))); 104 const updateUrl = (0, _Updates().getUpdateUrl)(config, username); 105 106 if (updateUrl) { 107 (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.UPDATE_URL, updateUrl); 108 } else { 109 (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.UPDATE_URL); 110 } 111 112 const codeSigningCertificate = (0, _Updates().getUpdatesCodeSigningCertificate)(projectRoot, config); 113 114 if (codeSigningCertificate) { 115 (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.CODE_SIGNING_CERTIFICATE, codeSigningCertificate); 116 } else { 117 (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.CODE_SIGNING_CERTIFICATE); 118 } 119 120 const codeSigningMetadata = (0, _Updates().getUpdatesCodeSigningMetadataStringified)(config); 121 122 if (codeSigningMetadata) { 123 (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.CODE_SIGNING_METADATA, codeSigningMetadata); 124 } else { 125 (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.CODE_SIGNING_METADATA); 126 } 127 128 return setVersionsConfig(config, androidManifest); 129} 130 131function setVersionsConfig(config, androidManifest) { 132 const mainApplication = (0, _Manifest().getMainApplicationOrThrow)(androidManifest); 133 const runtimeVersion = (0, _Updates().getRuntimeVersionNullable)(config, 'android'); 134 135 if (!runtimeVersion && (0, _Manifest().findMetaDataItem)(mainApplication, Config.RUNTIME_VERSION) > -1) { 136 throw new Error('A runtime version is set in your AndroidManifest.xml, but is missing from your app.json/app.config.js. Please either set runtimeVersion in your app.json/app.config.js or remove expo.modules.updates.EXPO_RUNTIME_VERSION from your AndroidManifest.xml.'); 137 } 138 139 const sdkVersion = (0, _Updates().getSDKVersion)(config); 140 141 if (runtimeVersion) { 142 (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.SDK_VERSION); 143 (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.RUNTIME_VERSION, runtimeVersion); 144 } else if (sdkVersion) { 145 /** 146 * runtime version maybe null in projects using classic updates. In that 147 * case we use SDK version 148 */ 149 (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.RUNTIME_VERSION); 150 (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.SDK_VERSION, sdkVersion); 151 } else { 152 (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.RUNTIME_VERSION); 153 (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.SDK_VERSION); 154 } 155 156 return androidManifest; 157} 158 159function ensureBuildGradleContainsConfigurationScript(projectRoot, buildGradleContents) { 160 if (!isBuildGradleConfigured(projectRoot, buildGradleContents)) { 161 let cleanedUpBuildGradleContents; 162 const isBuildGradleMisconfigured = buildGradleContents.split('\n').some(line => line.includes(CREATE_MANIFEST_ANDROID_PATH)); 163 164 if (isBuildGradleMisconfigured) { 165 cleanedUpBuildGradleContents = buildGradleContents.replace(new RegExp(`(\n// Integration with Expo updates)?\n.*${CREATE_MANIFEST_ANDROID_PATH}.*\n`), ''); 166 } else { 167 cleanedUpBuildGradleContents = buildGradleContents; 168 } 169 170 const gradleScriptApply = formatApplyLineForBuildGradle(projectRoot); 171 return `${cleanedUpBuildGradleContents}\n// Integration with Expo updates\n${gradleScriptApply}\n`; 172 } else { 173 return buildGradleContents; 174 } 175} 176 177function formatApplyLineForBuildGradle(projectRoot) { 178 const updatesGradleScriptPath = _resolveFrom().default.silent(projectRoot, CREATE_MANIFEST_ANDROID_PATH); 179 180 if (!updatesGradleScriptPath) { 181 throw new Error("Could not find the build script for Android. This could happen in case of outdated 'node_modules'. Run 'npm install' to make sure that it's up-to-date."); 182 } 183 184 const relativePath = _path().default.relative(_path().default.join(projectRoot, 'android', 'app'), updatesGradleScriptPath); 185 186 const posixPath = process.platform === 'win32' ? relativePath.replace(/\\/g, '/') : relativePath; 187 return `apply from: "${posixPath}"`; 188} 189 190function isBuildGradleConfigured(projectRoot, buildGradleContents) { 191 const androidBuildScript = formatApplyLineForBuildGradle(projectRoot); 192 return buildGradleContents.replace(/\r\n/g, '\n').split('\n') // Check for both single and double quotes 193 .some(line => line === androidBuildScript || line === androidBuildScript.replace(/"/g, "'")); 194} 195 196function isMainApplicationMetaDataSet(androidManifest) { 197 const updateUrl = (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.UPDATE_URL); 198 const runtimeVersion = (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.RUNTIME_VERSION); 199 const sdkVersion = (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.SDK_VERSION); 200 return Boolean(updateUrl && (sdkVersion || runtimeVersion)); 201} 202 203function isMainApplicationMetaDataSynced(projectRoot, config, androidManifest, username) { 204 return (0, _Updates().getUpdateUrl)(config, username) === (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.UPDATE_URL) && String((0, _Updates().getUpdatesEnabled)(config)) === (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.ENABLED) && String((0, _Updates().getUpdatesTimeout)(config)) === (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.LAUNCH_WAIT_MS) && (0, _Updates().getUpdatesCheckOnLaunch)(config) === (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.CHECK_ON_LAUNCH) && (0, _Updates().getUpdatesCodeSigningCertificate)(projectRoot, config) === (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.CODE_SIGNING_CERTIFICATE) && (0, _Updates().getUpdatesCodeSigningMetadataStringified)(config) === (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.CODE_SIGNING_METADATA) && areVersionsSynced(config, androidManifest); 205} 206 207function areVersionsSynced(config, androidManifest) { 208 const expectedRuntimeVersion = (0, _Updates().getRuntimeVersionNullable)(config, 'android'); 209 const expectedSdkVersion = (0, _Updates().getSDKVersion)(config); 210 const currentRuntimeVersion = (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.RUNTIME_VERSION); 211 const currentSdkVersion = (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.SDK_VERSION); 212 213 if (expectedRuntimeVersion !== null) { 214 return currentRuntimeVersion === expectedRuntimeVersion && currentSdkVersion === null; 215 } else if (expectedSdkVersion !== null) { 216 return currentSdkVersion === expectedSdkVersion && currentRuntimeVersion === null; 217 } else { 218 return true; 219 } 220} 221//# sourceMappingURL=Updates.js.map