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