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