1{"version":3,"file":"mod-compiler.js","names":["_debug","data","_interopRequireDefault","require","_path","_Xcodeproj","_errors","Warnings","_interopRequireWildcard","_createBaseMod","_withAndroidBaseMods","_withIosBaseMods","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","debug","Debug","withDefaultBaseMods","config","props","withIosBaseMods","withAndroidBaseMods","withIntrospectionBaseMods","saveToInternal","skipEmptyMod","mods","platform","keys","_config$mods$platform","_config$mods$platform2","isIntrospective","_config$mods$platform3","compileModsAsync","introspect","evalModsAsync","sortMods","commands","order","allKeys","map","completeOrder","Set","sorted","length","group","shift","commandSet","find","push","getRawClone","freeze","JSON","parse","stringify","orders","ios","android","projectRoot","platforms","assertMissingModProviders","modRawConfig","platformName","entries","_config$mods","includes","name","join","platformProjectRoot","path","projectName","getHackyProjectName","undefined","modName","mod","modRequest","isProvider","errorMessage","PluginError","addWarningForPlatform","results","modResults","assertModResults"],"sources":["../../src/plugins/mod-compiler.ts"],"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\nfunction getRawClone({ mods, ...config }: ExportedConfig) {\n  // Configs should be fully serializable, so we can clone them without worrying about\n  // the mods.\n  return Object.freeze(JSON.parse(JSON.stringify(config)));\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  const modRawConfig = getRawClone(config);\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          modRawConfig,\n        });\n\n        // Sanity check to help locate non compliant mods.\n        config = assertModResults(results, platformName, modName);\n        // @ts-ignore: `modResults` is added for modifications\n        delete config.modResults;\n        // @ts-ignore: `modRequest` is added for modifications\n        delete config.modRequest;\n        // @ts-ignore: `modRawConfig` is added for modifications\n        delete config.modRawConfig;\n      }\n    }\n  }\n\n  return config;\n}\n"],"mappings":"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"}