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;
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 _androidPlugins() {
32  const data = require("../plugins/android-plugins");
33  _androidPlugins = function () {
34    return data;
35  };
36  return data;
37}
38function _withPlugins() {
39  const data = require("../plugins/withPlugins");
40  _withPlugins = function () {
41    return data;
42  };
43  return data;
44}
45function _Updates() {
46  const data = require("../utils/Updates");
47  _Updates = function () {
48    return data;
49  };
50  return data;
51}
52function _Manifest() {
53  const data = require("./Manifest");
54  _Manifest = function () {
55    return data;
56  };
57  return data;
58}
59function _Resources() {
60  const data = require("./Resources");
61  _Resources = function () {
62    return data;
63  };
64  return data;
65}
66function _Strings() {
67  const data = require("./Strings");
68  _Strings = 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;
76exports.Config = Config;
77(function (Config) {
78  Config["ENABLED"] = "expo.modules.updates.ENABLED";
79  Config["CHECK_ON_LAUNCH"] = "expo.modules.updates.EXPO_UPDATES_CHECK_ON_LAUNCH";
80  Config["LAUNCH_WAIT_MS"] = "expo.modules.updates.EXPO_UPDATES_LAUNCH_WAIT_MS";
81  Config["SDK_VERSION"] = "expo.modules.updates.EXPO_SDK_VERSION";
82  Config["RUNTIME_VERSION"] = "expo.modules.updates.EXPO_RUNTIME_VERSION";
83  Config["UPDATE_URL"] = "expo.modules.updates.EXPO_UPDATE_URL";
84  Config["RELEASE_CHANNEL"] = "expo.modules.updates.EXPO_RELEASE_CHANNEL";
85  Config["UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY"] = "expo.modules.updates.UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY";
86  Config["CODE_SIGNING_CERTIFICATE"] = "expo.modules.updates.CODE_SIGNING_CERTIFICATE";
87  Config["CODE_SIGNING_METADATA"] = "expo.modules.updates.CODE_SIGNING_METADATA";
88})(Config || (exports.Config = Config = {}));
89const withUpdates = (config, {
90  expoUsername
91}) => {
92  return (0, _withPlugins().withPlugins)(config, [[withUpdatesManifest, {
93    expoUsername
94  }], withRuntimeVersionResource]);
95};
96exports.withUpdates = withUpdates;
97const withUpdatesManifest = (config, {
98  expoUsername
99}) => {
100  return (0, _androidPlugins().withAndroidManifest)(config, config => {
101    const projectRoot = config.modRequest.projectRoot;
102    const expoUpdatesPackageVersion = (0, _Updates().getExpoUpdatesPackageVersion)(projectRoot);
103    config.modResults = setUpdatesConfig(projectRoot, config, config.modResults, expoUsername, expoUpdatesPackageVersion);
104    return config;
105  });
106};
107const withRuntimeVersionResource = (0, _androidPlugins().createStringsXmlPlugin)(applyRuntimeVersionFromConfig, 'withRuntimeVersionResource');
108function applyRuntimeVersionFromConfig(config, stringsJSON) {
109  const runtimeVersion = (0, _Updates().getRuntimeVersionNullable)(config, 'android');
110  if (runtimeVersion) {
111    return (0, _Strings().setStringItem)([(0, _Resources().buildResourceItem)({
112      name: 'expo_runtime_version',
113      value: runtimeVersion
114    })], stringsJSON);
115  }
116  return (0, _Strings().removeStringItem)('expo_runtime_version', stringsJSON);
117}
118function setUpdatesConfig(projectRoot, config, androidManifest, username, expoUpdatesPackageVersion) {
119  const mainApplication = (0, _Manifest().getMainApplicationOrThrow)(androidManifest);
120  (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.ENABLED, String((0, _Updates().getUpdatesEnabled)(config)));
121  (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.CHECK_ON_LAUNCH, (0, _Updates().getUpdatesCheckOnLaunch)(config, expoUpdatesPackageVersion));
122  (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.LAUNCH_WAIT_MS, String((0, _Updates().getUpdatesTimeout)(config)));
123  const updateUrl = (0, _Updates().getUpdateUrl)(config, username);
124  if (updateUrl) {
125    (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.UPDATE_URL, updateUrl);
126  } else {
127    (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.UPDATE_URL);
128  }
129  const codeSigningCertificate = (0, _Updates().getUpdatesCodeSigningCertificate)(projectRoot, config);
130  if (codeSigningCertificate) {
131    (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.CODE_SIGNING_CERTIFICATE, codeSigningCertificate);
132  } else {
133    (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.CODE_SIGNING_CERTIFICATE);
134  }
135  const codeSigningMetadata = (0, _Updates().getUpdatesCodeSigningMetadataStringified)(config);
136  if (codeSigningMetadata) {
137    (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.CODE_SIGNING_METADATA, codeSigningMetadata);
138  } else {
139    (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.CODE_SIGNING_METADATA);
140  }
141  const requestHeaders = (0, _Updates().getUpdatesRequestHeadersStringified)(config);
142  if (requestHeaders) {
143    (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY, requestHeaders);
144  } else {
145    (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY);
146  }
147  return setVersionsConfig(config, androidManifest);
148}
149function setVersionsConfig(config, androidManifest) {
150  const mainApplication = (0, _Manifest().getMainApplicationOrThrow)(androidManifest);
151  const runtimeVersion = (0, _Updates().getRuntimeVersionNullable)(config, 'android');
152  if (!runtimeVersion && (0, _Manifest().findMetaDataItem)(mainApplication, Config.RUNTIME_VERSION) > -1) {
153    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.');
154  }
155  const sdkVersion = (0, _Updates().getSDKVersion)(config);
156  if (runtimeVersion) {
157    (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.SDK_VERSION);
158    (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.RUNTIME_VERSION, '@string/expo_runtime_version');
159  } else if (sdkVersion) {
160    /**
161     * runtime version maybe null in projects using classic updates. In that
162     * case we use SDK version
163     */
164    (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.RUNTIME_VERSION);
165    (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.SDK_VERSION, sdkVersion);
166  } else {
167    (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.RUNTIME_VERSION);
168    (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.SDK_VERSION);
169  }
170  return androidManifest;
171}
172function ensureBuildGradleContainsConfigurationScript(projectRoot, buildGradleContents) {
173  if (!isBuildGradleConfigured(projectRoot, buildGradleContents)) {
174    let cleanedUpBuildGradleContents;
175    const isBuildGradleMisconfigured = buildGradleContents.split('\n').some(line => line.includes(CREATE_MANIFEST_ANDROID_PATH));
176    if (isBuildGradleMisconfigured) {
177      cleanedUpBuildGradleContents = buildGradleContents.replace(new RegExp(`(\n// Integration with Expo updates)?\n.*${CREATE_MANIFEST_ANDROID_PATH}.*\n`), '');
178    } else {
179      cleanedUpBuildGradleContents = buildGradleContents;
180    }
181    const gradleScriptApply = formatApplyLineForBuildGradle(projectRoot);
182    return `${cleanedUpBuildGradleContents}\n// Integration with Expo updates\n${gradleScriptApply}\n`;
183  } else {
184    return buildGradleContents;
185  }
186}
187function formatApplyLineForBuildGradle(projectRoot) {
188  const updatesGradleScriptPath = _resolveFrom().default.silent(projectRoot, CREATE_MANIFEST_ANDROID_PATH);
189  if (!updatesGradleScriptPath) {
190    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.");
191  }
192  const relativePath = _path().default.relative(_path().default.join(projectRoot, 'android', 'app'), updatesGradleScriptPath);
193  const posixPath = process.platform === 'win32' ? relativePath.replace(/\\/g, '/') : relativePath;
194  return `apply from: "${posixPath}"`;
195}
196function isBuildGradleConfigured(projectRoot, buildGradleContents) {
197  const androidBuildScript = formatApplyLineForBuildGradle(projectRoot);
198  return buildGradleContents.replace(/\r\n/g, '\n').split('\n')
199  // Check for both single and double quotes
200  .some(line => line === androidBuildScript || line === androidBuildScript.replace(/"/g, "'"));
201}
202function isMainApplicationMetaDataSet(androidManifest) {
203  const updateUrl = (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.UPDATE_URL);
204  const runtimeVersion = (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.RUNTIME_VERSION);
205  const sdkVersion = (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.SDK_VERSION);
206  return Boolean(updateUrl && (sdkVersion || runtimeVersion));
207}
208function isMainApplicationMetaDataSynced(projectRoot, config, androidManifest, username) {
209  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);
210}
211function areVersionsSynced(config, androidManifest) {
212  const expectedRuntimeVersion = (0, _Updates().getRuntimeVersionNullable)(config, 'android');
213  const expectedSdkVersion = (0, _Updates().getSDKVersion)(config);
214  const currentRuntimeVersion = (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.RUNTIME_VERSION);
215  const currentSdkVersion = (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.SDK_VERSION);
216  if (expectedRuntimeVersion !== null) {
217    return currentRuntimeVersion === expectedRuntimeVersion && currentSdkVersion === null;
218  } else if (expectedSdkVersion !== null) {
219    return currentSdkVersion === expectedSdkVersion && currentRuntimeVersion === null;
220  } else {
221    return true;
222  }
223}
224//# sourceMappingURL=Updates.js.map