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