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 _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, config => {
96    const projectRoot = config.modRequest.projectRoot;
97    const expoUpdatesPackageVersion = (0, _Updates().getExpoUpdatesPackageVersion)(projectRoot);
98    config.modResults = setUpdatesConfig(projectRoot, config, config.modResults, expoUpdatesPackageVersion);
99    return config;
100  });
101};
102const withRuntimeVersionResource = (0, _androidPlugins().createStringsXmlPlugin)(applyRuntimeVersionFromConfig, 'withRuntimeVersionResource');
103function applyRuntimeVersionFromConfig(config, stringsJSON) {
104  const runtimeVersion = (0, _Updates().getRuntimeVersionNullable)(config, 'android');
105  if (runtimeVersion) {
106    return (0, _Strings().setStringItem)([(0, _Resources().buildResourceItem)({
107      name: 'expo_runtime_version',
108      value: runtimeVersion
109    })], stringsJSON);
110  }
111  return (0, _Strings().removeStringItem)('expo_runtime_version', stringsJSON);
112}
113function setUpdatesConfig(projectRoot, config, androidManifest, expoUpdatesPackageVersion) {
114  const mainApplication = (0, _Manifest().getMainApplicationOrThrow)(androidManifest);
115  (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.ENABLED, String((0, _Updates().getUpdatesEnabled)(config)));
116  (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.CHECK_ON_LAUNCH, (0, _Updates().getUpdatesCheckOnLaunch)(config, expoUpdatesPackageVersion));
117  (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.LAUNCH_WAIT_MS, String((0, _Updates().getUpdatesTimeout)(config)));
118  const updateUrl = (0, _Updates().getUpdateUrl)(config);
119  if (updateUrl) {
120    (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.UPDATE_URL, updateUrl);
121  } else {
122    (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.UPDATE_URL);
123  }
124  const codeSigningCertificate = (0, _Updates().getUpdatesCodeSigningCertificate)(projectRoot, config);
125  if (codeSigningCertificate) {
126    (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.CODE_SIGNING_CERTIFICATE, codeSigningCertificate);
127  } else {
128    (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.CODE_SIGNING_CERTIFICATE);
129  }
130  const codeSigningMetadata = (0, _Updates().getUpdatesCodeSigningMetadataStringified)(config);
131  if (codeSigningMetadata) {
132    (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.CODE_SIGNING_METADATA, codeSigningMetadata);
133  } else {
134    (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.CODE_SIGNING_METADATA);
135  }
136  const requestHeaders = (0, _Updates().getUpdatesRequestHeadersStringified)(config);
137  if (requestHeaders) {
138    (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY, requestHeaders);
139  } else {
140    (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY);
141  }
142  return setVersionsConfig(config, androidManifest);
143}
144function setVersionsConfig(config, androidManifest) {
145  const mainApplication = (0, _Manifest().getMainApplicationOrThrow)(androidManifest);
146  const runtimeVersion = (0, _Updates().getRuntimeVersionNullable)(config, 'android');
147  if (!runtimeVersion && (0, _Manifest().findMetaDataItem)(mainApplication, Config.RUNTIME_VERSION) > -1) {
148    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.');
149  }
150  const sdkVersion = (0, _Updates().getSDKVersion)(config);
151  if (runtimeVersion) {
152    (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.SDK_VERSION);
153    (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.RUNTIME_VERSION, '@string/expo_runtime_version');
154  } else if (sdkVersion) {
155    /**
156     * runtime version maybe null in projects using classic updates. In that
157     * case we use SDK version
158     */
159    (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.RUNTIME_VERSION);
160    (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.SDK_VERSION, sdkVersion);
161  } else {
162    (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.RUNTIME_VERSION);
163    (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.SDK_VERSION);
164  }
165  return androidManifest;
166}
167function ensureBuildGradleContainsConfigurationScript(projectRoot, buildGradleContents) {
168  if (!isBuildGradleConfigured(projectRoot, buildGradleContents)) {
169    let cleanedUpBuildGradleContents;
170    const isBuildGradleMisconfigured = buildGradleContents.split('\n').some(line => line.includes(CREATE_MANIFEST_ANDROID_PATH));
171    if (isBuildGradleMisconfigured) {
172      cleanedUpBuildGradleContents = buildGradleContents.replace(new RegExp(`(\n// Integration with Expo updates)?\n.*${CREATE_MANIFEST_ANDROID_PATH}.*\n`), '');
173    } else {
174      cleanedUpBuildGradleContents = buildGradleContents;
175    }
176    const gradleScriptApply = formatApplyLineForBuildGradle(projectRoot);
177    return `${cleanedUpBuildGradleContents}\n// Integration with Expo updates\n${gradleScriptApply}\n`;
178  } else {
179    return buildGradleContents;
180  }
181}
182function formatApplyLineForBuildGradle(projectRoot) {
183  const updatesGradleScriptPath = _resolveFrom().default.silent(projectRoot, CREATE_MANIFEST_ANDROID_PATH);
184  if (!updatesGradleScriptPath) {
185    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.");
186  }
187  const relativePath = _path().default.relative(_path().default.join(projectRoot, 'android', 'app'), updatesGradleScriptPath);
188  const posixPath = process.platform === 'win32' ? relativePath.replace(/\\/g, '/') : relativePath;
189  return `apply from: "${posixPath}"`;
190}
191function isBuildGradleConfigured(projectRoot, buildGradleContents) {
192  const androidBuildScript = formatApplyLineForBuildGradle(projectRoot);
193  return buildGradleContents.replace(/\r\n/g, '\n').split('\n')
194  // Check for both single and double quotes
195  .some(line => line === androidBuildScript || line === androidBuildScript.replace(/"/g, "'"));
196}
197function isMainApplicationMetaDataSet(androidManifest) {
198  const updateUrl = (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.UPDATE_URL);
199  const runtimeVersion = (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.RUNTIME_VERSION);
200  const sdkVersion = (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.SDK_VERSION);
201  return Boolean(updateUrl && (sdkVersion || runtimeVersion));
202}
203function isMainApplicationMetaDataSynced(projectRoot, config, androidManifest) {
204  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) && areVersionsSynced(config, androidManifest);
205}
206function areVersionsSynced(config, androidManifest) {
207  const expectedRuntimeVersion = (0, _Updates().getRuntimeVersionNullable)(config, 'android');
208  const expectedSdkVersion = (0, _Updates().getSDKVersion)(config);
209  const currentRuntimeVersion = (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.RUNTIME_VERSION);
210  const currentSdkVersion = (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.SDK_VERSION);
211  if (expectedRuntimeVersion !== null) {
212    return currentRuntimeVersion === expectedRuntimeVersion && currentSdkVersion === null;
213  } else if (expectedSdkVersion !== null) {
214    return currentSdkVersion === expectedSdkVersion && currentRuntimeVersion === null;
215  } else {
216    return true;
217  }
218}
219//# sourceMappingURL=Updates.js.map