@expo/config-plugins 4.0.16 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,14 +3,17 @@ import { AndroidManifest } from './Manifest';
3
3
  export declare type IntentFilterProps = {
4
4
  actions: string[];
5
5
  categories: string[];
6
- schemes: string[];
6
+ data: {
7
+ scheme: string;
8
+ host?: string;
9
+ }[];
7
10
  };
8
11
  export declare const withScheme: import("..").ConfigPlugin<void>;
9
12
  export declare function getScheme(config: {
10
13
  scheme?: string | string[];
11
14
  }): string[];
12
15
  export declare function setScheme(config: Pick<ExpoConfig, 'scheme' | 'android'>, androidManifest: AndroidManifest): AndroidManifest;
13
- export declare function getSchemesFromManifest(androidManifest: AndroidManifest): string[];
16
+ export declare function getSchemesFromManifest(androidManifest: AndroidManifest, requestedHost?: string | null): string[];
14
17
  export declare function ensureManifestHasValidIntentFilter(androidManifest: AndroidManifest): boolean;
15
18
  export declare function hasScheme(scheme: string, androidManifest: AndroidManifest): boolean;
16
19
  export declare function appendScheme(scheme: string, androidManifest: AndroidManifest): AndroidManifest;
@@ -87,14 +87,13 @@ function setScheme(config, androidManifest) {
87
87
 
88
88
  function isValidRedirectIntentFilter({
89
89
  actions,
90
- categories,
91
- schemes
90
+ categories
92
91
  }) {
93
92
  return actions.includes('android.intent.action.VIEW') && !categories.includes('android.intent.category.LAUNCHER');
94
93
  }
95
94
 
96
95
  function propertiesFromIntentFilter(intentFilter) {
97
- var _intentFilter$action$, _intentFilter$action, _intentFilter$categor, _intentFilter$categor2, _intentFilter$data$ma, _intentFilter$data;
96
+ var _intentFilter$action$, _intentFilter$action, _intentFilter$categor, _intentFilter$categor2, _intentFilter$data$fi, _intentFilter$data, _intentFilter$data$fi2;
98
97
 
99
98
  const actions = (_intentFilter$action$ = intentFilter === null || intentFilter === void 0 ? void 0 : (_intentFilter$action = intentFilter.action) === null || _intentFilter$action === void 0 ? void 0 : _intentFilter$action.map(data => {
100
99
  var _data$$;
@@ -106,15 +105,22 @@ function propertiesFromIntentFilter(intentFilter) {
106
105
 
107
106
  return data === null || data === void 0 ? void 0 : (_data$$2 = data.$) === null || _data$$2 === void 0 ? void 0 : _data$$2['android:name'];
108
107
  })) !== null && _intentFilter$categor !== void 0 ? _intentFilter$categor : [];
109
- const schemes = (_intentFilter$data$ma = intentFilter === null || intentFilter === void 0 ? void 0 : (_intentFilter$data = intentFilter.data) === null || _intentFilter$data === void 0 ? void 0 : _intentFilter$data.map(data => {
108
+ const data = (_intentFilter$data$fi = intentFilter === null || intentFilter === void 0 ? void 0 : (_intentFilter$data = intentFilter.data) === null || _intentFilter$data === void 0 ? void 0 : (_intentFilter$data$fi2 = _intentFilter$data.filter(data => {
110
109
  var _data$$3;
111
110
 
112
111
  return data === null || data === void 0 ? void 0 : (_data$$3 = data.$) === null || _data$$3 === void 0 ? void 0 : _data$$3['android:scheme'];
113
- })) !== null && _intentFilter$data$ma !== void 0 ? _intentFilter$data$ma : [];
112
+ })) === null || _intentFilter$data$fi2 === void 0 ? void 0 : _intentFilter$data$fi2.map(data => {
113
+ var _data$$4, _data$$5;
114
+
115
+ return {
116
+ scheme: data === null || data === void 0 ? void 0 : (_data$$4 = data.$) === null || _data$$4 === void 0 ? void 0 : _data$$4['android:scheme'],
117
+ host: data === null || data === void 0 ? void 0 : (_data$$5 = data.$) === null || _data$$5 === void 0 ? void 0 : _data$$5['android:host']
118
+ };
119
+ })) !== null && _intentFilter$data$fi !== void 0 ? _intentFilter$data$fi : [];
114
120
  return {
115
- schemes,
116
121
  actions,
117
- categories
122
+ categories,
123
+ data
118
124
  };
119
125
  }
120
126
 
@@ -143,21 +149,26 @@ function getSingleTaskIntentFilters(androidManifest) {
143
149
  return outputSchemes;
144
150
  }
145
151
 
146
- function getSchemesFromManifest(androidManifest) {
152
+ function getSchemesFromManifest(androidManifest, requestedHost = null) {
147
153
  const outputSchemes = [];
148
154
  const singleTaskIntentFilters = getSingleTaskIntentFilters(androidManifest);
149
155
 
150
156
  for (const intentFilter of singleTaskIntentFilters) {
151
157
  const properties = propertiesFromIntentFilter(intentFilter);
152
158
 
153
- if (isValidRedirectIntentFilter(properties)) {
154
- outputSchemes.push(properties);
159
+ if (isValidRedirectIntentFilter(properties) && properties.data) {
160
+ for (const {
161
+ scheme,
162
+ host
163
+ } of properties.data) {
164
+ if (requestedHost === null || !host || host === requestedHost) {
165
+ outputSchemes.push(scheme);
166
+ }
167
+ }
155
168
  }
156
169
  }
157
170
 
158
- return outputSchemes.reduce((prev, {
159
- schemes
160
- }) => [...prev, ...schemes], []);
171
+ return outputSchemes;
161
172
  }
162
173
 
163
174
  function ensureManifestHasValidIntentFilter(androidManifest) {
@@ -259,11 +270,11 @@ function removeScheme(scheme, androidManifest) {
259
270
 
260
271
  if (isValidRedirectIntentFilter(properties)) {
261
272
  for (const dataKey in (intentFilter === null || intentFilter === void 0 ? void 0 : intentFilter.data) || []) {
262
- var _intentFilter$data2, _data$$4;
273
+ var _intentFilter$data2, _data$$6;
263
274
 
264
275
  const data = (_intentFilter$data2 = intentFilter.data) === null || _intentFilter$data2 === void 0 ? void 0 : _intentFilter$data2[dataKey];
265
276
 
266
- if ((data === null || data === void 0 ? void 0 : (_data$$4 = data.$) === null || _data$$4 === void 0 ? void 0 : _data$$4['android:scheme']) === scheme) {
277
+ if ((data === null || data === void 0 ? void 0 : (_data$$6 = data.$) === null || _data$$6 === void 0 ? void 0 : _data$$6['android:scheme']) === scheme) {
267
278
  var _intentFilter$data3;
268
279
 
269
280
  (_intentFilter$data3 = intentFilter.data) === null || _intentFilter$data3 === void 0 ? true : delete _intentFilter$data3[dataKey];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/android/Scheme.ts"],"names":["withScheme","setScheme","getScheme","config","Array","isArray","scheme","validate","value","filter","androidManifest","schemes","android","package","push","length","ensureManifestHasValidIntentFilter","currentSchemes","getSchemesFromManifest","uri","index","indexOf","splice","appendScheme","isValidRedirectIntentFilter","actions","categories","includes","propertiesFromIntentFilter","intentFilter","action","map","data","$","category","getSingleTaskIntentFilters","manifest","application","outputSchemes","activity","activities","singleTaskActivities","intentFilters","concat","singleTaskIntentFilters","properties","reduce","prev","hasScheme","removeScheme","dataKey"],"mappings":"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","sourcesContent":["import { ExpoConfig } from '@expo/config-types';\n\nimport { createAndroidManifestPlugin } from '../plugins/android-plugins';\nimport { addWarningAndroid } from '../utils/warnings';\nimport { AndroidManifest, ManifestActivity } from './Manifest';\n\nexport type IntentFilterProps = {\n actions: string[];\n categories: string[];\n schemes: string[];\n};\n\nexport const withScheme = createAndroidManifestPlugin(setScheme, 'withScheme');\n\nexport function getScheme(config: { scheme?: string | string[] }): string[] {\n if (Array.isArray(config.scheme)) {\n const validate = (value: any): value is string => typeof value === 'string';\n\n return config.scheme.filter<string>(validate);\n } else if (typeof config.scheme === 'string') {\n return [config.scheme];\n }\n return [];\n}\n\n// This plugin used to remove the unused schemes but this is unpredictable because other plugins could add schemes.\n// The only way to reliably remove schemes from the project is to nuke the file and regenerate the code (`expo prebuild --clean`).\n// Regardless, having extra schemes isn't a fatal issue and therefore a tolerable compromise is to just add new schemes that aren't currently present.\nexport function setScheme(\n config: Pick<ExpoConfig, 'scheme' | 'android'>,\n androidManifest: AndroidManifest\n) {\n const schemes = [\n ...getScheme(config),\n // @ts-ignore: TODO: android.scheme is an unreleased -- harder to add to turtle v1.\n ...getScheme(config.android ?? {}),\n ];\n // Add the package name to the list of schemes for easier Google auth and parity with Turtle v1.\n if (config.android?.package) {\n schemes.push(config.android.package);\n }\n if (schemes.length === 0) {\n return androidManifest;\n }\n\n if (!ensureManifestHasValidIntentFilter(androidManifest)) {\n addWarningAndroid(\n 'scheme',\n `Cannot add schemes because the provided manifest does not have a valid Activity with \\`android:launchMode=\"singleTask\"\\``,\n 'https://expo.fyi/setup-android-uri-scheme'\n );\n return androidManifest;\n }\n\n // Get the current schemes and remove them from the list of schemes to add.\n const currentSchemes = getSchemesFromManifest(androidManifest);\n for (const uri of currentSchemes) {\n const index = schemes.indexOf(uri);\n if (index > -1) schemes.splice(index, 1);\n }\n\n // Now add all of the remaining schemes.\n for (const uri of schemes) {\n androidManifest = appendScheme(uri, androidManifest);\n }\n\n return androidManifest;\n}\n\nfunction isValidRedirectIntentFilter({ actions, categories, schemes }: IntentFilterProps): boolean {\n return (\n actions.includes('android.intent.action.VIEW') &&\n !categories.includes('android.intent.category.LAUNCHER')\n );\n}\n\nfunction propertiesFromIntentFilter(intentFilter: any): IntentFilterProps {\n const actions = intentFilter?.action?.map((data: any) => data?.$?.['android:name']) ?? [];\n const categories = intentFilter?.category?.map((data: any) => data?.$?.['android:name']) ?? [];\n const schemes = intentFilter?.data?.map((data: any) => data?.$?.['android:scheme']) ?? [];\n return {\n schemes,\n actions,\n categories,\n };\n}\n\nfunction getSingleTaskIntentFilters(androidManifest: AndroidManifest): any[] {\n if (!Array.isArray(androidManifest.manifest.application)) return [];\n\n let outputSchemes: any[] = [];\n for (const application of androidManifest.manifest.application) {\n const { activity } = application;\n // @ts-ignore\n const activities = Array.isArray(activity) ? activity : [activity];\n const singleTaskActivities = (activities as ManifestActivity[]).filter(\n activity => activity?.$?.['android:launchMode'] === 'singleTask'\n );\n for (const activity of singleTaskActivities) {\n const intentFilters = activity['intent-filter'];\n outputSchemes = outputSchemes.concat(intentFilters);\n }\n }\n return outputSchemes;\n}\n\nexport function getSchemesFromManifest(androidManifest: AndroidManifest): string[] {\n const outputSchemes: IntentFilterProps[] = [];\n\n const singleTaskIntentFilters = getSingleTaskIntentFilters(androidManifest);\n for (const intentFilter of singleTaskIntentFilters) {\n const properties = propertiesFromIntentFilter(intentFilter);\n if (isValidRedirectIntentFilter(properties)) {\n outputSchemes.push(properties);\n }\n }\n\n return outputSchemes.reduce<string[]>((prev, { schemes }) => [...prev, ...schemes], []);\n}\n\nexport function ensureManifestHasValidIntentFilter(androidManifest: AndroidManifest): boolean {\n if (!Array.isArray(androidManifest.manifest.application)) {\n return false;\n }\n\n for (const application of androidManifest.manifest.application) {\n for (const activity of application.activity || []) {\n if (activity?.$?.['android:launchMode'] === 'singleTask') {\n for (const intentFilter of activity['intent-filter'] || []) {\n // Parse valid intent filters...\n const properties = propertiesFromIntentFilter(intentFilter);\n if (isValidRedirectIntentFilter(properties)) {\n return true;\n }\n }\n if (!activity['intent-filter']) {\n activity['intent-filter'] = [];\n }\n\n activity['intent-filter'].push({\n action: [{ $: { 'android:name': 'android.intent.action.VIEW' } }],\n category: [\n { $: { 'android:name': 'android.intent.category.DEFAULT' } },\n { $: { 'android:name': 'android.intent.category.BROWSABLE' } },\n ],\n });\n return true;\n }\n }\n }\n return false;\n}\n\nexport function hasScheme(scheme: string, androidManifest: AndroidManifest): boolean {\n const schemes = getSchemesFromManifest(androidManifest);\n return schemes.includes(scheme);\n}\n\nexport function appendScheme(scheme: string, androidManifest: AndroidManifest): AndroidManifest {\n if (!Array.isArray(androidManifest.manifest.application)) {\n return androidManifest;\n }\n\n for (const application of androidManifest.manifest.application) {\n for (const activity of application.activity || []) {\n if (activity?.$?.['android:launchMode'] === 'singleTask') {\n for (const intentFilter of activity['intent-filter'] || []) {\n const properties = propertiesFromIntentFilter(intentFilter);\n if (isValidRedirectIntentFilter(properties)) {\n if (!intentFilter.data) intentFilter.data = [];\n intentFilter.data.push({\n $: { 'android:scheme': scheme },\n });\n }\n }\n break;\n }\n }\n }\n return androidManifest;\n}\n\nexport function removeScheme(scheme: string, androidManifest: AndroidManifest): AndroidManifest {\n if (!Array.isArray(androidManifest.manifest.application)) {\n return androidManifest;\n }\n\n for (const application of androidManifest.manifest.application) {\n for (const activity of application.activity || []) {\n if (activity?.$?.['android:launchMode'] === 'singleTask') {\n for (const intentFilter of activity['intent-filter'] || []) {\n // Parse valid intent filters...\n const properties = propertiesFromIntentFilter(intentFilter);\n if (isValidRedirectIntentFilter(properties)) {\n for (const dataKey in intentFilter?.data || []) {\n const data = intentFilter.data?.[dataKey];\n if (data?.$?.['android:scheme'] === scheme) {\n delete intentFilter.data?.[dataKey];\n }\n }\n }\n }\n break;\n }\n }\n }\n\n return androidManifest;\n}\n"],"file":"Scheme.js"}
1
+ {"version":3,"sources":["../../src/android/Scheme.ts"],"names":["withScheme","setScheme","getScheme","config","Array","isArray","scheme","validate","value","filter","androidManifest","schemes","android","package","push","length","ensureManifestHasValidIntentFilter","currentSchemes","getSchemesFromManifest","uri","index","indexOf","splice","appendScheme","isValidRedirectIntentFilter","actions","categories","includes","propertiesFromIntentFilter","intentFilter","action","map","data","$","category","host","getSingleTaskIntentFilters","manifest","application","outputSchemes","activity","activities","singleTaskActivities","intentFilters","concat","requestedHost","singleTaskIntentFilters","properties","hasScheme","removeScheme","dataKey"],"mappings":"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","sourcesContent":["import { ExpoConfig } from '@expo/config-types';\n\nimport { createAndroidManifestPlugin } from '../plugins/android-plugins';\nimport { addWarningAndroid } from '../utils/warnings';\nimport { AndroidManifest, ManifestActivity } from './Manifest';\n\nexport type IntentFilterProps = {\n actions: string[];\n categories: string[];\n data: {\n scheme: string;\n host?: string;\n }[];\n};\n\nexport const withScheme = createAndroidManifestPlugin(setScheme, 'withScheme');\n\nexport function getScheme(config: { scheme?: string | string[] }): string[] {\n if (Array.isArray(config.scheme)) {\n const validate = (value: any): value is string => typeof value === 'string';\n\n return config.scheme.filter<string>(validate);\n } else if (typeof config.scheme === 'string') {\n return [config.scheme];\n }\n return [];\n}\n\n// This plugin used to remove the unused schemes but this is unpredictable because other plugins could add schemes.\n// The only way to reliably remove schemes from the project is to nuke the file and regenerate the code (`expo prebuild --clean`).\n// Regardless, having extra schemes isn't a fatal issue and therefore a tolerable compromise is to just add new schemes that aren't currently present.\nexport function setScheme(\n config: Pick<ExpoConfig, 'scheme' | 'android'>,\n androidManifest: AndroidManifest\n) {\n const schemes = [\n ...getScheme(config),\n // @ts-ignore: TODO: android.scheme is an unreleased -- harder to add to turtle v1.\n ...getScheme(config.android ?? {}),\n ];\n // Add the package name to the list of schemes for easier Google auth and parity with Turtle v1.\n if (config.android?.package) {\n schemes.push(config.android.package);\n }\n if (schemes.length === 0) {\n return androidManifest;\n }\n\n if (!ensureManifestHasValidIntentFilter(androidManifest)) {\n addWarningAndroid(\n 'scheme',\n `Cannot add schemes because the provided manifest does not have a valid Activity with \\`android:launchMode=\"singleTask\"\\``,\n 'https://expo.fyi/setup-android-uri-scheme'\n );\n return androidManifest;\n }\n\n // Get the current schemes and remove them from the list of schemes to add.\n const currentSchemes = getSchemesFromManifest(androidManifest);\n for (const uri of currentSchemes) {\n const index = schemes.indexOf(uri);\n if (index > -1) schemes.splice(index, 1);\n }\n\n // Now add all of the remaining schemes.\n for (const uri of schemes) {\n androidManifest = appendScheme(uri, androidManifest);\n }\n\n return androidManifest;\n}\n\nfunction isValidRedirectIntentFilter({ actions, categories }: IntentFilterProps): boolean {\n return (\n actions.includes('android.intent.action.VIEW') &&\n !categories.includes('android.intent.category.LAUNCHER')\n );\n}\n\nfunction propertiesFromIntentFilter(intentFilter: any): IntentFilterProps {\n const actions = intentFilter?.action?.map((data: any) => data?.$?.['android:name']) ?? [];\n const categories = intentFilter?.category?.map((data: any) => data?.$?.['android:name']) ?? [];\n const data =\n intentFilter?.data\n ?.filter((data: any) => data?.$?.['android:scheme'])\n ?.map((data: any) => ({\n scheme: data?.$?.['android:scheme'],\n host: data?.$?.['android:host'],\n })) ?? [];\n return {\n actions,\n categories,\n data,\n };\n}\n\nfunction getSingleTaskIntentFilters(androidManifest: AndroidManifest): any[] {\n if (!Array.isArray(androidManifest.manifest.application)) return [];\n\n let outputSchemes: any[] = [];\n for (const application of androidManifest.manifest.application) {\n const { activity } = application;\n // @ts-ignore\n const activities = Array.isArray(activity) ? activity : [activity];\n const singleTaskActivities = (activities as ManifestActivity[]).filter(\n activity => activity?.$?.['android:launchMode'] === 'singleTask'\n );\n for (const activity of singleTaskActivities) {\n const intentFilters = activity['intent-filter'];\n outputSchemes = outputSchemes.concat(intentFilters);\n }\n }\n return outputSchemes;\n}\n\nexport function getSchemesFromManifest(\n androidManifest: AndroidManifest,\n requestedHost: string | null = null\n): string[] {\n const outputSchemes: string[] = [];\n\n const singleTaskIntentFilters = getSingleTaskIntentFilters(androidManifest);\n for (const intentFilter of singleTaskIntentFilters) {\n const properties = propertiesFromIntentFilter(intentFilter);\n if (isValidRedirectIntentFilter(properties) && properties.data) {\n for (const { scheme, host } of properties.data) {\n if (requestedHost === null || !host || host === requestedHost) {\n outputSchemes.push(scheme);\n }\n }\n }\n }\n\n return outputSchemes;\n}\n\nexport function ensureManifestHasValidIntentFilter(androidManifest: AndroidManifest): boolean {\n if (!Array.isArray(androidManifest.manifest.application)) {\n return false;\n }\n\n for (const application of androidManifest.manifest.application) {\n for (const activity of application.activity || []) {\n if (activity?.$?.['android:launchMode'] === 'singleTask') {\n for (const intentFilter of activity['intent-filter'] || []) {\n // Parse valid intent filters...\n const properties = propertiesFromIntentFilter(intentFilter);\n if (isValidRedirectIntentFilter(properties)) {\n return true;\n }\n }\n if (!activity['intent-filter']) {\n activity['intent-filter'] = [];\n }\n\n activity['intent-filter'].push({\n action: [{ $: { 'android:name': 'android.intent.action.VIEW' } }],\n category: [\n { $: { 'android:name': 'android.intent.category.DEFAULT' } },\n { $: { 'android:name': 'android.intent.category.BROWSABLE' } },\n ],\n });\n return true;\n }\n }\n }\n return false;\n}\n\nexport function hasScheme(scheme: string, androidManifest: AndroidManifest): boolean {\n const schemes = getSchemesFromManifest(androidManifest);\n return schemes.includes(scheme);\n}\n\nexport function appendScheme(scheme: string, androidManifest: AndroidManifest): AndroidManifest {\n if (!Array.isArray(androidManifest.manifest.application)) {\n return androidManifest;\n }\n\n for (const application of androidManifest.manifest.application) {\n for (const activity of application.activity || []) {\n if (activity?.$?.['android:launchMode'] === 'singleTask') {\n for (const intentFilter of activity['intent-filter'] || []) {\n const properties = propertiesFromIntentFilter(intentFilter);\n if (isValidRedirectIntentFilter(properties)) {\n if (!intentFilter.data) intentFilter.data = [];\n intentFilter.data.push({\n $: { 'android:scheme': scheme },\n });\n }\n }\n break;\n }\n }\n }\n return androidManifest;\n}\n\nexport function removeScheme(scheme: string, androidManifest: AndroidManifest): AndroidManifest {\n if (!Array.isArray(androidManifest.manifest.application)) {\n return androidManifest;\n }\n\n for (const application of androidManifest.manifest.application) {\n for (const activity of application.activity || []) {\n if (activity?.$?.['android:launchMode'] === 'singleTask') {\n for (const intentFilter of activity['intent-filter'] || []) {\n // Parse valid intent filters...\n const properties = propertiesFromIntentFilter(intentFilter);\n if (isValidRedirectIntentFilter(properties)) {\n for (const dataKey in intentFilter?.data || []) {\n const data = intentFilter.data?.[dataKey];\n if (data?.$?.['android:scheme'] === scheme) {\n delete intentFilter.data?.[dataKey];\n }\n }\n }\n }\n break;\n }\n }\n }\n\n return androidManifest;\n}\n"],"file":"Scheme.js"}
@@ -9,20 +9,18 @@ export declare enum Config {
9
9
  RUNTIME_VERSION = "expo.modules.updates.EXPO_RUNTIME_VERSION",
10
10
  UPDATE_URL = "expo.modules.updates.EXPO_UPDATE_URL",
11
11
  RELEASE_CHANNEL = "expo.modules.updates.EXPO_RELEASE_CHANNEL",
12
- UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY = "expo.modules.updates.UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY"
12
+ UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY = "expo.modules.updates.UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY",
13
+ CODE_SIGNING_CERTIFICATE = "expo.modules.updates.CODE_SIGNING_CERTIFICATE",
14
+ CODE_SIGNING_METADATA = "expo.modules.updates.CODE_SIGNING_METADATA"
13
15
  }
14
16
  export declare const withUpdates: ConfigPlugin<{
15
17
  expoUsername: string | null;
16
18
  }>;
17
- export declare function getSDKVersion(config: Pick<ExpoConfigUpdates, 'sdkVersion'>): string | null;
18
- export declare function getUpdatesEnabled(config: Pick<ExpoConfigUpdates, 'updates'>): boolean;
19
- export declare function getUpdatesTimeout(config: Pick<ExpoConfigUpdates, 'updates'>): number;
20
- export declare function getUpdatesCheckOnLaunch(config: Pick<ExpoConfigUpdates, 'updates'>, expoUpdatesPackageVersion?: string | null): 'NEVER' | 'ERROR_RECOVERY_ONLY' | 'ALWAYS';
21
- export declare function setUpdatesConfig(config: ExpoConfigUpdates, androidManifest: AndroidManifest, username: string | null, expoUpdatesPackageVersion?: string | null): AndroidManifest;
19
+ export declare function setUpdatesConfig(projectRoot: string, config: ExpoConfigUpdates, androidManifest: AndroidManifest, username: string | null, expoUpdatesPackageVersion?: string | null): AndroidManifest;
22
20
  export declare function setVersionsConfig(config: Pick<ExpoConfigUpdates, 'sdkVersion' | 'runtimeVersion'>, androidManifest: AndroidManifest): AndroidManifest;
23
21
  export declare function ensureBuildGradleContainsConfigurationScript(projectRoot: string, buildGradleContents: string): string;
24
22
  export declare function formatApplyLineForBuildGradle(projectRoot: string): string;
25
23
  export declare function isBuildGradleConfigured(projectRoot: string, buildGradleContents: string): boolean;
26
24
  export declare function isMainApplicationMetaDataSet(androidManifest: AndroidManifest): boolean;
27
- export declare function isMainApplicationMetaDataSynced(config: ExpoConfigUpdates, androidManifest: AndroidManifest, username: string | null): boolean;
25
+ export declare function isMainApplicationMetaDataSynced(projectRoot: string, config: ExpoConfigUpdates, androidManifest: AndroidManifest, username: string | null): boolean;
28
26
  export declare function areVersionsSynced(config: Pick<ExpoConfigUpdates, 'runtimeVersion' | 'sdkVersion'>, androidManifest: AndroidManifest): boolean;
@@ -7,10 +7,6 @@ exports.Config = void 0;
7
7
  exports.areVersionsSynced = areVersionsSynced;
8
8
  exports.ensureBuildGradleContainsConfigurationScript = ensureBuildGradleContainsConfigurationScript;
9
9
  exports.formatApplyLineForBuildGradle = formatApplyLineForBuildGradle;
10
- exports.getSDKVersion = getSDKVersion;
11
- exports.getUpdatesCheckOnLaunch = getUpdatesCheckOnLaunch;
12
- exports.getUpdatesEnabled = getUpdatesEnabled;
13
- exports.getUpdatesTimeout = getUpdatesTimeout;
14
10
  exports.isBuildGradleConfigured = isBuildGradleConfigured;
15
11
  exports.isMainApplicationMetaDataSet = isMainApplicationMetaDataSet;
16
12
  exports.isMainApplicationMetaDataSynced = isMainApplicationMetaDataSynced;
@@ -38,16 +34,6 @@ function _resolveFrom() {
38
34
  return data;
39
35
  }
40
36
 
41
- function _semver() {
42
- const data = _interopRequireDefault(require("semver"));
43
-
44
- _semver = function () {
45
- return data;
46
- };
47
-
48
- return data;
49
- }
50
-
51
37
  function _androidPlugins() {
52
38
  const data = require("../plugins/android-plugins");
53
39
 
@@ -93,58 +79,28 @@ exports.Config = Config;
93
79
  Config["UPDATE_URL"] = "expo.modules.updates.EXPO_UPDATE_URL";
94
80
  Config["RELEASE_CHANNEL"] = "expo.modules.updates.EXPO_RELEASE_CHANNEL";
95
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";
96
84
  })(Config || (exports.Config = Config = {}));
97
85
 
98
86
  const withUpdates = (config, {
99
87
  expoUsername
100
88
  }) => {
101
89
  return (0, _androidPlugins().withAndroidManifest)(config, config => {
102
- const expoUpdatesPackageVersion = (0, _Updates().getExpoUpdatesPackageVersion)(config.modRequest.projectRoot);
103
- config.modResults = setUpdatesConfig(config, config.modResults, expoUsername, expoUpdatesPackageVersion);
90
+ const projectRoot = config.modRequest.projectRoot;
91
+ const expoUpdatesPackageVersion = (0, _Updates().getExpoUpdatesPackageVersion)(projectRoot);
92
+ config.modResults = setUpdatesConfig(projectRoot, config, config.modResults, expoUsername, expoUpdatesPackageVersion);
104
93
  return config;
105
94
  });
106
95
  };
107
96
 
108
97
  exports.withUpdates = withUpdates;
109
98
 
110
- function getSDKVersion(config) {
111
- return typeof config.sdkVersion === 'string' ? config.sdkVersion : null;
112
- }
113
-
114
- function getUpdatesEnabled(config) {
115
- var _config$updates;
116
-
117
- return ((_config$updates = config.updates) === null || _config$updates === void 0 ? void 0 : _config$updates.enabled) !== false;
118
- }
119
-
120
- function getUpdatesTimeout(config) {
121
- var _config$updates$fallb, _config$updates2;
122
-
123
- return (_config$updates$fallb = (_config$updates2 = config.updates) === null || _config$updates2 === void 0 ? void 0 : _config$updates2.fallbackToCacheTimeout) !== null && _config$updates$fallb !== void 0 ? _config$updates$fallb : 0;
124
- }
125
-
126
- function getUpdatesCheckOnLaunch(config, expoUpdatesPackageVersion) {
127
- var _config$updates3, _config$updates4;
128
-
129
- if (((_config$updates3 = config.updates) === null || _config$updates3 === void 0 ? void 0 : _config$updates3.checkAutomatically) === 'ON_ERROR_RECOVERY') {
130
- // native 'ERROR_RECOVERY_ONLY' option was only introduced in 0.11.x
131
- if (expoUpdatesPackageVersion && _semver().default.gte(expoUpdatesPackageVersion, '0.11.0')) {
132
- return 'ERROR_RECOVERY_ONLY';
133
- }
134
-
135
- return 'NEVER';
136
- } else if (((_config$updates4 = config.updates) === null || _config$updates4 === void 0 ? void 0 : _config$updates4.checkAutomatically) === 'ON_LOAD') {
137
- return 'ALWAYS';
138
- }
139
-
140
- return 'ALWAYS';
141
- }
142
-
143
- function setUpdatesConfig(config, androidManifest, username, expoUpdatesPackageVersion) {
99
+ function setUpdatesConfig(projectRoot, config, androidManifest, username, expoUpdatesPackageVersion) {
144
100
  const mainApplication = (0, _Manifest().getMainApplicationOrThrow)(androidManifest);
145
- (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.ENABLED, String(getUpdatesEnabled(config)));
146
- (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.CHECK_ON_LAUNCH, getUpdatesCheckOnLaunch(config, expoUpdatesPackageVersion));
147
- (0, _Manifest().addMetaDataItemToMainApplication)(mainApplication, Config.LAUNCH_WAIT_MS, String(getUpdatesTimeout(config)));
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)));
148
104
  const updateUrl = (0, _Updates().getUpdateUrl)(config, username);
149
105
 
150
106
  if (updateUrl) {
@@ -153,6 +109,22 @@ function setUpdatesConfig(config, androidManifest, username, expoUpdatesPackageV
153
109
  (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.UPDATE_URL);
154
110
  }
155
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
+
156
128
  return setVersionsConfig(config, androidManifest);
157
129
  }
158
130
 
@@ -164,7 +136,7 @@ function setVersionsConfig(config, androidManifest) {
164
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.');
165
137
  }
166
138
 
167
- const sdkVersion = getSDKVersion(config);
139
+ const sdkVersion = (0, _Updates().getSDKVersion)(config);
168
140
 
169
141
  if (runtimeVersion) {
170
142
  (0, _Manifest().removeMetaDataItemFromMainApplication)(mainApplication, Config.SDK_VERSION);
@@ -228,13 +200,13 @@ function isMainApplicationMetaDataSet(androidManifest) {
228
200
  return Boolean(updateUrl && (sdkVersion || runtimeVersion));
229
201
  }
230
202
 
231
- function isMainApplicationMetaDataSynced(config, androidManifest, username) {
232
- return (0, _Updates().getUpdateUrl)(config, username) === (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.UPDATE_URL) && String(getUpdatesEnabled(config)) === (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.ENABLED) && String(getUpdatesTimeout(config)) === (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.LAUNCH_WAIT_MS) && getUpdatesCheckOnLaunch(config) === (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.CHECK_ON_LAUNCH) && areVersionsSynced(config, androidManifest);
203
+ function 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);
233
205
  }
234
206
 
235
207
  function areVersionsSynced(config, androidManifest) {
236
208
  const expectedRuntimeVersion = (0, _Updates().getRuntimeVersionNullable)(config, 'android');
237
- const expectedSdkVersion = getSDKVersion(config);
209
+ const expectedSdkVersion = (0, _Updates().getSDKVersion)(config);
238
210
  const currentRuntimeVersion = (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.RUNTIME_VERSION);
239
211
  const currentSdkVersion = (0, _Manifest().getMainApplicationMetaDataValue)(androidManifest, Config.SDK_VERSION);
240
212
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/android/Updates.ts"],"names":["CREATE_MANIFEST_ANDROID_PATH","Config","withUpdates","config","expoUsername","expoUpdatesPackageVersion","modRequest","projectRoot","modResults","setUpdatesConfig","getSDKVersion","sdkVersion","getUpdatesEnabled","updates","enabled","getUpdatesTimeout","fallbackToCacheTimeout","getUpdatesCheckOnLaunch","checkAutomatically","semver","gte","androidManifest","username","mainApplication","ENABLED","String","CHECK_ON_LAUNCH","LAUNCH_WAIT_MS","updateUrl","UPDATE_URL","setVersionsConfig","runtimeVersion","RUNTIME_VERSION","Error","SDK_VERSION","ensureBuildGradleContainsConfigurationScript","buildGradleContents","isBuildGradleConfigured","cleanedUpBuildGradleContents","isBuildGradleMisconfigured","split","some","line","includes","replace","RegExp","gradleScriptApply","formatApplyLineForBuildGradle","updatesGradleScriptPath","resolveFrom","silent","relativePath","path","relative","join","posixPath","process","platform","androidBuildScript","isMainApplicationMetaDataSet","Boolean","isMainApplicationMetaDataSynced","areVersionsSynced","expectedRuntimeVersion","expectedSdkVersion","currentRuntimeVersion","currentSdkVersion"],"mappings":"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","sourcesContent":["import path from 'path';\nimport resolveFrom from 'resolve-from';\nimport semver from 'semver';\n\nimport { ConfigPlugin } from '../Plugin.types';\nimport { withAndroidManifest } from '../plugins/android-plugins';\nimport {\n ExpoConfigUpdates,\n getExpoUpdatesPackageVersion,\n getRuntimeVersionNullable,\n getUpdateUrl,\n} from '../utils/Updates';\nimport {\n addMetaDataItemToMainApplication,\n AndroidManifest,\n findMetaDataItem,\n getMainApplicationMetaDataValue,\n getMainApplicationOrThrow,\n removeMetaDataItemFromMainApplication,\n} from './Manifest';\n\nconst CREATE_MANIFEST_ANDROID_PATH = 'expo-updates/scripts/create-manifest-android.gradle';\n\nexport enum Config {\n ENABLED = 'expo.modules.updates.ENABLED',\n CHECK_ON_LAUNCH = 'expo.modules.updates.EXPO_UPDATES_CHECK_ON_LAUNCH',\n LAUNCH_WAIT_MS = 'expo.modules.updates.EXPO_UPDATES_LAUNCH_WAIT_MS',\n SDK_VERSION = 'expo.modules.updates.EXPO_SDK_VERSION',\n RUNTIME_VERSION = 'expo.modules.updates.EXPO_RUNTIME_VERSION',\n UPDATE_URL = 'expo.modules.updates.EXPO_UPDATE_URL',\n RELEASE_CHANNEL = 'expo.modules.updates.EXPO_RELEASE_CHANNEL',\n UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY = 'expo.modules.updates.UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY',\n}\n\nexport const withUpdates: ConfigPlugin<{ expoUsername: string | null }> = (\n config,\n { expoUsername }\n) => {\n return withAndroidManifest(config, config => {\n const expoUpdatesPackageVersion = getExpoUpdatesPackageVersion(config.modRequest.projectRoot);\n config.modResults = setUpdatesConfig(\n config,\n config.modResults,\n expoUsername,\n expoUpdatesPackageVersion\n );\n return config;\n });\n};\n\nexport function getSDKVersion(config: Pick<ExpoConfigUpdates, 'sdkVersion'>): string | null {\n return typeof config.sdkVersion === 'string' ? config.sdkVersion : null;\n}\n\nexport function getUpdatesEnabled(config: Pick<ExpoConfigUpdates, 'updates'>): boolean {\n return config.updates?.enabled !== false;\n}\n\nexport function getUpdatesTimeout(config: Pick<ExpoConfigUpdates, 'updates'>): number {\n return config.updates?.fallbackToCacheTimeout ?? 0;\n}\n\nexport function getUpdatesCheckOnLaunch(\n config: Pick<ExpoConfigUpdates, 'updates'>,\n expoUpdatesPackageVersion?: string | null\n): 'NEVER' | 'ERROR_RECOVERY_ONLY' | 'ALWAYS' {\n if (config.updates?.checkAutomatically === 'ON_ERROR_RECOVERY') {\n // native 'ERROR_RECOVERY_ONLY' option was only introduced in 0.11.x\n if (expoUpdatesPackageVersion && semver.gte(expoUpdatesPackageVersion, '0.11.0')) {\n return 'ERROR_RECOVERY_ONLY';\n }\n return 'NEVER';\n } else if (config.updates?.checkAutomatically === 'ON_LOAD') {\n return 'ALWAYS';\n }\n return 'ALWAYS';\n}\n\nexport function setUpdatesConfig(\n config: ExpoConfigUpdates,\n androidManifest: AndroidManifest,\n username: string | null,\n expoUpdatesPackageVersion?: string | null\n): AndroidManifest {\n const mainApplication = getMainApplicationOrThrow(androidManifest);\n\n addMetaDataItemToMainApplication(\n mainApplication,\n Config.ENABLED,\n String(getUpdatesEnabled(config))\n );\n addMetaDataItemToMainApplication(\n mainApplication,\n Config.CHECK_ON_LAUNCH,\n getUpdatesCheckOnLaunch(config, expoUpdatesPackageVersion)\n );\n addMetaDataItemToMainApplication(\n mainApplication,\n Config.LAUNCH_WAIT_MS,\n String(getUpdatesTimeout(config))\n );\n\n const updateUrl = getUpdateUrl(config, username);\n if (updateUrl) {\n addMetaDataItemToMainApplication(mainApplication, Config.UPDATE_URL, updateUrl);\n } else {\n removeMetaDataItemFromMainApplication(mainApplication, Config.UPDATE_URL);\n }\n\n return setVersionsConfig(config, androidManifest);\n}\n\nexport function setVersionsConfig(\n config: Pick<ExpoConfigUpdates, 'sdkVersion' | 'runtimeVersion'>,\n androidManifest: AndroidManifest\n): AndroidManifest {\n const mainApplication = getMainApplicationOrThrow(androidManifest);\n\n const runtimeVersion = getRuntimeVersionNullable(config, 'android');\n if (!runtimeVersion && findMetaDataItem(mainApplication, Config.RUNTIME_VERSION) > -1) {\n throw new Error(\n '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.'\n );\n }\n const sdkVersion = getSDKVersion(config);\n if (runtimeVersion) {\n removeMetaDataItemFromMainApplication(mainApplication, Config.SDK_VERSION);\n addMetaDataItemToMainApplication(mainApplication, Config.RUNTIME_VERSION, runtimeVersion);\n } else if (sdkVersion) {\n /**\n * runtime version maybe null in projects using classic updates. In that\n * case we use SDK version\n */\n removeMetaDataItemFromMainApplication(mainApplication, Config.RUNTIME_VERSION);\n addMetaDataItemToMainApplication(mainApplication, Config.SDK_VERSION, sdkVersion);\n } else {\n removeMetaDataItemFromMainApplication(mainApplication, Config.RUNTIME_VERSION);\n removeMetaDataItemFromMainApplication(mainApplication, Config.SDK_VERSION);\n }\n\n return androidManifest;\n}\nexport function ensureBuildGradleContainsConfigurationScript(\n projectRoot: string,\n buildGradleContents: string\n): string {\n if (!isBuildGradleConfigured(projectRoot, buildGradleContents)) {\n let cleanedUpBuildGradleContents;\n\n const isBuildGradleMisconfigured = buildGradleContents\n .split('\\n')\n .some(line => line.includes(CREATE_MANIFEST_ANDROID_PATH));\n if (isBuildGradleMisconfigured) {\n cleanedUpBuildGradleContents = buildGradleContents.replace(\n new RegExp(`(\\n// Integration with Expo updates)?\\n.*${CREATE_MANIFEST_ANDROID_PATH}.*\\n`),\n ''\n );\n } else {\n cleanedUpBuildGradleContents = buildGradleContents;\n }\n\n const gradleScriptApply = formatApplyLineForBuildGradle(projectRoot);\n return `${cleanedUpBuildGradleContents}\\n// Integration with Expo updates\\n${gradleScriptApply}\\n`;\n } else {\n return buildGradleContents;\n }\n}\n\nexport function formatApplyLineForBuildGradle(projectRoot: string): string {\n const updatesGradleScriptPath = resolveFrom.silent(projectRoot, CREATE_MANIFEST_ANDROID_PATH);\n\n if (!updatesGradleScriptPath) {\n throw new Error(\n \"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.\"\n );\n }\n\n const relativePath = path.relative(\n path.join(projectRoot, 'android', 'app'),\n updatesGradleScriptPath\n );\n const posixPath = process.platform === 'win32' ? relativePath.replace(/\\\\/g, '/') : relativePath;\n\n return `apply from: \"${posixPath}\"`;\n}\n\nexport function isBuildGradleConfigured(projectRoot: string, buildGradleContents: string): boolean {\n const androidBuildScript = formatApplyLineForBuildGradle(projectRoot);\n\n return (\n buildGradleContents\n .replace(/\\r\\n/g, '\\n')\n .split('\\n')\n // Check for both single and double quotes\n .some(line => line === androidBuildScript || line === androidBuildScript.replace(/\"/g, \"'\"))\n );\n}\n\nexport function isMainApplicationMetaDataSet(androidManifest: AndroidManifest): boolean {\n const updateUrl = getMainApplicationMetaDataValue(androidManifest, Config.UPDATE_URL);\n const runtimeVersion = getMainApplicationMetaDataValue(androidManifest, Config.RUNTIME_VERSION);\n const sdkVersion = getMainApplicationMetaDataValue(androidManifest, Config.SDK_VERSION);\n\n return Boolean(updateUrl && (sdkVersion || runtimeVersion));\n}\n\nexport function isMainApplicationMetaDataSynced(\n config: ExpoConfigUpdates,\n androidManifest: AndroidManifest,\n username: string | null\n): boolean {\n return (\n getUpdateUrl(config, username) ===\n getMainApplicationMetaDataValue(androidManifest, Config.UPDATE_URL) &&\n String(getUpdatesEnabled(config)) ===\n getMainApplicationMetaDataValue(androidManifest, Config.ENABLED) &&\n String(getUpdatesTimeout(config)) ===\n getMainApplicationMetaDataValue(androidManifest, Config.LAUNCH_WAIT_MS) &&\n getUpdatesCheckOnLaunch(config) ===\n getMainApplicationMetaDataValue(androidManifest, Config.CHECK_ON_LAUNCH) &&\n areVersionsSynced(config, androidManifest)\n );\n}\n\nexport function areVersionsSynced(\n config: Pick<ExpoConfigUpdates, 'runtimeVersion' | 'sdkVersion'>,\n androidManifest: AndroidManifest\n): boolean {\n const expectedRuntimeVersion = getRuntimeVersionNullable(config, 'android');\n const expectedSdkVersion = getSDKVersion(config);\n\n const currentRuntimeVersion = getMainApplicationMetaDataValue(\n androidManifest,\n Config.RUNTIME_VERSION\n );\n const currentSdkVersion = getMainApplicationMetaDataValue(androidManifest, Config.SDK_VERSION);\n\n if (expectedRuntimeVersion !== null) {\n return currentRuntimeVersion === expectedRuntimeVersion && currentSdkVersion === null;\n } else if (expectedSdkVersion !== null) {\n return currentSdkVersion === expectedSdkVersion && currentRuntimeVersion === null;\n } else {\n return true;\n }\n}\n"],"file":"Updates.js"}
1
+ {"version":3,"sources":["../../src/android/Updates.ts"],"names":["CREATE_MANIFEST_ANDROID_PATH","Config","withUpdates","config","expoUsername","projectRoot","modRequest","expoUpdatesPackageVersion","modResults","setUpdatesConfig","androidManifest","username","mainApplication","ENABLED","String","CHECK_ON_LAUNCH","LAUNCH_WAIT_MS","updateUrl","UPDATE_URL","codeSigningCertificate","CODE_SIGNING_CERTIFICATE","codeSigningMetadata","CODE_SIGNING_METADATA","setVersionsConfig","runtimeVersion","RUNTIME_VERSION","Error","sdkVersion","SDK_VERSION","ensureBuildGradleContainsConfigurationScript","buildGradleContents","isBuildGradleConfigured","cleanedUpBuildGradleContents","isBuildGradleMisconfigured","split","some","line","includes","replace","RegExp","gradleScriptApply","formatApplyLineForBuildGradle","updatesGradleScriptPath","resolveFrom","silent","relativePath","path","relative","join","posixPath","process","platform","androidBuildScript","isMainApplicationMetaDataSet","Boolean","isMainApplicationMetaDataSynced","areVersionsSynced","expectedRuntimeVersion","expectedSdkVersion","currentRuntimeVersion","currentSdkVersion"],"mappings":"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","sourcesContent":["import path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { ConfigPlugin } from '../Plugin.types';\nimport { withAndroidManifest } from '../plugins/android-plugins';\nimport {\n ExpoConfigUpdates,\n getExpoUpdatesPackageVersion,\n getRuntimeVersionNullable,\n getSDKVersion,\n getUpdatesCheckOnLaunch,\n getUpdatesCodeSigningCertificate,\n getUpdatesCodeSigningMetadataStringified,\n getUpdatesEnabled,\n getUpdatesTimeout,\n getUpdateUrl,\n} from '../utils/Updates';\nimport {\n addMetaDataItemToMainApplication,\n AndroidManifest,\n findMetaDataItem,\n getMainApplicationMetaDataValue,\n getMainApplicationOrThrow,\n removeMetaDataItemFromMainApplication,\n} from './Manifest';\n\nconst CREATE_MANIFEST_ANDROID_PATH = 'expo-updates/scripts/create-manifest-android.gradle';\n\nexport enum Config {\n ENABLED = 'expo.modules.updates.ENABLED',\n CHECK_ON_LAUNCH = 'expo.modules.updates.EXPO_UPDATES_CHECK_ON_LAUNCH',\n LAUNCH_WAIT_MS = 'expo.modules.updates.EXPO_UPDATES_LAUNCH_WAIT_MS',\n SDK_VERSION = 'expo.modules.updates.EXPO_SDK_VERSION',\n RUNTIME_VERSION = 'expo.modules.updates.EXPO_RUNTIME_VERSION',\n UPDATE_URL = 'expo.modules.updates.EXPO_UPDATE_URL',\n RELEASE_CHANNEL = 'expo.modules.updates.EXPO_RELEASE_CHANNEL',\n UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY = 'expo.modules.updates.UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY',\n CODE_SIGNING_CERTIFICATE = 'expo.modules.updates.CODE_SIGNING_CERTIFICATE',\n CODE_SIGNING_METADATA = 'expo.modules.updates.CODE_SIGNING_METADATA',\n}\n\nexport const withUpdates: ConfigPlugin<{ expoUsername: string | null }> = (\n config,\n { expoUsername }\n) => {\n return withAndroidManifest(config, config => {\n const projectRoot = config.modRequest.projectRoot;\n const expoUpdatesPackageVersion = getExpoUpdatesPackageVersion(projectRoot);\n config.modResults = setUpdatesConfig(\n projectRoot,\n config,\n config.modResults,\n expoUsername,\n expoUpdatesPackageVersion\n );\n return config;\n });\n};\n\nexport function setUpdatesConfig(\n projectRoot: string,\n config: ExpoConfigUpdates,\n androidManifest: AndroidManifest,\n username: string | null,\n expoUpdatesPackageVersion?: string | null\n): AndroidManifest {\n const mainApplication = getMainApplicationOrThrow(androidManifest);\n\n addMetaDataItemToMainApplication(\n mainApplication,\n Config.ENABLED,\n String(getUpdatesEnabled(config))\n );\n addMetaDataItemToMainApplication(\n mainApplication,\n Config.CHECK_ON_LAUNCH,\n getUpdatesCheckOnLaunch(config, expoUpdatesPackageVersion)\n );\n addMetaDataItemToMainApplication(\n mainApplication,\n Config.LAUNCH_WAIT_MS,\n String(getUpdatesTimeout(config))\n );\n\n const updateUrl = getUpdateUrl(config, username);\n if (updateUrl) {\n addMetaDataItemToMainApplication(mainApplication, Config.UPDATE_URL, updateUrl);\n } else {\n removeMetaDataItemFromMainApplication(mainApplication, Config.UPDATE_URL);\n }\n\n const codeSigningCertificate = getUpdatesCodeSigningCertificate(projectRoot, config);\n if (codeSigningCertificate) {\n addMetaDataItemToMainApplication(\n mainApplication,\n Config.CODE_SIGNING_CERTIFICATE,\n codeSigningCertificate\n );\n } else {\n removeMetaDataItemFromMainApplication(mainApplication, Config.CODE_SIGNING_CERTIFICATE);\n }\n\n const codeSigningMetadata = getUpdatesCodeSigningMetadataStringified(config);\n if (codeSigningMetadata) {\n addMetaDataItemToMainApplication(\n mainApplication,\n Config.CODE_SIGNING_METADATA,\n codeSigningMetadata\n );\n } else {\n removeMetaDataItemFromMainApplication(mainApplication, Config.CODE_SIGNING_METADATA);\n }\n\n return setVersionsConfig(config, androidManifest);\n}\n\nexport function setVersionsConfig(\n config: Pick<ExpoConfigUpdates, 'sdkVersion' | 'runtimeVersion'>,\n androidManifest: AndroidManifest\n): AndroidManifest {\n const mainApplication = getMainApplicationOrThrow(androidManifest);\n\n const runtimeVersion = getRuntimeVersionNullable(config, 'android');\n if (!runtimeVersion && findMetaDataItem(mainApplication, Config.RUNTIME_VERSION) > -1) {\n throw new Error(\n '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.'\n );\n }\n const sdkVersion = getSDKVersion(config);\n if (runtimeVersion) {\n removeMetaDataItemFromMainApplication(mainApplication, Config.SDK_VERSION);\n addMetaDataItemToMainApplication(mainApplication, Config.RUNTIME_VERSION, runtimeVersion);\n } else if (sdkVersion) {\n /**\n * runtime version maybe null in projects using classic updates. In that\n * case we use SDK version\n */\n removeMetaDataItemFromMainApplication(mainApplication, Config.RUNTIME_VERSION);\n addMetaDataItemToMainApplication(mainApplication, Config.SDK_VERSION, sdkVersion);\n } else {\n removeMetaDataItemFromMainApplication(mainApplication, Config.RUNTIME_VERSION);\n removeMetaDataItemFromMainApplication(mainApplication, Config.SDK_VERSION);\n }\n\n return androidManifest;\n}\nexport function ensureBuildGradleContainsConfigurationScript(\n projectRoot: string,\n buildGradleContents: string\n): string {\n if (!isBuildGradleConfigured(projectRoot, buildGradleContents)) {\n let cleanedUpBuildGradleContents;\n\n const isBuildGradleMisconfigured = buildGradleContents\n .split('\\n')\n .some(line => line.includes(CREATE_MANIFEST_ANDROID_PATH));\n if (isBuildGradleMisconfigured) {\n cleanedUpBuildGradleContents = buildGradleContents.replace(\n new RegExp(`(\\n// Integration with Expo updates)?\\n.*${CREATE_MANIFEST_ANDROID_PATH}.*\\n`),\n ''\n );\n } else {\n cleanedUpBuildGradleContents = buildGradleContents;\n }\n\n const gradleScriptApply = formatApplyLineForBuildGradle(projectRoot);\n return `${cleanedUpBuildGradleContents}\\n// Integration with Expo updates\\n${gradleScriptApply}\\n`;\n } else {\n return buildGradleContents;\n }\n}\n\nexport function formatApplyLineForBuildGradle(projectRoot: string): string {\n const updatesGradleScriptPath = resolveFrom.silent(projectRoot, CREATE_MANIFEST_ANDROID_PATH);\n\n if (!updatesGradleScriptPath) {\n throw new Error(\n \"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.\"\n );\n }\n\n const relativePath = path.relative(\n path.join(projectRoot, 'android', 'app'),\n updatesGradleScriptPath\n );\n const posixPath = process.platform === 'win32' ? relativePath.replace(/\\\\/g, '/') : relativePath;\n\n return `apply from: \"${posixPath}\"`;\n}\n\nexport function isBuildGradleConfigured(projectRoot: string, buildGradleContents: string): boolean {\n const androidBuildScript = formatApplyLineForBuildGradle(projectRoot);\n\n return (\n buildGradleContents\n .replace(/\\r\\n/g, '\\n')\n .split('\\n')\n // Check for both single and double quotes\n .some(line => line === androidBuildScript || line === androidBuildScript.replace(/\"/g, \"'\"))\n );\n}\n\nexport function isMainApplicationMetaDataSet(androidManifest: AndroidManifest): boolean {\n const updateUrl = getMainApplicationMetaDataValue(androidManifest, Config.UPDATE_URL);\n const runtimeVersion = getMainApplicationMetaDataValue(androidManifest, Config.RUNTIME_VERSION);\n const sdkVersion = getMainApplicationMetaDataValue(androidManifest, Config.SDK_VERSION);\n\n return Boolean(updateUrl && (sdkVersion || runtimeVersion));\n}\n\nexport function isMainApplicationMetaDataSynced(\n projectRoot: string,\n config: ExpoConfigUpdates,\n androidManifest: AndroidManifest,\n username: string | null\n): boolean {\n return (\n getUpdateUrl(config, username) ===\n getMainApplicationMetaDataValue(androidManifest, Config.UPDATE_URL) &&\n String(getUpdatesEnabled(config)) ===\n getMainApplicationMetaDataValue(androidManifest, Config.ENABLED) &&\n String(getUpdatesTimeout(config)) ===\n getMainApplicationMetaDataValue(androidManifest, Config.LAUNCH_WAIT_MS) &&\n getUpdatesCheckOnLaunch(config) ===\n getMainApplicationMetaDataValue(androidManifest, Config.CHECK_ON_LAUNCH) &&\n getUpdatesCodeSigningCertificate(projectRoot, config) ===\n getMainApplicationMetaDataValue(androidManifest, Config.CODE_SIGNING_CERTIFICATE) &&\n getUpdatesCodeSigningMetadataStringified(config) ===\n getMainApplicationMetaDataValue(androidManifest, Config.CODE_SIGNING_METADATA) &&\n areVersionsSynced(config, androidManifest)\n );\n}\n\nexport function areVersionsSynced(\n config: Pick<ExpoConfigUpdates, 'runtimeVersion' | 'sdkVersion'>,\n androidManifest: AndroidManifest\n): boolean {\n const expectedRuntimeVersion = getRuntimeVersionNullable(config, 'android');\n const expectedSdkVersion = getSDKVersion(config);\n\n const currentRuntimeVersion = getMainApplicationMetaDataValue(\n androidManifest,\n Config.RUNTIME_VERSION\n );\n const currentSdkVersion = getMainApplicationMetaDataValue(androidManifest, Config.SDK_VERSION);\n\n if (expectedRuntimeVersion !== null) {\n return currentRuntimeVersion === expectedRuntimeVersion && currentSdkVersion === null;\n } else if (expectedSdkVersion !== null) {\n return currentSdkVersion === expectedSdkVersion && currentRuntimeVersion === null;\n } else {\n return true;\n }\n}\n"],"file":"Updates.js"}
@@ -1,13 +1,13 @@
1
1
  import { ExpoConfig } from '@expo/config-types';
2
2
  import { XcodeProject } from 'xcode';
3
- import { ConfigPlugin } from '../Plugin.types';
3
+ import { ConfigPlugin, ModProps } from '../Plugin.types';
4
4
  import { InfoPlist } from './IosConfig.types';
5
- export declare const withGoogle: ConfigPlugin<void>;
5
+ export declare const withGoogle: ConfigPlugin;
6
6
  export declare const withGoogleServicesFile: ConfigPlugin;
7
- export declare function getGoogleSignInReservedClientId(config: Pick<ExpoConfig, 'ios'>): string | null;
7
+ export declare function getGoogleSignInReservedClientId(config: Pick<ExpoConfig, 'ios'>, modRequest: Pick<ModProps<InfoPlist>, 'projectRoot'>): string | null;
8
8
  export declare function getGoogleServicesFile(config: Pick<ExpoConfig, 'ios'>): string | null;
9
- export declare function setGoogleSignInReservedClientId(config: Pick<ExpoConfig, 'ios'>, infoPlist: InfoPlist): InfoPlist;
10
- export declare function setGoogleConfig(config: Pick<ExpoConfig, 'ios'>, infoPlist: InfoPlist): InfoPlist;
9
+ export declare function setGoogleSignInReservedClientId(config: Pick<ExpoConfig, 'ios'>, infoPlist: InfoPlist, modRequest: Pick<ModProps<InfoPlist>, 'projectRoot'>): InfoPlist;
10
+ export declare function setGoogleConfig(config: Pick<ExpoConfig, 'ios'>, infoPlist: InfoPlist, modRequest: ModProps<InfoPlist>): InfoPlist;
11
11
  export declare function setGoogleServicesFile(config: Pick<ExpoConfig, 'ios'>, { projectRoot, project }: {
12
12
  project: XcodeProject;
13
13
  projectRoot: string;
@@ -10,6 +10,26 @@ exports.setGoogleServicesFile = setGoogleServicesFile;
10
10
  exports.setGoogleSignInReservedClientId = setGoogleSignInReservedClientId;
11
11
  exports.withGoogleServicesFile = exports.withGoogle = void 0;
12
12
 
13
+ function _plist() {
14
+ const data = _interopRequireDefault(require("@expo/plist"));
15
+
16
+ _plist = function () {
17
+ return data;
18
+ };
19
+
20
+ return data;
21
+ }
22
+
23
+ function _assert() {
24
+ const data = _interopRequireDefault(require("assert"));
25
+
26
+ _assert = function () {
27
+ return data;
28
+ };
29
+
30
+ return data;
31
+ }
32
+
13
33
  function _fsExtra() {
14
34
  const data = _interopRequireDefault(require("fs-extra"));
15
35
 
@@ -72,7 +92,13 @@ function _Xcodeproj() {
72
92
 
73
93
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
74
94
 
75
- const withGoogle = (0, _iosPlugins().createInfoPlistPlugin)(setGoogleConfig, 'withGoogle');
95
+ const withGoogle = config => {
96
+ return (0, _iosPlugins().withInfoPlist)(config, config => {
97
+ config.modResults = setGoogleConfig(config, config.modResults, config.modRequest);
98
+ return config;
99
+ });
100
+ };
101
+
76
102
  exports.withGoogle = withGoogle;
77
103
 
78
104
  const withGoogleServicesFile = config => {
@@ -87,10 +113,34 @@ const withGoogleServicesFile = config => {
87
113
 
88
114
  exports.withGoogleServicesFile = withGoogleServicesFile;
89
115
 
90
- function getGoogleSignInReservedClientId(config) {
91
- var _config$ios$config$go, _config$ios, _config$ios$config, _config$ios$config$go2;
116
+ function readGoogleServicesInfoPlist(relativePath, {
117
+ projectRoot
118
+ }) {
119
+ const googleServiceFilePath = _path().default.resolve(projectRoot, relativePath);
120
+
121
+ const contents = _fsExtra().default.readFileSync(googleServiceFilePath, 'utf8');
122
+
123
+ (0, _assert().default)(contents, 'GoogleService-Info.plist is empty');
124
+ return _plist().default.parse(contents);
125
+ }
126
+
127
+ function getGoogleSignInReservedClientId(config, modRequest) {
128
+ var _config$ios$config$go, _config$ios, _config$ios$config, _config$ios$config$go2, _infoPlist$REVERSED_C;
129
+
130
+ const reservedClientId = (_config$ios$config$go = (_config$ios = config.ios) === null || _config$ios === void 0 ? void 0 : (_config$ios$config = _config$ios.config) === null || _config$ios$config === void 0 ? void 0 : (_config$ios$config$go2 = _config$ios$config.googleSignIn) === null || _config$ios$config$go2 === void 0 ? void 0 : _config$ios$config$go2.reservedClientId) !== null && _config$ios$config$go !== void 0 ? _config$ios$config$go : null;
131
+
132
+ if (reservedClientId) {
133
+ return reservedClientId;
134
+ }
135
+
136
+ const googleServicesFileRelativePath = getGoogleServicesFile(config);
137
+
138
+ if (googleServicesFileRelativePath === null) {
139
+ return null;
140
+ }
92
141
 
93
- return (_config$ios$config$go = (_config$ios = config.ios) === null || _config$ios === void 0 ? void 0 : (_config$ios$config = _config$ios.config) === null || _config$ios$config === void 0 ? void 0 : (_config$ios$config$go2 = _config$ios$config.googleSignIn) === null || _config$ios$config$go2 === void 0 ? void 0 : _config$ios$config$go2.reservedClientId) !== null && _config$ios$config$go !== void 0 ? _config$ios$config$go : null;
142
+ const infoPlist = readGoogleServicesInfoPlist(googleServicesFileRelativePath, modRequest);
143
+ return (_infoPlist$REVERSED_C = infoPlist.REVERSED_CLIENT_ID) !== null && _infoPlist$REVERSED_C !== void 0 ? _infoPlist$REVERSED_C : null;
94
144
  }
95
145
 
96
146
  function getGoogleServicesFile(config) {
@@ -99,8 +149,8 @@ function getGoogleServicesFile(config) {
99
149
  return (_config$ios$googleSer = (_config$ios2 = config.ios) === null || _config$ios2 === void 0 ? void 0 : _config$ios2.googleServicesFile) !== null && _config$ios$googleSer !== void 0 ? _config$ios$googleSer : null;
100
150
  }
101
151
 
102
- function setGoogleSignInReservedClientId(config, infoPlist) {
103
- const reservedClientId = getGoogleSignInReservedClientId(config);
152
+ function setGoogleSignInReservedClientId(config, infoPlist, modRequest) {
153
+ const reservedClientId = getGoogleSignInReservedClientId(config, modRequest);
104
154
 
105
155
  if (reservedClientId === null) {
106
156
  return infoPlist;
@@ -109,8 +159,8 @@ function setGoogleSignInReservedClientId(config, infoPlist) {
109
159
  return (0, _Scheme().appendScheme)(reservedClientId, infoPlist);
110
160
  }
111
161
 
112
- function setGoogleConfig(config, infoPlist) {
113
- infoPlist = setGoogleSignInReservedClientId(config, infoPlist);
162
+ function setGoogleConfig(config, infoPlist, modRequest) {
163
+ infoPlist = setGoogleSignInReservedClientId(config, infoPlist, modRequest);
114
164
  return infoPlist;
115
165
  }
116
166
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ios/Google.ts"],"names":["withGoogle","setGoogleConfig","withGoogleServicesFile","config","modResults","setGoogleServicesFile","projectRoot","modRequest","project","getGoogleSignInReservedClientId","ios","googleSignIn","reservedClientId","getGoogleServicesFile","googleServicesFile","setGoogleSignInReservedClientId","infoPlist","googleServicesFileRelativePath","googleServiceFilePath","path","resolve","fs","copyFileSync","join","projectName","plistFilePath","hasFile","filepath","groupName","isBuildFile","verbose"],"mappings":";;;;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAIA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAEO,MAAMA,UAAU,GAAG,yCAAsBC,eAAtB,EAAuC,YAAvC,CAAnB;;;AAEA,MAAMC,sBAAoC,GAAGC,MAAM,IAAI;AAC5D,SAAO,oCAAiBA,MAAjB,EAAyBA,MAAM,IAAI;AACxCA,IAAAA,MAAM,CAACC,UAAP,GAAoBC,qBAAqB,CAACF,MAAD,EAAS;AAChDG,MAAAA,WAAW,EAAEH,MAAM,CAACI,UAAP,CAAkBD,WADiB;AAEhDE,MAAAA,OAAO,EAAEL,MAAM,CAACC;AAFgC,KAAT,CAAzC;AAIA,WAAOD,MAAP;AACD,GANM,CAAP;AAOD,CARM;;;;AAUA,SAASM,+BAAT,CAAyCN,MAAzC,EAA0E;AAAA;;AAC/E,iDAAOA,MAAM,CAACO,GAAd,sEAAO,YAAYP,MAAnB,iFAAO,mBAAoBQ,YAA3B,2DAAO,uBAAkCC,gBAAzC,yEAA6D,IAA7D;AACD;;AAEM,SAASC,qBAAT,CAA+BV,MAA/B,EAAgE;AAAA;;AACrE,kDAAOA,MAAM,CAACO,GAAd,iDAAO,aAAYI,kBAAnB,yEAAyC,IAAzC;AACD;;AAEM,SAASC,+BAAT,CACLZ,MADK,EAELa,SAFK,EAGM;AACX,QAAMJ,gBAAgB,GAAGH,+BAA+B,CAACN,MAAD,CAAxD;;AAEA,MAAIS,gBAAgB,KAAK,IAAzB,EAA+B;AAC7B,WAAOI,SAAP;AACD;;AAED,SAAO,4BAAaJ,gBAAb,EAA+BI,SAA/B,CAAP;AACD;;AAEM,SAASf,eAAT,CAAyBE,MAAzB,EAA0Da,SAA1D,EAA2F;AAChGA,EAAAA,SAAS,GAAGD,+BAA+B,CAACZ,MAAD,EAASa,SAAT,CAA3C;AACA,SAAOA,SAAP;AACD;;AAEM,SAASX,qBAAT,CACLF,MADK,EAEL;AAAEG,EAAAA,WAAF;AAAeE,EAAAA;AAAf,CAFK,EAGS;AACd,QAAMS,8BAA8B,GAAGJ,qBAAqB,CAACV,MAAD,CAA5D;;AACA,MAAIc,8BAA8B,KAAK,IAAvC,EAA6C;AAC3C,WAAOT,OAAP;AACD;;AAED,QAAMU,qBAAqB,GAAGC,gBAAKC,OAAL,CAAad,WAAb,EAA0BW,8BAA1B,CAA9B;;AACAI,qBAAGC,YAAH,CACEJ,qBADF,EAEEC,gBAAKI,IAAL,CAAU,4BAAcjB,WAAd,CAAV,EAAsC,0BAAtC,CAFF;;AAKA,QAAMkB,WAAW,GAAG,iCAAelB,WAAf,CAApB;AACA,QAAMmB,aAAa,GAAI,GAAED,WAAY,2BAArC;;AACA,MAAI,CAAChB,OAAO,CAACkB,OAAR,CAAgBD,aAAhB,CAAL,EAAqC;AACnCjB,IAAAA,OAAO,GAAG,yCAAuB;AAC/BmB,MAAAA,QAAQ,EAAEF,aADqB;AAE/BG,MAAAA,SAAS,EAAEJ,WAFoB;AAG/BhB,MAAAA,OAH+B;AAI/BqB,MAAAA,WAAW,EAAE,IAJkB;AAK/BC,MAAAA,OAAO,EAAE;AALsB,KAAvB,CAAV;AAOD;;AACD,SAAOtB,OAAP;AACD","sourcesContent":["import { ExpoConfig } from '@expo/config-types';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { XcodeProject } from 'xcode';\n\nimport { ConfigPlugin } from '../Plugin.types';\nimport { createInfoPlistPlugin, withXcodeProject } from '../plugins/ios-plugins';\nimport { InfoPlist } from './IosConfig.types';\nimport { getSourceRoot } from './Paths';\nimport { appendScheme } from './Scheme';\nimport { addResourceFileToGroup, getProjectName } from './utils/Xcodeproj';\n\nexport const withGoogle = createInfoPlistPlugin(setGoogleConfig, 'withGoogle');\n\nexport const withGoogleServicesFile: ConfigPlugin = config => {\n return withXcodeProject(config, config => {\n config.modResults = setGoogleServicesFile(config, {\n projectRoot: config.modRequest.projectRoot,\n project: config.modResults,\n });\n return config;\n });\n};\n\nexport function getGoogleSignInReservedClientId(config: Pick<ExpoConfig, 'ios'>) {\n return config.ios?.config?.googleSignIn?.reservedClientId ?? null;\n}\n\nexport function getGoogleServicesFile(config: Pick<ExpoConfig, 'ios'>) {\n return config.ios?.googleServicesFile ?? null;\n}\n\nexport function setGoogleSignInReservedClientId(\n config: Pick<ExpoConfig, 'ios'>,\n infoPlist: InfoPlist\n): InfoPlist {\n const reservedClientId = getGoogleSignInReservedClientId(config);\n\n if (reservedClientId === null) {\n return infoPlist;\n }\n\n return appendScheme(reservedClientId, infoPlist);\n}\n\nexport function setGoogleConfig(config: Pick<ExpoConfig, 'ios'>, infoPlist: InfoPlist): InfoPlist {\n infoPlist = setGoogleSignInReservedClientId(config, infoPlist);\n return infoPlist;\n}\n\nexport function setGoogleServicesFile(\n config: Pick<ExpoConfig, 'ios'>,\n { projectRoot, project }: { project: XcodeProject; projectRoot: string }\n): XcodeProject {\n const googleServicesFileRelativePath = getGoogleServicesFile(config);\n if (googleServicesFileRelativePath === null) {\n return project;\n }\n\n const googleServiceFilePath = path.resolve(projectRoot, googleServicesFileRelativePath);\n fs.copyFileSync(\n googleServiceFilePath,\n path.join(getSourceRoot(projectRoot), 'GoogleService-Info.plist')\n );\n\n const projectName = getProjectName(projectRoot);\n const plistFilePath = `${projectName}/GoogleService-Info.plist`;\n if (!project.hasFile(plistFilePath)) {\n project = addResourceFileToGroup({\n filepath: plistFilePath,\n groupName: projectName,\n project,\n isBuildFile: true,\n verbose: true,\n });\n }\n return project;\n}\n"],"file":"Google.js"}
1
+ {"version":3,"sources":["../../src/ios/Google.ts"],"names":["withGoogle","config","modResults","setGoogleConfig","modRequest","withGoogleServicesFile","setGoogleServicesFile","projectRoot","project","readGoogleServicesInfoPlist","relativePath","googleServiceFilePath","path","resolve","contents","fs","readFileSync","plist","parse","getGoogleSignInReservedClientId","reservedClientId","ios","googleSignIn","googleServicesFileRelativePath","getGoogleServicesFile","infoPlist","REVERSED_CLIENT_ID","googleServicesFile","setGoogleSignInReservedClientId","copyFileSync","join","projectName","plistFilePath","hasFile","filepath","groupName","isBuildFile","verbose"],"mappings":"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","sourcesContent":["import { ExpoConfig } from '@expo/config-types';\nimport plist from '@expo/plist';\nimport assert from 'assert';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { XcodeProject } from 'xcode';\n\nimport { ConfigPlugin, ModProps } from '../Plugin.types';\nimport { withInfoPlist, withXcodeProject } from '../plugins/ios-plugins';\nimport { InfoPlist } from './IosConfig.types';\nimport { getSourceRoot } from './Paths';\nimport { appendScheme } from './Scheme';\nimport { addResourceFileToGroup, getProjectName } from './utils/Xcodeproj';\n\nexport const withGoogle: ConfigPlugin = config => {\n return withInfoPlist(config, config => {\n config.modResults = setGoogleConfig(config, config.modResults, config.modRequest);\n return config;\n });\n};\n\nexport const withGoogleServicesFile: ConfigPlugin = config => {\n return withXcodeProject(config, config => {\n config.modResults = setGoogleServicesFile(config, {\n projectRoot: config.modRequest.projectRoot,\n project: config.modResults,\n });\n return config;\n });\n};\n\nfunction readGoogleServicesInfoPlist(\n relativePath: string,\n { projectRoot }: { projectRoot: string }\n) {\n const googleServiceFilePath = path.resolve(projectRoot, relativePath);\n const contents = fs.readFileSync(googleServiceFilePath, 'utf8');\n assert(contents, 'GoogleService-Info.plist is empty');\n return plist.parse(contents);\n}\n\nexport function getGoogleSignInReservedClientId(\n config: Pick<ExpoConfig, 'ios'>,\n modRequest: Pick<ModProps<InfoPlist>, 'projectRoot'>\n): string | null {\n const reservedClientId = config.ios?.config?.googleSignIn?.reservedClientId ?? null;\n if (reservedClientId) {\n return reservedClientId;\n }\n\n const googleServicesFileRelativePath = getGoogleServicesFile(config);\n if (googleServicesFileRelativePath === null) {\n return null;\n }\n\n const infoPlist = readGoogleServicesInfoPlist(googleServicesFileRelativePath, modRequest);\n\n return infoPlist.REVERSED_CLIENT_ID ?? null;\n}\n\nexport function getGoogleServicesFile(config: Pick<ExpoConfig, 'ios'>) {\n return config.ios?.googleServicesFile ?? null;\n}\n\nexport function setGoogleSignInReservedClientId(\n config: Pick<ExpoConfig, 'ios'>,\n infoPlist: InfoPlist,\n modRequest: Pick<ModProps<InfoPlist>, 'projectRoot'>\n): InfoPlist {\n const reservedClientId = getGoogleSignInReservedClientId(config, modRequest);\n\n if (reservedClientId === null) {\n return infoPlist;\n }\n\n return appendScheme(reservedClientId, infoPlist);\n}\n\nexport function setGoogleConfig(\n config: Pick<ExpoConfig, 'ios'>,\n infoPlist: InfoPlist,\n modRequest: ModProps<InfoPlist>\n): InfoPlist {\n infoPlist = setGoogleSignInReservedClientId(config, infoPlist, modRequest);\n return infoPlist;\n}\n\nexport function setGoogleServicesFile(\n config: Pick<ExpoConfig, 'ios'>,\n { projectRoot, project }: { project: XcodeProject; projectRoot: string }\n): XcodeProject {\n const googleServicesFileRelativePath = getGoogleServicesFile(config);\n if (googleServicesFileRelativePath === null) {\n return project;\n }\n\n const googleServiceFilePath = path.resolve(projectRoot, googleServicesFileRelativePath);\n fs.copyFileSync(\n googleServiceFilePath,\n path.join(getSourceRoot(projectRoot), 'GoogleService-Info.plist')\n );\n\n const projectName = getProjectName(projectRoot);\n const plistFilePath = `${projectName}/GoogleService-Info.plist`;\n if (!project.hasFile(plistFilePath)) {\n project = addResourceFileToGroup({\n filepath: plistFilePath,\n groupName: projectName,\n project,\n isBuildFile: true,\n verbose: true,\n });\n }\n return project;\n}\n"],"file":"Google.js"}
@@ -45,4 +45,6 @@ export declare type ExpoPlist = {
45
45
  EXUpdatesRequestHeaders: Record<string, string>;
46
46
  EXUpdatesSDKVersion?: string;
47
47
  EXUpdatesURL?: string;
48
+ EXUpdatesCodeSigningCertificate?: string;
49
+ EXUpdatesCodeSigningMetadata?: Record<string, string>;
48
50
  };