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