@expo/config-plugins 4.0.18 → 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"}
@@ -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"}
package/build/ios/Maps.js CHANGED
@@ -244,7 +244,7 @@ const withGoogleMapsAppDelegate = (config, {
244
244
  apiKey
245
245
  }) => {
246
246
  return (0, _iosPlugins().withAppDelegate)(config, config => {
247
- if (config.modResults.language === 'objc') {
247
+ if (['objc', 'objcpp'].includes(config.modResults.language)) {
248
248
  if (apiKey && isReactNativeMapsAutolinked(config) && isReactNativeMapsInstalled(config.modRequest.projectRoot)) {
249
249
  try {
250
250
  config.modResults.contents = addGoogleMapsAppDelegateImport(config.modResults.contents).contents;
@@ -261,7 +261,7 @@ const withGoogleMapsAppDelegate = (config, {
261
261
  config.modResults.contents = removeGoogleMapsAppDelegateInit(config.modResults.contents).contents;
262
262
  }
263
263
  } else {
264
- throw new Error('Cannot setup Google Maps because the AppDelegate is not Objective C');
264
+ throw new Error(`Cannot setup Google Maps because the project AppDelegate is not a supported language: ${config.modResults.language}`);
265
265
  }
266
266
 
267
267
  return config;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ios/Maps.ts"],"names":["debug","require","MATCH_INIT","withGoogleMapsKey","setGoogleMapsApiKey","withMaps","config","apiKey","getGoogleMapsApiKey","withMapsCocoaPods","useGoogleMaps","withGoogleMapsAppDelegate","ios","googleMapsApiKey","GMSApiKey","infoPlist","addGoogleMapsAppDelegateImport","src","newSrc","push","tag","join","anchor","offset","comment","removeGoogleMapsAppDelegateImport","addGoogleMapsAppDelegateInit","removeGoogleMapsAppDelegateInit","addMapsCocoaPods","removeMapsCocoaPods","isReactNativeMapsInstalled","projectRoot","resolved","resolveFrom","silent","path","dirname","isReactNativeMapsAutolinked","filePath","modRequest","platformProjectRoot","contents","fs","readFile","results","googleMapsPath","isLinked","error","code","Error","didMerge","didClear","writeFile","modResults","language"],"mappings":"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","sourcesContent":["import { ExpoConfig } from '@expo/config-types';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { ConfigPlugin, InfoPlist } from '../Plugin.types';\nimport { createInfoPlistPlugin, withAppDelegate } from '../plugins/ios-plugins';\nimport { withDangerousMod } from '../plugins/withDangerousMod';\nimport { mergeContents, MergeResults, removeContents } from '../utils/generateCode';\n\nconst debug = require('debug')('expo:config-plugins:ios:maps') as typeof console.log;\n\n// Match against `UMModuleRegistryAdapter` (unimodules), and React Native without unimodules (Expo Modules), and SDK +44 React AppDelegate subscriber.\nexport const MATCH_INIT = /(?:(self\\.|_)(\\w+)\\s?=\\s?\\[\\[UMModuleRegistryAdapter alloc\\])|(?:RCTBridge\\s?\\*\\s?(\\w+)\\s?=\\s?\\[\\[RCTBridge alloc\\])|(\\[self\\.reactDelegate createBridgeWithDelegate:self launchOptions:launchOptions\\])/g;\n\nconst withGoogleMapsKey = createInfoPlistPlugin(setGoogleMapsApiKey, 'withGoogleMapsKey');\n\nexport const withMaps: ConfigPlugin = config => {\n config = withGoogleMapsKey(config);\n\n const apiKey = getGoogleMapsApiKey(config);\n // Technically adds react-native-maps (Apple maps) and google maps.\n\n debug('Google Maps API Key:', apiKey);\n config = withMapsCocoaPods(config, { useGoogleMaps: !!apiKey });\n\n // Adds/Removes AppDelegate setup for Google Maps API on iOS\n config = withGoogleMapsAppDelegate(config, { apiKey });\n\n return config;\n};\n\nexport function getGoogleMapsApiKey(config: Pick<ExpoConfig, 'ios'>) {\n return config.ios?.config?.googleMapsApiKey ?? null;\n}\n\nexport function setGoogleMapsApiKey(\n config: Pick<ExpoConfig, 'ios'>,\n { GMSApiKey, ...infoPlist }: InfoPlist\n): InfoPlist {\n const apiKey = getGoogleMapsApiKey(config);\n\n if (apiKey === null) {\n return infoPlist;\n }\n\n return {\n ...infoPlist,\n GMSApiKey: apiKey,\n };\n}\n\nexport function addGoogleMapsAppDelegateImport(src: string): MergeResults {\n const newSrc = [];\n newSrc.push(\n '#if __has_include(<GoogleMaps/GoogleMaps.h>)',\n '#import <GoogleMaps/GoogleMaps.h>',\n '#endif'\n );\n\n return mergeContents({\n tag: 'react-native-maps-import',\n src,\n newSrc: newSrc.join('\\n'),\n anchor: /#import \"AppDelegate\\.h\"/,\n offset: 1,\n comment: '//',\n });\n}\n\nexport function removeGoogleMapsAppDelegateImport(src: string): MergeResults {\n return removeContents({\n tag: 'react-native-maps-import',\n src,\n });\n}\n\nexport function addGoogleMapsAppDelegateInit(src: string, apiKey: string): MergeResults {\n const newSrc = [];\n newSrc.push(\n '#if __has_include(<GoogleMaps/GoogleMaps.h>)',\n ` [GMSServices provideAPIKey:@\"${apiKey}\"];`,\n '#endif'\n );\n\n return mergeContents({\n tag: 'react-native-maps-init',\n src,\n newSrc: newSrc.join('\\n'),\n anchor: MATCH_INIT,\n offset: 0,\n comment: '//',\n });\n}\n\nexport function removeGoogleMapsAppDelegateInit(src: string): MergeResults {\n return removeContents({\n tag: 'react-native-maps-init',\n src,\n });\n}\n\n/**\n * @param src The contents of the Podfile.\n * @returns Podfile with Google Maps added.\n */\nexport function addMapsCocoaPods(src: string): MergeResults {\n return mergeContents({\n tag: 'react-native-maps',\n src,\n newSrc: ` pod 'react-native-google-maps', path: File.dirname(\\`node --print \"require.resolve('react-native-maps/package.json')\"\\`)`,\n anchor: /use_native_modules/,\n offset: 0,\n comment: '#',\n });\n}\n\nexport function removeMapsCocoaPods(src: string): MergeResults {\n return removeContents({\n tag: 'react-native-maps',\n src,\n });\n}\n\nfunction isReactNativeMapsInstalled(projectRoot: string): string | null {\n const resolved = resolveFrom.silent(projectRoot, 'react-native-maps/package.json');\n return resolved ? path.dirname(resolved) : null;\n}\n\nfunction isReactNativeMapsAutolinked(config: Pick<ExpoConfig, '_internal'>): boolean {\n // Only add the native code changes if we know that the package is going to be linked natively.\n // This is specifically for monorepo support where one app might have react-native-maps (adding it to the node_modules)\n // but another app will not have it installed in the package.json, causing it to not be linked natively.\n // This workaround only exists because react-native-maps doesn't have a config plugin vendored in the package.\n\n // TODO: `react-native-maps` doesn't use Expo autolinking so we cannot safely disable the module.\n return true;\n\n // return (\n // !config._internal?.autolinkedModules ||\n // config._internal.autolinkedModules.includes('react-native-maps')\n // );\n}\n\nconst withMapsCocoaPods: ConfigPlugin<{ useGoogleMaps: boolean }> = (config, { useGoogleMaps }) => {\n return withDangerousMod(config, [\n 'ios',\n async config => {\n const filePath = path.join(config.modRequest.platformProjectRoot, 'Podfile');\n const contents = await fs.readFile(filePath, 'utf-8');\n let results: MergeResults;\n // Only add the block if react-native-maps is installed in the project (best effort).\n // Generally prebuild runs after a yarn install so this should always work as expected.\n const googleMapsPath = isReactNativeMapsInstalled(config.modRequest.projectRoot);\n const isLinked = isReactNativeMapsAutolinked(config);\n debug('Is Expo Autolinked:', isLinked);\n debug('react-native-maps path:', googleMapsPath);\n if (isLinked && googleMapsPath && useGoogleMaps) {\n try {\n results = addMapsCocoaPods(contents);\n } catch (error: any) {\n if (error.code === 'ERR_NO_MATCH') {\n throw new Error(\n `Cannot add react-native-maps to the project's ios/Podfile because it's malformed. Please report this with a copy of your project Podfile.`\n );\n }\n throw error;\n }\n } else {\n // If the package is no longer installed, then remove the block.\n results = removeMapsCocoaPods(contents);\n }\n if (results.didMerge || results.didClear) {\n await fs.writeFile(filePath, results.contents);\n }\n return config;\n },\n ]);\n};\n\nconst withGoogleMapsAppDelegate: ConfigPlugin<{ apiKey: string | null }> = (config, { apiKey }) => {\n return withAppDelegate(config, config => {\n if (config.modResults.language === 'objc') {\n if (\n apiKey &&\n isReactNativeMapsAutolinked(config) &&\n isReactNativeMapsInstalled(config.modRequest.projectRoot)\n ) {\n try {\n config.modResults.contents = addGoogleMapsAppDelegateImport(\n config.modResults.contents\n ).contents;\n config.modResults.contents = addGoogleMapsAppDelegateInit(\n config.modResults.contents,\n apiKey\n ).contents;\n } catch (error) {\n if (error.code === 'ERR_NO_MATCH') {\n throw new Error(\n `Cannot add Google Maps to the project's AppDelegate because it's malformed. Please report this with a copy of your project AppDelegate.`\n );\n }\n throw error;\n }\n } else {\n config.modResults.contents = removeGoogleMapsAppDelegateImport(\n config.modResults.contents\n ).contents;\n config.modResults.contents = removeGoogleMapsAppDelegateInit(\n config.modResults.contents\n ).contents;\n }\n } else {\n throw new Error('Cannot setup Google Maps because the AppDelegate is not Objective C');\n }\n return config;\n });\n};\n"],"file":"Maps.js"}
1
+ {"version":3,"sources":["../../src/ios/Maps.ts"],"names":["debug","require","MATCH_INIT","withGoogleMapsKey","setGoogleMapsApiKey","withMaps","config","apiKey","getGoogleMapsApiKey","withMapsCocoaPods","useGoogleMaps","withGoogleMapsAppDelegate","ios","googleMapsApiKey","GMSApiKey","infoPlist","addGoogleMapsAppDelegateImport","src","newSrc","push","tag","join","anchor","offset","comment","removeGoogleMapsAppDelegateImport","addGoogleMapsAppDelegateInit","removeGoogleMapsAppDelegateInit","addMapsCocoaPods","removeMapsCocoaPods","isReactNativeMapsInstalled","projectRoot","resolved","resolveFrom","silent","path","dirname","isReactNativeMapsAutolinked","filePath","modRequest","platformProjectRoot","contents","fs","readFile","results","googleMapsPath","isLinked","error","code","Error","didMerge","didClear","writeFile","includes","modResults","language"],"mappings":"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","sourcesContent":["import { ExpoConfig } from '@expo/config-types';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { ConfigPlugin, InfoPlist } from '../Plugin.types';\nimport { createInfoPlistPlugin, withAppDelegate } from '../plugins/ios-plugins';\nimport { withDangerousMod } from '../plugins/withDangerousMod';\nimport { mergeContents, MergeResults, removeContents } from '../utils/generateCode';\n\nconst debug = require('debug')('expo:config-plugins:ios:maps') as typeof console.log;\n\n// Match against `UMModuleRegistryAdapter` (unimodules), and React Native without unimodules (Expo Modules), and SDK +44 React AppDelegate subscriber.\nexport const MATCH_INIT = /(?:(self\\.|_)(\\w+)\\s?=\\s?\\[\\[UMModuleRegistryAdapter alloc\\])|(?:RCTBridge\\s?\\*\\s?(\\w+)\\s?=\\s?\\[\\[RCTBridge alloc\\])|(\\[self\\.reactDelegate createBridgeWithDelegate:self launchOptions:launchOptions\\])/g;\n\nconst withGoogleMapsKey = createInfoPlistPlugin(setGoogleMapsApiKey, 'withGoogleMapsKey');\n\nexport const withMaps: ConfigPlugin = config => {\n config = withGoogleMapsKey(config);\n\n const apiKey = getGoogleMapsApiKey(config);\n // Technically adds react-native-maps (Apple maps) and google maps.\n\n debug('Google Maps API Key:', apiKey);\n config = withMapsCocoaPods(config, { useGoogleMaps: !!apiKey });\n\n // Adds/Removes AppDelegate setup for Google Maps API on iOS\n config = withGoogleMapsAppDelegate(config, { apiKey });\n\n return config;\n};\n\nexport function getGoogleMapsApiKey(config: Pick<ExpoConfig, 'ios'>) {\n return config.ios?.config?.googleMapsApiKey ?? null;\n}\n\nexport function setGoogleMapsApiKey(\n config: Pick<ExpoConfig, 'ios'>,\n { GMSApiKey, ...infoPlist }: InfoPlist\n): InfoPlist {\n const apiKey = getGoogleMapsApiKey(config);\n\n if (apiKey === null) {\n return infoPlist;\n }\n\n return {\n ...infoPlist,\n GMSApiKey: apiKey,\n };\n}\n\nexport function addGoogleMapsAppDelegateImport(src: string): MergeResults {\n const newSrc = [];\n newSrc.push(\n '#if __has_include(<GoogleMaps/GoogleMaps.h>)',\n '#import <GoogleMaps/GoogleMaps.h>',\n '#endif'\n );\n\n return mergeContents({\n tag: 'react-native-maps-import',\n src,\n newSrc: newSrc.join('\\n'),\n anchor: /#import \"AppDelegate\\.h\"/,\n offset: 1,\n comment: '//',\n });\n}\n\nexport function removeGoogleMapsAppDelegateImport(src: string): MergeResults {\n return removeContents({\n tag: 'react-native-maps-import',\n src,\n });\n}\n\nexport function addGoogleMapsAppDelegateInit(src: string, apiKey: string): MergeResults {\n const newSrc = [];\n newSrc.push(\n '#if __has_include(<GoogleMaps/GoogleMaps.h>)',\n ` [GMSServices provideAPIKey:@\"${apiKey}\"];`,\n '#endif'\n );\n\n return mergeContents({\n tag: 'react-native-maps-init',\n src,\n newSrc: newSrc.join('\\n'),\n anchor: MATCH_INIT,\n offset: 0,\n comment: '//',\n });\n}\n\nexport function removeGoogleMapsAppDelegateInit(src: string): MergeResults {\n return removeContents({\n tag: 'react-native-maps-init',\n src,\n });\n}\n\n/**\n * @param src The contents of the Podfile.\n * @returns Podfile with Google Maps added.\n */\nexport function addMapsCocoaPods(src: string): MergeResults {\n return mergeContents({\n tag: 'react-native-maps',\n src,\n newSrc: ` pod 'react-native-google-maps', path: File.dirname(\\`node --print \"require.resolve('react-native-maps/package.json')\"\\`)`,\n anchor: /use_native_modules/,\n offset: 0,\n comment: '#',\n });\n}\n\nexport function removeMapsCocoaPods(src: string): MergeResults {\n return removeContents({\n tag: 'react-native-maps',\n src,\n });\n}\n\nfunction isReactNativeMapsInstalled(projectRoot: string): string | null {\n const resolved = resolveFrom.silent(projectRoot, 'react-native-maps/package.json');\n return resolved ? path.dirname(resolved) : null;\n}\n\nfunction isReactNativeMapsAutolinked(config: Pick<ExpoConfig, '_internal'>): boolean {\n // Only add the native code changes if we know that the package is going to be linked natively.\n // This is specifically for monorepo support where one app might have react-native-maps (adding it to the node_modules)\n // but another app will not have it installed in the package.json, causing it to not be linked natively.\n // This workaround only exists because react-native-maps doesn't have a config plugin vendored in the package.\n\n // TODO: `react-native-maps` doesn't use Expo autolinking so we cannot safely disable the module.\n return true;\n\n // return (\n // !config._internal?.autolinkedModules ||\n // config._internal.autolinkedModules.includes('react-native-maps')\n // );\n}\n\nconst withMapsCocoaPods: ConfigPlugin<{ useGoogleMaps: boolean }> = (config, { useGoogleMaps }) => {\n return withDangerousMod(config, [\n 'ios',\n async config => {\n const filePath = path.join(config.modRequest.platformProjectRoot, 'Podfile');\n const contents = await fs.readFile(filePath, 'utf-8');\n let results: MergeResults;\n // Only add the block if react-native-maps is installed in the project (best effort).\n // Generally prebuild runs after a yarn install so this should always work as expected.\n const googleMapsPath = isReactNativeMapsInstalled(config.modRequest.projectRoot);\n const isLinked = isReactNativeMapsAutolinked(config);\n debug('Is Expo Autolinked:', isLinked);\n debug('react-native-maps path:', googleMapsPath);\n if (isLinked && googleMapsPath && useGoogleMaps) {\n try {\n results = addMapsCocoaPods(contents);\n } catch (error: any) {\n if (error.code === 'ERR_NO_MATCH') {\n throw new Error(\n `Cannot add react-native-maps to the project's ios/Podfile because it's malformed. Please report this with a copy of your project Podfile.`\n );\n }\n throw error;\n }\n } else {\n // If the package is no longer installed, then remove the block.\n results = removeMapsCocoaPods(contents);\n }\n if (results.didMerge || results.didClear) {\n await fs.writeFile(filePath, results.contents);\n }\n return config;\n },\n ]);\n};\n\nconst withGoogleMapsAppDelegate: ConfigPlugin<{ apiKey: string | null }> = (config, { apiKey }) => {\n return withAppDelegate(config, config => {\n if (['objc', 'objcpp'].includes(config.modResults.language)) {\n if (\n apiKey &&\n isReactNativeMapsAutolinked(config) &&\n isReactNativeMapsInstalled(config.modRequest.projectRoot)\n ) {\n try {\n config.modResults.contents = addGoogleMapsAppDelegateImport(\n config.modResults.contents\n ).contents;\n config.modResults.contents = addGoogleMapsAppDelegateInit(\n config.modResults.contents,\n apiKey\n ).contents;\n } catch (error: any) {\n if (error.code === 'ERR_NO_MATCH') {\n throw new Error(\n `Cannot add Google Maps to the project's AppDelegate because it's malformed. Please report this with a copy of your project AppDelegate.`\n );\n }\n throw error;\n }\n } else {\n config.modResults.contents = removeGoogleMapsAppDelegateImport(\n config.modResults.contents\n ).contents;\n config.modResults.contents = removeGoogleMapsAppDelegateInit(\n config.modResults.contents\n ).contents;\n }\n } else {\n throw new Error(\n `Cannot setup Google Maps because the project AppDelegate is not a supported language: ${config.modResults.language}`\n );\n }\n return config;\n });\n};\n"],"file":"Maps.js"}
@@ -3,14 +3,15 @@ interface ProjectFile<L extends string = string> {
3
3
  language: L;
4
4
  contents: string;
5
5
  }
6
- export declare type AppDelegateProjectFile = ProjectFile<'objc' | 'swift'>;
6
+ declare type AppleLanguage = 'objc' | 'objcpp' | 'swift';
7
+ export declare type AppDelegateProjectFile = ProjectFile<AppleLanguage>;
7
8
  export declare function getAppDelegateHeaderFilePath(projectRoot: string): string;
8
9
  export declare function getAppDelegateFilePath(projectRoot: string): string;
9
10
  export declare function getAppDelegateObjcHeaderFilePath(projectRoot: string): string;
10
11
  export declare function getFileInfo(filePath: string): {
11
12
  path: string;
12
13
  contents: string;
13
- language: "objc" | "swift";
14
+ language: AppleLanguage;
14
15
  };
15
16
  export declare function getAppDelegate(projectRoot: string): AppDelegateProjectFile;
16
17
  export declare function getSourceRoot(projectRoot: string): string;
@@ -103,7 +103,7 @@ function getAppDelegateHeaderFilePath(projectRoot) {
103
103
  }
104
104
 
105
105
  function getAppDelegateFilePath(projectRoot) {
106
- const [using, ...extra] = (0, _glob().sync)('ios/*/AppDelegate.@(m|swift)', {
106
+ const [using, ...extra] = (0, _glob().sync)('ios/*/AppDelegate.@(m|mm|swift)', {
107
107
  absolute: true,
108
108
  cwd: projectRoot,
109
109
  ignore: ignoredPaths
@@ -154,6 +154,9 @@ function getLanguage(filePath) {
154
154
  const extension = path().extname(filePath);
155
155
 
156
156
  switch (extension) {
157
+ case '.mm':
158
+ return 'objcpp';
159
+
157
160
  case '.m':
158
161
  case '.h':
159
162
  return 'objc';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ios/Paths.ts"],"names":["ignoredPaths","getAppDelegateHeaderFilePath","projectRoot","using","extra","absolute","cwd","ignore","UnexpectedError","length","warnMultipleFiles","tag","fileName","getAppDelegateFilePath","getAppDelegateObjcHeaderFilePath","getLanguage","filePath","extension","path","extname","getFileInfo","normalize","contents","language","getAppDelegate","getSourceRoot","appDelegate","dirname","findSchemePaths","findSchemeNames","schemePaths","map","schemePath","parse","name","getAllXcodeProjectPaths","iosFolder","pbxprojPaths","filter","project","test","sort","value","join","getXcodeProjectPath","getAllPBXProjectPaths","projectPaths","paths","getPBXProjectPath","getAllInfoPlistPaths","a","b","getInfoPlistPath","getAllEntitlementsPaths","getEntitlementsPath","getSupportingPath","resolve","basename","getExpoPlistPath","supportingPath","usingPath","relative","extraPaths","v","JSON","stringify"],"mappings":"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","sourcesContent":["import { pathExistsSync, readFileSync } from 'fs-extra';\nimport { sync as globSync } from 'glob';\nimport * as path from 'path';\n\nimport { UnexpectedError } from '../utils/errors';\nimport { addWarningIOS } from '../utils/warnings';\n\nconst ignoredPaths = ['**/@(Carthage|Pods|vendor|node_modules)/**'];\n\ninterface ProjectFile<L extends string = string> {\n path: string;\n language: L;\n contents: string;\n}\n\nexport type AppDelegateProjectFile = ProjectFile<'objc' | 'swift'>;\n\nexport function getAppDelegateHeaderFilePath(projectRoot: string): string {\n const [using, ...extra] = globSync('ios/*/AppDelegate.h', {\n absolute: true,\n cwd: projectRoot,\n ignore: ignoredPaths,\n });\n\n if (!using) {\n throw new UnexpectedError(\n `Could not locate a valid AppDelegate header at root: \"${projectRoot}\"`\n );\n }\n\n if (extra.length) {\n warnMultipleFiles({\n tag: 'app-delegate-header',\n fileName: 'AppDelegate',\n projectRoot,\n using,\n extra,\n });\n }\n\n return using;\n}\n\nexport function getAppDelegateFilePath(projectRoot: string): string {\n const [using, ...extra] = globSync('ios/*/AppDelegate.@(m|swift)', {\n absolute: true,\n cwd: projectRoot,\n ignore: ignoredPaths,\n });\n\n if (!using) {\n throw new UnexpectedError(`Could not locate a valid AppDelegate at root: \"${projectRoot}\"`);\n }\n\n if (extra.length) {\n warnMultipleFiles({\n tag: 'app-delegate',\n fileName: 'AppDelegate',\n projectRoot,\n using,\n extra,\n });\n }\n\n return using;\n}\n\nexport function getAppDelegateObjcHeaderFilePath(projectRoot: string): string {\n const [using, ...extra] = globSync('ios/*/AppDelegate.h', {\n absolute: true,\n cwd: projectRoot,\n ignore: ignoredPaths,\n });\n\n if (!using) {\n throw new UnexpectedError(`Could not locate a valid AppDelegate.h at root: \"${projectRoot}\"`);\n }\n\n if (extra.length) {\n warnMultipleFiles({\n tag: 'app-delegate-objc-header',\n fileName: 'AppDelegate.h',\n projectRoot,\n using,\n extra,\n });\n }\n\n return using;\n}\n\nfunction getLanguage(filePath: string): 'objc' | 'swift' {\n const extension = path.extname(filePath);\n switch (extension) {\n case '.m':\n case '.h':\n return 'objc';\n case '.swift':\n return 'swift';\n default:\n throw new UnexpectedError(`Unexpected iOS file extension: ${extension}`);\n }\n}\n\nexport function getFileInfo(filePath: string) {\n return {\n path: path.normalize(filePath),\n contents: readFileSync(filePath, 'utf8'),\n language: getLanguage(filePath),\n };\n}\n\nexport function getAppDelegate(projectRoot: string): AppDelegateProjectFile {\n const filePath = getAppDelegateFilePath(projectRoot);\n return getFileInfo(filePath);\n}\n\nexport function getSourceRoot(projectRoot: string): string {\n const appDelegate = getAppDelegate(projectRoot);\n return path.dirname(appDelegate.path);\n}\n\nexport function findSchemePaths(projectRoot: string): string[] {\n return globSync('ios/*.xcodeproj/xcshareddata/xcschemes/*.xcscheme', {\n absolute: true,\n cwd: projectRoot,\n ignore: ignoredPaths,\n });\n}\n\nexport function findSchemeNames(projectRoot: string): string[] {\n const schemePaths = findSchemePaths(projectRoot);\n return schemePaths.map(schemePath => path.parse(schemePath).name);\n}\n\nexport function getAllXcodeProjectPaths(projectRoot: string): string[] {\n const iosFolder = 'ios';\n const pbxprojPaths = globSync('**/*.xcodeproj', { cwd: projectRoot, ignore: ignoredPaths })\n .filter(project => !/test|example|sample/i.test(project) || path.dirname(project) === iosFolder)\n .sort(project => (path.dirname(project) === iosFolder ? -1 : 1))\n // sort alphabetically to ensure this works the same across different devices (Fail in CI (linux) without this)\n .sort();\n\n if (!pbxprojPaths.length) {\n throw new UnexpectedError(\n `Failed to locate the ios/*.xcodeproj files relative to path \"${projectRoot}\".`\n );\n }\n return pbxprojPaths.map(value => path.join(projectRoot, value));\n}\n\n/**\n * Get the pbxproj for the given path\n */\nexport function getXcodeProjectPath(projectRoot: string): string {\n const [using, ...extra] = getAllXcodeProjectPaths(projectRoot);\n\n if (extra.length) {\n warnMultipleFiles({\n tag: 'xcodeproj',\n fileName: '*.xcodeproj',\n projectRoot,\n using,\n extra,\n });\n }\n\n return using;\n}\n\nexport function getAllPBXProjectPaths(projectRoot: string): string[] {\n const projectPaths = getAllXcodeProjectPaths(projectRoot);\n const paths = projectPaths\n .map(value => path.join(value, 'project.pbxproj'))\n .filter(value => pathExistsSync(value));\n\n if (!paths.length) {\n throw new UnexpectedError(\n `Failed to locate the ios/*.xcodeproj/project.pbxproj files relative to path \"${projectRoot}\".`\n );\n }\n return paths;\n}\n\nexport function getPBXProjectPath(projectRoot: string): string {\n const [using, ...extra] = getAllPBXProjectPaths(projectRoot);\n\n if (extra.length) {\n warnMultipleFiles({\n tag: 'project-pbxproj',\n fileName: 'project.pbxproj',\n projectRoot,\n using,\n extra,\n });\n }\n\n return using;\n}\n\nexport function getAllInfoPlistPaths(projectRoot: string): string[] {\n const paths = globSync('ios/*/Info.plist', {\n absolute: true,\n cwd: projectRoot,\n ignore: ignoredPaths,\n }).sort(\n // longer name means more suffixes, we want the shortest possible one to be first.\n (a, b) => a.length - b.length\n );\n\n if (!paths.length) {\n throw new UnexpectedError(\n `Failed to locate Info.plist files relative to path \"${projectRoot}\".`\n );\n }\n return paths;\n}\n\nexport function getInfoPlistPath(projectRoot: string): string {\n const [using, ...extra] = getAllInfoPlistPaths(projectRoot);\n\n if (extra.length) {\n warnMultipleFiles({\n tag: 'info-plist',\n fileName: 'Info.plist',\n projectRoot,\n using,\n extra,\n });\n }\n\n return using;\n}\n\nexport function getAllEntitlementsPaths(projectRoot: string): string[] {\n const paths = globSync('ios/*/*.entitlements', {\n absolute: true,\n cwd: projectRoot,\n ignore: ignoredPaths,\n });\n return paths;\n}\n\n/**\n * Get the entitlements file path if it exists.\n *\n * @param projectRoot\n */\nexport function getEntitlementsPath(projectRoot: string): string | null {\n const [using, ...extra] = getAllEntitlementsPaths(projectRoot);\n\n if (extra.length) {\n warnMultipleFiles({\n tag: 'entitlements',\n fileName: '*.entitlements',\n projectRoot,\n using,\n extra,\n });\n }\n\n return using ?? null;\n}\n\nexport function getSupportingPath(projectRoot: string): string {\n return path.resolve(projectRoot, 'ios', path.basename(getSourceRoot(projectRoot)), 'Supporting');\n}\n\nexport function getExpoPlistPath(projectRoot: string): string {\n const supportingPath = getSupportingPath(projectRoot);\n return path.join(supportingPath, 'Expo.plist');\n}\n\nfunction warnMultipleFiles({\n tag,\n fileName,\n projectRoot,\n using,\n extra,\n}: {\n tag: string;\n fileName: string;\n projectRoot?: string;\n using: string;\n extra: string[];\n}) {\n const usingPath = projectRoot ? path.relative(projectRoot, using) : using;\n const extraPaths = projectRoot ? extra.map(v => path.relative(projectRoot, v)) : extra;\n addWarningIOS(\n `paths-${tag}`,\n `Found multiple ${fileName} file paths, using \"${usingPath}\". Ignored paths: ${JSON.stringify(\n extraPaths\n )}`\n );\n}\n"],"file":"Paths.js"}
1
+ {"version":3,"sources":["../../src/ios/Paths.ts"],"names":["ignoredPaths","getAppDelegateHeaderFilePath","projectRoot","using","extra","absolute","cwd","ignore","UnexpectedError","length","warnMultipleFiles","tag","fileName","getAppDelegateFilePath","getAppDelegateObjcHeaderFilePath","getLanguage","filePath","extension","path","extname","getFileInfo","normalize","contents","language","getAppDelegate","getSourceRoot","appDelegate","dirname","findSchemePaths","findSchemeNames","schemePaths","map","schemePath","parse","name","getAllXcodeProjectPaths","iosFolder","pbxprojPaths","filter","project","test","sort","value","join","getXcodeProjectPath","getAllPBXProjectPaths","projectPaths","paths","getPBXProjectPath","getAllInfoPlistPaths","a","b","getInfoPlistPath","getAllEntitlementsPaths","getEntitlementsPath","getSupportingPath","resolve","basename","getExpoPlistPath","supportingPath","usingPath","relative","extraPaths","v","JSON","stringify"],"mappings":"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","sourcesContent":["import { pathExistsSync, readFileSync } from 'fs-extra';\nimport { sync as globSync } from 'glob';\nimport * as path from 'path';\n\nimport { UnexpectedError } from '../utils/errors';\nimport { addWarningIOS } from '../utils/warnings';\n\nconst ignoredPaths = ['**/@(Carthage|Pods|vendor|node_modules)/**'];\n\ninterface ProjectFile<L extends string = string> {\n path: string;\n language: L;\n contents: string;\n}\n\ntype AppleLanguage = 'objc' | 'objcpp' | 'swift';\n\nexport type AppDelegateProjectFile = ProjectFile<AppleLanguage>;\n\nexport function getAppDelegateHeaderFilePath(projectRoot: string): string {\n const [using, ...extra] = globSync('ios/*/AppDelegate.h', {\n absolute: true,\n cwd: projectRoot,\n ignore: ignoredPaths,\n });\n\n if (!using) {\n throw new UnexpectedError(\n `Could not locate a valid AppDelegate header at root: \"${projectRoot}\"`\n );\n }\n\n if (extra.length) {\n warnMultipleFiles({\n tag: 'app-delegate-header',\n fileName: 'AppDelegate',\n projectRoot,\n using,\n extra,\n });\n }\n\n return using;\n}\n\nexport function getAppDelegateFilePath(projectRoot: string): string {\n const [using, ...extra] = globSync('ios/*/AppDelegate.@(m|mm|swift)', {\n absolute: true,\n cwd: projectRoot,\n ignore: ignoredPaths,\n });\n\n if (!using) {\n throw new UnexpectedError(`Could not locate a valid AppDelegate at root: \"${projectRoot}\"`);\n }\n\n if (extra.length) {\n warnMultipleFiles({\n tag: 'app-delegate',\n fileName: 'AppDelegate',\n projectRoot,\n using,\n extra,\n });\n }\n\n return using;\n}\n\nexport function getAppDelegateObjcHeaderFilePath(projectRoot: string): string {\n const [using, ...extra] = globSync('ios/*/AppDelegate.h', {\n absolute: true,\n cwd: projectRoot,\n ignore: ignoredPaths,\n });\n\n if (!using) {\n throw new UnexpectedError(`Could not locate a valid AppDelegate.h at root: \"${projectRoot}\"`);\n }\n\n if (extra.length) {\n warnMultipleFiles({\n tag: 'app-delegate-objc-header',\n fileName: 'AppDelegate.h',\n projectRoot,\n using,\n extra,\n });\n }\n\n return using;\n}\n\nfunction getLanguage(filePath: string): AppleLanguage {\n const extension = path.extname(filePath);\n switch (extension) {\n case '.mm':\n return 'objcpp';\n case '.m':\n case '.h':\n return 'objc';\n case '.swift':\n return 'swift';\n default:\n throw new UnexpectedError(`Unexpected iOS file extension: ${extension}`);\n }\n}\n\nexport function getFileInfo(filePath: string) {\n return {\n path: path.normalize(filePath),\n contents: readFileSync(filePath, 'utf8'),\n language: getLanguage(filePath),\n };\n}\n\nexport function getAppDelegate(projectRoot: string): AppDelegateProjectFile {\n const filePath = getAppDelegateFilePath(projectRoot);\n return getFileInfo(filePath);\n}\n\nexport function getSourceRoot(projectRoot: string): string {\n const appDelegate = getAppDelegate(projectRoot);\n return path.dirname(appDelegate.path);\n}\n\nexport function findSchemePaths(projectRoot: string): string[] {\n return globSync('ios/*.xcodeproj/xcshareddata/xcschemes/*.xcscheme', {\n absolute: true,\n cwd: projectRoot,\n ignore: ignoredPaths,\n });\n}\n\nexport function findSchemeNames(projectRoot: string): string[] {\n const schemePaths = findSchemePaths(projectRoot);\n return schemePaths.map(schemePath => path.parse(schemePath).name);\n}\n\nexport function getAllXcodeProjectPaths(projectRoot: string): string[] {\n const iosFolder = 'ios';\n const pbxprojPaths = globSync('**/*.xcodeproj', { cwd: projectRoot, ignore: ignoredPaths })\n .filter(project => !/test|example|sample/i.test(project) || path.dirname(project) === iosFolder)\n .sort(project => (path.dirname(project) === iosFolder ? -1 : 1))\n // sort alphabetically to ensure this works the same across different devices (Fail in CI (linux) without this)\n .sort();\n\n if (!pbxprojPaths.length) {\n throw new UnexpectedError(\n `Failed to locate the ios/*.xcodeproj files relative to path \"${projectRoot}\".`\n );\n }\n return pbxprojPaths.map(value => path.join(projectRoot, value));\n}\n\n/**\n * Get the pbxproj for the given path\n */\nexport function getXcodeProjectPath(projectRoot: string): string {\n const [using, ...extra] = getAllXcodeProjectPaths(projectRoot);\n\n if (extra.length) {\n warnMultipleFiles({\n tag: 'xcodeproj',\n fileName: '*.xcodeproj',\n projectRoot,\n using,\n extra,\n });\n }\n\n return using;\n}\n\nexport function getAllPBXProjectPaths(projectRoot: string): string[] {\n const projectPaths = getAllXcodeProjectPaths(projectRoot);\n const paths = projectPaths\n .map(value => path.join(value, 'project.pbxproj'))\n .filter(value => pathExistsSync(value));\n\n if (!paths.length) {\n throw new UnexpectedError(\n `Failed to locate the ios/*.xcodeproj/project.pbxproj files relative to path \"${projectRoot}\".`\n );\n }\n return paths;\n}\n\nexport function getPBXProjectPath(projectRoot: string): string {\n const [using, ...extra] = getAllPBXProjectPaths(projectRoot);\n\n if (extra.length) {\n warnMultipleFiles({\n tag: 'project-pbxproj',\n fileName: 'project.pbxproj',\n projectRoot,\n using,\n extra,\n });\n }\n\n return using;\n}\n\nexport function getAllInfoPlistPaths(projectRoot: string): string[] {\n const paths = globSync('ios/*/Info.plist', {\n absolute: true,\n cwd: projectRoot,\n ignore: ignoredPaths,\n }).sort(\n // longer name means more suffixes, we want the shortest possible one to be first.\n (a, b) => a.length - b.length\n );\n\n if (!paths.length) {\n throw new UnexpectedError(\n `Failed to locate Info.plist files relative to path \"${projectRoot}\".`\n );\n }\n return paths;\n}\n\nexport function getInfoPlistPath(projectRoot: string): string {\n const [using, ...extra] = getAllInfoPlistPaths(projectRoot);\n\n if (extra.length) {\n warnMultipleFiles({\n tag: 'info-plist',\n fileName: 'Info.plist',\n projectRoot,\n using,\n extra,\n });\n }\n\n return using;\n}\n\nexport function getAllEntitlementsPaths(projectRoot: string): string[] {\n const paths = globSync('ios/*/*.entitlements', {\n absolute: true,\n cwd: projectRoot,\n ignore: ignoredPaths,\n });\n return paths;\n}\n\n/**\n * Get the entitlements file path if it exists.\n *\n * @param projectRoot\n */\nexport function getEntitlementsPath(projectRoot: string): string | null {\n const [using, ...extra] = getAllEntitlementsPaths(projectRoot);\n\n if (extra.length) {\n warnMultipleFiles({\n tag: 'entitlements',\n fileName: '*.entitlements',\n projectRoot,\n using,\n extra,\n });\n }\n\n return using ?? null;\n}\n\nexport function getSupportingPath(projectRoot: string): string {\n return path.resolve(projectRoot, 'ios', path.basename(getSourceRoot(projectRoot)), 'Supporting');\n}\n\nexport function getExpoPlistPath(projectRoot: string): string {\n const supportingPath = getSupportingPath(projectRoot);\n return path.join(supportingPath, 'Expo.plist');\n}\n\nfunction warnMultipleFiles({\n tag,\n fileName,\n projectRoot,\n using,\n extra,\n}: {\n tag: string;\n fileName: string;\n projectRoot?: string;\n using: string;\n extra: string[];\n}) {\n const usingPath = projectRoot ? path.relative(projectRoot, using) : using;\n const extraPaths = projectRoot ? extra.map(v => path.relative(projectRoot, v)) : extra;\n addWarningIOS(\n `paths-${tag}`,\n `Found multiple ${fileName} file paths, using \"${usingPath}\". Ignored paths: ${JSON.stringify(\n extraPaths\n )}`\n );\n}\n"],"file":"Paths.js"}
@@ -4,7 +4,7 @@ import type { XcodeProject } from 'xcode';
4
4
  import type { ConfigPlugin, Mod } from '../Plugin.types';
5
5
  import type { ExpoPlist, InfoPlist } from '../ios/IosConfig.types';
6
6
  import type { AppDelegateProjectFile } from '../ios/Paths';
7
- declare type MutateInfoPlistAction = (expo: ExpoConfig, infoPlist: InfoPlist) => InfoPlist;
7
+ declare type MutateInfoPlistAction = (expo: ExpoConfig, infoPlist: InfoPlist) => Promise<InfoPlist> | InfoPlist;
8
8
  /**
9
9
  * Helper method for creating mods from existing config functions.
10
10
  *
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugins/ios-plugins.ts"],"names":["createInfoPlistPlugin","action","name","withUnknown","config","withInfoPlist","modResults","Object","defineProperty","value","createEntitlementsPlugin","withEntitlementsPlist","withAppDelegate","platform","mod","ios","infoPlist","entitlements","withExpoPlist","withXcodeProject","withPodfileProperties"],"mappings":";;;;;;;;;AAOA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAIA;AACA;AACA;AACA;AACA;AACO,SAASA,qBAAT,CAA+BC,MAA/B,EAA8DC,IAA9D,EAA2F;AAChG,QAAMC,WAAyB,GAAGC,MAAM,IACtCC,aAAa,CAACD,MAAD,EAAS,MAAMA,MAAN,IAAgB;AACpCA,IAAAA,MAAM,CAACE,UAAP,GAAoB,MAAML,MAAM,CAACG,MAAD,EAASA,MAAM,CAACE,UAAhB,CAAhC;AACA,WAAOF,MAAP;AACD,GAHY,CADf;;AAKA,MAAIF,IAAJ,EAAU;AACRK,IAAAA,MAAM,CAACC,cAAP,CAAsBL,WAAtB,EAAmC,MAAnC,EAA2C;AACzCM,MAAAA,KAAK,EAAEP;AADkC,KAA3C;AAGD;;AACD,SAAOC,WAAP;AACD;;AAID;AACA;AACA;AACA;AACA;AACO,SAASO,wBAAT,CACLT,MADK,EAELC,IAFK,EAGS;AACd,QAAMC,WAAyB,GAAGC,MAAM,IACtCO,qBAAqB,CAACP,MAAD,EAAS,MAAMA,MAAN,IAAgB;AAC5CA,IAAAA,MAAM,CAACE,UAAP,GAAoB,MAAML,MAAM,CAACG,MAAD,EAASA,MAAM,CAACE,UAAhB,CAAhC;AACA,WAAOF,MAAP;AACD,GAHoB,CADvB;;AAKA,MAAIF,IAAJ,EAAU;AACRK,IAAAA,MAAM,CAACC,cAAP,CAAsBL,WAAtB,EAAmC,MAAnC,EAA2C;AACzCM,MAAAA,KAAK,EAAEP;AADkC,KAA3C;AAGD;;AACD,SAAOC,WAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;;;AACO,MAAMS,eAA0D,GAAG,CAACR,MAAD,EAASH,MAAT,KAAoB;AAC5F,SAAO,wBAAQG,MAAR,EAAgB;AACrBS,IAAAA,QAAQ,EAAE,KADW;AAErBC,IAAAA,GAAG,EAAE,aAFgB;AAGrBb,IAAAA;AAHqB,GAAhB,CAAP;AAKD,CANM;AAQP;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AACO,MAAMI,aAA2C,GAAG,CAACD,MAAD,EAASH,MAAT,KAAoB;AAC7E,SAAO,wBAAmBG,MAAnB,EAA2B;AAChCS,IAAAA,QAAQ,EAAE,KADsB;AAEhCC,IAAAA,GAAG,EAAE,WAF2B;;AAGhC,UAAMb,MAAN,CAAaG,MAAb,EAAqB;AACnBA,MAAAA,MAAM,GAAG,MAAMH,MAAM,CAACG,MAAD,CAArB;;AACA,UAAI,CAACA,MAAM,CAACW,GAAZ,EAAiB;AACfX,QAAAA,MAAM,CAACW,GAAP,GAAa,EAAb;AACD;;AACDX,MAAAA,MAAM,CAACW,GAAP,CAAWC,SAAX,GAAuBZ,MAAM,CAACE,UAA9B;AACA,aAAOF,MAAP;AACD;;AAV+B,GAA3B,CAAP;AAYD,CAbM;AAeP;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AACO,MAAMO,qBAAoD,GAAG,CAACP,MAAD,EAASH,MAAT,KAAoB;AACtF,SAAO,wBAAoBG,MAApB,EAA4B;AACjCS,IAAAA,QAAQ,EAAE,KADuB;AAEjCC,IAAAA,GAAG,EAAE,cAF4B;;AAGjC,UAAMb,MAAN,CAAaG,MAAb,EAAqB;AACnBA,MAAAA,MAAM,GAAG,MAAMH,MAAM,CAACG,MAAD,CAArB;;AACA,UAAI,CAACA,MAAM,CAACW,GAAZ,EAAiB;AACfX,QAAAA,MAAM,CAACW,GAAP,GAAa,EAAb;AACD;;AACDX,MAAAA,MAAM,CAACW,GAAP,CAAWE,YAAX,GAA0Bb,MAAM,CAACE,UAAjC;AACA,aAAOF,MAAP;AACD;;AAVgC,GAA5B,CAAP;AAYD,CAbM;AAeP;AACA;AACA;AACA;AACA;AACA;;;;;AACO,MAAMc,aAA2C,GAAG,CAACd,MAAD,EAASH,MAAT,KAAoB;AAC7E,SAAO,wBAAQG,MAAR,EAAgB;AACrBS,IAAAA,QAAQ,EAAE,KADW;AAErBC,IAAAA,GAAG,EAAE,WAFgB;AAGrBb,IAAAA;AAHqB,GAAhB,CAAP;AAKD,CANM;AAQP;AACA;AACA;AACA;AACA;AACA;;;;;AACO,MAAMkB,gBAAiD,GAAG,CAACf,MAAD,EAASH,MAAT,KAAoB;AACnF,SAAO,wBAAQG,MAAR,EAAgB;AACrBS,IAAAA,QAAQ,EAAE,KADW;AAErBC,IAAAA,GAAG,EAAE,WAFgB;AAGrBb,IAAAA;AAHqB,GAAhB,CAAP;AAKD,CANM;AAQP;AACA;AACA;AACA;AACA;AACA;;;;;AACO,MAAMmB,qBAAmE,GAAG,CACjFhB,MADiF,EAEjFH,MAFiF,KAG9E;AACH,SAAO,wBAAQG,MAAR,EAAgB;AACrBS,IAAAA,QAAQ,EAAE,KADW;AAErBC,IAAAA,GAAG,EAAE,mBAFgB;AAGrBb,IAAAA;AAHqB,GAAhB,CAAP;AAKD,CATM","sourcesContent":["import type { ExpoConfig } from '@expo/config-types';\nimport type { JSONObject, JSONValue } from '@expo/json-file';\nimport type { XcodeProject } from 'xcode';\n\nimport type { ConfigPlugin, Mod } from '../Plugin.types';\nimport type { ExpoPlist, InfoPlist } from '../ios/IosConfig.types';\nimport type { AppDelegateProjectFile } from '../ios/Paths';\nimport { withMod } from './withMod';\n\ntype MutateInfoPlistAction = (expo: ExpoConfig, infoPlist: InfoPlist) => InfoPlist;\n\n/**\n * Helper method for creating mods from existing config functions.\n *\n * @param action\n */\nexport function createInfoPlistPlugin(action: MutateInfoPlistAction, name?: string): ConfigPlugin {\n const withUnknown: ConfigPlugin = config =>\n withInfoPlist(config, async config => {\n config.modResults = await action(config, config.modResults);\n return config;\n });\n if (name) {\n Object.defineProperty(withUnknown, 'name', {\n value: name,\n });\n }\n return withUnknown;\n}\n\ntype MutateEntitlementsPlistAction = (expo: ExpoConfig, entitlements: JSONObject) => JSONObject;\n\n/**\n * Helper method for creating mods from existing config functions.\n *\n * @param action\n */\nexport function createEntitlementsPlugin(\n action: MutateEntitlementsPlistAction,\n name: string\n): ConfigPlugin {\n const withUnknown: ConfigPlugin = config =>\n withEntitlementsPlist(config, async config => {\n config.modResults = await action(config, config.modResults);\n return config;\n });\n if (name) {\n Object.defineProperty(withUnknown, 'name', {\n value: name,\n });\n }\n return withUnknown;\n}\n\n/**\n * Provides the AppDelegate file for modification.\n *\n * @param config\n * @param action\n */\nexport const withAppDelegate: ConfigPlugin<Mod<AppDelegateProjectFile>> = (config, action) => {\n return withMod(config, {\n platform: 'ios',\n mod: 'appDelegate',\n action,\n });\n};\n\n/**\n * Provides the Info.plist file for modification.\n * Keeps the config's expo.ios.infoPlist object in sync with the data.\n *\n * @param config\n * @param action\n */\nexport const withInfoPlist: ConfigPlugin<Mod<InfoPlist>> = (config, action) => {\n return withMod<InfoPlist>(config, {\n platform: 'ios',\n mod: 'infoPlist',\n async action(config) {\n config = await action(config);\n if (!config.ios) {\n config.ios = {};\n }\n config.ios.infoPlist = config.modResults;\n return config;\n },\n });\n};\n\n/**\n * Provides the main .entitlements file for modification.\n * Keeps the config's expo.ios.entitlements object in sync with the data.\n *\n * @param config\n * @param action\n */\nexport const withEntitlementsPlist: ConfigPlugin<Mod<JSONObject>> = (config, action) => {\n return withMod<JSONObject>(config, {\n platform: 'ios',\n mod: 'entitlements',\n async action(config) {\n config = await action(config);\n if (!config.ios) {\n config.ios = {};\n }\n config.ios.entitlements = config.modResults;\n return config;\n },\n });\n};\n\n/**\n * Provides the Expo.plist for modification.\n *\n * @param config\n * @param action\n */\nexport const withExpoPlist: ConfigPlugin<Mod<ExpoPlist>> = (config, action) => {\n return withMod(config, {\n platform: 'ios',\n mod: 'expoPlist',\n action,\n });\n};\n\n/**\n * Provides the main .xcodeproj for modification.\n *\n * @param config\n * @param action\n */\nexport const withXcodeProject: ConfigPlugin<Mod<XcodeProject>> = (config, action) => {\n return withMod(config, {\n platform: 'ios',\n mod: 'xcodeproj',\n action,\n });\n};\n\n/**\n * Provides the Podfile.properties.json for modification.\n *\n * @param config\n * @param action\n */\nexport const withPodfileProperties: ConfigPlugin<Mod<Record<string, JSONValue>>> = (\n config,\n action\n) => {\n return withMod(config, {\n platform: 'ios',\n mod: 'podfileProperties',\n action,\n });\n};\n"],"file":"ios-plugins.js"}
1
+ {"version":3,"sources":["../../src/plugins/ios-plugins.ts"],"names":["createInfoPlistPlugin","action","name","withUnknown","config","withInfoPlist","modResults","Object","defineProperty","value","createEntitlementsPlugin","withEntitlementsPlist","withAppDelegate","platform","mod","ios","infoPlist","entitlements","withExpoPlist","withXcodeProject","withPodfileProperties"],"mappings":"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","sourcesContent":["import type { ExpoConfig } from '@expo/config-types';\nimport type { JSONObject, JSONValue } from '@expo/json-file';\nimport type { XcodeProject } from 'xcode';\n\nimport type { ConfigPlugin, Mod } from '../Plugin.types';\nimport type { ExpoPlist, InfoPlist } from '../ios/IosConfig.types';\nimport type { AppDelegateProjectFile } from '../ios/Paths';\nimport { withMod } from './withMod';\n\ntype MutateInfoPlistAction = (\n expo: ExpoConfig,\n infoPlist: InfoPlist\n) => Promise<InfoPlist> | InfoPlist;\n\n/**\n * Helper method for creating mods from existing config functions.\n *\n * @param action\n */\nexport function createInfoPlistPlugin(action: MutateInfoPlistAction, name?: string): ConfigPlugin {\n const withUnknown: ConfigPlugin = config =>\n withInfoPlist(config, async config => {\n config.modResults = await action(config, config.modResults);\n return config;\n });\n if (name) {\n Object.defineProperty(withUnknown, 'name', {\n value: name,\n });\n }\n return withUnknown;\n}\n\ntype MutateEntitlementsPlistAction = (expo: ExpoConfig, entitlements: JSONObject) => JSONObject;\n\n/**\n * Helper method for creating mods from existing config functions.\n *\n * @param action\n */\nexport function createEntitlementsPlugin(\n action: MutateEntitlementsPlistAction,\n name: string\n): ConfigPlugin {\n const withUnknown: ConfigPlugin = config =>\n withEntitlementsPlist(config, async config => {\n config.modResults = await action(config, config.modResults);\n return config;\n });\n if (name) {\n Object.defineProperty(withUnknown, 'name', {\n value: name,\n });\n }\n return withUnknown;\n}\n\n/**\n * Provides the AppDelegate file for modification.\n *\n * @param config\n * @param action\n */\nexport const withAppDelegate: ConfigPlugin<Mod<AppDelegateProjectFile>> = (config, action) => {\n return withMod(config, {\n platform: 'ios',\n mod: 'appDelegate',\n action,\n });\n};\n\n/**\n * Provides the Info.plist file for modification.\n * Keeps the config's expo.ios.infoPlist object in sync with the data.\n *\n * @param config\n * @param action\n */\nexport const withInfoPlist: ConfigPlugin<Mod<InfoPlist>> = (config, action) => {\n return withMod<InfoPlist>(config, {\n platform: 'ios',\n mod: 'infoPlist',\n async action(config) {\n config = await action(config);\n if (!config.ios) {\n config.ios = {};\n }\n config.ios.infoPlist = config.modResults;\n return config;\n },\n });\n};\n\n/**\n * Provides the main .entitlements file for modification.\n * Keeps the config's expo.ios.entitlements object in sync with the data.\n *\n * @param config\n * @param action\n */\nexport const withEntitlementsPlist: ConfigPlugin<Mod<JSONObject>> = (config, action) => {\n return withMod<JSONObject>(config, {\n platform: 'ios',\n mod: 'entitlements',\n async action(config) {\n config = await action(config);\n if (!config.ios) {\n config.ios = {};\n }\n config.ios.entitlements = config.modResults;\n return config;\n },\n });\n};\n\n/**\n * Provides the Expo.plist for modification.\n *\n * @param config\n * @param action\n */\nexport const withExpoPlist: ConfigPlugin<Mod<ExpoPlist>> = (config, action) => {\n return withMod(config, {\n platform: 'ios',\n mod: 'expoPlist',\n action,\n });\n};\n\n/**\n * Provides the main .xcodeproj for modification.\n *\n * @param config\n * @param action\n */\nexport const withXcodeProject: ConfigPlugin<Mod<XcodeProject>> = (config, action) => {\n return withMod(config, {\n platform: 'ios',\n mod: 'xcodeproj',\n action,\n });\n};\n\n/**\n * Provides the Podfile.properties.json for modification.\n *\n * @param config\n * @param action\n */\nexport const withPodfileProperties: ConfigPlugin<Mod<Record<string, JSONValue>>> = (\n config,\n action\n) => {\n return withMod(config, {\n platform: 'ios',\n mod: 'podfileProperties',\n action,\n });\n};\n"],"file":"ios-plugins.js"}
@@ -85,9 +85,6 @@ function getAndroidManifestTemplate(config) {
85
85
  <uses-permission android:name="android.permission.INTERNET"/>
86
86
  <!-- OPTIONAL PERMISSIONS, REMOVE WHATEVER YOU DO NOT NEED -->
87
87
  <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
88
- <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
89
- <uses-permission android:name="android.permission.VIBRATE"/>
90
- <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
91
88
  <!-- These require runtime permissions on M -->
92
89
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
93
90
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugins/withAndroidBaseMods.ts"],"names":["readFile","writeFile","promises","getAndroidManifestTemplate","config","android","package","sortAndroidManifest","obj","manifest","reverseSortString","Array","isArray","sort","a","b","$","application","map","defaultProviders","dangerous","getFilePath","read","filePath","modResults","write","isIntrospective","modRequest","platformProjectRoot","path","join","Manifest","readAndroidManifestAsync","error","introspect","writeAndroidManifestAsync","gradleProperties","Properties","parsePropertiesFile","propertiesListToString","strings","projectRoot","Strings","getProjectStringsXMLPathAsync","Resources","readResourcesXMLAsync","resources","xml","colors","Colors","getProjectColorsXMLPathAsync","colorsNight","kind","styles","Styles","getProjectStylesXMLPathAsync","fallback","projectBuildGradle","Paths","getProjectBuildGradleFilePath","getFileInfo","contents","settingsGradle","getSettingsGradleFilePath","appBuildGradle","getAppBuildGradleFilePath","mainActivity","getProjectFilePath","mainApplication","withAndroidBaseMods","providers","props","platform","getAndroidModFileProviders"],"mappings":"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","sourcesContent":["import { promises } from 'fs';\nimport path from 'path';\n\nimport { ExportedConfig, ModConfig } from '../Plugin.types';\nimport { Colors, Manifest, Paths, Properties, Resources, Strings, Styles } from '../android';\nimport { AndroidManifest } from '../android/Manifest';\nimport { parseXMLAsync, writeXMLAsync } from '../utils/XML';\nimport { reverseSortString, sortObject, sortObjWithOrder } from '../utils/sortObject';\nimport { ForwardedBaseModOptions, provider, withGeneratedBaseMods } from './createBaseMod';\n\nconst { readFile, writeFile } = promises;\n\ntype AndroidModName = keyof Required<ModConfig>['android'];\n\nfunction getAndroidManifestTemplate(config: ExportedConfig) {\n // Keep in sync with https://github.com/expo/expo/blob/master/templates/expo-template-bare-minimum/android/app/src/main/AndroidManifest.xml\n // TODO: Read from remote template when possible\n return parseXMLAsync(`\n <manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" package=\"${\n config.android?.package ?? 'com.placeholder.appid'\n }\">\n\n <uses-permission android:name=\"android.permission.INTERNET\"/>\n <!-- OPTIONAL PERMISSIONS, REMOVE WHATEVER YOU DO NOT NEED -->\n <uses-permission android:name=\"android.permission.SYSTEM_ALERT_WINDOW\"/>\n <uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>\n <uses-permission android:name=\"android.permission.VIBRATE\"/>\n <uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>\n <!-- These require runtime permissions on M -->\n <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>\n <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>\n <!-- END OPTIONAL PERMISSIONS -->\n\n <queries>\n <!-- Support checking for http(s) links via the Linking API -->\n <intent>\n <action android:name=\"android.intent.action.VIEW\" />\n <category android:name=\"android.intent.category.BROWSABLE\" />\n <data android:scheme=\"https\" />\n </intent>\n </queries>\n\n <application\n android:name=\".MainApplication\"\n android:label=\"@string/app_name\"\n android:icon=\"@mipmap/ic_launcher\"\n android:roundIcon=\"@mipmap/ic_launcher_round\"\n android:allowBackup=\"false\"\n android:theme=\"@style/AppTheme\"\n android:usesCleartextTraffic=\"true\"\n >\n <meta-data android:name=\"expo.modules.updates.EXPO_UPDATE_URL\" android:value=\"YOUR-APP-URL-HERE\"/>\n <meta-data android:name=\"expo.modules.updates.EXPO_SDK_VERSION\" android:value=\"YOUR-APP-SDK-VERSION-HERE\"/>\n <activity\n android:name=\".MainActivity\"\n android:label=\"@string/app_name\"\n android:configChanges=\"keyboard|keyboardHidden|orientation|screenSize|uiMode\"\n android:launchMode=\"singleTask\"\n android:windowSoftInputMode=\"adjustResize\"\n android:theme=\"@style/Theme.App.SplashScreen\"\n >\n <intent-filter>\n <action android:name=\"android.intent.action.MAIN\"/>\n <category android:name=\"android.intent.category.LAUNCHER\"/>\n </intent-filter>\n </activity>\n <activity android:name=\"com.facebook.react.devsupport.DevSettingsActivity\"/>\n </application>\n </manifest>\n `) as Promise<AndroidManifest>;\n}\n\nexport function sortAndroidManifest(obj: AndroidManifest) {\n if (obj.manifest) {\n // Reverse sort so application is last and permissions are first\n obj.manifest = sortObject(obj.manifest, reverseSortString);\n\n if (Array.isArray(obj.manifest['uses-permission'])) {\n // Sort permissions alphabetically\n obj.manifest['uses-permission'].sort((a, b) => {\n if (a.$['android:name'] < b.$['android:name']) return -1;\n if (a.$['android:name'] > b.$['android:name']) return 1;\n return 0;\n });\n }\n\n if (Array.isArray(obj.manifest.application)) {\n // reverse sort applications so activity is towards the end and meta-data is towards the front.\n obj.manifest.application = obj.manifest.application.map(application => {\n application = sortObjWithOrder(application, ['meta-data', 'service', 'activity']);\n\n if (Array.isArray(application['meta-data'])) {\n // Sort metadata alphabetically\n application['meta-data'].sort((a, b) => {\n if (a.$['android:name'] < b.$['android:name']) return -1;\n if (a.$['android:name'] > b.$['android:name']) return 1;\n return 0;\n });\n }\n return application;\n });\n }\n }\n return obj;\n}\n\nconst defaultProviders = {\n dangerous: provider<unknown>({\n getFilePath() {\n return '';\n },\n async read() {\n return { filePath: '', modResults: {} };\n },\n async write() {},\n }),\n\n // Append a rule to supply gradle.properties data to mods on `mods.android.gradleProperties`\n manifest: provider<Manifest.AndroidManifest>({\n isIntrospective: true,\n getFilePath({ modRequest: { platformProjectRoot } }) {\n return path.join(platformProjectRoot, 'app/src/main/AndroidManifest.xml');\n },\n async read(filePath, config) {\n try {\n return await Manifest.readAndroidManifestAsync(filePath);\n } catch (error: any) {\n if (!config.modRequest.introspect) {\n throw error;\n }\n }\n return await getAndroidManifestTemplate(config);\n },\n async write(filePath, { modResults, modRequest: { introspect } }) {\n if (introspect) return;\n await Manifest.writeAndroidManifestAsync(filePath, sortAndroidManifest(modResults));\n },\n }),\n\n // Append a rule to supply gradle.properties data to mods on `mods.android.gradleProperties`\n gradleProperties: provider<Properties.PropertiesItem[]>({\n isIntrospective: true,\n\n getFilePath({ modRequest: { platformProjectRoot } }) {\n return path.join(platformProjectRoot, 'gradle.properties');\n },\n async read(filePath, config) {\n try {\n return await Properties.parsePropertiesFile(await readFile(filePath, 'utf8'));\n } catch (error) {\n if (!config.modRequest.introspect) {\n throw error;\n }\n }\n return [];\n },\n async write(filePath, { modResults, modRequest: { introspect } }) {\n if (introspect) return;\n await writeFile(filePath, Properties.propertiesListToString(modResults));\n },\n }),\n\n // Append a rule to supply strings.xml data to mods on `mods.android.strings`\n strings: provider<Resources.ResourceXML>({\n isIntrospective: true,\n\n async getFilePath({ modRequest: { projectRoot, introspect } }) {\n try {\n return await Strings.getProjectStringsXMLPathAsync(projectRoot);\n } catch (error: any) {\n if (!introspect) {\n throw error;\n }\n }\n return '';\n },\n\n async read(filePath, config) {\n try {\n return await Resources.readResourcesXMLAsync({ path: filePath });\n } catch (error) {\n if (!config.modRequest.introspect) {\n throw error;\n }\n }\n return { resources: {} };\n },\n async write(filePath, { modResults, modRequest: { introspect } }) {\n if (introspect) return;\n await writeXMLAsync({ path: filePath, xml: modResults });\n },\n }),\n\n colors: provider<Resources.ResourceXML>({\n isIntrospective: true,\n\n async getFilePath({ modRequest: { projectRoot, introspect } }) {\n try {\n return await Colors.getProjectColorsXMLPathAsync(projectRoot);\n } catch (error: any) {\n if (!introspect) {\n throw error;\n }\n }\n return '';\n },\n\n async read(filePath, { modRequest: { introspect } }) {\n try {\n return await Resources.readResourcesXMLAsync({ path: filePath });\n } catch (error: any) {\n if (!introspect) {\n throw error;\n }\n }\n return { resources: {} };\n },\n async write(filePath, { modResults, modRequest: { introspect } }) {\n if (introspect) return;\n await writeXMLAsync({ path: filePath, xml: modResults });\n },\n }),\n\n colorsNight: provider<Resources.ResourceXML>({\n isIntrospective: true,\n\n async getFilePath({ modRequest: { projectRoot, introspect } }) {\n try {\n return await Colors.getProjectColorsXMLPathAsync(projectRoot, { kind: 'values-night' });\n } catch (error: any) {\n if (!introspect) {\n throw error;\n }\n }\n return '';\n },\n async read(filePath, config) {\n try {\n return await Resources.readResourcesXMLAsync({ path: filePath });\n } catch (error: any) {\n if (!config.modRequest.introspect) {\n throw error;\n }\n }\n return { resources: {} };\n },\n async write(filePath, { modResults, modRequest: { introspect } }) {\n if (introspect) return;\n await writeXMLAsync({ path: filePath, xml: modResults });\n },\n }),\n\n styles: provider<Resources.ResourceXML>({\n isIntrospective: true,\n\n async getFilePath({ modRequest: { projectRoot, introspect } }) {\n try {\n return await Styles.getProjectStylesXMLPathAsync(projectRoot);\n } catch (error: any) {\n if (!introspect) {\n throw error;\n }\n }\n return '';\n },\n async read(filePath, config) {\n let styles: Resources.ResourceXML = { resources: {} };\n\n try {\n // Adds support for `tools:x`\n styles = await Resources.readResourcesXMLAsync({\n path: filePath,\n fallback: `<?xml version=\"1.0\" encoding=\"utf-8\"?><resources xmlns:tools=\"http://schemas.android.com/tools\"></resources>`,\n });\n } catch (error: any) {\n if (!config.modRequest.introspect) {\n throw error;\n }\n }\n\n // Ensure support for tools is added...\n if (!styles.resources.$) {\n styles.resources.$ = {};\n }\n if (!styles.resources.$?.['xmlns:tools']) {\n styles.resources.$['xmlns:tools'] = 'http://schemas.android.com/tools';\n }\n return styles;\n },\n async write(filePath, { modResults, modRequest: { introspect } }) {\n if (introspect) return;\n await writeXMLAsync({ path: filePath, xml: modResults });\n },\n }),\n\n projectBuildGradle: provider<Paths.GradleProjectFile>({\n getFilePath({ modRequest: { projectRoot } }) {\n return Paths.getProjectBuildGradleFilePath(projectRoot);\n },\n async read(filePath) {\n return Paths.getFileInfo(filePath);\n },\n async write(filePath, { modResults: { contents } }) {\n await writeFile(filePath, contents);\n },\n }),\n\n settingsGradle: provider<Paths.GradleProjectFile>({\n getFilePath({ modRequest: { projectRoot } }) {\n return Paths.getSettingsGradleFilePath(projectRoot);\n },\n async read(filePath) {\n return Paths.getFileInfo(filePath);\n },\n async write(filePath, { modResults: { contents } }) {\n await writeFile(filePath, contents);\n },\n }),\n\n appBuildGradle: provider<Paths.GradleProjectFile>({\n getFilePath({ modRequest: { projectRoot } }) {\n return Paths.getAppBuildGradleFilePath(projectRoot);\n },\n async read(filePath) {\n return Paths.getFileInfo(filePath);\n },\n async write(filePath, { modResults: { contents } }) {\n await writeFile(filePath, contents);\n },\n }),\n\n mainActivity: provider<Paths.ApplicationProjectFile>({\n getFilePath({ modRequest: { projectRoot } }) {\n return Paths.getProjectFilePath(projectRoot, 'MainActivity');\n },\n async read(filePath) {\n return Paths.getFileInfo(filePath);\n },\n async write(filePath, { modResults: { contents } }) {\n await writeFile(filePath, contents);\n },\n }),\n\n mainApplication: provider<Paths.ApplicationProjectFile>({\n getFilePath({ modRequest: { projectRoot } }) {\n return Paths.getProjectFilePath(projectRoot, 'MainApplication');\n },\n async read(filePath) {\n return Paths.getFileInfo(filePath);\n },\n async write(filePath, { modResults: { contents } }) {\n await writeFile(filePath, contents);\n },\n }),\n};\n\ntype AndroidDefaultProviders = typeof defaultProviders;\n\nexport function withAndroidBaseMods(\n config: ExportedConfig,\n {\n providers,\n ...props\n }: ForwardedBaseModOptions & { providers?: Partial<AndroidDefaultProviders> } = {}\n): ExportedConfig {\n return withGeneratedBaseMods<AndroidModName>(config, {\n ...props,\n platform: 'android',\n providers: providers ?? getAndroidModFileProviders(),\n });\n}\n\nexport function getAndroidModFileProviders() {\n return defaultProviders;\n}\n"],"file":"withAndroidBaseMods.js"}
1
+ {"version":3,"sources":["../../src/plugins/withAndroidBaseMods.ts"],"names":["readFile","writeFile","promises","getAndroidManifestTemplate","config","android","package","sortAndroidManifest","obj","manifest","reverseSortString","Array","isArray","sort","a","b","$","application","map","defaultProviders","dangerous","getFilePath","read","filePath","modResults","write","isIntrospective","modRequest","platformProjectRoot","path","join","Manifest","readAndroidManifestAsync","error","introspect","writeAndroidManifestAsync","gradleProperties","Properties","parsePropertiesFile","propertiesListToString","strings","projectRoot","Strings","getProjectStringsXMLPathAsync","Resources","readResourcesXMLAsync","resources","xml","colors","Colors","getProjectColorsXMLPathAsync","colorsNight","kind","styles","Styles","getProjectStylesXMLPathAsync","fallback","projectBuildGradle","Paths","getProjectBuildGradleFilePath","getFileInfo","contents","settingsGradle","getSettingsGradleFilePath","appBuildGradle","getAppBuildGradleFilePath","mainActivity","getProjectFilePath","mainApplication","withAndroidBaseMods","providers","props","platform","getAndroidModFileProviders"],"mappings":"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","sourcesContent":["import { promises } from 'fs';\nimport path from 'path';\n\nimport { ExportedConfig, ModConfig } from '../Plugin.types';\nimport { Colors, Manifest, Paths, Properties, Resources, Strings, Styles } from '../android';\nimport { AndroidManifest } from '../android/Manifest';\nimport { parseXMLAsync, writeXMLAsync } from '../utils/XML';\nimport { reverseSortString, sortObject, sortObjWithOrder } from '../utils/sortObject';\nimport { ForwardedBaseModOptions, provider, withGeneratedBaseMods } from './createBaseMod';\n\nconst { readFile, writeFile } = promises;\n\ntype AndroidModName = keyof Required<ModConfig>['android'];\n\nfunction getAndroidManifestTemplate(config: ExportedConfig) {\n // Keep in sync with https://github.com/expo/expo/blob/master/templates/expo-template-bare-minimum/android/app/src/main/AndroidManifest.xml\n // TODO: Read from remote template when possible\n return parseXMLAsync(`\n <manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" package=\"${\n config.android?.package ?? 'com.placeholder.appid'\n }\">\n\n <uses-permission android:name=\"android.permission.INTERNET\"/>\n <!-- OPTIONAL PERMISSIONS, REMOVE WHATEVER YOU DO NOT NEED -->\n <uses-permission android:name=\"android.permission.SYSTEM_ALERT_WINDOW\"/>\n <!-- These require runtime permissions on M -->\n <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>\n <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>\n <!-- END OPTIONAL PERMISSIONS -->\n\n <queries>\n <!-- Support checking for http(s) links via the Linking API -->\n <intent>\n <action android:name=\"android.intent.action.VIEW\" />\n <category android:name=\"android.intent.category.BROWSABLE\" />\n <data android:scheme=\"https\" />\n </intent>\n </queries>\n\n <application\n android:name=\".MainApplication\"\n android:label=\"@string/app_name\"\n android:icon=\"@mipmap/ic_launcher\"\n android:roundIcon=\"@mipmap/ic_launcher_round\"\n android:allowBackup=\"false\"\n android:theme=\"@style/AppTheme\"\n android:usesCleartextTraffic=\"true\"\n >\n <meta-data android:name=\"expo.modules.updates.EXPO_UPDATE_URL\" android:value=\"YOUR-APP-URL-HERE\"/>\n <meta-data android:name=\"expo.modules.updates.EXPO_SDK_VERSION\" android:value=\"YOUR-APP-SDK-VERSION-HERE\"/>\n <activity\n android:name=\".MainActivity\"\n android:label=\"@string/app_name\"\n android:configChanges=\"keyboard|keyboardHidden|orientation|screenSize|uiMode\"\n android:launchMode=\"singleTask\"\n android:windowSoftInputMode=\"adjustResize\"\n android:theme=\"@style/Theme.App.SplashScreen\"\n >\n <intent-filter>\n <action android:name=\"android.intent.action.MAIN\"/>\n <category android:name=\"android.intent.category.LAUNCHER\"/>\n </intent-filter>\n </activity>\n <activity android:name=\"com.facebook.react.devsupport.DevSettingsActivity\"/>\n </application>\n </manifest>\n `) as Promise<AndroidManifest>;\n}\n\nexport function sortAndroidManifest(obj: AndroidManifest) {\n if (obj.manifest) {\n // Reverse sort so application is last and permissions are first\n obj.manifest = sortObject(obj.manifest, reverseSortString);\n\n if (Array.isArray(obj.manifest['uses-permission'])) {\n // Sort permissions alphabetically\n obj.manifest['uses-permission'].sort((a, b) => {\n if (a.$['android:name'] < b.$['android:name']) return -1;\n if (a.$['android:name'] > b.$['android:name']) return 1;\n return 0;\n });\n }\n\n if (Array.isArray(obj.manifest.application)) {\n // reverse sort applications so activity is towards the end and meta-data is towards the front.\n obj.manifest.application = obj.manifest.application.map(application => {\n application = sortObjWithOrder(application, ['meta-data', 'service', 'activity']);\n\n if (Array.isArray(application['meta-data'])) {\n // Sort metadata alphabetically\n application['meta-data'].sort((a, b) => {\n if (a.$['android:name'] < b.$['android:name']) return -1;\n if (a.$['android:name'] > b.$['android:name']) return 1;\n return 0;\n });\n }\n return application;\n });\n }\n }\n return obj;\n}\n\nconst defaultProviders = {\n dangerous: provider<unknown>({\n getFilePath() {\n return '';\n },\n async read() {\n return { filePath: '', modResults: {} };\n },\n async write() {},\n }),\n\n // Append a rule to supply gradle.properties data to mods on `mods.android.gradleProperties`\n manifest: provider<Manifest.AndroidManifest>({\n isIntrospective: true,\n getFilePath({ modRequest: { platformProjectRoot } }) {\n return path.join(platformProjectRoot, 'app/src/main/AndroidManifest.xml');\n },\n async read(filePath, config) {\n try {\n return await Manifest.readAndroidManifestAsync(filePath);\n } catch (error: any) {\n if (!config.modRequest.introspect) {\n throw error;\n }\n }\n return await getAndroidManifestTemplate(config);\n },\n async write(filePath, { modResults, modRequest: { introspect } }) {\n if (introspect) return;\n await Manifest.writeAndroidManifestAsync(filePath, sortAndroidManifest(modResults));\n },\n }),\n\n // Append a rule to supply gradle.properties data to mods on `mods.android.gradleProperties`\n gradleProperties: provider<Properties.PropertiesItem[]>({\n isIntrospective: true,\n\n getFilePath({ modRequest: { platformProjectRoot } }) {\n return path.join(platformProjectRoot, 'gradle.properties');\n },\n async read(filePath, config) {\n try {\n return await Properties.parsePropertiesFile(await readFile(filePath, 'utf8'));\n } catch (error) {\n if (!config.modRequest.introspect) {\n throw error;\n }\n }\n return [];\n },\n async write(filePath, { modResults, modRequest: { introspect } }) {\n if (introspect) return;\n await writeFile(filePath, Properties.propertiesListToString(modResults));\n },\n }),\n\n // Append a rule to supply strings.xml data to mods on `mods.android.strings`\n strings: provider<Resources.ResourceXML>({\n isIntrospective: true,\n\n async getFilePath({ modRequest: { projectRoot, introspect } }) {\n try {\n return await Strings.getProjectStringsXMLPathAsync(projectRoot);\n } catch (error: any) {\n if (!introspect) {\n throw error;\n }\n }\n return '';\n },\n\n async read(filePath, config) {\n try {\n return await Resources.readResourcesXMLAsync({ path: filePath });\n } catch (error) {\n if (!config.modRequest.introspect) {\n throw error;\n }\n }\n return { resources: {} };\n },\n async write(filePath, { modResults, modRequest: { introspect } }) {\n if (introspect) return;\n await writeXMLAsync({ path: filePath, xml: modResults });\n },\n }),\n\n colors: provider<Resources.ResourceXML>({\n isIntrospective: true,\n\n async getFilePath({ modRequest: { projectRoot, introspect } }) {\n try {\n return await Colors.getProjectColorsXMLPathAsync(projectRoot);\n } catch (error: any) {\n if (!introspect) {\n throw error;\n }\n }\n return '';\n },\n\n async read(filePath, { modRequest: { introspect } }) {\n try {\n return await Resources.readResourcesXMLAsync({ path: filePath });\n } catch (error: any) {\n if (!introspect) {\n throw error;\n }\n }\n return { resources: {} };\n },\n async write(filePath, { modResults, modRequest: { introspect } }) {\n if (introspect) return;\n await writeXMLAsync({ path: filePath, xml: modResults });\n },\n }),\n\n colorsNight: provider<Resources.ResourceXML>({\n isIntrospective: true,\n\n async getFilePath({ modRequest: { projectRoot, introspect } }) {\n try {\n return await Colors.getProjectColorsXMLPathAsync(projectRoot, { kind: 'values-night' });\n } catch (error: any) {\n if (!introspect) {\n throw error;\n }\n }\n return '';\n },\n async read(filePath, config) {\n try {\n return await Resources.readResourcesXMLAsync({ path: filePath });\n } catch (error: any) {\n if (!config.modRequest.introspect) {\n throw error;\n }\n }\n return { resources: {} };\n },\n async write(filePath, { modResults, modRequest: { introspect } }) {\n if (introspect) return;\n await writeXMLAsync({ path: filePath, xml: modResults });\n },\n }),\n\n styles: provider<Resources.ResourceXML>({\n isIntrospective: true,\n\n async getFilePath({ modRequest: { projectRoot, introspect } }) {\n try {\n return await Styles.getProjectStylesXMLPathAsync(projectRoot);\n } catch (error: any) {\n if (!introspect) {\n throw error;\n }\n }\n return '';\n },\n async read(filePath, config) {\n let styles: Resources.ResourceXML = { resources: {} };\n\n try {\n // Adds support for `tools:x`\n styles = await Resources.readResourcesXMLAsync({\n path: filePath,\n fallback: `<?xml version=\"1.0\" encoding=\"utf-8\"?><resources xmlns:tools=\"http://schemas.android.com/tools\"></resources>`,\n });\n } catch (error: any) {\n if (!config.modRequest.introspect) {\n throw error;\n }\n }\n\n // Ensure support for tools is added...\n if (!styles.resources.$) {\n styles.resources.$ = {};\n }\n if (!styles.resources.$?.['xmlns:tools']) {\n styles.resources.$['xmlns:tools'] = 'http://schemas.android.com/tools';\n }\n return styles;\n },\n async write(filePath, { modResults, modRequest: { introspect } }) {\n if (introspect) return;\n await writeXMLAsync({ path: filePath, xml: modResults });\n },\n }),\n\n projectBuildGradle: provider<Paths.GradleProjectFile>({\n getFilePath({ modRequest: { projectRoot } }) {\n return Paths.getProjectBuildGradleFilePath(projectRoot);\n },\n async read(filePath) {\n return Paths.getFileInfo(filePath);\n },\n async write(filePath, { modResults: { contents } }) {\n await writeFile(filePath, contents);\n },\n }),\n\n settingsGradle: provider<Paths.GradleProjectFile>({\n getFilePath({ modRequest: { projectRoot } }) {\n return Paths.getSettingsGradleFilePath(projectRoot);\n },\n async read(filePath) {\n return Paths.getFileInfo(filePath);\n },\n async write(filePath, { modResults: { contents } }) {\n await writeFile(filePath, contents);\n },\n }),\n\n appBuildGradle: provider<Paths.GradleProjectFile>({\n getFilePath({ modRequest: { projectRoot } }) {\n return Paths.getAppBuildGradleFilePath(projectRoot);\n },\n async read(filePath) {\n return Paths.getFileInfo(filePath);\n },\n async write(filePath, { modResults: { contents } }) {\n await writeFile(filePath, contents);\n },\n }),\n\n mainActivity: provider<Paths.ApplicationProjectFile>({\n getFilePath({ modRequest: { projectRoot } }) {\n return Paths.getProjectFilePath(projectRoot, 'MainActivity');\n },\n async read(filePath) {\n return Paths.getFileInfo(filePath);\n },\n async write(filePath, { modResults: { contents } }) {\n await writeFile(filePath, contents);\n },\n }),\n\n mainApplication: provider<Paths.ApplicationProjectFile>({\n getFilePath({ modRequest: { projectRoot } }) {\n return Paths.getProjectFilePath(projectRoot, 'MainApplication');\n },\n async read(filePath) {\n return Paths.getFileInfo(filePath);\n },\n async write(filePath, { modResults: { contents } }) {\n await writeFile(filePath, contents);\n },\n }),\n};\n\ntype AndroidDefaultProviders = typeof defaultProviders;\n\nexport function withAndroidBaseMods(\n config: ExportedConfig,\n {\n providers,\n ...props\n }: ForwardedBaseModOptions & { providers?: Partial<AndroidDefaultProviders> } = {}\n): ExportedConfig {\n return withGeneratedBaseMods<AndroidModName>(config, {\n ...props,\n platform: 'android',\n providers: providers ?? getAndroidModFileProviders(),\n });\n}\n\nexport function getAndroidModFileProviders() {\n return defaultProviders;\n}\n"],"file":"withAndroidBaseMods.js"}
@@ -15,7 +15,7 @@ export declare function getRuntimeVersionNullable(...[config, platform]: Paramet
15
15
  export declare function getRuntimeVersion(config: Pick<ExpoConfig, 'version' | 'runtimeVersion' | 'sdkVersion'> & {
16
16
  android?: Pick<Android, 'versionCode' | 'runtimeVersion'>;
17
17
  ios?: Pick<IOS, 'buildNumber' | 'runtimeVersion'>;
18
- }, platform: 'android' | 'ios'): string;
18
+ }, platform: 'android' | 'ios'): string | null;
19
19
  export declare function getSDKVersion(config: Pick<ExpoConfigUpdates, 'sdkVersion'>): string | null;
20
20
  export declare function getUpdatesEnabled(config: Pick<ExpoConfigUpdates, 'updates'>): boolean;
21
21
  export declare function getUpdatesTimeout(config: Pick<ExpoConfigUpdates, 'updates'>): number;
@@ -152,15 +152,23 @@ const withRuntimeVersion = config => {
152
152
  var _config$ios, _config$android;
153
153
 
154
154
  if ((_config$ios = config.ios) !== null && _config$ios !== void 0 && _config$ios.runtimeVersion || config.runtimeVersion) {
155
- config.ios = { ...config.ios,
156
- runtimeVersion: getRuntimeVersion(config, 'ios')
157
- };
155
+ const runtimeVersion = getRuntimeVersion(config, 'ios');
156
+
157
+ if (runtimeVersion) {
158
+ config.ios = { ...config.ios,
159
+ runtimeVersion
160
+ };
161
+ }
158
162
  }
159
163
 
160
164
  if ((_config$android = config.android) !== null && _config$android !== void 0 && _config$android.runtimeVersion || config.runtimeVersion) {
161
- config.android = { ...config.android,
162
- runtimeVersion: getRuntimeVersion(config, 'android')
163
- };
165
+ const runtimeVersion = getRuntimeVersion(config, 'android');
166
+
167
+ if (runtimeVersion) {
168
+ config.android = { ...config.android,
169
+ runtimeVersion
170
+ };
171
+ }
164
172
  }
165
173
 
166
174
  delete config.runtimeVersion;
@@ -187,7 +195,7 @@ function getRuntimeVersion(config, platform) {
187
195
  const runtimeVersion = (_config$platform$runt = (_config$platform = config[platform]) === null || _config$platform === void 0 ? void 0 : _config$platform.runtimeVersion) !== null && _config$platform$runt !== void 0 ? _config$platform$runt : config.runtimeVersion;
188
196
 
189
197
  if (!runtimeVersion) {
190
- throw new Error(`There is neither a value or a policy set for the runtime version on "${platform}"`);
198
+ return null;
191
199
  }
192
200
 
193
201
  if (typeof runtimeVersion === 'string') {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/Updates.ts"],"names":["getExpoUpdatesPackageVersion","projectRoot","expoUpdatesPackageJsonPath","resolveFrom","silent","fs","existsSync","packageJson","JSON","parse","readFileSync","version","getUpdateUrl","config","username","updates","url","user","owner","slug","getNativeVersion","platform","IOSConfig","Version","getVersion","buildNumber","getBuildNumber","versionCode","AndroidConfig","getVersionCode","Error","withRuntimeVersion","ios","runtimeVersion","getRuntimeVersion","android","getRuntimeVersionNullable","e","console","log","policy","sdkVersion","stringify","getSDKVersion","getUpdatesEnabled","enabled","getUpdatesTimeout","fallbackToCacheTimeout","getUpdatesCheckOnLaunch","expoUpdatesPackageVersion","checkAutomatically","semver","gte","getUpdatesCodeSigningCertificate","codeSigningCertificatePath","codeSigningCertificate","undefined","finalPath","path","join","getUpdatesCodeSigningMetadata","codeSigningMetadata","getUpdatesCodeSigningMetadataStringified","metadata"],"mappings":"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","sourcesContent":["import { Android, ExpoConfig, IOS } from '@expo/config-types';\nimport { getRuntimeVersionForSDKVersion } from '@expo/sdk-runtime-versions';\nimport fs from 'fs';\nimport { boolish } from 'getenv';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\nimport semver from 'semver';\n\nimport { AndroidConfig, IOSConfig } from '..';\n\nexport type ExpoConfigUpdates = Pick<\n ExpoConfig,\n 'sdkVersion' | 'owner' | 'runtimeVersion' | 'updates' | 'slug'\n>;\n\nexport function getExpoUpdatesPackageVersion(projectRoot: string): string | null {\n const expoUpdatesPackageJsonPath = resolveFrom.silent(projectRoot, 'expo-updates/package.json');\n if (!expoUpdatesPackageJsonPath || !fs.existsSync(expoUpdatesPackageJsonPath)) {\n return null;\n }\n const packageJson = JSON.parse(fs.readFileSync(expoUpdatesPackageJsonPath, 'utf8'));\n return packageJson.version;\n}\n\nexport function getUpdateUrl(\n config: Pick<ExpoConfigUpdates, 'owner' | 'slug' | 'updates'>,\n username: string | null\n): string | null {\n if (config.updates?.url) {\n return config.updates?.url;\n }\n\n const user = typeof config.owner === 'string' ? config.owner : username;\n if (!user) {\n return null;\n }\n return `https://exp.host/@${user}/${config.slug}`;\n}\n\nexport function getNativeVersion(\n config: Pick<ExpoConfig, 'version'> & {\n android?: Pick<Android, 'versionCode'>;\n ios?: Pick<IOS, 'buildNumber'>;\n },\n platform: 'android' | 'ios'\n): string {\n const version = IOSConfig.Version.getVersion(config);\n switch (platform) {\n case 'ios': {\n const buildNumber = IOSConfig.Version.getBuildNumber(config);\n return `${version}(${buildNumber})`;\n }\n case 'android': {\n const versionCode = AndroidConfig.Version.getVersionCode(config);\n return `${version}(${versionCode})`;\n }\n default: {\n throw new Error(\n `\"${platform}\" is not a supported platform. Choose either \"ios\" or \"android\".`\n );\n }\n }\n}\n\n/**\n * Compute runtime version policies.\n * @return an expoConfig with only string valued platform specific runtime versions.\n */\nexport const withRuntimeVersion: (config: ExpoConfig) => ExpoConfig = config => {\n if (config.ios?.runtimeVersion || config.runtimeVersion) {\n config.ios = {\n ...config.ios,\n runtimeVersion: getRuntimeVersion(config, 'ios'),\n };\n }\n if (config.android?.runtimeVersion || config.runtimeVersion) {\n config.android = {\n ...config.android,\n runtimeVersion: getRuntimeVersion(config, 'android'),\n };\n }\n delete config.runtimeVersion;\n return config;\n};\n\nexport function getRuntimeVersionNullable(\n ...[config, platform]: Parameters<typeof getRuntimeVersion>\n): string | null {\n try {\n return getRuntimeVersion(config, platform);\n } catch (e) {\n if (boolish('EXPO_DEBUG', false)) {\n console.log(e);\n }\n return null;\n }\n}\n\nexport function getRuntimeVersion(\n config: Pick<ExpoConfig, 'version' | 'runtimeVersion' | 'sdkVersion'> & {\n android?: Pick<Android, 'versionCode' | 'runtimeVersion'>;\n ios?: Pick<IOS, 'buildNumber' | 'runtimeVersion'>;\n },\n platform: 'android' | 'ios'\n): string {\n const runtimeVersion = config[platform]?.runtimeVersion ?? config.runtimeVersion;\n if (!runtimeVersion) {\n throw new Error(\n `There is neither a value or a policy set for the runtime version on \"${platform}\"`\n );\n }\n\n if (typeof runtimeVersion === 'string') {\n return runtimeVersion;\n } else if (runtimeVersion.policy === 'nativeVersion') {\n return getNativeVersion(config, platform);\n } else if (runtimeVersion.policy === 'sdkVersion') {\n if (!config.sdkVersion) {\n throw new Error(\"An SDK version must be defined when using the 'sdkVersion' runtime policy.\");\n }\n return getRuntimeVersionForSDKVersion(config.sdkVersion);\n }\n\n throw new Error(\n `\"${\n typeof runtimeVersion === 'object' ? JSON.stringify(runtimeVersion) : runtimeVersion\n }\" is not a valid runtime version. getRuntimeVersion only supports a string, \"sdkVersion\", or \"nativeVersion\" policy.`\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 getUpdatesCodeSigningCertificate(\n projectRoot: string,\n config: Pick<ExpoConfigUpdates, 'updates'>\n): string | undefined {\n const codeSigningCertificatePath = config.updates?.codeSigningCertificate;\n if (!codeSigningCertificatePath) {\n return undefined;\n }\n\n const finalPath = path.join(projectRoot, codeSigningCertificatePath);\n if (!fs.existsSync(finalPath)) {\n throw new Error(`File not found at \\`updates.codeSigningCertificate\\` path: ${finalPath}`);\n }\n\n return fs.readFileSync(finalPath, 'utf8');\n}\n\nexport function getUpdatesCodeSigningMetadata(\n config: Pick<ExpoConfigUpdates, 'updates'>\n): NonNullable<ExpoConfigUpdates['updates']>['codeSigningMetadata'] {\n return config.updates?.codeSigningMetadata;\n}\n\nexport function getUpdatesCodeSigningMetadataStringified(\n config: Pick<ExpoConfigUpdates, 'updates'>\n): string | undefined {\n const metadata = getUpdatesCodeSigningMetadata(config);\n if (!metadata) {\n return undefined;\n }\n\n return JSON.stringify(metadata);\n}\n"],"file":"Updates.js"}
1
+ {"version":3,"sources":["../../src/utils/Updates.ts"],"names":["getExpoUpdatesPackageVersion","projectRoot","expoUpdatesPackageJsonPath","resolveFrom","silent","fs","existsSync","packageJson","JSON","parse","readFileSync","version","getUpdateUrl","config","username","updates","url","user","owner","slug","getNativeVersion","platform","IOSConfig","Version","getVersion","buildNumber","getBuildNumber","versionCode","AndroidConfig","getVersionCode","Error","withRuntimeVersion","ios","runtimeVersion","getRuntimeVersion","android","getRuntimeVersionNullable","e","console","log","policy","sdkVersion","stringify","getSDKVersion","getUpdatesEnabled","enabled","getUpdatesTimeout","fallbackToCacheTimeout","getUpdatesCheckOnLaunch","expoUpdatesPackageVersion","checkAutomatically","semver","gte","getUpdatesCodeSigningCertificate","codeSigningCertificatePath","codeSigningCertificate","undefined","finalPath","path","join","getUpdatesCodeSigningMetadata","codeSigningMetadata","getUpdatesCodeSigningMetadataStringified","metadata"],"mappings":"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","sourcesContent":["import { Android, ExpoConfig, IOS } from '@expo/config-types';\nimport { getRuntimeVersionForSDKVersion } from '@expo/sdk-runtime-versions';\nimport fs from 'fs';\nimport { boolish } from 'getenv';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\nimport semver from 'semver';\n\nimport { AndroidConfig, IOSConfig } from '..';\n\nexport type ExpoConfigUpdates = Pick<\n ExpoConfig,\n 'sdkVersion' | 'owner' | 'runtimeVersion' | 'updates' | 'slug'\n>;\n\nexport function getExpoUpdatesPackageVersion(projectRoot: string): string | null {\n const expoUpdatesPackageJsonPath = resolveFrom.silent(projectRoot, 'expo-updates/package.json');\n if (!expoUpdatesPackageJsonPath || !fs.existsSync(expoUpdatesPackageJsonPath)) {\n return null;\n }\n const packageJson = JSON.parse(fs.readFileSync(expoUpdatesPackageJsonPath, 'utf8'));\n return packageJson.version;\n}\n\nexport function getUpdateUrl(\n config: Pick<ExpoConfigUpdates, 'owner' | 'slug' | 'updates'>,\n username: string | null\n): string | null {\n if (config.updates?.url) {\n return config.updates?.url;\n }\n\n const user = typeof config.owner === 'string' ? config.owner : username;\n if (!user) {\n return null;\n }\n return `https://exp.host/@${user}/${config.slug}`;\n}\n\nexport function getNativeVersion(\n config: Pick<ExpoConfig, 'version'> & {\n android?: Pick<Android, 'versionCode'>;\n ios?: Pick<IOS, 'buildNumber'>;\n },\n platform: 'android' | 'ios'\n): string {\n const version = IOSConfig.Version.getVersion(config);\n switch (platform) {\n case 'ios': {\n const buildNumber = IOSConfig.Version.getBuildNumber(config);\n return `${version}(${buildNumber})`;\n }\n case 'android': {\n const versionCode = AndroidConfig.Version.getVersionCode(config);\n return `${version}(${versionCode})`;\n }\n default: {\n throw new Error(\n `\"${platform}\" is not a supported platform. Choose either \"ios\" or \"android\".`\n );\n }\n }\n}\n\n/**\n * Compute runtime version policies.\n * @return an expoConfig with only string valued platform specific runtime versions.\n */\nexport const withRuntimeVersion: (config: ExpoConfig) => ExpoConfig = config => {\n if (config.ios?.runtimeVersion || config.runtimeVersion) {\n const runtimeVersion = getRuntimeVersion(config, 'ios');\n if (runtimeVersion) {\n config.ios = {\n ...config.ios,\n runtimeVersion,\n };\n }\n }\n if (config.android?.runtimeVersion || config.runtimeVersion) {\n const runtimeVersion = getRuntimeVersion(config, 'android');\n if (runtimeVersion) {\n config.android = {\n ...config.android,\n runtimeVersion,\n };\n }\n }\n delete config.runtimeVersion;\n return config;\n};\n\nexport function getRuntimeVersionNullable(\n ...[config, platform]: Parameters<typeof getRuntimeVersion>\n): string | null {\n try {\n return getRuntimeVersion(config, platform);\n } catch (e) {\n if (boolish('EXPO_DEBUG', false)) {\n console.log(e);\n }\n return null;\n }\n}\n\nexport function getRuntimeVersion(\n config: Pick<ExpoConfig, 'version' | 'runtimeVersion' | 'sdkVersion'> & {\n android?: Pick<Android, 'versionCode' | 'runtimeVersion'>;\n ios?: Pick<IOS, 'buildNumber' | 'runtimeVersion'>;\n },\n platform: 'android' | 'ios'\n): string | null {\n const runtimeVersion = config[platform]?.runtimeVersion ?? config.runtimeVersion;\n if (!runtimeVersion) {\n return null;\n }\n\n if (typeof runtimeVersion === 'string') {\n return runtimeVersion;\n } else if (runtimeVersion.policy === 'nativeVersion') {\n return getNativeVersion(config, platform);\n } else if (runtimeVersion.policy === 'sdkVersion') {\n if (!config.sdkVersion) {\n throw new Error(\"An SDK version must be defined when using the 'sdkVersion' runtime policy.\");\n }\n return getRuntimeVersionForSDKVersion(config.sdkVersion);\n }\n\n throw new Error(\n `\"${\n typeof runtimeVersion === 'object' ? JSON.stringify(runtimeVersion) : runtimeVersion\n }\" is not a valid runtime version. getRuntimeVersion only supports a string, \"sdkVersion\", or \"nativeVersion\" policy.`\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 getUpdatesCodeSigningCertificate(\n projectRoot: string,\n config: Pick<ExpoConfigUpdates, 'updates'>\n): string | undefined {\n const codeSigningCertificatePath = config.updates?.codeSigningCertificate;\n if (!codeSigningCertificatePath) {\n return undefined;\n }\n\n const finalPath = path.join(projectRoot, codeSigningCertificatePath);\n if (!fs.existsSync(finalPath)) {\n throw new Error(`File not found at \\`updates.codeSigningCertificate\\` path: ${finalPath}`);\n }\n\n return fs.readFileSync(finalPath, 'utf8');\n}\n\nexport function getUpdatesCodeSigningMetadata(\n config: Pick<ExpoConfigUpdates, 'updates'>\n): NonNullable<ExpoConfigUpdates['updates']>['codeSigningMetadata'] {\n return config.updates?.codeSigningMetadata;\n}\n\nexport function getUpdatesCodeSigningMetadataStringified(\n config: Pick<ExpoConfigUpdates, 'updates'>\n): string | undefined {\n const metadata = getUpdatesCodeSigningMetadata(config);\n if (!metadata) {\n return undefined;\n }\n\n return JSON.stringify(metadata);\n}\n"],"file":"Updates.js"}
@@ -23,3 +23,4 @@ export declare function format(manifest: any, { indentLevel, newline }?: {
23
23
  * @param value unescaped Android XML string literal.
24
24
  */
25
25
  export declare function escapeAndroidString(value: string): string;
26
+ export declare function unescapeAndroidString(value: string): string;
@@ -7,6 +7,7 @@ exports.escapeAndroidString = escapeAndroidString;
7
7
  exports.format = format;
8
8
  exports.parseXMLAsync = parseXMLAsync;
9
9
  exports.readXMLAsync = readXMLAsync;
10
+ exports.unescapeAndroidString = unescapeAndroidString;
10
11
  exports.writeXMLAsync = writeXMLAsync;
11
12
 
12
13
  function _fsExtra() {
@@ -58,6 +59,8 @@ async function writeXMLAsync(options) {
58
59
  }
59
60
 
60
61
  async function readXMLAsync(options) {
62
+ var _manifest$resources;
63
+
61
64
  let contents = '';
62
65
 
63
66
  try {
@@ -69,7 +72,20 @@ async function readXMLAsync(options) {
69
72
  }
70
73
 
71
74
  const parser = new (_xml2js().Parser)();
72
- const manifest = await parser.parseStringPromise(contents || options.fallback || '');
75
+ const manifest = await parser.parseStringPromise(contents || options.fallback || ''); // For strings.xml
76
+
77
+ if (Array.isArray(manifest === null || manifest === void 0 ? void 0 : (_manifest$resources = manifest.resources) === null || _manifest$resources === void 0 ? void 0 : _manifest$resources.string)) {
78
+ for (const string of manifest === null || manifest === void 0 ? void 0 : (_manifest$resources2 = manifest.resources) === null || _manifest$resources2 === void 0 ? void 0 : _manifest$resources2.string) {
79
+ var _manifest$resources2;
80
+
81
+ if (string.$.translatable === 'false' || string.$.translatable === false) {
82
+ continue;
83
+ }
84
+
85
+ string._ = unescapeAndroidString(string._);
86
+ }
87
+ }
88
+
73
89
  return manifest;
74
90
  }
75
91
 
@@ -89,15 +105,15 @@ function format(manifest, {
89
105
  if (typeof manifest === 'string') {
90
106
  xmlInput = manifest;
91
107
  } else if (manifest.toString) {
92
- var _manifest$resources;
108
+ var _manifest$resources3;
93
109
 
94
110
  const builder = new (_xml2js().Builder)({
95
111
  headless: true
96
112
  }); // For strings.xml
97
113
 
98
- if (Array.isArray(manifest === null || manifest === void 0 ? void 0 : (_manifest$resources = manifest.resources) === null || _manifest$resources === void 0 ? void 0 : _manifest$resources.string)) {
99
- for (const string of manifest === null || manifest === void 0 ? void 0 : (_manifest$resources2 = manifest.resources) === null || _manifest$resources2 === void 0 ? void 0 : _manifest$resources2.string) {
100
- var _manifest$resources2;
114
+ if (Array.isArray(manifest === null || manifest === void 0 ? void 0 : (_manifest$resources3 = manifest.resources) === null || _manifest$resources3 === void 0 ? void 0 : _manifest$resources3.string)) {
115
+ for (const string of manifest === null || manifest === void 0 ? void 0 : (_manifest$resources4 = manifest.resources) === null || _manifest$resources4 === void 0 ? void 0 : _manifest$resources4.string) {
116
+ var _manifest$resources4;
101
117
 
102
118
  if (string.$.translatable === 'false' || string.$.translatable === false) {
103
119
  continue;
@@ -174,4 +190,8 @@ function escapeAndroidString(value) {
174
190
 
175
191
  return value;
176
192
  }
193
+
194
+ function unescapeAndroidString(value) {
195
+ return value.replace(/\\(.)/g, '$1');
196
+ }
177
197
  //# sourceMappingURL=XML.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/XML.ts"],"names":["writeXMLAsync","options","xml","format","fs","ensureDir","path","dirname","writeFile","readXMLAsync","contents","readFile","encoding","flag","parser","Parser","manifest","parseStringPromise","fallback","parseXMLAsync","stringTimesN","n","char","Array","join","indentLevel","newline","EOL","xmlInput","toString","builder","Builder","headless","isArray","resources","string","$","translatable","_","escapeAndroidString","buildObject","Error","indentString","formatted","regex","replace","pad","split","map","line","trim","forEach","indent","match","padding","value","m"],"mappings":"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","sourcesContent":["import fs from 'fs-extra';\nimport { EOL } from 'os';\nimport path from 'path';\nimport { Builder, Parser } from 'xml2js';\n\nexport type XMLValue = boolean | number | string | null | XMLArray | XMLObject;\n\nexport interface XMLArray extends Array<XMLValue> {}\n\nexport interface XMLObject {\n [key: string]: XMLValue | undefined;\n}\n\nexport async function writeXMLAsync(options: { path: string; xml: any }): Promise<void> {\n const xml = format(options.xml);\n await fs.ensureDir(path.dirname(options.path));\n await fs.writeFile(options.path, xml);\n}\n\nexport async function readXMLAsync(options: {\n path: string;\n fallback?: string | null;\n}): Promise<XMLObject> {\n let contents: string = '';\n try {\n contents = await fs.readFile(options.path, { encoding: 'utf8', flag: 'r' });\n } catch {\n // catch and use fallback\n }\n const parser = new Parser();\n const manifest = await parser.parseStringPromise(contents || options.fallback || '');\n return manifest;\n}\n\nexport async function parseXMLAsync(contents: string): Promise<XMLObject> {\n const xml = await new Parser().parseStringPromise(contents);\n return xml;\n}\n\nconst stringTimesN = (n: number, char: string) => Array(n + 1).join(char);\n\nexport function format(manifest: any, { indentLevel = 2, newline = EOL } = {}): string {\n let xmlInput: string;\n if (typeof manifest === 'string') {\n xmlInput = manifest;\n } else if (manifest.toString) {\n const builder = new Builder({\n headless: true,\n });\n\n // For strings.xml\n if (Array.isArray(manifest?.resources?.string)) {\n for (const string of manifest?.resources?.string) {\n if (string.$.translatable === 'false' || string.$.translatable === false) {\n continue;\n }\n string._ = escapeAndroidString(string._);\n }\n }\n\n xmlInput = builder.buildObject(manifest);\n\n return xmlInput;\n } else {\n throw new Error(`Invalid XML value passed in: ${manifest}`);\n }\n const indentString = stringTimesN(indentLevel, ' ');\n\n let formatted = '';\n const regex = /(>)(<)(\\/*)/g;\n const xml = xmlInput.replace(regex, `$1${newline}$2$3`);\n let pad = 0;\n xml\n .split(/\\r?\\n/)\n .map((line: string) => line.trim())\n .forEach((line: string) => {\n let indent = 0;\n if (line.match(/.+<\\/\\w[^>]*>$/)) {\n indent = 0;\n } else if (line.match(/^<\\/\\w/)) {\n if (pad !== 0) {\n pad -= 1;\n }\n } else if (line.match(/^<\\w([^>]*[^/])?>.*$/)) {\n indent = 1;\n } else {\n indent = 0;\n }\n\n const padding = stringTimesN(pad, indentString);\n formatted += padding + line + newline;\n pad += indent;\n });\n\n return formatted.trim();\n}\n\n/**\n * Escapes Android string literals, specifically characters `\"`, `'`, `\\`, `\\n`, `\\r`, `\\t`\n *\n * @param value unescaped Android XML string literal.\n */\nexport function escapeAndroidString(value: string): string {\n value = value.replace(/[\\n\\r\\t'\"@]/g, m => {\n switch (m) {\n case '\"':\n case \"'\":\n case '@':\n return '\\\\' + m;\n case '\\n':\n return '\\\\n';\n case '\\r':\n return '\\\\r';\n case '\\t':\n return '\\\\t';\n default:\n throw new Error(`Cannot escape unhandled XML character: ${m}`);\n }\n });\n if (value.match(/(^\\s|\\s$)/)) {\n value = '\"' + value + '\"';\n }\n return value;\n}\n"],"file":"XML.js"}
1
+ {"version":3,"sources":["../../src/utils/XML.ts"],"names":["writeXMLAsync","options","xml","format","fs","ensureDir","path","dirname","writeFile","readXMLAsync","contents","readFile","encoding","flag","parser","Parser","manifest","parseStringPromise","fallback","Array","isArray","resources","string","$","translatable","_","unescapeAndroidString","parseXMLAsync","stringTimesN","n","char","join","indentLevel","newline","EOL","xmlInput","toString","builder","Builder","headless","escapeAndroidString","buildObject","Error","indentString","formatted","regex","replace","pad","split","map","line","trim","forEach","indent","match","padding","value","m"],"mappings":"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","sourcesContent":["import fs from 'fs-extra';\nimport { EOL } from 'os';\nimport path from 'path';\nimport { Builder, Parser } from 'xml2js';\n\nexport type XMLValue = boolean | number | string | null | XMLArray | XMLObject;\n\nexport interface XMLArray extends Array<XMLValue> {}\n\nexport interface XMLObject {\n [key: string]: XMLValue | undefined;\n}\n\nexport async function writeXMLAsync(options: { path: string; xml: any }): Promise<void> {\n const xml = format(options.xml);\n await fs.ensureDir(path.dirname(options.path));\n await fs.writeFile(options.path, xml);\n}\n\nexport async function readXMLAsync(options: {\n path: string;\n fallback?: string | null;\n}): Promise<XMLObject> {\n let contents: string = '';\n try {\n contents = await fs.readFile(options.path, { encoding: 'utf8', flag: 'r' });\n } catch {\n // catch and use fallback\n }\n const parser = new Parser();\n const manifest = await parser.parseStringPromise(contents || options.fallback || '');\n\n // For strings.xml\n if (Array.isArray(manifest?.resources?.string)) {\n for (const string of manifest?.resources?.string) {\n if (string.$.translatable === 'false' || string.$.translatable === false) {\n continue;\n }\n string._ = unescapeAndroidString(string._);\n }\n }\n\n return manifest;\n}\n\nexport async function parseXMLAsync(contents: string): Promise<XMLObject> {\n const xml = await new Parser().parseStringPromise(contents);\n return xml;\n}\n\nconst stringTimesN = (n: number, char: string) => Array(n + 1).join(char);\n\nexport function format(manifest: any, { indentLevel = 2, newline = EOL } = {}): string {\n let xmlInput: string;\n if (typeof manifest === 'string') {\n xmlInput = manifest;\n } else if (manifest.toString) {\n const builder = new Builder({\n headless: true,\n });\n\n // For strings.xml\n if (Array.isArray(manifest?.resources?.string)) {\n for (const string of manifest?.resources?.string) {\n if (string.$.translatable === 'false' || string.$.translatable === false) {\n continue;\n }\n string._ = escapeAndroidString(string._);\n }\n }\n\n xmlInput = builder.buildObject(manifest);\n\n return xmlInput;\n } else {\n throw new Error(`Invalid XML value passed in: ${manifest}`);\n }\n const indentString = stringTimesN(indentLevel, ' ');\n\n let formatted = '';\n const regex = /(>)(<)(\\/*)/g;\n const xml = xmlInput.replace(regex, `$1${newline}$2$3`);\n let pad = 0;\n xml\n .split(/\\r?\\n/)\n .map((line: string) => line.trim())\n .forEach((line: string) => {\n let indent = 0;\n if (line.match(/.+<\\/\\w[^>]*>$/)) {\n indent = 0;\n } else if (line.match(/^<\\/\\w/)) {\n if (pad !== 0) {\n pad -= 1;\n }\n } else if (line.match(/^<\\w([^>]*[^/])?>.*$/)) {\n indent = 1;\n } else {\n indent = 0;\n }\n\n const padding = stringTimesN(pad, indentString);\n formatted += padding + line + newline;\n pad += indent;\n });\n\n return formatted.trim();\n}\n\n/**\n * Escapes Android string literals, specifically characters `\"`, `'`, `\\`, `\\n`, `\\r`, `\\t`\n *\n * @param value unescaped Android XML string literal.\n */\nexport function escapeAndroidString(value: string): string {\n value = value.replace(/[\\n\\r\\t'\"@]/g, m => {\n switch (m) {\n case '\"':\n case \"'\":\n case '@':\n return '\\\\' + m;\n case '\\n':\n return '\\\\n';\n case '\\r':\n return '\\\\r';\n case '\\t':\n return '\\\\t';\n default:\n throw new Error(`Cannot escape unhandled XML character: ${m}`);\n }\n });\n if (value.match(/(^\\s|\\s$)/)) {\n value = '\"' + value + '\"';\n }\n return value;\n}\n\nexport function unescapeAndroidString(value: string): string {\n return value.replace(/\\\\(.)/g, '$1');\n}\n"],"file":"XML.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expo/config-plugins",
3
- "version": "4.0.18",
3
+ "version": "4.1.0",
4
4
  "description": "A library for Expo config plugins",
5
5
  "main": "build/index.js",
6
6
  "scripts": {