@expo/config-plugins 4.0.7 → 4.0.8

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 (85) hide show
  1. package/build/Plugin.types.js +6 -6
  2. package/build/android/AllowBackup.js +1 -1
  3. package/build/android/Colors.js +3 -3
  4. package/build/android/EasBuild.js +1 -1
  5. package/build/android/GoogleServices.js +3 -3
  6. package/build/android/IntentFilters.js +1 -1
  7. package/build/android/JsEngine.js +2 -1
  8. package/build/android/JsEngine.js.map +1 -1
  9. package/build/android/Manifest.js +10 -10
  10. package/build/android/Name.d.ts +2 -1
  11. package/build/android/Name.js +7 -4
  12. package/build/android/Name.js.map +1 -1
  13. package/build/android/Orientation.js +2 -1
  14. package/build/android/Orientation.js.map +1 -1
  15. package/build/android/Package.js +4 -4
  16. package/build/android/Package.js.map +1 -1
  17. package/build/android/Paths.js +9 -9
  18. package/build/android/Permissions.js +6 -6
  19. package/build/android/Resources.js +5 -5
  20. package/build/android/Scheme.js +3 -3
  21. package/build/android/StatusBar.js +3 -3
  22. package/build/android/Strings.js +1 -1
  23. package/build/android/Styles.js +5 -5
  24. package/build/android/Updates.d.ts +0 -5
  25. package/build/android/Updates.js +14 -23
  26. package/build/android/Updates.js.map +1 -1
  27. package/build/android/Version.js +2 -2
  28. package/build/android/WindowSoftInputMode.js +1 -1
  29. package/build/android/codeMod.js +2 -2
  30. package/build/index.js +54 -53
  31. package/build/index.js.map +1 -1
  32. package/build/ios/Bitcode.js +1 -1
  33. package/build/ios/BuildScheme.js +2 -2
  34. package/build/ios/BundleIdentifier.js +3 -3
  35. package/build/ios/DeviceFamily.js +3 -3
  36. package/build/ios/Entitlements.js +2 -2
  37. package/build/ios/Entitlements.js.map +1 -1
  38. package/build/ios/Google.js +2 -2
  39. package/build/ios/JsEngine.js +2 -1
  40. package/build/ios/JsEngine.js.map +1 -1
  41. package/build/ios/Locales.js +1 -1
  42. package/build/ios/Maps.js +32 -18
  43. package/build/ios/Maps.js.map +1 -1
  44. package/build/ios/Orientation.js +2 -1
  45. package/build/ios/Orientation.js.map +1 -1
  46. package/build/ios/Paths.js +14 -14
  47. package/build/ios/Paths.js.map +1 -1
  48. package/build/ios/Permissions.js +1 -1
  49. package/build/ios/Permissions.js.map +1 -1
  50. package/build/ios/Scheme.js +4 -4
  51. package/build/ios/Swift.js +2 -2
  52. package/build/ios/Target.js +5 -5
  53. package/build/ios/Updates.d.ts +0 -5
  54. package/build/ios/Updates.js +14 -23
  55. package/build/ios/Updates.js.map +1 -1
  56. package/build/ios/Version.js +3 -3
  57. package/build/ios/codeMod.js +2 -2
  58. package/build/ios/index.js +3 -1
  59. package/build/ios/index.js.map +1 -1
  60. package/build/ios/utils/Xcodeproj.js +9 -9
  61. package/build/plugins/android-plugins.js +1 -1
  62. package/build/plugins/createBaseMod.js +2 -2
  63. package/build/plugins/createBaseMod.js.map +1 -1
  64. package/build/plugins/ios-plugins.js +2 -2
  65. package/build/plugins/mod-compiler.js +3 -3
  66. package/build/plugins/mod-compiler.js.map +1 -1
  67. package/build/plugins/withAndroidBaseMods.js +1 -1
  68. package/build/plugins/withIosBaseMods.js +1 -1
  69. package/build/utils/Updates.d.ts +1 -0
  70. package/build/utils/Updates.js +24 -1
  71. package/build/utils/Updates.js.map +1 -1
  72. package/build/utils/XML.d.ts +6 -0
  73. package/build/utils/XML.js +57 -10
  74. package/build/utils/XML.js.map +1 -1
  75. package/build/utils/errors.js +1 -1
  76. package/build/utils/generateCode.js +2 -2
  77. package/build/utils/history.js +1 -1
  78. package/build/utils/modules.js +1 -1
  79. package/build/utils/plugin-resolver.js +4 -4
  80. package/build/utils/sortObject.js +2 -2
  81. package/build/utils/warnings.js +1 -1
  82. package/package.json +3 -3
  83. package/build/utils/resolvePackageRootFolder.d.ts +0 -1
  84. package/build/utils/resolvePackageRootFolder.js +0 -57
  85. package/build/utils/resolvePackageRootFolder.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugins/createBaseMod.ts"],"names":["debug","createBaseMod","methodName","platform","modName","getFilePath","read","write","isIntrospective","withUnknown","config","_props","props","mod","skipEmptyMod","saveToInternal","isProvider","action","modRequest","nextMod","results","filePath","modResults","assertModResults","error","message","Object","defineProperty","value","platformName","ensuredResults","mods","Error","JSON","stringify","upperFirst","name","charAt","toUpperCase","slice","createPlatformBaseMod","provider","withGeneratedBaseMods","providers","entries","reduce","baseMod"],"mappings":"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","sourcesContent":["import Debug from 'debug';\n\nimport {\n ConfigPlugin,\n ExportedConfig,\n ExportedConfigWithProps,\n ModPlatform,\n} from '../Plugin.types';\nimport { BaseModOptions, withBaseMod } from './withMod';\n\nconst debug = Debug('config-plugins:base-mods');\n\nexport type ForwardedBaseModOptions = Partial<\n Pick<BaseModOptions, 'saveToInternal' | 'skipEmptyMod'>\n>;\n\nexport type BaseModProviderMethods<\n ModType,\n Props extends ForwardedBaseModOptions = ForwardedBaseModOptions\n> = {\n getFilePath: (config: ExportedConfigWithProps<ModType>, props: Props) => Promise<string> | string;\n read: (\n filePath: string,\n config: ExportedConfigWithProps<ModType>,\n props: Props\n ) => Promise<ModType> | ModType;\n write: (\n filePath: string,\n config: ExportedConfigWithProps<ModType>,\n props: Props\n ) => Promise<void> | void;\n /**\n * If the mod supports introspection, and avoids making any filesystem modifications during compilation.\n * By enabling, this mod, and all of its descendants will be run in introspection mode.\n * This should only be used for static files like JSON or XML, and not for application files that require regexes,\n * or complex static files that require other files to be generated like Xcode `.pbxproj`.\n */\n isIntrospective?: boolean;\n};\n\nexport type CreateBaseModProps<\n ModType,\n Props extends ForwardedBaseModOptions = ForwardedBaseModOptions\n> = {\n methodName: string;\n platform: ModPlatform;\n modName: string;\n} & BaseModProviderMethods<ModType, Props>;\n\nexport function createBaseMod<\n ModType,\n Props extends ForwardedBaseModOptions = ForwardedBaseModOptions\n>({\n methodName,\n platform,\n modName,\n getFilePath,\n read,\n write,\n isIntrospective,\n}: CreateBaseModProps<ModType, Props>): ConfigPlugin<Props | void> {\n const withUnknown: ConfigPlugin<Props | void> = (config, _props) => {\n const props = _props || ({} as Props);\n return withBaseMod<ModType>(config, {\n platform,\n mod: modName,\n skipEmptyMod: props.skipEmptyMod ?? true,\n saveToInternal: props.saveToInternal ?? false,\n isProvider: true,\n isIntrospective,\n async action({ modRequest: { nextMod, ...modRequest }, ...config }) {\n try {\n let results: ExportedConfigWithProps<ModType> = {\n ...config,\n modRequest,\n };\n\n const filePath = await getFilePath(results, props);\n debug(`mods.${platform}.${modName}: file path: ${filePath || '[skipped]'}`);\n const modResults = await read(filePath, results, props);\n\n results = await nextMod!({\n ...results,\n modResults,\n modRequest,\n });\n\n assertModResults(results, modRequest.platform, modRequest.modName);\n\n await write(filePath, results, props);\n return results;\n } catch (error: any) {\n error.message = `[${platform}.${modName}]: ${methodName}: ${error.message}`;\n throw error;\n }\n },\n });\n };\n\n if (methodName) {\n Object.defineProperty(withUnknown, 'name', {\n value: methodName,\n });\n }\n\n return withUnknown;\n}\n\nexport function assertModResults(results: any, platformName: string, modName: string) {\n // If the results came from a mod, they'd be in the form of [config, data].\n // Ensure the results are an array and omit the data since it should've been written by a data provider plugin.\n const ensuredResults = results;\n\n // Sanity check to help locate non compliant mods.\n if (!ensuredResults || typeof ensuredResults !== 'object' || !ensuredResults?.mods) {\n throw new Error(\n `Mod \\`mods.${platformName}.${modName}\\` evaluated to an object that is not a valid project config. Instead got: ${JSON.stringify(\n ensuredResults\n )}`\n );\n }\n return ensuredResults;\n}\n\nfunction upperFirst(name: string): string {\n return name.charAt(0).toUpperCase() + name.slice(1);\n}\n\nexport function createPlatformBaseMod<\n ModType,\n Props extends ForwardedBaseModOptions = ForwardedBaseModOptions\n>({ modName, ...props }: Omit<CreateBaseModProps<ModType, Props>, 'methodName'>) {\n // Generate the function name to ensure it's uniform and also to improve stack traces.\n const methodName = `with${upperFirst(props.platform)}${upperFirst(modName)}BaseMod`;\n return createBaseMod<ModType, Props>({\n methodName,\n modName,\n ...props,\n });\n}\n\n/** A TS wrapper for creating provides */\nexport function provider<ModType, Props extends ForwardedBaseModOptions = ForwardedBaseModOptions>(\n props: BaseModProviderMethods<ModType, Props>\n) {\n return props;\n}\n\n/** Plugin to create and append base mods from file providers */\nexport function withGeneratedBaseMods<ModName extends string>(\n config: ExportedConfig,\n {\n platform,\n providers,\n ...props\n }: ForwardedBaseModOptions & {\n platform: ModPlatform;\n providers: Partial<Record<ModName, BaseModProviderMethods<any, any>>>;\n }\n): ExportedConfig {\n return Object.entries(providers).reduce((config, [modName, value]) => {\n const baseMod = createPlatformBaseMod({ platform, modName, ...(value as any) });\n return baseMod(config, props);\n }, config);\n}\n"],"file":"createBaseMod.js"}
1
+ {"version":3,"sources":["../../src/plugins/createBaseMod.ts"],"names":["debug","createBaseMod","methodName","platform","modName","getFilePath","read","write","isIntrospective","withUnknown","config","_props","props","mod","skipEmptyMod","saveToInternal","isProvider","action","modRequest","nextMod","results","filePath","modResults","assertModResults","error","message","Object","defineProperty","value","platformName","ensuredResults","mods","Error","JSON","stringify","upperFirst","name","charAt","toUpperCase","slice","createPlatformBaseMod","provider","withGeneratedBaseMods","providers","entries","reduce","baseMod"],"mappings":"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","sourcesContent":["import Debug from 'debug';\n\nimport {\n ConfigPlugin,\n ExportedConfig,\n ExportedConfigWithProps,\n ModPlatform,\n} from '../Plugin.types';\nimport { BaseModOptions, withBaseMod } from './withMod';\n\nconst debug = Debug('expo:config-plugins:base-mods');\n\nexport type ForwardedBaseModOptions = Partial<\n Pick<BaseModOptions, 'saveToInternal' | 'skipEmptyMod'>\n>;\n\nexport type BaseModProviderMethods<\n ModType,\n Props extends ForwardedBaseModOptions = ForwardedBaseModOptions\n> = {\n getFilePath: (config: ExportedConfigWithProps<ModType>, props: Props) => Promise<string> | string;\n read: (\n filePath: string,\n config: ExportedConfigWithProps<ModType>,\n props: Props\n ) => Promise<ModType> | ModType;\n write: (\n filePath: string,\n config: ExportedConfigWithProps<ModType>,\n props: Props\n ) => Promise<void> | void;\n /**\n * If the mod supports introspection, and avoids making any filesystem modifications during compilation.\n * By enabling, this mod, and all of its descendants will be run in introspection mode.\n * This should only be used for static files like JSON or XML, and not for application files that require regexes,\n * or complex static files that require other files to be generated like Xcode `.pbxproj`.\n */\n isIntrospective?: boolean;\n};\n\nexport type CreateBaseModProps<\n ModType,\n Props extends ForwardedBaseModOptions = ForwardedBaseModOptions\n> = {\n methodName: string;\n platform: ModPlatform;\n modName: string;\n} & BaseModProviderMethods<ModType, Props>;\n\nexport function createBaseMod<\n ModType,\n Props extends ForwardedBaseModOptions = ForwardedBaseModOptions\n>({\n methodName,\n platform,\n modName,\n getFilePath,\n read,\n write,\n isIntrospective,\n}: CreateBaseModProps<ModType, Props>): ConfigPlugin<Props | void> {\n const withUnknown: ConfigPlugin<Props | void> = (config, _props) => {\n const props = _props || ({} as Props);\n return withBaseMod<ModType>(config, {\n platform,\n mod: modName,\n skipEmptyMod: props.skipEmptyMod ?? true,\n saveToInternal: props.saveToInternal ?? false,\n isProvider: true,\n isIntrospective,\n async action({ modRequest: { nextMod, ...modRequest }, ...config }) {\n try {\n let results: ExportedConfigWithProps<ModType> = {\n ...config,\n modRequest,\n };\n\n const filePath = await getFilePath(results, props);\n debug(`mods.${platform}.${modName}: file path: ${filePath || '[skipped]'}`);\n const modResults = await read(filePath, results, props);\n\n results = await nextMod!({\n ...results,\n modResults,\n modRequest,\n });\n\n assertModResults(results, modRequest.platform, modRequest.modName);\n\n await write(filePath, results, props);\n return results;\n } catch (error: any) {\n error.message = `[${platform}.${modName}]: ${methodName}: ${error.message}`;\n throw error;\n }\n },\n });\n };\n\n if (methodName) {\n Object.defineProperty(withUnknown, 'name', {\n value: methodName,\n });\n }\n\n return withUnknown;\n}\n\nexport function assertModResults(results: any, platformName: string, modName: string) {\n // If the results came from a mod, they'd be in the form of [config, data].\n // Ensure the results are an array and omit the data since it should've been written by a data provider plugin.\n const ensuredResults = results;\n\n // Sanity check to help locate non compliant mods.\n if (!ensuredResults || typeof ensuredResults !== 'object' || !ensuredResults?.mods) {\n throw new Error(\n `Mod \\`mods.${platformName}.${modName}\\` evaluated to an object that is not a valid project config. Instead got: ${JSON.stringify(\n ensuredResults\n )}`\n );\n }\n return ensuredResults;\n}\n\nfunction upperFirst(name: string): string {\n return name.charAt(0).toUpperCase() + name.slice(1);\n}\n\nexport function createPlatformBaseMod<\n ModType,\n Props extends ForwardedBaseModOptions = ForwardedBaseModOptions\n>({ modName, ...props }: Omit<CreateBaseModProps<ModType, Props>, 'methodName'>) {\n // Generate the function name to ensure it's uniform and also to improve stack traces.\n const methodName = `with${upperFirst(props.platform)}${upperFirst(modName)}BaseMod`;\n return createBaseMod<ModType, Props>({\n methodName,\n modName,\n ...props,\n });\n}\n\n/** A TS wrapper for creating provides */\nexport function provider<ModType, Props extends ForwardedBaseModOptions = ForwardedBaseModOptions>(\n props: BaseModProviderMethods<ModType, Props>\n) {\n return props;\n}\n\n/** Plugin to create and append base mods from file providers */\nexport function withGeneratedBaseMods<ModName extends string>(\n config: ExportedConfig,\n {\n platform,\n providers,\n ...props\n }: ForwardedBaseModOptions & {\n platform: ModPlatform;\n providers: Partial<Record<ModName, BaseModProviderMethods<any, any>>>;\n }\n): ExportedConfig {\n return Object.entries(providers).reduce((config, [modName, value]) => {\n const baseMod = createPlatformBaseMod({ platform, modName, ...(value as any) });\n return baseMod(config, props);\n }, config);\n}\n"],"file":"createBaseMod.js"}
@@ -3,9 +3,9 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.createInfoPlistPlugin = createInfoPlistPlugin;
7
6
  exports.createEntitlementsPlugin = createEntitlementsPlugin;
8
- exports.withPodfileProperties = exports.withXcodeProject = exports.withExpoPlist = exports.withEntitlementsPlist = exports.withInfoPlist = exports.withAppDelegate = void 0;
7
+ exports.createInfoPlistPlugin = createInfoPlistPlugin;
8
+ exports.withXcodeProject = exports.withPodfileProperties = exports.withInfoPlist = exports.withExpoPlist = exports.withEntitlementsPlist = exports.withAppDelegate = void 0;
9
9
 
10
10
  function _withMod() {
11
11
  const data = require("./withMod");
@@ -3,10 +3,10 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.withDefaultBaseMods = withDefaultBaseMods;
7
- exports.withIntrospectionBaseMods = withIntrospectionBaseMods;
8
6
  exports.compileModsAsync = compileModsAsync;
9
7
  exports.evalModsAsync = evalModsAsync;
8
+ exports.withDefaultBaseMods = withDefaultBaseMods;
9
+ exports.withIntrospectionBaseMods = withIntrospectionBaseMods;
10
10
 
11
11
  function _debug() {
12
12
  const data = _interopRequireDefault(require("debug"));
@@ -94,7 +94,7 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
94
94
 
95
95
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
96
96
 
97
- const debug = (0, _debug().default)('config-plugins:mod-compiler');
97
+ const debug = (0, _debug().default)('expo:config-plugins:mod-compiler');
98
98
 
99
99
  function withDefaultBaseMods(config, props = {}) {
100
100
  config = (0, _withIosBaseMods().withIosBaseMods)(config, props);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugins/mod-compiler.ts"],"names":["debug","withDefaultBaseMods","config","props","withIntrospectionBaseMods","saveToInternal","skipEmptyMod","mods","platform","Object","keys","key","isIntrospective","compileModsAsync","introspect","evalModsAsync","sortMods","commands","order","allKeys","map","completeOrder","Set","sorted","length","group","shift","commandSet","find","push","orders","ios","android","projectRoot","platforms","assertMissingModProviders","platformName","entries","includes","name","join","platformProjectRoot","path","projectName","undefined","modName","mod","modRequest","isProvider","errorMessage","PluginError","Warnings","addWarningForPlatform","results","modResults"],"mappings":"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","sourcesContent":["import Debug from 'debug';\nimport path from 'path';\n\nimport { ExportedConfig, Mod, ModConfig, ModPlatform } from '../Plugin.types';\nimport { getHackyProjectName } from '../ios/utils/Xcodeproj';\nimport { PluginError } from '../utils/errors';\nimport * as Warnings from '../utils/warnings';\nimport { assertModResults, ForwardedBaseModOptions } from './createBaseMod';\nimport { withAndroidBaseMods } from './withAndroidBaseMods';\nimport { withIosBaseMods } from './withIosBaseMods';\n\nconst debug = Debug('config-plugins:mod-compiler');\n\nexport function withDefaultBaseMods(\n config: ExportedConfig,\n props: ForwardedBaseModOptions = {}\n): ExportedConfig {\n config = withIosBaseMods(config, props);\n config = withAndroidBaseMods(config, props);\n return config;\n}\n\n/**\n * Get a prebuild config that safely evaluates mods without persisting any changes to the file system.\n * Currently this only supports infoPlist, entitlements, androidManifest, strings, gradleProperties, and expoPlist mods.\n * This plugin should be evaluated directly:\n */\nexport function withIntrospectionBaseMods(\n config: ExportedConfig,\n props: ForwardedBaseModOptions = {}\n): ExportedConfig {\n config = withIosBaseMods(config, {\n saveToInternal: true,\n // This writing optimization can be skipped since we never write in introspection mode.\n // Including empty mods will ensure that all mods get introspected.\n skipEmptyMod: false,\n ...props,\n });\n config = withAndroidBaseMods(config, {\n saveToInternal: true,\n skipEmptyMod: false,\n ...props,\n });\n\n if (config.mods) {\n // Remove all mods that don't have an introspection base mod, for instance `dangerous` mods.\n for (const platform of Object.keys(config.mods) as ModPlatform[]) {\n // const platformPreserve = preserve[platform];\n for (const key of Object.keys(config.mods[platform] || {})) {\n // @ts-ignore\n if (!config.mods[platform]?.[key]?.isIntrospective) {\n debug(`removing non-idempotent mod: ${platform}.${key}`);\n // @ts-ignore\n delete config.mods[platform]?.[key];\n }\n }\n }\n }\n\n return config;\n}\n\n/**\n *\n * @param projectRoot\n * @param config\n */\nexport async function compileModsAsync(\n config: ExportedConfig,\n props: {\n projectRoot: string;\n platforms?: ModPlatform[];\n introspect?: boolean;\n assertMissingModProviders?: boolean;\n }\n): Promise<ExportedConfig> {\n if (props.introspect === true) {\n config = withIntrospectionBaseMods(config);\n } else {\n config = withDefaultBaseMods(config);\n }\n return await evalModsAsync(config, props);\n}\n\nfunction sortMods(commands: [string, any][], order: string[]): [string, any][] {\n const allKeys = commands.map(([key]) => key);\n const completeOrder = [...new Set([...order, ...allKeys])];\n const sorted: [string, any][] = [];\n while (completeOrder.length) {\n const group = completeOrder.shift()!;\n const commandSet = commands.find(([key]) => key === group);\n if (commandSet) {\n sorted.push(commandSet);\n }\n }\n return sorted;\n}\n\nconst orders: Record<string, string[]> = {\n ios: [\n // dangerous runs first\n 'dangerous',\n // run the XcodeProject mod second because many plugins attempt to read from it.\n 'xcodeproj',\n ],\n android: ['dangerous'],\n};\n/**\n * A generic plugin compiler.\n *\n * @param config\n */\nexport async function evalModsAsync(\n config: ExportedConfig,\n {\n projectRoot,\n introspect,\n platforms,\n /**\n * Throw errors when mods are missing providers.\n * @default true\n */\n assertMissingModProviders,\n }: {\n projectRoot: string;\n introspect?: boolean;\n assertMissingModProviders?: boolean;\n platforms?: ModPlatform[];\n }\n): Promise<ExportedConfig> {\n for (const [platformName, platform] of Object.entries(config.mods ?? ({} as ModConfig))) {\n if (platforms && !platforms.includes(platformName as any)) {\n debug(`skip platform: ${platformName}`);\n continue;\n }\n\n let entries = Object.entries(platform);\n if (entries.length) {\n // Move dangerous item to the first position if it exists, this ensures that all dangerous code runs first.\n entries = sortMods(entries, orders[platformName]!);\n debug(`run in order: ${entries.map(([name]) => name).join(', ')}`);\n const platformProjectRoot = path.join(projectRoot, platformName);\n const projectName =\n platformName === 'ios' ? getHackyProjectName(projectRoot, config) : undefined;\n\n for (const [modName, mod] of entries) {\n const modRequest = {\n projectRoot,\n projectName,\n platformProjectRoot,\n platform: platformName as ModPlatform,\n modName,\n introspect: !!introspect,\n };\n\n if (!(mod as Mod).isProvider) {\n // In strict mode, throw an error.\n const errorMessage = `Initial base modifier for \"${platformName}.${modName}\" is not a provider and therefore will not provide modResults to child mods`;\n if (assertMissingModProviders !== false) {\n throw new PluginError(errorMessage, 'MISSING_PROVIDER');\n } else {\n Warnings.addWarningForPlatform(\n platformName as ModPlatform,\n `${platformName}.${modName}`,\n `Skipping: Initial base modifier for \"${platformName}.${modName}\" is not a provider and therefore will not provide modResults to child mods. This may be due to an outdated version of Expo CLI.`\n );\n // In loose mode, just skip the mod entirely.\n continue;\n }\n }\n\n const results = await (mod as Mod)({\n ...config,\n modResults: null,\n modRequest,\n });\n\n // Sanity check to help locate non compliant mods.\n config = assertModResults(results, platformName, modName);\n // @ts-ignore: data is added for modifications\n delete config.modResults;\n // @ts-ignore: info is added for modifications\n delete config.modRequest;\n }\n }\n }\n\n return config;\n}\n"],"file":"mod-compiler.js"}
1
+ {"version":3,"sources":["../../src/plugins/mod-compiler.ts"],"names":["debug","withDefaultBaseMods","config","props","withIntrospectionBaseMods","saveToInternal","skipEmptyMod","mods","platform","Object","keys","key","isIntrospective","compileModsAsync","introspect","evalModsAsync","sortMods","commands","order","allKeys","map","completeOrder","Set","sorted","length","group","shift","commandSet","find","push","orders","ios","android","projectRoot","platforms","assertMissingModProviders","platformName","entries","includes","name","join","platformProjectRoot","path","projectName","undefined","modName","mod","modRequest","isProvider","errorMessage","PluginError","Warnings","addWarningForPlatform","results","modResults"],"mappings":"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","sourcesContent":["import Debug from 'debug';\nimport path from 'path';\n\nimport { ExportedConfig, Mod, ModConfig, ModPlatform } from '../Plugin.types';\nimport { getHackyProjectName } from '../ios/utils/Xcodeproj';\nimport { PluginError } from '../utils/errors';\nimport * as Warnings from '../utils/warnings';\nimport { assertModResults, ForwardedBaseModOptions } from './createBaseMod';\nimport { withAndroidBaseMods } from './withAndroidBaseMods';\nimport { withIosBaseMods } from './withIosBaseMods';\n\nconst debug = Debug('expo:config-plugins:mod-compiler');\n\nexport function withDefaultBaseMods(\n config: ExportedConfig,\n props: ForwardedBaseModOptions = {}\n): ExportedConfig {\n config = withIosBaseMods(config, props);\n config = withAndroidBaseMods(config, props);\n return config;\n}\n\n/**\n * Get a prebuild config that safely evaluates mods without persisting any changes to the file system.\n * Currently this only supports infoPlist, entitlements, androidManifest, strings, gradleProperties, and expoPlist mods.\n * This plugin should be evaluated directly:\n */\nexport function withIntrospectionBaseMods(\n config: ExportedConfig,\n props: ForwardedBaseModOptions = {}\n): ExportedConfig {\n config = withIosBaseMods(config, {\n saveToInternal: true,\n // This writing optimization can be skipped since we never write in introspection mode.\n // Including empty mods will ensure that all mods get introspected.\n skipEmptyMod: false,\n ...props,\n });\n config = withAndroidBaseMods(config, {\n saveToInternal: true,\n skipEmptyMod: false,\n ...props,\n });\n\n if (config.mods) {\n // Remove all mods that don't have an introspection base mod, for instance `dangerous` mods.\n for (const platform of Object.keys(config.mods) as ModPlatform[]) {\n // const platformPreserve = preserve[platform];\n for (const key of Object.keys(config.mods[platform] || {})) {\n // @ts-ignore\n if (!config.mods[platform]?.[key]?.isIntrospective) {\n debug(`removing non-idempotent mod: ${platform}.${key}`);\n // @ts-ignore\n delete config.mods[platform]?.[key];\n }\n }\n }\n }\n\n return config;\n}\n\n/**\n *\n * @param projectRoot\n * @param config\n */\nexport async function compileModsAsync(\n config: ExportedConfig,\n props: {\n projectRoot: string;\n platforms?: ModPlatform[];\n introspect?: boolean;\n assertMissingModProviders?: boolean;\n }\n): Promise<ExportedConfig> {\n if (props.introspect === true) {\n config = withIntrospectionBaseMods(config);\n } else {\n config = withDefaultBaseMods(config);\n }\n return await evalModsAsync(config, props);\n}\n\nfunction sortMods(commands: [string, any][], order: string[]): [string, any][] {\n const allKeys = commands.map(([key]) => key);\n const completeOrder = [...new Set([...order, ...allKeys])];\n const sorted: [string, any][] = [];\n while (completeOrder.length) {\n const group = completeOrder.shift()!;\n const commandSet = commands.find(([key]) => key === group);\n if (commandSet) {\n sorted.push(commandSet);\n }\n }\n return sorted;\n}\n\nconst orders: Record<string, string[]> = {\n ios: [\n // dangerous runs first\n 'dangerous',\n // run the XcodeProject mod second because many plugins attempt to read from it.\n 'xcodeproj',\n ],\n android: ['dangerous'],\n};\n/**\n * A generic plugin compiler.\n *\n * @param config\n */\nexport async function evalModsAsync(\n config: ExportedConfig,\n {\n projectRoot,\n introspect,\n platforms,\n /**\n * Throw errors when mods are missing providers.\n * @default true\n */\n assertMissingModProviders,\n }: {\n projectRoot: string;\n introspect?: boolean;\n assertMissingModProviders?: boolean;\n platforms?: ModPlatform[];\n }\n): Promise<ExportedConfig> {\n for (const [platformName, platform] of Object.entries(config.mods ?? ({} as ModConfig))) {\n if (platforms && !platforms.includes(platformName as any)) {\n debug(`skip platform: ${platformName}`);\n continue;\n }\n\n let entries = Object.entries(platform);\n if (entries.length) {\n // Move dangerous item to the first position if it exists, this ensures that all dangerous code runs first.\n entries = sortMods(entries, orders[platformName]!);\n debug(`run in order: ${entries.map(([name]) => name).join(', ')}`);\n const platformProjectRoot = path.join(projectRoot, platformName);\n const projectName =\n platformName === 'ios' ? getHackyProjectName(projectRoot, config) : undefined;\n\n for (const [modName, mod] of entries) {\n const modRequest = {\n projectRoot,\n projectName,\n platformProjectRoot,\n platform: platformName as ModPlatform,\n modName,\n introspect: !!introspect,\n };\n\n if (!(mod as Mod).isProvider) {\n // In strict mode, throw an error.\n const errorMessage = `Initial base modifier for \"${platformName}.${modName}\" is not a provider and therefore will not provide modResults to child mods`;\n if (assertMissingModProviders !== false) {\n throw new PluginError(errorMessage, 'MISSING_PROVIDER');\n } else {\n Warnings.addWarningForPlatform(\n platformName as ModPlatform,\n `${platformName}.${modName}`,\n `Skipping: Initial base modifier for \"${platformName}.${modName}\" is not a provider and therefore will not provide modResults to child mods. This may be due to an outdated version of Expo CLI.`\n );\n // In loose mode, just skip the mod entirely.\n continue;\n }\n }\n\n const results = await (mod as Mod)({\n ...config,\n modResults: null,\n modRequest,\n });\n\n // Sanity check to help locate non compliant mods.\n config = assertModResults(results, platformName, modName);\n // @ts-ignore: data is added for modifications\n delete config.modResults;\n // @ts-ignore: info is added for modifications\n delete config.modRequest;\n }\n }\n }\n\n return config;\n}\n"],"file":"mod-compiler.js"}
@@ -3,9 +3,9 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.getAndroidModFileProviders = getAndroidModFileProviders;
6
7
  exports.sortAndroidManifest = sortAndroidManifest;
7
8
  exports.withAndroidBaseMods = withAndroidBaseMods;
8
- exports.getAndroidModFileProviders = getAndroidModFileProviders;
9
9
 
10
10
  function _fs() {
11
11
  const data = require("fs");
@@ -3,8 +3,8 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.withIosBaseMods = withIosBaseMods;
7
6
  exports.getIosModFileProviders = getIosModFileProviders;
7
+ exports.withIosBaseMods = withIosBaseMods;
8
8
 
9
9
  function _jsonFile() {
10
10
  const data = _interopRequireDefault(require("@expo/json-file"));
@@ -10,6 +10,7 @@ export declare function getNativeVersion(config: Pick<ExpoConfig, 'version'> & {
10
10
  * @return an expoConfig with only string valued platform specific runtime versions.
11
11
  */
12
12
  export declare const withRuntimeVersion: (config: ExpoConfig) => ExpoConfig;
13
+ export declare function getRuntimeVersionNullable(...[config, platform]: Parameters<typeof getRuntimeVersion>): string | null;
13
14
  export declare function getRuntimeVersion(config: Pick<ExpoConfig, 'version' | 'runtimeVersion' | 'sdkVersion'> & {
14
15
  android?: Pick<Android, 'versionCode' | 'runtimeVersion'>;
15
16
  ios?: Pick<IOS, 'buildNumber' | 'runtimeVersion'>;
@@ -3,9 +3,10 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.getUpdateUrl = getUpdateUrl;
7
6
  exports.getNativeVersion = getNativeVersion;
8
7
  exports.getRuntimeVersion = getRuntimeVersion;
8
+ exports.getRuntimeVersionNullable = getRuntimeVersionNullable;
9
+ exports.getUpdateUrl = getUpdateUrl;
9
10
  exports.withRuntimeVersion = void 0;
10
11
 
11
12
  function _sdkRuntimeVersions() {
@@ -18,6 +19,16 @@ function _sdkRuntimeVersions() {
18
19
  return data;
19
20
  }
20
21
 
22
+ function _getenv() {
23
+ const data = require("getenv");
24
+
25
+ _getenv = function () {
26
+ return data;
27
+ };
28
+
29
+ return data;
30
+ }
31
+
21
32
  function _() {
22
33
  const data = require("..");
23
34
 
@@ -97,6 +108,18 @@ const withRuntimeVersion = config => {
97
108
 
98
109
  exports.withRuntimeVersion = withRuntimeVersion;
99
110
 
111
+ function getRuntimeVersionNullable(...[config, platform]) {
112
+ try {
113
+ return getRuntimeVersion(config, platform);
114
+ } catch (e) {
115
+ if ((0, _getenv().boolish)('EXPO_DEBUG', false)) {
116
+ console.log(e);
117
+ }
118
+
119
+ return null;
120
+ }
121
+ }
122
+
100
123
  function getRuntimeVersion(config, platform) {
101
124
  var _config$platform$runt, _config$platform;
102
125
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/Updates.ts"],"names":["getUpdateUrl","config","username","updates","url","user","owner","slug","getNativeVersion","platform","version","IOSConfig","Version","getVersion","buildNumber","getBuildNumber","versionCode","AndroidConfig","getVersionCode","Error","withRuntimeVersion","ios","runtimeVersion","getRuntimeVersion","android","policy","sdkVersion","JSON","stringify"],"mappings":"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","sourcesContent":["import { Android, ExpoConfig, IOS } from '@expo/config-types';\nimport { getRuntimeVersionForSDKVersion } from '@expo/sdk-runtime-versions';\n\nimport { AndroidConfig, IOSConfig } from '..';\n\nexport type ExpoConfigUpdates = Pick<\n ExpoConfig,\n 'sdkVersion' | 'owner' | 'runtimeVersion' | 'updates' | 'slug'\n>;\n\nexport function getUpdateUrl(\n config: Pick<ExpoConfigUpdates, 'owner' | 'slug' | 'updates'>,\n username: string | null\n): string | null {\n if (config.updates?.url) {\n return config.updates?.url;\n }\n\n const user = typeof config.owner === 'string' ? config.owner : username;\n if (!user) {\n return null;\n }\n return `https://exp.host/@${user}/${config.slug}`;\n}\n\nexport function getNativeVersion(\n config: Pick<ExpoConfig, 'version'> & {\n android?: Pick<Android, 'versionCode'>;\n ios?: Pick<IOS, 'buildNumber'>;\n },\n platform: 'android' | 'ios'\n): string {\n const version = IOSConfig.Version.getVersion(config);\n switch (platform) {\n case 'ios': {\n const buildNumber = IOSConfig.Version.getBuildNumber(config);\n return `${version}(${buildNumber})`;\n }\n case 'android': {\n const versionCode = AndroidConfig.Version.getVersionCode(config);\n return `${version}(${versionCode})`;\n }\n default: {\n throw new Error(\n `\"${platform}\" is not a supported platform. Choose either \"ios\" or \"android\".`\n );\n }\n }\n}\n\n/**\n * Compute runtime version policies.\n * @return an expoConfig with only string valued platform specific runtime versions.\n */\nexport const withRuntimeVersion: (config: ExpoConfig) => ExpoConfig = config => {\n if (config.ios?.runtimeVersion || config.runtimeVersion) {\n config.ios = {\n ...config.ios,\n runtimeVersion: getRuntimeVersion(config, 'ios'),\n };\n }\n if (config.android?.runtimeVersion || config.runtimeVersion) {\n config.android = {\n ...config.android,\n runtimeVersion: getRuntimeVersion(config, 'android'),\n };\n }\n delete config.runtimeVersion;\n return config;\n};\n\nexport function getRuntimeVersion(\n config: Pick<ExpoConfig, 'version' | 'runtimeVersion' | 'sdkVersion'> & {\n android?: Pick<Android, 'versionCode' | 'runtimeVersion'>;\n ios?: Pick<IOS, 'buildNumber' | 'runtimeVersion'>;\n },\n platform: 'android' | 'ios'\n): string {\n const runtimeVersion = config[platform]?.runtimeVersion ?? config.runtimeVersion;\n if (!runtimeVersion) {\n throw new Error(\n `There is neither a value or a policy set for the runtime version on \"${platform}\"`\n );\n }\n\n if (typeof runtimeVersion === 'string') {\n return runtimeVersion;\n } else if (runtimeVersion.policy === 'nativeVersion') {\n return getNativeVersion(config, platform);\n } else if (runtimeVersion.policy === 'sdkVersion') {\n if (!config.sdkVersion) {\n throw new Error(\"An SDK version must be defined when using the 'sdkVersion' runtime policy.\");\n }\n return getRuntimeVersionForSDKVersion(config.sdkVersion);\n }\n\n throw new Error(\n `\"${\n typeof runtimeVersion === 'object' ? JSON.stringify(runtimeVersion) : runtimeVersion\n }\" is not a valid runtime version. getRuntimeVersion only supports a string, \"sdkVersion\", or \"nativeVersion\" policy.`\n );\n}\n"],"file":"Updates.js"}
1
+ {"version":3,"sources":["../../src/utils/Updates.ts"],"names":["getUpdateUrl","config","username","updates","url","user","owner","slug","getNativeVersion","platform","version","IOSConfig","Version","getVersion","buildNumber","getBuildNumber","versionCode","AndroidConfig","getVersionCode","Error","withRuntimeVersion","ios","runtimeVersion","getRuntimeVersion","android","getRuntimeVersionNullable","e","console","log","policy","sdkVersion","JSON","stringify"],"mappings":"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","sourcesContent":["import { Android, ExpoConfig, IOS } from '@expo/config-types';\nimport { getRuntimeVersionForSDKVersion } from '@expo/sdk-runtime-versions';\nimport { boolish } from 'getenv';\n\nimport { AndroidConfig, IOSConfig } from '..';\n\nexport type ExpoConfigUpdates = Pick<\n ExpoConfig,\n 'sdkVersion' | 'owner' | 'runtimeVersion' | 'updates' | 'slug'\n>;\n\nexport function getUpdateUrl(\n config: Pick<ExpoConfigUpdates, 'owner' | 'slug' | 'updates'>,\n username: string | null\n): string | null {\n if (config.updates?.url) {\n return config.updates?.url;\n }\n\n const user = typeof config.owner === 'string' ? config.owner : username;\n if (!user) {\n return null;\n }\n return `https://exp.host/@${user}/${config.slug}`;\n}\n\nexport function getNativeVersion(\n config: Pick<ExpoConfig, 'version'> & {\n android?: Pick<Android, 'versionCode'>;\n ios?: Pick<IOS, 'buildNumber'>;\n },\n platform: 'android' | 'ios'\n): string {\n const version = IOSConfig.Version.getVersion(config);\n switch (platform) {\n case 'ios': {\n const buildNumber = IOSConfig.Version.getBuildNumber(config);\n return `${version}(${buildNumber})`;\n }\n case 'android': {\n const versionCode = AndroidConfig.Version.getVersionCode(config);\n return `${version}(${versionCode})`;\n }\n default: {\n throw new Error(\n `\"${platform}\" is not a supported platform. Choose either \"ios\" or \"android\".`\n );\n }\n }\n}\n\n/**\n * Compute runtime version policies.\n * @return an expoConfig with only string valued platform specific runtime versions.\n */\nexport const withRuntimeVersion: (config: ExpoConfig) => ExpoConfig = config => {\n if (config.ios?.runtimeVersion || config.runtimeVersion) {\n config.ios = {\n ...config.ios,\n runtimeVersion: getRuntimeVersion(config, 'ios'),\n };\n }\n if (config.android?.runtimeVersion || config.runtimeVersion) {\n config.android = {\n ...config.android,\n runtimeVersion: getRuntimeVersion(config, 'android'),\n };\n }\n delete config.runtimeVersion;\n return config;\n};\n\nexport function getRuntimeVersionNullable(\n ...[config, platform]: Parameters<typeof getRuntimeVersion>\n): string | null {\n try {\n return getRuntimeVersion(config, platform);\n } catch (e) {\n if (boolish('EXPO_DEBUG', false)) {\n console.log(e);\n }\n return null;\n }\n}\n\nexport function getRuntimeVersion(\n config: Pick<ExpoConfig, 'version' | 'runtimeVersion' | 'sdkVersion'> & {\n android?: Pick<Android, 'versionCode' | 'runtimeVersion'>;\n ios?: Pick<IOS, 'buildNumber' | 'runtimeVersion'>;\n },\n platform: 'android' | 'ios'\n): string {\n const runtimeVersion = config[platform]?.runtimeVersion ?? config.runtimeVersion;\n if (!runtimeVersion) {\n throw new Error(\n `There is neither a value or a policy set for the runtime version on \"${platform}\"`\n );\n }\n\n if (typeof runtimeVersion === 'string') {\n return runtimeVersion;\n } else if (runtimeVersion.policy === 'nativeVersion') {\n return getNativeVersion(config, platform);\n } else if (runtimeVersion.policy === 'sdkVersion') {\n if (!config.sdkVersion) {\n throw new Error(\"An SDK version must be defined when using the 'sdkVersion' runtime policy.\");\n }\n return getRuntimeVersionForSDKVersion(config.sdkVersion);\n }\n\n throw new Error(\n `\"${\n typeof runtimeVersion === 'object' ? JSON.stringify(runtimeVersion) : runtimeVersion\n }\" is not a valid runtime version. getRuntimeVersion only supports a string, \"sdkVersion\", or \"nativeVersion\" policy.`\n );\n}\n"],"file":"Updates.js"}
@@ -17,3 +17,9 @@ export declare function format(manifest: any, { indentLevel, newline }?: {
17
17
  indentLevel?: number | undefined;
18
18
  newline?: string | undefined;
19
19
  }): string;
20
+ /**
21
+ * Escapes Android string literals, specifically characters `"`, `'`, `\`, `\n`, `\r`, `\t`
22
+ *
23
+ * @param value unescaped Android XML string literal.
24
+ */
25
+ export declare function escapeAndroidString(value: string): string;
@@ -3,10 +3,11 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.writeXMLAsync = writeXMLAsync;
7
- exports.readXMLAsync = readXMLAsync;
8
- exports.parseXMLAsync = parseXMLAsync;
6
+ exports.escapeAndroidString = escapeAndroidString;
9
7
  exports.format = format;
8
+ exports.parseXMLAsync = parseXMLAsync;
9
+ exports.readXMLAsync = readXMLAsync;
10
+ exports.writeXMLAsync = writeXMLAsync;
10
11
 
11
12
  function _fsExtra() {
12
13
  const data = _interopRequireDefault(require("fs-extra"));
@@ -51,7 +52,7 @@ function _xml2js() {
51
52
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
52
53
 
53
54
  async function writeXMLAsync(options) {
54
- const xml = new (_xml2js().Builder)().buildObject(options.xml);
55
+ const xml = format(options.xml);
55
56
  await _fsExtra().default.ensureDir(_path().default.dirname(options.path));
56
57
  await _fsExtra().default.writeFile(options.path, xml);
57
58
  }
@@ -88,9 +89,24 @@ function format(manifest, {
88
89
  if (typeof manifest === 'string') {
89
90
  xmlInput = manifest;
90
91
  } else if (manifest.toString) {
92
+ var _manifest$resources;
93
+
91
94
  const builder = new (_xml2js().Builder)({
92
95
  headless: true
93
- });
96
+ }); // For strings.xml
97
+
98
+ if (Array.isArray(manifest === null || manifest === void 0 ? void 0 : (_manifest$resources = manifest.resources) === null || _manifest$resources === void 0 ? void 0 : _manifest$resources.string)) {
99
+ for (const string of manifest === null || manifest === void 0 ? void 0 : (_manifest$resources2 = manifest.resources) === null || _manifest$resources2 === void 0 ? void 0 : _manifest$resources2.string) {
100
+ var _manifest$resources2;
101
+
102
+ if (string.$.translatable === 'false' || string.$.translatable === false) {
103
+ continue;
104
+ }
105
+
106
+ string._ = escapeAndroidString(string._);
107
+ }
108
+ }
109
+
94
110
  xmlInput = builder.buildObject(manifest);
95
111
  return xmlInput;
96
112
  } else {
@@ -108,9 +124,6 @@ function format(manifest, {
108
124
  if (line.match(/.+<\/\w[^>]*>$/)) {
109
125
  indent = 0;
110
126
  } else if (line.match(/^<\/\w/)) {
111
- // Somehow istanbul doesn't see the else case as covered, although it is. Skip it.
112
-
113
- /* istanbul ignore else */
114
127
  if (pad !== 0) {
115
128
  pad -= 1;
116
129
  }
@@ -121,10 +134,44 @@ function format(manifest, {
121
134
  }
122
135
 
123
136
  const padding = stringTimesN(pad, indentString);
124
- formatted += padding + line + newline; // eslint-disable-line prefer-template
125
-
137
+ formatted += padding + line + newline;
126
138
  pad += indent;
127
139
  });
128
140
  return formatted.trim();
129
141
  }
142
+ /**
143
+ * Escapes Android string literals, specifically characters `"`, `'`, `\`, `\n`, `\r`, `\t`
144
+ *
145
+ * @param value unescaped Android XML string literal.
146
+ */
147
+
148
+
149
+ function escapeAndroidString(value) {
150
+ value = value.replace(/[\n\r\t'"@]/g, m => {
151
+ switch (m) {
152
+ case '"':
153
+ case "'":
154
+ case '@':
155
+ return '\\' + m;
156
+
157
+ case '\n':
158
+ return '\\n';
159
+
160
+ case '\r':
161
+ return '\\r';
162
+
163
+ case '\t':
164
+ return '\\t';
165
+
166
+ default:
167
+ throw new Error(`Cannot escape unhandled XML character: ${m}`);
168
+ }
169
+ });
170
+
171
+ if (value.match(/(^\s|\s$)/)) {
172
+ value = '"' + value + '"';
173
+ }
174
+
175
+ return value;
176
+ }
130
177
  //# sourceMappingURL=XML.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/XML.ts"],"names":["writeXMLAsync","options","xml","Builder","buildObject","fs","ensureDir","path","dirname","writeFile","readXMLAsync","contents","readFile","encoding","flag","parser","Parser","manifest","parseStringPromise","fallback","parseXMLAsync","stringTimesN","n","char","Array","join","format","indentLevel","newline","EOL","xmlInput","toString","builder","headless","Error","indentString","formatted","regex","replace","pad","split","map","line","trim","forEach","indent","match","padding"],"mappings":"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","sourcesContent":["import fs from 'fs-extra';\nimport { EOL } from 'os';\nimport path from 'path';\nimport { Builder, Parser } from 'xml2js';\n\nexport type XMLValue = boolean | number | string | null | XMLArray | XMLObject;\n\nexport interface XMLArray extends Array<XMLValue> {}\n\nexport interface XMLObject {\n [key: string]: XMLValue | undefined;\n}\n\nexport async function writeXMLAsync(options: { path: string; xml: any }): Promise<void> {\n const xml = new Builder().buildObject(options.xml);\n await fs.ensureDir(path.dirname(options.path));\n await fs.writeFile(options.path, xml);\n}\n\nexport async function readXMLAsync(options: {\n path: string;\n fallback?: string | null;\n}): Promise<XMLObject> {\n let contents: string = '';\n try {\n contents = await fs.readFile(options.path, { encoding: 'utf8', flag: 'r' });\n } catch {\n // catch and use fallback\n }\n const parser = new Parser();\n const manifest = await parser.parseStringPromise(contents || options.fallback || '');\n return manifest;\n}\n\nexport async function parseXMLAsync(contents: string): Promise<XMLObject> {\n const xml = await new Parser().parseStringPromise(contents);\n return xml;\n}\n\nconst stringTimesN = (n: number, char: string) => Array(n + 1).join(char);\n\nexport function format(manifest: any, { indentLevel = 2, newline = EOL } = {}): string {\n let xmlInput: string;\n if (typeof manifest === 'string') {\n xmlInput = manifest;\n } else if (manifest.toString) {\n const builder = new Builder({ headless: true });\n xmlInput = builder.buildObject(manifest);\n return xmlInput;\n } else {\n throw new Error(`Invalid XML value passed in: ${manifest}`);\n }\n const indentString = stringTimesN(indentLevel, ' ');\n\n let formatted = '';\n const regex = /(>)(<)(\\/*)/g;\n const xml = xmlInput.replace(regex, `$1${newline}$2$3`);\n let pad = 0;\n xml\n .split(/\\r?\\n/)\n .map((line: string) => line.trim())\n .forEach((line: string) => {\n let indent = 0;\n if (line.match(/.+<\\/\\w[^>]*>$/)) {\n indent = 0;\n } else if (line.match(/^<\\/\\w/)) {\n // Somehow istanbul doesn't see the else case as covered, although it is. Skip it.\n /* istanbul ignore else */\n if (pad !== 0) {\n pad -= 1;\n }\n } else if (line.match(/^<\\w([^>]*[^/])?>.*$/)) {\n indent = 1;\n } else {\n indent = 0;\n }\n\n const padding = stringTimesN(pad, indentString);\n formatted += padding + line + newline; // eslint-disable-line prefer-template\n pad += indent;\n });\n\n return formatted.trim();\n}\n"],"file":"XML.js"}
1
+ {"version":3,"sources":["../../src/utils/XML.ts"],"names":["writeXMLAsync","options","xml","format","fs","ensureDir","path","dirname","writeFile","readXMLAsync","contents","readFile","encoding","flag","parser","Parser","manifest","parseStringPromise","fallback","parseXMLAsync","stringTimesN","n","char","Array","join","indentLevel","newline","EOL","xmlInput","toString","builder","Builder","headless","isArray","resources","string","$","translatable","_","escapeAndroidString","buildObject","Error","indentString","formatted","regex","replace","pad","split","map","line","trim","forEach","indent","match","padding","value","m"],"mappings":"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","sourcesContent":["import fs from 'fs-extra';\nimport { EOL } from 'os';\nimport path from 'path';\nimport { Builder, Parser } from 'xml2js';\n\nexport type XMLValue = boolean | number | string | null | XMLArray | XMLObject;\n\nexport interface XMLArray extends Array<XMLValue> {}\n\nexport interface XMLObject {\n [key: string]: XMLValue | undefined;\n}\n\nexport async function writeXMLAsync(options: { path: string; xml: any }): Promise<void> {\n const xml = format(options.xml);\n await fs.ensureDir(path.dirname(options.path));\n await fs.writeFile(options.path, xml);\n}\n\nexport async function readXMLAsync(options: {\n path: string;\n fallback?: string | null;\n}): Promise<XMLObject> {\n let contents: string = '';\n try {\n contents = await fs.readFile(options.path, { encoding: 'utf8', flag: 'r' });\n } catch {\n // catch and use fallback\n }\n const parser = new Parser();\n const manifest = await parser.parseStringPromise(contents || options.fallback || '');\n return manifest;\n}\n\nexport async function parseXMLAsync(contents: string): Promise<XMLObject> {\n const xml = await new Parser().parseStringPromise(contents);\n return xml;\n}\n\nconst stringTimesN = (n: number, char: string) => Array(n + 1).join(char);\n\nexport function format(manifest: any, { indentLevel = 2, newline = EOL } = {}): string {\n let xmlInput: string;\n if (typeof manifest === 'string') {\n xmlInput = manifest;\n } else if (manifest.toString) {\n const builder = new Builder({\n headless: true,\n });\n\n // For strings.xml\n if (Array.isArray(manifest?.resources?.string)) {\n for (const string of manifest?.resources?.string) {\n if (string.$.translatable === 'false' || string.$.translatable === false) {\n continue;\n }\n string._ = escapeAndroidString(string._);\n }\n }\n\n xmlInput = builder.buildObject(manifest);\n\n return xmlInput;\n } else {\n throw new Error(`Invalid XML value passed in: ${manifest}`);\n }\n const indentString = stringTimesN(indentLevel, ' ');\n\n let formatted = '';\n const regex = /(>)(<)(\\/*)/g;\n const xml = xmlInput.replace(regex, `$1${newline}$2$3`);\n let pad = 0;\n xml\n .split(/\\r?\\n/)\n .map((line: string) => line.trim())\n .forEach((line: string) => {\n let indent = 0;\n if (line.match(/.+<\\/\\w[^>]*>$/)) {\n indent = 0;\n } else if (line.match(/^<\\/\\w/)) {\n if (pad !== 0) {\n pad -= 1;\n }\n } else if (line.match(/^<\\w([^>]*[^/])?>.*$/)) {\n indent = 1;\n } else {\n indent = 0;\n }\n\n const padding = stringTimesN(pad, indentString);\n formatted += padding + line + newline;\n pad += indent;\n });\n\n return formatted.trim();\n}\n\n/**\n * Escapes Android string literals, specifically characters `\"`, `'`, `\\`, `\\n`, `\\r`, `\\t`\n *\n * @param value unescaped Android XML string literal.\n */\nexport function escapeAndroidString(value: string): string {\n value = value.replace(/[\\n\\r\\t'\"@]/g, m => {\n switch (m) {\n case '\"':\n case \"'\":\n case '@':\n return '\\\\' + m;\n case '\\n':\n return '\\\\n';\n case '\\r':\n return '\\\\r';\n case '\\t':\n return '\\\\t';\n default:\n throw new Error(`Cannot escape unhandled XML character: ${m}`);\n }\n });\n if (value.match(/(^\\s|\\s$)/)) {\n value = '\"' + value + '\"';\n }\n return value;\n}\n"],"file":"XML.js"}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.PluginError = exports.UnexpectedError = void 0;
6
+ exports.UnexpectedError = exports.PluginError = void 0;
7
7
 
8
8
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
9
9
 
@@ -3,11 +3,11 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.createGeneratedHeaderComment = createGeneratedHeaderComment;
7
+ exports.createHash = createHash;
6
8
  exports.mergeContents = mergeContents;
7
9
  exports.removeContents = removeContents;
8
10
  exports.removeGeneratedContents = removeGeneratedContents;
9
- exports.createGeneratedHeaderComment = createGeneratedHeaderComment;
10
- exports.createHash = createHash;
11
11
 
12
12
  function _crypto() {
13
13
  const data = _interopRequireDefault(require("crypto"));
@@ -3,8 +3,8 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.getHistoryItem = getHistoryItem;
7
6
  exports.addHistoryItem = addHistoryItem;
7
+ exports.getHistoryItem = getHistoryItem;
8
8
 
9
9
  function getHistoryItem(config, name) {
10
10
  var _config$_internal$plu, _config$_internal, _config$_internal$plu2;
@@ -3,9 +3,9 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.fileExistsAsync = fileExistsAsync;
7
6
  exports.directoryExistsAsync = directoryExistsAsync;
8
7
  exports.fileExists = fileExists;
8
+ exports.fileExistsAsync = fileExistsAsync;
9
9
 
10
10
  function _fs() {
11
11
  const data = _interopRequireDefault(require("fs"));
@@ -3,14 +3,14 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.resolvePluginForModule = resolvePluginForModule;
6
+ exports.assertInternalProjectRoot = assertInternalProjectRoot;
7
7
  exports.moduleNameIsDirectFileReference = moduleNameIsDirectFileReference;
8
8
  exports.normalizeStaticPlugin = normalizeStaticPlugin;
9
- exports.assertInternalProjectRoot = assertInternalProjectRoot;
9
+ exports.pluginFileName = void 0;
10
+ exports.resolveConfigPluginExport = resolveConfigPluginExport;
10
11
  exports.resolveConfigPluginFunction = resolveConfigPluginFunction;
11
12
  exports.resolveConfigPluginFunctionWithInfo = resolveConfigPluginFunctionWithInfo;
12
- exports.resolveConfigPluginExport = resolveConfigPluginExport;
13
- exports.pluginFileName = void 0;
13
+ exports.resolvePluginForModule = resolvePluginForModule;
14
14
 
15
15
  function _assert() {
16
16
  const data = _interopRequireDefault(require("assert"));
@@ -3,10 +3,10 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.sortObject = sortObject;
6
+ exports.reverseSortString = void 0;
7
7
  exports.sortObjWithOrder = sortObjWithOrder;
8
+ exports.sortObject = sortObject;
8
9
  exports.sortWithOrder = sortWithOrder;
9
- exports.reverseSortString = void 0;
10
10
 
11
11
  function sortObject(obj, compareFn) {
12
12
  return Object.keys(obj).sort(compareFn).reduce((acc, key) => ({ ...acc,
@@ -4,8 +4,8 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.addWarningAndroid = addWarningAndroid;
7
- exports.addWarningIOS = addWarningIOS;
8
7
  exports.addWarningForPlatform = addWarningForPlatform;
8
+ exports.addWarningIOS = addWarningIOS;
9
9
 
10
10
  function _chalk() {
11
11
  const data = _interopRequireDefault(require("chalk"));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expo/config-plugins",
3
- "version": "4.0.7",
3
+ "version": "4.0.8",
4
4
  "description": "A library for Expo config plugins",
5
5
  "main": "build/index.js",
6
6
  "scripts": {
@@ -33,8 +33,8 @@
33
33
  ],
34
34
  "dependencies": {
35
35
  "@expo/config-types": "^43.0.1",
36
- "@expo/json-file": "8.2.33",
37
- "@expo/plist": "0.0.15",
36
+ "@expo/json-file": "8.2.34",
37
+ "@expo/plist": "0.0.16",
38
38
  "@react-native/normalize-color": "^2.0.0",
39
39
  "chalk": "^4.1.2",
40
40
  "debug": "^4.3.1",
@@ -1 +0,0 @@
1
- export declare function resolvePackageRootFolder(fromDirectory: string, moduleId: string): string | null;
@@ -1,57 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.resolvePackageRootFolder = resolvePackageRootFolder;
7
-
8
- function _findUp() {
9
- const data = _interopRequireDefault(require("find-up"));
10
-
11
- _findUp = function () {
12
- return data;
13
- };
14
-
15
- return data;
16
- }
17
-
18
- function path() {
19
- const data = _interopRequireWildcard(require("path"));
20
-
21
- path = function () {
22
- return data;
23
- };
24
-
25
- return data;
26
- }
27
-
28
- function _resolveFrom() {
29
- const data = _interopRequireDefault(require("resolve-from"));
30
-
31
- _resolveFrom = function () {
32
- return data;
33
- };
34
-
35
- return data;
36
- }
37
-
38
- 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); }
39
-
40
- 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; }
41
-
42
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
43
-
44
- function resolvePackageRootFolder(fromDirectory, moduleId) {
45
- const resolved = _resolveFrom().default.silent(fromDirectory, moduleId);
46
-
47
- if (!resolved) return null; // Get the closest package.json to the node module
48
-
49
- const packageJson = _findUp().default.sync('package.json', {
50
- cwd: resolved
51
- });
52
-
53
- if (!packageJson) return null; // resolve the root folder for the node module
54
-
55
- return path().dirname(packageJson);
56
- }
57
- //# sourceMappingURL=resolvePackageRootFolder.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utils/resolvePackageRootFolder.ts"],"names":["resolvePackageRootFolder","fromDirectory","moduleId","resolved","resolveFrom","silent","packageJson","findUp","sync","cwd","path","dirname"],"mappings":";;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;AAEO,SAASA,wBAAT,CAAkCC,aAAlC,EAAyDC,QAAzD,EAA0F;AAC/F,QAAMC,QAAQ,GAAGC,uBAAYC,MAAZ,CAAmBJ,aAAnB,EAAkCC,QAAlC,CAAjB;;AACA,MAAI,CAACC,QAAL,EAAe,OAAO,IAAP,CAFgF,CAG/F;;AACA,QAAMG,WAAW,GAAGC,kBAAOC,IAAP,CAAY,cAAZ,EAA4B;AAAEC,IAAAA,GAAG,EAAEN;AAAP,GAA5B,CAApB;;AACA,MAAI,CAACG,WAAL,EAAkB,OAAO,IAAP,CAL6E,CAM/F;;AACA,SAAOI,IAAI,GAACC,OAAL,CAAaL,WAAb,CAAP;AACD","sourcesContent":["import findUp from 'find-up';\nimport * as path from 'path';\nimport resolveFrom from 'resolve-from';\n\nexport function resolvePackageRootFolder(fromDirectory: string, moduleId: string): string | null {\n const resolved = resolveFrom.silent(fromDirectory, moduleId);\n if (!resolved) return null;\n // Get the closest package.json to the node module\n const packageJson = findUp.sync('package.json', { cwd: resolved });\n if (!packageJson) return null;\n // resolve the root folder for the node module\n return path.dirname(packageJson);\n}\n"],"file":"resolvePackageRootFolder.js"}