@expo/config-plugins 4.0.10 → 4.0.14

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.
Files changed (40) hide show
  1. package/build/android/IntentFilters.d.ts +3 -3
  2. package/build/android/IntentFilters.js +44 -48
  3. package/build/android/IntentFilters.js.map +1 -1
  4. package/build/android/Manifest.d.ts +8 -1
  5. package/build/android/Manifest.js +3 -1
  6. package/build/android/Manifest.js.map +1 -1
  7. package/build/android/Permissions.d.ts +2 -0
  8. package/build/android/Permissions.js +88 -3
  9. package/build/android/Permissions.js.map +1 -1
  10. package/build/android/Updates.d.ts +2 -2
  11. package/build/android/Updates.js +20 -4
  12. package/build/android/Updates.js.map +1 -1
  13. package/build/android/Version.d.ts +9 -0
  14. package/build/android/Version.js +37 -1
  15. package/build/android/Version.js.map +1 -1
  16. package/build/ios/BundleIdentifier.js +11 -1
  17. package/build/ios/BundleIdentifier.js.map +1 -1
  18. package/build/ios/Maps.d.ts +3 -5
  19. package/build/ios/Maps.js +29 -34
  20. package/build/ios/Maps.js.map +1 -1
  21. package/build/ios/Name.d.ts +7 -2
  22. package/build/ios/Name.js +58 -1
  23. package/build/ios/Name.js.map +1 -1
  24. package/build/ios/ProvisioningProfile.js +11 -2
  25. package/build/ios/ProvisioningProfile.js.map +1 -1
  26. package/build/ios/Target.js +29 -10
  27. package/build/ios/Target.js.map +1 -1
  28. package/build/ios/Updates.d.ts +2 -2
  29. package/build/ios/Updates.js +20 -4
  30. package/build/ios/Updates.js.map +1 -1
  31. package/build/ios/utils/string.d.ts +1 -0
  32. package/build/ios/utils/string.js +11 -0
  33. package/build/ios/utils/string.js.map +1 -0
  34. package/build/utils/Updates.d.ts +1 -0
  35. package/build/utils/Updates.js +34 -0
  36. package/build/utils/Updates.js.map +1 -1
  37. package/package.json +2 -1
  38. package/build/utils/resolvePackageRootFolder.d.ts +0 -1
  39. package/build/utils/resolvePackageRootFolder.js +0 -57
  40. package/build/utils/resolvePackageRootFolder.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/android/Updates.ts"],"names":["CREATE_MANIFEST_ANDROID_PATH","Config","withUpdates","config","expoUsername","modResults","setUpdatesConfig","getSDKVersion","sdkVersion","getUpdatesEnabled","updates","enabled","getUpdatesTimeout","fallbackToCacheTimeout","getUpdatesCheckOnLaunch","checkAutomatically","androidManifest","username","mainApplication","ENABLED","String","CHECK_ON_LAUNCH","LAUNCH_WAIT_MS","updateUrl","UPDATE_URL","setVersionsConfig","runtimeVersion","SDK_VERSION","RUNTIME_VERSION","ensureBuildGradleContainsConfigurationScript","projectRoot","buildGradleContents","isBuildGradleConfigured","cleanedUpBuildGradleContents","isBuildGradleMisconfigured","split","some","line","includes","replace","RegExp","gradleScriptApply","formatApplyLineForBuildGradle","updatesGradleScriptPath","resolveFrom","silent","Error","relativePath","path","relative","join","posixPath","process","platform","androidBuildScript","isMainApplicationMetaDataSet","Boolean","isMainApplicationMetaDataSynced","areVersionsSynced","expectedRuntimeVersion","expectedSdkVersion","currentRuntimeVersion","currentSdkVersion"],"mappings":"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","sourcesContent":["import path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { ConfigPlugin } from '../Plugin.types';\nimport { withAndroidManifest } from '../plugins/android-plugins';\nimport { ExpoConfigUpdates, getRuntimeVersionNullable, getUpdateUrl } from '../utils/Updates';\nimport {\n addMetaDataItemToMainApplication,\n AndroidManifest,\n getMainApplicationMetaDataValue,\n getMainApplicationOrThrow,\n removeMetaDataItemFromMainApplication,\n} from './Manifest';\n\nconst CREATE_MANIFEST_ANDROID_PATH = 'expo-updates/scripts/create-manifest-android.gradle';\n\nexport enum Config {\n ENABLED = 'expo.modules.updates.ENABLED',\n CHECK_ON_LAUNCH = 'expo.modules.updates.EXPO_UPDATES_CHECK_ON_LAUNCH',\n LAUNCH_WAIT_MS = 'expo.modules.updates.EXPO_UPDATES_LAUNCH_WAIT_MS',\n SDK_VERSION = 'expo.modules.updates.EXPO_SDK_VERSION',\n RUNTIME_VERSION = 'expo.modules.updates.EXPO_RUNTIME_VERSION',\n UPDATE_URL = 'expo.modules.updates.EXPO_UPDATE_URL',\n RELEASE_CHANNEL = 'expo.modules.updates.EXPO_RELEASE_CHANNEL',\n UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY = 'expo.modules.updates.UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY',\n}\n\nexport const withUpdates: ConfigPlugin<{ expoUsername: string | null }> = (\n config,\n { expoUsername }\n) => {\n return withAndroidManifest(config, config => {\n config.modResults = setUpdatesConfig(config, config.modResults, expoUsername);\n return config;\n });\n};\n\nexport function getSDKVersion(config: Pick<ExpoConfigUpdates, 'sdkVersion'>): string | null {\n return typeof config.sdkVersion === 'string' ? config.sdkVersion : null;\n}\n\nexport function getUpdatesEnabled(config: Pick<ExpoConfigUpdates, 'updates'>): boolean {\n return config.updates?.enabled !== false;\n}\n\nexport function getUpdatesTimeout(config: Pick<ExpoConfigUpdates, 'updates'>): number {\n return config.updates?.fallbackToCacheTimeout ?? 0;\n}\n\nexport function getUpdatesCheckOnLaunch(\n config: Pick<ExpoConfigUpdates, 'updates'>\n): 'NEVER' | 'ALWAYS' {\n if (config.updates?.checkAutomatically === 'ON_ERROR_RECOVERY') {\n return 'NEVER';\n } else if (config.updates?.checkAutomatically === 'ON_LOAD') {\n return 'ALWAYS';\n }\n return 'ALWAYS';\n}\n\nexport function setUpdatesConfig(\n config: ExpoConfigUpdates,\n androidManifest: AndroidManifest,\n username: string | null\n): AndroidManifest {\n const mainApplication = getMainApplicationOrThrow(androidManifest);\n\n addMetaDataItemToMainApplication(\n mainApplication,\n Config.ENABLED,\n String(getUpdatesEnabled(config))\n );\n addMetaDataItemToMainApplication(\n mainApplication,\n Config.CHECK_ON_LAUNCH,\n getUpdatesCheckOnLaunch(config)\n );\n addMetaDataItemToMainApplication(\n mainApplication,\n Config.LAUNCH_WAIT_MS,\n String(getUpdatesTimeout(config))\n );\n\n const updateUrl = getUpdateUrl(config, username);\n if (updateUrl) {\n addMetaDataItemToMainApplication(mainApplication, Config.UPDATE_URL, updateUrl);\n } else {\n removeMetaDataItemFromMainApplication(mainApplication, Config.UPDATE_URL);\n }\n\n return setVersionsConfig(config, androidManifest);\n}\n\nexport function setVersionsConfig(\n config: Pick<ExpoConfigUpdates, 'sdkVersion' | 'runtimeVersion'>,\n androidManifest: AndroidManifest\n): AndroidManifest {\n const mainApplication = getMainApplicationOrThrow(androidManifest);\n\n const runtimeVersion = getRuntimeVersionNullable(config, 'android');\n const sdkVersion = getSDKVersion(config);\n if (runtimeVersion) {\n removeMetaDataItemFromMainApplication(mainApplication, Config.SDK_VERSION);\n addMetaDataItemToMainApplication(mainApplication, Config.RUNTIME_VERSION, runtimeVersion);\n } else if (sdkVersion) {\n /**\n * runtime version maybe null in projects using classic updates. In that\n * case we use SDK version\n */\n removeMetaDataItemFromMainApplication(mainApplication, Config.RUNTIME_VERSION);\n addMetaDataItemToMainApplication(mainApplication, Config.SDK_VERSION, sdkVersion);\n } else {\n removeMetaDataItemFromMainApplication(mainApplication, Config.RUNTIME_VERSION);\n removeMetaDataItemFromMainApplication(mainApplication, Config.SDK_VERSION);\n }\n\n return androidManifest;\n}\nexport function ensureBuildGradleContainsConfigurationScript(\n projectRoot: string,\n buildGradleContents: string\n): string {\n if (!isBuildGradleConfigured(projectRoot, buildGradleContents)) {\n let cleanedUpBuildGradleContents;\n\n const isBuildGradleMisconfigured = buildGradleContents\n .split('\\n')\n .some(line => line.includes(CREATE_MANIFEST_ANDROID_PATH));\n if (isBuildGradleMisconfigured) {\n cleanedUpBuildGradleContents = buildGradleContents.replace(\n new RegExp(`(\\n// Integration with Expo updates)?\\n.*${CREATE_MANIFEST_ANDROID_PATH}.*\\n`),\n ''\n );\n } else {\n cleanedUpBuildGradleContents = buildGradleContents;\n }\n\n const gradleScriptApply = formatApplyLineForBuildGradle(projectRoot);\n return `${cleanedUpBuildGradleContents}\\n// Integration with Expo updates\\n${gradleScriptApply}\\n`;\n } else {\n return buildGradleContents;\n }\n}\n\nexport function formatApplyLineForBuildGradle(projectRoot: string): string {\n const updatesGradleScriptPath = resolveFrom.silent(projectRoot, CREATE_MANIFEST_ANDROID_PATH);\n\n if (!updatesGradleScriptPath) {\n throw new Error(\n \"Could not find the build script for Android. This could happen in case of outdated 'node_modules'. Run 'npm install' to make sure that it's up-to-date.\"\n );\n }\n\n const relativePath = path.relative(\n path.join(projectRoot, 'android', 'app'),\n updatesGradleScriptPath\n );\n const posixPath = process.platform === 'win32' ? relativePath.replace(/\\\\/g, '/') : relativePath;\n\n return `apply from: \"${posixPath}\"`;\n}\n\nexport function isBuildGradleConfigured(projectRoot: string, buildGradleContents: string): boolean {\n const androidBuildScript = formatApplyLineForBuildGradle(projectRoot);\n\n return (\n buildGradleContents\n .replace(/\\r\\n/g, '\\n')\n .split('\\n')\n // Check for both single and double quotes\n .some(line => line === androidBuildScript || line === androidBuildScript.replace(/\"/g, \"'\"))\n );\n}\n\nexport function isMainApplicationMetaDataSet(androidManifest: AndroidManifest): boolean {\n const updateUrl = getMainApplicationMetaDataValue(androidManifest, Config.UPDATE_URL);\n const runtimeVersion = getMainApplicationMetaDataValue(androidManifest, Config.RUNTIME_VERSION);\n const sdkVersion = getMainApplicationMetaDataValue(androidManifest, Config.SDK_VERSION);\n\n return Boolean(updateUrl && (sdkVersion || runtimeVersion));\n}\n\nexport function isMainApplicationMetaDataSynced(\n config: ExpoConfigUpdates,\n androidManifest: AndroidManifest,\n username: string | null\n): boolean {\n return (\n getUpdateUrl(config, username) ===\n getMainApplicationMetaDataValue(androidManifest, Config.UPDATE_URL) &&\n String(getUpdatesEnabled(config)) ===\n getMainApplicationMetaDataValue(androidManifest, Config.ENABLED) &&\n String(getUpdatesTimeout(config)) ===\n getMainApplicationMetaDataValue(androidManifest, Config.LAUNCH_WAIT_MS) &&\n getUpdatesCheckOnLaunch(config) ===\n getMainApplicationMetaDataValue(androidManifest, Config.CHECK_ON_LAUNCH) &&\n areVersionsSynced(config, androidManifest)\n );\n}\n\nexport function areVersionsSynced(\n config: Pick<ExpoConfigUpdates, 'runtimeVersion' | 'sdkVersion'>,\n androidManifest: AndroidManifest\n): boolean {\n const expectedRuntimeVersion = getRuntimeVersionNullable(config, 'android');\n const expectedSdkVersion = getSDKVersion(config);\n\n const currentRuntimeVersion = getMainApplicationMetaDataValue(\n androidManifest,\n Config.RUNTIME_VERSION\n );\n const currentSdkVersion = getMainApplicationMetaDataValue(androidManifest, Config.SDK_VERSION);\n\n if (expectedRuntimeVersion !== null) {\n return currentRuntimeVersion === expectedRuntimeVersion && currentSdkVersion === null;\n } else if (expectedSdkVersion !== null) {\n return currentSdkVersion === expectedSdkVersion && currentRuntimeVersion === null;\n } else {\n return true;\n }\n}\n"],"file":"Updates.js"}
1
+ {"version":3,"sources":["../../src/android/Updates.ts"],"names":["CREATE_MANIFEST_ANDROID_PATH","Config","withUpdates","config","expoUsername","expoUpdatesPackageVersion","modRequest","projectRoot","modResults","setUpdatesConfig","getSDKVersion","sdkVersion","getUpdatesEnabled","updates","enabled","getUpdatesTimeout","fallbackToCacheTimeout","getUpdatesCheckOnLaunch","checkAutomatically","semver","gte","androidManifest","username","mainApplication","ENABLED","String","CHECK_ON_LAUNCH","LAUNCH_WAIT_MS","updateUrl","UPDATE_URL","setVersionsConfig","runtimeVersion","SDK_VERSION","RUNTIME_VERSION","ensureBuildGradleContainsConfigurationScript","buildGradleContents","isBuildGradleConfigured","cleanedUpBuildGradleContents","isBuildGradleMisconfigured","split","some","line","includes","replace","RegExp","gradleScriptApply","formatApplyLineForBuildGradle","updatesGradleScriptPath","resolveFrom","silent","Error","relativePath","path","relative","join","posixPath","process","platform","androidBuildScript","isMainApplicationMetaDataSet","Boolean","isMainApplicationMetaDataSynced","areVersionsSynced","expectedRuntimeVersion","expectedSdkVersion","currentRuntimeVersion","currentSdkVersion"],"mappings":"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","sourcesContent":["import path from 'path';\nimport resolveFrom from 'resolve-from';\nimport semver from 'semver';\n\nimport { ConfigPlugin } from '../Plugin.types';\nimport { withAndroidManifest } from '../plugins/android-plugins';\nimport {\n ExpoConfigUpdates,\n getExpoUpdatesPackageVersion,\n getRuntimeVersionNullable,\n getUpdateUrl,\n} from '../utils/Updates';\nimport {\n addMetaDataItemToMainApplication,\n AndroidManifest,\n getMainApplicationMetaDataValue,\n getMainApplicationOrThrow,\n removeMetaDataItemFromMainApplication,\n} from './Manifest';\n\nconst CREATE_MANIFEST_ANDROID_PATH = 'expo-updates/scripts/create-manifest-android.gradle';\n\nexport enum Config {\n ENABLED = 'expo.modules.updates.ENABLED',\n CHECK_ON_LAUNCH = 'expo.modules.updates.EXPO_UPDATES_CHECK_ON_LAUNCH',\n LAUNCH_WAIT_MS = 'expo.modules.updates.EXPO_UPDATES_LAUNCH_WAIT_MS',\n SDK_VERSION = 'expo.modules.updates.EXPO_SDK_VERSION',\n RUNTIME_VERSION = 'expo.modules.updates.EXPO_RUNTIME_VERSION',\n UPDATE_URL = 'expo.modules.updates.EXPO_UPDATE_URL',\n RELEASE_CHANNEL = 'expo.modules.updates.EXPO_RELEASE_CHANNEL',\n UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY = 'expo.modules.updates.UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY',\n}\n\nexport const withUpdates: ConfigPlugin<{ expoUsername: string | null }> = (\n config,\n { expoUsername }\n) => {\n return withAndroidManifest(config, config => {\n const expoUpdatesPackageVersion = getExpoUpdatesPackageVersion(config.modRequest.projectRoot);\n config.modResults = setUpdatesConfig(\n config,\n config.modResults,\n expoUsername,\n expoUpdatesPackageVersion\n );\n return config;\n });\n};\n\nexport function getSDKVersion(config: Pick<ExpoConfigUpdates, 'sdkVersion'>): string | null {\n return typeof config.sdkVersion === 'string' ? config.sdkVersion : null;\n}\n\nexport function getUpdatesEnabled(config: Pick<ExpoConfigUpdates, 'updates'>): boolean {\n return config.updates?.enabled !== false;\n}\n\nexport function getUpdatesTimeout(config: Pick<ExpoConfigUpdates, 'updates'>): number {\n return config.updates?.fallbackToCacheTimeout ?? 0;\n}\n\nexport function getUpdatesCheckOnLaunch(\n config: Pick<ExpoConfigUpdates, 'updates'>,\n expoUpdatesPackageVersion?: string | null\n): 'NEVER' | 'ERROR_RECOVERY_ONLY' | 'ALWAYS' {\n if (config.updates?.checkAutomatically === 'ON_ERROR_RECOVERY') {\n // native 'ERROR_RECOVERY_ONLY' option was only introduced in 0.11.x\n if (expoUpdatesPackageVersion && semver.gte(expoUpdatesPackageVersion, '0.11.0')) {\n return 'ERROR_RECOVERY_ONLY';\n }\n return 'NEVER';\n } else if (config.updates?.checkAutomatically === 'ON_LOAD') {\n return 'ALWAYS';\n }\n return 'ALWAYS';\n}\n\nexport function setUpdatesConfig(\n config: ExpoConfigUpdates,\n androidManifest: AndroidManifest,\n username: string | null,\n expoUpdatesPackageVersion?: string | null\n): AndroidManifest {\n const mainApplication = getMainApplicationOrThrow(androidManifest);\n\n addMetaDataItemToMainApplication(\n mainApplication,\n Config.ENABLED,\n String(getUpdatesEnabled(config))\n );\n addMetaDataItemToMainApplication(\n mainApplication,\n Config.CHECK_ON_LAUNCH,\n getUpdatesCheckOnLaunch(config, expoUpdatesPackageVersion)\n );\n addMetaDataItemToMainApplication(\n mainApplication,\n Config.LAUNCH_WAIT_MS,\n String(getUpdatesTimeout(config))\n );\n\n const updateUrl = getUpdateUrl(config, username);\n if (updateUrl) {\n addMetaDataItemToMainApplication(mainApplication, Config.UPDATE_URL, updateUrl);\n } else {\n removeMetaDataItemFromMainApplication(mainApplication, Config.UPDATE_URL);\n }\n\n return setVersionsConfig(config, androidManifest);\n}\n\nexport function setVersionsConfig(\n config: Pick<ExpoConfigUpdates, 'sdkVersion' | 'runtimeVersion'>,\n androidManifest: AndroidManifest\n): AndroidManifest {\n const mainApplication = getMainApplicationOrThrow(androidManifest);\n\n const runtimeVersion = getRuntimeVersionNullable(config, 'android');\n const sdkVersion = getSDKVersion(config);\n if (runtimeVersion) {\n removeMetaDataItemFromMainApplication(mainApplication, Config.SDK_VERSION);\n addMetaDataItemToMainApplication(mainApplication, Config.RUNTIME_VERSION, runtimeVersion);\n } else if (sdkVersion) {\n /**\n * runtime version maybe null in projects using classic updates. In that\n * case we use SDK version\n */\n removeMetaDataItemFromMainApplication(mainApplication, Config.RUNTIME_VERSION);\n addMetaDataItemToMainApplication(mainApplication, Config.SDK_VERSION, sdkVersion);\n } else {\n removeMetaDataItemFromMainApplication(mainApplication, Config.RUNTIME_VERSION);\n removeMetaDataItemFromMainApplication(mainApplication, Config.SDK_VERSION);\n }\n\n return androidManifest;\n}\nexport function ensureBuildGradleContainsConfigurationScript(\n projectRoot: string,\n buildGradleContents: string\n): string {\n if (!isBuildGradleConfigured(projectRoot, buildGradleContents)) {\n let cleanedUpBuildGradleContents;\n\n const isBuildGradleMisconfigured = buildGradleContents\n .split('\\n')\n .some(line => line.includes(CREATE_MANIFEST_ANDROID_PATH));\n if (isBuildGradleMisconfigured) {\n cleanedUpBuildGradleContents = buildGradleContents.replace(\n new RegExp(`(\\n// Integration with Expo updates)?\\n.*${CREATE_MANIFEST_ANDROID_PATH}.*\\n`),\n ''\n );\n } else {\n cleanedUpBuildGradleContents = buildGradleContents;\n }\n\n const gradleScriptApply = formatApplyLineForBuildGradle(projectRoot);\n return `${cleanedUpBuildGradleContents}\\n// Integration with Expo updates\\n${gradleScriptApply}\\n`;\n } else {\n return buildGradleContents;\n }\n}\n\nexport function formatApplyLineForBuildGradle(projectRoot: string): string {\n const updatesGradleScriptPath = resolveFrom.silent(projectRoot, CREATE_MANIFEST_ANDROID_PATH);\n\n if (!updatesGradleScriptPath) {\n throw new Error(\n \"Could not find the build script for Android. This could happen in case of outdated 'node_modules'. Run 'npm install' to make sure that it's up-to-date.\"\n );\n }\n\n const relativePath = path.relative(\n path.join(projectRoot, 'android', 'app'),\n updatesGradleScriptPath\n );\n const posixPath = process.platform === 'win32' ? relativePath.replace(/\\\\/g, '/') : relativePath;\n\n return `apply from: \"${posixPath}\"`;\n}\n\nexport function isBuildGradleConfigured(projectRoot: string, buildGradleContents: string): boolean {\n const androidBuildScript = formatApplyLineForBuildGradle(projectRoot);\n\n return (\n buildGradleContents\n .replace(/\\r\\n/g, '\\n')\n .split('\\n')\n // Check for both single and double quotes\n .some(line => line === androidBuildScript || line === androidBuildScript.replace(/\"/g, \"'\"))\n );\n}\n\nexport function isMainApplicationMetaDataSet(androidManifest: AndroidManifest): boolean {\n const updateUrl = getMainApplicationMetaDataValue(androidManifest, Config.UPDATE_URL);\n const runtimeVersion = getMainApplicationMetaDataValue(androidManifest, Config.RUNTIME_VERSION);\n const sdkVersion = getMainApplicationMetaDataValue(androidManifest, Config.SDK_VERSION);\n\n return Boolean(updateUrl && (sdkVersion || runtimeVersion));\n}\n\nexport function isMainApplicationMetaDataSynced(\n config: ExpoConfigUpdates,\n androidManifest: AndroidManifest,\n username: string | null\n): boolean {\n return (\n getUpdateUrl(config, username) ===\n getMainApplicationMetaDataValue(androidManifest, Config.UPDATE_URL) &&\n String(getUpdatesEnabled(config)) ===\n getMainApplicationMetaDataValue(androidManifest, Config.ENABLED) &&\n String(getUpdatesTimeout(config)) ===\n getMainApplicationMetaDataValue(androidManifest, Config.LAUNCH_WAIT_MS) &&\n getUpdatesCheckOnLaunch(config) ===\n getMainApplicationMetaDataValue(androidManifest, Config.CHECK_ON_LAUNCH) &&\n areVersionsSynced(config, androidManifest)\n );\n}\n\nexport function areVersionsSynced(\n config: Pick<ExpoConfigUpdates, 'runtimeVersion' | 'sdkVersion'>,\n androidManifest: AndroidManifest\n): boolean {\n const expectedRuntimeVersion = getRuntimeVersionNullable(config, 'android');\n const expectedSdkVersion = getSDKVersion(config);\n\n const currentRuntimeVersion = getMainApplicationMetaDataValue(\n androidManifest,\n Config.RUNTIME_VERSION\n );\n const currentSdkVersion = getMainApplicationMetaDataValue(androidManifest, Config.SDK_VERSION);\n\n if (expectedRuntimeVersion !== null) {\n return currentRuntimeVersion === expectedRuntimeVersion && currentSdkVersion === null;\n } else if (expectedSdkVersion !== null) {\n return currentSdkVersion === expectedSdkVersion && currentRuntimeVersion === null;\n } else {\n return true;\n }\n}\n"],"file":"Updates.js"}
@@ -1,6 +1,15 @@
1
1
  import { ExpoConfig } from '@expo/config-types';
2
2
  import { ConfigPlugin } from '../Plugin.types';
3
3
  export declare const withVersion: ConfigPlugin;
4
+ /** Sets a numeric version for a value in the project.gradle buildscript.ext object to be at least the provided props.minVersion, if the existing value is greater then no change will be made. */
5
+ export declare const withBuildScriptExtMinimumVersion: ConfigPlugin<{
6
+ name: string;
7
+ minVersion: number;
8
+ }>;
9
+ export declare function setMinBuildScriptExtVersion(buildGradle: string, { name, minVersion }: {
10
+ name: string;
11
+ minVersion: number;
12
+ }): string;
4
13
  export declare function getVersionName(config: Pick<ExpoConfig, 'version'>): string | null;
5
14
  export declare function setVersionName(config: Pick<ExpoConfig, 'version'>, buildGradle: string): string;
6
15
  export declare function getVersionCode(config: Pick<ExpoConfig, 'android'>): number;
@@ -5,9 +5,10 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.getVersionCode = getVersionCode;
7
7
  exports.getVersionName = getVersionName;
8
+ exports.setMinBuildScriptExtVersion = setMinBuildScriptExtVersion;
8
9
  exports.setVersionCode = setVersionCode;
9
10
  exports.setVersionName = setVersionName;
10
- exports.withVersion = void 0;
11
+ exports.withVersion = exports.withBuildScriptExtMinimumVersion = void 0;
11
12
 
12
13
  function _androidPlugins() {
13
14
  const data = require("../plugins/android-plugins");
@@ -41,9 +42,44 @@ const withVersion = config => {
41
42
  return config;
42
43
  });
43
44
  };
