@expo/config-plugins 4.1.0 → 4.1.3

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 (80) hide show
  1. package/README.md +17 -2
  2. package/build/android/BuildProperties.d.ts +28 -0
  3. package/build/android/BuildProperties.js +96 -0
  4. package/build/android/BuildProperties.js.map +1 -0
  5. package/build/android/EasBuild.js +8 -8
  6. package/build/android/EasBuild.js.map +1 -1
  7. package/build/android/GoogleServices.js +16 -14
  8. package/build/android/GoogleServices.js.map +1 -1
  9. package/build/android/Manifest.d.ts +7 -0
  10. package/build/android/Manifest.js +43 -5
  11. package/build/android/Manifest.js.map +1 -1
  12. package/build/android/Package.js +27 -15
  13. package/build/android/Package.js.map +1 -1
  14. package/build/android/Paths.js +6 -6
  15. package/build/android/Paths.js.map +1 -1
  16. package/build/android/Permissions.d.ts +3 -1
  17. package/build/android/Permissions.js +42 -28
  18. package/build/android/Permissions.js.map +1 -1
  19. package/build/android/codeMod.js +1 -1
  20. package/build/android/codeMod.js.map +1 -1
  21. package/build/android/index.d.ts +2 -2
  22. package/build/android/index.js +18 -18
  23. package/build/android/index.js.map +1 -1
  24. package/build/ios/BuildProperties.d.ts +27 -0
  25. package/build/ios/BuildProperties.js +83 -0
  26. package/build/ios/BuildProperties.js.map +1 -0
  27. package/build/ios/BuildScheme.js +6 -3
  28. package/build/ios/BuildScheme.js.map +1 -1
  29. package/build/ios/BundleIdentifier.js +6 -6
  30. package/build/ios/BundleIdentifier.js.map +1 -1
  31. package/build/ios/Entitlements.d.ts +5 -1
  32. package/build/ios/Entitlements.js +63 -52
  33. package/build/ios/Entitlements.js.map +1 -1
  34. package/build/ios/Google.js +5 -5
  35. package/build/ios/Google.js.map +1 -1
  36. package/build/ios/Locales.js +14 -14
  37. package/build/ios/Locales.js.map +1 -1
  38. package/build/ios/Maps.js +5 -5
  39. package/build/ios/Maps.js.map +1 -1
  40. package/build/ios/Paths.d.ts +1 -3
  41. package/build/ios/Paths.js +29 -24
  42. package/build/ios/Paths.js.map +1 -1
  43. package/build/ios/ProvisioningProfile.js +4 -4
  44. package/build/ios/ProvisioningProfile.js.map +1 -1
  45. package/build/ios/Swift.js +5 -5
  46. package/build/ios/Swift.js.map +1 -1
  47. package/build/ios/Target.d.ts +1 -0
  48. package/build/ios/Target.js +11 -1
  49. package/build/ios/Target.js.map +1 -1
  50. package/build/ios/XcodeProjectFile.js +5 -5
  51. package/build/ios/XcodeProjectFile.js.map +1 -1
  52. package/build/ios/index.d.ts +2 -2
  53. package/build/ios/index.js +19 -19
  54. package/build/ios/index.js.map +1 -1
  55. package/build/ios/utils/Xcodeproj.d.ts +2 -1
  56. package/build/ios/utils/Xcodeproj.js +4 -1
  57. package/build/ios/utils/Xcodeproj.js.map +1 -1
  58. package/build/plugins/ios-plugins.d.ts +2 -2
  59. package/build/plugins/ios-plugins.js.map +1 -1
  60. package/build/plugins/withIosBaseMods.js +27 -7
  61. package/build/plugins/withIosBaseMods.js.map +1 -1
  62. package/build/utils/BuildProperties.types.d.ts +25 -0
  63. package/build/utils/BuildProperties.types.js +2 -0
  64. package/build/utils/BuildProperties.types.js.map +1 -0
  65. package/build/utils/XML.js +8 -6
  66. package/build/utils/XML.js.map +1 -1
  67. package/build/utils/fs.d.ts +4 -0
  68. package/build/utils/fs.js +56 -0
  69. package/build/utils/fs.js.map +1 -0
  70. package/build/utils/modules.js +1 -1
  71. package/build/utils/modules.js.map +1 -1
  72. package/build/utils/versions.js +2 -2
  73. package/build/utils/versions.js.map +1 -1
  74. package/package.json +3 -5
  75. package/build/android/JsEngine.d.ts +0 -8
  76. package/build/android/JsEngine.js +0 -59
  77. package/build/android/JsEngine.js.map +0 -1
  78. package/build/ios/JsEngine.d.ts +0 -8
  79. package/build/ios/JsEngine.js +0 -47
  80. package/build/ios/JsEngine.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/android/Package.ts"],"names":["debug","withPackageManifest","setPackageInAndroidManifest","withPackageGradle","config","modResults","language","contents","setPackageInBuildGradle","withPackageRefactor","renamePackageOnDisk","modRequest","projectRoot","getPackage","android","package","getPackageRoot","type","path","join","getCurrentPackageName","packageRoot","mainApplication","packagePath","dirname","packagePathParts","relative","split","sep","filter","Boolean","getCurrentPackageForProjectFile","fileName","filePath","getCurrentPackageNameForType","newPackageName","renamePackageOnDiskForType","packageName","currentPackageName","currentPackagePath","newPackagePath","fs","mkdirpSync","cwd","forEach","relativePath","filepath","lstatSync","isFile","moveSync","oldPathParts","length","pathToCheck","files","readdirSync","rmdirSync","pop","filesToUpdate","absolute","push","readFileSync","toString","replace","RegExp","writeFileSync","e","buildGradle","pattern","androidManifest","manifest","$","getApplicationIdAsync","buildGradlePath","pathExists","readFile","matchResult","match"],"mappings":"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","sourcesContent":["import { ExpoConfig } from '@expo/config-types';\nimport Debug from 'debug';\nimport fs from 'fs-extra';\nimport { sync as globSync } from 'glob';\nimport path from 'path';\n\nimport { ConfigPlugin } from '../Plugin.types';\nimport { createAndroidManifestPlugin, withAppBuildGradle } from '../plugins/android-plugins';\nimport { withDangerousMod } from '../plugins/withDangerousMod';\nimport { directoryExistsAsync } from '../utils/modules';\nimport { addWarningAndroid } from '../utils/warnings';\nimport { AndroidManifest } from './Manifest';\nimport { getAppBuildGradleFilePath, getProjectFilePath } from './Paths';\n\nconst debug = Debug('expo:config-plugins:android:package');\n\nexport const withPackageManifest = createAndroidManifestPlugin(\n setPackageInAndroidManifest,\n 'withPackageManifest'\n);\n\nexport const withPackageGradle: ConfigPlugin = config => {\n return withAppBuildGradle(config, config => {\n if (config.modResults.language === 'groovy') {\n config.modResults.contents = setPackageInBuildGradle(config, config.modResults.contents);\n } else {\n addWarningAndroid(\n 'android.package',\n `Cannot automatically configure app build.gradle if it's not groovy`\n );\n }\n return config;\n });\n};\n\nexport const withPackageRefactor: ConfigPlugin = config => {\n return withDangerousMod(config, [\n 'android',\n async config => {\n await renamePackageOnDisk(config, config.modRequest.projectRoot);\n return config;\n },\n ]);\n};\n\nexport function getPackage(config: Pick<ExpoConfig, 'android'>) {\n return config.android?.package ?? null;\n}\n\nfunction getPackageRoot(projectRoot: string, type: 'main' | 'debug') {\n return path.join(projectRoot, 'android', 'app', 'src', type, 'java');\n}\n\nfunction getCurrentPackageName(projectRoot: string, packageRoot: string) {\n const mainApplication = getProjectFilePath(projectRoot, 'MainApplication');\n const packagePath = path.dirname(mainApplication);\n const packagePathParts = path.relative(packageRoot, packagePath).split(path.sep).filter(Boolean);\n\n return packagePathParts.join('.');\n}\n\nfunction getCurrentPackageForProjectFile(\n projectRoot: string,\n packageRoot: string,\n fileName: string,\n type: string\n) {\n const filePath = globSync(\n path.join(projectRoot, `android/app/src/${type}/java/**/${fileName}.@(java|kt)`)\n )[0];\n\n if (!filePath) {\n return null;\n }\n\n const packagePath = path.dirname(filePath);\n const packagePathParts = path.relative(packageRoot, packagePath).split(path.sep).filter(Boolean);\n\n return packagePathParts.join('.');\n}\n\nfunction getCurrentPackageNameForType(projectRoot: string, type: string): string | null {\n const packageRoot = getPackageRoot(projectRoot, type as any);\n\n if (type === 'main') {\n return getCurrentPackageName(projectRoot, packageRoot);\n }\n // debug, etc..\n return getCurrentPackageForProjectFile(projectRoot, packageRoot, '*', type);\n}\n\n// NOTE(brentvatne): this assumes that our MainApplication.java file is in the root of the package\n// this makes sense for standard react-native projects but may not apply in customized projects, so if\n// we want this to be runnable in any app we need to handle other possibilities\nexport async function renamePackageOnDisk(\n config: Pick<ExpoConfig, 'android'>,\n projectRoot: string\n) {\n const newPackageName = getPackage(config);\n if (newPackageName === null) {\n return;\n }\n\n for (const type of ['main', 'debug']) {\n await renamePackageOnDiskForType({ projectRoot, type, packageName: newPackageName });\n }\n}\n\nexport async function renamePackageOnDiskForType({\n projectRoot,\n type,\n packageName,\n}: {\n projectRoot: string;\n type: string;\n packageName: string;\n}) {\n if (!packageName) {\n return;\n }\n\n const currentPackageName = getCurrentPackageNameForType(projectRoot, type);\n debug(`Found package \"${currentPackageName}\" for type \"${type}\"`);\n if (!currentPackageName || currentPackageName === packageName) {\n return;\n }\n debug(`Refactor \"${currentPackageName}\" to \"${packageName}\" for type \"${type}\"`);\n const packageRoot = getPackageRoot(projectRoot, type as any);\n // Set up our paths\n if (!(await directoryExistsAsync(packageRoot))) {\n debug(`- skipping refactor of missing directory: ${packageRoot}`);\n return;\n }\n\n const currentPackagePath = path.join(packageRoot, ...currentPackageName.split('.'));\n const newPackagePath = path.join(packageRoot, ...packageName.split('.'));\n\n // Create the new directory\n fs.mkdirpSync(newPackagePath);\n\n // Move everything from the old directory over\n globSync('**/*', { cwd: currentPackagePath }).forEach(relativePath => {\n const filepath = path.join(currentPackagePath, relativePath);\n if (fs.lstatSync(filepath).isFile()) {\n fs.moveSync(filepath, path.join(newPackagePath, relativePath));\n } else {\n fs.mkdirpSync(filepath);\n }\n });\n\n // Remove the old directory recursively from com/old/package to com/old and com,\n // as long as the directories are empty\n const oldPathParts = currentPackageName.split('.');\n while (oldPathParts.length) {\n const pathToCheck = path.join(packageRoot, ...oldPathParts);\n try {\n const files = fs.readdirSync(pathToCheck);\n if (files.length === 0) {\n fs.rmdirSync(pathToCheck);\n }\n } finally {\n oldPathParts.pop();\n }\n }\n\n const filesToUpdate = [...globSync('**/*', { cwd: newPackagePath, absolute: true })];\n // Only update the BUCK file to match the main package name\n if (type === 'main') {\n filesToUpdate.push(path.join(projectRoot, 'android', 'app', 'BUCK'));\n }\n // Replace all occurrences of the path in the project\n filesToUpdate.forEach((filepath: string) => {\n try {\n if (fs.lstatSync(filepath).isFile()) {\n let contents = fs.readFileSync(filepath).toString();\n contents = contents.replace(new RegExp(currentPackageName!, 'g'), packageName);\n fs.writeFileSync(filepath, contents);\n }\n } catch (e) {\n debug(`Error updating \"${filepath}\" for type \"${type}\"`);\n }\n });\n}\n\nexport function setPackageInBuildGradle(config: Pick<ExpoConfig, 'android'>, buildGradle: string) {\n const packageName = getPackage(config);\n if (packageName === null) {\n return buildGradle;\n }\n\n const pattern = new RegExp(`applicationId ['\"].*['\"]`);\n return buildGradle.replace(pattern, `applicationId '${packageName}'`);\n}\n\nexport function setPackageInAndroidManifest(\n config: Pick<ExpoConfig, 'android'>,\n androidManifest: AndroidManifest\n) {\n const packageName = getPackage(config);\n\n if (packageName) {\n androidManifest.manifest.$.package = packageName;\n } else {\n delete androidManifest.manifest.$.package;\n }\n\n return androidManifest;\n}\n\nexport async function getApplicationIdAsync(projectRoot: string): Promise<string | null> {\n const buildGradlePath = getAppBuildGradleFilePath(projectRoot);\n if (!(await fs.pathExists(buildGradlePath))) {\n return null;\n }\n const buildGradle = await fs.readFile(buildGradlePath, 'utf8');\n const matchResult = buildGradle.match(/applicationId ['\"](.*)['\"]/);\n // TODO add fallback for legacy cases to read from AndroidManifest.xml\n return matchResult?.[1] ?? null;\n}\n"],"file":"Package.js"}
1
+ {"version":3,"sources":["../../src/android/Package.ts"],"names":["debug","withPackageManifest","setPackageInAndroidManifest","withPackageGradle","config","modResults","language","contents","setPackageInBuildGradle","withPackageRefactor","renamePackageOnDisk","modRequest","projectRoot","getPackage","android","package","getPackageRoot","type","path","join","getCurrentPackageName","packageRoot","mainApplication","packagePath","dirname","packagePathParts","relative","split","sep","filter","Boolean","getCurrentPackageForProjectFile","fileName","filePath","getCurrentPackageNameForType","newPackageName","renamePackageOnDiskForType","packageName","currentPackageName","currentPackagePath","newPackagePath","fs","mkdirSync","recursive","cwd","forEach","relativePath","filepath","lstatSync","isFile","moveFileSync","oldPathParts","length","pathToCheck","files","readdirSync","rmdirSync","pop","filesToUpdate","absolute","push","readFileSync","toString","replace","RegExp","writeFileSync","src","dest","renameSync","buildGradle","pattern","androidManifest","manifest","$","getApplicationIdAsync","buildGradlePath","existsSync","promises","readFile","matchResult","match"],"mappings":"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","sourcesContent":["import { ExpoConfig } from '@expo/config-types';\nimport Debug from 'debug';\nimport fs from 'fs';\nimport { sync as globSync } from 'glob';\nimport path from 'path';\n\nimport { ConfigPlugin } from '../Plugin.types';\nimport { createAndroidManifestPlugin, withAppBuildGradle } from '../plugins/android-plugins';\nimport { withDangerousMod } from '../plugins/withDangerousMod';\nimport { directoryExistsAsync } from '../utils/modules';\nimport { addWarningAndroid } from '../utils/warnings';\nimport { AndroidManifest } from './Manifest';\nimport { getAppBuildGradleFilePath, getProjectFilePath } from './Paths';\n\nconst debug = Debug('expo:config-plugins:android:package');\n\nexport const withPackageManifest = createAndroidManifestPlugin(\n setPackageInAndroidManifest,\n 'withPackageManifest'\n);\n\nexport const withPackageGradle: ConfigPlugin = config => {\n return withAppBuildGradle(config, config => {\n if (config.modResults.language === 'groovy') {\n config.modResults.contents = setPackageInBuildGradle(config, config.modResults.contents);\n } else {\n addWarningAndroid(\n 'android.package',\n `Cannot automatically configure app build.gradle if it's not groovy`\n );\n }\n return config;\n });\n};\n\nexport const withPackageRefactor: ConfigPlugin = config => {\n return withDangerousMod(config, [\n 'android',\n async config => {\n await renamePackageOnDisk(config, config.modRequest.projectRoot);\n return config;\n },\n ]);\n};\n\nexport function getPackage(config: Pick<ExpoConfig, 'android'>) {\n return config.android?.package ?? null;\n}\n\nfunction getPackageRoot(projectRoot: string, type: 'main' | 'debug') {\n return path.join(projectRoot, 'android', 'app', 'src', type, 'java');\n}\n\nfunction getCurrentPackageName(projectRoot: string, packageRoot: string) {\n const mainApplication = getProjectFilePath(projectRoot, 'MainApplication');\n const packagePath = path.dirname(mainApplication);\n const packagePathParts = path.relative(packageRoot, packagePath).split(path.sep).filter(Boolean);\n\n return packagePathParts.join('.');\n}\n\nfunction getCurrentPackageForProjectFile(\n projectRoot: string,\n packageRoot: string,\n fileName: string,\n type: string\n) {\n const filePath = globSync(\n path.join(projectRoot, `android/app/src/${type}/java/**/${fileName}.@(java|kt)`)\n )[0];\n\n if (!filePath) {\n return null;\n }\n\n const packagePath = path.dirname(filePath);\n const packagePathParts = path.relative(packageRoot, packagePath).split(path.sep).filter(Boolean);\n\n return packagePathParts.join('.');\n}\n\nfunction getCurrentPackageNameForType(projectRoot: string, type: string): string | null {\n const packageRoot = getPackageRoot(projectRoot, type as any);\n\n if (type === 'main') {\n return getCurrentPackageName(projectRoot, packageRoot);\n }\n // debug, etc..\n return getCurrentPackageForProjectFile(projectRoot, packageRoot, '*', type);\n}\n\n// NOTE(brentvatne): this assumes that our MainApplication.java file is in the root of the package\n// this makes sense for standard react-native projects but may not apply in customized projects, so if\n// we want this to be runnable in any app we need to handle other possibilities\nexport async function renamePackageOnDisk(\n config: Pick<ExpoConfig, 'android'>,\n projectRoot: string\n) {\n const newPackageName = getPackage(config);\n if (newPackageName === null) {\n return;\n }\n\n for (const type of ['main', 'debug']) {\n await renamePackageOnDiskForType({ projectRoot, type, packageName: newPackageName });\n }\n}\n\nexport async function renamePackageOnDiskForType({\n projectRoot,\n type,\n packageName,\n}: {\n projectRoot: string;\n type: string;\n packageName: string;\n}) {\n if (!packageName) {\n return;\n }\n\n const currentPackageName = getCurrentPackageNameForType(projectRoot, type);\n debug(`Found package \"${currentPackageName}\" for type \"${type}\"`);\n if (!currentPackageName || currentPackageName === packageName) {\n return;\n }\n debug(`Refactor \"${currentPackageName}\" to \"${packageName}\" for type \"${type}\"`);\n const packageRoot = getPackageRoot(projectRoot, type as any);\n // Set up our paths\n if (!(await directoryExistsAsync(packageRoot))) {\n debug(`- skipping refactor of missing directory: ${packageRoot}`);\n return;\n }\n\n const currentPackagePath = path.join(packageRoot, ...currentPackageName.split('.'));\n const newPackagePath = path.join(packageRoot, ...packageName.split('.'));\n\n // Create the new directory\n fs.mkdirSync(newPackagePath, { recursive: true });\n\n // Move everything from the old directory over\n globSync('**/*', { cwd: currentPackagePath }).forEach(relativePath => {\n const filepath = path.join(currentPackagePath, relativePath);\n if (fs.lstatSync(filepath).isFile()) {\n moveFileSync(filepath, path.join(newPackagePath, relativePath));\n } else {\n fs.mkdirSync(filepath, { recursive: true });\n }\n });\n\n // Remove the old directory recursively from com/old/package to com/old and com,\n // as long as the directories are empty\n const oldPathParts = currentPackageName.split('.');\n while (oldPathParts.length) {\n const pathToCheck = path.join(packageRoot, ...oldPathParts);\n try {\n const files = fs.readdirSync(pathToCheck);\n if (files.length === 0) {\n fs.rmdirSync(pathToCheck);\n }\n } finally {\n oldPathParts.pop();\n }\n }\n\n const filesToUpdate = [...globSync('**/*', { cwd: newPackagePath, absolute: true })];\n // Only update the BUCK file to match the main package name\n if (type === 'main') {\n filesToUpdate.push(path.join(projectRoot, 'android', 'app', 'BUCK'));\n }\n // Replace all occurrences of the path in the project\n filesToUpdate.forEach((filepath: string) => {\n try {\n if (fs.lstatSync(filepath).isFile()) {\n let contents = fs.readFileSync(filepath).toString();\n contents = contents.replace(new RegExp(currentPackageName!, 'g'), packageName);\n fs.writeFileSync(filepath, contents);\n }\n } catch {\n debug(`Error updating \"${filepath}\" for type \"${type}\"`);\n }\n });\n}\n\nfunction moveFileSync(src: string, dest: string) {\n fs.mkdirSync(path.dirname(dest), { recursive: true });\n fs.renameSync(src, dest);\n}\n\nexport function setPackageInBuildGradle(config: Pick<ExpoConfig, 'android'>, buildGradle: string) {\n const packageName = getPackage(config);\n if (packageName === null) {\n return buildGradle;\n }\n\n const pattern = new RegExp(`applicationId ['\"].*['\"]`);\n return buildGradle.replace(pattern, `applicationId '${packageName}'`);\n}\n\nexport function setPackageInAndroidManifest(\n config: Pick<ExpoConfig, 'android'>,\n androidManifest: AndroidManifest\n) {\n const packageName = getPackage(config);\n\n if (packageName) {\n androidManifest.manifest.$.package = packageName;\n } else {\n delete androidManifest.manifest.$.package;\n }\n\n return androidManifest;\n}\n\nexport async function getApplicationIdAsync(projectRoot: string): Promise<string | null> {\n const buildGradlePath = getAppBuildGradleFilePath(projectRoot);\n if (!fs.existsSync(buildGradlePath)) {\n return null;\n }\n const buildGradle = await fs.promises.readFile(buildGradlePath, 'utf8');\n const matchResult = buildGradle.match(/applicationId ['\"](.*)['\"]/);\n // TODO add fallback for legacy cases to read from AndroidManifest.xml\n return matchResult?.[1] ?? null;\n}\n"],"file":"Package.js"}
@@ -29,10 +29,10 @@ function _assert() {
29
29
  return data;
30
30
  }
31
31
 
32
- function _fsExtra() {
33
- const data = _interopRequireDefault(require("fs-extra"));
32
+ function _fs() {
33
+ const data = _interopRequireDefault(require("fs"));
34
34
 
35
- _fsExtra = function () {
35
+ _fs = function () {
36
36
  return data;
37
37
  };
38
38
 
@@ -114,7 +114,7 @@ function getLanguage(filePath) {
114
114
  function getFileInfo(filePath) {
115
115
  return {
116
116
  path: path().normalize(filePath),
117
- contents: _fsExtra().default.readFileSync(filePath, 'utf8'),
117
+ contents: _fs().default.readFileSync(filePath, 'utf8'),
118
118
  language: getLanguage(filePath)
119
119
  };
120
120
  }
@@ -133,9 +133,9 @@ function getGradleFilePath(projectRoot, gradleName) {
133
133
  const groovyPath = path().resolve(projectRoot, `${gradleName}.gradle`);
134
134
  const ktPath = path().resolve(projectRoot, `${gradleName}.gradle.kts`);
135
135
 
136
- const isGroovy = _fsExtra().default.pathExistsSync(groovyPath);
136
+ const isGroovy = _fs().default.existsSync(groovyPath);
137
137
 
138
- const isKotlin = !isGroovy && _fsExtra().default.pathExistsSync(ktPath);
138
+ const isKotlin = !isGroovy && _fs().default.existsSync(ktPath);
139
139
 
140
140
  if (!isGroovy && !isKotlin) {
141
141
  throw new Error(`Failed to find '${gradleName}.gradle' file for project: ${projectRoot}.`);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/android/Paths.ts"],"names":["getProjectFilePath","projectRoot","name","filePath","path","join","getLanguage","extension","extname","UnexpectedError","getFileInfo","normalize","contents","fs","readFileSync","language","getMainApplicationAsync","getMainActivityAsync","getGradleFilePath","gradleName","groovyPath","resolve","ktPath","isGroovy","pathExistsSync","isKotlin","Error","getProjectBuildGradleFilePath","getProjectBuildGradleAsync","getSettingsGradleFilePath","getSettingsGradleAsync","getAppBuildGradleFilePath","getAppBuildGradleAsync","getProjectPathOrThrowAsync","projectPath","getAndroidManifestAsync","getResourceFolderAsync","getResourceXMLPathAsync","kind","resourcePath"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;AAYO,SAASA,kBAAT,CAA4BC,WAA5B,EAAiDC,IAAjD,EAAuE;AAC5E,QAAMC,QAAQ,GAAG,kBACfC,IAAI,GAACC,IAAL,CAAUJ,WAAV,EAAwB,gCAA+BC,IAAK,aAA5D,CADe,EAEf,CAFe,CAAjB;AAGA,yBACEC,QADF,EAEG,iBAAgBD,IAAK,iDAAgDD,WAAY,GAFpF;AAKA,SAAOE,QAAP;AACD;;AAED,SAASG,WAAT,CAAqBH,QAArB,EAAiE;AAC/D,QAAMI,SAAS,GAAGH,IAAI,GAACI,OAAL,CAAaL,QAAb,CAAlB;;AACA,UAAQI,SAAR;AACE,SAAK,OAAL;AACE,aAAO,MAAP;;AACF,SAAK,MAAL;AACA,SAAK,KAAL;AACE,aAAO,IAAP;;AACF,SAAK,SAAL;AACA,SAAK,SAAL;AACE,aAAO,QAAP;;AACF;AACE,YAAM,KAAIE,yBAAJ,EAAqB,sCAAqCF,SAAU,EAApE,CAAN;AAVJ;AAYD;;AAEM,SAASG,WAAT,CAAqBP,QAArB,EAAuC;AAC5C,SAAO;AACLC,IAAAA,IAAI,EAAEA,IAAI,GAACO,SAAL,CAAeR,QAAf,CADD;AAELS,IAAAA,QAAQ,EAAEC,mBAAGC,YAAH,CAAgBX,QAAhB,EAA0B,MAA1B,CAFL;AAGLY,IAAAA,QAAQ,EAAET,WAAW,CAACH,QAAD;AAHhB,GAAP;AAKD;;AAEM,eAAea,uBAAf,CACLf,WADK,EAE4B;AACjC,QAAME,QAAQ,GAAGH,kBAAkB,CAACC,WAAD,EAAc,iBAAd,CAAnC;AACA,SAAOS,WAAW,CAACP,QAAD,CAAlB;AACD;;AAEM,eAAec,oBAAf,CAAoChB,WAApC,EAA0F;AAC/F,QAAME,QAAQ,GAAGH,kBAAkB,CAACC,WAAD,EAAc,cAAd,CAAnC;AACA,SAAOS,WAAW,CAACP,QAAD,CAAlB;AACD;;AAEM,SAASe,iBAAT,CAA2BjB,WAA3B,EAAgDkB,UAAhD,EAA4E;AACjF,QAAMC,UAAU,GAAGhB,IAAI,GAACiB,OAAL,CAAapB,WAAb,EAA2B,GAAEkB,UAAW,SAAxC,CAAnB;AACA,QAAMG,MAAM,GAAGlB,IAAI,GAACiB,OAAL,CAAapB,WAAb,EAA2B,GAAEkB,UAAW,aAAxC,CAAf;;AAEA,QAAMI,QAAQ,GAAGV,mBAAGW,cAAH,CAAkBJ,UAAlB,CAAjB;;AACA,QAAMK,QAAQ,GAAG,CAACF,QAAD,IAAaV,mBAAGW,cAAH,CAAkBF,MAAlB,CAA9B;;AAEA,MAAI,CAACC,QAAD,IAAa,CAACE,QAAlB,EAA4B;AAC1B,UAAM,IAAIC,KAAJ,CAAW,mBAAkBP,UAAW,8BAA6BlB,WAAY,GAAjF,CAAN;AACD;;AACD,QAAME,QAAQ,GAAGoB,QAAQ,GAAGH,UAAH,GAAgBE,MAAzC;AACA,SAAOnB,QAAP;AACD;;AAEM,SAASwB,6BAAT,CAAuC1B,WAAvC,EAAoE;AACzE,SAAOiB,iBAAiB,CAACd,IAAI,GAACC,IAAL,CAAUJ,WAAV,EAAuB,SAAvB,CAAD,EAAoC,OAApC,CAAxB;AACD;;AAEM,eAAe2B,0BAAf,CAA0C3B,WAA1C,EAA2F;AAChG,SAAOS,WAAW,CAACiB,6BAA6B,CAAC1B,WAAD,CAA9B,CAAlB;AACD;;AAEM,SAAS4B,yBAAT,CAAmC5B,WAAnC,EAAgE;AACrE,SAAOiB,iBAAiB,CAACd,IAAI,GAACC,IAAL,CAAUJ,WAAV,EAAuB,SAAvB,CAAD,EAAoC,UAApC,CAAxB;AACD;;AAEM,eAAe6B,sBAAf,CAAsC7B,WAAtC,EAAuF;AAC5F,SAAOS,WAAW,CAACmB,yBAAyB,CAAC5B,WAAD,CAA1B,CAAlB;AACD;;AAEM,SAAS8B,yBAAT,CAAmC9B,WAAnC,EAAgE;AACrE,SAAOiB,iBAAiB,CAACd,IAAI,GAACC,IAAL,CAAUJ,WAAV,EAAuB,SAAvB,EAAkC,KAAlC,CAAD,EAA2C,OAA3C,CAAxB;AACD;;AAEM,eAAe+B,sBAAf,CAAsC/B,WAAtC,EAAuF;AAC5F,SAAOS,WAAW,CAACqB,yBAAyB,CAAC9B,WAAD,CAA1B,CAAlB;AACD;;AAEM,eAAegC,0BAAf,CAA0ChC,WAA1C,EAAgF;AACrF,QAAMiC,WAAW,GAAG9B,IAAI,GAACC,IAAL,CAAUJ,WAAV,EAAuB,SAAvB,CAApB;;AACA,MAAI,MAAM,qCAAqBiC,WAArB,CAAV,EAA6C;AAC3C,WAAOA,WAAP;AACD;;AACD,QAAM,IAAIR,KAAJ,CAAW,iDAAgDzB,WAAY,EAAvE,CAAN;AACD;;AAEM,eAAekC,uBAAf,CAAuClC,WAAvC,EAA6E;AAClF,QAAMiC,WAAW,GAAG,MAAMD,0BAA0B,CAAChC,WAAD,CAApD;AACA,QAAME,QAAQ,GAAGC,IAAI,GAACC,IAAL,CAAU6B,WAAV,EAAuB,kCAAvB,CAAjB;AACA,SAAO/B,QAAP;AACD;;AAEM,eAAeiC,sBAAf,CAAsCnC,WAAtC,EAA4E;AACjF,QAAMiC,WAAW,GAAG,MAAMD,0BAA0B,CAAChC,WAAD,CAApD;AACA,SAAOG,IAAI,GAACC,IAAL,CAAU6B,WAAV,EAAwB,kBAAxB,CAAP;AACD;;AAEM,eAAeG,uBAAf,CACLpC,WADK,EAEL;AAAEqC,EAAAA,IAAI,GAAG,QAAT;AAAmBpC,EAAAA;AAAnB,CAFK,EAGY;AACjB,QAAMqC,YAAY,GAAG,MAAMH,sBAAsB,CAACnC,WAAD,CAAjD;AAEA,QAAME,QAAQ,GAAGC,IAAI,GAACC,IAAL,CAAUkC,YAAV,EAAyB,GAAED,IAAK,IAAGpC,IAAK,MAAxC,CAAjB;AACA,SAAOC,QAAP;AACD","sourcesContent":["import assert from 'assert';\nimport fs from 'fs-extra';\nimport { sync as globSync } from 'glob';\nimport * as path from 'path';\n\nimport { UnexpectedError } from '../utils/errors';\nimport { directoryExistsAsync } from '../utils/modules';\nimport { ResourceKind } from './Resources';\n\nexport interface ProjectFile<L extends string = string> {\n path: string;\n language: L;\n contents: string;\n}\n\nexport type ApplicationProjectFile = ProjectFile<'java' | 'kt'>;\nexport type GradleProjectFile = ProjectFile<'groovy' | 'kt'>;\n\nexport function getProjectFilePath(projectRoot: string, name: string): string {\n const filePath = globSync(\n path.join(projectRoot, `android/app/src/main/java/**/${name}.@(java|kt)`)\n )[0];\n assert(\n filePath,\n `Project file \"${name}\" does not exist in android project for root \"${projectRoot}\"`\n );\n\n return filePath;\n}\n\nfunction getLanguage(filePath: string): 'java' | 'groovy' | 'kt' {\n const extension = path.extname(filePath);\n switch (extension) {\n case '.java':\n return 'java';\n case '.kts':\n case '.kt':\n return 'kt';\n case '.groovy':\n case '.gradle':\n return 'groovy';\n default:\n throw new UnexpectedError(`Unexpected Android file extension: ${extension}`);\n }\n}\n\nexport function getFileInfo(filePath: string) {\n return {\n path: path.normalize(filePath),\n contents: fs.readFileSync(filePath, 'utf8'),\n language: getLanguage(filePath) as any,\n };\n}\n\nexport async function getMainApplicationAsync(\n projectRoot: string\n): Promise<ApplicationProjectFile> {\n const filePath = getProjectFilePath(projectRoot, 'MainApplication');\n return getFileInfo(filePath);\n}\n\nexport async function getMainActivityAsync(projectRoot: string): Promise<ApplicationProjectFile> {\n const filePath = getProjectFilePath(projectRoot, 'MainActivity');\n return getFileInfo(filePath);\n}\n\nexport function getGradleFilePath(projectRoot: string, gradleName: string): string {\n const groovyPath = path.resolve(projectRoot, `${gradleName}.gradle`);\n const ktPath = path.resolve(projectRoot, `${gradleName}.gradle.kts`);\n\n const isGroovy = fs.pathExistsSync(groovyPath);\n const isKotlin = !isGroovy && fs.pathExistsSync(ktPath);\n\n if (!isGroovy && !isKotlin) {\n throw new Error(`Failed to find '${gradleName}.gradle' file for project: ${projectRoot}.`);\n }\n const filePath = isGroovy ? groovyPath : ktPath;\n return filePath;\n}\n\nexport function getProjectBuildGradleFilePath(projectRoot: string): string {\n return getGradleFilePath(path.join(projectRoot, 'android'), 'build');\n}\n\nexport async function getProjectBuildGradleAsync(projectRoot: string): Promise<GradleProjectFile> {\n return getFileInfo(getProjectBuildGradleFilePath(projectRoot));\n}\n\nexport function getSettingsGradleFilePath(projectRoot: string): string {\n return getGradleFilePath(path.join(projectRoot, 'android'), 'settings');\n}\n\nexport async function getSettingsGradleAsync(projectRoot: string): Promise<GradleProjectFile> {\n return getFileInfo(getSettingsGradleFilePath(projectRoot));\n}\n\nexport function getAppBuildGradleFilePath(projectRoot: string): string {\n return getGradleFilePath(path.join(projectRoot, 'android', 'app'), 'build');\n}\n\nexport async function getAppBuildGradleAsync(projectRoot: string): Promise<GradleProjectFile> {\n return getFileInfo(getAppBuildGradleFilePath(projectRoot));\n}\n\nexport async function getProjectPathOrThrowAsync(projectRoot: string): Promise<string> {\n const projectPath = path.join(projectRoot, 'android');\n if (await directoryExistsAsync(projectPath)) {\n return projectPath;\n }\n throw new Error(`Android project folder is missing in project: ${projectRoot}`);\n}\n\nexport async function getAndroidManifestAsync(projectRoot: string): Promise<string> {\n const projectPath = await getProjectPathOrThrowAsync(projectRoot);\n const filePath = path.join(projectPath, 'app/src/main/AndroidManifest.xml');\n return filePath;\n}\n\nexport async function getResourceFolderAsync(projectRoot: string): Promise<string> {\n const projectPath = await getProjectPathOrThrowAsync(projectRoot);\n return path.join(projectPath, `app/src/main/res`);\n}\n\nexport async function getResourceXMLPathAsync(\n projectRoot: string,\n { kind = 'values', name }: { kind?: ResourceKind; name: 'colors' | 'strings' | 'styles' | string }\n): Promise<string> {\n const resourcePath = await getResourceFolderAsync(projectRoot);\n\n const filePath = path.join(resourcePath, `${kind}/${name}.xml`);\n return filePath;\n}\n"],"file":"Paths.js"}
1
+ {"version":3,"sources":["../../src/android/Paths.ts"],"names":["getProjectFilePath","projectRoot","name","filePath","path","join","getLanguage","extension","extname","UnexpectedError","getFileInfo","normalize","contents","fs","readFileSync","language","getMainApplicationAsync","getMainActivityAsync","getGradleFilePath","gradleName","groovyPath","resolve","ktPath","isGroovy","existsSync","isKotlin","Error","getProjectBuildGradleFilePath","getProjectBuildGradleAsync","getSettingsGradleFilePath","getSettingsGradleAsync","getAppBuildGradleFilePath","getAppBuildGradleAsync","getProjectPathOrThrowAsync","projectPath","getAndroidManifestAsync","getResourceFolderAsync","getResourceXMLPathAsync","kind","resourcePath"],"mappings":"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","sourcesContent":["import assert from 'assert';\nimport fs from 'fs';\nimport { sync as globSync } from 'glob';\nimport * as path from 'path';\n\nimport { UnexpectedError } from '../utils/errors';\nimport { directoryExistsAsync } from '../utils/modules';\nimport { ResourceKind } from './Resources';\n\nexport interface ProjectFile<L extends string = string> {\n path: string;\n language: L;\n contents: string;\n}\n\nexport type ApplicationProjectFile = ProjectFile<'java' | 'kt'>;\nexport type GradleProjectFile = ProjectFile<'groovy' | 'kt'>;\n\nexport function getProjectFilePath(projectRoot: string, name: string): string {\n const filePath = globSync(\n path.join(projectRoot, `android/app/src/main/java/**/${name}.@(java|kt)`)\n )[0];\n assert(\n filePath,\n `Project file \"${name}\" does not exist in android project for root \"${projectRoot}\"`\n );\n\n return filePath;\n}\n\nfunction getLanguage(filePath: string): 'java' | 'groovy' | 'kt' {\n const extension = path.extname(filePath);\n switch (extension) {\n case '.java':\n return 'java';\n case '.kts':\n case '.kt':\n return 'kt';\n case '.groovy':\n case '.gradle':\n return 'groovy';\n default:\n throw new UnexpectedError(`Unexpected Android file extension: ${extension}`);\n }\n}\n\nexport function getFileInfo(filePath: string) {\n return {\n path: path.normalize(filePath),\n contents: fs.readFileSync(filePath, 'utf8'),\n language: getLanguage(filePath) as any,\n };\n}\n\nexport async function getMainApplicationAsync(\n projectRoot: string\n): Promise<ApplicationProjectFile> {\n const filePath = getProjectFilePath(projectRoot, 'MainApplication');\n return getFileInfo(filePath);\n}\n\nexport async function getMainActivityAsync(projectRoot: string): Promise<ApplicationProjectFile> {\n const filePath = getProjectFilePath(projectRoot, 'MainActivity');\n return getFileInfo(filePath);\n}\n\nexport function getGradleFilePath(projectRoot: string, gradleName: string): string {\n const groovyPath = path.resolve(projectRoot, `${gradleName}.gradle`);\n const ktPath = path.resolve(projectRoot, `${gradleName}.gradle.kts`);\n\n const isGroovy = fs.existsSync(groovyPath);\n const isKotlin = !isGroovy && fs.existsSync(ktPath);\n\n if (!isGroovy && !isKotlin) {\n throw new Error(`Failed to find '${gradleName}.gradle' file for project: ${projectRoot}.`);\n }\n const filePath = isGroovy ? groovyPath : ktPath;\n return filePath;\n}\n\nexport function getProjectBuildGradleFilePath(projectRoot: string): string {\n return getGradleFilePath(path.join(projectRoot, 'android'), 'build');\n}\n\nexport async function getProjectBuildGradleAsync(projectRoot: string): Promise<GradleProjectFile> {\n return getFileInfo(getProjectBuildGradleFilePath(projectRoot));\n}\n\nexport function getSettingsGradleFilePath(projectRoot: string): string {\n return getGradleFilePath(path.join(projectRoot, 'android'), 'settings');\n}\n\nexport async function getSettingsGradleAsync(projectRoot: string): Promise<GradleProjectFile> {\n return getFileInfo(getSettingsGradleFilePath(projectRoot));\n}\n\nexport function getAppBuildGradleFilePath(projectRoot: string): string {\n return getGradleFilePath(path.join(projectRoot, 'android', 'app'), 'build');\n}\n\nexport async function getAppBuildGradleAsync(projectRoot: string): Promise<GradleProjectFile> {\n return getFileInfo(getAppBuildGradleFilePath(projectRoot));\n}\n\nexport async function getProjectPathOrThrowAsync(projectRoot: string): Promise<string> {\n const projectPath = path.join(projectRoot, 'android');\n if (await directoryExistsAsync(projectPath)) {\n return projectPath;\n }\n throw new Error(`Android project folder is missing in project: ${projectRoot}`);\n}\n\nexport async function getAndroidManifestAsync(projectRoot: string): Promise<string> {\n const projectPath = await getProjectPathOrThrowAsync(projectRoot);\n const filePath = path.join(projectPath, 'app/src/main/AndroidManifest.xml');\n return filePath;\n}\n\nexport async function getResourceFolderAsync(projectRoot: string): Promise<string> {\n const projectPath = await getProjectPathOrThrowAsync(projectRoot);\n return path.join(projectPath, `app/src/main/res`);\n}\n\nexport async function getResourceXMLPathAsync(\n projectRoot: string,\n { kind = 'values', name }: { kind?: ResourceKind; name: 'colors' | 'strings' | 'styles' | string }\n): Promise<string> {\n const resourcePath = await getResourceFolderAsync(projectRoot);\n\n const filePath = path.join(resourcePath, `${kind}/${name}.xml`);\n return filePath;\n}\n"],"file":"Paths.js"}
@@ -2,7 +2,9 @@ import { ExpoConfig } from '@expo/config-types';
2
2
  import { ConfigPlugin } from '../Plugin.types';
3
3
  import { AndroidManifest, ManifestUsesPermission } from './Manifest';
4
4
  export declare const withPermissions: ConfigPlugin<string[] | void>;
5
- export declare const withBlockedPermissions: ConfigPlugin<string[]>;
5
+ /** Given a permission or list of permissions, block permissions in the final `AndroidManifest.xml` to ensure no installed library or plugin can add them. */
6
+ export declare const withBlockedPermissions: ConfigPlugin<string[] | string>;
7
+ export declare const withInternalBlockedPermissions: ConfigPlugin;
6
8
  export declare function addBlockedPermissions(androidManifest: AndroidManifest, permissions: string[]): AndroidManifest;
7
9
  export declare function getAndroidPermissions(config: Pick<ExpoConfig, 'android'>): string[];
8
10
  export declare function setAndroidPermissions(config: Pick<ExpoConfig, 'android'>, androidManifest: AndroidManifest): AndroidManifest;
@@ -14,29 +14,41 @@ exports.getPermissions = getPermissions;
14
14
  exports.isPermissionAlreadyRequested = isPermissionAlreadyRequested;
15
15
  exports.removePermissions = removePermissions;
16
16
  exports.setAndroidPermissions = setAndroidPermissions;
17
- exports.withPermissions = exports.withBlockedPermissions = void 0;
17
+ exports.withPermissions = exports.withInternalBlockedPermissions = exports.withBlockedPermissions = void 0;
18
18
 
19
- function _assert() {
20
- const data = _interopRequireDefault(require("assert"));
19
+ function _androidPlugins() {
20
+ const data = require("../plugins/android-plugins");
21
21
 
22
- _assert = function () {
22
+ _androidPlugins = function () {
23
23
  return data;
24
24
  };
25
25
 
26
26
  return data;
27
27
  }
28
28
 
29
- function _androidPlugins() {
30
- const data = require("../plugins/android-plugins");
29
+ function WarningAggregator() {
30
+ const data = _interopRequireWildcard(require("../utils/warnings"));
31
31
 
32
- _androidPlugins = function () {
32
+ WarningAggregator = function () {
33
+ return data;
34
+ };
35
+
36
+ return data;
37
+ }
38
+
39
+ function _Manifest() {
40
+ const data = require("./Manifest");
41
+
42
+ _Manifest = function () {
33
43
  return data;
34
44
  };
35
45
 
36
46
  return data;
37
47
  }
38
48
 
39
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
49
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
50
+
51
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
40
52
 
41
53
  const USES_PERMISSION = 'uses-permission';
42
54
 
@@ -54,45 +66,47 @@ const withPermissions = (config, permissions) => {
54
66
  return config;
55
67
  });
56
68
  };
69
+ /** Given a permission or list of permissions, block permissions in the final `AndroidManifest.xml` to ensure no installed library or plugin can add them. */
70
+
57
71
 
58
72
  exports.withPermissions = withPermissions;
59
73
 
60
74
  const withBlockedPermissions = (config, permissions) => {
61
75
  var _config$android;
62
76
 
63
- (0, _assert().default)(Array.isArray(permissions), 'permissions prop must be an array');
77
+ const resolvedPermissions = (Array.isArray(permissions) ? permissions : [permissions]).filter(Boolean);
78
+
79
+ if (!resolvedPermissions.length) {
80
+ WarningAggregator().addWarningAndroid('block-permissions', 'No permissions provided');
81
+ }
64
82
 
65
83
  if (config !== null && config !== void 0 && (_config$android = config.android) !== null && _config$android !== void 0 && _config$android.permissions && Array.isArray(config.android.permissions)) {
66
84
  // Remove any static config permissions
67
- config.android.permissions = config.android.permissions.filter(permission => !permissions.includes(permission));
85
+ config.android.permissions = config.android.permissions.filter(permission => !resolvedPermissions.includes(permission));
68
86
  }
69
87
 
70
88
  return (0, _androidPlugins().withAndroidManifest)(config, async config => {
71
- config.modResults = ensureToolsAvailable(config.modResults);
72
- config.modResults = addBlockedPermissions(config.modResults, permissions);
89
+ config.modResults = (0, _Manifest().ensureToolsAvailable)(config.modResults);
90
+ config.modResults = addBlockedPermissions(config.modResults, resolvedPermissions);
73
91
  return config;
74
92
  });
75
93
  };
76
- /**
77
- * Ensure the `tools:*` namespace is available in the manifest.
78
- *
79
- * @param manifest AndroidManifest.xml
80
- * @returns manifest with the `tools:*` namespace available
81
- */
82
-
83
94
 
84
95
  exports.withBlockedPermissions = withBlockedPermissions;
85
96
 
86
- function ensureToolsAvailable(manifest) {
87
- var _manifest$manifest, _manifest$manifest$$;
97
+ const withInternalBlockedPermissions = config => {
98
+ var _config$android2, _config$android2$bloc;
88
99
 
89
- if (manifest !== null && manifest !== void 0 && (_manifest$manifest = manifest.manifest) !== null && _manifest$manifest !== void 0 && (_manifest$manifest$$ = _manifest$manifest.$) !== null && _manifest$manifest$$ !== void 0 && _manifest$manifest$$['xmlns:tools']) {
90
- return manifest;
100
+ // Only add permissions if the user defined the property and added some values
101
+ // this ensures we don't add the `tools:*` namespace extraneously.
102
+ if ((_config$android2 = config.android) !== null && _config$android2 !== void 0 && (_config$android2$bloc = _config$android2.blockedPermissions) !== null && _config$android2$bloc !== void 0 && _config$android2$bloc.length) {
103
+ return withBlockedPermissions(config, config.android.blockedPermissions);
91
104
  }
92
105
 
93
- manifest.manifest.$['xmlns:tools'] = 'http://schemas.android.com/tools';
94
- return manifest;
95
- }
106
+ return config;
107
+ };
108
+
109
+ exports.withInternalBlockedPermissions = withInternalBlockedPermissions;
96
110
 
97
111
  function addBlockedPermissions(androidManifest, permissions) {
98
112
  if (!Array.isArray(androidManifest.manifest['uses-permission'])) {
@@ -140,9 +154,9 @@ function prefixAndroidPermissionsIfNecessary(permissions) {
140
154
  }
141
155
 
142
156
  function getAndroidPermissions(config) {
143
- var _config$android$permi, _config$android2;
157
+ var _config$android$permi, _config$android3;
144
158
 
145
- return (_config$android$permi = (_config$android2 = config.android) === null || _config$android2 === void 0 ? void 0 : _config$android2.permissions) !== null && _config$android$permi !== void 0 ? _config$android$permi : [];
159
+ return (_config$android$permi = (_config$android3 = config.android) === null || _config$android3 === void 0 ? void 0 : _config$android3.permissions) !== null && _config$android$permi !== void 0 ? _config$android$permi : [];
146
160
  }
147
161
 
148
162
  function setAndroidPermissions(config, androidManifest) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/android/Permissions.ts"],"names":["USES_PERMISSION","withPermissions","config","permissions","Array","isArray","filter","Boolean","android","Set","concat","modResults","setAndroidPermissions","withBlockedPermissions","permission","includes","ensureToolsAvailable","addBlockedPermissions","manifest","$","androidManifest","ensureBlockedPermission","manifestPermissions","e","push","prefixAndroidPermissionsIfNecessary","map","getAndroidPermissions","providedPermissions","permissionsToAdd","hasOwnProperty","forEach","isPermissionAlreadyRequested","addPermissionToManifest","some","removePermissions","permissionNames","targetNames","ensurePermissionNameFormat","nextPermissions","attribute","value","name","addPermission","permissionName","usesPermissions","ensurePermissions","getPermissions","results","targetName","ensurePermission","com","split","pop","toUpperCase","join","permissionObject"],"mappings":"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","sourcesContent":["import { ExpoConfig } from '@expo/config-types';\nimport assert from 'assert';\n\nimport { ConfigPlugin } from '../Plugin.types';\nimport { withAndroidManifest } from '../plugins/android-plugins';\nimport { AndroidManifest, ManifestUsesPermission } from './Manifest';\n\nconst USES_PERMISSION = 'uses-permission';\n\nexport const withPermissions: ConfigPlugin<string[] | void> = (config, permissions) => {\n if (Array.isArray(permissions)) {\n permissions = permissions.filter(Boolean);\n if (!config.android) config.android = {};\n if (!config.android.permissions) config.android.permissions = [];\n config.android.permissions = [\n // @ts-ignore\n ...new Set(config.android.permissions.concat(permissions)),\n ];\n }\n return withAndroidManifest(config, async config => {\n config.modResults = await setAndroidPermissions(config, config.modResults);\n return config;\n });\n};\n\nexport const withBlockedPermissions: ConfigPlugin<string[]> = (config, permissions) => {\n assert(Array.isArray(permissions), 'permissions prop must be an array');\n\n if (config?.android?.permissions && Array.isArray(config.android.permissions)) {\n // Remove any static config permissions\n config.android.permissions = config.android.permissions.filter(\n permission => !permissions.includes(permission)\n );\n }\n\n return withAndroidManifest(config, async config => {\n config.modResults = ensureToolsAvailable(config.modResults);\n config.modResults = addBlockedPermissions(config.modResults, permissions);\n\n return config;\n });\n};\n\n/**\n * Ensure the `tools:*` namespace is available in the manifest.\n *\n * @param manifest AndroidManifest.xml\n * @returns manifest with the `tools:*` namespace available\n */\nfunction ensureToolsAvailable(manifest: AndroidManifest) {\n if (manifest?.manifest?.$?.['xmlns:tools']) {\n return manifest;\n }\n manifest.manifest.$['xmlns:tools'] = 'http://schemas.android.com/tools';\n return manifest;\n}\n\nexport function addBlockedPermissions(androidManifest: AndroidManifest, permissions: string[]) {\n if (!Array.isArray(androidManifest.manifest['uses-permission'])) {\n androidManifest.manifest['uses-permission'] = [];\n }\n\n for (const permission of permissions) {\n androidManifest.manifest['uses-permission'] = ensureBlockedPermission(\n androidManifest.manifest['uses-permission'],\n permission\n );\n }\n\n return androidManifest;\n}\n\n/**\n * Filter any existing permissions matching the provided permission name, then add a\n * restricted permission to overwrite any extra permissions that may be added in a\n * third-party package's AndroidManifest.xml.\n *\n * @param manifestPermissions manifest `uses-permissions` array.\n * @param permission `android:name` of the permission to restrict\n * @returns\n */\nfunction ensureBlockedPermission(\n manifestPermissions: ManifestUsesPermission[],\n permission: string\n) {\n // Remove permission if it currently exists\n manifestPermissions = manifestPermissions.filter(e => e.$['android:name'] !== permission);\n\n // Add a permission with tools:node to overwrite any existing permission and ensure it's removed upon building.\n manifestPermissions.push({\n $: { 'android:name': permission, 'tools:node': 'remove' },\n });\n return manifestPermissions;\n}\n\nfunction prefixAndroidPermissionsIfNecessary(permissions: string[]): string[] {\n return permissions.map(permission => {\n if (!permission.includes('.')) {\n return `android.permission.${permission}`;\n }\n return permission;\n });\n}\n\nexport function getAndroidPermissions(config: Pick<ExpoConfig, 'android'>): string[] {\n return config.android?.permissions ?? [];\n}\n\nexport function setAndroidPermissions(\n config: Pick<ExpoConfig, 'android'>,\n androidManifest: AndroidManifest\n) {\n const permissions = getAndroidPermissions(config);\n const providedPermissions = prefixAndroidPermissionsIfNecessary(permissions);\n const permissionsToAdd = [...providedPermissions];\n\n if (!androidManifest.manifest.hasOwnProperty('uses-permission')) {\n androidManifest.manifest['uses-permission'] = [];\n }\n // manifest.manifest['uses-permission'] = [];\n\n const manifestPermissions = androidManifest.manifest['uses-permission'] ?? [];\n\n permissionsToAdd.forEach(permission => {\n if (!isPermissionAlreadyRequested(permission, manifestPermissions)) {\n addPermissionToManifest(permission, manifestPermissions);\n }\n });\n\n return androidManifest;\n}\n\nexport function isPermissionAlreadyRequested(\n permission: string,\n manifestPermissions: ManifestUsesPermission[]\n): boolean {\n return manifestPermissions.some(e => e.$['android:name'] === permission);\n}\n\nexport function addPermissionToManifest(\n permission: string,\n manifestPermissions: ManifestUsesPermission[]\n) {\n manifestPermissions.push({ $: { 'android:name': permission } });\n return manifestPermissions;\n}\n\nexport function removePermissions(androidManifest: AndroidManifest, permissionNames?: string[]) {\n const targetNames = permissionNames ? permissionNames.map(ensurePermissionNameFormat) : null;\n const permissions = androidManifest.manifest[USES_PERMISSION] || [];\n const nextPermissions = [];\n for (const attribute of permissions) {\n if (targetNames) {\n // @ts-ignore: name isn't part of the type\n const value = attribute.$['android:name'] || attribute.$.name;\n if (!targetNames.includes(value)) {\n nextPermissions.push(attribute);\n }\n }\n }\n\n androidManifest.manifest[USES_PERMISSION] = nextPermissions;\n}\n\nexport function addPermission(androidManifest: AndroidManifest, permissionName: string): void {\n const usesPermissions: ManifestUsesPermission[] = androidManifest.manifest[USES_PERMISSION] || [];\n usesPermissions.push({\n $: { 'android:name': permissionName },\n });\n androidManifest.manifest[USES_PERMISSION] = usesPermissions;\n}\n\nexport function ensurePermissions(\n androidManifest: AndroidManifest,\n permissionNames: string[]\n): { [permission: string]: boolean } {\n const permissions = getPermissions(androidManifest);\n\n const results: { [permission: string]: boolean } = {};\n for (const permissionName of permissionNames) {\n const targetName = ensurePermissionNameFormat(permissionName);\n if (!permissions.includes(targetName)) {\n addPermission(androidManifest, targetName);\n results[permissionName] = true;\n } else {\n results[permissionName] = false;\n }\n }\n return results;\n}\n\nexport function ensurePermission(\n androidManifest: AndroidManifest,\n permissionName: string\n): boolean {\n const permissions = getPermissions(androidManifest);\n const targetName = ensurePermissionNameFormat(permissionName);\n\n if (!permissions.includes(targetName)) {\n addPermission(androidManifest, targetName);\n return true;\n }\n return false;\n}\n\nexport function ensurePermissionNameFormat(permissionName: string): string {\n if (permissionName.includes('.')) {\n const com = permissionName.split('.');\n const name = com.pop() as string;\n return [...com, name.toUpperCase()].join('.');\n } else {\n // If shorthand form like `WRITE_CONTACTS` is provided, expand it to `android.permission.WRITE_CONTACTS`.\n return ensurePermissionNameFormat(`android.permission.${permissionName}`);\n }\n}\n\nexport function getPermissions(androidManifest: AndroidManifest): string[] {\n const usesPermissions: { [key: string]: any }[] = androidManifest.manifest[USES_PERMISSION] || [];\n const permissions = usesPermissions.map(permissionObject => {\n return permissionObject.$['android:name'] || permissionObject.$.name;\n });\n return permissions;\n}\n"],"file":"Permissions.js"}
1
+ {"version":3,"sources":["../../src/android/Permissions.ts"],"names":["USES_PERMISSION","withPermissions","config","permissions","Array","isArray","filter","Boolean","android","Set","concat","modResults","setAndroidPermissions","withBlockedPermissions","resolvedPermissions","length","WarningAggregator","addWarningAndroid","permission","includes","addBlockedPermissions","withInternalBlockedPermissions","blockedPermissions","androidManifest","manifest","ensureBlockedPermission","manifestPermissions","e","$","push","prefixAndroidPermissionsIfNecessary","map","getAndroidPermissions","providedPermissions","permissionsToAdd","hasOwnProperty","forEach","isPermissionAlreadyRequested","addPermissionToManifest","some","removePermissions","permissionNames","targetNames","ensurePermissionNameFormat","nextPermissions","attribute","value","name","addPermission","permissionName","usesPermissions","ensurePermissions","getPermissions","results","targetName","ensurePermission","com","split","pop","toUpperCase","join","permissionObject"],"mappings":"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","sourcesContent":["import { ExpoConfig } from '@expo/config-types';\n\nimport { ConfigPlugin } from '../Plugin.types';\nimport { withAndroidManifest } from '../plugins/android-plugins';\nimport * as WarningAggregator from '../utils/warnings';\nimport { AndroidManifest, ensureToolsAvailable, ManifestUsesPermission } from './Manifest';\n\nconst USES_PERMISSION = 'uses-permission';\n\nexport const withPermissions: ConfigPlugin<string[] | void> = (config, permissions) => {\n if (Array.isArray(permissions)) {\n permissions = permissions.filter(Boolean);\n if (!config.android) config.android = {};\n if (!config.android.permissions) config.android.permissions = [];\n config.android.permissions = [\n // @ts-ignore\n ...new Set(config.android.permissions.concat(permissions)),\n ];\n }\n return withAndroidManifest(config, async config => {\n config.modResults = await setAndroidPermissions(config, config.modResults);\n return config;\n });\n};\n\n/** Given a permission or list of permissions, block permissions in the final `AndroidManifest.xml` to ensure no installed library or plugin can add them. */\nexport const withBlockedPermissions: ConfigPlugin<string[] | string> = (config, permissions) => {\n const resolvedPermissions = (Array.isArray(permissions) ? permissions : [permissions]).filter(\n Boolean\n );\n\n if (!resolvedPermissions.length) {\n WarningAggregator.addWarningAndroid('block-permissions', 'No permissions provided');\n }\n\n if (config?.android?.permissions && Array.isArray(config.android.permissions)) {\n // Remove any static config permissions\n config.android.permissions = config.android.permissions.filter(\n permission => !resolvedPermissions.includes(permission)\n );\n }\n\n return withAndroidManifest(config, async config => {\n config.modResults = ensureToolsAvailable(config.modResults);\n config.modResults = addBlockedPermissions(config.modResults, resolvedPermissions);\n return config;\n });\n};\n\nexport const withInternalBlockedPermissions: ConfigPlugin = config => {\n // Only add permissions if the user defined the property and added some values\n // this ensures we don't add the `tools:*` namespace extraneously.\n if (config.android?.blockedPermissions?.length) {\n return withBlockedPermissions(config, config.android.blockedPermissions);\n }\n\n return config;\n};\n\nexport function addBlockedPermissions(androidManifest: AndroidManifest, permissions: string[]) {\n if (!Array.isArray(androidManifest.manifest['uses-permission'])) {\n androidManifest.manifest['uses-permission'] = [];\n }\n\n for (const permission of permissions) {\n androidManifest.manifest['uses-permission'] = ensureBlockedPermission(\n androidManifest.manifest['uses-permission'],\n permission\n );\n }\n\n return androidManifest;\n}\n\n/**\n * Filter any existing permissions matching the provided permission name, then add a\n * restricted permission to overwrite any extra permissions that may be added in a\n * third-party package's AndroidManifest.xml.\n *\n * @param manifestPermissions manifest `uses-permissions` array.\n * @param permission `android:name` of the permission to restrict\n * @returns\n */\nfunction ensureBlockedPermission(\n manifestPermissions: ManifestUsesPermission[],\n permission: string\n) {\n // Remove permission if it currently exists\n manifestPermissions = manifestPermissions.filter(e => e.$['android:name'] !== permission);\n\n // Add a permission with tools:node to overwrite any existing permission and ensure it's removed upon building.\n manifestPermissions.push({\n $: { 'android:name': permission, 'tools:node': 'remove' },\n });\n return manifestPermissions;\n}\n\nfunction prefixAndroidPermissionsIfNecessary(permissions: string[]): string[] {\n return permissions.map(permission => {\n if (!permission.includes('.')) {\n return `android.permission.${permission}`;\n }\n return permission;\n });\n}\n\nexport function getAndroidPermissions(config: Pick<ExpoConfig, 'android'>): string[] {\n return config.android?.permissions ?? [];\n}\n\nexport function setAndroidPermissions(\n config: Pick<ExpoConfig, 'android'>,\n androidManifest: AndroidManifest\n) {\n const permissions = getAndroidPermissions(config);\n const providedPermissions = prefixAndroidPermissionsIfNecessary(permissions);\n const permissionsToAdd = [...providedPermissions];\n\n if (!androidManifest.manifest.hasOwnProperty('uses-permission')) {\n androidManifest.manifest['uses-permission'] = [];\n }\n // manifest.manifest['uses-permission'] = [];\n\n const manifestPermissions = androidManifest.manifest['uses-permission'] ?? [];\n\n permissionsToAdd.forEach(permission => {\n if (!isPermissionAlreadyRequested(permission, manifestPermissions)) {\n addPermissionToManifest(permission, manifestPermissions);\n }\n });\n\n return androidManifest;\n}\n\nexport function isPermissionAlreadyRequested(\n permission: string,\n manifestPermissions: ManifestUsesPermission[]\n): boolean {\n return manifestPermissions.some(e => e.$['android:name'] === permission);\n}\n\nexport function addPermissionToManifest(\n permission: string,\n manifestPermissions: ManifestUsesPermission[]\n) {\n manifestPermissions.push({ $: { 'android:name': permission } });\n return manifestPermissions;\n}\n\nexport function removePermissions(androidManifest: AndroidManifest, permissionNames?: string[]) {\n const targetNames = permissionNames ? permissionNames.map(ensurePermissionNameFormat) : null;\n const permissions = androidManifest.manifest[USES_PERMISSION] || [];\n const nextPermissions = [];\n for (const attribute of permissions) {\n if (targetNames) {\n // @ts-ignore: name isn't part of the type\n const value = attribute.$['android:name'] || attribute.$.name;\n if (!targetNames.includes(value)) {\n nextPermissions.push(attribute);\n }\n }\n }\n\n androidManifest.manifest[USES_PERMISSION] = nextPermissions;\n}\n\nexport function addPermission(androidManifest: AndroidManifest, permissionName: string): void {\n const usesPermissions: ManifestUsesPermission[] = androidManifest.manifest[USES_PERMISSION] || [];\n usesPermissions.push({\n $: { 'android:name': permissionName },\n });\n androidManifest.manifest[USES_PERMISSION] = usesPermissions;\n}\n\nexport function ensurePermissions(\n androidManifest: AndroidManifest,\n permissionNames: string[]\n): { [permission: string]: boolean } {\n const permissions = getPermissions(androidManifest);\n\n const results: { [permission: string]: boolean } = {};\n for (const permissionName of permissionNames) {\n const targetName = ensurePermissionNameFormat(permissionName);\n if (!permissions.includes(targetName)) {\n addPermission(androidManifest, targetName);\n results[permissionName] = true;\n } else {\n results[permissionName] = false;\n }\n }\n return results;\n}\n\nexport function ensurePermission(\n androidManifest: AndroidManifest,\n permissionName: string\n): boolean {\n const permissions = getPermissions(androidManifest);\n const targetName = ensurePermissionNameFormat(permissionName);\n\n if (!permissions.includes(targetName)) {\n addPermission(androidManifest, targetName);\n return true;\n }\n return false;\n}\n\nexport function ensurePermissionNameFormat(permissionName: string): string {\n if (permissionName.includes('.')) {\n const com = permissionName.split('.');\n const name = com.pop() as string;\n return [...com, name.toUpperCase()].join('.');\n } else {\n // If shorthand form like `WRITE_CONTACTS` is provided, expand it to `android.permission.WRITE_CONTACTS`.\n return ensurePermissionNameFormat(`android.permission.${permissionName}`);\n }\n}\n\nexport function getPermissions(androidManifest: AndroidManifest): string[] {\n const usesPermissions: { [key: string]: any }[] = androidManifest.manifest[USES_PERMISSION] || [];\n const permissions = usesPermissions.map(permissionObject => {\n return permissionObject.$['android:name'] || permissionObject.$.name;\n });\n return permissions;\n}\n"],"file":"Permissions.js"}
@@ -60,7 +60,7 @@ function findNewInstanceCodeBlock(contents, classDeclaration, language) {
60
60
  // ```
61
61
 
62
62
  const nextBrace = contents.indexOf('{', end + 1);
63
- const isAnonymousClass = nextBrace >= end && !!contents.substring(end + 1, nextBrace).match(/^\s*$/m);
63
+ const isAnonymousClass = nextBrace >= end && !!contents.substring(end + 1, nextBrace).match(/^\s*$/);
64
64
 
65
65
  if (isAnonymousClass) {
66
66
  end = (0, _matchBrackets().findMatchingBracketPosition)(contents, '{', end);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/android/codeMod.ts"],"names":["findNewInstanceCodeBlock","contents","classDeclaration","language","isJava","start","indexOf","search","RegExp","end","nextBrace","isAnonymousClass","substring","match","code","appendContentsInsideDeclarationBlock","srcContents","declaration","insertion","Error","addImports","source","imports","lines","split","lineIndexWithPackageDeclaration","findIndex","line","javaImport","includes","importStatement","splice","join"],"mappings":";;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASA,wBAAT,CACLC,QADK,EAELC,gBAFK,EAGLC,QAHK,EAIa;AAClB,QAAMC,MAAM,GAAGD,QAAQ,KAAK,MAA5B;AACA,MAAIE,KAAK,GAAGD,MAAM,GACdH,QAAQ,CAACK,OAAT,CAAkB,QAAOJ,gBAAiB,GAA1C,CADc,GAEdD,QAAQ,CAACM,MAAT,CAAgB,IAAIC,MAAJ,CAAY,sBAAqBN,gBAAiB,KAAlD,CAAhB,CAFJ;;AAGA,MAAIG,KAAK,GAAG,CAAZ,EAAe;AACb,WAAO,IAAP;AACD,GAPiB,CAQlB;;;AACAA,EAAAA,KAAK,IAAI,CAAT;AACA,MAAII,GAAG,GAAG,kDAA4BR,QAA5B,EAAsC,GAAtC,EAA2CI,KAA3C,CAAV,CAVkB,CAYlB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,QAAMK,SAAS,GAAGT,QAAQ,CAACK,OAAT,CAAiB,GAAjB,EAAsBG,GAAG,GAAG,CAA5B,CAAlB;AACA,QAAME,gBAAgB,GACpBD,SAAS,IAAID,GAAb,IAAoB,CAAC,CAACR,QAAQ,CAACW,SAAT,CAAmBH,GAAG,GAAG,CAAzB,EAA4BC,SAA5B,EAAuCG,KAAvC,CAA6C,QAA7C,CADxB;;AAEA,MAAIF,gBAAJ,EAAsB;AACpBF,IAAAA,GAAG,GAAG,kDAA4BR,QAA5B,EAAsC,GAAtC,EAA2CQ,GAA3C,CAAN;AACD;;AAED,SAAO;AACLJ,IAAAA,KADK;AAELI,IAAAA,GAFK;AAGLK,IAAAA,IAAI,EAAEb,QAAQ,CAACW,SAAT,CAAmBP,KAAnB,EAA0BI,GAAG,GAAG,CAAhC;AAHD,GAAP;AAKD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACO,SAASM,oCAAT,CACLC,WADK,EAELC,WAFK,EAGLC,SAHK,EAIG;AACR,QAAMb,KAAK,GAAGW,WAAW,CAACT,MAAZ,CAAmB,IAAIC,MAAJ,CAAY,OAAMS,WAAY,aAA9B,CAAnB,CAAd;;AACA,MAAIZ,KAAK,GAAG,CAAZ,EAAe;AACb,UAAM,IAAIc,KAAJ,CAAW,2CAA0CF,WAAY,GAAjE,CAAN;AACD;;AACD,QAAMR,GAAG,GAAG,kDAA4BO,WAA5B,EAAyC,GAAzC,EAA8CX,KAA9C,CAAZ;AACA,SAAO,6CAAuBW,WAAvB,EAAoCE,SAApC,EAA+CT,GAA/C,CAAP;AACD;;AAEM,SAASW,UAAT,CAAoBC,MAApB,EAAoCC,OAApC,EAAuDlB,MAAvD,EAAgF;AACrF,QAAMmB,KAAK,GAAGF,MAAM,CAACG,KAAP,CAAa,IAAb,CAAd;AACA,QAAMC,+BAA+B,GAAGF,KAAK,CAACG,SAAN,CAAgBC,IAAI,IAAIA,IAAI,CAACd,KAAL,CAAW,gBAAX,CAAxB,CAAxC;;AACA,OAAK,MAAMe,UAAX,IAAyBN,OAAzB,EAAkC;AAChC,QAAI,CAACD,MAAM,CAACQ,QAAP,CAAgBD,UAAhB,CAAL,EAAkC;AAChC,YAAME,eAAe,GAAI,UAASF,UAAW,GAAExB,MAAM,GAAG,GAAH,GAAS,EAAG,EAAjE;AACAmB,MAAAA,KAAK,CAACQ,MAAN,CAAaN,+BAA+B,GAAG,CAA/C,EAAkD,CAAlD,EAAqDK,eAArD;AACD;AACF;;AACD,SAAOP,KAAK,CAACS,IAAN,CAAW,IAAX,CAAP;AACD","sourcesContent":["import { CodeBlock, insertContentsAtOffset } from '../utils/commonCodeMod';\nimport { findMatchingBracketPosition } from '../utils/matchBrackets';\n\n/**\n * Find java or kotlin new class instance code block\n *\n * @param contents source contents\n * @param classDeclaration class declaration or just a class name\n * @param language 'java' | 'kt'\n * @returns `CodeBlock` for start/end offset and code block contents\n */\nexport function findNewInstanceCodeBlock(\n contents: string,\n classDeclaration: string,\n language: 'java' | 'kt'\n): CodeBlock | null {\n const isJava = language === 'java';\n let start = isJava\n ? contents.indexOf(` new ${classDeclaration}(`)\n : contents.search(new RegExp(` (object\\\\s*:\\\\s*)?${classDeclaration}\\\\(`));\n if (start < 0) {\n return null;\n }\n // `+ 1` for the prefix space\n start += 1;\n let end = findMatchingBracketPosition(contents, '(', start);\n\n // For anonymous class, should search further to the {} block.\n // ```java\n // new Foo() {\n // @Override\n // protected void interfaceMethod {}\n // };\n // ```\n //\n // ```kotlin\n // object : Foo() {\n // override fun interfaceMethod {}\n // }\n // ```\n const nextBrace = contents.indexOf('{', end + 1);\n const isAnonymousClass =\n nextBrace >= end && !!contents.substring(end + 1, nextBrace).match(/^\\s*$/m);\n if (isAnonymousClass) {\n end = findMatchingBracketPosition(contents, '{', end);\n }\n\n return {\n start,\n end,\n code: contents.substring(start, end + 1),\n };\n}\n\n/**\n * Append contents to the end of code declaration block, support class or method declarations.\n *\n * @param srcContents source contents\n * @param declaration class declaration or method declaration\n * @param insertion code to append\n * @returns updated contents\n */\nexport function appendContentsInsideDeclarationBlock(\n srcContents: string,\n declaration: string,\n insertion: string\n): string {\n const start = srcContents.search(new RegExp(`\\\\s*${declaration}.*?[\\\\(\\\\{]`));\n if (start < 0) {\n throw new Error(`Unable to find code block - declaration[${declaration}]`);\n }\n const end = findMatchingBracketPosition(srcContents, '{', start);\n return insertContentsAtOffset(srcContents, insertion, end);\n}\n\nexport function addImports(source: string, imports: string[], isJava: boolean): string {\n const lines = source.split('\\n');\n const lineIndexWithPackageDeclaration = lines.findIndex(line => line.match(/^package .*;?$/));\n for (const javaImport of imports) {\n if (!source.includes(javaImport)) {\n const importStatement = `import ${javaImport}${isJava ? ';' : ''}`;\n lines.splice(lineIndexWithPackageDeclaration + 1, 0, importStatement);\n }\n }\n return lines.join('\\n');\n}\n"],"file":"codeMod.js"}
1
+ {"version":3,"sources":["../../src/android/codeMod.ts"],"names":["findNewInstanceCodeBlock","contents","classDeclaration","language","isJava","start","indexOf","search","RegExp","end","nextBrace","isAnonymousClass","substring","match","code","appendContentsInsideDeclarationBlock","srcContents","declaration","insertion","Error","addImports","source","imports","lines","split","lineIndexWithPackageDeclaration","findIndex","line","javaImport","includes","importStatement","splice","join"],"mappings":";;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASA,wBAAT,CACLC,QADK,EAELC,gBAFK,EAGLC,QAHK,EAIa;AAClB,QAAMC,MAAM,GAAGD,QAAQ,KAAK,MAA5B;AACA,MAAIE,KAAK,GAAGD,MAAM,GACdH,QAAQ,CAACK,OAAT,CAAkB,QAAOJ,gBAAiB,GAA1C,CADc,GAEdD,QAAQ,CAACM,MAAT,CAAgB,IAAIC,MAAJ,CAAY,sBAAqBN,gBAAiB,KAAlD,CAAhB,CAFJ;;AAGA,MAAIG,KAAK,GAAG,CAAZ,EAAe;AACb,WAAO,IAAP;AACD,GAPiB,CAQlB;;;AACAA,EAAAA,KAAK,IAAI,CAAT;AACA,MAAII,GAAG,GAAG,kDAA4BR,QAA5B,EAAsC,GAAtC,EAA2CI,KAA3C,CAAV,CAVkB,CAYlB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,QAAMK,SAAS,GAAGT,QAAQ,CAACK,OAAT,CAAiB,GAAjB,EAAsBG,GAAG,GAAG,CAA5B,CAAlB;AACA,QAAME,gBAAgB,GACpBD,SAAS,IAAID,GAAb,IAAoB,CAAC,CAACR,QAAQ,CAACW,SAAT,CAAmBH,GAAG,GAAG,CAAzB,EAA4BC,SAA5B,EAAuCG,KAAvC,CAA6C,OAA7C,CADxB;;AAEA,MAAIF,gBAAJ,EAAsB;AACpBF,IAAAA,GAAG,GAAG,kDAA4BR,QAA5B,EAAsC,GAAtC,EAA2CQ,GAA3C,CAAN;AACD;;AAED,SAAO;AACLJ,IAAAA,KADK;AAELI,IAAAA,GAFK;AAGLK,IAAAA,IAAI,EAAEb,QAAQ,CAACW,SAAT,CAAmBP,KAAnB,EAA0BI,GAAG,GAAG,CAAhC;AAHD,GAAP;AAKD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACO,SAASM,oCAAT,CACLC,WADK,EAELC,WAFK,EAGLC,SAHK,EAIG;AACR,QAAMb,KAAK,GAAGW,WAAW,CAACT,MAAZ,CAAmB,IAAIC,MAAJ,CAAY,OAAMS,WAAY,aAA9B,CAAnB,CAAd;;AACA,MAAIZ,KAAK,GAAG,CAAZ,EAAe;AACb,UAAM,IAAIc,KAAJ,CAAW,2CAA0CF,WAAY,GAAjE,CAAN;AACD;;AACD,QAAMR,GAAG,GAAG,kDAA4BO,WAA5B,EAAyC,GAAzC,EAA8CX,KAA9C,CAAZ;AACA,SAAO,6CAAuBW,WAAvB,EAAoCE,SAApC,EAA+CT,GAA/C,CAAP;AACD;;AAEM,SAASW,UAAT,CAAoBC,MAApB,EAAoCC,OAApC,EAAuDlB,MAAvD,EAAgF;AACrF,QAAMmB,KAAK,GAAGF,MAAM,CAACG,KAAP,CAAa,IAAb,CAAd;AACA,QAAMC,+BAA+B,GAAGF,KAAK,CAACG,SAAN,CAAgBC,IAAI,IAAIA,IAAI,CAACd,KAAL,CAAW,gBAAX,CAAxB,CAAxC;;AACA,OAAK,MAAMe,UAAX,IAAyBN,OAAzB,EAAkC;AAChC,QAAI,CAACD,MAAM,CAACQ,QAAP,CAAgBD,UAAhB,CAAL,EAAkC;AAChC,YAAME,eAAe,GAAI,UAASF,UAAW,GAAExB,MAAM,GAAG,GAAH,GAAS,EAAG,EAAjE;AACAmB,MAAAA,KAAK,CAACQ,MAAN,CAAaN,+BAA+B,GAAG,CAA/C,EAAkD,CAAlD,EAAqDK,eAArD;AACD;AACF;;AACD,SAAOP,KAAK,CAACS,IAAN,CAAW,IAAX,CAAP;AACD","sourcesContent":["import { CodeBlock, insertContentsAtOffset } from '../utils/commonCodeMod';\nimport { findMatchingBracketPosition } from '../utils/matchBrackets';\n\n/**\n * Find java or kotlin new class instance code block\n *\n * @param contents source contents\n * @param classDeclaration class declaration or just a class name\n * @param language 'java' | 'kt'\n * @returns `CodeBlock` for start/end offset and code block contents\n */\nexport function findNewInstanceCodeBlock(\n contents: string,\n classDeclaration: string,\n language: 'java' | 'kt'\n): CodeBlock | null {\n const isJava = language === 'java';\n let start = isJava\n ? contents.indexOf(` new ${classDeclaration}(`)\n : contents.search(new RegExp(` (object\\\\s*:\\\\s*)?${classDeclaration}\\\\(`));\n if (start < 0) {\n return null;\n }\n // `+ 1` for the prefix space\n start += 1;\n let end = findMatchingBracketPosition(contents, '(', start);\n\n // For anonymous class, should search further to the {} block.\n // ```java\n // new Foo() {\n // @Override\n // protected void interfaceMethod {}\n // };\n // ```\n //\n // ```kotlin\n // object : Foo() {\n // override fun interfaceMethod {}\n // }\n // ```\n const nextBrace = contents.indexOf('{', end + 1);\n const isAnonymousClass =\n nextBrace >= end && !!contents.substring(end + 1, nextBrace).match(/^\\s*$/);\n if (isAnonymousClass) {\n end = findMatchingBracketPosition(contents, '{', end);\n }\n\n return {\n start,\n end,\n code: contents.substring(start, end + 1),\n };\n}\n\n/**\n * Append contents to the end of code declaration block, support class or method declarations.\n *\n * @param srcContents source contents\n * @param declaration class declaration or method declaration\n * @param insertion code to append\n * @returns updated contents\n */\nexport function appendContentsInsideDeclarationBlock(\n srcContents: string,\n declaration: string,\n insertion: string\n): string {\n const start = srcContents.search(new RegExp(`\\\\s*${declaration}.*?[\\\\(\\\\{]`));\n if (start < 0) {\n throw new Error(`Unable to find code block - declaration[${declaration}]`);\n }\n const end = findMatchingBracketPosition(srcContents, '{', start);\n return insertContentsAtOffset(srcContents, insertion, end);\n}\n\nexport function addImports(source: string, imports: string[], isJava: boolean): string {\n const lines = source.split('\\n');\n const lineIndexWithPackageDeclaration = lines.findIndex(line => line.match(/^package .*;?$/));\n for (const javaImport of imports) {\n if (!source.includes(javaImport)) {\n const importStatement = `import ${javaImport}${isJava ? ';' : ''}`;\n lines.splice(lineIndexWithPackageDeclaration + 1, 0, importStatement);\n }\n }\n return lines.join('\\n');\n}\n"],"file":"codeMod.js"}
@@ -1,10 +1,10 @@
1
1
  import * as AllowBackup from './AllowBackup';
2
+ import * as BuildProperties from './BuildProperties';
2
3
  import * as Colors from './Colors';
3
4
  import * as EasBuild from './EasBuild';
4
5
  import * as GoogleMapsApiKey from './GoogleMapsApiKey';
5
6
  import * as GoogleServices from './GoogleServices';
6
7
  import * as IntentFilters from './IntentFilters';
7
- import * as JsEngine from './JsEngine';
8
8
  import * as Manifest from './Manifest';
9
9
  import * as Name from './Name';
10
10
  import * as Orientation from './Orientation';
@@ -22,4 +22,4 @@ import * as Updates from './Updates';
22
22
  import * as Version from './Version';
23
23
  import * as WindowSoftInputMode from './WindowSoftInputMode';
24
24
  export { Manifest, Colors, Paths, Permissions, Properties, Resources, Scheme, Strings, Styles };
25
- export { AllowBackup, EasBuild, GoogleMapsApiKey, GoogleServices, IntentFilters, Name, Orientation, Package, PrimaryColor, StatusBar, Updates, Version, JsEngine, WindowSoftInputMode, };
25
+ export { AllowBackup, BuildProperties, EasBuild, GoogleMapsApiKey, GoogleServices, IntentFilters, Name, Orientation, Package, PrimaryColor, StatusBar, Updates, Version, WindowSoftInputMode, };
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.WindowSoftInputMode = exports.Version = exports.Updates = exports.Styles = exports.Strings = exports.StatusBar = exports.Scheme = exports.Resources = exports.Properties = exports.PrimaryColor = exports.Permissions = exports.Paths = exports.Package = exports.Orientation = exports.Name = exports.Manifest = exports.JsEngine = exports.IntentFilters = exports.GoogleServices = exports.GoogleMapsApiKey = exports.EasBuild = exports.Colors = exports.AllowBackup = void 0;
6
+ exports.WindowSoftInputMode = exports.Version = exports.Updates = exports.Styles = exports.Strings = exports.StatusBar = exports.Scheme = exports.Resources = exports.Properties = exports.PrimaryColor = exports.Permissions = exports.Paths = exports.Package = exports.Orientation = exports.Name = exports.Manifest = exports.IntentFilters = exports.GoogleServices = exports.GoogleMapsApiKey = exports.EasBuild = exports.Colors = exports.BuildProperties = exports.AllowBackup = void 0;
7
7
 
8
8
  function AllowBackup() {
9
9
  const data = _interopRequireWildcard(require("./AllowBackup"));
@@ -22,6 +22,23 @@ Object.defineProperty(exports, "AllowBackup", {
22
22
  }
23
23
  });
24
24
 
25
+ function BuildProperties() {
26
+ const data = _interopRequireWildcard(require("./BuildProperties"));
27
+
28
+ BuildProperties = function () {
29
+ return data;
30
+ };
31
+
32
+ return data;
33
+ }
34
+
35
+ Object.defineProperty(exports, "BuildProperties", {
36
+ enumerable: true,
37
+ get: function () {
38
+ return BuildProperties();
39
+ }
40
+ });
41
+
25
42
  function Colors() {
26
43
  const data = _interopRequireWildcard(require("./Colors"));
27
44
 
@@ -107,23 +124,6 @@ Object.defineProperty(exports, "IntentFilters", {
107
124
  }
108
125
  });
109
126
 
110
- function JsEngine() {
111
- const data = _interopRequireWildcard(require("./JsEngine"));
112
-
113
- JsEngine = function () {
114
- return data;
115
- };
116
-
117
- return data;
118
- }
119
-
120
- Object.defineProperty(exports, "JsEngine", {
121
- enumerable: true,
122
- get: function () {
123
- return JsEngine();
124
- }
125
- });
126
-
127
127
  function Manifest() {
128
128
  const data = _interopRequireWildcard(require("./Manifest"));
129
129
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/android/index.ts"],"names":[],"mappings":";;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA","sourcesContent":["import * as AllowBackup from './AllowBackup';\nimport * as Colors from './Colors';\nimport * as EasBuild from './EasBuild';\nimport * as GoogleMapsApiKey from './GoogleMapsApiKey';\nimport * as GoogleServices from './GoogleServices';\nimport * as IntentFilters from './IntentFilters';\nimport * as JsEngine from './JsEngine';\nimport * as Manifest from './Manifest';\nimport * as Name from './Name';\nimport * as Orientation from './Orientation';\nimport * as Package from './Package';\nimport * as Paths from './Paths';\nimport * as Permissions from './Permissions';\nimport * as PrimaryColor from './PrimaryColor';\nimport * as Properties from './Properties';\nimport * as Resources from './Resources';\nimport * as Scheme from './Scheme';\nimport * as StatusBar from './StatusBar';\nimport * as Strings from './Strings';\nimport * as Styles from './Styles';\nimport * as Updates from './Updates';\nimport * as Version from './Version';\nimport * as WindowSoftInputMode from './WindowSoftInputMode';\n\nexport { Manifest, Colors, Paths, Permissions, Properties, Resources, Scheme, Strings, Styles };\n\nexport {\n AllowBackup,\n EasBuild,\n GoogleMapsApiKey,\n GoogleServices,\n IntentFilters,\n Name,\n Orientation,\n Package,\n PrimaryColor,\n StatusBar,\n Updates,\n Version,\n JsEngine,\n WindowSoftInputMode,\n};\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../../src/android/index.ts"],"names":[],"mappings":";;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA","sourcesContent":["import * as AllowBackup from './AllowBackup';\nimport * as BuildProperties from './BuildProperties';\nimport * as Colors from './Colors';\nimport * as EasBuild from './EasBuild';\nimport * as GoogleMapsApiKey from './GoogleMapsApiKey';\nimport * as GoogleServices from './GoogleServices';\nimport * as IntentFilters from './IntentFilters';\nimport * as Manifest from './Manifest';\nimport * as Name from './Name';\nimport * as Orientation from './Orientation';\nimport * as Package from './Package';\nimport * as Paths from './Paths';\nimport * as Permissions from './Permissions';\nimport * as PrimaryColor from './PrimaryColor';\nimport * as Properties from './Properties';\nimport * as Resources from './Resources';\nimport * as Scheme from './Scheme';\nimport * as StatusBar from './StatusBar';\nimport * as Strings from './Strings';\nimport * as Styles from './Styles';\nimport * as Updates from './Updates';\nimport * as Version from './Version';\nimport * as WindowSoftInputMode from './WindowSoftInputMode';\n\nexport { Manifest, Colors, Paths, Permissions, Properties, Resources, Scheme, Strings, Styles };\n\nexport {\n AllowBackup,\n BuildProperties,\n EasBuild,\n GoogleMapsApiKey,\n GoogleServices,\n IntentFilters,\n Name,\n Orientation,\n Package,\n PrimaryColor,\n StatusBar,\n Updates,\n Version,\n WindowSoftInputMode,\n};\n"],"file":"index.js"}
@@ -0,0 +1,27 @@
1
+ import type { ExpoConfig } from '@expo/config-types';
2
+ import type { ConfigPlugin } from '../Plugin.types';
3
+ import { BuildPropertiesConfig, ConfigToPropertyRuleType } from '../utils/BuildProperties.types';
4
+ /**
5
+ * Creates a `withPodfileProperties` config-plugin based on given config to property mapping rules.
6
+ *
7
+ * The factory supports two modes from generic type inference
8
+ * ```ts
9
+ * // config-plugin without `props`, it will implicitly use the expo config as source config.
10
+ * createBuildPodfilePropsConfigPlugin<ExpoConfig>(): ConfigPlugin<void>;
11
+ *
12
+ * // config-plugin with a parameter `props: CustomType`, it will use the `props` as source config.
13
+ * createBuildPodfilePropsConfigPlugin<CustomType>(): ConfigPlugin<CustomType>;
14
+ * ```
15
+ *
16
+ * @param configToPropertyRules config to property mapping rules
17
+ * @param name the config plugin name
18
+ */
19
+ export declare function createBuildPodfilePropsConfigPlugin<SourceConfigType extends BuildPropertiesConfig>(configToPropertyRules: ConfigToPropertyRuleType<SourceConfigType>[], name?: string): ConfigPlugin<SourceConfigType extends ExpoConfig ? void : SourceConfigType>;
20
+ /**
21
+ * A config-plugin to update `ios/Podfile.properties.json` from the `jsEngine` in expo config
22
+ */
23
+ export declare const withJsEnginePodfileProps: ConfigPlugin<void>;
24
+ export declare function updateIosBuildPropertiesFromConfig<SourceConfigType extends BuildPropertiesConfig>(config: SourceConfigType, podfileProperties: Record<string, string>, configToPropertyRules: ConfigToPropertyRuleType<SourceConfigType>[]): Record<string, string>;
25
+ export declare function updateIosBuildProperty(podfileProperties: Record<string, string>, name: string, value: string | null | undefined, options?: {
26
+ removePropWhenValueIsNull?: boolean;
27
+ }): Record<string, string>;
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createBuildPodfilePropsConfigPlugin = createBuildPodfilePropsConfigPlugin;
7
+ exports.updateIosBuildPropertiesFromConfig = updateIosBuildPropertiesFromConfig;
8
+ exports.updateIosBuildProperty = updateIosBuildProperty;
9
+ exports.withJsEnginePodfileProps = void 0;
10
+
11
+ function _iosPlugins() {
12
+ const data = require("../plugins/ios-plugins");
13
+
14
+ _iosPlugins = function () {
15
+ return data;
16
+ };
17
+
18
+ return data;
19
+ }
20
+
21
+ /**
22
+ * Creates a `withPodfileProperties` config-plugin based on given config to property mapping rules.
23
+ *
24
+ * The factory supports two modes from generic type inference
25
+ * ```ts
26
+ * // config-plugin without `props`, it will implicitly use the expo config as source config.
27
+ * createBuildPodfilePropsConfigPlugin<ExpoConfig>(): ConfigPlugin<void>;
28
+ *
29
+ * // config-plugin with a parameter `props: CustomType`, it will use the `props` as source config.
30
+ * createBuildPodfilePropsConfigPlugin<CustomType>(): ConfigPlugin<CustomType>;
31
+ * ```
32
+ *
33
+ * @param configToPropertyRules config to property mapping rules
34
+ * @param name the config plugin name
35
+ */
36
+ function createBuildPodfilePropsConfigPlugin(configToPropertyRules, name) {
37
+ const withUnknown = (config, sourceConfig) => (0, _iosPlugins().withPodfileProperties)(config, config => {
38
+ config.modResults = updateIosBuildPropertiesFromConfig(sourceConfig !== null && sourceConfig !== void 0 ? sourceConfig : config, config.modResults, configToPropertyRules);
39
+ return config;
40
+ });
41
+
42
+ if (name) {
43
+ Object.defineProperty(withUnknown, 'name', {
44
+ value: name
45
+ });
46
+ }
47
+
48
+ return withUnknown;
49
+ }
50
+ /**
51
+ * A config-plugin to update `ios/Podfile.properties.json` from the `jsEngine` in expo config
52
+ */
53
+
54
+
55
+ const withJsEnginePodfileProps = createBuildPodfilePropsConfigPlugin([{
56
+ propName: 'expo.jsEngine',
57
+ propValueGetter: config => {
58
+ var _ref, _config$ios$jsEngine, _config$ios;
59
+
60
+ return (_ref = (_config$ios$jsEngine = (_config$ios = config.ios) === null || _config$ios === void 0 ? void 0 : _config$ios.jsEngine) !== null && _config$ios$jsEngine !== void 0 ? _config$ios$jsEngine : config.jsEngine) !== null && _ref !== void 0 ? _ref : 'jsc';
61
+ }
62
+ }], 'withJsEnginePodfileProps');
63
+ exports.withJsEnginePodfileProps = withJsEnginePodfileProps;
64
+
65
+ function updateIosBuildPropertiesFromConfig(config, podfileProperties, configToPropertyRules) {
66
+ for (const configToProperty of configToPropertyRules) {
67
+ const value = configToProperty.propValueGetter(config);
68
+ updateIosBuildProperty(podfileProperties, configToProperty.propName, value);
69
+ }
70
+
71
+ return podfileProperties;
72
+ }
73
+
74
+ function updateIosBuildProperty(podfileProperties, name, value, options) {
75
+ if (value) {
76
+ podfileProperties[name] = value;
77
+ } else if (options !== null && options !== void 0 && options.removePropWhenValueIsNull) {
78
+ delete podfileProperties[name];
79
+ }
80
+
81
+ return podfileProperties;
82
+ }
83
+ //# sourceMappingURL=BuildProperties.js.map