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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"}