1"use strict"; 2 3Object.defineProperty(exports, "__esModule", { 4 value: true 5}); 6exports.Config = void 0; 7exports.applyRuntimeVersionFromConfig = applyRuntimeVersionFromConfig; 8exports.areVersionsSynced = areVersionsSynced; 9exports.ensureBuildGradleContainsConfigurationScript = ensureBuildGradleContainsConfigurationScript; 10exports.formatApplyLineForBuildGradle = formatApplyLineForBuildGradle; 11exports.isBuildGradleConfigured = isBuildGradleConfigured; 12exports.isMainApplicationMetaDataSet = isMainApplicationMetaDataSet; 13exports.isMainApplicationMetaDataSynced = isMainApplicationMetaDataSynced; 14exports.setUpdatesConfig = setUpdatesConfig; 15exports.setVersionsConfig = setVersionsConfig; 16exports.withUpdates = void 0; 17 18function _path() { 19 const data = _interopRequireDefault(require("path")); 20 21 _path = function () { 22 return data; 23 }; 24 25 return data; 26} 27 28function _resolveFrom() { 29 const data = _interopRequireDefault(require("resolve-from")); 30 31 _resolveFrom = function () { 32 return data; 33 }; 34 35 return data; 36} 37 38function _androidPlugins() { 39 const data = require("../plugins/android-plugins"); 40 41 _androidPlugins = function () { 42 return data; 43 }; 44 45 return data; 46} 47 48function _withPlugins() { 49 const data = require("../plugins/withPlugins"); 50 51 _withPlugins = function () { 52 return data; 53 }; 54 55 return data; 56} 57 58function _Updates() { 59 const data = require("../utils/Updates"); 60 61 _Updates = function () { 62 return data; 63 }; 64 65 return data; 66} 67 68function _Manifest() { 69 const data = require("./Manifest"); 70 71 _Manifest = function () { 72 return data; 73 }; 74 75 return data; 76} 77 78function _Resources() { 79 const data = require("./Resources"); 80 81 _Resources = function () { 82 return data; 83 }; 84 85 return data; 86} 87 88function _Strings() { 89 const data = require("./Strings"); 90 91 _Strings = function () { 92 return data; 93 }; 94 95 return data; 96} 97 98function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 99 100const CREATE_MANIFEST_ANDROID_PATH = 'expo-updates/scripts/create-manifest-android.gradle'; 101let Config; 102exports.Config = Config; 103 104(function (Config) { 105 Config["ENABLED"] = "expo.modules.updates.ENABLED"; 106 Config["CHECK_ON_LAUNCH"] = "expo.modules.updates.EXPO_UPDATES_CHECK_ON_LAUNCH"; 107 Config["LAUNCH_WAIT_MS"] = "expo.modules.updates.EXPO_UPDATES_LAUNCH_WAIT_MS"; 108 Config["SDK_VERSION"] = "expo.modules.updates.EXPO_SDK_VERSION"; 109 Config["RUNTIME_VERSION"] = "expo.modules.updates.EXPO_RUNTIME_VERSION"; 110 Config["UPDATE_URL"] = "expo.modules.updates.EXPO_UPDATE_URL"; 111 Config["RELEASE_CHANNEL"] = "expo.modules.updates.EXPO_RELEASE_CHANNEL"; 112 Config["UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY"] = "expo.modules.updates.UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY"; 113 Config["CODE_SIGNING_CERTIFICATE"] = "expo.modules.updates.CODE_SIGNING_CERTIFICATE"; 114 Config["CODE_SIGNING_METADATA"] = "expo.modules.updates.CODE_SIGNING_METADATA"; 115})(Config || (exports.Config = Config = {})); 116 117const withUpdates = (config, { 118 expoUsername 119}) => { 120 return (0, _withPlugins().withPlugins)(config, [[withUpdatesManifest, { 121 expoUsername 122 }], withRuntimeVersionResource]); 123}; 124 125exports.withUpdates = withUpdates; 126 127const withUpdatesManifest = (config, { 128 expoUsername 129}) => { 130 return (0, _androidPlugins().withAndroidManifest)(config, config => { 131 const projectRoot = config.modRequest.projectRoot; 132 const expoUpdatesPackageVersion = (0, _Updates().getExpoUpdatesPackageVersion)(projectRoot); 133 config.modResults = setUpdatesConfig(projectRoot, config, config.modResults, expoUsername, expoUpdatesPackageVersion); 134 return config; 135 }); 136}; 137 138const withRuntimeVersionResource = (0, _androidPlugins().createStringsXmlPlugin)(applyRuntimeVersionFromConfig, 'withRuntimeVersionResource'); 139 140function applyRuntimeVersionFromConfig(config, stringsJSON) { 141 const runtimeVersion = (0, _Updates().getRuntimeVersionNullable)(config, 'android'); 142 143 if (runtimeVersion) { 144 return (0, _Strings().setStringItem)([(0, _Resources().buildResourceItem)({ 145 name: 'expo_runtime_version', 146 value: runtimeVersion 147 })], stringsJSON); 148 } 149 150 return (0, _Strings().removeStringItem)('expo_runtime_version', stringsJSON); 151} 152 153function setUpdatesConfig(projectRoot, config, androidManifest, username, expoUpdatesPackageVersion) { 154 const mainApplication = (0, _Manifest().getMainApplicationOrThrow)(androidManifest); 155 (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.ENABLED, String((0, _Updates().getUpdatesEnabled)(config))); 156 (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.CHECK_ON_LAUNCH, (0, _Updates().getUpdatesCheckOnLaunch)(config, expoUpdatesPackageVersion)); 157 (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.LAUNCH_WAIT_MS, String((0, _Updates().getUpdatesTimeout)(config))); 158 const updateUrl = (0, _Updates().getUpdateUrl)(config, username); 159 160 if (updateUrl) { 161 (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.UPDATE_URL, updateUrl); 162 } else { 163 (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.UPDATE_URL); 164 } 165 166 const codeSigningCertificate = (0, _Updates().getUpdatesCodeSigningCertificate)(projectRoot, config); 167 168 if (codeSigningCertificate) { 169 (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.CODE_SIGNING_CERTIFICATE, codeSigningCertificate); 170 } else { 171 (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.CODE_SIGNING_CERTIFICATE); 172 } 173 174 const codeSigningMetadata = (0, _Updates().getUpdatesCodeSigningMetadataStringified)(config); 175 176 if (codeSigningMetadata) { 177 (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.CODE_SIGNING_METADATA, codeSigningMetadata); 178 } else { 179 (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.CODE_SIGNING_METADATA); 180 } 181 182 return setVersionsConfig(config, androidManifest); 183} 184 185function setVersionsConfig(config, androidManifest) { 186 const mainApplication = (0, _Manifest().getMainApplicationOrThrow)(androidManifest); 187 const runtimeVersion = (0, _Updates().getRuntimeVersionNullable)(config, 'android'); 188 189 if (!runtimeVersion && (0, _Manifest().findMetaDataItem)(mainApplication, Config.RUNTIME_VERSION) > -1) { 190 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.'); 191 } 192 193 const sdkVersion = (0, _Updates().getSDKVersion)(config); 194 195 if (runtimeVersion) { 196 (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.SDK_VERSION); 197 (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.RUNTIME_VERSION, '@string/expo_runtime_version'); 198 } else if (sdkVersion) { 199 /** 200 * runtime version maybe null in projects using classic updates. In that 201 * case we use SDK version 202 */ 203 (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.RUNTIME_VERSION); 204 (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.SDK_VERSION, sdkVersion); 205 } else { 206 (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.RUNTIME_VERSION); 207 (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.SDK_VERSION); 208 } 209 210 return androidManifest; 211} 212 213function ensureBuildGradleContainsConfigurationScript(projectRoot, buildGradleContents) { 214 if (!isBuildGradleConfigured(projectRoot, buildGradleContents)) { 215 let cleanedUpBuildGradleContents; 216 const isBuildGradleMisconfigured = buildGradleContents.split('\n').some(line => line.includes(CREATE_MANIFEST_ANDROID_PATH)); 217 218 if (isBuildGradleMisconfigured) { 219 cleanedUpBuildGradleContents = buildGradleContents.replace(new RegExp(`(\n// Integration with Expo updates)?\n.*${CREATE_MANIFEST_ANDROID_PATH}.*\n`), ''); 220 } else { 221 cleanedUpBuildGradleContents = buildGradleContents; 222 } 223 224 const gradleScriptApply = formatApplyLineForBuildGradle(projectRoot); 225 return `${cleanedUpBuildGradleContents}\n// Integration with Expo updates\n${gradleScriptApply}\n`; 226 } else { 227 return buildGradleContents; 228 } 229} 230 231function formatApplyLineForBuildGradle(projectRoot) { 232 const updatesGradleScriptPath = _resolveFrom().default.silent(projectRoot, CREATE_MANIFEST_ANDROID_PATH); 233 234 if (!updatesGradleScriptPath) { 235 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."); 236 } 237 238 const relativePath = _path().default.relative(_path().default.join(projectRoot, 'android', 'app'), updatesGradleScriptPath); 239 240 const posixPath = process.platform === 'win32' ? relativePath.replace(/\\/g, '/') : relativePath; 241 return `apply from: "${posixPath}"`; 242} 243 244function isBuildGradleConfigured(projectRoot, buildGradleContents) { 245 const androidBuildScript = formatApplyLineForBuildGradle(projectRoot); 246 return buildGradleContents.replace(/\r\n/g, '\n').split('\n') // Check for both single and double quotes 247 .some(line => line === androidBuildScript || line === androidBuildScript.replace(/"/g, "'")); 248} 249 250function isMainApplicationMetaDataSet(androidManifest) { 251 const updateUrl = (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.UPDATE_URL); 252 const runtimeVersion = (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.RUNTIME_VERSION); 253 const sdkVersion = (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.SDK_VERSION); 254 return Boolean(updateUrl && (sdkVersion || runtimeVersion)); 255} 256 257function isMainApplicationMetaDataSynced(projectRoot, config, androidManifest, username) { 258 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); 259} 260 261function areVersionsSynced(config, androidManifest) { 262 const expectedRuntimeVersion = (0, _Updates().getRuntimeVersionNullable)(config, 'android'); 263 const expectedSdkVersion = (0, _Updates().getSDKVersion)(config); 264 const currentRuntimeVersion = (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.RUNTIME_VERSION); 265 const currentSdkVersion = (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.SDK_VERSION); 266 267 if (expectedRuntimeVersion !== null) { 268 return currentRuntimeVersion === expectedRuntimeVersion && currentSdkVersion === null; 269 } else if (expectedSdkVersion !== null) { 270 return currentSdkVersion === expectedSdkVersion && currentRuntimeVersion === null; 271 } else { 272 return true; 273 } 274} 275//# sourceMappingURL=Updates.js.map