45
+ /** Sets a numeric version for a value in the project.gradle buildscript.ext object to be at least the provided props.minVersion, if the existing value is greater then no change will be made. */
46
+
44
47
 
45
48
  exports.withVersion = withVersion;
46
49
 
50
+ const withBuildScriptExtMinimumVersion = (config, props) => {
51
+ return (0, _androidPlugins().withProjectBuildGradle)(config, config => {
52
+ if (config.modResults.language === 'groovy') {
53
+ config.modResults.contents = setMinBuildScriptExtVersion(config.modResults.contents, props);
54
+ } else {
55
+ (0, _warnings().addWarningAndroid)('withBuildScriptExtVersion', `Cannot automatically configure project build.gradle if it's not groovy`);
56
+ }
57
+
58
+ return config;
59
+ });
60
+ };
61
+
62
+ exports.withBuildScriptExtMinimumVersion = withBuildScriptExtMinimumVersion;
63
+
64
+ function setMinBuildScriptExtVersion(buildGradle, {
65
+ name,
66
+ minVersion
67
+ }) {
68
+ var _buildGradle$match;
69
+
70
+ const regex = new RegExp(`(${name}\\s?=\\s?)(\\d+(?:\\.\\d+)?)`);
71
+ const currentVersion = (_buildGradle$match = buildGradle.match(regex)) === null || _buildGradle$match === void 0 ? void 0 : _buildGradle$match[2];
72
+
73
+ if (!currentVersion) {
74
+ (0, _warnings().addWarningAndroid)('withBuildScriptExtVersion', `Cannot set minimum buildscript.ext.${name} version because the property "${name}" cannot be found or does not have a numeric value.`); // TODO: Maybe just add the property...
75
+
76
+ return buildGradle;
77
+ }
78
+
79
+ const currentVersionNum = Number(currentVersion);
80
+ return buildGradle.replace(regex, `$1${Math.max(minVersion, currentVersionNum)}`);
81
+ }
82
+
47
83
  function getVersionName(config) {
48
84
  var _config$version;
49
85
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/android/Version.ts"],"names":["withVersion","config","modResults","language","contents","setVersionCode","setVersionName","getVersionName","version","buildGradle","versionName","pattern","RegExp","replace","getVersionCode","android","versionCode"],"mappings":";;;;;;;;;;;AAGA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEO,MAAMA,WAAyB,GAAGC,MAAM,IAAI;AACjD,SAAO,0CAAmBA,MAAnB,EAA2BA,MAAM,IAAI;AAC1C,QAAIA,MAAM,CAACC,UAAP,CAAkBC,QAAlB,KAA+B,QAAnC,EAA6C;AAC3CF,MAAAA,MAAM,CAACC,UAAP,CAAkBE,QAAlB,GAA6BC,cAAc,CAACJ,MAAD,EAASA,MAAM,CAACC,UAAP,CAAkBE,QAA3B,CAA3C;AACAH,MAAAA,MAAM,CAACC,UAAP,CAAkBE,QAAlB,GAA6BE,cAAc,CAACL,MAAD,EAASA,MAAM,CAACC,UAAP,CAAkBE,QAA3B,CAA3C;AACD,KAHD,MAGO;AACL,yCACE,qBADF,EAEG,oEAFH;AAID;;AACD,WAAOH,MAAP;AACD,GAXM,CAAP;AAYD,CAbM;;;;AAeA,SAASM,cAAT,CAAwBN,MAAxB,EAA6D;AAAA;;AAClE,4BAAOA,MAAM,CAACO,OAAd,6DAAyB,IAAzB;AACD;;AAEM,SAASF,cAAT,CAAwBL,MAAxB,EAA6DQ,WAA7D,EAAkF;AACvF,QAAMC,WAAW,GAAGH,cAAc,CAACN,MAAD,CAAlC;;AACA,MAAIS,WAAW,KAAK,IAApB,EAA0B;AACxB,WAAOD,WAAP;AACD;;AAED,QAAME,OAAO,GAAG,IAAIC,MAAJ,CAAY,kBAAZ,CAAhB;AACA,SAAOH,WAAW,CAACI,OAAZ,CAAoBF,OAApB,EAA8B,gBAAeD,WAAY,GAAzD,CAAP;AACD;;AAEM,SAASI,cAAT,CAAwBb,MAAxB,EAA6D;AAAA;;AAClE,qDAAOA,MAAM,CAACc,OAAd,oDAAO,gBAAgBC,WAAvB,yEAAsC,CAAtC;AACD;;AAEM,SAASX,cAAT,CAAwBJ,MAAxB,EAA6DQ,WAA7D,EAAkF;AACvF,QAAMO,WAAW,GAAGF,cAAc,CAACb,MAAD,CAAlC;;AACA,MAAIe,WAAW,KAAK,IAApB,EAA0B;AACxB,WAAOP,WAAP;AACD;;AAED,QAAME,OAAO,GAAG,IAAIC,MAAJ,CAAY,eAAZ,CAAhB;AACA,SAAOH,WAAW,CAACI,OAAZ,CAAoBF,OAApB,EAA8B,eAAcK,WAAY,EAAxD,CAAP;AACD","sourcesContent":["import { ExpoConfig } from '@expo/config-types';\n\nimport { ConfigPlugin } from '../Plugin.types';\nimport { withAppBuildGradle } from '../plugins/android-plugins';\nimport { addWarningAndroid } from '../utils/warnings';\n\nexport const withVersion: ConfigPlugin = config => {\n return withAppBuildGradle(config, config => {\n if (config.modResults.language === 'groovy') {\n config.modResults.contents = setVersionCode(config, config.modResults.contents);\n config.modResults.contents = setVersionName(config, config.modResults.contents);\n } else {\n addWarningAndroid(\n 'android.versionCode',\n `Cannot automatically configure app build.gradle if it's not groovy`\n );\n }\n return config;\n });\n};\n\nexport function getVersionName(config: Pick<ExpoConfig, 'version'>) {\n return config.version ?? null;\n}\n\nexport function setVersionName(config: Pick<ExpoConfig, 'version'>, buildGradle: string) {\n const versionName = getVersionName(config);\n if (versionName === null) {\n return buildGradle;\n }\n\n const pattern = new RegExp(`versionName \".*\"`);\n return buildGradle.replace(pattern, `versionName \"${versionName}\"`);\n}\n\nexport function getVersionCode(config: Pick<ExpoConfig, 'android'>) {\n return config.android?.versionCode ?? 1;\n}\n\nexport function setVersionCode(config: Pick<ExpoConfig, 'android'>, buildGradle: string) {\n const versionCode = getVersionCode(config);\n if (versionCode === null) {\n return buildGradle;\n }\n\n const pattern = new RegExp(`versionCode.*`);\n return buildGradle.replace(pattern, `versionCode ${versionCode}`);\n}\n"],"file":"Version.js"}
1
+ {"version":3,"sources":["../../src/android/Version.ts"],"names":["withVersion","config","modResults","language","contents","setVersionCode","setVersionName","withBuildScriptExtMinimumVersion","props","setMinBuildScriptExtVersion","buildGradle","name","minVersion","regex","RegExp","currentVersion","match","currentVersionNum","Number","replace","Math","max","getVersionName","version","versionName","pattern","getVersionCode","android","versionCode"],"mappings":"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","sourcesContent":["import { ExpoConfig } from '@expo/config-types';\n\nimport { ConfigPlugin } from '../Plugin.types';\nimport { withAppBuildGradle, withProjectBuildGradle } from '../plugins/android-plugins';\nimport { addWarningAndroid } from '../utils/warnings';\n\nexport const withVersion: ConfigPlugin = config => {\n return withAppBuildGradle(config, config => {\n if (config.modResults.language === 'groovy') {\n config.modResults.contents = setVersionCode(config, config.modResults.contents);\n config.modResults.contents = setVersionName(config, config.modResults.contents);\n } else {\n addWarningAndroid(\n 'android.versionCode',\n `Cannot automatically configure app build.gradle if it's not groovy`\n );\n }\n return config;\n });\n};\n\n/** Sets a numeric version for a value in the project.gradle buildscript.ext object to be at least the provided props.minVersion, if the existing value is greater then no change will be made. */\nexport const withBuildScriptExtMinimumVersion: ConfigPlugin<{\n name: string;\n minVersion: number;\n}> = (config, props) => {\n return withProjectBuildGradle(config, config => {\n if (config.modResults.language === 'groovy') {\n config.modResults.contents = setMinBuildScriptExtVersion(config.modResults.contents, props);\n } else {\n addWarningAndroid(\n 'withBuildScriptExtVersion',\n `Cannot automatically configure project build.gradle if it's not groovy`\n );\n }\n return config;\n });\n};\n\nexport function setMinBuildScriptExtVersion(\n buildGradle: string,\n { name, minVersion }: { name: string; minVersion: number }\n) {\n const regex = new RegExp(`(${name}\\\\s?=\\\\s?)(\\\\d+(?:\\\\.\\\\d+)?)`);\n const currentVersion = buildGradle.match(regex)?.[2];\n if (!currentVersion) {\n addWarningAndroid(\n 'withBuildScriptExtVersion',\n `Cannot set minimum buildscript.ext.${name} version because the property \"${name}\" cannot be found or does not have a numeric value.`\n );\n // TODO: Maybe just add the property...\n return buildGradle;\n }\n\n const currentVersionNum = Number(currentVersion);\n return buildGradle.replace(regex, `$1${Math.max(minVersion, currentVersionNum)}`);\n}\n\nexport function getVersionName(config: Pick<ExpoConfig, 'version'>) {\n return config.version ?? null;\n}\n\nexport function setVersionName(config: Pick<ExpoConfig, 'version'>, buildGradle: string) {\n const versionName = getVersionName(config);\n if (versionName === null) {\n return buildGradle;\n }\n\n const pattern = new RegExp(`versionName \".*\"`);\n return buildGradle.replace(pattern, `versionName \"${versionName}\"`);\n}\n\nexport function getVersionCode(config: Pick<ExpoConfig, 'android'>) {\n return config.android?.versionCode ?? 1;\n}\n\nexport function setVersionCode(config: Pick<ExpoConfig, 'android'>, buildGradle: string) {\n const versionCode = getVersionCode(config);\n if (versionCode === null) {\n return buildGradle;\n }\n\n const pattern = new RegExp(`versionCode.*`);\n return buildGradle.replace(pattern, `versionCode ${versionCode}`);\n}\n"],"file":"Version.js"}
@@ -92,6 +92,16 @@ function _Xcodeproj() {
92
92
  return data;
93
93
  }
94
94
 
95
+ function _string() {
96
+ const data = require("./utils/string");
97
+
98
+ _string = function () {
99
+ return data;
100
+ };
101
+
102
+ return data;
103
+ }
104
+
95
105
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
96
106
 
97
107
  const withBundleIdentifier = (config, {
@@ -179,7 +189,7 @@ function getProductBundleIdentifierFromBuildConfiguration(xcBuildConfiguration)
179
189
  const bundleIdentifierRaw = xcBuildConfiguration.buildSettings.PRODUCT_BUNDLE_IDENTIFIER;
180
190
 
181
191
  if (bundleIdentifierRaw) {
182
- const bundleIdentifier = bundleIdentifierRaw[0] === '"' ? bundleIdentifierRaw.slice(1, -1) : bundleIdentifierRaw; // it's possible to use interpolation for the bundle identifier
192
+ const bundleIdentifier = (0, _string().trimQuotes)(bundleIdentifierRaw); // it's possible to use interpolation for the bundle identifier
183
193
  // the most common case is when the last part of the id is set to `$(PRODUCT_NAME:rfc1034identifier)`
184
194
  // in this case, PRODUCT_NAME should be replaced with its value
185
195
  // the `rfc1034identifier` modifier replaces all non-alphanumeric characters with dashes
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ios/BundleIdentifier.ts"],"names":["withBundleIdentifier","config","bundleIdentifier","bundleId","ios","setBundleIdentifierForPbxproj","modRequest","projectRoot","getBundleIdentifier","setBundleIdentifier","infoPlist","CFBundleIdentifier","getBundleIdentifierFromPbxproj","targetName","buildConfiguration","pbxprojPath","project","xcode","parseSync","xcBuildConfiguration","getProductBundleIdentifierFromBuildConfiguration","bundleIdentifierRaw","buildSettings","PRODUCT_BUNDLE_IDENTIFIER","slice","bundleIdentifierParts","split","length","PRODUCT_NAME","replace","join","updateBundleIdentifierForPbxproj","updateProductName","nativeTarget","buildConfigurationList","forEach","item","productName","pop","includes","fs","writeFileSync","writeSync","pbxprojPaths","defaultBundleId","resetAllPlistBundleIdentifiers","infoPlistPaths","plistPath","resetPlistBundleIdentifier","rawPlist","readFileSync","plistObject","plist","parse","format","pretty","indent","xml","build"],"mappings":"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","sourcesContent":["import { ExpoConfig } from '@expo/config-types';\nimport plist, { PlistObject } from '@expo/plist';\nimport assert from 'assert';\nimport fs from 'fs-extra';\nimport xcode, { XCBuildConfiguration } from 'xcode';\n\nimport { ConfigPlugin } from '../Plugin.types';\nimport { withDangerousMod } from '../plugins/withDangerousMod';\nimport { InfoPlist } from './IosConfig.types';\nimport { getAllInfoPlistPaths, getAllPBXProjectPaths, getPBXProjectPath } from './Paths';\nimport { findFirstNativeTarget, getXCBuildConfigurationFromPbxproj } from './Target';\nimport { ConfigurationSectionEntry, getBuildConfigurationsForListId } from './utils/Xcodeproj';\n\nexport const withBundleIdentifier: ConfigPlugin<{ bundleIdentifier?: string }> = (\n config,\n { bundleIdentifier }\n) => {\n return withDangerousMod(config, [\n 'ios',\n async config => {\n const bundleId = bundleIdentifier ?? config.ios?.bundleIdentifier;\n assert(\n bundleId,\n '`bundleIdentifier` must be defined in the app config (`expo.ios.bundleIdentifier`) or passed to the plugin `withBundleIdentifier`.'\n );\n await setBundleIdentifierForPbxproj(config.modRequest.projectRoot, bundleId!);\n return config;\n },\n ]);\n};\n\nfunction getBundleIdentifier(config: Pick<ExpoConfig, 'ios'>): string | null {\n return config.ios?.bundleIdentifier ?? null;\n}\n\n/**\n * In Turtle v1 we set the bundleIdentifier directly on Info.plist rather\n * than in pbxproj\n */\nfunction setBundleIdentifier(config: ExpoConfig, infoPlist: InfoPlist): InfoPlist {\n const bundleIdentifier = getBundleIdentifier(config);\n\n if (!bundleIdentifier) {\n return infoPlist;\n }\n\n return {\n ...infoPlist,\n CFBundleIdentifier: bundleIdentifier,\n };\n}\n\n/**\n * Gets the bundle identifier defined in the Xcode project found in the project directory.\n *\n * A bundle identifier is stored as a value in XCBuildConfiguration entry.\n * Those entries exist for every pair (build target, build configuration).\n * Unless target name is passed, the first target defined in the pbxproj is used\n * (to keep compatibility with the inaccurate legacy implementation of this function).\n * The build configuration is usually 'Release' or 'Debug'. However, it could be any arbitrary string.\n * Defaults to 'Release'.\n *\n * @param {string} projectRoot Path to project root containing the ios directory\n * @param {string} targetName Target name\n * @param {string} buildConfiguration Build configuration. Defaults to 'Release'.\n * @returns {string | null} bundle identifier of the Xcode project or null if the project is not configured\n */\nfunction getBundleIdentifierFromPbxproj(\n projectRoot: string,\n {\n targetName,\n buildConfiguration = 'Release',\n }: { targetName?: string; buildConfiguration?: string } = {}\n): string | null {\n let pbxprojPath: string;\n try {\n pbxprojPath = getPBXProjectPath(projectRoot);\n } catch {\n return null;\n }\n const project = xcode.project(pbxprojPath);\n project.parseSync();\n\n const xcBuildConfiguration = getXCBuildConfigurationFromPbxproj(project, {\n targetName,\n buildConfiguration,\n });\n if (!xcBuildConfiguration) {\n return null;\n }\n return getProductBundleIdentifierFromBuildConfiguration(xcBuildConfiguration);\n}\n\nfunction getProductBundleIdentifierFromBuildConfiguration(\n xcBuildConfiguration: XCBuildConfiguration\n): string | null {\n const bundleIdentifierRaw = xcBuildConfiguration.buildSettings.PRODUCT_BUNDLE_IDENTIFIER;\n if (bundleIdentifierRaw) {\n const bundleIdentifier =\n bundleIdentifierRaw[0] === '\"' ? bundleIdentifierRaw.slice(1, -1) : bundleIdentifierRaw;\n // it's possible to use interpolation for the bundle identifier\n // the most common case is when the last part of the id is set to `$(PRODUCT_NAME:rfc1034identifier)`\n // in this case, PRODUCT_NAME should be replaced with its value\n // the `rfc1034identifier` modifier replaces all non-alphanumeric characters with dashes\n const bundleIdentifierParts = bundleIdentifier.split('.');\n if (\n bundleIdentifierParts[bundleIdentifierParts.length - 1] ===\n '$(PRODUCT_NAME:rfc1034identifier)' &&\n xcBuildConfiguration.buildSettings.PRODUCT_NAME\n ) {\n bundleIdentifierParts[\n bundleIdentifierParts.length - 1\n ] = xcBuildConfiguration.buildSettings.PRODUCT_NAME.replace(/[^a-zA-Z0-9]/g, '-');\n }\n return bundleIdentifierParts.join('.');\n } else {\n return null;\n }\n}\n\n/**\n * Updates the bundle identifier for a given pbxproj\n *\n * @param {string} pbxprojPath Path to pbxproj file\n * @param {string} bundleIdentifier Bundle identifier to set in the pbxproj\n * @param {boolean} [updateProductName=true] Whether to update PRODUCT_NAME\n */\nfunction updateBundleIdentifierForPbxproj(\n pbxprojPath: string,\n bundleIdentifier: string,\n updateProductName: boolean = true\n): void {\n const project = xcode.project(pbxprojPath);\n project.parseSync();\n\n const [, nativeTarget] = findFirstNativeTarget(project);\n\n getBuildConfigurationsForListId(project, nativeTarget.buildConfigurationList).forEach(\n ([, item]: ConfigurationSectionEntry) => {\n if (item.buildSettings.PRODUCT_BUNDLE_IDENTIFIER === bundleIdentifier) {\n return;\n }\n\n item.buildSettings.PRODUCT_BUNDLE_IDENTIFIER = `\"${bundleIdentifier}\"`;\n\n if (updateProductName) {\n const productName = bundleIdentifier.split('.').pop();\n if (!productName?.includes('$')) {\n item.buildSettings.PRODUCT_NAME = productName;\n }\n }\n }\n );\n fs.writeFileSync(pbxprojPath, project.writeSync());\n}\n\n/**\n * Updates the bundle identifier for pbx projects inside the ios directory of the given project root\n *\n * @param {string} projectRoot Path to project root containing the ios directory\n * @param {string} bundleIdentifier Desired bundle identifier\n * @param {boolean} [updateProductName=true] Whether to update PRODUCT_NAME\n */\nfunction setBundleIdentifierForPbxproj(\n projectRoot: string,\n bundleIdentifier: string,\n updateProductName: boolean = true\n): void {\n // Get all pbx projects in the ${projectRoot}/ios directory\n let pbxprojPaths: string[] = [];\n try {\n pbxprojPaths = getAllPBXProjectPaths(projectRoot);\n } catch {}\n\n for (const pbxprojPath of pbxprojPaths) {\n updateBundleIdentifierForPbxproj(pbxprojPath, bundleIdentifier, updateProductName);\n }\n}\n\n/**\n * Reset bundle identifier field in Info.plist to use PRODUCT_BUNDLE_IDENTIFIER, as recommended by Apple.\n */\n\nconst defaultBundleId = '$(PRODUCT_BUNDLE_IDENTIFIER)';\n\nfunction resetAllPlistBundleIdentifiers(projectRoot: string): void {\n const infoPlistPaths = getAllInfoPlistPaths(projectRoot);\n\n for (const plistPath of infoPlistPaths) {\n resetPlistBundleIdentifier(plistPath);\n }\n}\n\nfunction resetPlistBundleIdentifier(plistPath: string): void {\n const rawPlist = fs.readFileSync(plistPath, 'utf8');\n const plistObject = plist.parse(rawPlist) as PlistObject;\n\n if (plistObject.CFBundleIdentifier) {\n if (plistObject.CFBundleIdentifier === defaultBundleId) return;\n\n // attempt to match default Info.plist format\n const format = { pretty: true, indent: `\\t` };\n\n const xml = plist.build(\n {\n ...plistObject,\n CFBundleIdentifier: defaultBundleId,\n },\n format\n );\n\n if (xml !== rawPlist) {\n fs.writeFileSync(plistPath, xml);\n }\n }\n}\n\nexport {\n getBundleIdentifier,\n setBundleIdentifier,\n getBundleIdentifierFromPbxproj,\n updateBundleIdentifierForPbxproj,\n setBundleIdentifierForPbxproj,\n resetAllPlistBundleIdentifiers,\n resetPlistBundleIdentifier,\n};\n"],"file":"BundleIdentifier.js"}
1
+ {"version":3,"sources":["../../src/ios/BundleIdentifier.ts"],"names":["withBundleIdentifier","config","bundleIdentifier","bundleId","ios","setBundleIdentifierForPbxproj","modRequest","projectRoot","getBundleIdentifier","setBundleIdentifier","infoPlist","CFBundleIdentifier","getBundleIdentifierFromPbxproj","targetName","buildConfiguration","pbxprojPath","project","xcode","parseSync","xcBuildConfiguration","getProductBundleIdentifierFromBuildConfiguration","bundleIdentifierRaw","buildSettings","PRODUCT_BUNDLE_IDENTIFIER","bundleIdentifierParts","split","length","PRODUCT_NAME","replace","join","updateBundleIdentifierForPbxproj","updateProductName","nativeTarget","buildConfigurationList","forEach","item","productName","pop","includes","fs","writeFileSync","writeSync","pbxprojPaths","defaultBundleId","resetAllPlistBundleIdentifiers","infoPlistPaths","plistPath","resetPlistBundleIdentifier","rawPlist","readFileSync","plistObject","plist","parse","format","pretty","indent","xml","build"],"mappings":"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","sourcesContent":["import { ExpoConfig } from '@expo/config-types';\nimport plist, { PlistObject } from '@expo/plist';\nimport assert from 'assert';\nimport fs from 'fs-extra';\nimport xcode, { XCBuildConfiguration } from 'xcode';\n\nimport { ConfigPlugin } from '../Plugin.types';\nimport { withDangerousMod } from '../plugins/withDangerousMod';\nimport { InfoPlist } from './IosConfig.types';\nimport { getAllInfoPlistPaths, getAllPBXProjectPaths, getPBXProjectPath } from './Paths';\nimport { findFirstNativeTarget, getXCBuildConfigurationFromPbxproj } from './Target';\nimport { ConfigurationSectionEntry, getBuildConfigurationsForListId } from './utils/Xcodeproj';\nimport { trimQuotes } from './utils/string';\n\nexport const withBundleIdentifier: ConfigPlugin<{ bundleIdentifier?: string }> = (\n config,\n { bundleIdentifier }\n) => {\n return withDangerousMod(config, [\n 'ios',\n async config => {\n const bundleId = bundleIdentifier ?? config.ios?.bundleIdentifier;\n assert(\n bundleId,\n '`bundleIdentifier` must be defined in the app config (`expo.ios.bundleIdentifier`) or passed to the plugin `withBundleIdentifier`.'\n );\n await setBundleIdentifierForPbxproj(config.modRequest.projectRoot, bundleId!);\n return config;\n },\n ]);\n};\n\nfunction getBundleIdentifier(config: Pick<ExpoConfig, 'ios'>): string | null {\n return config.ios?.bundleIdentifier ?? null;\n}\n\n/**\n * In Turtle v1 we set the bundleIdentifier directly on Info.plist rather\n * than in pbxproj\n */\nfunction setBundleIdentifier(config: ExpoConfig, infoPlist: InfoPlist): InfoPlist {\n const bundleIdentifier = getBundleIdentifier(config);\n\n if (!bundleIdentifier) {\n return infoPlist;\n }\n\n return {\n ...infoPlist,\n CFBundleIdentifier: bundleIdentifier,\n };\n}\n\n/**\n * Gets the bundle identifier defined in the Xcode project found in the project directory.\n *\n * A bundle identifier is stored as a value in XCBuildConfiguration entry.\n * Those entries exist for every pair (build target, build configuration).\n * Unless target name is passed, the first target defined in the pbxproj is used\n * (to keep compatibility with the inaccurate legacy implementation of this function).\n * The build configuration is usually 'Release' or 'Debug'. However, it could be any arbitrary string.\n * Defaults to 'Release'.\n *\n * @param {string} projectRoot Path to project root containing the ios directory\n * @param {string} targetName Target name\n * @param {string} buildConfiguration Build configuration. Defaults to 'Release'.\n * @returns {string | null} bundle identifier of the Xcode project or null if the project is not configured\n */\nfunction getBundleIdentifierFromPbxproj(\n projectRoot: string,\n {\n targetName,\n buildConfiguration = 'Release',\n }: { targetName?: string; buildConfiguration?: string } = {}\n): string | null {\n let pbxprojPath: string;\n try {\n pbxprojPath = getPBXProjectPath(projectRoot);\n } catch {\n return null;\n }\n const project = xcode.project(pbxprojPath);\n project.parseSync();\n\n const xcBuildConfiguration = getXCBuildConfigurationFromPbxproj(project, {\n targetName,\n buildConfiguration,\n });\n if (!xcBuildConfiguration) {\n return null;\n }\n return getProductBundleIdentifierFromBuildConfiguration(xcBuildConfiguration);\n}\n\nfunction getProductBundleIdentifierFromBuildConfiguration(\n xcBuildConfiguration: XCBuildConfiguration\n): string | null {\n const bundleIdentifierRaw = xcBuildConfiguration.buildSettings.PRODUCT_BUNDLE_IDENTIFIER;\n if (bundleIdentifierRaw) {\n const bundleIdentifier = trimQuotes(bundleIdentifierRaw);\n // it's possible to use interpolation for the bundle identifier\n // the most common case is when the last part of the id is set to `$(PRODUCT_NAME:rfc1034identifier)`\n // in this case, PRODUCT_NAME should be replaced with its value\n // the `rfc1034identifier` modifier replaces all non-alphanumeric characters with dashes\n const bundleIdentifierParts = bundleIdentifier.split('.');\n if (\n bundleIdentifierParts[bundleIdentifierParts.length - 1] ===\n '$(PRODUCT_NAME:rfc1034identifier)' &&\n xcBuildConfiguration.buildSettings.PRODUCT_NAME\n ) {\n bundleIdentifierParts[\n bundleIdentifierParts.length - 1\n ] = xcBuildConfiguration.buildSettings.PRODUCT_NAME.replace(/[^a-zA-Z0-9]/g, '-');\n }\n return bundleIdentifierParts.join('.');\n } else {\n return null;\n }\n}\n\n/**\n * Updates the bundle identifier for a given pbxproj\n *\n * @param {string} pbxprojPath Path to pbxproj file\n * @param {string} bundleIdentifier Bundle identifier to set in the pbxproj\n * @param {boolean} [updateProductName=true] Whether to update PRODUCT_NAME\n */\nfunction updateBundleIdentifierForPbxproj(\n pbxprojPath: string,\n bundleIdentifier: string,\n updateProductName: boolean = true\n): void {\n const project = xcode.project(pbxprojPath);\n project.parseSync();\n\n const [, nativeTarget] = findFirstNativeTarget(project);\n\n getBuildConfigurationsForListId(project, nativeTarget.buildConfigurationList).forEach(\n ([, item]: ConfigurationSectionEntry) => {\n if (item.buildSettings.PRODUCT_BUNDLE_IDENTIFIER === bundleIdentifier) {\n return;\n }\n\n item.buildSettings.PRODUCT_BUNDLE_IDENTIFIER = `\"${bundleIdentifier}\"`;\n\n if (updateProductName) {\n const productName = bundleIdentifier.split('.').pop();\n if (!productName?.includes('$')) {\n item.buildSettings.PRODUCT_NAME = productName;\n }\n }\n }\n );\n fs.writeFileSync(pbxprojPath, project.writeSync());\n}\n\n/**\n * Updates the bundle identifier for pbx projects inside the ios directory of the given project root\n *\n * @param {string} projectRoot Path to project root containing the ios directory\n * @param {string} bundleIdentifier Desired bundle identifier\n * @param {boolean} [updateProductName=true] Whether to update PRODUCT_NAME\n */\nfunction setBundleIdentifierForPbxproj(\n projectRoot: string,\n bundleIdentifier: string,\n updateProductName: boolean = true\n): void {\n // Get all pbx projects in the ${projectRoot}/ios directory\n let pbxprojPaths: string[] = [];\n try {\n pbxprojPaths = getAllPBXProjectPaths(projectRoot);\n } catch {}\n\n for (const pbxprojPath of pbxprojPaths) {\n updateBundleIdentifierForPbxproj(pbxprojPath, bundleIdentifier, updateProductName);\n }\n}\n\n/**\n * Reset bundle identifier field in Info.plist to use PRODUCT_BUNDLE_IDENTIFIER, as recommended by Apple.\n */\n\nconst defaultBundleId = '$(PRODUCT_BUNDLE_IDENTIFIER)';\n\nfunction resetAllPlistBundleIdentifiers(projectRoot: string): void {\n const infoPlistPaths = getAllInfoPlistPaths(projectRoot);\n\n for (const plistPath of infoPlistPaths) {\n resetPlistBundleIdentifier(plistPath);\n }\n}\n\nfunction resetPlistBundleIdentifier(plistPath: string): void {\n const rawPlist = fs.readFileSync(plistPath, 'utf8');\n const plistObject = plist.parse(rawPlist) as PlistObject;\n\n if (plistObject.CFBundleIdentifier) {\n if (plistObject.CFBundleIdentifier === defaultBundleId) return;\n\n // attempt to match default Info.plist format\n const format = { pretty: true, indent: `\\t` };\n\n const xml = plist.build(\n {\n ...plistObject,\n CFBundleIdentifier: defaultBundleId,\n },\n format\n );\n\n if (xml !== rawPlist) {\n fs.writeFileSync(plistPath, xml);\n }\n }\n}\n\nexport {\n getBundleIdentifier,\n setBundleIdentifier,\n getBundleIdentifierFromPbxproj,\n updateBundleIdentifierForPbxproj,\n setBundleIdentifierForPbxproj,\n resetAllPlistBundleIdentifiers,\n resetPlistBundleIdentifier,\n};\n"],"file":"BundleIdentifier.js"}
@@ -10,10 +10,8 @@ export declare function removeGoogleMapsAppDelegateImport(src: string): MergeRes
10
10
  export declare function addGoogleMapsAppDelegateInit(src: string, apiKey: string): MergeResults;
11
11
  export declare function removeGoogleMapsAppDelegateInit(src: string): MergeResults;
12
12
  /**
13
- * @param src
14
- * @param useGoogleMaps
15
- * @param googleMapsPath '../node_modules/react-native-maps'
16
- * @returns
13
+ * @param src The contents of the Podfile.
14
+ * @returns Podfile with Google Maps added.
17
15
  */
18
- export declare function addMapsCocoaPods(src: string, googleMapsPath: string): MergeResults;
16
+ export declare function addMapsCocoaPods(src: string): MergeResults;
19
17
  export declare function removeMapsCocoaPods(src: string): MergeResults;
package/build/ios/Maps.js CHANGED
@@ -14,30 +14,30 @@ exports.removeMapsCocoaPods = removeMapsCocoaPods;
14
14
  exports.setGoogleMapsApiKey = setGoogleMapsApiKey;
15
15
  exports.withMaps = void 0;
16
16
 
17
- function _debug() {
18
- const data = _interopRequireDefault(require("debug"));
17
+ function _fsExtra() {
18
+ const data = _interopRequireDefault(require("fs-extra"));
19
19
 
20
- _debug = function () {
20
+ _fsExtra = function () {
21
21
  return data;
22
22
  };
23
23
 
24
24
  return data;
25
25
  }
26
26
 
27
- function _fsExtra() {
28
- const data = _interopRequireDefault(require("fs-extra"));
27
+ function _path() {
28
+ const data = _interopRequireDefault(require("path"));
29
29
 
30
- _fsExtra = function () {
30
+ _path = function () {
31
31
  return data;
32
32
  };
33
33
 
34
34
  return data;
35
35
  }
36
36
 
37
- function _path() {
38
- const data = _interopRequireDefault(require("path"));
37
+ function _resolveFrom() {
38
+ const data = _interopRequireDefault(require("resolve-from"));
39
39
 
40
- _path = function () {
40
+ _resolveFrom = function () {
41
41
  return data;
42
42
  };
43
43
 
@@ -74,21 +74,12 @@ function _generateCode() {
74
74
  return data;
75
75
  }
76
76
 
77
- function _resolvePackageRootFolder() {
78
- const data = require("../utils/resolvePackageRootFolder");
79
-
80
- _resolvePackageRootFolder = function () {
81
- return data;
82
- };
83
-
84
- return data;
85
- }
86
-
87
77
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
88
78
 
89
- const debug = (0, _debug().default)('expo:config-plugins:ios:maps'); // Match against `UMModuleRegistryAdapter` (unimodules), and React Native without unimodules (Expo Modules).
79
+ const debug = require('debug')('expo:config-plugins:ios:maps'); // Match against `UMModuleRegistryAdapter` (unimodules), and React Native without unimodules (Expo Modules), and SDK +44 React AppDelegate subscriber.
80
+
90
81
 
91
- const MATCH_INIT = /(?:(self\.|_)(\w+)\s?=\s?\[\[UMModuleRegistryAdapter alloc\])|(?:RCTBridge\s?\*\s?(\w+)\s?=\s?\[\[RCTBridge alloc\])/g;
82
+ const MATCH_INIT = /(?:(self\.|_)(\w+)\s?=\s?\[\[UMModuleRegistryAdapter alloc\])|(?:RCTBridge\s?\*\s?(\w+)\s?=\s?\[\[RCTBridge alloc\])|(\[self\.reactDelegate createBridgeWithDelegate:self launchOptions:launchOptions\])/g;
92
83
  exports.MATCH_INIT = MATCH_INIT;
93
84
  const withGoogleMapsKey = (0, _iosPlugins().createInfoPlistPlugin)(setGoogleMapsApiKey, 'withGoogleMapsKey');
94
85
 
@@ -170,18 +161,16 @@ function removeGoogleMapsAppDelegateInit(src) {
170
161
  });
171
162
  }
172
163
  /**
173
- * @param src
174
- * @param useGoogleMaps
175
- * @param googleMapsPath '../node_modules/react-native-maps'
176
- * @returns
164
+ * @param src The contents of the Podfile.
165
+ * @returns Podfile with Google Maps added.
177
166
  */
178
167
 
179
168
 
180
- function addMapsCocoaPods(src, googleMapsPath) {
169
+ function addMapsCocoaPods(src) {
181
170
  return (0, _generateCode().mergeContents)({
182
171
  tag: 'react-native-maps',
183
172
  src,
184
- newSrc: ` pod 'react-native-google-maps', path: '${googleMapsPath}'`,
173
+ newSrc: ` pod 'react-native-google-maps', path: File.dirname(\`node --print "require.resolve('react-native-maps/package.json')"\`)`,
185
174
  anchor: /use_native_modules/,
186
175
  offset: 0,
187
176
  comment: '#'
@@ -196,12 +185,21 @@ function removeMapsCocoaPods(src) {
196
185
  }
197
186
 
198
187
  function isReactNativeMapsInstalled(projectRoot) {
199
- return (0, _resolvePackageRootFolder().resolvePackageRootFolder)(projectRoot, 'react-native-maps');
188
+ const resolved = _resolveFrom().default.silent(projectRoot, 'react-native-maps/package.json');
189
+
190
+ return resolved ? _path().default.dirname(resolved) : null;
200
191
  }
201
192
 
202
193
  function isReactNativeMapsAutolinked(config) {
203
- // TODO: Detect autolinking
204
- return true;
194
+ // Only add the native code changes if we know that the package is going to be linked natively.
195
+ // This is specifically for monorepo support where one app might have react-native-maps (adding it to the node_modules)
196
+ // but another app will not have it installed in the package.json, causing it to not be linked natively.
197
+ // This workaround only exists because react-native-maps doesn't have a config plugin vendored in the package.
198
+ // TODO: `react-native-maps` doesn't use Expo autolinking so we cannot safely disable the module.
199
+ return true; // return (
200
+ // !config._internal?.autolinkedModules ||
201
+ // config._internal.autolinkedModules.includes('react-native-maps')
202
+ // );
205
203
  }
206
204
 
207
205
  const withMapsCocoaPods = (config, {
@@ -220,11 +218,8 @@ const withMapsCocoaPods = (config, {
220
218
  debug('react-native-maps path:', googleMapsPath);
221
219
 
222
220
  if (isLinked && googleMapsPath && useGoogleMaps) {
223
- // Make the pod path relative to the ios folder.
224
- const googleMapsPodPath = _path().default.relative(config.modRequest.platformProjectRoot, googleMapsPath);
225
-
226
221
  try {
227
- results = addMapsCocoaPods(contents, googleMapsPodPath);
222
+ results = addMapsCocoaPods(contents);
228
223
  } catch (error) {
229
224
  if (error.code === 'ERR_NO_MATCH') {
230
225
  throw new Error(`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.`);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ios/Maps.ts"],"names":["debug","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","googleMapsPath","removeMapsCocoaPods","isReactNativeMapsInstalled","projectRoot","isReactNativeMapsAutolinked","filePath","path","modRequest","platformProjectRoot","contents","fs","readFile","results","isLinked","googleMapsPodPath","relative","error","code","Error","didMerge","didClear","writeFile","modResults","language"],"mappings":"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","sourcesContent":["import { ExpoConfig } from '@expo/config-types';\nimport Debug from 'debug';\nimport fs from 'fs-extra';\nimport path from 'path';\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';\nimport { resolvePackageRootFolder } from '../utils/resolvePackageRootFolder';\n\nconst debug = Debug('expo:config-plugins:ios:maps');\n\n// Match against `UMModuleRegistryAdapter` (unimodules), and React Native without unimodules (Expo Modules).\nexport const MATCH_INIT = /(?:(self\\.|_)(\\w+)\\s?=\\s?\\[\\[UMModuleRegistryAdapter alloc\\])|(?:RCTBridge\\s?\\*\\s?(\\w+)\\s?=\\s?\\[\\[RCTBridge alloc\\])/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\n * @param useGoogleMaps\n * @param googleMapsPath '../node_modules/react-native-maps'\n * @returns\n */\nexport function addMapsCocoaPods(src: string, googleMapsPath: string): MergeResults {\n return mergeContents({\n tag: 'react-native-maps',\n src,\n newSrc: ` pod 'react-native-google-maps', path: '${googleMapsPath}'`,\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 return resolvePackageRootFolder(projectRoot, 'react-native-maps');\n}\n\nfunction isReactNativeMapsAutolinked(config: Pick<ExpoConfig, '_internal'>): boolean {\n // TODO: Detect autolinking\n return true;\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 // Make the pod path relative to the ios folder.\n const googleMapsPodPath = path.relative(\n config.modRequest.platformProjectRoot,\n googleMapsPath\n );\n try {\n results = addMapsCocoaPods(contents, googleMapsPodPath);\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","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,7 +1,11 @@
1
1
  import { ExpoConfig } from '@expo/config-types';
2
+ import { XcodeProject } from 'xcode';
3
+ import { ConfigPlugin } from '../Plugin.types';
2
4
  import { InfoPlist } from './IosConfig.types';
3
- export declare const withDisplayName: import("..").ConfigPlugin<void>;
4
- export declare const withName: import("..").ConfigPlugin<void>;
5
+ export declare const withDisplayName: ConfigPlugin<void>;
6
+ export declare const withName: ConfigPlugin<void>;
7
+ /** Set the PRODUCT_NAME variable in the xcproj file based on the app.json name property. */
8
+ export declare const withProductName: ConfigPlugin;
5
9
  export declare function getName(config: Pick<ExpoConfig, 'name'>): string | null;
6
10
  /**
7
11
  * CFBundleDisplayName is used for most things: the name on the home screen, in
@@ -13,3 +17,4 @@ export declare function setDisplayName(configOrName: Pick<ExpoConfig, 'name'> |
13
17
  * sometimes on the App Store
14
18
  */
15
19
  export declare function setName(config: Pick<ExpoConfig, 'name'>, { CFBundleName, ...infoPlist }: InfoPlist): InfoPlist;
20
+ export declare function setProductName(config: Pick<ExpoConfig, 'name'>, project: XcodeProject): XcodeProject;
package/build/ios/Name.js CHANGED
@@ -6,7 +6,8 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.getName = getName;
7
7
  exports.setDisplayName = setDisplayName;
8
8
  exports.setName = setName;
9
- exports.withName = exports.withDisplayName = void 0;
9
+ exports.setProductName = setProductName;
10
+ exports.withProductName = exports.withName = exports.withDisplayName = void 0;
10
11
 
11
12
  function _iosPlugins() {
12
13
  const data = require("../plugins/ios-plugins");
@@ -18,11 +19,42 @@ function _iosPlugins() {
18
19
  return data;
19
20
  }
20
21
 
22
+ function _Target() {
23
+ const data = require("./Target");
24
+
25
+ _Target = function () {
26
+ return data;
27
+ };
28
+
29
+ return data;
30
+ }
31
+
32
+ function _Xcodeproj() {
33
+ const data = require("./utils/Xcodeproj");
34
+
35
+ _Xcodeproj = function () {
36
+ return data;
37
+ };
38
+
39
+ return data;
40
+ }
41
+
21
42
  const withDisplayName = (0, _iosPlugins().createInfoPlistPlugin)(setDisplayName, 'withDisplayName');
22
43
  exports.withDisplayName = withDisplayName;
23
44
  const withName = (0, _iosPlugins().createInfoPlistPlugin)(setName, 'withName');
45
+ /** Set the PRODUCT_NAME variable in the xcproj file based on the app.json name property. */
46
+
24
47
  exports.withName = withName;
25
48
 
49
+ const withProductName = config => {
50
+ return (0, _iosPlugins().withXcodeProject)(config, config => {
51
+ config.modResults = setProductName(config, config.modResults);
52
+ return config;
53
+ });
54
+ };
55
+
56
+ exports.withProductName = withProductName;
57
+
26
58
  function getName(config) {
27
59
  return typeof config.name === 'string' ? config.name : null;
28
60
  }
@@ -72,4 +104,29 @@ function setName(config, {
72
104
  CFBundleName: name
73
105
  };
74
106
  }
107
+
108
+ function setProductName(config, project) {
109
+ var _getName;
110
+
111
+ const name = (0, _Xcodeproj().sanitizedName)((_getName = getName(config)) !== null && _getName !== void 0 ? _getName : '');
112
+
113
+ if (!name) {
114
+ return project;
115
+ }
116
+
117
+ const quotedName = ensureQuotes(name);
118
+ const [, nativeTarget] = (0, _Target().findFirstNativeTarget)(project);
119
+ (0, _Xcodeproj().getBuildConfigurationsForListId)(project, nativeTarget.buildConfigurationList).forEach(([, item]) => {
120
+ item.buildSettings.PRODUCT_NAME = quotedName;
121
+ });
122
+ return project;
123
+ }
124
+
125
+ const ensureQuotes = value => {
126
+ if (!value.match(/^['"]/)) {
127
+ return `"${value}"`;
128
+ }
129
+
130
+ return value;
131
+ };
75
132
  //# sourceMappingURL=Name.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ios/Name.ts"],"names":["withDisplayName","setDisplayName","withName","setName","getName","config","name","configOrName","CFBundleDisplayName","infoPlist","CFBundleName"],"mappings":";;;;;;;;;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAGO,MAAMA,eAAe,GAAG,yCAAsBC,cAAtB,EAAsC,iBAAtC,CAAxB;;AAEA,MAAMC,QAAQ,GAAG,yCAAsBC,OAAtB,EAA+B,UAA/B,CAAjB;;;AAEA,SAASC,OAAT,CAAiBC,MAAjB,EAAmD;AACxD,SAAO,OAAOA,MAAM,CAACC,IAAd,KAAuB,QAAvB,GAAkCD,MAAM,CAACC,IAAzC,GAAgD,IAAvD;AACD;AAED;AACA;AACA;AACA;;;AACO,SAASL,cAAT,CACLM,YADK,EAEL;AAAEC,EAAAA,mBAAF;AAAuB,KAAGC;AAA1B,CAFK,EAGM;AACX,MAAIH,IAAmB,GAAG,IAA1B;;AACA,MAAI,OAAOC,YAAP,KAAwB,QAA5B,EAAsC;AACpCD,IAAAA,IAAI,GAAGC,YAAP;AACD,GAFD,MAEO;AACLD,IAAAA,IAAI,GAAGF,OAAO,CAACG,YAAD,CAAd;AACD;;AAED,MAAI,CAACD,IAAL,EAAW;AACT,WAAOG,SAAP;AACD;;AAED,SAAO,EACL,GAAGA,SADE;AAELD,IAAAA,mBAAmB,EAAEF;AAFhB,GAAP;AAID;AAED;AACA;AACA;AACA;;;AACO,SAASH,OAAT,CACLE,MADK,EAEL;AAAEK,EAAAA,YAAF;AAAgB,KAAGD;AAAnB,CAFK,EAGM;AACX,QAAMH,IAAI,GAAGF,OAAO,CAACC,MAAD,CAApB;;AAEA,MAAI,CAACC,IAAL,EAAW;AACT,WAAOG,SAAP;AACD;;AAED,SAAO,EACL,GAAGA,SADE;AAELC,IAAAA,YAAY,EAAEJ;AAFT,GAAP;AAID","sourcesContent":["import { ExpoConfig } from '@expo/config-types';\n\nimport { createInfoPlistPlugin } from '../plugins/ios-plugins';\nimport { InfoPlist } from './IosConfig.types';\n\nexport const withDisplayName = createInfoPlistPlugin(setDisplayName, 'withDisplayName');\n\nexport const withName = createInfoPlistPlugin(setName, 'withName');\n\nexport function getName(config: Pick<ExpoConfig, 'name'>) {\n return typeof config.name === 'string' ? config.name : null;\n}\n\n/**\n * CFBundleDisplayName is used for most things: the name on the home screen, in\n * notifications, and others.\n */\nexport function setDisplayName(\n configOrName: Pick<ExpoConfig, 'name'> | string,\n { CFBundleDisplayName, ...infoPlist }: InfoPlist\n): InfoPlist {\n let name: string | null = null;\n if (typeof configOrName === 'string') {\n name = configOrName;\n } else {\n name = getName(configOrName);\n }\n\n if (!name) {\n return infoPlist;\n }\n\n return {\n ...infoPlist,\n CFBundleDisplayName: name,\n };\n}\n\n/**\n * CFBundleName is recommended to be 16 chars or less and is used in lists, eg:\n * sometimes on the App Store\n */\nexport function setName(\n config: Pick<ExpoConfig, 'name'>,\n { CFBundleName, ...infoPlist }: InfoPlist\n): InfoPlist {\n const name = getName(config);\n\n if (!name) {\n return infoPlist;\n }\n\n return {\n ...infoPlist,\n CFBundleName: name,\n };\n}\n"],"file":"Name.js"}
1
+ {"version":3,"sources":["../../src/ios/Name.ts"],"names":["withDisplayName","setDisplayName","withName","setName","withProductName","config","modResults","setProductName","getName","name","configOrName","CFBundleDisplayName","infoPlist","CFBundleName","project","quotedName","ensureQuotes","nativeTarget","buildConfigurationList","forEach","item","buildSettings","PRODUCT_NAME","value","match"],"mappings":";;;;;;;;;;;AAIA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAMO,MAAMA,eAAe,GAAG,yCAAsBC,cAAtB,EAAsC,iBAAtC,CAAxB;;AAEA,MAAMC,QAAQ,GAAG,yCAAsBC,OAAtB,EAA+B,UAA/B,CAAjB;AAEP;;;;AACO,MAAMC,eAA6B,GAAGC,MAAM,IAAI;AACrD,SAAO,oCAAiBA,MAAjB,EAAyBA,MAAM,IAAI;AACxCA,IAAAA,MAAM,CAACC,UAAP,GAAoBC,cAAc,CAACF,MAAD,EAASA,MAAM,CAACC,UAAhB,CAAlC;AACA,WAAOD,MAAP;AACD,GAHM,CAAP;AAID,CALM;;;;AAOA,SAASG,OAAT,CAAiBH,MAAjB,EAAmD;AACxD,SAAO,OAAOA,MAAM,CAACI,IAAd,KAAuB,QAAvB,GAAkCJ,MAAM,CAACI,IAAzC,GAAgD,IAAvD;AACD;AAED;AACA;AACA;AACA;;;AACO,SAASR,cAAT,CACLS,YADK,EAEL;AAAEC,EAAAA,mBAAF;AAAuB,KAAGC;AAA1B,CAFK,EAGM;AACX,MAAIH,IAAmB,GAAG,IAA1B;;AACA,MAAI,OAAOC,YAAP,KAAwB,QAA5B,EAAsC;AACpCD,IAAAA,IAAI,GAAGC,YAAP;AACD,GAFD,MAEO;AACLD,IAAAA,IAAI,GAAGD,OAAO,CAACE,YAAD,CAAd;AACD;;AAED,MAAI,CAACD,IAAL,EAAW;AACT,WAAOG,SAAP;AACD;;AAED,SAAO,EACL,GAAGA,SADE;AAELD,IAAAA,mBAAmB,EAAEF;AAFhB,GAAP;AAID;AAED;AACA;AACA;AACA;;;AACO,SAASN,OAAT,CACLE,MADK,EAEL;AAAEQ,EAAAA,YAAF;AAAgB,KAAGD;AAAnB,CAFK,EAGM;AACX,QAAMH,IAAI,GAAGD,OAAO,CAACH,MAAD,CAApB;;AAEA,MAAI,CAACI,IAAL,EAAW;AACT,WAAOG,SAAP;AACD;;AAED,SAAO,EACL,GAAGA,SADE;AAELC,IAAAA,YAAY,EAAEJ;AAFT,GAAP;AAID;;AAEM,SAASF,cAAT,CACLF,MADK,EAELS,OAFK,EAGS;AAAA;;AACd,QAAML,IAAI,GAAG,4CAAcD,OAAO,CAACH,MAAD,CAArB,+CAAiC,EAAjC,CAAb;;AAEA,MAAI,CAACI,IAAL,EAAW;AACT,WAAOK,OAAP;AACD;;AACD,QAAMC,UAAU,GAAGC,YAAY,CAACP,IAAD,CAA/B;AAEA,QAAM,GAAGQ,YAAH,IAAmB,qCAAsBH,OAAtB,CAAzB;AAEA,oDAAgCA,OAAhC,EAAyCG,YAAY,CAACC,sBAAtD,EAA8EC,OAA9E,CACE,CAAC,GAAGC,IAAH,CAAD,KAAyC;AACvCA,IAAAA,IAAI,CAACC,aAAL,CAAmBC,YAAnB,GAAkCP,UAAlC;AACD,GAHH;AAMA,SAAOD,OAAP;AACD;;AAED,MAAME,YAAY,GAAIO,KAAD,IAAmB;AACtC,MAAI,CAACA,KAAK,CAACC,KAAN,CAAY,OAAZ,CAAL,EAA2B;AACzB,WAAQ,IAAGD,KAAM,GAAjB;AACD;;AACD,SAAOA,KAAP;AACD,CALD","sourcesContent":["import { ExpoConfig } from '@expo/config-types';\nimport { XcodeProject } from 'xcode';\n\nimport { ConfigPlugin } from '../Plugin.types';\nimport { createInfoPlistPlugin, withXcodeProject } from '../plugins/ios-plugins';\nimport { InfoPlist } from './IosConfig.types';\nimport { findFirstNativeTarget } from './Target';\nimport {\n ConfigurationSectionEntry,\n getBuildConfigurationsForListId,\n sanitizedName,\n} from './utils/Xcodeproj';\n\nexport const withDisplayName = createInfoPlistPlugin(setDisplayName, 'withDisplayName');\n\nexport const withName = createInfoPlistPlugin(setName, 'withName');\n\n/** Set the PRODUCT_NAME variable in the xcproj file based on the app.json name property. */\nexport const withProductName: ConfigPlugin = config => {\n return withXcodeProject(config, config => {\n config.modResults = setProductName(config, config.modResults);\n return config;\n });\n};\n\nexport function getName(config: Pick<ExpoConfig, 'name'>) {\n return typeof config.name === 'string' ? config.name : null;\n}\n\n/**\n * CFBundleDisplayName is used for most things: the name on the home screen, in\n * notifications, and others.\n */\nexport function setDisplayName(\n configOrName: Pick<ExpoConfig, 'name'> | string,\n { CFBundleDisplayName, ...infoPlist }: InfoPlist\n): InfoPlist {\n let name: string | null = null;\n if (typeof configOrName === 'string') {\n name = configOrName;\n } else {\n name = getName(configOrName);\n }\n\n if (!name) {\n return infoPlist;\n }\n\n return {\n ...infoPlist,\n CFBundleDisplayName: name,\n };\n}\n\n/**\n * CFBundleName is recommended to be 16 chars or less and is used in lists, eg:\n * sometimes on the App Store\n */\nexport function setName(\n config: Pick<ExpoConfig, 'name'>,\n { CFBundleName, ...infoPlist }: InfoPlist\n): InfoPlist {\n const name = getName(config);\n\n if (!name) {\n return infoPlist;\n }\n\n return {\n ...infoPlist,\n CFBundleName: name,\n };\n}\n\nexport function setProductName(\n config: Pick<ExpoConfig, 'name'>,\n project: XcodeProject\n): XcodeProject {\n const name = sanitizedName(getName(config) ?? '');\n\n if (!name) {\n return project;\n }\n const quotedName = ensureQuotes(name);\n\n const [, nativeTarget] = findFirstNativeTarget(project);\n\n getBuildConfigurationsForListId(project, nativeTarget.buildConfigurationList).forEach(\n ([, item]: ConfigurationSectionEntry) => {\n item.buildSettings.PRODUCT_NAME = quotedName;\n }\n );\n\n return project;\n}\n\nconst ensureQuotes = (value: string) => {\n if (!value.match(/^['\"]/)) {\n return `\"${value}\"`;\n }\n return value;\n};\n"],"file":"Name.js"}