1{"version":3,"file":"mod-compiler.js","names":["debug","Debug","withDefaultBaseMods","config","props","withIosBaseMods","withAndroidBaseMods","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","getRawClone","freeze","JSON","parse","stringify","orders","ios","android","projectRoot","platforms","assertMissingModProviders","modRawConfig","platformName","entries","includes","name","join","platformProjectRoot","path","projectName","getHackyProjectName","undefined","modName","mod","modRequest","isProvider","errorMessage","PluginError","Warnings","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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"}