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